Metropoli BBS
VIEWER: banked.pps MODE: TEXT (CP437)
'  BANKED.PPS - Bank Free Configuration File Editor
'               Written by Dan Shore
'               October 14, 1996
'
' Purpose:  A program to add or edit entries in Bank Free
'           Configuration Files.  This program is not required
'           as programs like QEdit/TSE can also be used to
'           edit the configuration files.  But this program
'           makes it easy to see each configuration entry for
'           a specific security level.
'
' Note:     Full source code comes with this PPE.  Any of the code can
' B W       be used by others.  If you USE any of this source code you
'           need to mention either the program name, or the authors
'           name as the originator of the code within YOUR documentation.
'
'                    Give credit where credit is due!!!!
'
'───────────────────────────────────────────────────────────────────────────
STRING hold                    ' Generic STRING variable
STRING hold2                   ' Generic STRING variable

STRING cfg_line_number         ' Line number of entry in CFG file
STRING cfg_line_number_hold    ' Hold the last entry we processed
STRING current_cfg_line        ' Current .CFG entry being processed

STRING cfg_filename            ' .CFG filename
string chg_filename            ' CHG? Filename

STRING main_prompt             ' Generic prompt for user input
STRING user_input              ' Generic user input
STRING user_input2             ' Generic user input

STRING user_sec                ' Security Level
STRING max_bank_time           ' Max Bank Time Balance
STRING max_bank_byte           ' Max Bank Byte Balance
STRING max_time_wd             ' Max Time W/D Per Day
STRING max_byte_wd             ' Max Byte W/D Per Day
STRING time_ex_rate            ' Time Exchange Rate
STRING byte_ex_rate            ' Byte Exchange Rate
STRING ex_bank                 ' Allow Exchange Bank Balances
STRING ex_online               ' Allow Exchange Online Balances
STRING cfg_entry_lines         ' Lines from .CFG/.CHG file that have entries

STRING range_size              ' Size allowed for changing a value
STRING range_values            ' Input values allowed during change
STRING bank_txt                ' Text file for all user prompts

INT line_count                 ' Counter when reading .CHG file
INT x                          ' For Loop
INT changes_made               ' Number of changes made to file
INT item_number

BOOLEAN value_change           ' Did a change get made to a value
BOOLEAN adding                 ' Flag when ADDING a user
BOOLEAN duplicate              ' Flag for duplicate security level when adding
BOOLEAN ask_for_update         ' Flag to update new entry to CHG file
BOOLEAN new_file               ' Flag for New .CFG file created
'─────────────────────────────────────────────────────────────────────────────
'
'  Declare our procedures
'
DECLARE PROCEDURE CHANGE_ITEM (INT item_number)
DECLARE PROCEDURE WAIT_FOR_KEY ()
DECLARE PROCEDURE CHECK_DUPLICATE (VAR BOOLEAN duplicate )
DECLARE PROCEDURE ADD_COMMAS (STRING before_str, VAR STRING hold2)
DECLARE PROCEDURE CHANGE_CFG_LINE(VAR INT changes_made, VAR INT line_count)

*$USEFUNCS

BEGIN

   CLS
   '
   '  Define external text file - Support Language Files
   '
   bank_txt = PPEPATH() + "BANKTXT2" + LANGEXT()
   '
   '  Clean up old file
   '
   chg_filename = PPEPATH() + "CHG" + STRING(PCBNODE())
   IF (EXIST(chg_filename)) DELETE chg_filename
   '
   '  Display opening screen
   '
   NEWLINES 2
   PRINTLN "@X0B@X0FBank Free Configuration File Editor @X0E- @X0AVersion 1.00"
   NEWLINES 2
   main_prompt = READLINE(bank_txt, 101)
   INPUTSTR main_prompt, user_input, @X07, 2, "0123456789", LFAFTER+UPCASE+GUIDE+FIELDLEN
   user_input = TRIM(user_input," ")
   '
   '  Process .CFG file chosen to edit
   '
   GOSUB OPEN_CFG
   '
   '  Show each entry prompt
   '
   GOSUB SHOW_DISPLAY
   '
   '  Tokenize the entry from cfg we are processing
   '
   TOKENIZE current_cfg_line
   '
   '  Show values of each entry
   '
   GOSUB PARSE_ENTRY
   '
   '  Get input for action to perform on current entry
   '
   GOSUB CHOOSE_ENTRY
   '
   '  Get 'outa here!!
   '
   GOTO EXIT_PROG
