errorCode parseNext(Parser* parser) { errorCode tmp_err_code = UNEXPECTED_ERROR; SmallIndex tmpNonTermID = GR_VOID_NON_TERMINAL; tmp_err_code = processNextProduction(&parser->strm, &tmpNonTermID, &parser->handler, parser->app_data); if(tmp_err_code != ERR_OK) return tmp_err_code; if(tmpNonTermID == GR_VOID_NON_TERMINAL) { EXIGrammar* grammar; popGrammar(&(parser->strm.gStack), &grammar); if(parser->strm.gStack == NULL) // There is no more grammars in the stack { parser->strm.context.currNonTermID = GR_VOID_NON_TERMINAL; // The stream is parsed } else { parser->strm.context.currNonTermID = parser->strm.gStack->lastNonTermID; } } else { parser->strm.context.currNonTermID = tmpNonTermID; } if(parser->strm.context.currNonTermID == GR_VOID_NON_TERMINAL) return PARSING_COMPLETE; return ERR_OK; }
END_TEST START_TEST (test_processNextProduction) { errorCode err = EXIP_UNEXPECTED_ERROR; EXIStream strm; SmallIndex nonTermID_out; ContentHandler handler; EXIPSchema schema; QNameID emptyQnameID = {URI_MAX, LN_MAX}; initAllocList(&strm.memList); initAllocList(&schema.memList); err = createDocGrammar(&schema, NULL, 0); fail_unless (err == EXIP_OK, "createDocGrammar returns an error code %d", err); err = pushGrammar(&strm.gStack, emptyQnameID, &schema.docGrammar); fail_unless (err == EXIP_OK, "pushGrammar returns an error code %d", err); strm.gStack->currNonTermID = 4; err = processNextProduction(&strm, &nonTermID_out, &handler, NULL); fail_unless (err == EXIP_INCONSISTENT_PROC_STATE, "processNextProduction does not return the correct error code"); freeAllocList(&strm.memList); freeAllocList(&schema.memList); }