core/TextParsers.cpp
changeset 2558 178d7954939d
parent 2289 44045ead61cd
child 2702 e5478415190e
     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   */