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