00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef __MXTOK_H_
00017 #define __MXTOK_H_
00018
00019 #include<iostream>
00020 #include<vector>
00021 #include<string>
00022
00023 namespace token {
00024 template<typename type>
00025
00026 type substr(type t, size_t start, size_t stop) {
00027 type temp;
00028 for(size_t i = start; i < stop; i++)
00029 temp += t[i];
00030 return temp;
00031 }
00032
00033
00034 template<> char* substr(char *t, size_t start, size_t stop) {
00035 char *temp = new char [ stop-start ];
00036 size_t pos = 0;
00037 for(size_t i = start; i < stop; i++)
00038 temp[pos++] = t[i];
00039 temp[pos] = 0;
00040 return temp;
00041 }
00042
00043 template<typename type>
00044
00045 size_t len(type &t) {
00046 size_t c;
00047 for(c = 0; t[c] != 0; c++);
00048 return c;
00049 }
00050
00051 template<typename type>
00052
00053 size_t find(size_t start, type& source, type& sub) {
00054
00055
00056 for(size_t i = start; source[i] != 0; i++) {
00057 bool add = true;
00058
00059
00060 for(size_t z = 0; sub[z] != 0; z++) {
00061
00062
00063 if(source[i+z] != sub[z]) {
00064 add = false;
00065 break;
00066 }
00067 }
00068 if(add == true)
00069 return i;
00070 }
00071 return 0;
00072 }
00073
00074 template<typename type>
00075
00076 size_t tokenize(type source, type delim, std::vector<type> &v) {
00077 size_t i = find<type>(0,source,delim),z=0;
00078 size_t lenz = len<type>(source), dlen = len<type>(delim);
00079
00080
00081 while ( i != 0 && i < lenz && z < lenz ) {
00082 v.push_back(substr(source,z,i));
00083 z = i+dlen;
00084 i = find<type>(i+1, source, delim);
00085 }
00086 if( z < lenz ) v.push_back( substr(source,z,lenz) );
00087 return v.size();
00088 }
00089
00090 }
00091
00092 #endif
00093