home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / BBS / RBBS_PC / 173_BAS.ZIP / CNFG-SUB.BAS < prev    next >
Encoding:
BASIC Source File  |  1990-02-10  |  95.1 KB  |  2,247 lines

  1. ' $linesize:132
  2. ' $title: 'CNFG-SUB.BAS CPC17.3, Copyright 1987-90 by D. Thomas Mack'
  3. '  Copyright 1990 by D. Thomas Mack, all rights reserved.
  4. '  Name ...............: CNFG-SUB.BAS
  5. '  First Released .....: February 11, 1990
  6. '  Subsequent Releases.: 
  7. '  Copyright ..........: 1987-90
  8. '  Purpose.............: The Remote Bulletin Board System for the IBM PC,
  9. '                        RBBS-PC, configuration program -- CONFIG.BAS
  10. '                        utilizes a lot of menus and string space.
  11. '                        These are incorporated within CNFG-SUB.BAS as a
  12. '                        seperately callable subroutines in order to free
  13. '                        up as much code as possible within the 64K code
  14. '                        segment used by CONFIG.BAS.
  15. '  Parameters..........: Most parameters are passed via a COMMON statement.
  16. '
  17. ' Subroutine  Line      Function of Subroutine
  18. '    Name    Number
  19. ' ALLCAPS    61212+     Captialize a string
  20. ' ANSIDECODE 62040+     Convert ANSI strings into english text expressions
  21. ' ANYINTEGER 61450      Prompt for any integer
  22. ' ANYNUMBER  61400      Prompt for any number
  23. ' ASKRO      61100      Ask a question on a specific row
  24. ' ASKUPOS    61300      Ask for identifying field in USERS record
  25. ' BRKFNAME   61830      Break file name in drive/path, prefix, extension
  26. ' CHKFMSDIR  61700      Check FMS directory for valid structure
  27. ' CHKPERSDIR 61755      Check Personal directory format
  28. ' CNFGINIT   60385      Initialize CONFIG's constants
  29. ' COLORCODE  62040+     Convert response into ANSI-meaningful strings
  30. ' DISPLAY    12190      Display the CONFIG menu pages
  31. ' FINDFILE   61600      Determine whether a file exists
  32. ' FINDLAST   61850      Find last occurence of a character in a string
  33. ' GETANSI    62000      Prompt for ANSI colors to be used
  34. ' GETASCII   61810      Get any character by character or ascii value
  35. ' GETCOLOR   61950      Process request for setting color
  36. ' GETINIT    61110      Get answers that are integers
  37. ' GETNUMYN   61150      Get TRUE/FALSE answer to a YES/NO question
  38. ' GETYESNO   61200      Ask a question with a "yes" or "no" response
  39. ' HANDERR    61775+     Handle error checking for FMS directories
  40. ' MMINTEGER  61500      Prompt for integer with min and a max
  41. ' NETTYPE    60382      Prompt for supported network types
  42. ' REMOVE     61800      Remove characters from a string
  43. ' SECURE     61860      Allow commands and their security level to be changed
  44. ' SELMODEM   62100      Select modem to set modem strings
  45. ' TRIMTRAIL  61840      Remove trailing characters from a string
  46. '
  47. '  $INCLUDE: 'CNFG-VAR.BAS'
  48. '
  49. '  $SUBTITLE: 'DISPLAY - subroutine to display CONFIG's menus'
  50. '  $PAGE
  51. '
  52. '  SUBROUTINE NAME    --  DISPLAY
  53. '
  54. '  INPUT PARAMETERS   --  PARAMETER        DESCRIPTION
  55. '                         IX = 0           DISPLAY THE CHOICE OF MENUS
  56. '                         IX = -1          RE-READ THE INPUT (INVALID REQUEST)
  57. '                         IX > 0           DISPLAY THE APPROPRIATE PAGE
  58. '
  59. '  OUTPUT PARAMETERS  --  HJ$              OPTION SELECTED
  60. '                         IPAGE            MENU PAGE CONTAINING OPTION
  61. '                         ILOOKUP          INDEX (1 TO 20) OF OPTION SELECTED
  62. '
  63. '  SUBROUTINE PURPOSE --  TO DISPLAY CONFIG'S MENUS AND REQUEST OPTION
  64. '
  65.       SUB DISPLAY STATIC
  66. '
  67. ' *  DISPLAY CONFIG'S MAIN FUNCTION KEY MENU
  68. '
  69.       IF IX > 0 THEN _
  70.          GOTO 12320
  71.       IF IX = -1 THEN _
  72.          GOTO 12590
  73. 12190 COLOR FG,BG,BORDER
  74.       CLS
  75.       DISPLAYED.PAGE.NUMBER = 0
  76.       I! = FRE(C$)
  77.       COLOR 0,7,0
  78.       LOCATE 4,10
  79.       PRINT "RBBS-PC "+ CONFIG.VERSION$ + " CONFIGURATION PROGRAM "
  80.       COLOR FG,BG,BORDER
  81.       LOCATE 1,1,0
  82.       PRINT "Copyright (c) 1983-1990 Tom Mack"
  83.       LOCATE 2,1,0
  84.       PRINT "39 Cranbury Dr, Trumbull, CT. 06611";
  85.       IF CONFERENCE.MODE THEN _
  86.          GOSUB 24970
  87.       LOCATE  5,1
  88.       PRINT "   F1            Global RBBS-PC Parameters (part 1)
  89.       PRINT "   F2            Global RBBS-PC Parameters (part 2)
  90.       PRINT "   F3            Global RBBS-PC Parameters (part 3)
  91.       PRINT "   F4            RBBS-PC System Files (part 1)
  92.       PRINT "   F5            RBBS-PC System Files (part 2)
  93.       PRINT "   F6            Parameters for RBBS-PC's 'Doors'
  94.       PRINT "   F7            Parameters for RBBS-PC's Security (part 1)
  95.       PRINT "   F8            Parameters for RBBS-PC's Security (part 2)
  96.       PRINT "   F9            Parameters for multiple RBBS-PC's
  97.       PRINT "  F10            RBBS-PC utilities
  98.       PRINT "  Shift-F1       RBBS-PC File Management Faciliites"
  99.       PRINT "  Shift-F2       RBBS-PC Communications Parameters (part 1)
  100.       PRINT "  Shift-F3       RBBS-PC Communications Parameters (part 2)
  101.       PRINT "  Shift-F4       Parameters for RBBS-PC NET-MAIL
  102.       PRINT "  Shift-F5       New users parameters"
  103.       PRINT "  Shift-F6       Library Sub-System"
  104.       PRINT "  Shift-F7       RBBS-PC Color parameters"
  105.       PRINT "  Shift-F8       Reserved for future use"
  106.       XX$ = "Press END to terminate or Function Key to select page "
  107.       GOSUB 50345
  108.       LOCATE ,,1
  109. 12310 GOSUB 22160
  110. 12320 IF IX THEN _            'IX    Key    Where to branch to
  111.          ON IX GOTO 12360, _  ' 1       F1 - Global Parameters (Part 1)
  112.                     12370, _  ' 2       F2 - Global Parameters (Part 2)
  113.                     12380, _  ' 3       F3 - Global Parameters (Part 3)
  114.                     12390, _  ' 4       F4 - RBBS-PC System Files (Part 1)
  115.                     12400, _  ' 5       F5 - RBBS-PC System Files (Part 2)
  116.                     12410, _  ' 6       F6 - RBBS-PC "doors"
  117.                     12420, _  ' 7       F7 - RBBS-PC security parms. (Part 1)
  118.                     12466, _  ' 8       F8 - RBBS-PC security parms. (Part 2)
  119.                     12470, _  ' 9       F9 - Multiple RBBS-PC parameters
  120.                     12480, _  '10      F10 - RBBS-PC's utilities
  121.                     12490, _  '11 Shift-F1 - RBBS-PC File Manager
  122.                     12500, _  '12 Shift-F2 - RBBS-PC comm. parameters (Part 1)
  123.                     12505, _  '13 Shift-F3 - RBBS-PC comm. parameters (Part 2)
  124.                     12510, _  '14 Shift-F4 - RBBS-PC Net Mail
  125.                     12520, _  '15 Shift-F5 - New user parameters
  126.                     12530, _  '16 Shift-F6 - Library parameters
  127.                     12540, _  '17 Shift-F7 - RBBS-PC Color parameters
  128.                     12310, _  '18 Shift-F8 - Reserved for future use
  129.                     12340, _  '19     PgUp - Go to previous page
  130.                     12330, _  '20     PgDn - Go to next page
  131.                     12630, _  '21      End - Terminate CONFIG
  132.                     12350     '22    Enter - Re-display current page
  133.       GOTO 12310
  134. '
  135. ' *  COMMON ROUTINE TO HANDLE UNDEFINED OPTIONS
  136. '
  137. 12325 IX = IPAGE
  138.       GOTO 12320
  139. '
  140. ' *  COMMON ROUTINE TO HANDLE PAGE UP OF DISPLAYS
  141. '
  142. 12330 IF (DISPLAYED.PAGE.NUMBER + 1 ) > 17 THEN _
  143.          GOTO 12190
  144.       IX = DISPLAYED.PAGE.NUMBER + 1
  145.       GOTO 12320
  146. '
  147. ' *  COMMON ROUTINE TO HANDLE PAGE DOWN OF DISPLAYS
  148. '
  149. 12340 IF (DISPLAYED.PAGE.NUMBER - 1) < 1 THEN _
  150.          GOTO 12190
  151.       IX = DISPLAYED.PAGE.NUMBER - 1
  152.       GOTO 12320
  153. '
  154. ' *  RETURN TO PRIMARY MENU SELECTION DISPLAY
  155. '
  156. 12350 GOSUB 60380
  157.       GOTO 12310
  158. '
  159. ' *  COMMON CONFIGURATION PROGRAM MENU AND PAGE DISPLAY
  160. '
  161. 12360 DISPLAYED.PAGE.NUMBER = 1
  162.       GOSUB 24800
  163.       LOCATE  3,1
  164.       PRINT " 1. SYSOP's Public First Name -------------------- " + SYSOP.FIRST.NAME$
  165.       PRINT " 2. SYSOP's Public Last Name --------------------- " + SYSOP.LAST.NAME$
  166.       PRINT " 3. SYSOP's default expert mode at signon -------- " + EXPERT.USER$
  167.       PRINT " 4. SYSOP's office hours -------------------------"STR$(START.OFFICE.HOURS);" to"STR$(END.OFFICE.HOURS)
  168.       PRINT " 5. Page SYSOP using printer's bell -------------- " + M11$
  169.       PRINT " 6. Go off-line whenever a DISK FULL occurs ------ " ; FNYESNO$(DISKFULL.GO.OFFLINE)
  170.       PRINT " 7. Prompt bell default is ----------------------- " + PROMPT.BELL$
  171.       PRINT " 8. Maximum time per session (in minutes) --------"STR$(MINUTES.PER.SESSION!)
  172.       PRINT " 9. Maximum minutes per day ----------------------";STR$(MAX.PER.DAY)
  173.       PRINT "10. Factor to extend session time for uploads ----" + STR$(UPLOAD.TIME.FACTOR!)
  174.       PRINT "11. # Months of inactivity before user deleted ---"STR$(ACT.MNTHS.B4.DELETING)
  175.       PRINT "12. Name of RBBS-PC shown initially is ----------- " + RBBS.NAME$
  176.       PRINT "13. Foreground color (for color monitors) is -----"STR$(FG)
  177.       PRINT "14. Background color (for color monitors) is -----"STR$(BG)
  178.       PRINT "15. The border color (for color monitors) is -----"STR$(BORDER)
  179.       PRINT "16. Your CONFIG.SYS contains 'DEVICE=ANSI.SYS'---- " + FNYESNO$(DOSANSI)
  180.       IF SMART.TEXT THEN _
  181.          SMART.TEXT$ = STR$(SMART.TEXT) _
  182.       ELSE SMART.TEXT$ = "<none>"
  183.       PRINT "17. Control character for SMART TEXT -------------" + SMART.TEXT$
  184.       PRINT "18. File with automatic operator page parameters - " ; AUTOPAGE.DEF$
  185.       X = INSTR("ANS",LOGON.MAIL.LEVEL$)
  186.       IF X < 1 THEN _
  187.          X = 1
  188.       X$ = MID$("OLD & NEWNEW ONLY NONE",9*X-8,9)
  189.       IF X$ = "NONE" THEN _
  190.          X$ = NONE.PICKED$
  191.       PRINT "19. Personal mail notification level at logon is - " + X$
  192.       GOTO 12580
  193. 12370 DISPLAYED.PAGE.NUMBER = 2
  194.       GOSUB 24800
  195.       LOCATE  3,1
  196.       PRINT "21. Remind users of messages that they left ------ " + FNYESNO$(MESSAGE.REMINDER)
  197.       PRINT "22. Remind users of # uploads and downloads? ----- " + FNYESNO$(REMIND.FILE.TRANSFERS)
  198.       PRINT "23. Remind users of their terminal profile? ------ " + FNYESNO$(REMIND.PROFILE)
  199.       PRINT "24. Enable download of new files at logon -------- " + FNYESNO$(NEW.FILES.CHECK)
  200.       PRINT "25. Default user page length is ------------------" + STR$(PAGE.LENGTH)
  201.       PRINT "26. Maximum number of lines allowed per message --" + STR$(MAX.MESSAGE.LINES)
  202.       PRINT "27. Is system 'welcome' interruptable? ----------- " + FNYESNO$(WELCOME.INTERRUPTABLE)
  203.       PRINT "28. Are system bulletins to be 'optional'? ------- " + FNYESNO$(BULLETINS.OPTIONAL)
  204.       PRINT "29. Type of PC RBBS-PC will be running on? ------- " + COMPUTER.TYPE$
  205.       PRINT "30. Symbols to use for SYSOP commands ------------ " + SYSOP.COMMANDS$
  206.       PRINT "31. Symbols to use for MAIN menu commands -------- " + MAIN.COMMANDS$
  207.       PRINT "32. Symbols to use for FILE menu commands -------- " + FILE.COMMANDS$
  208.       PRINT "33. Symbols to use for UTILITIES menu commands --- " + UTIL.COMMANDS$
  209.       PRINT "34. Symbols to use for global commands ----------- " + GLOBAL.COMMANDS$
  210.       PRINT "35. Show section in command prompt --------------- " + FNYESNO$(SHOW.SECTION)
  211.       PRINT "36. Show commands in command prompt -------------- " + FNYESNO$(COMMANDS.IN.PROMPT)
  212.       PRINT "37. Restrict valid commands to current section --- " + FNYESNO$(RESTRICT.VALID.CMDS)
  213.       PRINT "38. Use machine language routines for speed ------ " + FNYESNO$(TURBO.RBBS)
  214.       PRINT "39. Use BASIC PRINT for screen writes ------------ " + FNYESNO$(USE.BASIC.WRITES)
  215.       PRINT "40. # of lines for extended file descriptions ----" + STR$(MAX.EXTENDED.LINES)
  216.       GOTO 12580
  217. 12380 DISPLAYED.PAGE.NUMBER = 3
  218.       GOSUB 24800
  219.       LOCATE  3,1
  220.       PRINT "41. Field used to identify users ----------------- " + HASH.ID$
  221.       PRINT "42. Field used to distinguish users with same ID-- " + INDIV.ID$
  222.       PRINT "43. Start position identifying personal downloads-"  + STR$(PERSONAL.BEGIN)
  223.       PRINT "44. Field length to identify personal downloads --"  + STR$(PERSONAL.LEN)
  224.       PRINT "45. Prompt for first part of personal identifier - " + FIRST.NAME.PROMPT$
  225.       PRINT "46. Prompt for last part of personal identifier -- " + LAST.NAME.PROMPT$
  226.       PRINT "47. Enforce upload/download ratios --------------- " + FNYESNO$(ENFORCE.UPLOAD.DOWNLOAD.RATIOS)
  227.       PRINT "48. RESTRICT users by SUBSCRIPTION date ---------- " + FNYESNO$(RESTRICT.BY.DATE)
  228.       PRINT "49. Security level when SUBSCRIPTION expires -----"  + STR$(EXPIRED.SECURITY)
  229.       PRINT "50. Days before expiration to warn callers -------"  + STR$(DAYS.TO.WARN)
  230.       PRINT "51. Default # days in SUBSCRIPTION PERIOD --------"  + STR$(DAYS.IN.SUBSCRIPTION.PERIOD)
  231.       PRINT "52. Turn printer off after each recycle ---------- " + FNYESNO$(TURN.PRINTER.OFF)
  232.       PRINT "53. Play musical themes for RBBS-PC functions----- " + FNYESNO$(MUSIC)
  233.       PRINT "54. BUFFER SIZE used when displaying text files --" + STR$(BUFFER.SIZE)
  234.       PRINT "55. Stack space to be made available -------------" + STR$(SIZE.OF.STACK)
  235.       PRINT "56. File shown users when SYSOP wants system next  " + NOT.YET.IN$ ' F7.MESSAGE$
  236.       PRINT "57. Ask users their (What is your ...) ----------- " + USER.LOCATION$
  237.       PRINT "58. Show ALL DIRECTORIES in order in dir of dir -- " + FNYESNO$(USE.DIR.ORDER)
  238.       PRINT "59. BUFFER SIZE for writes on internal protocols -" + STR$(WRITE.BUF.DEF)
  239.       PRINT "60. Voice Synthesizer support -------------------- " + VOICE.TYPE$
  240.       GOTO 12580
  241. 12390 DISPLAYED.PAGE.NUMBER = 4
  242.       GOSUB 24800
  243.       IF INSTR(DRIVE.FOR.BULLETINS$,":") < 1 THEN _
  244.          DRIVE.FOR.BULLETINS$ = DRIVE.FOR.BULLETINS$ + ":"
  245.       LOCATE  3,1
  246.       PRINT "61. Drive and file describing 'bulletins' is ----- " + DRIVE.FOR.BULLETINS$ + BULLETIN.MENU$
  247.       PRINT "62. Number of active 'bulletins' -----------------" + STR$(ACTIVE.BULLETINS)
  248.       PRINT "63. Prefix used to name bulletin files is -------- " + BULLETIN.PREFIX$
  249.       PRINT "64. Drive and path (optional) for 'help' files --- " + HELP.PATH$
  250.       PRINT "65. Prefix used to name three major 'help' files - " + HELP.FILE.PREFIX$
  251.       PRINT "66. Extension for help files of individual cmds -- " + HELP.EXTENSION$
  252.       PRINT "67. HELP file when callers CATEGORIZE uploads ---- " + UPCAT.HELP$
  253.       PRINT "68. Name of 'newuser' file shown to new users ---- " + NEWUSER.FILE$
  254.       PRINT "69. Name of 'welcome' file shown at logon -------- " + WELCOME.FILE$
  255.       PRINT "70. The SYSOP's command menu is named ------------ " + MENU$(1)
  256.       PRINT "71. The MAIN system menu is named ---------------- " + MENU$(2)
  257.       PRINT "72. The file subsystem menu is named ------------- " + MENU$(3)
  258.       PRINT "73. The utilities subsystem menu is named -------- " + MENU$(4)
  259.       PRINT "74. Menu that lists available conferences is ----- " + CONFERENCE.MENU$
  260.       PRINT "75. Menu that lists questionnaires available is -- " + ANS.MENU$
  261.       PRINT "76. Drive/path for optional questionnaires ------- " + QUES.PATH$
  262.       PRINT "77. File with main SYSOP-supplied user interface - " + MAIN.PUI$
  263.       PRINT "78. Allow menus to pause in the middle ----------- " + FNYESNO$(MENUS.CAN.PAUSE)
  264.       PRINT "79. Drive/path where macro files are stored ------ " + MACRO.DRVPATH$
  265.       IF MACRO.EXTENSION$ = "" THEN _
  266.          X$ = NONE.PICKED$ _
  267.       ELSE X$ = MACRO.EXTENSION$
  268.       PRINT "80. Extension of macro files --------------------- " ; X$
  269.       GOTO 12580
  270. 12400 DISPLAYED.PAGE.NUMBER = 5
  271.       GOSUB 24800
  272.       LOCATE  3,1
  273.       PRINT " 81. File containing invalid user names ----------- " + TRASHCAN.FILE$
  274.       PRINT " 82. Name questionnaire required of ALL callers --- " + REQUIRED.QUESTIONNAIRE$
  275.       PRINT " 83. Name of 'pre-log' file ----------------------- " + PRELOG$
  276.       PRINT " 84. Name of questionnaire required of new users -- " + NEW.USER.QUESTIONNAIRE$
  277.       PRINT " 85. Name of 'epi-log' questionnaire -------------- " + EPILOG$
  278.       PRINT " 86. System file containing messages is named ----- " + MAIN.MESSAGE.FILE$
  279.       PRINT " 87. System file for recording users is named ----- " + MAIN.USER.FILE$
  280.       PRINT " 88. System file for comments to SYSOP is named --- " + COMMENTS.FILE$
  281.       PRINT " 89. Record comments as private messages ---------- " ; FNYESNO$(COMMENTS.AS.MESSAGES)
  282.       PRINT " 90. System file for 'callers' is named ----------- " + CALLERS.FILE$
  283.       PRINT " 91. Extended logging to 'callers' file ----------- " ; FNYESNO$(EXTENDED.LOGGING)
  284.       PRINT " 92. Wrap-around the 'callers' file --------------- " + NOT.YET.IN$ ' WRAP.CALLERS.FILE$
  285.       PRINT " 93. File controlling scan for mail waiting ------- " + CONFMAIL.LIST$
  286.       PRINT " 94. Max # of work variables in ques/macros -------"  ; STR$(MAX.WORK.VAR)
  287.       GOTO 12580
  288. 12410 DISPLAYED.PAGE.NUMBER = 6
  289.       GOSUB 24800
  290.       LOCATE  3,1
  291.       PRINT "101. Is the 'door' subystem available? ------------ " ; FNYESNO$(DOORS.AVAILABLE)
  292.       PRINT "102. The 'door' subsystem menu is named ----------- " + MENU$(5)
  293.       PRINT "103. File built dynamically to open a 'door' ------ " + RCTTY.BAT$
  294.       PRINT "104. When a 'door' closes, re-invoke RBBS-PC via -- " + RBBS.BAT$
  295.       PRINT "105. Drive/path to look for COMMAND.COM on -------- " + DISK.FOR.DOS$
  296.       PRINT "106. Use the Dos 'CTTY' command to redirect I/O --- " ; FNYESNO$(REDIRECT.IO.METHOD)
  297.       PRINT "107. Door Program to check users at logon --------- " ; REGISTRATION.PROGRAM$
  298.       PRINT "108. Logon door required of new users & security <="  ; STR$(MAX.REG.SEC)
  299.       PRINT "109. Name of control file for doors --------------- " ; DOORS.DEF$
  300.       GOTO 12580
  301. 12420 DISPLAYED.PAGE.NUMBER = 7
  302.       GOSUB 24800
  303.       LOCATE  3,1
  304.       PRINT "121. Pseudonym to sign on remotely as the SYSOP ---- " + MN1$+ " " +MN2$
  305.       PRINT "122. ESC key logs SYSOP on locally without password- " + FNYESNO$(ESCAPE.INSECURE)
  306.       PRINT "123. Minimum security level to log on RBBS-PC ------" + STR$(MINIMUM.LOGON.SECURITY)
  307.       PRINT "124. Default security level for new callers --------" + STR$(DEFAULT.SECURITY.LEVEL)
  308.       PRINT "125. Security level for SYSOP ----------------------" + STR$(SYSOP.SECURITY.LEVEL)
  309.       PRINT "126. Minimum security level to see SYSOP's menu ----" + STR$(SYSOP.MENU.SECURITY.LEVEL)
  310.       PRINT "127. Minimum security to leave extended description-" + STR$(ASK.EXTENDED.DESC)
  311.       PRINT "128. Max # security violations before disconnect ---" + STR$(MAXIMUM.VIOLATIONS)
  312.       M22$ = STR$(SYSOP.FUNCTION(1))
  313.       IX = SYSOP.FUNCTION(1)
  314.       FOR I = 2 TO NUM.SYSOP
  315.         IF IX <> SYSOP.FUNCTION(I) THEN _
  316.            M22$ = "(Variable)" : _
  317.            GOTO 12430
  318.       NEXT
  319. 12430 PRINT "129. Security level for SYSOP functions ------------" + M22$
  320.       M23$ = STR$(MAIN.FUNCTION(1))
  321.       IX = MAIN.FUNCTION(1)
  322.       FOR I = 2 TO NUM.MAIN
  323.         IF IX<>MAIN.FUNCTION(I) THEN _
  324.            M23$ = "(Variable)" : _
  325.            GOTO 12440
  326.       NEXT
  327. 12440 PRINT "130. Security level for main menu functions --------" + M23$
  328.       M24$ = STR$(FILES.FUNCTION(1))
  329.       IX = FILES.FUNCTION(1)
  330.       FOR I = 2 TO NUM.FILES
  331.         IF IX<>FILES.FUNCTION(I) THEN _
  332.            M24$ = "(Variable)" : _
  333.            GOTO 12450
  334.       NEXT
  335. 12450 PRINT "131. Security level for file menu functions --------" + M24$
  336.       M25$ = STR$(UTILITY.FUNCTION(1))
  337.       IX = UTILITY.FUNCTION(1)
  338.       FOR I = 2 TO NUM.UTILITY
  339.         IF IX<>UTILITY.FUNCTION(I) THEN _
  340.            M25$ = "(Variable)" : _
  341.            GOTO 12460
  342.       NEXT
  343. 12460 PRINT "132. Security level for utilities menu functions ---" + M25$
  344.       M26$ = STR$(GLOBAL.FUNCTION(1))
  345.       IX = GLOBAL.FUNCTION(1)
  346.       FOR I = 1 TO NUM.GLOBAL
  347.         IF IX<>GLOBAL.FUNCTION(I) THEN _
  348.            M26$ = "(Variable)" : _
  349.            GOTO 12465
  350.       NEXT
  351. 12465 PRINT "133. Security level for GLOBAL commands ------------" + M26$
  352.       PRINT "134. Max # of password changes in a session --------" + STR$(MAXIMUM.PASSWORD.CHANGES)
  353.       PRINT "135. Minimum security for temp. password changes ---" + STR$(MINIMUM.SECURITY.FOR.TEMP.PASSWORD)
  354.       PRINT "136. Minimum security to overwrite on uploads ------" + STR$(OVERWRITE.SECURITY.LEVEL)
  355.       PRINT "137. User's security exempted from 'packing' -------" + STR$(SEC.LVL.EXEMPT.FRM.PURGING)
  356.       PRINT "138. Default security to read new PRIVATE messages -"  + STR$(PRIVATE.READ.SEC)
  357.       PRINT "139. Default security to read new PUBLIC messages --"  + STR$(PUBLIC.READ.SEC)
  358.       PRINT "140. Minimum security to change msg.'s security ----"  + STR$(SEC.CHANGE.MSG)
  359.       GOTO 12580
  360. 12466 DISPLAYED.PAGE.NUMBER = 8
  361.       GOSUB 24800
  362.       LOCATE  3,1
  363.       PRINT "141. Call-back verification ----------------------- " + NOT.YET.IN$ ' CALLBACK.VERIFICATION$
  364.       PRINT "142. Drive/path where personal files & dir stored - " + PERSONAL.DRVPATH$
  365.       PRINT "143. Name of Personal Directory ------------------- " + PERSONAL.DIR$
  366.       PRINT "144. Protocol required for personal downloads ----- " + MID$("<none>  Ascii  XMODEM Xm/CRC Kermit Ymodem Imodem YmodemGWxmodem", 7 * INSTR("NAXCKYIGW",PERSONAL.PROTOCOL$) - 6,7)
  367.       PRINT "145. Files with download security are listed in --- " + FILESEC.FILE$
  368.       PRINT "146. File name with privileged group passwords is - " + PASSWORD.FILE$
  369.       PRINT "147. Concatenate multi-file ASCII downloads ------- " + FNYESNO$(PERSONAL.CONCAT)
  370.       PRINT "148. Min SECURITY to CATEGORIZE uploads -----------" + STR$(SL.CATEGORIZE.UPLOADS)
  371.       PRINT "149. Min security level to view new uploads -------" + STR$(MIN.SEC.TO.VIEW)
  372.       PRINT "150. Security level exempt from 'epi-log' file ----" + STR$(SECURITY.EXEMPT.FROM.EPILOG)
  373.       PRINT "151. Min. security to 'AUTO ADD' conference user --" + AUTO.ADD.SECURITY$
  374.       PRINT "152. Min. security for old caller to turbo logon --" + STR$(ALLOW.CALLER.TURBO)
  375.       PRINT "153. Min. security to describe an existing file ---" + STR$(ADD.DIR.SECURITY)
  376.       PRINT "154. Help file to display for a security violation- " + SECVIO.HLP$
  377.       TIME.LOCK$ = MID$("<none> DOORS  DOWNLDSBOTH   ",TIME.LOCK*7+1,7)
  378.       PRINT "155. Time lock on DOORS and DOWNLOADS ------------- "; TIME.LOCK$
  379.       PRINT "156. Min. sec level exempt from auto-update of sec-" ; AUTO.UPGRADE.SEC
  380.       PRINT "157. Min security to READ & KILL all messages -----" ; SEC.KILL.ANY
  381.       PRINT "158. Do not display messages beginning with ------- "; SCREEN.OUT.MSG$
  382.       GOTO 12580
  383. 12470 DISPLAYED.PAGE.NUMBER = 9
  384.       GOSUB 30040
  385.       ' MAX.USR.FILE.SIZE.FRM.DEF = HIGHEST.USER.RECORD
  386.       MAX.MSG.FILE.SIZE.FRM.DEF! = HIGHEST.MESSAGE.RECORD
  387.       MAX.ALLOWED.MSGS.FRM.DEF  = MAXIMUM.NUMBER.OF.MSGS
  388.       GOSUB 24800
  389.       LOCATE  3,1
  390.       PRINT "161. Maximum number of concurrent RBBS-PC's  -------" + STR$(MAXIMUM.NUMBER.OF.NODES)
  391.       MT$ = "single RBBS-PC copy "
  392.       IF MAXIMUM.NUMBER.OF.NODES <> 1 THEN _
  393.          MT$ = "concurrent RBBS-PC's" : _
  394.          SUBROUTINE.PARAMETER = 2 : _
  395.          IF NETWORK.TYPE < 0 OR NETWORK.TYPE > 7 THEN _
  396.             SUBROUTINE.PARAMETER = 1 : _
  397.             CALL NETTYPE : _
  398.          ELSE CALL NETTYPE
  399.       IF NETWORK.TYPE = 6 THEN _
  400.          MT$ = "NETBIOS             "
  401.       IF NETWORK.TYPE = 7 THEN _
  402.          MT$ = "DoubleDOS           "
  403.       PRINT "162. Environment running " + MT$ + " ------ " + NETWORK.TYPE$
  404.       PRINT "163. RBBS-PC 'recycle' method when users log off --- " + RECYCLE.TO.DOS$
  405.       FILE$ = MAIN.MESSAGE.FILE$
  406.       GOSUB 30180
  407.       MAX.MSG.FILE.SIZE.FRM.DEF! = UG
  408.       PRINT "164. Number of records in the User File ------------";STR$(MAX.USR.FILE.SIZE.FRM.DEF)
  409.       PRINT "165. Number of records in the Message File ---------";STR$(MAX.MSG.FILE.SIZE.FRM.DEF!)
  410.       PRINT "166. Maximum number of messages allowed ------------" + STR$(MAX.ALLOWED.MSGS.FRM.DEF)
  411.       PRINT "167. Conference File Maintenance."
  412.       PRINT "168. Default extension for compressed files -------- " ; DEFAULT.EXTENSION$
  413.       PRINT "169. Additional extensions for compressed files ---- " ; COMPRESSED.EXT$
  414.       PRINT "170. Message file GROWS in size as messages added -- " ; FNYESNO$(MESSAGES.CAN.GROW)
  415.       GOTO 12580
  416. 12480 DISPLAYED.PAGE.NUMBER = 10
  417.       GOSUB 24800
  418.       RB = 0
  419.       LOCATE  3,1
  420.       PRINT "181. Pack " + MAIN.MESSAGE.FILE$ + " file.
  421.       PRINT "182. Rebuild " + MAIN.USER.FILE$ + " file.
  422.       PRINT "183. Print " + MAIN.MESSAGE.FILE$ + " 'header' records.
  423.       PRINT "184. Renumber messages in " + MAIN.MESSAGE.FILE$ + " file.
  424.       PRINT "185. Repair messages in " + MAIN.MESSAGE.FILE$ + " file.
  425.       PRINT "186. Make all users answer required questionnaire."
  426.       PRINT "187. Check FMS directory structure."
  427.       PRINT "188. Check Personal Download directory structure."
  428.       PRINT "189. Set most critical parameters."
  429.       PRINT "190. Set parameters new to RBBS-PC " + CONFIG.VERSION$
  430.       PRINT "191. Reset active printers for all nodes."
  431.       PRINT "192. Make user pref. on hilighting match color graphics."
  432.       GOTO 12580
  433. 12490 DISPLAYED.PAGE.NUMBER = 11
  434.       GOSUB 24800
  435.       LOCATE  3,1
  436.       PRINT "201. Drive available for uploading files to ------- " + DRIVE.FOR.UPLOADS$ + ":"
  437.       PRINT "202. File name of Upload Directory  --------------- " + UPLOAD.DIRECTORY$
  438.       PRINT "203. Drive/path where Upload Directory stored ----- " + UPLOAD.PATH$
  439.       PRINT "204. Drive(s) available for Downloading ----------- " + DRIVES.FOR.DOWNLOADS$
  440.       PRINT "205. Will you be using DOS sub-directories? ------- " ; FNYESNO$(WILL.SUBDIRS.B.USED)
  441.       PRINT "206. Write Uploads to a DOS sub-directory? -------- " + FNYESNO$(UPLOAD.TO.SUBDIR)
  442.       PRINT "207. Are downloads from DOS sub-directories? ------ " + FNYESNO$(DOWNLOAD.TO.SUBDIR)
  443.       PRINT "208. List, change, add, delete sub-directories."
  444.       PRINT "209. Extension for file directories --------------- " + DIRECTORY.EXTENTION$
  445.       X$ = ALTDIR.EXTENSION$
  446.       IF ALTDIR.EXTENSION$ = "" OR _
  447.          ALTDIR.EXTENSION$ = "<none>" THEN _
  448.          X$ = NONE.PICKED$
  449.       PRINT "210. Alternate extension for directory files ------ " + X$
  450.       PRINT "211. Name (prefix) of directory of directories ---- " + DIRECTORY.PREFIX$
  451.       PRINT "212. Omit directory of directories in N)ew cmnd. -- " + OMIT.MAIN.DIRECTORY$
  452.       X$ = ALWAYS.STREW.TO$
  453.       IF ALWAYS.STREW.TO$ = "" OR _
  454.          ALWAYS.STREW.TO$ = "<none>" THEN _
  455.          X$ = "NO"
  456.       PRINT "213. Copy all upload descriptions to -------------- " + X$
  457.       A$ = FMS.DIRECTORY$
  458.       IF FMS.DIRECTORY$ = "" THEN _
  459.          A$ = NONE.PICKED$
  460.       PRINT "214. Name of master File Management System dir is - " + A$
  461.       PRINT "215. Limit file searches to master FMS dir only --- " ; FNYESNO$(LIMIT.SEARCH.TO.FMS)
  462.       PRINT "216. Default category code for uploads ------------ " + DEFAULT.CATEGORY.CODE$
  463.       PRINT "217. File containing valid directory categories --- " + DIR.CATEGORY.FILE$
  464.       X$ = MASTER.DIRECTORY.NAME$
  465.       IF MASTER.DIRECTORY.NAME$ = "" THEN _
  466.          X$ = "NO"
  467.       PRINT "218. Limit search for 'ALL' dirs to directory ----- " + X$
  468.       PRINT "219. Max length of description of uploaded file ---" + STR$(MAX.DESC.LEN)
  469.       PRINT "220. Drive/path(optional) for directory files ----- " + DIRECTORY.PATH$
  470.       GOTO 12580
  471. 12500 DISPLAYED.PAGE.NUMBER = 12
  472.       GOSUB 24800
  473.       LOCATE 3,1
  474.       PRINT "221. Communications port to be used by RBBS-PC ---- " + COM.PORT$
  475.       PRINT "222. # of seconds to wait for modem to initialize -" + STR$(MODEM.INIT.WAIT.TIME)
  476.       PRINT "223. Seconds to wait before issuing modem commands-" + STR$(MODEM.COMMAND.DELAY.TIME)
  477.       PRINT "224. Number of rings to wait before answering -----" + STR$(REQUIRED.RINGS);
  478.       IF INSTR(USER.INIT.COMMAND$, "S0=255 ") > 0 THEN _
  479.          PRINT " RING BACK";
  480.       PRINT
  481.       PRINT "225. Set the modem commands"
  482.       PRINT "226. ---------------------------------------------- "
  483.       PRINT "227. Issue modem commands between rings ----------- " ; FNYESNO$(COMMANDS.BETWEEN.RINGS)
  484.       PRINT "228. Baud rate to initially open modem at --------- " + MODEM.INIT.BAUD$
  485.       X$ = STR$(WAIT.BEFORE.DISCONNECT) + " seconds"
  486.       IF WAIT.BEFORE.DISCONNECT = 0 THEN _
  487.          X$ = "NO"
  488.       PRINT "229. Log off user who are idle for ----------------" + X$
  489.       PRINT "230. Are you using a 'DUMB' auto-answer modem? ---- " ; FNYESNO$(DUMB.MODEM)
  490.       PRINT "231. Initialize modem firmware for RBBS-PC."
  491.       PRINT "232. # seconds to wait after dropping DTR ---------"  + STR$(DTR.DROP.DELAY)
  492.       PRINT "233. File with PROTOCOL definitions --------------- " + PROTO.DEF$
  493.       PRINT "234. Always check caller for AUTODOWNLOAD support - " ; FNYESNO$(ASK.IDENTITY)
  494.       PRINT "235. Require non-ascii protocol for BASIC files --- " ; FNYESNO$(REQUIRE.NON.ASCII)
  495.       X$ = STR$(RECYCLE.WAIT) + " minutes"
  496.       IF RECYCLE.WAIT = 0 THEN _
  497.          X$ = "<Don't recycle>"
  498.       PRINT "236. Recycle if no calls are received within ------" + X$
  499.       PRINT "237. Leave modem at initial baud ------------------ " + FNYESNO$(KEEP.INIT.BAUD)
  500.       GOTO 12580
  501. 12505 DISPLAYED.PAGE.NUMBER = 13
  502.       GOSUB 24800
  503.       LOCATE 3,1
  504.       PRINT "241. Restore initial parms. after change to N/8/1 - " + FNYESNO$(SWITCH.BACK)
  505.       PRINT "242. Minimum baud required of new callers ---------"  + STR$(MIN.NEWCALLER.BAUD)
  506.       PRINT "243. Minimum baud required of old callers ---------"  + STR$(MIN.OLDCALLER.BAUD)
  507.       PRINT "244. Modem flow control uses Clear-to-Send (CTS)--- " + RTS$
  508.       PRINT "245. Modem flow control uses XON/XOFF ------------- " + FNYESNO$(XON.XOFF)
  509.       PRINT "246. Seconds to wait for carrier after answering --"  + STR$(MAX.CARRIER.WAIT)
  510.       GOTO 12580
  511. 12510 DISPLAYED.PAGE.NUMBER = 14
  512.       GOSUB 24800
  513.       LOCATE 3,1
  514.       TIME.TO.DROP.TO.DOS$ = "<none>"
  515.       IF TIME.TO.DROP.TO.DOS > 0 THEN _
  516.          TIME.TO.DROP.TO.DOS$ = STRING$(4 - (LEN(STR$(TIME.TO.DROP.TO.DOS)) - 1),"0") + MID$(STR$(TIME.TO.DROP.TO.DOS),2)
  517. 12512 PRINT "261. Time of day to exit to DOS ------------------- " + TIME.TO.DROP.TO.DOS$
  518.       PRINT "262. Net mail to invoke is ------------------------ " + NET.MAIL$
  519.       X$ = HOST.ECHO.ON$
  520.       IF HOST.ECHO.ON$ = "" THEN _
  521.          X$ = NONE.PICKED$
  522.       PRINT "263. Command for intermediate host to ECHO -------- " + X$
  523.       X$ = HOST.ECHO.OFF$
  524.       IF HOST.ECHO.OFF$ = "" THEN _
  525.          X$ = NONE.PICKED$
  526.       PRINT "264. Command for intermediate host NOT to ECHO ---- " + X$
  527.       X = INSTR("ICR",DEFAULT.ECHOER$)
  528.       X$ = MID$("Intermediate hostCaller's softwareRBBS-PC",1 + 17 * (X - 1),17)
  529.       PRINT "265. Who echos what a remote caller types? -------- " + X$
  530.       X$ = DEFAULT.LINE.ACK$
  531.       IF DEFAULT.LINE.ACK$ = "" THEN _
  532.          X$ = NONE.PICKED$
  533.       PRINT "266. String to acknowlege line in ASCII upload ---- "+ X$
  534.       PRINT "267. Name of sorted file list used in up/download = "; FAST.FILE.LIST$ ' 102201
  535.       PRINT "268. Name of locator file used in up/download ----- "; FAST.FILE.LOCATOR$ ' 102201
  536.       GOTO 12580
  537. 12520 DISPLAYED.PAGE.NUMBER = 15
  538.       GOSUB 24800
  539.       LOCATE  3,1
  540.       PRINT "281. Let new users set their preferences --------- " ; FNYESNO$(NEWUSER.SETS.DEFAULTS)
  541.       PRINT "282. New users default sign-on mode -------------- " + NOT.YET.IN$ ' NEW.USER.DEFAULT.MODE$
  542.       PRINT "283. New users default file-transfer protocol ---- " + NOT.YET.IN$ ' NEW.USER.DEFAULT.PROTOCOL$
  543.       PRINT "284. Line feeds for new users default to --------- " + NOT.YET.IN$ ' NEW.USER.LINE.FEEDS$
  544.       PRINT "285. Nulls for new users default to -------------- " + NOT.YET.IN$ ' NEW.USER.NULLS$
  545.       PRINT "286. Prompt bell for new users defaults to ------- " + NOT.YET.IN$ ' NEW.USER.BELL$
  546.       PRINT "287. New users 'graphics' capability is assumed -- " + NOT.YET.IN$ ' NEW.USER.GRAPHICS$
  547.       PRINT "288. New users are assumed UPPERCASE only -------- " + NOT.YET.IN$ ' NEW.USER.CASE$
  548.       PRINT "289. New users message margins defaults to ------- " + NOT.YET.IN$ ' STR$(NEW.USER.MARGINS)
  549.       PRINT "290. Add new users to USERS file ----------------- " ; FNYESNO$(REMEMBER.NEW.USERS)
  550.       PRINT "291. Let new users on even when USERS file full -- " ; FNYESNO$(SURVIVE.NOUSER.ROOM)
  551.       GOTO 12580
  552. 12530 DISPLAYED.PAGE.NUMBER = 16
  553.       GOSUB 24800
  554.       LOCATE  3,1
  555.       X$ = LIBRARY.DRIVE$
  556.       IF LIBRARY.DRIVE$ = "" THEN _
  557.          X$ = NONE.PICKED$
  558.       PRINT "301. Library drive ------------------------------- " + X$
  559.       PRINT "302. Drive/Path for Library directory ------------ " + LIBRARY.DIRECTORY.PATH$
  560.       PRINT "303. Extension for Library directory ------------- " + LIBRARY.DIRECTORY.EXTENTION$
  561.       PRINT "304. Drive/Path for Library work/RAM disk -------- " + LIBRARY.WORK.DISK.PATH$
  562.       PRINT "305. # of disks in Library -----------------------" + STR$(LIBRARY.MAX.DISK)
  563.       PRINT "306. # of master Library subdirectories ----------" + STR$(LIBRARY.MAX.DIRECTORY)
  564.       PRINT "307. # of subdirectories in each master ----------" + STR$(LIBRARY.MAX.SUBDIR)
  565.       PRINT "308. Prefix of Library subdirectories ------------ " + LIBRARY.SUBDIR.PREFIX$
  566.       PRINT "309. Name of Library subsystem command menu ------ " + MENU$(6)
  567.       PRINT "310. Symbols to use for Library menu commands ---- " + LIBRARY.COMMANDS$
  568.       M27$ = STR$(PS)
  569.       IX = LIBRARY.FUNCTION(1)
  570.       FOR I = 1 TO NUM.LIBRARY
  571.          IF IX<>LIBRARY.FUNCTION(I) THEN _
  572.             M27$ = "(Variable)" : _
  573.             GOTO 12531
  574.       NEXT
  575. 12531 PRINT "311. Security level for Library menu functions --- " + M27$
  576.       PRINT "312. Drive/Path of archive utility --------------- " + LIBRARY.ARCHIVE.PATH$
  577.       PRINT "313. Name of executable archive utility ---------- " + LIBRARY.ARCHIVE.PROGRAM$
  578.       GOTO 12580
  579. 12540 DISPLAYED.PAGE.NUMBER = 17
  580.       GOSUB 24800
  581.       LOCATE  3,1
  582.       X$ = EMPHASIZE.ON.DEF$
  583.       IF EMPHASIZE.ON.DEF$ = "" THEN _
  584.          X$ = NONE.PICKED$
  585.       PRINT "321. String to turn ON Graphic Emphasis ----------- " + X$
  586.       X$ = EMPHASIZE.OFF.DEF$
  587.       IF EMPHASIZE.OFF.DEF$ = "" THEN _
  588.          X$ = NONE.PICKED$
  589.       PRINT "322. String to restore normal text (Emphasis OFF) - " + X$
  590.       PRINT "323. Caller's Foreground color 1 ------------------ " + FG.1.DEF$
  591.       PRINT "324. Caller's Foreground color 2 ------------------ " + FG.2.DEF$
  592.       PRINT "325. Caller's Foreground color 3 ------------------ " + FG.3.DEF$
  593.       PRINT "326. Caller's Foreground color 4 ------------------ " + FG.4.DEF$
  594.       X$ = MID$("<none>Blue  Green Cyan  Red   PurpleYellowWhite",CALLER.BKGRD*6+1,6)
  595.       PRINT "327. Caller's Background color -------------------- " ; X$
  596.       GOTO 12580
  597. 12550 DISPLAYED.PAGE.NUMBER = 18
  598.       GOSUB 24800
  599.       GOTO 12580
  600. 12580 IF PRE.DISPLAY THEN _
  601.          PRE.DISPLAY = FALSE : _
  602.          GOTO 12622
  603.       GOSUB 24890
  604. 12590 GOSUB 22160
  605. 12592 IF IX THEN _            'IX       Key    Where to branch to
  606.          ON IX GOTO 12360, _  ' 1       F1 - Global Parameters (Part 1)
  607.                     12370, _  ' 2       F2 - Global Parameters (Part 2)
  608.                     12380, _  ' 3       F3 - Global Parameters (Part 3)
  609.                     12390, _  ' 4       F4 - RBBS-PC System Files (Part 1)
  610.                     12400, _  ' 5       F5 - RBBS-PC System Files (Part 2)
  611.                     12410, _  ' 6       F6 - RBBS-PC "doors"
  612.                     12420, _  ' 7       F7 - RBBS-PC security parms. (Part 1)
  613.                     12466, _  ' 8       F8 - RBBS-PC security parms. (Part 2)
  614.                     12470, _  ' 9       F9 - Multiple RBBS-PC parameters
  615.                     12480, _  '10      F10 - RBBS-PC's utilities
  616.                     12490, _  '11 Shift-F1 - RBBS-PC File Manager
  617.                     12500, _  '12 Shift-F2 - RBBS-PC comm. parameters (Part 1)
  618.                     12505, _  '13 Shift-F3 - RBBS-PC comm. parameters (Part 2)
  619.                     12510, _  '14 Shift-F4 - RBBS-PC Net Mail
  620.                     12520, _  '15 Shift-F5 - New user parameters
  621.                     12530, _  '16 Shift-F6 - Library parameters
  622.                     12540, _  '17 Shift-F7 - RBBS-PC Color parameters
  623.                     12310, _  '18 Shift-F8 - Reserved for future use
  624.                     12340, _  '19     PgUp - Go to previous page
  625.                     12330, _  '20     PgDn - Go to next page
  626.                     12630, _  '21      End - Terminate CONFIG
  627.                     12620     '22 Enter - Option selected followed by "enter"
  628.       GOTO 12590
  629. 12620 GOSUB 50340
  630.       IF VAL(HJ$) < 1 OR VAL(HJ$) > 331 THEN _
  631.          GOTO 12580
  632.       IPAGE = INT((VAL(HJ$) - 1) / 20)
  633.       IF DISPLAYED.PAGE.NUMBER <> IPAGE+1 THEN _
  634.          PRE.DISPLAY = TRUE : _
  635.          IX = IPAGE+1 : _
  636.          GOTO 12592
  637. 12622 ILOOKUP = VAL(HJ$) - (20 * IPAGE)
  638.       IPAGE = IPAGE + 1
  639.       IF ILOOKUP < 1 THEN _
  640.          ILOOKUP = 20 : _
  641.          IPAGE = IPAGE - 1
  642. 12630 EXIT SUB
  643. '
  644. ' * COMMON SUBROUTINE TO HANDLE THE FUNCTION KEYS, SCROLL BETWEEN CONFIG'S
  645. ' * PAGES OF OPTIONS, AND USER'S SELECTING A NUMERIC 4-CHARACTER OPTION.
  646. '
  647. 22160 I! = FRE(C$)
  648.       IX = 0
  649.       IF KSTACKED$ = "" THEN _
  650.          GOTO 22161
  651.       X = INSTR(KSTACKED$,CHR$(13))
  652.       IF X > 0 THEN _
  653.          IX = 22 : _
  654.          HJ$ = LEFT$(KSTACKED$,X-1) : _
  655.          KSTACKED$ = RIGHT$(KSTACKED$,LEN(KSTACKED$)-X) : _
  656.          OPTION$ = HJ$ : _
  657.          RETURN
  658.       Y$ = CHR$(0) + CHR$(68)
  659.       IF KSTACKED$ = "END" THEN _
  660.          Y$ = CHR$(0) + CHR$(79)
  661.       KSTACKED$ = ""
  662.       GOTO 22240
  663. 22161 Y$ = INKEY$
  664.       IF LEN(Y$) < 1 THEN _
  665.          GOTO 22161
  666.       IF LEN(Y$) = 2 THEN _               ' IF A FUNCTION KEY, BRANCH
  667.          GOTO 22240
  668.       IF ASC(Y$) = 13 THEN _              ' IF A CARRIAGE RETURN, RETURN
  669.          IX = 22 : _
  670.          RETURN
  671.       IF ASC(Y$) = 8 AND LEN(HJ$) > 0 THEN _
  672.          HJ$ = LEFT$(HJ$,LEN(HJ$) - 1) : _
  673.          PRINT CHR$(29) + " " + CHR$(29); : _
  674.          GOTO 22161
  675.       IF ASC(Y$) < 48 OR ASC(Y$) > 57 THEN _
  676.          GOTO 22161
  677.       PRINT Y$;
  678.       HJ$ = HJ$ + _
  679.             Y$
  680.       OPTION$ = HJ$
  681.       IF LEN(HJ$) > 4 THEN _              ' IF MORE THAN FOUR CHARACTERS,
  682.          IX = 22                          ' RETURN
  683.       RETURN
  684. '
  685. ' * COMMON SUBROUTINE TO HANDLE SET UP RETURN CODES FOR FUNCTION KEYS THAT
  686. ' * WERE PRESSED ON THE LOCAL PC RUNNING CONFIG
  687. '
  688. 22240 IX = ASC(RIGHT$(Y$,1))
  689.       IF IX < 59 OR IX > 91 THEN _        ' IGNORE IF NOT F1 THROUGH F10 OR
  690.          IX = 0: _                        ' SHIFT-F1 THROUGH SHIFT-F8
  691.          RETURN
  692.       IF IX = 73 THEN _                   ' IF PGUP THEN SET IX = 19
  693.          IX = 19 : _
  694.          RETURN
  695.       IF IX = 79 THEN _                   ' IF END THEN SET IX = 21
  696.          IX = 21 : _
  697.          RETURN
  698.       IF IX = 81 THEN _                   ' IF PGDN THEN SET IX = 20
  699.          IX = 20 : _
  700.          RETURN
  701.       IF (IX-58) < 11 THEN _              ' IF F1 THROUGH F10 SET IX = 1
  702.          IX = IX - 58 : _                 ' THROUGH 10 ACCORDINGLY.
  703.          RETURN
  704.       IF (IX-73) > 10 AND _               ' IF SHIFT-F1 THROUGH SHIFT-F8 THEN
  705.          (IX-73) < 19 THEN _              ' SET IX = 11 THROUGH 18
  706.             IX = IX - 73 : _              ' ACCORDINGLY.
  707.             RETURN
  708.       IX = 0
  709.       RETURN
  710. '
  711. ' * ROUTINE TO DISPLAY THE PAGE HEADER FOR CONFIG'S DISPLAYS
  712. '
  713. 24800 CLS
  714.       I! = FRE(C$)
  715.       COLOR 0,7,0
  716.       LOCATE 1,10
  717.       PRINT "RBBS-PC " + CONFIG.VERSION$ + " Configuration ";
  718.       IF CONFERENCE.MODE THEN _
  719.          GOSUB 24970
  720.       COLOR FG,BG,BORDER
  721.       PRINT " Page" + STR$(DISPLAYED.PAGE.NUMBER) + " of" + STR$(MAXIMUM.DISPLAYABLE.PAGES)
  722.       RETURN
  723. 24890 A$ = "Enter parameter # to change, END to update, PgUp/PgDn to scroll:"
  724. 24900 LOCATE 24,5
  725.       PRINT A$;
  726.       X = POS(0) + 2
  727.       PRINT STRING$((75 - LEN(A$)),32);
  728.       LOCATE 24,X
  729.       COLOR FG,BG,BORDER
  730.       HJ$ = "
  731.       I! = FRE(C$)
  732.       RETURN
  733. '
  734. ' * ROUTINE TO DISPLAY CONFERENCE MAINTENANCE MODE IN CONFIG'S DISPLAYS
  735. '
  736. 24970 LOCATE 2,1
  737.       PRINT SPACE$(10)
  738.       LOCATE 2,10
  739.       A$ = "Private"
  740.       IF CONFERENCE.MODE = 2 THEN _
  741.          A$ = "Public"
  742.       PRINT "(" + A$ + " Conference Maintenance Mode for " + _
  743.             MID$(MAIN.MESSAGE.FILE$,1,INSTR(MAIN.MESSAGE.FILE$,"M.DEF")-1) + _
  744.             ")";
  745.       RETURN
  746. '
  747. ' * COMMON SUBROUTINE TO READ THE MESSAGES FILE'S CHECKPOINT RECORD
  748. '
  749. 30040 IF NETWORK.TYPE = 6 THEN _
  750.          OPEN MAIN.MESSAGE.FILE$ FOR RANDOM SHARED AS #2 LEN=128 _
  751.       ELSE OPEN "R",2,MAIN.MESSAGE.FILE$,128
  752.       FIELD 2,128 AS RR$
  753.       GET 2,1
  754.       CALLS.TODATE! = VAL(MID$(RR$,1,8))             '  1-  8  =  number of last message on system
  755.       FIRST.USER.RECORD = VAL(MID$(RR$,52,5))        ' 52- 56  =  first rec. of user file
  756.       CURRENT.USER.COUNT = VAL(MID$(RR$,57,5))       ' 57- 61  =  next avail. user record
  757.       HIGHEST.USER.RECORD = VAL(MID$(RR$,62,5))      ' 62- 66  =  last rec. of user file
  758.       FIRST.MESSAGE.RECORD = VAL(MID$(RR$,68,7))     ' 68- 74 = first rec. of msgs file
  759.       NEXT.MESSAGE.RECORD = VAL(MID$(RR$,75,7))      ' 75- 81 = next avail. msgs record
  760.       HIGHEST.MESSAGE.RECORD = VAL(MID$(RR$,82,7))   ' 82- 88 = last rec. of msgs file
  761.       MAXIMUM.NUMBER.OF.MSGS = VAL(MID$(RR$,89,7))   ' 89- 95 = maximum number of messages
  762.       MAXIMUM.NUMBER.OF.NODES = VAL(MID$(RR$,127,2)) '127-128 = maximum number of "nodes"
  763.       CLOSE 2
  764.       RETURN
  765. '
  766. ' * COMMON ROUTINE TO GET THE LENGTH OF A FILE
  767. '
  768. 30180 IF NETWORK.TYPE = 6 THEN _
  769.          OPEN FILE$ FOR RANDOM SHARED AS #2 LEN=128 _
  770.       ELSE OPEN "R",2,FILE$,128
  771.       FIELD 2,128 AS RR$
  772.       UG = LOF(2) / 128
  773.       CLOSE 2
  774.       RETURN
  775. '
  776. ' * COMMON SUBROUTINE TO KEEP STRING SPACE CLEAN AND CLEAR LINE 24
  777. '
  778. 50340 I! = FRE(C$)
  779.       LOCATE 24,1
  780.       PRINT STRING$(79,32);
  781.       RETURN
  782. '
  783. ' * COMMON SUBROUTINE TO DISPLAY A MESSAGE ON LINE 24
  784. '
  785. 50345 GOSUB 50340
  786.       LOCATE 24,5
  787.       PRINT XX$;
  788.       RETURN
  789. '
  790. ' * COMMON SUBROUTINE TO BEEP AT THE SYSOP
  791. '
  792. 60380 FOR I = 1 TO 3
  793.         BEEP
  794.       NEXT
  795.       RETURN
  796.       END SUB
  797. '  $SUBTITLE: 'NETTYPE - subroutine to select supported networks'
  798. '  $PAGE
  799. '
  800. '  SUBROUTINE NAME    --  NETTYPE
  801. '
  802. '  INPUT PARAMETERS   --  MLCOM
  803. '                         NETWORK.TYPE
  804. '                         NETWORK.TYPE$
  805. '                         SUBROUTINE.PARAMETER
  806. '
  807. '  OUTPUT PARAMETERS  --  MLCOM
  808. '                         NETWORK.TYPE
  809. '                         NETWORK.TYPE$
  810. '
  811. '  SUBROUTINE PURPOSE --  TO SELECT THE RBBS-PC SUPPORTED NETWORKS
  812. '
  813.       SUB NETTYPE STATIC
  814.       ON SUBROUTINE.PARAMETER GOTO 60382,60384
  815. 60382 CLS
  816.       LOCATE 3,1
  817.       PRINT "     RBBS-PC is supported in the following:"
  818.       PRINT "                   Environment"
  819.       PRINT "          0. Single RBBS-PC in an IBM DOS environment"
  820.       PRINT "          1. MultiLink (multi-tasking under single DOS)"
  821.       PRINT "          2. Omninet (CORVUS)"
  822.       PRINT "          3. PC-NET (Orchid)"
  823.       PRINT "          4. DESQview (Quarterdeck)"
  824.       PRINT "          5. 10 NET (Fox Research)"
  825.       PRINT "          6. NETBIOS (DOS SHARE)"
  826.       PRINT "          7. DoubleDOS, but file sharing not supported."
  827. 60383 XX$ = "Select environment (0 to 7, [ENTER] quits)"
  828.       I! = FRE(C$)
  829.       LOCATE 24,1
  830.       PRINT STRING$(79,32);
  831.       LOCATE 24,5
  832.       PRINT XX$;
  833.       LINE INPUT;X$
  834.       IF X$ = "" THEN _
  835.          EXIT SUB
  836.       NETWORK.TYPE = VAL(X$)
  837.       IF NETWORK.TYPE < 0 OR NETWORK.TYPE > 7 THEN _
  838.          GOTO 60383
  839. 60384 IF NETWORK.TYPE = 0 THEN _
  840.          NETWORK.TYPE$ = "IBM's DOS"
  841.       IF NETWORK.TYPE = 1 THEN _
  842.          MLCOM = TRUE : _
  843.          NETWORK.TYPE$ = "MultiLink"
  844.       IF NETWORK.TYPE = 2 THEN _
  845.          NETWORK.TYPE$ = "Omninet"
  846.       IF NETWORK.TYPE = 3 THEN _
  847.          NETWORK.TYPE$ = "PC-NET"
  848.       IF NETWORK.TYPE = 4 THEN _
  849.          NETWORK.TYPE$ = "DESQview"
  850.       IF NETWORK.TYPE = 5 THEN _
  851.          NETWORK.TYPE$ = "10 NET"
  852.       IF NETWORK.TYPE = 6 THEN _
  853.          NETWORK.TYPE$ = "NETBIOS"
  854.       IF NETWORK.TYPE = 7 THEN _
  855.          NETWORK.TYPE$ = "No file sharing!"
  856.       IF SUBROUTINE.PARAMETER = 2 THEN _
  857.          EXIT SUB
  858.       IF NETWORK.TYPE = 2 OR NETWORK.TYPE = 3 OR NETWORK.TYPE = 5 OR NETWORK.TYPE = 6 THEN _
  859.          CALL GETNUMYN ("Are you running Multi-Link with " + NETWORK.TYPE$,MLCOM)
  860.       END SUB
  861. '  $SUBTITLE: 'CNFGINIT - subroutine to initialize CONFIG's constants'
  862. '  $PAGE
  863. '
  864. '  SUBROUTINE NAME    --  CNFGINIT
  865. '
  866. '  INPUT PARAMETERS   --  NONE
  867. '
  868. '  OUTPUT PARAMETERS  --  CONFIG'S CONSTANTS INITIALIZED
  869. '
  870. '  SUBROUTINE PURPOSE --  TO INITIALIZE THE CONSTANTS USED BY CONFIG
  871. '
  872. 60385 SUB CNFGINIT STATIC
  873. '
  874. ' * INITALIZE ALL VARIABLES IF A .DEF FILE DOESN'T AREADY EXIST
  875. '
  876.       D$ = DD$
  877.       DRV$ = LEFT$(D$,1)
  878.       FALSE                      = 0
  879.       TRUE                       = NOT FALSE
  880.       SYSOP.SECURITY.LEVEL       = 10
  881.       ACT.MNTHS.B4.DELETING      = 1
  882.       ACTIVE.BULLETINS           = 6
  883.       ADD.DIR.SECURITY           = SYSOP.SECURITY.LEVEL
  884.       ALLOW.CALLER.TURBO         = 6
  885.       ALTDIR.EXTENSION$          = ""
  886.       ALWAYS.STREW.TO$           = ""
  887.       ANS.MENU$                  = D$ + "MENUA"
  888.       ASK.EXTENDED.DESC          = SYSOP.SECURITY.LEVEL
  889.       ASK.IDENTITY               = FALSE
  890.       AUTO.ADD.SECURITY          = 5
  891.       AUTO.UPGRADE.SEC           = SYSOP.SECURITY.LEVEL
  892.       AUTOPAGE.DEF$              = D$ + "AUTOPAGE.DEF"
  893.       BG                         = 0
  894.       BORDER                     = 0
  895.       BUFFER.SIZE                = 128
  896.       BULLETIN.MENU$             = "BULLET"
  897.       BULLETIN.PREFIX$           = "BULLET"
  898.       BULLETINS.OPTIONAL         = TRUE
  899.       C$                         = ""
  900.       CALLER.BKGRD               = 0
  901.       CALLERS.FILE$              = D$ + "CALLERS"
  902.       SEC.KILL.ANY               = SYSOP.SECURITY.LEVEL
  903.       COM.PORT$                  = "COM1"
  904.       COMMANDS.BETWEEN.RINGS     = FALSE
  905.       COMMANDS.IN.PROMPT         = TRUE
  906.       COMMENTS.AS.MESSAGES       = FALSE
  907.       COMMENTS.FILE$             = D$ + "COMMENTS"
  908.       COMPRESSED.EXT$            = ".ARC.PAK"
  909.       COMPUTER.TYPE              = 0
  910.       CONFERENCE.MENU$           = D$ + "CONFENCE"
  911.       CONFERENCE.VIEWER.SEC.LVL  = 0
  912.       CONFMAIL.LIST$             = D$ + "CONFMAIL.DEF"
  913.       CONFIG.VERSION$            = "Version CPC17.3"
  914.       DEFAULT.CATEGORY.CODE$     = "UNC"
  915.       DAYS.IN.SUBSCRIPTION.PERIOD = 365
  916.       DAYS.TO.WARN               = 60
  917.       DIR.CATEGORY.FILE$         = D$ + "DIR.CAT"
  918.       DIRECTORY.PREFIX$          = "DIR"
  919.       DEFAULT.ECHOER$            = "R"
  920.       DEFAULT.LINE.ACK$          = ""
  921.       DEFAULT.SECURITY.LEVEL     = 5
  922.       DIRECTORY.EXTENTION$       = "DIR"
  923.       DIRECTORY.PATH$            = D$
  924.       DISK.FOR.DOS$              = D$
  925.       DISKFULL.GO.OFFLINE        = TRUE
  926.       DNLD.SUB                   = 0
  927.       DOORS.AVAILABLE            = FALSE
  928.       DOORS.DEF$                 = D$ + "DOORS.DEF"
  929.       DOORS.TERMINAL.TYPE        = 8
  930.       DOSANSI                    = FALSE
  931.       DOS.VERSION                = 2
  932.       DOWNLOAD.DRIVES$           = DRV$ + DRV$
  933.       DOWNLOAD.TO.SUBDIR         = FALSE
  934.       DRIVE.FOR.BULLETINS$       = D$
  935.       DRIVE.FOR.HELP.FILES$      = D$
  936.       DTR.DROP.DELAY             = 3
  937.       DUMB.MODEM                 = FALSE
  938.       ECHOER$                    = "R"
  939.       EMPHASIZE.OFF.DEF$         = "[27]" + "[0;40;33m"
  940.       EMPHASIZE.ON.DEF$          = "[27]" + "[1;41;37m"
  941.       END.OFFICE.HOURS           = 2200
  942.       ENFORCE.UPLOAD.DOWNLOAD.RATIOS = FALSE
  943.       EPILOG$                    = D$ + "EPILOG.DEF"
  944.       ESCAPE.INSECURE            = FALSE
  945.       EXPERT.USER                = 0
  946.       EXPIRED.SECURITY           = DEFAULT.SECURITY.LEVEL
  947.       EXTENDED.LOGGING           = FALSE
  948.       EXTENSION.LIST$            = "ZIP"
  949.       FAST.FILE.LIST$            = D$ + "FIDX.DEF"
  950.       FAST.FILE.LOCATOR$         = D$ + "LIDX.DEF"
  951.       FC                         = 5
  952.       FG                         = 7
  953.       FG.1.DEF$                  = "Bright Green"
  954.       FG.2.DEF$                  = "Bright Yellow"
  955.       FG.3.DEF$                  = "Bright Purple"
  956.       FG.4.DEF$                  = "Bright Cyan"
  957.       FILE.COMMANDS.DEFAULTS$    = "DGLNPSUV"
  958.       FILE.COMMANDS$             = FILE.COMMANDS.DEFAULTS$
  959.       FILE.NOTIFY                = FALSE
  960.       FILES.FUNCTION$(1,1)       = "D)ownload a file      "
  961.       FILES.FUNCTION$(2,1)       = "G)oodbye              "
  962.       FILES.FUNCTION$(3,1)       = "L)ist file directory  "
  963.       FILES.FUNCTION$(4,1)       = "N)ew file search      "
  964.       FILES.FUNCTION$(5,1)       = "P)ersonal files       "
  965.       FILES.FUNCTION$(6,1)       = "S)earch files         "
  966.       FILES.FUNCTION$(7,1)       = "U)pload a file        "
  967.       FILES.FUNCTION$(8,1)       = "V)erbose archive list "
  968.       FILES.FUNCTION$(1,2)       = "D"
  969.       FILES.FUNCTION$(2,2)       = "G"
  970.       FILES.FUNCTION$(3,2)       = "L"
  971.       FILES.FUNCTION$(4,2)       = "N"
  972.       FILES.FUNCTION$(5,2)       = "P"
  973.       FILES.FUNCTION$(6,2)       = "S"
  974.       FILES.FUNCTION$(7,2)       = "U"
  975.       FILES.FUNCTION$(8,2)       = "V"
  976.       FILESEC.FILE$              = D$ + "FILESEC"
  977.       FIRST.NAME.PROMPT$         = "FIRST name"
  978.       FOSSIL                     = 0
  979.       GB                         = FC
  980.       GLOBAL.COMMANDS.DEFAULTS$  = "H?QX"
  981.       GLOBAL.COMMANDS$           = GLOBAL.COMMANDS.DEFAULTS$
  982.       GLOBAL.FUNCTION$(1,1)      = "H)elp on-line           "
  983.       GLOBAL.FUNCTION$(2,1)      = "?)help on-line (=H)     "
  984.       GLOBAL.FUNCTION$(3,1)      = "Q)uit this part         "
  985.       GLOBAL.FUNCTION$(4,1)      = "X)Expert toggle on/off  "
  986.       GLOBAL.FUNCTION$(1,2)      = "H"
  987.       GLOBAL.FUNCTION$(2,2)      = "?"
  988.       GLOBAL.FUNCTION$(3,2)      = "Q"
  989.       GLOBAL.FUNCTION$(4,2)      = "X"
  990.       GO.TO.SHELL                = TRUE
  991.       HELP$(3)                   = "HELP03"
  992.       HELP$(4)                   = "HELP04"
  993.       HELP$(7)                   = "HELP07"
  994.       HELP$(9)                   = "HELP09"
  995.       HELP.EXTENSION$            = "HLP"
  996.       HELP.FILE.PREFIX$          = "HELP0"
  997.       HELP.PATH$                 = D$
  998.       HOST.ECHO.OFF$             = ""
  999.       HOST.ECHO.ON$              = ""
  1000.       IB                         = 0
  1001.       KEEP.INIT.BAUD             = FALSE
  1002.       KEEP.TIME.CREDITS          = FALSE
  1003.       LAST.NAME.PROMPT$          = "LAST name"
  1004.       LEN.HASH                   = 31
  1005.       LEN.INDIV                  = 0
  1006.       LIBRARY.ARCHIVE.PATH$        = D$
  1007.       LIBRARY.ARCHIVE.PROGRAM$     = "ARCA "
  1008.       LIBRARY.COMMANDS.DEFAULTS$   = "ACDGLSV"
  1009.       LIBRARY.COMMANDS$            = LIBRARY.COMMANDS.DEFAULTS$
  1010.       LIBRARY.DRIVE$               = ""
  1011.       LIBRARY.MAX.DISK             = 705
  1012.       LIBRARY.MAX.DIRECTORY        = 7
  1013.       LIBRARY.MAX.SUBDIR           = 100
  1014.       LIBRARY.SUBDIR.PREFIX$       = "DISK"
  1015.       LIBRARY.DIRECTORY.PATH$      = D$
  1016.       LIBRARY.DIRECTORY.EXTENTION$ = "CDR"
  1017.       LIBRARY.FUNCTION$(1,1)       = "A)rchive a Library disk  "
  1018.       LIBRARY.FUNCTION$(2,1)       = "C)hange Library disk     "
  1019.       LIBRARY.FUNCTION$(3,1)       = "D)ownload a file         "
  1020.       LIBRARY.FUNCTION$(4,1)       = "G)oodbye                 "
  1021.       LIBRARY.FUNCTION$(5,1)       = "L)ist a file directory   "
  1022.       LIBRARY.FUNCTION$(6,1)       = "S)earch files            "
  1023.       LIBRARY.FUNCTION$(7,1)       = "V)erbose archive list    "
  1024.       LIBRARY.FUNCTION$(1,2)       = "A"
  1025.       LIBRARY.FUNCTION$(2,2)       = "C"
  1026.       LIBRARY.FUNCTION$(3,2)       = "D"
  1027.       LIBRARY.FUNCTION$(4,2)       = "G"
  1028.       LIBRARY.FUNCTION$(5,2)       = "L"
  1029.       LIBRARY.FUNCTION$(6,2)       = "S"
  1030.       LIBRARY.FUNCTION$(7,2)       = "V"
  1031.       LIBRARY.WORK.DISK.PATH$      = D$
  1032.       LIMIT.SEARCH.TO.FMS        = FALSE
  1033.       LOGON.MAIL.LEVEL$          = "A"
  1034.       LSB                        = 1016
  1035. 60390 MACRO.DRVPATH$             = D$
  1036.       MACRO.EXTENSION$           = ""
  1037.       MAIN.COMMANDS.DEFAULTS$    = "ABCDEFIJKOPRSTUVW@"
  1038.       MAIN.COMMANDS$             = MAIN.COMMANDS.DEFAULTS$
  1039.       MAIN.FUNCTION$(1,1)        = "A)nswer questionnaire  "
  1040.       MAIN.FUNCTION$(2,1)        = "B)ulletins             "
  1041.       MAIN.FUNCTION$(3,1)        = "C)omments              "
  1042.       MAIN.FUNCTION$(4,1)        = "D)oor subsystem        "
  1043.       MAIN.FUNCTION$(5,1)        = "E)nter message         "
  1044.       MAIN.FUNCTION$(6,1)        = "F)iles subsystem       "
  1045.       MAIN.FUNCTION$(7,1)        = "I)nitial welcome       "
  1046.       MAIN.FUNCTION$(8,1)        = "J)oin a conference     "
  1047.       MAIN.FUNCTION$(9,1)        = "K)ill messages         "
  1048.       MAIN.FUNCTION$(10,1)       = "O)perator page         "
  1049.       MAIN.FUNCTION$(11,1)       = "P)ersonal mail         "
  1050.       MAIN.FUNCTION$(12,1)       = "R)ead messages         "
  1051.       MAIN.FUNCTION$(13,1)       = "S)can messages header  "
  1052.       MAIN.FUNCTION$(14,1)       = "T)opic msg scan        "
  1053.       MAIN.FUNCTION$(15,1)       = "U)tilities subsystem   "
  1054.       MAIN.FUNCTION$(16,1)       = "V)iew conference mail  "
  1055.       MAIN.FUNCTION$(17,1)       = "W)ho's on other nodes  "
  1056.       MAIN.FUNCTION$(18,1)       = "@)Library subsystem    "
  1057.       MAIN.FUNCTION$(1,2)        = "A"
  1058.       MAIN.FUNCTION$(2,2)        = "B"
  1059.       MAIN.FUNCTION$(3,2)        = "C"
  1060.       MAIN.FUNCTION$(4,2)        = "D"
  1061.       MAIN.FUNCTION$(5,2)        = "E"
  1062.       MAIN.FUNCTION$(6,2)        = "F"
  1063.       MAIN.FUNCTION$(7,2)        = "I"
  1064.       MAIN.FUNCTION$(8,2)        = "J"
  1065.       MAIN.FUNCTION$(9,2)        = "K"
  1066.       MAIN.FUNCTION$(10,2)       = "O"
  1067.       MAIN.FUNCTION$(11,2)       = "P"
  1068.       MAIN.FUNCTION$(12,2)       = "R"
  1069.       MAIN.FUNCTION$(13,2)       = "S"
  1070.       MAIN.FUNCTION$(14,2)       = "T"
  1071.       MAIN.FUNCTION$(15,2)       = "U"
  1072.       MAIN.FUNCTION$(16,2)       = "V"
  1073.       MAIN.FUNCTION$(17,2)       = "W"
  1074.       MAIN.MESSAGE.BACKUP$       = D$ + "MESSAGES.BAK"
  1075.       MAIN.MESSAGE.FILE$         = D$ + "MESSAGES"
  1076.       MAIN.PUI$                  = D$ + "MAIN.PUI"
  1077.       MAIN.USER.FILE$            = D$ + "USERS"
  1078.       MASTER.DIRECTORY.NAME$     = ""
  1079.       MAX.ALLOWED.MSGS.FRM.DEF   = 5
  1080.       MAX.CARRIER.WAIT           = 30
  1081.       MAX.DESC.LEN               = 40
  1082.       MAX.EXTENDED.LINES         = 2
  1083.       MAX.MESSAGE.LINES          = 19
  1084.       MAX.PER.DAY                = 0
  1085.       MAX.REG.SEC                = 0
  1086.       MAX.USR.FILE.SIZE.FRM.DEF  = 16
  1087.       MAX.WORK.VAR               = 30
  1088.       MAXD                       = 15
  1089.       MAXIMUM.DISPLAYABLE.PAGES  = 17
  1090.       MAXIMUM.PASSWORD.CHANGES   = 3
  1091.       MAXIMUM.VIOLATIONS         = 5
  1092.       MAXIMUM.NUMBER.OF.NODES    = 1
  1093.       MENU$(1)                   = D$ + "MENU1"
  1094.       MENU$(2)                   = D$ + "MENU2"
  1095.       MENU$(3)                   = D$ + "MENU3"
  1096.       MENU$(4)                   = D$ + "MENU4"
  1097.       MENU$(5)                   = D$ + "MENU5"
  1098.       MENU$(6)                   = D$ + "MENU6"
  1099.       MENUS.CAN.PAUSE            = TRUE
  1100.       MESSAGE.REMINDER           = TRUE
  1101.       MESSAGES.CAN.GROW          = FALSE
  1102.       MIN.NEWCALLER.BAUD         = 0
  1103.       MIN.OLDCALLER.BAUD         = 0
  1104.       MIN.SEC.TO.VIEW            = DEFAULT.SECURITY.LEVEL
  1105.       MINIMUM.LOGON.SECURITY     = 0
  1106.       MINIMUM.SECURITY.FOR.TEMP.PASSWORD = 5
  1107.       MINUTES.PER.SESSION!       = 72
  1108.       MLCOM                      = FALSE
  1109.       MM                         = 5
  1110.       MO$                        = DD$
  1111.       MODEM.ANSWER.COMMAND$      = "ATQ0X1V1A"
  1112.       MODEM.COMMAND.DELAY.TIME   = 1
  1113.       MODEM.COUNT.RINGS.COMMAND$ = "ATS1?"
  1114.       MODEM.GO.OFFHOOK.COMMAND$  = "ATQ1E1H1M0"
  1115.       MODEM.INIT.BAUD$           = "300"
  1116.       MODEM.INIT.COMMAND$        = "ATM0Q1S2=255S10=30E0Q0X1S0=254  "
  1117.       MODEM.INIT.WAIT.TIME       = 2
  1118.       MODEM.RESET.COMMAND$       = "ATZ"
  1119.       MUSIC                      = FALSE
  1120.       NET.MAIL$                  = "<none>"
  1121.       NETWORK.TYPE               = 0
  1122.       NETWORK.TYPE$              = "IBM's DOS"
  1123.       NEW.FILES.CHECK            = FALSE
  1124.       NEW.USER.QUESTIONNAIRE$    = D$ + "RBBS-REG.DEF"
  1125.       NEWUSER.FILE$              = D$ + "NEWUSER"
  1126.       NEWUSER.SETS.DEFAULTS      = TRUE
  1127.       OMIT.MAIN.DIRECTORY$       = "NO"
  1128.       OMIT.UPLOAD.DIRECTORY$     = "NO"
  1129.       OVERWRITE.SECURITY.LEVEL   = SYSOP.SECURITY.LEVEL
  1130.       PAGE.LENGTH                = 23
  1131.       PAGING.PRINTER.SUPPORT$    = ". "
  1132.       PASSWORD.FILE$             = D$ + "PASSWRDS"
  1133.       PCJR                       = FALSE
  1134.       PERSONAL.BEGIN             = 1
  1135.       PERSONAL.DIR$              = D$+"PRIV.DEF"
  1136.       PERSONAL.DRVPATH$          = D$
  1137.       PERSONAL.LEN               = 31
  1138.       PERSONAL.CONCAT            = FALSE
  1139.       PRELOG$                    = D$ + "PRELOG"
  1140.       PRIVATE.READ.SEC           = DEFAULT.SECURITY.LEVEL
  1141.       PROTO.DEF$                 = D$ + "PROTO.DEF"
  1142.       PROMPT.BELL                = 0
  1143.       PROMPT.HASH$               = "Name"
  1144.       PROMPT.INDIV$              = ""
  1145.       PS                         = 5
  1146.       PUBLIC.READ.SEC            = DEFAULT.SECURITY.LEVEL
  1147.       QUES.PATH$                 = D$
  1148.       RBBS.BAT$                  = D$ + "RBBS" + NODE.ID$ + ".BAT"
  1149.       RBBS.NAME$                 = "RBBS-PC"
  1150.       RCTTY.BAT$                 = D$ + "RCTTY" + NODE.ID$ + ".BAT"
  1151.       RECYCLE.TO.DOS             = 0
  1152.       RECYCLE.TO.DOS$            = "INTERNAL"
  1153.       RECYCLE.WAIT               = 0
  1154.       REDIRECT.IO.METHOD         = TRUE
  1155.       REGISTRATION.PROGRAM$      = "<none>"
  1156.       REMEMBER.NEW.USERS         = TRUE
  1157.       REMIND.FILE.TRANSFERS      = FALSE
  1158.       REMIND.PROFILE             = FALSE
  1159.       REQUIRE.NON.ASCII          = TRUE
  1160.       REQUIRED.QUESTIONNAIRE$    = "<none>"
  1161.       REQUIRED.RINGS             = 1
  1162.       RESTRICT.BAUD              = FALSE
  1163.       RESTRICT.BY.DATE           = FALSE
  1164.       RESTRICT.VALID.CMDS        = FALSE
  1165.       RTS$                       = "NO"
  1166.       SCREEN.OUT.MSG$            = "SEEN-BY: "
  1167.       SEC.CHANGE.MSG             = SYSOP.SECURITY.LEVEL
  1168.       SEC.LVL.EXEMPT.FRM.PURGING = SYSOP.SECURITY.LEVEL
  1169.       SECVIO.HLP$                = D$ + "SECVIO." + HELP.EXTENSION$
  1170.       SECURITY.EXEMPT.FROM.EPILOG= DEFAULT.SECURITY.LEVEL + 1
  1171.       SF                         = SYSOP.SECURITY.LEVEL
  1172.       SHOOT.YOURSELF             = FALSE
  1173.       SHOW.SECTION               = TRUE
  1174.       SIZE.OF.STACK              = 1024
  1175.       SL.CATEGORIZE.UPLOADS      = SYSOP.SECURITY.LEVEL
  1176.       SMART.TEXT                 = 123
  1177.       START.HASH                 = 1
  1178.       START.INDIV                = 0
  1179.       START.OFFICE.HOURS         = 800
  1180.       SURVIVE.NOUSER.ROOM        = FALSE
  1181.       SWITCH.BACK                = FALSE
  1182.       SYSOP.COMMANDS.DEFAULTS$   = "1234567"
  1183.       SYSOP.COMMANDS$            = SYSOP.COMMANDS.DEFAULTS$
  1184.       SYSOP.FUNCTION$(1,1)       = " 1 List comments      "
  1185.       SYSOP.FUNCTION$(2,1)       = " 2 List CALLERS log   "
  1186.       SYSOP.FUNCTION$(3,1)       = " 3 Recover a message  "
  1187.       SYSOP.FUNCTION$(4,1)       = " 4 Erase comments     "
  1188.       SYSOP.FUNCTION$(5,1)       = " 5 User maintenance   "
  1189.       SYSOP.FUNCTION$(6,1)       = " 6 Toggle Page bell   "
  1190.       SYSOP.FUNCTION$(7,1)       = " 7 Exit to DOS        "
  1191.       SYSOP.FUNCTION$(1,2)       = " 1"
  1192.       SYSOP.FUNCTION$(2,2)       = " 2"
  1193.       SYSOP.FUNCTION$(3,2)       = " 3"
  1194.       SYSOP.FUNCTION$(4,2)       = " 4"
  1195.       SYSOP.FUNCTION$(5,2)       = " 5"
  1196.       SYSOP.FUNCTION$(6,2)       = " 6"
  1197.       SYSOP.FUNCTION$(7,2)       = " 7"
  1198.       SYSOP.FIRST.NAME$          = "TOM"
  1199.       SYSOP.LAST.NAME$           = "MACK"
  1200.       SYSOP.MENU.SECURITY.LEVEL  = SYSOP.SECURITY.LEVEL
  1201.       SYSOP.PASSWORD.1$          = "RBBS-PC"
  1202.       SYSOP.PASSWORD.2$          = "CPC173"
  1203.       TIME.TO.DROP.TO.DOS        = 0
  1204.       TRASHCAN.FILE$             = D$ + "TRASHCAN"
  1205.       TURN.PRINTER.OFF           = FALSE
  1206.       TURBO.RBBS                 = TRUE
  1207.       UE                         = 5
  1208.       FMS.DIRECTORY$             = ""
  1209.       UPCAT.HELP$                = "UPCAT"
  1210.       UPLOAD.DIRECTORY$          = "99"
  1211.       UPLOAD.PATH$               = D$
  1212.       UPLOAD.SUBDIR$             = ""
  1213.       UPLOAD.TIME.FACTOR!        = 0
  1214.       UPLOAD.TO.SUBDIR           = FALSE
  1215.       USE.BASIC.WRITES           = FALSE
  1216.       USE.DEVICE.DRIVER$         = ""
  1217.       USER.INITIALIZE.COMMAND$   = "AT&C1&D3B1E0V1M0S0=0&T5"
  1218.       USER.FIRMWARE.CLEAR.CMND$  = "AT&F"
  1219.       USER.FIRMWARE.WRITE.CMND$  = "&W"
  1220.       USER.LOCATION$             = "CITY and STATE"
  1221.       UTIL.COMMANDS.DEFAULTS$    = "BCEFGLMPRSTU"
  1222.       UTIL.COMMANDS$             = UTIL.COMMANDS.DEFAULTS$
  1223.       UTILITY.FUNCTION$(1,1)     = "B)aud rate            "
  1224.       UTILITY.FUNCTION$(2,1)     = "C)lock (time)         "
  1225.       UTILITY.FUNCTION$(3,1)     = "E)cho                 "
  1226.       UTILITY.FUNCTION$(4,1)     = "F)ile x-fer protocol  "
  1227.       UTILITY.FUNCTION$(5,1)     = "G)raphics             "
  1228.       UTILITY.FUNCTION$(6,1)     = "L)ines per page       "
  1229.       UTILITY.FUNCTION$(7,1)     = "M)sg margin setting   "
  1230.       UTILITY.FUNCTION$(8,1)     = "P)assword change      "
  1231.       UTILITY.FUNCTION$(9,1)     = "R)eview defaults      "
  1232.       UTILITY.FUNCTION$(10,1)    = "S)tatistics           "
  1233.       UTILITY.FUNCTION$(11,1)    = "T)oggle               "
  1234.       UTILITY.FUNCTION$(12,1)    = "U)ser log scan        "
  1235.       VOICE.TYPE                 = 0
  1236.       VOICE.TYPE$                = NONE.PICKED$
  1237.       XON.XOFF                   = FALSE
  1238.       FOR I = 1 TO LEN(UTIL.COMMANDS.DEFAULTS$)
  1239.          UTILITY.FUNCTION$(I,2) = MID$(UTIL.COMMANDS.DEFAULTS$,I,1)
  1240.       NEXT
  1241.       WAIT.BEFORE.DISCONNECT     = 180
  1242.       WELCOME.FILE$              = D$ + "WELCOME"
  1243.       WELCOME.INTERRUPTABLE      = TRUE
  1244.       WILL.SUBDIRS.B.USED        = FALSE
  1245.       WRITE.BUF.DEF              = 1024
  1246.       FOR I = 1 TO NUM.SYSOP
  1247.          SYSOP.FUNCTION(I) = SF
  1248.       NEXT
  1249.       FOR I = 1 TO NUM.MAIN
  1250.          MAIN.FUNCTION(I) = MM
  1251.       NEXT
  1252.       FOR I = 1 TO NUM.FILES
  1253.          FILES.FUNCTION(I) = FC
  1254.       NEXT
  1255.       FOR I = 1 TO NUM.LIBRARY
  1256.          LIBRARY.FUNCTION(I) = PS
  1257.       NEXT
  1258.       FOR I = 1 TO NUM.UTILITY
  1259.          UTILITY.FUNCTION(I) = UE
  1260.       NEXT
  1261.       FOR I = 1 TO NUM.GLOBAL
  1262.          GLOBAL.FUNCTION(I) = GB
  1263.       NEXT
  1264.       END SUB
  1265. '  $SUBTITLE: 'VOICETYPE - subroutine to select voice'
  1266. '  $PAGE
  1267. '
  1268. '  SUBROUTINE NAME    --  VOICETYPE
  1269. '
  1270. '  INPUT PARAMETERS   --  VOICE.TYPE
  1271. '                         VOICE.TYPE$
  1272. '                         SUBROUTINE.PARAMETER
  1273. '
  1274. '  OUTPUT PARAMETERS  --  VOICE.TYPE
  1275. '                         VOICE.TYPE$
  1276. '
  1277. '  SUBROUTINE PURPOSE --  TO SELECT THE RBBS-PC SUPPORTED VOICE
  1278. '                         SYNTHESIZERS
  1279. '
  1280.       SUB VOICETYPE STATIC
  1281.       ON SUBROUTINE.PARAMETER GOTO 60482,60484
  1282. 60482 CLS
  1283.       LOCATE 3,1
  1284.       PRINT "     RBBS-PC is supported in the following:"
  1285.       PRINT "            Voice Synthesizers"
  1286.       PRINT "          0. None"
  1287.       PRINT "          1. CompuTalker"
  1288.       PRINT "             B.G. MICRO"
  1289.       PRINT "             P.O. Box 280298"
  1290.       PRINT "             Dallas, Texas 75228"
  1291.       PRINT "          2. HearSay 1000"
  1292.       PRINT "             HEARSAY INC."
  1293.       PRINT "             1825 74th Street"
  1294.       PRINT "             Brooklyn, New York 11204"
  1295. 60483 CALL ASKRO("Select environment (0 to 2, [ENTER] quits)",24,X$)
  1296.       IF X$ = "" THEN _
  1297.          EXIT SUB
  1298.       VOICE.TYPE = VAL(X$)
  1299.       IF VOICE.TYPE < 0 OR VOICE.TYPE > 2 THEN _
  1300.          GOTO 60483
  1301. 60484 IF VOICE.TYPE = 0 THEN _
  1302.          VOICE.TYPE$ = NONE.PICKED$
  1303.       IF VOICE.TYPE = 1 THEN _
  1304.          VOICE.TYPE$ = "CompuTalker"
  1305.       IF VOICE.TYPE = 2 THEN _
  1306.          VOICE.TYPE$ = "HearSay 1000"
  1307.       END SUB
  1308. '  $SUBTITLE: 'ASKRO - ask a question at a specific row'
  1309. '  $PAGE
  1310. '
  1311. '  SUBROUTINE NAME    --  ASKRO
  1312. '
  1313. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1314. '                         ANS$           STRING TO PUT THE ANSWER IN
  1315. '                         STRNG$         STRING CONTAINING THE QUESTION
  1316. '                         RO             ROW TO ASK THE QUESTION ON
  1317. '
  1318. '  OUTPUT PARAMETERS  --  ANS$           RESPONSE FROM THE KEYBOARD
  1319. '
  1320. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AT A
  1321. '                         SPECIFIC ROW
  1322. '
  1323.       SUB ASKRO (STRNG$,RO,ANS$) STATIC
  1324. 61100 LOCATE RO,1
  1325.       PRINT SPACE$(79);
  1326.       LOCATE RO,5
  1327.       PRINT STRNG$;" ";
  1328.       LINE INPUT;ANS$
  1329.       END SUB
  1330. '  $SUBTITLE: 'GETINIT - get an integer'
  1331. '  $PAGE
  1332. '
  1333. '  SUBROUTINE NAME    --  GETINIT
  1334. '
  1335. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1336. '                         ANS            WHERE TO PUT THE ANSWER IN
  1337. '                         STRNG$         STRING CONTAINING THE QUESTION
  1338. '                         RO             ROW TO ASK THE QUESTION ON
  1339. '                         MIN            MINIMUM ACCEPTABLE NUMBER
  1340. '                         MAX            MAXIMUM ACCEPTABLE NUMBER
  1341. '
  1342. '  OUTPUT PARAMETERS  --  ANS            RESPONSE FROM THE KEYBOARD
  1343. '
  1344. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AT A
  1345. '                         SPECIFIC ROW AND GET AN INTEGER BACK
  1346. '
  1347.       SUB GETINIT (STRNG$,RO,MIN,MAX,ANS,CR) STATIC
  1348. 61110 LOCATE RO,1
  1349.       CR = FALSE
  1350.       ANS = MIN
  1351.       PRINT SPACE$(79);
  1352.       LOCATE RO,5
  1353.       PRINT STRNG$;" ";
  1354.       LINE INPUT;ANS$
  1355.       IF ANS$ = "" THEN _
  1356.          CR = TRUE : _
  1357.          EXIT SUB
  1358.       IF VAL(ANS$) < MIN OR _
  1359.          VAL(ANS$) > MAX THEN _
  1360.          GOTO 61110
  1361.       ANS = VAL(ANS$)
  1362.       IF ANS = 0 AND LEFT$(ANS$,1) <> "0" THEN _
  1363.          GOTO 61110
  1364.       END SUB
  1365. '  $SUBTITLE: 'GETNUMYN - get a TRUE-FALSE answer to a YES OR NO question'
  1366. '  $PAGE
  1367. '
  1368. '  SUBROUTINE NAME    --  GETNUMYN
  1369. '
  1370. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1371. '                         STRNG$         STRING CONTAINING THE QUESTION
  1372. '
  1373. '  OUTPUT PARAMETERS  --  ANS            Returned value - -1 IF yes, 0 IF no
  1374. '
  1375. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AND GET A
  1376. '                         YES OR NO ANSWER CONVERTED TO TRUE/FALSE
  1377. '
  1378.        SUB GETNUMYN (STRNG$,ANS) STATIC
  1379.        CALL GETYESNO (STRNG$,ANS$)
  1380.        ANS = FNYESNO (ANS$)
  1381.        END SUB
  1382. '  $SUBTITLE: 'GETYESNO - Ask a YES OR NO question'
  1383. '  $PAGE
  1384. '
  1385. '  SUBROUTINE NAME    --  GETYESNO
  1386. '
  1387. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1388. '                         ANS$           STRING TO PUT THE ANSWER IN
  1389. '                         STRNG$         STRING CONTAINING THE QUESTION
  1390. '
  1391. '  OUTPUT PARAMETERS  --  ANS$           RESPONSE FROM THE KEYBOARD
  1392. '
  1393. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AND GET A
  1394. '                         YES OR NO ANSWER
  1395. '
  1396.       SUB GETYESNO (STRNG$,ANS$) STATIC
  1397. 61200 CALL ASKRO (STRNG$+" Y)es or N)o",24,HJ$)
  1398.       L = LEN(HJ$)
  1399.       IF L < 1 OR L > 3 THEN _
  1400.          GOTO 61207
  1401.       CALL ALLCAPS(HJ$)
  1402.       X = INSTR("NY",LEFT$(HJ$,1))
  1403.       ON X GOTO 61210,61212
  1404. 61207 BEEP
  1405.       GOTO 61200
  1406. 61210 ANS$ = "NO"
  1407.       EXIT SUB
  1408. 61212 ANS$ = "YES"
  1409.       EXIT SUB
  1410.       END SUB
  1411. '  $SUBTITLE: 'ALLCAPS - convert a sting into all capital letters'
  1412. '  $PAGE
  1413. '
  1414. '  SUBROUTINE NAME    --  ALLCAPS
  1415. '
  1416. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1417. '                         STRNG$         STRING CONTAINING THE QUESTION
  1418. '
  1419. '  OUTPUT PARAMETERS  --  STRNG$         CAPITALIZED STRING
  1420. '
  1421. '  SUBROUTINE PURPOSE --  TO CAPITALIZE A STRING
  1422. '
  1423.       SUB ALLCAPS (STRNG$) STATIC
  1424.       FOR Z = 1 TO LEN(STRNG$)
  1425.         MID$(STRNG$,Z,1) = CHR$(ASC(MID$(STRNG$,Z,1)) + _
  1426.                            32 * (ASC(MID$(STRNG$,Z,1)) > 96))
  1427.       NEXT
  1428.       END SUB
  1429. '  $SUBTITLE: 'ASKUPOS - find the unique user field for USERS'
  1430. '  $PAGE
  1431. '
  1432. '  SUBROUTINE NAME    --  ASKUPOS
  1433. '
  1434. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1435. '                         HDR$           HEADER
  1436. '                         BEGIN.COL      BEGINNING COLUMN OF FIELD
  1437. '                         FIELD.LEN      LENGTH OF FIELD IN USER'S RECORD
  1438. '                         PRMPT$         PROMPT TO GIVE FOR FIELD
  1439. '
  1440. '  OUTPUT PARAMETERS  --  ABOVE INPUTS UPDATED WITH USER'S RESPONSES
  1441. '
  1442. '  SUBROUTINE PURPOSE --  TO ASK THE SYSOP WHAT UNIQUE FIELD IN THE USERS
  1443. '                         RECORD IS TO BE ASKED FOR AT LOGON
  1444. '
  1445.       SUB ASKUPOS (HDR$,BEGIN.COL,FIELD.LEN,PRMPT$) STATIC
  1446.       CLS
  1447.       LOCATE 3,20
  1448.       PRINT HDR$;
  1449. 61300 LOCATE 6,5
  1450.       PRINT "1.  BEGINNING COLUMN in USERS file";TAB(44);STR$(BEGIN.COL);"   ";
  1451.       LOCATE 8,5
  1452.       PRINT "2.  Number of CHARACTERS to use";TAB(44);STR$(FIELD.LEN);"   ";
  1453.       LOCATE 10,5
  1454.       PRINT "3.  PROMPT to display to callers";TAB(45);PRMPT$;SPACE$(34-LEN(PRMPT$));
  1455. 61310 CALL ASKRO ("Select option to change (1-3, ENTER to end)",24,X$)
  1456.       IF X$ = "" THEN _
  1457.          EXIT SUB
  1458.       X = VAL(X$)
  1459.       IF X < 1 OR X > 3 THEN _
  1460.          GOTO 61310
  1461.       ON X GOTO 61320,61330,61340
  1462. 61320 CALL ASKRO ("New BEGINNING COLUMN",24,HJ$)
  1463.       IF HJ$ = "" THEN _
  1464.          GOTO 61320
  1465.       X = VAL(HJ$)
  1466.       IF X < 0 OR X > 128 THEN _
  1467.          GOTO 61320
  1468.       BEGIN.COL = X
  1469.       GOTO 61300
  1470. 61330 CALL ASKRO ("New # CHARACTERS to use",24,HJ$)
  1471.       IF HJ$ = "" THEN _
  1472.          GOTO 61330
  1473.       X = VAL(HJ$)
  1474.       IF X < 0 OR X > 31 THEN _
  1475.          GOTO 61330
  1476.       FIELD.LEN = X
  1477.       GOTO 61300
  1478. 61340 CALL ASKRO ("New PROMPT",24,HJ$)
  1479.       IF LEN(HJ$) > 34 THEN _
  1480.          GOTO 61340
  1481.       PRMPT$ = HJ$
  1482.       GOTO 61300
  1483.       END SUB
  1484. '  $SUBTITLE: 'ANYNUMBER - input any numeric value'
  1485. '  $PAGE
  1486. '
  1487. '  SUBROUTINE NAME    --  ANYNUMBER
  1488. '
  1489. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1490. '                         PRMPT$           PROMPT
  1491. '
  1492. '  OUTPUT PARAMETERS  --  RETURNED.VALUE!  VALUE RETURNED
  1493. '
  1494. '  SUBROUTINE PURPOSE --  TO GET A NUMERIC VALUE
  1495. '
  1496.       SUB ANYNUMBER (PRMPT$,RETURNED.VALUE!) STATIC
  1497. 61400 CALL ASKRO (PRMPT$,24,HJ$)
  1498.       RETURNED.VALUE! = VAL(HJ$)
  1499.       END SUB
  1500. '  $SUBTITLE: 'ANYINTEGER - input any integer value'
  1501. '  $PAGE
  1502. '
  1503. '  SUBROUTINE NAME    --  ANYINTEGER
  1504. '
  1505. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1506. '                         PRMPT$           PROMPT TO DISPLAY
  1507. '
  1508. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1509. '
  1510. '  SUBROUTINE PURPOSE --  TO GET AN INTEGER VALUE
  1511. '
  1512.       SUB ANYINTEGER (PRMPT$,RETURNED.VALUE) STATIC
  1513. 61450 CALL ANYNUMBER (PRMPT$,RETURNED.VALUE!)
  1514.       IF RETURNED.VALUE! >  32767.0 OR _
  1515.          RETURNED.VALUE! < -32767.0 THEN_
  1516.          BEEP : _
  1517.          GOTO 61450
  1518.       RETURNED.VALUE = RETURNED.VALUE!
  1519.       END SUB
  1520. '  $SUBTITLE: 'MMINTEGER - input any integer value with range check'
  1521. '  $PAGE
  1522. '
  1523. '  SUBROUTINE NAME    --  MMINTEGER
  1524. '
  1525. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1526. '                         PRMPT$           PROMPT
  1527. '                         MIN              MINIMUM VALUE (INCLUSIVE)
  1528. '                         MAX              MAXIMUM VALUE (INCLUSIVE)
  1529. '
  1530. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1531. '
  1532. '  SUBROUTINE PURPOSE --  TO GET AN INTEGER VALUE WITHIN A RANGE
  1533. '
  1534.       SUB MMINTEGER (PRMPT$,MIN,MAX,RETURNED.VALUE) STATIC
  1535. 61500 CALL ANYINTEGER (PRMPT$,RETURNED.VALUE)
  1536.       IF RETURNED.VALUE < MIN OR RETURNED.VALUE > MAX THEN _
  1537.          BEEP : _
  1538.          GOTO 61500
  1539.       END SUB
  1540. '  $SUBTITLE: 'MMREAL - input any single precision real # with range check'
  1541. '  $PAGE
  1542. '
  1543. '  SUBROUTINE NAME    --  MMREAL
  1544. '
  1545. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1546. '                         PRMPT$           PROMPT
  1547. '                         MIN!             MINIMUM VALUE (INCLUSIVE)
  1548. '                         MAX!             MAXIMUM VALUE (INCLUSIVE)
  1549. '
  1550. '  OUTPUT PARAMETERS  --  RETURNED.VALUE!  VALUE RETURNED
  1551. '
  1552. '  SUBROUTINE PURPOSE --  TO GET AN REAL # VALUE WITHIN A RANGE
  1553. '
  1554.       SUB MMREAL (PRMPT$,MIN!,MAX!,RETURNED.VALUE!) STATIC
  1555. 61550 CALL ANYNUMBER (PRMPT$,RETURNED.VALUE!)
  1556.       IF RETURNED.VALUE! < MIN! OR RETURNED.VALUE! > MAX! THEN _
  1557.          BEEP : _
  1558.          GOTO 61550
  1559.       END SUB
  1560. '  $SUBTITLE: 'FINDFILE - Determine whether a file exists'
  1561. '  $PAGE
  1562. '
  1563. '  SUBROUTINE NAME    --  FINDFILE
  1564. '
  1565. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1566. '                         FILNAME$         FILE TO LOOK FOR
  1567. '                         FEXISTS          WHETHER FILE EXISTS
  1568. '
  1569. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1570. '
  1571. '  SUBROUTINE PURPOSE --  DETERMINE WHETHER PASSED FILE NAME EXISTS
  1572. '                         RETURN TRUE OR FALSE IN "FEXISTS"
  1573. '
  1574.       SUB FINDFILE (FILNAME$,FEXISTS) STATIC
  1575. 61600 CALL RBBSFIND (FILNAME$,Z,Y,M,D)
  1576.       FEXISTS = (Z = 0)
  1577.       END SUB
  1578. '  $SUBTITLE: 'CHKFMSDIR - Validate structure of FMS directory'
  1579. '  $PAGE
  1580. '
  1581. '  SUBROUTINE NAME    --  CHKFMSDIR
  1582. '
  1583. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1584. '                         FMSDIR$         NAME OF FMS DIRECTORY
  1585. '                         LINELEN         PROPER LENGTH OF LINES
  1586. '                                         (EXCLUDING CR/LF AT END)
  1587. '                         FMS.DIRCAT$     CATEGORY FILE FOR FMS
  1588. '
  1589. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1590. '
  1591. '  SUBROUTINE PURPOSE --  VERIFIES THAT FMS IS IN VALID FORMAT
  1592. '                         AND DIAGNOSES PROBLEMS
  1593. '
  1594. 61700 SUB CHKFMSDIR (FMSDIR$,LINELEN,FMS.DIRCAT$) STATIC
  1595.       DIM CAT.CODE$(99)
  1596.       CLS
  1597.       LOCATE 5,20
  1598.       PRINT "Checking FMS file ";FMSDIR$;
  1599.       NLINES = 0
  1600.       LOCATE 7,27
  1601.       PRINT "Line #";
  1602.       LOCATE 9,20
  1603.       COLOR 0,7
  1604.       PRINT " Last Line with an ERROR ";
  1605.       LOCATE 12,28
  1606.       PRINT " Last ERROR ";
  1607.       COLOR 7,0
  1608.       NCATS = 0
  1609.       CALL FINDFILE (FMS.DIRCAT$,FEXISTS)
  1610.       IF FEXISTS THEN _
  1611.          NCATS = 1:_
  1612.          CAT.CODE$(1) = "***":_
  1613.          OPEN FMS.DIRCAT$ FOR INPUT AS #2 : _
  1614.          WHILE NOT EOF(2) AND NCATS < UBOUND(CAT.CODE$) :_
  1615.             NCATS = NCATS + 1:_
  1616.             INPUT #2,X$,Y$,X$:_
  1617.             CAT.CODE$(NCATS) = Y$:_
  1618.          WEND:_
  1619.          CLOSE 2
  1620.       GO.ON = -1
  1621.       CALL FINDFILE (FMSDIR$,FEXISTS)
  1622.       IF NOT FEXISTS THEN _
  1623.          LOCATE 6,25 : _
  1624.          PRINT "File not found"; : _
  1625.          GOTO 61750
  1626.       OPEN FMSDIR$ FOR INPUT AS #2
  1627.       WHILE NOT EOF(2) AND GO.ON
  1628.          NLINES = NLINES + 1
  1629.          LINE INPUT #2, A$
  1630.          L = LEN(A$)
  1631.          LOCATE 7,36
  1632.          PRINT NLINES;
  1633.          IF L > LINELEN THEN _
  1634.             CALL HANDERR (A$,NLINES,"Too LONG: has" + STR$(L) + " chars but should have" + STR$(LINELEN),GO.ON):_
  1635.             IF NOT GO.ON THEN _
  1636.                GOTO 61740
  1637.          IF L < LINELEN THEN _
  1638.             X$ = "Too SHORT: has" + STR$(L) + " chars but should have" + STR$(LINELEN) : _
  1639.             CALL HANDERR (A$,NLINES,X$,GO.ON):_
  1640.             IF NOT GO.ON THEN _
  1641.                GOTO 61740
  1642.          IF L > 0 THEN _
  1643.             IF INSTR ("\* ",LEFT$(A$,1)) THEN _
  1644.                GOTO 61740
  1645.          IF L > 30 THEN _
  1646.             X$ = MID$(A$,24,2) + _
  1647.                  MID$(A$,27,2) + _
  1648.                  MID$(A$,30,2) : _
  1649.             I = 1 : _
  1650.             WHILE I < 7 AND INSTR("0123456789",MID$(X$,I,1)) > 0 : _
  1651.                I = I + 1: _
  1652.             WEND: _
  1653.             IF I < 7 THEN _
  1654.                CALL HANDERR (A$,NLINES,"INVALID CHARACTER <" + MID$(X$,I,1) + "> in date field",GO.ON) : _
  1655.                IF NOT GO.ON THEN _
  1656.                   GOTO 61740
  1657.          I = 1
  1658.          Y$ = MID$(A$,L - 2)
  1659.          CALL REMOVE (Y$," ")
  1660.          WHILE I <= NCATS AND Y$ <> CAT.CODE$(I)
  1661.             I = I + 1
  1662.          WEND
  1663.          IF I > NCATS THEN _
  1664.             CALL HANDERR (A$,NLINES,"Category code <" + Y$ + "> NOT IN " + FMS.DIRCAT$,GO.ON)
  1665. 61740 WEND
  1666. 61750 CLOSE 2
  1667.       IF GO.ON THEN _
  1668.          LOCATE 15,15:_
  1669.          BEEP:_
  1670.          CALL ASKRO ("           Done checking.  Press [ENTER] to continue",20,ANS$)
  1671.       END SUB
  1672. '  $SUBTITLE: 'CHKPERSDIR - Validate personal directories'
  1673. '  $PAGE
  1674. '
  1675. '  SUBROUTINE NAME    --  CHKPERSDIR
  1676. '
  1677. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1678. '                         PDIR$           NAME OF PERSONAL DIRECTORY
  1679. '                         NAMELEN         PROPER LENGTH OF NAME FIELD
  1680. '
  1681. '  OUTPUT PARAMETERS  --  NONE
  1682. '
  1683. '  SUBROUTINE PURPOSE --  CHECKS PERSONAL DIRECTORY FOR PROPER FORMAT
  1684. '
  1685. 61755 SUB CHKPERSDIR (PDIR$, DESC.LEN, NAMELEN) STATIC
  1686.       CLS
  1687.       LOCATE 5, 21
  1688.       PRINT "Checking Personal Directory "; PDIR$;
  1689.       NLINES = 0
  1690.       LOCATE 7, 27
  1691.       PRINT "Line #";
  1692.       LOCATE 9, 20
  1693.       COLOR 0, 7
  1694.       PRINT " Last Line with an ERROR ";
  1695.       LOCATE 12, 28
  1696.       PRINT " Last ERROR ";
  1697.       COLOR 7, 0
  1698.       GO.ON = -1
  1699.       CALL FINDFILE(PDIR$, FEXISTS)
  1700.       IF NOT FEXISTS THEN _
  1701.          LOCATE 6, 25: _
  1702.          PRINT "File not found"; : _
  1703.          GOTO 61775
  1704.       LINELEN = 34 + DESC.LEN + NAMELEN
  1705.       OPEN PDIR$ FOR INPUT AS #2
  1706.       WHILE NOT EOF(2) AND GO.ON
  1707.          NLINES = NLINES + 1
  1708.          LINE INPUT #2, A$
  1709.          L = LEN(A$)
  1710.          LOCATE 7, 36
  1711.          PRINT NLINES;
  1712.          IF L > LINELEN THEN _
  1713.             CALL HANDERR(A$, NLINES, "Too LONG: has" + STR$(L) + " chars but should have" + STR$(LINELEN), GO.ON) : _
  1714.             IF NOT GO.ON THEN _
  1715.                GOTO 61770
  1716.          IF L < LINELEN THEN _
  1717.             CALL HANDERR(A$, NLINES, "Too SHORT: has" + STR$(L) + " chars but should have" + STR$(LINELEN), GO.ON) : _
  1718.                IF NOT GO.ON THEN _
  1719.                   GOTO 61770
  1720.          IF L > 30 THEN _
  1721.             X$ = MID$(A$, 24, 2) + MID$(A$, 27, 2) + MID$(A$, 30, 2) : _
  1722.             I = 1 : _
  1723.             WHILE I < 7 AND INSTR("0123456789", MID$(X$, I, 1)) > 0 : _
  1724.                I = I + 1 : _
  1725.             WEND : _
  1726.             IF I < 7 THEN _
  1727.                CALL HANDERR(A$, NLINES, "INVALID CHARACTER <" + MID$(X$, I, 1) + "> in date field", GO.ON) : _
  1728.                IF NOT GO.ON THEN _
  1729.                   GOTO 61770
  1730.            IF L = LINELEN THEN _
  1731.               X$ = RIGHT$(A$, 1) : _
  1732.               IF INSTR("*!", X$) = 0 THEN _
  1733.                  CALL HANDERR(A$, NLINES, "Last char on line should be * or ! but found <" + X$ + ">", GO.ON) : _
  1734.                  IF NOT GO.ON THEN  _
  1735.                     GOTO 61770
  1736.            IF L = LINELEN THEN _
  1737.               X$ = MID$(A$, L - NAMELEN, LINELEN) : _
  1738.               IF LEFT$(X$, 1) = " " THEN _
  1739.                  IF INSTR("0123456789-", MID$(X$, 2, 1)) = 0 THEN _
  1740.                     CALL HANDERR(A$, NLINES, "Name field at col" + STR$(L - NAMELEN) + " has <" + LEFT$(X$, 1) + ">, needs non-blank or blank+number", GO.ON) : _
  1741.                     IF NOT GO.ON THEN _
  1742.                        GOTO 61770
  1743. 61770 WEND
  1744. 61775 CLOSE 2
  1745.       IF GO.ON THEN _
  1746.          LOCATE 15, 15 : _
  1747.          BEEP : _
  1748.          CALL ASKRO("           Done checking.  Press [ENTER] to continue", 20, ANS$)
  1749.       END SUB
  1750. '  $SUBTITLE: 'HANDERR - subroutine to handle FMS errors'
  1751. '  $PAGE
  1752. '
  1753. '  SUBROUTINE NAME    -- HANDERR
  1754. '
  1755. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1756. '                        ERRLINE$                LINE THAT HAS THE ERROR
  1757. '                        ERRL                    LINE NUMBER WITH ERROR
  1758. '                        ERRMES$                 ERROR MESSAGE TO ISSUE
  1759. '
  1760. '  OUTPUT PARAMETERS  -- GO.ON                   INIDCATE TO PROCEDURE OR NOT
  1761. '
  1762. '  SUBROUTINE PURPOSE -- TO HANDLE ERROR CHECKING OF THE FMS DIRECTORY
  1763. '
  1764.       SUB HANDERR (ERRLINE$,ERRL,ERRMES$,GO.ON) STATIC
  1765.       LOCATE 10,1
  1766.       PRINT SPACE$(80);
  1767.       LOCATE 10,1
  1768.       PRINT ERRLINE$;
  1769.       LOCATE 9,45
  1770.       PRINT STR$(ERRL);
  1771.       LOCATE 13,1
  1772.       PRINT SPACE$(79);
  1773.       L = LEN(ERRMES$)
  1774.       IF L > 68 THEN _
  1775.          STRT = 1 _
  1776.       ELSE STRT = (70 - L) / 2
  1777.       LOCATE 13,STRT
  1778.       PRINT ERRMES$;
  1779.       CALL ASKRO ("               CONTINUE checking (Y/N,[ENTER]=Y) ",20,ANS$)
  1780.       IF ANS$ = "" THEN _
  1781.          ANS$ = "Y"
  1782.       CALL ALLCAPS (ANS$)
  1783.       GO.ON = FNYESNO (ANS$)
  1784.       END SUB
  1785. ' $SUBTITLE: 'REMOVE - subroutine to delete a string from within a string'
  1786. ' $PAGE
  1787. '
  1788. '  SUBROUTINE NAME    -- REMOVE
  1789. '
  1790. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1791. '                        BADSTRING$              STRING CONTAINING CHARACTERS
  1792. '                                                TO BE DELETED FROM "L$"
  1793. '                        L$                      STRING TO BE ALTERED
  1794. '
  1795. '  OUTPUT PARAMETERS  -- L$                      WITH THE CHARACTERS IN
  1796. '                                                "BADSTRING#" DELETED FROM IT
  1797. '
  1798. '  SUBROUTINE PURPOSE -- TO REMOVE ALL INSTANCES OF THE CHARACTERS IN
  1799. '                        "BADSTRING$" FROM "L$"
  1800. '
  1801.       SUB REMOVE (L$,BADSTRNG$) STATIC
  1802. 61800 J = 0
  1803.       FOR I = 1 TO LEN(L$)
  1804.          IF INSTR(BADSTRNG$,MID$(L$,I,1)) = 0 THEN_
  1805.             J = J + 1:_
  1806.             MID$(L$,J,1) = MID$(L$,I,1)
  1807.       NEXT I
  1808.       L$ = LEFT$(L$,J)
  1809.       END SUB
  1810. ' $SUBTITLE: 'GETASCII - subroutine to prompt for any ASCII values'
  1811. ' $PAGE
  1812. '
  1813. '  SUBROUTINE NAME    -- GETASCII
  1814. '
  1815. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1816. '                        TITLE$                  HEADER EXPANATION FOR PARAM
  1817. '
  1818. '  OUTPUT PARAMETERS  -- STRNG$                  RESULTANT CONFIG PARAMETER
  1819. '
  1820. '  SUBROUTINE PURPOSE -- ALLOWS ANY ASCII CHARACTER TO BE STORED IN A PARAMETER
  1821. '                        BY ENCLOSING IT IN SQUARE BRACKETS.  CHARACTERS NOT IN
  1822. '                        SQUARE BRACKETS ARE INTERPRETED EXACTLY AS ENTERED.
  1823. '                        CHARACTER'S ASCII VALUE EQUAL THE NUMERIC VALUE IN THE
  1824. '                        SQUARE BRACKETS.
  1825. '
  1826.       SUB GETASCII (TITLE$,STRNG$) STATIC
  1827. 61810 CLS
  1828.       LOCATE 8,30
  1829.       PRINT TITLE$;
  1830.       LOCATE 13,5
  1831.       PRINT "Current value is"
  1832.       PRINT STRNG$
  1833.       PRINT
  1834.       PRINT "Please enter the new values by entering the character"
  1835.       PRINT "or enclosing its ASCII value in square brackets:"
  1836.       PRINT "(Press ENTER to make empty)
  1837.       LINE INPUT "";HJ$
  1838.       STRNG$ = HJ$
  1839.       END SUB
  1840. ' $SUBTITLE: 'BRKFNAME - subroutine to decompose a file name'
  1841. ' $PAGE
  1842. '
  1843. '  SUBROUTINE NAME    -- BRKFNAME
  1844. '
  1845. '  INPUT PARAMETERS   -- PARAMETER                     MEANING
  1846. '                        FILENAME$       NAME OF THE FILE TO BE DECOMPOSED
  1847. '                        FOR.JOINING     INDICATOR IF OUTPUT IS TO BE COMPBINED
  1848. '
  1849. '  OUTPUT PARAMETERS  -- DRVPATH$        DRIVE AND PATH
  1850. '                        PREFIX$         8-CHARACTER FILE NAME PREFIX
  1851. '                        EXTENSION$      3-CHARACTER EXTENSION
  1852. '
  1853. '  SUBROUTINE PURPOSE -- BREAKS DOWN A FILE NAME INTO A DRIVE AND PATH,
  1854. '                        FILE PREFIX (8 CHARACTERS), AND FILE EXTENSION
  1855. '                        (3 CHARACTERS).  IF "FOR.JOINING" IS TRUE, THE
  1856. '                        DRIVE AND PATH HAVE A ":" AND A "\" IN IT AND
  1857. '                        THE EXTENSION BEGINS WITH A ".".
  1858. '
  1859.       SUB BRKFNAME (FILENAME$,DRVPATH$,PREFIX$,EXTENSION$,FOR.JOINING) STATIC
  1860. 61830 CALL ALLCAPS (FILENAME$)
  1861.       DRVPATH$ = ""
  1862.       PREFIX$ = ""
  1863.       EXTENSION$ = ""
  1864.       CALL TRIMTRAIL (FILENAME$,"\")
  1865.       IF LEN(FILENAME$) < 1 THEN _
  1866.          EXIT SUB
  1867.       CALL FINDLAST (FILENAME$,"\",X,Y)
  1868.       IF X < 1 THEN _
  1869.          IF MID$(FILENAME$,2,1) = ":" THEN _
  1870.             DRVPATH$ = LEFT$(FILENAME$,1): _
  1871.             S = 3 _
  1872.          ELSE S = 1 _
  1873.       ELSE DRVPATH$ = LEFT$(FILENAME$,X - 1) : _
  1874.            S = X + 1
  1875.       X = INSTR(FILENAME$+".",".")
  1876.       EXTENSION$ = MID$(FILENAME$,X + 1,3)
  1877.       PREFIX$ = MID$(FILENAME$,S,X - S)
  1878.       IF NOT FOR.JOINING THEN _
  1879.          EXIT SUB
  1880.       IF LEN(DRVPATH$) = 1 THEN _
  1881.          DRVPATH$ = DRVPATH$ + ":"
  1882.       IF INSTR(DRVPATH$,"\") > 0 THEN _
  1883.          DRVPATH$ = DRVPATH$ + "\"
  1884.       IF LEN(EXTENSION$) > 0 THEN _
  1885.          EXTENSION$ = "." + EXTENSION$
  1886.       END SUB
  1887. '
  1888. '  $SUBTITLE: 'TRIMTRAIL - subroutine to trim off trailing characters'
  1889. '  $PAGE
  1890. '
  1891. '  SUBROUTINE NAME    --  TRIMTRAIL
  1892. '
  1893. '  INPUT PARAMETERS   --  PARAMETER           MEANING
  1894. '                         TRIM.PARM$  TIME IN SECONDS AFTER MIDNIGHT TO WAIT
  1895. '                                     BEFORE DISPLAYING
  1896. '                         TRIM.THIS$  WHAT CHARACTER TO TRIM OFF END
  1897. '
  1898. '  OUTPUT PARAMETERS  --  NONE
  1899. '
  1900. '  SUBROUTINE PURPOSE --  TO DISPLAY RBBS-PC's SYSOP MENU ON THE LOCAL SCREEN
  1901. '
  1902. 61840 SUB TRIMTRAIL (TRIM.PARM$,TRIM.THIS$) STATIC
  1903.       WHILE RIGHT$(TRIM.PARM$,1) = TRIM.THIS$
  1904.          TRIM.PARM$ = LEFT$(TRIM.PARM$,LEN(TRIM.PARM$) - 1)
  1905.       WEND
  1906.       END SUB
  1907. ' $SUBTITLE: 'FINDLAST - subroutine to find last occurence of a string'
  1908. ' $PAGE
  1909. '
  1910. '  SUBROUTINE NAME    -- FINDLAST
  1911. '
  1912. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1913. '                        LOOK.IN$           STRING TO LOOK INTO
  1914. '                        LOOK.FOR$          STRING TO SEARCH FOR
  1915. '
  1916. '  OUTPUT PARAMETERS  -- WHERE.FOUND        POSITION IN LOOK.IN$ THAT
  1917. '                                            LOOK.FOR$ FOUND
  1918. '                        NUM.FINDS          HOW MANY OCCURENCES IN LOOK.IN$
  1919. '
  1920. '  SUBROUTINE PURPOSE -- FINDS THE LAST OCCURANCE OF "LOOK.FOR$" IN "LOOK.IN$"
  1921. '                        AND RETURNS COUNT OF NUMBER OF OCCURENCES.  IF NONE
  1922. '                        ARE FOUND, BOTH RETURNED PARAMETERS ARE ZERO.
  1923. '
  1924.       SUB FINDLAST (LOOK.IN$,LOOK.FOR$,WHERE.FOUND,NUM.FINDS) STATIC
  1925. 61850 WHERE.FOUND = INSTR(LOOK.IN$,LOOK.FOR$)
  1926.       NUM.FINDS = -(WHERE.FOUND > 0)
  1927.       NEXT.FOUND = INSTR(WHERE.FOUND + 1,LOOK.IN$,LOOK.FOR$)
  1928.       WHILE NEXT.FOUND > 0
  1929.          NUM.FINDS = NUM.FINDS + 1
  1930.          WHERE.FOUND = NEXT.FOUND
  1931.          NEXT.FOUND = INSTR(WHERE.FOUND + 1,LOOK.IN$,LOOK.FOR$)
  1932.       WEND
  1933.       END SUB
  1934. ' $SUBTITLE: 'SECURE - subroutine to assign security to commands'
  1935. ' $PAGE
  1936. '
  1937. '  SUBROUTINE NAME    -- SECURE
  1938. '
  1939. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1940. '                        SECTION$           NAME OF THE SECTION
  1941. '                        DEFAULTS$          DEFAULT COMMANDS FOR THE SECTION
  1942. '                        NUMBER.OF.COMMANDS NUMBER OF COMMANDS IN THE SECTION
  1943. '                        COMMANDS$()        CHARACTERS REPRESENTING THE ONE-
  1944. '                                              CHARACTER COMMANDS
  1945. '                        COMMANDS()         SECURITY LEVEL ASSOCIATED WITH
  1946. '                                           THE COMMAND
  1947. '                        SECTION.COMMANDS$  PROMPT STRING OF ALL COMMANDS IN
  1948. '                                             THE SECTION
  1949. '
  1950. '  OUTPUT PARAMETERS  -- COMMANDS$()        CHARACTERS REPRESENTING THE ONE-
  1951. '                                              CHARACTER COMMANDS
  1952. '                        COMMANDS()         SECURITY LEVEL ASSOCIATED WITH
  1953. '                                           THE COMMAND
  1954. '                        SECTION.COMMANDS$  PROMPT STRING OF ALL COMMANDS IN
  1955. '                                             THE SECTION
  1956. '
  1957. '  SUBROUTINE PURPOSE -- ALLOWS USERS TO MODIFY COMMANDS AND SECURITY FOR
  1958. '                        EACH COMMAND.
  1959. '
  1960.       SUB SECURE (SECTION$,DEFAULTS$,NUMBER.OF.COMMANDS,COMMANDS$(2),COMMANDS(1),SECTION.COMMANDS$) STATIC
  1961. 61860 IF IPAGE = 2 OR _
  1962.          VAL(OPTION$) = 310 THEN _
  1963.          XX$ = "ALL " + _
  1964.                SECTION$ + _
  1965.                " commands use default letters?" _
  1966.       ELSE XX$ = "ALL " + _
  1967.                SECTION$ + _
  1968.                " commands = SAME security level?"
  1969.       LOCATE 24,1
  1970.       PRINT SPACE$(79);
  1971.       LOCATE 24,1
  1972.       CALL GETNUMYN (XX$,AB)
  1973.       IF NOT AB THEN _
  1974.          GOTO 61880
  1975. 61870 IF IPAGE = 2 OR _
  1976.          VAL(OPTION$) = 310 THEN _
  1977.          SECTION.COMMANDS$ = DEFAULTS$ : _
  1978.          FOR I = 1 TO NUMBER.OF.COMMANDS : _
  1979.             COMMANDS$(I,2) = MID$(SECTION.COMMANDS$,I,1) : _
  1980.          NEXT : _
  1981.          EXIT SUB
  1982.       CALL MMINTEGER("Security level for all " + _
  1983.                       SECTION$ + _
  1984.                      " commands is?",-32767,32767,B1)
  1985.       FOR I = 1 TO NUMBER.OF.COMMANDS
  1986.          COMMANDS(I) = B1
  1987.       NEXT
  1988.       GB = B1
  1989.       EXIT SUB
  1990. 61880 GOSUB 61900
  1991.       IROW = 4
  1992.       ICOL = 10
  1993.       FOR I = 1 TO NUMBER.OF.COMMANDS
  1994.          LOCATE IROW + I,ICOL
  1995.          IF IPAGE = 2 OR _
  1996.             VAL(OPTION$) = 310 THEN _
  1997.             PRINT COMMANDS$(I,1);" ";COMMANDS$(I,2) _
  1998.          ELSE PRINT COMMANDS$(I,1);STR$(COMMANDS(I))
  1999.       NEXT
  2000. 61890 CALL ASKRO("Enter first character of command ([ENTER] quits)",24,X$)
  2001.       IF X$ = "" THEN _
  2002.          EXIT SUB
  2003.       IF LEN(X$) <> 1 THEN _
  2004.          GOTO 61890
  2005.       CALL ALLCAPS(X$)
  2006.       FF = INSTR(DEFAULTS$,X$)
  2007.       IF FF = 0 THEN _
  2008.          GOTO 61890
  2009.       IF IPAGE = 2 OR _
  2010.          VAL(OPTION$) = 310 THEN _
  2011.          GOTO 61892
  2012.       CALL MMINTEGER("Security level for all " + _
  2013.                       SECTION$ + _
  2014.                      " '" + _
  2015.                      X$ + _
  2016.                      "' commands is?",-32767,32767,B1)
  2017.       GOTO 61893
  2018. 61892 CALL ASKRO("New command for " + _
  2019.                   MID$(COMMANDS$(FF,1),1,INSTR(COMMANDS$(FF,1),"  ")) + _
  2020.                  "is?",24,HK$)
  2021.       X$ = MID$(HK$,1,1)
  2022.       CALL ALLCAPS (X$)
  2023.       IF LEN(HK$) > 1 THEN _
  2024.          HK$ = X$ + MID$(HK$,2)
  2025.       IF LEN (HK$) = 1 THEN _
  2026.          HK$ = X$
  2027.       COMMANDS$(FF,2) = HK$
  2028.       MID$(SECTION.COMMANDS$,FF,1) = HK$
  2029.       GOTO 61880
  2030. 61893 COMMANDS(FF) = B1
  2031.       GOTO 61880
  2032. '
  2033. ' * COMMON ROUTINE TO DISPLAY SUBSYSTEM COMMANDS AND THEIR SECURITY LEVELS
  2034. '
  2035. 61900 CLS
  2036.       I! = FRE(C$)
  2037.       COLOR 0,7,0
  2038.       LOCATE 1,23
  2039.       PRINT "RBBS-PC "+ CONFIG.VERSION$ + " Default Configuration";
  2040.       COLOR FG,BG,BORDER
  2041.       LOCATE  2,5
  2042.       PRINT "The RBBS-PC " + _
  2043.              SECTION$ + _
  2044.             " Commands are as follows:"
  2045.       LOCATE   3,10
  2046.       XX$ = "Command             Security"
  2047.       IF IPAGE = 2 OR _
  2048.          VAL(OPTION$) = 310 THEN _
  2049.          XX$ = "Description         Command"
  2050.       PRINT XX$
  2051.       RETURN
  2052.       END SUB
  2053. '  $SUBTITLE: 'GETCOLOR - get colors using natural language'
  2054. '  $PAGE
  2055. '
  2056. '  SUBROUTINE NAME    -- GETCOLOR
  2057. '
  2058. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  2059. '                        STRNG$             TITLE OF WHAT COLOR IS FOR
  2060. '                        NUM.COLOR          CURRENT COLOR SETTING
  2061. '
  2062. '  OUTPUT PARAMETERS  -- NUM.COLOR          NEW COLOR SETTING
  2063. '
  2064. '  SUBROUTINE PURPOSE -- SET THE COLOR USING NATURAL LANGUAGE PHRASES
  2065. '
  2066.       SUB GETCOLOR (STRNG$,NUM.COLOR) STATIC
  2067.       CLS
  2068. 61950 IF NUM.COLOR > 7 THEN _
  2069.          X = NUM.COLOR - 8 _
  2070.       ELSE X = NUM.COLOR
  2071.       X$ = MID$("<none>Blue  Green Cyan  Red   PurpleYellowWhite",X*6+1,6)
  2072.       LOCATE 9,15
  2073.       PRINT STRNG$;" now ";X$;"     ";
  2074. 61955 CALL ASKRO ("Make N)one,R)ed,G)reen,Y)ellow,B)lue,P)urple,C)yan,W)hite,[ENTER] quits",20,ANS$)
  2075.       IF ANS$ = "" THEN _
  2076.          EXIT SUB
  2077.       CALL ALLCAPS (ANS$)
  2078.       Y = INSTR("NBGCRPYW",ANS$) - 1
  2079.       IF Y < 0 THEN _
  2080.          GOTO 61955
  2081.       NUM.COLOR = Y
  2082.       GOTO 61950
  2083.       END SUB
  2084. ' $SUBTITLE: 'GETANSI - SUBROUTINE TO GET CALLERS COLOR VALUES'
  2085. ' $PAGE
  2086. '
  2087. '  SUBROUTINE NAME    -- GETANSI
  2088. '
  2089. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  2090. '                        SELECTION$       NAME OF SELECTION TO HAVE COLOR
  2091. '                        PRMPT$           WHAT TO PROMPT ON THE SCREEN
  2092. '
  2093. '  OUTPUT PARAMETERS  -- FG.1.DEF$        FIRST COLOR SELECTION
  2094. '                        FG.2.DEF$        SECOND COLOR SELECTION
  2095. '                        FG.3.DEF$        THIRD COLOR SELECTION
  2096. '                        FG.4.DEF$        FOURTH COLOR SELECTION
  2097. '
  2098. '  SUBROUTINE PURPOSE -- ASK THE SYSOP TO SELECT THE FOUR COLORS TO BE
  2099. '                        USED FOR CALLERS THAT SELECT COLOR DISPLAYS.
  2100. '
  2101.       SUB GETANSI (SELECTION$,PRMPT$) STATIC
  2102.       CLS
  2103. 62000 LOCATE 8,10
  2104.       PRINT PRMPT$;" Foreground for caller now ";SELECTION$;"       "
  2105.       LOCATE 10,1
  2106.       PRINT "Current foreground selections: ";
  2107.       CALL COLORCODE (FG.1.DEF$,X$,X)
  2108.       COLOR X,CALLER.BKGRD
  2109.       PRINT "First ";
  2110.       CALL COLORCODE (FG.2.DEF$,X$,X)
  2111.       COLOR X
  2112.       PRINT "Second ";
  2113.       CALL COLORCODE (FG.3.DEF$,X$,X)
  2114.       COLOR X
  2115.       PRINT "Third ";
  2116.       CALL COLORCODE (FG.4.DEF$,X$,X)
  2117.       COLOR X
  2118.       PRINT "Fourth"
  2119.       COLOR FG,BG
  2120. 62040 CALL ASKRO ("Make N)one,R)ed,G)reen,Y)ellow,B)lue,P)urple,C)yan,W)hite,[ENTER] quits",14,ANS$)
  2121.       IF ANS$ = "" THEN _
  2122.          EXIT SUB
  2123.       CALL ALLCAPS (ANS$)
  2124.       X = INSTR("NRGYBPCW",ANS$)
  2125.       IF X < 2 THEN _
  2126.          SELECTION$ = NONE.PICKED$ : _
  2127.          GOTO 62000
  2128.       X$ = MID$("Red   Green YellowBlue  PurpleCyan  White",X*6-11,6)
  2129.       CALL ASKRO ("Make "+X$+" [B]right, or N)ormal",17,ANS$)
  2130.       CALL ALLCAPS (ANS$)
  2131.       IF ANS$ <> "N" THEN _
  2132.          SELECTION$ = "Bright " + X$ _
  2133.       ELSE SELECTION$ = "Normal " + X$
  2134.       GOTO 62000
  2135.       END SUB
  2136. ' $SUBTITLE: 'COLORCODE - SUBROUTINE TO GET COLOR CODES'
  2137. ' $PAGE
  2138. '
  2139. '  SUBROUTINE NAME    -- COLORCODE
  2140. '
  2141. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  2142. '                        NAT.LANG.COLOR$  NATURAL LANGUAGE LETTER OF COLOR
  2143. '                                           N = NONE
  2144. '                                           B = BLUE
  2145. '                                           G = GREEN
  2146. '                                           C = CYAN
  2147. '                                           R = RED
  2148. '                                           P = PURPLE
  2149. '                                           Y = YELLOW
  2150. '                                           W = WHITE
  2151. '
  2152. '  OUTPUT PARAMETERS  -- ANSI.COLOR$      CORRECT CHARACTER SEQUENCE OF COLOR
  2153. '                        BASIC.FG         NUMBER FOR BASIC FORGROUND
  2154. '
  2155. '  SUBROUTINE PURPOSE -- TO CONVERT THE NATURAL LANGUAGE COLOR SELECTION INTO
  2156. '                        COLOR CODES THAT ARE MEANINGFUL.
  2157. '
  2158.       SUB COLORCODE (NAT.LANG.COLOR$,ANSI.COLOR$,BASIC.FG) STATIC
  2159.       BASIC.FG = 7
  2160.       IF NAT.LANG.COLOR$ = NONE.PICKED$ THEN _
  2161.          ANSI.COLOR$ = "" : _
  2162.          EXIT SUB
  2163.       X = INSTR(" BN",LEFT$(NAT.LANG.COLOR$,1))
  2164.       IF X < 2 THEN _
  2165.          EXIT SUB
  2166.       X$ = MID$("10",X-1,1)
  2167.       X = INSTR(NAT.LANG.COLOR$," ")
  2168.       IF X < 1 OR X >= LEN(NAT.LANG.COLOR$) THEN _
  2169.          EXIT SUB
  2170.       Z$ = MID$(NAT.LANG.COLOR$,X+1,1)
  2171.       X = INSTR("RGYBPCW",Z$)
  2172.       IF X < 1 THEN _
  2173.          EXIT SUB
  2174.       BASIC.FG = INSTR("BGCRPYW",Z$) - 8 * (X$="1")
  2175.       Y$ = MID$(STR$(30+X),2)
  2176.       Z = INSTR("NRGYBPCW",MID$("NBGCRPYW",CALLER.BKGRD+1,1))
  2177.       Z$ = MID$(STR$(39+Z),2)
  2178.       ANSI.COLOR$ = CHR$(27) + "[" + X$ + ";" + Z$ + ";" + Y$ + "m"
  2179.       END SUB
  2180. ' $SUBTITLE: 'ANSIDECODE - SUBROUTINE TO DECODE ANSI VALUES'
  2181. ' $PAGE
  2182. '
  2183. '  SUBROUTINE NAME    -- ANSIDECODE
  2184. '
  2185. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  2186. '                        ANSI.EXPRESSION$ EXPRESSION WITH ANSI COLOR CODES IN
  2187. '
  2188. '  OUTPUT PARAMETERS  -- ANSI.EXPRESSION$ ENGLISH LANGUAGE DESCRIPTION OF COLOR
  2189. '
  2190. '  SUBROUTINE PURPOSE -- DECODES THE ANSI EXPRESSION INTO A MEANINGFUL
  2191. '                        ENGLISH TEXT DESCRIPTION.
  2192. '
  2193.       SUB ANSIDECODE (ANSI.EXPRESSION$) STATIC
  2194.       IF LEN (ANSI.EXPRESSION$) < 3 THEN _
  2195.          EXIT SUB
  2196.       IF ASC(ANSI.EXPRESSION$) <> 27 THEN _
  2197.          EXIT SUB
  2198.       X = INSTR(ANSI.EXPRESSION$,";")
  2199.       IF X < 1 THEN _
  2200.          EXIT SUB
  2201.       IF MID$(ANSI.EXPRESSION$,X-1,1) = "1" THEN _
  2202.          X$ = "Bright " _
  2203.       ELSE X$ = "Normal "
  2204.       X = INSTR(X,ANSI.EXPRESSION$,"m")
  2205.       IF X < 1 THEN _
  2206.          EXIT SUB
  2207.       X = VAL(MID$(ANSI.EXPRESSION$,X-2,2)) - 30
  2208.       IF X < 1 OR X > 7 THEN _
  2209.          EXIT SUB
  2210.       ANSI.EXPRESSION$ = X$ + MID$("Red   Green YellowBlue  PurpleCyan  White",X*6-5,6)
  2211.       END SUB
  2212. 62100 ' set modem strings by selecting a modem
  2213.       SUB SELMODEM STATIC
  2214.       CALL FINDFILE ("MODEMS.SET",OK)
  2215.       IF NOT OK THEN _
  2216.          EXIT SUB
  2217. 62105 CLS
  2218.       LOCATE 5,15
  2219.       PRINT "Select the MODEM MODEL YOU ARE USING";
  2220.       LOCATE 7,10
  2221.       PRINT "Use Parameter 231 to initialize modem's firmware"
  2222.       IF NETWORK.TYPE = 6 THEN _
  2223.          OPEN "MODEMS.SET" FOR INPUT SHARED AS #2 _
  2224.       ELSE OPEN "I",2,"MODEMS.SET"
  2225.       ANS$ = ""
  2226.       WHILE NOT EOF(2) AND ANS$ <> "S"
  2227.          INPUT #2, MODEM.MODEL$, SWITCHES$
  2228.          FOR I = 1 TO 12
  2229.             INPUT #2,A$(I)
  2230.          NEXT
  2231.          LOCATE 10,10
  2232.          PRINT SPACE$(60);
  2233.          LOCATE 10,14
  2234.          PRINT "Model Modem: ";MODEM.MODEL$;
  2235.          LOCATE 12,10
  2236.          PRINT SPACE$(60);
  2237.          LOCATE 12,10
  2238.          PRINT "Switch Settings: ";SWITCHES$
  2239.          CALL ASKRO("S)elect this model (Enter for next choice)?",24,ANS$)
  2240.          CALL ALLCAPS (ANS$)
  2241.       WEND
  2242.       CLOSE 2
  2243.       IF ANS$ = "S" THEN _
  2244.          EXIT SUB
  2245.       GOTO 62105
  2246.       END SUB
  2247.