Url Parsing in Fortran
Here’s the translation of the URL parsing example from Go to Fortran:
Our program will demonstrate how to parse URLs in Fortran. URLs provide a uniform way to locate resources.
program url_parsing
use iso_fortran_env, only: error_unit
implicit none
character(len=:), allocatable :: url
character(len=:), allocatable :: scheme, user_info, host, path, query, fragment
integer :: port, status
! We'll parse this example URL, which includes a scheme, authentication info,
! host, port, path, query params, and query fragment.
url = "postgres://user:pass@host.com:5432/path?k=v#f"
! Parse the URL
call parse_url(url, scheme, user_info, host, port, path, query, fragment, status)
if (status /= 0) then
write(error_unit,*) "Error parsing URL"
stop
end if
! Accessing the scheme is straightforward
print *, "Scheme: ", scheme
! Print user info (authentication)
print *, "User info: ", user_info
! Print host and port
print *, "Host: ", host
print *, "Port: ", port
! Print path and fragment
print *, "Path: ", path
print *, "Fragment: ", fragment
! Print query string
print *, "Query: ", query
contains
subroutine parse_url(url, scheme, user_info, host, port, path, query, fragment, status)
character(len=*), intent(in) :: url
character(len=:), allocatable, intent(out) :: scheme, user_info, host, path, query, fragment
integer, intent(out) :: port, status
integer :: i, j
! This is a simplified URL parser and doesn't handle all cases
i = index(url, "://")
if (i > 0) then
scheme = url(:i-1)
j = i + 3
else
status = 1
return
end if
i = index(url(j:), "@")
if (i > 0) then
user_info = url(j:j+i-2)
j = j + i
else
user_info = ""
end if
i = index(url(j:), ":")
if (i > 0) then
host = url(j:j+i-2)
read(url(j+i:), *, iostat=status) port
if (status /= 0) return
j = index(url(j+i:), "/") + j + i - 1
else
i = index(url(j:), "/")
if (i > 0) then
host = url(j:j+i-2)
j = j + i - 1
else
host = url(j:)
path = ""
query = ""
fragment = ""
port = 80 ! Default HTTP port
status = 0
return
end if
end if
i = index(url(j:), "?")
if (i > 0) then
path = url(j:j+i-2)
j = j + i
i = index(url(j:), "#")
if (i > 0) then
query = url(j:j+i-2)
fragment = url(j+i:)
else
query = url(j:)
fragment = ""
end if
else
i = index(url(j:), "#")
if (i > 0) then
path = url(j:j+i-2)
fragment = url(j+i:)
query = ""
else
path = url(j:)
query = ""
fragment = ""
end if
end if
status = 0
end subroutine parse_url
end program url_parsing
This Fortran program demonstrates URL parsing. Here’s what it does:
We define a URL string that includes various components like scheme, authentication info, host, port, path, query params, and fragment.
We call a custom
parse_url
subroutine to break down the URL into its components.The program then prints out each component of the URL.
The
parse_url
subroutine is a simplified URL parser. It uses string manipulation functions likeindex
to find specific characters and split the URL into its parts.Error handling is implemented using a
status
variable. If there’s an error during parsing, the program will print an error message and stop.
To run this program:
- Save the code in a file, for example,
url_parsing.f90
. - Compile the program using a Fortran compiler. For example, with gfortran:
$ gfortran url_parsing.f90 -o url_parsing
- Run the compiled program:
$ ./url_parsing
The output will show the different components of the parsed URL.
Note that this is a basic implementation and may not handle all possible URL formats or edge cases. For production use, consider using a well-tested URL parsing library if available for Fortran.