123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- // -*- C++ -*-
- // Declarations etc. related to the string class, defined in libgroff/string.cc
- #include <string.h>
- #include <stdio.h>
- #include <assert.h>
- // Ensure that the first declaration of functions that are later
- // declared as inline declares them as inline.
- class string;
- inline string operator+(const string &, const string &);
- inline string operator+(const string &, const char *);
- inline string operator+(const char *, const string &);
- inline string operator+(const string &, char);
- inline string operator+(char, const string &);
- inline int operator==(const string &, const string &);
- inline int operator!=(const string &, const string &);
- class string
- {
- public:
- // ctors, dtor
- string();
- string(const string &);
- string(const char *);
- string(const char *, int);
- string(char);
- ~string();
-
- string &operator=(const string &);
- string &operator=(const char *);
- string &operator=(char);
- string &operator+=(const string &);
- string &operator+=(const char *);
- string &operator+=(char);
- void append(const char *, int);
-
- int length() const;
- int empty() const;
- int operator*() const;
- string substring(int i, int n) const;
- char &operator[](int);
- char operator[](int) const;
- void set_length(int i);
- const char *contents() const;
- int search(char) const;
- char *extract() const;
- void clear();
- void move(string &);
- friend string operator+(const string &, const string &);
- friend string operator+(const string &, const char *);
- friend string operator+(const char *, const string &);
- friend string operator+(const string &, char);
- friend string operator+(char, const string &);
-
- friend int operator==(const string &, const string &);
- friend int operator!=(const string &, const string &);
- friend int operator<=(const string &, const string &);
- friend int operator<(const string &, const string &);
- friend int operator>=(const string &, const string &);
- friend int operator>(const string &, const string &);
- private:
- char *ptr;
- int len;
- int sz;
- string(const char *, int, const char *, int); // for use by operator+
- void grow1();
- };
- inline char &
- string::operator[](int i)
- {
- assert(i >= 0 && i < len);
- return ptr[i];
- }
- inline char
- string::operator[](int i) const
- {
- assert(i >= 0 && i < len);
- return ptr[i];
- }
- inline int
- string::length() const
- {
- return len;
- }
- inline int
- string::empty() const
- {
- return len == 0;
- }
- inline int
- string::operator*() const
- {
- return len;
- }
- inline const char *
- string::contents() const
- {
- return ptr;
- }
- inline string
- operator+(const string &s1, const string &s2)
- {
- return string(s1.ptr, s1.len, s2.ptr, s2.len);
- }
- inline string
- operator+(const string &s1, const char *s2)
- {
- #ifdef __GNUG__
- if (s2 == 0)
- return s1;
- else
- return string(s1.ptr, s1.len, s2, strlen(s2));
- #else
- return s2 == 0 ? s1 : string(s1.ptr, s1.len, s2, strlen(s2));
- #endif
- }
- inline string
- operator+(const char *s1, const string &s2)
- {
- #ifdef __GNUG__
- if (s1 == 0)
- return s2;
- else
- return string(s1, strlen(s1), s2.ptr, s2.len);
- #else
- return s1 == 0 ? s2 : string(s1, strlen(s1), s2.ptr, s2.len);
- #endif
- }
- inline string
- operator+(const string &s, char c)
- {
- return string(s.ptr, s.len, &c, 1);
- }
- inline string
- operator+(char c, const string &s)
- {
- return string(&c, 1, s.ptr, s.len);
- }
- inline int
- operator==(const string &s1, const string &s2)
- {
- return (s1.len == s2.len
- && (s1.len == 0 || memcmp(s1.ptr, s2.ptr, s1.len) == 0));
- }
- inline int
- operator!=(const string &s1, const string &s2)
- {
- return (s1.len != s2.len
- || (s1.len != 0 && memcmp(s1.ptr, s2.ptr, s1.len) != 0));
- }
- inline string
- string::substring(int i, int n) const
- {
- assert(i >= 0 && i + n <= len);
- return string(ptr + i, n);
- }
- inline string &
- string::operator+=(char c)
- {
- if (len >= sz)
- grow1();
- ptr[len++] = c;
- return *this;
- }
- void put_string(const string &, FILE *);
- string as_string(int);
|