Annotation of capa/capa51/GUITools/tcl2c-qz.c, revision 1.1
1.1 ! albertel 1: #include <tcl.h>
! 2: #include <stdio.h>
! 3:
! 4: #ifdef __cplusplus
! 5: extern C {
! 6: #endif
! 7:
! 8: extern void exit _ANSI_ARGS_((int status));
! 9: extern int isupper _ANSI_ARGS_((int ch));
! 10: extern int tolower _ANSI_ARGS_((int ch));
! 11:
! 12: #ifdef __cplusplus
! 13: }
! 14: #endif
! 15:
! 16: #define MAX_STRING_LEN 8192 /* give warning if string length exceeds this value */
! 17:
! 18: #ifdef NO_STRING_H
! 19: # include <strings.h>
! 20: # define strchr index
! 21: # define strrchr rindex
! 22: #else
! 23: # include <string.h>
! 24: #endif
! 25:
! 26: typedef struct tableitem {
! 27: char *package;/* corresponding packagename */
! 28: char *option; /* option expected */
! 29: int flag ; /* which packages are needed */
! 30: } tableitem;
! 31:
! 32: static tableitem table[] = {
! 33: {"Tcl" ,"-tcl" , 1},
! 34: {"Tk" ,"-tk" , 3},
! 35: {"Tclx" ,"-tclx" , 5},
! 36: {"Itcl" ,"-itcl" , 9},
! 37: {"Otcl" ,"-otcl" , 17}, /* not tested yet */
! 38: {"Pvm" ,"-pvm" , 33},
! 39: {"Tkx" ,"-tkx" , 71},
! 40: {"Itk" ,"-itk" , 139},
! 41: {"Iwidgets" ,"-iwidgets" , 395},
! 42: {"Img" ,"-img" ,515},
! 43: {"Tix" ,"-tix" ,1027}, /* not tested yet */
! 44: {"Blt" ,"-blt" ,2051}, /* not tested yet */
! 45: {"Vtcl" ,"-vtcl" ,4103}, /* not tested yet */
! 46: {"Quizzer", "-qz",8195},
! 47: {"Grader", "-gd", 16387},
! 48: {"Manager", "-mn", 32771},
! 49: {"Webpage", "-wb", 65537},
! 50: };
! 51:
! 52: static char *verbose = "\n\
! 53: *************************** tcl2c ********************************\n\
! 54: written by: Jan Nijtmans\n\
! 55: CMG (Computer Management Group) Arnhem B.V.\n\
! 56: email: nijtmans@worldaccess.nl (private)\n\
! 57: Jan.Nijtmans@cmg.nl (work)\n\
! 58: url: http://www.worldaccess.nl/~nijtmans/\n\n\
! 59: Modified by: Guy Albertelli \n\n\
! 60: usage: tcl2c -o file source1 source2 ... ?options?\n\
! 61: tcl2c -help\n\
! 62: ";
! 63:
! 64: static char *help = "\n\
! 65: available options:\n\
! 66: -a use character array instead of string for script\n\
! 67: -n script_name name of script variable\n\
! 68: -o filename output file (default is stdout)\n\
! 69: -tcl use Tcl\n\
! 70: -tclx use Tclx\n\
! 71: -otcl use Otcl (not tested yet)\n\
! 72: -pvm use tkPvm\n\
! 73: -tk use Tk\n\
! 74: -tkx use Tkx (not really useful)\n\
! 75: -img use Img\n\
! 76: -tix use Tix (not tested yet)\n\
! 77: -blt use Blt (not tested yet)\n\
! 78: -vtcl use Vtcl (not tested yet)\n\
! 79: -qz use Quizzer\n\
! 80: -gd use Grader\n\
! 81: Other command line arguments are assumed to be tcl script-files. It is \n\
! 82: possible to include C-files (with the extension .c), which are already\n\
! 83: converted tcl-scripts. These are included using the \"#include\".\n\n\
! 84: The output file can be compiled with any C or C++ compiler.\n\
! 85: ";
! 86:
! 87: static char *part1 = "\n\
! 88: /* This file is created by the \"tcl2c-qz\" utility, which is included in\n\
! 89: * most \"plus\"-patches (e.g. for Tcl7.6 and Tcl8.0). Standalone\n\
! 90: * executables can be made by providing alternative initialization\n\
! 91: * functions which don't read files any more. Sometimes, small\n\
! 92: * adaptations to the original libraries are needed to get the\n\
! 93: * application truly standalone. The \"plus\"-patches contain these\n\
! 94: * adaptations for Tcl and Tk. If you just create your own\n\
! 95: * Xxx_InitStandAlone() function for your package, you can\n\
! 96: * easyly extend the \"tcl2c\" utility to your own requirements.\n\
! 97: *\n\
! 98: * Jan Nijtmans\n\
! 99: * CMG (Computer Management Group) Arnhem B.V.\n\
! 100: * email: nijtmans@worldaccess.nl (private)\n\
! 101: * Jan.Nijtmans@cmg.nl (work)\n\
! 102: * url: http://www.worldaccess.nl/~nijtmans/\n\
! 103: */\n\
! 104: #include \"tcl.h\"\n\
! 105: #ifdef __WIN32__\n\
! 106: #define WIN32_LEAN_AND_MEAN\n\
! 107: #include <windows.h>\n\
! 108: #undef WIN32_LEAN_AND_MEAN\n\
! 109: #include <malloc.h>\n\
! 110: #include <locale.h>\n\
! 111: \n\
! 112: static int setargv _ANSI_ARGS_((char ***argvPtr));\n\
! 113: static void TclshPanic _ANSI_ARGS_(TCL_VARARGS(char *,format));\n\
! 114: extern void TclWinSetTclInstance(HINSTANCE instance);\n\
! 115: \n\
! 116: #endif\n\
! 117: \n\
! 118: /*\n\
! 119: * Defines to replace the standard Xxx_Init calls to Xxx_InitStandAlone.\n\
! 120: * If you don't have this function, just delete the corresponding\n\
! 121: * define such that the normal initialization function is used.\n\
! 122: * Similar: If SafeInit functions exists, you can use these\n\
! 123: * by commenting out the corresponding lines below.\n\
! 124: */\n\
! 125: \n\
! 126: #if defined(TCL_ACTIVE) && !defined(SHARED)\n\
! 127: ";
! 128:
! 129: static char *part2 = "#endif\n\
! 130: \n\
! 131: #if TCL_MAJOR_VERSION < 8\n\
! 132: ";
! 133:
! 134: static char *part3 = "\
! 135: #endif\n\
! 136: \n\
! 137: /*\n\
! 138: * Prototypes of all initialization functions and the free() function.\n\
! 139: * So, only \"tcl.h\" needs to be included now.\n\
! 140: */\n\
! 141: \n\
! 142: #ifdef __cplusplus\n\
! 143: extern \"C\" {\n\
! 144: #endif\n\
! 145: \n\
! 146: #ifndef USE_TCLALLOC\n\
! 147: # define USE_TCLALLOC 0\n\
! 148: #endif\n\
! 149: #if USE_TCLALLOC == 0\n\
! 150: extern void free _ANSI_ARGS_((void *));\n\
! 151: #endif\n\
! 152: extern int Tcl_Init _ANSI_ARGS_((Tcl_Interp *interp));\n\
! 153: \n\
! 154: ";
! 155:
! 156: static char *part3a = "\n\
! 157: extern void Tk_MainLoop _ANSI_ARGS_((void));\n\
! 158: #define HAS_TK\n\
! 159: #ifdef __WIN32__\n\
! 160: extern void TkWinXInit _ANSI_ARGS_((HINSTANCE hinstance));\n\
! 161: extern void TkWinXCleanup _ANSI_ARGS_((HINSTANCE hinstance));\n\
! 162: #endif\n\
! 163: \n\
! 164: ";
! 165:
! 166: static char *part4 = "\n\
! 167: \n\
! 168: #ifdef __cplusplus\n\
! 169: }\n\
! 170: #endif\n\
! 171: \n\
! 172: /*\n\
! 173: * The array \"%s\" contains the script that is compiled in.\n\
! 174: * It will be executed in tclAppInit() after the other initializations.\n\
! 175: */\n\
! 176: \n\
! 177: ";
! 178:
! 179: static char *part4a = "\
! 180: static char *lineformat = \"%%.0s%%d\";\n\
! 181: static int line = (__LINE__ + 1);\n\
! 182: ";
! 183:
! 184: static char *part4b = "\
! 185: static char *lineformat = \"%%s_line%%d\";\n\
! 186: static int line = 0;\n\
! 187: ";
! 188:
! 189: static char *part5 = "\
! 190: /*\n\
! 191: *----------------------------------------------------------------------\n\
! 192: *\n\
! 193: * main --\n\
! 194: *\n\
! 195: * This is the main program for the application.\n\
! 196: *\n\
! 197: * Results:\n\
! 198: * None.\n\
! 199: *\n\
! 200: * Side effects:\n\
! 201: * Whatever the application does.\n\
! 202: *\n\
! 203: *----------------------------------------------------------------------\n\
! 204: */\n\
! 205: \n\
! 206: #if defined(__WIN32__) && defined(HAS_TK)\n\
! 207: int APIENTRY\n\
! 208: WinMain(hInstance, hPrevInstance, lpszCmdLine, nCmdShow)\n\
! 209: HINSTANCE hInstance;\n\
! 210: HINSTANCE hPrevInstance;\n\
! 211: LPSTR lpszCmdLine;\n\
! 212: int nCmdShow;\n\
! 213: {\n\
! 214: char **argv;\n\
! 215: int argc;\n\
! 216: #else\n\
! 217: ";
! 218:
! 219: static char *part5a = "\
! 220: int\n\
! 221: #ifdef _USING_PROTOTYPES_\n\
! 222: main (int argc, /* Number of command-line arguments. */\n\
! 223: char **argv) /* Values of command-line arguments. */\n\
! 224: #else\n\
! 225: main(argc, argv)\n\
! 226: int argc; /* Number of command-line arguments. */\n\
! 227: char **argv; /* Values of command-line arguments. */\n\
! 228: #endif\n\
! 229: {\n\
! 230: #endif\n\
! 231: Tcl_Interp *interp;\n\
! 232: char **p = %s;\n\
! 233: char *q, buffer[256];\n\
! 234: Tcl_DString data;\n\
! 235: Tcl_Channel inChannel, outChannel, errChannel;\n\
! 236: \n\
! 237: #ifdef __WIN32__\n\
! 238: #if defined(TCL_ACTIVE) && !defined(SHARED) && defined(HAS_TK)\n\
! 239: TclWinSetTclInstance(hInstance);\n\
! 240: TkWinXInit(hInstance);\n\
! 241: Tcl_CreateExitHandler((Tcl_ExitProc *) TkWinXCleanup, (ClientData) hInstance);\n\
! 242: #endif\n\
! 243: \n\
! 244: Tcl_SetPanicProc(TclshPanic);\n\
! 245: \n";
! 246:
! 247: static char *part5b = "\n\
! 248: /*\n\
! 249: * Set up the default locale to be standard \"C\" locale so parsing\n\
! 250: * is performed correctly.\n\
! 251: */\n\
! 252: \n\
! 253: setlocale(LC_ALL, \"C\");\n\
! 254: \n\
! 255: /*\n\
! 256: * Increase the application queue size from default value of 8.\n\
! 257: * At the default value, cross application SendMessage of WM_KILLFOCUS\n\
! 258: * will fail because the handler will not be able to do a PostMessage!\n\
! 259: * This is only needed for Windows 3.x, since NT dynamically expands\n\
! 260: * the queue.\n\
! 261: */\n\
! 262: SetMessageQueue(64);\n\
! 263: \n\
! 264: argc = setargv(&argv);\n\
! 265: \n\
! 266: /*\n\
! 267: * Replace argv[0] with full pathname of executable, and forward\n\
! 268: * slashes substituted for backslashes.\n\
! 269: */\n\
! 270: \n\
! 271: ";
! 272:
! 273: static char *part5c = "\
! 274: GetModuleFileName(NULL, buffer, sizeof(buffer));\n\
! 275: argv[0] = buffer;\n\
! 276: for (q = buffer; *q != '\\0'; q++) {\n\
! 277: if (*q == '\\\\') {\n\
! 278: *q = '/';\n\
! 279: }\n\
! 280: }\n\
! 281: \n\
! 282: #endif\n\
! 283: Tcl_FindExecutable(argv[0]);\n\
! 284: interp = Tcl_CreateInterp();\n\
! 285: \n\
! 286: q = Tcl_Merge(argc-1, argv+1);\n\
! 287: Tcl_SetVar(interp, \"argv\", q, TCL_GLOBAL_ONLY);\n\
! 288: ckfree(q);\n\
! 289: sprintf(buffer, \"%%d\", argc-1);\n\
! 290: Tcl_SetVar(interp, \"argc\", buffer, TCL_GLOBAL_ONLY);\n\
! 291: Tcl_SetVar(interp, \"argv0\", argv[0],TCL_GLOBAL_ONLY);\n\
! 292: Tcl_SetVar(interp, \"tcl_interactive\",\"0\", TCL_GLOBAL_ONLY);\n\
! 293: \n\
! 294: ";
! 295:
! 296: static char *part6 = "\n\
! 297: /*\n\
! 298: * Execute the script that is compiled in.\n\
! 299: */\n\
! 300: \n\
! 301: inChannel = Tcl_GetStdChannel(TCL_STDIN);\n\
! 302: outChannel = Tcl_GetStdChannel(TCL_STDOUT);\n\
! 303: Tcl_DStringInit(&data);\n\
! 304: while(*p) {\n\
! 305: Tcl_DStringSetLength(&data,0);\n\
! 306: Tcl_DStringAppend(&data,*p++,-1);\n\
! 307: if (Tcl_Eval(interp,Tcl_DStringValue(&data)) != TCL_OK) {\n\
! 308: Tcl_DStringFree(&data);\n\
! 309: while (p-- != %s) {\n\
! 310: for (q = *p;*q; q++) {\n\
! 311: if (*q=='\\n') line++;\n\
! 312: }\n\
! 313: line++;\n\
! 314: }\n\
! 315: sprintf(buffer,lineformat,\"%s\",line);\n\
! 316: Tcl_AddErrorInfo(interp,\"\\n ( Error in file: \\\"\");\n\
! 317: Tcl_AddErrorInfo(interp,__FILE__);\n\
! 318: Tcl_AddErrorInfo(interp,\"\\\", line: \");\n\
! 319: Tcl_AddErrorInfo(interp,buffer);\n\
! 320: Tcl_AddErrorInfo(interp,\")\");\n\
! 321: errChannel = Tcl_GetStdChannel(TCL_STDERR);\n\
! 322: if (errChannel) {\n\
! 323: Tcl_Write(errChannel,\n\
! 324: Tcl_GetVar(interp, \"errorInfo\", TCL_GLOBAL_ONLY), -1);\n\
! 325: Tcl_Write(errChannel, \"\\n\", 1);\n\
! 326: }\n\
! 327: #ifdef __WIN32__\n\
! 328: TclshPanic(Tcl_GetVar(interp, \"errorInfo\", TCL_GLOBAL_ONLY));\n\
! 329: #endif\n\
! 330: sprintf(buffer, \"exit %%d\", 1);\n\
! 331: Tcl_Eval(interp, buffer);\n\
! 332: }\n\
! 333: }\n\
! 334: Tcl_DStringFree(&data);\n\
! 335: ";
! 336:
! 337: static char *part6a = "\
! 338: Tk_MainLoop();\n\
! 339: ";
! 340:
! 341: static char *part6b = "\
! 342: sprintf(buffer, \"exit %%d\", 0);\n\
! 343: Tcl_Eval(interp, buffer);\n\
! 344: \n\
! 345: error:\n\
! 346: errChannel = Tcl_GetStdChannel(TCL_STDERR);\n\
! 347: if (errChannel) {\n\
! 348: Tcl_Write(errChannel,\n\
! 349: \"application-specific initialization failed: \", -1);\n\
! 350: Tcl_Write(errChannel, interp->result, -1);\n\
! 351: Tcl_Write(errChannel, \"\\n\", 1);\n\
! 352: }\n\
! 353: #ifdef __WIN32__\n\
! 354: TclshPanic(interp->result);\n\
! 355: #endif\n\
! 356: sprintf(buffer, \"exit %%d\", 1);\n\
! 357: Tcl_Eval(interp, buffer);\n\
! 358: return 0;\n\
! 359: }\n\
! 360: \n\
! 361: #ifdef __WIN32__\n\
! 362: /*\n\
! 363: *----------------------------------------------------------------------\n\
! 364: *\n\
! 365: * TclshPanic --\n\
! 366: *\n\
! 367: * Display a message and exit.\n\
! 368: *\n\
! 369: * Results:\n\
! 370: * None.\n\
! 371: *\n\
! 372: * Side effects:\n\
! 373: * Exits the program.\n\
! 374: *\n\
! 375: *----------------------------------------------------------------------\n\
! 376: */\n\
! 377: \n\
! 378: void\n\
! 379: TclshPanic TCL_VARARGS_DEF(char *,arg1)\n\
! 380: {\n\
! 381: va_list argList;\n\
! 382: char buf[1024];\n\
! 383: char *format;\n\
! 384: \n\
! 385: format = TCL_VARARGS_START(char *,arg1,argList);\n\
! 386: vsprintf(buf, format, argList);\n\
! 387: \n\
! 388: MessageBeep(MB_ICONEXCLAMATION);\n\
! 389: MessageBox(NULL, buf, \"Fatal Error in Tclsh\",\n\
! 390: MB_ICONSTOP | MB_OK | MB_TASKMODAL | MB_SETFOREGROUND);\n\
! 391: #ifdef _MSC_VER\n\
! 392: _asm {\n\
! 393: int 3\n\
! 394: }\n\
! 395: #endif\n\
! 396: ExitProcess(1);\n\
! 397: }\n\
! 398: ";
! 399:
! 400: static char *part6c = "\
! 401: \n\
! 402: /*\n\
! 403: *-------------------------------------------------------------------------\n\
! 404: *\n\
! 405: * setargv --\n\
! 406: *\n\
! 407: * Parse the Windows command line string into argc/argv. Done here\n\
! 408: * because we don't trust the builtin argument parser in crt0. \n\
! 409: * Windows applications are responsible for breaking their command\n\
! 410: * line into arguments.\n\
! 411: *\n\
! 412: * 2N backslashes + quote -> N backslashes + begin quoted string\n\
! 413: * 2N + 1 backslashes + quote -> literal\n\
! 414: * N backslashes + non-quote -> literal\n\
! 415: * quote + quote in a quoted string -> single quote\n\
! 416: * quote + quote not in quoted string -> empty string\n\
! 417: * quote -> begin quoted string\n\
! 418: *\n\
! 419: * Results:\n\
! 420: * returns the number of arguments and fill argvPtr with the\n\
! 421: * array of arguments.\n\
! 422: *\n\
! 423: * Side effects:\n\
! 424: * Memory allocated.\n\
! 425: *\n\
! 426: *--------------------------------------------------------------------------\n\
! 427: */\n\
! 428: \n\
! 429: ";
! 430:
! 431: static char *part6d = "\
! 432: static int\n\
! 433: setargv(argvPtr)\n\
! 434: char ***argvPtr; /* Filled with argument strings (malloc'd). */\n\
! 435: {\n\
! 436: char *cmdLine, *p, *arg, *argSpace;\n\
! 437: char **argv;\n\
! 438: int argc, size, inquote, copy, slashes;\n\
! 439: \n\
! 440: cmdLine = GetCommandLine();\n\
! 441: \n\
! 442: /*\n\
! 443: * Precompute an overly pessimistic guess at the number of arguments\n\
! 444: * in the command line by counting non-space spans.\n\
! 445: */\n\
! 446: \n\
! 447: size = 2;\n\
! 448: for (p = cmdLine; *p != '\\0'; p++) {\n\
! 449: if (isspace(*p)) {\n\
! 450: size++;\n\
! 451: while (isspace(*p)) {\n\
! 452: p++;\n\
! 453: }\n\
! 454: if (*p == '\\0') {\n\
! 455: break;\n\
! 456: }\n\
! 457: }\n\
! 458: }\n\
! 459: argSpace = (char *) ckalloc((unsigned) (size * sizeof(char *)\n\
! 460: + strlen(cmdLine) + 1));\n\
! 461: argv = (char **) argSpace;\n\
! 462: argSpace += size * sizeof(char *);\n\
! 463: size--;\n\
! 464: \n\
! 465: p = cmdLine;\n\
! 466: for (argc = 0; argc < size; argc++) {\n\
! 467: argv[argc] = arg = argSpace;\n\
! 468: while (isspace(*p)) {\n\
! 469: p++;\n\
! 470: }\n\
! 471: if (*p == '\\0') {\n\
! 472: break;\n\
! 473: }\n\
! 474: \n\
! 475: ";
! 476:
! 477: static char *part6e = "\
! 478: inquote = 0;\n\
! 479: slashes = 0;\n\
! 480: while (1) {\n\
! 481: copy = 1;\n\
! 482: while (*p == '\\\\') {\n\
! 483: slashes++;\n\
! 484: p++;\n\
! 485: }\n\
! 486: if (*p == '\"') {\n\
! 487: if ((slashes & 1) == 0) {\n\
! 488: copy = 0;\n\
! 489: if ((inquote) && (p[1] == '\"')) {\n\
! 490: p++;\n\
! 491: copy = 1;\n\
! 492: } else {\n\
! 493: inquote = !inquote;\n\
! 494: }\n\
! 495: }\n\
! 496: slashes >>= 1;\n\
! 497: }\n\
! 498: \n\
! 499: while (slashes) {\n\
! 500: *arg = '\\\\';\n\
! 501: arg++;\n\
! 502: slashes--;\n\
! 503: }\n\
! 504: \n\
! 505: if ((*p == '\\0') || (!inquote && isspace(*p))) {\n\
! 506: break;\n\
! 507: }\n\
! 508: if (copy != 0) {\n\
! 509: *arg = *p;\n\
! 510: arg++;\n\
! 511: }\n\
! 512: p++;\n\
! 513: }\n\
! 514: *arg = '\\0';\n\
! 515: argSpace = arg + 1;\n\
! 516: }\n\
! 517: argv[argc] = NULL;\n\
! 518: \n\
! 519: *argvPtr = argv;\n\
! 520: return argc;\n\
! 521: }\n\
! 522: #endif /* __WIN32__ */\n\
! 523: ";
! 524:
! 525: static char *partwebpage ="\
! 526: if (argc >1) {\n\
! 527: if (!strcmp(argv[1],\"-emailcapaid\")) { emailcapaid(argc,argv);return 0;}\n\
! 528: if (!strcmp(argv[1],\"-getid\")) { getid(argc,argv);return 0;}\n\
! 529: }\n\
! 530: ";
! 531:
! 532: static char *defineproto1 = "\
! 533: #define %s_Init %s_InitStandAlone\n\
! 534: ";
! 535:
! 536: static char *defineproto2 = "\
! 537: #define %s_SafeInit (Tcl_PackageInitProc *) NULL\n\
! 538: ";
! 539:
! 540: static char *initproto = "\
! 541: extern int %s_Init _ANSI_ARGS_((Tcl_Interp *interp));\n\
! 542: #ifndef %s_SafeInit\n\
! 543: extern int %s_SafeInit _ANSI_ARGS_((Tcl_Interp *interp));\n\
! 544: #endif\n\
! 545: ";
! 546:
! 547: static char *packageproto = "\
! 548: Tcl_StaticPackage(interp, \"%s\", %s_Init, %s_SafeInit);\n\
! 549: ";
! 550:
! 551: static char *callinit = "\
! 552: if (%s_Init(interp) != TCL_OK) {\n\
! 553: goto error;\n\
! 554: }\n\
! 555: ";
! 556:
! 557: static char buffer[32768];
! 558: static unsigned int max_buffer = 0;
! 559: static char max_buffer_content[80];
! 560:
! 561: static char array_instead_of_string = 0;
! 562: static unsigned int num_lines = 0;
! 563:
! 564: static char script_name[256];
! 565:
! 566: int printline _ANSI_ARGS_((FILE *f, char *buf, char *dir, int flags));
! 567: int printfile _ANSI_ARGS_((FILE *fout, char *filename, char *dir, int flags));
! 568:
! 569: int
! 570: #ifdef _USING_PROTOTYPES_
! 571: printline (
! 572: FILE *f,
! 573: char *buf,
! 574: char *dir,
! 575: int flags)
! 576: #else
! 577: printline(f,buf,dir,flags)
! 578: FILE *f;
! 579: char *buf;
! 580: char *dir;
! 581: int flags;
! 582: #endif
! 583: {
! 584: char *p,*q;
! 585: char path[128];
! 586: unsigned int l;
! 587:
! 588: p=buf; while (*p=='\t' || *p==' ') p++;
! 589: if (!strncmp(p,"catch",5)) {
! 590: q=p+5; while (*q=='\t' || *q==' ') q++;
! 591: if (*q++=='{') {
! 592: while (*q=='\t' || *q==' ') q++;
! 593: if (strncmp(q,"source",6)) q=(char *)NULL;
! 594: } else {
! 595: q=(char *)NULL;
! 596: }
! 597: } else {
! 598: q=(char *)NULL;
! 599: }
! 600: if (!strncmp(p,"source",6) || q) {
! 601: if (q!=(char *)NULL) {
! 602: p = q;
! 603: }
! 604: p += 6;
! 605: while(*p=='\t' || *p==' ') p++;
! 606: if (*p=='/') {
! 607: strcpy(path,p);
! 608: } else {
! 609: strcpy(path,dir);
! 610: strcat(path,p);
! 611: }
! 612: if (q) {
! 613: q=strrchr(p,'}');
! 614: if (q) {
! 615: *q=0;
! 616: }
! 617: }
! 618:
! 619: if (!printfile(f, path, dir, flags)) {
! 620: return 0;
! 621: } else {
! 622: p = strrchr(p,'/');
! 623: if (p) {
! 624: strcpy(path,dir);
! 625: strcat(path,p+1);
! 626: if (!printfile(f ,path ,dir, flags)) {
! 627: return 0;
! 628: }
! 629: }
! 630: }
! 631: if (q) {
! 632: *q='}';
! 633: }
! 634: }
! 635: p = buf;
! 636: while ((p = strstr(p, "[list source [file join $dir")) != NULL) {
! 637: q = strstr(p,".tcl]]");
! 638: if (q != NULL) {
! 639: memcpy(p,"{source -rsrc",13);
! 640: memcpy(p+13,p+28,q-p-28);
! 641: memcpy(q-15,"}",1);
! 642: strcpy(q-14,q+6);
! 643: } else {
! 644: p++;
! 645: }
! 646: }
! 647: if (array_instead_of_string) {
! 648: fprintf(f, "\nstatic char %s_line%d[] = {\n ",
! 649: script_name, ++num_lines);
! 650: while (*buf) {
! 651: for (l = 0; *buf && l < 14; l++) {
! 652: fputc('\'', f);
! 653: if (*buf == '\n') { fprintf(f,"\\n',"); buf++; continue; }
! 654: if (*buf == '\'' || *buf == '\\') fputc('\\', f);
! 655: fprintf(f, "%c',", *buf++);
! 656: }
! 657: fprintf(f, "\n ");
! 658: }
! 659: fprintf(f, "'\\0' };\n");
! 660: } else {
! 661: fputc('\"',f);
! 662: l = strlen(buf);
! 663: if (l>max_buffer) {
! 664: max_buffer = l;
! 665: p = (strchr(buf,'\n'));
! 666: if (p) {
! 667: l = p - buf;
! 668: } else {
! 669: l = strlen(buf);
! 670: }
! 671: if (l>72) {l = 72;}
! 672: memcpy(max_buffer_content,buf,l);
! 673: max_buffer_content[l] = 0;
! 674: }
! 675: while(*buf) {
! 676: if (*buf=='\"'||*buf=='\\') fputc('\\',f);
! 677: if (*buf=='\n') {fputc('\\',f); fputc('n',f); fputc('\\',f); }
! 678: fputc(*buf++,f);
! 679: }
! 680: fprintf(f, "\",\n");
! 681: }
! 682: return 0;
! 683: }
! 684:
! 685: int
! 686: #ifdef _USING_PROTOTYPES_
! 687: printfile (
! 688: FILE *fout,
! 689: char *filename,
! 690: char *dir,
! 691: int flags)
! 692: #else
! 693: printfile(fout,filename,dir, flags)
! 694: FILE *fout;
! 695: char *filename;
! 696: char *dir;
! 697: int flags;
! 698: #endif
! 699: {
! 700: FILE *fin;
! 701: char *p, *q;
! 702: int c;
! 703:
! 704: if (!(fin=fopen(filename,"r"))) {
! 705: return 1 /* cannot open file */;
! 706: }
! 707: p = q = buffer;
! 708: while ((c=fgetc(fin))!=EOF) {
! 709: *p = 0;
! 710: if (c=='\n') {
! 711: if (!strncmp(buffer,"if {[info exists tk_library] && [string compare $tk_library {}]} {",66)) {
! 712: int flag = 1;
! 713: while (((c=fgetc(fin))!=EOF) && flag) {
! 714: if (c=='{') {
! 715: flag++;
! 716: } else if (c=='}') {
! 717: flag--;
! 718: }
! 719: }
! 720: p=q=buffer;
! 721: } else if ((p==buffer)||(*q=='\n')||(*q=='#')) {
! 722: if ((*q=='#') && (*(p-1)=='\\')) {
! 723: p=q+1;
! 724: } else {
! 725: p=q;
! 726: }
! 727: } else {
! 728: *p++ = '\n'; *p=0;
! 729: if (Tcl_CommandComplete(buffer)) {
! 730: p--; *p = 0; printline(fout,buffer,dir,flags);
! 731: p = q = buffer;
! 732: } else {
! 733: q=p;
! 734: }
! 735: }
! 736: } else {
! 737: *p++ = (char) c;
! 738: }
! 739: }
! 740: if (p!=buffer) {
! 741: *p=0; printline(fout,buffer,dir,flags);
! 742: }
! 743: fclose(fin);
! 744: return 0; /* O.K. */
! 745: }
! 746:
! 747: int
! 748: #ifdef _USING_PROTOTYPES_
! 749: main (
! 750: int argc,
! 751: char *argv[])
! 752: #else
! 753: main(argc, argv)
! 754: int argc;
! 755: char *argv[];
! 756: #endif
! 757: {
! 758: FILE *fout;
! 759: char *p,*q, *filename=NULL;
! 760: char dir[128];
! 761: tableitem *t;
! 762: int c,i, flags=0;
! 763:
! 764: if (argc==1) {
! 765: printf(verbose);
! 766: exit(0);
! 767: }
! 768: if (argc==2&&!strcmp(argv[1],"-help")) {
! 769: printf(verbose);
! 770: printf(help);
! 771: exit(0);
! 772: }
! 773: script_name[0] = 0;
! 774: /* parse all command line arguments */
! 775: for (i=1; i<argc; i++) {
! 776: if (!strcmp(argv[i],"-a")) {
! 777: array_instead_of_string = 1;
! 778: } else if (!strcmp(argv[i],"-n")) {
! 779: i++; strcpy(script_name,argv[i]);
! 780: } else if (!strcmp(argv[i],"-o")) {
! 781: i++; filename = argv[i];
! 782: } else {
! 783: for (t=table;t<table+(sizeof(table)/sizeof(tableitem));t++) {
! 784: if (!strcmp(argv[i],t->option)) {
! 785: flags |= t->flag;
! 786: }
! 787: }
! 788: }
! 789: }
! 790: /* open output file, if not stdout */
! 791: if (filename) {
! 792: fout = fopen(filename,"w");
! 793: if (fout==NULL) {
! 794: fprintf(stderr,"error opening file %s\n",filename);
! 795: exit(1);
! 796: }
! 797: } else {
! 798: fout = stdout;
! 799: }
! 800: p = script_name;
! 801: if ((q = strrchr(p,':')) != NULL) {
! 802: p = q+1;
! 803: }
! 804: if ((q = strrchr(p,'/')) != NULL) {
! 805: p = q+1;
! 806: }
! 807: if ((q = strrchr(p,'\\')) != NULL) {
! 808: p = q+1;
! 809: }
! 810: strcpy(script_name,p);
! 811: q = script_name;
! 812: while (*q) {
! 813: if (*q == '.') {
! 814: *q = '_';
! 815: } else if (isupper(*q)) {
! 816: *q = tolower(*q);
! 817: }
! 818: q++;
! 819: }
! 820: while ((q = strchr(script_name,'.')) != NULL) {
! 821: *q = '_';
! 822: }
! 823: /* create prototypes for all initialization functions that are used */
! 824: if (flags) {
! 825: if (script_name[0] == 0) {
! 826: strcpy(script_name,"script");
! 827: }
! 828: fprintf(fout, part1);
! 829: for (i=0,c=1;i<(sizeof(table)/sizeof(tableitem));i++,c<<=1) {
! 830: if (flags & c) {
! 831: fprintf(fout,defineproto1,table[i].package,
! 832: table[i].package);
! 833: }
! 834: }
! 835: fprintf(fout, part2);
! 836: for (i=1,c=2;i<(sizeof(table)/sizeof(tableitem));i++,c<<=1) {
! 837: if (flags & c) {
! 838: fprintf(fout,defineproto2,table[i].package);
! 839: }
! 840: }
! 841: fprintf(fout, part3);
! 842: if (flags & 2) {
! 843: fprintf(fout, part3a);
! 844: }
! 845: for (i=1,c=2;i<(sizeof(table)/sizeof(tableitem));i++,c<<=1) {
! 846: if (flags & c) {
! 847: fprintf(fout,initproto,table[i].package,
! 848: table[i].package,table[i].package);
! 849: }
! 850: }
! 851: fprintf(fout, part4, script_name);
! 852: if (array_instead_of_string) {
! 853: fprintf(fout, part4b);
! 854: } else {
! 855: fprintf(fout, part4a);
! 856: }
! 857: }
! 858: if ( !array_instead_of_string && script_name[0]) {
! 859: fprintf(fout, "static char *%s[] = {\n", script_name);
! 860: }
! 861: /* handle all remaining arguments */
! 862: if (argc) {argc--; argv++;}
! 863: while(argc) {
! 864: if ((*argv)[0]=='-') {
! 865: if ((((*argv)[1]=='o')||((*argv)[1]=='n'))&&((*argv)[2]==0)) {
! 866: argc--; argv++;
! 867: }
! 868: } else if ((p=strstr(*argv,".c"))&&(p[2]==0)) {
! 869: fprintf(fout,"#include \"%s\"\n",*argv);
! 870: } else {
! 871: strcpy(dir,*argv);
! 872: if ((p=strrchr(dir,'/'))!= NULL) { *(p+1)=0; } else {*dir=0;}
! 873: if (printfile(fout,*argv,dir,flags)) {
! 874: fprintf(stderr,"Error: cannot open file %s\n",*argv);
! 875: }
! 876: }
! 877: argc--; argv++;
! 878: }
! 879: if ( array_instead_of_string ) {
! 880: fprintf(fout, "static char *%s[] = {\n", script_name);
! 881: for (i = 0; (unsigned int)i < num_lines;)
! 882: fprintf(fout, "%s_line%d,\n", script_name, ++i);
! 883: }
! 884: if (script_name[0]) {
! 885: fprintf(fout, "(char *) NULL\n};\n\n");
! 886: }
! 887: /* end of scripts, finally the functions main() and tclAppInit() */
! 888: if (flags) {
! 889: fprintf(fout, part5, script_name);
! 890: fprintf(fout, part5a, script_name);
! 891: fprintf(fout, part5b);
! 892: fprintf(fout, part5c);
! 893: if (flags==65537) { fprintf(fout, partwebpage); }
! 894: fprintf(fout,callinit,table[0].package);
! 895: for (i=1,c=2;i<(sizeof(table)/sizeof(tableitem));i++,c<<=1) {
! 896: if (flags & c) {
! 897: fprintf(fout,callinit,table[i].package);
! 898: fprintf(fout,packageproto,table[i].package,table[i].package,table[i].package);
! 899: }
! 900: }
! 901: p=filename?filename:"app";
! 902: if ((q=strrchr(p,'/')) != NULL) p=q+1;
! 903: if ((q=strchr(p,'.')) != NULL) *q=0;
! 904: if (!*p) p="app";
! 905: fprintf(fout, part6,script_name,script_name,p,p);
! 906: if (flags & 2) {
! 907: fprintf(fout, part6a);
! 908: }
! 909: fprintf(fout, part6b);
! 910: fprintf(fout, part6c);
! 911: fprintf(fout, part6d);
! 912: fprintf(fout, part6e);
! 913: }
! 914: /* close output-file, if not stdout */
! 915: if (fout!=stdout) {
! 916: fclose(fout);
! 917: }
! 918: if (max_buffer>MAX_STRING_LEN) {
! 919: fprintf(stderr,"warning: largest sting in output file is %d bytes\n\
! 920: many compilers can only handle %d characters in a string\n\
! 921: first line: %s\n",max_buffer,MAX_STRING_LEN,max_buffer_content);
! 922: }
! 923: exit(0);
! 924: return 0;
! 925: }
! 926:
! 927:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>