diff --git a/src/modules/Image/encodings/iff.c b/src/modules/Image/encodings/iff.c index b294b05a5bdc00ac15e71c49c29310f75d1cb73f..3ecb90518c12bb1836e5b162e2306a2d1e84cc69 100644 --- a/src/modules/Image/encodings/iff.c +++ b/src/modules/Image/encodings/iff.c @@ -1,16 +1,18 @@ -/* $Id: iff.c,v 1.1 1999/04/06 17:24:32 marcus Exp $ */ +/* $Id: iff.c,v 1.2 1999/04/09 16:18:42 marcus Exp $ */ #include "global.h" #include "stralloc.h" -RCSID("$Id: iff.c,v 1.1 1999/04/06 17:24:32 marcus Exp $"); +RCSID("$Id: iff.c,v 1.2 1999/04/09 16:18:42 marcus Exp $"); #include "pike_macros.h" #include "object.h" #include "constants.h" #include "interpret.h" #include "svalue.h" #include "mapping.h" +#include "array.h" #include "error.h" +#include "operators.h" static INT32 low_parse_iff(unsigned char *data, INT32 len, unsigned char *hdr, @@ -60,3 +62,51 @@ void parse_iff(char *id, unsigned char *data, INT32 len, low_parse_iff(data+12, len-12, data, m, stopchunk); } + +static struct pike_string *low_make_iff(struct svalue *s) +{ + INT32 len; + unsigned char lenb[4]; + + if(s->type != T_ARRAY || s->u.array->size != 2 || + s->u.array->item[0].type != T_STRING || + s->u.array->item[1].type != T_STRING) + error("invalid chunk\n"); + + add_ref(s->u.array); + push_array_items(s->u.array); + len = sp[-1].u.string->len; + lenb[0] = (len & 0xff000000)>>24; + lenb[1] = (len & 0x00ff0000)>>16; + lenb[2] = (len & 0x0000ff00)>>8; + lenb[3] = (len & 0x000000ff); + push_string(make_shared_binary_string(lenb, 4)); + stack_swap(); + if(len&1) { + push_string(make_shared_binary_string("\0", 1)); + f_add(4); + } else + f_add(3); + return (--sp)->u.string; +} + +struct pike_string *make_iff(char *id, struct array *chunks) +{ + struct pike_string *res; + INT32 i; + + push_text("FORM"); + push_text(id); + if(chunks->size > 0) { + for(i=0; i<chunks->size; i++) + push_string(low_make_iff(&chunks->item[i])); + if(chunks->size > 1) + f_add(chunks->size); + } else + push_text(""); + f_add(2); + f_aggregate(2); + res = low_make_iff(&sp[-1]); + pop_stack(); + return res; +}