#include extern int LenStr(); extern BOOL CmpStr(); extern int BToL(); union Uni { char ch; int i; BOOL l; char *chPtr; int *iPtr; union Uni *uPtr; union Uni *auPtr[1]; }; typedef union Uni UniType; char *GetFlags(ArgCount, ArgVector, FlagsDesc, Dest) unsigned int *ArgCount; char *(*ArgVector[]); char *FlagsDesc; UniType *Dest; { register char *fPtr; register char *cPtr; register char *cnPtr; BOOL qArg; unsigned int Base; int t3; long int ll; UniType *DestPtr; UniType *uPtr; (*ArgVector)++; /* first argument - program name */ for (; --(*ArgCount) != 0; (*ArgVector)++) { cPtr= **ArgVector; /* starting from begin of current argument string */ if (CmpStr(cPtr, "--")) { (*ArgCount)--; (*ArgVector)++; break; } else if (CmpStr(cPtr, "-")) break; else if ((*cPtr != '-') && (*cPtr != '+')) break; else { if (*cPtr == '-') cPtr++; while (*cPtr) { fPtr=FlagsDesc; qArg=NO; DestPtr.uPtr= &Dest; cnPtr=cPtr; for (;;) { if (*fPtr == '*') { /* * form - setup address */ qArg=YES; /* descriptor found */ uPtr.chPtr= /* char pointer */ (*cnPtr) ? cnPtr : /* if string non zero */ /* else if exist next then ... else ... */ ((--(*ArgCount)) ? *(++(*ArgVector)) : cnPtr); cnPtr=LenStr(uPtr.chPtr) + uPtr.chPtr; } else if (*fPtr == '?') { qArg=YES; uPtr.i= (int) *cnPtr; if (*cnPtr) cnPtr++; } else if (*fPtr == '#') { qArg= (isdigit(*cnPtr)) ? YES : NO; if (*cnPtr != '0') Base=10; else if (tolower(*(cnPtr+1)) == 'x') Base=16; else Base=8; cnPtr += BToL(cnPtr, LenStr(cnPtr), &ll, Base); uPtr.i=ll; } else if ((*fPtr == ',') || (*fPtr == 0)) { if (qArg) { /* if arg found */ DestPtr->uPtr->i = uPtr.i; /* set argument value */ /* DestPtr->uPtr->uPtr = uPtr; /* or may be as show here */ cPtr=cnPtr; /* next pointer in strirg */ break; } else if (*fPtr) { /* arg not found - end of arg desc ? */ DestPtr++; /* skip in arg destination */ cnPtr=cPtr; } /* from begin */ else /* else */ return cPtr; } /* return bad arg pointer */ else if (*fPtr == '>') { if (qArg) if (DestPtr->uPtr->uPtr) { (DestPtr->uPtr+1)->auPtr[--DestPtr->uPtr->i] = uPtr; cPtr=cnPtr; break; } else return cPtr; else { DestPtr++; cnPtr=cPtr; } } else if (*fPtr == *cnPtr) { qArg=YES; uPtr.l=YES; cnPtr++; } else { qArg=NO; while ((*fPtr != ',') && (*fPtr != '>') && *fPtr) fPtr++; fPtr--; } fPtr++; } } } } return NULL; /* all is allright */ }