1 /* This testcase is part of GDB, the GNU debugger.
2 
3    Copyright 1992, 1993, 1994, 1995, 1999, 2002, 2003 Free Software
4    Foundation, Inc.
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 
20    Please email any bugs, comments, and/or additions to this file to:
21    bug-gdb@prep.ai.mit.edu  */
22 
23 #ifdef vxworks
24 
25 #  include <stdio.h>
26 
27 /* VxWorks does not supply atoi.  */
28 static int
29 atoi (z)
30      char *z;
31 {
32   int i = 0;
33 
34   while (*z >= '0' && *z <= '9')
35     i = i * 10 + (*z++ - '0');
36   return i;
37 }
38 
39 /* I don't know of any way to pass an array to VxWorks.  This function
40    can be called directly from gdb.  */
41 
42 vxmain (arg)
43 char *arg;
44 {
45   char *argv[2];
46 
47   argv[0] = "";
48   argv[1] = arg;
49   main (2, argv, (char **) 0);
50 }
51 
52 #else /* ! vxworks */
53 #  include <stdio.h>
54 #  include <stdlib.h>
55 #endif /* ! vxworks */
56 
57 #ifdef PROTOTYPES
58 extern int marker1 (void);
59 extern int marker2 (int a);
60 extern void marker3 (char *a, char *b);
61 extern void marker4 (long d);
62 #else
63 extern int marker1 ();
64 extern int marker2 ();
65 extern void marker3 ();
66 extern void marker4 ();
67 #endif
68 
69 /*
70  *	This simple classical example of recursion is useful for
71  *	testing stack backtraces and such.
72  */
73 
74 #ifdef PROTOTYPES
75 int factorial(int);
76 
77 int
78 main (int argc, char **argv, char **envp)
79 #else
80 int
81 main (argc, argv, envp)
82 int argc;
83 char *argv[], **envp;
84 #endif
85 {
86 #ifdef usestubs
87     set_debug_traps();  /* set breakpoint 5 here */
88     breakpoint();
89 #endif
90     if (argc == 12345) {  /* an unlikely value < 2^16, in case uninited */ /* set breakpoint 6 here */
91 	fprintf (stderr, "usage:  factorial <number>\n");
92 	return 1;
93     }
94     printf ("%d\n", factorial (atoi ("6")));  /* set breakpoint 1 here */
95     /* set breakpoint 12 here */
96     marker1 ();  /* set breakpoint 11 here */
97     marker2 (43); /* set breakpoint 20 here */
98     marker3 ("stack", "trace"); /* set breakpoint 21 here */
99     marker4 (177601976L);
100     argc = (argc == 12345); /* This is silly, but we can step off of it */ /* set breakpoint 2 here */
101     return argc;  /* set breakpoint 10 here */
102 }
103 
104 #ifdef PROTOTYPES
105 int factorial (int value)
106 #else
107 int factorial (value)
108 int value;
109 #endif
110 {
111   if (value > 1) {  /* set breakpoint 7 here */
112 	value *= factorial (value - 1);
113     }
114     return (value); /* set breakpoint 19 here */
115 }
116 
117 #ifdef PROTOTYPES
118 int multi_line_if_conditional (int a, int b, int c)
119 #else
120 int multi_line_if_conditional (a, b, c)
121   int a, b, c;
122 #endif
123 {
124   if (a    /* set breakpoint 3 here */
125       && b
126       && c)
127     return 0;
128   else
129     return 1;
130 }
131 
132 #ifdef PROTOTYPES
133 int multi_line_while_conditional (int a, int b, int c)
134 #else
135 int multi_line_while_conditional (a, b, c)
136   int a, b, c;
137 #endif
138 {
139   while (a /* set breakpoint 4 here */
140       && b
141       && c)
142     {
143       a--, b--, c--;
144     }
145   return 0;
146 }
147