Index: trunk/src/Makefile.dep =================================================================== --- trunk/src/Makefile.dep (revision 15194) +++ trunk/src/Makefile.dep (revision 15195) @@ -397,10 +397,10 @@ ht_element.h ../src_3rd/genht/ht.h ../src_3rd/genht/hash.h \ obj_pstk_list.h obj_pstk.h ../src_3rd/genvector/vtp0.h obj_text_list.h \ obj_rat_list.h obj_rat.h layer_grp.h library.h rats_patch.h board.h \ - build_run.h compat_misc.h data.h crosshair.h vtonpoint.h hid.h error.h \ - drc.h route.h buffer.h obj_subc_list.h obj_subc.h \ - ../src_3rd/libminuid/libminuid.h ../src_3rd/genht/htsp.h rtree.h \ - rtree2.h ../src_3rd/genrtree/genrtree_api.h rtree2_compat.h ht_subc.h \ + build_run.h ../src_3rd/genht/htsp.h compat_misc.h data.h crosshair.h \ + vtonpoint.h hid.h error.h drc.h route.h buffer.h obj_subc_list.h \ + obj_subc.h ../src_3rd/libminuid/libminuid.h rtree.h rtree2.h \ + ../src_3rd/genrtree/genrtree_api.h rtree2_compat.h ht_subc.h \ vtpadstack.h obj_pstk_shape.h polygon.h vtpadstack_t.h draw.h \ ../src_plugins/draw_fab/../report/drill.h obj_all.h plugins.h \ ../src_3rd/puplug/puplug.h ../src_3rd/puplug/libs.h \ @@ -427,9 +427,9 @@ ht_element.h ../src_3rd/genht/ht.h ../src_3rd/genht/hash.h \ obj_pstk_list.h obj_pstk.h ../src_3rd/genvector/vtp0.h obj_text_list.h \ obj_rat_list.h obj_rat.h layer_grp.h library.h rats_patch.h board.h \ - build_run.h data.h crosshair.h vtonpoint.h hid.h error.h drc.h route.h \ - buffer.h obj_subc_list.h obj_subc.h ../src_3rd/libminuid/libminuid.h \ - ../src_3rd/genht/htsp.h rtree.h rtree2.h \ + build_run.h ../src_3rd/genht/htsp.h data.h crosshair.h vtonpoint.h hid.h \ + error.h drc.h route.h buffer.h obj_subc_list.h obj_subc.h \ + ../src_3rd/libminuid/libminuid.h rtree.h rtree2.h \ ../src_3rd/genrtree/genrtree_api.h rtree2_compat.h ht_subc.h \ vtpadstack.h obj_pstk_shape.h polygon.h vtpadstack_t.h draw.h font.h \ const.h hid_actions.h obj_all.h plugins.h ../src_3rd/puplug/puplug.h \ @@ -660,9 +660,9 @@ ht_element.h ../src_3rd/genht/ht.h ../src_3rd/genht/hash.h \ obj_pstk_list.h obj_pstk.h ../src_3rd/genvector/vtp0.h obj_text_list.h \ obj_rat_list.h obj_rat.h layer_grp.h library.h rats_patch.h board.h \ - build_run.h data.h crosshair.h vtonpoint.h hid.h error.h drc.h route.h \ - buffer.h obj_subc_list.h obj_subc.h ../src_3rd/libminuid/libminuid.h \ - ../src_3rd/genht/htsp.h rtree.h rtree2.h \ + build_run.h ../src_3rd/genht/htsp.h data.h crosshair.h vtonpoint.h hid.h \ + error.h drc.h route.h buffer.h obj_subc_list.h obj_subc.h \ + ../src_3rd/libminuid/libminuid.h rtree.h rtree2.h \ ../src_3rd/genrtree/genrtree_api.h rtree2_compat.h ht_subc.h \ vtpadstack.h obj_pstk_shape.h polygon.h vtpadstack_t.h error.h draw.h \ layer.h pcb-printf.h plugins.h ../src_3rd/puplug/puplug.h \ @@ -3239,6 +3239,7 @@ ../src_plugins/lib_gtk_common/dlg_about.o: \ ../src_plugins/lib_gtk_common/dlg_about.c ../config.h \ ../src_plugins/lib_gtk_common/dlg_about.h compat_nls.h build_run.h \ + ../src_3rd/genht/htsp.h ../src_3rd/genht/ht.h \ ../src_plugins/lib_gtk_common/compat.h \ ../src_plugins/lib_gtk_common/dlg_report.h ../src_plugins/lib_gtk_common/dlg_attribute.o: \ @@ -5667,8 +5668,8 @@ funchash_core_list.h compat_nls.h obj_all_op.h obj_arc_op.h \ obj_elem_op.h obj_line_op.h obj_pad_op.h obj_pinvia_op.h obj_poly_op.h \ obj_text_op.h obj_rat_op.h obj_subc_op.h obj_pstk_op.h event.h safe_fs.h -build_run.o: build_run.c ../config.h ../src_3rd/genvector/gds_char.h \ - ../src_3rd/genvector/genvector_impl.h \ +build_run.o: build_run.c ../config.h ../src_3rd/genht/hash.h \ + ../src_3rd/genvector/gds_char.h ../src_3rd/genvector/genvector_impl.h \ ../src_3rd/genvector/genvector_undef.h conf_core.h conf.h \ global_typedefs.h pcb_bool.h unit.h pcb-printf.h \ ../src_3rd/liblihata/lihata.h ../src_3rd/liblihata/dom.h \ @@ -5683,10 +5684,9 @@ obj_line.h obj_pad_list.h obj_pad.h obj_pinvia_list.h obj_pinvia.h \ obj_text.h font.h ../src_3rd/genht/htip.h obj_poly.h polyarea.h \ obj_poly_list.h box.h math_helper.h move.h misc_util.h ht_element.h \ - ../src_3rd/genht/ht.h ../src_3rd/genht/hash.h obj_pstk_list.h obj_pstk.h \ - obj_text_list.h obj_rat_list.h obj_rat.h layer_grp.h library.h \ - rats_patch.h build_run.h hid_init.h hid.h error.h drc.h plug_io.h \ - compat_misc.h + ../src_3rd/genht/ht.h obj_pstk_list.h obj_pstk.h obj_text_list.h \ + obj_rat_list.h obj_rat.h layer_grp.h library.h rats_patch.h build_run.h \ + hid_init.h hid.h error.h drc.h plug_io.h compat_misc.h buildin.o: buildin.c ../src_3rd/puplug/libs.h ../src_3rd/puplug/puplug.h \ ../src_3rd/puplug/os_dep.h ../src_3rd/puplug/config.h \ ../src_3rd/puplug/libs.h @@ -5941,10 +5941,10 @@ ht_element.h ../src_3rd/genht/ht.h ../src_3rd/genht/hash.h \ obj_pstk_list.h obj_pstk.h ../src_3rd/genvector/vtp0.h obj_text_list.h \ obj_rat_list.h obj_rat.h layer_grp.h library.h rats_patch.h build_run.h \ - conf_core.h conf.h pcb-printf.h ../src_3rd/liblihata/lihata.h \ - ../src_3rd/liblihata/dom.h ../src_3rd/liblihata/lihata.h \ - ../src_3rd/liblihata/parser.h ../src_3rd/genht/htsp.h list_conf.h data.h \ - crosshair.h vtonpoint.h hid.h error.h drc.h route.h buffer.h \ + ../src_3rd/genht/htsp.h conf_core.h conf.h pcb-printf.h \ + ../src_3rd/liblihata/lihata.h ../src_3rd/liblihata/dom.h \ + ../src_3rd/liblihata/lihata.h ../src_3rd/liblihata/parser.h list_conf.h \ + data.h crosshair.h vtonpoint.h hid.h error.h drc.h route.h buffer.h \ obj_subc_list.h obj_subc.h ../src_3rd/libminuid/libminuid.h rtree.h \ rtree2.h ../src_3rd/genrtree/genrtree_api.h rtree2_compat.h ht_subc.h \ vtpadstack.h obj_pstk_shape.h polygon.h vtpadstack_t.h action_helper.h \ @@ -6066,10 +6066,10 @@ ht_element.h ../src_3rd/genht/ht.h ../src_3rd/genht/hash.h \ obj_pstk_list.h obj_pstk.h ../src_3rd/genvector/vtp0.h obj_text_list.h \ obj_rat_list.h obj_rat.h layer_grp.h library.h rats_patch.h build_run.h \ - conf_core.h conf.h pcb-printf.h ../src_3rd/liblihata/lihata.h \ - ../src_3rd/liblihata/dom.h ../src_3rd/liblihata/lihata.h \ - ../src_3rd/liblihata/parser.h ../src_3rd/genht/htsp.h list_conf.h data.h \ - crosshair.h vtonpoint.h hid.h error.h drc.h route.h buffer.h \ + ../src_3rd/genht/htsp.h conf_core.h conf.h pcb-printf.h \ + ../src_3rd/liblihata/lihata.h ../src_3rd/liblihata/dom.h \ + ../src_3rd/liblihata/lihata.h ../src_3rd/liblihata/parser.h list_conf.h \ + data.h crosshair.h vtonpoint.h hid.h error.h drc.h route.h buffer.h \ obj_subc_list.h obj_subc.h ../src_3rd/libminuid/libminuid.h rtree.h \ rtree2.h ../src_3rd/genrtree/genrtree_api.h rtree2_compat.h ht_subc.h \ vtpadstack.h obj_pstk_shape.h polygon.h vtpadstack_t.h action_helper.h \ Index: trunk/src/build_run.c =================================================================== --- trunk/src/build_run.c (revision 15194) +++ trunk/src/build_run.c (revision 15195) @@ -29,6 +29,7 @@ #include "config.h" #include +#include #include #include "conf_core.h" #include "board.h" @@ -308,3 +309,121 @@ pcb_message(PCB_MSG_ERROR, "aborted by %s signal\n", s); exit(1); } + + +/*** files loaded ***/ + +htsp_t pcb_file_loaded; + + +pcb_file_loaded_t *pcb_file_loaded_category(const char *name, int alloc) +{ + pcb_file_loaded_t *cat = htsp_get(&pcb_file_loaded, name); + + if ((cat == NULL) && (alloc)) { + cat = calloc(sizeof(pcb_file_loaded_t), 1); + cat->type = PCB_FLT_CATEGORY; + cat->name = pcb_strdup(name); + } + return cat; +} + +int pcb_file_loaded_file_free(pcb_file_loaded_t *file) +{ + free(file->data.file.path); + free(file->data.file.desc); + free(file->name); + free(file); + return 0; +} + +int pcb_file_loaded_clear(pcb_file_loaded_t *cat) +{ + htsp_entry_t *e; + + assert(cat->type = PCB_FLT_CATEGORY); + + for (e = htsp_first(&cat->data.category.children); e; e = htsp_next(&cat->data.category.children, e)) { + pcb_file_loaded_file_free(e->value); + htsp_delentry(&cat->data.category.children, e); + } + return 0; +} + +int pcb_file_loaded_clear_at(const char *catname) +{ + pcb_file_loaded_t *cat = pcb_file_loaded_category(catname, 0); + if (cat != NULL) + return pcb_file_loaded_clear(cat); + return 0; +} + +/* clear the subtree of a category, keeping the category; return 0 on success */ +int pcb_file_loaded_set(pcb_file_loaded_t *cat, const char *name, const char *path, const char *desc) +{ + pcb_file_loaded_t *file; + + assert(cat->type = PCB_FLT_CATEGORY); + file = htsp_get(&cat->data.category.children, name); + if (file != NULL) { + free(file->data.file.path); + free(file->data.file.desc); + } + else { + file = malloc(sizeof(pcb_file_loaded_t)); + file->type = PCB_FLT_FILE; + file->name = pcb_strdup(name); + htsp_set(&cat->data.category.children, file->name, file); + } + if (path != NULL) + file->data.file.path = pcb_strdup(path); + else + file->data.file.path = NULL; + + if (desc != NULL) + file->data.file.desc = pcb_strdup(desc); + else + file->data.file.desc = NULL; + return 0; +} + +int pcb_file_loaded_set_at(const char *catnam, const char *name, const char *path, const char *desc) +{ + pcb_file_loaded_t *cat = pcb_file_loaded_category(catnam, 1); + return pcb_file_loaded_set(cat, name, path, desc); +} + +int pcb_file_loaded_del(pcb_file_loaded_t *cat, const char *name) +{ + pcb_file_loaded_t *file; + assert(cat->type = PCB_FLT_CATEGORY); + file = htsp_pop(&cat->data.category.children, name); + if (file != NULL) { + if (file->type != PCB_FLT_FILE) + return -1; + pcb_file_loaded_file_free(file); + } + return 0; +} + +void pcb_file_loaded_init(void) +{ + htsp_init(&pcb_file_loaded, strhash, strkeyeq); +} + +void pcb_file_loaded_uninit(void) +{ + htsp_entry_t *e; + + for (e = htsp_first(&pcb_file_loaded); e; e = htsp_next(&pcb_file_loaded, e)) { + pcb_file_loaded_t *cat = e->value; + pcb_file_loaded_clear(cat); + free(cat->name); + free(cat); + htsp_delentry(&pcb_file_loaded, e); + } + + htsp_uninit(&pcb_file_loaded); +} + + Index: trunk/src/build_run.h =================================================================== --- trunk/src/build_run.h (revision 15194) +++ trunk/src/build_run.h (revision 15195) @@ -26,6 +26,8 @@ * */ +#include + void pcb_quit_app(void); char *pcb_get_info_program(void); @@ -42,3 +44,53 @@ const char *pcb_author(void); void pcb_catch_signal(int Signal); + + + +/*** info on where files are loaded from ***/ + +/* Hash-in-hash tree with the top tree being categories. */ + +typedef enum pcb_file_loaded_type_e { + PCB_FLT_CATEGORY, + PCB_FLT_FILE +} pcb_file_loaded_type_t; + +typedef struct pcb_file_loaded_s pcb_file_loaded_t; + +struct pcb_file_loaded_s { + char *name; /* same as the hash key; strdup'd */ + pcb_file_loaded_type_t type; + union { + struct { + htsp_t children; + } category; + struct { + char *path; + char *desc; + } file; + } data; +}; + +extern htsp_t pcb_file_loaded; + +/* Return the category called name; if doesn't exist and alloc is 1, + allocate it it (else return NULL) */ +pcb_file_loaded_t *pcb_file_loaded_category(const char *name, int alloc); + +/* clear the subtree of a category, keeping the category; return 0 on success */ +int pcb_file_loaded_clear(pcb_file_loaded_t *cat); +int pcb_file_loaded_clear_at(const char *catname); + +/* clear the subtree of a category, keeping the category; return 0 on success */ +int pcb_file_loaded_set(pcb_file_loaded_t *cat, const char *name, const char *path, const char *desc); +int pcb_file_loaded_set_at(const char *catname, const char *name, const char *path, const char *desc); + +/* remove an entry */ +int pcb_file_loaded_del(pcb_file_loaded_t *cat, const char *name); + + +/* called once, from main */ +void pcb_file_loaded_init(void); +void pcb_file_loaded_uninit(void); + Index: trunk/src/main.c =================================================================== --- trunk/src/main.c (revision 15194) +++ trunk/src/main.c (revision 15195) @@ -273,6 +273,7 @@ conf_uninit(); pcb_io_uninit(); pcb_plugin_uninit(); + pcb_file_loaded_uninit(); } static int arg_match(const char *in, const char *shrt, const char *lng) @@ -336,6 +337,7 @@ /* Minimal conf setup before we do anything else */ + pcb_file_loaded_init(); pcb_minuid_init(); conf_init(); conf_core_init();