1 //========================================================================
5 // Copyright 1996-2002 Glyph & Cog, LLC
7 //========================================================================
27 //------------------------------------------------------------------------
29 //------------------------------------------------------------------------
32 int num
; // object number
33 int gen
; // generation number
36 //------------------------------------------------------------------------
38 //------------------------------------------------------------------------
51 objDict
, // dictionary
53 objRef
, // indirect reference
56 objCmd
, // command name
57 objError
, // error return from Lexer
58 objEOF
, // end of file return from Lexer
59 objNone
// uninitialized object
62 #define numObjTypes 14 // total number of object types
64 //------------------------------------------------------------------------
66 //------------------------------------------------------------------------
69 #define initObj(t) ++numAlloc[type = t]
71 #define initObj(t) type = t
77 // Default constructor.
81 // Initialize an object.
82 Object
*initBool(GBool boolnA
)
83 { initObj(objBool
); booln
= boolnA
; return this; }
84 Object
*initInt(int intgA
)
85 { initObj(objInt
); intg
= intgA
; return this; }
86 Object
*initReal(double realA
)
87 { initObj(objReal
); real
= realA
; return this; }
88 Object
*initString(GString
*stringA
)
89 { initObj(objString
); string
= stringA
; return this; }
90 Object
*initName(char *nameA
)
91 { initObj(objName
); name
= copyString(nameA
); return this; }
93 { initObj(objNull
); return this; }
94 Object
*initArray(XRef
*xref
);
95 Object
*initDict(XRef
*xref
);
96 Object
*initStream(Stream
*streamA
);
97 Object
*initRef(int numA
, int genA
)
98 { initObj(objRef
); ref
.num
= numA
; ref
.gen
= genA
; return this; }
99 Object
*initCmd(char *cmdA
)
100 { initObj(objCmd
); cmd
= copyString(cmdA
); return this; }
102 { initObj(objError
); return this; }
104 { initObj(objEOF
); return this; }
107 Object
*copy(Object
*obj
);
109 // If object is a Ref, fetch and return the referenced object.
110 // Otherwise, return a copy of the object.
111 Object
*fetch(XRef
*xref
, Object
*obj
);
113 // Free object contents.
117 ObjType
getType() { return type
; }
118 GBool
isBool() { return type
== objBool
; }
119 GBool
isInt() { return type
== objInt
; }
120 GBool
isReal() { return type
== objReal
; }
121 GBool
isNum() { return type
== objInt
|| type
== objReal
; }
122 GBool
isString() { return type
== objString
; }
123 GBool
isName() { return type
== objName
; }
124 GBool
isNull() { return type
== objNull
; }
125 GBool
isArray() { return type
== objArray
; }
126 GBool
isDict() { return type
== objDict
; }
127 GBool
isStream() { return type
== objStream
; }
128 GBool
isRef() { return type
== objRef
; }
129 GBool
isCmd() { return type
== objCmd
; }
130 GBool
isError() { return type
== objError
; }
131 GBool
isEOF() { return type
== objEOF
; }
132 GBool
isNone() { return type
== objNone
; }
134 // Special type checking.
135 GBool
isName(char *nameA
)
136 { return type
== objName
&& !strcmp(name
, nameA
); }
137 GBool
isDict(char *dictType
);
138 GBool
isStream(char *dictType
);
139 GBool
isCmd(char *cmdA
)
140 { return type
== objCmd
&& !strcmp(cmd
, cmdA
); }
142 // Accessors. NB: these assume object is of correct type.
143 GBool
getBool() { return booln
; }
144 int getInt() { return intg
; }
145 double getReal() { return real
; }
146 double getNum() { return type
== objInt
? (double)intg
: real
; }
147 GString
*getString() { return string
; }
148 char *getName() { return name
; }
149 Array
*getArray() { return array
; }
150 Dict
*getDict() { return dict
; }
151 Stream
*getStream() { return stream
; }
152 Ref
getRef() { return ref
; }
153 int getRefNum() { return ref
.num
; }
154 int getRefGen() { return ref
.gen
; }
157 int arrayGetLength();
158 void arrayAdd(Object
*elem
);
159 Object
*arrayGet(int i
, Object
*obj
);
160 Object
*arrayGetNF(int i
, Object
*obj
);
164 void dictAdd(char *key
, Object
*val
);
165 GBool
dictIs(char *dictType
);
166 Object
*dictLookup(char *key
, Object
*obj
);
167 Object
*dictLookupNF(char *key
, Object
*obj
);
168 char *dictGetKey(int i
);
169 Object
*dictGetVal(int i
, Object
*obj
);
170 Object
*dictGetValNF(int i
, Object
*obj
);
173 GBool
streamIs(char *dictType
);
177 int streamLookChar();
178 char *streamGetLine(char *buf
, int size
);
179 Guint
streamGetPos();
180 void streamSetPos(Guint pos
, int dir
= 0);
181 Dict
*streamGetDict();
185 void print(FILE *f
= stdout
);
188 static void memCheck(FILE *f
);
192 ObjType type
; // object type
193 union { // value for each type:
194 GBool booln
; // boolean
197 GString
*string
; // string
199 Array
*array
; // array
200 Dict
*dict
; // dictionary
201 Stream
*stream
; // stream
202 Ref ref
; // indirect reference
203 char *cmd
; // command
207 static int // number of each type of object
208 numAlloc
[numObjTypes
]; // currently allocated
212 //------------------------------------------------------------------------
214 //------------------------------------------------------------------------
218 inline int Object::arrayGetLength()
219 { return array
->getLength(); }
221 inline void Object::arrayAdd(Object
*elem
)
222 { array
->add(elem
); }
224 inline Object
*Object::arrayGet(int i
, Object
*obj
)
225 { return array
->get(i
, obj
); }
227 inline Object
*Object::arrayGetNF(int i
, Object
*obj
)
228 { return array
->getNF(i
, obj
); }
230 //------------------------------------------------------------------------
232 //------------------------------------------------------------------------
236 inline int Object::dictGetLength()
237 { return dict
->getLength(); }
239 inline void Object::dictAdd(char *key
, Object
*val
)
240 { dict
->add(key
, val
); }
242 inline GBool
Object::dictIs(char *dictType
)
243 { return dict
->is(dictType
); }
245 inline GBool
Object::isDict(char *dictType
)
246 { return type
== objDict
&& dictIs(dictType
); }
248 inline Object
*Object::dictLookup(char *key
, Object
*obj
)
249 { return dict
->lookup(key
, obj
); }
251 inline Object
*Object::dictLookupNF(char *key
, Object
*obj
)
252 { return dict
->lookupNF(key
, obj
); }
254 inline char *Object::dictGetKey(int i
)
255 { return dict
->getKey(i
); }
257 inline Object
*Object::dictGetVal(int i
, Object
*obj
)
258 { return dict
->getVal(i
, obj
); }
260 inline Object
*Object::dictGetValNF(int i
, Object
*obj
)
261 { return dict
->getValNF(i
, obj
); }
263 //------------------------------------------------------------------------
265 //------------------------------------------------------------------------
269 inline GBool
Object::streamIs(char *dictType
)
270 { return stream
->getDict()->is(dictType
); }
272 inline GBool
Object::isStream(char *dictType
)
273 { return type
== objStream
&& streamIs(dictType
); }
275 inline void Object::streamReset()
278 inline void Object::streamClose()
281 inline int Object::streamGetChar()
282 { return stream
->getChar(); }
284 inline int Object::streamLookChar()
285 { return stream
->lookChar(); }
287 inline char *Object::streamGetLine(char *buf
, int size
)
288 { return stream
->getLine(buf
, size
); }
290 inline Guint
Object::streamGetPos()
291 { return stream
->getPos(); }
293 inline void Object::streamSetPos(Guint pos
, int dir
)
294 { stream
->setPos(pos
, dir
); }
296 inline Dict
*Object::streamGetDict()
297 { return stream
->getDict(); }