diff --git a/build_linux64/libamsstring4.linux64.a b/build_linux64/libamsstring4.linux64.a index 16c3b01..46a9418 100644 Binary files a/build_linux64/libamsstring4.linux64.a and b/build_linux64/libamsstring4.linux64.a differ diff --git a/build_linux64/objstore/amsstring4_convenience1.o b/build_linux64/objstore/amsstring4_convenience1.o index 3b9cbbe..e093c1e 100644 Binary files a/build_linux64/objstore/amsstring4_convenience1.o and b/build_linux64/objstore/amsstring4_convenience1.o differ diff --git a/build_linux64/tests b/build_linux64/tests index 9bf1ec9..2095091 100644 Binary files a/build_linux64/tests and b/build_linux64/tests differ diff --git a/include/amsstring4/amsstring4.hpp b/include/amsstring4/amsstring4.hpp index a1fdb74..9638f63 100644 --- a/include/amsstring4/amsstring4.hpp +++ b/include/amsstring4/amsstring4.hpp @@ -136,7 +136,21 @@ public: double strtonum() const; //updated convenience functions as class members - //todo + amsarray splitlines() const; + amsarray split(const ams_chartype delimitchar) const; + amsarray split(const ams_chartype *delimitstr) const; + amsarray splitfirst(const ams_chartype delimitchar) const; //guaranteed size 2 array + amsarray splitfirst(const ams_chartype *delimitstr) const; //guaranteed size 2 array + amsarray splitwhitespace() const; + amsstring stripwhitespace() const; + amsstring stripallwhitespace() const; + amsstring stripnewlines() const; + amsarray splitalphanum() const; + amsarray path_splitext() const; + amsarray path_split() const; + amsstring select_between(const ams_chartype *delimitleft, const ams_chartype *delimitright) const; + + }; @@ -180,6 +194,12 @@ amsarray splitwhitespace(const amsstring &s); amsstring stripwhitespace(const amsstring &s); amsstring stripallwhitespace(const amsstring &s); +//strips \r and \n from the right side of the string +amsstring stripnewlines(const amsstring &s); + +//strips \r and \n from the right side of the strings +void stripnewlines(amsarray *sa_inout); + //splits a string into contiguous sets of alphanumeric characters ignoring non-alphanums amsarray splitalphanum(const amsstring &s); @@ -204,8 +224,6 @@ amsstring concatenate(const amsarray &slist); //adds \n between each line in the concatenated string amsstring concat_lines(const amsarray &lns); - - void freadline(FILE *fp, amsstring *s); void freadlines(FILE *fp, amsarray *lines); void fwritelines(FILE *fp, amsstring *s); diff --git a/src/amsstring4/amsstring4_convenience1.cpp b/src/amsstring4/amsstring4_convenience1.cpp index a8f706c..f4ed842 100644 --- a/src/amsstring4/amsstring4_convenience1.cpp +++ b/src/amsstring4/amsstring4_convenience1.cpp @@ -423,10 +423,10 @@ amsstring select_between(const amsstring &s, const ams_chartype delimitleft, con ind1 = s.find(delimitleft); ind2 = s.findright(delimitright); - if(ind1<0) ind1=0; + if(ind1<0) ind1=-1; if(ind2<0) ind2=s.length; - ret = s.substring(ind1,ind2); + ret = s.substring(ind1+1,ind2); return ret; } @@ -440,7 +440,7 @@ amsstring select_between(const amsstring &s, const ams_chartype *delimitleft, co int slen1,slen2; slen1 = amsstring_strlen(delimitleft); - slen2 = amsstring_strlen(delimitleft); + slen2 = amsstring_strlen(delimitright); ind1 = -1; ind2 = -1; @@ -449,10 +449,10 @@ amsstring select_between(const amsstring &s, const ams_chartype *delimitleft, co if(slen2>0) ind2 = s.findright(delimitright); - if(ind1<0) ind1=0; + if(ind1<0) ind1=-slen1; if(ind2<0) ind2=s.length; - ret = s.substring(ind1,ind2); + ret = s.substring(ind1+slen1,ind2); return ret; } @@ -521,6 +521,105 @@ amsarray splitalphanum(const amsstring &s) return sa; } +//strips \r and \n from the right side of the string +amsstring stripnewlines(const amsstring &s) +{ + amsstring ret; + int I0,I; + I0 = s.length; + for(I=s.length-1;I>=0;I--) + { + if(s[I]!='\n' && s[I]!='\r') + { + I0 = I+1; + break; + } + } + ret = s.substring(0,I0); + return ret; +} + +//strips \r and \n from the right side of the strings +void stripnewlines(amsarray *sa_inout) +{ + int I; + for(I=0;Ilength;I++) + { + sa_inout->at(I) = stripnewlines(sa_inout->at(I)); + } + return; +} + +/////////////////////////////////////////////////////// +// Member Function Versions of Convenience Functions // +/////////////////////////////////////////////////////// + +amsarray amsstring::splitlines() const +{ + return ams::splitlines(*this); +} + +amsarray amsstring::split(const ams_chartype delimitchar) const +{ + return ams::split(*this,delimitchar); +} + +amsarray amsstring::split(const ams_chartype *delimitstr) const +{ + return ams::split(*this,delimitstr); +} + +amsarray amsstring::splitfirst(const ams_chartype delimitchar) const +{ + return ams::splitfirst(*this,delimitchar); +} + +amsarray amsstring::splitfirst(const ams_chartype *delimitstr) const +{ + return ams::splitfirst(*this,delimitstr); +} + +amsarray amsstring::splitwhitespace() const +{ + return ams::splitwhitespace(*this); +} + +amsstring amsstring::stripwhitespace() const +{ + return ams::stripwhitespace(*this); +} + +amsstring amsstring::stripallwhitespace() const +{ + return ams::stripallwhitespace(*this); +} + +amsstring amsstring::stripnewlines() const +{ + return ams::stripnewlines(*this); +} + +amsarray amsstring::splitalphanum() const +{ + return ams::splitalphanum(*this); +} + +amsarray amsstring::path_splitext() const +{ + return ams::path_splitext(*this); +} + +amsarray amsstring::path_split() const +{ + return ams::path_split(*this); +} + +amsstring amsstring::select_between(const ams_chartype *delimitleft, const ams_chartype *delimitright) const +{ + return ams::select_between(*this,delimitleft,delimitright); +} + + ///////////// // Testing // ///////////// @@ -694,6 +793,57 @@ void amsstring4_test_convenience1b() printf("s[%d] = '%s'\n",I,sa[I].cstring); } + s1 = "arandomtuple = (apples,1.2,pi);"; + s2 = select_between(s1,"(",")"); + printf("s1='%s'\ns2='%s'\n",s1.cstring,s2.cstring); + + s1 = "arandomtuple = {apples,1.2,pi);"; + s2 = select_between(s1,"(",")"); + printf("s1='%s'\ns2='%s'\n",s1.cstring,s2.cstring); + + s1 = "arandomtuple = (apples,1.2,pi};"; + s2 = select_between(s1,"(",")"); + printf("s1='%s'\ns2='%s'\n",s1.cstring,s2.cstring); + + s1 = "arandomtuple) = (apples,1.2,pi};"; + s2 = select_between(s1,"(",")"); + printf("s1='%s'\ns2='%s'\n",s1.cstring,s2.cstring); + + s1 = "arandomtuple) = (apples,1.2,pi};"; + s2 = select_between(s1,'(',')'); + printf("s1='%s'\ns2='%s'\n",s1.cstring,s2.cstring); + + s1 = "kernellaunch<<>>(apples,1.2,pi);"; + s2 = select_between(s1,"<<<",">>>"); + printf("s1='%s'\ns2='%s'\n",s1.cstring,s2.cstring); + + s1 = "kernellaunch<<>>(apples,1.2,pi);"; + s2 = select_between(s1,"<<<",""); + printf("s1='%s'\ns2='%s'\n",s1.cstring,s2.cstring); + + s1 = "kernellaunch<<>>(apples,1.2,pi);"; + s2 = select_between(s1,"",">>>"); + printf("s1='%s'\ns2='%s'\n",s1.cstring,s2.cstring); + + sa.resize(0); + sa.append("this"); + sa.append(" is"); + sa.append("a "); + sa.append("series\n"); + sa.append("of\r\n"); + sa.append("strings."); + + s1 = concatenate(sa); + printf("\nconcatenate(sa) = '%s'\n---\n",s1.cstring); + + s1 = concat_lines(sa); + printf("\nconcat_lines(sa) = '%s'\n----\n",s1.cstring); + + stripnewlines(&sa); + s1 = concat_lines(sa); + printf("\nconcat_lines(sa) = '%s'\n----\n",s1.cstring); + + } };//end namespace ams