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