END

'───────────────────────────────────
'   Start of Subroutines/Procedures
'───────────────────────────────────

'
'  Process next action
'
:CHOOSE_ENTRY

   '
   '  Prompt for action
   '
   ANSIPOS 3,13
   CLREOL
   user_input = ""
   main_prompt = READLINE(bank_txt, 102)
   INPUTSTR main_prompt, user_input, @X07, 1, "123456789ADNS", LFAFTER+UPCASE+GUIDE+FIELDLEN
   '
   '  Process selection
   '
   SELECT CASE user_input
      '
      '  Exit program
      '
      CASE ""
        '
        '  If we are in Add Mode, prompt for adding current
        '  display to the configuration file as a change
        '
        IF (adding) GOSUB ASK_UPDATE_CHG
        '
        '  Time to leave :)
        '
        GOTO EXIT_PROG
        '
      '
      '  Security Level
      '
      CASE "1"
        duplicate = FALSE
        range_size = 3
        range_values = MASK_NUM()
        main_prompt = READLINE(bank_txt, 103)
        GOSUB CHANGE_UPDATE_VALUE
        '
      '
      '  Max Bank Time
      '
      CASE "2"
        range_size = 4
        range_values = MASK_NUM()
        main_prompt = READLINE(bank_txt, 104)
        GOSUB CHANGE_UPDATE_VALUE
        '
      '
      '  Max Bank Bytes
      '
      CASE "3"
        range_size = 9
        range_values = MASK_NUM()
        main_prompt = READLINE(bank_txt, 105)
        GOSUB CHANGE_UPDATE_VALUE
        '
      '
      '  Max Time W/D Per Day
      '
      CASE "4"
        range_size = 3
        range_values = MASK_NUM()
        main_prompt = READLINE(bank_txt, 106)
        GOSUB CHANGE_UPDATE_VALUE
        '
      '
      '  Max Byte W/D Per Day
      '
      CASE "5"
        range_size = 9
        range_values = MASK_NUM()
        main_prompt = READLINE(bank_txt, 107)
        GOSUB CHANGE_UPDATE_VALUE
        '
      '
      '  Time Exchange Rate
      '
      CASE "6"
        range_size = 6
        range_values = MASK_NUM()
        main_prompt = READLINE(bank_txt, 108)
        GOSUB CHANGE_UPDATE_VALUE
        '
      '
      '  Byte Exchange Rate
      '
      CASE "7"
        range_size = 6
        range_values = MASK_NUM()
        main_prompt = READLINE(bank_txt, 109)
        GOSUB CHANGE_UPDATE_VALUE
        '
      '
      '  Allow exchange of Bank Balances
      '
      CASE "8"
        range_size = 1
        range_values = "YN"
        main_prompt = READLINE(bank_txt, 110)
        GOSUB CHANGE_UPDATE_VALUE
        '
      '
      '  Allow exchange of On-Line Balances
      '
      CASE "9"
        range_size = 1
        range_values = "YN"
        main_prompt = READLINE(bank_txt, 111)
        GOSUB CHANGE_UPDATE_VALUE
      '
      '  Add a new entry
      '
      CASE "A"
         '
         '  Set variables
         '
         IF (adding) GOSUB ASK_UPDATE_CHG
         adding = TRUE
         GOSUB SET_DEFAULTS
         TOKENIZE current_cfg_line
         GOSUB PARSE_ENTRY
      '
      '  Delete Current Entry
      '
      CASE "D"
        ANSIPOS 3, 14
        user_input2 = YESCHAR()
        main_prompt = READLINE(bank_txt, 112)
        INPUTYN main_prompt, user_input2, @X07
        IF (user_input2 = YESCHAR()) THEN
          GOSUB GET_VALUE_CHANGE
          IF (!duplicate && value_change) THEN
            CHANGE_ITEM (1)
            IF (!adding) CHANGE_CFG_LINE(changes_made, line_count)
            TOKENIZE current_cfg_line
            GOSUB PARSE_ENTRY
          END IF
        ELSE
          ANSIPOS 3, 14
          PRINT READLINE(bank_txt, 113)
          DELAY 18
        END IF
        ANSIPOS 3, 14
        CLREOL
        '
      '
      '  Display next entry
      '
      CASE "N"
        '
        '  If we are in Add Mode, prompt for adding current
        '  to the configuration file as a change
        '
        IF (adding) GOSUB ASK_UPDATE_CHG
        adding = FALSE

        '
        '  Find next entry in cfg_entry_lines
        '
        TOKENIZE cfg_entry_lines
        WHILE (1) DO
          cfg_line_number = GETTOKEN()
          IF (cfg_line_number = cfg_line_number_hold) THEN
            cfg_line_number = GETTOKEN()
            cfg_line_number_hold = cfg_line_number
            BREAK
          END IF
        END WHILE
        '
        ' If next entry is BLANK, we have reached end of .CFG entries
        ' It is Time to start over from beginning.
        '
        IF (cfg_line_number = "") THEN
          TOKENIZE cfg_entry_lines
          ANSIPOS 3,15
          PRINT READLINE(bank_txt, 114)
          DELAY 18
          ANSIPOS 3,15
          CLREOL
          cfg_line_number = GETTOKEN()
          cfg_line_number_hold = cfg_line_number
        END IF
        '
        '  Display values for next entry
        '
        current_cfg_line = READLINE(chg_filename, TOINT(cfg_line_number))
        TOKENIZE current_cfg_line
        GOSUB PARSE_ENTRY
      '
      ' Search for security level
      '
      CASE "S"
        '
        '  If we are in Add Mode, prompt for adding current
        '  to the configuration file as a change
        '
        IF (adding) GOSUB ASK_UPDATE_CHG
        adding = FALSE
        '
        '  Prompt for security level to find
        '
        ANSIPOS 3,14
        CLREOL
        user_input = ""
        main_prompt = READLINE(bank_txt, 115)
        INPUTSTR main_prompt, user_input, @X07, 3, "0123456789", LFAFTER+UPCASE+GUIDE+FIELDLEN
        user_input = TRIM(user_input," ")
        IF (user_input = "") THEN
          ANSIPOS 3,14
          CLREOL
          GOTO CHOOSE_ENTRY
        END IF
        '
        '  Read entries from cfg_entry_lines
        '
        TOKENIZE cfg_entry_lines
        WHILE (1) DO
          cfg_line_number = GETTOKEN()
          IF (cfg_line_number = "") THEN
            ANSIPOS 9,16
            CLREOL
            PRINT READLINE(bank_txt, 116), user_input, READLINE(bank_txt, 117)
            WAIT_FOR_KEY()
            ANSIPOS 1,14
            CLREOL
            ANSIPOS 9,16
            CLREOL
            BREAK
          END IF
          '
          ' Read line from .CFG file
          '
          current_cfg_line = READLINE(chg_filename, TOINT(cfg_line_number))
          user_sec = MID(current_cfg_line, 1, INSTR(current_cfg_line, ";")-1)
          '
          '  See if security level matches search entry
          '
          IF (user_sec = user_input) THEN
            current_cfg_line = READLINE(chg_filename, TOINT(cfg_line_number))
            cfg_line_number_hold = cfg_line_number
            TOKENIZE current_cfg_line
            GOSUB PARSE_ENTRY
            ANSIPOS 3,14
            CLREOL
            BREAK
          END IF
        END WHILE
    END SELECT

    GOTO CHOOSE_ENTRY
    RETURN

