* All affected files: Update postal address of FSF.
[s-roff.git] / src / include / stringclass.h
blobfb3299ce90ad9503b0b96c68f8992198c42aedda
1 // -*- C++ -*-
2 /* Copyright (C) 1989, 1990, 1991, 1992, 2002 Free Software Foundation, Inc.
3 Written by James Clark (jjc@jclark.com)
5 This file is part of groff.
7 groff is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
12 groff is distributed in the hope that it will be useful, but WITHOUT ANY
13 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.
17 You should have received a copy of the GNU General Public License along
18 with groff; see the file COPYING. If not, write to the Free Software
19 Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
21 #include <string.h>
22 #include <stdio.h>
23 #include <assert.h>
25 // Ensure that the first declaration of functions that are later
26 // declared as inline declares them as inline.
28 class string;
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 &);
38 class string {
39 public:
40 string();
41 string(const string &);
42 string(const char *);
43 string(const char *, int);
44 string(char);
46 ~string();
48 string &operator=(const string &);
49 string &operator=(const char *);
50 string &operator=(char);
52 string &operator+=(const string &);
53 string &operator+=(const char *);
54 string &operator+=(char);
55 void append(const char *, int);
57 int length() const;
58 int empty() const;
59 int operator*() const;
61 string substring(int i, int n) const;
63 char &operator[](int);
64 char operator[](int) const;
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 &);
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 &);
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 &);
87 private:
88 char *ptr;
89 int len;
90 int sz;
92 string(const char *, int, const char *, int); // for use by operator+
93 void grow1();
97 inline char &string::operator[](int i)
99 assert(i >= 0 && i < len);
100 return ptr[i];
103 inline char string::operator[](int i) const
105 assert(i >= 0 && i < len);
106 return ptr[i];
109 inline int string::length() const
111 return len;
114 inline int string::empty() const
116 return len == 0;
119 inline int string::operator*() const
121 return len;
124 inline const char *string::contents() const
126 return ptr;
129 inline string operator+(const string &s1, const string &s2)
131 return string(s1.ptr, s1.len, s2.ptr, s2.len);
134 inline string operator+(const string &s1, const char *s2)
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
146 inline string operator+(const char *s1, const string &s2)
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
158 inline string operator+(const string &s, char c)
160 return string(s.ptr, s.len, &c, 1);
163 inline string operator+(char c, const string &s)
165 return string(&c, 1, s.ptr, s.len);
168 inline int operator==(const string &s1, const string &s2)
170 return (s1.len == s2.len
171 && (s1.len == 0 || memcmp(s1.ptr, s2.ptr, s1.len) == 0));
174 inline int operator!=(const string &s1, const string &s2)
176 return (s1.len != s2.len
177 || (s1.len != 0 && memcmp(s1.ptr, s2.ptr, s1.len) != 0));
180 inline string string::substring(int i, int n) const
182 assert(i >= 0 && i + n <= len);
183 return string(ptr + i, n);
186 inline string &string::operator+=(char c)
188 if (len >= sz)
189 grow1();
190 ptr[len++] = c;
191 return *this;
194 void put_string(const string &, FILE *);
196 string as_string(int);