/* * COPYRIGHT * * cschem - modular/flexible schematics editor - libcschem (core library) * Copyright (C) 2019,2020 Tibor 'Igor2' Palinkas * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version.* * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 31 Milk Street, # 960789 Boston, MA 02196 USA * * Contact: * Project page: http://repo.hu/projects/sch-rnd * contact lead developer: http://www.repo.hu/projects/sch-rnd/contact.html * mailing list: http://www.repo.hu/projects/sch-rnd/contact.html */ #include #include "config.h" #include #include #include #include #include #include #include #include #include #include "util_lib_fs.h" char *csch_lib_fs_realpath(rnd_design_t *hl, const char *root) { char *patha, *rp; const char *path = root; if (*path == '?') path++; patha = rnd_build_fn(hl, path); rp = rnd_lrealpath(patha); free(patha); return rp; } void csch_lib_fs_map(rnd_design_t *hl, csch_lib_backend_t *be, csch_lib_t *parent, gds_t *path, csch_lib_type_t (*type_cb)(rnd_design_t *, const char *fn)) { DIR *dir; struct dirent *de; long save = path->used, restore; csch_lib_t *newent; dir = rnd_opendir(hl, path->array); if (dir == NULL) return; gds_append(path, '/'); restore = path->used; while((de = rnd_readdir(dir)) != NULL) { if (*de->d_name == '.') continue; gds_append_str(path, de->d_name); if (rnd_is_dir(hl, path->array)) { newent = csch_lib_alloc_append(be, parent, rnd_strdup(de->d_name), CSCH_SLIB_DIR); csch_lib_fs_map(hl, be, newent, path, type_cb); } else { csch_lib_type_t type = type_cb(hl, path->array); if (type != CSCH_SLIB_invalid) newent = csch_lib_alloc_append(be, parent, rnd_strdup(de->d_name), type); else newent = NULL; } if (newent != NULL) newent->realpath = rnd_strdup(path->array); path->used = restore; } path->used = save; rnd_closedir(dir); }