added int parameters to callback routines
[dyninst.git] / visi / test / xtext2.C
1 /*
2  * xtext.c
3  *
4  * This an example of how to use the Text and Paned widgets.
5  *
6  * November 14, 1989 - Chris D. Peterson 
7  *
8  * Updated to also demonstrate XtAppAddInput() -- Bruce Irvin 3/8/94
9  */
10
11 /*
12  * $XConsortium: xtext.c,v 1.16 91/05/16 14:56:23 swick Exp $
13  *
14  * Copyright 1989 Massachusetts Institute of Technology
15  *
16  * Permission to use, copy, modify, distribute, and sell this software and its
17  * documentation for any purpose is hereby granted without fee, provided that
18  * the above copyright notice appear in all copies and that both that
19  * copyright notice and this permission notice appear in supporting
20  * documentation, and that the name of M.I.T. not be used in advertising or
21  * publicity pertaining to distribution of the software without specific,
22  * written prior permission.  M.I.T. makes no representations about the
23  * suitability of this software for any purpose.  It is provided "as is"
24  * without express or implied warranty.
25  *
26  * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
28  * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
29  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
30  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
31  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
32  */
33
34 #include <stdio.h>
35 #include <X11/Intrinsic.h>
36 #include <X11/StringDefs.h>
37
38 #include <X11/Xaw/AsciiText.h>
39 #include <X11/Xaw/Command.h>
40 #include <X11/Xaw/Paned.h>
41
42 #include <X11/Xaw/Cardinals.h>
43
44 //////////////////////////////////
45 #include "../h/visualization.h"
46 //////////////////////////////////
47
48 static void ClearText(Widget w,XtPointer text_ptr,XtPointer call_data);
49 static void PrintText(Widget w,XtPointer text_ptr,XtPointer call_data);
50 static void QuitProgram(Widget w,XtAppContext app_con,XtPointer call_data);
51 static void Syntax(XtAppContext app_con,char *call);
52 //////////////////////////////
53 XtAppContext app_con;
54 Widget toplevel, paned, clear, print, quit, text;
55 Widget getMR, stopMR, phaseN;
56 //////////////////////////////
57
58 // extern int fprintf(), bcopy(), read(), perror(), printf();
59
60 String fallback_resources[] = { 
61     "*input:                            True",
62     "*showGrip:                         off",
63     "?.?.text.preferredPaneSize:        200", 
64     "?.?.text.width:                    200", 
65     "?.?.text.textSource.editType:      edit",
66     "?.?.text.scrollVertical:           whenNeeded",
67     "?.?.text.scrollHorizontal:         whenNeeded",
68     "?.?.text.autoFill:                 on",
69     "*clear*label:            Clear",
70     "*print*label:            Print",
71     "*quit*label:              Quit",
72     NULL,
73 };
74  
75 // callback routine for FOLD and DATAVALUES 
76 int fd_input(int dummy){
77
78   Arg args[1];
79   XawTextPosition pos;
80   XawTextBlock tb;
81   char buf[100];
82   int i,j,k;
83   int noMetrics,noResources,noBins;
84   int size;
85   float value;
86
87   XtSetArg(args[0], XtNinsertPosition, &pos);
88   XtGetValues(text, args, ONE);
89
90
91   fprintf(stderr,"@@@@ in callback for datavalues and fold\n");
92   noMetrics = dataGrid.NumMetrics();
93   noResources = dataGrid.NumResources();
94   noBins = dataGrid.NumBins();
95   for(i=0;i < noMetrics; i++)
96    for(j=0;j<noResources;j++){
97     for(k=0;k<noBins;k++){
98       if((value = dataGrid[i][j][k]) != ERROR){
99       sprintf(&buf[0],"%s%d%s%d%s%d%s%f\n","dataGrid[",i,"][",j,"][",k,
100               "] = ",value); 
101       }
102       else{
103         sprintf(&buf[0],"%s%d%s%d%s%d%s\n","dataGrid[",i,"][",j,"][",k ,
104                 "] = NaN"); 
105       }
106       size = strlen(buf);  
107       tb.firstPos = 0;
108       tb.length = size;
109       tb.ptr = buf;
110       tb.format = FMT8BIT;
111       if (XawTextReplace(text,pos,pos+size-1,&tb) != XawEditDone) {
112           fprintf(stderr,"XawTextReplace returned error\n");
113       }
114       pos += size;
115       XtSetArg(args[0], XtNinsertPosition, pos);
116       XtSetValues(text, args, ONE);
117     }
118     
119     sprintf(&buf[0],"\n");
120     size = strlen(buf);  
121     tb.firstPos = 0;
122     tb.length = size;
123     tb.ptr = buf;
124     tb.format = FMT8BIT;
125     if (XawTextReplace(text,pos,pos+size-1,&tb) != XawEditDone) {
126       fprintf(stderr,"XawTextReplace returned error\n");
127     }
128     pos += size;
129     XtSetArg(args[0], XtNinsertPosition, pos);
130     XtSetValues(text, args, ONE);
131   }
132   fprintf(stderr,"@@@@ leaving callback for datavalues and fold\n");
133
134 }
135
136 // callback routine for ADDMETRICSRESOURCES
137 int fd_input2(int dummy){
138   Arg args[1];
139   XawTextPosition pos;
140   XawTextBlock tb;
141   char buf[100];
142   int size;
143   int noMetrics,noResources,noBins;
144   int aggr;
145   float value;
146
147   XtSetArg(args[0], XtNinsertPosition, &pos);
148   XtGetValues(text, args, ONE);
149   noMetrics = dataGrid.NumMetrics();
150   noResources = dataGrid.NumResources();
151   noBins = dataGrid.NumBins();
152   value  = dataGrid.BinWidth();
153   aggr   = dataGrid.FoldMethod(0);
154   sprintf(&buf[0],"\n%s%d%s%d%s%d%s%f%s%d\n","noMetrics = ",noMetrics,
155          ", no resources = ",noResources,", num Bins = ",noBins,
156          "\nbinWidth = ",value,", Fold Method = ",aggr);
157
158   size = strlen(buf);  
159   tb.firstPos = 0;
160   tb.length = size;
161   tb.ptr = buf;
162   tb.format = FMT8BIT;
163   if (XawTextReplace(text,pos,pos+size-1,&tb) != XawEditDone) {
164     fprintf(stderr,"XawTextReplace returned error\n");
165   }
166   pos += size;
167   XtSetArg(args[0], XtNinsertPosition, pos);
168   XtSetValues(text, args, ONE);
169
170   return(OK);
171 }
172
173 // callback routine for NEWMETRICSRESOURCES, PHASENAME
174 int fd_input3(int dummy){
175   Arg args[1];
176   XawTextPosition pos;
177   XawTextBlock tb;
178   char buf[100];
179   int size;
180
181   XtSetArg(args[0], XtNinsertPosition, &pos);
182   XtGetValues(text, args, ONE);
183   sprintf(&buf[0],"\n%s\n",
184   "This operation is not fully supported: only the call is implemented");
185   size = strlen(buf);  
186   tb.firstPos = 0;
187   tb.length = size;
188   tb.ptr = buf;
189   tb.format = FMT8BIT;
190   if (XawTextReplace(text,pos,pos+size-1,&tb) != XawEditDone) {
191     fprintf(stderr,"XawTextReplace returned error\n");
192   }
193   pos += size;
194   XtSetArg(args[0], XtNinsertPosition, pos);
195   XtSetValues(text, args, ONE);
196
197   return(OK);
198 }
199
200 /////////////////////////////////////
201 static void GetMetsRes(Widget w,XtAppContext app_con,XtPointer call_data){
202
203  fprintf(stderr,"@@@@ in GetMetsRes before call\n"); 
204   vp->GetMetricResource(" "," ",0);  
205  fprintf(stderr,"@@@@ in GetMetsRes after call\n"); 
206 }
207
208 static void StopMetsRes(Widget w,XtAppContext app_con,XtPointer call_data){
209
210  fprintf(stderr,"@@@@ in StopMetsRes before call\n"); 
211   vp->StopMetricResource(0,0);  
212  fprintf(stderr,"@@@@ in StopMetsRes after call\n"); 
213 }
214
215 static void PName(Widget w,XtAppContext app_con,XtPointer call_data){
216
217  fprintf(stderr,"@@@@ in PName before call\n"); 
218   vp->PhaseName(0.0,1.0," ");  
219  fprintf(stderr,"@@@@ in PName after call\n"); 
220 }
221 /////////////////////////////////////
222
223
224 int main(int argc,char **argv)
225 {
226  //   XtAppContext app_con;
227  //  Widget toplevel, paned, clear, print, quit, text;
228  Arg args[1];
229
230 /////////////////////////////////////
231 // variables added for paradyn integration 
232     int ok, fd;
233 /////////////////////////////////////
234
235     toplevel = XtAppInitialize(&app_con, "Xtext", NULL, ZERO,
236                                &argc, argv, fallback_resources,
237                                NULL, ZERO);
238
239     /*
240      * Check to see that all arguments were processed, and if not then
241      * report an error and exit.
242      */
243
244     if (argc != 1)              
245         Syntax(app_con, argv[0]);
246
247 //////////////////////////////////////
248 // call VisiInit: step (1) from README file
249
250    if((fd = VisiInit()) < 0){
251          exit(-1);
252     }
253 //////////////////////////////////////
254
255 //////////////////////////////////////
256 // register event callbacks: step (2) from README file
257
258    ok = RegistrationCallback(ADDMETRICSRESOURCES,fd_input2); 
259    ok = RegistrationCallback(DATAVALUES,fd_input); 
260    ok = RegistrationCallback(FOLD,fd_input); 
261    ok = RegistrationCallback(INVALIDMETRICSRESOURCES,fd_input);
262    ok = RegistrationCallback(NEWMETRICSRESOURCES,fd_input3);
263    ok = RegistrationCallback(PHASENAME,fd_input3);
264 //////////////////////////////////////
265
266 //////////////////////////////////////
267 // start visi: get initial metric and resource choices: step (3) from README
268
269    ok = StartVisi(0,0);
270 //////////////////////////////////////
271
272     paned = XtCreateManagedWidget("paned", panedWidgetClass, toplevel, 
273                                   NULL, ZERO);
274     clear = XtCreateManagedWidget("clear", commandWidgetClass, paned, 
275                                   NULL, ZERO);
276     print = XtCreateManagedWidget("print", commandWidgetClass, paned, 
277                                   NULL, ZERO);
278     quit = XtCreateManagedWidget("quit", commandWidgetClass, paned, 
279                                   NULL, ZERO);
280 //////////////////////////////////////
281 // this is for an upcall to Paradyn: step (3a) from README
282
283     getMR = XtCreateManagedWidget("Get Metric Resource",commandWidgetClass,
284                                   paned,NULL,ZERO);
285     stopMR = XtCreateManagedWidget("Stop Metric Resource",commandWidgetClass,
286                                   paned,NULL,ZERO);
287     phaseN = XtCreateManagedWidget("Name a Phase",commandWidgetClass,
288                                   paned,NULL,ZERO);
289
290 //////////////////////////////////////
291
292     XtSetArg(args[0], XtNstring, "This is a test.\n");
293
294     text = XtCreateManagedWidget("text", asciiTextWidgetClass, paned, 
295                                  args, ONE);
296
297     XtAddCallback(clear, XtNcallback, ClearText, (XtPointer) text);
298     XtAddCallback(print, XtNcallback, PrintText, (XtPointer) text);
299     XtAddCallback(quit, XtNcallback, QuitProgram, (XtPointer) app_con);
300
301 ///////////////////////////////////////
302 //  Add callbacks for upcalls to Paradyn: step (3b) from README
303
304     XtAddCallback(getMR, XtNcallback, GetMetsRes, (XtPointer) app_con);
305     XtAddCallback(stopMR, XtNcallback, StopMetsRes, (XtPointer) app_con);
306     XtAddCallback(phaseN, XtNcallback, PName, (XtPointer) app_con);
307 //////////////////////////////////////
308
309 //////////////////////////////////////
310 // register visi_callback routine as callback on events assoc. w/ file desc
311 // step (4) from README file
312
313    XtAppAddInput(app_con,fd,(XtPointer) XtInputReadMask,
314                  (XtInputCallbackProc) visi_callback, text); 
315 //////////////////////////////////////
316
317     XtRealizeWidget(toplevel);
318     XtAppMainLoop(app_con);
319 }
320
321 /*      Function Name: ClearText
322  *      Description: This function clears all text out of the text widget.
323  *      Arguments: w - *** UNUSED ***
324  *                 text_ptr - a pointer to the text widget.
325  *                 call_data - *** UNUSED ***.
326  *      Returns: none.
327  */
328
329 /* ARGSUSED */
330 static void ClearText(Widget w,XtPointer text_ptr,XtPointer call_data)
331 {
332     Widget text = (Widget) text_ptr;
333     Arg args[1];
334
335     XtSetArg(args[0], XtNstring, "");
336     XtSetValues(text, args, ONE);
337 }
338
339 /*      Function Name: PrintText
340  *      Description: This function clears all text out of the text widget.
341  *      Arguments: w - *** UNUSED ***
342  *                 text_ptr - a pointer to the text widget.
343  *                 call_data - *** UNUSED ***.
344  *      Returns: none.
345  */
346
347 /* ARGSUSED */
348 static void PrintText(Widget w,XtPointer text_ptr,XtPointer call_data)
349 {
350     Widget text = (Widget) text_ptr;
351     Arg args[1];
352     String str;
353
354     XtSetArg(args[0], XtNstring, &str);
355     XtGetValues(text, args, ONE);
356
357     fprintf(stderr, "Text String is:\n--------\n%s\n--------\n", str);
358 }
359
360 /*      Function Name: QuitProgram
361  *      Description: This function exits the program
362  *      Arguments: w - *** UNUSED ***
363  *                 text_ptr - a pointer to the text widget.
364  *                 call_data - *** UNUSED ***.
365  *      Returns: none.
366  */
367
368 /* ARGSUSED */
369 static void QuitProgram(Widget w,XtAppContext app_con,XtPointer call_data)
370 {
371     fprintf(stderr, "Bye!\n");
372     XtDestroyApplicationContext(app_con);
373     exit(0);
374 }
375
376 /*      Function Name: Syntax
377  *      Description: Prints a the calling syntax for this function to stdout.
378  *      Arguments: app_con - the application context.
379  *                 call - the name of the application.
380  *      Returns: none - exits tho.
381  */
382
383 static void Syntax(XtAppContext app_con,char *call)
384 {
385     XtDestroyApplicationContext(app_con);
386     fprintf( stderr, "Usage: %s \n", call);
387     exit(1);
388 }
389