windows-nt/Source/XPSP1/NT/base/crts/crtw32/startup/wincmdln.c
2020-09-26 16:20:57 +08:00

112 lines
2.9 KiB
C

/***
*wincmdln.c - process command line for WinMain
*
* Copyright (c) 1997-2001, Microsoft Corporation. All rights reserved.
*
*Purpose:
* Prepare command line to be passed to [w]WinMain.
*
*Revision History:
* 06-23-97 GJF Module created by extracting the code from crt0.c
* 03-24-01 PML Protect against null _[aw]cmdln (vs7#229081)
*
*******************************************************************************/
#include <internal.h>
#include <tchar.h>
#define SPACECHAR _T(' ')
#define DQUOTECHAR _T('\"')
/*
* Flag to ensure multibyte ctype table is only initialized once
*/
extern int __mbctype_initialized;
/***
*_[w]wincmdln
*
*Purpose:
* Extract the command line tail to be passed to WinMain.
*
* Be warned! This code was originally implemented by the NT group and
* has remained pretty much unchanged since 12-91. It should be changed
* only with extreme care since there are undoubtedly many apps which
* depend on its historical behavior.
*
*Entry:
* The global variable _[a|w]cmdln is set to point at the complete
* command line.
*
*Exit:
* Returns a pointer to the command line tail.
*
*Exceptions:
*
*******************************************************************************/
_TUCHAR * __cdecl
#ifdef WPRFLAG
_wwincmdln(
#else
_wincmdln(
#endif
void
)
{
_TUCHAR *lpszCommandLine;
#ifdef _MBCS
/*
* If necessary, initialize the multibyte ctype table
*/
if ( __mbctype_initialized == 0 )
__initmbctable();
#endif
/*
* Skip past program name (first token in command line).
* Check for and handle quoted program name.
*/
#ifdef WPRFLAG
lpszCommandLine = _wcmdln == NULL ? L"" : (wchar_t *)_wcmdln;
#else
lpszCommandLine = _acmdln == NULL ? "" : (unsigned char *)_acmdln;
#endif
if ( *lpszCommandLine == DQUOTECHAR ) {
/*
* Scan, and skip over, subsequent characters until
* another double-quote or a null is encountered.
*/
while ( (*(++lpszCommandLine) != DQUOTECHAR)
&& (*lpszCommandLine != _T('\0')) )
{
#ifdef _MBCS
if (_ismbblead(*lpszCommandLine))
lpszCommandLine++;
#endif
}
/*
* If we stopped on a double-quote (usual case), skip
* over it.
*/
if ( *lpszCommandLine == DQUOTECHAR )
lpszCommandLine++;
}
else {
while (*lpszCommandLine > SPACECHAR)
lpszCommandLine++;
}
/*
* Skip past any white space preceeding the second token.
*/
while (*lpszCommandLine && (*lpszCommandLine <= SPACECHAR))
lpszCommandLine++;
return lpszCommandLine;
}