ref: 17128cefa8384e9433de8a725686b4e544a83308
dir: /array.c/
#include <u.h> #include <libc.h> #include <bio.h> #include "pdf.h" /* 7.3.6 Array Objects */ Object * pdfarray(Pdf *pdf, Biobuf *b) { Object *o, *m; Object **a; int c, noel; o = calloc(1, sizeof(*o)); o->pdf = pdf; o->type = Oarray; Bgetc(b); /* throw away '[' */ for(noel = 0;;){ if((c = Bgetc(b)) < 0 || c == ']') break; if(noel){ werrstr("no ']'"); goto err; } Bungetc(b); if((m = pdfobj(pdf, b)) == nil){ noel = 1; continue; } if((a = realloc(o->array.e, (o->array.ne+1)*sizeof(Object*))) == nil){ pdfobjfree(m); goto err; } o->array.e = a; a[o->array.ne++] = m; } if(c != ']'){ werrstr("no ']'"); goto err; } return o; err: werrstr("array: %r"); pdfobjfree(o); return nil; } int arraylen(Object *o) { if(o == nil || o == &null) return 0; return (o->type == Oarray) ? o->array.ne : 1; } Object * arrayget(Object *o, int i) { if(arraylen(o) <= i) sysfatal("array: indexing out of range"); return o->type == Oarray ? o->array.e[i] : o; } int arrayint(Object *o, int i) { return (o = arrayget(o, i))->type == Onum ? o->num : 0; }