Initial version of tclVisi and tabVis
[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.1  1994/05/31 21:05:47  rbi
6  * Initial version of tclVisi and tabVis
7  *
8  */
9 #include <stdlib.h>
10 #include <tcl.h>
11 #include <tk.h>
12 #include "visi/h/visualization.h"
13
14 extern Tcl_Interp *MainInterp;
15
16 int Dg_Add(int dummy) {
17
18   Tcl_Eval(MainInterp, "DgConfigCallback");
19   return(0);
20 }
21
22 int Dg_Data(int dummy) {
23
24   Tcl_Eval(MainInterp, "DgDataCallback");
25   return(0);
26 }
27
28 int Dg_Fold(int dummy) {
29
30   Tcl_Eval(MainInterp, "DgFoldCallback");
31   return(0);
32 }
33
34 int Dg_Invalid(int dummy) {
35
36   Tcl_Eval(MainInterp, "DgInvalidateCallback");
37   return(0);
38 }
39
40 int Dg_New(int dummy) {
41
42   Tcl_Eval(MainInterp, "DgConfigCallback");
43   return(0);
44 }
45
46 int Dg_Phase(int dummy) {
47
48   Tcl_Eval(MainInterp, "DgPhaseCallback");
49   return(0);
50 }
51
52 #define   AGGREGATE        0
53 #define   BINWIDTH         1
54 #define   FOLDMETHOD       2
55 #define   METRICNAME       3
56 #define   METRICUNITS      4
57 #define   NUMBINS          5
58 #define   NUMMETRICS       6
59 #define   NUMRESOURCES     7
60 #define   DEFINEPHASE      8
61 #define   RESOURCENAME     9
62 #define   STARTSTREAM      10
63 #define   STOPSTREAM       11
64 #define   DGSUM            12
65 #define   DGVALID            13
66 #define   VALUE            14
67 #define   CMDERROR         15
68 #define   LASTBUCKET       16
69
70 struct cmdTabEntry 
71 {
72   char *cmdname;
73   int index;
74   int numargs;
75 };
76
77 static struct cmdTabEntry Dg_Cmds[] = {
78   {"aggregate",    AGGREGATE,       2},
79   {"binwidth",     BINWIDTH,        0},
80   {"foldmethod",   FOLDMETHOD,      2},
81   {"lastbucket",   LASTBUCKET,      2},
82   {"metricname",   METRICNAME,      1},
83   {"metricunits",  METRICUNITS,     1},
84   {"numbins",      NUMBINS,         0},
85   {"nummetrics",   NUMMETRICS,      0},
86   {"numresources", NUMRESOURCES,    0},
87   {"phase",        DEFINEPHASE,     3},
88   {"resourcename", RESOURCENAME,    1},
89   {"start",        STARTSTREAM,     2},
90   {"stop",         STOPSTREAM,      2},
91   {"sum",          DGSUM,           2},
92   {"valid",        DGVALID,         2},
93   {"value",        VALUE,           3},
94   {NULL,           CMDERROR,        0}
95 };
96
97 static int findCommand(Tcl_Interp *interp, 
98                        int argc, 
99                        char *argv[])
100 {
101   struct cmdTabEntry *C;
102
103   if (argc == 0) {
104     sprintf(interp->result, "USAGE: Dg <option> [args...]\n");
105     return CMDERROR;
106   }
107   for (C = Dg_Cmds; C->cmdname; C++) {
108     if (strcmp(argv[0], C->cmdname) == 0) {
109       if ((argc-1) == C->numargs) 
110         return C->index;
111       sprintf(interp->result, 
112               "%s: wrong number of args (%d). Should be %d\n",
113               argv[0], argc-1, C->numargs);
114       return CMDERROR;
115     }
116   }
117
118   sprintf(interp->result, "unknown option (%s)\n", argv[0]);
119   return CMDERROR;
120 }
121
122 int Dg_TclCommand(ClientData clientData,
123                Tcl_Interp *interp, 
124                int argc, 
125                char *argv[])
126 {
127   int cmdDex, m, r, buck;
128
129   cmdDex = findCommand(interp, argc-1, argv+1);
130   if (cmdDex == CMDERROR) {
131     return TCL_ERROR;
132   }
133
134   switch(cmdDex) {
135   case AGGREGATE:   
136     m = atoi(argv[2]);
137     r = atoi(argv[3]);
138     sprintf(interp->result,"%g", dataGrid.AggregateValue(m,r));
139     return TCL_OK;
140
141   case BINWIDTH:     
142     sprintf(interp->result, "%g", dataGrid.BinWidth());
143     return TCL_OK;
144
145   case FOLDMETHOD:
146     m = atoi(argv[2]);
147     sprintf(interp->result,"%d", dataGrid.FoldMethod(m));
148     return TCL_OK;
149
150   case LASTBUCKET:
151     m = atoi(argv[2]);
152     r = atoi(argv[3]);
153     sprintf(interp->result,"%d", dataGrid[m][r].LastBucketFilled());
154     return TCL_OK;
155
156   case METRICNAME:  
157     m = atoi(argv[2]);
158     sprintf(interp->result, "%s", dataGrid.MetricName(m));
159     return TCL_OK;
160
161   case METRICUNITS:  
162     m = atoi(argv[2]);
163     sprintf(interp->result, "%s", dataGrid.MetricUnits(m));
164     return TCL_OK;
165
166   case NUMBINS:     
167     sprintf(interp->result, "%d", dataGrid.NumBins());
168     return TCL_OK;
169
170   case NUMMETRICS:  
171     sprintf(interp->result, "%d", dataGrid.NumMetrics());
172     return TCL_OK;
173
174   case NUMRESOURCES:
175     sprintf(interp->result, "%d", dataGrid.NumResources());
176     return TCL_OK;
177
178   case DEFINEPHASE:       
179     NamePhase(atof(argv[2]), atof(argv[3]), argv[4]);
180     return TCL_OK;
181
182   case RESOURCENAME:
183     r = atoi(argv[2]);
184     sprintf(interp->result, "%s", dataGrid.ResourceName(r));
185     return TCL_OK;
186
187   case STARTSTREAM:       
188     GetMetsRes(argv[2], argv[3], 0);
189     return TCL_OK;
190
191   case STOPSTREAM:
192     m = atoi(argv[2]);
193     r = atoi(argv[3]);
194     StopMetRes(m, r);
195     return TCL_OK;
196
197   case DGSUM:         
198     m = atoi(argv[2]);
199     r = atoi(argv[3]);
200     sprintf(interp->result,"%g", dataGrid.SumValue(m,r));
201     return TCL_OK;
202
203   case DGVALID:
204     m = atoi(argv[2]);
205     r = atoi(argv[3]);
206     sprintf(interp->result, "%d", dataGrid.Valid(m,r));
207     return TCL_OK;
208
209   case VALUE:       
210     m = atoi(argv[2]);
211     r = atoi(argv[3]);
212     buck = atoi(argv[4]);
213     sprintf(interp->result,"%g", dataGrid[m][r].Value(buck));
214     return TCL_OK;
215   }
216
217   sprintf(interp->result, "Internal error (func findCommand)\n");
218   return TCL_ERROR;
219 }
220
221 static void
222 my_visi_callback(void* arg0, int* arg1, long unsigned int* arg2)
223 {
224     int ret;
225
226     ret = visi_callback();
227     if (ret == -1) exit(0);
228 }
229
230 int 
231 Dg_Init(Tcl_Interp *interp)
232 {
233   int fd;
234
235   /* Initialize visualization module */
236   if((fd = VisiInit()) < 0){
237     exit(-1);
238   }
239   (void) RegistrationCallback(ADDMETRICSRESOURCES,Dg_Add); 
240   (void) RegistrationCallback(DATAVALUES,Dg_Data); 
241   (void) RegistrationCallback(FOLD,Dg_Fold); 
242   (void) RegistrationCallback(INVALIDMETRICSRESOURCES,Dg_Invalid);
243   (void) RegistrationCallback(NEWMETRICSRESOURCES,Dg_New);
244   (void) RegistrationCallback(PHASENAME,Dg_Phase);
245   (void) StartVisi(0,0);
246
247   Tcl_CreateCommand(interp, "Dg", Dg_TclCommand, 
248                     (ClientData *) NULL,(Tcl_CmdDeleteProc *) NULL);
249  
250   Tk_CreateFileHandler(fd, TK_READABLE, (Tk_FileProc *) my_visi_callback, 0);
251
252   return TCL_OK;
253 }
254
255