changes due to visiLib interface changes
[dyninst.git] / visiClients / tableVisi / src / dg2.C
1 // dg2.C
2 // implementation of the "Dg" tcl command
3
4 /*
5  * $Log: dg2.C,v $
6  * Revision 1.4  1996/01/19 20:56:18  newhall
7  * changes due to visiLib interface changes
8  *
9  * Revision 1.3  1996/01/17 18:31:36  newhall
10  * changes due to new visiLib
11  *
12  * Revision 1.2  1995/11/08  21:45:56  tamches
13  * specialized s.t. only the implementation of the "Dg" tcl command is here
14  *
15  * Revision 1.1  1995/11/04 00:44:11  tamches
16  * First version of new table visi
17  *
18  */
19
20 #include <stdlib.h> // exit()
21 #include <iostream.h>
22
23 #include "tclclean.h"
24 #include "tkclean.h"
25 #include "tkTools.h"
26
27 #include "tableVisiTcl.h"
28
29 #include "visi/h/visualization.h"
30 #include "dg2.h"
31
32 #define   AGGREGATE        0
33 #define   BINWIDTH         1
34 #define   FOLDMETHOD       2
35 #define   METRICNAME       3
36 #define   METRICUNITS      4
37 #define   NUMBINS          5
38 #define   NUMMETRICS       6
39 #define   NUMRESOURCES     7
40 #define   DEFINEPHASE      8
41 #define   RESOURCENAME     9
42 #define   STARTSTREAM      10
43 #define   STOPSTREAM       11
44 #define   DGSUM            12
45 #define   DGVALID          13
46 #define   DGENABLED        14
47 #define   VALUE            15
48 #define   CMDERROR         16
49 #define   LASTBUCKET       17
50 #define   FIRSTBUCKET      18
51
52 struct cmdTabEntry {
53    const char *cmdname;
54    int index;
55    int numargs;
56 };
57
58 static struct cmdTabEntry Dg_Cmds[] = {
59   {"aggregate",    AGGREGATE,       2},
60   {"binwidth",     BINWIDTH,        0},
61   {"firstbucket",  FIRSTBUCKET,     2},
62   {"foldmethod",   FOLDMETHOD,      2},
63   {"lastbucket",   LASTBUCKET,      2},
64   {"metricname",   METRICNAME,      1},
65   {"metricunits",  METRICUNITS,     1},
66   {"numbins",      NUMBINS,         0},
67   {"nummetrics",   NUMMETRICS,      0},
68   {"numresources", NUMRESOURCES,    0},
69   {"phase",        DEFINEPHASE,     3},
70   {"resourcename", RESOURCENAME,    1},
71   {"start",        STARTSTREAM,     2},
72   {"stop",         STOPSTREAM,      2},
73   {"sum",          DGSUM,           2},
74   {"valid",        DGVALID,         2},
75   {"enabled",      DGENABLED,       2},
76   {"value",        VALUE,           3},
77   {NULL,           CMDERROR,        0}
78 };
79
80 int findCommand(Tcl_Interp *interp, 
81                        int argc, 
82                        char *argv[]) {
83
84   if (argc == 0) {
85      sprintf(interp->result, "USAGE: Dg <option> [args...]\n");
86      return CMDERROR;
87   }
88
89   for (cmdTabEntry *C = Dg_Cmds; C->cmdname!=NULL; C++) {
90      if (strcmp(argv[0], C->cmdname) == 0) {
91         if (argc-1 == C->numargs) 
92            return C->index; // successful parsing
93
94         sprintf(interp->result, 
95               "%s: wrong number of args (%d). Should be %d\n",
96               argv[0], argc-1, C->numargs);
97         return CMDERROR;
98      }
99   }
100
101   sprintf(interp->result, "unknown option (%s)\n", argv[0]);
102   return CMDERROR;
103 }
104
105 int Dg_TclCommand(ClientData, Tcl_Interp *interp, 
106                   int argc, char *argv[]) {
107   // entrypoint to the tcl "Dg" command we've installed
108   // all the sprintf()'s are rather slow...
109
110   // parse the arguments, using global vrble Dg_Cmds[] to tell what's what.
111   int cmdDex = findCommand(interp, argc-1, argv+1);
112   if (cmdDex == CMDERROR)
113     return TCL_ERROR;
114
115   int m, r, buck; // metric number, resource number, bucket number
116
117   switch(cmdDex) {
118   case AGGREGATE:   
119     m = atoi(argv[2]);
120     r = atoi(argv[3]);
121     sprintf(interp->result,"%g", visi_AverageValue(m,r));
122     return TCL_OK;
123
124   case BINWIDTH:     
125     sprintf(interp->result, "%g", visi_BucketWidth());
126     return TCL_OK;
127
128   case FIRSTBUCKET:
129     m = atoi(argv[2]);
130     r = atoi(argv[3]);
131     sprintf(interp->result,"%d", visi_FirstValidBucket(m,r)); 
132     return TCL_OK;
133
134   case LASTBUCKET:
135     m = atoi(argv[2]);
136     r = atoi(argv[3]);
137     sprintf(interp->result,"%d", visi_LastBucketFilled(m,r));
138     return TCL_OK;
139
140   case METRICNAME:  
141     m = atoi(argv[2]);
142     sprintf(interp->result, "%s", visi_MetricName(m));
143     return TCL_OK;
144
145   case METRICUNITS:  
146     m = atoi(argv[2]);
147     sprintf(interp->result, "%s", visi_MetricUnits(m));
148     return TCL_OK;
149
150   case NUMBINS:     
151     sprintf(interp->result, "%d", visi_NumBuckets());
152     return TCL_OK;
153
154   case NUMMETRICS:  
155     sprintf(interp->result, "%d", visi_NumMetrics());
156     return TCL_OK;
157
158   case NUMRESOURCES:
159     sprintf(interp->result, "%d", visi_NumResources());
160     return TCL_OK;
161
162   case DEFINEPHASE:       
163     visi_DefinePhase(NULL);
164     return TCL_OK;
165
166   case RESOURCENAME:
167     r = atoi(argv[2]);
168     sprintf(interp->result, "%s", visi_ResourceName(r));
169     return TCL_OK;
170
171   case STARTSTREAM:       
172     visi_GetMetsRes(argv[2], atoi(argv[3]));
173     return TCL_OK;
174
175   case STOPSTREAM:
176     m = atoi(argv[2]);
177     r = atoi(argv[3]);
178     visi_StopMetRes(m, r);
179     return TCL_OK;
180
181   case DGSUM:         
182     m = atoi(argv[2]);
183     r = atoi(argv[3]);
184     sprintf(interp->result,"%g", visi_SumValue(m,r));
185     return TCL_OK;
186
187   case DGVALID:
188     m = atoi(argv[2]);
189     r = atoi(argv[3]);
190     sprintf(interp->result, "%d", visi_Valid(m,r));
191     return TCL_OK;
192
193   case DGENABLED:
194     m = atoi(argv[2]);
195     r = atoi(argv[3]);
196     sprintf(interp->result, "%d", visi_Enabled(m,r));
197     return TCL_OK;
198
199   case VALUE:       
200     m = atoi(argv[2]);
201     r = atoi(argv[3]);
202     buck = atoi(argv[4]);
203     sprintf(interp->result,"%g", visi_DataValue(m,r,buck));
204     return TCL_OK;
205   }
206
207   sprintf(interp->result, "Internal error (func findCommand)\n");
208   return TCL_ERROR;
209 }
210
211 int Dg2_Init(Tcl_Interp *interp) {
212    Tcl_CreateCommand(interp, "Dg", Dg_TclCommand, 
213                     (ClientData *) NULL,(Tcl_CmdDeleteProc *) NULL);
214  
215    return TCL_OK;
216 }