/* "Special" commands code fragment
The contract here is:
The commands may alter any of the tag-specific variables
errors may be indicated if encountered in childReturnCode and the error* variables
setting childReturnCode equal to FAILURE_CODE declares that the read head has not moved
childReturnCode must be set (or default "you have to move forward to match" semantics are used)
*/
/* doesn't there need to be a check for integer arguments
that the value is an integer?
Or does the compiler do that now */
case MATCH_FAIL: /* == MATCH_JUMP */
/* dumb question, what is MATCH_JUMP supposed to do? */
childReturnCode = FAILURE_CODE;
break;
case MATCH_SKIP:
/* Argh, what to do when moves past buffer?
Where do we check that this is still in-bounds?
documented as always succeeding, but results in
result-tuples with negative or out-of-range values
in current code.
Can't do:
if (childPosition < sliceleft) {
childPosition = 0;
} else if (childPosition > sliceright) {
childPosition = sliceright;
}
because we might have another move, or an EOF
or whatever coming up.
Marc-André want's these conditions:
childPosition < 0 { # (not sliceleft!)
raise TypeError: Tag Table entry %(index): moved/skipped beyond start of text
} and no check for > right or beyond end of buffer...
*/
DPRINTF("\nSkip %li characters\n"
" in string = '%.40s'\n",
PyInt_AS_LONG(match),text+childPosition);
childPosition += PyInt_AS_LONG(match);
childReturnCode = SUCCESS_CODE;
break;
case MATCH_MOVE:
/* same potential out-of-bounds issue as with skip */
childPosition = PyInt_AS_LONG(match);
if (childPosition < 0) {
/* Relative to end of the slice */
childPosition += sliceright + 1;
} else {
/* Relative to beginning of the slice */
childPosition += sliceleft;
}
DPRINTF("\nMove to position %i \n"
" string = '%.40s'\n",
childPosition,text+childPosition);
childReturnCode = SUCCESS_CODE;
break;
case MATCH_EOF:
DPRINTF("\nEOF at position %i ? \n"
" string = '%.40s'\n",
childPosition,text+childPosition);
if (sliceright > childPosition) { /* not matched */
childReturnCode = FAILURE_CODE;
} else {
/* I don't see why this would necessarily be the end of the parsing run, after all
you might want to match EOF, then back up X characters? The documentation doesn't
mention anything about such a restriction.
Approach here seems to match documentation functionality
but still suffers the out-of-range problems seen in move
and skip commands as well.
*/
childReturnCode = SUCCESS_CODE;
childPosition = sliceright;
childStart = sliceright;
}
break;
case MATCH_JUMPTARGET:
/* note: currently this can report a value, though I don't think
that was intended originally. I see it as useful because it lets
you enter a flag in the results table just by specifying a non-None
tagobj */
/* null operation */
DPRINTF("\nJumpTarget '%.40s' (skipped)\n",
PyString_AsString(match));
childReturnCode = SUCCESS_CODE;
break;
syntax highlighted by Code2HTML, v. 0.9.1