*DECK CONVLIT 
  PROC CONVLIT(SCBUF,INTERBUFF,LITBUF,ERRCODE); 
# ******************************************************************** #
# NUMERIC LITERAL VALUE IS CONVERTED TO FORMAT OF THE DATA ITEM.       #
#                                                                      #
# THE LITERAL MUST CONFORM TO THE DESCRIPTION IN SECTION 3.0 OF        #
# DDLC SCHEMA REPORT OF 1/15/74.                                       #
#                                                                      #
#   ON ENTRY                                                           #
# NUMERIC LITERAL IN ARRAY CWORD, LEFT JUSTIFIED.                      #
# LENGTH OF LITERAL IN CURLENW (WORDS) AND CURLENG (CHAR).             #
# DATA ITEM INFO IN FIELDS SCITEMSIZE (SIZE IN CHAR), SCITEMCLASS      #
# AND (FOR CLASS = 3,4) THE SIGN AND DECIMAL INFO FIELDS               #
# SCITEMSLOC,SCITEMSIGN,SCITEMSIGNFG,SCITEMPTLOC,SCITEMACTLPT,         #
# SCITEMPTLEFT.                                                        #
#   ON EXIT                                                            #
# CONVERTED LITERAL IN ARRAY NAMES, LEFT JUSTIFIED ZERO-FILL.          #
#                                                                      #
# PRESENT IMPLEMENTATION DOES NOT SUPPORT FLOATING POINT LITERALS      #
# (WITH -E- IMBEDDED) AND  DATA ITEM MUST BE CLASS 3,4,12,13, OR 14.   #
# DATA ITEM IS FURTHER RESTRICTED TO HAVE NO EXPLICIT SIGN CHARACTER,  #
# AND SIGN OVERPUNCH CHARACTER IS RESTRICTED TO RIGHTMOST DIGIT.       #
#                                                                      #
# ******************************************************************** #
  
    BEGIN 
      DEF BFWDS #10#;        # SIZE OF SCH BUFFER--ITEM ENTRY HEADER + #
                             # ITEM NAME LENGTH(3 WORDS).              #
  
      ITEM ERRCODE;          # ERROR CODE PASSED BACK BY DD$CCON.      #
                             # NON-ZERO EQUALS FATAL ERROR.            #
      ITEM FIRSTONE U;       #ORDINAL OF FIRST LITERAL CHAR TO CONVERT.#
      ITEM I;                          # SCRATCH ITEM.                 #
      ITEM IPTR;             # SCHEMA ITEM POINTER. POINTS TO THE      #
                             # TARGET ITEM IN THE SCHEMA BUFFER THAT   #
                             # THE LITERAL LITERAL IS TO BE CONVERTED  #
      ITEM LASTONE U;        #ORDINAL OF LAST LITERAL CHAR TO CONVERT. #
      ITEM NEXTCHAR C(1);    #CHARACTER FROM LITERAL. # 
      ITEM PREZERO B;        #TRUE UNTIL FIRST NON-ZERO DIGIT REACHED. #
      ITEM SACTLPT B;        #TRUE IF SOURCE ITEM ACTUAL DECIMAL POINT.#
      ITEM SCLASS  U = 4;    #SOURCE ITEM CLASS-CODE.#
      ITEM SRDECPT I;        #SOURCE DECIMAL POINT POSITION. #
      ITEM SSIGNF  B;        #TRUE IF SOURCE ITEM SIGNED. # 
      ITEM SSIZE   U;        #SOURCE ITEM SIZE (BITS). #
      ITEM TGDECPT I;        #TARGET DECIMAL POINT POSITION. #
      ITEM TSIGNF  B;        #TRUE IF TARGET ITEM SIGNED. # 
      ITEM TSIZE   U;        #TARGET ITEM SIZE (BITS). #
      ARRAY INTERBUFF[3] S(1);
        BEGIN 
        ITEM BUFF C(0,0,40);
        ITEM BUFFWD C(0,0,10);
        ITEM BUFFINT U(0,0,60); 
        END 
      ARRAY LITBUF [25] S(1);          # CONTAINS THE LITERAL AFTER    #
        ITEM LITWRD U(0,0,60);         # CONVERSION.                   #
      ARRAY SCBUF [BFWDS] S(1); 
        BEGIN 
*CALL SCIHDDCLS 
        END 
      XREF ITEM CURLENG;               # LENGTH IN CHARACTERS OF THE   #
                                       # CURRENT SOURCE WORD.          #
      XREF ITEM CURLENW;               # LENGTH IN WORDS OF THE CURRENT#
                                       # SOURCE WORD.                  #
      XREF ARRAY CWORD [25];           # CURRENT SYNTAX SOURCE WORD    #
                                       # KRACKED BY CTLSCAN.           #
        ITEM CURWORD U(0,0,60); 
      XREF PROC DD$CCON;               # DOES THE ACTUAL CONVERSION    #
                                       # OF THE LITERAL.               #
      ERRCODE = 0;           #INITIALIZE. # 
      IPTR = 0;  # INITIALIZE ITEM POINTER.                            #
      SSIGNF = FALSE;        #DEFAULT, NO SIGN ON LITERAL. #
      SACTLPT = FALSE;       #DEFAULT, NO ACTUAL DECIMAL IN LITERAL. #
      FIRSTONE = 0; 
      LASTONE = 0;
      SRDECPT = CURLENG;      #DEFAULT, DECIMAL POSITION AT RIGHT END. #
      PREZERO = TRUE; 
