xref: /aosp_15_r20/external/toybox/toys/example/skeleton.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker /* skeleton.c - Example program to act as template for new commands.
2*cf5a6c84SAndroid Build Coastguard Worker  *              (Although really, half the time copying hello.c is easier.)
3*cf5a6c84SAndroid Build Coastguard Worker  *
4*cf5a6c84SAndroid Build Coastguard Worker  * Copyright 2014 Rob Landley <[email protected]>
5*cf5a6c84SAndroid Build Coastguard Worker  *
6*cf5a6c84SAndroid Build Coastguard Worker  * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/
7*cf5a6c84SAndroid Build Coastguard Worker  * See http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/cmdbehav.html
8*cf5a6c84SAndroid Build Coastguard Worker  * See https://www.ietf.org/rfc/rfc3.txt
9*cf5a6c84SAndroid Build Coastguard Worker  * See https://man7.org/linux/man-pages/man1/intro.1.html
10*cf5a6c84SAndroid Build Coastguard Worker  * No standard.
11*cf5a6c84SAndroid Build Coastguard Worker 
12*cf5a6c84SAndroid Build Coastguard Worker // Accept many different kinds of command line argument (see top of lib/args.c)
13*cf5a6c84SAndroid Build Coastguard Worker // Demonstrate two commands in the same file (see www/documentation.html)
14*cf5a6c84SAndroid Build Coastguard Worker 
15*cf5a6c84SAndroid Build Coastguard Worker USE_SKELETON(NEWTOY(skeleton, "(walrus)(blubber):;(also):h(hlong):; g(glong): f(longf):;e@d*c#b:a", TOYFLAG_USR|TOYFLAG_BIN))
16*cf5a6c84SAndroid Build Coastguard Worker USE_SKELETON_ALIAS(NEWTOY(skeleton_alias, "b#dq", TOYFLAG_USR|TOYFLAG_BIN))
17*cf5a6c84SAndroid Build Coastguard Worker 
18*cf5a6c84SAndroid Build Coastguard Worker config SKELETON
19*cf5a6c84SAndroid Build Coastguard Worker   bool "skeleton"
20*cf5a6c84SAndroid Build Coastguard Worker   default n
21*cf5a6c84SAndroid Build Coastguard Worker   help
22*cf5a6c84SAndroid Build Coastguard Worker     usage: skeleton [-a] [-b STRING] [-c NUMBER] [-d LIST] [-e COUNT] [...]
23*cf5a6c84SAndroid Build Coastguard Worker 
24*cf5a6c84SAndroid Build Coastguard Worker     Template for new commands. You don't need this.
25*cf5a6c84SAndroid Build Coastguard Worker 
26*cf5a6c84SAndroid Build Coastguard Worker     When creating a new command, copy this file and delete the parts you
27*cf5a6c84SAndroid Build Coastguard Worker     don't need. Be sure to replace all instances of "skeleton" (upper and lower
28*cf5a6c84SAndroid Build Coastguard Worker     case) with your new command name.
29*cf5a6c84SAndroid Build Coastguard Worker 
30*cf5a6c84SAndroid Build Coastguard Worker     For simple commands, "hello.c" is probably a better starting point.
31*cf5a6c84SAndroid Build Coastguard Worker 
32*cf5a6c84SAndroid Build Coastguard Worker config SKELETON_ALIAS
33*cf5a6c84SAndroid Build Coastguard Worker   bool "skeleton_alias"
34*cf5a6c84SAndroid Build Coastguard Worker   default n
35*cf5a6c84SAndroid Build Coastguard Worker   help
36*cf5a6c84SAndroid Build Coastguard Worker     usage: skeleton_alias [-dq] [-b NUMBER]
37*cf5a6c84SAndroid Build Coastguard Worker 
38*cf5a6c84SAndroid Build Coastguard Worker     Example of a second command with different arguments in the same source
39*cf5a6c84SAndroid Build Coastguard Worker     file as the first. This allows shared infrastructure outside of lib/.
40*cf5a6c84SAndroid Build Coastguard Worker */
41*cf5a6c84SAndroid Build Coastguard Worker 
42*cf5a6c84SAndroid Build Coastguard Worker #define FOR_skeleton
43*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
44*cf5a6c84SAndroid Build Coastguard Worker 
45*cf5a6c84SAndroid Build Coastguard Worker // The union lets lib/args.c store arguments for either command.
46*cf5a6c84SAndroid Build Coastguard Worker // It's customary to put a space between argument variables and other globals.
GLOBALS(union{ struct { char *b; long c; struct arg_list *d; long e; char *f, *g, *h, *also, *blubber; } s; struct { long b; } a; };int more_globals;)47*cf5a6c84SAndroid Build Coastguard Worker GLOBALS(
48*cf5a6c84SAndroid Build Coastguard Worker   union {
49*cf5a6c84SAndroid Build Coastguard Worker     struct {
50*cf5a6c84SAndroid Build Coastguard Worker       char *b;
51*cf5a6c84SAndroid Build Coastguard Worker       long c;
52*cf5a6c84SAndroid Build Coastguard Worker       struct arg_list *d;
53*cf5a6c84SAndroid Build Coastguard Worker       long e;
54*cf5a6c84SAndroid Build Coastguard Worker       char *f, *g, *h, *also, *blubber;
55*cf5a6c84SAndroid Build Coastguard Worker     } s;
56*cf5a6c84SAndroid Build Coastguard Worker     struct {
57*cf5a6c84SAndroid Build Coastguard Worker       long b;
58*cf5a6c84SAndroid Build Coastguard Worker     } a;
59*cf5a6c84SAndroid Build Coastguard Worker   };
60*cf5a6c84SAndroid Build Coastguard Worker 
61*cf5a6c84SAndroid Build Coastguard Worker   int more_globals;
62*cf5a6c84SAndroid Build Coastguard Worker )
63*cf5a6c84SAndroid Build Coastguard Worker 
64*cf5a6c84SAndroid Build Coastguard Worker // Parse many different kinds of command line argument:
65*cf5a6c84SAndroid Build Coastguard Worker void skeleton_main(void)
66*cf5a6c84SAndroid Build Coastguard Worker {
67*cf5a6c84SAndroid Build Coastguard Worker   char **optargs;
68*cf5a6c84SAndroid Build Coastguard Worker 
69*cf5a6c84SAndroid Build Coastguard Worker   printf("Ran %s\n", toys.which->name);
70*cf5a6c84SAndroid Build Coastguard Worker 
71*cf5a6c84SAndroid Build Coastguard Worker   // Command line options parsing is done for you by lib/args.c called
72*cf5a6c84SAndroid Build Coastguard Worker   // from main.c using the optstring in the NEWTOY macros. Display results.
73*cf5a6c84SAndroid Build Coastguard Worker   if (toys.optflags) printf("flags=%llx\n", toys.optflags);
74*cf5a6c84SAndroid Build Coastguard Worker   if (FLAG(a)) printf("Saw a\n");
75*cf5a6c84SAndroid Build Coastguard Worker   if (FLAG(b)) printf("b=%s\n", TT.s.b);
76*cf5a6c84SAndroid Build Coastguard Worker   if (FLAG(c)) printf("c=%ld\n", TT.s.c);
77*cf5a6c84SAndroid Build Coastguard Worker   while (TT.s.d) {
78*cf5a6c84SAndroid Build Coastguard Worker     printf("d=%s\n", TT.s.d->arg);
79*cf5a6c84SAndroid Build Coastguard Worker     TT.s.d = TT.s.d->next;
80*cf5a6c84SAndroid Build Coastguard Worker   }
81*cf5a6c84SAndroid Build Coastguard Worker   if (TT.s.e) printf("e was seen %ld times\n", TT.s.e);
82*cf5a6c84SAndroid Build Coastguard Worker   if (TT.s.f) printf("f=%s\n", TT.s.f);
83*cf5a6c84SAndroid Build Coastguard Worker   if (TT.s.g) printf("g=%s\n", TT.s.g);
84*cf5a6c84SAndroid Build Coastguard Worker   if (TT.s.h) printf("h=%s\n", TT.s.h);
85*cf5a6c84SAndroid Build Coastguard Worker   for (optargs = toys.optargs; *optargs; optargs++)
86*cf5a6c84SAndroid Build Coastguard Worker     printf("optarg=%s\n", *optargs);
87*cf5a6c84SAndroid Build Coastguard Worker   if (FLAG(walrus)) printf("Saw --walrus\n");
88*cf5a6c84SAndroid Build Coastguard Worker   if (TT.s.blubber) printf("--blubber=%s\n", TT.s.blubber);
89*cf5a6c84SAndroid Build Coastguard Worker 
90*cf5a6c84SAndroid Build Coastguard Worker   printf("Other globals should start zeroed: %d\n", TT.more_globals);
91*cf5a6c84SAndroid Build Coastguard Worker }
92*cf5a6c84SAndroid Build Coastguard Worker 
93*cf5a6c84SAndroid Build Coastguard Worker // Switch gears from skeleton to skeleton_alias (swap FLAG macros).
94*cf5a6c84SAndroid Build Coastguard Worker #define FOR_skeleton_alias
95*cf5a6c84SAndroid Build Coastguard Worker #include "generated/flags.h"
96*cf5a6c84SAndroid Build Coastguard Worker 
skeleton_alias_main(void)97*cf5a6c84SAndroid Build Coastguard Worker void skeleton_alias_main(void)
98*cf5a6c84SAndroid Build Coastguard Worker {
99*cf5a6c84SAndroid Build Coastguard Worker   printf("Ran %s\n", toys.which->name);
100*cf5a6c84SAndroid Build Coastguard Worker   printf("flags=%llx\n", toys.optflags);
101*cf5a6c84SAndroid Build Coastguard Worker 
102*cf5a6c84SAndroid Build Coastguard Worker   // Note, this FLAG_b is a different bit position than the other FLAG_b,
103*cf5a6c84SAndroid Build Coastguard Worker   // and fills out a different variable of a different type.
104*cf5a6c84SAndroid Build Coastguard Worker   if (FLAG(b)) printf("b=%ld", TT.a.b);
105*cf5a6c84SAndroid Build Coastguard Worker }
106