206 character(len = *),
intent(in):: fullname
207 character(len = *),
intent(out):: iorange
208 character(len = *),
intent(out):: remainder
209 character(STRING):: file, var, attr
210 call urlsplit(fullname, file=file, var=var, attr=attr, iorange=iorange)
211 remainder = url_merge_cccc(file=file, var=var, attr=attr, iorange=
"")
214 function url_search_iorange(fullname, dimvar)
result(result)
225 use dc_string,
only: split
226 character(len = *),
intent(in):: fullname
227 character(len = *),
intent(in):: dimvar
228 character(len = STRING):: result
229 character(STRING):: file, var, attr, iorange
230 character(STRING),
pointer :: ioranges_slice(:) => null()
231 integer :: i, eqpos, atmark
236 if (atmark == 0) atmark = index(fullname,
gt_atmark)
237 if (atmark /= 0)
then
238 call urlsplit(fullname, file=file, var=var, attr=attr, iorange=iorange)
242 call split(iorange, ioranges_slice,
gt_comma)
243 do i = 1,
size(ioranges_slice)
244 eqpos = index(ioranges_slice(i),
gt_equal)
245 if (ioranges_slice(i)(1:eqpos-1) == trim(dimvar))
then
246 result = trim(ioranges_slice(i)(eqpos+1:))
250 deallocate(ioranges_slice)
253 subroutine url_split_c(fullname, file, var, attr, iorange)
260 character(len = *),
intent(in):: fullname
261 character(len = *),
intent(out),
optional:: file, var, attr, iorange
262 character(len = STRING):: varpart
263 integer:: atmark, colon, comma
264 character(len = *),
parameter:: VARNAME_SET &
265 =
"0123456789eEdD+-=^,.:_" &
266 //
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" &
267 //
"abcdefghijklmnopqrstuvwxyz"
274 if (atmark == 0)
then
275 atmark = index(fullname,
gt_atmark, back=.true.)
276 if (atmark /= 0)
then
277 if (verify(trim(fullname(atmark+1: )), varname_set) /= 0)
then
282 if (atmark == 0)
then
284 if (
present(file)) file = fullname
285 if (
present(var)) var =
''
286 if (
present(attr)) attr =
''
287 if (
present(iorange)) iorange =
''
290 varpart = fullname(atmark+1: )
292 if (
present(file)) file = fullname(1: atmark - 1)
297 if (
present(var)) var = varpart(1: comma - 1)
298 if (
present(attr)) attr =
''
299 if (
present(iorange)) iorange = varpart(comma + 1: )
302 if (
present(iorange)) iorange =
''
306 if (
present(var)) var = varpart
307 if (
present(attr)) attr =
''
311 if (
present(var)) var = varpart(1: colon - 1)
312 if (
present(attr)) attr = varpart(colon + 1: )
404 function url_resolve_c(relative, base)
result(result)
410 use dc_string,
only: strhead
412 use dc_trace,
only: beginsub, endsub, dbgmessage
414 character(len = *),
intent(in):: relative
415 character(len = *),
intent(in):: base
416 character(len = STRING):: result
417 integer,
parameter:: file = 1, var = 2, attr = 3, ior = 4
418 character(len = STRING):: rel(file:ior), bas(file:ior)
419 character(3),
parameter:: pathdelim =
"/:" // achar(94)
420 integer:: idir_r, idir_b
422 call beginsub(
'urlresolve',
'rel=<%c> base=<%c>', c1=relative, c2=base)
423 call urlsplit(trim(relative), file=rel(file), var=rel(var), &
424 & attr=rel(attr), iorange=rel(ior))
425 call dbgmessage(
'rel -> file=<%c> var=<%c> attr=<%c>', &
426 & c1=trim(rel(file)), c2=trim(rel(var)), &
427 & c3=(trim(rel(attr)) //
'> ior=<' // trim(rel(ior))))
428 call urlsplit(base, file=bas(file), var=bas(var), &
429 & attr=bas(attr), iorange=bas(ior))
430 call dbgmessage(
'base -> file=<%s> var=<%s> attr=<%s> ior=<%s>', &
431 & c1=trim(bas(file)), c2=trim(bas(var)), &
432 & c3=(trim(bas(attr)) //
'> ior=<' // trim(bas(ior))))
434 if (rel(file) ==
"")
then
435 rel(file) = bas(file)
436 if (rel(var) ==
"") &
437 & rel(var) = bas(var)
438 result =
urlmerge(file=rel(file), var=rel(var), &
439 & attr=rel(attr), iorange=rel(ior))
440 call endsub(
'urlresolve',
'1 result=%c', c1=trim(result))
444 if (strhead(rel(file),
"file:") &
445 & .OR. strhead(rel(file),
"http:") &
446 & .OR. strhead(rel(file),
"ftp:") &
447 & .OR. strhead(rel(file),
"news:") &
448 & .OR. strhead(rel(file),
"www") &
449 & .OR. strhead(rel(file),
"/") &
450 & .OR. strhead(rel(file), achar(94)) &
451 & .OR. rel(file)(2:2) ==
":" &
454 call endsub(
'urlresolve',
'2 result=%c', c1=trim(result))
458 idir_b = scan(bas(file), pathdelim, back=.true.)
459 if (idir_b == 0)
then
463 call endsub(
'urlresolve',
'3 result=%c', c1=trim(result))
467 idir_r = scan(rel(file), pathdelim, back=.true.)
468 if (idir_r == 0)
then
472 result = base(1: idir_b) // relative(idir_r: )
473 call endsub(
'urlresolve',
'4 result=%c', c1=trim(result))