Exemplo n.º 1
0
/*
 * xmlAddEntity : register a new entity for an entities table.
 */
static xmlEntityPtr
xmlAddEntity(xmlDtdPtr dtd, const xmlChar *name, int type,
             const xmlChar *ExternalID, const xmlChar *SystemID,
             const xmlChar *content)
{
  xmlDictPtr dict = NULL;
  xmlEntitiesTablePtr table = NULL;
  xmlEntityPtr ret;

  if (name == NULL)
    return(NULL);
  if (dtd == NULL)
    return(NULL);
  if (dtd->doc != NULL)
    dict = dtd->doc->dict;

  switch (type)
  {
  case XML_INTERNAL_GENERAL_ENTITY:
  case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
  case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
    if (dtd->entities == NULL)
      dtd->entities = xmlHashCreateDict(0, dict);
    table = dtd->entities;
    break;
  case XML_INTERNAL_PARAMETER_ENTITY:
  case XML_EXTERNAL_PARAMETER_ENTITY:
    if (dtd->pentities == NULL)
      dtd->pentities = xmlHashCreateDict(0, dict);
    table = dtd->pentities;
    break;
  case XML_INTERNAL_PREDEFINED_ENTITY:
    return(NULL);
  }
  if (table == NULL)
    return(NULL);
  ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content);
  if (ret == NULL)
    return(NULL);
  ret->doc = dtd->doc;

  if (xmlHashAddEntry(table, name, ret))
  {
    /*
     * entity was already defined at another level.
     */
    xmlFreeEntity(ret);
    return(NULL);
  }
  return(ret);
}
Exemplo n.º 2
0
/*
 * xmlAddEntity : register a new entity for an entities table.
 */
static xmlEntityPtr
xmlAddEntity(xmlDtdPtr dtd, const xmlChar *name, int type,
	  const xmlChar *ExternalID, const xmlChar *SystemID,
	  const xmlChar *content) {
    xmlDictPtr dict = NULL;
    xmlEntitiesTablePtr table = NULL;
    xmlEntityPtr ret;

    if (name == NULL)
	return(NULL);
    if (dtd == NULL)
	return(NULL);
    if (dtd->doc != NULL)
        dict = dtd->doc->dict;

    switch (type) {
        case XML_INTERNAL_GENERAL_ENTITY:
        case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
        case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
	    if (dtd->entities == NULL)
		dtd->entities = xmlHashCreateDict(0, dict);
	    table = dtd->entities;
	    break;
        case XML_INTERNAL_PARAMETER_ENTITY:
        case XML_EXTERNAL_PARAMETER_ENTITY:
	    if (dtd->pentities == NULL)
		dtd->pentities = xmlHashCreateDict(0, dict);
	    table = dtd->pentities;
	    break;
        case XML_INTERNAL_PREDEFINED_ENTITY:
	    return(NULL);
    }
    if (table == NULL)
	return(NULL);
    ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity));
    if (ret == NULL) {
        xmlEntitiesErrMemory("xmlAddEntity:: malloc failed");
	return(NULL);
    }
    memset(ret, 0, sizeof(xmlEntity));
    ret->type = XML_ENTITY_DECL;

    /*
     * fill the structure.
     */
    ret->etype = (xmlEntityType) type;
    if (dict == NULL) {
	ret->name = xmlStrdup(name);
	if (ExternalID != NULL)
	    ret->ExternalID = xmlStrdup(ExternalID);
	if (SystemID != NULL)
	    ret->SystemID = xmlStrdup(SystemID);
    } else {
        ret->name = xmlDictLookup(dict, name, -1);
	if (ExternalID != NULL)
	    ret->ExternalID = xmlDictLookup(dict, ExternalID, -1);
	if (SystemID != NULL)
	    ret->SystemID = xmlDictLookup(dict, SystemID, -1);
    }
    if (content != NULL) {
        ret->length = xmlStrlen(content);
	if ((dict != NULL) && (ret->length < 5))
	    ret->content = (xmlChar *)
	                   xmlDictLookup(dict, content, ret->length);
	else
	    ret->content = xmlStrndup(content, ret->length);
     } else {
        ret->length = 0;
        ret->content = NULL;
    }
    ret->URI = NULL; /* to be computed by the layer knowing
			the defining entity */
    ret->orig = NULL;
    ret->owner = 0;
    ret->doc = dtd->doc;

    if (xmlHashAddEntry(table, name, ret)) {
	/*
	 * entity was already defined at another level.
	 */
        xmlFreeEntity(ret);
	return(NULL);
    }
    return(ret);
}