Annotation of gpl/axl/src/axl_decl.h, revision 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>