str.hh revision 1762
110930Sbrandon.potter@amd.com/* 211856Sbrandon.potter@amd.com * Copyright (c) 2001-2005 The Regents of The University of Michigan 311856Sbrandon.potter@amd.com * All rights reserved. 411856Sbrandon.potter@amd.com * 511856Sbrandon.potter@amd.com * Redistribution and use in source and binary forms, with or without 610930Sbrandon.potter@amd.com * modification, are permitted provided that the following conditions are 710930Sbrandon.potter@amd.com * met: redistributions of source code must retain the above copyright 811856Sbrandon.potter@amd.com * notice, this list of conditions and the following disclaimer; 910930Sbrandon.potter@amd.com * redistributions in binary form must reproduce the above copyright 1011856Sbrandon.potter@amd.com * notice, this list of conditions and the following disclaimer in the 1111856Sbrandon.potter@amd.com * documentation and/or other materials provided with the distribution; 1210930Sbrandon.potter@amd.com * neither the name of the copyright holders nor the names of its 1311856Sbrandon.potter@amd.com * contributors may be used to endorse or promote products derived from 1411856Sbrandon.potter@amd.com * this software without specific prior written permission. 1511856Sbrandon.potter@amd.com * 1611856Sbrandon.potter@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711856Sbrandon.potter@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811856Sbrandon.potter@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911856Sbrandon.potter@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011856Sbrandon.potter@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111856Sbrandon.potter@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211856Sbrandon.potter@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311856Sbrandon.potter@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411856Sbrandon.potter@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511856Sbrandon.potter@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611856Sbrandon.potter@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711856Sbrandon.potter@amd.com */ 2811856Sbrandon.potter@amd.com 2911856Sbrandon.potter@amd.com#ifndef __STR_HH__ 3011856Sbrandon.potter@amd.com#define __STR_HH__ 3111856Sbrandon.potter@amd.com 3211856Sbrandon.potter@amd.com#include <sstream> 3312697Santhony.gutierrez@amd.com#include <string> 3410930Sbrandon.potter@amd.com#include <vector> 3510930Sbrandon.potter@amd.com 3610930Sbrandon.potter@amd.com#include <ctype.h> 3710930Sbrandon.potter@amd.com 3810930Sbrandon.potter@amd.comtemplate<class> class Hash; 3911856Sbrandon.potter@amd.comtemplate<> 4010930Sbrandon.potter@amd.comclass Hash<std::string> { 4110930Sbrandon.potter@amd.compublic: 4210930Sbrandon.potter@amd.com unsigned operator()(const std::string &s) { 4311800Sbrandon.potter@amd.com std::string::const_iterator i = s.begin(); 4411800Sbrandon.potter@amd.com std::string::const_iterator end = s.end(); 4511800Sbrandon.potter@amd.com unsigned hash = 5381; 4610930Sbrandon.potter@amd.com 4710930Sbrandon.potter@amd.com while (i < end) 4811856Sbrandon.potter@amd.com hash = ((hash << 5) + hash) + *i++; 4911856Sbrandon.potter@amd.com 5010930Sbrandon.potter@amd.com return hash; 5110930Sbrandon.potter@amd.com } 5210930Sbrandon.potter@amd.com}; 5310930Sbrandon.potter@amd.com 5411856Sbrandon.potter@amd.cominline void 5511856Sbrandon.potter@amd.comeat_lead_white(std::string &s) 5610930Sbrandon.potter@amd.com{ 5710930Sbrandon.potter@amd.com std::string::size_type off = s.find_first_not_of(' '); 5811856Sbrandon.potter@amd.com if (off != std::string::npos) { 5911856Sbrandon.potter@amd.com std::string::iterator begin = s.begin(); 6013030Sbrandon.potter@amd.com s.erase(begin, begin + off); 6111856Sbrandon.potter@amd.com } 6213030Sbrandon.potter@amd.com} 6311856Sbrandon.potter@amd.com 6411856Sbrandon.potter@amd.cominline void 6511856Sbrandon.potter@amd.comeat_end_white(std::string &s) 6611856Sbrandon.potter@amd.com{ 6711856Sbrandon.potter@amd.com std::string::size_type off = s.find_last_not_of(' '); 6811856Sbrandon.potter@amd.com if (off != std::string::npos) 6911856Sbrandon.potter@amd.com s.erase(s.begin() + off + 1, s.end()); 7011856Sbrandon.potter@amd.com} 7111856Sbrandon.potter@amd.com 7211856Sbrandon.potter@amd.cominline void 7311856Sbrandon.potter@amd.comeat_white(std::string &s) 7411856Sbrandon.potter@amd.com{ 7511856Sbrandon.potter@amd.com eat_lead_white(s); 7611856Sbrandon.potter@amd.com eat_end_white(s); 7711856Sbrandon.potter@amd.com} 7811856Sbrandon.potter@amd.com 7911856Sbrandon.potter@amd.cominline std::string 8011856Sbrandon.potter@amd.comto_lower(const std::string &s) 8111856Sbrandon.potter@amd.com{ 8211856Sbrandon.potter@amd.com std::string lower; 8313933Sbrandon.potter@amd.com int len = s.size(); 8413933Sbrandon.potter@amd.com 8513933Sbrandon.potter@amd.com lower.reserve(len); 8613933Sbrandon.potter@amd.com 8713933Sbrandon.potter@amd.com for (int i = 0; i < len; ++i) 8813933Sbrandon.potter@amd.com lower.push_back(tolower(s[i])); 8913933Sbrandon.potter@amd.com 9013933Sbrandon.potter@amd.com return lower; 9113933Sbrandon.potter@amd.com} 9213933Sbrandon.potter@amd.com 9313030Sbrandon.potter@amd.com// Split the string s into lhs and rhs on the first occurence of the 9413030Sbrandon.potter@amd.com// character c. 9511856Sbrandon.potter@amd.combool 9613030Sbrandon.potter@amd.comsplit_first(const std::string &s, std::string &lhs, std::string &rhs, char c); 9713030Sbrandon.potter@amd.com 9811856Sbrandon.potter@amd.com// Split the string s into lhs and rhs on the last occurence of the 9911856Sbrandon.potter@amd.com// character c. 10011856Sbrandon.potter@amd.combool 10111856Sbrandon.potter@amd.comsplit_last(const std::string &s, std::string &lhs, std::string &rhs, char c); 10211856Sbrandon.potter@amd.com 10311856Sbrandon.potter@amd.com// Tokenize the string <s> splitting on the character <token>, and 10411856Sbrandon.potter@amd.com// place the result in the string vector <vector>. If <ign> is true, 10511856Sbrandon.potter@amd.com// then empty result strings (due to trailing tokens, or consecutive 10611856Sbrandon.potter@amd.com// tokens) are skipped. 10711856Sbrandon.potter@amd.comvoid 10811856Sbrandon.potter@amd.comtokenize(std::vector<std::string> &vector, const std::string &s, 10911856Sbrandon.potter@amd.com char token, bool ign = true); 11011856Sbrandon.potter@amd.com 11111856Sbrandon.potter@amd.comtemplate <class T> bool 11211856Sbrandon.potter@amd.comto_number(const std::string &value, T &retval); 11311856Sbrandon.potter@amd.com 11411856Sbrandon.potter@amd.comtemplate <class T> 11511856Sbrandon.potter@amd.cominline std::string 11611856Sbrandon.potter@amd.comto_string(const T &value) 11711856Sbrandon.potter@amd.com{ 11811856Sbrandon.potter@amd.com std::stringstream str; 11911856Sbrandon.potter@amd.com str << value; 12011856Sbrandon.potter@amd.com return str.str(); 12111856Sbrandon.potter@amd.com} 12211856Sbrandon.potter@amd.com 12311856Sbrandon.potter@amd.com// Put quotes around string arg if it contains spaces. 12411856Sbrandon.potter@amd.cominline std::string 12511856Sbrandon.potter@amd.comquote(const std::string &s) 12613030Sbrandon.potter@amd.com{ 12711856Sbrandon.potter@amd.com std::string ret; 12811856Sbrandon.potter@amd.com bool quote = s.find(' ') != std::string::npos; 12911856Sbrandon.potter@amd.com 13011856Sbrandon.potter@amd.com if (quote) 13111856Sbrandon.potter@amd.com ret = '"'; 13213030Sbrandon.potter@amd.com 13313030Sbrandon.potter@amd.com ret += s; 13411856Sbrandon.potter@amd.com 13513030Sbrandon.potter@amd.com if (quote) 13613030Sbrandon.potter@amd.com ret += '"'; 13711856Sbrandon.potter@amd.com 13811168Sandreas.hansson@arm.com return ret; 13911168Sandreas.hansson@arm.com} 14010930Sbrandon.potter@amd.com 14111856Sbrandon.potter@amd.com#endif //__STR_HH__ 14211856Sbrandon.potter@amd.com