sbase

suckless unix tools
git clone git://git.suckless.org/sbase
Log | Files | Refs | README | LICENSE

mkbox (1719B)


      1 #!/bin/sh
      2 
      3 trap "rm -rf build" INT QUIT TERM
      4 
      5 rm -rf build
      6 mkdir -p build
      7 
      8 cp *.h build
      9 
     10 cat > build/sbase-box.c <<EOF
     11 #include <unistd.h>
     12 
     13 #include <libgen.h>
     14 #include <errno.h>
     15 #include <stdio.h>
     16 #include <stdlib.h>
     17 #include <string.h>
     18 
     19 #include "util.h"
     20 #include "sbase-box.h"
     21 
     22 struct cmd {
     23 	char *name;
     24 	int (*fn)(int, char **);
     25 } cmds[] = {
     26 	{"[", test_main},
     27 $(grep -l ^main *.c |
     28 while read f
     29 do
     30 	sed -n '
     31 	/^main/ {
     32 		s/main/'${f%.c}'_main/
     33 		s/-/_/g
     34 		w build/'$f'
     35 		s/\(^.*\)(.*)/	{"'${f%.c}'", \1},/
     36 		s/xinstall/install/
     37 		p
     38 		d
     39 	}
     40 	w 'build/$f $f
     41 done)
     42 	{NULL},
     43 };
     44 
     45 static void
     46 install(char *path)
     47 {
     48 	int r;
     49 	struct cmd *bp;
     50 	char fname[FILENAME_MAX];
     51 
     52 	if (path == NULL) {
     53 		fputs("sbase-box [-i path] [command]\n", stderr);
     54 		exit(1);
     55 	}
     56 
     57 	for (bp = cmds; bp->name; ++bp) {
     58 		r = snprintf(fname, sizeof(fname), "%s/%s", path, bp->name);
     59 		if (r < 0 || r >= sizeof(fname)) {
     60 			fprintf(stderr,
     61 			        "sbase-box: destination path truncated for '%s'\n",
     62 			        bp->name);
     63 			exit(1);
     64 		}
     65 		remove(fname);
     66 		if (symlink("sbase-box", fname) < 0) {
     67 			fprintf(stderr,
     68 			        "sbase-box: %s: %s\n",
     69 			        bp->name, strerror(errno));
     70 			exit(1);
     71 		}
     72 	}
     73 }
     74 
     75 int
     76 main(int argc, char *argv[])
     77 {
     78 	char *s = basename(argv[0]);
     79 	struct cmd *bp;
     80 
     81 	if (!strcmp(s, "sbase-box") && argc > 1) {
     82 		argc--; argv++;
     83 		if (strcmp(argv[0], "-i") == 0) {
     84 			install(argv[1]);
     85 			exit(0);
     86 		}
     87 		s = basename(argv[0]);
     88 	}
     89 
     90 	for (bp = cmds; bp->name; ++bp) {
     91 		if (strcmp(bp->name, s) == 0)
     92 			return (*bp->fn)(argc, argv);
     93 	}
     94 
     95 	for (bp = cmds; bp->name; ++bp)
     96 		printf("%s ", bp->name);
     97 	putchar('\n');
     98 
     99 	return 0;
    100 }
    101 EOF
    102 
    103 sed -n 's/.* \(.*_main\).*/int \1(int, char **);/p'\
    104 	build/sbase-box.c > build/sbase-box.h