program demo_M_list
use M_list, only : insert, locate, replace, remove
! create a dictionary with character keywords, values, and value lengths
! using the routines for maintaining a list
use M_list, only : locate, insert, replace
implicit none
character(len=:),allocatable :: keywords(:)
character(len=:),allocatable :: values(:)
integer,allocatable :: counts(:)
integer :: i
! insert and replace entries
call update('b','value of b')
call update('a','value of a')
call update('c','value of c')
call update('c','value of c again')
call update('d','value of d')
call update('a','value of a again')
! show array
write(*,'(*(a,"==>","[",a,"]",/))')&
& (trim(keywords(i)),values(i)(:counts(i)),i=1,size(keywords))
! remove some entries
call update('a')
call update('c')
write(*,'(*(a,"==>","[",a,"]",/))')&
& (trim(keywords(i)),values(i)(:counts(i)),i=1,size(keywords))
! get some values
write(*,*)'get b=>',get('b')
write(*,*)'get d=>',get('d')
write(*,*)'get notthere=>',get('notthere')
!
contains
subroutine update(key,valin)
character(len=*),intent(in) :: key
character(len=*),intent(in),optional :: valin
integer :: place
integer :: ilen
character(len=:),allocatable :: val
if(present(valin))then
val=valin
ilen=len_trim(val)
! find where string is or should be
call locate(keywords,key,place)
! if string was not found insert it
if(place.lt.1)then
call insert(keywords,key,iabs(place))
call insert(values,val,iabs(place))
call insert(counts,ilen,iabs(place))
else
call replace(values,val,place)
call replace(counts,ilen,place)
endif
else
call locate(keywords,key,place)
if(place.gt.0)then
call remove(keywords,place)
call remove(values,place)
call remove(counts,place)
endif
endif
end subroutine update
function get(key) result(valout)
character(len=*),intent(in) :: key
character(len=:),allocatable :: valout
integer :: place
! find where string is or should be
call locate(keywords,key,place)
if(place.lt.1)then
valout=''
else
valout=values(place)(:counts(place))
endif
end function get
end program demo_M_list