FreeCalypso > hg > ueda-linux
view 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 source
#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(); } }