1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h>
2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h>
3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h>
4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint main(int, char **);
6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int toolbox_main(int argc, char **argv)
8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    // "toolbox foo ..." is equivalent to "foo ..."
10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (argc > 1) {
11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return main(argc - 1, argv + 1);
12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        printf("Toolbox!\n");
14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 0;
15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define TOOL(name) int name##_main(int, char**);
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "tools.h"
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef TOOL
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic struct
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const char *name;
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int (*func)(int, char**);
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} tools[] = {
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    { "toolbox", toolbox_main },
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define TOOL(name) { #name, name##_main },
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "tools.h"
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef TOOL
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    { 0, 0 },
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project};
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint main(int argc, char **argv)
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int i;
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *name = argv[0];
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if((argc > 1) && (argv[1][0] == '@')) {
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        name = argv[1] + 1;
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argc--;
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argv++;
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        char *cmd = strrchr(argv[0], '/');
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (cmd)
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            name = cmd + 1;
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    for(i = 0; tools[i].name; i++){
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(!strcmp(tools[i].name, name)){
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return tools[i].func(argc, argv);
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    printf("%s: no such tool\n", argv[0]);
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return -1;
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
58