2 #include "fitz-stream.h"
4 extern void fz_droparray(fz_obj
*array
);
5 extern void fz_dropdict(fz_obj
*dict
);
7 //#define DO_OBJ_STATS 1
10 static int objstats
[FZ_POINTER
+1];
11 static int intsLessThan65k
;
13 static const char *getTypeName(int type
)
40 void dump_type_stats(void)
47 for (i
= FZ_NULL
; i
<= FZ_POINTER
; i
++) {
51 printf("total: %d\n", total
);
52 for (i
= FZ_NULL
; i
<= FZ_POINTER
; i
++) {
54 percent
= ((double)val
* 100.0) / (double)total
;
55 printf("%5d %.2f%% %s\n", val
, percent
, getTypeName(i
));
57 val
= intsLessThan65k
;
58 percent
= ((double)val
* 100.0) / (double)total
;
59 printf("%5d %.2f%% %s\n", val
, percent
, "intsLessThan65k");
62 void dump_type_stats(void)
68 #define NEWOBJ(KIND,SIZE) \
70 o = *op = fz_malloc(SIZE); \
71 if (!o) return fz_outofmem; \
76 #define NEWOBJ(KIND,SIZE) \
78 o = *op = fz_malloc(SIZE); \
79 if (!o) return fz_outofmem; \
85 fz_newnull(fz_obj
**op
)
87 NEWOBJ(FZ_NULL
, sizeof (fz_obj
));
92 fz_newbool(fz_obj
**op
, int b
)
94 NEWOBJ(FZ_BOOL
, sizeof (fz_obj
));
100 fz_newint(fz_obj
**op
, int i
)
102 NEWOBJ(FZ_INT
, sizeof (fz_obj
));
112 fz_newreal(fz_obj
**op
, float f
)
114 NEWOBJ(FZ_REAL
, sizeof (fz_obj
));
120 fz_newstring(fz_obj
**op
, char *str
, int len
)
122 NEWOBJ(FZ_STRING
, offsetof(fz_obj
, u
.s
.buf
) + len
+ 1);
124 memcpy(o
->u
.s
.buf
, str
, len
);
125 o
->u
.s
.buf
[len
] = '\0';
130 fz_newname(fz_obj
**op
, char *str
)
132 NEWOBJ(FZ_NAME
, offsetof(fz_obj
, u
.n
) + strlen(str
) + 1);
138 fz_newindirect(fz_obj
**op
, int objid
, int genid
)
140 NEWOBJ(FZ_INDIRECT
, sizeof (fz_obj
));
147 fz_newpointer(fz_obj
**op
, void *p
)
149 NEWOBJ(FZ_POINTER
, sizeof (fz_obj
));
155 fz_keepobj(fz_obj
*o
)
164 fz_dropobj(fz_obj
*o
)
170 if (o
->kind
== FZ_ARRAY
)
172 else if (o
->kind
== FZ_DICT
)
180 fz_isnull(fz_obj
*obj
)
182 return obj
? obj
->kind
== FZ_NULL
: 0;
186 fz_isbool(fz_obj
*obj
)
188 return obj
? obj
->kind
== FZ_BOOL
: 0;
192 fz_isint(fz_obj
*obj
)
194 return obj
? obj
->kind
== FZ_INT
: 0;
198 fz_isreal(fz_obj
*obj
)
200 return obj
? obj
->kind
== FZ_REAL
: 0;
204 fz_isstring(fz_obj
*obj
)
206 return obj
? obj
->kind
== FZ_STRING
: 0;
210 fz_isname(fz_obj
*obj
)
212 return obj
? obj
->kind
== FZ_NAME
: 0;
216 fz_isarray(fz_obj
*obj
)
218 return obj
? obj
->kind
== FZ_ARRAY
: 0;
222 fz_isdict(fz_obj
*obj
)
224 return obj
? obj
->kind
== FZ_DICT
: 0;
228 fz_isindirect(fz_obj
*obj
)
230 return obj
? obj
->kind
== FZ_INDIRECT
: 0;
234 fz_ispointer(fz_obj
*obj
)
236 return obj
? obj
->kind
== FZ_POINTER
: 0;
240 fz_tobool(fz_obj
*obj
)
248 fz_toint(fz_obj
*obj
)
258 fz_toreal(fz_obj
*obj
)
268 fz_toname(fz_obj
*obj
)
276 fz_tostrbuf(fz_obj
*obj
)
278 if (fz_isstring(obj
))
284 fz_tostrlen(fz_obj
*obj
)
286 if (fz_isstring(obj
))
292 fz_tonum(fz_obj
*obj
)
294 if (fz_isindirect(obj
))
300 fz_togen(fz_obj
*obj
)
302 if (fz_isindirect(obj
))
308 fz_topointer(fz_obj
*obj
)
310 if (fz_ispointer(obj
))
316 fz_newnamefromstring(fz_obj
**op
, fz_obj
*str
)
318 NEWOBJ(FZ_NAME
, offsetof(fz_obj
, u
.n
) + fz_tostrlen(str
) + 1);
319 memcpy(o
->u
.n
, fz_tostrbuf(str
), fz_tostrlen(str
));
320 o
->u
.n
[fz_tostrlen(str
)] = '\0';
325 fz_objcmp(fz_obj
*a
, fz_obj
*b
)
331 if (a
->kind
!= b
->kind
)
336 case FZ_NULL
: return 0;
337 case FZ_BOOL
: return a
->u
.b
- b
->u
.b
;
338 case FZ_INT
: return a
->u
.i
- b
->u
.i
;
339 case FZ_REAL
: return a
->u
.f
- b
->u
.f
;
341 if (a
->u
.s
.len
!= b
->u
.s
.len
)
342 return a
->u
.s
.len
- b
->u
.s
.len
;
343 return memcmp(a
->u
.s
.buf
, b
->u
.s
.buf
, a
->u
.s
.len
);
345 return strcmp(a
->u
.n
, b
->u
.n
);
348 if (a
->u
.r
.oid
== b
->u
.r
.oid
)
349 return a
->u
.r
.gid
- b
->u
.r
.gid
;
350 return a
->u
.r
.oid
- b
->u
.r
.oid
;
353 if (a
->u
.a
.len
!= b
->u
.a
.len
)
354 return a
->u
.a
.len
- b
->u
.a
.len
;
355 for (i
= 0; i
< a
->u
.a
.len
; i
++)
356 if (fz_objcmp(a
->u
.a
.items
[i
], b
->u
.a
.items
[i
]))
361 if (a
->u
.d
.len
!= b
->u
.d
.len
)
362 return a
->u
.d
.len
- b
->u
.d
.len
;
363 for (i
= 0; i
< a
->u
.d
.len
; i
++)
365 if (fz_objcmp(a
->u
.d
.items
[i
].k
, b
->u
.d
.items
[i
].k
))
367 if (fz_objcmp(a
->u
.d
.items
[i
].v
, b
->u
.d
.items
[i
].v
))