'
'   Prompt for Value Change, update file entry, update display
'
:CHANGE_UPDATE_VALUE
    '
    '  Get new value
    '
    duplicate = FALSE
    GOSUB GET_VALUE_CHANGE
    IF (user_input2 = user_input) CHECK_DUPLICATE (duplicate)
    IF (!duplicate && value_change) THEN
      '
      '  Makes item change in "current_cfg_line"
      '
      CHANGE_ITEM (TOINT(user_input))
      '
      '  Makes change to CHG file
      '
      IF (!adding) CHANGE_CFG_LINE(changes_made, line_count)
      '
      '  Tokenize NEW current_cfg_line and update display
      '
      TOKENIZE current_cfg_line
      GOSUB PARSE_ENTRY
      '
    END IF
    RETURN

'
'  See if current "new" entry should be added to CHG file
'
:ASK_UPDATE_CHG

     ANSIPOS 3,14
     user_input2 = YESCHAR()
     main_prompt = READLINE(bank_txt, 118)
     INPUTYN main_prompt, user_input2, @X07
     IF (user_input2 = YESCHAR()) THEN
       FAPPEND 2, chg_filename, O_RW, S_DW
       FPUTLN 2, current_cfg_line
       FCLOSE 2
       INC changes_made
       cfg_entry_lines = cfg_entry_lines + STRING(line_count) + ";"
       cfg_line_number_hold = line_count
     ELSE
       DEC line_count
       DEC changes_made
     END IF
     ANSIPOS 3,14
     CLREOL
     RETURN

