removed blt-ish influences
[dyninst.git] / visiClients / tclVisi / src / DGclient.C
1 /*
2  *  DGclient.C -- Code for the visi<->tcl interface.
3  *    
4  * $Log: DGclient.C,v $
5  * Revision 1.6  1994/11/08 00:20:26  tamches
6  * removed blt-ish influences
7  * sped up processing of new data callbacks
8  * very close now to dg2.C of barchart
9  *
10  * Revision 1.5  1994/09/30  21:03:07  newhall
11  * removed call to StartVisi
12  *
13  * Revision 1.4  1994/09/25  02:07:47  newhall
14  * changed arguments to GetMetsRes
15  *
16  * Revision 1.3  1994/08/05  20:17:10  rbi
17  * Update for new version of libvisi.a
18  *
19  * Revision 1.2  1994/06/14  18:57:47  rbi
20  * Updated layout and added curve validation callback.
21  *
22  * Revision 1.1  1994/05/31  21:05:47  rbi
23  * Initial version of tclVisi and tabVis
24  *
25  */
26 #include <stdlib.h>
27 #include <iostream.h>
28 #include <tcl.h>
29 #include <tk.h>
30 #include "../../../visi/h/visualization.h"
31
32 extern Tcl_Interp *MainInterp;
33
34 void my_visi_callback(void* arg0, int* arg1, long unsigned int* arg2) {
35     if (-1 == visi_callback())
36        exit(1);
37 }
38
39 int Dg_Add(int dummy) {
40    // Gets called by visi lib when it detects new METRICS and/or RESOURCES
41
42    const int retval = Tcl_Eval(MainInterp, "DgConfigCallback");
43    if (retval == TCL_ERROR)
44       cerr << MainInterp->result << endl;
45
46    return retval;
47 }
48
49 int Dg_Data(int lastBucket) {
50    // New data has arrived.
51    // We are passed the bucket number.  We can grab data for all current
52    // metric/resource pairs and do something.
53
54    // Here, we just invoke the tcl script "DgDataCallback", passing lastBucket
55
56    char buffer[100];
57    sprintf(buffer, "DgDataCallback %d", lastBucket);
58    const int retval = Tcl_Eval(MainInterp, buffer);
59    if (retval == TCL_ERROR)
60       cerr << MainInterp->result << endl;
61
62    return retval;
63 }
64
65 int Dg_Fold(int dummy) {
66    const int retval=Tcl_Eval(MainInterp, "DgFoldCallback");
67    if (retval == TCL_ERROR)
68       cerr << MainInterp->result << endl;
69
70    return retval;
71 }
72
73 int Dg_Invalid(int dummy) {
74    const int retval=Tcl_Eval(MainInterp, "DgInvalidCallback");
75    if (retval == TCL_ERROR)
76       cerr << MainInterp->result << endl;
77
78    return retval;
79 }
80
81 int Dg_Phase(int dummy) {
82    const int retval=Tcl_Eval(MainInterp, "DgPhaseCallback");
83    if (retval == TCL_ERROR)
84       cerr << MainInterp->result << endl;
85
86   return retval;
87 }
88
89 #define   AGGREGATE        0
90 #define   BINWIDTH         1
91 #define   FOLDMETHOD       2
92 #define   METRICNAME       3
93 #define   METRICUNITS      4
94 #define   NUMBINS          5
95 #define   NUMMETRICS       6
96 #define   NUMRESOURCES     7
97 #define   DEFINEPHASE      8
98 #define   RESOURCENAME     9
99 #define   STARTSTREAM      10
100 #define   STOPSTREAM       11
101 #define   DGSUM            12
102 #define   DGVALID          13
103 #define   DGENABLED        14
104 #define   VALUE            15
105 #define   CMDERROR         16
106 #define   LASTBUCKET       17
107 #define   FIRSTBUCKET      18
108
109 struct cmdTabEntry {
110    char *cmdname;
111    int index;
112    int numargs;
113 };
114
115 static struct cmdTabEntry Dg_Cmds[] = {
116   {"aggregate",    AGGREGATE,       2},
117   {"binwidth",     BINWIDTH,        0},
118   {"firstbucket",  FIRSTBUCKET,     2},
119   {"foldmethod",   FOLDMETHOD,      2},
120   {"lastbucket",   LASTBUCKET,      2},
121   {"metricname",   METRICNAME,      1},
122   {"metricunits",  METRICUNITS,     1},
123   {"numbins",      NUMBINS,         0},
124   {"nummetrics",   NUMMETRICS,      0},
125   {"numresources", NUMRESOURCES,    0},
126   {"phase",        DEFINEPHASE,     3},
127   {"resourcename", RESOURCENAME,    1},
128   {"start",        STARTSTREAM,     2},
129   {"stop",         STOPSTREAM,      2},
130   {"sum",          DGSUM,           2},
131   {"valid",        DGVALID,         2},
132   {"enabled",      DGENABLED,       2},
133   {"value",        VALUE,           3},
134   {NULL,           CMDERROR,        0}
135 };
136
137 int findCommand(Tcl_Interp *interp, 
138                 int argc, char *argv[]) {
139   if (argc == 0) {
140     sprintf(interp->result, "USAGE: Dg <option> [args...]\n");
141     return CMDERROR;
142   }
143   for (cmdTabEntry *C = Dg_Cmds; C->cmdname; C++) {
144     if (strcmp(argv[0], C->cmdname) == 0) {
145       if ((argc-1) == C->numargs) 
146         return C->index; // successful parsing
147
148       sprintf(interp->result, 
149               "%s: wrong number of args (%d). Should be %d\n",
150               argv[0], argc-1, C->numargs);
151       return CMDERROR;
152     }
153   }
154
155   sprintf(interp->result, "unknown option (%s)\n", argv[0]);
156   return CMDERROR;
157 }
158
159 int Dg_TclCommand(ClientData clientData,
160                   Tcl_Interp *interp, 
161                   int argc, 
162                   char *argv[]) {
163   const int cmdDex = findCommand(interp, argc-1, argv+1);
164   if (cmdDex == CMDERROR)
165      return TCL_ERROR;
166
167   int m, r, buck;
168
169   switch(cmdDex) {
170   case AGGREGATE:   
171     m = atoi(argv[2]);
172     r = atoi(argv[3]);
173     sprintf(interp->result,"%g", dataGrid.AggregateValue(m,r));
174     return TCL_OK;
175
176   case BINWIDTH:     
177     sprintf(interp->result, "%g", dataGrid.BinWidth());
178     return TCL_OK;
179
180   case FIRSTBUCKET:
181     m = atoi(argv[2]);
182     r = atoi(argv[3]);
183     sprintf(interp->result,"%d", dataGrid[m][r].FirstValidBucket()); 
184     return TCL_OK;
185
186   case FOLDMETHOD:
187     m = atoi(argv[2]);
188     sprintf(interp->result,"%d", dataGrid.FoldMethod(m));
189     return TCL_OK;
190
191   case LASTBUCKET:
192     m = atoi(argv[2]);
193     r = atoi(argv[3]);
194     sprintf(interp->result,"%d", dataGrid[m][r].LastBucketFilled());
195     return TCL_OK;
196
197   case METRICNAME:  
198     m = atoi(argv[2]);
199     sprintf(interp->result, "%s", dataGrid.MetricName(m));
200     return TCL_OK;
201
202   case METRICUNITS:  
203     m = atoi(argv[2]);
204     sprintf(interp->result, "%s", dataGrid.MetricUnits(m));
205     return TCL_OK;
206
207   case NUMBINS:     
208     sprintf(interp->result, "%d", dataGrid.NumBins());
209     return TCL_OK;
210
211   case NUMMETRICS:  
212     sprintf(interp->result, "%d", dataGrid.NumMetrics());
213     return TCL_OK;
214
215   case NUMRESOURCES:
216     sprintf(interp->result, "%d", dataGrid.NumResources());
217     return TCL_OK;
218
219   case DEFINEPHASE:       
220     NamePhase(atof(argv[2]), atof(argv[3]), argv[4]);
221     return TCL_OK;
222
223   case RESOURCENAME:
224     r = atoi(argv[2]);
225     sprintf(interp->result, "%s", dataGrid.ResourceName(r));
226     return TCL_OK;
227
228   case STARTSTREAM:       
229     // GetMetsRes(argv[2], argv[3], 0); 
230 //    GetMetsRes((char *)NULL,0, 0); 
231     GetMetsRes(argv[2], atoi(argv[3]), 0); // 0-->histogram (1-->scalar)
232                                            // argv[3] is num
233     return TCL_OK;
234
235   case STOPSTREAM:
236     m = atoi(argv[2]);
237     r = atoi(argv[3]);
238     StopMetRes(m, r);
239     return TCL_OK;
240
241   case DGSUM:         
242     m = atoi(argv[2]);
243     r = atoi(argv[3]);
244     sprintf(interp->result,"%g", dataGrid.SumValue(m,r));
245     return TCL_OK;
246
247   case DGVALID:
248     m = atoi(argv[2]);
249     r = atoi(argv[3]);
250     sprintf(interp->result, "%d", dataGrid.Valid(m,r));
251     return TCL_OK;
252
253   case DGENABLED:
254     m = atoi(argv[2]);
255     r = atoi(argv[3]);
256     sprintf(interp->result, "%d", dataGrid[m][r].Enabled());
257     return TCL_OK;
258
259   case VALUE:       
260     m = atoi(argv[2]);
261     r = atoi(argv[3]);
262     buck = atoi(argv[4]);
263     sprintf(interp->result,"%g", dataGrid[m][r].Value(buck));
264     return TCL_OK;
265   }
266
267   sprintf(interp->result, "Internal error (func findCommand)\n");
268   return TCL_ERROR;
269 }
270
271 int Dg_Init(Tcl_Interp *interp) {
272    int fd=VisiInit();
273    if (fd < 0) {
274       cerr << "tclVisi: could not initialize visilib" << endl;
275       exit(-1);
276    }
277
278   (void) RegistrationCallback(ADDMETRICSRESOURCES,Dg_Add); 
279   (void) RegistrationCallback(DATAVALUES,Dg_Data); 
280   (void) RegistrationCallback(FOLD,Dg_Fold); 
281   (void) RegistrationCallback(INVALIDMETRICSRESOURCES,Dg_Invalid);
282   (void) RegistrationCallback(PHASENAME,Dg_Phase);
283
284   Tcl_CreateCommand(interp, "Dg", Dg_TclCommand, 
285                     (ClientData *) NULL,(Tcl_CmdDeleteProc *) NULL);
286  
287   // Arrange for my_visi_callback() to be called whenever data is waiting
288   // to be read off of descriptor "fd".  Extremely important! [tcl book
289   // page 357]
290   Tk_CreateFileHandler(fd, TK_READABLE, (Tk_FileProc *) my_visi_callback, 0);
291
292   return TCL_OK;
293 }
294
295