# MOVE INCOMING ARRAY CWORD INTO ARRAY INTERBUFF. # 
      FOR I = 0 STEP 1 UNTIL CURLENW - 1 DO 
        BUFFINT[I] = CURWORD[I];
# ZERO THE REST OF THE ARRAY. # 
      FOR I = CURLENW STEP 1 UNTIL 3 DO 
        BUFFINT[I] = 0; 
# SCAN LITERAL STRING, NOTEING SIGN OR DECIMAL PT, TRUNCATING LEADING 
    OR TRAILING ZEROES. # 
      FOR I = 0 STEP 1 UNTIL CURLENG - 1 DO 
        BEGIN 
        NEXTCHAR = C<I>BUFF[0];       #NEXT CHARACTER IN STRING. #
        IF NEXTCHAR EQ "-" THEN 
          BEGIN 
          SSIGNF = TRUE;      #REMEMBER NEGATIVE SIGN. #
          TEST;               #LOOP FOR NEXT CHARACTER. # 
          END 
        IF NEXTCHAR EQ "+" THEN 
          TEST;               #LOOP FOR NEXT CHARACTER. # 
        IF NEXTCHAR EQ "." THEN 
          BEGIN 
          SRDECPT = I;       #REMEMBER DECIMAL POSITION. #
          TEST;              #LOOP FOR NEXT CHARACTER. #
          END 
        IF NEXTCHAR NQ "0" THEN 
          BEGIN 
          LASTONE = I;       #KEEP TRACK OF LAST NON-ZERO DIGIT. #
          IF PREZERO THEN 
            BEGIN 
            FIRSTONE = I;    #POSITION OF FIRST NON-ZERO DIGIT. # 
            PREZERO = FALSE;
            END 
          END 
        END  #OF FOR LOOP. #
# SET SACTLPT TO INDICATE ACTUAL DECIMAL POINT. # 
      IF SRDECPT GQ FIRSTONE AND SRDECPT LS LASTONE THEN
        SACTLPT = TRUE; 
# ADJUST DECIMAL POINT TO REFLECT DISTANCE FROM LAST CHAR IN STRING.# 
      IF SRDECPT LQ LASTONE THEN
        SRDECPT = LASTONE - SRDECPT;
      ELSE
        SRDECPT = LASTONE - SRDECPT + 1;
      IF SSIGNF THEN        #MUST APPLY SIGN OVERPUNCH TO LAST DIGIT. # 
        BEGIN 
        I = C<LASTONE>BUFF[0];     #GET VALUE OF LAST CHAR IN STRING. # 
        IF I EQ O"33" THEN
          I = O"110";        #WANT DISPLAY 33 TO BECOME DISPLAY 66. # 
        C<LASTONE>BUFF[0] = I - O"22"; #DISPLAY CODE FOR SIGN OVERPUNCH#
        END 
# SET UP REMAINING PARAMETERS FOR CONVERSION ROUTINE. # 
      TSIZE = 6 * SCITEMSIZE[IPTR];   # TARGET ITEM SIZE IN BITS.      #
      SSIZE = 6 * (LASTONE + 1 - FIRSTONE); #SOURCE LITERAL SIZE, BITS.#
      FIRSTONE = 6 * FIRSTONE;         #BEGIN BIT POS, SOURCE LITERAL. #
      IF SCITEMPTLEFT[IPTR] THEN
        TGDECPT = SCITEMPTLOC[IPTR];  # PT TO LEFT,POSITION POSITIVE.  #
      ELSE
        TGDECPT = - SCITEMPTLOC[IPTR]; # PT TO RIGHT,POSITION NEGATIVE.#
      IF (SACTLPT AND SSIZE GR 114) OR (NOT SACTLPT AND SSIZE GR 108) 
        THEN BEGIN
        ERRCODE = O"660";    #LITERAL TOO LONG. # 
        RETURN; 
        END 
# ZERO OUT TARGET BUFFER #
      FOR I = 0 STEP 1 UNTIL 3  DO
        LITWRD[I] = 0;
# CALL FOR CONVERSION, STORING RESULT IN ARRAY CWORD. # 
      DD$CCON(ERRCODE,SCLASS,SCITEMCLASS[IPTR], 
        LOC(INTERBUFF),LOC(LITBUF),FIRSTONE,0,
        SSIZE,TSIZE,0,0,
        SRDECPT,TGDECPT,SACTLPT,SCITEMACTLPT[IPTR], 
        SSIGNF,SCITEMSIGNFG[IPTR]); 
      RETURN;                   #EXIT PROC CONVERTCKLIT#
    END          #OF PROC CONVERTCKLIT# 
  TERM; 
