diff options
author | landley <landley@driftwood> | 2006-09-27 00:45:05 -0400 |
---|---|---|
committer | landley <landley@driftwood> | 2006-09-27 00:45:05 -0400 |
commit | 13bab2f09e9189c2b1e83ae37a1134108f9479cf (patch) | |
tree | 148ceea436c59c9a7c3e4deec638b52b16e307e5 /toys | |
download | toybox-13bab2f09e9189c2b1e83ae37a1134108f9479cf.tar.gz |
Starting a new project. Just a bit past the "hello world" stage...
Diffstat (limited to 'toys')
-rw-r--r-- | toys/main.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/toys/main.c b/toys/main.c new file mode 100644 index 00000000..bd15d602 --- /dev/null +++ b/toys/main.c @@ -0,0 +1,95 @@ +/* vi: set ts=4 :*/ +/* Toybox infrastructure. + * + * Copyright 2006 Rob Landley <rob@landley.net> + * + * Licensed under GPL version 2, see file LICENSE in this tarball for details. + */ + +#include <stdio.h> +#include <strings.h> + +/* +name +main() +struct +usage (short long example info) +path (/usr/sbin) +*/ + +int toybox_main(void) +{ + printf("toybox\n"); + return 0; +} + +int toysh_main(void) +{ + printf("toysh\n"); +} + +// The monster fun applet list. + +struct toy_list { + char *name; + int (*toy_main)(void); +} toy_list[] = { + {"toybox", toybox_main}, + {"toysh", toysh_main} +}; + +// Global context for this applet. + +struct toy_context { + struct toy_list *which; + int argc; + char **argv; + char buf[4096]; +// toy_union toydata; +} toys; + +struct toy_list *find_toy_by_name(char *name) +{ + int top, bottom, middle; + + // If the name starts with "toybox", accept that as a match. Otherwise + // skip the first entry, which is out of order. + + if (!strncmp(name,"toybox",6)) return toy_list; + bottom=1; + + // Binary search to find this applet. + + top=(sizeof(toy_list)/sizeof(struct toy_list))-1; + for(;;) { + int result; + + middle=(top+bottom)/2; + if(middle<bottom || middle>top) return NULL; + result = strcmp(name,toy_list[middle].name); + if(!result) return toy_list+middle; + if(result<0) top=--middle; + else bottom=++middle; + } +} + +int main(int argc, char *argv[]) +{ + char *name; + + // Record command line arguments. + toys.argc = argc; + toys.argv = argv; + + // Figure out which applet got called. + name = rindex(argv[0],'/'); + if (!name) name = argv[0]; + else name++; + toys.which = find_toy_by_name(name); + + if (!toys.which) { + dprintf(2,"No behavior for %s\n",name); + return 1; + } + return toys.which->toy_main(); +} |