'
'  Check edited Security Level for duplication
'
PROCEDURE CHECK_DUPLICATE (VAR BOOLEAN duplicate)

   STRING remain, temp
   INT start, end

   TOKENIZE cfg_entry_lines
   WHILE (1) DO
      hold = GETTOKEN()
      IF (hold = "") BREAK
      temp = READLINE(chg_filename, TOINT(hold))
      temp = MID(temp, 1, INSTR(temp, ";")-1)
      IF (temp = user_input2) THEN
        duplicate = TRUE
        ANSIPOS 3, 15
        PRINT READLINE(bank_txt, 119)
        WAIT_FOR_KEY()
        ANSIPOS 3, 15
        CLREOL
        BREAK
      END IF
   END WHILE

END PROC

'
'  Get new value for item selected - Enter means no change
'
:GET_VALUE_CHANGE

   IF (user_input != "D") THEN
     TOKENIZE current_cfg_line
     FOR x = 1 to 9
       hold = GETTOKEN()
       IF (x = TOINT(user_input)) THEN
         ANSIPOS 3,15
         PRINTLN READLINE(bank_txt, 120), hold
         BREAK
       END IF
     NEXT

     value_change = FALSE
     user_input2 = ""
     ANSIPOS 3,16
     INPUTSTR main_prompt, user_input2, @X0A, range_size, range_values, LFAFTER+UPCASE+GUIDE+FIELDLEN+ERASELINE
     user_input2 = TRIM(user_input2," ")
   ELSE
     user_input2 = "*DELETED*"
   END IF
   IF (user_input2 != "") value_change = TRUE

   ANSIPOS 3,15
   CLREOL
   RETURN

'
'  Change value of item
'
PROCEDURE CHANGE_ITEM (INT item_number)

   TOKENIZE current_cfg_line
   hold = ""
   FOR x = 1 to 9
     IF (x != item_number) THEN
       hold = hold + GETTOKEN()
       IF (x != 9) hold = hold + ";"
     ELSE
       hold = hold + user_input2
       IF (x != 9) hold = hold + ";"
       main_prompt = GETTOKEN()
     END IF
   NEXT
   current_cfg_line = hold

END PROC

