Index: trunk/src/libcschem/hierarchy.c =================================================================== --- trunk/src/libcschem/hierarchy.c (revision 10237) +++ trunk/src/libcschem/hierarchy.c (revision 10238) @@ -35,6 +35,7 @@ #include "concrete.h" #include "cnc_grp.h" #include "project.h" +#include "plug_library.h" #include "hierarchy.h" @@ -41,6 +42,9 @@ #define HSEP '/' #define MAX_DEPTH 32 +csch_sheet_t *(*csch_app_load_sheet_cb)(csch_project_t *proj, const char *path) = NULL; + + csch_sheet_t *csch_hier_find_by_uuid(const csch_sheet_t *sheet, const char *uuid, int add_to_prj_as_aux) { rnd_message(RND_MSG_ERROR, "cschem/child/uuid not yet implemented"); @@ -48,9 +52,9 @@ return NULL; } -RND_INLINE int sheet_name_eq(csch_sheet_t *sheet, const char *name, long nlen) +/* sname is sheet's loadname (short name), name:nlen is the requested name and its strlen() */ +RND_INLINE int sheet_name_eq(const char *sname, const char *name, long nlen) { - const char *sname = sheet->hidlib.loadname; long slen = strlen(sname); if (slen < nlen) return 0; /* sheet name too short, can't match */ @@ -85,19 +89,71 @@ return 0; } +csch_sheet_t *sch_rnd_multi_load(const char *fn, const char *fmt, int *is_project); + +static csch_sheet_t *hlib_find_by_name(csch_project_t *proj, csch_lib_t *lib, const char *name, long nlen, int add_to_prj_as_aux) +{ + long n; + + if (lib == NULL) + return NULL; + + switch(lib->type) { + case CSCH_SLIB_STATIC: +rnd_trace("static? '%s' '%s':%d\n", lib->name, name, nlen); + if (sheet_name_eq(lib->name, name, nlen)) { +/* csch_sheet_t *res = csch_load_sheet(proj, lib->realpath, NULL, NULL, NULL);*/ + csch_sheet_t *res = csch_app_load_sheet_cb(proj, lib->realpath); + + +rnd_trace(" found! loaded '%s' %p\n", lib->realpath, res); + + return res; + } + break; + + case CSCH_SLIB_PARAMETRIC: + return NULL; + + case CSCH_SLIB_DIR: + for(n = 0; n < lib->children.used; n++) { + csch_sheet_t *res = hlib_find_by_name(proj, lib->children.array[n], name, nlen, add_to_prj_as_aux); + if (res != NULL) + return res; + } + break; + } + + return NULL; +} + csch_sheet_t *csch_hier_find_by_name(const csch_sheet_t *sheet, const char *name, int add_to_prj_as_aux) { csch_project_t *prj = (csch_project_t *)sheet->hidlib.project; long n, nlen = strlen(name); + csch_lib_master_t *master; + htsp_entry_t *e; /* search in project first */ for(n = 0; n < prj->hdr.designs.used; n++) { csch_sheet_t *sheet = prj->hdr.designs.array[n]; - if (sheet_name_eq(sheet, name, nlen)) + if (sheet_name_eq(sheet->hidlib.loadname, name, nlen)) return sheet; } - TODO("hlibrary search"); + /* search the hlibrary */ + if (csch_app_load_sheet_cb == NULL) + return NULL; + master = csch_lib_get_master("hlibrary", 0); + if (master == NULL) + return NULL; + + for(e = htsp_first(&master->roots); e != NULL; e = htsp_next(&master->roots, e)) { + csch_sheet_t *res = hlib_find_by_name((csch_project_t *)sheet->hidlib.project, e->value, name, nlen, add_to_prj_as_aux); + if (res != NULL) + return res; + } + return NULL; } Index: trunk/src/libcschem/hierarchy.h =================================================================== --- trunk/src/libcschem/hierarchy.h (revision 10237) +++ trunk/src/libcschem/hierarchy.h (revision 10238) @@ -69,5 +69,7 @@ void csch_hier_build_path(gds_t *prefix, csch_hlevel_t *hlev); +/* The app needs to provide this call */ +extern csch_sheet_t *(*csch_app_load_sheet_cb)(csch_project_t *proj, const char *path); #endif Index: trunk/src/libcschem/libcschem.h =================================================================== --- trunk/src/libcschem/libcschem.h (revision 10237) +++ trunk/src/libcschem/libcschem.h (revision 10238) @@ -85,4 +85,8 @@ extern minuid_session_t csch_minuid; +/* Further app-side configuration defined in other headers: + - csch_app_load_sheet_cb() +*/ + #endif