84 private::ftn_arg_get_dbl,ftn_arg_get_int,ftn_arg_get_lgc,ftn_arg_get_sng
85 private::ftn_arg_get_flt
89 module procedure ftn_arg_get_dbl,ftn_arg_get_int,ftn_arg_get_lgc,ftn_arg_get_sng
91 module procedure ftn_arg_get_flt
104 character(len=*),
intent(in)::sng
131 character(len=*),
intent(in)::sng
139 if (len_sng >= 1)
then 140 if (sng(1:1) ==
'-') dsh_nbr=1
142 if (len_sng >= 2)
then 143 if (sng(1:2) ==
'--') dsh_nbr=2
147 if (sng(idx:idx) ==
' ' .or. sng(idx:idx) ==
'=')
goto 100
156 subroutine ftn_getarg_wrp( & ! [sbr] Call getarg() and increment arg_idx
168 integer,
intent(inout)::arg_idx
169 character(len=*),
intent(inout)::arg_val
173 call get_command_argument(arg_idx,arg_val)
175 ': DEBUG ftn_getarg_wrp() reports arg_idx = ',arg_idx,
', arg_val = ',arg_val(1:len_trim(arg_val))
195 integer,
intent(inout)::arg_idx
196 character(len=*),
intent(inout)::arg_val
202 arg_nbr=command_argument_count()
206 ': Short option syntax is dash-key-space-value, e.g., -D 2' 208 ': Long option syntax is dash-dash-key-space-value, e.g., --dbg 2', &
209 ', or dash-dash-key-equal-value, e.g., --dbg=2 (preferred)' 212 ': DEBUG ftn_getarg_err() reports arg_idx = ',arg_idx,
', arg_val = ',arg_val(1:len_trim(arg_val))
213 if (arg_idx+1 <= arg_nbr)
then 215 call get_command_argument(arg_idx,arg_val)
217 ': DEBUG Next argument value is arg_val(',arg_idx,
') = ',arg_val
220 ': DEBUG No arguments follow this one' 224 stop
'Exit on error from ftn_getarg_err()' 242 subroutine ftn_arg_get_dbl( & ! [sbr] Process double-valued command-line argument
243 arg_idx, & ! I/O [idx] Argument counter
244 arg_val, & ! I/O [sng] Double to copy into opt_val
245 opt_val, & ! O [frc] Variable to receive copy of arg_val
253 character(len=*),
parameter::sbr_nm=
'ftn_arg_get_dbl' 257 integer,
intent(inout)::arg_idx
258 character(len=*),
intent(inout)::arg_val
260 real(selected_real_kind(p=12)),intent(out)::opt_val
261 logical,
optional,
intent(out)::opt_flg
265 integer arg_val_srt_idx
266 logical opt_cnj_is_spc
269 arg_lng=len_trim(arg_val)
273 ': DEBUG '//sbr_nm//
'() reports arg_idx = ',arg_idx, &
274 ', Full option = ''',arg_val(1:arg_lng),
''', Length = ',arg_lng
278 if (opt_lng+2 < arg_lng)
then 279 opt_cnj_is_spc=.false.
280 arg_val_srt_idx=3+opt_lng+1
283 ': DEBUG '//sbr_nm//
'() diassembles argument into Option = ''', &
284 arg_val(3:2+opt_lng),
''', conjunction is ''', &
285 arg_val(3+opt_lng:3+opt_lng),
''', argument = ''', &
286 arg_val(arg_val_srt_idx:arg_lng),
'''' 289 opt_cnj_is_spc=.true.
292 if (opt_cnj_is_spc)
then 295 call get_command_argument(arg_idx,arg_val)
299 arg_lng=len_trim(arg_val)
300 if (arg_lng <= 0) stop
'ftn_???_arg_get() reports option lacks argument' 303 read (arg_val(arg_val_srt_idx:arg_lng),*) opt_val
306 ': DEBUG '//sbr_nm//
'() assigned argument value = ',opt_val
308 if(
present(opt_flg)) opt_flg=.true.
310 end subroutine ftn_arg_get_dbl
312 subroutine ftn_arg_get_flt( & ! [sbr] Process float-valued command-line argument
313 arg_idx, & ! I/O [idx] Argument counter
314 arg_val, & ! I/O [sng] Float to copy into opt_val
315 opt_val, & ! O [frc] Variable to receive copy of arg_val
323 character(len=*),
parameter::sbr_nm=
'ftn_arg_get_flt' 327 integer,
intent(inout)::arg_idx
328 character(len=*),
intent(inout)::arg_val
330 real(selected_real_kind(p=6)),intent(out)::opt_val
331 logical,
optional,
intent(out)::opt_flg
335 integer arg_val_srt_idx
336 logical opt_cnj_is_spc
339 arg_lng=len_trim(arg_val)
343 ': DEBUG '//sbr_nm//
'() reports arg_idx = ',arg_idx, &
344 ', Full option = ''',arg_val(1:arg_lng),
''', Length = ',arg_lng
348 if (opt_lng+2 < arg_lng)
then 349 opt_cnj_is_spc=.false.
350 arg_val_srt_idx=3+opt_lng+1
353 ': DEBUG '//sbr_nm//
'() diassembles argument into Option = ''', &
354 arg_val(3:2+opt_lng),
''', conjunction is ''', &
355 arg_val(3+opt_lng:3+opt_lng),
''', argument = ''', &
356 arg_val(arg_val_srt_idx:arg_lng),
'''' 359 opt_cnj_is_spc=.true.
362 if (opt_cnj_is_spc)
then 365 call get_command_argument(arg_idx,arg_val)
369 arg_lng=len_trim(arg_val)
370 if (arg_lng <= 0) stop
'ftn_???_arg_get() reports option lacks argument' 373 read (arg_val(arg_val_srt_idx:arg_lng),*) opt_val
376 ': DEBUG '//sbr_nm//
'() assigned argument value = ',opt_val
378 if(
present(opt_flg)) opt_flg=.true.
380 end subroutine ftn_arg_get_flt
382 subroutine ftn_arg_get_int( & ! [sbr] Process integer-valued command-line argument
383 arg_idx, & ! I/O [idx] Argument counter
384 arg_val, & ! I/O [sng] Integer to copy into opt_val
385 opt_val, & ! O [nbr] Variable to receive copy of arg_val
393 character(len=*),
parameter::sbr_nm=
'ftn_arg_get_int' 397 integer,
intent(inout)::arg_idx
398 character(len=*),
intent(inout)::arg_val
400 integer,
intent(inout)::opt_val
401 logical,
optional,
intent(out)::opt_flg
406 integer arg_val_srt_idx
407 logical opt_cnj_is_spc
410 arg_lng=len_trim(arg_val)
414 ': DEBUG '//sbr_nm//
'() reports arg_idx = ',arg_idx, &
415 ', Full option = ''',arg_val(1:arg_lng),
''', Length = ',arg_lng
419 if (opt_lng+2 < arg_lng)
then 420 opt_cnj_is_spc=.false.
421 arg_val_srt_idx=3+opt_lng+1
424 ': DEBUG '//sbr_nm//
'() diassembles argument into Option = ''', &
425 arg_val(3:2+opt_lng),
''', conjunction is ''', &
426 arg_val(3+opt_lng:3+opt_lng),
''', argument = ''', &
427 arg_val(arg_val_srt_idx:arg_lng),
'''' 430 opt_cnj_is_spc=.true.
433 if (opt_cnj_is_spc)
then 436 call get_command_argument(arg_idx,arg_val)
440 arg_lng=len_trim(arg_val)
441 if (arg_lng <= 0) stop
'ftn_arg_get_int() reports option lacks argument' 444 read (arg_val(arg_val_srt_idx:arg_lng),*) opt_val
447 ': DEBUG '//sbr_nm//
'() assigned argument value = ',opt_val
449 if(
present(opt_flg)) opt_flg=.true.
451 end subroutine ftn_arg_get_int
453 subroutine ftn_arg_get_lgc( & ! [sbr] Process logical-valued command-line argument
454 arg_idx, & ! I/O [idx] Argument counter
455 arg_val, & ! I/O [sng] Logical to copy into opt_val
456 opt_val, & ! O [flg] Variable to receive copy of arg_val
464 character(len=*),
parameter::sbr_nm=
'ftn_arg_get_lgc' 468 integer,
intent(inout)::arg_idx
469 character(len=*),
intent(inout)::arg_val
471 logical,
intent(out)::opt_val
472 logical,
optional,
intent(out)::opt_flg
476 integer arg_val_srt_idx
477 logical opt_cnj_is_spc
480 arg_lng=len_trim(arg_val)
484 ': DEBUG '//sbr_nm//
'() reports arg_idx = ',arg_idx, &
485 ', Full option = ''',arg_val(1:arg_lng),
''', Length = ',arg_lng
489 if (opt_lng+2 < arg_lng)
then 490 opt_cnj_is_spc=.false.
491 arg_val_srt_idx=3+opt_lng+1
494 ': DEBUG '//sbr_nm//
'() diassembles argument into Option = ''', &
495 arg_val(3:2+opt_lng),
''', conjunction is ''', &
496 arg_val(3+opt_lng:3+opt_lng),
''', argument = ''', &
497 arg_val(arg_val_srt_idx:arg_lng),
'''' 500 opt_cnj_is_spc=.true.
503 if (opt_cnj_is_spc)
then 506 call get_command_argument(arg_idx,arg_val)
510 arg_lng=len_trim(arg_val)
511 if (arg_lng <= 0) stop
'ftn_arg_get_lgc() reports option lacks argument' 514 read (arg_val(arg_val_srt_idx:arg_lng),*) opt_val
517 ': DEBUG '//sbr_nm//
'() assigned argument value = ',opt_val
519 if(
present(opt_flg)) opt_flg=.true.
521 end subroutine ftn_arg_get_lgc
523 subroutine ftn_arg_get_sng( & ! [sbr] Process string-valued command-line argument
524 arg_idx, & ! I/O [idx] Argument counter
525 arg_val, & ! I/O [sng] String to copy into opt_val
526 opt_val, & ! O [sng] Variable to receive copy of arg_val
536 character(len=*),
parameter::sbr_nm=
'ftn_arg_get_sng' 540 integer,
intent(inout)::arg_idx
541 character(len=*),
intent(inout)::arg_val
543 character(len=*),
intent(out)::opt_val
544 logical,
optional,
intent(out)::opt_flg
550 integer arg_val_srt_idx
551 logical opt_cnj_is_spc
556 arg_lng=len_trim(arg_val)
560 ': DEBUG '//sbr_nm//
'() reports arg_idx = ',arg_idx, &
561 ', Option = ''',arg_val(1:arg_lng),
''', Length = ',arg_lng
565 if (opt_lng+2 < arg_lng)
then 566 opt_cnj_is_spc=.false.
567 arg_val_srt_idx=3+opt_lng+1
570 ': DEBUG '//sbr_nm//
'() diassembles argument into Option = ''', &
571 arg_val(3:2+opt_lng),
''', conjunction is ''', &
572 arg_val(3+opt_lng:3+opt_lng),
''', argument = ''', &
573 arg_val(arg_val_srt_idx:arg_lng),
'''' 576 opt_cnj_is_spc=.true.
579 if (opt_cnj_is_spc)
then 582 call get_command_argument(arg_idx,arg_val)
586 arg_lng=len_trim(arg_val)
587 if (arg_lng <= 0) stop
'ftn_???_arg_get() reports option lacks argument' 588 if (arg_lng > len_var)
then 590 ': ERROR '//sbr_nm//
'() reports argument length = ',arg_lng, &
591 ' too long to fit into variable length ',len_var
596 read (arg_val(arg_val_srt_idx:arg_lng),
'(a)') opt_val
598 nll_srt_idx=arg_lng-arg_val_srt_idx+2
599 do idx=nll_srt_idx,len_var
600 opt_val(idx:idx)=char(0)
604 ': DEBUG '//sbr_nm//
'() assigned argument value = ',opt_val(1:len_trim(opt_val)),
'<--End of opt_val string' 607 if(
present(opt_flg)) opt_flg=.true.
609 end subroutine ftn_arg_get_sng
619 character(len=*),
intent(in)::sng1
620 character(len=*),
intent(in)::sng2
632 if (sng1(idx1:idx1) == sng2(1:1))
then 634 if (sng1(idx1+idx2-1:idx1+idx2-1) /= sng2(idx2:idx2))
goto 200
641 if (idx2 == lng2+1)
then 655 character(len=*),
intent(out)::sng
676 character(len=*),
intent(inout)::sng
680 integer lst_sgn_chr_idx
684 do idx=lst_sgn_chr_idx+1,lng
685 if(sng(idx:idx) ==
' ') sng(idx:idx)=char(0)
705 character(len=*),
intent(in)::sng
713 if (sng(idx:idx) /=
' '.and.sng(idx:idx) /= char(0))
goto 100
730 character(len=*),
intent(in)::sng
738 if (sng(idx:idx) == char(0) .or. iachar(sng(idx:idx)) > 127)
goto 100
751 character(len=*),
intent(in)::sng
762 iachr_crr=iachar(chr_crr)
764 if (iachr_crr == 0)
then 765 write (6,
'(a3,a3,i3,a2)',advance=
"no")
'NUL',
' = ',iachr_crr,
', ' 766 else if (iachr_crr == 32)
then 767 write (6,
'(a5,a3,i3,a2)',advance=
"no")
'SPACE',
' = ',iachr_crr,
', ' 769 write (6,
'(a1,a3,i3,a2)',advance=
"no") chr_crr,
' = ',iachr_crr,
', ' 772 if (iachr_crr == 0)
then 773 write (6,
'(a3,a3,i3)')
'NUL',
' = ',iachr_crr,
', ' 774 else if (iachr_crr == 32)
then 775 write (6,
'(a5,a3,i3)')
'SPACE',
' = ',iachr_crr,
', ' 777 write (6,
'(a1,a3,i3)') chr_crr,
' = ',iachr_crr,
', ' 794 character(len=*),
intent(in)::sng2
796 character(len=*),
intent(inout)::sng1
819 if (len1 < lng2)
then 821 write (6,
'(a,i3,a,i3,2a)')
'len1 = ',len1,
', lng1 = ',lng1,
', sng1 = ',sng1
822 write (6,
'(a,i3,a,i3,2a)')
'len2 = ',len2,
', lng2 = ',lng2,
', sng2 = ',sng2
823 stop
'EXIT_FAILURE from ftn_strcpy()' 825 sng1(1:lng2)=sng2(1:lng2)
840 character(len=*),
intent(in)::sng1
841 character(len=*),
intent(in)::sng2
859 write (6,
'(2(a,i3),2a)')
'len1 = ',len1,
', lng1 = ',lng1,
', sng1 = ',sng1
860 write (6,
'(2(a,i3),2a)')
'len2 = ',len2,
', lng2 = ',lng2,
', sng2 = ',sng2
864 lng_min=min(lng1,lng2)
868 if (iachar(sng1(idx:idx)) == iachar(sng2(idx:idx))) cycle
870 if (iachar(sng1(idx:idx)) < iachar(sng2(idx:idx)))
then 880 if (lng1 == lng2)
then 888 if (lng1 > lng2)
then 909 character(len=*),
intent(in)::sng2
911 character(len=*),
intent(inout)::sng1
923 if (len1 < lsc2)
then 925 write (6,
'(a,i3,a,i3,2a)')
'len1 = ',len1,
', lsc1 = ',lsc1,
', sng1 = ',sng1
926 write (6,
'(a,i3,a,i3,2a)')
'len2 = ',len2,
', lsc2 = ',lsc2,
', sng2 = ',sng2
927 stop
'EXIT_FAILURE from ftn_strcpylsc()' 929 sng1(1:lsc2)=sng2(1:lsc2)
932 sng1(idx:idx)=char(0)
937 subroutine ftn_strcat( & ! [fnc] sng1 := sng1 // sng2
938 sng1, & ! I/O [sng] String to affix second string to
948 character(len=*),
intent(in)::sng2
950 character(len=*),
intent(inout)::sng1
961 if (lng1+lng2 >= len1)
then 963 write (6,
'(a,i3,a,i3,2a)')
'len1 = ',len1,
', lng1 = ',lng1,
', sng1 = ',sng1
964 write (6,
'(a,i3,a,i3,2a)')
'len2 = ',len2,
', lng2 = ',lng2,
', sng2 = ',sng2
965 stop
'EXIT_FAILURE from ftn_strcat()' 967 sng1(lng1+1:lng1+lng2)=sng2(1:lng2)
983 character(len=*),
intent(in)::sng1
985 character(len=*),
intent(inout)::sng2
1002 len_trim1=len_trim(sng1)
1003 len_trim2=len_trim(sng2)
1004 if (lsc1+lsc2 >= len2)
then 1006 write (6,
'(4(a,i3),2a)')
'len1 = ',len1,
', len_trim1 = ',len_trim1,
', lng1 = ',lng1,
', sng1 = ',sng1
1007 write (6,
'(4(a,i3),2a)')
'len2 = ',len2,
', len_trim2 = ',len_trim2,
', lng2 = ',lng2,
', sng2 = ',sng2
1010 stop
'EXIT_FAILURE from ftn_strpfx()' 1013 sng2(lsc1+1:lsc1+lsc2)=sng2(1:lsc2)
1014 sng2(1:lsc1)=sng1(1:lsc1)
1018 subroutine ftn_drcpfx( & ! [sbr] fl_nm := drc/fl_nm
1019 drc, & ! I [sng] Directory to prepend
1032 character(len=*),
intent(in)::drc
1034 character(len=*),
intent(inout)::fl_nm
1045 if (lng_drc+lng_fl >= len_fl)
then 1047 write (6,
'(2(a,i3),2a)')
'len_drc = ',len_drc,
', lng_drc = ',lng_drc,
', drc = ',drc
1048 write (6,
'(2(a,i3),2a)')
'len_fl = ',len_fl,
', lng_fl = ',lng_fl,
', fl_nm = ',fl_nm
1051 stop
'EXIT_FAILURE from ftn_drcpfx()' 1059 if (drc(lng_drc:lng_drc) /=
'/')
then 1061 if (lng_drc+lng_fl+1 < len_fl)
then 1064 fl_nm(lng_drc+2:lng_drc+2+lng_fl)=fl_nm(1:lng_fl)
1065 fl_nm(1:lng_drc)=drc(1:lng_drc)
1066 fl_nm(lng_drc+1:lng_drc+1)=
'/' 1069 fl_nm(lng_drc+1:lng_drc+1+lng_fl)=fl_nm(1:lng_fl)
1070 fl_nm(1:lng_drc)=drc(1:lng_drc)
1078 subroutine ftn_prg_id_mk(CVS_Id,CVS_Revision,CVS_Date,prg_ID)
1084 integer,
parameter::CVS_kk=0
1085 integer,
parameter::CVS_kv=1
1086 integer,
parameter::CVS_kkv=2
1088 character(len=*),
intent(in)::CVS_Id
1089 character(len=*),
intent(in)::CVS_Revision
1090 character(len=*),
intent(in)::CVS_Date
1092 character(len=*),
intent(out)::prg_ID
1102 if (date_ptr < 0)
then 1108 if (slash_ptr > 0)
then 1117 write (6,
'(a,a)')
'CVS_Id: ',cvs_id
1118 write (6,
'(a,a)')
'CVS_Revision: ',cvs_revision
1119 write (6,
'(a,a)')
'CVS_Date: ',cvs_date
1120 write (6,
'(a,i1)')
'CVS_typ: ',cvs_typ
1121 write (6,
'(a,i2)')
'Date_ptr: ',date_ptr
1122 write (6,
'(a,i2)')
'slash_ptr: ',slash_ptr
1129 if (cvs_typ == cvs_kk)
then 1130 prg_id=
'Source file unknown Version unknown Date unknown' // char(0)
1133 if (prg_ptr < 0) stop
'ERROR: ftn_prg_ID_mk() unable to find source code name' 1134 if (cvs_typ == cvs_kv)
then 1135 prg_id=cvs_id(1:prg_ptr-1) // &
1136 ' version ' // cvs_revision(1:
ftn_strlen(cvs_revision)) // &
1137 ' dated ' // cvs_date(1:
ftn_strlen(cvs_date)) //
' GMT' // char(0)
1138 else if (cvs_typ == cvs_kkv)
then 1140 if (vrs_ptr < 0) stop
'ERROR: ftn_prg_ID_mk() unable to find revision number' 1141 prg_id=cvs_id(6:prg_ptr-1) // &
1142 ' version ' // cvs_revision(vrs_ptr+5:
ftn_strlen(cvs_revision)-2) // &
1143 ' dated ' // cvs_date(8:26) //
' GMT' // char(0)
1160 character(len=*),
intent(out)::cmd_ln
1162 character(len=80) arg_val
1171 cmd_ln_len=len(cmd_ln)
1174 arg_nbr=command_argument_count()
1176 write (6,
'(a,i2)')
'ftn_cmd_ln_sng(): arg_nbr = ',arg_nbr
1180 do arg_idx=0,arg_nbr
1184 if (arg_idx > 0) cmd_ln(cmd_ln_lng+1:cmd_ln_lng+1)=
' ' 1186 call get_command_argument(arg_idx,arg_val)
1191 if (cmd_ln_lng > cmd_ln_len) stop
'cmd_ln_lng > cmd_ln_len in ftn_cmd_ln_sng()' 1193 write (6,
'(a,i3)')
'arg_idx = ',arg_idx
1194 write (6,
'(a,a)')
'arg_val = ',arg_val
1195 write (6,
'(a,i3)')
'len(arg_val) = ',len(arg_val)
1196 write (6,
'(a,i3)')
'ftn_strlen(arg_val) = ',
ftn_strlen(arg_val)
1197 write (6,
'(a,i3)')
'ftn_strlen(cmd_ln) = ',
ftn_strlen(cmd_ln)
1198 write (6,
'(a,a)')
'cmd_ln = ',cmd_ln
1215 integer,
intent(in)::idate
1225 mm=mod(abs(idate),10000)/100
1226 dd=mod(abs(idate),100)
1227 write(
ftn_date2sng,
'(i4.4,a1,i2.2,a1,i2.2)') yy,dash,mm,dash,dd
1238 integer,
intent(in)::isec
1248 mm=mod(isec,3600)/60
1250 write(
ftn_sec2sng,
'(i2.2,a1,i2.2,a1,i2.2)') hh,colon,mm,colon,ss
integer function ftn_strfic(sng)
subroutine ftn_getarg_wrp(arg_idx, arg_val)
subroutine ftn_strcpy(sng1, sng2)
subroutine ftn_getarg_err(arg_idx, arg_val)
subroutine ftn_cmd_ln_sng(cmd_ln)
integer function ftn_strcmp(sng1, sng2)
integer, parameter dbg_vrb
subroutine ftn_prg_id_mk(CVS_Id, CVS_Revision, CVS_Date, prg_ID)
subroutine ftn_strpfx(sng1, sng2)
integer function ftn_strlen(sng)
integer function ftn_opt_lng_get(sng)
subroutine ftn_strcat(sng1, sng2)
subroutine ftn_strini(sng)
subroutine ftn_strnul(sng)
subroutine ftn_drcpfx(drc, fl_nm)
subroutine ftn_strprn(sng)
character(len=8) function ftn_sec2sng(isec)
subroutine ftn_strcpylsc(sng1, sng2)
integer, parameter dbg_io
integer function ftn_strstr(sng1, sng2)
integer function ftn_strlsc(sng)
character(len=10) function ftn_date2sng(idate)
integer, parameter dbg_vec