X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fapc.git;a=blobdiff_plain;f=src%2Fir.c;h=4255f22857b838edf7cea9bec205bd23f299f93d;hp=76c221d2d376d164489635b47fec0920c976cd8c;hb=05fe1bb311ac82279ed19270b3a834f623de3004;hpb=1effafc476cde8a9996d2a520dd3afc3666f45af diff --git a/src/ir.c b/src/ir.c index 76c221d..4255f22 100644 --- a/src/ir.c +++ b/src/ir.c @@ -25,15 +25,26 @@ int ir_condenser(void); /* Private */ extern //apc.c long sys_pagesize; -static - static inline struct ir_framebox_t* ir_set_add_framebox(struct ir_set_t*, uint8_t*); -static inline -void ir_quit_r(struct pagenode_t*); +static +void ir_free_pages(struct pagenode_t*); static inline int bytes_identical(uint8_t*,uint8_t*); - +static +void* stack_alloc(size_t); +/* Memory allocator */ +struct pagenode_t; +struct pagenode_t { + struct pagenode_t* next; + char* head; + char root[]; +}* pagenode_root, * pagenode_head; +#define PN_ALLOCSIZE (sys_pagesize) +#define PN_HEADERSIZE() (sizeof(struct pagenode_t*) + sizeof(char*)) +#define PN_MEMSIZE() (PN_ALLOCSIZE - PN_HEADERSIZE()) +#define PN_HEADSIZE() (pagenode_head->head - pagenode_head->root) +#define PN_HEADSPACE() (PN_MEMSIZE() - PN_HEADSIZE()) /* Enumerated types */ enum dtype { FSDAT, MSDAT, ADAT, LDAT, FBDAT }; enum ltype { OLINK, MLINK, VLINK, ALINK }; @@ -48,20 +59,19 @@ struct ir_frameinfo_t struct ir_framedata_t { struct ir_setdata_header_t header; struct ir_frameinfo_t frameinfo; -}** framedatas; +}; struct ir_framebox_t { struct ir_setdata_header_t header; struct ir_framedata_t framesheets[FACING_MAX]; struct ir_framedata_t mapsheets[FACING_MAX]; -}** frameboxes; +}; struct ir_simplex_t -{ struct ir_setdat_header_t header; -}** simplexes; +{ struct ir_setdata_header_t header; }; struct ir_link_t -{ struct ir_setdat_header_t header; - struct ir_set_t* src, * trg; - enum ltype type; -}** links; +{ struct ir_setdata_header_t header; + struct ir_set_t* src, * trg; + enum ltype type; +}; union ir_setdata_t { struct ir_setdata_header_t header; struct ir_framebox_t framebox; @@ -74,7 +84,7 @@ struct ir_class_t { struct ir_class_t* nextchild, * nextsib; struct ir_set_t* root_set; uint8_t* name; -}** classes; +}; struct ir_set_t { struct ir_set_t* nextchild, * nextsib; struct ir_class_t* class; @@ -83,7 +93,7 @@ struct ir_set_t struct framebox_t* frameboxes; struct simplex_t* audio; struct link_t* links; -}** sets; +}; /* Function-Like Macros */ #define do_warn() do { \ } while (0) @@ -108,14 +118,13 @@ struct ir_set_t } while (0) #define struct_alloc(_T) ((struct _T*) stack_alloc(sizeof(struct _T))) - static -struct ir_class_t root_class = { .name = "." }; +struct ir_class_t root_class = { .name = (uint8_t*)"." }; /* Init */ int ir_init ( void ) -{ pagenode_root = calloc(struct pagenode_t*) calloc(PN_ALLOCSIZE); +{ pagenode_root = (struct pagenode_t*) calloc(PN_ALLOCSIZE); if (pagenode_root == NULL) return -1; pagenode_root->head = pagenode_root->root; @@ -128,13 +137,13 @@ int ir_init */ void ir_quit ( void ) -{ ir_quit_r(pagenode_root); } +{ ir_free_pages(pagenode_root); } -static inline -void ir_quit_r +static +void ir_free_pages ( struct pagenode_t* pagenode ) { if (pagenode->next != NULL) - ir_quit_r(pagenode->next); + ir_free_pages(pagenode->next); free(pagenode); } @@ -377,19 +386,6 @@ union ir_setdata_t* ir_audio return (union ir_setdata_t*) audio; } - -#define PN_ALLOCSIZE (sys_pagesize) -#define PN_HEADERSIZE() (sizeof(struct pagenode_t*) + sizeof(void*)) -#define PN_MEMSIZE() (PN_ALLOCSIZE - PN_HEADERSIZE()) -#define PN_HEADSIZE() (pagenode_head->head - pagenode_head->root) -#define PN_HEADSPACE() (PN_MEMSIZE() - PN_HEADSIZE()) -struct pagenode_t { - struct pagenode_t* next; - char* head; - char root[]; -}* pagenode_root, * pagenode_head; - - static void* stack_alloc(size_t bytes) { if (!bytes)