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>