1 /* $NetBSD: stringclass.h,v 1.1.1.1 2016/01/13 18:41:48 christos Exp $ */
2
3 // -*- C++ -*-
4 /* Copyright (C) 1989, 1990, 1991, 1992, 2002 Free Software Foundation, Inc.
5 Written by James Clark (jjc@jclark.com)
6
7 This file is part of groff.
8
9 groff is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2, or (at your option) any later
12 version.
13
14 groff is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License along
20 with groff; see the file COPYING. If not, write to the Free Software
21 Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
22
23 #include <string.h>
24 #include <stdio.h>
25 #include <assert.h>
26
27 // Ensure that the first declaration of functions that are later
28 // declared as inline declares them as inline.
29
30 class string;
31
32 inline string operator+(const string &, const string &);
33 inline string operator+(const string &, const char *);
34 inline string operator+(const char *, const string &);
35 inline string operator+(const string &, char);
36 inline string operator+(char, const string &);
37 inline int operator==(const string &, const string &);
38 inline int operator!=(const string &, const string &);
39
40 class string {
41 public:
42 string();
43 string(const string &);
44 string(const char *);
45 string(const char *, int);
46 string(char);
47
48 ~string();
49
50 string &operator=(const string &);
51 string &operator=(const char *);
52 string &operator=(char);
53
54 string &operator+=(const string &);
55 string &operator+=(const char *);
56 string &operator+=(char);
57 void append(const char *, int);
58
59 int length() const;
60 int empty() const;
61 int operator*() const;
62
63 string substring(int i, int n) const;
64
65 char &operator[](int);
66 char operator[](int) const;
67
68 void set_length(int i);
69 const char *contents() const;
70 int search(char) const;
71 char *extract() const;
72 void remove_spaces();
73 void clear();
74 void move(string &);
75
76 friend string operator+(const string &, const string &);
77 friend string operator+(const string &, const char *);
78 friend string operator+(const char *, const string &);
79 friend string operator+(const string &, char);
80 friend string operator+(char, const string &);
81
82 friend int operator==(const string &, const string &);
83 friend int operator!=(const string &, const string &);
84 friend int operator<=(const string &, const string &);
85 friend int operator<(const string &, const string &);
86 friend int operator>=(const string &, const string &);
87 friend int operator>(const string &, const string &);
88
89 private:
90 char *ptr;
91 int len;
92 int sz;
93
94 string(const char *, int, const char *, int); // for use by operator+
95 void grow1();
96 };
97
98
99 inline char &string::operator[](int i)
100 {
101 assert(i >= 0 && i < len);
102 return ptr[i];
103 }
104
105 inline char string::operator[](int i) const
106 {
107 assert(i >= 0 && i < len);
108 return ptr[i];
109 }
110
length()111 inline int string::length() const
112 {
113 return len;
114 }
115
empty()116 inline int string::empty() const
117 {
118 return len == 0;
119 }
120
121 inline int string::operator*() const
122 {
123 return len;
124 }
125
contents()126 inline const char *string::contents() const
127 {
128 return ptr;
129 }
130
131 inline string operator+(const string &s1, const string &s2)
132 {
133 return string(s1.ptr, s1.len, s2.ptr, s2.len);
134 }
135
136 inline string operator+(const string &s1, const char *s2)
137 {
138 #ifdef __GNUG__
139 if (s2 == 0)
140 return s1;
141 else
142 return string(s1.ptr, s1.len, s2, strlen(s2));
143 #else
144 return s2 == 0 ? s1 : string(s1.ptr, s1.len, s2, strlen(s2));
145 #endif
146 }
147
148 inline string operator+(const char *s1, const string &s2)
149 {
150 #ifdef __GNUG__
151 if (s1 == 0)
152 return s2;
153 else
154 return string(s1, strlen(s1), s2.ptr, s2.len);
155 #else
156 return s1 == 0 ? s2 : string(s1, strlen(s1), s2.ptr, s2.len);
157 #endif
158 }
159
160 inline string operator+(const string &s, char c)
161 {
162 return string(s.ptr, s.len, &c, 1);
163 }
164
165 inline string operator+(char c, const string &s)
166 {
167 return string(&c, 1, s.ptr, s.len);
168 }
169
170 inline int operator==(const string &s1, const string &s2)
171 {
172 return (s1.len == s2.len
173 && (s1.len == 0 || memcmp(s1.ptr, s2.ptr, s1.len) == 0));
174 }
175
176 inline int operator!=(const string &s1, const string &s2)
177 {
178 return (s1.len != s2.len
179 || (s1.len != 0 && memcmp(s1.ptr, s2.ptr, s1.len) != 0));
180 }
181
substring(int i,int n)182 inline string string::substring(int i, int n) const
183 {
184 assert(i >= 0 && i + n <= len);
185 return string(ptr + i, n);
186 }
187
188 inline string &string::operator+=(char c)
189 {
190 if (len >= sz)
191 grow1();
192 ptr[len++] = c;
193 return *this;
194 }
195
196 void put_string(const string &, FILE *);
197
198 string as_string(int);
199