* xmlParseCRNG_pattern: * @ctxt: a compact RNG parser context * * Parse pattern of the RELAX NG Compact Syntax Appendix A * * Returns 0 in case of success and -1 in case of error */
| 1035 | * Returns 0 in case of success and -1 in case of error |
| 1036 | */ |
| 1037 | static int |
| 1038 | xmlParseCRNG_pattern(xmlCRelaxNGParserCtxtPtr ctxt) |
| 1039 | { |
| 1040 | tokenPtr token; |
| 1041 | xmlNodePtr insert = ctxt->insert, prev, grp; |
| 1042 | |
| 1043 | ctxt->insert = NULL; |
| 1044 | xmlParseCRNG_particle(ctxt); |
| 1045 | prev = ctxt->insert; |
| 1046 | token = xmlParseCRNGGetToken(ctxt, 1); |
| 1047 | while ((prev != NULL) && (token != NULL) && (token->toktype == CRNG_OP)) { |
| 1048 | if (token->token == ctxt->key_or) { |
| 1049 | grp = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_choice); |
| 1050 | if (grp == NULL) CRNG_MEM_ERROR0(); |
| 1051 | } else if (token->token == ctxt->key_and) { |
| 1052 | grp = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_interleave); |
| 1053 | if (grp == NULL) CRNG_MEM_ERROR0(); |
| 1054 | } else if (token->token == ctxt->key_comma) { |
| 1055 | grp = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_group); |
| 1056 | if (grp == NULL) CRNG_MEM_ERROR0(); |
| 1057 | } else |
| 1058 | break; |
| 1059 | xmlParseCRNGDropTokens(ctxt, 1); |
| 1060 | ctxt->insert = NULL; |
| 1061 | xmlParseCRNG_particle(ctxt); |
| 1062 | xmlAddChild(grp, prev); |
| 1063 | xmlAddChild(grp, ctxt->insert); |
| 1064 | prev = grp; |
| 1065 | token = xmlParseCRNGGetToken(ctxt, 1); |
| 1066 | } |
| 1067 | if (insert != NULL) { |
| 1068 | xmlAddChild(insert, prev); |
| 1069 | ctxt->insert = insert; |
| 1070 | } else { |
| 1071 | ctxt->insert = prev; |
| 1072 | } |
| 1073 | |
| 1074 | return(0); |
| 1075 | } |
| 1076 | |
| 1077 | /** |
| 1078 | * xmlParseCRNG_component: |
no test coverage detected