Initial import of the CDE 2.1.30 sources from the Open Group.
[oweals/cde.git] / cde / programs / nsgmls / UnivCharsetDesc.h
1 /* $XConsortium: UnivCharsetDesc.h /main/1 1996/07/29 17:07:49 cde-hp $ */
2 // Copyright (c) 1994 James Clark
3 // See the file COPYING for copying permission.
4
5 #ifndef UnivCharsetDesc_INCLUDED
6 #define UnivCharsetDesc_INCLUDED 1
7 #ifdef __GNUG__
8 #pragma interface
9 #endif
10
11 #include <stddef.h>
12 #include "types.h"
13 #include "RangeMap.h"
14 #include "Boolean.h"
15 #include "ISet.h"
16
17 #ifdef SP_NAMESPACE
18 namespace SP_NAMESPACE {
19 #endif
20
21 #ifndef SP_API
22 #define SP_API
23 #endif
24
25 class SP_API UnivCharsetDesc {
26 public:
27   struct SP_API Range {
28     WideChar descMin;
29     // Note that this is a count, as in the SGML declaration,
30     // rather than a maximum.
31     unsigned long count;
32     UnivChar univMin;
33   };
34   enum {
35     zero = 48,
36     A = 65,
37     a = 97,
38     tab = 9,
39     rs = 10,
40     re = 13,
41     space = 32,
42     exclamation = 33,
43     lessThan = 60,
44     greaterThan = 62
45     };
46   UnivCharsetDesc();
47   UnivCharsetDesc(const Range *, size_t);
48   void set(const Range *, size_t);
49   Boolean descToUniv(WideChar from, UnivChar &to) const;
50   Boolean descToUniv(WideChar from, UnivChar &to, WideChar &alsoMax) const;
51   // Return 0 for no matches, 1 for 1, 2 for more than 1
52   unsigned univToDesc(UnivChar from, WideChar &to, ISet<WideChar> &toSet)
53        const;
54   unsigned univToDesc(UnivChar from, WideChar &to, ISet<WideChar> &toSet,
55                       WideChar &count)
56        const;
57   void addRange(WideChar descMin, WideChar descMax, UnivChar univMin);
58   void addBaseRange(const UnivCharsetDesc &baseSet,
59                     WideChar descMin,
60                     WideChar descMax,
61                     WideChar baseMin,
62                     ISet<WideChar> &baseMissing);
63   WideChar maxDesc() const;
64 private:
65   RangeMap<WideChar,UnivChar> descToUniv_;
66   friend class UnivCharsetDescIter;
67 };
68
69 class SP_API UnivCharsetDescIter {
70 public:
71   UnivCharsetDescIter(const UnivCharsetDesc &);
72   Boolean next(WideChar &descMin, WideChar &descMax, UnivChar &univMin);
73 private:
74   RangeMapIter<WideChar,UnivChar> iter_;
75 };
76
77 inline
78 Boolean UnivCharsetDesc::descToUniv(WideChar from, UnivChar &to) const
79 {
80   WideChar tem;
81   return descToUniv_.map(from, to, tem);
82 }
83
84 inline
85 Boolean UnivCharsetDesc::descToUniv(WideChar from, UnivChar &to,
86                                     WideChar &alsoMax) const
87 {
88   return descToUniv_.map(from, to, alsoMax);
89 }
90
91 inline
92 unsigned UnivCharsetDesc::univToDesc(UnivChar from, WideChar &to,
93                                      ISet<WideChar> &toSet) const
94 {
95   WideChar tem;
96   return descToUniv_.inverseMap(from, to, toSet, tem);
97 }
98
99 inline
100 unsigned UnivCharsetDesc::univToDesc(UnivChar from, WideChar &to,
101                                      ISet<WideChar> &toSet,
102                                      WideChar &count) const
103 {
104   return descToUniv_.inverseMap(from, to, toSet, count);
105 }
106
107 inline
108 void UnivCharsetDesc::addRange(WideChar descMin,
109                                WideChar descMax,
110                                UnivChar univMin)
111 {
112   descToUniv_.addRange(descMin, descMax, univMin);
113 }
114
115 inline
116 UnivCharsetDescIter::UnivCharsetDescIter(const UnivCharsetDesc &desc)
117 : iter_(desc.descToUniv_)
118 {
119 }
120
121 inline
122 Boolean UnivCharsetDescIter::next(WideChar &descMin,
123                                   WideChar &descMax,
124                                   UnivChar &univMin)
125 {
126   return iter_.next(descMin, descMax, univMin);
127 }
128
129 #ifdef SP_NAMESPACE
130 }
131 #endif
132
133 #endif /* not UnivCharsetDesc_INCLUDED */