os_w32exe.c
资源名称:vim53src.zip [点击查看]
上传用户:gddssl
上传日期:2007-01-06
资源大小:1003k
文件大小:4k
源码类别:
编辑器/阅读器
开发平台:
DOS
- /* vi:set ts=8 sts=4 sw=4:
- *
- * VIM - Vi IMproved by Bram Moolenaar
- * GUI support by Robert Webb
- *
- * Do ":help uganda" in Vim to read copying and usage conditions.
- * Do ":help credits" in Vim to see a list of people who contributed.
- *
- * Windows GUI: main program (EXE) entry point:
- *
- * Ron Aaron <ron@mossbayeng.com> wrote this and the DLL support code.
- */
- #include "vim.h"
- #include <windows.h>
- /* cproto doesn't create a prototype for main() */
- int _cdecl main __ARGS((int argc, char **argv));
- int (_cdecl *pmain)(int, char **);
- #ifndef PROTO
- #ifdef USE_GUI
- #ifndef VIMDLL
- void _cdecl SaveInst(HINSTANCE hInst);
- #endif
- void (_cdecl *pSaveInst)(HINSTANCE);
- #endif
- int WINAPI
- WinMain(
- HINSTANCE hInstance,
- HINSTANCE hPrevInst,
- LPSTR lpszCmdLine,
- int nCmdShow)
- {
- int argc;
- char **argv;
- int i;
- char *pch;
- char *pszNewCmdLine;
- char prog[256];
- char *p;
- int fIsQuote;
- #ifdef VIMDLL
- HANDLE hLib;
- #endif
- /*
- * Ron: added full path name so that the $VIM variable will get set to our
- * startup path (so the .vimrc file can be found w/o a VIM env. var.)
- * Remove the ".exe" extension, and find the 1st non-space.
- */
- GetModuleFileName(NULL, prog, 255);
- p = strrchr(prog, '.');
- if (p != NULL)
- *p = ' ';
- for (p = prog; *p != ' ' && *p == ' '; ++p)
- ;
- /*
- * Add the size of the string, two quotes, the separating space, and a
- * terminating ' '.
- */
- pszNewCmdLine = (char *)malloc(STRLEN(lpszCmdLine) + STRLEN(prog) + 4);
- if (pszNewCmdLine == NULL)
- return 0;
- /* put double quotes around the prog name, it could contain spaces */
- pszNewCmdLine[0] = '"';
- STRCPY(pszNewCmdLine + 1, p);
- STRCAT(pszNewCmdLine, "" ");
- STRCAT(pszNewCmdLine, lpszCmdLine);
- /*
- * Isolate each argument and put it in argv[].
- */
- pch = pszNewCmdLine;
- argc = 0;
- while ( *pch != ' ' )
- {
- /* Ron: Handle quoted strings in args list */
- fIsQuote = (*pch == '"');
- if (fIsQuote)
- ++pch;
- argc++; /* this is an argument */
- if (fIsQuote)
- {
- while (*pch != ' ' && *pch != '"')
- pch++; /* advance until a closing quote */
- if (*pch)
- pch++;
- }
- else
- {
- while ((*pch != ' ') && (*pch != ' '))
- pch++; /* advance until a space */
- }
- while (*pch && *pch == ' ' )
- pch++; /* advance until a non-space */
- }
- argv = (char**) malloc((argc+1) * sizeof(char*));
- if (argv == NULL )
- return 0; /* malloc error */
- i = 0;
- pch = pszNewCmdLine;
- while ((i < argc) && (*pch != ' '))
- {
- fIsQuote = (*pch == '"');
- if (fIsQuote)
- ++pch;
- argv[i++] = pch;
- if (fIsQuote)
- {
- while (*pch != ' ' && *pch != '"')
- pch++; /* advance until the closing quote */
- }
- else
- {
- while (*pch != ' ' && *pch != ' ')
- pch++; /* advance until a space */
- }
- if (*pch != ' ')
- *(pch++) = ' '; /* parse argument here */
- while (*pch && *pch == ' ')
- pch++; /* advance until a non-space */
- }
- // ASSERT(i == argc);
- argv[argc] = (char *) NULL; /* NULL-terminated list */
- #ifdef VIMDLL
- // LoadLibrary - get name of dll to load in here:
- p = strrchr(prog, '\');
- if (p != NULL)
- {
- #ifdef DEBUG
- strcpy(p+1, "vim32d.dll");
- #else
- strcpy(p+1, "vim32.dll");
- #endif
- }
- hLib = LoadLibrary(prog);
- if (hLib == NULL)
- {
- MessageBox(0, "Could not load vim32.dll!","VIM Error",0);
- goto errout;
- }
- // fix up the function pointers
- #ifdef USE_GUI
- pSaveInst = GetProcAddress(hLib, (LPCSTR)2);
- #endif
- pmain = GetProcAddress(hLib, (LPCSTR)1);
- if (pmain == NULL)
- {
- MessageBox(0, "Could not fix up function pointers to the DLL!","VIM Error",0);
- goto errout;
- }
- #else
- #ifdef USE_GUI
- pSaveInst = SaveInst;
- #endif
- pmain = main;
- #endif
- #ifdef USE_GUI
- pSaveInst(hInstance);
- #endif
- pmain (argc, argv);
- #ifdef VIMDLL
- FreeLibrary(hLib);
- errout:
- #endif
- free(argv);
- free(pszNewCmdLine);
- return 0;
- }
- #endif