ref: 3c27f041321b91dbf2bfd0ab9e4865e03854cd68
dir: /dict.c/
#include <u.h>
#include <libc.h>
#include <ctype.h>
#include "pdf.h"
Object *
pdfdict(char *p, char **e, int len)
{
Object *o, *k, *v;
KeyValue *kv;
o = nil;
if(len < 4 || p[0] != '<' || p[1] != '<'){
werrstr("invalid dict");
goto err;
}
p += 2;
len -= 2;
o = calloc(1, sizeof(*o));
o->type = Odict;
for(; len >= 2;){
for(; len > 2 && isws(*p); p++, len--);
if(len < 1){
werrstr("too short");
goto err;
}
if(p[0] == '>' && p[1] == '>'){
p += 2;
break;
}
if((k = pdfobject(p, e, len)) == nil)
goto err;
if(k->type != Oname){
freeobject(k);
werrstr("expected name as a key");
goto err;
}
len -= *e - p;
p = *e;
if((v = pdfobject(p, e, len)) == nil){
freeobject(k);
goto err;
}
len -= *e - p;
p = *e;
if((kv = realloc(o->dict.kv, (o->dict.nkv+1)*sizeof(KeyValue))) == nil){
freeobject(k);
freeobject(v);
goto err;
}
o->dict.kv = kv;
kv[o->dict.nkv].key = strdup(k->name);
freeobject(k);
kv[o->dict.nkv++].value = v;
}
*e = p;
return o;
err:
freeobject(o);
return nil;
}