'
'  Make change to line in CHG? file (changed file)
'
PROCEDURE CHANGE_CFG_LINE(VAR INT changes_made, VAR INT line_count)

   STRING hold2, hold3

   hold2 = chg_filename
   hold3 = PPEPATH() + "TMP" + STRING(PCBNODE())
   FOPEN 2, hold2, O_RW, S_DW
   FOPEN 3, hold3, O_WR, S_DW
   line_count = 1
   WHILE (1) DO
     IF (cfg_line_number = line_count) THEN
       FPUTLN 3, current_cfg_line
       FGET 2, hold
     END IF
     FGET 2, hold
     IF (FERR(2)) BREAK
     INC line_count
     FPUTLN 3, hold
   END WHILE

   FCLOSE 2
   FCLOSE 3
   hold = READLINE(cfg_filename,1)
   DELETE hold2
   RENAME hold3, hold2
   hold = READLINE(chg_filename,1)
   INC changes_made

END PROC

'
'  Retrieve values from .cfg file entry
:PARSE_ENTRY

   user_sec = GETTOKEN()
   max_bank_time = GETTOKEN()
   max_bank_byte = GETTOKEN()
   max_time_wd = GETTOKEN()
   max_byte_wd = GETTOKEN()
   time_ex_rate = GETTOKEN()
   byte_ex_rate = GETTOKEN()
   ex_bank = GETTOKEN()
   ex_online = GETTOKEN()
   ANSIPOS 40,3
   PRINT "@X03", user_sec
   CLREOL
   ANSIPOS 40,4
   ADD_COMMAS (max_bank_time, hold2)
   PRINT "@X03", hold2
   CLREOL
   ANSIPOS 40,5
   ADD_COMMAS (max_bank_byte, hold2)
   PRINT "@X03", hold2
   CLREOL
   ANSIPOS 40,6
   ADD_COMMAS (max_time_wd, hold2)
   PRINT "@X03", hold2
   CLREOL
   ANSIPOS 40,7
   ADD_COMMAS (max_byte_wd, hold2)
   PRINT "@X03", hold2
   CLREOL
   ANSIPOS 40,8
   ADD_COMMAS (time_ex_rate, hold2)
   PRINT "@X03", hold2
   IF (hold2 != "0") THEN
     ANSIPOS 50, 8
     PRINT READLINE(bank_txt, 121)
   END IF
   CLREOL
   ANSIPOS 40,9
   ADD_COMMAS (byte_ex_rate, hold2)
   PRINT "@X03", hold2
   IF (hold2 != "0") THEN
     ANSIPOS 50, 9
     PRINT READLINE(bank_txt, 122)
   END IF
   CLREOL
   ANSIPOS 40,10
   PRINT "@X03", ex_bank
   CLREOL
   ANSIPOS 40,11
   PRINT "@X03", ex_online
   CLREOL
   RETURN


'
'  Show explaination of each value
'
:SHOW_DISPLAY

   CLS
   ANSIPOS 3, 1
   PRINTLN "@X0B@X0FBank Free Configuration File Editor @X0E- @X0AVersion 1.00"
   ANSIPOS 3,3
   PRINT READLINE(bank_txt, 123)
   ANSIPOS 3,4
   PRINT READLINE(bank_txt, 124)
   ANSIPOS 3,5
   PRINT READLINE(bank_txt, 125)
   ANSIPOS 3,6
   PRINT READLINE(bank_txt, 126)
   ANSIPOS 3,7
   PRINT READLINE(bank_txt, 127)
   ANSIPOS 3,8
   PRINT READLINE(bank_txt, 128)
   ANSIPOS 3,9
   PRINT READLINE(bank_txt, 129)
   ANSIPOS 3,10
   PRINT READLINE(bank_txt, 130)
   ANSIPOS 3,11
   PRINT READLINE(bank_txt, 131)
   RETURN

