Index: trunk/src/flag.c =================================================================== --- trunk/src/flag.c (revision 21749) +++ trunk/src/flag.c (revision 21750) @@ -26,6 +26,7 @@ * */ +#include #include #include #include "config.h" @@ -85,3 +86,32 @@ return (memcmp(f1->t, &f2->t, sizeof(f1->t)) == 0); } + +const char *pcb_dynflag_cookie[PCB_DYNFLAG_BLEN]; + +pcb_dynf_t pcb_dynflag_alloc(const char *cookie) +{ + pcb_dynf_t n; + for(n = 0; n < PCB_DYNFLAG_BLEN; n++) { + if (pcb_dynflag_cookie[n] == NULL) { + pcb_dynflag_cookie[n] = cookie; + return n; + } + } + return PCB_DYNF_INVALID; +} + +void pcb_dynflag_free(pcb_dynf_t dynf) +{ + if ((dynf >= 0) && (dynf < PCB_DYNFLAG_BLEN)) + pcb_dynflag_cookie[dynf] = NULL; +} + + +void pcb_dynflag_uninit(void) +{ + pcb_dynf_t n; + for(n = 0; n < PCB_DYNFLAG_BLEN; n++) + if (pcb_dynflag_cookie[n] != NULL) + fprintf(stderr, "pcb-rnd: Internal error: dynamic flag %d (%s) not unregistered\n", n, pcb_dynflag_cookie[n]); +} Index: trunk/src/flag.h =================================================================== --- trunk/src/flag.h (revision 21749) +++ trunk/src/flag.h (revision 21750) @@ -40,8 +40,13 @@ pcb_unknown_flag_t *next; }; +#define PCB_DYNFLAG_WORD unsigned long +#define PCB_DYNFLAG_WLEN ((PCB_DYNFLAG_BLEN-1) / sizeof(PCB_DYNFLAG_WORD)+1) +typedef PCB_DYNFLAG_WORD pcb_dynflag_t[PCB_DYNFLAG_WLEN]; + typedef struct { - unsigned long f; /* generic flags */ + unsigned long f; /* generic statically assigned flag bits */ + pcb_dynflag_t df; /* dynamically allocated flag bits */ unsigned char t[(PCB_MAX_LAYER + 1) / 2]; /* thermals */ unsigned char q; /* square geometry flag - need to keep only for .pcb compatibility */ pcb_unknown_flag_t *unknowns; @@ -155,6 +160,7 @@ } \ } while(0) +/* Ignores dynamic flags and thermals */ int pcb_flag_eq(pcb_flag_t *f1, pcb_flag_t *f2); #define PCB_FLAG_EQ(F1,F2) pcb_flag_eq(&(F1), &(F2)) @@ -175,4 +181,19 @@ int pcb_mem_any_set(unsigned char *arr, int arr_len); #define PCB_FLAG_THERM_TEST_ANY(P) pcb_mem_any_set((P)->Flags.t, sizeof((P)->Flags.t)) +/*** Dynamic flags ***/ +#define PCB_DFLAG_SET(flg, dynf) (flg)->df[(dynf) / sizeof(PCB_DYNFLAG_WORD)] |= (1 << (dynf) % sizeof(PCB_DYNFLAG_WORD)) +#define PCB_DFLAG_CLR(flg, dynf) (flg)->df[(dynf) / sizeof(PCB_DYNFLAG_WORD)] &= ~(1 << (dynf) % sizeof(PCB_DYNFLAG_WORD)) +#define PCB_DFLAG_TEST(flg, dynf, val) (!!((flg)->df[(dynf) / sizeof(PCB_DYNFLAG_WORD)] & (1 << (dynf) % sizeof(PCB_DYNFLAG_WORD)))) +#define PCB_DFLAG_PUT(flg, dynf, val) ((val) ? PCB_DFLAG_SET((flg), (dynf)) : PCB_DFLAG_CLR((flg), (dynf))) + +extern const char *pcb_dynflag_cookie[PCB_DYNFLAG_BLEN]; + +typedef int pcb_dynf_t; +#define PCB_DYNF_INVALID (-1) +pcb_dynf_t pcb_dynflag_alloc(const char *cookie); +void pcb_dynflag_free(pcb_dynf_t dynf); + +void pcb_dynflag_uninit(void); + #endif Index: trunk/src/globalconst.h =================================================================== --- trunk/src/globalconst.h (revision 21749) +++ trunk/src/globalconst.h (revision 21750) @@ -66,6 +66,10 @@ #endif #endif +/* number of dynamic flag bits that can be allocated at once; should be n*64 for + memory efficiency */ +#define PCB_DYNFLAG_BLEN 64 + #define PCB_MAX_LINE_POINT_DISTANCE 0 /* maximum distance when searching line points; same for arc point */ #define PCB_MAX_POLYGON_POINT_DISTANCE 0 /* maximum distance when searching polygon points */ #define PCB_MAX_NETLIST_LINE_LENGTH 255 /* maximum line length for netlist files */ Index: trunk/src/main.c =================================================================== --- trunk/src/main.c (revision 21749) +++ trunk/src/main.c (revision 21750) @@ -52,6 +52,7 @@ #include "polygon.h" #include "buildin.h" #include "build_run.h" +#include "flag.h" #include "flag_str.h" #include "plugins.h" #include "plug_footprint.h" @@ -282,6 +283,7 @@ pcb_actions_uninit(); pcb_uilayer_uninit(); pcb_cli_uninit(); + pcb_dynflag_uninit(); } static int arg_match(const char *in, const char *shrt, const char *lng)