⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlparse.c

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 C
📖 第 1 页 / 共 5 页
字号:
    if (tag->rawName == rawNameBuf)      break;    /* For re-use purposes we need to ensure that the       size of tag->buf is a multiple of sizeof(XML_Char).    */    bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char));    if (bufSize > tag->bufEnd - tag->buf) {      char *temp = (char *)REALLOC(tag->buf, bufSize);      if (temp == NULL)        return XML_FALSE;      /* if tag->name.str points to tag->buf (only when namespace         processing is off) then we have to update it      */      if (tag->name.str == (XML_Char *)tag->buf)        tag->name.str = (XML_Char *)temp;      /* if tag->name.localPart is set (when namespace processing is on)         then update it as well, since it will always point into tag->buf      */      if (tag->name.localPart)        tag->name.localPart = (XML_Char *)temp + (tag->name.localPart -                                                  (XML_Char *)tag->buf);      tag->buf = temp;      tag->bufEnd = temp + bufSize;      rawNameBuf = temp + nameLen;    }    memcpy(rawNameBuf, tag->rawName, tag->rawNameLength);    tag->rawName = rawNameBuf;    tag = tag->parent;  }  return XML_TRUE;}static enum XML_Error PTRCALLcontentProcessor(XML_Parser parser,                 const char *start,                 const char *end,                 const char **endPtr){  enum XML_Error result =    doContent(parser, 0, encoding, start, end, endPtr);  if (result != XML_ERROR_NONE)    return result;  if (!storeRawNames(parser))    return XML_ERROR_NO_MEMORY;  return result;}static enum XML_Error PTRCALLexternalEntityInitProcessor(XML_Parser parser,                            const char *start,                            const char *end,                            const char **endPtr){  enum XML_Error result = initializeEncoding(parser);  if (result != XML_ERROR_NONE)    return result;  processor = externalEntityInitProcessor2;  return externalEntityInitProcessor2(parser, start, end, endPtr);}static enum XML_Error PTRCALLexternalEntityInitProcessor2(XML_Parser parser,                             const char *start,                             const char *end,                             const char **endPtr){  const char *next = start; /* XmlContentTok doesn't always set the last arg */  int tok = XmlContentTok(encoding, start, end, &next);  switch (tok) {  case XML_TOK_BOM:    /* If we are at the end of the buffer, this would cause the next stage,       i.e. externalEntityInitProcessor3, to pass control directly to       doContent (by detecting XML_TOK_NONE) without processing any xml text       declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent.    */    if (next == end && endPtr) {      *endPtr = next;      return XML_ERROR_NONE;    }    start = next;    break;  case XML_TOK_PARTIAL:    if (endPtr) {      *endPtr = start;      return XML_ERROR_NONE;    }    eventPtr = start;    return XML_ERROR_UNCLOSED_TOKEN;  case XML_TOK_PARTIAL_CHAR:    if (endPtr) {      *endPtr = start;      return XML_ERROR_NONE;    }    eventPtr = start;    return XML_ERROR_PARTIAL_CHAR;  }  processor = externalEntityInitProcessor3;  return externalEntityInitProcessor3(parser, start, end, endPtr);}static enum XML_Error PTRCALLexternalEntityInitProcessor3(XML_Parser parser,                             const char *start,                             const char *end,                             const char **endPtr){  const char *next = start; /* XmlContentTok doesn't always set the last arg */  int tok = XmlContentTok(encoding, start, end, &next);  switch (tok) {  case XML_TOK_XML_DECL:    {      enum XML_Error result = processXmlDecl(parser, 1, start, next);      if (result != XML_ERROR_NONE)        return result;      start = next;    }    break;  case XML_TOK_PARTIAL:    if (endPtr) {      *endPtr = start;      return XML_ERROR_NONE;    }    eventPtr = start;    return XML_ERROR_UNCLOSED_TOKEN;  case XML_TOK_PARTIAL_CHAR:    if (endPtr) {      *endPtr = start;      return XML_ERROR_NONE;    }    eventPtr = start;    return XML_ERROR_PARTIAL_CHAR;  }  processor = externalEntityContentProcessor;  tagLevel = 1;  return externalEntityContentProcessor(parser, start, end, endPtr);}static enum XML_Error PTRCALLexternalEntityContentProcessor(XML_Parser parser,                               const char *start,                               const char *end,                               const char **endPtr){  enum XML_Error result =    doContent(parser, 1, encoding, start, end, endPtr);  if (result != XML_ERROR_NONE)    return result;  if (!storeRawNames(parser))    return XML_ERROR_NO_MEMORY;  return result;}static enum XML_ErrordoContent(XML_Parser parser,          int startTagLevel,          const ENCODING *enc,          const char *s,          const char *end,          const char **nextPtr){  DTD * const dtd = _dtd;  /* save one level of indirection */  const char **eventPP;  const char **eventEndPP;  if (enc == encoding) {    eventPP = &eventPtr;    eventEndPP = &eventEndPtr;  }  else {    eventPP = &(openInternalEntities->internalEventPtr);    eventEndPP = &(openInternalEntities->internalEventEndPtr);  }  *eventPP = s;  for (;;) {    const char *next = s; /* XmlContentTok doesn't always set the last arg */    int tok = XmlContentTok(enc, s, end, &next);    *eventEndPP = next;    switch (tok) {    case XML_TOK_TRAILING_CR:      if (nextPtr) {        *nextPtr = s;        return XML_ERROR_NONE;      }      *eventEndPP = end;      if (characterDataHandler) {        XML_Char c = 0xA;        characterDataHandler(handlerArg, &c, 1);      }      else if (defaultHandler)        reportDefault(parser, enc, s, end);      if (startTagLevel == 0)        return XML_ERROR_NO_ELEMENTS;      if (tagLevel != startTagLevel)        return XML_ERROR_ASYNC_ENTITY;      return XML_ERROR_NONE;    case XML_TOK_NONE:      if (nextPtr) {        *nextPtr = s;        return XML_ERROR_NONE;      }      if (startTagLevel > 0) {        if (tagLevel != startTagLevel)          return XML_ERROR_ASYNC_ENTITY;        return XML_ERROR_NONE;      }      return XML_ERROR_NO_ELEMENTS;    case XML_TOK_INVALID:      *eventPP = next;      return XML_ERROR_INVALID_TOKEN;    case XML_TOK_PARTIAL:      if (nextPtr) {        *nextPtr = s;        return XML_ERROR_NONE;      }      return XML_ERROR_UNCLOSED_TOKEN;    case XML_TOK_PARTIAL_CHAR:      if (nextPtr) {        *nextPtr = s;        return XML_ERROR_NONE;      }      return XML_ERROR_PARTIAL_CHAR;    case XML_TOK_ENTITY_REF:      {        const XML_Char *name;        ENTITY *entity;        XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc,                                              s + enc->minBytesPerChar,                                              next - enc->minBytesPerChar);        if (ch) {          if (characterDataHandler)            characterDataHandler(handlerArg, &ch, 1);          else if (defaultHandler)            reportDefault(parser, enc, s, next);          break;        }        name = poolStoreString(&dtd->pool, enc,                                s + enc->minBytesPerChar,                                next - enc->minBytesPerChar);        if (!name)          return XML_ERROR_NO_MEMORY;        entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0);        poolDiscard(&dtd->pool);        /* First, determine if a check for an existing declaration is needed;           if yes, check that the entity exists, and that it is internal,           otherwise call the skipped entity or default handler.        */        if (!dtd->hasParamEntityRefs || dtd->standalone) {          if (!entity)            return XML_ERROR_UNDEFINED_ENTITY;          else if (!entity->is_internal)            return XML_ERROR_ENTITY_DECLARED_IN_PE;        }        else if (!entity) {          if (skippedEntityHandler)            skippedEntityHandler(handlerArg, name, 0);          else if (defaultHandler)            reportDefault(parser, enc, s, next);          break;        }        if (entity->open)          return XML_ERROR_RECURSIVE_ENTITY_REF;        if (entity->notation)          return XML_ERROR_BINARY_ENTITY_REF;        if (entity->textPtr) {          enum XML_Error result;          OPEN_INTERNAL_ENTITY openEntity;          if (!defaultExpandInternalEntities) {            if (skippedEntityHandler)              skippedEntityHandler(handlerArg, entity->name, 0);            else if (defaultHandler)              reportDefault(parser, enc, s, next);            break;          }          entity->open = XML_TRUE;          openEntity.next = openInternalEntities;          openInternalEntities = &openEntity;          openEntity.entity = entity;          openEntity.internalEventPtr = NULL;          openEntity.internalEventEndPtr = NULL;          result = doContent(parser,                             tagLevel,                             internalEncoding,                             (char *)entity->textPtr,                             (char *)(entity->textPtr + entity->textLen),                             0);          entity->open = XML_FALSE;          openInternalEntities = openEntity.next;          if (result)            return result;        }        else if (externalEntityRefHandler) {          const XML_Char *context;          entity->open = XML_TRUE;          context = getContext(parser);          entity->open = XML_FALSE;          if (!context)            return XML_ERROR_NO_MEMORY;          if (!externalEntityRefHandler((XML_Parser)externalEntityRefHandlerArg,                                        context,                                        entity->base,                                        entity->systemId,                                        entity->publicId))            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;          poolDiscard(&tempPool);        }        else if (defaultHandler)          reportDefault(parser, enc, s, next);        break;      }    case XML_TOK_START_TAG_NO_ATTS:      /* fall through */    case XML_TOK_START_TAG_WITH_ATTS:      {        TAG *tag;        enum XML_Error result;        XML_Char *toPtr;        if (freeTagList) {          tag = freeTagList;          freeTagList = freeTagList->parent;        }        else {          tag = (TAG *)MALLOC(sizeof(TAG));          if (!tag)            return XML_ERROR_NO_MEMORY;          tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE);          if (!tag->buf) {            FREE(tag);            return XML_ERROR_NO_MEMORY;          }          tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE;        }        tag->bindings = NULL;        tag->parent = tagStack;        tagStack = tag;        tag->name.localPart = NULL;        tag->name.prefix = NULL;        tag->rawName = s + enc->minBytesPerChar;        tag->rawNameLength = XmlNameLength(enc, tag->rawName);        ++tagLevel;        {          const char *rawNameEnd = tag->rawName + tag->rawNameLength;          const char *fromPtr = tag->rawName;          toPtr = (XML_Char *)tag->buf;          for (;;) {            int bufSize;            int convLen;            XmlConvert(enc,                       &fromPtr, rawNameEnd,                       (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1);            convLen = toPtr - (XML_Char *)tag->buf;            if (fromPtr == rawNameEnd) {              tag->name.strLen = convLen;              break;            }            bufSize = (tag->bufEnd - tag->buf) << 1;            {              char *temp = (char *)REALLOC(tag->buf, bufSize);              if (temp == NULL)                return XML_ERROR_NO_MEMORY;              tag->buf = temp;              tag->bufEnd = temp + bufSize;              toPtr = (XML_Char *)temp + convLen;            }          }        }        tag->name.str = (XML_Char *)tag->buf;        *toPtr = XML_T('\0');        result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings));        if (result)          return result;        if (startElementHandler)          startElementHandler(handlerArg, tag->name.str,                              (const XML_Char **)atts);        else if (defaultHandler)          reportDefault(parser, enc, s, next);        poolClear(&tempPool);        break;      }    case XML_TOK_EMPTY_ELEMENT_NO_ATTS:      /* fall through */    case XML_TOK_EMPTY_ELEMENT_WITH_ATTS:      {        const char *rawName = s + enc->minBytesPerChar;        enum XML_Error result;        BINDING *bindings = NULL;        XML_Bool noElmHandlers = XML_TRUE;        TAG_NAME name;        name.str = poolStoreString(&tempPool, enc, rawName,                                   rawName + XmlNameLength(enc, rawName));        if (!name.str)          return XML_ERROR_NO_MEMORY;        poolFinish(&tempPool);        result = storeAtts(parser, enc, s, &name, &bindings);        if (result)          return result;        poolFinish(&tempPool);        if (startElementHandler) {          startElementHandler(handlerArg, name.str, (const XML_Char **)atts);          noElmHandlers = XML_FALSE;        }        if (endElementHandler) {          if (startElementHandler)            *eventPP = *eventEndPP;          endElementHandler(handlerArg, name.str);          noElmHandlers = XML_FALSE;        }        if (noElmHandlers && defaultHandler)          reportDefault(parser, enc, s, next);        poolClear(&tempPool);        while (bindings) {          BINDING *b = bindings;          if (endNamespaceDeclHandler)            endNamespaceDeclHandler(handlerArg, b->prefix->name);          bindings = bindings->nextTagBinding;          b->nextTagBinding = freeBindingList;          freeBindingList = b;          b->prefix->binding = b->prevPrefixBinding;        }      }      if (tagLevel == 0)        return epilogProcessor(parser, next, end, nextPtr);      break;    case XML_TOK_END_TAG:      if (tagLevel == startTagLevel)        return XML_ERROR_ASYNC_ENTITY;      else {        int len;        const char *rawName;        TAG *tag = tagStack;        tagStack = tag->parent;        tag->parent = freeTagList;        freeTagList = tag;        rawName = s + enc->minBytesPerChar*2;        len = XmlNameLength(enc, rawName);        if (len != tag->rawNameLength            ||

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -