1// -*- C++ -*-
2/* Copyright (C) 1989, 1990, 1991, 1992, 2002, 2004
3   Free Software Foundation, Inc.
4     Written by James Clark (jjc@jclark.com)
5
6This file is part of groff.
7
8groff is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 2, or (at your option) any later
11version.
12
13groff is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License along
19with groff; see the file COPYING.  If not, write to the Free Software
20Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
21
22#define DONT_STORE 1
23#define MUST_ALREADY_EXIST 2
24
25class symbol {
26  static const char **table;
27  static int table_used;
28  static int table_size;
29  static char *block;
30  static int block_size;
31  const char *s;
32public:
33  symbol(const char *p, int how = 0);
34  symbol();
35  unsigned long hash() const;
36  int operator ==(symbol) const;
37  int operator !=(symbol) const;
38  const char *contents() const;
39  int is_null() const;
40  int is_empty() const;
41};
42
43
44extern const symbol NULL_SYMBOL;
45extern const symbol EMPTY_SYMBOL;
46
47inline symbol::symbol() : s(0)
48{
49}
50
51inline int symbol::operator==(symbol p) const
52{
53  return s == p.s;
54}
55
56inline int symbol::operator!=(symbol p) const
57{
58  return s != p.s;
59}
60
61inline unsigned long symbol::hash() const
62{
63  return (unsigned long)s;
64}
65
66inline const char *symbol::contents() const
67{
68  return s;
69}
70
71inline int symbol::is_null() const
72{
73  return s == 0;
74}
75
76inline int symbol::is_empty() const
77{
78  return s != 0 && *s == 0;
79}
80
81symbol concat(symbol, symbol);
82
83extern symbol default_symbol;
84