view pads2gpcb/main.c @ 145:5e91200bf609

netdiff: donl-pinreport utility written, compiles
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Nov 2020 01:17:10 +0000
parents be1fe110b6ab
children
line wrap: on
line source

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>
#include <strings.h>
#include "globals.h"

extern long cmdline_dim_arg();

static
parse_header_line()
{
	char *cp;

	if (strncmp(input_line_buf, "!PADS-POWERPCB-", 15))
		return(-1);
	cp = input_line_buf + 15;
	while (isalnum(*cp) || *cp == '.')
		cp++;
	if (*cp++ != '-')
		return(-1);
	if (!strncmp(cp, "BASIC", 5))
		input_units_global = 'B';
	else if (!strncmp(cp, "MILS", 4))
		input_units_global = 'I';
	else if (!strncmp(cp, "METRIC", 6))
		input_units_global = 'M';
	else
		return(-1);
	return(0);
}

main(argc, argv)
	char **argv;
{
	int c;
	char *main_output;
	extern int optind;
	extern char *optarg;

	while ((c = getopt(argc, argv, "c:fm:s:x:y:")) != EOF)
		switch (c) {
		case 'c':
			clearance_setting = cmdline_dim_arg(optarg);
			continue;
		case 'f':
			write_footprint_files = 1;
			continue;
		case 'm':
			soldermask_delta = cmdline_dim_arg(optarg);
			continue;
		case 's':
			do_footprint_silk = 1;
			select_drawlevel_for_silk(atoi(optarg));
			continue;
		case 'x':
			output_x_offset = cmdline_dim_arg(optarg);
			continue;
		case 'y':
			output_y_offset = cmdline_dim_arg(optarg);
			continue;
		default:
		usage:
			fprintf(stderr,
			"usage: %s [options] pads-file.asc [output.pcb]\n",
				argv[0]);
			exit(1);
		}
	if (argc < optind + 1 || argc > optind + 2)
		goto usage;
	input_filename = argv[optind];
	main_output = argv[optind+1];
	open_input_file();

	/* parse the header line with the units specification */
	if (!get_input_line()) {
invheader:	fprintf(stderr,
		"error: %s does not begin with a recognized header line\n",
			input_filename);
		exit(1);
	}
	if (parse_header_line() < 0)
		goto invheader;

	/* process the body of the monster! */
	while (get_input_line()) {
		if (input_line_buf[0] != '*')
			continue;
		parse_starline();
loop:		if (!strcmp(input_line_starkw, "PARTDECAL")) {
			process_partdecal_section();
			goto loop;
		}
		if (!strcmp(input_line_starkw, "PARTTYPE")) {
			process_parttype_section();
			goto loop;
		}
		if (!strcmp(input_line_starkw, "PART")) {
			process_part_section();
			goto loop;
		}
	}
	if (main_output)
		write_elements_pcb(main_output);
	exit(0);
}