www.pudn.com > vim53src.zip > os_w32exe.c


/* 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  wrote this and  the DLL support code. 
 */ 
#include "vim.h" 
 
#include  
 
/* 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 = '\0'; 
    for (p = prog; *p != '\0' && *p == ' '; ++p) 
	; 
 
    /* 
     * Add the size of the string, two quotes, the separating space, and a 
     * terminating '\0'. 
     */ 
    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 != '\0' ) 
    { 
	/* Ron: Handle quoted strings in args list */ 
	fIsQuote = (*pch == '\"'); 
	if (fIsQuote) 
	    ++pch; 
 
	argc++;			    /* this is an argument */ 
	if (fIsQuote) 
	{ 
	    while (*pch != '\0' && *pch != '\"') 
		pch++;		    /* advance until a closing quote */ 
	    if (*pch) 
		pch++; 
	} 
	else 
	{ 
	    while ((*pch != '\0') && (*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 != '\0')) 
    { 
	fIsQuote = (*pch == '\"'); 
	if (fIsQuote) 
	    ++pch; 
 
	argv[i++] = pch; 
	if (fIsQuote) 
	{ 
	    while (*pch != '\0' && *pch != '\"') 
		pch++;		    /* advance until the closing quote */ 
	} 
	else 
	{ 
	    while (*pch != '\0' && *pch != ' ') 
		pch++;		    /* advance until a space */ 
	} 
	if (*pch != '\0') 
	    *(pch++) = '\0';	    /* 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