+ mw->data = (unsigned char*)realloc(mw->data, newlength);
+#endif
+ mw->length = newlength;
+ }
+ memcpy(&mw->data[w->pos], data, len);
+ w->pos += len;
+ return len;
+}
+static void writer_growmemwrite_finish(writer_t*w)
+{
+ struct growmemwrite_t*mw = (struct growmemwrite_t*)w->internal;
+ if(mw->data)
+ free(mw->data);
+ mw->data = 0;
+ mw->length = 0;
+ free(w->internal);mw=0;
+ memset(w, 0, sizeof(writer_t));
+}
+void* writer_growmemwrite_getmem(writer_t*w)
+{
+ struct growmemwrite_t*mw = (struct growmemwrite_t*)w->internal;
+ void*ret = mw->data;
+ /* remove own reference so that neither write() nor finish() can free it.
+ It's property of the caller now.
+ */
+ mw->data = 0;
+ return ret;
+}
+void writer_init_growingmemwriter(writer_t*w, U32 grow)
+{
+ struct growmemwrite_t *mr;
+ mr = (struct growmemwrite_t *)malloc(sizeof(struct growmemwrite_t));
+ mr->length = 4096;
+ mr->data = (unsigned char *)malloc(mr->length);
+ mr->grow = grow;
+ memset(w, 0, sizeof(writer_t));
+ w->write = writer_growmemwrite_write;
+ w->finish = writer_growmemwrite_finish;
+ w->internal = (void*)mr;
+ w->type = WRITER_TYPE_GROWING_MEM;
+ w->bitpos = 0;
+ w->mybyte = 0;
+ w->pos = 0;
+}
+
+/* ---------------------------- file writer ------------------------------- */
+
+struct filewrite_t
+{
+ int handle;
+ char free_handle;
+};
+
+static int writer_filewrite_write(writer_t*w, void* data, int len)
+{
+ struct filewrite_t * fw= (struct filewrite_t*)w->internal;
+ return write(fw->handle, data, len);
+}
+static void writer_filewrite_finish(writer_t*w)
+{
+ struct filewrite_t *mr = (struct filewrite_t*)w->internal;
+ if(mr->free_handle)
+ close(mr->handle);
+ free(w->internal);
+ memset(w, 0, sizeof(writer_t));
+}
+void writer_init_filewriter(writer_t*w, int handle)
+{
+ struct filewrite_t *mr = (struct filewrite_t *)malloc(sizeof(struct filewrite_t));
+ mr->handle = handle;
+ mr->free_handle = 0;
+ memset(w, 0, sizeof(writer_t));
+ w->write = writer_filewrite_write;
+ w->finish = writer_filewrite_finish;
+ w->internal = mr;
+ w->type = WRITER_TYPE_FILE;
+ w->bitpos = 0;
+ w->mybyte = 0;
+ w->pos = 0;
+}
+void writer_init_filewriter2(writer_t*w, char*filename)
+{
+ int fi = open("movie.swf",
+#ifdef O_BINARY
+ O_BINARY|