home *** CD-ROM | disk | FTP | other *** search
- #include "Tokenizer.h"
-
- #include <string.h>
-
- Tokenizer::Tokenizer(const char* string, const char* separators, const char* brackets){
- for(int i=0;i<TOKENIZER_MAX_TOKENS;i++)
- tokv[i]=NULL;
-
- this->separators=separators;
- this->brackets=brackets;
-
- tokenize(string);
- }
-
- Tokenizer::Tokenizer(const char* separators, const char* brackets){
- for(int i=0;i<TOKENIZER_MAX_TOKENS;i++)
- tokv[i]=NULL;
-
- this->separators=separators;
- this->brackets=brackets;
- }
-
- Tokenizer::~Tokenizer(){
- clearTokens(); // free allocated memory for tokv
- }
-
-
- bool Tokenizer::tokenize(const char* string){
- char* p=(char*)string;
- char* startp=(char*)string;
- bool bracketsOpened=false;
-
- clearTokens();
-
- while(*p!='\0'){
- if(contains(separators, *p) && !bracketsOpened){ // if we've read a 'bracket'-char all seps are ignored until
- if(startp!=p){ // we reach the 'closing bracket'.
- if(!addToken(startp, p-startp))
- return false;
- }
- startp=p+1;
- }
-
- if(contains(brackets, *p)){
- if(bracketsOpened){ // bracket opened -> close bracket
- if(contains(separators, *p)){ // if bracket is also separator add token
- if(!addToken(startp, p-startp))
- return false;
- startp=p+1;
- }
- bracketsOpened=false;
- }else{ // opening bracket -> just remember that in 'bracketsOpened'
- // if(startp!=p){
- // if(!addToken(startp, p-startp))
- // return false;
- // }
- bracketsOpened=true;
- }
- // startp=p+1; // ignore 'brackets'
- }
- p++;
- if(*p=='\0' && startp!=p){ // make sure we also get the last token in the string
- addToken(startp, p-startp);
- }
- }
-
-
- return true;
- }
-
-
- bool Tokenizer::contains(const char* str, char c){
- char *p=(char*)str;
-
- while(*p!='\0'){ // go through entire string and see, if we can find character 'c'
- if(c==*p)
- return true;
- p++;
- }
- return false;
- }
-
- bool Tokenizer::addToken(char *start, unsigned int length){
- if(tokc>=TOKENIZER_MAX_TOKENS)
- return false; // no more free slots
-
- tokv[tokc]=strncpy(new char[length+1], start, length); // allocate mem and copy token into it
- tokv[tokc][length]='\0'; // append \0
- tokc++; // and finaly increase counter
- return true;
- }
-
- void Tokenizer::clearTokens(){
- tokc=0; // reset token counter
- for(int i=0; i<TOKENIZER_MAX_TOKENS; i++){ // delete all tokens from previous calls
- if(tokv[i]!=NULL){
- delete[] tokv[i];
- tokv[i]=NULL;
- }
- }
- }
-
- char* newString(const char* str){
- return strcpy(new char[strlen(str)+1], (str));
- }
-
- char* newString(const char* start, int length){
- char* ret=strncpy(new char[length+1], start, length);
- ret[length]='\0';
-
- return ret;
- }
-