new functions
[swftools.git] / lib / rfxswf.c
index a225f7e..15b7e2a 100644 (file)
 #include "./bitio.h"
 #include "./MD5.h"
 
+// memory allocation
+
+void* rfxalloc(int size)
+{
+  void*ptr;
+#ifdef HAVE_CALLOC
+  ptr = calloc(size);
+#else
+  ptr = malloc(size);
+  memset(ptr, 0, size);
+#endif
+  if(!ptr) {
+    fprintf(stderr, "FATAL: Out of memory\n");
+    /* TODO: we should send a signal, so that the debugger kicks in */
+    exit(1);
+  }
+  return ptr;
+}
+
+void rfxdealloc(void*ptr)
+{
+  free(ptr);
+}
+
 // internal constants
 
 #define MALLOC_SIZE     128
@@ -55,7 +79,6 @@
 
 #define MEMSIZE(l) (((l/MALLOC_SIZE)+1)*MALLOC_SIZE)
 
-
 // inline wrapper functions
 
 TAG * swf_NextTag(TAG * t) { return t->next; }
@@ -179,6 +202,13 @@ int swf_SetU16(TAG * t,U16 v)
   t->data[t->len++] = a[1];
   return 0;
 }
+void swf_SetS16(TAG * t,int v)
+{
+    if(v>32767 || v<-32768) {
+       fprintf(stderr, "Warning: S16 overflow: %d\n", v);
+    }
+    swf_SetU16(t, (S16)v);
+}
 
 int swf_SetU32(TAG * t,U32 v)
 { U8 a[4];
@@ -805,6 +835,13 @@ void swf_ResetTag(TAG*tag, U16 id)
     tag->id = id;
 }
 
+TAG* swf_CopyTag(TAG*tag, TAG*to_copy)
+{
+    tag = swf_InsertTag(tag, to_copy->id);
+    swf_SetBlock(tag, to_copy->data, to_copy->len);
+    return tag;
+}
+
 int swf_DeleteTag(TAG * t)
 { if (!t) return -1;