Commit: 2e0b57f7be573e37b40147ac88e077819ae5566e
Parent: 176aea0b28194d920f532d71caf706885740edec
Author: Randy Palamar
Date:   Thu, 10 Oct 2024 06:55:09 -0600
drop arg.h
this header is not really useful - just write the code
Diffstat:
| D | arg.h |  |  | 50 | -------------------------------------------------- | 
| M | build.sh |  |  | 2 | +- | 
| M | jdict.c |  |  | 97 | +++++++++++++++++++++++++++++++++++++------------------------------------------ | 
| M | util.c |  |  | 35 | ++++++++++++++++++++++++++--------- | 
4 files changed, 73 insertions(+), 111 deletions(-)
diff --git a/arg.h b/arg.h
@@ -1,50 +0,0 @@
-/*
- * Copy me if you can.
- * by 20h
- */
-
-#ifndef ARG_H__
-#define ARG_H__
-
-extern char *argv0;
-
-/* use main(int argc, char *argv[]) */
-#define ARGBEGIN	for (argv0 = *argv, argv++, argc--;\
-					argv[0] && argv[0][0] == '-'\
-					&& argv[0][1];\
-					argc--, argv++) {\
-				char argc_;\
-				char **argv_;\
-				int brk_;\
-				if (argv[0][1] == '-' && argv[0][2] == '\0') {\
-					argv++;\
-					argc--;\
-					break;\
-				}\
-				int i_;\
-				for (i_ = 1, brk_ = 0, argv_ = argv;\
-						argv[0][i_] && !brk_;\
-						i_++) {\
-					if (argv_ != argv)\
-						break;\
-					argc_ = argv[0][i_];\
-					switch (argc_)
-
-#define ARGEND			}\
-			}
-
-#define ARGC()		argc_
-
-#define EARGF(x)	((argv[0][i_+1] == '\0' && argv[1] == NULL)?\
-				((x), abort(), (char *)0) :\
-				(brk_ = 1, (argv[0][i_+1] != '\0')?\
-					(&argv[0][i_+1]) :\
-					(argc--, argv++, argv[0])))
-
-#define ARGF()		((argv[0][i_+1] == '\0' && argv[1] == NULL)?\
-				(char *)0 :\
-				(brk_ = 1, (argv[0][i_+1] != '\0')?\
-					(&argv[0][i_+1]) :\
-					(argc--, argv++, argv[0])))
-
-#endif
diff --git a/build.sh b/build.sh
@@ -5,4 +5,4 @@ cflags="-march=native -O3 -std=c99 -Wall -Wextra -pedantic"
 cflags="$cflags -D_BSD_SOURCE"
 ldflags="-s -static"
 
-cc $cflags $ldflags jdict.c -o jdict 
+cc $cflags $ldflags jdict.c -o jdict
diff --git a/jdict.c b/jdict.c
@@ -2,15 +2,12 @@
 #include <dirent.h>
 #include <fcntl.h>
 #include <limits.h>
-#include <stddef.h>
-#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/mman.h>
 #include <unistd.h>
 
-#include "arg.h"
 #include "util.c"
 #include "yomidict.c"
 
@@ -22,10 +19,6 @@
 /* Number of hash table slots (1 << HT_EXP) */
 #define HT_EXP 20
 
