1e93f7393Sniklas /*
2e93f7393Sniklas * This simple classical example of recursion is useful for
3e93f7393Sniklas * testing stack backtraces and such.
4e93f7393Sniklas */
5e93f7393Sniklas
6e93f7393Sniklas #ifdef vxworks
7e93f7393Sniklas
8e93f7393Sniklas # include <stdio.h>
9e93f7393Sniklas
10e93f7393Sniklas /* VxWorks does not supply atoi. */
11e93f7393Sniklas static int
atoi(z)12e93f7393Sniklas atoi (z)
13e93f7393Sniklas char *z;
14e93f7393Sniklas {
15e93f7393Sniklas int i = 0;
16e93f7393Sniklas
17e93f7393Sniklas while (*z >= '0' && *z <= '9')
18e93f7393Sniklas i = i * 10 + (*z++ - '0');
19e93f7393Sniklas return i;
20e93f7393Sniklas }
21e93f7393Sniklas
22e93f7393Sniklas /* I don't know of any way to pass an array to VxWorks. This function
23e93f7393Sniklas can be called directly from gdb. */
24e93f7393Sniklas
vxmain(arg)25e93f7393Sniklas vxmain (arg)
26e93f7393Sniklas char *arg;
27e93f7393Sniklas {
28e93f7393Sniklas char *argv[2];
29e93f7393Sniklas
30e93f7393Sniklas argv[0] = "";
31e93f7393Sniklas argv[1] = arg;
32e93f7393Sniklas main (2, argv, (char **) 0);
33e93f7393Sniklas }
34e93f7393Sniklas
35e93f7393Sniklas #else /* ! vxworks */
36e93f7393Sniklas # include <stdio.h>
37*b725ae77Skettenis # include <stdlib.h>
38e93f7393Sniklas #endif /* ! vxworks */
39e93f7393Sniklas
40*b725ae77Skettenis #ifdef PROTOTYPES
41*b725ae77Skettenis int factorial (int);
42*b725ae77Skettenis
43*b725ae77Skettenis int
main(int argc,char ** argv,char ** envp)44*b725ae77Skettenis main (int argc, char **argv, char **envp)
45*b725ae77Skettenis #else
46*b725ae77Skettenis int
47e93f7393Sniklas main (argc, argv, envp)
48e93f7393Sniklas int argc;
49e93f7393Sniklas char *argv[], **envp;
50*b725ae77Skettenis #endif
51e93f7393Sniklas {
52e93f7393Sniklas #ifdef usestubs
53e93f7393Sniklas set_debug_traps();
54e93f7393Sniklas breakpoint();
55e93f7393Sniklas #endif
56*b725ae77Skettenis #ifdef FAKEARGV
57*b725ae77Skettenis printf ("%d\n", factorial (1));
58*b725ae77Skettenis #else
59e93f7393Sniklas if (argc != 2) {
60e93f7393Sniklas printf ("usage: factorial <number>\n");
61e93f7393Sniklas return 1;
62e93f7393Sniklas } else {
63e93f7393Sniklas printf ("%d\n", factorial (atoi (argv[1])));
64e93f7393Sniklas }
65*b725ae77Skettenis #endif
66e93f7393Sniklas return 0;
67e93f7393Sniklas }
68e93f7393Sniklas
69*b725ae77Skettenis #ifdef PROTOTYPES
factorial(int value)70*b725ae77Skettenis int factorial (int value)
71*b725ae77Skettenis #else
72*b725ae77Skettenis int factorial (value) int value;
73*b725ae77Skettenis #endif
74e93f7393Sniklas {
75*b725ae77Skettenis int local_var;
76*b725ae77Skettenis
77e93f7393Sniklas if (value > 1) {
78e93f7393Sniklas value *= factorial (value - 1);
79e93f7393Sniklas }
80*b725ae77Skettenis local_var = value;
81e93f7393Sniklas return (value);
82e93f7393Sniklas }
83