source: utilib/trunk/src/adt/utilib/string_ops.h @ 1488

Revision 1488, 3.7 KB checked in by wehart, 6 years ago (diff)

Segregating OptionParser? code into a *.cpp file.

Misc fixes to the wordwrapper logic. I'm sure there are still bugs...

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/*  _________________________________________________________________________
2 *
3 *  UTILIB: A utility library for developing portable C++ codes.
4 *  Copyright (c) 2001, Sandia National Laboratories.
5 *  This software is distributed under the GNU Lesser General Public License.
6 *  For more information, see the README file in the top UTILIB directory.
7 *  _________________________________________________________________________
8 */
9
10/**
11 * \file string_ops.h
12 *
13 * Misc operations on CharString objects
14 */
15
16#ifndef utilib_string_h
17#define utilib_string_h
18
19#include <utilib/utilib_config.h>
20#include <string.h>
21#include <utilib/CharString.h>
22
23namespace utilib
24{
25
26
27/// Convert a CharString to upper case
28inline void toUpper(CharString& str)
29{
30   for (size_t i = 0; i < str.size(); i++)
31      str[i] = toupper(str[i]);
32}
33
34/// Convert a CharString to lower case
35inline void toLower(CharString& str)
36{
37   for (size_t i = 0; i < str.size(); i++)
38      str[i] = tolower(str[i]);
39}
40
41/// Split a string into an array of strings
42inline BasicArray<CharString> split(const CharString& str, char sep)
43{
44   size_type len = str.size();
45
46   int npart = 1;
47   CharString tmp = str;
48   for (size_type i = 0; i < len; i++)
49   {
50      if (str[i] == sep)
51      {
52         npart++;
53         tmp[i] = '\000';
54      }
55   }
56
57   BasicArray<CharString> strs(npart);
58   size_type ndx = 0;
59   for (size_type i = 0; i < len; i++)
60   {
61      if (ndx < len)
62         strs[i] = &(tmp[ndx]);
63      while ((ndx < len) && (tmp[ndx] != '\000'))
64         ndx++;
65      ndx++;
66   }
67
68   return strs;
69}
70
71
72/** Join an array of strings into a single string */
73inline CharString join(const BasicArray<CharString>& strs, char sep)
74{
75   CharString str;
76   if (strs.size() == 0) return str;
77   str += strs[0];
78
79   for (size_type i = 1; i < strs.size(); i++)
80   {
81      str += sep;
82      str += strs[i];
83   }
84
85   return str;
86}
87
88/// NOTE: this treats tabs as simple whitespace!
89inline void wordwrap_printline(std::ostream& os, const std::string& line, const std::string& prefix, unsigned int ncols = 79)
90{
91   std::string::const_iterator curr = line.begin();
92   std::string::const_iterator end  = line.end();
93   std::string token;
94   std::string ws;
95   int col = 0;
96   while (curr != end)
97   {
98      if ((*curr == ' ') || (*curr == '\t'))
99      {
100         if ((col + ws.size() + token.size()) < ncols)
101         {
102            os << ws << token;
103            col = col + ws.size() + token.size();
104         }
105         else
106         {
107            os << std::endl;
108            os << prefix;
109            os << token;
110            col = prefix.size() + token.size();
111         }
112         token = "";
113         ws = " ";
114         curr++;
115         if (curr == end) break;
116         while ((curr != end) && ((*curr == ' ') || (*curr == '\t')))
117         {
118            ws += " ";
119            curr++;
120         }
121      }
122      else if (*curr == '\n')
123      {
124         curr++;
125         if (token == "")
126         {
127            os << std::endl;
128         }
129         else if ((col + ws.size() + token.size()) < ncols)
130         {
131            os << ws << token << std::endl;
132            col = col + ws.size() + token.size();
133         }
134         else
135         {
136            os << std::endl;
137            os << prefix;
138            os << token;
139            os << std::endl;
140         }
141         if (curr != end)
142         {
143            os << prefix;
144            col = prefix.size();
145         }
146         token = "";
147         ws = "";
148      }
149      else
150      {
151         token += *curr;
152         curr++;
153      }
154   }
155   if ((col + ws.size() + token.size()) < ncols)
156   {
157      os << ws << token << std::endl;
158   }
159   else
160   {
161      os << std::endl << prefix << token << std::endl;
162   }
163}
164
165} // namespace utilib
166
167#endif
Note: See TracBrowser for help on using the repository browser.