# HG changeset patch # User Mychaela Falconia # Date 1454275928 0 # Node ID 2b71943a311bbc66283877e21befdf27ed4f8c34 # Parent 6a1197106b6ff4f21f7f098a550ee8f9eda9be97 pads2gpcb: PART section parsing implemented, compiles diff -r 6a1197106b6f -r 2b71943a311b pads2gpcb/Makefile --- a/pads2gpcb/Makefile Sun Jan 31 07:37:09 2016 +0000 +++ b/pads2gpcb/Makefile Sun Jan 31 21:32:08 2016 +0000 @@ -1,7 +1,7 @@ CC= gcc CFLAGS= -O2 -OBJS= decals.o globals.o gpcbout.o main.o parttype.o rdunits.o readpads.o \ - silkselect.o util.o writeelem.o +OBJS= decals.o globals.o gpcbout.o main.o partinst.o parttype.o rdunits.o \ + readpads.o silkselect.o util.o writeelem.o HDRS= globals.h gpcbout.h struct.h PROG= pads2gpcb BINDIR= /usr/local/bin diff -r 6a1197106b6f -r 2b71943a311b pads2gpcb/globals.c --- a/pads2gpcb/globals.c Sun Jan 31 07:37:09 2016 +0000 +++ b/pads2gpcb/globals.c Sun Jan 31 21:32:08 2016 +0000 @@ -1,5 +1,6 @@ int input_units_global, input_units_current; struct part_decal *part_decal_list; struct part_type *part_type_list; +struct part_instance *part_inst_list; int do_footprint_silk; int write_decal_files, write_parttype_files, write_final_elements; diff -r 6a1197106b6f -r 2b71943a311b pads2gpcb/globals.h --- a/pads2gpcb/globals.h Sun Jan 31 07:37:09 2016 +0000 +++ b/pads2gpcb/globals.h Sun Jan 31 21:32:08 2016 +0000 @@ -2,6 +2,7 @@ extern int input_units_global, input_units_current; extern struct part_decal *part_decal_list; extern struct part_type *part_type_list; +extern struct part_instance *part_inst_list; extern int do_footprint_silk; extern int write_decal_files, write_parttype_files, write_final_elements; diff -r 6a1197106b6f -r 2b71943a311b pads2gpcb/main.c --- a/pads2gpcb/main.c Sun Jan 31 07:37:09 2016 +0000 +++ b/pads2gpcb/main.c Sun Jan 31 21:32:08 2016 +0000 @@ -103,12 +103,10 @@ process_parttype_section(); goto loop; } -#if 0 if (!strcmp(input_line_starkw, "PART")) { process_part_section(); goto loop; } -#endif } exit(0); } diff -r 6a1197106b6f -r 2b71943a311b pads2gpcb/partinst.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pads2gpcb/partinst.c Sun Jan 31 21:32:08 2016 +0000 @@ -0,0 +1,164 @@ +#include +#include +#include +#include +#include +#include "globals.h" +#include "struct.h" + +extern struct part_type *find_parttype_by_name(); +extern struct part_decal *find_decal_by_name(); +extern long convert_input_dim(); + +static struct part_instance *our_part; + +static void +enter_part_inst() +{ + struct part_instance *p, **pp; + char *name = input_line_fields[0]; + + for (pp = &part_inst_list; p = *pp; pp = &p->next) + if (!strcmp(p->name, name)) { + fprintf(stderr, + "%s line %d: part instance \"%s\" already defined\n", + input_filename, input_lineno, name); + exit(1); + } + p = malloc(sizeof(struct part_instance) + strlen(name) + 1); + if (!p) { + perror("malloc of struct part_instance"); + exit(1); + } + bzero(p, sizeof(struct part_instance)); + p->name = (char *)(p + 1); + strcpy(p->name, name); + *pp = p; + our_part = p; +} + +static void +select_decal_by_name(decalname) + char *decalname; +{ + our_part->decal = find_decal_by_name(decalname); + if (!our_part->decal) { + fprintf(stderr, + "%s line %d: part instantiation refers to unknown decal name \"%s\"\n", + input_filename, input_lineno, decalname); + exit(1); + } +} + +static void +select_decal_by_number() +{ + char *strnum = input_line_fields[7]; + int num = atoi(strnum); + + if (num < 0 || num >= our_part->type->ndecals) { + fprintf(stderr, + "%s line %d: invalid decal number \"%s\" in PART line\n", + input_filename, input_lineno, strnum); + exit(1); + } + our_part->decal = our_part->type->decals[num]; +} + +static void +find_type_and_decal() +{ + char *typename = input_line_fields[1]; + char *decalname; + + decalname = index(typename, '@'); + if (decalname) + *decalname++; + our_part->type = find_parttype_by_name(typename); + if (!our_part->type) { + fprintf(stderr, + "%s line %d: part instantiation refers to unknown part type \"%s\"\n", + input_filename, input_lineno, typename); + exit(1); + } + if (decalname) + select_decal_by_name(decalname); + else + select_decal_by_number(); +} + +static void +one_attr_label() +{ + int i; + + /* just skip it for now */ + for (i = 0; i < 3; i++) { + if (!get_input_line()) { + fprintf(stderr, + "error: EOF when expecting a part label line\n"); + exit(1); + } + } +} + +static void +read_one_part() +{ + int num_attr_labels, i; + + if (input_line_nfields < 8 || input_line_nfields > 12) { + fprintf(stderr, + "%s line %d: expected beginning of part instance, wrong # of fields\n", + input_filename, input_lineno); + exit(1); + } + enter_part_inst(); + printf("Processing part instance %s\n", our_part->name); + find_type_and_decal(); + our_part->mark_x = convert_input_dim(input_line_fields[2]); + our_part->mark_y = -convert_input_dim(input_line_fields[3]); + our_part->ori = parse_input_angle_90s(input_line_fields[4]); + if (!strcmp(input_line_fields[6], "N")) + our_part->onbottom = 0; + else if (!strcmp(input_line_fields[6], "M")) + our_part->onbottom = 1; + else { + fprintf(stderr, "%s line %d: expected 'N' or 'M' in field 6\n", + input_filename, input_lineno); + exit(1); + } + if (input_line_nfields > 11) + num_attr_labels = atoi(input_line_fields[11]); + else + num_attr_labels = 0; + for (i = 0; i < num_attr_labels; i++) + one_attr_label(); +} + +static void +process_one_part() +{ + read_one_part(); +} + +process_part_section() +{ + input_units_current = input_units_global; + for (;;) { + if (!get_input_line()) { + fprintf(stderr, "error: EOF in PART section\n"); + exit(1); + } + if (input_line_buf[0] == '*') { + parse_starline(); + if (strcmp(input_line_starkw, "REMARK")) + break; + else + continue; + } + parse_input_line_fields(); + if (input_line_nfields) + process_one_part(); + } +} diff -r 6a1197106b6f -r 2b71943a311b pads2gpcb/parttype.c --- a/pads2gpcb/parttype.c Sun Jan 31 07:37:09 2016 +0000 +++ b/pads2gpcb/parttype.c Sun Jan 31 21:32:08 2016 +0000 @@ -186,3 +186,15 @@ process_one_parttype(); } } + +struct part_type * +find_parttype_by_name(name) + char *name; +{ + struct part_type *p; + + for (p = part_type_list; p; p = p->next) + if (!strcmp(p->name, name)) + break; + return(p); +} diff -r 6a1197106b6f -r 2b71943a311b pads2gpcb/struct.h --- a/pads2gpcb/struct.h Sun Jan 31 07:37:09 2016 +0000 +++ b/pads2gpcb/struct.h Sun Jan 31 21:32:08 2016 +0000 @@ -70,3 +70,16 @@ char **alpha_pins; struct part_type *next; }; + +struct part_instance { + char *name; + char *newname; + struct part_type *type; + struct part_decal *decal; + long mark_x; + long mark_y; + int ori; + int onbottom; + struct footprint_body *body; + struct part_instance *next; +};