summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2021-01-15 14:47:42 -0500
committerJune McEnroe <june@causal.agency>2021-01-15 14:48:39 -0500
commit820ae65b3a6b0e07f7c59458e1b0889011c67f4a (patch)
tree29daaf0afcaaba9a2d3bf376e88aae27cd24554f
parentCall cap_rights_limit on stderr too (diff)
downloadsrc-820ae65b3a6b0e07f7c59458e1b0889011c67f4a.tar.gz
src-820ae65b3a6b0e07f7c59458e1b0889011c67f4a.zip
Output htagml -x from the main loop
Silly the way it was written, but I think I started writing it that way
before I decided to make it mutually exclusive with regular output.
-rw-r--r--bin/htagml.c43
-rw-r--r--bin/man1/htagml.12
2 files changed, 17 insertions, 28 deletions
diff --git a/bin/htagml.c b/bin/htagml.c
index f94e7bfc..b95f6a96 100644
--- a/bin/htagml.c
+++ b/bin/htagml.c
@@ -23,16 +23,6 @@
 #include <sysexits.h>
 #include <unistd.h>
 
-struct Tag {
-	char *tag;
-	int num;
-	regex_t regex;
-};
-
-static int compar(const void *a, const void *b) {
-	return ((const struct Tag *)a)->num - ((const struct Tag *)b)->num;
-}
-
 static char *nomagic(const char *pattern) {
 	char *buf = malloc(2 * strlen(pattern) + 1);
 	if (!buf) err(EX_OSERR, "malloc");
@@ -94,7 +84,11 @@ int main(int argc, char *argv[]) {
 
 	size_t len = 0;
 	size_t cap = 256;
-	struct Tag *tags = malloc(cap * sizeof(*tags));
+	struct Tag {
+		char *tag;
+		int num;
+		regex_t regex;
+	} *tags = malloc(cap * sizeof(*tags));
 	if (!tags) err(EX_OSERR, "malloc");
 
 	char *buf = NULL;
@@ -142,7 +136,7 @@ int main(int argc, char *argv[]) {
 	if (!file) err(EX_NOINPUT, "%s", name);
 
 	int num = 0;
-	if (pre) printf("<pre>");
+	printf(pre ? "<pre>" : index ? "<ul class=\"index\">\n" : "");
 	while (0 < getline(&buf, &bufCap, file) && ++num) {
 		struct Tag *tag = NULL;
 		for (size_t i = 0; i < len; ++i) {
@@ -155,7 +149,15 @@ int main(int argc, char *argv[]) {
 			tag->num = num;
 			break;
 		}
-		if (index) continue;
+		if (index) {
+			if (!tag) continue;
+			printf("<li><a class=\"tag\" href=\"#");
+			escape(true, tag->tag, strlen(tag->tag));
+			printf("\">");
+			escape(true, tag->tag, strlen(tag->tag));
+			printf("</a></li>\n");
+			continue;
+		}
 		if (pipe) {
 			ssize_t len = getline(&buf, &bufCap, stdin);
 			if (len < 0) {
@@ -187,18 +189,5 @@ int main(int argc, char *argv[]) {
 		printf("</a>");
 		if (match) escape(!pipe, match, strlen(match));
 	}
-	if (pre) printf("</pre>");
-
-	if (!index) return EX_OK;
-	qsort(tags, len, sizeof(*tags), compar);
-	printf("<ul class=\"index\">\n");
-	for (size_t i = 0; i < len; ++i) {
-		if (!tags[i].num) continue;
-		printf("<li><a class=\"tag\" href=\"#");
-		escape(true, tags[i].tag, strlen(tags[i].tag));
-		printf("\">");
-		escape(true, tags[i].tag, strlen(tags[i].tag));
-		printf("</a></li>\n");
-	}
-	printf("</ul>\n");
+	printf(pre ? "</pre>" : index ? "</ul>\n" : "");
 }
diff --git a/bin/man1/htagml.1 b/bin/man1/htagml.1
index 7a5f572f..97e8f3f2 100644
--- a/bin/man1/htagml.1
+++ b/bin/man1/htagml.1
@@ -8,7 +8,7 @@
 .
 .Sh SYNOPSIS
 .Nm
-.Op Fl ipx
+.Op Fl ip | x
 .Op Fl f Ar tagsfile
 .Ar file
 .