//---------------------------------------------------------------------
// Splits a command line into argc/argv lists, using the VC7 parsing rules.
//
// This functions interface mimics the CommandLineToArgvW api.
//
// If function fails, returns NULL.
//
// If function suceeds, call delete [] on return pointer when done.
//
//---------------------------------------------------------------------
LPWSTR *SegmentCommandLine(LPCWSTR lpCmdLine, DWORD *pNumArgs)
{
STATIC_CONTRACT_NOTHROW;
STATIC_CONTRACT_GC_NOTRIGGER;
STATIC_CONTRACT_FAULT;
*pNumArgs = 0;
int nch = (int)wcslen(lpCmdLine);
// Calculate the worstcase storage requirement. (One pointer for
// each argument, plus storage for the arguments themselves.)
int cbAlloc = (nch+1)*sizeof(LPWSTR) + sizeof(WCHAR)*(nch + 1);
LPWSTR pAlloc = new (nothrow) WCHAR[cbAlloc / sizeof(WCHAR)];
if (!pAlloc)
return NULL;
LPWSTR *argv = (LPWSTR*) pAlloc;// We store the argv pointers in the first halt
LPWSTRpdst = (LPWSTR)( ((BYTE*)pAlloc) + sizeof(LPWSTR)*(nch+1) ); // A running pointer to second half to store arguments
LPCWSTR psrc = lpCmdLine;
WCHAR c;
BOOL inquote;
BOOL copychar;
int numslash;
// First, parse the program name (argv[0]). Argv[0] is parsed under
// special rules. Anything up to the first whitespace outside a quoted
// subtring is accepted. Backslashes are treated as normal characters.
argv[ (*pNumArgs)++ ] = pdst;
inquote = FALSE;
do {
if (*psrc == L'"' )
{
inquote = !inquote;
c = *psrc++;
continue;
}
*pdst++ = *psrc;
c = *psrc++;
} while ( (c != L'\0' && (inquote || (c != L' ' && c != L'\t'))) );
if ( c == L'\0' ) {
psrc--;
} else {
*(pdst-1) = L'\0';
}
inquote = FALSE;
/* loop on each argument */
for(;;)
{
if ( *psrc )
{
while (*psrc == L' ' || *psrc == L'\t')
{
++psrc;
}
}
if (*psrc == L'\0')
break; /* end of args */
/* scan an argument */
argv[ (*pNumArgs)++ ] = pdst;
/* loop through scanning one argument */
for (;;)
{
copychar = 1;
/* Rules: 2N backslashes + " ==> N backslashes and begin/end quote
2N+1 backslashes + " ==> N backslashes + literal "
N backslashes ==> N backslashes */
numslash = 0;
while (*psrc == L'\\')
{
/* count number of backslashes for use below */
++psrc;
++numslash;
}
if (*psrc == L'"')
{
/* if 2N backslashes before, start/end quote, otherwise
copy literally */
if (numslash % 2 == 0)
{
if (inquote)
{
if (psrc[1] == L'"')
{
psrc++; /* Double quote inside quoted string */
}
else
{
/* skip first quote char and copy second */
copychar = 0;
}
}
else
{
copychar = 0; /* don't copy quote */
}
inquote = !inquote;
}
numslash /= 2; /* divide numslash by two */
}
/* copy slashes */
while (numslash--)
{
*pdst++ = L'\\';
}
/* if at end of arg, break loop */
if (*psrc == L'\0' || (!inquote && (*psrc == L' ' || *psrc == L'\t')))
break;
/* copy character into argument */
if (copychar)
{
*pdst++ = *psrc;
}
++psrc;
}
/* null-terminate the argument */
*pdst++ = L'\0'; /* terminate string */
}
/* We put one last argument in -- a null ptr */
argv[ (*pNumArgs) ] = NULL;
_ASSERTE((BYTE*)pdst <= (BYTE*)pAlloc + cbAlloc);
return argv;
}
|
相关推荐
它基于.NET Framework,并提供了丰富的功能和工具来简化Web开发过程。在本文中,我们将深入探讨ASP.NET的一些核心概念和编程方法。 首先,让我们关注面向对象编程(OOP)的基本特性:封装、继承和多态。封装是OOP的...
1、我们在Main()函数中,调用Test()函数,我们管Main()函数称之为调用者, 管Test()函数称之为被调用者。 如果被调用者想要得到调用者的值: 1)、传递参数。 2)、使用静态字段来模拟全局变量。 如果调用者想要得到被...
3. **优先使用.NET库函数和公共函数**:除非有特殊需求,否则应优先使用.NET框架提供的库函数及项目中的公共函数。 - 这有助于提高代码的一致性和可维护性。 - 减少对外部方法(如Windows核心动态链接库)的依赖,...
- **基本结构**:一个C#控制台应用程序通常包含`class`和`static void Main()`方法。 - **输出语句**:使用`Console.WriteLine`方法来输出文本。 ##### 3.3 运行程序 - **编译**:使用Visual Studio或命令行工具...
在 .NET 中,委托是一种特殊的类型,可以将一个方法作为参数传递给另一个方法。事件是一种特殊的委托,用于处理用户交互事件。 五、override 和重载的区别 override 和重载是两个不同的概念: 1. 重载:方法的...
- **业务逻辑层**:实现业务规则和流程,处理业务逻辑。 - **表示层**:与用户交互,展示数据和接收用户输入。 这样的分层提高了系统的可维护性和可扩展性,使得各层职责更加清晰,有利于团队协作。 #### 12. 类的...
- **业务逻辑层** (Business Logic Layer): 包含业务逻辑处理,可以进一步细分为业务规则层和业务表观层。 - **表示层** (Presentation Layer): 用户界面,负责与用户的交互。 - **优点**: - 易于维护和扩展。 -...
- **CLS(Common Language Specification)**:通用语言规范,定义了一组所有.NET语言都必须遵循的规则,确保不同语言编写的代码可以互操作。 - **CLR(Common Language Runtime)**:公共语言运行库,是.NET框架的...
可以进一步细分为业务表观层(负责与表示层通信)和业务规则层(处理复杂的业务逻辑)。 - **表示层**: 负责与用户交互,如显示数据、接收用户输入等。 **分层的好处**: - **分工明确**: 不同层次关注不同的职责...