Tekkotsu Homepage
Demos
Overview
Downloads
Dev. Resources
Reference
Credits

string_util.cc

Go to the documentation of this file.
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) { //escaped line break
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 /*! @file
00130  * @brief Implements some useful functions for string manipulation in the string_util namespace
00131  * @author ejt (Creator)
00132  *
00133  * $Author: ejt $
00134  * $Name: tekkotsu-3_0 $
00135  * $Revision: 1.6 $
00136  * $State: Exp $
00137  * $Date: 2006/03/16 22:07:28 $
00138  */

Tekkotsu v3.0
Generated Wed Oct 4 00:03:46 2006 by Doxygen 1.4.7