Index: trunk/src_plugins/query/fnc.c =================================================================== --- trunk/src_plugins/query/fnc.c (revision 35641) +++ trunk/src_plugins/query/fnc.c (revision 35642) @@ -168,6 +168,7 @@ pcb_qry_fnc_reg("netlen", fnc_netlen); pcb_qry_fnc_reg("obj_by_idpath", fnc_obj_by_idpath); pcb_qry_fnc_reg("poly_is_valid", fnc_poly_is_valid); + pcb_qry_fnc_reg("text_invalid_chars", fnc_text_invalid_chars); pcb_qry_fnc_reg("thermal_on", fnc_thermal_on); Index: trunk/src_plugins/query/fnc_glue.c =================================================================== --- trunk/src_plugins/query/fnc_glue.c (revision 35641) +++ trunk/src_plugins/query/fnc_glue.c (revision 35642) @@ -339,4 +339,18 @@ return -1; PCB_QRY_RET_INT(res, !!pcb_poly_is_valid((pcb_poly_t *)obj)); -} \ No newline at end of file +} + +static int fnc_text_invalid_chars(pcb_qry_exec_t *ectx, int argc, pcb_qry_val_t *argv, pcb_qry_val_t *res) +{ + pcb_any_obj_t *obj; + + if ((argc != 1) || (argv[0].type != PCBQ_VT_OBJ)) + return -1; + + obj = argv[0].data.obj; + if (obj->type != PCB_OBJ_TEXT) + return -1; + + PCB_QRY_RET_INT(res, pcb_text_invalid_chars(ectx->pcb, NULL, ((pcb_text_t *)obj))); +}