'
'  Common exit point for the program
'
:EXIT_PROG

   IF (changes_made > 0) THEN
      changes_made = 0
      IF (EXIST(chg_filename)) THEN
        user_input = YESCHAR()
        main_prompt = READLINE(bank_txt, 132)
        ANSIPOS 3,14
        INPUTYN main_prompt, user_input, @X07
        '
        '  Update changes
        '
        IF (user_input = YESCHAR()) THEN
           '
           '  See if we have WRITE access to .CFG file
           '  Check for 5 Seconds to try to write to .CFG
           '
           FOR x = 1 to 5
             '
             '  Make sure no other program is reading .CFG at the moment
             '
             FOPEN 1, cfg_filename, O_RW, S_DN
             IF (!FERR(1)) THEN
               FCLOSE 1
               '
               '  Use readline to close cfg_filename
               '  readline command.  Unless there is a
               '  file handle to use I am unware of.
               '
               hold = READLINE(chg_filename,1)
               '
               '  Delete old .CFG file, and write contents
               '  from CHG? file to new .CFG file.  Strip
               '  out any lines that have been flagged as
               '  *DELETED* for their security level.
               '
               DELETE cfg_filename
               FOPEN 2, cfg_filename, O_WR, S_DW
               FOPEN 3, chg_filename, O_RD, S_DN
               '
               '  Copy CHG (changes) file over .CFG file
               '
               WHILE (1) DO
                 FGET 3, hold
                 IF (FERR(3)) BREAK
                 IF (LEFT(hold, 9) != "*DELETED*") FPUTLN 2, hold
               END WHILE
               FCLOSE 2
               FCLOSE 3
               '
               '  Make changes incremented, and clear the prompt
               '
               INC changes_made
               ANSIPOS 3,15
               CLREOL
               BREAK
             ELSE
               ANSIPOS 3,15
               PRINT cfg_filename, READLINE(bank_txt, 133)
               DELAY 18
             END IF
           NEXT
           IF (!changes_made) THEN
             ANSIPOS 3,15
             PRINT READLINE(bank_txt, 134), + STRING(PCBNODE()), READLINE(bank_txt, 135)
             WAIT_FOR_KEY()
             ANSIPOS 3,15
             CLREOL
           ELSE
             ANSIPOS 3,15
             PRINT READLINE(bank_txt, 136)
             '
             '  Readline from .CFG file so CHG file is closed
             '  and then we can delete the file
             '
             hold = READLINE(cfg_filename,1)
             DELETE chg_filename
             WAIT_FOR_KEY()
             ANSIPOS 3,15
             CLREOL
           END IF
        END IF
      END IF
   ELSE
      IF (EXIST(chg_filename)) DELETE chg_filename
   END IF

   IF (FILEINF(cfg_filename,4) = 0) DELETE cfg_filename
   NEWLINE
   PRINTLN READLINE(bank_txt, 137)
   DELAY 9
   END

'
'  Read chosen .CFG file
'
:OPEN_CFG
   '
   ' Check for node specific configuration file.  If not exist,
   ' use generic BANK.CFG configuration file.
   '
   cfg_filename = PPEPATH() + "bank" + user_input + ".cfg"

   IF (!EXIST(cfg_filename)) THEN
     NEWLINE
     ANSIPOS 1,8
     PRINT "@X0CBANK", user_input, READLINE(bank_txt, 138)
     DELAY 18
     adding = TRUE
     new_file = TRUE
     GOSUB SET_DEFAULTS
     ANSIPOS 1,8
     CLREOL
     '
     '  Create a .CFG file (0 bytes)
     '
     FOPEN 1, cfg_filename, O_WR, S_DN
     FCLOSE 1
   ELSE
     '
     '  Open .CFG file and load up entry lines
     '
     FOPEN 1, cfg_filename, O_RD, S_DN
     FOPEN 2, chg_filename, O_WR, S_DW
     '
     '  Determine each line where a .CFG entry in located in file
     '  Build STRING cfg_entry_lines with each line number
     '
     WHILE (1) DO
       FGET 1, current_cfg_line
       IF (FERR(1)) BREAK
       INC line_count
       FPUTLN 2, current_cfg_line
       IF (LEFT(current_cfg_line, 1) = "'" || LEFT(current_cfg_line, 1) = " ") CONTINUE
       cfg_entry_lines = cfg_entry_lines + STRING(line_count) + ";"
     END WHILE
     FCLOSE 1
     FCLOSE 2
   END IF
   '
   '  Read the first configuration entry
   '
   TOKENIZE cfg_entry_lines
   cfg_line_number = GETTOKEN()
   cfg_line_number_hold = cfg_line_number
   IF (!new_file) current_cfg_line = READLINE(chg_filename, TOINT(cfg_line_number))
   IF (new_file) new_file = FALSE
   RETURN

