| 4663 | */ |
| 4664 | |
| 4665 | static int |
| 4666 | xmlValidateElementType(xmlValidCtxtPtr ctxt) { |
| 4667 | int ret = -1; |
| 4668 | int determinist = 1; |
| 4669 | |
| 4670 | NODE = xmlValidateSkipIgnorable(NODE); |
| 4671 | if ((NODE == NULL) && (CONT == NULL)) |
| 4672 | return(1); |
| 4673 | if ((NODE == NULL) && |
| 4674 | ((CONT->ocur == XML_ELEMENT_CONTENT_MULT) || |
| 4675 | (CONT->ocur == XML_ELEMENT_CONTENT_OPT))) { |
| 4676 | return(1); |
| 4677 | } |
| 4678 | if (CONT == NULL) return(-1); |
| 4679 | if ((NODE != NULL) && (NODE->type == XML_ENTITY_REF_NODE)) |
| 4680 | return(-2); |
| 4681 | |
| 4682 | /* |
| 4683 | * We arrive here when more states need to be examined |
| 4684 | */ |
| 4685 | cont: |
| 4686 | |
| 4687 | /* |
| 4688 | * We just recovered from a rollback generated by a possible |
| 4689 | * epsilon transition, go directly to the analysis phase |
| 4690 | */ |
| 4691 | if (STATE == ROLLBACK_PARENT) { |
| 4692 | ret = 1; |
| 4693 | goto analyze; |
| 4694 | } |
| 4695 | |
| 4696 | /* |
| 4697 | * we may have to save a backup state here. This is the equivalent |
| 4698 | * of handling epsilon transition in NFAs. |
| 4699 | */ |
| 4700 | if ((CONT != NULL) && |
| 4701 | ((CONT->parent == NULL) || |
| 4702 | (CONT->parent == (xmlElementContentPtr) 1) || |
| 4703 | (CONT->parent->type != XML_ELEMENT_CONTENT_OR)) && |
| 4704 | ((CONT->ocur == XML_ELEMENT_CONTENT_MULT) || |
| 4705 | (CONT->ocur == XML_ELEMENT_CONTENT_OPT) || |
| 4706 | ((CONT->ocur == XML_ELEMENT_CONTENT_PLUS) && (OCCURRENCE)))) { |
| 4707 | if (vstateVPush(ctxt, CONT, NODE, DEPTH, OCCURS, ROLLBACK_PARENT) < 0) |
| 4708 | return(0); |
| 4709 | } |
| 4710 | |
| 4711 | |
| 4712 | /* |
| 4713 | * Check first if the content matches |
| 4714 | */ |
| 4715 | switch (CONT->type) { |
| 4716 | case XML_ELEMENT_CONTENT_PCDATA: |
| 4717 | if (NODE == NULL) { |
| 4718 | ret = 0; |
| 4719 | break; |
| 4720 | } |
| 4721 | if (NODE->type == XML_TEXT_NODE) { |
| 4722 | /* |
no test coverage detected