' 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