Index: trunk/src/libcschem/util_parse.c =================================================================== --- trunk/src/libcschem/util_parse.c (revision 3979) +++ trunk/src/libcschem/util_parse.c (revision 3980) @@ -87,11 +87,12 @@ /*** lihata parsers ***/ -static void csch_lht_parse_attribs_val(csch_sheet_t *sheet, csch_cgrp_t *dstg, csch_attribs_t *dsta, csch_source_arg_t src, const char *key, lht_node_t *n, char *src_append_loc, void (*error)(void *ectx, lht_node_t *n, const char *msg), void *ectx, int prio) +static void csch_lht_parse_attribs_val(csch_sheet_t *sheet, csch_cgrp_t *dstg, csch_attribs_t *dsta, const char *key, lht_node_t *n, void (*error)(void *ectx, lht_node_t *n, const char *msg), void *ectx, int prio) { lht_node_t *i, *np, *nv; long idx; const char *val; + csch_source_arg_t src; if (dstg != NULL) { assert(csch_obj_is_grp(&dstg->hdr)); @@ -100,6 +101,7 @@ switch(n->type) { case LHT_TEXT: /* plain text: scalar attrib */ val = n->data.text.value; + csch_attrib_plugin_source_c(&src, n->file_name, n->line, n->col, NULL); if (dstg != NULL) csch_cobj_attrib_set(sheet, dstg, prio, key, val, src); else @@ -107,6 +109,7 @@ break; case LHT_LIST: /* array attrib */ /* first create the attribute as an empty array, just in case it is indeed an empty arrya with no child */ + csch_attrib_plugin_source_c(&src, n->file_name, n->line, n->col, NULL); if (dstg != NULL) csch_cobj_attrib_set(sheet, dstg, prio, key, NULL, src); else @@ -118,6 +121,7 @@ continue; } val = i->data.text.value; + csch_attrib_plugin_source_c(&src, i->file_name, i->line, i->col, NULL); if (dstg != NULL) csch_cobj_attrib_seti(sheet, dstg, prio, key, idx, val, src); else @@ -154,7 +158,7 @@ return; } } - csch_lht_parse_attribs_val(sheet, dstg, dsta, src, key, nv, src_append_loc, error, ectx, prio); + csch_lht_parse_attribs_val(sheet, dstg, dsta, key, nv, error, ectx, prio); break; default: error(ectx, n, "invalid node type for an attribute"); @@ -161,7 +165,7 @@ } } -int csch_lht_parse_attribs_(csch_sheet_t *sheet, csch_chdr_t *dsth, csch_attribs_t *dsta, csch_source_arg_t src, lht_node_t *subtree, char *src_append_loc, void (*error)(void *ectx, lht_node_t *n, const char *msg), void *ectx) +int csch_lht_parse_attribs_(csch_sheet_t *sheet, csch_chdr_t *dsth, csch_attribs_t *dsta, lht_node_t *subtree, void (*error)(void *ectx, lht_node_t *n, const char *msg), void *ectx) { lht_node_t *n; lht_dom_iterator_t it; @@ -174,18 +178,15 @@ assert(csch_obj_is_grp(dsth)); } - for(n = lht_dom_first(&it, subtree); n != NULL; n = lht_dom_next(&it)) { - if (src_append_loc != NULL) - sprintf(src_append_loc, "%d.%d", n->line, n->col); + for(n = lht_dom_first(&it, subtree); n != NULL; n = lht_dom_next(&it)) + csch_lht_parse_attribs_val(sheet, dstg, dsta, n->name, n, error, ectx, CSCH_ATP_USER_DEFAULT); - csch_lht_parse_attribs_val(sheet, dstg, dsta, src, n->name, n, src_append_loc, error, ectx, CSCH_ATP_USER_DEFAULT); - } return 0; } -int csch_lht_parse_attribs(csch_attribs_t *dst, csch_source_arg_t src, lht_node_t *subtree, void (*error)(void *ectx, lht_node_t *n, const char *msg), void *ectx) +int csch_lht_parse_attribs(csch_attribs_t *dst, lht_node_t *subtree, void (*error)(void *ectx, lht_node_t *n, const char *msg), void *ectx) { - return csch_lht_parse_attribs_(NULL, NULL, dst, src, subtree, NULL, error, ectx); + return csch_lht_parse_attribs_(NULL, NULL, dst, subtree, error, ectx); } lht_node_t *csch_view2lht(const csch_view_t *view) Index: trunk/src/libcschem/util_parse.h =================================================================== --- trunk/src/libcschem/util_parse.h (revision 3979) +++ trunk/src/libcschem/util_parse.h (revision 3980) @@ -6,8 +6,8 @@ lht_doc_t *ldch_lht_get_doc(ldch_file_t *file); ldch_low_parser_t *ldch_lht_reg_low_parser(ldch_ctx_t *ctx); -int csch_lht_parse_attribs_(csch_sheet_t *sheet, csch_chdr_t *dsth, csch_attribs_t *dsta, csch_source_arg_t src, lht_node_t *subtree, char *src_append_loc, void (*error)(void *ectx, lht_node_t *n, const char *msg), void *ectx); -int csch_lht_parse_attribs(csch_attribs_t *dst, csch_source_arg_t src, lht_node_t *subtree, void (*error)(void *ectx, lht_node_t *n, const char *msg), void *ectx); +int csch_lht_parse_attribs_(csch_sheet_t *sheet, csch_chdr_t *dsth, csch_attribs_t *dsta, lht_node_t *subtree, void (*error)(void *ectx, lht_node_t *n, const char *msg), void *ectx); +int csch_lht_parse_attribs(csch_attribs_t *dst, lht_node_t *subtree, void (*error)(void *ectx, lht_node_t *n, const char *msg), void *ectx); /* Build a lihata subtree for a view; return NULL on error */ lht_node_t *csch_view2lht(const csch_view_t *view); Index: trunk/src/plugins/io_lihata/read.c =================================================================== --- trunk/src/plugins/io_lihata/read.c (revision 3979) +++ trunk/src/plugins/io_lihata/read.c (revision 3980) @@ -62,8 +62,6 @@ int ver; /* file version */ csch_sheet_t *sheet; csch_project_t *proj; - csch_source_arg_t src; - char *loc, *loc_volatile; rnd_conf_role_t cfg_dest; } read_ctx_t; @@ -77,7 +75,7 @@ static int parse_attribs(read_ctx_t *ctx, csch_chdr_t *dsth, csch_attribs_t *dsta, lht_node_t *subtree) { - return csch_lht_parse_attribs_(ctx->sheet, dsth, dsta, ctx->src, subtree, ctx->loc_volatile, attr_error, ctx); + return csch_lht_parse_attribs_(ctx->sheet, dsth, dsta, subtree, attr_error, ctx); } /* Convert an oid from string, making sure there's no duplicate */ @@ -1009,7 +1007,6 @@ int io_lihata_load_sheet(FILE *f, const char *fn, const char *fmt, csch_sheet_t *dst) { - size_t fn_len = strlen(fn); int res = -1; char *errmsg = NULL; read_ctx_t ctx; @@ -1023,14 +1020,6 @@ return -1; } - /* prepare attribute source template */ - ctx.loc = malloc(fn_len+64); - memcpy(ctx.loc, fn, fn_len); - ctx.loc_volatile = ctx.loc + fn_len; - *ctx.loc_volatile = ':'; - ctx.loc_volatile++; - ctx.src = csch_attrib_src('c', ctx.loc, NULL); - TODO("This should be coming from an arg for loading file into buffer: , rnd_conf_role_t settings_dest"); ctx.cfg_dest = RND_CFR_DESIGN; @@ -1051,7 +1040,6 @@ } lht_dom_uninit(ctx.doc); - free(ctx.loc); free(errmsg); return res; } @@ -1095,7 +1083,6 @@ csch_cgrp_t *io_lihata_load_grp(FILE *f, const char *fn, const char *fmt, csch_sheet_t *sheet) { - size_t fn_len = strlen(fn); csch_cgrp_t *resgrp = NULL; char *errmsg = NULL; read_ctx_t ctx; @@ -1110,13 +1097,6 @@ } TODO("code dup with sheet load"); - /* prepare attribute source template */ - ctx.loc = malloc(fn_len+64); - memcpy(ctx.loc, fn, fn_len); - ctx.loc_volatile = ctx.loc + fn_len; - *ctx.loc_volatile = ':'; - ctx.loc_volatile++; - ctx.src = csch_attrib_src('c', ctx.loc, NULL); if ((ctx.doc->root != NULL) && (ctx.doc->root->type == LHT_HASH) && (strncmp(ctx.doc->root->name, "cschem-group-v", 14) == 0)) { char *end; @@ -1146,7 +1126,6 @@ rnd_message(RND_MSG_ERROR, "Error loading '%s': not a group\n", fn); lht_dom_uninit(ctx.doc); - free(ctx.loc); free(errmsg); return resgrp; } Index: trunk/src/plugins/std_devmap/parse.c =================================================================== --- trunk/src/plugins/std_devmap/parse.c (revision 3979) +++ trunk/src/plugins/std_devmap/parse.c (revision 3980) @@ -36,7 +36,6 @@ ldch_data_t *data; devmap_t *devmap; lht_doc_t *doc = ldch_lht_get_doc(file); - csch_source_arg_t src; if ((doc->root == NULL) || (doc->root->type != LHT_HASH) || (strcmp(doc->root->name, "std_devmap.v1") != 0)) { rnd_message(RND_MSG_ERROR, "devmap: invalid root node in '%s'; expected 'ha:std_devmap.v1'\n", file->real_name); @@ -46,8 +45,7 @@ data = ldch_data_alloc(file, parser, sizeof(devmap_t)); devmap = (devmap_t *)&data->payload; csch_attrib_init(&devmap->comp_attribs); - csch_attrib_plugin_source_p(&src, "std_devmap", file->real_name); - if (csch_lht_parse_attribs(&devmap->comp_attribs, src, lht_dom_hash_get(doc->root, "comp_attribs"), parse_error, NULL) != 0) { + if (csch_lht_parse_attribs(&devmap->comp_attribs, lht_dom_hash_get(doc->root, "comp_attribs"), parse_error, NULL) != 0) { rnd_message(RND_MSG_ERROR, "devmap: failed to load any component attributes from '%s''\n", file->real_name); ldch_data_free(parser->ctx, data); return NULL;