Index: trunk/src/flag_str.c =================================================================== --- trunk/src/flag_str.c (revision 16463) +++ trunk/src/flag_str.c (revision 16464) @@ -60,34 +60,34 @@ #define N(x) x, sizeof(x)-1 #define FN(x) x, #x pcb_flag_bits_t pcb_object_flagbits[] = { - {FN(PCB_FLAG_PIN), N("pin"), PCB_OBJ_ANY, "If set, this object is a pin. This flag is for internal use only." }, - {FN(PCB_FLAG_VIA), N("via"), PCB_OBJ_ANY, "If set, this object is a via. This flag is for internal use only." }, - {FN(PCB_FLAG_FOUND), N("found"), PCB_OBJ_ANY, "If set, this object has been found by FindConnection()" }, - {FN(PCB_FLAG_HOLE), N("hole"), PCB_OBJ_CLASS_PIN, "For pins and vias, this flag means that the pin or via is a hole without a copper annulus." }, - {FN(PCB_FLAG_RAT), N("rat"), PCB_OBJ_RAT, "If set for a line, indicates that this line is a rat line instead of a copper trace." }, - {FN(PCB_FLAG_PININPOLY), N("pininpoly"), 0, "For pins and pads, this flag is used internally to indicate that the pin or pad overlaps a polygon on some layer." }, - {FN(PCB_FLAG_CLEARPOLY), N("clearpoly"), PCB_OBJ_POLY, "For polygons, this flag means that pins and vias will normally clear these polygons (thus, thermals are required for electrical connection). When clear, polygons will solidly connect to pins and vias. " }, - {FN(PCB_FLAG_HIDENAME), N("hidename"), 0, "For elements, when set the name of the element is hidden." }, - {FN(PCB_FLAG_DISPLAYNAME), N("showname"), 0, "OBSOLETE: For elements, when set the names of pins are shown." }, - {FN(PCB_FLAG_CLEARLINE), N("clearline"), PCB_OBJ_LINE | PCB_OBJ_ARC | PCB_OBJ_TEXT | PCB_OBJ_PSTK, "For lines and arcs, the line/arc will clear polygons instead of connecting to them." }, - {FN(PCB_FLAG_SELECTED), N("selected"), PCB_OBJ_ANY, "Set when the object is selected."}, - {FN(PCB_FLAG_ONSOLDER), N("onsolder"), PCB_OBJ_TEXT, "For text, indicates that it is on the solder side."}, - {FN(PCB_FLAG_AUTO), N("auto"), PCB_OBJ_ANY, "For lines and vias, indicates that these were created by the autorouter."}, - {FN(PCB_FLAG_SQUARE), N("square"), 0, "For pins and pads, indicates a square (vs round) pin/pad."}, - {FN(PCB_FLAG_RUBBEREND), N("rubberend"), PCB_OBJ_LINE | PCB_OBJ_ARC, "For lines, used internally for rubber band moves: indicates one end already rubber banding."}, - {FN(PCB_FLAG_WARN), N("warn"), PCB_OBJ_CLASS_PIN, "For pins, vias, and pads, set to indicate a warning."}, - {FN(PCB_FLAG_USETHERMAL), N("usetherm"), PCB_OBJ_CLASS_PIN | PCB_OBJ_LINE | PCB_OBJ_ARC, "Obsolete, indicates that pins/vias should be drawn with thermal fingers."}, - {FN(PCB_FLAG_OCTAGON), N("octagon"), 0, "Draw pins and vias as octagons." }, - {FN(PCB_FLAG_DRC), N("drc"), PCB_OBJ_ANY, "Set for objects that fail DRC: flag like FOUND flag for DRC checking."}, - {FN(PCB_FLAG_LOCK), N("lock"), PCB_OBJ_ANY, "Set for locked objects."}, - {FN(PCB_FLAG_EDGE2), N("edge2"), PCB_OBJ_ANY, "For pads, indicates that the second point is closer to the edge. For pins, indicates that the pin is closer to a horizontal edge and thus pinout text should be vertical. (Padr.Point2 is closer to outside edge also pinout text for pins is vertical)" }, - {FN(PCB_FLAG_FULLPOLY), N("fullpoly"), PCB_OBJ_POLY, "For polygons, the full polygon is drawn (i.e. all parts instead of only the biggest one)." }, - {FN(PCB_FLAG_NOPASTE), N("nopaste"), 0, "Pad should not receive solderpaste. This is to support fiducials" }, - {FN(PCB_FLAG_NONETLIST), N("nonetlist"), PCB_OBJ_ANY, "subcircuit is not on the netlist and should not interfere with the netlist "}, - {FN(PCB_FLAG_TERMNAME), N("termname"), PCB_OBJ_LINE | PCB_OBJ_ARC | PCB_OBJ_POLY | PCB_OBJ_TEXT | PCB_OBJ_PSTK | PCB_OBJ_SUBC, "when set the names of pins are shown."}, - {FN(PCB_FLAG_CLEARPOLYPOLY), N("clearpolypoly"), PCB_OBJ_POLY, "For polygons, apply clearance to nearby polygons" }, - {FN(PCB_FLAG_DYNTEXT), N("dyntext"), PCB_OBJ_TEXT, "For text: dynamic string (substitute %patterns%)"}, - {FN(PCB_FLAG_FLOATER), N("floater"), PCB_OBJ_ANY, "subc part can be moved after subc placing"} + {FN(PCB_FLAG_PIN), N("pin"), PCB_OBJ_ANY, "If set, this object is a pin. This flag is for internal use only.", 0}, + {FN(PCB_FLAG_VIA), N("via"), PCB_OBJ_ANY, "If set, this object is a via. This flag is for internal use only.", 0}, + {FN(PCB_FLAG_FOUND), N("found"), PCB_OBJ_ANY, "If set, this object has been found by FindConnection()", 0}, + {FN(PCB_FLAG_HOLE), N("hole"), PCB_OBJ_CLASS_PIN, "For pins and vias, this flag means that the pin or via is a hole without a copper annulus.", 0}, + {FN(PCB_FLAG_RAT), N("rat"), PCB_OBJ_RAT, "If set for a line, indicates that this line is a rat line instead of a copper trace.", 0}, + {FN(PCB_FLAG_PININPOLY), N("pininpoly"), 0, "For pins and pads, this flag is used internally to indicate that the pin or pad overlaps a polygon on some layer.", 0}, + {FN(PCB_FLAG_CLEARPOLY), N("clearpoly"), PCB_OBJ_POLY, "For polygons, this flag means that pins and vias will normally clear these polygons (thus, thermals are required for electrical connection). When clear, polygons will solidly connect to pins and vias. ", 0}, + {FN(PCB_FLAG_HIDENAME), N("hidename"), 0, "For elements, when set the name of the element is hidden.", 0}, + {FN(PCB_FLAG_DISPLAYNAME), N("showname"), 0, "OBSOLETE: For elements, when set the names of pins are shown.", 0}, + {FN(PCB_FLAG_CLEARLINE), N("clearline"), PCB_OBJ_LINE | PCB_OBJ_ARC | PCB_OBJ_TEXT | PCB_OBJ_PSTK, "For lines and arcs, the line/arc will clear polygons instead of connecting to them.", 0 }, + {FN(PCB_FLAG_SELECTED), N("selected"), PCB_OBJ_ANY, "Set when the object is selected.", 0}, + {FN(PCB_FLAG_ONSOLDER), N("onsolder"), PCB_OBJ_TEXT, "For text, indicates that it is on the solder side.", 0}, + {FN(PCB_FLAG_AUTO), N("auto"), PCB_OBJ_ANY, "For lines and vias, indicates that these were created by the autorouter.", 0}, + {FN(PCB_FLAG_SQUARE), N("square"), 0, "For pins and pads, indicates a square (vs round) pin/pad.", PCB_OBJ_PSTK}, + {FN(PCB_FLAG_RUBBEREND), N("rubberend"), PCB_OBJ_LINE | PCB_OBJ_ARC, "For lines, used internally for rubber band moves: indicates one end already rubber banding.", 0}, + {FN(PCB_FLAG_WARN), N("warn"), PCB_OBJ_CLASS_PIN, "For pins, vias, and pads, set to indicate a warning.", 0}, + {FN(PCB_FLAG_USETHERMAL), N("usetherm"), PCB_OBJ_CLASS_PIN | PCB_OBJ_LINE | PCB_OBJ_ARC, "Obsolete, indicates that pins/vias should be drawn with thermal fingers.", 0}, + {FN(PCB_FLAG_OCTAGON), N("octagon"), 0, "Draw pins and vias as octagons.", 0}, + {FN(PCB_FLAG_DRC), N("drc"), PCB_OBJ_ANY, "Set for objects that fail DRC: flag like FOUND flag for DRC checking.", 0}, + {FN(PCB_FLAG_LOCK), N("lock"), PCB_OBJ_ANY, "Set for locked objects.", 0}, + {FN(PCB_FLAG_EDGE2), N("edge2"), PCB_OBJ_ANY, "For pads, indicates that the second point is closer to the edge. For pins, indicates that the pin is closer to a horizontal edge and thus pinout text should be vertical. (Padr.Point2 is closer to outside edge also pinout text for pins is vertical)", 0}, + {FN(PCB_FLAG_FULLPOLY), N("fullpoly"), PCB_OBJ_POLY, "For polygons, the full polygon is drawn (i.e. all parts instead of only the biggest one).", 0}, + {FN(PCB_FLAG_NOPASTE), N("nopaste"), 0, "Pad should not receive solderpaste. This is to support fiducials", 0}, + {FN(PCB_FLAG_NONETLIST), N("nonetlist"), PCB_OBJ_ANY, "subcircuit is not on the netlist and should not interfere with the netlist ", 0}, + {FN(PCB_FLAG_TERMNAME), N("termname"), PCB_OBJ_LINE | PCB_OBJ_ARC | PCB_OBJ_POLY | PCB_OBJ_TEXT | PCB_OBJ_PSTK | PCB_OBJ_SUBC, "when set the names of pins are shown.", 0}, + {FN(PCB_FLAG_CLEARPOLYPOLY), N("clearpolypoly"), PCB_OBJ_POLY, "For polygons, apply clearance to nearby polygons", 0}, + {FN(PCB_FLAG_DYNTEXT), N("dyntext"), PCB_OBJ_TEXT, "For text: dynamic string (substitute %patterns%)", 0}, + {FN(PCB_FLAG_FLOATER), N("floater"), PCB_OBJ_ANY, "subc part can be moved after subc placing", 0} }; #undef N #undef FN @@ -331,7 +331,7 @@ static pcb_flag_t empty_flags; -pcb_flag_t pcb_strflg_common_s2f(const char *flagstring, int (*error) (const char *msg), pcb_flag_bits_t * flagbits, int n_flagbits, unsigned char *intconn) +pcb_flag_t pcb_strflg_common_s2f(const char *flagstring, int (*error) (const char *msg), pcb_flag_bits_t * flagbits, int n_flagbits, unsigned char *intconn, int compat) { const char *fp, *ep; int flen; @@ -421,9 +421,9 @@ return rv.Flags; } -pcb_flag_t pcb_strflg_s2f(const char *flagstring, int (*error) (const char *msg), unsigned char *intconn) +pcb_flag_t pcb_strflg_s2f(const char *flagstring, int (*error) (const char *msg), unsigned char *intconn, int compat) { - return pcb_strflg_common_s2f(flagstring, error, pcb_object_flagbits, PCB_ENTRIES(pcb_object_flagbits), intconn); + return pcb_strflg_common_s2f(flagstring, error, pcb_object_flagbits, PCB_ENTRIES(pcb_object_flagbits), intconn, compat); } @@ -436,7 +436,7 @@ * will be automatically set by parsing, so it won't (for example in * the old data model) include the "via" flag for PCB_OBJ_VIAs because * it knows those get forcibly set when vias are parsed. */ -char *pcb_strflg_common_f2s(pcb_flag_t flags, int object_type, pcb_flag_bits_t * flagbits, int n_flagbits, unsigned char *intconn) +char *pcb_strflg_common_f2s(pcb_flag_t flags, int object_type, pcb_flag_bits_t * flagbits, int n_flagbits, unsigned char *intconn, int compat) { int len; int i; @@ -458,14 +458,13 @@ len = 3; /* for "()\0" */ - for (i = 0; i < n_flagbits; i++) - - if ((flagbits[i].object_types & object_type) - && (PCB_FLAG_TEST(flagbits[i].mask, &fh))) { - + for (i = 0; i < n_flagbits; i++) { + long my_obj_typs = flagbits[i].object_types | (compat ? flagbits[i].compat_types : 0); + if ((my_obj_typs & object_type) && (PCB_FLAG_TEST(flagbits[i].mask, &fh))) { len += flagbits[i].nlen + 1; PCB_FLAG_CLEAR(flagbits[i].mask, &fh); } + } if (PCB_FLAG_THERM_TEST_ANY(&fh)) { len += sizeof("thermal()"); @@ -496,8 +495,9 @@ *bp++ = '"'; fh = savef; - for (i = 0; i < n_flagbits; i++) - if (flagbits[i].object_types & object_type && (PCB_FLAG_TEST(flagbits[i].mask, &fh))) { + for (i = 0; i < n_flagbits; i++) { + long my_obj_typs = flagbits[i].object_types | (compat ? flagbits[i].compat_types : 0); + if ((my_obj_typs & object_type) && (PCB_FLAG_TEST(flagbits[i].mask, &fh))) { if (bp != buf + 1) *bp++ = ','; strcpy(bp, flagbits[i].name); @@ -504,6 +504,7 @@ bp += flagbits[i].nlen; PCB_FLAG_CLEAR(flagbits[i].mask, &fh); } + } if (PCB_FLAG_THERM_TEST_ANY(&fh)) { if (bp != buf + 1) @@ -544,9 +545,9 @@ return buf; } -char *pcb_strflg_f2s(pcb_flag_t flags, int object_type, unsigned char *intconn) +char *pcb_strflg_f2s(pcb_flag_t flags, int object_type, unsigned char *intconn, int compat) { - return pcb_strflg_common_f2s(flags, object_type, pcb_object_flagbits, PCB_ENTRIES(pcb_object_flagbits), intconn); + return pcb_strflg_common_f2s(flags, object_type, pcb_object_flagbits, PCB_ENTRIES(pcb_object_flagbits), intconn, compat); } @@ -582,10 +583,10 @@ char *pcb_strflg_board_f2s(pcb_flag_t flags) { - return pcb_strflg_common_f2s(flags, PCB_OBJ_ANY, pcb_flagbits, PCB_ENTRIES(pcb_flagbits), NULL); + return pcb_strflg_common_f2s(flags, PCB_OBJ_ANY, pcb_flagbits, PCB_ENTRIES(pcb_flagbits), NULL, 0); } pcb_flag_t pcb_strflg_board_s2f(const char *flagstring, int (*error) (const char *msg)) { - return pcb_strflg_common_s2f(flagstring, error, pcb_flagbits, PCB_ENTRIES(pcb_flagbits), NULL); + return pcb_strflg_common_s2f(flagstring, error, pcb_flagbits, PCB_ENTRIES(pcb_flagbits), NULL, 0); } Index: trunk/src/flag_str.h =================================================================== --- trunk/src/flag_str.h (revision 16463) +++ trunk/src/flag_str.h (revision 16464) @@ -46,11 +46,14 @@ const char *name; int nlen; - /* If set, this entry won't be output unless the object type is one - of these. */ + /* The entry won't be output unless the object type is one of these. */ int object_types; char *help; + + /* in compatibility mode also accept these object types to have the flag */ + int compat_types; + } pcb_flag_bits_t; /* All flags natively known by the core */ @@ -59,17 +62,19 @@ /* The purpose of this interface is to make the file format able to handle more than 32 flags, and to hide the internal details of - flags from the file format. */ + flags from the file format. In compat mode, compat_types are + also considered (so an old PCB PAD (padstack now) can have + a square flag). */ /* When passed a string, parse it and return an appropriate set of flags. Errors cause error() to be called with a suitable message; if error is NULL, errors are ignored. */ -pcb_flag_t pcb_strflg_s2f(const char *flagstring, int (*error) (const char *msg), unsigned char *intconn); +pcb_flag_t pcb_strflg_s2f(const char *flagstring, int (*error) (const char *msg), unsigned char *intconn, int compat); /* Given a set of flags for a given object type, return a string which can be output to a file. The returned pointer must not be freed. */ -char *pcb_strflg_f2s(pcb_flag_t flags, int object_type, unsigned char *intconn); +char *pcb_strflg_f2s(pcb_flag_t flags, int object_type, unsigned char *intconn, int compat); /* same as above, for pcb level flags */ char *pcb_strflg_board_f2s(pcb_flag_t flags); @@ -79,7 +84,7 @@ void pcb_strflg_uninit_layerlist(void); /* low level */ -pcb_flag_t pcb_strflg_common_s2f(const char *flagstring, int (*error) (const char *msg), pcb_flag_bits_t * flagbits, int n_flagbits, unsigned char *intconn); -char *pcb_strflg_common_f2s(pcb_flag_t flags, int object_type, pcb_flag_bits_t * flagbits, int n_flagbits, unsigned char *intconn); +pcb_flag_t pcb_strflg_common_s2f(const char *flagstring, int (*error) (const char *msg), pcb_flag_bits_t * flagbits, int n_flagbits, unsigned char *intconn, int compat); +char *pcb_strflg_common_f2s(pcb_flag_t flags, int object_type, pcb_flag_bits_t * flagbits, int n_flagbits, unsigned char *intconn, int compat); #endif Index: trunk/src/undo_old.c =================================================================== --- trunk/src/undo_old.c (revision 16463) +++ trunk/src/undo_old.c (revision 16464) @@ -371,7 +371,7 @@ return pcb_true; } pcb_message(PCB_MSG_ERROR, "hace Internal error: Can't find ID %d type %08x\n", Entry->ID, Entry->Kind); - pcb_message(PCB_MSG_ERROR, "for UndoFlag Operation. Previous flags: %s\n", pcb_strflg_f2s(Entry->Data.Flags, 0, NULL)); + pcb_message(PCB_MSG_ERROR, "for UndoFlag Operation. Previous flags: %s\n", pcb_strflg_f2s(Entry->Data.Flags, 0, NULL, 0)); return pcb_false; } Index: trunk/src_plugins/djopt/djopt.c =================================================================== --- trunk/src_plugins/djopt/djopt.c (revision 16463) +++ trunk/src_plugins/djopt/djopt.c (revision 16464) @@ -484,7 +484,7 @@ pcb_line_t *nl; dprintf ("New line \033[35m%#mD to %#mD from l%d t%#mS c%#mS f%s\033[0m\n", - s->x, s->y, e->x, e->y, layer, example->Thickness, example->Clearance, pcb_strflg_f2s(example->Flags, PCB_OBJ_LINE, NULL)); + s->x, s->y, e->x, e->y, layer, example->Thickness, example->Clearance, pcb_strflg_f2s(example->Flags, PCB_OBJ_LINE, NULL, 0)); nl = create_pcb_line(layer, s->x, s->y, e->x, e->y, example->Thickness, example->Clearance, example->Flags); if (!nl) @@ -2121,7 +2121,7 @@ c[ci]->lines[li]->s->x, c[ci]->lines[li]->s->y, c[ci]->lines[li]->e->x, c[ci]->lines[li]->e->y, c[ci]->lines[li]->line->Thickness, - c[ci]->lines[li]->line->Clearance, pcb_strflg_f2s(c[ci]->lines[li]->line->Flags, PCB_OBJ_LINE, NULL)); + c[ci]->lines[li]->line->Clearance, pcb_strflg_f2s(c[ci]->lines[li]->line->Flags, PCB_OBJ_LINE, NULL, 0)); /* Pads are disqualified, as we want to mimic a trace line. */ if (c[ci]->lines[li]->line == (pcb_line_t *) c[ci]->pad) { dprintf(" bad, pad\n"); Index: trunk/src_plugins/export_ipcd356/export_ipcd356.pup =================================================================== --- trunk/src_plugins/export_ipcd356/export_ipcd356.pup (revision 16463) +++ trunk/src_plugins/export_ipcd356/export_ipcd356.pup (revision 16464) @@ -5,5 +5,6 @@ $fmt-native no $fmt-feature-w export IPC-D-356 Netlist (for automated testing) $package export-extra +dep lib_compat_help default buildin autoload 1 Index: trunk/src_plugins/io_pcb/file.c =================================================================== --- trunk/src_plugins/io_pcb/file.c (revision 16463) +++ trunk/src_plugins/io_pcb/file.c (revision 16464) @@ -94,7 +94,7 @@ static char *pcb_strflg_f2s_compat(pcb_flag_t flags, int object_type, unsigned char *intconn) { flags.f &= ~IGNORE_FLAGS; - return pcb_strflg_f2s(flags, object_type, intconn); + return pcb_strflg_f2s(flags, object_type, intconn, 1); } @@ -362,7 +362,7 @@ pcb_fprintf(FP, "Via[%[0] %[0] %[0] %[0] %[0] %[0] ", x, y, pad_dia, clearance*2, mask, drill_dia); pcb_print_quoted_string(FP, (char *) PCB_EMPTY(name)); - fprintf(FP, " %s]\n", pcb_strflg_f2s(pcb_pstk_compat_pinvia_flag(ps, cshape), PCB_OBJ_VIA, NULL)); + fprintf(FP, " %s]\n", pcb_strflg_f2s(pcb_pstk_compat_pinvia_flag(ps, cshape), PCB_OBJ_VIA, NULL, 1)); } } @@ -461,7 +461,7 @@ pcb_print_quoted_string(FP, (char *)PCB_EMPTY(pcb_attribute_get(&ps->Attributes, "name"))); fprintf(FP, " "); pcb_print_quoted_string(FP, (char *) PCB_EMPTY(pcb_attribute_get(&ps->Attributes, "term"))); - fprintf(FP, " %s]\n", pcb_strflg_f2s(pcb_pstk_compat_pinvia_flag(ps, cshape), PCB_OBJ_PIN, &ic)); + fprintf(FP, " %s]\n", pcb_strflg_f2s(pcb_pstk_compat_pinvia_flag(ps, cshape), PCB_OBJ_PIN, &ic, 1)); } else if (pcb_pstk_export_compat_pad(ps, &x1, &y1, &x2, &y2, &thickness, &clearance, &mask, &square, &nopaste)) { unsigned long fl = (square ? PCB_FLAG_SQUARE : 0) | (nopaste ? PCB_FLAG_NOPASTE : 0); @@ -470,7 +470,7 @@ pcb_print_quoted_string(FP, (char *)PCB_EMPTY(pcb_attribute_get(&ps->Attributes, "name"))); fprintf(FP, " "); pcb_print_quoted_string(FP, (char *) PCB_EMPTY(pcb_attribute_get(&ps->Attributes, "term"))); - fprintf(FP, " %s]\n", pcb_strflg_f2s(pcb_flag_make(fl), PCB_OBJ_PAD, &ic)); + fprintf(FP, " %s]\n", pcb_strflg_f2s(pcb_flag_make(fl), PCB_OBJ_PAD, &ic, 1)); } else pcb_io_incompat_save(sc->data, (pcb_any_obj_t *)ps, "Padstack can not be exported as pin or pad", "use simpler padstack; for pins, all copper layers must have the same shape and there must be no paste; for pads, use a line or a rectangle; paste and mask must match the copper shape"); Index: trunk/src_plugins/io_pcb/parse_y.c =================================================================== --- trunk/src_plugins/io_pcb/parse_y.c (revision 16463) +++ trunk/src_plugins/io_pcb/parse_y.c (revision 16464) @@ -2802,7 +2802,7 @@ case 163: #line 1753 "parse_y.y" /* yacc.c:1646 */ - { (yyval.flagtype) = pcb_strflg_s2f((yyvsp[0].string), yyerror, &yy_intconn); free((yyvsp[0].string)); } + { (yyval.flagtype) = pcb_strflg_s2f((yyvsp[0].string), yyerror, &yy_intconn, 1); free((yyvsp[0].string)); } #line 2807 "parse_y.c" /* yacc.c:1646 */ break; Index: trunk/src_plugins/io_pcb/parse_y.y =================================================================== --- trunk/src_plugins/io_pcb/parse_y.y (revision 16463) +++ trunk/src_plugins/io_pcb/parse_y.y (revision 16464) @@ -1750,7 +1750,7 @@ ; flags : INTEGER { $$ = pcb_flag_old($1); } - | STRING { $$ = pcb_strflg_s2f($1, yyerror, &yy_intconn); free($1); } + | STRING { $$ = pcb_strflg_s2f($1, yyerror, &yy_intconn, 1); free($1); } ; symbols Index: trunk/src_plugins/report/report.c =================================================================== --- trunk/src_plugins/report/report.c (revision 16463) +++ trunk/src_plugins/report/report.c (revision 16464) @@ -178,7 +178,7 @@ gds_init(&tmp); pcb_append_printf(&tmp, "%m+PADSTACK ID# %ld; Flags:%s\n" - "(X,Y) = %$mD.\n", USER_UNITMASK, ps->ID, pcb_strflg_f2s(ps->Flags, PCB_OBJ_PSTK, NULL), + "(X,Y) = %$mD.\n", USER_UNITMASK, ps->ID, pcb_strflg_f2s(ps->Flags, PCB_OBJ_PSTK, NULL, 0), ps->x, ps->y); if ((proto != NULL) && (proto->hdia > 0)) @@ -209,7 +209,7 @@ "and has name \"%s\".\n" "%s" "%s%s", USER_UNITMASK, - line->ID, pcb_strflg_f2s(line->Flags, PCB_OBJ_LINE, NULL), + line->ID, pcb_strflg_f2s(line->Flags, PCB_OBJ_LINE, NULL, 0), line->Point1.X, line->Point1.Y, line->Point1.ID, line->Point2.X, line->Point2.Y, line->Point2.ID, line->Thickness, line->Clearance / 2, @@ -232,7 +232,7 @@ "connects to layer group #%d (%s).\n" "SecondPoint(X,Y) = %$mD; ID = %ld; " "connects to layer group #%d (%s).\n", - USER_UNITMASK, line->ID, pcb_strflg_f2s(line->Flags, PCB_OBJ_LINE, NULL), + USER_UNITMASK, line->ID, pcb_strflg_f2s(line->Flags, PCB_OBJ_LINE, NULL, 0), line->Point1.X, line->Point1.Y, line->Point1.ID, line->group1, grpname(line->group1), line->Point2.X, line->Point2.Y, line->Point2.ID, line->group2, grpname(line->group2)); break; @@ -260,7 +260,7 @@ "That makes the end points at %$mD and %$mD.\n" "It is on layer %d.\n" "%s" - "%s%s%s", USER_UNITMASK, Arc->ID, pcb_strflg_f2s(Arc->Flags, PCB_OBJ_ARC, NULL), + "%s%s%s", USER_UNITMASK, Arc->ID, pcb_strflg_f2s(Arc->Flags, PCB_OBJ_ARC, NULL, 0), Arc->X, Arc->Y, Arc->Thickness, Arc->Clearance / 2, Arc->Width, Arc->StartAngle, Arc->Delta, @@ -304,7 +304,7 @@ "Its unclipped area is %f square %s.\n" "%s" "%s%s%s", USER_UNITMASK, Polygon->ID, - pcb_strflg_f2s(Polygon->Flags, PCB_OBJ_POLY, NULL), + pcb_strflg_f2s(Polygon->Flags, PCB_OBJ_POLY, NULL, 0), Polygon->BoundingBox.X1, Polygon->BoundingBox.Y1, Polygon->BoundingBox.X2, Polygon->BoundingBox.Y2, Polygon->PointN, Polygon->PointMax - Polygon->PointN, @@ -328,7 +328,7 @@ "BoundingBox %$mD %$mD.\n" "Refdes \"%s\".\n" "%s", USER_UNITMASK, - subc->ID, pcb_strflg_f2s(subc->Flags, PCB_OBJ_SUBC, NULL), + subc->ID, pcb_strflg_f2s(subc->Flags, PCB_OBJ_SUBC, NULL, 0), subc->BoundingBox.X1, subc->BoundingBox.Y1, subc->BoundingBox.X2, subc->BoundingBox.Y2, PCB_EMPTY(subc->refdes),