-typedef uint64_t u64;
-typedef uint32_t u32;
-typedef int32_t  i32;
-
 typedef struct {
 	s8 term;
 	s8 *defs;
@@ -45,10 +38,8 @@ typedef struct {
 
 #include "config.h"
 
-char *argv0;
-
 static void
-usage(void)
+usage(char *argv0)
 {
 	die("usage: %s [-d path] [-F FS] [-i] term ...\n", argv0);
 }
@@ -251,14 +242,14 @@ make_dict(Dict *d)
 
 	d->ht.ents = xreallocarray(NULL, sizeof(DictEnt *), 1 << HT_EXP);
 
-	snprintf(path, LEN(path), "%s/%s", prefix, d->rom);
+	snprintf(path, ARRAY_COUNT(path), "%s/%s", prefix, d->rom);
 	if ((nbanks = count_term_banks(path)) == 0) {
 		fprintf(stderr, "no term banks found: %s\n", path);
 		return 0;
 	}
 
 	for (size_t i = 1; i <= nbanks; i++) {
-		snprintf(tbank, LEN(tbank), "%s/term_bank_%zu.json", path, i);
+		snprintf(tbank, ARRAY_COUNT(tbank), "%s/term_bank_%zu.json", path, i);
 		parse_term_bank(&d->ht, tbank);
 	}
 
@@ -318,8 +309,8 @@ find_and_print_defs(Dict *dict, s8 *terms, size_t nterms)
 static void
 repl(Dict *dicts, size_t ndicts)
 {
-	char t[BUFLEN];
-	s8 buf = {t, BUFLEN};
+	u8 t[BUFLEN];
+	s8 buf = {.len = ARRAY_COUNT(t), .s = t};
 	size_t i;
 
 	make_dicts(dicts, ndicts);
@@ -328,10 +319,10 @@ repl(Dict *dicts, size_t ndicts)
 	for (;;) {
 		fputs(repl_prompt, stdout);
 		fflush(stdout);
-		buf.len = BUFLEN;
-		if (fgets(buf.s, buf.len, stdin) == NULL)
+		buf.len = ARRAY_COUNT(t);
+		if (fgets((char *)buf.s, buf.len, stdin) == NULL)
 			break;
-		buf.len = strlen(buf.s);
+		buf.len = strlen((char *)buf.s);
 		for (i = 0; i < ndicts; i++)
 			find_and_print(s8trim(buf), &dicts[i]);
 	}
@@ -342,59 +333,63 @@ int
 main(int argc, char *argv[])
 {
 	s8 *terms = NULL;
-	char *t;
 	Dict *dicts = NULL;
-	size_t i, ndicts = 0, nterms = 0;
+	size_t ndicts = 0, nterms = 0;
 	int iflag = 0;
 
-	argv0 = argv[0];
-
-	ARGBEGIN {
-	case 'd':
-		t = EARGF(usage());
-		for (i = 0; i < LEN(default_dict_map); i++) {
-			if (strcmp(t, default_dict_map[i].rom) == 0) {
-				dicts = &default_dict_map[i];
-				ndicts++;
-				break;
+	char *argv0 = argv[0];
+	for (argv++, argc--; argv[0] && argv[0][0] == '-' && argv[0][1]; argc--, argv++) {
+		/* NOTE: '--' to end parameters */
+		if (argv[0][1] == '-' && argv[0][2] == 0) {
+			argv++;
+			argc--;
+			break;
+		}
+		switch (argv[0][1]) {
+		case 'F':
+			if (!argv[1] || !argv[1][0])
+				usage(argv0);
+			fsep = unescape(cstr_to_s8(argv[1]));
+			argv++;
+			break;
+		case 'd':
+			if (!argv[1] || !argv[1][0])
+				usage(argv0);
+			for (u32 j = 0; j < ARRAY_COUNT(default_dict_map); j++) {
+				if (strcmp(argv[1], default_dict_map[j].rom) == 0) {
+					dicts = &default_dict_map[j];
+					ndicts++;
+					break;
+				}
 			}
+			if (dicts == NULL)
+				die("invalid dictionary name: %s\n", argv[1]);
+			argv++;
+			break;
+		case 'i': iflag = 1;   break;
+		default: usage(argv0); break;
 		}
-		if (dicts == NULL)
-			die("invalid dictionary name: %s\n", t);
-		break;
-	case 'F':
-		t = EARGF(usage());
-		fsep = unescape((s8){t, strlen(t)});
-		break;
-	case 'i':
-		iflag = 1;
-		break;
-	default:
-		usage();
-	} ARGEND
+	}
 
 	if (ndicts == 0) {
-		dicts = default_dict_map;
-		ndicts = LEN(default_dict_map);
+		dicts  = default_dict_map;
+		ndicts = ARRAY_COUNT(default_dict_map);
 	}
 
 	/* remaining argv elements are terms to search for */
-	for (i = 0; argc && *argv; argv++, i++, argc--) {
+	for (i32 i = 0; argc && *argv; argv++, i++, argc--) {
 		terms = xreallocarray(terms, ++nterms, sizeof(s8));
-		terms[i].s = *argv;
-		terms[i].len = strlen(terms[i].s);
+		terms[i] = cstr_to_s8(*argv);
 	}
 
 	if (nterms == 0 && iflag == 0)
-		usage();
+		usage(argv0);
 
 	if (iflag == 0)
-		for (i = 0; i < ndicts; i++)
+		for (size_t i = 0; i < ndicts; i++)
 			find_and_print_defs(&dicts[i], terms, nterms);
 	else
 		repl(dicts, ndicts);
 
-	free(terms);
-
 	return 0;
 }
diff --git a/util.c b/util.c
@@ -6,13 +6,22 @@
 #include <stdlib.h>
 #include <string.h>
 
-#define LEN(a) (sizeof(a) / sizeof(*a))
+#include <stdint.h>
+#include <stddef.h>
+typedef uint8_t   u8;
+typedef int64_t   i64;
+typedef uint64_t  u64;
+typedef int32_t   i32;
+typedef uint32_t  u32;
+typedef ptrdiff_t size;
+
+#define ARRAY_COUNT(a) (sizeof(a) / sizeof(*a))
 
 typedef struct {
-	char *s;
-	ptrdiff_t len;
+	size len;
+	u8   *s;
 } s8;
-#define s8(s) (s8){s, LEN(s) - 1}
+#define s8(cstr) (s8){.len = ARRAY_COUNT(cstr) - 1, .s = (u8 *)cstr}
 
 static void __attribute__((noreturn))
 die(const char *fmt, ...)
@@ -41,7 +50,7 @@ s8cmp(s8 a, s8 b)
 static s8
 s8trim(s8 str)
 {
-	char *p = &str.s[str.len-1];
+	u8 *p = str.s + str.len - 1;
 
 	for (; str.len && isspace(*p); str.len--, p--);
 	for (; str.len && isspace(*str.s); str.len--, str.s++);
@@ -53,8 +62,8 @@ s8trim(s8 str)
 static s8
 unescape(s8 str)
 {
-	char *t = str.s;
-	ptrdiff_t rem = str.len;
+	u8 *t    = str.s;
+	size rem = str.len;
 	int off;
 
 	while ((t = memchr(t, '\\', rem)) != NULL) {
@@ -84,12 +93,20 @@ xreallocarray(void *o, size_t n, size_t s)
 }
 
 static s8
-s8dup(void *src, ptrdiff_t len)
+s8dup(void *src, size len)
 {
-	s8 str = {0, len};
+	s8 str = {.len = len};
 	if (len < 0)
 		die("s8dup(): negative len\n");
 	str.s = xreallocarray(NULL, 1, len);
 	memcpy(str.s, src, len);
 	return str;
 }
+
+static s8
+cstr_to_s8(char *cstr)
+{
+	s8 result = {.s = (u8 *)cstr};
+	if (cstr) while (*cstr) { result.len++; cstr++; }
+	return result;
+}