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