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