*DECK FFSULAP 
USETEXT TEXTFFS                      # FS  SYSTEM DEFINITIONS         # 
FUNC FFSULAP (STRING, (POSITION), (CHAR$SET)) I;
*CALL COPYRITE
# TITLE FFSULAP - LOCATE ACTUAL POSITION.                             # 
  
      BEGIN  # FFSULAP #
  
# 
**    FFSULAP - LOCATE ACTUAL POSITION. 
* 
*     'FFSULAP' LOCATES THE ACTUAL POSITION IN A STRING, GIVEN THE
*     CHARACTER POSITION.  IT WILL ONLY BE DIFFERENT IF THE CHARACTER 
*     SET IS 6/12 ASCII AND IF THERE ARE ANY SPECIAL CHARACTERS PRIOR 
*     TO POSITION.
* 
*     FUNC FFSULAP (STRING, POSITION, CHAR$SET) I 
* 
*     ENTRY (STRING)   = ARRAY CONTAINING THE STRING. 
*           (POSITION) = CHARACTER POSITION OF THE STRING (STARTING 
*                        ZERO). 
*                        A CHARACTER WILL HAVE THE SAME POSITION IN A 
*                        STRING INDEPENDENT OF THE CHARACTER SET. 
*           (CHAR$SET) = CHARACTER SET: STR$DIS FOR DISPLAY CODE, 
*                                       STR$612 FOR 6/12 ASCII. 
* 
*     EXIT  (FFSULAP)  = ACTUAL CHARACTER POSITION OF THE STRING
*                        (STARTING FROM ZERO).
*                        A CHARACTER'S ACTUAL POSITION WILL BE
*                        DIFFERENT FOR THE TWO DIFFERENT CHARACTER SETS 
*                        IF IT HAS SPECIAL CHARACTERS IN FRONT OF IT, 
*                        SINCE THE SPECIAL CHARACTERS TAKE UP TWO 
*                        CHARACTER POSITIONS. 
* 
*     DESCRIPTION.
* 
*     IF CHARACTER SET IS DISPLAY CODE
*     THEN
*       SET FFSULAP TO POSITION.
*     ELSE
*       SET SPECIAL CHARACTER COUNT TO 0. 
*       SET ACTUAL POSITION TO 0. 
*       SET WORD TO 0.
*       SET WDCHAR TO 0.
*       SET REMAIN TO 10. 
*       LOOP FOR POS = 0 STEP 1 
*         WHILE POS < POSITION
*       DO
*         IF CHARACTER AT ACTUAL POSITION IS A 6/12 ASCII SPECIAL 
*           CHARACTER 
*         THEN
*           INCREMENT SPECIAL CHARACTER COUNT BY 1. 
*           INCREMENT ACTUAL POSITION BY 2. 
*         ELSE
*           INCREMENT ACTUAL POSITION BY 1. 
*         CALL FFSULWC TO LOCATE WORD AND CHARACTER POSITIONS FOR 
*           STRING BASED ON ACTUAL CHARACTER POSITION.
*       END LOOP
*       SET FFSULAP TO POSITION + SPECIAL CHARACTER COUNT.
*     RETURN. 
# 
  
      ARRAY  STRING  [0:0]  S(1);   # ARRAY CONTAINING THE STRING     # 
        BEGIN 
        ITEM  STR     C(00,00,10);
        END 
  
      ITEM   POSITION    I;         # CHARACTER POSITION OF THE STRING
                                     (STARTING FROM ZERO).
                                      A CHARACTER WILL HAVE THE SAME
                                      POSITION IN A STRING INDEPENDENT
                                      OF THE CHARACTER SET.           # 
  
      ITEM   CHAR$SET    I;         # CHARACTER SET:  
                                      STR$DIS FOR DISPLAY CODE, 
                                      STR$612 FOR 6/12 ASCII.         # 
  
      XREF
        BEGIN 
        FUNC FFSUISC B;      # IS SPECIAL CHARACTER                   # 
        PROC FFSULWC;        # LOCATE WORD AND CHARACTER POSITIONS    # 
        END 
  
      ITEM   ACTUAL$POS  I;  # CURRENT ACTUAL CHARACTER POSITION IN THE 
                               STRING                                 # 
      ITEM   POS         I;  # CURRENT CHARACTER POSITION IN THE
                               STRING                                 # 
      ITEM   SPEC$COUNT  I;  # RUNNING COUNT OF SPECIAL CHARACTERS    # 
      ITEM   REMAIN      I;  # NUMBER OF CHARACTERS REMAINING IN THE
                               STRING CURRENT WORD                    # 
      ITEM   WDCHAR      I;  # CURRENT CHARACTER POSITION IN THE STRING 
                               CURRENT WORD                           # 
      ITEM   WORD        I;  # CURRENT WORD OF THE STRING             # 
                                                         CONTROL EJECT; 
# 
*     IF CHARACTER SET IS DISPLAY CODE
*     THEN
*       SET FFSULAP TO POSITION.
# 
  
      IF CHAR$SET EQ STR$DIS
      THEN
        BEGIN 
        FFSULAP = POSITION; 
        END  # IF CHARACTER SET IS DISPLAY CODE # 
  
# 
*     ELSE
# 
  
      ELSE
        BEGIN 
  
# 
*       SET SPECIAL CHARACTER COUNT TO 0. 
*       SET ACTUAL POSITION TO 0. 
*       SET WORD TO 0.
*       SET WDCHAR TO 0.
*       SET REMAIN TO 10. 
# 
  
        SPEC$COUNT = 0; 
        ACTUAL$POS = 0; 
        WORD = 0; 
        WDCHAR = 0; 
        REMAIN = 10;
  
# 
*       LOOP FOR POS = 0 STEP 1 
*         WHILE POS < POSITION
*       DO
# 
  
        CONTROL SLOWLOOP; 
        FOR POS = 0 STEP 1
          WHILE POS LS POSITION 
        DO
          BEGIN 
  
# 
*         IF CHARACTER AT ACTUAL POSITION IS A 6/12 ASCII SPECIAL 
*           CHARACTER 
*         THEN
*           INCREMENT SPECIAL CHARACTER COUNT BY 1. 
*           INCREMENT ACTUAL POSITION BY 2. 
*         ELSE
*           INCREMENT ACTUAL POSITION BY 1. 
*         CALL FFSULWC TO LOCATE WORD AND CHARACTER POSITIONS FOR 
*           STRING BASED ON ACTUAL CHARACTER POSITION.
# 
  
          IF FFSUISC (STRING, WORD, WDCHAR, CHAR$SET) 
          THEN
            BEGIN 
            SPEC$COUNT = SPEC$COUNT + 1;
            ACTUAL$POS = ACTUAL$POS + 2;
            END  # IF # 
  
          ELSE
            BEGIN 
            ACTUAL$POS = ACTUAL$POS + 1;
            END  # ELSE # 
  
          FFSULWC (ACTUAL$POS, WORD, WDCHAR, REMAIN); 
  
          END  # LOOP # 
  
# 
*       SET FFSULAP TO POSITION + SPECIAL CHARACTER COUNT.
# 
  
        FFSULAP = POSITION + SPEC$COUNT;
  
  
        END  # IF CHARACTER SET IS DISPLAY CODE ELSE #
  
# 
*     RETURN. 
# 
  
      RETURN; 
  
      END  # FFSULAP #
  
      TERM
