moved declarations into include file
[swftools.git] / lib / modules / swfabc.h
diff --git a/lib/modules/swfabc.h b/lib/modules/swfabc.h
new file mode 100644 (file)
index 0000000..94d8300
--- /dev/null
@@ -0,0 +1,162 @@
+#ifndef __swfabc_h__
+#define __swfabc_h__
+
+#define DECLARE(x) struct _##x;typedef struct _##x x##_t;
+#define DECLARE_LIST(x) \
+struct _##x##_list { \
+    struct _##x* x; \
+    struct _##x##_list*next; \
+}; \
+typedef struct _##x##_list x##_list_t; \
+
+DECLARE(abc_file);
+DECLARE(abc_method_body);
+DECLARE(abc_interface);
+DECLARE(abc_multiname);
+DECLARE(abc_namespace);
+
+DECLARE_LIST(abc_multiname);
+
+typedef struct _abc_method {
+    abc_multiname_t*return_type;
+    abc_multiname_list_t*parameters;
+    const char*name;
+    U8 flags;
+
+    int index;
+    int method_body_index;
+} abc_method_t;
+
+typedef enum multiname_type
+{QNAME=0x07,
+ QNAMEA=0x0D,
+ RTQNAME=0x0F,
+ RTQNAMEA=0x10,
+ RTQNAMEL=0x11,
+ RTQNAMELA=0x12,
+ MULTINAME=0x09,
+ MULTINAMEA=0x0E,
+ MULTINAMEL=0x1B,
+ MULTINAMELA=0x1C
+} multiname_type_t;
+
+struct _abc_namespace {
+    U8 access;
+    char*name;
+};
+
+struct _abc_multiname {
+    multiname_type_t type;
+    abc_namespace_t*ns;
+    const char*namespace_set_name; // FIXME should be a struct
+    const char*name;
+};
+
+typedef struct _dict_entry {
+    const char*name;
+    void*data;
+} dict_entry_t;
+
+typedef struct _dict {
+    int num;
+    int size;
+    dict_entry_t*d;
+} dict_t;
+
+struct _abc_file {
+
+    // contant_pool
+
+    dict_t*ints;
+    dict_t*uints;
+    dict_t*floats;
+    dict_t*strings;
+    dict_t*namespaces;
+    dict_t*namespace_sets;
+    dict_t*sets;
+    dict_t*multinames;
+
+    // abc_file
+
+    dict_t*methods;
+    dict_t*classes;
+    dict_t*scripts;
+    dict_t*method_bodies;
+};
+
+abc_file_t*abc_file_new();
+
+typedef struct _abc_trait {
+    unsigned char type;
+    int name_index;
+
+    union {
+        int disp_id;
+        int slot_id;
+        int data1;
+    };
+    union {
+        int nr;
+        int cls;
+        int type_index;
+        int data2;
+    };
+    int vindex;
+    int vkind;
+} abc_trait_t;
+
+typedef struct _abc_class {
+    int index;
+    abc_file_t*pool;
+    
+    const char*classname;
+    const char*superclass;
+    const char*protectedNS;
+
+    abc_multiname_list_t*interfaces;
+
+    int iinit;
+    U8 flags;
+    
+    int static_constructor_index;
+    dict_t*static_constructor_traits;
+
+    dict_t*traits;
+} abc_class_t;
+
+abc_class_t* abc_class_new(abc_file_t*pool, char*classname, char*superclass);
+void abc_class_sealed(abc_class_t*c);
+void abc_class_final(abc_class_t*c);
+void abc_class_interface(abc_class_t*c);
+void abc_class_protectedNS(abc_class_t*c, char*namespace);
+
+abc_method_body_t* abc_class_staticconstructor(abc_class_t*cls, char*returntype, int num_params, ...);
+abc_method_body_t* abc_class_constructor(abc_class_t*cls, char*returntype, int num_params, ...);
+abc_method_body_t* abc_class_method(abc_class_t*cls, char*returntype, char*name, int num_params, ...);
+
+struct _abc_method_body {
+    int index;
+    abc_file_t*pool;
+    //abc_class_t*cls;
+    abc_method_t*method;
+    TAG*tag;
+    int max_stack;
+    int local_count;
+    int init_scope_depth;
+    int max_scope_depth;
+    int exception_count;
+    dict_t*traits;
+};
+
+typedef struct _abc_label {
+} abc_label_t;
+
+typedef struct _abc_script {
+    abc_method_t*method;
+    abc_file_t*pool;
+    dict_t*traits;
+} abc_script_t;
+
+abc_script_t* abc_initscript(abc_file_t*pool, char*returntype, int num_params, ...);
+
+#endif