SUBROUTINE SNTBDE ( LUNT, IFXYN, LINE, MXMTBD, MXELEM, . 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