Dryobates napisał(a)
Źródła???? Skąd je masz?
Z sieci - tylko tyle mogę Ci powiedzieć (i dodam, że to źródło już nie istnieje).
A oto fragment pliku mem.c (dla niekumatych: funkcja parsująca wiersz poleceń):
/******************************************************************************
*
* parse_cmd() interepetes the following options from the command-line:
*
* /C or /CLASSIFY - DataLevel = 1
* /D or /DEBUG - DataLevel = 2
* /F or /FREE - DataLevel = 3
* /M module or /MODULE module - DataLevel = 4
* none of /C,/D,/F,/M - DataLevel = 0
*
* /P or /PAGE - PageBreak = 1
*
* /H or /? or /HELP - Helptext displayed; immediate exit
*
* It accepts arguments as "MEM/C/P" or "MEM/P/M:module" or
* "MEM /Mmodule" or "MEM/M = module /P" or "MEM/Mmodule/P" or
* "MEM /debug/page" or... well, just about anything.
*
* If it returns 0, everything's fine... otherwise, it returns the error
* message that should be printed before exiting.
*
*/
#define SWITCHCHAR '/'
int
parse_cmd (agc, agv)
int agc;
char **agv;
{
char cmdline[256], *ptr;
int i;
char far *fptr;
/*
* First we reconstruct the command-line... argv[][] is a little too
* clumsy for what we're gonna do in a sec.
*
*/
cmdline[0] = 0;
for (i = 1; i < agc; i++)
{
strcat (cmdline, agv[i]);
strcat (cmdline, " ");
}
strupr (cmdline); /* Make it case-insensitive */
/*
* That done, let's go...
*
*/
ArgPos = cmdline;
for ( ; *ArgPos; )
{
while (*ArgPos && strchr (" \t", *ArgPos)) /* Skip whitespace */
ArgPos++;
if (! *ArgPos) break; /* In the event that it ended in whitespace */
if (*ArgPos != SWITCHCHAR)
{
for (i = ArgPos - cmdline; i >= 0; i--)
if (cmdline[i] == SWITCHCHAR) break;
i = max (i, 0);
for ( ; *ArgPos; ArgPos++)
if (strchr (" /\t", *ArgPos)) break;
*ArgPos = 0; /* Null-terminate after this option... */
ArgPos = &cmdline[i]; /* ...and point to the start of the option. */
return p_not_in_key; /* They've given "MEM garbage" or something */
}
switch (*(ArgPos+1))
{
case 'C': if (DataLevel != 0)
{
*(ArgPos+2) = 0;
return p_too_many;
}
DataLevel = 1;
ArgPos += (! strncmp (ArgPos+1, "CLASSIFY", 8)) ? 9 : 2;
break;
case 'D': if (DataLevel != 0)
{
*(ArgPos+2) = 0;
return p_too_many;
}
DataLevel = 2;
ArgPos += (! strncmp (ArgPos+1, "DEBUG", 5)) ? 6 : 2;
break;
case 'F': if (DataLevel != 0)
{
*(ArgPos+2) = 0;
return p_too_many;
}
DataLevel = 3;
ArgPos += (! strncmp (ArgPos+1, "FREE", 4)) ? 5 : 2;
break;
case 'P': if (PageBreak != 0)
{
*(ArgPos+2) = 0;
return p_too_many;
}
PageBreak = 3;
ArgPos += (! strncmp (ArgPos+1, "PAGE", 4)) ? 5 : 2;
break;
case 'M': if (DataLevel != 0)
{
*(ArgPos+2) = 0;
return p_too_many;
}
ptr = ArgPos; /* Remember where we are, in case of err */
DataLevel = 4;
ArgPos += (! strncmp (ArgPos+1, "MODULE", 6)) ? 7 : 2;
while (*ArgPos && strchr (" :\t", *ArgPos))
ArgPos++; /* Skip delimiters */
i = 0;
while (*ArgPos && !strchr (" /\t", *ArgPos))
{
ModName[i] = *ArgPos;
ArgPos++; i++;
}
ModName[i] = 0; /* Terminate the name */
if (i == 0) /* They didn't give a module name */
{
InRegs.x.ax = ModuleName;
InRegs.h.dh = Utility_Msg_Class;
sysgetmsg(&InRegs,&SegRegs,&OutRegs);
FP_OFF(fptr) = OutRegs.x.si;
FP_SEG(fptr) = SegRegs.ds;
for (ptr = cmdline; *fptr; ptr++, fptr++)
*ptr = *fptr;
*ptr = 0;
ArgPos = cmdline; /* So complain, and list the */
/* paramter as missing from */
return p_op_missing; /* the option "/MODULE". */
}
break;
case 'H':
case '?': if (DataLevel != 0 || PageBreak != 0)
{
*(ArgPos+2) = 0;
return p_too_many;
}
for (i = MSG_OPTIONS_FIRST; i <= MSG_OPTIONS_LAST; i++)
mprintf (i, "");
exit (0);
break;
default: *(ArgPos+2) = 0;
return p_not_in_sw;
}
}
return 0;
}