PPL  1.2
wrap_string.cc
Go to the documentation of this file.
1 /* String wrapping helper function.
2  Copyright (C) 2001-2010 Roberto Bagnara <bagnara@cs.unipr.it>
3  Copyright (C) 2010-2016 BUGSENG srl (http://bugseng.com)
4 
5 This file is part of the Parma Polyhedra Library (PPL).
6 
7 The PPL is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
11 
12 The PPL is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software Foundation,
19 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
20 
21 For the most up-to-date information see the Parma Polyhedra Library
22 site: http://bugseng.com/products/ppl/ . */
23 
24 #include "ppl-config.h"
25 #include "wrap_string.hh"
26 #include "assertions.hh"
27 #include <cstdlib>
28 
29 namespace Parma_Polyhedra_Library {
30 
31 namespace IO_Operators {
32 
33 std::string
34 wrap_string(const std::string& src_string,
35  const unsigned indent_depth,
36  const unsigned preferred_first_line_length,
37  const unsigned preferred_line_length) {
38  const unsigned npos = C_Integer<unsigned>::max;
39  std::string dst_string;
40  const char *src = src_string.c_str();
41  for (unsigned line = 0; ; ++line) {
42  const unsigned line_length = ((line == 0)
43  ? preferred_first_line_length
44  : preferred_line_length);
45  unsigned last_comma = npos;
46  unsigned last_space = npos;
47  unsigned split_pos = npos;
48  unsigned idx;
49  for (idx = 0; idx <= line_length; ++idx) {
50  if (src[idx] == '\0' || src[idx] == '\n') {
51  split_pos = idx;
52  break;
53  }
54  if (src[idx] == ',' && idx < line_length) {
55  last_comma = idx;
56  }
57  if (is_space(src[idx]) && (idx == 0 || !is_space(src[idx-1]))) {
58  last_space = idx;
59  }
60  }
61  if (split_pos == npos) {
62  if (last_comma != npos) {
63  split_pos = last_comma + 1;
64  }
65  else if (last_space != npos) {
66  split_pos = last_space;
67  }
68  else {
69  for ( ; src[idx] != '\0'; ++idx) {
70  if (src[idx] == ',') {
71  ++idx;
72  break;
73  }
74  if (is_space(src[idx])) {
75  break;
76  }
77  }
78  split_pos = idx;
79  }
80  }
81  PPL_ASSERT(split_pos != npos);
82  if (split_pos > 0 && line > 0 && indent_depth > 0) {
83  dst_string.append(indent_depth, ' ');
84  }
85  dst_string.append(src, split_pos);
86  src += split_pos;
87  if (is_space(*src)) {
88  ++src;
89  }
90  while (*src == ' ') {
91  ++src;
92  }
93  if (*src == '\0') {
94  break;
95  }
96  dst_string.push_back('\n');
97  }
98  return dst_string;
99 }
100 
101 } // namespace IO_Operators
102 
103 } // namespace Parma_Polyhedra_Library
104 
bool is_space(char c)
Returns true if c is any kind of space character.
std::string wrap_string(const std::string &src_string, const unsigned indent_depth, const unsigned preferred_first_line_length, const unsigned preferred_line_length)
Utility function for the wrapping of lines of text.
Definition: wrap_string.cc:34
The entire library is confined to this namespace.
Definition: version.hh:61