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 }