| 1 |
! F2KCLI : Fortran 200x Command Line Interface |
| 2 |
! copyright Interactive Software Services Ltd. 2001 |
| 3 |
! For conditions of use see manual.txt |
| 4 |
! |
| 5 |
! Platform : Unix/Linux |
| 6 |
! Compiler : Any Fortran 9x compiler supporting IARGC/GETARG |
| 7 |
! which counts the first true command line argument |
| 8 |
! after the program name as argument number one. |
| 9 |
! (Excludes compilers which require a special USE |
| 10 |
! statement to make IARGC/GETARG available). |
| 11 |
! To compile : f90 -c f2kcli.f90 |
| 12 |
! (exact compiler name will vary) |
| 13 |
! Implementer : Lawson B. Wakefield, I.S.S. Ltd. |
| 14 |
! Date : February 2001 |
| 15 |
! |
| 16 |
MODULE F2KCLI |
| 17 |
USE IFLPORT! |
| 18 |
CONTAINS |
| 19 |
! |
| 20 |
SUBROUTINE GET_COMMAND(COMMAND,LENGTH,STATUS) |
| 21 |
! |
| 22 |
! Description. Returns the entire command by which the program was |
| 23 |
! invoked. |
| 24 |
! |
| 25 |
! Class. Subroutine. |
| 26 |
! |
| 27 |
! Arguments. |
| 28 |
! COMMAND (optional) shall be scalar and of type default character. |
| 29 |
! It is an INTENT(OUT) argument. It is assigned the entire command |
| 30 |
! by which the program was invoked. If the command cannot be |
| 31 |
! determined, COMMAND is assigned all blanks. |
| 32 |
! LENGTH (optional) shall be scalar and of type default integer. It is |
| 33 |
! an INTENT(OUT) argument. It is assigned the significant length |
| 34 |
! of the command by which the program was invoked. The significant |
| 35 |
! length may include trailing blanks if the processor allows commands |
| 36 |
! with significant trailing blanks. This length does not consider any |
| 37 |
! possible truncation or padding in assigning the command to the |
| 38 |
! COMMAND argument; in fact the COMMAND argument need not even be |
| 39 |
! present. If the command length cannot be determined, a length of |
| 40 |
! 0 is assigned. |
| 41 |
! STATUS (optional) shall be scalar and of type default integer. It is |
| 42 |
! an INTENT(OUT) argument. It is assigned the value 0 if the |
| 43 |
! command retrieval is sucessful. It is assigned a processor-dependent |
| 44 |
! non-zero value if the command retrieval fails. |
| 45 |
! |
| 46 |
CHARACTER(LEN=*), INTENT(OUT), OPTIONAL :: COMMAND |
| 47 |
INTEGER , INTENT(OUT), OPTIONAL :: LENGTH |
| 48 |
INTEGER , INTENT(OUT), OPTIONAL :: STATUS |
| 49 |
! |
| 50 |
INTEGER :: IARG,NARG,IPOS |
| 51 |
INTEGER , SAVE :: LENARG |
| 52 |
CHARACTER(LEN=2000), SAVE :: ARGSTR |
| 53 |
LOGICAL , SAVE :: GETCMD = .TRUE. |
| 54 |
! |
| 55 |
! Under Unix we must reconstruct the command line from its constituent |
| 56 |
! parts. This will not be the original command line. Rather it will be |
| 57 |
! the expanded command line as generated by the shell. |
| 58 |
! |
| 59 |
IF (GETCMD) THEN |
| 60 |
NARG = IARGC() |
| 61 |
IF (NARG > 0) THEN |
| 62 |
IPOS = 1 |
| 63 |
DO IARG = 1,NARG |
| 64 |
CALL GETARG(IARG,ARGSTR(IPOS:)) |
| 65 |
LENARG = LEN_TRIM(ARGSTR) |
| 66 |
IPOS = LENARG + 2 |
| 67 |
IF (IPOS > LEN(ARGSTR)) EXIT |
| 68 |
END DO |
| 69 |
ELSE |
| 70 |
ARGSTR = ' ' |
| 71 |
LENARG = 0 |
| 72 |
ENDIF |
| 73 |
GETCMD = .FALSE. |
| 74 |
ENDIF |
| 75 |
IF (PRESENT(COMMAND)) COMMAND = ARGSTR |
| 76 |
IF (PRESENT(LENGTH)) LENGTH = LENARG |
| 77 |
IF (PRESENT(STATUS)) STATUS = 0 |
| 78 |
RETURN |
| 79 |
END SUBROUTINE GET_COMMAND |
| 80 |
! |
| 81 |
INTEGER FUNCTION COMMAND_ARGUMENT_COUNT() |
| 82 |
! |
| 83 |
! Description. Returns the number of command arguments. |
| 84 |
! |
| 85 |
! Class. Inquiry function |
| 86 |
! |
| 87 |
! Arguments. None. |
| 88 |
! |
| 89 |
! Result Characteristics. Scalar default integer. |
| 90 |
! |
| 91 |
! Result Value. The result value is equal to the number of command |
| 92 |
! arguments available. If there are no command arguments available |
| 93 |
! or if the processor does not support command arguments, then |
| 94 |
! the result value is 0. If the processor has a concept of a command |
| 95 |
! name, the command name does not count as one of the command |
| 96 |
! arguments. |
| 97 |
! |
| 98 |
COMMAND_ARGUMENT_COUNT = IARGC() |
| 99 |
RETURN |
| 100 |
END FUNCTION COMMAND_ARGUMENT_COUNT |
| 101 |
! |
| 102 |
SUBROUTINE GET_COMMAND_ARGUMENT(NUMBER,VALUE,LENGTH,STATUS) |
| 103 |
! |
| 104 |
! Description. Returns a command argument. |
| 105 |
! |
| 106 |
! Class. Subroutine. |
| 107 |
! |
| 108 |
! Arguments. |
| 109 |
! NUMBER shall be scalar and of type default integer. It is an |
| 110 |
! INTENT(IN) argument. It specifies the number of the command |
| 111 |
! argument that the other arguments give information about. Useful |
| 112 |
! values of NUMBER are those between 0 and the argument count |
| 113 |
! returned by the COMMAND_ARGUMENT_COUNT intrinsic. |
| 114 |
! Other values are allowed, but will result in error status return |
| 115 |
! (see below). Command argument 0 is defined to be the command |
| 116 |
! name by which the program was invoked if the processor has such |
| 117 |
! a concept. It is allowed to call the GET_COMMAND_ARGUMENT |
| 118 |
! procedure for command argument number 0, even if the processor |
| 119 |
! does not define command names or other command arguments. |
| 120 |
! The remaining command arguments are numbered consecutively from |
| 121 |
! 1 to the argument count in an order determined by the processor. |
| 122 |
! VALUE (optional) shall be scalar and of type default character. |
| 123 |
! It is an INTENT(OUT) argument. It is assigned the value of the |
| 124 |
! command argument specified by NUMBER. If the command argument value |
| 125 |
! cannot be determined, VALUE is assigned all blanks. |
| 126 |
! LENGTH (optional) shall be scalar and of type default integer. |
| 127 |
! It is an INTENT(OUT) argument. It is assigned the significant length |
| 128 |
! of the command argument specified by NUMBER. The significant |
| 129 |
! length may include trailing blanks if the processor allows command |
| 130 |
! arguments with significant trailing blanks. This length does not |
| 131 |
! consider any possible truncation or padding in assigning the |
| 132 |
! command argument value to the VALUE argument; in fact the |
| 133 |
! VALUE argument need not even be present. If the command |
| 134 |
! argument length cannot be determined, a length of 0 is assigned. |
| 135 |
! STATUS (optional) shall be scalar and of type default integer. |
| 136 |
! It is an INTENT(OUT) argument. It is assigned the value 0 if |
| 137 |
! the argument retrieval is sucessful. It is assigned a |
| 138 |
! processor-dependent non-zero value if the argument retrieval fails. |
| 139 |
! |
| 140 |
! NOTE |
| 141 |
! One possible reason for failure is that NUMBER is negative or |
| 142 |
! greater than COMMAND_ARGUMENT_COUNT(). |
| 143 |
! |
| 144 |
INTEGER , INTENT(IN) :: NUMBER |
| 145 |
CHARACTER(LEN=*), INTENT(OUT), OPTIONAL :: VALUE |
| 146 |
INTEGER , INTENT(OUT), OPTIONAL :: LENGTH |
| 147 |
INTEGER , INTENT(OUT), OPTIONAL :: STATUS |
| 148 |
! |
| 149 |
! A temporary variable for the rare case case where LENGTH is |
| 150 |
! specified but VALUE is not. An arbitrary maximum argument length |
| 151 |
! of 1000 characters should cover virtually all situations. |
| 152 |
! |
| 153 |
CHARACTER(LEN=1000) :: TMPVAL |
| 154 |
! |
| 155 |
! Possible error codes: |
| 156 |
! 1 = Argument number is less than minimum |
| 157 |
! 2 = Argument number exceeds maximum |
| 158 |
! |
| 159 |
IF (NUMBER < 0) THEN |
| 160 |
IF (PRESENT(VALUE )) VALUE = ' ' |
| 161 |
IF (PRESENT(LENGTH)) LENGTH = 0 |
| 162 |
IF (PRESENT(STATUS)) STATUS = 1 |
| 163 |
RETURN |
| 164 |
ELSE IF (NUMBER > IARGC()) THEN |
| 165 |
IF (PRESENT(VALUE )) VALUE = ' ' |
| 166 |
IF (PRESENT(LENGTH)) LENGTH = 0 |
| 167 |
IF (PRESENT(STATUS)) STATUS = 2 |
| 168 |
RETURN |
| 169 |
END IF |
| 170 |
! |
| 171 |
! Get the argument if VALUE is present |
| 172 |
! |
| 173 |
IF (PRESENT(VALUE)) CALL GETARG(NUMBER,VALUE) |
| 174 |
! |
| 175 |
! The LENGTH option is fairly pointless under Unix. |
| 176 |
! Trailing spaces can only be specified using quotes. |
| 177 |
! Since the command line has already been processed by the |
| 178 |
! shell before the application sees it, we have no way of |
| 179 |
! knowing the true length of any quoted arguments. LEN_TRIM |
| 180 |
! is used to ensure at least some sort of meaningful result. |
| 181 |
! |
| 182 |
IF (PRESENT(LENGTH)) THEN |
| 183 |
IF (PRESENT(VALUE)) THEN |
| 184 |
LENGTH = LEN_TRIM(VALUE) |
| 185 |
ELSE |
| 186 |
CALL GETARG(NUMBER,TMPVAL) |
| 187 |
LENGTH = LEN_TRIM(TMPVAL) |
| 188 |
END IF |
| 189 |
END IF |
| 190 |
! |
| 191 |
! Since GETARG does not return a result code, assume success |
| 192 |
! |
| 193 |
IF (PRESENT(STATUS)) STATUS = 0 |
| 194 |
RETURN |
| 195 |
END SUBROUTINE GET_COMMAND_ARGUMENT |
| 196 |
! |
| 197 |
END MODULE F2KCLI |