From: Jordan Date: Sat, 14 Jan 2017 04:04:02 +0000 (-0800) Subject: fixes X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fapc.git;a=commitdiff_plain;h=56b5678e46687b800dfbec7291f6860f357a7653 fixes --- diff --git a/src/ir.c b/src/ir.c index 16a0ca3..0e52459 100644 --- a/src/ir.c +++ b/src/ir.c @@ -22,33 +22,23 @@ int ir_init(void); void ir_quit(void); int ir_linker(void); int ir_condenser(void); -/* Private */ +/* Memory allocation structures */ struct pagenode_t; -extern //apc.c -long sys_pagesize; -static inline -struct ir_framebox_t* ir_set_add_framebox(struct ir_set_t*, uint8_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_header_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 */ +}; +struct pagenode_t { + struct pagenode_header_t header; + char root[]; +}; +struct pagelist_t { + struct pagenode_t* root, * head; + size_t page_size; +}; +/* Set link data */ enum dtype { FSDAT, MSDAT, ADAT, LDAT, FBDAT }; enum ltype { OLINK, MLINK, VLINK, ALINK }; -/* Set link data */ struct ir_namelist_t; struct ir_namelist_t { struct ir_namelist_t* nextsib; @@ -56,12 +46,12 @@ struct ir_namelist_t }; struct ir_classld_t { struct ir_class_t* root_class; - struct ir_namelist_t* namelist; + struct ir_namelist_t* namelist, * namelist_head; }; struct ir_setld_t { struct classld_t* classld; long long ref; - struct ir_namelist_t* namelist; + struct ir_namelist_t* namelist, * namelist_head; }; /* Set data mem */ struct ir_setdata_header_t @@ -80,8 +70,7 @@ struct ir_framebox_t struct ir_framedata_t framesheets[FACING_MAX]; struct ir_framedata_t mapsheets[FACING_MAX]; }; -struct ir_simplex_t -{ struct ir_setdata_header_t header; }; +struct ir_simplex_t { struct ir_setdata_header_t header; }; struct ir_link_t { struct ir_setdata_header_t header; struct ir_classld_t* classld; @@ -110,6 +99,19 @@ struct ir_set_t struct ir_simplex_t* audio; struct ir_link_t* links; }; +/* Functions */ +static inline +struct ir_framebox_t* ir_set_add_framebox(struct ir_set_t*, uint8_t*); +static +void ir_free_pagenodes(struct pagenode_t*); +static inline +int bytes_identical(uint8_t*,uint8_t*); +static +void* stack_alloc(size_t); +static +uint8_t* name_alloc(uint8_t*); +static inline +union ir_setdata_t* ir_framedata (enum dtype,uint8_t*,apc_facing,int,int); /* Function-Like Macros */ #define do_warn() do { \ } while (0) @@ -133,30 +135,54 @@ struct ir_set_t do_error(); \ } while (0) #define struct_alloc(_T) ((struct _T*) stack_alloc(sizeof(struct _T))) - +#define DATA_PAGESIZE (sys_pagesize) +#define NAME_PAGESIZE (APC_NAME_MAX * 1024) +#define PL_HEADERSIZE (sizeof struct pagenode_header_t) +#define PL_HEADSIZE(_PL) (_PL.head->header.head - _PL.head->root) +#define PL_HEADMEM(_PL) (_PL.page_size - PL_HEADERSIZE - PL_HEADSIZE(_PL)) +/* Memory */ +extern //apc.c +long sys_pagesize; +static +struct pagelist_t datapages, namepages; static struct ir_class_t root_class = { .name = (uint8_t*)"." }; /* Init */ int ir_init ( void ) -{ pagenode_root = (struct pagenode_t*) calloc((size_t)PN_ALLOCSIZE,1); - if (pagenode_root == NULL) +{ if (init_pagelist(&datapages, (size_t)DATA_PAGESIZE)) + eprintf("Memory allocation error\n"); + if (init_pagelist(&namepages, (size_t)NAME_PAGESIZE)) + eprintf("Memory allocation error\n"); + return 0; +} + +static inline +int init_pagelist +( struct pagelist_t* pl, + size_t size +) +{ pl->page_size = size; + pl->root = (struct pagenode_t*) calloc(size,1); + if (pl->root == NULL) return -1; - pagenode_root->head = pagenode_root->root; - pagenode_head = pagenode_root; + pl->root->header.head = pl->root->root; + pl->head = pl->root; return 0; -} +} /* Quit/Cleanup Recursively clean pagenode linked list */ void ir_quit ( void ) -{ ir_free_pages(pagenode_root); } +{ ir_free_pagenodes(datapages.root); + ir_free_pagenodes(namepages.root); +} static -void ir_free_pages +void ir_free_pagenodes ( struct pagenode_t* pagenode ) { if (pagenode->next != NULL) ir_free_pages(pagenode->next); @@ -201,6 +227,7 @@ struct ir_class_t* ir_class_addchild } iter = struct_alloc(ir_class_t); iter->nextsib = class->nextchild; + iter->name = name_alloc(name); return class->nextchild = iter; } @@ -225,6 +252,7 @@ struct ir_set_t* ir_class_addset } iter = struct_alloc(ir_set_t); iter->nextsib = class->root_set; + iter->name = name_alloc(name); return class->root_set = iter; } @@ -249,6 +277,7 @@ struct ir_set_t* ir_set_addchild } iter = struct_alloc(ir_set_t); iter->nextsib = set->nextchild; + iter->name = name_alloc(name); return set->nextchild = iter; } @@ -274,6 +303,7 @@ struct ir_framebox_t* ir_set_add_framebox } iter = struct_alloc(ir_framebox_t); iter->header.nextsib = (union ir_setdata_t*) set->frameboxes; + iter->name = name_alloc(name); return set->frameboxes = iter; } @@ -332,7 +362,8 @@ void ir_set_assign_data } else simplex = (struct ir_simplex_t*) simplex->header.nextsib; - simplex->header.nextsib = setdata; + setdata->audio.header.nextsib = (union ir_setdata_t*) set->audio; + set->audio = (struct ir_simplex_t*) setdata; break; case LDAT: setdata->link.header.nextsib = (union ir_setdata_t*) set->links; @@ -359,26 +390,19 @@ void ir_data_assign_path ( union ir_setdata_t* setdata, uint8_t* path ) -{ setdata->header.src_filename = path; - //TODO: internal strdup, not assign (= path;) +{ if (setdata->header.src_filename != NULL) + wprintf("Path override: %s -> %s for setdata %s\n" + setdata->header.src_filename, path, setdata->header.data_name); + setdata->header.src_filename = name_alloc(path); } - -//TODO: Macro ir_framsheet and mapsheet? union ir_setdata_t* ir_framesheet ( uint8_t* name, apc_facing d, int width, int height ) -{ struct ir_framedata_t* framesheet = struct_alloc(ir_framedata_t); - framesheet->header.type = FSDAT; - framesheet->header.data_name = name; - framesheet->frameinfo.facing = d; - framesheet->frameinfo.w = width; - framesheet->frameinfo.h = height; - return (union ir_setdata_t*) framesheet; -} +{ return ir_framedata(FSDAT, name, d, width, height); } union ir_setdata_t* ir_mapsheet ( uint8_t* name, @@ -386,35 +410,125 @@ union ir_setdata_t* ir_mapsheet int width, int height ) -{ struct ir_framedata_t* mapsheet = struct_alloc(ir_framedata_t); - mapsheet->header.type = MSDAT; - mapsheet->header.data_name = name; - mapsheet->frameinfo.facing = d; - mapsheet->frameinfo.w = width; - mapsheet->frameinfo.h = height; - return (union ir_setdata_t*) mapsheet; +{ return ir_framedata(MSDAT, name, d, width, height); } + +static inline +union ir_setdata_t* ir_framedata +( enum dtype type, + uint8_t* name, + apc_facing d, + int width, + int height +) +{ struct ir_framedata_t* framedata = struct_alloc(ir_framedata_t); + framedata->header.type = type; + framedata->header.data_name = name_alloc(name); + framedata->frameinfo.facing = d; + framedata->frameinfo.w = width; + framedata->frameinfo.h = height; + return (union ir_setdata_t*) framedata; } union ir_setdata_t* ir_audio ( uint8_t* name ) { struct ir_simplex_t* audio = struct_alloc(ir_simplex_t); audio->header.type = ADAT; - audio->header.data_name = name; + audio->header.data_name = name_alloc(name); return (union ir_setdata_t*) audio; } + +/* Create classld that points to a class */ +struct ir_classld_t* ir_classld_from_class +( struct ir_class_t* class ) +{ struct ir_classld_t* classld; + classld = struct_alloc(ir_classld_t); + classld->root_class = class; + return classld; +} + +struct ir_setld_t* ir_setld_from_ref +( long long ref ) +{ struct ir_setld_t* setld; + setld = struct_alloc(ir_setld_t); + setld->ref = ref; + return setld; +} + +struct ir_setld_t* ir_setld_from_classld +( struct ir_classld_t* classld, + uint8_t* name +) +{ struct ir_setld_t* setld; + setld = struct_alloc(ir_setld_t); + setld->namelist.name = name_alloc(name); + setld->namelist_head = setld->namelist; + setld->classld = classld; + return setld; +} + +struct ir_setld_t* ir_setld_addchild +( ir_setld_t* setld, + uint8_t* name +) +{ setld->namelist_head->nextsib = struct_alloc(ir_namelist_t); + setld->namelist_head->nextsib.name = name_alloc(name); + setld->namelist_head = setld->namelist_head->nextsib; + return setld; +} + +union ir_setdata_t* ir_link +( enum ltype link_type, + ir_setld_t* setld, + uint8_t* name +) +{ struct ir_link_t* link; + int name_len; + link = struct_alloc(ir_link_t); + link->header.type = LDAT; + link->type = link_type; + link->classld = setld->classld; + link->setld = setld; + if (link_type != ODAT && name != NULL) + link->header.data_name = name_alloc(name); + return (union ir_setdata_t*) link; +} + + static -void* stack_alloc(size_t bytes) -{ if (!bytes) - { wprint("Attempting to allocate 0 bytes in stack_alloc"); - return pagenode_head->head; - } - if (PN_HEADSPACE() < bytes) - { pagenode_head->next = (struct pagenode_t*) calloc(PN_ALLOCSIZE,1); - pagenode_head = pagenode_head->next; - pagenode_head->head = pagenode_head->root; +void* stack_alloc +( size_t bytes ) +{ if (!bytes) //valid behavior to attain current head + return datapages.head->header.head; + if (PL_HEADMEM(datapages) < bytes) + { datapages.head->header.next = (struct pagenode_t*) calloc(datapages.pagesize,1); + if (datapages.head->header.next == NULL) + eprintf("Memory allocation error \n"); + datapages.head = datapages.head->header.next; + datapages.head->header.head = datapages.head->root; } - pagenode_head->head += bytes; - return (void*) pagenode_head->head - bytes; + datapages.head->header.head += bytes; + return (void*) datapages.head->header.head - bytes; } +static +uint8_t* name_alloc +( uint8_t* name_src ) +{ uint8_t* iter, * name; + int head_mem; + copy: + name = namepages.head->header.head; + iter = name_src; + for (head_mem = PL_HEADMEM(namepages); *iter && head_mem; head_mem--) + *(namepages.head->header.head)++ = *iter++; + if (head_mem == 0) //not enough room + { namepages.head->next = (struct pagenode_t*) calloc(namepages.page_size,1); + if (namepages.head->next == NULL) + eprintf("Memory allocation error\n"); + namepages.head = namepages.head->next; + namepages.head->header.head = namepages.head->root; + goto copy; + } + *(namepages.head->header.head)++ = '\0'; + return name; +}