Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / tests / src / test4b.mutatee.c
1 /*
2  * Copyright (c) 1996-2009 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 /* Test application (Mutatee) */
33
34 /* $Id: test4b.mutatee.c,v 1.8 2006/02/08 23:41:34 bernat Exp $ */
35
36 #include <stdio.h>
37 #include <assert.h>
38 #include <sys/types.h>
39 #include <signal.h>
40 #include <string.h>
41 #include <stdlib.h>
42 #include <stdarg.h>
43
44 #if defined(i386_unknown_nt4_0) && !defined(__GNUC__)
45 #define WIN32_LEAN_AND_MEAN
46 #include <windows.h>
47 #define getpid _getpid
48 #else
49 #include <unistd.h>
50 #endif
51
52 #ifdef __cplusplus
53 int mutateeCplusplus = 1;
54 #else
55 int mutateeCplusplus = 0;
56 #endif
57
58 #ifndef COMPILER
59 #define COMPILER ""
60 #endif
61 const char *Builder_id=COMPILER; /* defined on compile line */
62
63 int debugPrint = 0;
64
65 /* control debug printf statements */
66 void dprintf(const char *fmt, ...) {
67         va_list args;
68         va_start(args, fmt);
69      
70         if( debugPrint ) {
71                 vfprintf(stderr, fmt, args);
72                 }
73         va_end(args);
74         fflush(stderr);
75         }
76         
77 #define TRUE    1
78 #define FALSE   0
79
80 int runAllTests = TRUE;
81 #define MAX_TEST 5
82 int runTest[MAX_TEST+1];
83
84 int globalVariable3_1;
85
86 void func3_2() 
87 {
88     dprintf("in func3_2\n");
89     globalVariable3_1 = 3000002;
90 }
91
92 void func3_1()
93 {
94     dprintf("in func3_1\n");
95 }
96
97 int globalVariable4_1;
98
99 void func4_4()
100 {
101     dprintf("in test4b func4_4\n");
102
103     globalVariable4_1 = 4000003;
104 }
105
106 void func4_2()
107 {
108     dprintf("in test4b func4_2\n");
109
110     /* a call to func4_4 gets hooked onto the exit of this */
111 }
112
113 void func4_1()
114 {
115 #ifndef i386_unknown_nt4_0
116     dprintf("in test4b func4_1\n");
117
118     func4_2();
119
120     exit(getpid());
121 #endif
122 }
123
124 int main(int argc, char *argv[])
125 {                                       
126     int i, j;
127
128     dprintf("test4b.mutatee started...\n");
129
130     for (i=1; i < argc; i++) {
131         if (!strcmp(argv[i], "-verbose")) {
132             debugPrint = TRUE;
133         } else if (!strcmp(argv[i], "-run")) {
134             runAllTests = FALSE;
135             for (j=0; j <= MAX_TEST; j++) runTest[j] = FALSE;
136             for (j=i+1; j < argc; j++) {
137                 unsigned int testId;
138                 if ((testId = atoi(argv[j]))) {
139                     if ((testId > 0) && (testId <= MAX_TEST)) {
140                         runTest[testId] = TRUE;
141                     } else {
142                         printf("invalid test %d requested\n", testId);
143                         exit(-1);
144                     }
145                 } else {
146                     /* end of test list */
147                     break;
148                 }
149             }
150             i=j-1;
151         } else {
152             fprintf(stderr, "Usage: %s [-verbose] -run <num> ..\n", argv[0]);
153             exit(-1);
154         }
155     }
156
157     if ((argc==1) || debugPrint)
158         printf("Mutatee %s [%s]:\"%s\"\n", argv[0], 
159                 mutateeCplusplus ? "C++" : "C", Builder_id);
160     if (argc==1) exit(0);
161
162     if (runTest[3]) func3_1();
163     if (runTest[4]) func4_1();
164
165     dprintf("Mutatee %s terminating.\n", argv[0]);
166     return 0;
167 }