/****************************************************************/ /* */ /* dosopt.c */ /* */ /* DOS Reusable Command Line Parsing Function */ /* */ /* June 2, 1993 */ /* */ /* Copyright (c) 1995 */ /* Pasquale J. Villani */ /* All Rights Reserved */ /* */ /* This file is part of DOS-C. */ /* */ /* DOS-C is free software; you can redistribute it and/or */ /* modify it under the terms of the GNU General Public License */ /* as published by the Free Software Foundation; either version */ /* 2, or (at your option) any later version. */ /* */ /* DOS-C is distributed in the hope that it will be useful, but */ /* WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ /* the GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public */ /* License along with DOS-C; see the file COPYING. If not, */ /* write to the Free Software Foundation, 675 Mass Ave, */ /* Cambridge, MA 02139, USA. */ /****************************************************************/ /* $Logfile: C:/dos-c/src/misc/dosopt.c_v $ */ /* * $Log: C:/dos-c/src/misc/dosopt.c_v $ * * Rev 1.1 01 Sep 1995 18:11:00 patv * First GPL release. * * Rev 1.0 02 Jul 1995 11:04:46 patv * Initial revision. */ #include "../../hdr/portab.h" #ifdef PROTO BOOL iswild(BYTE *); BYTE FAR *skipwh(BYTE FAR *); COUNT iseol(COUNT); COUNT issep(COUNT); BOOL iswhite(COUNT); COUNT tolower(COUNT); #else BOOL iswild(); BYTE FAR *skipwh(); COUNT iseol(); COUNT issep(); BOOL iswhite(); COUNT tolower(); #endif BYTE optswitch = '/'; COUNT dosopt(fmt, s, args) BYTE *fmt; BYTE FAR *s; VOID *args; { VOID **argp = &args, **startp; BYTE *start, FAR *skipwh(); COUNT ret_count = 0; BYTE FAR *p, FAR *q; while(*fmt != '\0' && !iseol(*s)) { switch(*fmt) { case '*': /* The anything but option case */ s = skipwh(s); if(!issep(*s)) ++ret_count; while(!issep(*s)) *((BYTE *)(*argp))++ = *s++; *((BYTE *)(*argp))++ = '\0'; ++((BYTE **)argp); ++fmt; break; case '$': ++fmt; switch(*fmt) { case 'd': s = skipwh(s); if(s[1] == ':') { *((COUNT *)(*argp)) = ((tolower(*s)) - 'a'); s = &s[2]; ++ret_count; } else *((COUNT *)(*argp))++ = -1; ++((COUNT **)argp); ++fmt; break; case 'p': s = skipwh(s); q = (BYTE FAR *)0; for(p = s; !issep(*p); ++p) { if(*p == '/' || *p == '\\') q = p; } if(q != (BYTE FAR *)0) { COUNT n = 0; do { *((BYTE *)(*argp))++ = *s++; ++n; } while(s <= q); if(n > 1 && (((BYTE *)(*argp))[-1] == '\\' || ((BYTE *)(*argp))[-1] == '/')) ((BYTE *)(*argp))[-1] = '\0'; ++ret_count; } *((BYTE *)(*argp))++ = '\0'; ++((BYTE **)argp); ++fmt; break; } break; case '[': start = fmt; startp = argp; s = skipwh(s); if(*s == optswitch) { ++s; ++fmt; while(*fmt != ']') { if(*fmt == ':') { ++fmt; continue; } if(*fmt++ == tolower(*s)) { if(*fmt == ':') { ++s, ++s; while(!issep(*s)) *((BYTE *)(*argp))++ = *s++; ++fmt; } else { *((COUNT *)(*argp)) ^= 1; ++s; } while(*fmt++ != ']') ++((COUNT **)argp); --fmt; ++ret_count; } else ++((COUNT **)argp); } if(*(fmt + 1) == '+') { argp = startp; fmt = start; } } else while(!issep(*s)) ++s; break; default: break; } } return ret_count; } BOOL iswild(s) BYTE *s; { for( ; *s != '\0'; ++s) if(*s == '?' || *s == '*') return TRUE; return FALSE; } static COUNT tolower(c) COUNT c; { static BYTE *alpha[2] = { "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz" }; COUNT idx; for(idx = 0; alpha[0][idx] != '\0'; ++idx) { if(alpha[0][idx] == c) return alpha[1][idx]; } return c; } static BOOL iswhite(c) COUNT c; { return (c == ' ' || c == '\t'); } static BYTE FAR *skipwh(s) BYTE FAR *s; { while(iswhite(*s)) ++s; return s; } static COUNT iseol(c) COUNT c; { return(c == '\0' || c == '\r' || c == '\n'); } COUNT issep(c) COUNT c; { return(iseol(c) || iswhite(c) || c == optswitch); }