Index: trunk/src_plugins/drc_query/drc_query.c =================================================================== --- trunk/src_plugins/drc_query/drc_query.c (revision 30158) +++ trunk/src_plugins/drc_query/drc_query.c (revision 30159) @@ -115,7 +115,7 @@ qctx.title = title; qctx.desc = desc; - pcb_qry_run_script(query, scope, drc_qry_exec_cb, &qctx); + pcb_qry_run_script(pcb, query, scope, drc_qry_exec_cb, &qctx); return 0; } Index: trunk/src_plugins/query/query.h =================================================================== --- trunk/src_plugins/query/query.h (revision 30158) +++ trunk/src_plugins/query/query.h (revision 30159) @@ -182,7 +182,7 @@ /* Compile and execute a script, calling cb for each object. Returns the number of evaluation errors or -1 if evaluation couldn't start */ -int pcb_qry_run_script(const char *script, const char *scope, void (*cb)(void *user_ctx, pcb_qry_val_t *res, pcb_any_obj_t *current), void *user_ctx); +int pcb_qry_run_script(pcb_board_t *pcb, const char *script, const char *scope, void (*cb)(void *user_ctx, pcb_qry_val_t *res, pcb_any_obj_t *current), void *user_ctx); #endif Index: trunk/src_plugins/query/query_act.c =================================================================== --- trunk/src_plugins/query/query_act.c (revision 30158) +++ trunk/src_plugins/query/query_act.c (revision 30159) @@ -124,7 +124,7 @@ pcb_idpath_list_append(list, idp); } -int pcb_qry_run_script(const char *script, const char *scope, void (*cb)(void *user_ctx, pcb_qry_val_t *res, pcb_any_obj_t *current), void *user_ctx) +int pcb_qry_run_script(pcb_board_t *pcb, const char *script, const char *scope, void (*cb)(void *user_ctx, pcb_qry_val_t *res, pcb_any_obj_t *current), void *user_ctx) { pcb_qry_node_t *prg = NULL; int bufno = -1; /* empty scope means board */ @@ -164,7 +164,7 @@ return -1; } } - return pcb_qry_run(prg, bufno, cb, user_ctx); + return pcb_qry_run(pcb, prg, bufno, cb, user_ctx); } static fgw_error_t pcb_act_query(fgw_arg_t *res, int argc, fgw_arg_t *argv) @@ -203,7 +203,7 @@ memset(&st, 0, sizeof(st)); printf("Script eval: '%s' scope='%s'\n", arg, scope == NULL ? "" : scope); - errs = pcb_qry_run_script(arg, scope, eval_cb, &st); + errs = pcb_qry_run_script(PCB_ACT_BOARD, arg, scope, eval_cb, &st); if (errs < 0) printf("Failed to run the query\n"); @@ -230,7 +230,7 @@ PCB_ACT_MAY_CONVARG(2, FGW_STR, query, arg = argv[2].val.str); PCB_ACT_MAY_CONVARG(3, FGW_STR, query, scope = argv[3].val.str); - if (pcb_qry_run_script(arg, scope, flagop_cb, &sel) < 0) + if (pcb_qry_run_script(PCB_ACT_BOARD, arg, scope, flagop_cb, &sel) < 0) printf("Failed to run the query\n"); if (sel.cnt > 0) { pcb_board_set_changed_flag(pcb_true); @@ -258,7 +258,7 @@ PCB_ACT_MAY_CONVARG(2, FGW_STR, query, arg = argv[2].val.str); PCB_ACT_MAY_CONVARG(3, FGW_STR, query, scope = argv[3].val.str); - if (pcb_qry_run_script(arg, scope, flagop_cb, &sel) < 0) + if (pcb_qry_run_script(PCB_ACT_BOARD, arg, scope, flagop_cb, &sel) < 0) printf("Failed to run the query\n"); if (sel.cnt > 0) { pcb_board_set_changed_flag(pcb_true); @@ -279,7 +279,7 @@ if (!fgw_ptr_in_domain(&pcb_fgw, &argv[2], PCB_PTR_DOMAIN_IDPATH_LIST)) return FGW_ERR_PTR_DOMAIN; - if (pcb_qry_run_script(arg, scope, append_cb, list) < 0) + if (pcb_qry_run_script(PCB_ACT_BOARD, arg, scope, append_cb, list) < 0) PCB_ACT_IRES(1); else PCB_ACT_IRES(0); Index: trunk/src_plugins/query/query_exec.c =================================================================== --- trunk/src_plugins/query/query_exec.c (revision 30158) +++ trunk/src_plugins/query/query_exec.c (revision 30159) @@ -34,7 +34,7 @@ #include "query_access.h" #include -void pcb_qry_init(pcb_qry_exec_t *ctx, pcb_qry_node_t *root, int bufno) +void pcb_qry_init(pcb_qry_exec_t *ctx, pcb_board_t *pcb, pcb_qry_node_t *root, int bufno) { memset(ctx, 0, sizeof(pcb_qry_exec_t)); ctx->all.type = PCBQ_VT_LST; @@ -43,6 +43,7 @@ else pcb_qry_list_all_data(&ctx->all, pcb_buffers[bufno].Data, PCB_OBJ_ANY & (~PCB_OBJ_LAYER)); + ctx->pcb = pcb; ctx->root = root; ctx->iter = NULL; } @@ -123,13 +124,13 @@ ctx->iter->idx[vi] = 0; } -int pcb_qry_run(pcb_qry_node_t *prg, int bufno, void (*cb)(void *user_ctx, pcb_qry_val_t *res, pcb_any_obj_t *current), void *user_ctx) +int pcb_qry_run(pcb_board_t *pcb, pcb_qry_node_t *prg, int bufno, void (*cb)(void *user_ctx, pcb_qry_val_t *res, pcb_any_obj_t *current), void *user_ctx) { int ret = 0, r; pcb_qry_exec_t ec; if (prg->type == PCBQ_EXPR_PROG) { - pcb_qry_init(&ec, prg, bufno); + pcb_qry_init(&ec, pcb, prg, bufno); ret = pcb_qry_run_(&ec, prg, 1, 0, cb, user_ctx); pcb_qry_uninit(&ec); return ret; @@ -138,7 +139,7 @@ if (prg->type == PCBQ_RULE) { pcb_qry_node_t *n; - pcb_qry_init(&ec, prg, bufno); + pcb_qry_init(&ec, pcb, prg, bufno); /* execute 'let' statements first */ for(n = prg->data.children->next->next; n != NULL; n = n->next) { Index: trunk/src_plugins/query/query_exec.h =================================================================== --- trunk/src_plugins/query/query_exec.h (revision 30158) +++ trunk/src_plugins/query/query_exec.h (revision 30159) @@ -2,7 +2,7 @@ * COPYRIGHT * * pcb-rnd, interactive printed circuit board design - * Copyright (C) 2016 Tibor 'Igor2' Palinkas + * Copyright (C) 2016,2020 Tibor 'Igor2' Palinkas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,6 +32,7 @@ #include "query.h" struct pcb_qry_exec_s { + pcb_board_t *pcb; pcb_qry_node_t *root; pcb_qry_val_t all; /* a list of all objects */ pcb_query_iter_t *iter; /* current iterator */ @@ -38,11 +39,11 @@ }; /* if bufno is -1, scope is the board, else scope is the buffer addressed by bufno */ -void pcb_qry_init(pcb_qry_exec_t *ctx, pcb_qry_node_t *root, int bufno); +void pcb_qry_init(pcb_qry_exec_t *ctx, pcb_board_t *pcb, pcb_qry_node_t *root, int bufno); void pcb_qry_uninit(pcb_qry_exec_t *ctx); /* Execute an expression or a rule */ -int pcb_qry_run(pcb_qry_node_t *prg, int bufno, void (*cb)(void *user_ctx, pcb_qry_val_t *res, pcb_any_obj_t *current), void *user_ctx); +int pcb_qry_run(pcb_board_t *pcb, pcb_qry_node_t *prg, int bufno, void (*cb)(void *user_ctx, pcb_qry_val_t *res, pcb_any_obj_t *current), void *user_ctx); int pcb_qry_is_true(pcb_qry_val_t *val);