Manual Reference Pages  - delim (3m_strings)

NAME

delim(3f) - [M_strings:TOKENS] parse a string and store tokens into an array (LICENSE:PD)

CONTENTS

Synopsis
Description
Options
Examples
Author
License

SYNOPSIS

subroutine delim(line,array,n,icount,ibegin,iterm,lgth,dlim)

    character(len=*),intent(in)  :: line
    integer,integer(in)          :: n
    integer,intent(out)          :: icount
    character(len=*)             :: array(n)
    integer,intent(out)          :: ibegin(n)
    integer,intent(out)          :: iterm(n)
    integer,intent(out)          :: lgth
    character(len=*)             :: dlim

DESCRIPTION

Given a LINE of structure " par1 par2 par3 ... parn " store each par(n) into a separate variable in ARRAY (UNLESS ARRAY(1) == ’#N#’)

This routine predates Fortran90. For versions using optional parameters and allocatable arrays see split(3f) and slice(3f).

Also set ICOUNT to number of elements of array initialized, and return beginning and ending positions for each element in IBEGIN(N) and ITERM(N).

Return position of last non-blank character (even if more than N elements were found) in lgth

No quoting or escaping of delimiter is allowed, so the delimiter character can not be placed in a token.

No checking for more than N parameters; If any more they are ignored.

OPTIONS

LINE input string to parse into tokens
ARRAY(N)
  array that receives tokens
N size of arrays ARRAY, IBEGIN, ITERM
ICOUNT number of tokens found
IBEGIN(N)
  starting columns of tokens found
ITERM(N)
  ending columns of tokens found
LGTH position of last non-blank character in input string LINE
DLIM delimiter characters

EXAMPLES

Sample program:

    program demo_delim

use M_strings, only: delim implicit none character(len=80) :: line character(len=80) :: dlm integer,parameter :: n=80 character(len=20) :: array(n)=’ ’ integer :: ibegin(n),iterm(n) integer :: i20, icount, lgth, i10,i30 line=’ first second 10.3 words_of_stuff ’ do i20=1,4 ! change delimiter list and what is calculated or parsed if(i20 == 1)dlm=’ ’ if(i20 == 2)dlm=’o’ if(i20 == 3)dlm=’ aeiou’ ! NOTE SPACE IS FIRST if(i20 == 3)ARRAY(1)=’#N#’ ! QUIT RETURNING STRING ARRAY if(i20 == 4)line=’AAAaBBBBBBbIIIIIi J K L’

! write out a break line composed of =========== .. write(*,’(57("="))’) ! show line being parsed write(*,’(a)’)’PARSING=[’//trim(line)//’] on ’//trim(dlm) ! call parsing procedure call delim(line,array,n,icount,ibegin,iterm,lgth,dlm) write(*,*)’number of tokens found=’,icount write(*,*)’last character in column ’,lgth if(icount > 0)then if(lgth /= iterm(icount))then write(*,*)’ignored from column ’,iterm(icount)+1,’ to ’,lgth endif do i10=1,icount ! check flag to see if ARRAY() was set if(array(1) /= ’#N#’)then ! from returned array write(*,’(a,a,a)’,advance=’no’)& &’[’,array(i10)(:iterm(i10)-ibegin(i10)+1),’]’ endif enddo ! using start and end positions in IBEGIN() and ITERM() write(*,*) do i10=1,icount ! from positions in original line write(*,’(a,a,a)’,advance=’no’)& &’[’,line(ibegin(i10):iterm(i10)),’]’ enddo write(*,*) endif enddo line=’four score and seven years ago’ call delim(line,["#N#"],n,icount,ibegin,iterm,lgth,’ ’) do i30=1,icount write(*,*)ibegin(i30),iterm(i30),& & ’[’//line(ibegin(i30):iterm(i30))//’]’ enddo

end program demo_delim

Results:

 > =========================================================
 > PARSING=[ first  second 10.3 words_of_stuff] on
 >  number of tokens found=           4
 >  last character in column           34
 > [first][second][10.3][words_of_stuff]
 > [first][second][10.3][words_of_stuff]
 > =========================================================
 > PARSING=[ first  second 10.3 words_of_stuff] on o
 >  number of tokens found=           4
 >  last character in column           34
 > [ first  sec][nd 10.3 w][rds_][f_stuff]
 > [ first  sec][nd 10.3 w][rds_][f_stuff]
 > =========================================================
 > PARSING=[ first  second 10.3 words_of_stuff] on  aeiou
 >  number of tokens found=          10
 >  last character in column           34
 >
 > [f][rst][s][c][nd][10.3][w][rds_][f_st][ff]
 > =========================================================
 > PARSING=[AAAaBBBBBBbIIIIIi  J K L] on  aeiou
 >  number of tokens found=           5
 >  last character in column           24
 >
 > [AAA][BBBBBBbIIIII][J][K][L]
 >            1           4 [four]
 >            9          13 [score]
 >           15          17 [and]
 >           21          25 [seven]
 >           28          32 [years]
 >           34          36 [ago]
================================================================================

AUTHOR

John S. Urban

LICENSE

Public Domain