<HTML> <BODY BGCOLOR=#ccccdd LINK=#0000aa VLINK=#0000ff ALINK=#ff0000 ><BASE TARGET="bottom_target"><PRE>
<A NAME='SNTBDE'><A href='../../html_code/bufr/sntbde.f.html#SNTBDE' TARGET='top_target'><IMG SRC="../../gif/bar_red.gif" border=0></A>
SUBROUTINE SNTBDE ( LUNT, IFXYN, LINE, MXMTBD, MXELEM, 5,9
. NMTBD, IMFXYN, CMMNEM, CMDSC, CMSEQ,
. NMELEM, IEFXYN, CEELEM )
C$$$ SUBPROGRAM DOCUMENTATION BLOCK
C
C SUBPROGRAM: SNTBDE
C PRGMMR: ATOR ORG: NP12 DATE: 2007-01-19
C
C ABSTRACT: THIS SUBROUTINE PARSES THE FIRST LINE OF AN ENTRY THAT WAS
C PREVIOUSLY READ FROM AN ASCII MASTER TABLE D FILE AND STORES THE
C OUTPUT INTO THE MERGED ARRAYS. IT THEN READS AND PARSES ALL
C REMAINING LINES FOR THAT SAME ENTRY AND THEN LIKEWISE STORES THAT
C OUTPUT INTO THE MERGED ARRAYS. THE RESULT IS THAT, UPON OUTPUT,
C THE MERGED ARRAYS NOW CONTAIN ALL OF THE INFORMATION FOR THE
C CURRENT TABLE ENTRY.
C
C PROGRAM HISTORY LOG:
C 2007-01-19 J. ATOR -- ORIGINAL AUTHOR
C
C USAGE: CALL SNTBDE
( LUNT, IFXYN, LINE, MXMTBD, MXELEM,
C NMTBD, IMFXYN, CMMNEM, CMDSC, CMSEQ,
C NMELEM, IEFXYN, CEELEM )
C INPUT ARGUMENT LIST:
C LUNT - INTEGER: FORTRAN LOGICAL UNIT NUMBER OF ASCII FILE
C CONTAINING MASTER TABLE D INFORMATION
C IFXYN - INTEGER: BIT-WISE REPRESENTATION OF FXY NUMBER FOR
C TABLE ENTRY; THIS FXY NUMBER IS THE SEQUENCE DESCRIPTOR
C LINE - CHARACTER*(*): FIRST LINE OF TABLE ENTRY
C MXMTBD - INTEGER: MAXIMUM NUMBER OF ENTRIES TO BE STORED IN
C MERGED MASTER TABLE D ARRAYS; THIS SHOULD BE THE SAME
C NUMBER AS WAS USED TO DIMENSION THE OUTPUT ARRAYS IN
C THE CALLING PROGRAM, AND IT IS USED BY THIS SUBROUTINE
C TO ENSURE THAT IT DOESN'T OVERFLOW THESE ARRAYS
C MXELEM - INTEGER: MAXIMUM NUMBER OF ELEMENTS TO BE STORED PER
C ENTRY WITHIN THE MERGED MASTER TABLE D ARRAYS; THIS
C SHOULD BE THE SAME NUMBER AS WAS USED TO DIMENSION THE
C OUTPUT ARRAYS IN THE CALLING PROGRAM, AND IT IS USED
C BY THIS SUBROUTINE TO ENSURE THAT IT DOESN'T OVERFLOW
C THESE ARRAYS
C
C OUTPUT ARGUMENT LIST:
C NMTBD - INTEGER: NUMBER OF ENTRIES IN MERGED MASTER TABLE D
C ARRAYS
C IMFXYN(*)- INTEGER: MERGED ARRAY CONTAINING BIT-WISE
C REPRESENTATIONS OF FXY NUMBERS (I.E. SEQUENCE
C DESCRIPTORS)
C CMMNEM(*)- CHARACTER*8: MERGED ARRAY CONTAINING MNEMONICS
C CMDSC(*) - CHARACTER*4: MERGED ARRAY CONTAINING DESCRIPTOR CODES
C CMSEQ(*) - CHARACTER*120: MERGED ARRAY CONTAINING SEQUENCE NAMES
C NMELEM(*)- INTEGER: MERGED ARRAY CONTAINING NUMBER OF ELEMENTS
C STORED FOR EACH ENTRY
C IEFXYN(*,*)- INTEGER: MERGED ARRAY CONTAINING BIT-WISE
C REPRESENTATIONS OF ELEMENT FXY NUMBERS
C CEELEM(*,*)- CHARACTER*120: MERGED ARRAY CONTAINING ELEMENT NAMES
C
C REMARKS:
C THIS ROUTINE CALLS: ADN30 BORT BORT2 IFXY
C IGETFXY IGETNTBL JSTCHR NEMOCK
C PARSTR
C THIS ROUTINE IS CALLED BY: RDMTBD
C Normally not called by any application
C programs.
C
C ATTRIBUTES:
C LANGUAGE: FORTRAN 77
C MACHINE: PORTABLE TO ALL PLATFORMS
C
C$$$
CHARACTER*(*) LINE
CHARACTER*200 TAGS(10), CLINE
CHARACTER*128 BORT_STR1, BORT_STR2
CHARACTER*120 CMSEQ(*), CEELEM(MXMTBD,MXELEM)
CHARACTER*8 CMMNEM(*)
CHARACTER*6 ADN30, ADSC, CLEMON
CHARACTER*4 CMDSC(*)
INTEGER IMFXYN(*), NMELEM(*),
. IEFXYN(MXMTBD,MXELEM)
LOGICAL DONE
C-----------------------------------------------------------------------
C-----------------------------------------------------------------------
IF ( NMTBD .GE. MXMTBD ) GOTO 900
NMTBD = NMTBD + 1
C Store the FXY number. This is the sequence descriptor.
IMFXYN ( NMTBD ) = IFXYN
C Is there any other information within the first line of the
C table entry? If so, it follows a "|" separator.
CMMNEM ( NMTBD ) = ' '
CMDSC ( NMTBD ) = ' '
CMSEQ ( NMTBD ) = ' '
IPT = INDEX ( LINE, '|' )
IF ( IPT .NE. 0 ) THEN
C Parse the rest of the line. Any of the fields may be blank.
CALL PARSTR
( LINE(IPT+1:), TAGS, 10, NTAG, ';', .FALSE. )
IF ( NTAG .GT. 0 ) THEN
C The first additional field contains the mnemonic.
CALL JSTCHR
( TAGS(1), IRET )
C If there is a mnemonic, then make sure it's legal.
IF ( ( IRET .EQ. 0 ) .AND.
. ( NEMOCK ( TAGS(1) ) .NE. 0 ) ) THEN
BORT_STR2 = ' HAS ILLEGAL MNEMONIC'
GOTO 901
ENDIF
CMMNEM ( NMTBD ) = TAGS(1)(1:8)
ENDIF
IF ( NTAG .GT. 1 ) THEN
C The second additional field contains descriptor codes.
CALL JSTCHR
( TAGS(2), IRET )
CMDSC ( NMTBD ) = TAGS(2)(1:4)
ENDIF
IF ( NTAG .GT. 2 ) THEN
C The third additional field contains the sequence name.
CALL JSTCHR
( TAGS(3), IRET )
CMSEQ ( NMTBD ) = TAGS(3)(1:120)
ENDIF
ENDIF
C Now, read and parse all remaining lines from this table entry.
C Each line should contain an element descriptor for the sequence
C represented by the current sequence descriptor.
NELEM = 0
DONE = .FALSE.
DO WHILE ( .NOT. DONE )
IF ( IGETNTBL ( LUNT, CLINE ) .NE. 0 ) THEN
BORT_STR2 = ' IS INCOMPLETE'
GOTO 901
ENDIF
CALL PARSTR
( CLINE, TAGS, 10, NTAG, '|', .FALSE. )
IF ( NTAG .LT. 2 ) THEN
BORT_STR2 = ' HAS BAD ELEMENT CARD'
GOTO 901
ENDIF
C The second field contains the FXY number for this element.
IF ( IGETFXY ( TAGS(2), ADSC ) .NE. 0 ) THEN
BORT_STR2 = ' HAS BAD OR MISSING' //
. ' ELEMENT FXY NUMBER'
GOTO 901
ENDIF
IF ( NELEM .GE. MXELEM ) GOTO 900
NELEM = NELEM + 1
IEFXYN ( NMTBD, NELEM ) = IFXY ( ADSC )
C The third field (if it exists) contains the element name.
IF ( NTAG .GT. 2 ) THEN
CALL JSTCHR
( TAGS(3), IRET )
CEELEM ( NMTBD, NELEM ) = TAGS(3)(1:120)
ELSE
CEELEM ( NMTBD, NELEM ) = ' '
ENDIF
C Is this the last line for this table entry?
IF ( INDEX ( TAGS(2), ' >' ) .EQ. 0 ) DONE = .TRUE.
ENDDO
NMELEM ( NMTBD ) = NELEM
RETURN
900 CALL BORT
('BUFRLIB: SNTBDE - OVERFLOW OF MERGED ARRAYS')
901 CLEMON = ADN30 ( IFXYN, 6 )
WRITE(BORT_STR1,'("BUFRLIB: SNTBDE - TABLE D ENTRY FOR' //
. ' SEQUENCE DESCRIPTOR: ",5A)')
. CLEMON(1:1), '-', CLEMON(2:3), '-', CLEMON(4:6)
CALL BORT2
(BORT_STR1,BORT_STR2)
END