예제 #1
0
std::unique_ptr<Node> inflate(std::istream* in, SourceLogger* logger) {
    Stack stack;

    XML_Parser parser = XML_ParserCreateNS(nullptr, kXmlNamespaceSep);
    XML_SetUserData(parser, &stack);
    XML_UseParserAsHandlerArg(parser);
    XML_SetElementHandler(parser, startElementHandler, endElementHandler);
    XML_SetNamespaceDeclHandler(parser, startNamespaceHandler, endNamespaceHandler);
    XML_SetCharacterDataHandler(parser, characterDataHandler);
    XML_SetCommentHandler(parser, commentDataHandler);

    char buffer[1024];
    while (!in->eof()) {
        in->read(buffer, sizeof(buffer) / sizeof(buffer[0]));
        if (in->bad() && !in->eof()) {
            stack.root = {};
            logger->error() << strerror(errno) << std::endl;
            break;
        }

        if (XML_Parse(parser, buffer, in->gcount(), in->eof()) == XML_STATUS_ERROR) {
            stack.root = {};
            logger->error(XML_GetCurrentLineNumber(parser))
                    << XML_ErrorString(XML_GetErrorCode(parser)) << std::endl;
            break;
        }
    }

    XML_ParserFree(parser);
    return std::move(stack.root);
}
예제 #2
0
static void
buildMenu(void)
{
    /* XML parsing is done using expat */
    int done = 1;
    int len = strlen(crut_api.menuBuffer);

    XML_Parser p = XML_ParserCreate(NULL);

    if (! p) 
    {
	fprintf(stderr, "Couldn't allocate memory for parser\n");
	exit(-1);
    }
    
    XML_UseParserAsHandlerArg(p);
    XML_SetElementHandler(p, start_hndl, end_hndl);

    if (! XML_Parse(p, crut_api.menuBuffer, len, done)) 
    {
	crError("Parse error at line %d:\n%s\n",
	      XML_GetCurrentLineNumber(p),
	      XML_ErrorString(XML_GetErrorCode(p)));
    }

    buildGLUTMenu( crut_server.stack );

    buildValueArray();
}
예제 #3
0
int main(int argc, char **argv) {

//	int res = isatty(fileno( stdin));
//
//	if(!res){
//		fprintf(stderr, "Must provide input document on stdin\n");
//		exit(1);
//	}

	XML_Parser p = XML_ParserCreate(NULL);
	if (!p) {
		fprintf(stderr, "Couldn't allocate memory for parser\n");
		exit(-1);
	}




	XML_UseParserAsHandlerArg(p);
	XML_SetElementHandler(p, start_hndl, end_hndl);
	XML_SetCharacterDataHandler(p, char_hndl);
	XML_SetProcessingInstructionHandler(p, proc_hndl);

	/* Notice that the default handler is not set at this point */

	for (;;) {
		int done;
		int len;
		fgets(Buff, sizeof(Buff), stdin);





		len = strlen(Buff);
		if (ferror(stdin)) {
			fprintf(stderr, "Read error\n");
			exit(-1);
		}
		done = feof(stdin);
		if (XML_Parse(p, Buff, len, done) != XML_STATUS_OK) {
			fprintf(stderr, "Parse error at line %lu :\n %s \n",
					XML_GetCurrentLineNumber(p), XML_ErrorString(
							XML_GetErrorCode(p)));
			exit(-1);
		}

		if (done)
			break;
	}
	printf("\n");
	return 0;
} /* End main */
예제 #4
0
파일: NFparse.c 프로젝트: ztessler/nFrames
/****************************************************************************************************************
 * Parse configuration
*****************************************************************************************************************/
NFcompModel_p NFmodelParse (FILE *inFile, bool report)
{
	char *doc;

	NFdata_t      data;
	XML_Parser parser;

	data.SkipName   = "root";
	data.Abort      = false;
	data.Buffer     = (char *) NULL;
	data.BufferLen  = 0;
	data.Skip       = false;
	data.Stack      =
	data.StackSize  =
	data.SkipLevel  = 0;
	data.Model      = (NFcompModel_p) NULL;
	data.Objects    = (NFobject_p *)  NULL;

	if ((doc = _NFreadDoc (inFile)) == (char *) NULL) {
		CMmsgPrint (CMmsgAppError, "Document reading error in %s:%d\n",__FILE__,__LINE__);
		return ((NFcompModel_p) NULL);
	}

	if ((parser = XML_ParserCreate(NULL)) == (XML_Parser) NULL) {
		CMmsgPrint (CMmsgSysError, "Memory allocation in %s:%d\n",__FILE__,__LINE__);
		return ((NFcompModel_p) NULL);
	}

	XML_SetUserData             (parser, &data);
	XML_SetElementHandler       (parser, _NFentryStart, _NFentryEnd);
	XML_SetCharacterDataHandler (parser, _NFentryText);
	XML_UseParserAsHandlerArg   (parser);

	if (XML_Parse(parser, doc, strlen (doc), true) == XML_STATUS_ERROR) {
		CMmsgPrint (CMmsgAppError,"Parse error at line %d\n", XML_GetCurrentLineNumber(parser));
		return ((NFcompModel_p) NULL);
	}
	XML_ParserFree (parser);
	if (data.Objects != (NFobject_p *) NULL) free (data.Objects);
	if ((data.Abort) && (data.Model != (NFcompModel_p) NULL)) {
		NFobjectFree ((NFobject_p) data.Model);
		return ((NFcompModel_p) NULL);
	}
	if (report) NFobjectPrint ((NFobject_p) (data.Model));
	return (data.Model);
}
예제 #5
0
파일: settings.c 프로젝트: avm/madpdf
void load_settings(const char *filename)
{
    struct stat stat_p;
    int filehandle;
    char *buffer;
    long nread;
    XML_Parser myparse;
    
    init_settings();
    init_parsinginfo();
    
    
    myparse=XML_ParserCreate("UTF-8");
    XML_UseParserAsHandlerArg(myparse);
    XML_SetElementHandler(myparse,handlestart,handleend);
    XML_SetCharacterDataHandler(myparse,handlechar);
    
    
    
    
    filehandle=open(filename,O_RDONLY);
    if(filehandle == -1) {
        XML_ParserFree(myparse);
        return;
    }

    stat(filename,&stat_p);
    buffer=(char *)malloc(stat_p.st_size);
    nread=read(filehandle,(void *)buffer,stat_p.st_size);
    XML_Parse(myparse,buffer,nread,1);
    
    
    free(buffer);
    free_parsinginfo();
    close(filehandle);
    
    XML_ParserFree(myparse);

}
예제 #6
0
void LoadPropertyTreeFromXmlString(Sys::PropertyTree* props, const char* xml)
{
  if (xml != NULL)
  {
    XML_Parser parser = XML_ParserCreate("UTF-8");
    if (parser != NULL)
    {
      try
      {
        // Prepare parser
        XML_SetElementHandler(parser,
          LoadPropertyTreeFromXml_OnStartRootElement,
          LoadPropertyTreeFromXml_OnEndRootElement);
        XML_SetCharacterDataHandler(parser, LoadPropertyTreeFromXml_OnCharacterData);
        XML_UseParserAsHandlerArg(parser);
        XML_SetUserData(parser, props);

        // Parse
        int n = (int)strlen(xml);
        if (XML_Parse(parser, xml, (int)n, true) == XML_STATUS_ERROR)
          throw new Sys::Exception("cannot parse XML string");
      }
      catch (...)
      {
        // Protect from possible exceptions in callbacks (e.g. XML_SetElementHandler)
        XML_ParserFree(parser);
        throw;
      }
      XML_ParserFree(parser);
    }
    else
      throw new Sys::Exception("cannot create XML parser");
  }
  else
    throw Sys::CreateArgumentNullException();
}
예제 #7
0
void LoadPropertyTreeFromXmlFile(Sys::PropertyTree* props, const char* xmlFilePath)
{
  if (xmlFilePath != NULL)
  {
    FILE* f = fopen(xmlFilePath, "r");
    if (f != NULL)
    {
      try
      {
        XML_Parser parser = XML_ParserCreate("UTF-8");
        if (parser != NULL)
        {
          char *buf = NULL;
          try
          {
            // Prepare parser
            XML_SetElementHandler(parser,
              LoadPropertyTreeFromXml_OnStartRootElement,
              LoadPropertyTreeFromXml_OnEndRootElement);
            XML_SetCharacterDataHandler(parser, LoadPropertyTreeFromXml_OnCharacterData);
            XML_UseParserAsHandlerArg(parser);
            XML_SetUserData(parser, props);

            // Prepare buffer
            const size_t BUF_SIZE = 16 * 1024;
            buf = new char[BUF_SIZE];
            if (buf != NULL)
            {
              props->Clear();
              // Read & parse
              size_t n = fread(buf, 1, BUF_SIZE, f);
              while (n != 0)
              {
                if (XML_Parse(parser, buf, (int)n, n != BUF_SIZE) == XML_STATUS_ERROR)
                  throw new Sys::Exception(Sys::FormattedString(
                    "cannot parse XML file '%s'", xmlFilePath));
                n = fread(buf, 1, BUF_SIZE, f);
              }
            }
            else
              throw new Sys::SystemException("out of memory");
          }
          catch (...)
          {
            // Protect from possible exceptions in callbacks (e.g. XML_SetElementHandler)
            delete[] buf;
            XML_ParserFree(parser);
            throw;
          }
          delete[] buf;
          XML_ParserFree(parser);
        }
        else
          throw new Sys::Exception("cannot create XML parser");
      }
      catch (...)
      {
        // Protect from possible exceptions in callbacks (e.g. XML_SetElementHandler)
        fclose(f);
        throw;
      }
      fclose(f);
    }
    else
      throw new Sys::IOException(Sys::FormattedString(
        "cannot open file '%s' for reading", xmlFilePath));
  }
  else
    throw Sys::CreateArgumentNullException();
}
예제 #8
0
void _Expat_XML_UseParserAsHandlerArg(struct ExpatIFace * Self, XML_Parser parser)
{
	XML_UseParserAsHandlerArg(parser);
}