Annotation of gpl/axl/src/axl_decl.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  *  LibAxl:  Another XML library
                      3:  *  Copyright (C) 2006 Advanced Software Production Line, S.L.
                      4:  *
                      5:  *  This program is free software; you can redistribute it and/or
                      6:  *  modify it under the terms of the GNU Lesser General Public License
                      7:  *  as published by the Free Software Foundation; either version 2.1 of
                      8:  *  the License, or (at your option) any later version.
                      9:  *
                     10:  *  This program is distributed in the hope that it will be useful,
                     11:  *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
                     12:  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
                     13:  *  GNU Lesser General Public License for more details.
                     14:  *
                     15:  *  You should have received a copy of the GNU Lesser General Public
                     16:  *  License along with this program; if not, write to the Free
                     17:  *  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
                     18:  *  02111-1307 USA
                     19:  *  
                     20:  *  You may find a copy of the license under this software is released
                     21:  *  at COPYING file. This is LGPL software: you are welcome to
                     22:  *  develop proprietary applications using this library without any
                     23:  *  royalty or fee but returning back any change, improvement or
                     24:  *  addition in the form of source code, project image, documentation
                     25:  *  patches, etc. 
                     26:  *
                     27:  *  For commercial support on build XML enabled solutions contact us:
                     28:  *          
                     29:  *      Postal address:
                     30:  *         Advanced Software Production Line, S.L.
                     31:  *         Edificio Alius A, Oficina 102,
                     32:  *         C/ Antonio Suarez Nº 10,
                     33:  *         Alcalá de Henares 28802 Madrid
                     34:  *         Spain
                     35:  *
                     36:  *      Email address:
                     37:  *         info@aspl.es - http://www.aspl.es/xml
                     38:  */
                     39: #ifndef __AXL_DECL_H__
                     40: #define __AXL_DECL_H__
                     41: 
                     42: /* include platform specific configuration */
                     43: #include <axl_config.h>
                     44: 
                     45: /* include this at this place to load GNU extensions */
                     46: #if defined(__GNUC__)
                     47: #  ifndef _GNU_SOURCE
                     48: #  define _GNU_SOURCE
                     49: #  endif
                     50: #  define __AXL_PRETTY_FUNCTION__ __PRETTY_FUNCTION__
                     51: #  define __AXL_LINE__            __LINE__
                     52: #  define __AXL_FILE__            __FILE__
                     53: #elif defined(_MSC_VER)
                     54: #  define __AXL_PRETTY_FUNCTION__ __FUNCDNAME__
                     55: #  define __AXL_LINE__            __LINE__
                     56: #  define __AXL_FILE__            __FILE__
                     57: #else
                     58: /* unknown compiler */
                     59: #define __AXL_PRETTY_FUNCTION__ ""
                     60: #define __AXL_LINE__            0
                     61: #define __AXL_FILE__            ""
                     62: #endif
                     63: 
                     64: #include <stdio.h>
                     65: #include <stdlib.h>
                     66: #include <stdarg.h>
                     67: #include <string.h>
                     68: 
                     69: /* only include unistd.h if unix platform is found or gnu gcc compiler
                     70:  * is found */
                     71: #if defined(__GNUC__) || defined(AXL_OS_UNIX)
                     72: # include <unistd.h>
                     73: #endif
                     74: 
                     75: #include <sys/types.h>
                     76: #include <sys/stat.h>
                     77: #include <fcntl.h>
                     78: #include <ctype.h>
                     79: 
                     80: /**
                     81:  * \defgroup axl_decl_module Axl Declarations: Common Axl declarations, Types, macros, and support functions.
                     82:  */
                     83: 
                     84: /** 
                     85:  * \addtogroup axl_decl_module
                     86:  * @{
                     87:  */
                     88: 
                     89: 
                     90: /**
                     91:  * @brief Axl XML document type definition.
                     92:  *
                     93:  * This type represents a reference to an entiry XML document loaded
                     94:  * into memory. Functions to be used to load XML document could be the
                     95:  * following:
                     96:  * 
                     97:  *  - \ref axl_doc_parse
                     98:  *  - \ref axl_doc_parse_strings
                     99:  *  - \ref axl_doc_parse_from_file
                    100:  * 
                    101:  * You can also create an empty document by using \ref axl_doc_create
                    102:  * and fill the initial root node using the \ref axl_doc_set_root
                    103:  * function. Once the document have an initial root node, you can add
                    104:  * more nodes as childs to the root element previously added.
                    105:  * 
                    106:  * Check the \ref axl_doc_module "axlDoc API reference" to get more
                    107:  * information.
                    108:  */
                    109: typedef struct _axlDoc axlDoc;
                    110: 
                    111: /** 
                    112:  * @brief An abstraction that allows to hold an xml node or any other
                    113:  * content that can be found inside an xml node: comments, content,
                    114:  * CDATA-content, PI, entity references.
                    115:  *
                    116:  * This type is mainly used inside the MIXED API, which allows to get
                    117:  * access to every particular item found inside a particular node
                    118:  * (\ref axlNode). Every item has a type (\ref AxlItemType) and a
                    119:  * content that is being encapsulated and usually accessed by \ref
                    120:  * axl_item_get_data.
                    121:  *
                    122:  * Check the \ref axl_item_module "Axl Item interface" for more information.
                    123:  */
                    124: typedef struct _axlItem axlItem;
                    125: 
                    126: /** 
                    127:  * @internal Factory allocation type.
                    128:  */
                    129: typedef struct _axlFactory axlFactory;
                    130: 
                    131: /** 
                    132:  * @internal String factory allocation type.
                    133:  */
                    134: typedef struct _axlStrFactory axlStrFactory;
                    135: 
                    136: /**
                    137:  * @brief Axl XML node type definition.
                    138:  *
                    139:  * This type reference represents a single XML node. To create a xml node you can use:
                    140:  * 
                    141:  * - \ref axl_node_create
                    142:  * 
                    143:  * To get the node name or if the node have childs or if it is empty,
                    144:  * you can use the following functions:
                    145:  *
                    146:  * - \ref axl_node_get_name
                    147:  * - \ref axl_node_is_empty
                    148:  * - \ref axl_node_have_childs
                    149:  *
                    150:  * To get the \ref axlNode content you can use the following
                    151:  * functions:
                    152:  * 
                    153:  * - \ref axl_node_get_content
                    154:  * - \ref axl_node_get_content_copy
                    155:  * - \ref axl_node_get_content_trans
                    156:  *
                    157:  * For attributes manipulation, you can using the following functions
                    158:  * to set them and retrieve them:
                    159:  * 
                    160:  * - \ref axl_node_get_attribute_value
                    161:  * - \ref axl_node_get_attribute_value_copy
                    162:  * - \ref axl_node_get_attribute_value_trans
                    163:  *
                    164:  * To retrive childs number or childs inside the given \ref axlNode
                    165:  * you can use the following function:
                    166:  * 
                    167:  * - \ref axl_node_get_child_num
                    168:  * - \ref axl_node_get_child_nth
                    169:  *
                    170:  * You can also use the following functions to get the parent node for
                    171:  * a provided xml node child and the next xml node found at the same
                    172:  * level, for a provided xml node reference.
                    173:  *
                    174:  * - \ref axl_node_get_parent
                    175:  * - \ref axl_node_get_next
                    176:  * 
                    177:  * Check the axlNode \ref axl_node_module "API for more information".
                    178:  */
                    179: typedef struct _axlNode axlNode;
                    180: 
                    181: /** 
                    182:  * @brief Public cursor type used to iterate over attributes installed
                    183:  * on a particular node (see \ref axl_node_attr_cursor_new to get examples and more information).
                    184:  */
                    185: typedef struct _axlAttrCursor axlAttrCursor;
                    186: 
                    187: /** 
                    188:  * @brief Axl DTD entity representation.
                    189:  */
                    190: typedef struct _axlDtd        axlDtd;
                    191: 
                    192: /** 
                    193:  * @brief Axl DTD entity element declaration.
                    194:  */
                    195: typedef struct _axlDtdElement axlDtdElement;
                    196: 
                    197: /** 
                    198:  * @brief Axl DTD item list element declaration.
                    199:  */
                    200: typedef struct _axlDtdElementList axlDtdElementList;
                    201: 
                    202: /** 
                    203:  * @brief Axl DTD item list element declaration.
                    204:  */
                    205: typedef struct _axlDtdElementListNode axlDtdElementListNode;
                    206: 
                    207: 
                    208: /** 
                    209:  * @brief Axl DTD attribute declaration (<!ATTLIST..>)
                    210:  */
                    211: typedef struct _axlDtdAttribute axlDtdAttribute;
                    212: 
                    213: /** 
                    214:  * @brief Axl DTD attribute list decleration inside \ref axlDtdAttribute.
                    215:  */
                    216: typedef struct _axlDtdAttributeDecl axlDtdAttributeDecl;
                    217: 
                    218: /** 
                    219:  * @brief Axl DTD entity declaration (<!ENTITY support>)
                    220:  */
                    221: typedef struct _axlDtdEntity axlDtdEntity;
                    222: 
                    223: /** 
                    224:  * @brief Support type definition for \ref axlDtdEntity, which holds
                    225:  * information about external resource pointed by the \ref
                    226:  * axlDtdEntity instance.
                    227:  */
                    228: typedef struct _axlDtdEntityExternalData axlDtdEntityExternalData;
                    229: 
                    230: /** 
                    231:  * @brief Declares the entity type for a provided \ref axlDtdEntity.
                    232:  */
                    233: typedef enum {
                    234:        /** 
                    235:         * @brief The \ref axlDtdEntity definition represents a
                    236:         * general entity definition (that comes without % before the
                    237:         * entity name).
                    238:         */
                    239:        GENERAL_ENTITY,
                    240:        /** 
                    241:         * @brief The \ref axlDtdEntity definition represents a
                    242:         * parameter entity definition (that comes with a % before the
                    243:         * entity name, making this entity definition to be only
                    244:         * usable from a DTD definition).
                    245:         */
                    246:        PARAMETER_ENTITY
                    247: }axlDtdEntityType;
                    248: 
                    249: /** 
                    250:  * @brief Attribute type declaration (the type of the attribute
                    251:  * constrain). This type is used to identifier the attribute contains
                    252:  * applied to the node selected.
                    253:  */
                    254: typedef enum { 
                    255:        /** 
                    256:         * @brief The attribute type is defined but its content is
                    257:         * CDATA (any string value is allowed), activated when used 'CDATA'.
                    258:         */
                    259:        CDATA_ATTRIBUTE, 
                    260:        /** 
                    261:         * @brief Especific token declaration that implicitly contrain
                    262:         * the node attribute value, activated when used 'ID'.
                    263:         */
                    264:        TOKENIZED_TYPE_ID, 
                    265:        /** 
                    266:         * @brief Especific token declaration that implicitly contrain
                    267:         * the node attribute value, activated when used 'IDREF'.
                    268:         */
                    269:        TOKENIZED_TYPE_IDREF,
                    270:        /** 
                    271:         * @brief Especific token declaration that implicitly contrain
                    272:         * the node attribute value, activated when used 'IDREFS'.
                    273:         */
                    274:        TOKENIZED_TYPE_IDREFS,
                    275:        /** 
                    276:         * @brief Especific token declaration that implicitly contrain
                    277:         * the node attribute value, activated when used 'ENTITY'.
                    278:         */
                    279:        TOKENIZED_TYPE_ENTITY,
                    280:        /** 
                    281:         * @brief Especific token declaration that implicitly contrain
                    282:         * the node attribute value, activated when used 'ENTITIES'.
                    283:         */
                    284:        TOKENIZED_TYPE_ENTITIES,
                    285:        /** 
                    286:         * @brief Especific token declaration that implicitly contrain
                    287:         * the node attribute value, activated when used 'NMTOKEN'.
                    288:         */
                    289:        TOKENIZED_TYPE_NMTOKEN,
                    290:        /** 
                    291:         * @brief Especific token declaration that implicitly contrain
                    292:         * the node attribute value, activated when used 'NMTOKENS'.
                    293:         */
                    294:        TOKENIZED_TYPE_NMTOKENS,
                    295:        /** 
                    296:         * @brief The attribute type declaration is constrained to a
                    297:         * set of values. This values are considered as an
                    298:         * enumeration.
                    299:         */
                    300:        ENUMERATION_TYPE, 
                    301:        /** 
                    302:         * @brief Attribute type not supported yet (although defined).
                    303:         */
                    304:        NOTATION_TYPE
                    305: } AxlDtdAttributeType;
                    306: 
                    307: /** 
                    308:  * @brief Defines the DTD attribute declaration default state.
                    309:  */
                    310: typedef enum {
                    311:        /** 
                    312:         * @brief The attribute is required as especified by the
                    313:         * attribute declaration.
                    314:         */
                    315:        ATT_REQUIRED,
                    316:        /** 
                    317:         * @brief The attribute is not requried, however, if it
                    318:         * appears it must follow the attribute type declaration.
                    319:         */
                    320:        ATT_IMPLIED,
                    321:        /** 
                    322:         * @brief The attribute must appear and have the value
                    323:         * provided as the default.
                    324:         */
                    325:        ATT_FIXED
                    326: }AxlDtdAttributeDefaults;
                    327: 
                    328: 
                    329: /** 
                    330:  * @brief The type of the DTD sequences stored by the \ref
                    331:  * axlDtdElementList.
                    332:  */
                    333: typedef enum {
                    334:        /** 
                    335:         * @internal
                    336:         *
                    337:         * Internal value used by the library to support mixing
                    338:         * content seperator types detection.
                    339:         */
                    340:        STILL_UNDEF  = 0,
                    341:        /** 
                    342:         * @brief Represents that the item selection is configured to
                    343:         * be a choice (a selection allowed from any item inside the
                    344:         * collection).
                    345:         */
                    346:        CHOICE        = 1,
                    347:        /** 
                    348:         * @brief Represents that the item selection is configured to
                    349:         * select each item in the order they apper.
                    350:         */
                    351:        SEQUENCE      = 2
                    352: }AxlDtdNestedType;
                    353: 
                    354: /** 
                    355:  * @brief An indication of the element type stored on the provided
                    356:  * \ref axlDtdElementListNode reference.
                    357:  *
                    358:  * An \ref axlDtdElementListNode reference could contain a single
                    359:  * reference to a content particule name, that is the XML node name to
                    360:  * be allowed to be used at the provided position or a reference to an
                    361:  * \ref axlDtdElementList which contains a nested list containing more
                    362:  * content particules.
                    363:  * 
                    364:  */
                    365: typedef enum {
                    366:        /** 
                    367:         * @internal
                    368:         * Represents the not defined value.
                    369:         */
                    370:        AXL_ELEMENT_NOT_DEFINED = 1,
                    371:        /** 
                    372:         * @brief The reference contains an \ref axlDtdElementList.
                    373:         */
                    374:        AXL_ELEMENT_LIST = 2,
                    375:        /** 
                    376:         * @brief The reference contains a reference to a leaf node, a
                    377:         * content particule.
                    378:         */
                    379:        AXL_ELEMENT_NODE = 3
                    380: } NodeType;
                    381: 
                    382: /** 
                    383:  * @brief DTD element type enumeration.
                    384:  *
                    385:  * While using DTD declaration, <b>ELEMENT</b> used to define how your
                    386:  * xml document is structured and constrained, are clasified using the
                    387:  * following values.
                    388:  *
                    389:  * This type specification must not be confused with \ref NodeType,
                    390:  * which is the configuration for an element, inside the content DTD
                    391:  * element specification.
                    392:  */
                    393: typedef enum {
                    394:        /** 
                    395:         * @internal
                    396:         *
                    397:         * Internal value to avoid confusing EMPTY declaration with a
                    398:         * non-defined value.
                    399:         */
                    400:        ELEMENT_TYPE_UNKNOWN = 0,
                    401:        /** 
                    402:         * @brief Used to represent that the element declaration have
                    403:         * no content inside it. This includes not only PCDATA (data
                    404:         * stored between xml tags) but also any child declaration.
                    405:         */
                    406:        ELEMENT_TYPE_EMPTY = 1,
                    407:        /** 
                    408:         * @brief Used to represent that the element used in your xml
                    409:         * document could contain anthing without any contraint. 
                    410:         */
                    411:        ELEMENT_TYPE_ANY = 2,
                    412:        /** 
                    413:         * @brief Used to represent that the following xml node have
                    414:         * content not only defined by a set of allowed xml nodes but
                    415:         * also PCDATA.
                    416:         */
                    417:        ELEMENT_TYPE_MIXED = 3,
                    418:        /** 
                    419:         * @brief Used to represent that the folowing xml node have
                    420:         * only xml nodes as content, in the form of xml childs,
                    421:         * without inlucing PCDATA.
                    422:         */
                    423:        ELEMENT_TYPE_CHILDREN = 4,
                    424:        /** 
                    425:         * @brief Used to represent that the DTD element specification
                    426:         * contains only PCDATA. No child nodes or childs nodes mixed
                    427:         * with PCDATA.
                    428:         */
                    429:        ELEMENT_TYPE_PCDATA = 5
                    430: } AxlDtdElementType;
                    431: 
                    432: /** 
                    433:  * @brief Current configuration for elements definied inside a ELEMENT
                    434:  * DTD declaration.
                    435:  */
                    436: typedef enum {
                    437:        /** 
                    438:         * @internal 
                    439:         *
                    440:         * Internal representation to identify wrong repetition
                    441:         * especification values.
                    442:         */
                    443:        DTD_TIMES_UNKNOWN = 0,
                    444:        /** 
                    445:         * Current configuration for DTD element content specification
                    446:         * signals that it must appear one and only one times.
                    447:         */
                    448:        ONE_AND_ONLY_ONE  = 1,
                    449:        /** 
                    450:         * Current configuration for DTD element content specification
                    451:         * signals that it could appear zero or one time.
                    452:         */
                    453:        ZERO_OR_ONE       = 2,
                    454:        /** 
                    455:         * Current configuration for DTD element content specification
                    456:         * signals 
                    457:         */
                    458:        ZERO_OR_MANY      = 3,
                    459:        /** 
                    460:         * Current configuration for DTD element content specification
                    461:         * signals that it must appear one up to many times.
                    462:         */
                    463:        ONE_OR_MANY       = 4
                    464: }AxlDtdTimes;
                    465: 
                    466: /** 
                    467:  * @brief Item types that can hold an xml node (\ref axlNode).
                    468:  *
                    469:  * \ref AxlItemType is used to notify the type for a particular item
                    470:  * (\ref axlItem) that is stored as a child on a particular \ref
                    471:  * axlNode.
                    472:  *
                    473:  * This is mainly used inside the MIXED API, which is the way that Axl
                    474:  * exposes the content of a xml node that is expected to contain more
                    475:  * nodes mixed with more content.
                    476:  *
                    477:  * Each type represents a particular basic unit that could be found as
                    478:  * a child item inside an xml node.
                    479:  */
                    480: typedef enum {
                    481:        /** 
                    482:         * @brief The \ref axlItem is encapsulating another item
                    483:         * node. Calling to \ref axl_item_get_data will return a
                    484:         * reference to an \ref axlNode.
                    485:         *
                    486:         */
                    487:        ITEM_NODE      = 1 << 0,
                    488:        /** 
                    489:         * @brief The \ref axlItem is encapsulating an node
                    490:         * content. Calling to the convenience function \ref
                    491:         * axl_item_get_content to get the content and the size that
                    492:         * is stored in the \ref axlItem with this type.
                    493:         */
                    494:        ITEM_CONTENT   = 1 << 1,
                    495:        /** 
                    496:         * @brief The \ref axlItem is encapsulating an application
                    497:         * process instruction. Calling to \ref axl_item_get_data will
                    498:         * return a reference to a \ref axlPI.
                    499:         *
                    500:         */
                    501:        ITEM_PI        = 1 << 2,
                    502:        
                    503:        /** 
                    504:         * @brief The \ref axlItem is encapsulating an xml
                    505:         * comment. 
                    506:         * 
                    507:         * XML comments inside Axl are handled xml node content. The
                    508:         * comment that is returned from the function has the initial
                    509:         * '<!--' and the ending '-->' elements stripped from its
                    510:         * body.
                    511:         *
                    512:         * You must use the convenience function \ref
                    513:         * axl_item_get_content to get the comment content and the
                    514:         * size that is stored on the \ref axlItem.
                    515:         */
                    516:        ITEM_COMMENT   = 1 << 3,
                    517:        /** 
                    518:         * @brief The \ref axlItem is encapsulating an xml entity
                    519:         * reference that wasn't resolved yet.
                    520:         *
                    521:         * Not implemented yet.
                    522:         */
                    523:        ITEM_REF       = 1 << 4,
                    524:        /** 
                    525:         * @brief The \ref axlItem is encapsulating an xml content
                    526:         * that was enclosed using the <![CDATA[]]> construction. This
                    527:         * child item works the same as \ref ITEM_CONTENT but, adding
                    528:         * the CDATA semantic and the fact that the content wasn't
                    529:         * parsed by the Axl XML engine. 
                    530:         *
                    531:         * You must use the convenience function \ref
                    532:         * axl_item_get_content to get the CDATA content and the size
                    533:         * that is stored on the \ref axlItem.
                    534:         *
                    535:         */
                    536:        ITEM_CDATA     = 1 << 6,
                    537: 
                    538:        /** 
                    539:         * @internal Item type which allows to signal that the item
                    540:         * comes from an item factory and shouldn't be deallocated in
                    541:         * the usual manner.
                    542:         */
                    543:        ITEM_FROM_FACTORY = 1 << 7,
                    544:        /** 
                    545:         * @internal Item type which allows to signal that the content
                    546:         * item comes from an item factory and shouldn't be
                    547:         * deallocated in the usual manner. 
                    548:         */
                    549:        ITEM_CONTENT_FROM_FACTORY = 1 << 8
                    550: }AxlItemType;
                    551: 
                    552: /** 
                    553:  * @brief Simple alias for the AxlDtdElementType.
                    554:  */
                    555: typedef AxlDtdElementType ElementType;
                    556: 
                    557: /** 
                    558:  * @brief Axl DTD entity attribute element declaration.
                    559:  */
                    560: typedef struct _axtDtdAttr    axlDtdAttr;
                    561: 
                    562: /** 
                    563:  * @brief Axl Processing instruction type definition.
                    564:  */
                    565: typedef struct _axlPI        axlPI;
                    566: 
                    567: /** 
                    568:  * @brief Axl error reporting variable.
                    569:  *
                    570:  * All Axl interface report errors found, with a textual diagnostic,
                    571:  * to the application level using this variable. You have to know that
                    572:  * it is also optional, so every function that receives an \ref
                    573:  * axlError, will properly handle a NULL reference received.
                    574:  *
                    575:  * Once an error was detected, for that condition you must check the
                    576:  * documentation provided for the function that is failing, you can
                    577:  * get the error code and the error textual diagnostic by using the
                    578:  * following functions:
                    579:  *
                    580:  *  - \ref axl_error_get_code
                    581:  *  - \ref axl_error_get
                    582:  *
                    583:  * If an error is not detected, there is no especial operation to be
                    584:  * done once returned the function that has received the \ref axlError
                    585:  * error reference. However, if an error is detected, the reference
                    586:  * must be deallocated by using the following function:
                    587:  *  
                    588:  *  - \ref axl_error_free
                    589:  * 
                    590:  * Here is an example:
                    591:  * \code
                    592:  * // declare the axlError reference
                    593:  * axlError * error;
                    594:  *
                    595:  * // parse the document, giving a reference to the axlError
                    596:  * // NOTE: you can safely provide a NULL reference.
                    597:  * doc = axl_doc_parse_from_file ("test.xml", &error);
                    598:  * if (doc == NULL) {
                    599:  *     printf ("Parse error: code=%d, message=%s\n", 
                    600:  *             axl_error_get_code (error), axl_error_get (error));
                    601:  *     axl_error_free (error);
                    602:  *     return axl_false;
                    603:  * }
                    604:  *
                    605:  * // beyond this point, it is not required to do
                    606:  * // any especial task with the axlError reference
                    607:  * \endcode
                    608:  *
                    609:  * To get more information about the \ref axlError check its \ref axl_error_module "API documentation".
                    610:  */
                    611: typedef struct _axlError  axlError;
                    612: 
                    613: /** 
                    614:  * @brief Axl Stream representation (an abstraction API to manage
                    615:  * source of data with convenience functions).
                    616:  */
                    617: typedef struct _axlStream axlStream;
                    618: 
                    619: /** 
                    620:  * @brief (DEPRECATED use \ref axl_true) Type definition to represent a boolean true value, that is equal to 1.
                    621:  */
                    622: #define AXL_TRUE  (axl_true)
                    623: 
                    624: /** 
                    625:  * @brief (DEPRECATED use \ref axl_false) Type definition to represent a* boolean false value, that is equal to 0.
                    626:  */
                    627: #define AXL_FALSE (axl_false)
                    628: 
                    629: /** 
                    630:  * @brief Alias declaration to bind the <i>int</i> to the <b>boolean</b>
                    631:  * concept (TRUE / FALSE states) (DEPRECATED).
                    632:  *
                    633:  * This is mainly used to emphasize that some integer values that
                    634:  * returns some function must be considered to be \ref axl_true or \ref
                    635:  * axl_false, that represents the boolean TRUE and FALSE values.
                    636:  *
                    637:  * This allows to perform boolean comparations using structure
                    638:  * controls like if, while, but also making a differenciation about
                    639:  * the boolean values and integer values.
                    640:  *
                    641:  * You are also allowed to use <b>bool</b> as boolean type definition.
                    642:  */
                    643: typedef int aboolean;
                    644: 
                    645: /**
                    646:  * @brief Bool definition for the Axl library. This type built on top
                    647:  * of <b>int</b> is used along with \ref axl_false and \ref axl_true
                    648:  * to model those API functions and attributes that returns or receive
                    649:  * a boolean state. 
                    650:  */
                    651: typedef int axl_bool;
                    652: 
                    653: /** 
                    654:  * @brief Common definition to have false (\ref axl_false) value (which is defined to 0 integer value).
                    655:  */
                    656: #define axl_false ((int)0)
                    657: /** 
                    658:  * @brief Common definition to have true (\ref axl_true) value (which is defined to 1 integer value).
                    659:  */
                    660: #define axl_true  ((int)1)
                    661: 
                    662: /**
                    663:  * @brief Boolean, deprecated, compatibility mode provided for those
                    664:  * applications and libraries built on top of Axl Library or any
                    665:  * library on top of it (like Vortex Library) to support people from C
                    666:  * user space using bool type definition and its corresponding values
                    667:  * false and true as they was available before 0.5.5 release.
                    668:  *
                    669:  * Definitions provided by this compatibility mode are:
                    670:  *
                    671:  * - \ref bool
                    672:  * - \ref true
                    673:  * - \ref false
                    674:  */
                    675: #if !defined(__cplusplus) && !defined(__bool_true_false_are_defined) && !defined(__axl_disable_broken_bool_def__)
                    676: /**
                    677:  * @brief <b>DEPRECATED:</b> boolean definition provided to support
                    678:  * applications and libraries using this type as defined by Axl
                    679:  * Library before 0.5.5 release. Do use this for newly written code.
                    680:  */
                    681: typedef int bool;
                    682: 
                    683: /**
                    684:  * @brief <b>DEPRECATED:</b> boolean false definition provided to
                    685:  * support applications and libraries using this type as defined by
                    686:  * Axl Library before 0.5.5 release. Do use this for newly written
                    687:  * code.
                    688:  */ 
                    689: #define false axl_false
                    690: 
                    691: /**
                    692:  * @brief <b>DEPRECATED:</b> boolean true definition provided to
                    693:  * support applications and libraries using this type as defined by
                    694:  * Axl Library before 0.5.5 release. Do use this for newly written
                    695:  * code.
                    696:  */ 
                    697: #define true axl_true
                    698: #endif
                    699: 
                    700: 
                    701: /** 
                    702:  * @brief Pointer to any structure definition. It should be required
                    703:  * to use this definition, however, some platforms doesn't support the
                    704:  * <b>void *</b> making it necessary to use the <b>char *</b>
                    705:  * definition as a general way to represent references.
                    706:  */
                    707: typedef void * axlPointer;
                    708: 
                    709: /** 
                    710:  * @brief \ref axlList definition, a list implementation.
                    711:  * See \ref axl_list_new for more information about using this type.
                    712:  */
                    713: typedef struct _axlList axlList;
                    714: 
                    715: /** 
                    716:  * @brief \ref axlListCursor definition, a iterator type used to
                    717:  * traverse an axlList in a efficient way. See \ref axl_list_cursor_get.
                    718:  */
                    719: typedef struct _axlListCursor axlListCursor;
                    720: 
                    721: /** 
                    722:  * @brief \ref axlStack definitinon, a stack implementation on top of \ref
                    723:  * axlList.
                    724:  * See \ref axl_stack_new for more information about using this type.
                    725:  */
                    726: typedef struct _axlStack axlStack;
                    727: 
                    728: /** 
                    729:  * @brief Compact binary state representation stack.
                    730:  *
                    731:  * This data structure allows to store binary/boolean values in an
                    732:  * efficient way.
                    733:  *
                    734:  * See \ref axl_binary_stack_new for more information.
                    735:  */
                    736: typedef struct _axlBinaryStack axlBinaryStack;
                    737: 
                    738: /** 
                    739:  * @brief \ref axlHash definition, a hash table to store key indexed
                    740:  * values.
                    741:  * See \ref axl_hash_new for more information about using this type.
                    742:  */
                    743: typedef struct _axlHash  axlHash;
                    744: 
                    745: /** 
                    746:  * @brief \ref axlHashCursor definition, a support type that is used
                    747:  * to iterate a hash in a linear mode, without calling to \ref
                    748:  * axl_hash_foreach family functions (see \ref axl_hash_cursor_new).
                    749:  */
                    750: typedef struct _axlHashCursor axlHashCursor;
                    751: 
                    752: /** 
                    753:  * @brief Handler definition used to compare two elements.
                    754:  * 
                    755:  * In the case they are equal, 0 is returned. In the case a should be
                    756:  * before b the -1 is returned. In the case a should be after b then 1
                    757:  * should be returned. A properly configured handler should help
                    758:  * collections and other function to order elements.
                    759:  *
                    760:  * @param a The element to compare
                    761:  * @param b The other element to compare
                    762:  * 
                    763:  * @return A value selected from {-1,0,1} according to previous
                    764:  * description.
                    765:  */
                    766: typedef int (*axlEqualFunc) (axlPointer a, axlPointer b);
                    767: 
                    768: /** 
                    769:  * @brief Handler definition which represent deallocation functions.
                    770:  *
                    771:  * @param ptr The pointer to the memory to be released.
                    772:  */
                    773: typedef void (*axlDestroyFunc) (axlPointer ptr);
                    774: 
                    775: /** 
                    776:  * @brief Handler used to represent the set of functions that could be
                    777:  * used to configure the axl stream allocation method. See \ref
                    778:  * axl_stream_set_buffer_alloc.
                    779:  * 
                    780:  * @param size The amount of memory to be allocated (memory requested by the axl stream).
                    781:  * 
                    782:  * @param data User defined pointer configured at \ref axl_stream_set_buffer_alloc.
                    783:  * 
                    784:  * @return The handler must return newly allocated memory to hold <b>size</b>
                    785:  * bytes.
                    786:  */
                    787: typedef char * (*axlStreamAlloc) (int size, axlPointer data);
                    788: 
                    789: /** 
                    790:  * @brief Handler definition for the set of functions that allows to
                    791:  * translate content into a particular format back to utf-8, which is
                    792:  * the default format used for internal data stored by Axl. 
                    793:  * 
                    794:  * @param source The source content to be decoded into utf-8. 
                    795:  *
                    796:  * @param source_size The size of the source content to be decoded.
                    797:  *
                    798:  * @param source_encoding The encoding of the source. 
                    799:  *
                    800:  * @param output The output of the decode operation. This buffer is
                    801:  * memory allocated by the caller. The size to be written is limited
                    802:  * by the following parameter.
                    803:  *
                    804:  * @param output_size The size of the output produced (in terms of
                    805:  * octects not utf-8 logical units).
                    806:  *
                    807:  * @param remain_source_index Reference where the last index of valid
                    808:  * input still pending to be process. Especially useful under
                    809:  * situation where the decode function returns 2.
                    810:  * 
                    811:  * @return The handler must return 1 if the operation was completed, 2
                    812:  * if the operation was completed but not enough size was found on
                    813:  * output buffer to store the content or 0 if the function fails.
                    814:  */
                    815: typedef int (*axlStreamDecode) (const char * source, int source_size,
                    816:                                const char * source_encoding,
                    817:                                char * output, int output_size, 
                    818:                                int * output_converted,
                    819:                                int * remain_source_index,
                    820:                                axlPointer user_data);
                    821: 
                    822: /** 
                    823:  * @brief A handler definition used by axl stream API to define the
                    824:  * set of functions that can be used to check content read from a file
                    825:  * into the axl stream buffer. The initial intention was to allow axl
                    826:  * babel to install an utf-8 content checked if an xml entity in utf-8
                    827:  * was detected but it allows more features.
                    828:  *
                    829:  * This handler is configured using \ref axl_stream_setup_check.
                    830:  * 
                    831:  * @param source The source to check.
                    832:  *
                    833:  * @param source_size The size of the source to check.
                    834:  *
                    835:  * @param source_encoding The source encoding found.
                    836:  *
                    837:  * @param user_data User defined pointer 
                    838:  * 
                    839:  * @return 
                    840:  */
                    841: typedef int (*axlStreamContentCheck) (const char  * source, 
                    842:                                      int           source_size,
                    843:                                      const char  * source_encoding,
                    844:                                      axlPointer    user_data,
                    845:                                      axlError   ** error);
                    846:                                      
                    847: 
                    848: /** 
                    849:  * @brief Axl debug levels.
                    850:  * 
                    851:  * While reporting log to the console, these levels are used to report
                    852:  * the severity for such log.
                    853:  */
                    854: typedef enum {
                    855:        /** 
                    856:         * @brief Debug level. Only used to report common
                    857:         * circumstances that represent the proper functionality.
                    858:         */
                    859:        AXL_LEVEL_DEBUG, 
                    860:        /** 
                    861:         * @brief Warning level. Only used to report that an internal
                    862:         * issue have happend that could be interesting while
                    863:         * reporting error, but it could also mean common situations.
                    864:         */
                    865:        AXL_LEVEL_WARNING, 
                    866:        /** 
                    867:         * @brief Critical level. Only used to report critical
                    868:         * situations where some that have happened shouldn't. 
                    869:         *
                    870:         * This level should only be used while reporting critical
                    871:         * situations.
                    872:         */
                    873:        AXL_LEVEL_CRITICAL}  
                    874: AxlDebugLevel;
                    875: 
                    876: /** 
                    877:  * @brief Support macro to allocate memory using axl_calloc function,
                    878:  * making a casting and using the sizeof keyword.
                    879:  *
                    880:  * @param type The type to allocate
                    881:  * @param count How many items to allocate.
                    882:  * 
                    883:  * @return A newly allocated pointer.
                    884:  */
                    885: #define axl_new(type, count) (type *) axl_calloc (count, sizeof (type))
                    886: 
                    887: /** 
                    888:  * @brief Allows to check a condition and return if it is not meet.
                    889:  * 
                    890:  * @param expr The expresion to check.
                    891:  */
                    892: #define axl_return_if_fail(expr) \
                    893: if (!(expr)) {__axl_log ("", AXL_LEVEL_CRITICAL, "Expresion '%s' have failed at %s (%s:%d)", #expr, __AXL_PRETTY_FUNCTION__, __AXL_FILE__, __AXL_LINE__); return;}
                    894: 
                    895: /** 
                    896:  * @brief Allows to check a condition and return the given value if it
                    897:  * is not meet.
                    898:  * 
                    899:  * @param expr The expresion to check.
                    900:  *
                    901:  * @param val The value to return if the expression is not meet.
                    902:  */
                    903: #define axl_return_val_if_fail(expr, val) \
                    904: if (!(expr)) { __axl_log ("", AXL_LEVEL_CRITICAL, "Expresion '%s' have failed, returning: %s at %s (%s:%d)", #expr, #val, __AXL_PRETTY_FUNCTION__, __AXL_FILE__, __AXL_LINE__); return val;}
                    905: 
                    906: 
                    907: /** 
                    908:  * @brief Consumes all spaces found and tabulars on the given stream
                    909:  * until a different char is found.
                    910:  *
                    911:  * This internal function also consumes coments inside the xml read.
                    912:  * 
                    913:  * @param stream The stream where the operation will be performed.
                    914:  */
                    915: #define AXL_CONSUME_SPACES(stream) \
                    916: axl_stream_consume_white_spaces (stream)
                    917: 
                    918: /** 
                    919:  * @internal
                    920:  *
                    921:  * @brief Allows to check if the provided string is empty either
                    922:  * because it is NULL of because the string contains no data.
                    923:  * 
                    924:  * @param str The string to check for emptyness.
                    925:  * 
                    926:  * @return Returns axl_true if the string is empty and axl_false if
                    927:  * not.
                    928:  */
                    929: #define AXL_IS_STR_EMPTY(str) (((str == NULL) || strlen (str) == 0) ? axl_true : axl_false)
                    930: 
                    931: /** 
                    932:  * @internal
                    933:  *
                    934:  * C++ support declarations borrowed from the libtool webpage. Thanks
                    935:  * you guys for this information. 
                    936:  *
                    937:  * BEGIN_C_DECLS should be used at the beginning of your declarations,
                    938:  * so that C++ compilers don't mangle their names.  Use END_C_DECLS at
                    939:  * the end of C declarations.
                    940:  */
                    941: #undef BEGIN_C_DECLS
                    942: #undef END_C_DECLS
                    943: #ifdef __cplusplus
                    944: # define BEGIN_C_DECLS extern "C" {
                    945: # define END_C_DECLS }
                    946: #else
                    947: # define BEGIN_C_DECLS /* empty */
                    948: # define END_C_DECLS /* empty */
                    949: #endif
                    950: 
                    951: #define _memcmp(i,s1,s2,size)\
                    952: i = 0;\
                    953: while (s1 [i] != 0 && s2 [i] != 0) {\
                    954:      if (s1 [i] != s2 [i])\
                    955:        return axl_false;\
                    956:      i++;\
                    957:      if (i == size)\
                    958:        return axl_true;\
                    959: }\
                    960: return axl_false
                    961: 
                    962: /** 
                    963:  * @brief Allows to configure how is performed the iteration other the xml document.
                    964:  *
                    965:  * An xml document could be considered as a tree structure, where the
                    966:  * root document node is the root of the tree. This enumerator allows
                    967:  * to configure how is visited each node of the tree. 
                    968:  */
                    969: typedef enum {
                    970:        /** 
                    971:         * @brief Makes a deep iteration, visiting first childs of a
                    972:         * visited node instead of brother nodes at the same level. 
                    973:         */
                    974:        DEEP_ITERATION, 
                    975:        /** 
                    976:         * @brief Makes a wide iteration, visiting first all nodes for
                    977:         * a given level, after visiting nodes for the next level.
                    978:         */
                    979:        WIDE_ITERATION
                    980: } AxlIterationMode;
                    981: 
                    982: /**
                    983:  * \defgroup axl_handlers Axl Handlers: Handlers declarations used by Axl Library functions.
                    984:  */
                    985: 
                    986: /** 
                    987:  * \addtogroup axl_handlers
                    988:  * @{
                    989:  */
                    990: 
                    991: /** 
                    992:  * @brief Axl iteration function definition.
                    993:  *
                    994:  * This handler definition is used by \ref axl_doc_iterate as the
                    995:  * function definition that will be called for each node found in the
                    996:  * document.
                    997:  *
                    998:  * The function provides a pointer to the node found, the first
                    999:  * paramenter, and additionally, provides a pointer to the parent node
                   1000:  * for the node found, the document where the node is found and an
                   1001:  * optional user defined pointer provided at the function calling
                   1002:  * (\ref axl_doc_iterate).
                   1003:  *
                   1004:  * The function returns a boolean value to signal the library to stop
                   1005:  * iterating over the XML structure if \ref axl_false is returned. So, to
                   1006:  * continue the iteration, you must always return \ref axl_true.
                   1007:  * 
                   1008:  * @param node The node found inside the document.
                   1009:  *
                   1010:  * @param parent The parent node for the node found (first parameter).
                   1011:  *
                   1012:  * @param doc The document that contains the node found.
                   1013:  *
                   1014:  * @param was_removed If contains a reference to a boolean value that
                   1015:  * helps the invoked funtion to notify the iteration system that the
                   1016:  * node was removed from the tree, using \ref axl_node_remove or \ref
                   1017:  * axl_node_replace. Iteration support inside axl library is built in
                   1018:  * a way that allows the programmer to remove a node (including its
                   1019:  * childs) without breaking the loop, however, you must use this
                   1020:  * variable to notify that the node was removed, so the iteration
                   1021:  * system won't iterate over its childs.
                   1022:  * 
                   1023:  * @param ptr A user defined pointer that the user provided at \ref
                   1024:  * axl_doc_iterate.
                   1025:  * 
                   1026:  * @return The callback must return axl_false in the case the iteration
                   1027:  * must be stopped. Otherwise, axl_true must be returned.
                   1028:  */
                   1029: typedef axl_bool (*axlIterationFunc) (axlNode * node, axlNode * parent, axlDoc * doc, axl_bool * was_removed, axlPointer ptr);
                   1030: 
                   1031: /** 
                   1032:  * @brief Axl iteration function definition (with two user defined
                   1033:  * pointer support).
                   1034:  *
                   1035:  * This handler definition is used by \ref axl_doc_iterate_full as the
                   1036:  * function definition that will be called for each node found in the
                   1037:  * document.
                   1038:  *
                   1039:  * The function provides a pointer to the node found, the first
                   1040:  * paramenter, and additionally, provides a pointer to the parent node
                   1041:  * for the node found, the document where the node is found and an
                   1042:  * optional user defined pointer provided at the function calling
                   1043:  * (\ref axl_doc_iterate_full).
                   1044:  *
                   1045:  * The function returns a axl_boolean value to signal the library to stop
                   1046:  * iterating over the XML structure if \ref axl_false is returned. So, to
                   1047:  * continue the iteration, you must always return \ref axl_true.
                   1048:  * 
                   1049:  * @param node The node found inside the document.
                   1050:  *
                   1051:  * @param parent The parent node for the node found (first parameter).
                   1052:  *
                   1053:  * @param doc The document that contains the node found.
                   1054:  *
                   1055:  * @param was_removed If contains a reference to a boolean value that
                   1056:  * helps the invoked funtion to notify the iteration system that the
                   1057:  * node was removed from the tree, using \ref axl_node_remove or \ref
                   1058:  * axl_node_replace. Iteration support inside axl library is built in
                   1059:  * a way that allows the programmer to remove a node (including its
                   1060:  * childs) without breaking the loop, however, you must use this
                   1061:  * variable to notify that the node was removed, so the iteration
                   1062:  * system won't iterate over its childs.
                   1063:  * 
                   1064:  * @param ptr A user defined pointer that the user provided at \ref
                   1065:  * axl_doc_iterate_full.
                   1066:  *
                   1067:  * @param ptr2 Second user defined pointer that the user provided at
                   1068:  * \ref axl_doc_iterate_full.
                   1069:  * 
                   1070:  * @return The callback must return axl_false in the case the iteration
                   1071:  * must be stopped. Otherwise, axl_true must be returned.
                   1072:  */
                   1073: typedef axl_bool (*axlIterationFunc2) (axlNode * node, axlNode * parent, axlDoc * doc, axl_bool * was_removed, axlPointer ptr, axlPointer ptr2);
                   1074: 
                   1075: /** 
                   1076:  * @brief Defines a signature for a set of function that are used to
                   1077:  * duplicate the content provided at the first parameter, returning a
                   1078:  * copy.
                   1079:  *
                   1080:  * This handler definition is used by: 
                   1081:  *
                   1082:  * - \ref axl_list_copy
                   1083:  * 
                   1084:  * @param ptr The data to duplicate.
                   1085:  * 
                   1086:  * @return A newly allocated data duplicated.
                   1087:  */
                   1088: typedef axlPointer (*axlDuplicateFunc) (axlPointer ptr);
                   1089: 
                   1090: /** 
                   1091:  * @brief Handler used by the \ref axl_list_module "axl list module"
                   1092:  * to perform linear and efficient lookups.
                   1093:  * 
                   1094:  * @param ptr A pointer to the object stored inside the list and to be
                   1095:  * checked if it is the one looked up. 
                   1096:  * 
                   1097:  * @param data A pointer to a user defined data that is received at
                   1098:  * the lookup function and passed to this handler.
                   1099:  * 
                   1100:  * @return The function should return axl_true (found). Otherwise, axl_false
                   1101:  * must be returned to keep on searching.
                   1102:  */
                   1103: typedef axl_bool (*axlLookupFunc) (axlPointer ptr, axlPointer data);
                   1104: 
                   1105: /** 
                   1106:  * @brief Hashing function used by the axl hash module to implement
                   1107:  * translation from an user defined pointer into a number that should
                   1108:  * be as much unique as possible.
                   1109:  * 
                   1110:  * @param key User defined data that represents the key for a data to
                   1111:  * be stored into the hash. The value provided here usually is an
                   1112:  * string but it could be any other data used as key. 
                   1113:  * 
                   1114:  * @return The function must return a positive value that will be used
                   1115:  * to index the content into the hash table. It doesn't matter if the
                   1116:  * number is greater than the table size. A modulo operation is
                   1117:  * applied to the result.
                   1118:  */
                   1119: typedef unsigned int (*axlHashFunc) (axlPointer key);
                   1120: 
                   1121: /** 
                   1122:  * @brief Foreach function signature used to represent the set of
                   1123:  * functions used at \ref axl_hash_foreach.
                   1124:  * 
                   1125:  * The function receives the item found (key and data values) as well
                   1126:  * as a user defined pointer also defined at \ref
                   1127:  * axl_hash_foreach. The function must return \ref axl_true (<i>"item
                   1128:  * found"</i>) to make the search to stop. In the case a full
                   1129:  * iteration over all items inside the hash is required, the function
                   1130:  * must always return \ref axl_false.
                   1131:  * 
                   1132:  * @param key The key for the item stored.
                   1133:  * @param data The data associated to the key found
                   1134:  * @param user_data User defined data that was provided to the axl_hash_foreach function.
                   1135:  * 
                   1136:  * @return \ref axl_true to make the foreach process to stop. \ref axl_false
                   1137:  * to make the process to continue.
                   1138:  */
                   1139: typedef axl_bool (* axlHashForeachFunc) (axlPointer key, axlPointer data, axlPointer user_data);
                   1140: 
                   1141: /** 
                   1142:  * @brief Foreach function signature used to represent the set of
                   1143:  * functions used at \ref axl_hash_foreach2.
                   1144:  * 
                   1145:  * The function receives the item found (key and data values) as well
                   1146:  * as two user defined pointers also defined at \ref
                   1147:  * axl_hash_foreach2. The function must return \ref axl_true (<i>"item
                   1148:  * found"</i>) to make the search to stop. In the case a full
                   1149:  * iteration over all items inside the hash is required, the function
                   1150:  * must always return \ref axl_false.
                   1151:  * 
                   1152:  * @param key The key for the item stored.
                   1153:  * @param data The data associated to the key found
                   1154:  * @param user_data User defined data that was provided to the axl_hash_foreach2 function.
                   1155:  * @param user_data2 Second User defined data that was provided to the axl_hash_foreach2 function.
                   1156:  * 
                   1157:  * @return \ref axl_true to make the foreach process to stop. \ref axl_false
                   1158:  * to make the process to continue.
                   1159:  */
                   1160: typedef axl_bool (* axlHashForeachFunc2) (axlPointer key, axlPointer data, axlPointer user_data, axlPointer user_data2);
                   1161: 
                   1162: /** 
                   1163:  * @brief Foreach function signature used to represent the set of
                   1164:  * functions used at \ref axl_hash_foreach3.
                   1165:  * 
                   1166:  * The function receives the item found (key and data values) as well
                   1167:  * as tree user defined pointers also defined at \ref
                   1168:  * axl_hash_foreach3. The function must return \ref axl_true (<i>"item
                   1169:  * found"</i>) to make the search to stop. In the case a full
                   1170:  * iteration over all items inside the hash is required, the function
                   1171:  * must always return \ref axl_false.
                   1172:  * 
                   1173:  * @param key The key for the item stored.
                   1174:  *
                   1175:  * @param data The data associated to the key found
                   1176:  *
                   1177:  * @param user_data User defined data that was provided to the
                   1178:  * axl_hash_foreach3 function.
                   1179:  *
                   1180:  * @param user_data2 Second User defined data that was provided to the
                   1181:  * axl_hash_foreach3 function.
                   1182:  *
                   1183:  * @param user_data3 Third User defined data that was provided to the
                   1184:  * axl_hash_foreach3 function.
                   1185:  * 
                   1186:  * @return \ref axl_true to make the foreach process to stop. \ref axl_false
                   1187:  * to make the process to continue.
                   1188:  */
                   1189: typedef axl_bool (* axlHashForeachFunc3) (axlPointer key, axlPointer data, axlPointer user_data, axlPointer user_data2, axlPointer user_data3);
                   1190: 
                   1191: /**
                   1192:  * @brief Foreach function signature used to represent the set of
                   1193:  * functions used at \ref axl_hash_foreach4.
                   1194:  * 
                   1195:  * The function receives the item found (key and data values) as well
                   1196:  * as tree user defined pointers also defined at \ref
                   1197:  * axl_hash_foreach4. The function must return \ref axl_true (<i>"item
                   1198:  * found"</i>) to make the search to stop. In the case a full
                   1199:  * iteration over all items inside the hash is required, the function
                   1200:  * must always return \ref axl_false.
                   1201:  * 
                   1202:  * @param key The key for the item stored.
                   1203:  *
                   1204:  * @param data The data associated to the key found
                   1205:  *
                   1206:  * @param user_data User defined data that was provided to the
                   1207:  * axl_hash_foreach4 function.
                   1208:  *
                   1209:  * @param user_data2 Second User defined data that was provided to the
                   1210:  * axl_hash_foreach4 function.
                   1211:  *
                   1212:  * @param user_data3 Third User defined data that was provided to the
                   1213:  * axl_hash_foreach4 function.
                   1214:  *
                   1215:  * @param user_data4 Forth User defined data that was provided to the
                   1216:  * axl_hash_foreach4 function.
                   1217:  * 
                   1218:  * @return \ref axl_true to make the foreach process to stop. \ref axl_false
                   1219:  * to make the process to continue.
                   1220:  */
                   1221: typedef axl_bool (* axlHashForeachFunc4) (axlPointer key, axlPointer data, axlPointer user_data, axlPointer user_data2, axlPointer user_data3, axlPointer user_data4);
                   1222: 
                   1223: /** 
                   1224:  * @brief Function handler definition for to allowing copying items at
                   1225:  * the hash by \ref axl_hash_copy function.
                   1226:  *
                   1227:  * The function receive both pointers the key and the data value but,
                   1228:  * only one of them must be copied. This is done to provide more
                   1229:  * control at the copy process, but only the required value must be
                   1230:  * returned. There is no indication to about which pointer must be
                   1231:  * returned, so, don't use the same function to copy both pointers.
                   1232:  *
                   1233:  * The function also receive pointers to the current function
                   1234:  * deallocation associated to the key and value being copied. This
                   1235:  * could also work as information to know if the data must be
                   1236:  * replicated or not. Having the destroy function defined for the item
                   1237:  * is a clue to return an allocated item.
                   1238:  * 
                   1239:  * @param key The key to be copied if the function was provided to copy the key.
                   1240:  *
                   1241:  * @param key_destroy The key destroy function associated to the value
                   1242:  * being copied.
                   1243:  *
                   1244:  * @param data The data to be copied if the function was provided to copy the data.
                   1245:  *
                   1246:  * @param data_destroy The data destroy function associated to the
                   1247:  * data value being copied.
                   1248:  * 
                   1249:  * @return A newly allocated reference representing the copy. 
                   1250:  */
                   1251: typedef axlPointer (*axlHashItemCopy) (axlPointer key, axlDestroyFunc key_destroy, axlPointer data, axlDestroyFunc data_destroy);
                   1252: 
                   1253: /** 
                   1254:  * @brief Foreach function handler used at \ref axl_stack_foreach
                   1255:  * function to iterate all elements inside the stack, from the head to
                   1256:  * the tail.
                   1257:  *
                   1258:  * The function receives two user defined pointers that are defined at
                   1259:  * the \ref axl_stack_foreach function. 
                   1260:  * 
                   1261:  * @param stack_data A reference to the stack data stored.
                   1262:  *
                   1263:  * @param user_data A reference to a user defined pointer passed to
                   1264:  * \ref axl_stack_foreach.
                   1265:  *
                   1266:  * @param user_data2 A second reference to a user defined pointer
                   1267:  * passed to \ref axl_stack_foreach.
                   1268:  * 
                   1269:  * @return \ref axl_true to make the foreach process to stop. \ref axl_false
                   1270:  * to make the process to continue.
                   1271:  */
                   1272: typedef axl_bool (* axlStackForeach2) (axlPointer stack_data, axlPointer user_data, axlPointer user_data2);
                   1273: 
                   1274: /** 
                   1275:  * @brief Foreach function handler used at \ref axl_stack_foreach3
                   1276:  * function to iterate all elements inside the stack, from the head to
                   1277:  * the tail.
                   1278:  *
                   1279:  * The function receives three user defined pointers that are defined
                   1280:  * at the \ref axl_stack_foreach3 function.
                   1281:  * 
                   1282:  * @param stack_data A reference to the stack data stored.
                   1283:  *
                   1284:  * @param user_data A reference to a user defined pointer passed to
                   1285:  * \ref axl_stack_foreach3.
                   1286:  *
                   1287:  * @param user_data2 A second reference to a user defined pointer
                   1288:  * passed to \ref axl_stack_foreach3.
                   1289:  *
                   1290:  * @param user_data3 Third reference to a user defined pointer passed
                   1291:  * to \ref axl_stack_foreach3.
                   1292:  * 
                   1293:  * @return \ref axl_true to make the foreach process to stop. \ref axl_false
                   1294:  * to make the process to continue.
                   1295:  */
                   1296: typedef axl_bool (* axlStackForeach3) (axlPointer stack_data, axlPointer user_data, axlPointer user_data2, axlPointer user_data3);
                   1297: 
                   1298: /** 
                   1299:  * @brief Foreach function used by \ref axl_node_attr_foreach function.
                   1300:  * 
                   1301:  * @param key The attribute name.
                   1302:  *
                   1303:  * @param value The attribute value.
                   1304:  *
                   1305:  * @param data User defined pointer provided at \ref
                   1306:  * axl_node_attr_foreach.
                   1307:  *
                   1308:  * @param data2 Second user defined data provided at \ref
                   1309:  * axl_node_attr_foreach.
                   1310:  *
                   1311:  * @return The foreach function can stop the process at a particular
                   1312:  * attribute by returning \ref axl_true ("item found"). To iterate all
                   1313:  * attributes return \ref axl_false.
                   1314:  */
                   1315: typedef axl_bool (* axlNodeAttrForeachFunc) (const char * key, const char * value, axlPointer data, axlPointer data2);
                   1316: 
                   1317: /** 
                   1318:  * @brief Entity resolver function used by the library to translate
                   1319:  * entity references into the replacement text. This is normally used
                   1320:  * by the library itself, not by the application programmer.
                   1321:  *
                   1322:  * This handler is currently used at \ref axl_dtd_check_entity_ref_and_expand
                   1323:  * 
                   1324:  * @param entityName The entity name that is being requested to be
                   1325:  * resolved.
                   1326:  * 
                   1327:  * @return The user defined data provided at \ref
                   1328:  * axl_dtd_check_entity_ref_and_expand, which is passed to the
                   1329:  * resolver function once it is executed.
                   1330:  */
                   1331: typedef const char * (* axlDtdEntityResolver) (const char * entityName, axlPointer data);
                   1332: 
                   1333: /** 
                   1334:  * @brief Handler definition for the set of functions that allows to
                   1335:  * detect codification found at the document being opened by the
                   1336:  * \ref axlStream reference provided.
                   1337:  * 
                   1338:  * @param stream The stream where the detection will be implemented.
                   1339:  *
                   1340:  * @param detected A reference to the codification detected or NULL if
                   1341:  * nothing clearly detected. For example (ascii, iso-8859) but still
                   1342:  * not enough information. Handler implementator must configure an
                   1343:  * static string for this value.
                   1344:  *
                   1345:  * @param user_data A reference to user-defined data. This value was
                   1346:  * configured at \ref axl_doc_set_detect_codification_func.
                   1347:  * 
                   1348:  * @return axl_true if the detection was implemented properly, otherse
                   1349:  * axl_false is returned. The handler could return axl_true and no
                   1350:  * codification be clearly detected.
                   1351:  */
                   1352: typedef axl_bool (* axlDocDetectCodification) (axlStream * stream, const char ** detected, axlPointer user_data, axlError ** error);
                   1353: 
                   1354: /** 
                   1355:  * @brief Handler definition for the set of functions that allows to
                   1356:  * finally configure codification to be used for the provided stream.
                   1357:  * 
                   1358:  * @param stream A reference to the stream to be configured.
                   1359:  *
                   1360:  * @param encoding A reference to the encoding detected. It could be
                   1361:  * NULL.
                   1362:  *
                   1363:  * @param detected_encoding A reference to the detected encoding (a
                   1364:  * value provided by the \ref axlDocDetectCodification if defined).
                   1365:  * 
                   1366:  * @param user_data A reference to user defined data.
                   1367:  *
                   1368:  * @param error An optional error that will be filled in the case an
                   1369:  * error is found.
                   1370:  * 
                   1371:  * @return axl_true if the configuration operation was done, otherwise
                   1372:  * axl_false is returned.
                   1373:  */
                   1374: typedef axl_bool (* axlDocConfigureCodification) (axlStream * stream, const char * encoding, const char * detected_encoding, axlPointer user_data, axlError ** error);
                   1375: 
                   1376: BEGIN_C_DECLS
                   1377: 
                   1378: axlPointer  axl_calloc  (size_t count, size_t size);
                   1379: 
                   1380: axlPointer  axl_realloc (axlPointer ref, size_t size);
                   1381: 
                   1382: void        axl_free    (axlPointer ref);
                   1383: 
                   1384: END_C_DECLS
                   1385: 
                   1386: /* @} */
                   1387: #endif
                   1388: 
                   1389: /* @} */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>