00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "weStrings.h"
00022 #include "boost/regex.hpp"
00023
00024 using namespace boost;
00025
00026 WeStringLinks::WeStringLinks( string sep , string delim ) :
00027 WeLinkedList<string, string>()
00028 {
00029 separator = sep;
00030 delimiter = delim;
00031 }
00032
00033 WeStringLinks::WeStringLinks( WeStringLinks& lst )
00034 {
00035 WeLinkedString *obj;
00036
00037 data = NULL;
00038 curr = NULL;
00039 separator = lst.separator;
00040 delimiter = lst.delimiter;
00041 obj = lst.First();
00042 data = new WeLinkedString(*obj);
00043 curr = data;
00044 obj = lst++;
00045 while (obj != NULL) {
00046 curr->Add(new WeLinkedString(*obj));
00047 curr = curr->Next();
00048 obj = lst++;
00049 }
00050 }
00051
00052 void WeStringLinks::Parse( string data, string sep , string delim )
00053 {
00054 string process;
00055 string head;
00056 string k, v;
00057 boost::smatch dlRes, spRes;
00058
00059 if (delim.empty()) {
00060 delim = delimiter;
00061 }
00062 if (sep.empty()) {
00063 sep = separator;
00064 }
00065 Clear();
00066
00067 string dlRexp = string("(.*?)") + delim + string("(.*)");
00068 regex dl(dlRexp);
00069 string spRexp = string("(.*?)") + sep + string("(.*)");
00070 regex sp(spRexp);
00071
00072 process = data;
00073 while(regex_match(process, dlRes, dl)) {
00074 head = dlRes[1];
00075 process = dlRes[2];
00076 if (regex_match(head, spRes, sp)) {
00077 k = spRes[1];
00078 v = spRes[2];
00079 }
00080 else {
00081 k = head;
00082 v = head;
00083 }
00084 Append(k, v);
00085 }
00086 if (!process.empty()) {
00087 if (regex_match(process, spRes, sp)) {
00088 k = spRes[1];
00089 v = spRes[2];
00090 }
00091 else {
00092 k = head;
00093 v = head;
00094 }
00095 Append(k, v);
00096 }
00097 }
00098
00099 string& WeStringLinks::Compose( string sep , string delim )
00100 {
00101 WeLinkedString* elem = data;
00102 string *retval = new string("");
00103
00104 if (delim.empty()) {
00105 delim = delimiter;
00106 }
00107 if (sep.empty()) {
00108 sep = separator;
00109 }
00110 while (elem) {
00111 *retval += elem->Key() + sep + elem->Value();
00112 if (elem->Next() != NULL) {
00113 *retval += delim;
00114 }
00115 elem = elem->Next();
00116 }
00117 return *retval;
00118 }