66 public::
operator(.onthesamefile.)
71 module procedure url_merge_cc
72 module procedure url_merge_cccc
73 module procedure url_merge_cccca
79 module procedure url_split_c
84 module procedure url_resolve_c
89 module procedure url_search_iorange
92 interface operator(.onthesamefile.)
93 module procedure urlonthesamefile
160 function url_merge_cc(file, var)
result(result)
162 character(len = STRING):: result
163 character(len = *),
intent(in):: file
164 character(len = *),
intent(in):: var
166 result = url_merge_cccc(file, var,
"",
"")
167 end function url_merge_cc
198 function url_merge_cccca(file, var, attr, iorange)
result(result)
200 character(len = STRING):: result
201 character(len = *),
intent(in):: file
202 character(len = *),
intent(in):: var
203 character(len = *),
intent(in):: attr
204 character(len = *),
intent(in):: iorange(:)
212 if (var /=
"") result = trim(result) // var
214 result = trim(result) //
gt_colon // attr
216 do i = 1,
size(iorange)
217 if (iorange(i) /=
"")
then
218 if (iorange(i)(1:1) ==
gt_comma)
then
219 result = trim(result) // trim(iorange(i))
221 result = trim(result) //
gt_comma // trim(iorange(i))
225 end function url_merge_cccca
252 function url_merge_cccc(file, var, attr, iorange)
result(result)
254 character(len = STRING):: result
255 character(len = *),
intent(in):: file
256 character(len = *),
intent(in):: var
257 character(len = *),
intent(in):: attr
258 character(len = *),
intent(in):: iorange
260 if (trim(file) /=
"")
then
265 if (trim(var) /=
"") result = trim(result) // var
266 if (trim(attr) /=
"")
then
267 result = trim(result) //
gt_colon // attr
269 if (trim(iorange) /=
"")
then
271 result = trim(result) // iorange
273 result = trim(result) //
gt_comma // iorange
276 end function url_merge_cccc
302 character(len = *),
intent(in):: fullname
303 character(len = *),
intent(out):: iorange
304 character(len = *),
intent(out):: remainder
305 character(STRING):: file, var, attr
306 call urlsplit(fullname, file=file, var=var, attr=attr, iorange=iorange)
307 remainder = url_merge_cccc(file=file, var=var, attr=attr, iorange=
"")
345 function url_search_iorange(fullname, dimvar)
result(result)
348 character(len = *),
intent(in):: fullname
349 character(len = *),
intent(in):: dimvar
350 character(len = STRING):: result
351 character(STRING):: file, var, attr, iorange
352 character(STRING),
pointer :: ioranges_slice(:) => null()
353 integer :: i, eqpos, atmark
358 if (atmark == 0) atmark = index(fullname,
gt_atmark)
359 if (atmark /= 0)
then
360 call urlsplit(fullname, file=file, var=var, attr=attr, iorange=iorange)
365 do i = 1,
size(ioranges_slice)
366 eqpos = index(ioranges_slice(i),
gt_equal)
367 if (ioranges_slice(i)(1:eqpos-1) == trim(dimvar))
then
368 result = trim(ioranges_slice(i)(eqpos+1:))
372 deallocate(ioranges_slice)
373 end function url_search_iorange
403 subroutine url_split_c(fullname, file, var, attr, iorange)
405 character(len = *),
intent(in):: fullname
406 character(len = *),
intent(out),
optional:: file, var, attr, iorange
407 character(len = STRING):: varpart
408 integer:: atmark, colon, comma
409 character(len = *),
parameter:: VARNAME_SET &
410 =
"0123456789eEdD+-=^,.:_" &
411 //
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" &
412 //
"abcdefghijklmnopqrstuvwxyz"
419 if (atmark == 0)
then
420 atmark = index(fullname,
gt_atmark, back=.true.)
421 if (atmark /= 0)
then
422 if (verify(trim(fullname(atmark+1: )), varname_set) /= 0)
then
427 if (atmark == 0)
then
429 if (
present(file)) file = fullname
430 if (
present(var)) var =
''
431 if (
present(attr)) attr =
''
432 if (
present(iorange)) iorange =
''
435 varpart = fullname(atmark+1: )
437 if (
present(file)) file = fullname(1: atmark - 1)
442 if (
present(var)) var = varpart(1: comma - 1)
443 if (
present(attr)) attr =
''
444 if (
present(iorange)) iorange = varpart(comma + 1: )
447 if (
present(iorange)) iorange =
''
451 if (
present(var)) var = varpart
452 if (
present(attr)) attr =
''
456 if (
present(var)) var = varpart(1: colon - 1)
457 if (
present(attr)) attr = varpart(colon + 1: )
459 end subroutine url_split_c
549 logical function urlonthesamefile(url_a, url_b)
result(result)
552 character(len = *),
intent(in) :: url_a
553 character(len = *),
intent(in) :: url_b
554 character(len = STRING) :: filepart_a
555 character(len = STRING) :: filepart_b
556 call urlsplit(url_a, file=filepart_a)
557 call urlsplit(url_b, file=filepart_b)
558 result = (filepart_a == filepart_b)
559 end function urlonthesamefile
584 function url_resolve_c(relative, base)
result(result)
589 character(len = *),
intent(in):: relative
590 character(len = *),
intent(in):: base
591 character(len = STRING):: result
592 integer,
parameter:: file = 1, var = 2, attr = 3, ior = 4
593 character(len = STRING):: rel(file:ior), bas(file:ior)
594 character(3),
parameter:: pathdelim =
"/:" // achar(94)
595 integer:: idir_r, idir_b
597 call beginsub(
'urlresolve',
'rel=<%c> base=<%c>', c1=relative, c2=base)
598 call urlsplit(trim(relative), file=rel(file), var=rel(var), &
599 & attr=rel(attr), iorange=rel(ior))
600 call dbgmessage(
'rel -> file=<%c> var=<%c> attr=<%c>', &
601 & c1=trim(rel(file)), c2=trim(rel(var)), &
602 & c3=(trim(rel(attr)) //
'> ior=<' // trim(rel(ior))))
603 call urlsplit(base, file=bas(file), var=bas(var), &
604 & attr=bas(attr), iorange=bas(ior))
605 call dbgmessage(
'base -> file=<%s> var=<%s> attr=<%s> ior=<%s>', &
606 & c1=trim(bas(file)), c2=trim(bas(var)), &
607 & c3=(trim(bas(attr)) //
'> ior=<' // trim(bas(ior))))
609 if (rel(file) ==
"")
then
610 rel(file) = bas(file)
611 if (rel(var) ==
"") &
612 & rel(var) = bas(var)
613 result =
urlmerge(file=rel(file), var=rel(var), &
614 & attr=rel(attr), iorange=rel(ior))
615 call endsub(
'urlresolve',
'1 result=%c', c1=trim(result))
619 if (
strhead(rel(file),
"file:") &
620 & .OR.
strhead(rel(file),
"http:") &
621 & .OR.
strhead(rel(file),
"ftp:") &
622 & .OR.
strhead(rel(file),
"news:") &
623 & .OR.
strhead(rel(file),
"www") &
624 & .OR.
strhead(rel(file),
"/") &
625 & .OR.
strhead(rel(file), achar(94)) &
626 & .OR. rel(file)(2:2) ==
":" &
629 call endsub(
'urlresolve',
'2 result=%c', c1=trim(result))
633 idir_b = scan(bas(file), pathdelim, back=.true.)
634 if (idir_b == 0)
then
638 call endsub(
'urlresolve',
'3 result=%c', c1=trim(result))
642 idir_r = scan(rel(file), pathdelim, back=.true.)
643 if (idir_r == 0)
then
647 result = base(1: idir_b) // relative(idir_r: )
648 call endsub(
'urlresolve',
'4 result=%c', c1=trim(result))
649 end function url_resolve_c
subroutine, public dbgmessage(fmt, i, r, d, l, n, c1, c2, c3, ca)
subroutine, public beginsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca, version)
subroutine, public endsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca)
integer, parameter, public string
文字列を保持する 文字型変数の種別型パラメタ
character, parameter, public gt_atmark
character, parameter, public gt_plus
character, parameter, public gt_comma
subroutine, public url_chop_iorange(fullname, iorange, remainder)
character, parameter, public gt_equal
character, parameter, public gt_colon
character, parameter, public gt_circumflex
character, parameter, public gt_question