! Copyright (c) 2020 Jeffrey Armstrong ! ! Permission is hereby granted, free of charge, to any person obtaining a copy ! of this software and associated documentation files (the "Software"), to deal ! in the Software without restriction, including without limitation the rights ! to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ! copies of the Software, and to permit persons to whom the Software is ! furnished to do so, subject to the following conditions: ! ! The above copyright notice and this permission notice shall be included in ! all copies or substantial portions of the Software. ! ! The Software shall be used for Good, not Evil. ! ! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ! IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ! FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ! AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ! LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ! OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ! SOFTWARE. module history implicit none type :: location character(1024)::url type(location), pointer::next end type contains function last_location(first_location) implicit none type(location), pointer::first_location type(location), pointer::last_location if(.not. associated(first_location)) then last_location => null() else last_location => first_location do while(associated(last_location%next)) last_location => last_location%next end do end if end function last_location function add_location(first_location, url) result(head) implicit none type(location), pointer::first_location type(location), pointer::head character(*), intent(in)::url type(location), pointer::last ! Check if it is our first location if(.not. associated(first_location)) then allocate(first_location) first_location%next => null() first_location%url = url else last => last_location(first_location) if(trim(last%url) /= trim(url)) then allocate(last%next) last => last%next last%next => null() last%url = url end if end if head => first_location end function add_location subroutine back_location(first_location, url) implicit none type(location), pointer::first_location character(*), intent(out)::url type(location), pointer::last, new_last url = " " last => last_location(first_location) if(associated(last)) then if(.not. associated(last, first_location)) then new_last => first_location do while(.not. associated(new_last%next, last)) new_last => new_last%next end do deallocate(last) else new_last => first_location end if new_last%next => null() url = new_last%url end if end subroutine back_location end module history