winMain.c
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:6k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. /*
  2.  * winMain.c --
  3.  *
  4.  * Main entry point for wish and other Tk-based applications.
  5.  *
  6.  * Copyright (c) 1995 Sun Microsystems, Inc.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * SCCS: @(#) winMain.c 1.33 96/12/17 12:56:14
  12.  *
  13.  * Revision 1.1 97/09/10 14:15:00 Geza Groma
  14.  * WinMain() calls main() to execute Togl example programs
  15.  */
  16. #include <tk.h>
  17. #define WIN32_LEAN_AND_MEAN
  18. #include <windows.h>
  19. #undef WIN32_LEAN_AND_MEAN
  20. #include <malloc.h>
  21. #include <locale.h>
  22. /*
  23.  * The following declarations refer to internal Tk routines.  These
  24.  * interfaces are available for use, but are not supported.
  25.  */
  26. EXTERN void TkConsoleCreate(void);
  27. EXTERN int TkConsoleInit(Tcl_Interp *interp);
  28. EXTERN int      main( int argc, char *argv[] );
  29. /*
  30.  * Forward declarations for procedures defined later in this file:
  31.  */
  32. static void setargv _ANSI_ARGS_((int *argcPtr, char ***argvPtr));
  33. static void WishPanic _ANSI_ARGS_(TCL_VARARGS(char *,format));
  34. /*
  35.  *----------------------------------------------------------------------
  36.  *
  37.  * WinMain --
  38.  *
  39.  * Main entry point from Windows.
  40.  *
  41.  * Results:
  42.  * Returns false if initialization fails, otherwise it never
  43.  * returns.
  44.  *
  45.  * Side effects:
  46.  * Just about anything, since from here we call arbitrary Tcl code.
  47.  *
  48.  *----------------------------------------------------------------------
  49.  */
  50. int APIENTRY
  51. WinMain(hInstance, hPrevInstance, lpszCmdLine, nCmdShow)
  52.     HINSTANCE hInstance;
  53.     HINSTANCE hPrevInstance;
  54.     LPSTR lpszCmdLine;
  55.     int nCmdShow;
  56. {
  57.     char **argv, *p, **arg;
  58.     int argc;
  59.     char buffer[MAX_PATH];
  60.     Tcl_SetPanicProc(WishPanic);
  61.     /*
  62.      * Set up the default locale to be standard "C" locale so parsing
  63.      * is performed correctly.
  64.      */
  65.     setlocale(LC_ALL, "C");
  66.     /*
  67.      * Increase the application queue size from default value of 8.
  68.      * At the default value, cross application SendMessage of WM_KILLFOCUS
  69.      * will fail because the handler will not be able to do a PostMessage!
  70.      * This is only needed for Windows 3.x, since NT dynamically expands
  71.      * the queue.
  72.      */
  73.     SetMessageQueue(64);
  74.     /*
  75.      * Create the console channels and install them as the standard
  76.      * channels.  All I/O will be discarded until TkConsoleInit is
  77.      * called to attach the console to a text widget.
  78.      *
  79.      * Delete the following statement if you do not need console.
  80.      */
  81.     TkConsoleCreate();
  82. /*
  83.  * C runtime i/o (printf) still goes to the Windows console, not the Tk one.
  84.  * so we need one of those too -- this is ugly --
  85.  * and I don't even know how to reinitialize cout to work.
  86.  * Consider this a "for now" hack.
  87.  */
  88. AllocConsole();
  89. freopen ("CON", "w", stdout);
  90. freopen ("CON", "w", stderr);
  91.     setargv(&argc, &argv);
  92.     /*
  93.      * Replace argv[0] with full pathname of executable, and forward
  94.      * slashes substituted for backslashes.
  95.      */
  96.     GetModuleFileName(NULL, buffer, sizeof(buffer));
  97.     argv[0] = buffer;
  98. // magi -- all of scanalyze likes / better than , so replace all of argv
  99. for (arg = argv; arg < argv + argc; arg++)
  100. {
  101. for (p = *arg; *p != ''; p++) {
  102. if (*p == '\') {
  103. *p = '/';
  104. }
  105. }
  106. }
  107.     return main(argc, argv);
  108. }
  109. /*
  110.  *----------------------------------------------------------------------
  111.  *
  112.  * WishPanic --
  113.  *
  114.  * Display a message and exit.
  115.  *
  116.  * Results:
  117.  * None.
  118.  *
  119.  * Side effects:
  120.  * Exits the program.
  121.  *
  122.  *----------------------------------------------------------------------
  123.  */
  124. void
  125. WishPanic TCL_VARARGS_DEF(char *,arg1)
  126. {
  127.     va_list argList;
  128.     char buf[1024];
  129.     char *format;
  130.     format = TCL_VARARGS_START(char *,arg1,argList);
  131.     vsprintf(buf, format, argList);
  132.     MessageBeep(MB_ICONEXCLAMATION);
  133.     MessageBox(NULL, buf, "Fatal Error in Togl",
  134.     MB_ICONSTOP | MB_OK | MB_TASKMODAL | MB_SETFOREGROUND);
  135. #ifdef _MSC_VER
  136.     _asm {
  137.         int 3
  138.     }
  139. #endif
  140.     ExitProcess(1);
  141. }
  142. /*
  143.  *-------------------------------------------------------------------------
  144.  *
  145.  * setargv --
  146.  *
  147.  * Parse the Windows command line string into argc/argv.  Done here
  148.  * because we don't trust the builtin argument parser in crt0.
  149.  * Windows applications are responsible for breaking their command
  150.  * line into arguments.
  151.  *
  152.  * 2N backslashes + quote -> N backslashes + begin quoted string
  153.  * 2N + 1 backslashes + quote -> literal
  154.  * N backslashes + non-quote -> literal
  155.  * quote + quote in a quoted string -> single quote
  156.  * quote + quote not in quoted string -> empty string
  157.  * quote -> begin quoted string
  158.  *
  159.  * Results:
  160.  * Fills argcPtr with the number of arguments and argvPtr with the
  161.  * array of arguments.
  162.  *
  163.  * Side effects:
  164.  * Memory allocated.
  165.  *
  166.  *--------------------------------------------------------------------------
  167.  */
  168. static void
  169. setargv(argcPtr, argvPtr)
  170.     int *argcPtr; /* Filled with number of argument strings. */
  171.     char ***argvPtr; /* Filled with argument strings (malloc'd). */
  172. {
  173.     char *cmdLine, *p, *arg, *argSpace;
  174.     char **argv;
  175.     int argc, size, inquote, copy, slashes;
  176.     cmdLine = GetCommandLine();
  177.     /*
  178.      * Precompute an overly pessimistic guess at the number of arguments
  179.      * in the command line by counting non-space spans.
  180.      */
  181.     size = 2;
  182.     for (p = cmdLine; *p != ''; p++) {
  183. if (isspace(*p)) {
  184.     size++;
  185.     while (isspace(*p)) {
  186. p++;
  187.     }
  188.     if (*p == '') {
  189. break;
  190.     }
  191. }
  192.     }
  193.     argSpace = (char *) ckalloc((unsigned) (size * sizeof(char *)
  194.     + strlen(cmdLine) + 1));
  195.     argv = (char **) argSpace;
  196.     argSpace += size * sizeof(char *);
  197.     size--;
  198.     p = cmdLine;
  199.     for (argc = 0; argc < size; argc++) {
  200. argv[argc] = arg = argSpace;
  201. while (isspace(*p)) {
  202.     p++;
  203. }
  204. if (*p == '') {
  205.     break;
  206. }
  207. inquote = 0;
  208. slashes = 0;
  209. while (1) {
  210.     copy = 1;
  211.     while (*p == '\') {
  212. slashes++;
  213. p++;
  214.     }
  215.     if (*p == '"') {
  216. if ((slashes & 1) == 0) {
  217.     copy = 0;
  218.     if ((inquote) && (p[1] == '"')) {
  219. p++;
  220. copy = 1;
  221.     } else {
  222. inquote = !inquote;
  223.     }
  224.                 }
  225.                 slashes >>= 1;
  226.             }
  227.             while (slashes) {
  228. *arg = '\';
  229. arg++;
  230. slashes--;
  231.     }
  232.     if ((*p == '') || (!inquote && isspace(*p))) {
  233. break;
  234.     }
  235.     if (copy != 0) {
  236. *arg = *p;
  237. arg++;
  238.     }
  239.     p++;
  240.         }
  241. *arg = '';
  242. argSpace = arg + 1;
  243.     }
  244.     argv[argc] = NULL;
  245.     *argcPtr = argc;
  246.     *argvPtr = argv;
  247. }