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