Diff for /XML/valid.c between versions 1.20 and 1.21

version 1.20, 1999/08/07 14:10:11 version 1.21, 1999/08/12 13:04:03
Line 1306  xmlDumpNotationTable(xmlBufferPtr buf, x Line 1306  xmlDumpNotationTable(xmlBufferPtr buf, x
   
 /************************************************************************  /************************************************************************
  *                                                                      *   *                                                                      *
    *                              NOTATIONs                               *
    *                                                                      *
    ************************************************************************/
   /**
    * xmlCreateIDTable:
    *
    * create and initialize an empty id hash table.
    *
    * Returns the xmlIDTablePtr just created or NULL in case
    *                of error.
    */
   xmlIDTablePtr
   xmlCreateIDTable(void) {
       xmlIDTablePtr ret;
   
       ret = (xmlIDTablePtr) 
            malloc(sizeof(xmlIDTable));
       if (ret == NULL) {
           fprintf(stderr, "xmlCreateIDTable : malloc(%ld) failed\n",
                   (long)sizeof(xmlIDTable));
           return(NULL);
       }
       ret->max_ids = XML_MIN_NOTATION_TABLE;
       ret->nb_ids = 0;
       ret->table = (xmlIDPtr *) 
            malloc(ret->max_ids * sizeof(xmlIDPtr));
       if (ret == NULL) {
           fprintf(stderr, "xmlCreateIDTable : malloc(%ld) failed\n",
                   ret->max_ids * (long)sizeof(xmlID));
           free(ret);
           return(NULL);
       }
       return(ret);
   }
   
   
   /**
    * xmlAddID:
    * @ctxt:  the validation context
    * @doc:  pointer to the document
    * @value:  the value name
    * @attr:  the attribute holding the ID
    *
    * Register a new id declaration
    *
    * Returns NULL if not, othervise the new xmlIDPtr
    */
   xmlIDPtr 
   xmlAddID(xmlValidCtxtPtr ctxt, xmlDocPtr doc, const CHAR *value,
            xmlAttrPtr attr) {
       xmlIDPtr ret, cur;
       xmlIDTablePtr table;
       int i;
   
       if (doc == NULL) {
           fprintf(stderr, "xmlAddIDDecl: doc == NULL\n");
           return(NULL);
       }
       if (value == NULL) {
           fprintf(stderr, "xmlAddIDDecl: value == NULL\n");
           return(NULL);
       }
       if (attr == NULL) {
           fprintf(stderr, "xmlAddIDDecl: attr == NULL\n");
           return(NULL);
       }
   
       /*
        * Create the ID table if needed.
        */
       table = doc->ids;
       if (table == NULL) 
           table = doc->ids = xmlCreateIDTable();
       if (table == NULL) {
           fprintf(stderr, "xmlAddID: Table creation failed!\n");
           return(NULL);
       }
   
       /*
        * Validity Check:
        * Search the DTD for previous declarations of the ATTLIST
        */
       for (i = 0;i < table->nb_ids;i++) {
           cur = table->table[i];
           if (!xmlStrcmp(cur->value, value)) {
               /*
                * The id is already defined in this Dtd.
                */
               VERROR(ctxt->userData, "ID %s already defined\n", value);
               return(NULL);
           }
       }
   
       /*
        * Grow the table, if needed.
        */
       if (table->nb_ids >= table->max_ids) {
           /*
            * need more ids.
            */
           table->max_ids *= 2;
           table->table = (xmlIDPtr *) 
               realloc(table->table, table->max_ids *
                       sizeof(xmlIDPtr));
           if (table->table == NULL) {
               fprintf(stderr, "xmlAddID: out of memory\n");
               return(NULL);
           }
       }
       ret = (xmlIDPtr) malloc(sizeof(xmlID));
       if (ret == NULL) {
           fprintf(stderr, "xmlAddID: out of memory\n");
           return(NULL);
       }
       table->table[table->nb_ids] = ret;
   
       /*
        * fill the structure.
        */
       ret->value = xmlStrdup(value);
       ret->attr = attr;
       table->nb_ids++;
   
       return(ret);
   }
   
   /**
    * xmlFreeID:
    * @not:  A id
    *
    * Deallocate the memory used by an id definition
    */
   void
   xmlFreeID(xmlIDPtr id) {
       if (id == NULL) return;
       if (id->value != NULL)
           free((CHAR *) id->value);
       memset(id, -1, sizeof(xmlID));
       free(id);
   }
   
   /**
    * xmlFreeIDTable:
    * @table:  An id table
    *
    * Deallocate the memory used by an ID hash table.
    */
   void
   xmlFreeIDTable(xmlIDTablePtr table) {
       int i;
   
       if (table == NULL) return;
   
       for (i = 0;i < table->nb_ids;i++) {
           xmlFreeID(table->table[i]);
       }
       free(table->table);
       free(table);
   }
   
   /**
    * xmlIsID
    * @doc:  the document
    * @elem:  the element carrying the attribute
    * @attr:  the attribute
    *
    * Determine whether an attribute is of type ID. In case we have Dtd(s)
    * then this is simple, otherwise we use an heuristic: name ID (upper
    * or lowercase).
    *
    * Returns 0 or 1 depending on the lookup result
    */
   int
   xmlIsID(xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr) {
       if ((doc->intSubset == NULL) && (doc->extSubset == NULL)) {
           if (((attr->name[0] == 'I') || (attr->name[0] == 'i')) &&
               ((attr->name[1] == 'D') || (attr->name[1] == 'd')) &&
               (attr->name[2] == 0)) return(1);
       } else {
           xmlAttributePtr attrDecl;
   
           attrDecl = xmlGetDtdAttrDesc(doc->intSubset, elem->name, attr->name);
           if ((attrDecl == NULL) && (doc->extSubset != NULL))
               attrDecl = xmlGetDtdAttrDesc(doc->extSubset, elem->name,
                                            attr->name);
   
           if ((attrDecl == NULL) || (attrDecl->type == XML_ATTRIBUTE_ID))
               return(1);
       }
       return(0);
   }
   
   /************************************************************************
    *                                                                      *
  *              Routines for validity checking                          *   *              Routines for validity checking                          *
  *                                                                      *   *                                                                      *
  ************************************************************************/   ************************************************************************/

Removed from v.1.20  
changed lines
  Added in v.1.21


Webmaster