1.1 --- a/core/TextParsers.cpp Sun Feb 01 19:58:16 2009 -0500
1.2 +++ b/core/TextParsers.cpp Sun Feb 01 20:31:27 2009 -0500
1.3 @@ -80,45 +80,6 @@
1.4 }
1.5
1.6 /**
1.7 - * Character streams
1.8 - */
1.9 -
1.10 -struct CharStream
1.11 -{
1.12 - const char *curpos;
1.13 -};
1.14 -
1.15 -bool CharStreamReader(void *stream, char *buffer, size_t maxlength, unsigned int *read)
1.16 -{
1.17 - CharStream *srdr = (CharStream *)stream;
1.18 -
1.19 - const char *ptr = srdr->curpos;
1.20 - for (size_t i=0; i<maxlength; i++)
1.21 - {
1.22 - if (*ptr == '\0')
1.23 - {
1.24 - break;
1.25 - }
1.26 - *buffer++ = *ptr++;
1.27 - }
1.28 -
1.29 - *read = ptr - srdr->curpos;
1.30 -
1.31 - srdr->curpos = ptr;
1.32 -
1.33 - return true;
1.34 -}
1.35 -
1.36 -SMCError TextParsers::ParseString_SMC(const char *stream,
1.37 - ITextListener_SMC *smc,
1.38 - SMCStates *states)
1.39 -{
1.40 - CharStream srdr = { stream };
1.41 -
1.42 - return ParseStream_SMC(&srdr, CharStreamReader, smc, states);
1.43 -}
1.44 -
1.45 -/**
1.46 * File streams
1.47 */
1.48
1.49 @@ -189,6 +150,57 @@
1.50 return result;
1.51 }
1.52
1.53 +struct RawStream
1.54 +{
1.55 + const char *stream;
1.56 + size_t length;
1.57 + size_t pos;
1.58 +};
1.59 +
1.60 +bool RawStreamReader(void *stream, char *buffer, size_t maxlength, unsigned int *read)
1.61 +{
1.62 + RawStream *rs = (RawStream *)stream;
1.63 +
1.64 + if (rs->pos >= rs->length)
1.65 + {
1.66 + return false;
1.67 + }
1.68 +
1.69 + size_t remaining = rs->length - rs->pos;
1.70 +
1.71 + /* Use the smaller of the two */
1.72 + size_t copy = (remaining > maxlength) ? maxlength : remaining;
1.73 +
1.74 + memcpy(buffer, &rs->stream[rs->pos], copy);
1.75 + rs->pos += copy;
1.76 + *read = copy;
1.77 + assert(rs->pos <= rs->length);
1.78 +
1.79 + return true;
1.80 +}
1.81 +
1.82 +SMCError TextParsers::ParseSMCStream(const char *stream,
1.83 + size_t length,
1.84 + ITextListener_SMC *smc_listener,
1.85 + SMCStates *states,
1.86 + char *buffer,
1.87 + size_t maxsize)
1.88 +{
1.89 + RawStream rs;
1.90 + SMCError result;
1.91 +
1.92 + rs.stream = stream;
1.93 + rs.length = length;
1.94 + rs.pos = 0;
1.95 +
1.96 + result = ParseStream_SMC(&rs, RawStreamReader, smc_listener, states);
1.97 +
1.98 + const char *errstr = GetSMCErrorString(result);
1.99 + UTIL_Format(buffer, maxsize, "%s", errstr != NULL ? errstr : "Unknown error");
1.100 +
1.101 + return result;
1.102 +}
1.103 +
1.104 /**
1.105 * Raw parsing of streams with helper functions
1.106 */