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