mkbox - sbase - suckless unix tools
 (HTM) git clone git://git.suckless.org/sbase
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) 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