home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / database / entry141.zip / ENTRY.BAS next >
BASIC Source File  |  1991-02-18  |  27KB  |  1,155 lines

  1. '***************************************************************************
  2. '* ENTRY -- A simple editor for generating fixed field data files          *
  3. '*          written in QuickBASIC 4.5  COLOR VERSION 1.41                  *
  4. '*         (c) 1988, 1990 by DAVID WESSON, PhD.                            *
  5. '***************************************************************************
  6. '
  7. ' $INCLUDE: 'entry.dec'
  8. '
  9. '============================ PROGRAM STARTS ===============================
  10.     OPTION BASE 1
  11.     CLS
  12.     initialize
  13.     header
  14.     readcommandline
  15.     filebusiness
  16.     savebakfile
  17.     DO
  18.         menuroutine
  19.     LOOP
  20. '============================ PROGRAM ENDS ==================================
  21.  
  22. SUB autosave STATIC
  23.     savecursor
  24.     IF saveinterval = 0 THEN EXIT SUB
  25.     IF time2 >= (time1 + saveinterval) THEN
  26.         time1 = time2
  27.         savebakfile
  28.         OPEN outfile$ FOR APPEND AS #1
  29.     END IF
  30.     LOCATE saverow, savecol
  31. END SUB
  32.  
  33. SUB checkname STATIC
  34.     COLOR fore, back
  35.     CLS 2
  36.     askname$ = "Datafile: " + infile$ + "   [Return] use this name, [Space] use new name."
  37.     prompt askname$
  38.     getkey
  39.     in$ = UCASE$(in$)
  40.     SELECT CASE in$
  41.         CASE enter$
  42.             EXIT SUB
  43.         CASE esc$
  44.             EXIT SUB
  45.         CASE CHR$(32)
  46.             numcases = 0
  47.             datalines = 0
  48.             getfilename
  49.             filebusiness
  50.         CASE ELSE
  51.             checkname
  52.     END SELECT
  53. END SUB
  54.  
  55. SUB clear25 STATIC
  56.      LOCATE 25, 1
  57.      COLOR back, fore
  58.      PRINT SPACE$(80);
  59. END SUB
  60.  
  61. SUB clearcard STATIC
  62.     COLOR black, fore
  63.     LOCATE 8, col
  64.     PRINT CHR$(32);
  65.     FOR x = 0 TO 9
  66.         LOCATE 10 + x, col
  67.         PRINT MID$(STR$(x), 2, 1);
  68.     NEXT x
  69.     LOCATE 20, col
  70.     PRINT CHR$(32)
  71.     LOCATE row, col
  72. END SUB
  73.  
  74. SUB click STATIC
  75.     IF soundonoff = 0 THEN
  76.         EXIT SUB
  77.         ELSE s = VAL(data$(col))
  78.         SOUND (210 + (s * 32)), .6
  79.     END IF
  80. END SUB
  81.  
  82. SUB counter STATIC
  83.     savecursor
  84.     IF escape = 0 THEN
  85.         COLOR fore, back
  86.         LOCATE row - 1, 1
  87.         PRINT SPACE$(80)
  88.         LOCATE row - 1, col
  89.         COLOR 26, back
  90.         PRINT CHR$(24)
  91.         LOCATE saverow, savecol
  92.     END IF
  93. END SUB
  94.  
  95. SUB cursor (value) STATIC
  96.     SELECT CASE value
  97.         CASE 0
  98.             LOCATE , , 0, 0, 0
  99.         CASE 1
  100.             LOCATE , , 1, 6, 7
  101.     END SELECT
  102. END SUB
  103.  
  104. SUB dataroutine STATIC
  105.     DO
  106.         COLOR fore, back
  107.         LOCATE 3, 1: PRINT "CASE:"; numcases
  108.         LOCATE 4, 1: PRINT "LINE:"; card
  109.         LOCATE 6, 1: PRINT SPACE$(80)
  110.         LOCATE 6, 1: PRINT cardset$(card)
  111.         filecard row
  112.         col = 1
  113.         eol = 0
  114.         COLOR 0, 6
  115. GetCase:
  116.         DO
  117.             readcolumn
  118.             IF eol = 1 THEN EXIT DO
  119.             LOCATE row, col
  120.             counter
  121.             numpadscan
  122.             COLOR 0, 6
  123.             getkey
  124.             SELECT CASE in$
  125.                 CASE "EOL"
  126.                     EXIT DO
  127.                 CASE enter$
  128.                     filecard row
  129.                     col = 1
  130.                 CASE esc$
  131.                     datalines = datalines - 1
  132.                     numberpad 0
  133.                     cursor 0
  134.                     COLOR fore, back
  135.                     CLS 2
  136.                     CLOSE
  137.                     makedeffile
  138.                     EXIT SUB
  139.                 CASE bksp$
  140. BackUp:
  141.                     IF col > 1 THEN
  142.                             col = col - 1
  143.                             clearcard
  144.                             IF column$(col, card) = "C" OR column$(col, card) = "P" OR column$(col, card) = "B" THEN GOTO BackUp
  145.                         ELSE BEEP
  146.                     END IF
  147.                 CASE lft$
  148. LeftSpace:
  149.                     IF col > 1 THEN
  150.                             col = col - 1
  151.                             LOCATE row, col
  152.                             IF column$(col, card) = "C" OR column$(col, card) = "P" OR column$(col, card) = "B" THEN GOTO LeftSpace
  153.                         ELSE BEEP
  154.                     END IF
  155.                 CASE rght$
  156.                     IF col < 80 THEN
  157.                             col = col + 1
  158.                             LOCATE row, col
  159.                         ELSE BEEP
  160.                     END IF
  161.                 CASE home$
  162.                     LOCATE row, 1
  163.                     col = 1
  164.                     IF column$(1, card) = "C" THEN LOCATE row, 5: col = 5
  165.                 CASE end$
  166.                     col = LEN(cardset$(card))
  167.                     IF column$(col, card) = "+" THEN col = col - 1
  168.                     LOCATE row, col
  169.                 CASE fkey$(1)
  170.                     savecursor
  171.                     minihelp
  172.                     LOCATE saverow, savecol
  173.                 CASE fkey$(2)
  174.                     savecursor
  175.                     COLOR fore, back
  176.                     LOCATE 21, 1: PRINT SPACE$(320)
  177.                     LOCATE saverow, savecol
  178.                 CASE fkey$(3) TO fkey$(10)
  179.                     BEEP
  180.                 CASE delete$
  181.                     IF data$(col) < CHR$(58) THEN clearcard
  182.                         data$(col) = CHR$(32)
  183.                         LOCATE row, col
  184.                         PRINT CHR$(32);
  185.                         col = col + 1
  186.                 CASE insert$
  187.                     IF data$(col) < CHR$(58) THEN clearcard
  188.                     data$(col) = CHR$(32)
  189.                     LOCATE row, col
  190.                     PRINT CHR$(32);
  191.                 CASE plus$
  192.                     b = INSTR(col, cardset$(card), "B")
  193.                     p = INSTR(col, cardset$(card), "P")
  194.                     IF b = 0 AND p = 0 THEN
  195.                         col = LEN(cardset$(card)) + 1
  196.                     ELSEIF p = 0 OR b = 0 THEN
  197.                         IF p = 0 THEN col = b
  198.                         IF b = 0 THEN col = p
  199.                     ELSE
  200.                         IF p < b THEN col = p
  201.                         IF b < p THEN col = b
  202.                     END IF
  203.                     LOCATE row, col
  204.                 CASE ELSE
  205.                     IF column$(col, card) = "N" AND (in$ < CHR$(32) OR in$ > CHR$(58)) THEN BEEP: GOTO GetCase
  206.                     data$(col) = UCASE$(in$)
  207.                     clearcard
  208.                     LOCATE row, col
  209.                     PRINT data$(col);
  210.                     IF data$(col) < CHR$(58) AND data$(col) > CHR$(42) THEN punch
  211.                     col = col + 1
  212.             END SELECT
  213.         LOOP
  214.     LOOP UNTIL numcases = 10000
  215. END SUB
  216.  
  217. SUB editline25 STATIC
  218.     clear25
  219.     LOCATE 25, 1
  220.     COLOR high, fore
  221.     PRINT "   [Esc] MENU  "; CHR$(179);
  222.     PRINT "   [F1]  MiniHelp  "; CHR$(179);
  223.     PRINT "   NumberPad: ";
  224.     COLOR back, fore
  225.     PRINT pad$;
  226.     COLOR high, fore
  227.     PRINT "  "; CHR$(179);
  228.     PRINT "   Autosave:"; saveinterval; "sec.";
  229. END SUB
  230.  
  231. SUB editlines STATIC
  232. Top:
  233.     LOCATE 3, 1: PRINT "Datafile: "; outfile$;
  234.     PRINT TAB(40); "Total Cases:"; numcases; TAB(60); "Cards per Case:"; card
  235.     prompt "Hit any key to edit a card, or [Esc] to EXIT."
  236.     LOCATE 25, 1
  237.     getkey
  238.     IF in$ = esc$ THEN EXIT SUB
  239.     COLOR fore, back
  240.     cursor 1
  241.     numberpad 1
  242.     prompt "Edit CASE:          CARD:  "
  243.     LOCATE 25, 37
  244.     keyin 4
  245.         IF k$ = "" THEN k$ = STR$(editcase)
  246.         IF in$ = esc$ THEN EXIT SUB
  247.         editcase = VAL(k$)
  248.         IF editcase = 0 THEN editcase = 1
  249.     LOCATE 25, 52
  250.     keyin 1
  251.         IF k$ = "" THEN k$ = STR$(editcard)
  252.         IF in$ = esc$ THEN EXIT SUB
  253.         editcard = VAL(k$)
  254.         IF editcard > 3 OR editcard = 0 THEN editcard = 1
  255.     editline = ((editcase - 1) * card) + editcard
  256.     LOCATE 6, 1: PRINT "CASE:"; editcase
  257.     LOCATE 7, 1: PRINT "CARD:"; editcard
  258.     ruler 8
  259.     row = 10: col = 1
  260.     numberpad 0
  261.     LOCATE 9, 1: PRINT cardset$(editcard)
  262.     getdataline
  263.     LOCATE row, col: PRINT dataline$
  264.     cardlength = LEN(dataline$)
  265.     saveline$ = dataline$
  266.     IF saveline$ = "" THEN
  267.         prompt "Can't edit empty data line. Hit a key to continue."
  268.         getkey
  269.         COLOR fore, back
  270.         CLS 2
  271.         GOTO Top
  272.     END IF
  273.     editline25
  274.     escape = 0
  275.     cursor 0
  276.     DO
  277.         LOCATE row + 1, 1: PRINT SPACE$(80)
  278.         LOCATE row + 1, col: COLOR fore, back: PRINT CHR$(24)
  279.         LOCATE row, col
  280.         getkey
  281.         click
  282.         SELECT CASE in$
  283.             CASE lft$
  284.                 IF col > 1 THEN col = col - 1
  285.             CASE rght$
  286.                 IF col < cardlength THEN col = col + 1
  287.             CASE home$
  288.                 col = 1
  289.             CASE end$
  290.                 col = cardlength
  291.             CASE bksp$
  292.                 IF col > 1 THEN col = col - 1
  293.             CASE delete$
  294.                 MID$(dataline$, col, 1) = CHR$(32)
  295.                 PRINT CHR$(32);
  296.                 IF col < cardlength THEN col = col + 1
  297.             CASE insert$
  298.                 MID$(dataline$, col, 1) = CHR$(32)
  299.                 PRINT CHR$(32);
  300.             CASE esc$
  301.                 dataline$ = saveline$
  302.                 escape = 1
  303.                 COLOR fore, back
  304.                 CLS 2
  305.                 GOTO Top
  306.             CASE enter$
  307.                 COLOR fore, back
  308.                 CLS 2
  309.                 escape = 1
  310.                 writedataline
  311.                 GOTO Top
  312.             CASE fkey$(1)
  313.                 savecursor
  314.                 minihelp
  315.                 LOCATE saverow, savecol
  316.             CASE fkey$(2)
  317.                 savecursor
  318.                 COLOR fore, back
  319.                 LOCATE 21, 1: PRINT SPACE$(320)
  320.                 LOCATE saverow, savecol
  321.             CASE fkey$(3) TO fkey$(10), up$, down$
  322.                 BEEP
  323.             CASE ELSE
  324.                 MID$(dataline$, col, 1) = in$
  325.                 PRINT in$;
  326.                 IF col < cardlength THEN
  327.                     col = col + 1
  328.                 ELSE BEEP
  329.                 END IF
  330.         END SELECT
  331.   LOOP
  332. END SUB
  333.  
  334. SUB editor STATIC
  335.     cursor 0
  336.     escape = 0
  337.     editline25
  338.     COLOR fore, back
  339.     LOCATE 2, 1
  340.     PRINT "FILE: "; UCASE$(infile$)
  341.     ruler 5
  342.     numberpad 1
  343.     OPEN outfile$ FOR APPEND AS #1
  344.     time1 = TIMER
  345.     datalines = datalines + 1
  346.     numcases = numcases + 1
  347.     row = 8
  348.     card = 1
  349.     dataroutine
  350.     numberpad 0
  351.     cursor 0
  352.     COLOR fore, back
  353.     CLS 2
  354.     savebakfile
  355.     CLOSE
  356. END SUB
  357.  
  358. SUB filebusiness STATIC
  359.     splitfilename
  360.     bakfile$ = file$ + ".BAK"
  361.     outfile$ = infile$
  362.     deffile$ = file$ + ".DEF"
  363.     tempfile$ = file$ + ".TMP"
  364. END SUB
  365.  
  366. SUB filecard (row) STATIC
  367.     LOCATE row, 1
  368.     COLOR black, fore
  369.     PRINT SPACE$(160)
  370.     FOR x = 0 TO 9
  371.         PRINT STRING$(80, CHR$(48 + x))
  372.     NEXT x
  373.     PRINT SPACE$(80)
  374.     COLOR fore, back
  375. END SUB
  376.  
  377. SUB getbyte STATIC
  378.     DO
  379.         counter
  380.         getkey
  381.         byte$ = in$
  382.         IF byte$ = enter$ THEN EXIT SUB
  383.         IF byte$ = esc$ THEN escape = 1: EXIT SUB
  384.         readbyte
  385.     LOOP
  386. END SUB
  387.  
  388. SUB getdataline STATIC
  389.     prompt "Please wait, getting data line."
  390.     OPEN infile$ FOR INPUT AS #1
  391.     FOR x = 1 TO editline
  392.         LINE INPUT #1, dataline$
  393.     NEXT x
  394.     CLOSE #1
  395. END SUB
  396.  
  397. SUB getdeffile STATIC
  398.      OPEN deffile$ FOR RANDOM AS #1
  399.         IF LOF(1) = 0 THEN CLOSE : setup
  400.      CLOSE
  401.      card = 1
  402.      OPEN deffile$ FOR INPUT AS #1
  403.         INPUT #1, datalines
  404.         DO
  405.             LINE INPUT #1, cardset$(card)
  406.                 FOR l = 1 TO LEN(cardset$(card))
  407.                     column$(l, card) = MID$(cardset$(card), l, 1)
  408.                 NEXT l
  409.                 IF RIGHT$(cardset$(card), 1) = "+" THEN
  410.                      card = card + 1
  411.                      ELSE EXIT DO
  412.                 END IF
  413.         LOOP
  414.      CLOSE #1
  415.      numcases = FIX(datalines / card)
  416. END SUB
  417.  
  418. SUB getdirectory STATIC
  419.         cursor 0
  420.         clear25
  421.         COLOR fore, back
  422.         CLS 2
  423.         dirlist$ = drive$ + "dir.lst"
  424.         dir$ = "dir " + drive$ + " > " + dirlist$
  425.         SHELL dir$
  426.         OPEN dirlist$ FOR INPUT AS #1
  427.         prompt "Hit any key to continue."
  428.         COLOR fore, back
  429.         VIEW PRINT 2 TO 24
  430.         LOCATE 3, 3
  431.         DO WHILE NOT EOF(1)
  432.             l = l + 1
  433.             LINE INPUT #1, l$
  434.             LOCATE , 3: PRINT l$
  435.             IF l = 23 THEN getkey: l = 1
  436.             IF in$ = esc$ THEN EXIT DO
  437.         LOOP
  438.         VIEW PRINT 2 TO 25
  439.         CLOSE #1
  440.         KILL dirlist$
  441.         IF in$ <> esc$ THEN getkey
  442. END SUB
  443.  
  444. SUB getdirname STATIC
  445.         COLOR fore, back
  446.         CLS 2
  447.         l$(18) = "Which DRIVE are your files stored on?"
  448.         l$(19) = "     A:    for    A: drive"
  449.         l$(20) = "     B:    for    B: drive"
  450.         l$(21) = "    \path  for    subdirectory "
  451.         l$(23) = "[Return] for current drive or directory"
  452.         writescreen 20
  453.         prompt "Enter drive or path: "
  454.         keyin 30
  455.         IF k$ = esc$ THEN goodbye
  456.         IF LEN(k$) = 1 THEN k$ = k$ + ":"
  457.         IF NOT LEN(k$) = 2 AND NOT k$ = "" AND NOT RIGHT$(k$, 1) = "\" THEN k$ = k$ + "\"
  458.         drive$ = UCASE$(k$)
  459. END SUB
  460.  
  461. SUB getfilename STATIC
  462.     COLOR fore, back
  463.     CLS 2
  464.     l$(23) = "Hit [Return] to see directory list."
  465.     writescreen 21
  466.     prompt "Enter filename:                       "
  467.     LOCATE 25, 37
  468.     keyin 12
  469.     IF in$ = esc$ THEN EXIT SUB
  470.     IF k$ = "" THEN
  471.         getdirectory
  472.         getfilename
  473.         ELSE infile$ = drive$ + k$
  474.     END IF
  475. END SUB
  476.  
  477. SUB getinifile
  478.     OPEN "entry.ini" FOR APPEND AS 1
  479.     IF LOF(1) <> 0 THEN
  480.         CLOSE 1
  481.         OPEN "entry.ini" FOR INPUT AS 1
  482.         a$ = INPUT$(6, #1)
  483.         INPUT #1, fore
  484.         a$ = INPUT$(6, #1)
  485.         INPUT #1, back
  486.         a$ = INPUT$(6, #1)
  487.         INPUT #1, high
  488.         a$ = INPUT$(6, #1)
  489.         INPUT #1, saveinterval
  490.         a$ = INPUT$(7, #1)
  491.         INPUT #1, soundonoff
  492.     ELSE
  493.         IF monitortype = 2 THEN
  494.             fore = 14
  495.             back = 4
  496.             high = 3
  497.             black = 0
  498.         ELSE
  499.             fore = 7
  500.             back = 0
  501.             high = 15
  502.             black = 0
  503.         END IF
  504.         saveinterval = 120
  505.         soundonoff = 1
  506.     END IF
  507.     CLOSE 1
  508. END SUB
  509.  
  510. SUB getkey STATIC
  511. w:   in$ = INKEY$: IF in$ = "" THEN numpadscan: GOTO w
  512. END SUB
  513.  
  514. SUB getset STATIC
  515.     DO
  516.         col = POS(0)
  517.         getkey
  518.         in$ = UCASE$(in$)
  519.         SELECT CASE in$
  520.             CASE enter$
  521.                 EXIT DO
  522.             CASE esc$
  523.                 EXIT SUB
  524.             CASE bksp$, lft$
  525.                 IF col > 1 THEN
  526.                         col = col - 1
  527.                         LOCATE , col
  528.                         PRINT CHR$(32);
  529.                         LOCATE , col
  530.                         cardset$(card) = LEFT$(cardset$(card), col - 1)
  531.                     ELSE col = 1
  532.                 END IF
  533.             CASE "C", "A", "N", "B", "P", "+", ".", ","
  534.                 IF in$ = "+" THEN
  535.                     IF card = 3 THEN EXIT DO
  536.                     cardset$(card) = cardset$(card) + in$
  537.                     PRINT in$;
  538.                     card = card + 1
  539.                     setuproutine
  540.                 ELSE cardset$(card) = cardset$(card) + in$
  541.                     PRINT in$;
  542.                 END IF
  543.             CASE ELSE
  544.                 BEEP
  545.         END SELECT
  546.     LOOP UNTIL col = 80
  547. END SUB
  548.  
  549. SUB goodbye STATIC
  550.     COLOR 7, 0
  551.     VIEW PRINT
  552.     CLS
  553.     IF infile$ = "" THEN GOTO FastOut
  554.     writeinifile
  555.     PRINT "THANKS for using ENTRY."
  556.     PRINT "To renter this file in the future, type  ENTRY "; infile$
  557.     PRINT "Original file, if any, is now in "; bakfile$
  558. FastOut:
  559.     numberpad 0
  560.     CLOSE
  561.     END
  562. END SUB
  563.  
  564. SUB header
  565.     VIEW PRINT
  566.     COLOR back, fore
  567.     LOCATE 1, 1: PRINT SPACE$(80);
  568.     LOCATE 1, 20
  569.     COLOR high, fore
  570.     PRINT "ENTRY: Dr.Funkey's Data Entry Program v1.41"
  571.     VIEW PRINT 2 TO 25
  572. END SUB
  573.  
  574. SUB helpscreen STATIC
  575.      l$(4) = "DATA ENTRY AND EDITING OPTIONS"
  576.      l$(6) = "     [Space]           Enters an blank column."
  577.      l$(7) = "     [Return]          Aborts current line. Starts over."
  578.      l$(8) = "     [BackSpace]       Deletes left of cursor, moves to left. "
  579.      l$(9) = "     [*]               Accepted as Missing Value in Numeric Field"
  580.     l$(10) = "     [Esc]             EXIT to MENU."
  581.     l$(12) = "Hit [NumLock] to use following keys. Hit again to use numberpad."
  582.     l$(14) = "     [<--] [-->]       Move left or right."
  583.     l$(16) = "     [Home]            Cursor to beginning of line."
  584.     l$(18) = "     [End]             Cursor to end of line"
  585.     l$(20) = "     [Delete]          Deletes at cursor, moves to right."
  586.     l$(22) = "     [Insert]          Delete at cursor, cursor stays put."
  587.     prompt "Hit any key to continue."
  588.     writescreen 10
  589.     getkey
  590. END SUB
  591.  
  592. SUB initialize
  593.  
  594. cards = 3
  595. items = 11
  596. escape = 1
  597.  
  598. DIM menu$(items)
  599. DIM l$(25)
  600. DIM column$(81, cards)
  601. DIM data$(80)
  602. DIM fkey$(items)
  603. DIM cardset$(cards)
  604.  
  605. getinifile
  606. setnames
  607. END SUB
  608.  
  609. SUB issuecommand STATIC
  610.     COLOR fore, back
  611.     CLS
  612.     LOCATE 20, 1
  613.     PRINT "Type EXIT to return to ENTRY."
  614.     SHELL
  615.     header
  616. END SUB
  617.  
  618. SUB keyin (length) STATIC
  619.     inlen = length
  620.     cursor 1
  621.     k$ = ""
  622.     getbyte
  623. END SUB
  624.  
  625. SUB makedeffile STATIC
  626.     OPEN deffile$ FOR OUTPUT AS #1
  627.         PRINT #1, datalines
  628.         FOR c = 1 TO 3
  629.             IF cardset$(c) <> "" THEN PRINT #1, cardset$(c)
  630.         NEXT c
  631.     CLOSE #1
  632. END SUB
  633.  
  634. SUB menufunctions STATIC
  635.     COLOR fore, back
  636.     CLS 2
  637.     SELECT CASE in$
  638.         CASE fkey$(1)
  639.             getdeffile
  640.             editor
  641.         CASE fkey$(2)
  642.             helpscreen
  643.         CASE fkey$(3)
  644.             checkname
  645.             setup
  646.         CASE fkey$(4)
  647.             getdeffile
  648.             editlines
  649.         CASE fkey$(5)
  650.             prompt "Please wait, saving backup file first."
  651.             savebakfile
  652.             CLOSE
  653.             issuecommand
  654.         CASE fkey$(6)
  655.             setcolor
  656.             setsave
  657.             writeinifile
  658.         CASE fkey$(7)
  659.             getdeffile
  660.             printfile
  661.         CASE fkey$(8)
  662.             soundoff
  663.         CASE fkey$(9)
  664.             getdirname
  665.         CASE fkey$(10)
  666.             getdirectory
  667.         CASE esc$
  668.             goodbye
  669.     END SELECT
  670. END SUB
  671.  
  672. SUB menuinput STATIC
  673.     item = 1
  674.     DO
  675.         LOCATE (item * 2) + 1, 24
  676.         COLOR high, fore
  677.         PRINT menu$(item)
  678.         COLOR fore, back
  679.         getkey
  680.         LOCATE (item * 2) + 1, 24: PRINT menu$(item)
  681.         FOR a = 1 TO 11
  682.             IF in$ = fkey$(a) THEN EXIT SUB
  683.         NEXT a
  684.         SELECT CASE in$
  685.             CASE esc$:   EXIT SUB
  686.             CASE enter$: in$ = fkey$(item)
  687.                              EXIT SUB
  688.             CASE up$:    item = item - 1
  689.             CASE down$:  item = item + 1
  690.         END SELECT
  691.         IF item = items + 1 THEN item = 1
  692.         IF item = 0 THEN item = items
  693.     LOOP
  694. END SUB
  695.  
  696. SUB menuroutine STATIC
  697.     COLOR fore, back
  698.     CLS
  699.     escape = 1
  700.     menuscreen
  701.     menuinput
  702.     menufunctions
  703. END SUB
  704.  
  705. SUB menuscreen STATIC
  706.     COLOR fore, back
  707.     FOR l = 1 TO 24
  708.         l$(l) = ""
  709.     NEXT l
  710.         l$(3) = "[F1]  Enter data in datafile": menu$(1) = l$(3)
  711.         l$(5) = "[F2]  Help with entering data": menu$(2) = l$(5)
  712.         l$(7) = "[F3]  Set up new datafile": menu$(3) = l$(7)
  713.         l$(9) = "[F4]  Edit existing data": menu$(4) = l$(9)
  714.         l$(11) = "[F5]  Issue a DOS command": menu$(5) = l$(11)
  715.         l$(13) = "[F6]  Set autosave and color": menu$(6) = l$(13)
  716.         l$(15) = "[F7]  Print this file": menu$(7) = l$(15)
  717.         l$(17) = "[F8]  Turn sound ON/OFF": menu$(8) = l$(17)
  718.         l$(19) = "[F9]  Change drive": menu$(9) = l$(19)
  719.         l$(21) = "[F10] See drive directory": menu$(10) = l$(21)
  720.         l$(23) = "[Esc] EXIT program to DOS": menu$(11) = l$(23)
  721.         writescreen 24
  722.         IF soundonoff = 1 THEN s$ = "OFF   " ELSE s$ = "ON    "
  723.         LOCATE 17, 41
  724.         COLOR high, back
  725.         PRINT s$
  726.         prompt "Use cursor keys, then [Return] or hit Function Key."
  727. END SUB
  728.  
  729. SUB minihelp STATIC
  730.     COLOR fore, back
  731.     LOCATE 21, 1
  732.     PRINT "[Space] enter BLANK col     [Return] ABORT line    [BackSpace] Delete to left"
  733.     PRINT "[Home]  goto BEGIN line     [End] goto END line    [Insert] Delete at cursor"
  734.     PRINT "[F2] remove this MINIHELP panel                    [Delete] Delete, move right  "
  735.     PRINT "[NumLock] to use arrow keys. [Numlock] again to enter data"
  736. END SUB
  737.  
  738. FUNCTION monitortype
  739.      DEF SEG = 0
  740.      IF (PEEK(&H410) AND &H30) = &H30 THEN
  741.         monotype = 1
  742.      ELSE monotype = 2
  743.      END IF
  744.      DEF SEG
  745. END FUNCTION
  746.  
  747. SUB numberpad (value) STATIC
  748.     IF value = 1 THEN
  749.             DEF SEG = &H40
  750.             POKE &H17, PEEK(&H17) OR 32
  751.         ELSEIF value = 0 THEN
  752.             DEF SEG = &H40
  753.             POKE &H17, PEEK(&H17) AND 223
  754.     END IF
  755. END SUB
  756.  
  757. SUB numpadscan STATIC
  758.     num = PEEK(&H17)
  759.     IF num = 0 THEN
  760.         pad$ = "OFF"
  761.         ELSE IF num = 32 OR num = 128 THEN pad$ = "ON "
  762.     END IF
  763.     IF escape = 0 THEN
  764.         savecursor
  765.         COLOR back, fore
  766.         LOCATE 25, 51: PRINT pad$;
  767.         COLOR fore, back
  768.         LOCATE saverow, savecol
  769.     END IF
  770. END SUB
  771.  
  772. SUB openingscreen STATIC
  773.     l$(5) = "If you remember the bad old days of datacards, you remember bad"
  774.     l$(6) = "old cardpunch machines. But there was one function on that clunker"
  775.     l$(7) = "that was quite useful--the program drum. It permitted you to program"
  776.     l$(8) = "the datatype for each column of data, skip columns and automatically"
  777.     l$(9) = "start a new case. Good aids for data entry!"
  778.     l$(11) = "This program combines these functions with some of the advantages of"
  779.     l$(12) = "screen data entry, such as the ability to backspace for corrections."
  780.     l$(13) = "This program is limited to data for 9,999 cases of 3 cards per case"
  781.     l$(14) = "with 80 columns maximum each."
  782.     l$(16) = "If you use this program for commercial purposes, you are obligated to"
  783.     l$(17) = "the author for a payment of £10. Otherwise, use and enjoy."
  784.     l$(23) = "                   (c) 1988, 90, 91 David A. Wesson"
  785.     prompt "Hit any key to continue or [Esc] to EXIT. "
  786.     cursor 1
  787.     writescreen 6
  788.     getkey
  789.     IF in$ = esc$ THEN goodbye
  790. END SUB
  791.  
  792. SUB printfile STATIC
  793.     OPEN infile$ FOR INPUT AS #1
  794.     IF LOF(1) = 0 THEN
  795.         prompt "Empty datafile. Hit a key"
  796.         getkey
  797.         EXIT SUB
  798.     END IF
  799.     prompt "Make sure printer is turned on. Hit a key."
  800.     getkey
  801.     IF in$ = esc$ THEN EXIT SUB
  802.     prompt "Hit [Esc] to ABORT printing (except what is already in buffer.)"
  803.     LOCATE 24, 1
  804.     FOR n = 1 TO datalines
  805.          i$ = INKEY$
  806.          IF i$ = esc$ THEN CLOSE #1: LPRINT CHR$(24): EXIT SUB
  807.          INPUT #1, data$
  808.          LPRINT data$
  809.     NEXT n
  810.     CLOSE #1
  811. END SUB
  812.  
  813. SUB prompt (p$) STATIC
  814.     cursor 0
  815.     clear25
  816.     COLOR high, fore
  817.     LOCATE 25, (40 - (LEN(p$) / 2))
  818.     PRINT p$;
  819. END SUB
  820.  
  821. SUB punch STATIC
  822.     IF VAL(data$(col)) >= 0 AND VAL(data$(col)) < 10 THEN
  823.         savecursor
  824.         LOCATE row + 2 + VAL(data$(col)), col
  825.         COLOR black, black
  826.         PRINT CHR$(255)
  827.         click
  828.         COLOR back, fore
  829.         LOCATE saverow, savecol
  830.     END IF
  831. END SUB
  832.  
  833. SUB readbyte STATIC
  834.     col = POS(0): row = CSRLIN
  835.     IF byte$ = fkey$(2) THEN savecursor: setsave: LOCATE saverow, savecol
  836.     IF byte$ = home$ THEN GOTO HomeKey
  837.     IF byte$ = end$ THEN GOTO EndKey
  838.     IF byte$ = bksp$ THEN GOTO BackSpace
  839.     IF byte$ = lft$ THEN GOTO LeftKey
  840.     IF byte$ = rght$ THEN GOTO RightKey
  841.     IF byte$ = delete$ THEN GOTO DeleteKey
  842.     IF byte$ < CHR$(32) OR byte$ > CHR$(126) THEN EXIT SUB
  843.     IF LEN(k$) = inlen THEN BEEP: EXIT SUB
  844.     PRINT byte$;
  845.     k$ = k$ + byte$
  846.     EXIT SUB
  847.  
  848. BackSpace:
  849.     IF col > 1 AND k$ <> "" THEN
  850.             LOCATE , col - 1: PRINT CHR$(32);
  851.             LOCATE , col - 1
  852.             k$ = LEFT$(k$, LEN(k$) - 1)
  853.             ELSE click: getbyte
  854.     END IF
  855.     EXIT SUB
  856. LeftKey:
  857.     IF col > 1 AND k$ <> "" THEN
  858.          col = col - 1
  859.          LOCATE row, col
  860.          ELSE click: getbyte
  861.     END IF
  862.     EXIT SUB
  863. RightKey:
  864.     IF col < length THEN
  865.         col = col + 1
  866.         ELSE click: getbyte
  867.     END IF
  868.     EXIT SUB
  869. EndKey:
  870.     col = LEN(k$)
  871.     LOCATE row, col
  872.     EXIT SUB
  873. HomeKey:
  874.     col = 1
  875.     LOCATE row, col
  876.     EXIT SUB
  877. DeleteKey:
  878.     IF k$ <> "" THEN
  879.         k$ = LEFT$(k$, incol - 1) + MID$(k$, incol + 1)
  880.     LOCATE , 1: PRINT k$ + SPACE$(1)
  881.     END IF
  882.     EXIT SUB
  883. InsertKey:
  884.     k$ = LEFT$(k$, col - 1) + CHR$(32) + MID$(k$, col + 1)
  885.     LOCATE row, 1: PRINT k$;
  886.     LOCATE row, col
  887.     EXIT SUB
  888. END SUB
  889.  
  890. SUB readcolumn STATIC
  891.     COLOR back, fore
  892.     SELECT CASE column$(col, card)
  893.         CASE ""
  894.             BEEP
  895.             writeline
  896.             time2 = TIMER
  897.             autosave
  898.             card = 1
  899.             numcases = numcases + 1
  900.             eol = 1
  901.         CASE "C"
  902.             IF numcases < 10 THEN casenum$ = "0" + "0" + "0" + MID$(STR$(numcases), 2, 1)
  903.             IF numcases > 9 AND numcases < 100 THEN casenum$ = "0" + "0" + MID$(STR$(numcases), 2, 2)
  904.             IF numcases > 99 AND numcases < 1000 THEN casenum$ = "0" + MID$(STR$(numcases), 2, 3)
  905.             IF numcases > 999 AND numcases < 10000 THEN casenum$ = MID$(STR$(numcases), 2, 4)
  906.             FOR c = 1 TO 4
  907.                 data$(col) = MID$(casenum$, c, 1)
  908.                 COLOR black, fore
  909.                 LOCATE row, col: PRINT data$(col)
  910.                 punch
  911.                 col = col + 1
  912.             NEXT c
  913.             readcolumn
  914.         CASE "B"
  915.             LOCATE row, col
  916.             data$(col) = CHR$(32)
  917.             col = col + 1
  918.             readcolumn
  919.         CASE "P"
  920.             BEEP
  921.             data$(col) = CHR$(32)
  922.             col = col + 1
  923.             readcolumn
  924.         CASE "."
  925.             data$(col) = CHR$(46)
  926.             PRINT CHR$(46);
  927.             col = col + 1
  928.             readcolumn
  929.         CASE ","
  930.             data$(col) = CHR$(44)
  931.             PRINT CHR$(44);
  932.             col = col + 1
  933.             readcolumn
  934.         CASE "+"
  935.             BEEP
  936.             writeline
  937.             card = card + 1
  938.             eol = 1
  939.     END SELECT
  940. END SUB
  941.  
  942. SUB readcommandline STATIC
  943.     infile$ = UCASE$(COMMAND$)
  944.     IF infile$ = "" THEN
  945.         openingscreen
  946.         getdirname
  947.         getfilename
  948.     END IF
  949. END SUB
  950.  
  951. SUB ruler (row) STATIC
  952.     LOCATE row, 1
  953.     FOR z = 1 TO 8
  954.         COLOR black, fore: PRINT "123456789";
  955.         COLOR high, fore: PRINT MID$(STR$(z), 2, 1);
  956.     NEXT z
  957. END SUB
  958.  
  959. SUB savebakfile STATIC
  960.     CLOSE
  961.     LOCATE 24, 1
  962.     makebak$ = "COPY " + outfile$ + " " + bakfile$ + " > nul"
  963.     SHELL makebak$
  964. END SUB
  965.  
  966. SUB savecursor STATIC
  967.     savecol = POS(0)
  968.     saverow = CSRLIN
  969. END SUB
  970.  
  971. SUB setcolor
  972.     prompt "Hit [Return] to reset entry to original setting."
  973.     COLOR back, fore
  974.     LOCATE 18, 15
  975.     PRINT "       Enter a number for each color selection.       "
  976.     LOCATE 19, 15
  977.     PRINT " 0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15 "
  978.     LOCATE 20, 15
  979.     FOR x = 0 TO 9
  980.         COLOR x, fore: PRINT STRING$(3, 254);
  981.     NEXT x
  982.     FOR x = 10 TO 15
  983.         COLOR x, fore: PRINT STRING$(4, 254);
  984.     NEXT x
  985.     COLOR fore, back
  986.     LOCATE 23, 15
  987.     PRINT "   FOREGROUND: " + STRING$(2, 254) + "   BACKGROUND: " + STRING$(2, 254) + "   HIGHLIGHT: " + STRING$(2, 254) + "   "
  988.     LOCATE 23, 30
  989.     keyin 2
  990.     f = VAL(k$)
  991.     IF f <> 0 THEN fore = f
  992.     header
  993.     LOCATE 23, 47
  994.     keyin 2
  995.     b = VAL(k$)
  996.     IF b <> fore THEN back = b
  997.     header
  998.     LOCATE 23, 63
  999.     keyin 2
  1000.     h = VAL(k$)
  1001.     IF h <> back THEN high = h
  1002.     header
  1003. END SUB
  1004.  
  1005. SUB setnames
  1006.         esc$ = CHR$(27)
  1007.         bksp$ = CHR$(8)
  1008.         tab$ = CHR$(9)
  1009.         enter$ = CHR$(13)
  1010.         delete$ = CHR$(0) + CHR$(83)
  1011.         insert$ = CHR$(0) + CHR$(82)
  1012.         btab$ = CHR$(0) + CHR$(15)
  1013.         pgup$ = CHR$(0) + CHR$(73)
  1014.         pgdn$ = CHR$(0) + CHR$(81)
  1015.         home$ = CHR$(0) + CHR$(71)
  1016.         end$ = CHR$(0) + CHR$(79)
  1017.         up$ = CHR$(0) + CHR$(72)
  1018.         lft$ = CHR$(0) + CHR$(75)
  1019.         rght$ = CHR$(0) + CHR$(77)
  1020.         down$ = CHR$(0) + CHR$(80)
  1021.         plus$ = CHR$(43)
  1022.         fkey$(1) = CHR$(0) + CHR$(59)
  1023.         fkey$(2) = CHR$(0) + CHR$(60)
  1024.         fkey$(3) = CHR$(0) + CHR$(61)
  1025.         fkey$(4) = CHR$(0) + CHR$(62)
  1026.         fkey$(5) = CHR$(0) + CHR$(63)
  1027.         fkey$(6) = CHR$(0) + CHR$(64)
  1028.         fkey$(7) = CHR$(0) + CHR$(65)
  1029.         fkey$(8) = CHR$(0) + CHR$(66)
  1030.         fkey$(9) = CHR$(0) + CHR$(67)
  1031.         fkey$(10) = CHR$(0) + CHR$(68)
  1032.         numlock$ = CHR$(&H20) + CHR$(45)
  1033.         altminus$ = CHR$(0) + CHR$(130)
  1034.         altplus$ = CHR$(0) + CHR$(131)
  1035. END SUB
  1036.  
  1037. SUB setsave STATIC
  1038.     escape = 1
  1039.     saveline$ = "Current Autosave interval is" + STR$(saveinterval) + " seconds. New interval: "
  1040.     prompt saveline$
  1041.     LOCATE 25, 68
  1042.     keyin 3
  1043.     IF k$ = "" THEN EXIT SUB
  1044.     IF VAL(k$) < 20 OR VAL(k$) > 999 THEN
  1045.         saveinterval = 0
  1046.         ELSE saveinterval = VAL(k$)
  1047.     END IF
  1048.     escape = 0
  1049. END SUB
  1050.  
  1051. SUB setup STATIC
  1052.      IF in$ = esc$ THEN EXIT SUB
  1053.      l$(6) = "C    Enter CCCC for case numbers. Program assumes 9,999 cases max."
  1054.      l$(7) = "     The computer will enter the sequential numbers for you."
  1055.      l$(9) = "A    Alphanumerics are Any letter or number, but numbers will "
  1056.     l$(10) = "     not be treated as numerical data. Use N for numerical data."
  1057.     l$(12) = "B    Enter B for a blank column to help section data."
  1058.     l$(14) = "P    Enter P where you turn a page in your instrument. Will BEEP here."
  1059.     l$(15) = "     Program will beep and enter a blank column for you."
  1060.     l$(17) = ". ,  Enter a period or comma to have these automatically entered."
  1061.     l$(19) = "+    Enter a plus to continue onto next card. 3 card maximum."
  1062.     l$(21) = "Use BackSpace or Left Cursor [ <-- ] to make corrections."
  1063.     l$(23) = "Hit [Return] to FINISH data entry setup. Hit [Esc] to ABORT."
  1064.     writescreen 8
  1065.     prompt "Enter   C   A   N   B   P   .  ,  +  [Esc] Abort   [Return] Finish."
  1066.     card = 1
  1067.     FOR x = 1 TO 3
  1068.         cardset$(x) = ""
  1069.     NEXT x
  1070.     setuproutine
  1071. END SUB
  1072.  
  1073. SUB setuproutine STATIC
  1074.     COLOR fore, back
  1075.     LOCATE 2, 1: PRINT "DATA LINE:"; card; TAB(40); "DATA FILE: "; UCASE$(infile$)
  1076.     ruler 3
  1077.     COLOR fore, back
  1078.     LOCATE 4, 1: PRINT SPACE$(80)
  1079.     cursor 1
  1080.     LOCATE 4, 1
  1081.     getset
  1082.     IF in$ <> esc$ THEN makedeffile
  1083.     COLOR fore, back
  1084.     CLS 2
  1085. END SUB
  1086.  
  1087. SUB soundoff STATIC
  1088.     IF soundonoff = 1 THEN
  1089.         soundonoff = 0
  1090.         ELSEIF soundonoff = 0 THEN soundonoff = 1
  1091.     END IF
  1092.     writeinifile
  1093. END SUB
  1094.  
  1095. SUB splitfilename STATIC
  1096.         period = INSTR(infile$, ".")
  1097.         IF period = 0 THEN
  1098.             file$ = infile$
  1099.             ext$ = ""
  1100.             ELSE
  1101.                 file$ = LEFT$(infile$, period - 1)
  1102.                 ext$ = MID$(infile$, period + 1)
  1103.         END IF
  1104. END SUB
  1105.  
  1106. SUB writedataline STATIC
  1107.     prompt "Please wait, saving datafile."
  1108.     OPEN infile$ FOR INPUT AS #1
  1109.     OPEN tempfile$ FOR OUTPUT AS #2
  1110.     WHILE EOF(1) = 0
  1111.         n = n + 1
  1112.         LINE INPUT #1, a$
  1113.         IF n = editline THEN a$ = dataline$
  1114.         PRINT #2, a$
  1115.     WEND
  1116.     CLOSE
  1117.     KILL infile$
  1118.     NAME tempfile$ AS infile$
  1119. END SUB
  1120.  
  1121. SUB writeinifile
  1122.     OPEN "entry.ini" FOR OUTPUT AS 1
  1123.     PRINT #1, "FORE ="; fore
  1124.     PRINT #1, "BACK ="; back
  1125.     PRINT #1, "HIGH ="; high
  1126.     PRINT #1, "SAVE ="; saveinterval
  1127.     PRINT #1, "SOUND ="; soundonoff
  1128.     CLOSE 1
  1129. END SUB
  1130.  
  1131. SUB writeline STATIC
  1132.         dataline$ = ""
  1133.         FOR c = 1 TO LEN(cardset$(card))
  1134.             dataline$ = dataline$ + data$(c)
  1135.             data$(c) = ""
  1136.         NEXT c
  1137.         PRINT #1, dataline$
  1138.         datalines = datalines + 1
  1139. END SUB
  1140.  
  1141. SUB writescreen (indent)
  1142.     cursor 0
  1143.     VIEW PRINT 2 TO 24
  1144.     COLOR fore, back
  1145.     CLS 2
  1146.     FOR x = 3 TO 24
  1147.         IF NOT l$(x) = "" THEN
  1148.             LOCATE x, indent: PRINT l$(x);
  1149.         l$(x) = ""
  1150.         END IF
  1151.     NEXT x
  1152.     VIEW PRINT 2 TO 25
  1153. END SUB
  1154.  
  1155.