FreeCalypso > hg > ueda-linux
diff pads2gpcb/decals.c @ 40:1c37bec20596
pads2gpcb: slowly working on the decal processing logic
author | Mychaela Falconia <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 11 Jan 2016 08:12:40 +0000 |
parents | |
children | a2d304ec3817 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pads2gpcb/decals.c Mon Jan 11 08:12:40 2016 +0000 @@ -0,0 +1,220 @@ +#include <stdio.h> +#include <stdlib.h> +#include <ctype.h> +#include <string.h> +#include <strings.h> +#include "globals.h" +#include "struct.h" + +extern long convert_input_dim(); + +static struct part_decal *current_decal; +static struct footprint_body fpbody; +static struct footprint_pad *pins_array; +static int num_drawing_pieces, num_padstack_defs; +static int num_text_items, num_attr_labels; + +static void +enter_decal() +{ + struct part_decal *p, **pp; + char *name = input_line_fields[0]; + + for (pp = &part_decal_list; p = *pp; pp = &p->next) + if (!strcmp(p->name, name)) { + fprintf(stderr, + "%s line %d: decal name \"%s\" already defined\n", + input_filename, input_lineno, name); + exit(1); + } + p = malloc(sizeof(struct part_decal) + strlen(name) + 1); + if (!p) { + perror("malloc of struct part_decal"); + exit(1); + } + p->name = (char *)(p + 1); + strcpy(p->name, name); + p->body = 0; + p->next = 0; + **pp = p; + current_decal = p; +} + +static void +get_line_internal() +{ + if (!get_input_line()) { + fprintf(stderr, + "error: EOF in the middle of a part decal definition\n"); + exit(1); + } +} + +static void +one_drawing_piece() +{ + int ncoord, i; + + /* just skip it for now */ + get_line_internal(); + parse_input_line_fields(); + if (input_line_nfields < 2) { + fprintf(stderr, + "%s line %d: expected piece header line giving # of coords\n", + input_filename, input_lineno); + exit(1); + } + ncoord = atoi(input_line_fields[1]); + for (i = 0; i < ncoord; i++) + get_line_internal(); +} + +static void +one_text_item() +{ + /* just skip it for now */ + get_line_internal(); + get_line_internal(); + get_line_internal(); +} + +static void +one_attr_label() +{ + /* just skip it for now */ + get_line_internal(); + get_line_internal(); + get_line_internal(); +} + +static void +read_pindef_line(idx) +{ + get_line_internal(); + if (input_line_buf[0] != 'T') { + fprintf(stderr, "%s line %d: 'T' line expected\n", + input_filename, input_lineno); + exit(1); + } + parse_input_line_fields(); + if (input_line_nfields != 5) { + fprintf(stderr, "%s line %d: expected 5 fields in 'T' line\n", + input_filename, input_lineno); + exit(1); + } + input_line_fields[0]++; + + if (atoi(input_line_fields[4]) != i + 1) { + fprintf(stderr, + "%s line %d: expected %d in the pin number field\n", + input_filename, input_lineno); + exit(1); + } + pins_array[i].x1 = convert_input_dim(input_line_fields[0]); + pins_array[i].y1 = -convert_input_dim(input_line_fields[1]); +} + +static void +one_padstack_def() +{ + + +} + +static void +process_one_decal() +{ + int i; + + if (input_line_nfields < 7 || input_line_nfields > 9) { + fprintf(stderr, +"%s line %d: expected beginning of part decal definition, wrong # of fields\n", + input_filename, input_lineno); + exit(1); + } + enter_decal(); + bzero(&fpbody, sizeof fpbody); + if (input_line_fields[1][0] != 'I' && input_line_fields[1][0] != 'M' + || input_line_fields[1][1]) { + fprintf(stderr, "%s line %d: expected 'I' or 'M' in field 1\n", + input_filename, input_lineno); + exit(1); + } + fpbody.src_units = input_line_fields[1][0]; + if (input_units_global == 'B') + input_units_current = 'B'; + else + input_units_current = fpbody.src_units; + fpbody.mark_x = convert_input_dim(input_line_fields[2]); + fpbody.mark_y = -convert_input_dim(input_line_fields[3]); + num_drawing_pieces = atoi(input_line_fields[4]); + fpbody.npins = atoi(input_line_fields[5]); + num_padstack_defs = atoi(input_line_fields[6]); + if (input_line_nfields > 7) + num_text_items = atoi(input_line_fields[7]); + else + num_text_items = 0; + if (input_line_nfields > 8) + num_attr_labels = atoi(input_line_fields[8]); + else + num_attr_labels = 0; + + /* sanity checks */ + if (fpbody.npins < 1) { + fprintf(stderr, "%s line %d: # of terminals %d < 1\n", + input_filename, input_lineno, fpbody.npins); + exit(1); + } + if (num_padstack_defs < 1) { + fprintf(stderr, "%s line %d: # of pad stack defs %d < 1\n", + input_filename, input_lineno, num_padstack_defs); + exit(1); + } + + /* done parsing the header line, initialize some misc */ + fpbody.refdes_scale = 100; + + /* read and process the miscellany */ + for (i = 0; i < num_drawing_pieces; i++) + one_drawing_piece(); + for (i = 0; i < num_text_items; i++) + one_text_item(); + for (i = 0; i < num_attr_labels; i++) + one_attr_label(); + + /* the meat: allocate and fill the pins array */ + pins_array = malloc(sizeof(struct footprint_pad) * fpbody.npins); + if (!pins_array) { + perror("malloc of the pins array"); + exit(1); + } + fpbody.pins = pins_array; + bzero(pins_array, sizeof(struct footprint_pad) * fpbody.npins); + for (i = 0; i < fpbody.npins; i++) + read_pindef_line(i); + /* read and process the pad stack definitions */ + for (i = 0; i < num_padstack_defs; i++) + one_padstack_def(); + + +} + +process_partdecal_section() +{ + for (;;) { + if (!get_input_line()) { + fprintf(stderr, "error: EOF in PARTDECAL 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_decal(); + } +}