00001 #include "string_util.h"
00002 #include <ctype.h>
00003 #include <pwd.h>
00004 #include <stdlib.h>
00005
00006 using namespace std;
00007
00008 namespace string_util {
00009
00010 string makeLower(const string& s) {
00011 string ans(s.size(),'#');
00012 unsigned int i=s.size();
00013 while(i--!=0)
00014 ans[i]=::tolower(s[i]);
00015 return ans;
00016 }
00017
00018 string makeUpper(const string& s) {
00019 string ans(s.size(),'#');
00020 unsigned int i=s.size();
00021 while(i--!=0)
00022 ans[i]=::toupper(s[i]);
00023 return ans;
00024 }
00025
00026 string removePrefix(const string& str, const string& pre) {
00027 if(str.compare(0,pre.size(),pre)==0)
00028 return str.substr(pre.size());
00029 return string();
00030 }
00031
00032 string tildeExpansion(const string& str) {
00033 string ans;
00034 if(str[0]!='~') {
00035 return str;
00036 }
00037 #ifndef PLATFORM_APERIOS
00038 else if(str=="~" || str[1]=='/') {
00039 char* home=getenv("HOME");
00040 if(home==NULL)
00041 return str;
00042 if(str=="~")
00043 return home;
00044 return home+str.substr(1);
00045 } else {
00046 string::size_type p=str.find('/');
00047 struct passwd * pw;
00048 pw=getpwnam(str.substr(1,p-1).c_str());
00049 if(pw==NULL)
00050 return str;
00051 return pw->pw_dir+str.substr(p);
00052 }
00053 #else
00054 return str.substr(1);
00055 #endif
00056 }
00057
00058 string trim(const string& str) {
00059 if(str.size()==0)
00060 return str;
00061 unsigned int b=0;
00062 unsigned int e=str.size()-1;
00063 while(b<str.size() && isspace(str[b]))
00064 b++;
00065 while(b<e && isspace(str[e]))
00066 e--;
00067 return str.substr(b,e-b+1);
00068 }
00069
00070 bool parseArgs(const string& input, vector<string>& args, vector<unsigned int>& offsets) {
00071 string cur;
00072 bool isDoubleQuote=false;
00073 bool isSingleQuote=false;
00074 args.clear();
00075 offsets.clear();
00076 unsigned int begin=-1U;
00077 for(unsigned int i=0; i<input.size(); i++) {
00078 char c=input[i];
00079 if(begin==-1U && !isspace(c))
00080 begin=i;
00081 switch(c) {
00082 case ' ':
00083 case '\n':
00084 case '\r':
00085 case '\t':
00086 case '\v':
00087 case '\f':
00088 if(isSingleQuote || isDoubleQuote)
00089 cur+=c;
00090 else if(cur.size()!=0) {
00091 args.push_back(cur);
00092 offsets.push_back(begin);
00093 cur.clear();
00094 begin=-1U;
00095 }
00096 break;
00097 case '\\':
00098 if(i==input.size()-1) {
00099 return false;
00100 } else
00101 cur.push_back(input[++i]);
00102 break;
00103 case '"':
00104 if(isSingleQuote)
00105 cur.push_back(c);
00106 else
00107 isDoubleQuote=!isDoubleQuote;
00108 break;
00109 case '\'':
00110 if(isDoubleQuote)
00111 cur+=c;
00112 else
00113 isSingleQuote=!isSingleQuote;
00114 break;
00115 default:
00116 cur+=c;
00117 break;
00118 }
00119 }
00120 if(cur.size()>0) {
00121 args.push_back(cur);
00122 offsets.push_back(begin);
00123 }
00124 return !isDoubleQuote && !isSingleQuote;
00125 }
00126
00127 }
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138