diff pads2gpcb/rdunits.c @ 38:aa0539cc3d41

pads2gpcb project started, skeleton compiles
author Mychaela Falconia <falcon@ivan.Harhan.ORG>
date Mon, 11 Jan 2016 04:56:51 +0000
parents
children 43ba91b137e2
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pads2gpcb/rdunits.c	Mon Jan 11 04:56:51 2016 +0000
@@ -0,0 +1,102 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include "globals.h"
+
+long
+convert_input_dim(srcstr)
+	char *srcstr;
+{
+	long accum;
+	int sign = 1;
+	char *cp;
+	int maxdec, ndec;
+
+	cp = srcstr;
+	if (*cp == '-') {
+		cp++;
+		sign = -1;
+	}
+	if (!isdigit(*cp)) {
+inv:		fprintf(stderr, "%s line %d: invalid dimension \"%s\"\n",
+			input_filename, input_lineno, srcstr);
+		exit(1);
+	}
+	for (accum = 0; isdigit(*cp); ) {
+		accum *= 10;
+		accum += *cp++ - '0';
+	}
+	switch (input_units_current) {
+	case 'B':
+		maxdec = 0;
+		break;
+	case 'I':
+		maxdec = 2;
+		break;
+	case 'M':
+		maxdec = 6;
+		break;
+	}
+	if (*cp == '.') {
+		cp++;
+		for (ndec = 0; isdigit(*cp); ndec++) {
+			if (ndec >= maxdec) {
+				fprintf(stderr,
+		"%s line %d: dimension \"%s\": too many digits after '.'\n",
+					input_filename, input_lineno, srcstr);
+				exit(1);
+			}
+			accum *= 10;
+			accum += *cp++ - '0';
+		}
+	} else
+		ndec = 0;
+	if (*cp)
+		goto inv;
+	while (ndec < maxdec) {
+		accum *= 10;
+		ndec++;
+	}
+	switch (input_units_current) {
+	case 'B':
+		if (accum % 3) {
+			fprintf(stderr,
+		"%s line %d: basic units dimension \"%s\" not divisible by 3\n",
+				input_filename, input_lineno, srcstr);
+			exit(1);
+		}
+		accum /= 3;
+		accum *= 2;
+		break;
+	case 'I':
+		accum *= 254;
+		break;
+	}
+	return(accum * sign);
+}
+
+parse_input_angle_90s(srcstr)
+	char *srcstr;
+{
+	unsigned long num;
+	char *cp;
+
+	num = strtoul(srcstr, &cp, 10);
+	switch (num) {
+	case 0:
+	case 90:
+	case 180:
+	case 270:
+		break;
+	default:
+		return(-1);
+	}
+	if (*cp == '.') {
+		cp++;
+		while (*cp)
+			if (*cp++ != '0')
+				return(-1);
+	} else if (*cp)
+		return(-1);
+	return(num);
+}