--****************************************************************************** -- -- Package BOPT provides a standard way of retrieving command line arguments. -- --****************************************************************************** with TEXT_IO ; use TEXT_IO ; with ARG ; with ALEX ; use ALEX ; package BOPT is procedure GETOPT (POSSIBLE: in STRING ; OPTION: out CHARACTER ; ARGUMENT: out STRING ; END_OF_OPTIONS : out BOOLEAN) ; private OPTIND : INTEGER := 1 ; -- Current options index. GROUP_INDEX : INTEGER := 2 ; -- Character position in current group. END_OPTIND : INTEGER := 0 ; -- Position of end-of-options indicator. end BOPT ; package body BOPT is --****************************************************************************** -- -- Procedure GETOPT gets the next option from the command line. -- --****************************************************************************** procedure GETOPT (POSSIBLE: in STRING ; OPTION: out CHARACTER ; ARGUMENT: out STRING ; END_OF_OPTIONS : out BOOLEAN) is GROUP : STRING(1..64) ; I, LAST_OPTIND : INTEGER ; begin OPTION := ' ' ; COPY_STRING ("", ARGUMENT) ; END_OF_OPTIONS := FALSE ; LAST_OPTIND := OPTIND ; -- Save previous options index. while (OPTIND <= ARG.COUNT) loop COPY_STRING (ARG.DATA (OPTIND), GROUP) ; -- Is the current argument an options argument (first character is '-')? if (GROUP(1) = '-') then if (GROUP_INDEX <= GROUP'LENGTH) and then (GROUP(GROUP_INDEX) /= ' ') then if (GROUP(GROUP_INDEX) in '0' .. '9') then I := LOCATE ('9', POSSIBLE) ; else I := LOCATE (GROUP(GROUP_INDEX), POSSIBLE) ; end if ; if (I = 0) then OPTION := '?' ; -- Illegal option. ARGUMENT(1) := GROUP(GROUP_INDEX) ; else if (POSSIBLE(I) = '9') then OPTION := '-' ; COPY_STRING (GROUP(GROUP_INDEX..GROUP'LAST), ARGUMENT) ; GROUP_INDEX := GROUP'LENGTH ; elsif (I < POSSIBLE'LENGTH) and then (POSSIBLE(I+1) = ':') then OPTION := GROUP(GROUP_INDEX) ; if (GROUP_INDEX < GROUP'LENGTH) and then (GROUP(GROUP_INDEX+1) /= ' ') then COPY_STRING (GROUP(GROUP_INDEX+1..GROUP'LAST), ARGUMENT) ; GROUP_INDEX := GROUP'LENGTH ; elsif (OPTIND < ARG.COUNT) then OPTIND := OPTIND + 1 ; COPY_STRING (ARG.DATA (OPTIND), ARGUMENT) ; end if ; else OPTION := GROUP(GROUP_INDEX) ; end if ; end if ; GROUP_INDEX := GROUP_INDEX + 1 ; return ; end if ; else -- The current argument is a non-option argument. if (OPTIND /= LAST_OPTIND) then COPY_STRING (ARG.DATA (OPTIND), ARGUMENT) ; return ; end if ; end if ; OPTIND := OPTIND + 1 ; -- Move on to next argument. GROUP_INDEX := 2 ; end loop ; END_OF_OPTIONS := TRUE ; return ; end GETOPT ; end BOPT ;