SURFEX v8.1
General documentation of Surfex
xrd_getoptions.F90
Go to the documentation of this file.
2 
3 !**** *XRD_GETOPTIONS* - Parse command lines options in long form
4 
5 ! Author.
6 ! -------
7 ! Philippe Marguinaud *METEO FRANCE*
8 ! Original : 11-09-2012
9 
10 USE parkind1, ONLY: jpim, jprb, jplm
11 
12 USE xrd_unix_env, ONLY: xrd_iargc, xrd_getarg, &
15 
16 IMPLICIT NONE
17 
18 INTERFACE getoption
19  MODULE PROCEDURE getoptions, getoptionsl, &
23 
24 END INTERFACE
25 
26 !! @TODO : LIST WITH FIXED SIZE
27 
29 
30 INTEGER, PARAMETER :: argsizemax = 256
31 
32 CHARACTER(LEN=ARGSIZEMAX), POINTER :: myargs(:) => null()
33 LOGICAL(KIND=JPLM), POINTER :: check_args(:) => null()
34 LOGICAL(KIND=JPLM) :: lhelp = .false., lshell = .false.
35 
36 CHARACTER(LEN=1056) :: message_opt = ""
37 
38 
39 TYPE xrd_opt
40  CHARACTER(LEN=32) :: key, type
41  CHARACTER(LEN=1024) :: use
42  LOGICAL(KIND=JPLM) :: group = .false.
43 END TYPE
44 
45 INTEGER(KIND=JPIM) :: nopt_seen
46 TYPE(xrd_opt), POINTER :: opt_seen(:) => null()
47 
48 PRIVATE
49 
50 CONTAINS
51 
52 SUBROUTINE addgroup( USE )
53 CHARACTER(LEN=*), INTENT(IN) :: USE
54 
55 CALL init_opt_seen()
56 nopt_seen = nopt_seen + 1
57 CALL grow_opt_seen()
58 
59 opt_seen(nopt_seen)%GROUP = .true.
60 opt_seen(nopt_seen)%USE = use
61 
62 
63 END SUBROUTINE addgroup
64 
65 CHARACTER(LEN=ARGSIZEMAX) FUNCTION get_env_opt( KEY )
66 CHARACTER(LEN=*), INTENT(IN) :: KEY
67 CHARACTER(LEN=ARGSIZEMAX) :: KEY_ENV, VAL_ENV
68 INTEGER(KIND=JPIM) :: I, N
69 CHARACTER :: C
70 
71 key_env = key(3:)
72 
73 n = len(trim(key_env))
74 DO i = 1, n
75  c = key_env(i:i)
76  IF((.NOT.xrd_isalpha(c)) .AND. &
77  (.NOT.xrd_isdigit(c)) .AND. &
78  (c .NE. '_' )) THEN
79  key_env(i:i) = '_'
80  ENDIF
81 ENDDO
82 
83 val_env = ""
84 CALL xrd_getenv( 'XRD_OPT_'//trim(key_env), val_env )
85 
86 !PRINT *, " KEY = ", TRIM(KEY_ENV), " VAL = ", TRIM(VAL_ENV)
87 
88 get_env_opt = val_env
89 
90 END FUNCTION get_env_opt
91 
92 SUBROUTINE mygetarg( I, S )
93  INTEGER(KIND=JPIM), INTENT(IN) :: I
94  CHARACTER(LEN=*), INTENT(OUT) :: S
95 !
96  IF( i .LE. ubound( myargs, 1 ) ) THEN
97  s = myargs(i)
98  ELSE
99  s = ""
100  ENDIF
101 END SUBROUTINE mygetarg
102 
103 INTEGER FUNCTION myiargc()
104  INTEGER :: N
105  n = ubound( myargs, 1 )
106  myiargc = n
107 END FUNCTION myiargc
108 
109 SUBROUTINE addopt_shell( KEY, TYPE, MND, USE )
110  CHARACTER*(*), INTENT(IN) :: KEY, TYPE, USE
111  LOGICAL(KIND=JPLM), INTENT(IN) :: MND
112  OPTIONAL :: use, mnd
113 !
114  CHARACTER(LEN=ARGSIZEMAX) :: STR
115  INTEGER :: NN, N, N1, I1, I2, K
116  CHARACTER(LEN=ARGSIZEMAX), POINTER :: MYARGS1(:)
117 
118  myargs1 => null()
119 
120  IF( PRESENT( USE ) ) write( *, '("> ",A)' ) trim(use)
121  IF( PRESENT( mnd ) ) THEN
122  IF( mnd ) WRITE( *, * ) "[MANDATORY]"
123  ENDIF
124  WRITE( *, * ) "* OPTION: [", TYPE, "]", " ", TRIM(key)
125  READ( *, '(A)' ) str
126 
127 ! PRINT *, "STR = ",TRIM(STR)
128  IF( trim(str) .NE. "" ) THEN
129  IF( TYPE .EQ. 'FLAG' ) then
130  nn = 0
131  ELSE
132  nn = xrd_countwords( str )
133  ENDIF
134  n = ubound( myargs, 1 )
135  n1 = n + nn + 1
136 
137 !
138 ! REALLOC MYARGS
139 !
140  ALLOCATE( myargs1(0:n1) )
141  myargs1(0:n) = myargs(0:n)
142  DEALLOCATE( myargs )
143  myargs => myargs1
144  myargs(n+1) = key
145 
146 !
147 ! PARSE ARGUMENT LIST
148 !
149  IF( TYPE .NE. 'FLAG' ) then
150  k = 1
151  i1 = 1
152  loop_i1 : DO
153  DO
154  IF( i1 .GT. len(str)) EXIT loop_i1
155  IF( str(i1:i1) .NE. ' ' ) EXIT
156  i1 = i1+1
157  ENDDO
158  i2 = i1+1
159  DO
160  IF( i2 .GT. len(str)) EXIT
161  IF( str(i2:i2) .EQ. ' ' ) EXIT
162  i2 = i2+1
163  ENDDO
164 !PRINT *, I1, I2
165  myargs(n+1+k) = str(i1:i2-1)
166 !PRINT *, K, TRIM(MYARGS(N+1+K))
167  k = k+1
168  i1 = i2+1
169  ENDDO loop_i1
170  ENDIF
171  ENDIF
172 
173 END SUBROUTINE addopt_shell
174 
175 SUBROUTINE init_opt_seen()
177  IF( .NOT. ASSOCIATED( opt_seen ) ) THEN
178  nopt_seen = 0
179  ALLOCATE( opt_seen( 32 ) )
180  ENDIF
181 
182 END SUBROUTINE init_opt_seen
183 
184 SUBROUTINE grow_opt_seen()
185  INTEGER(KIND=JPIM) :: N
186  TYPE(xrd_opt), POINTER :: OPT_SEEN1(:)
187 
188  n = SIZE( opt_seen )
189  IF( nopt_seen .GE. n ) THEN ! REALLOC DATA
190  opt_seen1 => opt_seen
191  ALLOCATE( opt_seen( 2 * n ) )
192  opt_seen(1:nopt_seen) = opt_seen1(1:nopt_seen)
193  DEALLOCATE( opt_seen1 )
194  ENDIF
195 
196 END SUBROUTINE grow_opt_seen
197 
198 SUBROUTINE addopt( KEY, TYPE, USE )
199  CHARACTER*(*), INTENT(IN) :: KEY, TYPE, USE
200  OPTIONAL :: use
201 
202  CALL init_opt_seen()
203 
204  nopt_seen = nopt_seen + 1
205 
206  CALL grow_opt_seen()
207 
208  opt_seen(nopt_seen)%KEY = key
209  opt_seen(nopt_seen)%TYPE = TYPE
210 
211  IF( PRESENT( USE ) ) then
212  opt_seen(nopt_seen)%USE = use
213  ELSE
214  opt_seen(nopt_seen)%USE = ''
215  ENDIF
216 
217 END SUBROUTINE addopt
218 
219 SUBROUTINE initoptions( CDMESSAGE, KOPTMIN, KOPTMAX, CDARGS )
220  CHARACTER(LEN=*), OPTIONAL, INTENT (IN) :: CDMESSAGE
221  INTEGER (KIND=JPIM), OPTIONAL, INTENT (IN) :: KOPTMIN, KOPTMAX
222  CHARACTER (LEN=*), OPTIONAL, INTENT (IN) :: CDARGS (0:)
223  INTEGER(KIND=JPIM) :: N, I
224  INTEGER(KIND=JPIM) :: IOPTMIN, IOPTMAX
225  CHARACTER*32 :: STR
226 
227  IF (PRESENT (cdargs)) THEN
228  n = ubound(cdargs, 1)
229  ELSE
230  n = xrd_iargc()
231  ENDIF
232 
233  ioptmin = 0
234  ioptmax = n
235  IF (PRESENT (koptmin)) ioptmin = koptmin
236  IF (PRESENT (koptmax)) ioptmax = koptmax
237 
238  n = ioptmax-ioptmin
239 
240  ALLOCATE( myargs(0:n) )
241  DO i = 0, n
242  IF (PRESENT (cdargs)) THEN
243  myargs(i) = cdargs(ioptmin+i)
244  ELSE
245  CALL xrd_getarg( ioptmin+i, myargs(i) )
246  ENDIF
247  ENDDO
248 
249  IF( PRESENT( cdmessage ) ) THEN
250  message_opt = cdmessage
251  ELSE
252  message_opt = ""
253  ENDIF
254 
255  IF( n .EQ. 1 ) THEN
256  CALL mygetarg( 1_jpim, str )
257  IF( trim( str ) .EQ. '--help' ) THEN
258  lhelp = .true.
259  RETURN
260  ELSE IF( trim( str ) .EQ. '--shell' ) THEN
261  lshell = .true.
262  RETURN
263  ENDIF
264  ENDIF
265 
266  lhelp = .false.
267  ALLOCATE( check_args( n ) )
268  check_args = .false.
269 
270 END SUBROUTINE initoptions
271 
272 
273 
274 SUBROUTINE checkoptions()
275  INTEGER(KIND=JPIM) :: I, N, IS, NS, KS
276  CHARACTER(LEN=ARGSIZEMAX) :: OPT, PROG
277  LOGICAL(KIND=JPLM) :: PB
278  CHARACTER(LEN=10) :: FMT
279  CHARACTER(LEN=110) :: BUF
280 
281  CALL mygetarg( 0_jpim, prog )
282 
283  IF( lhelp ) THEN
284  print *, "PROGRAM: ", trim(xrd_basename( prog ))
285  IF( trim(message_opt) .NE. "" ) THEN
286  ns = len(message_opt)
287  DO is = 1, ns / 96
288  ks = len( trim(message_opt(1+(is-1)*96:is*96)) )
289  IF( ks .GT. 0 ) THEN
290  IF( is .EQ. 1 ) THEN
291  WRITE( *, '(" ")', advance = 'NO' )
292  ELSE
293  WRITE( *, '(" > ")', advance = 'NO' )
294  ENDIF
295  WRITE( fmt, '("(A",I2,")")' ) ks
296  WRITE( *, fmt ) trim(message_opt(1+(is-1)*96:is*96))
297  ENDIF
298  ENDDO
299  ENDIF
300  DO i = 1, nopt_seen
301 
302  IF(opt_seen(i)%GROUP) THEN
303  WRITE( *, * )
304  IF( trim(opt_seen(i)%USE) .NE. "" ) &
305  WRITE( *, * ) '* '//trim(opt_seen(i)%USE)
306  cycle
307  ENDIF
308 
309  buf = ""
310 
311  WRITE( buf, '(A32," = ",A15)' ) &
312  trim(opt_seen(i)%KEY), &
313  trim(opt_seen(i)%TYPE)
314 
315  IF( trim(opt_seen(i)%USE) .NE. '' ) THEN
316  ns = len( opt_seen(i)%USE)
317  DO is = 1, ns / 48
318  ks = len(trim(opt_seen(i)%USE(1+(is-1)*48:is*48)))
319  IF( ks .GT. 0 ) THEN
320  IF( is .EQ. 1 ) THEN
321  buf = trim(buf)//" : "//trim(opt_seen(i)%USE(1+(is-1)*48:is*48))
322  ELSE
323 ! 000000000011111111112222222222333333333344444444445555555555
324 ! 012345678901234567890123456789012345678901234567890123456789
325  buf = " > "&
326  //trim(opt_seen(i)%USE(1+(is-1)*48:is*48))
327  ENDIF
328  WRITE( *, '(A120)' ) buf
329  ENDIF
330  ENDDO
331  ELSE
332  WRITE( *, '(A120)' ) buf
333  WRITE( *, * )
334  ENDIF
335 
336  ENDDO
337  stop
338  ELSE IF( ASSOCIATED( check_args ) ) THEN
339  n = SIZE( check_args )
340  pb = .false.
341  DO i = 1, n
342  IF( .NOT. check_args(i) ) THEN
343  CALL mygetarg( i, opt )
344  IF( opt(1:2) .EQ. '--' ) THEN
345  print *, 'INVALID OPTION: ', trim(opt)
346  pb = .true.
347  check_args(i) = .true.
348  ENDIF
349  ENDIF
350  ENDDO
351 
352  DO i = 1, n
353  IF( .NOT. check_args(i) ) THEN
354  CALL mygetarg( i, opt )
355  print *, 'GARBAGE IN OPTIONS:`', trim(opt), "'"
356  pb = .true.
357  EXIT
358  ENDIF
359  ENDDO
360 
361  IF( pb ) CALL xrd_exit(1_jpim)
362 
363  DEALLOCATE( check_args )
364  ELSE IF( lshell ) THEN
365  OPEN( 77, file = trim(prog)//'.sh', form = 'FORMATTED' )
366  WRITE( 77, '("#!/bin/sh")' )
367  WRITE( 77, * )
368  WRITE( 77, '(A)', advance = 'NO' ) trim(prog)
369  n = ubound( myargs, 1 )
370  DO i = 1, n
371  IF( myargs(i) .EQ. '--shell' ) cycle
372  IF( myargs(i)(1:2) .EQ. '--' ) THEN
373  WRITE( 77, '(" \")' )
374  WRITE( 77, '(" ")', advance = 'NO' )
375  ENDIF
376  WRITE( 77, '(" ",A)', advance = 'NO' ) trim(myargs(i))
377  ENDDO
378  WRITE( 77, * )
379  CLOSE(77)
380  ENDIF
381 
382 
383 
384  IF( ASSOCIATED( opt_seen ) ) DEALLOCATE( opt_seen )
385  IF( ASSOCIATED( myargs ) ) DEALLOCATE( myargs )
386 END SUBROUTINE checkoptions
387 
388 
389 SUBROUTINE check_mnd( KEY, MND, USE )
390  CHARACTER(LEN=*), INTENT(IN) :: KEY
391  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE
392  LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND
393 !
394  CHARACTER(LEN=ARGSIZEMAX) :: PROG
395 
396  IF( PRESENT( mnd ) ) THEN
397  IF( mnd ) THEN
398  CALL mygetarg( 0_jpim, prog )
399  WRITE( *, '("PROGRAM: ",(A))' ) trim( prog )
400  WRITE( *, '("ERROR: OPTION `",(A),"'' IS MANDATORY")' ) trim( key )
401  IF( PRESENT( USE ) ) write( *, '(" ",(A)," : ",(A))' ) trim( key ), trim( use )
402  CALL xrd_exit(1_jpim)
403  ENDIF
404  ENDIF
405 
406 END SUBROUTINE check_mnd
407 
408 SUBROUTINE findargindex( KEY, I, N )
409  CHARACTER(LEN=*), INTENT(IN) :: KEY
410  INTEGER(KIND=JPIM), INTENT(OUT) :: I, N
411  CHARACTER(LEN=ARGSIZEMAX) :: ARG
412 
413  n = myiargc()
414  DO i = 1, n
415  CALL mygetarg( i, arg )
416  IF( trim( arg ) .EQ. trim( key ) ) RETURN
417  ENDDO
418  i = -1_jpim
419 END SUBROUTINE findargindex
420 
421 SUBROUTINE findnextargindex( I, J )
422  INTEGER(KIND=JPIM), INTENT(IN) :: I
423  INTEGER(KIND=JPIM), INTENT(OUT) :: J
424 !
425  CHARACTER(LEN=ARGSIZEMAX) :: ARG
426  INTEGER(KIND=JPIM) :: N
427 
428  n = myiargc()
429  DO j = i+1, n
430  CALL mygetarg( j, arg )
431  IF( arg(1:2) .EQ. '--' ) EXIT
432  ENDDO
433 
434 END SUBROUTINE findnextargindex
435 
436 SUBROUTINE getoptions( KEY, VAL, MND, USE )
437 !
438  CHARACTER(LEN=*), INTENT(IN) :: KEY
439  CHARACTER(LEN=*), INTENT(INOUT) :: VAL
440  LOGICAL(KIND=JPLM), INTENT(IN), OPTIONAL :: MND
441  CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: USE
442 !
443  INTEGER(KIND=JPIM) :: I, N
444  CHARACTER(LEN=ARGSIZEMAX) :: ARG
445  LOGICAL(KIND=JPLM) :: LSHELL1
446  LOGICAL(KIND=JPLM) :: FOUND
447 
448  lshell1 = lshell
449 
450  IF( lhelp ) THEN
451  CALL addopt( key, 'STRING', USE )
452  RETURN
453  ELSE IF( lshell ) THEN
454  lshell = .false.
455  CALL addopt_shell( key, 'STRING', mnd, USE )
456  ENDIF
457 
458  CALL findargindex( key, i, n )
459 
460  found = ( 0 .LT. i ) .AND. ( i .LT. n )
461 
462  IF( found ) THEN
463  IF( ASSOCIATED( check_args ) ) THEN
464  check_args(i) = .true.
465  check_args(i+1) = .true.
466  ENDIF
467  CALL mygetarg( i+1_jpim, val )
468  ELSE
469  arg = get_env_opt( key )
470  found = arg .NE. ""
471  IF( found ) val = arg
472  ENDIF
473 
474  IF( .NOT. found ) &
475  CALL check_mnd( key, mnd, USE )
476 
477  lshell = lshell1
478 
479 END SUBROUTINE getoptions
480 
481 SUBROUTINE getoptioni( KEY, VAL, MND, USE )
482 !
483  CHARACTER(LEN=*), INTENT(IN) :: KEY
484  INTEGER(KIND=JPIM), INTENT(INOUT) :: VAL
485  LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND
486  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE
487 !
488  CHARACTER(LEN=ARGSIZEMAX) :: SVAL
489  INTEGER :: ERR
490  LOGICAL(KIND=JPLM) :: LSHELL1
491 
492  lshell1 = lshell
493 
494  IF( lhelp ) THEN
495  CALL addopt( key, 'INTEGER', USE )
496  RETURN
497  ELSE IF( lshell ) THEN
498  lshell = .false.
499  CALL addopt_shell( key, 'INTEGER', mnd, USE )
500  ENDIF
501 
502  sval = ""
503  CALL getoptions( key, sval, mnd, USE )
504  IF( trim( sval ) .NE. "" ) THEN
505  READ( sval, *, iostat = err ) val
506  IF( err .NE. 0 ) THEN
507  print *, "ERROR WHILE PARSING OPTION "//trim(key)
508  CALL xrd_exit(1_jpim)
509  ENDIF
510  ENDIF
511 
512  lshell = lshell1
513 
514 END SUBROUTINE getoptioni
515 
516 SUBROUTINE getoptionr( KEY, VAL, MND, USE )
517 !
518  CHARACTER(LEN=*), INTENT(IN) :: KEY
519  REAL(KIND=JPRB), INTENT(INOUT) :: VAL
520  LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND
521  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE
522 !
523  CHARACTER(LEN=ARGSIZEMAX) :: SVAL
524  INTEGER :: ERR
525  LOGICAL(KIND=JPLM) :: LSHELL1
526 
527  lshell1 = lshell
528 
529  IF( lhelp ) THEN
530  CALL addopt( key, 'REAL', USE )
531  RETURN
532  ELSE IF( lshell ) THEN
533  lshell = .false.
534  CALL addopt_shell( key, 'REAL', mnd, USE )
535  ENDIF
536 
537  sval = ""
538  CALL getoptions( key, sval, mnd, USE )
539  IF( trim( sval ) .NE. "" ) THEN
540  READ( sval, *, iostat = err ) val
541  IF( err .NE. 0 ) THEN
542  print *, "ERROR WHILE PARSING OPTION "//trim(key)
543  CALL xrd_exit(1_jpim)
544  ENDIF
545  ENDIF
546 
547  lshell = lshell1
548 
549 END SUBROUTINE getoptionr
550 
551 SUBROUTINE readaslfromstring( VAL, SVAL )
552  CHARACTER(LEN=*), INTENT(OUT) :: VAL(:)
553  CHARACTER(LEN=*), INTENT(IN) :: SVAL
554 !
555  INTEGER(KIND=JPIM) :: I, J, K, N
556 
557  n = len( sval )
558 
559  i = 1
560  k = 1
561  do1 : DO
562  DO
563  IF( i .GT. n ) EXIT do1
564  IF( sval(i:i) .NE. ' ' ) EXIT
565  i = i + 1
566  ENDDO
567  j = i
568  DO
569  IF( j .GT. n ) EXIT
570  IF( sval(j:j) .EQ. ' ' ) EXIT
571  j = j + 1
572  ENDDO
573 
574  val(k) = sval(i:j-1)
575  i = j
576  k = k + 1
577  ENDDO do1
578 
579 
580 END SUBROUTINE readaslfromstring
581 
582 SUBROUTINE readslfromstring( VAL, SVAL )
583  CHARACTER(LEN=*), POINTER :: VAL(:)
584  CHARACTER(LEN=*), INTENT(IN) :: SVAL
585 !
586  INTEGER(KIND=JPIM) :: N
587 
588  n = xrd_countwords( sval )
589  ALLOCATE( val( n ) )
590 
591  CALL readaslfromstring( val, sval )
592 
593 END SUBROUTINE readslfromstring
594 
595 SUBROUTINE readslfromfile( VAL, SVAL )
596  CHARACTER(LEN=*), POINTER :: VAL(:)
597  CHARACTER(LEN=*), INTENT(IN) :: SVAL
598 !
599  INTEGER(KIND=JPIM) :: K, N
600  INTEGER(KIND=JPIM) :: IOERR
601  CHARACTER(LEN=4096) :: BUFFER
602 
603  OPEN( 77, file = trim(sval), form = 'FORMATTED', status = 'OLD', iostat = ioerr )
604  IF( ioerr .NE. 0 ) THEN
605  print '( "COULD NOT OPEN ",A, " FOR READING")', trim(sval)
606  CALL xrd_exit(1_jpim)
607  ENDIF
608  n = 0_jpim
609  DO
610  READ( 77, '(A)', end = 500 ) buffer
611  n = n + xrd_countwords( buffer )
612  ENDDO
613 
614  500 CONTINUE
615 
616  rewind( 77 )
617 
618  ALLOCATE( val( n ) )
619 
620  k = 1
621  DO
622  READ( 77, '(A)', end = 600 ) buffer
623  n = xrd_countwords( buffer )
624  CALL readaslfromstring( val(k:k+n-1), buffer )
625  k = k + n
626  ENDDO
627 
628  600 CONTINUE
629 
630 
631  CLOSE( 77 )
632 
633 END SUBROUTINE readslfromfile
634 
635 SUBROUTINE getoptionsl( KEY, VAL, MND, USE )
636 !
637  CHARACTER(LEN=*), INTENT(IN) :: KEY
638  CHARACTER(LEN=*), POINTER :: VAL(:)
639  LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND
640  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE
641 !
642  INTEGER(KIND=JPIM) :: I, J, K, N
643  CHARACTER(LEN=ARGSIZEMAX) :: ARG
644  CHARACTER(LEN=ARGSIZEMAX) :: SVAL
645  LOGICAL(KIND=JPLM) :: LSHELL1
646  LOGICAL(KIND=JPLM) :: FOUND
647 
648  lshell1 = lshell
649 
650  IF( lhelp ) THEN
651  CALL addopt( key, 'STRING-LIST', USE )
652  RETURN
653  ELSE IF( lshell ) THEN
654  lshell = .false.
655  CALL addopt_shell( key, 'STRING-LIST', mnd, USE )
656  ENDIF
657 
658  CALL findargindex( key, i, n )
659 
660  found = i >= 0
661 
662  IF( found ) THEN
663 
664  CALL findnextargindex( i, j )
665 
666  ALLOCATE( val( j - i - 1 ) )
667 
668  IF( ASSOCIATED( check_args ) ) &
669  check_args(i) = .true.
670 
671  DO k = i+1, j-1
672  IF( ASSOCIATED( check_args ) ) &
673  check_args(k) = .true.
674  CALL mygetarg( k, arg )
675  IF ((i+1.EQ.j-1) .AND. (arg(1:7).EQ.'file://')) THEN
676  DEALLOCATE (val)
677  arg = arg(8:)
678  CALL readslfromfile( val, arg )
679  ELSE
680  val(k-i) = arg
681  ENDIF
682  ENDDO
683 
684  ENDIF
685 
686  IF(.NOT. found) THEN
687  sval = get_env_opt( key )
688  found = sval .NE. ""
689  IF( found ) &
690  CALL readslfromstring( val, sval )
691  ENDIF
692 
693  IF( .NOT. found ) &
694  CALL check_mnd( key, mnd, USE )
695 
696  lshell = lshell1
697 
698 END SUBROUTINE getoptionsl
699 
700 SUBROUTINE getoptionil( KEY, VAL, MND, USE )
701 !
702  CHARACTER(LEN=*), INTENT(IN) :: KEY
703  INTEGER(KIND=JPIM), POINTER :: VAL(:)
704  LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND
705  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE
706 !
707  CHARACTER(LEN=ARGSIZEMAX), POINTER :: SVAL(:)
708  INTEGER(KIND=JPIM) :: I, N
709  INTEGER :: ERR
710  LOGICAL(KIND=JPLM) :: LSHELL1
711 
712  NULLIFY (sval)
713 
714  lshell1 = lshell
715 
716  IF( lhelp ) THEN
717  CALL addopt( key, 'INTEGER-LIST', USE )
718  RETURN
719  ELSE IF( lshell ) THEN
720  lshell = .false.
721  CALL addopt_shell( key, 'INTEGER-LIST', mnd, USE )
722  ENDIF
723 
724  CALL getoptionsl( key, sval, mnd, USE )
725 
726  IF( .NOT. ASSOCIATED( sval ) ) GOTO 999
727 
728  n = SIZE( sval )
729  ALLOCATE( val( n ) )
730  DO i = 1, n
731  READ( sval( i ), *, iostat = err ) val( i )
732  IF( err .NE. 0 ) THEN
733  print *, "ERROR WHILE PARSING OPTION "//trim(key)
734  CALL xrd_exit(1_jpim)
735  ENDIF
736  ENDDO
737 
738  DEALLOCATE( sval )
739 
740 999 CONTINUE
741  lshell = lshell1
742 
743 END SUBROUTINE getoptionil
744 
745 SUBROUTINE getoptionrl( KEY, VAL, MND, USE )
746 !
747  CHARACTER(LEN=*), INTENT(IN) :: KEY
748  REAL(KIND=JPRB), POINTER :: VAL(:)
749  LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND
750  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE
751 !
752  CHARACTER(LEN=ARGSIZEMAX), POINTER :: SVAL(:)
753  INTEGER(KIND=JPIM) :: I, N
754  INTEGER :: ERR
755  LOGICAL(KIND=JPLM) :: LSHELL1
756 
757  NULLIFY (sval)
758 
759  lshell1 = lshell
760 
761  IF( lhelp ) THEN
762  CALL addopt( key, 'REAL-LIST', USE )
763  RETURN
764  ELSE IF( lshell ) THEN
765  lshell = .false.
766  CALL addopt_shell( key, 'REAL-LIST', mnd, USE )
767  ENDIF
768 
769  CALL getoptionsl( key, sval, mnd, USE )
770 
771  IF( .NOT. ASSOCIATED( sval ) ) GOTO 999
772 
773  n = SIZE( sval )
774  ALLOCATE( val( n ) )
775  DO i = 1, n
776  READ( sval( i ), *, iostat = err ) val( i )
777  IF( err .NE. 0 ) THEN
778  print *, "ERROR WHILE PARSING OPTION "//trim(key)
779  CALL xrd_exit(1_jpim)
780  ENDIF
781  ENDDO
782 
783  DEALLOCATE( sval )
784 
785 999 CONTINUE
786  lshell = lshell1
787 
788 END SUBROUTINE getoptionrl
789 
790 SUBROUTINE getoptionb( KEY, VAL, USE )
791 !
792  CHARACTER(LEN=*), INTENT(IN) :: KEY
793  LOGICAL(KIND=JPLM), INTENT(INOUT) :: VAL
794  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE
795 !
796  LOGICAL(KIND=JPLM) :: LSHELL1
797  LOGICAL(KIND=JPLM) :: FOUND
798  CHARACTER(LEN=ARGSIZEMAX) :: SVAL
799  INTEGER(KIND=JPIM) :: I, N
800 
801  lshell1 = lshell
802 
803  val = .false.
804 
805  IF( lhelp ) THEN
806  CALL addopt( key, 'FLAG', USE )
807  RETURN
808  ELSE IF( lshell ) THEN
809  lshell = .false.
810  CALL addopt_shell( key, 'FLAG', .false._jplm, USE )
811  ENDIF
812 
813  CALL findargindex( key, i, n )
814  found = i > 0
815  IF( found .AND. ASSOCIATED( check_args ) ) THEN
816  check_args(i) = .true.
817  val = .true.
818  ELSE
819  sval = get_env_opt( key )
820  IF( sval .NE. "" ) &
821  READ( sval, * ) val
822  ENDIF
823 
824  lshell = lshell1
825 
826 END SUBROUTINE getoptionb
827 
828 END MODULE xrd_getoptions
subroutine readslfromstring(VAL, SVAL)
integer(kind=jpim) function xrd_countwords(S)
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine getoptioni(KEY, VAL, MND, USE)
character(len=argsizemax) function get_env_opt(KEY)
type(xrd_opt), dimension(:), pointer opt_seen
integer, parameter jpim
Definition: parkind1.F90:13
subroutine, public addgroup(USE)
logical(kind=jplm) lhelp
logical(kind=jplm) function xrd_isalpha(C)
subroutine getoptions(KEY, VAL, MND, USE)
character(len=1056) message_opt
subroutine getoptionr(KEY, VAL, MND, USE)
integer(kind=jpim) function xrd_iargc()
logical(kind=jplm) lshell
subroutine init_opt_seen()
subroutine findargindex(KEY, I, N)
subroutine findnextargindex(I, J)
subroutine getoptionsl(KEY, VAL, MND, USE)
subroutine, public checkoptions()
integer, parameter jprb
Definition: parkind1.F90:32
subroutine xrd_exit(STATUS)
subroutine readaslfromstring(VAL, SVAL)
character *256 function xrd_basename(PATH)
integer, parameter argsizemax
subroutine, public initoptions(CDMESSAGE, KOPTMIN, KOPTMAX, CDARGS)
subroutine getoptionrl(KEY, VAL, MND, USE)
logical(kind=jplm) function xrd_isdigit(C)
subroutine addopt(KEY, TYPE, USE)
subroutine addopt_shell(KEY, TYPE, MND, USE)
subroutine grow_opt_seen()
integer, parameter jplm
Definition: parkind1.F90:44
integer function myiargc()
subroutine mygetarg(I, S)
integer(kind=jpim) nopt_seen
subroutine check_mnd(KEY, MND, USE)
character(len=argsizemax), dimension(:), pointer myargs
subroutine readslfromfile(VAL, SVAL)
subroutine xrd_getarg(KEY, VAL)
logical(kind=jplm), dimension(:), pointer check_args
subroutine getoptionil(KEY, VAL, MND, USE)
subroutine getoptionb(KEY, VAL, USE)
subroutine xrd_getenv(KEY, VAL)