os_w32exe.c
上传用户:gddssl
上传日期:2007-01-06
资源大小:1003k
文件大小:4k
源码类别:

编辑器/阅读器

开发平台:

DOS

  1. /* vi:set ts=8 sts=4 sw=4:
  2.  *
  3.  * VIM - Vi IMproved by Bram Moolenaar
  4.  * GUI support by Robert Webb
  5.  *
  6.  * Do ":help uganda"  in Vim to read copying and usage conditions.
  7.  * Do ":help credits" in Vim to see a list of people who contributed.
  8.  *
  9.  * Windows GUI: main program (EXE) entry point:
  10.  *
  11.  * Ron Aaron <ron@mossbayeng.com> wrote this and  the DLL support code.
  12.  */
  13. #include "vim.h"
  14. #include <windows.h>
  15. /* cproto doesn't create a prototype for main() */
  16. int _cdecl main __ARGS((int argc, char **argv));
  17. int (_cdecl *pmain)(int, char **);
  18. #ifndef PROTO
  19. #ifdef USE_GUI
  20. #ifndef VIMDLL
  21. void _cdecl SaveInst(HINSTANCE hInst);
  22. #endif
  23. void (_cdecl *pSaveInst)(HINSTANCE);
  24. #endif
  25. int WINAPI
  26. WinMain(
  27.     HINSTANCE hInstance,
  28.     HINSTANCE hPrevInst,
  29.     LPSTR lpszCmdLine,
  30.     int nCmdShow)
  31. {
  32.     int argc;
  33.     char **argv;
  34.     int i;
  35.     char *pch;
  36.     char *pszNewCmdLine;
  37.     char prog[256];
  38.     char *p;
  39.     int fIsQuote;
  40. #ifdef VIMDLL
  41.     HANDLE hLib;
  42. #endif
  43.     /*
  44.      * Ron: added full path name so that the $VIM variable will get set to our
  45.      * startup path (so the .vimrc file can be found w/o a VIM env. var.)
  46.      * Remove the ".exe" extension, and find the 1st non-space.
  47.      */
  48.     GetModuleFileName(NULL, prog, 255);
  49.     p = strrchr(prog, '.');
  50.     if (p != NULL)
  51. *p = '';
  52.     for (p = prog; *p != '' && *p == ' '; ++p)
  53. ;
  54.     /*
  55.      * Add the size of the string, two quotes, the separating space, and a
  56.      * terminating ''.
  57.      */
  58.     pszNewCmdLine = (char *)malloc(STRLEN(lpszCmdLine) + STRLEN(prog) + 4);
  59.     if (pszNewCmdLine == NULL)
  60. return 0;
  61.     /* put double quotes around the prog name, it could contain spaces */
  62.     pszNewCmdLine[0] = '"';
  63.     STRCPY(pszNewCmdLine + 1, p);
  64.     STRCAT(pszNewCmdLine, "" ");
  65.     STRCAT(pszNewCmdLine, lpszCmdLine);
  66.     /*
  67.      * Isolate each argument and put it in argv[].
  68.      */
  69.     pch = pszNewCmdLine;
  70.     argc = 0;
  71.     while ( *pch != '' )
  72.     {
  73. /* Ron: Handle quoted strings in args list */
  74. fIsQuote = (*pch == '"');
  75. if (fIsQuote)
  76.     ++pch;
  77. argc++;     /* this is an argument */
  78. if (fIsQuote)
  79. {
  80.     while (*pch != '' && *pch != '"')
  81. pch++;     /* advance until a closing quote */
  82.     if (*pch)
  83. pch++;
  84. }
  85. else
  86. {
  87.     while ((*pch != '') && (*pch != ' '))
  88. pch++;     /* advance until a space */
  89. }
  90. while (*pch && *pch == ' ' )
  91.     pch++;     /* advance until a non-space */
  92.     }
  93.     argv = (char**) malloc((argc+1) * sizeof(char*));
  94.     if (argv == NULL )
  95. return 0;    /* malloc error */
  96.     i = 0;
  97.     pch = pszNewCmdLine;
  98.     while ((i < argc) && (*pch != ''))
  99.     {
  100. fIsQuote = (*pch == '"');
  101. if (fIsQuote)
  102.     ++pch;
  103. argv[i++] = pch;
  104. if (fIsQuote)
  105. {
  106.     while (*pch != '' && *pch != '"')
  107. pch++;     /* advance until the closing quote */
  108. }
  109. else
  110. {
  111.     while (*pch != '' && *pch != ' ')
  112. pch++;     /* advance until a space */
  113. }
  114. if (*pch != '')
  115.     *(pch++) = '';     /* parse argument here */
  116. while (*pch && *pch == ' ')
  117.     pch++;     /* advance until a non-space */
  118.     }
  119.     // ASSERT(i == argc);
  120.     argv[argc] = (char *) NULL;    /* NULL-terminated list */
  121. #ifdef VIMDLL
  122. // LoadLibrary - get name of dll to load in here:
  123. p = strrchr(prog, '\');
  124. if (p != NULL)
  125. {
  126. #ifdef DEBUG
  127. strcpy(p+1, "vim32d.dll");
  128. #else
  129. strcpy(p+1, "vim32.dll");
  130. #endif
  131. }
  132. hLib = LoadLibrary(prog);
  133. if (hLib == NULL)
  134. {
  135. MessageBox(0, "Could not load vim32.dll!","VIM Error",0);
  136. goto errout;
  137. }
  138. // fix up the function pointers
  139. #ifdef USE_GUI
  140. pSaveInst = GetProcAddress(hLib, (LPCSTR)2);
  141. #endif
  142. pmain = GetProcAddress(hLib, (LPCSTR)1);
  143. if (pmain == NULL)
  144. {
  145. MessageBox(0, "Could not fix up function pointers to the DLL!","VIM Error",0);
  146. goto errout;
  147. }
  148. #else
  149. #ifdef USE_GUI
  150. pSaveInst = SaveInst;
  151. #endif
  152. pmain = main;
  153. #endif
  154. #ifdef USE_GUI
  155. pSaveInst(hInstance);
  156. #endif
  157. pmain (argc, argv);
  158. #ifdef VIMDLL
  159. FreeLibrary(hLib);
  160. errout:
  161. #endif
  162. free(argv);
  163. free(pszNewCmdLine);
  164. return 0;
  165. }
  166. #endif