00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
#include <config.h>
00070
00071
#include <stdio.h>
00072
#include <string.h>
00073
#include <stdarg.h>
00074
#include <blah.h>
00075
#include "cdg.h"
00076
#include "hook.h"
00077
#include "gls.h"
00078
#include "set.h"
00079
#include "write.h"
00080
00081
00082
00083
00084
00085
00086
00087
00088 Vector
hkHooks =
NULL;
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 unsigned long int hkVerbosity =
CDG_DEFAULT |
CDG_ERROR |
CDG_INFO |
CDG_WARNING |
CDG_SEARCHRESULT;
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113 Boolean
hkValidate(String name, String value, Boolean *var)
00114 {
00115
if (!var) {
00116
return FALSE;
00117 }
00118
00119
if (strcmp(name,
"xml") == 0) {
00120
if ((strcmp(value,
"on") == 0 && *var ==
TRUE) ||
00121 (strcmp(value,
"off") == 0 && *var ==
FALSE)) {
00122
return TRUE;
00123 }
00124 }
00125
00126
return FALSE;
00127 }
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 void hkCallback(String name, Boolean *var)
00142 {
00143
if (strcmp(name,
"xml") == 0) {
00144
if (*var) {
00145 writeXmlHeader();
00146 }
else {
00147 writeXmlEndAll();
00148 }
00149 }
00150 }
00151
00152
00153
00154
00155
00156 void hkInitialize(
void)
00157 {
00158
Hook hook;
00159
00160
hkHooks = vectorNew(20);
00161
00162 hook = (
HookStruct *)memMalloc(
sizeof(
HookStruct));
00163 hook->
count = 0;
00164 hook->
name =
"printf";
00165 hook->
active =
TRUE;
00166 hook->
function = (
HookFunction *)vprintf;
00167
00168 hook->
no =
HOOK_PRINTF;
00169 hook->
cmd =
NULL;
00170 vectorSetElement(
hkHooks, hook, hook->
no);
00171
00172 hook = (HookStruct *)memMalloc(
sizeof(HookStruct));
00173 hook->
count = 0;
00174 hook->
name =
"flush";
00175 hook->
active =
TRUE;
00176 hook->
function =
NULL;
00177 hook->
no =
HOOK_FLUSH;
00178 hook->
cmd =
NULL;
00179 vectorSetElement(
hkHooks, hook, hook->
no);
00180
00181 hook = (HookStruct *)memMalloc(
sizeof(HookStruct));
00182 hook->
count = 0;
00183 hook->
name =
"buildnodes";
00184 hook->
active =
FALSE;
00185 hook->
function =
NULL;
00186 hook->
no =
HOOK_CNBUILDNODES;
00187 hook->
cmd =
NULL;
00188 vectorSetElement(
hkHooks, hook, hook->
no);
00189
00190 hook = (HookStruct *)memMalloc(
sizeof(HookStruct));
00191 hook->
count = 0;
00192 hook->
name =
"eval";
00193 hook->
active =
FALSE;
00194 hook->
function =
NULL;
00195 hook->
no =
HOOK_EVAL;
00196 hook->
cmd =
NULL;
00197 vectorSetElement(
hkHooks, hook, hook->
no);
00198
00199 hook = (HookStruct *)memMalloc(
sizeof(HookStruct));
00200 hook->
count = 0;
00201 hook->
name =
"netsearch";
00202 hook->
active =
FALSE;
00203 hook->
function =
NULL;
00204 hook->
no =
HOOK_NSSEARCH;
00205 hook->
cmd =
NULL;
00206 vectorSetElement(
hkHooks, hook, hook->
no);
00207
00208 hook = (HookStruct *)memMalloc(
sizeof(HookStruct));
00209 hook->
count = 0;
00210 hook->
name =
"reset";
00211 hook->
active =
TRUE;
00212 hook->
function =
NULL;
00213 hook->
no =
HOOK_RESET;
00214 hook->
cmd =
NULL;
00215 vectorSetElement(
hkHooks, hook, hook->
no);
00216
00217 hook = (HookStruct *)memMalloc(
sizeof(HookStruct));
00218 hook->
count = 0;
00219 hook->
name =
"glsInteraction";
00220 hook->
active =
TRUE;
00221 hook->
function = glsInteraction;
00222 hook->
no =
HOOK_GLSINTERACTION;
00223 hook->
cmd =
NULL;
00224 vectorSetElement(
hkHooks, hook, hook->
no);
00225
00226 hook = (HookStruct *)memMalloc(
sizeof(HookStruct));
00227 hook->
count = 0;
00228 hook->
name =
"gets";
00229 hook->
active =
TRUE;
00230 hook->
function =
NULL;
00231 hook->
no =
HOOK_GETS;
00232 hook->
cmd =
NULL;
00233 vectorSetElement(
hkHooks, hook, hook->
no);
00234
00235 hook = (HookStruct *)memMalloc(
sizeof(HookStruct));
00236 hook->
count = 0;
00237 hook->
name =
"progress";
00238 hook->
active =
TRUE;
00239 hook->
function =
NULL;
00240 hook->
no =
HOOK_PROGRESS;
00241 hook->
cmd =
NULL;
00242 vectorSetElement(
hkHooks, hook, hook->
no);
00243
00244 hook = (HookStruct *)memMalloc(
sizeof(HookStruct));
00245 hook->
count = 0;
00246 hook->
name =
"partialresult";
00247 hook->
active =
TRUE;
00248 hook->
function =
NULL;
00249 hook->
no =
HOOK_PARTIALRESULT;
00250 hook->
cmd =
NULL;
00251 vectorSetElement(
hkHooks, hook, hook->
no);
00252
00253 hook = (HookStruct *)memMalloc(
sizeof(HookStruct));
00254 hook->
count = 0;
00255 hook->
name =
"IC interaction";
00256 hook->
active =
TRUE;
00257 hook->
function =
NULL;
00258 hook->
no =
HOOK_ICINTERACTION;
00259 hook->
cmd =
NULL;
00260 vectorSetElement(
hkHooks, hook, hook->
no);
00261
00262 setRegister(
"verbosity", SET_UNSLONG, &
hkVerbosity,
NULL,
NULL,
NULL,
00263
"on",
CDG_DEFAULT |
CDG_ERROR |
CDG_HINT |
CDG_INFO |
CDG_WARNING |
CDG_SEARCHRESULT,
00264
"off",
CDG_WARNING,
00265
NULL);
00266 setRegister(
"hint", SET_BIT, &
hkVerbosity,
NULL,
NULL,
NULL,
CDG_HINT,
NULL);
00267 setRegister(
"info", SET_BIT, &
hkVerbosity,
NULL,
NULL,
NULL,
CDG_INFO,
NULL);
00268 setRegister(
"debug", SET_BIT, &
hkVerbosity,
NULL,
NULL,
NULL,
CDG_DEBUG,
NULL);
00269 setRegister(
"error", SET_BIT, &
hkVerbosity,
NULL,
NULL,
NULL,
CDG_ERROR,
NULL);
00270 setRegister(
"warning", SET_BIT, &
hkVerbosity,
NULL,
NULL,
NULL,
CDG_WARNING,
NULL);
00271 setRegister(
"prolog", SET_BIT, &
hkVerbosity,
NULL,
NULL,
NULL,
CDG_PROLOG,
NULL);
00272 setRegister(
"searchresult", SET_BIT, &
hkVerbosity,
NULL,
NULL,
NULL,
CDG_SEARCHRESULT,
NULL);
00273 setRegister(
"eval", SET_BIT, &
hkVerbosity,
NULL,
NULL,
NULL,
CDG_EVAL,
NULL);
00274 setRegister(
"profile", SET_BIT, &
hkVerbosity,
NULL,
NULL,
NULL,
CDG_PROFILE,
NULL);
00275 setRegister(
"progress", SET_BIT, &
hkVerbosity,
NULL,
NULL,
NULL,
CDG_PROGRESS,
NULL);
00276 setRegister(
"xml", SET_BIT, &
hkVerbosity,
NULL,
hkValidate,
hkCallback,
CDG_XML,
NULL);
00277
00278 }
00279
00280
00281
00282
00283
00284
00285
00286 void hkFinalize(
void)
00287 {
00288
int i;
00289
for (i=0; i<vectorSize(
hkHooks); i++) {
00290 memFree(vectorElement(
hkHooks, i));
00291 }
00292 vectorDelete(
hkHooks);
00293 }
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306 void cdgExecHook(
int hookNo, ...)
00307 {
00308
#define DEBUG_CDGEXECHOOK 0
00309
va_list ap;
00310
Hook hook;
00311
00312
if (hookNo >= vectorSize(
hkHooks)) {
00313
cdgPrintf(
CDG_ERROR,
"ERROR: unknown hook `%d' called\n", hookNo);
00314
return;
00315 }
00316
00317 hook = (
Hook) vectorElement(
hkHooks, hookNo);
00318
#if DEBUG_CDGEXECHOOK
00319
printf(
"DEBUG: hook = %p\n", hook);
00320 printf(
" name = %s\n", hook->
name);
00321 printf(
" active = %d\n", hook->
active);
00322 printf(
" count = %ld\n", hook->
count);
00323 printf(
" function = %p\n", hook->
function);
00324
#endif
00325
if(hook->
active) {
00326 hook->
count++;
00327
if(hook->
function) {
00328 va_start(ap, hookNo);
00329 (hook->
function)(hook, ap);
00330 va_end(ap);
00331 }
else {
00332
00333 }
00334 }
00335
#if DEBUG_CDGEXECHOOK
00336
printf(
"DEBUG: done hook\n");
00337
#endif
00338
}
00339
00340
00341
00342
00343
00344
00345
00346
00347 int hkFindNoOfHook(String name)
00348 {
00349
int index;
00350
Hook hook;
00351 Boolean found;
00352
00353
for(index=0, found=
FALSE;
00354 index < vectorSize(
hkHooks) && !found;
00355 index++) {
00356
00357 hook = (
Hook)vectorElement(
hkHooks, index);
00358 found = (strcmp(hook->
name, name) == 0);
00359 }
00360
00361
return (found?index-1:-1);
00362 }
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375 void cdgGetString(String buffer,
int size) {
00376
00377
Hook hook;
00378
00379 hook = vectorElement(
hkHooks,
HOOK_GETS);
00380 hook->
count++;
00381
if(hook->
function) {
00382 (hook->
function)(hook, buffer, size);
00383 }
00384
else {
00385 fgets(buffer, size, stdin);
00386 }
00387 }
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403 void cdgPrintf(
int mode, String format, ...)
00404 {
00405 va_list ap;
00406
Hook hook;
00407
00408
if (
hkVerbosity & mode) {
00409 va_start(ap, format);
00410
00411
00412
if (mode &
CDG_PROGRESS) {
00413 hook = vectorElement(
hkHooks,
HOOK_PROGRESS);
00414 hook->
count++;
00415
00416
00417
if (hook->
function !=
NULL) {
00418 (hook->
function)(hook, format, ap);
00419 }
00420
00421
00422
else {
00423 hook = vectorElement(
hkHooks,
HOOK_PRINTF);
00424 (hook->
function) (format, ap);
00425 }
00426
00427
00428
cdgFlush();
00429
00430 }
else {
00431
00432
if (mode &
CDG_WARNING) {
00433 writeXmlVaNotification(
"warning", format, ap);
00434 }
else if (mode &
CDG_ERROR) {
00435 writeXmlVaNotification(
"error", format, ap);
00436 }
00437
00438 hook = vectorElement(
hkHooks,
HOOK_PRINTF);
00439 hook->
count++;
00440 (hook->
function) (format, ap);
00441 }
00442
00443 va_end(ap);
00444 }
00445 }
00446
00447
00448
00449
00450
00451
00452
00453
00454 void cdgFlush(
void)
00455 {
00456
Hook hook;
00457
00458 hook = vectorElement(
hkHooks,
HOOK_FLUSH);
00459 hook->
count++;
00460
if(hook->
function)
00461 (hook->
function)();
00462
else {
00463 fflush(stdout);
00464 }
00465
00466 writeXmlFlush();
00467 }
00468
00469
00470
00471
00472