xref: /netbsd-src/external/gpl2/groff/dist/src/include/stringclass.h (revision 89a07cf815a29524268025a1139fac4c5190f765)
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