2 #include "fitz-stream.h"
4 void fz_droparray(fz_obj
*obj
);
7 fz_newarray(fz_obj
**op
, int initialcap
)
12 obj
= *op
= fz_malloc(sizeof (fz_obj
));
13 if (!obj
) return fz_outofmem
;
19 obj
->u
.a
.cap
= initialcap
> 0 ? initialcap
: 6;
21 obj
->u
.a
.items
= fz_malloc(sizeof (fz_obj
*) * obj
->u
.a
.cap
);
22 if (!obj
->u
.a
.items
) { fz_free(obj
); return fz_outofmem
; }
24 for (i
= 0; i
< obj
->u
.a
.cap
; i
++)
25 obj
->u
.a
.items
[i
] = nil
;
31 fz_copyarray(fz_obj
**op
, fz_obj
*obj
)
38 return fz_throw("typecheck in copyarray");
40 error
= fz_newarray(&new, fz_arraylen(obj
));
41 if (error
) return error
;
44 for (i
= 0; i
< fz_arraylen(obj
); i
++) {
45 error
= fz_arraypush(new, fz_arrayget(obj
, i
));
46 if (error
) { fz_droparray(new); return error
; }
53 fz_deepcopyarray(fz_obj
**op
, fz_obj
*obj
)
61 return fz_throw("typecheck in deepcopyarray");
63 error
= fz_newarray(&new, fz_arraylen(obj
));
64 if (error
) return error
;
67 for (i
= 0; i
< fz_arraylen(obj
); i
++)
69 val
= fz_arrayget(obj
, i
);
71 if (fz_isarray(val
)) {
72 error
= fz_deepcopyarray(&val
, val
);
73 if (error
) { fz_droparray(new); return error
; }
74 error
= fz_arraypush(new, val
);
75 if (error
) { fz_dropobj(val
); fz_droparray(new); return error
; }
79 else if (fz_isdict(val
)) {
80 error
= fz_deepcopydict(&val
, val
);
81 if (error
) { fz_droparray(new); return error
; }
82 error
= fz_arraypush(new, val
);
83 if (error
) { fz_dropobj(val
); fz_droparray(new); return error
; }
88 error
= fz_arraypush(new, val
);
89 if (error
) { fz_droparray(new); return error
; }
97 fz_arraylen(fz_obj
*obj
)
105 fz_arrayget(fz_obj
*obj
, int i
)
107 if (!fz_isarray(obj
))
110 if (i
< 0 || i
>= obj
->u
.a
.len
)
113 return obj
->u
.a
.items
[i
];
117 fz_arrayput(fz_obj
*obj
, int i
, fz_obj
*item
)
119 if (!fz_isarray(obj
))
120 return fz_throw("typecheck in arrayput");
122 return fz_throw("rangecheck in arrayput: %d < 0", i
);
123 if (i
>= obj
->u
.a
.len
)
124 return fz_throw("rangecheck in arrayput: %d > %d", i
, obj
->u
.a
.len
);
126 if (obj
->u
.a
.items
[i
])
127 fz_dropobj(obj
->u
.a
.items
[i
]);
128 obj
->u
.a
.items
[i
] = fz_keepobj(item
);
134 growarray(fz_obj
*obj
)
140 newcap
= obj
->u
.a
.cap
* 2;
141 newitems
= fz_realloc(obj
->u
.a
.items
, sizeof (fz_obj
*) * newcap
);
142 if (!newitems
) return fz_outofmem
;
144 obj
->u
.a
.items
= newitems
;
145 for (i
= obj
->u
.a
.cap
; i
< newcap
; i
++)
146 obj
->u
.a
.items
[i
] = nil
;
147 obj
->u
.a
.cap
= newcap
;
153 fz_arraypush(fz_obj
*obj
, fz_obj
*item
)
157 if (!fz_isarray(obj
))
158 return fz_throw("typecheck in arraypush");
160 if (obj
->u
.a
.len
+ 1 > obj
->u
.a
.cap
) {
161 error
= growarray(obj
);
162 if (error
) return error
;
165 obj
->u
.a
.items
[obj
->u
.a
.len
] = fz_keepobj(item
);
172 fz_droparray(fz_obj
*obj
)
176 assert(obj
->kind
== FZ_ARRAY
);
178 for (i
= 0; i
< obj
->u
.a
.len
; i
++)
179 if (obj
->u
.a
.items
[i
])
180 fz_dropobj(obj
->u
.a
.items
[i
]);
182 fz_free(obj
->u
.a
.items
);