ref: f8f7ffe655e3a6439adf0614d0232e7520757566
dir: /object.c/
#include <u.h>
#include <libc.h>
#include <ctype.h>
#include "pdf.h"
Object *
pdfobject(char *p, char **e, int len)
{
Object *o;
int sz;
o = nil;
for(; len > 0 && isws(*p); p++, len--);
if(len < 2){
werrstr("too short");
goto err;
}
if(*p < 1){
werrstr("unexpected non-ascii char");
goto err;
}
switch(*p){
case '<': /* dictionary or a string */
if(len < 2){
werrstr("too short");
goto err;
}
if(p[1] == '<'){ /* dictionary */
o = pdfdict(p, e, len);
break;
}
/* fall through */
case '(': /* string */
if((sz = pdfstring(p, e, len)) < 0)
goto err;
if((o = malloc(sizeof(*o)+sz+1)) != nil){
o->type = Ostr;
o->str = (char*)(o+1);
strcpy(o->str, p);
}
break;
case '/':
if((sz = pdfname(p, e, len)) < 0)
goto err;
if((o = malloc(sizeof(*o)+sz+1)) != nil){
o->type = Oname;
o->str = (char*)(o+1);
strcpy(o->str, p);
}
break;
default:
if(isdigit(*p)){
o->type = Onum;
o->num = strtod(p, e);
break;
}
werrstr("unexpected char %c", *p);
goto err;
}
if(o != nil)
return o;
err:
werrstr("object: %r");
freeobject(o);
return nil;
}
void
freeobject(Object *o)
{
if(o == nil)
return;
free(o);
}