Index: trunk/scconfig/Rev.h =================================================================== --- trunk/scconfig/Rev.h (revision 8989) +++ trunk/scconfig/Rev.h (revision 8990) @@ -1 +1 @@ -static const int myrev = 8920; +static const int myrev = 8990; Index: trunk/scconfig/Rev.tab =================================================================== --- trunk/scconfig/Rev.tab (revision 8989) +++ trunk/scconfig/Rev.tab (revision 8990) @@ -1,3 +1,4 @@ +8990 configure new source files for subcircuits 8920 configure build changes in puplug 8912 configure fp_board enabled by default; new plugin for mentor cell footprints 8817 configure fp_board: new plugin Index: trunk/src/Makefile.dep =================================================================== --- trunk/src/Makefile.dep (revision 8989) +++ trunk/src/Makefile.dep (revision 8990) @@ -5220,6 +5220,21 @@ obj_poly_list.h box.h math_helper.h macro.h move.h misc_util.h \ ht_element.h ../src_3rd/liblihata/genht/ht.h \ ../src_3rd/liblihata/genht/ht.c +ht_subc.o: ht_subc.c ../config.h obj_subc_list.h obj_subc.h obj_common.h \ + ../src_3rd/liblihata/genht/hash.h ../src_3rd/genlist/gendlist.h flag.h \ + globalconst.h attrib.h global_typedefs.h pcb_bool.h unit.h data.h \ + layer.h obj_all_list.h obj_arc_list.h obj_arc.h \ + ../src_3rd/genlist/gentdlist_impl.h ../src_3rd/genlist/gendlist.h \ + ../src_3rd/genlist/gentdlist_undef.h obj_elem_list.h obj_elem.h \ + obj_line_list.h obj_line.h obj_pad_list.h obj_pad.h obj_pinvia_list.h \ + obj_pinvia.h obj_text.h font.h ../src_3rd/liblihata/genht/htip.h \ + ../src_3rd/liblihata/genht/ht.h ../src_3rd/liblihata/genht/ht_inlines.h \ + obj_poly.h polyarea.h obj_poly_list.h box.h math_helper.h macro.h move.h \ + misc_util.h ht_element.h ../src_3rd/liblihata/genht/ht.h obj_text_list.h \ + obj_rat_list.h obj_rat.h crosshair.h vtonpoint.h \ + ../src_3rd/genvector/genvector_impl.h \ + ../src_3rd/genvector/genvector_undef.h hid.h error.h drc.h layer_grp.h \ + route.h const.h buffer.h ht_subc.h ../src_3rd/liblihata/genht/ht.c insert.o: insert.c ../config.h conf_core.h conf.h global_typedefs.h \ pcb_bool.h unit.h pcb-printf.h ../src_3rd/genvector/gds_char.h \ ../src_3rd/genvector/genvector_impl.h \ @@ -5718,6 +5733,23 @@ globalconst.h ../config.h attrib.h global_typedefs.h pcb_bool.h unit.h \ ../src_3rd/genlist/gentdlist_impl.h ../src_3rd/genlist/gendlist.h \ ../src_3rd/genlist/gentdlist_undef.h ../src_3rd/genlist/gentdlist_impl.c +obj_subc.o: obj_subc.c +obj_subc_list.o: obj_subc_list.c ../config.h obj_subc.h obj_common.h \ + ../src_3rd/liblihata/genht/hash.h ../src_3rd/genlist/gendlist.h flag.h \ + globalconst.h attrib.h global_typedefs.h pcb_bool.h unit.h data.h \ + layer.h obj_all_list.h obj_arc_list.h obj_arc.h \ + ../src_3rd/genlist/gentdlist_impl.h ../src_3rd/genlist/gendlist.h \ + ../src_3rd/genlist/gentdlist_undef.h obj_elem_list.h obj_elem.h \ + obj_line_list.h obj_line.h obj_pad_list.h obj_pad.h obj_pinvia_list.h \ + obj_pinvia.h obj_text.h font.h ../src_3rd/liblihata/genht/htip.h \ + ../src_3rd/liblihata/genht/ht.h ../src_3rd/liblihata/genht/ht_inlines.h \ + obj_poly.h polyarea.h obj_poly_list.h box.h math_helper.h macro.h move.h \ + misc_util.h ht_element.h ../src_3rd/liblihata/genht/ht.h obj_text_list.h \ + obj_rat_list.h obj_rat.h crosshair.h vtonpoint.h \ + ../src_3rd/genvector/genvector_impl.h \ + ../src_3rd/genvector/genvector_undef.h hid.h error.h drc.h layer_grp.h \ + route.h const.h buffer.h obj_subc_list.h ht_subc.h \ + ../src_3rd/genlist/gentdlist_impl.c obj_text.o: obj_text.c ../config.h rotate.h global_typedefs.h pcb_bool.h \ unit.h board.h const.h macro.h vtroutestyle.h attrib.h \ ../src_3rd/genvector/genvector_impl.h \ Index: trunk/src/Makefile.in =================================================================== --- trunk/src/Makefile.in (revision 8989) +++ trunk/src/Makefile.in (revision 8990) @@ -69,6 +69,7 @@ hid_init.o hid_nogui.o ht_element.o + ht_subc.o insert.o intersect.o layer.o @@ -103,6 +104,8 @@ obj_poly_list.o obj_rat.o obj_rat_list.o + obj_subc.o + obj_subc_list.o obj_text.o obj_text_list.o paths.o Index: trunk/src/global_typedefs.h =================================================================== --- trunk/src/global_typedefs.h (revision 8989) +++ trunk/src/global_typedefs.h (revision 8990) @@ -46,6 +46,7 @@ typedef struct pcb_rtree_s pcb_rtree_t; typedef struct pcb_ratspatch_line_s pcb_ratspatch_line_t; typedef struct pcb_element_s pcb_element_t; +typedef struct pcb_subc_s pcb_subc_t; typedef struct pcb_text_s pcb_text_t; typedef struct pcb_plug_io_s pcb_plug_io_t; Index: trunk/src/ht_subc.c =================================================================== --- trunk/src/ht_subc.c (nonexistent) +++ trunk/src/ht_subc.c (revision 8990) @@ -0,0 +1,9 @@ +#include +#include "config.h" +#include "obj_subc_list.h" + +#define HT(x) htscp_ ## x +#include +#undef HT + + Index: trunk/src/ht_subc.h =================================================================== --- trunk/src/ht_subc.h (nonexistent) +++ trunk/src/ht_subc.h (revision 8990) @@ -0,0 +1,13 @@ +#ifndef PCB_HT_SUBC_H +#define PCB_HT_SUBC_H + +/* Hash: subcircuit -> pointer */ + +/* hash instance */ +typedef const pcb_subc_t *htscp_key_t; +typedef int htscp_value_t; +#define HT(x) htscp_ ## x +#include +#undef HT + +#endif Index: trunk/src/obj_subc_list.c =================================================================== --- trunk/src/obj_subc_list.c (nonexistent) +++ trunk/src/obj_subc_list.c (revision 8990) @@ -0,0 +1,32 @@ +/* + * COPYRIGHT + * + * pcb-rnd, interactive printed circuit board design + * Copyright (C) 2017 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + + + +#include "config.h" + +/* include other lists before TDL_DONT_UNDEF makes them pollute the namespace */ +#include "obj_subc.h" + +#define TDL_DONT_UNDEF +#include "obj_subc_list.h" +#include Index: trunk/src/obj_subc_list.h =================================================================== --- trunk/src/obj_subc_list.h (nonexistent) +++ trunk/src/obj_subc_list.h (revision 8990) @@ -0,0 +1,81 @@ +/* + * COPYRIGHT + * + * pcb-rnd, interactive printed circuit board design + * Copyright (C) 2017 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef PCB_OBJ_SUBC_LIST_H +#define PCB_OBJ_SUBC_LIST_H + +#include "obj_subc.h" + +/* List of Elements */ +#define TDL(x) pcb_subclist_ ## x +#define TDL_LIST_T pcb_subclist_t +#define TDL_ITEM_T pcb_subc_t +#define TDL_FIELD link +#define TDL_SIZE_T size_t +#define TDL_FUNC + +#define subclist_foreach(list, iterator, loop_elem) \ + gdl_foreach_((&((list)->lst)), (iterator), (loop_elem)) + +#include "ht_subc.h" +#include + +/* Calculate a hash value using the content of the subc. The hash value + represents the actual content of an subc */ +unsigned int pcb_subc_hash(const pcb_subc_t *e); + +/* Compare two subcs and return 1 if they contain the same objects. */ +int pcb_subc_eq(const pcb_subc_t *e1, const pcb_subc_t *e2); + +/* Create a new local variable to be used for deduplication */ +#define pcb_subclist_dedup_initializer(state) htep_t *state = NULL; + +/* Do a "continue" if an subc matching loop_elem has been seen already; + Typically this is invoked as the first statement of an subclist_foreach() + loop. */ +#define pcb_subclist_dedup_skip(state, loop_elem) \ +switch(1) { \ + case 1: { \ + if (state == NULL) \ + state = htep_alloc(pcb_subc_hash, pcb_subc_eq); \ + if (htep_has(state, loop_elem)) \ + continue; \ + htep_set(state, loop_elem, 1); \ + } \ +} + +/* use this after the loop to free all memory used by state */ +#define pcb_subclist_dedup_free(state) \ + do { \ + if (state != NULL) { \ + htep_free(state); \ + state = NULL; \ + } \ + } while(0) + + +#ifndef LIST_SUBCENT_NOINSTANT +#include +#include +#endif + +#endif