shithub: pdffs

ref: 34238e0feb181a0c120561486d4c86b054d112bc
dir: pdffs/array.c

View raw version
#include <u.h>
#include <libc.h>
#include <ctype.h>
#include "pdf.h"

Object *
pdfarray(char *p, char **e, int len)
{
	Object *o, *m;
	Object **a;

	o = nil;
	if(len < 3 || p[0] != '['){
		werrstr("invalid array");
		goto err;
	}
	p++;
	len--;

	o = calloc(1, sizeof(*o));
	o->type = Oarray;
	for(; len >= 1;){
		for(; len > 0 && isws(*p); p++, len--);
		if(len < 1){
			werrstr("too short");
			goto err;
		}

		if(p[0] == ']'){
			p++;
			break;
		}

		if((m = pdfobject(p, e, len)) == nil)
			goto err;
		len -= *e - p;
		p = *e;

		if((a = realloc(o->array.e, (o->array.ne+1)*sizeof(Object*))) == nil){
			freeobject(m);
			goto err;
		}

		o->array.e = a;
		a[o->array.ne++] = m;
	}

	*e = p;

	return o;
err:
	freeobject(o);

	return nil;
}