*DECK DB$BFTX 
USETEXT BRGENTX 
      PROC DB$BFTX(TABLENTRYLOC,MESSAGE,TOINDEX); 
      BEGIN 
 #
* *   DB$BFTX - FORMAT MESSAGE TEXT              PAGE  1
* *   E. P. JOHNSON                              DATE  05/09/81 
* * 
* 
* DC  PURPOSE 
* 
*     TO FORMAT MESSAGE TEXTS FOR THE DBREC ERROR PROCESSOR AND 
*     THE USER REPORT GENERATOR.
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
# 
      ITEM TABLENTRYLOC I;             # LOCATION OF THE MESSAGE       #
                                       # TABLE ENTRY.                  #
      ITEM TOINDEX      I;             # CHARACTER POSITION IN THE     #
                                       # MESSAGE BUFFER.               #
      ARRAY MESSAGE [0:0] S(DFMSGBUFLENW);
                                       # MESSAGE BUFFER.               #
        BEGIN 
        ITEM MESBUF C(00,00,DFMSGBUFLENC);
        END 
# 
* D   ASSUMPTIONS 
* 
*     COMMON ITEMS: 
*       INSERTITEMC          THE SPECIAL CHARACTER INSERTION ITEM 
*                            CONTAINS THE DESIRED STRING TO BE INSERTED.
*       INSERTITEMI          THE SPECIAL INTEGER INSERTION ITEM 
*                            CONTAINS THE DESIRED NUMBER TO BE INSERTED.
*     COMMON ARRAYS:  
*       FIT FIELDS- 
*         FITES              THE FIT ERROR STATUS FIELD CONTAINS THE CRM
*                            ERROR NUMBER TO BE INSERTED. 
* 
*         FITLFN             THE FIT LOGICAL FILE NAME FIELD CONTAINS 
*                            THE FILE NAME TO BE INSERTED.
*       FET FIELDS- 
*         FETNOSAT           THE NOS FET ABNORMAL TERMINATION FIELD 
*                            CONTAINS THE CIO ERROR NUMBER TO BE
*                            INSERTED.
*         FETNBAT            THE NOS/BE FET ABNORMAL TERMINATION FIELD
*                            CONTAINS THE CIO ERROR NUMBER TO BE
*                            INSERTED.
*       MDSCDIR              MD SCHEMA DIRECTORY TABLE HAS BEEN READ IN.
*       MDSCINFO             MD SCHEMA INFORMATION TABLE HAS BEEN 
*                            READ IN. 
*         P<MDPIT>           THE POINTER OF THE PERMANENT FILE
*                            INFORMATION TABLE BASED ARRAY IS SET.
*           MDPITNAME        THE FILE NUMBER HAS BEEN APPENDED FOR THE
*                            JOURNAL LOG FILE OR THE TRANSACTION
*                            RECOVERY FILE. 
* 
* DC  EXIT CONDITIONS 
* 
*     NORMAL - THE MESSAGE HAS BEEN FORMATTED AND RETURNED IN THE 
*              MESSAGE ARRAY. THE LENGTH OF THE MESSAGE IS RETURNED 
*              IN TOINDEX.
* 
*     ABNORMAL - IF THE INSERTION TYPE CHARACTER IS NOT VALID, THEN 
*                THIS IS AN INTERNAL ERROR, DBREC IS ABORTED. 
* 
* DC  CALLING ROUTINES
* 
*     DB$BERR                DBREC ERROR PROCESSOR. 
*     DB$BURP                DBREC USER REPORT GENERATOR. 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$BUNT;               # DBREC INTERNAL ERROR PROCESSOR#
      XREF FUNC DB$CDIS C(10);         # CONVERT NUMBER TO DISPLAY CODE#
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     INSERTITEMC            SPECIAL CHARACTER INSERTION ITEM.
*     INSERTITEMI            SPECIAL INTEGER INSERTION ITEM.
* 
* DC  DESCRIPTION 
* 
*     - INITIALIZE THE TRANSFERFROM CHARACTER POSITION, THE NUMBER OF 
*       CHARACTERS TO TRANSFER AND FROMINDEX (THE CHARACTER POSITION OF 
*       THE MESSAGE TEXT BEING SCANNED) TO ZERO.
* 
*     - LOOP THROUGH THE CHARACTERS OF THE MESSAGE TEXT, UNDER THE
*       CONDITION THAT THE END OF THE MESSAGE HAS NOT BEEN REACHED, 
*       SCANNING FOR THE INSERTION INDICATOR ('). 
* 
*     - IF THE CURRENT CHARACTER IS NOT EQUAL TO THE INSERTION INDICATOR
*       AND IS NOT THE LAST CHARACTER, THEN INCREMENT FROMINDEX AND 
*       CONTINUE WITH THE NEXT CHARACTER. 
* 
*     - IF THE NUMBER OF CHARACTERS TO TRANSFER (FROMINDEX-TRANSFERFROM)
*       IS GREATER THAN ZERO, THEN TRANSFER THOSE CHARACTERS TO THE 
*       MESSAGE BUFFER AND INCREMENT TOINDEX (CHARACTER POSITION OF THE 
*       MESSAGE BUFFER) BY THE NUMBER OF CHARACTERS TRANSFERED. 
* 
*     - IF THE CURRENT CHARACTER IS THE LAST CHARACTER IN THE MESSAGE,
*       THEN END THE LOOP.
* 
*     - EXTRACT THE INSERTION TYPE CHARACTER FROM THE MESSAGE TEXT, SET 
*       FROMINDEX TO THE NEXT CHARACTER BEYOND THE INSERTION TYPE 
*       CHARACTER AND SET THE TRANSFERFROM CHARACTER POSITION EQUAL TO
*       FROMINDEX.
* 
*     - VERIFY THAT THE INSERTION TYPE CHARACTER IS VALID.
*       IF NOT VALID, THEN THIS IS AN INTERNAL ERROR, DBREC IS ABORTED. 
* 
*     - GOTO THE PARTICULAR INSERTION CASE INDICATED BY THE INSERTION 
*       TYPE CHARACTER. 
* 
*     - INSERTION TYPE: A. INSERT THE SCHEMA NAME FROM THE MD SCHEMA
*       DIRECTORY TABLE INTO THE MESSAGE BUFFER. CONTINUE SCANNING THE
*       MESSAGE TEXT. 
* 
*     - INSERTION TYPE: B. INSERT THE JOURNAL LOG, TRANSACTION RECOVERY,
*       QUICK RECOVERY, OR RESTART IDENTIFIER FILE NAME FROM THE
*       PERMANENT FILE INFORMATION TABLE (IN THE SCHEMA INFORMATION 
*       TABLE) INTO THE MESSAGE BUFFER. CONTINUE SCANNING THE MESSAGE 
*       TEXT. 
* 
*     - INSERTION TYPE: C. INSERT THE PFM ERROR NUMBER OR THE REQUEST OR
*       LABEL ERROR NUMBER OR THE EXTEND ERROR NUMBER INTO THE MESSAGE
*       BUFFER. CONTINUE SCANNING THE MESSAGE TEXT. 
* 
*     - INSERTION TYPE: D. INSERT THE CRM ERROR NUMBER INTO THE MESSAGE 
*       BUFFER. CONTINUE SCANNING THE MESSAGE TEXT. 
* 
*     - INSERTION TYPE: E. INSERT THE CIO ERROR NUMBER INTO THE MESSAGE 
*       BUFFER. IF THE OPERATING SYSTEM IS NOS THEN USE THE NOS FET 
*       ABNORMAL TERMINATION FIELD, ELSE USE THE NOS/BE FET ABNORMAL
*       TERMINATION FIELD. CONTINUE SCANNING THE MESSAGE TEXT.
* 
*     - INSERTION TYPE: F. INSERT ONE OF THE FOLLOWING CHARACTERISTICS
*       OF THE LAST JOURNAL LOG RECORD DUMPED TO TAPE INTO THE MESSAGE
*       BUFFER - THE USER ID, THE PROGRAM ID, THE TYPE OF RECORD, THE 
*       DATE OF ENTRY, OR THE TIME OF ENTRY. THESE CHARACTERISTICS ARE
*       FROM THE FIXED PORTION OF THE JOURNAL LOG RECORD. CONTINUE
*       SCANNING THE MESSAGE TEXT.
* 
*     - INSERTION TYPE: G. INSERT THE LFN FROM THE FIT INTO THE MESSAGE 
*       BUFFER. CONTINUE SCANNING THE MESSAGE TEXT. 
* 
*     - RETURN TO THE CALLER. 
* 
 #
  
# EXTERNALLY REFERENCED ITEMS.                                         #
  
      XREF ITEM DB$NOSU B;             # OPERATING SYSTEM FLAG.        #
                                       # TRUE = NOS.                   #
  
# LOCAL DEFS.                                                          #
  
      DEF DFMININSERT #01#;            # THE FIRST INSERTION TYPE      #
                                       # CHARACTER. DISPLAY CODE VALUE #
                                       # OF THE CHARACTER *A*.         #
      DEF DFMAXINSERT #07#;            # THE LAST INSERTION TYPE       #
                                       # CHARACTER. DISPLAY CODE VALUE #
                                       # OF THE CHARACTER *G*.         #
      SWITCH INSERTION                 # INSERTION TYPE CHARACTER      #
                                       # SWITCH.                       #
           ,A 
           ,B 
           ,C 
           ,D 
           ,E 
           ,F 
           ,G 
            ; 
  
# LOCAL VARIABLES.                                                     #
  
      ITEM FROMINDEX     I;            # THE MESSAGE TEXT CHARACTER    #
                                       # POSITION.                     #
      ITEM I             I;            # LOOP VARIABLE.                #
      ITEM INSERTCHAR    I;            # THE INSERTION TYPE CHARACTER. #
      ITEM NUMBERCHARS   I;            # THE NUMBER OF CHARACTERS TO   #
                                       # TRANSFER FROM THE MESSAGE TEXT#
                                       # TO THE MESSAGE BUFFER.        #
      ITEM TRANSFERFROM  I;            # THE CHARACTER POSITION TO     #
                                       # BEGIN THE TRANSFERING OF      #
                                       # CHARACTERS FROM THE MESSAGE   #
                                       # TEXT TO THE MESSAGE BUFFER.   #
*CALL BMGTBDCLS 
  
CONTROL EJECT;
# INTERNAL PROCEDURES.                                                 #
  
      PROC INSERT(INSERTTEXT);
      BEGIN 
 #
* *   DB$BFTX                                    PAGE  1
* *   INSERT - INSERT TEXT
* *   E. P. JOHNSON                              DATE  06/24/81 
* * 
* 
* DC  PURPOSE 
* 
*     TO INSERT THE GIVEN TEXT INTO THE MESSAGE BUFFER. 
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
# 
      ITEM INSERTTEXT C(30);           # TEXT TO BE INSERTED INTO THE  #
                                       # MESSAGE BUFFER.               #
# 
* D   ASSUMPTIONS 
* 
*     TOINDEX                THE CHARACTER POSITION IN THE MESSAGE
*                            BUFFER IS SET TO THE DESIRED LOCATION TO 
*                            BEGIN THE INSERTION. 
* 
* DC  EXIT CONDITIONS 
* 
*     THE TEXT HAS BEEN INSERTED INTO THE MESSAGE BUFFER AND TOINDEX
*     HAS BEEN INCREMENTED TO REFLECT THE INSERTION.
* 
* DC  CALLING ROUTINES
* 
*     DB$BFTX                FORMAT MESSAGE TEXT
* 
* DC  CALLED ROUTINES 
* 
*     NONE
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     MSGBUF                 THE MESSAGE BUFFER.
*     TOINDEX                CHARACTER POSITION IN THE MESSAGE BUFFER.
* 
* DC  DESCRIPTION 
* 
*     - DETERMINE THE LENGTH OF THE INSERTION TEXT BY LOOPING THROUGH 
*       THE TEXT UNTIL THE MAXIMUM LENGTH OF THE INSERTION TEXT HAS 
*       BEEN REACHED (30 CHARACTERS), OR A BLANK OR BINARY ZERO WAS 
*       FOUND (INDICATES END OF TEXT).
* 
*     - TRANSFER THE INSERTION TEXT TO THE MESSAGE BUFFER AND INCREMENT 
*       TOINDEX BY THE NUMBER OF CHARACTERS TRANSFERRED.
* 
*     - RETURN TO THE CALLER. 
* 
 #
  
# LOCAL VARIABLES.                                                     #
  
      ITEM INDEX I;                    # LOOP VARIABLE.                #
      ITEM NUMCHARS I;                 # THE NUMBER OF CHARACTERS TO   #
                                       # TRANSFER.                     #
  
  
# S T A R T   O F   I N S E R T   E X E C U T A B L E   C O D E        #
  
  
# DETERMINE THE LENGTH OF THE INSERTION TEXT BY LOOPING THROUGH THE    #
# TEXT UNTIL THE MAXIMUM LENGTH OF THE INSERTION TEXT HAS BEEN REACHED #
# (30 CHARACTERS), OR A BLANK OR BINARY ZERO WAS FOUND (INDICATES END  #
# OF TEXT).                                                            #
  
      NUMCHARS = 0;                    # INITIALIZE THE NUMBER OF      #
                                       # CHARS TO TRANSFER.            #
  
      FOR INDEX = 1 STEP 1
        WHILE NUMCHARS EQ 0 
      DO
        BEGIN 
        IF INDEX EQ 30
          OR C<INDEX,1>INSERTTEXT EQ " "
          OR C<INDEX,1>INSERTTEXT EQ  0 
        THEN
          BEGIN 
          NUMCHARS = INDEX; 
          END 
        END 
  
# TRANSFER THE INSERTION TEXT TO THE MESSAGE BUFFER AND INCREMENT      #
# TOINDEX BY THE NUMBER OF CHARACTERS TRANSFERRED.                     #
  
      C<TOINDEX,NUMCHARS>MESBUF[0] = C<0,NUMCHARS>INSERTTEXT; 
  
      TOINDEX = TOINDEX + NUMCHARS; 
  
# RETURN TO THE CALLER.                                                #
  
      RETURN; 
  
      END                              # END INSERT.                   #
CONTROL EJECT;
  
  
# S T A R T   O F   D B $ B F T X   E X E C U T A B L E   C O D E      #
  
  
# LOOP THROUGH THE CHARACTERS OF THE MESSAGE TEXT, UNDER THE CONDITION #
# THAT THE END OF THE MESSAGE HAS NOT BEEN REACHED, SCANNING FOR THE   #
# INSERTION INDICATOR (').                                             #
  
      TRANSFERFROM = 0;                # INITIALIZE THE TRANSFER FROM  #
                                       # CHARACTER POSITION.           #
      NUMBERCHARS = 0;                 # INITIALIZE THE NUMBER OF      #
                                       # CHARACTERS TO TRANSFER.       #
      FROMINDEX = 0;                   # INITIALIZE THE MESSAGE TEXT   #
                                       # CHARACTER POSITION.           #
      P<MSGTABLE> = TABLENTRYLOC;      # SET THE BASED ARRAY POINTER   #
                                       # OF THE MESSAGE TABLE TO THE   #
                                       # LOCATION OF THE MESSAGE       #
                                       # TABLE ENTRY.                  #
  
      FOR I=I 
        WHILE FROMINDEX LQ MSGTLENC[0]
      DO
        BEGIN                          # BEGIN FORMATTING LOOP.        #
  
# IF THE CURRENT CHARACTER IS NOT EQUAL TO THE INSERTION INDICATOR AND #
# IS NOT THE LAST CHARACTER, THEN INCREMENT FROMINDEX AND CONTINUE     #
# WITH THE NEXT CHARACTER.                                             #
  
        IF C<FROMINDEX,1>MSGTEXT[0] NQ "'"
            AND FROMINDEX NQ MSGTLENC[0]
        THEN
          BEGIN 
          FROMINDEX = FROMINDEX + 1;
          TEST;                        # CONTINUE WITH NEXT CHARACTER. #
  
          END 
  
# IF CHARACTERS HAVE BEEN SCANNED, THEN TRANSFER THOSE CHARACTERS TO   #
# THE MESSAGE BUFFER AND INCREMENT TOINDEX (CHARACTER POSITION OF THE  #
# MESSAGE BUFFER) BY THE NUMBER OF CHARACTERS TRANSFERRED.             #
  
        NUMBERCHARS = FROMINDEX - TRANSFERFROM; 
  
        IF NUMBERCHARS GR 0 
        THEN
          BEGIN 
          C<TOINDEX,NUMBERCHARS>MESBUF[0] = 
                        C<TRANSFERFROM,NUMBERCHARS>MSGTEXT[0];
          TOINDEX = TOINDEX + NUMBERCHARS;
          END 
  
# IF THE CURRENT CHARACTER IS THE LAST CHARACTER IN THE MESSAGE, THEN  #
# END THE LOOP.                                                        #
  
        FROMINDEX = FROMINDEX + 1;     # INCREMENT FROMINDEX TO GET    #
                                       # THE INSERTION TYPE CHARACTER  #
                                       # IF THIS IS NOT THE LAST CHAR. #
  
        IF FROMINDEX GR MSGTLENC[0] 
        THEN
          BEGIN 
          TEST;                        # END THE LOOP.                 #
  
          END 
  
# EXTRACT THE INSERTION TYPE CHARACTER FROM THE MESSAGE TEXT, SET      #
# FROMINDEX TO THE NEXT CHARACTER BEYOND THE INSERTION TYPE CHARACTER  #
# AND SET TRANSFERFROM EQUAL TO FROMINDEX.                             #
  
        INSERTCHAR = C<FROMINDEX,1>MSGTEXT[0];
        FROMINDEX = FROMINDEX + 1;
        TRANSFERFROM = FROMINDEX; 
  
# VERIFY THAT THE INSERTION TYPE CHARACTER IS LEGAL.                   #
  
        IF INSERTCHAR LS DFMININSERT
          OR INSERTCHAR GR DFMAXINSERT
        THEN
          BEGIN 
          DB$BUNT(" DB$BFTX-1");       # DBREC ABORT - ILLEGAL         #
                                       # INSERTION TYPE CHARACTER.     #
          END 
  
# MAKE THE INSERTION INDICATED BY THE INSERTION TYPE CHARACTER AND     #
# CONTINUE SCANNING THE MESSAGE TEXT.                                  #
  
        GOTO INSERTION[INSERTCHAR]; 
  
# INSERTION TYPE: A. INSERT THE SCHEMA NAME FROM THE MD SCHEMA         #
# DIRECTORY TABLE INTO THE MESSAGE BUFFER.                             #
  
A:                                     # SCHEMA NAME.                  #
        INSERT(MDSCNAME[SDTINDX]);
        TEST;                          # CONTINUE SCANNING MESSAGE TEXT#
  
  
# INSERTION TYPE: B. INSERT THE JOURNAL LOG, TRANSACTION RECOVERY,     #
# QUICK RECOVERY, OR RESTART IDENTIFIER FILE NAME FROM THE             #
# PERMANENT FILE INFORMATION TABLE (IN SCHEMA INFORMATION TABLE) INTO  #
# THE MESSAGE BUFFER.                                                  #
  
B:                                     # JLF, QRF, TRF, OR RIF NAME.   #
        INSERT(MDPITNAME[0]); 
        TEST;                          # CONTINUE SCANNING MESSAGE TEXT#
  
  
# INSERTION TYPE: C. INSERT THE PFM ERROR NUMBER OR THE REQUEST OR     #
# LABEL ERROR NUMBER OR THE EXTEND ERROR NUMBER INTO THE MESSAGE       #
# BUFFER.                                                              #
  
C:                                     # PFM ERROR NUMBER.             #
        INSERT(DB$CDIS(INSERTITEMI,3,8,"0")); 
        INSERTITEMI = 0;
        TEST;                          # CONTINUE SCANNING MESSAGE TEXT#
  
  
# INSERTION TYPE: D. INSERT THE CRM ERROR NUMBER INTO THE MESSAGE      #
# BUFFER.                                                              #
  
D:                                     # CRM ERROR NUMBER.             #
        INSERT(DB$CDIS(FITES[0],3,8,"0"));
        TEST;                          # CONTINUE SCANNING MESSAGE TEXT#
  
  
# INSERTION TYPE: E. INSERT THE CIO ERROR NUMBER INTO THE MESSAGE      #
# BUFFER. IF THE OPERATING SYSTEM IS NOS THEN USE THE NOS FET ABNORMAL #
# TERMINATION FIELD, ELSE USE THE NOS/BE ABNORMAL TERMINATION FIELD.   #
  
E:                                     # CIO ERROR NUMBER.             #
        IF DB$NOSU
        THEN
          BEGIN 
          INSERT(DB$CDIS(FETNOSAT[0],2,8,"0")); 
          END 
        ELSE
          BEGIN 
          INSERT(DB$CDIS(FETNBAT[0],2,8,"0"));
          END 
        TEST;                          # CONTINUE SCANNING MESSAGE TEXT#
  
# INSERTION TYPE: F. INSERT ONE OF THE FOLLOWING CHARACTERISTICS OF THE#
# LAST JOURNAL LOG RECORD DUMPED TO TAPE INTO THE MESSAGE BUFFER - THE #
# USER ID, THE PROGRAM ID, THE TYPE OF RECORD, THE DATE OF ENTRY, OR   #
# THE TIME OF ENTRY. THESE CHARACTERISTICS ARE FROM THE FIXED PORTION  #
# OF THE JOURNAL LOG RECORD.                                           #
  
F:                                     # JOURNAL LOG CHARACTERISTIC.   #
        INSERT(INSERTITEMC);
        INSERTITEMC = " ";
        TEST;                          # CONTINUE SCANNING MESSAGE TEXT#
  
# INSERTION TYPE: G. INSERT THE LFN FROM THE FIT INTO THE MESSAGE      #
# BUFFER.                                                              #
  
G:                                     # FIT LFN.                      #
        INSERT(C<0,7>FITLFN[0]);
        TEST;                          # CONTINUE SCANNING MESSAGE TEXT#
  
        END                            # END FORMATTING LOOP.          #
  
# RETURN TO THE CALLER.                                                #
  
      RETURN; 
  
      END 
      TERM