'
'  New Entry Defaults
'
:SET_DEFAULTS

   '
   '  Set Values
   '
   user_sec = "999"
   max_bank_time = "0"
   max_bank_byte = "0"
   max_time_wd = "0"
   max_byte_wd = "0"
   time_ex_rate = "0"
   byte_ex_rate = "0"
   ex_bank = "N"
   ex_online = "N"

   '
   '  Set Variables and write first entry to .CHG file
   '
   current_cfg_line = "999;0;0;0;0;0;0;N;N"
   IF (new_file) THEN
     FOPEN 7, chg_filename, O_WR, S_DN
     FPUTLN 7, READLINE(bank_txt, 139)
     FPUTLN 7, READLINE(bank_txt, 140)
     FPUTLN 7, READLINE(bank_txt, 141)
     FPUTLN 7, READLINE(bank_txt, 142)
     FPUTLN 7, READLINE(bank_txt, 143)
     FPUTLN 7, READLINE(bank_txt, 144)
     FPUTLN 7, READLINE(bank_txt, 145)
     FPUTLN 7, READLINE(bank_txt, 146)
     FPUTLN 7, READLINE(bank_txt, 147)
     FPUTLN 7, "'"
     FCLOSE 7
     line_count = 11
   '
   '  Adding an entry
   '
   ELSE
     INC line_count
     cfg_line_number_hold = cfg_line_number
     cfg_line_number = STRING(line_count)
   END IF
   RETURN

'
'  Wait for user to hit any key
'
PROCEDURE WAIT_FOR_KEY()

   STRING key

   WHILE (key = "") DO
     key = INKEY()
     DELAY 3
   END WHILE

ENDPROC

'
'  Add Commas to display of numeric information
'
PROCEDURE ADD_COMMAS (STRING before_str, VAR STRING hold2)

   STRING temp
   INT x

   temp = TRIM(STRING(before_str)," ")
   x = LEN(temp)
   '
   '  If the number is less than 4 characters in length, no need to add
   '  any commas to it.
   '
   IF (x < 4) THEN
     hold2 = temp
     RETURN
   END IF
   '
   '  Left pad the string with spaces (easy to add commas this way)
   '
   temp = SPACE(9-x) + temp

   IF (INSTR(temp,"-")) THEN
     '
     '  String has a negative symbol in it...Do not put a comma after it
     '
     IF (INSTR(MID(temp,1,3),"-")) THEN
       hold2 = MID(temp,1,3) + MID(temp,4,3) + "," + MID(temp,7,3)
     ELSE IF (INSTR(MID(temp,4,3),"-")) THEN
       hold2 = MID(temp,4,3) + MID(temp,7,3)
     END IF
   ELSE
     '
     '  Rebuild string with comma(s) in proper places
     '
     IF (MID(temp,1,3) != "   ") THEN
       hold2 = MID(temp,1,3) + "," + MID(temp,4,3) + "," + MID(temp,7,3)
     ELSE IF (MID(temp,4,3) != "   ") THEN
       hold2 = MID(temp,4,3) + "," + MID(temp,7,3)
     END IF
   END IF
   '
   '  Remove the left padded spaces we added above
   '
   hold2 = LTRIM(hold2," ")
   RETURN

ENDPROC
[ RETURN TO DIRECTORY ]