changeset 3:8123259c7f14

helpers/makeline imported from Selenite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 15 May 2020 02:02:09 +0000
parents 14f8a71286c5
children 7ed24ddc5c2a
files .hgignore helpers/Makefile helpers/makeline.c
diffstat 3 files changed, 92 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore	Fri May 15 02:02:09 2020 +0000
@@ -0,0 +1,5 @@
+syntax: regexp
+
+^build-
+
+^helpers/makeline$
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/helpers/Makefile	Fri May 15 02:02:09 2020 +0000
@@ -0,0 +1,11 @@
+CC=	gcc
+CFLAGS=	-O2
+PROGS=	makeline
+
+all:	${PROGS}
+
+makeline:	makeline.c
+	${CC} ${CFLAGS} -o $@ $@.c
+
+clean:
+	rm -f ${PROGS}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/helpers/makeline.c	Fri May 15 02:02:09 2020 +0000
@@ -0,0 +1,76 @@
+/*
+ * This helper utility for the FreeCalypso Selenite build system
+ * emits potentially long generated Makefile lines, breaking them into
+ * multiple lines with backslashes.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+
+int is_cmd, equ_or_colon, extra_indent;
+int linelen;
+
+main(argc, argv)
+	char **argv;
+{
+	char **ap;
+
+	if (argc < 4) {
+		fprintf(stderr, "error: too few arguments\n", argv[0]);
+		exit(1);
+	}
+	if (!strcmp(argv[1], "def")) {
+		is_cmd = 0;
+		equ_or_colon = '=';
+		extra_indent = 0;
+	} else if (!strcmp(argv[1], "dep")) {
+		is_cmd = 0;
+		equ_or_colon = ':';
+		extra_indent = 1;
+	} else if (!strcmp(argv[1], "cmd")) {
+		is_cmd = 1;
+		extra_indent = 1;
+	} else {
+		fprintf(stderr, "error: line type \"%s\" not known\n", argv[1]);
+		exit(1);
+	}
+	if (is_cmd) {
+		putchar('\t');
+		linelen = 8;
+	} else
+		linelen = 0;
+	fputs(argv[2], stdout);
+	linelen += strlen(argv[2]);
+	if (is_cmd) {
+		putchar(' ');
+		linelen++;
+	} else {
+		putchar(equ_or_colon);
+		linelen++;
+		putchar('\t');
+		do
+			linelen++;
+		while (linelen & 7);
+	}
+	fputs(argv[3], stdout);
+	linelen += strlen(argv[3]);
+	for (ap = argv + 4; *ap; ap++) {
+		if (linelen + 1 + strlen(*ap) <= 78) {
+			putchar(' ');
+			linelen++;
+		} else {
+			fputs(" \\\n\t", stdout);
+			linelen = 8;
+			if (extra_indent) {
+				fputs("    ", stdout);
+				linelen += 4;
+			}
+		}
+		fputs(*ap, stdout);
+		linelen += strlen(*ap);
+	}
+	putchar('\n');
+	exit(0);
+}