Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Again, more work on introspection of validation state. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | wip |
Files: | files | file ages | folders |
SHA3-256: |
5dd7e9928d051885a01dcd1d284caf8e |
User & Date: | rolf 2019-10-04 12:15:42 |
Context
2019-10-04
| ||
16:13 | More correct handling of interleave content particle in validation state introspection. check-in: 4c3f653e15 user: rolf tags: wip | |
12:15 | Again, more work on introspection of validation state. check-in: 5dd7e9928d user: rolf tags: wip | |
2019-10-03
| ||
22:39 | More work on introspection of validation state. check-in: 4328236591 user: rolf tags: wip | |
Changes
Changes to generic/schema.c.
757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 .... 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 .... 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 .... 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 .... 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 .... 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 .... 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 .... 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 .... 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 .... 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 .... 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 .... 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 |
stackElm = TMALLOC (SchemaValidationStack); } memset (stackElm, 0, sizeof (SchemaValidationStack)); stackElm->pattern = pattern; return stackElm; } static void pushToStack ( SchemaData *sdata, SchemaCP *pattern ) { SchemaValidationStack *stackElm, *se; DBG(fprintf(stderr, "push to Stack:\n");serializeCP(pattern)); if (sdata->stackPool) { stackElm = sdata->stackPool; sdata->stackPool = stackElm->down; } else { stackElm = TMALLOC (SchemaValidationStack); } memset (stackElm, 0, sizeof (SchemaValidationStack)); se = sdata->stack; stackElm->down = se; stackElm->pattern = pattern; if (pattern->type == SCHEMA_CTYPE_INTERLEAVE) { stackElm->interleaveState = MALLOC (sizeof (int) * pattern->nc); memset (stackElm->interleaveState, 0, sizeof (int) * pattern->nc); } sdata->stack = stackElm; ................................................................................ case SCHEMA_CTYPE_NAME: DBG(fprintf (stderr, "name: %s ns: %s candidate name: %s " "candidate ns: %s\n", name, namespace, candidate->name, candidate->namespace)); if (candidate->name == name && candidate->namespace == namespace) { updateStack (se, cp, ac); pushToStack (sdata, candidate); return 1; } break; case SCHEMA_CTYPE_CHOICE: for (i = 0; i < candidate->nc; i++) { icp = candidate->content[i]; ................................................................................ updateStack (se, cp, ac); sdata->skipDeep = 1; return 1; case SCHEMA_CTYPE_NAME: if (icp->name == name && icp->namespace == namespace) { pushToStack (sdata, icp); updateStack (se, cp, ac); return 1; } break; case SCHEMA_CTYPE_CHOICE: Tcl_Panic ("MIXED or CHOICE child of MIXED or CHOICE"); case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, icp); rc = matchElementStart (interp, sdata, name, namespace); if (rc == 1) { updateStack (se, cp, ac); return 1; } popStack (sdata); if (rc == -1) mayskip = 1; ................................................................................ mayskip = 1; break; } else return 0; case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, candidate); rc = matchElementStart (interp, sdata, name, namespace); if (rc == 1) { updateStack (se, cp, ac); return 1; } popStack (sdata); break; ................................................................................ se->hasMatched = 1; se->interleaveState[i] = 1; return 1; case SCHEMA_CTYPE_NAME: if (icp->name == name && icp->namespace == namespace) { pushToStack (sdata, icp); se->hasMatched = 1; se->interleaveState[i] = 1; return 1; } break; case SCHEMA_CTYPE_CHOICE: Tcl_Panic ("MIXED or CHOICE child of INTERLEAVE"); case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, icp); rc = matchElementStart (interp, sdata, name, namespace); if (rc == 1) { se->hasMatched = 1; se->interleaveState[i] = 1; return 1; } popStack (sdata); ................................................................................ if (recover (interp, sdata, S("UNKNOWN_ROOT_ELEMENT"), 0, 0)) { sdata->skipDeep = 1; return TCL_OK; } SetResult ("Unknown element"); return TCL_ERROR; } pushToStack (sdata, pattern); return TCL_OK; } /* The normal case: we're inside the tree */ rc = matchElementStart (interp, sdata, (char *) namePtr, namespacePtr); while (rc == -1) { popStack (sdata); ................................................................................ case SCHEMA_CTYPE_NAME: case SCHEMA_CTYPE_ANY: continue; case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, ic); if (checkElementEnd (interp, sdata)) { mayMiss = 1; } popStack (sdata); break; case SCHEMA_CTYPE_KEYSPACE_END: ................................................................................ case SCHEMA_CTYPE_VIRTUAL: if (evalVirtual (interp, sdata, ac)) break; else return 0; case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, cp->content[ac]); rc = checkElementEnd (interp, sdata); popStack (sdata); if (rc) break; return 0; case SCHEMA_CTYPE_ANY: if (recover (interp, sdata, S("MISSING_ANY"), 0, 0)) { ................................................................................ case SCHEMA_CTYPE_NAME: case SCHEMA_CTYPE_ANY: break; case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, ic); if (matchText (interp, sdata, text)) { updateStack (se, cp, ac); return 1; } popStack (sdata); break; ................................................................................ SetResult ("Unexpected text content"); return 0; } break; case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, candidate); if (matchText (interp, sdata, text)) { updateStack (se, cp, ac); return 1; } popStack (sdata); if (mustMatch (cp->quants[ac], hm)) { SetResult ("Unexpected text content"); ................................................................................ case SCHEMA_CTYPE_NAME: case SCHEMA_CTYPE_ANY: break; case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, ic); if (matchText (interp, sdata, text)) { updateStack (se, cp, ac); return 1; } popStack (sdata); break; ................................................................................ case SCHEMA_CTYPE_KEYSPACE_END: Tcl_Panic ("Invalid CTYPE onto the validation stack!"); } if (cp->type == SCHEMA_CTYPE_NAME) { return; } if (se->down) { getFrontExpected (sdata, se->down, interp, seenCPs, rObj); } } static int schemaInstanceInfoCmd ( SchemaData *sdata, Tcl_Interp *interp, |
> > > | > > > < | | | | | | | | | | | > > > |
757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 .... 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 .... 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 .... 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 .... 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 .... 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 .... 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 .... 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 .... 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 .... 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 .... 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 .... 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 |
stackElm = TMALLOC (SchemaValidationStack); } memset (stackElm, 0, sizeof (SchemaValidationStack)); stackElm->pattern = pattern; return stackElm; } /* The ac argument is the currend looked at child of the stack top * (which is not pattern, in case the looked ad child of the stack top * is SCHEMA_CTYPE_CHOICE). */ static void pushToStack ( SchemaData *sdata, SchemaCP *pattern, int ac ) { SchemaValidationStack *stackElm, *se; DBG(fprintf(stderr, "push to Stack:\n");serializeCP(pattern)); if (sdata->stackPool) { stackElm = sdata->stackPool; sdata->stackPool = stackElm->down; } else { stackElm = TMALLOC (SchemaValidationStack); } memset (stackElm, 0, sizeof (SchemaValidationStack)); se = sdata->stack; if (se) se->activeChild = ac; stackElm->down = se; stackElm->pattern = pattern; if (pattern->type == SCHEMA_CTYPE_INTERLEAVE) { stackElm->interleaveState = MALLOC (sizeof (int) * pattern->nc); memset (stackElm->interleaveState, 0, sizeof (int) * pattern->nc); } sdata->stack = stackElm; ................................................................................ case SCHEMA_CTYPE_NAME: DBG(fprintf (stderr, "name: %s ns: %s candidate name: %s " "candidate ns: %s\n", name, namespace, candidate->name, candidate->namespace)); if (candidate->name == name && candidate->namespace == namespace) { pushToStack (sdata, candidate, ac); updateStack (se, cp, ac); return 1; } break; case SCHEMA_CTYPE_CHOICE: for (i = 0; i < candidate->nc; i++) { icp = candidate->content[i]; ................................................................................ updateStack (se, cp, ac); sdata->skipDeep = 1; return 1; case SCHEMA_CTYPE_NAME: if (icp->name == name && icp->namespace == namespace) { pushToStack (sdata, icp, ac); updateStack (se, cp, ac); return 1; } break; case SCHEMA_CTYPE_CHOICE: Tcl_Panic ("MIXED or CHOICE child of MIXED or CHOICE"); case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, icp, ac); rc = matchElementStart (interp, sdata, name, namespace); if (rc == 1) { updateStack (se, cp, ac); return 1; } popStack (sdata); if (rc == -1) mayskip = 1; ................................................................................ mayskip = 1; break; } else return 0; case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, candidate, ac); rc = matchElementStart (interp, sdata, name, namespace); if (rc == 1) { updateStack (se, cp, ac); return 1; } popStack (sdata); break; ................................................................................ se->hasMatched = 1; se->interleaveState[i] = 1; return 1; case SCHEMA_CTYPE_NAME: if (icp->name == name && icp->namespace == namespace) { pushToStack (sdata, icp, 0); se->hasMatched = 1; se->interleaveState[i] = 1; return 1; } break; case SCHEMA_CTYPE_CHOICE: Tcl_Panic ("MIXED or CHOICE child of INTERLEAVE"); case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, icp, 0); rc = matchElementStart (interp, sdata, name, namespace); if (rc == 1) { se->hasMatched = 1; se->interleaveState[i] = 1; return 1; } popStack (sdata); ................................................................................ if (recover (interp, sdata, S("UNKNOWN_ROOT_ELEMENT"), 0, 0)) { sdata->skipDeep = 1; return TCL_OK; } SetResult ("Unknown element"); return TCL_ERROR; } pushToStack (sdata, pattern, 0); return TCL_OK; } /* The normal case: we're inside the tree */ rc = matchElementStart (interp, sdata, (char *) namePtr, namespacePtr); while (rc == -1) { popStack (sdata); ................................................................................ case SCHEMA_CTYPE_NAME: case SCHEMA_CTYPE_ANY: continue; case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, ic, ac); if (checkElementEnd (interp, sdata)) { mayMiss = 1; } popStack (sdata); break; case SCHEMA_CTYPE_KEYSPACE_END: ................................................................................ case SCHEMA_CTYPE_VIRTUAL: if (evalVirtual (interp, sdata, ac)) break; else return 0; case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, cp->content[ac], ac); rc = checkElementEnd (interp, sdata); popStack (sdata); if (rc) break; return 0; case SCHEMA_CTYPE_ANY: if (recover (interp, sdata, S("MISSING_ANY"), 0, 0)) { ................................................................................ case SCHEMA_CTYPE_NAME: case SCHEMA_CTYPE_ANY: break; case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, ic, ac); if (matchText (interp, sdata, text)) { updateStack (se, cp, ac); return 1; } popStack (sdata); break; ................................................................................ SetResult ("Unexpected text content"); return 0; } break; case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, candidate, ac); if (matchText (interp, sdata, text)) { updateStack (se, cp, ac); return 1; } popStack (sdata); if (mustMatch (cp->quants[ac], hm)) { SetResult ("Unexpected text content"); ................................................................................ case SCHEMA_CTYPE_NAME: case SCHEMA_CTYPE_ANY: break; case SCHEMA_CTYPE_INTERLEAVE: case SCHEMA_CTYPE_PATTERN: pushToStack (sdata, ic, 0); if (matchText (interp, sdata, text)) { updateStack (se, cp, ac); return 1; } popStack (sdata); break; ................................................................................ case SCHEMA_CTYPE_KEYSPACE_END: Tcl_Panic ("Invalid CTYPE onto the validation stack!"); } if (cp->type == SCHEMA_CTYPE_NAME) { return; } if (se->down) { hm = se->down->hasMatched; se->down->hasMatched = 1; getFrontExpected (sdata, se->down, interp, seenCPs, rObj); se->down->hasMatched = hm; } } static int schemaInstanceInfoCmd ( SchemaData *sdata, Tcl_Interp *interp, |