LCOV - code coverage report
Current view: top level - hemco/HEMCO/src/Shared/Headers - hco_charpak_mod.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 225 0.0 %
Date: 2025-01-13 21:54:50 Functions: 0 16 0.0 %

          Line data    Source code
       1             : !------------------------------------------------------------------------------
       2             : !                   Harmonized Emissions Component (HEMCO)                    !
       3             : !------------------------------------------------------------------------------
       4             : !BOP
       5             : !
       6             : ! !MODULE: HCO_charpak_mod.F90
       7             : !
       8             : ! !DESCRIPTION: Module HCO\_CHARPAK\_MOD contains routines from the CHARPAK
       9             : !  string and character manipulation package used by GEOS-Chem.
      10             : !\\
      11             : !\\
      12             : ! !INTERFACE:
      13             : !
      14             : MODULE HCO_Charpak_Mod
      15             : !
      16             : ! !USES:
      17             : !
      18             :   IMPLICIT NONE
      19             :   PRIVATE
      20             : !
      21             : ! !PUBLIC MEMBER FUNCTIONS:
      22             : !
      23             :   PUBLIC  :: CleanText
      24             :   PUBLIC  :: CntMat
      25             :   PUBLIC  :: CopyTxt
      26             :   PUBLIC  :: CStrip
      27             :   PUBLIC  :: IsDigit
      28             :   PUBLIC  :: ReadOneLine
      29             :   PUBLIC  :: Str2Hash14
      30             :   PUBLIC  :: Str2Hash31
      31             :   PUBLIC  :: StrRepl
      32             :   PUBLIC  :: StrSplit
      33             :   PUBLIC  :: StrSqueeze
      34             :   PUBLIC  :: To_UpperCase
      35             :   PUBLIC  :: TranLc
      36             :   PUBLIC  :: TranUc
      37             :   PUBLIC  :: Txtext
      38             :   PUBLIC  :: WordWrapPrint
      39             : !
      40             : ! !PRIVATE MEMBER FUNCTIONS
      41             : !
      42             : !
      43             : ! !REMARKS:
      44             : !  CHARPAK routines by Robert D. Stewart, 1992.  Subsequent modifications
      45             : !  made for GEOS-CHEM by Bob Yantosca (1998, 2002, 2004).
      46             : !
      47             : ! !REVISION HISTORY:
      48             : !  See https://github.com/geoschem/hemco for complete history
      49             : !EOP
      50             : !------------------------------------------------------------------------------
      51             : !BOC
      52             : !
      53             : ! !DEFINED PARAMETERS
      54             : !
      55             :   ! Maximum string length
      56             :   INTEGER, PARAMETER, PUBLIC :: MAXSTRLEN = 500
      57             : 
      58             : CONTAINS
      59             : !EOC
      60             : !------------------------------------------------------------------------------
      61             : !                   Harmonized Emissions Component (HEMCO)                    !
      62             : !------------------------------------------------------------------------------
      63             : !BOP
      64             : !
      65             : ! !IROUTINE: CntMat
      66             : !
      67             : ! !DESCRIPTION: Counts the number of characters in str1 that match
      68             : !  a character in str2.
      69             : !\\
      70             : !\\
      71             : ! !INTERFACE:
      72             : !
      73           0 :   SUBROUTINE CntMat( Str1, Str2, Imat, Locations )
      74             : !
      75             : ! !INPUT PARAMETERS:
      76             : !
      77             :     CHARACTER(LEN=*), INTENT(IN) ::  Str1             ! Text to scan
      78             :     CHARACTER(LEN=*), INTENT(IN) ::  Str2             ! Character to match
      79             : !
      80             : ! !OUTPUT PARAMETERS:
      81             : !
      82             :     INTEGER,          INTENT(OUT) :: imat             ! Number of matches
      83             :     INTEGER,          OPTIONAL    :: Locations(255)   ! Positions of matches
      84             : !
      85             : ! !REVISION HISTORY:
      86             : !     DATE:   JAN. 6, 1995
      87             : !     AUTHOR: R.D. STEWART
      88             : !     COMMENTS: Revised slightly (2-5-1996) so that trailing
      89             : !               blanks in str1 are ignored.  Revised again
      90             : !               on 3-6-1996.
      91             : !  See https://github.com/geoschem/hemco for complete history
      92             : !EOP
      93             : !------------------------------------------------------------------------------
      94             : !BOC
      95             : !
      96             : ! !LOCAL VARIABLES:
      97             : !
      98             :     ! Scalars
      99             :     INTEGER :: L1, L2, i, j
     100             :     LOGICAL :: again
     101             : 
     102             :     ! Arrays
     103             :     INTEGER :: TmpLocations(255)
     104             : 
     105             :     ! Initialize
     106           0 :     TmpLocations = 0
     107           0 :     L1           = MAX(1,LEN_TRIM(str1))
     108           0 :     L2           = LEN(str2)
     109           0 :     imat         = 0
     110             : 
     111           0 :     DO i=1,L1
     112             :        again = .true.
     113             :        j = 1
     114           0 :        DO WHILE (again)
     115           0 :           IF (str2(j:j).EQ.str1(i:i)) THEN
     116           0 :              imat               = imat+1
     117           0 :              TmpLocations(imat) = i
     118           0 :              again              = .false.
     119           0 :           ELSEIF (j.LT.L2) THEN
     120           0 :              j=j+1
     121             :           ELSE
     122             :              again = .false.
     123             :           ENDIF
     124             :        ENDDO
     125             :     ENDDO
     126             : 
     127             :     ! Return positions where matches occured (OPTIONAL)
     128           0 :     IF ( PRESENT( Locations ) ) Locations = TmpLocations
     129             : 
     130           0 :   END SUBROUTINE CntMat
     131             : !EOC
     132             : !------------------------------------------------------------------------------
     133             : !                   Harmonized Emissions Component (HEMCO)                    !
     134             : !------------------------------------------------------------------------------
     135             : !BOP
     136             : !
     137             : ! !IROUTINE: CopyTxt
     138             : !
     139             : ! !DESCRIPTION: Write all of the characters in str1 into variable
     140             : !               str2 beginning at column, col.  If the length of str1
     141             : !               + col is longer than the number of characters str2
     142             : !               can store, some characters will not be transfered to
     143             : !               str2.  Any characters already existing in str2 will
     144             : !               will be overwritten.
     145             : !\\
     146             : !\\
     147             : ! !INTERFACE:
     148             : !
     149           0 :   SUBROUTINE CopyTxt( col, str1, str2 )
     150             : !
     151             : ! !INPUT PARAMETERS:
     152             : !
     153             :     INTEGER,          INTENT(IN)    :: col
     154             :     CHARACTER(LEN=*), INTENT(IN)    :: str1
     155             : !
     156             : ! !OUTPUT PARAMETERS:
     157             : !
     158             :     CHARACTER(LEN=*), INTENT(INOUT) :: str2
     159             : !
     160             : ! !REVISION HISTORY:
     161             : !     DATE:   DEC. 24, 1993
     162             : !     AUTHOR: R.D. STEWART
     163             : !  See https://github.com/geoschem/hemco for complete history
     164             : !EOP
     165             : !------------------------------------------------------------------------------
     166             : !BOC
     167             : !
     168             : ! !LOCAL VARIABLES:
     169             : !
     170             :     INTEGER :: ilt1,i1,i,j,ic
     171             : 
     172           0 :     i1 = LEN(str2)
     173           0 :     IF (i1.GT.0) THEN
     174           0 :        ilt1 = LEN(str1)
     175           0 :        IF (ilt1.GT.0) THEN
     176           0 :           ic = MAX0(col,1)
     177           0 :           i = 1
     178           0 :           j = ic
     179           0 :           DO WHILE ((i.LE.ilt1).and.(j.LE.i1))
     180           0 :              str2(j:j) = str1(i:i)
     181           0 :              i = i + 1
     182           0 :              j = ic + (i-1)
     183             :           ENDDO
     184             :        ENDIF
     185             :     ENDIF
     186             : 
     187           0 :   END SUBROUTINE CopyTxt
     188             : !EOC
     189             : !------------------------------------------------------------------------------
     190             : !                   Harmonized Emissions Component (HEMCO)                    !
     191             : !------------------------------------------------------------------------------
     192             : !BOP
     193             : !
     194             : ! !IROUTINE: Cstrip
     195             : !
     196             : ! !DESCRIPTION: Strip blanks and null characters for the variable TEXT.
     197             : !\\
     198             : !\\
     199             : ! !INTERFACE:
     200             : !
     201           0 :   SUBROUTINE CStrip( text, KeepSpaces )
     202             : !
     203             : ! !INPUT PARAMETERS:
     204             : !
     205             :     LOGICAL,          OPTIONAL      :: KeepSpaces ! If =T, then keep spaces
     206             :                                                   !  but skip all other
     207             :                                                   !  non-printing chars
     208             : !
     209             : ! !INPUT/OUTPUT PARAMETERS:
     210             : !
     211             :     CHARACTER(LEN=*), INTENT(INOUT) :: TEXT       ! Text to be modified
     212             : !
     213             : ! !REMARKS:
     214             : !  The original "text" is destroyed upon exit.
     215             : !
     216             : ! !REVISION HISTORY:
     217             : !      AUTHOR: Robert D. Stewart
     218             : !        DATE: May 19, 1992
     219             : !  See https://github.com/geoschem/hemco for complete history
     220             : !EOP
     221             : !------------------------------------------------------------------------------
     222             : !BOC
     223             : !
     224             : ! !LOCAL VARIABLES:
     225             : !
     226             :     INTEGER          :: ilen, iasc, icnt, i, Start
     227             :     CHARACTER(LEN=1) :: ch
     228             : 
     229             :     ! Default: Skip space characters
     230           0 :     Start = 32
     231             : 
     232             :     ! If KEEPSPACES=T then skip all non-printing characters,
     233             :     ! but keep space characters. (bmy, 1/30/18)
     234           0 :     IF ( PRESENT( KeepSpaces ) ) THEN
     235           0 :        IF ( KeepSpaces ) Start = 31
     236             :     ENDIF
     237             : 
     238           0 :     ilen = LEN(text)
     239           0 :     IF (ilen.GT.1) THEN
     240             :        icnt = 1
     241           0 :        DO i=1,ilen
     242           0 :           iasc = ICHAR(text(i:i))
     243             : 
     244             :           ! Keep characters between these limits
     245           0 :           IF ( ( iasc > Start ).AND. (iasc < 255 ) ) THEN
     246           0 :              ch = text(i:i)
     247           0 :              text(icnt:icnt) = ch
     248           0 :              icnt = icnt + 1
     249             :           ENDIF
     250             :        ENDDO
     251             :        ! Fill remainder of text with blanks
     252           0 :        DO i=icnt,ilen
     253           0 :           text(i:i) = ' '
     254             :        ENDDO
     255             :     ENDIF
     256             : 
     257           0 :   END SUBROUTINE CStrip
     258             : !EOC
     259             : !------------------------------------------------------------------------------
     260             : !                   Harmonized Emissions Component (HEMCO)                    !
     261             : !------------------------------------------------------------------------------
     262             : !BOP
     263             : !
     264             : ! !IROUTINE: IsDigit
     265             : !
     266             : ! !DESCRIPTION: Returned as true if ch is a numeric character (i.e., one of
     267             : !  the numbers from 0 to 9).
     268             : !\\
     269             : !\\
     270             : ! !INTERFACE:
     271             : !
     272           0 :   FUNCTION IsDigit( ch ) RESULT( lnum )
     273             : !
     274             : ! !INPUT PARAMETERS:
     275             : !
     276             :     CHARACTER(LEN=1), INTENT(IN) :: ch
     277             : !
     278             : ! !RETURN VALUE:
     279             : !
     280             :     LOGICAL                      :: lnum
     281             : !
     282             : ! !REMARKS:
     283             : !  NOTE: Changed name from ISNUM to ISDIGIT (bmy, 7/15/04)
     284             : !
     285             : ! !REVISION HISTORY:
     286             : !     DATE:   NOV. 11, 1993
     287             : !     AUTHOR: R.D. STEWART
     288             : !  See https://github.com/geoschem/hemco for complete history
     289             : !EOP
     290             : !------------------------------------------------------------------------------
     291             : !BOC
     292             : !
     293             : ! !LOCAL VARIABLES:
     294             : !
     295             :     INTEGER iasc
     296             : 
     297           0 :     iasc = ICHAR(ch)
     298           0 :     lnum = .FALSE.
     299           0 :     IF ((iasc.GE.48).AND.(iasc.LE.57)) THEN
     300           0 :        lnum = .TRUE.
     301             :     ENDIF
     302             : 
     303           0 :   END FUNCTION IsDigit
     304             : !EOC
     305             : !------------------------------------------------------------------------------
     306             : !                   Harmonized Emissions Component (HEMCO)                    !
     307             : !------------------------------------------------------------------------------
     308             : !BOP
     309             : !
     310             : ! !IROUTINE: StrRepl
     311             : !
     312             : ! !DESCRIPTION: Subroutine StrRepl replaces all instances of PATTERN within
     313             : !  a string STR with replacement text REPLTXT.
     314             : !\\
     315             : !\\
     316             : ! !INTERFACE:
     317             : !
     318           0 :   SUBROUTINE StrRepl( Str, Pattern, ReplTxt )
     319             : !
     320             : ! !INPUT PARAMETERS:
     321             : !
     322             :     CHARACTER(LEN=*), INTENT(IN)    :: Pattern   ! Pattern to search for
     323             :     CHARACTER(LEN=*), INTENT(IN)    :: ReplTxt   ! Text to replace
     324             : !
     325             : ! !INPUT/OUTPUT PARAMETERS:
     326             : !
     327             :     CHARACTER(LEN=*), INTENT(INOUT) :: Str       ! String to be manipulated
     328             : !
     329             : ! !REMARKS:
     330             : !  PATTERN and REPLTXT can now have a different number of characters.
     331             : !
     332             : ! !REVISION HISTORY:
     333             : !  25 Jun 2002 - R. Yantosca - Initial version
     334             : !  See https://github.com/geoschem/hemco for complete history
     335             : !EOP
     336             : !------------------------------------------------------------------------------
     337             : !BOC
     338             : !
     339             : ! !LOCAL VARIABLES:
     340             : !
     341             :     ! Local variables
     342             :     INTEGER :: I1, I2
     343             : 
     344             :     !=================================================================
     345             :     ! StrRepl begins here!
     346             :     !=================================================================
     347           0 :     DO
     348             : 
     349             :        ! I1 is the first character that matches the search pattern;
     350             :        ! it must be 1 or larger.  Otherwise exit the routine.
     351           0 :        I1 = INDEX( Str, Pattern )
     352           0 :        IF ( I1 < 1 ) RETURN
     353             : 
     354             :        ! Replace the text.  I2 is the starting position of the
     355             :        ! string following the point of text replacement.
     356           0 :        I2 = I1 + LEN( Pattern )
     357           0 :        Str = Str(1:I1-1) // ReplTxt // Str(I2:)
     358             : 
     359             :     ENDDO
     360             : 
     361           0 :   END SUBROUTINE StrRepl
     362             : !EOC
     363             : !------------------------------------------------------------------------------
     364             : !                   Harmonized Emissions Component (HEMCO)                    !
     365             : !------------------------------------------------------------------------------
     366             : !BOP
     367             : !
     368             : ! !IROUTINE: StrSplit
     369             : !
     370             : ! !DESCRIPTION: Subroutine STRSPLIT returns substrings in a string, separated
     371             : !  by a separator character (similar to IDL's StrSplit function).  This is
     372             : !  mainly a convenience wrapper for CHARPAK routine TxtExt.
     373             : !\\
     374             : !\\
     375             : ! !INTERFACE:
     376             : !
     377           0 :   SUBROUTINE StrSplit( Str, Sep, Result, N_SubStrs )
     378             : !
     379             : ! !INPUT PARAMETERS:
     380             : !
     381             :     CHARACTER(LEN=*), INTENT(IN)  :: STR           ! String to be searched
     382             :     CHARACTER(LEN=1), INTENT(IN)  :: SEP           ! Separator character
     383             : !
     384             : ! !OUTPUT PARAMETERS:
     385             : !
     386             :     CHARACTER(LEN=*), INTENT(OUT) :: Result(255)   ! Returned substrings
     387             :     INTEGER,          OPTIONAL    :: N_SubStrs     ! # of substrings
     388             : !
     389             : ! !REVISION HISTORY:
     390             : !  11 Jul 2002 - R. Yantosca - Initial version
     391             : !  See https://github.com/geoschem/hemco for complete history
     392             : !EOP
     393             : !------------------------------------------------------------------------------
     394             : !BOC
     395             : !
     396             : ! !LOCAL VARIABLES:
     397             : !
     398             :     INTEGER             :: I, IFLAG, COL
     399             :     CHARACTER(LEN=2047) :: WORD
     400             : 
     401             :     !=======================================================================
     402             :     ! STRSPLIT begins here!
     403             :     !=======================================================================
     404             : 
     405             :     ! Initialize
     406           0 :     I         = 0
     407           0 :     COL       = 1
     408           0 :     IFLAG     = 0
     409           0 :     RESULT(:) = ''
     410             : 
     411             :     ! Loop until all matches found, or end of string
     412           0 :     DO WHILE ( IFLAG == 0 )
     413             : 
     414             :        ! Look for strings beteeen separator string
     415           0 :        CALL TXTEXT ( SEP, TRIM( STR ), COL, WORD, IFLAG )
     416             : 
     417             :        ! Store substrings in RESULT array
     418           0 :        I         = I + 1
     419           0 :        RESULT(I) = TRIM( WORD )
     420             : 
     421             :     ENDDO
     422             : 
     423             :     ! Optional argument: return # of substrings found
     424           0 :     IF ( PRESENT( N_SUBSTRS ) ) N_SUBSTRS = I
     425             : 
     426           0 :   END SUBROUTINE StrSplit
     427             : !EOC
     428             : !------------------------------------------------------------------------------
     429             : !                   Harmonized Emissions Component (HEMCO)                    !
     430             : !------------------------------------------------------------------------------
     431             : !BOP
     432             : !
     433             : ! !IROUTINE: StrSqueeze
     434             : !
     435             : ! !DESCRIPTION: Subroutine STRSQUEEZE strips white space from both ends of a
     436             : !  string.  White space in the middle of the string (i.e. between characters)
     437             : !  will be preserved as-is.  Somewhat similar (though not exactly) to IDL's
     438             : !  STRCOMPRESS function.
     439             : !\\
     440             : !\\
     441             : ! !INTERFACE:
     442             : !
     443           0 :   SUBROUTINE StrSqueeze( Str )
     444             : !
     445             : ! !INPUT/OUTPUT PARAMETERS:
     446             : !
     447             :     CHARACTER(LEN=*), INTENT(INOUT) :: Str   ! String to be squeezed
     448             : !
     449             : ! !REVISION HISTORY:
     450             : !  11 Jul 2002 - R. Yantosca - Initial version
     451             : !  See https://github.com/geoschem/hemco for complete history
     452             : !EOP
     453             : !------------------------------------------------------------------------------
     454             : !BOC
     455             :     !=================================================================
     456             :     ! STRSQUEEZE begins here!
     457             :     !=================================================================
     458           0 :     Str = ADJUSTR( TRIM( Str ) )
     459           0 :     Str = ADJUSTL( TRIM( Str ) )
     460             : 
     461           0 :   END SUBROUTINE StrSqueeze
     462             : !EOC
     463             : !------------------------------------------------------------------------------
     464             : !                   Harmonized Emissions Component (HEMCO)                    !
     465             : !------------------------------------------------------------------------------
     466             : !BOP
     467             : !
     468             : ! !IROUTINE: TranLc
     469             : !
     470             : ! !DESCRIPTION: Tranlate a character variable to all lowercase letters.
     471             : !               Non-alphabetic characters are not affected.
     472             : !\\
     473             : !\\
     474             : ! !INTERFACE:
     475             : !
     476           0 :   SUBROUTINE TranLc( text )
     477             : !
     478             : ! !INPUT/OUTPUT PARAMETERS:
     479             : !
     480             :     CHARACTER(LEN=*) :: text
     481             : !
     482             : ! !REMARKS:
     483             : !  The original "text" is destroyed.
     484             : !
     485             : ! !REVISION HISTORY:
     486             : !      AUTHOR: Robert D. Stewart
     487             : !        DATE: May 19, 1992
     488             : !  See https://github.com/geoschem/hemco for complete history
     489             : !EOP
     490             : !------------------------------------------------------------------------------
     491             : !BOC
     492             : !
     493             : ! !LOCAL VARIABLES:
     494             : !
     495             :     INTEGER :: iasc,i,ilen
     496             : 
     497           0 :     ilen = LEN(text)
     498           0 :     DO I=1,ilen
     499           0 :        iasc = ICHAR(text(i:i))
     500           0 :        IF ((iasc.GT.64).AND.(iasc.LT.91)) THEN
     501           0 :           text(i:i) = CHAR(iasc+32)
     502             :        ENDIF
     503             :     ENDDO
     504             : 
     505           0 :   END SUBROUTINE TRANLC
     506             : !EOC
     507             : !------------------------------------------------------------------------------
     508             : !                   Harmonized Emissions Component (HEMCO)                    !
     509             : !------------------------------------------------------------------------------
     510             : !BOP
     511             : !
     512             : ! !IROUTINE: TranUc
     513             : !
     514             : ! !DESCRIPTION: Tranlate a character variable to all upper case letters.
     515             : !               Non-alphabetic characters are not affected.
     516             : !\\
     517             : !\\
     518             : ! !INTERFACE:
     519             : !
     520           0 :   SUBROUTINE TranUc( text )
     521             : !
     522             : ! !INPUT/OUTPUT PARAMETERS:
     523             : !
     524             :     CHARACTER(LEN=*) :: text
     525             : !
     526             : ! !REMARKS:
     527             : !  The original "text" is destroyed.
     528             : !
     529             : ! !REVISION HISTORY:
     530             : !      AUTHOR: Robert D. Stewart
     531             : !        DATE: May 19, 1992
     532             : !  See https://github.com/geoschem/hemco for complete history
     533             : !EOP
     534             : !------------------------------------------------------------------------------
     535             : !BOC
     536             : !
     537             : ! !LOCAL VARIABLES:
     538             : !
     539             :     INTEGER :: iasc,i,ilen
     540             : 
     541           0 :     ilen = LEN(text)
     542           0 :     DO i=1,ilen
     543           0 :        iasc = ICHAR(text(i:i))
     544           0 :        IF ((iasc.GT.96).AND.(iasc.LT.123)) THEN
     545           0 :           text(i:i) = CHAR(iasc-32)
     546             :        ENDIF
     547             :     ENDDO
     548             : 
     549           0 :   END SUBROUTINE TRANUC
     550             : !EOC
     551             : !------------------------------------------------------------------------------
     552             : !                   Harmonized Emissions Component (HEMCO)                    !
     553             : !------------------------------------------------------------------------------
     554             : !BOP
     555             : !
     556             : ! !IROUTINE: TxtExt
     557             : !
     558             : ! !DESCRIPTION: TxtExt extracts a sequence of characters from
     559             : !               text and transfers them to word.  The extraction
     560             : !               procedure uses a set of character "delimiters"
     561             : !               to denote the desired sequence of characters.
     562             : !               For example if ch=' ', the first character sequence
     563             : !               bracketed by blank spaces will be returned in word.
     564             : !               The extraction procedure begins in column, col,
     565             : !               of TEXT.  If text(col:col) = ch (any character in
     566             : !               the character string), the text is returned beginning
     567             : !               with col+1 in text (i.e., the first match with ch
     568             : !               is ignored).
     569             : !\\
     570             : !\\
     571             : !               After completing the extraction, col is incremented to
     572             : !               the location of the first character following the
     573             : !               end of the extracted text.
     574             : !\\
     575             : !\\
     576             : !               A status flag is also returned with the following
     577             : !               meaning(s)
     578             : !\\
     579             : !\\
     580             : !               IF iflg = -1, found a text block, but no more characters
     581             : !                             are available in TEXT
     582             : !                  iflg = 0,  task completed sucessfully (normal term)
     583             : !                  iflg = 1,  ran out of text before finding a block of
     584             : !                             text.
     585             : !\\
     586             : !\\
     587             : ! !INTERFACE:
     588             : !
     589           0 :   SUBROUTINE TxtExt(ch,text,col,word,iflg)
     590             : !
     591             : ! !INPUT PARAMETERS:
     592             : !
     593             :     CHARACTER(LEN=*), INTENT(IN)    :: ch,text
     594             : !
     595             : ! !INPUT/OUTPUT PARAMETERS:
     596             : !
     597             :     INTEGER,          INTENT(INOUT) :: col
     598             : !
     599             : ! !OUTPUT PARAMETERS:
     600             : !
     601             :     CHARACTER(LEN=*), INTENT(OUT)   :: word
     602             :     INTEGER                         :: iflg
     603             : !
     604             : ! !REMARKS:
     605             : !  TxtExt is short for Text Extraction.  This routine provides a set of
     606             : !  powerful line-by-line text search and extraction capabilities in
     607             : !  standard FORTRAN.
     608             : !
     609             : ! !REVISION HISTORY:
     610             : !      AUTHOR: Robert D. Stewart
     611             : !        DATE: Jan. 1st, 1995
     612             : !  See https://github.com/geoschem/hemco for complete history
     613             : !EOP
     614             : !------------------------------------------------------------------------------
     615             : !BOC
     616             : !
     617             : ! !LOCAL VARIABLES:
     618             : !
     619             :     INTEGER :: Tmax,T1,T2,imat
     620             :     LOGICAL :: again,prev
     621             : 
     622             :     ! Length of text
     623           0 :     Tmax = LEN(text)
     624             : 
     625             :     ! Fill Word with blanks
     626           0 :     WORD = REPEAT( ' ', LEN( WORD ) )
     627             : 
     628           0 :     IF (col.GT.Tmax) THEN
     629             :        ! Text does not contain any characters past Tmax.
     630             :        ! Reset col to one and return flag = {error condition}
     631           0 :        iflg = 1
     632           0 :        col = 1
     633           0 :     ELSEIF (col.EQ.Tmax) THEN
     634             :        ! End of TEXT reached
     635           0 :        CALL CntMat(ch,text(Tmax:Tmax),imat)
     636           0 :        IF (imat.EQ.0) THEN
     637             :           ! Copy character into Word and set col=1
     638           0 :           CALL CopyTxt(1,Text(Tmax:Tmax),Word)
     639           0 :           col = 1
     640           0 :           iflg = -1
     641             :        ELSE
     642             :           ! Same error condition as if col.GT.Tmax
     643           0 :           iflg = 1
     644             :        ENDIF
     645             :     ELSE
     646             :        ! Make sure column is not less than 1
     647           0 :        IF (col.LT.1) col=1
     648           0 :        CALL CntMat(ch,text(col:col),imat)
     649           0 :        IF (imat.GT.0) THEN
     650             :           prev=.true.
     651             :        ELSE
     652           0 :           prev=.false.
     653             :        ENDIF
     654           0 :        T1=col
     655           0 :        T2 = T1
     656             : 
     657           0 :        again = .true.
     658           0 :        DO WHILE (again)
     659             :           ! Check for a match with a character in ch
     660           0 :           CALL CntMat(ch,text(T2:T2),imat)
     661           0 :           IF (imat.GT.0) THEN
     662             :              ! Current character in TEXT matches one (or more) of the
     663             :              ! characters in ch.
     664           0 :              IF (prev) THEN
     665           0 :                 IF (T2.LT.Tmax) THEN
     666             :                    ! Keep searching for a block of text
     667           0 :                    T2=T2+1
     668           0 :                    T1=T2
     669             :                 ELSE
     670             :                    ! Did not find any text blocks before running
     671             :                    ! out of characters in TEXT.
     672           0 :                    again=.false.
     673           0 :                    iflg=1
     674             :                 ENDIF
     675             :              ELSE
     676             :                  ! Previous character did not match ch, so terminate.
     677             :                  ! NOTE: This is "NORMAL" termination of the loop
     678           0 :                 again=.false.
     679           0 :                 T2=T2-1
     680           0 :                 iflg = 0
     681             :              ENDIF
     682           0 :           ELSEIF (T2.LT.Tmax) THEN
     683             :              ! Add a letter to the current block of text
     684           0 :              prev = .false.
     685           0 :              T2=T2+1
     686             :           ELSE
     687             :              ! Reached the end of the characters in TEXT before reaching
     688             :              ! another delimiting character.  A text block was identified
     689             :              ! however.
     690           0 :              again=.false.
     691           0 :              iflg=-1
     692             :           ENDIF
     693             :        ENDDO
     694             : 
     695           0 :        IF (iflg.EQ.0) THEN
     696             :           ! Copy characters into WORD and set col for return
     697           0 :           CALL CopyTxt(1,Text(T1:T2),Word)
     698           0 :           col = T2+1
     699             :        ELSE
     700             :           ! Copy characters into WORD and set col for return
     701           0 :           CALL CopyTxt(1,Text(T1:T2),Word)
     702           0 :           col = 1
     703             :        ENDIF
     704             :     ENDIF
     705             : 
     706           0 :   END SUBROUTINE TxtExt
     707             : !EOC
     708             : !------------------------------------------------------------------------------
     709             : !                   Harmonized Emissions Component (HEMCO)                    !
     710             : !------------------------------------------------------------------------------
     711             : !BOP
     712             : !
     713             : ! !IROUTINE: Str2Hash14
     714             : !
     715             : ! !DESCRIPTION: Returns a unique integer hash for a given character string.
     716             : !  This allows us to implement a fast name lookup algorithm.
     717             : !\\
     718             : !\\
     719             : ! !INTERFACE:
     720             : !
     721           0 :   FUNCTION Str2Hash14( Str ) RESULT( Hash )
     722             : !
     723             : ! !INPUT PARAMETERS:
     724             : !
     725             :     CHARACTER(LEN=14), INTENT(IN) :: Str    ! String (14 chars long)
     726             : !
     727             : ! !RETURN VALUE:
     728             : !
     729             :     INTEGER                       :: Hash   ! Hash value from string
     730             : !
     731             : ! !REMARKS:
     732             : !  (1) Algorithm taken from this web page:
     733             : !       https://fortrandev.wordpress.com/2013/07/06/fortran-hashing-algorithm/
     734             : !
     735             : !  (2) For now, we only use the first 14 characers of the character string
     736             : !       to compute the hash value.  Most GEOS-Chem species names only use
     737             : !       at most 14 unique characters.  We can change this later if need be.
     738             : !
     739             : ! !REVISION HISTORY:
     740             : !  04 May 2016 - R. Yantosca - Initial version
     741             : !  See https://github.com/geoschem/hemco for complete history
     742             : !EOP
     743             : !------------------------------------------------------------------------------
     744             : !BOC
     745             : !
     746             : ! !LOCAL VARIABLES:
     747             : !
     748             :     ! Initialize
     749           0 :     Hash = 5381
     750             : 
     751             :     !-----------------------------------------------------------------------
     752             :     ! Construct the hash from the first 14 characters of the string,
     753             :     ! which is about the longest species name for GEOS-Chem.
     754             :     !
     755             :     ! NOTE: It's MUCH faster to explicitly write these statements
     756             :     ! instead of writing them using a DO loop (bmy, 5/4/16)
     757             :     !-----------------------------------------------------------------------
     758           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 1: 1) )
     759           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 2: 2) )
     760           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 3: 3) )
     761           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 4: 4) )
     762           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 5: 5) )
     763           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 6: 6) )
     764           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 7: 7) )
     765           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 8: 8) )
     766           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 9: 9) )
     767           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(10:10) )
     768           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(11:11) )
     769           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(12:12) )
     770           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(13:13) )
     771           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(14:14) )
     772             : 
     773           0 :   END FUNCTION Str2Hash14
     774             : !EOC
     775             : !------------------------------------------------------------------------------
     776             : !                   Harmonized Emissions Component (HEMCO)                    !
     777             : !------------------------------------------------------------------------------
     778             : !BOP
     779             : !
     780             : ! !IROUTINE: Str2Hash
     781             : !
     782             : ! !DESCRIPTION: Returns a unique integer hash for a given character string.
     783             : !  This allows us to implement a fast name lookup algorithm.
     784             : !\\
     785             : !\\
     786             : ! !INTERFACE:
     787             : !
     788           0 :   FUNCTION Str2Hash31( Str ) RESULT( Hash )
     789             : !
     790             : ! !INPUT PARAMETERS:
     791             : !
     792             :     CHARACTER(LEN=31), INTENT(IN) :: Str    ! String (31 chars long)
     793             : !
     794             : ! !RETURN VALUE:
     795             : !
     796             :     INTEGER                       :: Hash   ! Hash value from string
     797             : !
     798             : ! !REMARKS:
     799             : !  (1) Algorithm taken from this web page:
     800             : !       https://fortrandev.wordpress.com/2013/07/06/fortran-hashing-algorithm/
     801             : !
     802             : !  (2) For now, we only use the first 31 characers of the character string
     803             : !       to compute the hash value.  Most GEOS-Chem variable names only use
     804             : !       up to 31 unique characters.  We can change this later if need be.
     805             : !
     806             : ! !REVISION HISTORY:
     807             : !  26 Jun 2017 - R. Yantosca - Initial version
     808             : !  See https://github.com/geoschem/hemco for complete history
     809             : !EOP
     810             : !------------------------------------------------------------------------------
     811             : !BOC
     812             : !
     813             : ! !LOCAL VARIABLES:
     814             : !
     815             :     ! Initialize
     816           0 :     Hash = 5381
     817             : 
     818             :     !-----------------------------------------------------------------------
     819             :     ! Construct the hash from the first 31 characters of the string,
     820             :     ! which is about the longest variable name for GEOS-Chem.
     821             :     !
     822             :     ! NOTE: It's MUCH faster to explicitly write these statements
     823             :     ! instead of writing them using a DO loop.
     824             :     !-----------------------------------------------------------------------
     825           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 1: 1) )
     826           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 2: 2) )
     827           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 3: 3) )
     828           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 4: 4) )
     829           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 5: 5) )
     830           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 6: 6) )
     831           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 7: 7) )
     832           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 8: 8) )
     833           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str( 9: 9) )
     834           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(10:10) )
     835           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(11:11) )
     836           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(12:12) )
     837           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(13:13) )
     838           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(14:14) )
     839           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(15:15) )
     840           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(16:16) )
     841           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(17:17) )
     842           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(18:18) )
     843           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(19:19) )
     844           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(20:20) )
     845           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(21:21) )
     846           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(22:22) )
     847           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(23:23) )
     848           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(24:24) )
     849           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(25:25) )
     850           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(26:26) )
     851           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(27:27) )
     852           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(28:28) )
     853           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(29:29) )
     854           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(30:30) )
     855           0 :     Hash = ( ISHFT( Hash, 5 ) + Hash ) + ICHAR( Str(31:31) )
     856             : 
     857           0 :   END FUNCTION Str2Hash31
     858             : !EOC
     859             : !------------------------------------------------------------------------------
     860             : !                   Harmonized Emissions Component (HEMCO)                    !
     861             : !------------------------------------------------------------------------------
     862             : !BOP
     863             : !
     864             : ! !IROUTINE: To_Uppercase
     865             : !
     866             : ! !DESCRIPTION: Converts a string to uppercase, so that we can reliably
     867             : !  do string matching.
     868             : !\\
     869             : !\\
     870             : ! !INTERFACE:
     871             : !
     872           0 :   FUNCTION To_UpperCase( Text ) RESULT( UpCaseText )
     873             : !
     874             : ! !INPUT PARAMETERS:
     875             : !
     876             :     CHARACTER(LEN=*), INTENT(IN) :: Text         ! Input test
     877             : !
     878             : ! !RETURN VALUE:
     879             : !
     880             :     CHARACTER(LEN=255)           :: UpCaseText   ! Output text, uppercase
     881             : !
     882             : ! !REMARKS:
     883             : !  Code originally from routine TRANUC (Author: R. D. Stewart, 19 May 1992)
     884             : !
     885             : ! !REVISION HISTORY:
     886             : !  26 Jun 2017 - R. Yantosca - Initial version
     887             : !  See https://github.com/geoschem/hemco for complete history
     888             : !EOP
     889             : !------------------------------------------------------------------------------
     890             : !BOC
     891             : !
     892             : ! !LOCAL VARIABLES:
     893             : !
     894             :     ! Scalars
     895             :     INTEGER :: C, Ascii
     896             : 
     897             :     !=======================================================================
     898             :     ! Convert to uppercase
     899             :     !=======================================================================
     900             : 
     901             :     ! Initialize
     902           0 :     UpCaseText = Text
     903             : 
     904             :     ! Loop over all characters
     905           0 :     DO C = 1, LEN_TRIM( UpCaseText )
     906             : 
     907             :        ! Get the ASCII code for each character
     908           0 :        Ascii = ICHAR( UpCaseText(C:C) )
     909             : 
     910             :        ! If lowercase, convert to uppercase
     911           0 :        IF ( Ascii > 96 .and. Ascii < 123 ) THEN
     912           0 :           UpCaseText(C:C) = CHAR( Ascii - 32 )
     913             :        ENDIF
     914             :     ENDDO
     915             : 
     916           0 :   END FUNCTION To_UpperCase
     917             : !EOC
     918             : !------------------------------------------------------------------------------
     919             : !                   Harmonized Emissions Component (HEMCO)                    !
     920             : !------------------------------------------------------------------------------
     921             : !BOP
     922             : !
     923             : ! !IROUTINE: ReadOneLine
     924             : !
     925             : ! !DESCRIPTION: Subroutine READ\_ONE\_LINE reads a line from the input file.
     926             : !  If the global variable VERBOSE is set, the line will be printed to stdout.
     927             : !  READ\_ONE\_LINE can trap an unexpected EOF if LOCATION is passed.
     928             : !  Otherwise, it will pass a logical flag back to the calling routine,
     929             : !  where the error trapping will be done.
     930             : !\\
     931             : !\\
     932             : ! !INTERFACE:
     933             : !
     934           0 :   FUNCTION ReadOneLine( fId, EndOfFile, IoStatus, Squeeze ) RESULT( Line )
     935             : !
     936             : ! !INPUT PARAMETERS:
     937             : !
     938             :     INTEGER, INTENT(IN)      :: fId        ! File unit number
     939             :     LOGICAL, OPTIONAL        :: Squeeze    ! Call Strsqueeze?
     940             : !
     941             : ! !OUTPUT PARAMETERS:
     942             : !
     943             :     LOGICAL, INTENT(OUT)     :: EndOfFile  ! Denotes EOF condition
     944             :     INTEGER, INTENT(OUT)     :: IoStatus   ! I/O status code
     945             : !
     946             : ! !RETURN VALUE:
     947             : !
     948             :     CHARACTER(LEN=MAXSTRLEN) :: Line       ! Single line from the input file
     949             : !
     950             : ! !REMARKS:
     951             : !  Mostly used by routines in the History/ folder.
     952             : !
     953             : ! !REVISION HISTORY:
     954             : !  16 Jun 2017 - R. Yantosca - Initial version, based on GEOS-Chem
     955             : !  See https://github.com/geoschem/hemco for complete history
     956             : !EOP
     957             : !------------------------------------------------------------------------------
     958             : !BOC
     959             : 
     960             :     !=================================================================
     961             :     ! Initialize
     962             :     !=================================================================
     963           0 :     EndOfFile = .FALSE.
     964           0 :     IoStatus  = 0
     965           0 :     Line      = ''
     966             : 
     967             :     !=================================================================
     968             :     ! Read data from the file
     969             :     !=================================================================
     970             : 
     971             :     ! Read a line from the file
     972           0 :     READ( fId, '(a)', IOSTAT=IoStatus ) Line
     973             : 
     974             :     ! IO Status < 0: EOF condition
     975           0 :     IF ( IoStatus < 0 ) THEN
     976           0 :        EndOfFile = .TRUE.
     977           0 :        RETURN
     978             :     ENDIF
     979             : 
     980             :     ! If desired, call StrSqueeze to strip leading and trailing blanks
     981           0 :     IF ( PRESENT( Squeeze ) ) THEN
     982           0 :        IF ( Squeeze ) THEN
     983           0 :           CALL StrSqueeze( Line )
     984             :        ENDIF
     985             :     ENDIF
     986             : 
     987             :   END FUNCTION ReadOneLine
     988             : !EOC
     989             : !------------------------------------------------------------------------------
     990             : !                   Harmonized Emissions Component (HEMCO)                    !
     991             : !------------------------------------------------------------------------------
     992             : !BOP
     993             : !
     994             : ! !IROUTINE: CleanText
     995             : !
     996             : ! !DESCRIPTION: Strips commas, apostrophes, spaces, and tabs from a string.
     997             : !\\
     998             : !\\
     999             : ! !INTERFACE:
    1000             : !
    1001           0 :   FUNCTION CleanText( Str ) RESULT( CleanStr )
    1002             : !
    1003             : ! !INPUT PARAMETERS:
    1004             : !
    1005             :     CHARACTER(LEN=*), INTENT(IN) :: Str        ! Original string
    1006             : !
    1007             : ! !RETURN VALUE
    1008             : !
    1009             :     CHARACTER(LEN=255)           :: CleanStr   ! Cleaned-up string
    1010             : !
    1011             : ! !REMARKS:
    1012             : !  Mostly used by routines in the History/ folder.
    1013             : !
    1014             : ! !REVISION HISTORY:
    1015             : !  06 Jan 2015 - R. Yantosca - Initial version
    1016             : !  See https://github.com/geoschem/hemco for complete history
    1017             : !EOP
    1018             : !------------------------------------------------------------------------------
    1019             : !BOC
    1020             : 
    1021             :     ! Initialize
    1022           0 :     CleanStr = Str
    1023             : 
    1024             :     ! Strip out non-printing characters (e.g. tabs)
    1025           0 :     CALL CStrip    ( CleanStr           )
    1026             : 
    1027             :     ! Remove commas and quotes
    1028           0 :     CALL StrRepl   ( CleanStr, ",", " " )
    1029           0 :     CALL StrRepl   ( CleanStr, "'", " " )
    1030             : 
    1031             :     ! Remove leading and trailing spaces
    1032           0 :     CALL StrSqueeze( CleanStr           )
    1033             : 
    1034           0 :   END FUNCTION CleanText
    1035             : !EOC
    1036             : !------------------------------------------------------------------------------
    1037             : !                   Harmonized Emissions Component (HEMCO)                    !
    1038             : !------------------------------------------------------------------------------
    1039             : !BOP
    1040             : !
    1041             : ! !IROUTINE: WordWrapPrint
    1042             : !
    1043             : ! !DESCRIPTION: Prints a text string wrapped to a specified line width.
    1044             : !  Useful for displaying error and warning messages.
    1045             : !\\
    1046             : !\\
    1047             : ! !INTERFACE:
    1048             : !
    1049           0 :   SUBROUTINE WordWrapPrint( Text, LineWidth, Delimiter )
    1050             : !
    1051             : ! !INPUT PARAMETERS:
    1052             : !
    1053             :     CHARACTER(LEN=*), INTENT(IN) :: Text        ! Text to print
    1054             :     INTEGER,          INTENT(IN) :: LineWidth   ! Width (characters) of lines
    1055             :     CHARACTER(LEN=1), OPTIONAL   :: Delimiter   ! Delimiter between words
    1056             : !
    1057             : ! !REMARKS:
    1058             : !  The default DELIMITER is the space (" ") character.
    1059             : !
    1060             : ! !REVISION HISTORY:
    1061             : !  20 Dec 2015 - R. Yantosca - Initial version
    1062             : !  See https://github.com/geoschem/hemco for complete history
    1063             : !EOP
    1064             : !------------------------------------------------------------------------------
    1065             : !BOC
    1066             : !
    1067             : ! !LOCAL VARIABLES:
    1068             : !
    1069             :     ! Scalars
    1070             :     INTEGER          :: C, S, B, Matches, Length
    1071             : 
    1072             :     ! Arrays
    1073             :     INTEGER          :: BreakPts(100)
    1074             :     INTEGER          :: SpaceLoc(500)
    1075             : 
    1076             :     ! Strings
    1077             :     CHARACTER(LEN=1) :: Delim
    1078             : 
    1079             :     !=======================================================================
    1080             :     ! WordWrapPrint begins here!
    1081             :     !=======================================================================
    1082             : 
    1083             :     ! SpaceLoc is the array of where delimiters (usually the " "
    1084             :     ! character) occur in the text, and S is its index.
    1085           0 :     S           = 1
    1086           0 :     SpaceLoc    = 0
    1087             : 
    1088             :     ! BreakPts is the array of where line breaks occur
    1089             :     ! and B is its index.
    1090           0 :     BreakPts    = 0
    1091           0 :     B           = 1
    1092           0 :     BreakPts(B) = 1
    1093             : 
    1094             :     ! Delimiter for separating words (will be the space character by default)
    1095           0 :     IF ( PRESENT( Delimiter ) ) THEN
    1096           0 :        Delim = Delimiter
    1097             :     ELSE
    1098           0 :        Delim = ' '
    1099             :     ENDIF
    1100             : 
    1101             :     ! Find the Location of spaces in the text
    1102           0 :     CALL CntMat( Text, ' ', Matches, SpaceLoc )
    1103             : 
    1104             :     ! Loop through the number of matches
    1105             :     DO
    1106             : 
    1107             :        ! Move to the next delimiter location
    1108           0 :        S = S + 1
    1109             : 
    1110             :        ! Compute the length of the line
    1111           0 :        Length = SpaceLoc(S) - BreakPts(B)
    1112             : 
    1113             :        ! If the length of this segment is greater than the requested
    1114             :        ! line length, store the position of this line break
    1115           0 :        IF ( Length > LineWidth ) THEN
    1116           0 :           B           = B             + 1
    1117           0 :           BreakPts(B) = SpaceLoc(S-1) + 1
    1118             :        ENDIF
    1119             : 
    1120             :        ! If we have exceeded the number of delimiters in the text, then set
    1121             :        ! the last breakpoint at the end of the text and exit the loop.
    1122           0 :        IF ( S > Matches ) THEN
    1123           0 :           B           = B + 1
    1124           0 :           BreakPts(B) = LEN_TRIM( Text ) + 1
    1125             :           EXIT
    1126             :        ENDIF
    1127             : 
    1128             :     ENDDO
    1129             : 
    1130             :     ! Print each line
    1131           0 :     DO C = 1, B-1
    1132           0 :        WRITE( 6, '(a)' ) Text( BreakPts(C):BreakPts(C+1)-1 )
    1133             :     ENDDO
    1134             : 
    1135           0 :   END SUBROUTINE WordWrapPrint
    1136             : !EOC
    1137             : END MODULE HCO_CharPak_Mod

Generated by: LCOV version 1.14