separator pre-parsing did not work as expected. Problems with whitespace separators. Back to old soluton

This commit is contained in:
zimoch
2010-12-07 10:07:58 +00:00
parent 6b948abc2d
commit 9619c359c1

View File

@ -722,7 +722,8 @@ printSeparator()
long i = 0; long i = 0;
for (; i < separator.length(); i++) for (; i < separator.length(); i++)
{ {
if (separator[i] == StreamProtocolParser::skip) continue; // wildcard if (separator[i] == StreamProtocolParser::skip ||
separator[i] == StreamProtocolParser::whitespace) continue; // wildcards
if (separator[i] == esc) i++; // escaped literal byte if (separator[i] == esc) i++; // escaped literal byte
outputLine.append(separator[i]); outputLine.append(separator[i]);
} }
@ -1299,7 +1300,7 @@ matchInput()
// ignore next input byte // ignore next input byte
consumedInput++; consumedInput++;
break; break;
case ' ': case StreamProtocolParser::whitespace:
// any number of whitespace (including 0) // any number of whitespace (including 0)
while (isspace(inputLine[consumedInput])) consumedInput++; while (isspace(inputLine[consumedInput])) consumedInput++;
break; break;
@ -1378,96 +1379,43 @@ matchSeparator()
{ {
// called before value is read, first value has Separator flag cleared // called before value is read, first value has Separator flag cleared
// for second and next value set Separator flag // for second and next value set Separator flag
// first skip over leading separator (all but first value)
// then find next separator and terminate with null byte to
// help parsing one value (e.g. %s)
if (!separator) { if (!separator) {
separatorStart = -1; // empty separator matches
return true; return true;
} }
if (flags & Separator) if (!(flags & Separator))
{
// not first element in array: expect to be at the separator
if (separatorStart == -1) {
return false; // no separator found
}
if (separator[0] == ' ' && separator.length() == 1
&& consumedInput != separatorStart)
{
// space-only separator may have matched zero spaces
// last found separator is still ahead
inputLine[separatorStart] = '\0';
return true;
}
if (consumedInput != separatorStart)
{
long i = separatorStart - consumedInput;
error("%s: %ld byte%s input left before separator: \"%s%s\" after \"%s%s\"\n",
name(), i, i != 1 ? "s" : "",
inputLine.expand(consumedInput, i > 20 ? 20 : i)(),
i > 20 ? "..." : "",
consumedInput > 20 ? "..." : "",
inputLine.expand(consumedInput, -20)());
return false;
}
consumedInput = separatorEnd;
}
else
{ {
// before first element, don't expect separator yet
flags |= Separator; flags |= Separator;
return true;
} }
long i;
// find next Separator and replace first byte with '\0' to help parsing elements long j = consumedInput;
// don't worry now if there is none, just set separatorStart = -1 for (i = 0; i < separator.length(); i++)
if (separator[0] == ' ' && separator.length() == 1)
{ {
// space-only separator: find any whitespace after non-whitespace switch (separator[i])
long j = consumedInput;
while (isspace(inputLine[j])) j++;
if (!inputLine[j]) {
separatorStart = -1;
return true;
}
while (inputLine[j] && !isspace(inputLine[j])) j++;
separatorStart = j;
while (isspace(inputLine[j])) j++;
separatorEnd = j;
}
else
{
long i = 0;
if (separator[0] == ' ' && separator[1] != ' ')
i = 1; // handle leading whitespaces later
separatorStart = inputLine.find(separator[i], consumedInput);
if (separatorStart == -1) return true;
// check rest of separator and handle escapes
long j;
for (j = separatorStart+1; ++i < separator.length(); j++)
{ {
if (separator[i] == StreamProtocolParser::skip) continue; // wildcard case StreamProtocolParser::skip:
// allow format here? j++;
if (separator[i] == esc) i++; // escaped literal byte continue;
if (separator[i] != inputLine[j]) case StreamProtocolParser::whitespace:
{ while (isspace(inputLine[j])) j++;
separatorStart = -1; continue;
return true; case esc:
} i++;
} default:
separatorEnd = j; if (separator[i] != inputLine[j])
// separator found {
if (separator[0] == ' ' && separator[1] != ' ') // no match
{ // don't complain here, just return false
// now skip leading whitespaces return false;
while (separatorStart > consumedInput && }
isspace(inputLine[separatorStart - 1])) separatorStart--; j++;
} }
} }
separatorStore = inputLine[separatorStart]; // separator successfully read
inputLine[separatorStart] = '\0'; consumedInput = j;
return true; return true;
} }
@ -1484,7 +1432,6 @@ scanValue(const StreamFormat& fmt, long& value)
if (!matchSeparator()) return -1; if (!matchSeparator()) return -1;
long consumed = StreamFormatConverter::find(fmt.conv)-> long consumed = StreamFormatConverter::find(fmt.conv)->
scanLong(fmt, inputLine(consumedInput), value); scanLong(fmt, inputLine(consumedInput), value);
if (separatorStart >= 0) inputLine[separatorStart] = separatorStore;
debug("StreamCore::scanValue(%s, format=%%%c, long) input=\"%s\"\n", debug("StreamCore::scanValue(%s, format=%%%c, long) input=\"%s\"\n",
name(), fmt.conv, inputLine.expand(consumedInput)()); name(), fmt.conv, inputLine.expand(consumedInput)());
if (consumed < 0) if (consumed < 0)
@ -1516,7 +1463,6 @@ scanValue(const StreamFormat& fmt, double& value)
if (!matchSeparator()) return -1; if (!matchSeparator()) return -1;
long consumed = StreamFormatConverter::find(fmt.conv)-> long consumed = StreamFormatConverter::find(fmt.conv)->
scanDouble(fmt, inputLine(consumedInput), value); scanDouble(fmt, inputLine(consumedInput), value);
if (separatorStart >= 0) inputLine[separatorStart] = separatorStore;
debug("StreamCore::scanValue(%s, format=%%%c, double) input=\"%s\"\n", debug("StreamCore::scanValue(%s, format=%%%c, double) input=\"%s\"\n",
name(), fmt.conv, inputLine.expand(consumedInput, 20)()); name(), fmt.conv, inputLine.expand(consumedInput, 20)());
if (consumed < 0) if (consumed < 0)
@ -1549,7 +1495,6 @@ scanValue(const StreamFormat& fmt, char* value, long maxlen)
if (!matchSeparator()) return -1; if (!matchSeparator()) return -1;
long consumed = StreamFormatConverter::find(fmt.conv)-> long consumed = StreamFormatConverter::find(fmt.conv)->
scanString(fmt, inputLine(consumedInput), value, maxlen); scanString(fmt, inputLine(consumedInput), value, maxlen);
if (separatorStart >= 0) inputLine[separatorStart] = separatorStore;
debug("StreamCore::scanValue(%s, format=%%%c, char*, maxlen=%ld) input=\"%s\"\n", debug("StreamCore::scanValue(%s, format=%%%c, char*, maxlen=%ld) input=\"%s\"\n",
name(), fmt.conv, maxlen, inputLine.expand(consumedInput)()); name(), fmt.conv, maxlen, inputLine.expand(consumedInput)());
if (consumed < 0) if (consumed < 0)