1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
// see EStringTokenizer.h for license details.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "EStringTokenizer.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <strings.h>
//-----------------------------------------------------------------------------
enum quoteEnum { NO_QUOTE=0, SINGLE_QUOTE, DOUBLE_QUOTE };
EStringTokenizer::EStringTokenizer()
{
buffer = 0;
pos = 0;
end = 0;
bufLen = 0;
}
void EStringTokenizer::tokenize( const char *str, const char *_separators )
{
if ( *str == '\0' )
{
pos = 0;
return;
}
int strLength = strlen( str ) + 1;
if ( bufLen < strLength )
{
delete [] buffer;
buffer = new char[ strLength ];
bufLen = strLength;
}
const char *src = str;
end = buffer;
int quoted = NO_QUOTE;
for ( ; *src != '\0'; src++ )
{
const char *x = strchr( _separators, *src );
if (( *src == '\"' ) && !quoted)
quoted = DOUBLE_QUOTE;
else if (( *src == '\'') && !quoted)
quoted = SINGLE_QUOTE;
else if ( (( *src == '\"') && (quoted == DOUBLE_QUOTE)) ||
(( *src == '\'') && (quoted == SINGLE_QUOTE)))
quoted = NO_QUOTE;
else if ( x && !quoted )
*end++ = 0;
else
*end++ = *src;
}
*end = 0;
if ( end - buffer < 1 )
{
// that check used to be <=1, but changed by stephan
// because this thing failes to tokenize 1-char strings :/
// i /hope/ it doesn't have evil side-effects!!!
// Been using it 3 years with this bug and never noticed it. :/
pos = 0; // no tokens
}
else
pos = buffer;
}
const char* EStringTokenizer::nextToken()
{
if ( pos == 0 )
return 0;
char *ret = pos;
pos += strlen( ret ) + 1;
if ( pos >= end )
pos = 0;
return ret;
}
EStringTokenizer::~EStringTokenizer()
{
if ( buffer != 0 )
delete [] buffer;
}
|