00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "LampBasic.h"
00026 #include "Core/Utility/StringTokenizer.h"
00027 #include "Core/System/StringMethod.h"
00028
00029 namespace Lamp{
00030
00031
00032 const String StringTokenizer::defaultDelimiter(" \t\n\r\f");
00033
00034
00035
00036 StringTokenizer::StringTokenizer() :
00037 base_(NULL), current_(NULL), tokenOffset_(0), delimiterOutput_(false){
00038 }
00039
00040
00041 void StringTokenizer::initialize(const char* target,
00042 const String& delimiter, bool delimiterOutput){
00043 base_ = current_ = target;
00044 tokenOffset_ = 0;
00045 delimiter_ = delimiter;
00046 delimiterOutput_ = delimiterOutput;
00047 nowToken_ = "";
00048 previousToken_ = "";
00049 }
00050
00051
00052 void StringTokenizer::initialize(const String& target,
00053 const String& delimiter, bool delimiterOutput){
00054 targetString_ = target;
00055 initialize(target.getBytes(), delimiter, delimiterOutput);
00056 }
00057
00058
00059 StringTokenizer::~StringTokenizer(){
00060 }
00061
00062
00063 bool StringTokenizer::hasMoreTokens(){
00064 if(current_ == NULL){ return false; }
00065 if(delimiterOutput_){ return ((*current_) != '\0'); }
00066 while(true){
00067 if((*current_) == '\0'){ return false; }
00068 int index = (int)StdStrcspn(current_, delimiter_.getBytes());
00069 if(index != 0){ break; }
00070 current_ = StdStrinc(current_);
00071 }
00072 return true;
00073 }
00074
00075
00076 String StringTokenizer::getNextToken(){
00077 Assert((*current_) != '\0');
00078 tokenOffset_ = (int)(current_ - base_);
00079
00080 int index = (int)StdStrcspn(current_, delimiter_.getBytes());
00081 if(delimiterOutput_ && (index == 0)){
00082 const char* prevCurrent = current_;
00083 current_ = StdStrinc(current_);
00084 int length = (int)(current_ - prevCurrent);
00085 char* newString = new char[length + 1];
00086 StdStrncpy(newString, prevCurrent, length);
00087 newString[length] = '\0';
00088 previousToken_ = nowToken_;
00089 nowToken_ = newString;
00090 delete[] newString;
00091 return nowToken_;
00092 }
00093 char* newString = new char[index + 1];
00094 StdStrncpy(newString, current_, index);
00095 newString[index] = '\0';
00096 previousToken_ = nowToken_;
00097 nowToken_ = newString;
00098 delete[] newString;
00099 current_ += index;
00100 return nowToken_;
00101 }
00102
00103 }
00104