00001
00002
00003
00004
00005
00006
00007 #ifndef TINKERKNOBS_H
00008 #define TINKERKNOBS_H
00009
00010 #include "TinkerHash.H"
00011
00012 #include <stdio.h>
00013 #include <stdlib.h>
00014 #include <ctype.h>
00015
00016 #define KNOB_TRUE ((char) 1)
00017 #define KNOB_FALSE ((char) 0)
00018
00019 #define DEFAULT_KNOBTABLE_SIZE (64)
00020 typedef char* knobstring;
00021
00022 class knobnamelist
00023 {
00024 friend class knobs;
00025
00026 char *name;
00027 class knobnamelist *next;
00028
00029 knobnamelist (char *n)
00030 {
00031 name = new char [strlen (n) + 1];
00032 strcpy (name, n);
00033 next = NULL;
00034 }
00035 ~knobnamelist() {delete[] name; delete next;}
00036 };
00037
00038 class knobs
00039 {
00040 char *customknobfile;
00041 hashtable *t;
00042 knobnamelist *names;
00043
00044 char *curfname;
00045 char *defaultpanel;
00046
00047 public:
00048 knobs (char *customk = NULL)
00049 {
00050 char *commonknobs = getenv ("TINKERKNOBS");
00051 if (commonknobs == NULL)
00052 {
00053 fprintf (stderr, "***Tinker Knobs Error***\n"
00054 "Please set the environment variable TINKERKNOBS to the full pathname of\n"
00055 "the common Tinker knob file, e.g.:\n"
00056 "setenv TINKERKNOBS /ncsu/tinker/tools/LEGO/knobs.txt\n\n");
00057 exit(1);
00058 }
00059
00060 t = new hashtable(DEFAULT_KNOBTABLE_SIZE);
00061 names = NULL;
00062 (void) Load (commonknobs);
00063 if (customk != NULL)
00064 {
00065 customknobfile = new char [strlen (customk) + 1];
00066 strcpy (customknobfile, customk);
00067 }
00068 else
00069 {
00070 customk = getenv ("MYTINKERKNOBS");
00071 if (customk != NULL)
00072 {
00073 customknobfile = new char [strlen (customk) + 1];
00074 strcpy (customknobfile, customk);
00075 }
00076 else
00077 customknobfile = NULL;
00078 }
00079
00080 if (customknobfile != NULL)
00081 (void) Load (customknobfile);
00082 curfname = NULL;
00083 defaultpanel = NULL;
00084 }
00085 ~knobs()
00086 {
00087 delete[] customknobfile; delete t; delete names; delete defaultpanel;
00088 }
00089
00090 char *GetDefaultPanel (void) { return defaultpanel; }
00091 void SetDefaultPanel (char *dp)
00092 {
00093 delete[] defaultpanel;
00094 defaultpanel = new char [strlen (dp) + 1];
00095 strcpy (defaultpanel, dp);
00096 return;
00097 }
00098
00099 int Load (char *);
00100 int Load (FILE *);
00101
00102 char Read (char *knobname, char &d)
00103 {
00104 char *pk;
00105
00106 d = '\0';
00107 if (strchr (knobname, ':') == NULL)
00108 {
00109 if (defaultpanel == NULL)
00110 {
00111 fprintf (stderr, "No default panel specified for knob %s.\n",
00112 knobname);
00113 exit(1);
00114 }
00115 pk = new char [strlen (defaultpanel) + strlen (knobname) + 2];
00116 sprintf (pk, "%s:%s", defaultpanel, knobname);
00117 t->Lookup (pk, d);
00118 delete[] pk;
00119 return d;
00120 }
00121 else
00122 return t->Lookup (knobname, d);
00123 }
00124 int Read (char *knobname, int &d)
00125 {
00126 char *pk;
00127
00128 d = 0;
00129 if (strchr (knobname, ':') == NULL)
00130 {
00131 if (defaultpanel == NULL)
00132 {
00133 fprintf (stderr, "No default panel specified for knob %s.\n",
00134 knobname);
00135 exit(1);
00136 }
00137 pk = new char [strlen (defaultpanel) + strlen (knobname) + 2];
00138 sprintf (pk, "%s:%s", defaultpanel, knobname);
00139 t->Lookup (pk, d);
00140 delete[] pk;
00141 return d;
00142 }
00143 else
00144 return t->Lookup (knobname, d);
00145 }
00146 double Read (char *knobname, double &d)
00147 {
00148 char *pk;
00149
00150 d = 0.0;
00151 if (strchr (knobname, ':') == NULL)
00152 {
00153 if (defaultpanel == NULL)
00154 {
00155 fprintf (stderr, "No default panel specified for knob %s.\n",
00156 knobname);
00157 exit(1);
00158 }
00159 pk = new char [strlen (defaultpanel) + strlen (knobname) + 2];
00160 sprintf (pk, "%s:%s", defaultpanel, knobname);
00161 t->Lookup (pk, d);
00162 delete[] pk;
00163 return d;
00164 }
00165 else
00166 return t->Lookup (knobname, d);
00167 }
00168 knobstring Read (char *knobname, knobstring &d)
00169 {
00170 char *pk;
00171
00172 d = NULL;
00173 if (strchr (knobname, ':') == NULL)
00174 {
00175 if (defaultpanel == NULL)
00176 {
00177 fprintf (stderr, "No default panel specified for knob %s.\n",
00178 knobname);
00179 exit(1);
00180 }
00181 pk = new char [strlen (defaultpanel) + strlen (knobname) + 2];
00182 sprintf (pk, "%s:%s", defaultpanel, knobname);
00183 t->Lookup (pk, (tinkerhash_pvoid &) d);
00184 delete[] pk;
00185 return (knobstring) d;
00186 }
00187 else
00188 return (knobstring) t->Lookup (knobname, (tinkerhash_pvoid &) d);
00189 }
00190
00191 void Adjust (char *knobname, char d)
00192 {
00193 char *pk;
00194
00195 if (strchr (knobname, ':') == NULL)
00196 {
00197 if (defaultpanel == NULL)
00198 {
00199 fprintf (stderr, "No default panel specified for knob %s.\n",
00200 knobname);
00201 exit(1);
00202 }
00203 pk = new char [strlen (defaultpanel) + strlen (knobname) + 2];
00204 sprintf (pk, "%s:%s", defaultpanel, knobname);
00205 t->Set (pk, d);
00206 delete[] pk;
00207 return;
00208 }
00209 else
00210 t->Set (knobname, d);
00211 }
00212 void Adjust (char *knobname, int d)
00213 {
00214 char *pk;
00215
00216 if (strchr (knobname, ':') == NULL)
00217 {
00218 if (defaultpanel == NULL)
00219 {
00220 fprintf (stderr, "No default panel specified for knob %s.\n",
00221 knobname);
00222 exit(1);
00223 }
00224 pk = new char [strlen (defaultpanel) + strlen (knobname) + 2];
00225 sprintf (pk, "%s:%s", defaultpanel, knobname);
00226 t->Set (pk, d);
00227 delete[] pk;
00228 return;
00229 }
00230 else
00231 t->Set (knobname, d);
00232 }
00233 void Adjust (char *knobname, double d)
00234 {
00235 char *pk;
00236
00237 if (strchr (knobname, ':') == NULL)
00238 {
00239 if (defaultpanel == NULL)
00240 {
00241 fprintf (stderr, "No default panel specified for knob %s.\n",
00242 knobname);
00243 exit(1);
00244 }
00245 pk = new char [strlen (defaultpanel) + strlen (knobname) + 2];
00246 sprintf (pk, "%s:%s", defaultpanel, knobname);
00247 t->Set (pk, d);
00248 delete[] pk;
00249 return;
00250 }
00251 else
00252 t->Set (knobname, d);
00253 }
00254 void Adjust (char *knobname, tinkerhash_pvoid d)
00255 {
00256 char *pk;
00257
00258 if (strchr (knobname, ':') == NULL)
00259 {
00260 if (defaultpanel == NULL)
00261 {
00262 fprintf (stderr, "No default panel specified for knob %s.\n",
00263 knobname);
00264 exit(1);
00265 }
00266 pk = new char [strlen (defaultpanel) + strlen (knobname) + 2];
00267 sprintf (pk, "%s:%s", defaultpanel, knobname);
00268 t->Set (pk, d);
00269 delete[] pk;
00270 return;
00271 }
00272 else
00273 t->Set (knobname, d);
00274 }
00275
00276 int Save (char *);
00277 int Save (FILE *);
00278 int Parse (int, char *[]);
00279
00280 };
00281
00282 #endif