*DECK FFSULEN 
USETEXT TEXTFFS                      # FS  SYSTEM DEFINITIONS         # 
FUNC FFSULEN (STRING, (CHAR$SET))  U; 
*CALL COPYRITE
# TITLE FFSULEN - STRING LENGTH.                                      # 
  
      BEGIN  # FFSULEN #
  
# 
**    FFSULEN - STRING LENGTH.
* 
*     'FFSULEN' FINDS THE NUMBER OF CHARACTERS IN A STRING. 
* 
*     FUNC FFSULEN (STRING, CHAR$SET)  U
* 
*     ENTRY (STRING)   = ARRAY CONTAINING THE STRING TERMINATED BY A
*                        ZERO-BYTE. 
*           (CHAR$SET) = CHARACTER SET: STR$DIS FOR DISPLAY CODE, 
*                                       STR$612 FOR 6/12 ASCII. 
* 
*     EXIT  (FFSULEN)  = NUMBER OF CHARACTERS IN THE STRING, NOT
*                        COUNTING THE ZERO-BYTE TERMINATOR. 
* 
*     DESCRIPTION.
* 
*     SET COUNT TO 0. 
*     SET POSITION TO 0.
*     LOOP WHILE WORD DOES NOT HAVE A ZERO-BYTE TERMINATOR
*     DO
*       IF THE CURRENT CHARACTER IS A 6/12 ASCII SPECIAL CHARACTER
*       THEN
*         INCREMENT POSITION BY 2.
*       ELSE
*         INCREMENT POSITION BY 1.
*       INCREMENT COUNT BY 1. 
*       CALL FFSULWC TO LOCATE WORD AND CHARACTER POSITIONS FOR STRING. 
*     END LOOP
* 
*     LOOP FOR POS = POSITION 
*       WHILE THE CURRENT CHARACTER IS NOT THE BEGINNING OF A ZERO-BYTE 
*             TERMINATOR
*       DO
*         IF THE CURRENT CHARACTER IS A 6/12 ASCII SPECIAL CHARACTER
*         THEN
*           INCREMENT POS BY 2. 
*         ELSE
*           INCREMENT POS BY 1. 
*         INCREMENT COUNT BY 1. 
*         CALL FFSULWC TO LOCATE WORD AND CHARACTER POSITIONS FOR 
*           STRING. 
*     END LOOP
* 
*     SET FFSULEN TO COUNT. 
* 
*     RETURN. 
# 
  
      ARRAY  STRING  [0:0]  S(1);   # ARRAY CONTAINING THE STRING     # 
        BEGIN                       # TERMINATED BY A ZERO-BYTE.      # 
        ITEM  STR     C(00,00,10);
        END 
  
      ITEM   CHAR$SET U;            # 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   COUNT       I;  # RUNNING COUNT OF NUMBER OF CHARACTERS
                               IN THE STRING                          # 
      ITEM   LOOP        I;  # LOOP INDEX                             # 
      ITEM   POS         I;  # CURRENT CHARACTER POSITION IN THE
                               STRING                                 # 
      ITEM   POSITION    I;  # CURRENT CHARACTER POSITION IN THE
                               STRING                                 # 
      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             # 
  
      ARRAY ZEROFILL [0:0] S(1);
        BEGIN 
        ITEM ZERO$1     U(00,00,60) = [0];
        ITEM ZEROWORD   C(00,00,10);
        END 
  
                                                         CONTROL EJECT; 
# 
*     SET COUNT TO 0. 
# 
  
      COUNT = 0;
  
# 
*     SET POSITION TO 0.
*     LOOP WHILE WORD DOES NOT HAVE A ZERO-BYTE TERMINATOR
*     DO
# 
  
      POSITION = 0; 
      FFSULWC (POSITION, WORD, WDCHAR, REMAIN); 
      CONTROL SLOWLOOP; 
      FOR LOOP=LOOP 
        WHILE NOT ((C<8, 2> STR [WORD] EQ             # 8,9 THIS WORD # 
                      C<8, 2> ZEROWORD)                       OR
                   ((C<9, 1> STR [WORD] EQ            #  9  THIS WORD # 
                       C<9, 1> ZEROWORD)                      AND 
                    (C<0, 10> STR [WORD+1] EQ         # 0-9 NEXT WORD # 
                       C<0, 10> ZEROWORD))) 
      DO
        BEGIN 
  
# 
*       IF THE CURRENT CHARACTER IS A 6/12 ASCII SPECIAL CHARACTER
*       THEN
*         INCREMENT POSITION BY 2.
*       ELSE
*         INCREMENT POSITION BY 1.
# 
  
        IF FFSUISC (STRING, WORD, WDCHAR, CHAR$SET) 
        THEN
          BEGIN 
          POSITION = POSITION + 2;
          END 
        ELSE
          BEGIN 
          POSITION = POSITION + 1;
          END 
  
# 
*       INCREMENT COUNT BY 1. 
# 
  
        COUNT = COUNT + 1;
  
# 
*       CALL FFSULWC TO LOCATE WORD AND CHARACTER POSITIONS FOR STRING. 
# 
  
        FFSULWC (POSITION, WORD, WDCHAR, REMAIN); 
  
        END  # LOOP # 
  
# 
*     LOOP FOR POS = POSITION 
*       WHILE THE CURRENT CHARACTER IS NOT THE BEGINNING OF A ZERO-BYTE 
*             TERMINATOR
*     DO
# 
  
      CONTROL SLOWLOOP; 
      FOR POS = POSITION
        WHILE NOT (((WDCHAR LS 9) AND                 # 8,9 THIS WORD # 
                    (C<WDCHAR, REMAIN> STR [WORD] EQ
                       C<WDCHAR, REMAIN> ZEROWORD))           OR
  
                   (C<WDCHAR, REMAIN> STR [WORD] EQ   #  9 THIS WORD  # 
                      C<WDCHAR, REMAIN> ZEROWORD)             AND 
                    (C<0, 10> STR [WORD+1] EQ         # 0-9 NEXT WORD # 
                       C<0, 10> ZEROWORD))
      DO
        BEGIN 
  
# 
*       IF THE CURRENT CHARACTER IS A 6/12 ASCII SPECIAL CHARACTER
*       THEN
*         INCREMENT POS BY 2. 
*       ELSE
*         INCREMENT POS BY 1. 
# 
  
        IF FFSUISC (STRING, WORD, WDCHAR, CHAR$SET) 
        THEN
          BEGIN 
          POS = POS + 2;
          END 
        ELSE
          BEGIN 
          POS = POS + 1;
          END 
  
# 
*       INCREMENT COUNT BY 1. 
# 
  
        COUNT = COUNT + 1;
  
# 
*       CALL FFSULWC TO LOCATE WORD AND CHARACTER POSITIONS FOR STRING. 
# 
  
        FFSULWC (POS, WORD, WDCHAR, REMAIN);
  
        END  # LOOP # 
  
# 
*     SET FFSULEN TO COUNT. 
# 
  
      FFSULEN = COUNT;
  
# 
*     RETURN. 
# 
  
      RETURN; 
  
      END  # FFSULEN #
  
      TERM
