From ae47696324e489355d19ea45c17442a3515a8845 Mon Sep 17 00:00:00 2001 From: fluxgen Date: Sat, 26 Apr 2003 18:12:47 +0000 Subject: moved from fluxbox source --- src/FbTk/StringUtil.cc | 148 +++++++++++++++++++++++++++++++++++++++++++++++++ src/FbTk/StringUtil.hh | 85 ++++++++++++++++++++++++++++ 2 files changed, 233 insertions(+) create mode 100644 src/FbTk/StringUtil.cc create mode 100644 src/FbTk/StringUtil.hh diff --git a/src/FbTk/StringUtil.cc b/src/FbTk/StringUtil.cc new file mode 100644 index 0000000..bd9a2df --- /dev/null +++ b/src/FbTk/StringUtil.cc @@ -0,0 +1,148 @@ +// StringUtil.cc for fluxbox +// Copyright (c) 2001 - 2003 Henrik Kinnunen (fluxgenlinuxmail.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +// $Id: StringUtil.cc,v 1.1 2003/04/26 18:12:47 fluxgen Exp $ + +#include "StringUtil.hh" + +#include +#include +#include +#include +#include +#include + +using namespace std; + +namespace FbTk { + +namespace StringUtil { + +/** + Takes a pointer to string *s as an argument, + creates a new string n, copies s to n and + returns a pointer to n. +*/ +char *strdup(const char *s) { + int l = strlen(s) + 1; + char *n = new char[l]; + strncpy(n, s, l); + return n; +} + +/** + Tries to find a string in another and + ignoring the case of the characters + Returns 0 on success else pointer to str. +*/ +const char *strcasestr(const char *str, const char *ptn) { + const char *s2, *p2; + for( ; *str; str++) { + for(s2=str, p2=ptn; ; s2++,p2++) { + // check if we reached the end of ptn, if so, return str + if (!*p2) + return str; + // check if the chars match(ignoring case) + if (toupper(*s2) != toupper(*p2)) + break; + } + } + return 0; +} + +/** + if ~ then expand it to home of user + returns expanded filename +*/ +string expandFilename(const std::string &filename) { + + string retval; + size_t pos = filename.find_first_not_of(" \t"); + if (pos != std::string::npos && filename[pos] == '~') { + retval = getenv("HOME"); + if (pos != filename.size()) { + // copy from the character after '~' + retval += static_cast(filename.c_str() + pos + 1); + } + } else + return filename; //return unmodified value + + return retval; +} + +/** + Parses a string between "first" and "last" characters + and ignoring ok_chars as whitespaces. The value is + returned in "out". + Returns negative value on error and this value is the position + in the in-string where the error occured. + Returns positive value on success and this value is + for the position + 1 in the in-string where the "last"-char value + was found. +*/ +int getStringBetween(std::string& out, const char *instr, const char first, const char last, + const char *ok_chars) { + assert(first); + assert(last); + assert(instr); + + std::string::size_type i = 0, + total_add=0; //used to add extra if there is a \last to skip + std::string in(instr); + + // eat leading whitespace + i = in.find_first_not_of(ok_chars); + if (i == std::string::npos) + return -in.size(); // nothing left but whitespace + + if (in[i]!=first) + return -i; //return position to error + + // find the end of the token + std::string::size_type j = i; + while (1) { + j = in.find_first_of(last, j+1); + if (j==std::string::npos) + return -in.size(); //send negative size + + //we found the last char, check so it doesn't have a '\' before + if (j>1 && in[j-1] != '\\') + break; + else if (j>1) { + in.erase(j-1, 1); //remove the '\' + j--; + total_add++; //save numchars removed so we can calculate totalpos + } + } + + out = in.substr(i+1, j-i-1); //copy the string between first and last + //return value to last character + return (j+1+total_add); +} + +void toLower(char * const conv) { + for (size_t byte_pos = 0; byte_pos < strlen(conv); ++byte_pos) + conv[byte_pos] = tolower(conv[byte_pos]); +} + +}; // end namespace StringUtil + +}; // end namespace FbTk diff --git a/src/FbTk/StringUtil.hh b/src/FbTk/StringUtil.hh new file mode 100644 index 0000000..c1f568e --- /dev/null +++ b/src/FbTk/StringUtil.hh @@ -0,0 +1,85 @@ +// StringUtil.hh for fluxbox +// Copyright (c) 2001 - 2003 Henrik Kinnunen (fluxgen(at)linuxmail.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +//$Id: StringUtil.hh,v 1.1 2003/04/26 18:12:46 fluxgen Exp $ + +#ifndef FBTK_STRINGUTIL_HH +#define FBTK_STRINGUTIL_HH + +#include + +namespace FbTk { + +namespace StringUtil { + +char *strdup(const char *); + +/// Similar to `strstr' but this function ignores the case of both strings +const char *strcasestr(const char *str, const char *ptn); + +/// expands ~ to value of ${HOME} enviroment variable +std::string expandFilename(const std::string &filename); + +/// returns string between character first and last +int getStringBetween(std::string& out, const char *instr, + char first, char last, + const char *ok_chars=" \t\n"); + +/// converts a string to lover case +void toLower(char * const conv); + + +/// Breaks a string into tokens +template +static void +stringtok (Container &container, std::string const &in, + const char * const delimiters = " \t\n") { + + const std::string::size_type len = in.length(); + std::string::size_type i = 0; + + while ( i < len ) { + // eat leading whitespace + i = in.find_first_not_of(delimiters, i); + if (i == std::string::npos) + return; // nothing left but white space + + // find the end of the token + std::string::size_type j = in.find_first_of(delimiters, i); + + // push token + if (j == std::string::npos) { + container.push_back(in.substr(i)); + return; + } else + container.push_back(in.substr(i, j-i)); + + // set up for next loop + i = j + 1; + } +} + +}; // end namespace StringUtil + +}; // end namespace FbTk + + +#endif // FBTK_STRINGUTIL_HH -- cgit v0.11.2