# HG changeset patch # User Rob Landley # Date 1200877216 21600 # Node ID 4f1ca01db0000ea76ed689ea166ba8f2a27ff714 # Parent 630b2e12db166cd51e692dbcd740b400dbd88fcd Fluff out hello.c to supply more example code as a skeleton for new commands, and update a chunk of code.html (much more to do there). diff -r 630b2e12db16 -r 4f1ca01db000 scripts/genconfig.sh --- a/scripts/genconfig.sh Sun Jan 20 17:34:53 2008 -0600 +++ b/scripts/genconfig.sh Sun Jan 20 19:00:16 2008 -0600 @@ -1,5 +1,8 @@ #!/bin/bash +# This has to be a separate file from scripts/make.sh so it can be called +# before menuconfig. (It's called again from scripts/make.sh just to be sure.) + mkdir -p generated function genconfig() diff -r 630b2e12db16 -r 4f1ca01db000 toys/hello.c --- a/toys/hello.c Sun Jan 20 17:34:53 2008 -0600 +++ b/toys/hello.c Sun Jan 20 19:00:16 2008 -0600 @@ -7,7 +7,7 @@ * Not in SUSv3. * See http://www.opengroup.org/onlinepubs/009695399/utilities/ -USE_HELLO(NEWTOY(hello, NULL, TOYFLAG_USR|TOYFLAG_BIN)) +USE_HELLO(NEWTOY(hello, "e@d*c#b:a", TOYFLAG_USR|TOYFLAG_BIN)) config HELLO bool "hello" @@ -21,6 +21,19 @@ #include "toys.h" +// Hello doesn't use these globals, they're here for example/skeleton purposes. + +DEFINE_GLOBALS( + char *b_string; + long c_number; + struct arg_list *d_list; + long e_count; + + int more_globals; +) + +#define TT this.hello + void hello_main(void) { printf("Hello world\n"); diff -r 630b2e12db16 -r 4f1ca01db000 www/code.html --- a/www/code.html Sun Jan 20 17:34:53 2008 -0600 +++ b/www/code.html Sun Jan 20 19:00:16 2008 -0600 @@ -17,25 +17,105 @@

Infrastructure:

-

The toybox source code is in three directories. The top level directory -contains the file main.c and the header file toys.h. The "lib" directory -contains generic functions shared by multiple commands. The "toys" directory -contains the implementations of individual commands.

+

The toybox source code is in following directories:

+ + +

Adding a new command

+

To add a new command to toybox, add a C file implementing that command to +the toys directory. No other files need to be modified; the build extracts +other information it needs (such as command line arguments) from specially +formatted comments and macros in the C file. (See the description of the +generated directory for details.)

+ +

An easy way to start a new command is copy the file "hello.c" to +the name of the new command, and modify this copy to implement the new command. +This file is a small, simple command meant to be used as a "skeleton" for +new commands (more or less by turning every instance of "hello" into the +name of your command, updating the command line arguments, globals, and +help data, and then filling out its "main" function with code that does +something interesting).

+ +

Here's a checklist of steps to turn hello.c into another command:

+ + + +

Top level directory.

+ +

This directory contains global infrastructure.

main.c

Contains the main() function where execution starts, plus common infrastructure to initialize global variables and select which command -to run.

+to run. The "toybox" multiplexer command is also defined here. (This is the +only command defined outside of the toys directory.)

Execution starts in main() which removes the path from the first command name and calls toybox_main(), which calls toy_exec(), which calls toy_find(), -toy_init() and the appropriate command's function from toy_list.

+toy_init() and the appropriate command's function from toy_list. If +the command is "toybox", execution returns to toybox_main(), otherwise +the call goes to the appropriate command_main() from the toys directory.

The following global variables are defined here: