' PBINPUT.BAS - replaces Basic's (LINE)INPUT ' Author : Egbert Zijlema (E.Zijlema@uni4nn.iaf.nl) ' (up)Date : 20 December 1996 ' Status : Public Domain ' Language : Power Basic 3.2 DEFINT A - Z ' all vars integer, unless tagged ' ----- data for character translation ' double quote > 'Umlaut' (German) quotation: DATA 18 DATA 34, 34 DATA 65, 142 DATA 79, 153 DATA 85, 154 DATA 97, 132 DATA 101, 137 DATA 105, 139 DATA 111, 148 DATA 117, 129 ' single quote > accent aigue (French/Dutch) apostrofe: DATA 14 DATA 39, 39 DATA 69, 144 DATA 97, 160 DATA 101, 130 DATA 105, 161 DATA 111, 162 DATA 117, 163 ' Scandinavian characters colon: DATA 6 DATA 58, 58 DATA 65, 143 DATA 97, 134 ' cC + cedilla (French/Dutch) semicolon: DATA 6 DATA 59, 59 DATA 67, 128 DATA 99, 135 circumflex: DATA 12 DATA 94, 94 DATA 97, 131 DATA 101, 136 DATA 105, 140 DATA 111, 147 DATA 117, 150 ' accent grave (French/Dutch) backaccnt: DATA 12 DATA 96, 96 DATA 97, 133 DATA 101, 138 DATA 105, 141 DATA 111, 149 DATA 117, 151 ' nN + tilde (Spanish) manana: DATA 6 DATA 78, 165 DATA 110, 164 DATA 126, 126 ' ----- end of character data %NO = 0 : %YES = NOT %NO ' true/false Boolean %F10 = 68 * 256 ' save text / see: SUB editor() %HOME = 71 * 256 : %UP = 72 * 256 : %PGUP = 73 * 256 %LEFT = 75 * 256 : %RIGHT = 77 * 256 : %END = 79 * 256 %DOWN = 80 * 256 : %PGDN = 81 * 256 : %DEL = 83 * 256 %BACKSPACE = 8 : %ESC = 27 %ENTER = 13 : %CTRLY = 25 ' equates for special characters: %ALTC = 46 * 256 ' Alt-c = dollar ent %ALTF = 33 * 256 ' Alt-f = Dutch lorin %ALTL = 38 * 256 ' pound sterling %ALTP = 25 * 256 ' Spanish peseta %ALTY = 21 * 256 ' Japanese en SUB editor (row, col, text$, length, rows, last) OldInsert = IsIns ' save insert modus InsertOn ' insert text$ = LTRIM$(RTRIM$(text$)) COLOR 15, 0 LOCATE row, col : PRINT text$ cursor = LEN(text$) + 1 IF cursor > length THEN DECR cursor DO ' display insert status LOCATE 25, 75 IF IsIns THEN PRINT "INS"; ELSE PRINT SPACE$(3); LOCATE row, col + cursor - 1, 1 ' visible cursor KeyIn = GetKey SELECT CASE KeyIn CASE %HOME: cursor = 1 CASE %END : cursor = LEN(text$) + 1 CASE %LEFT IF cursor > 1 THEN DECR cursor CASE %RIGHT IF cursor < LEN(text$) + 1 THEN INCR cursor CASE %DEL text$ = LEFT$(text$, cursor - 1) + MID$(text$, cursor + 1) CASE %BACKSPACE IF cursor = 1 THEN EXIT SELECT text$ = LEFT$(text$, cursor - 2) + MID$(text$, cursor) DECR cursor CASE %CTRLY cursor = 1: text$ = "" ' erase line CASE %UP IF rows > 1 THEN DECR rows EXIT DO END IF CASE %ENTER INCR rows EXIT DO CASE %DOWN ' same as ENTER but not when in the last line IF rows < last THEN INCR rows EXIT DO END IF CASE %PGUP IF rows <> 1 THEN rows = 1 EXIT DO END IF CASE %PGDN IF rows <> last THEN rows = last EXIT DO END IF CASE %F10 ' after editing the last line, pressing ENTER will save all ' however, after you made a last minute modification ' elsewhere, there is no need to re-scroll to the bottom line ' F10 saves your edited work instead rows = last + 1 EXIT DO CASE %ESC text$ = "" rows = last + 2 ' don 't save EXIT DO CASE 32 TO 123, 125 IF previous THEN SELECT CASE previous CASE 34 : RESTORE quotation CASE 39 : RESTORE apostrofe CASE 58 : RESTORE colon CASE 59 : RESTORE semicolon CASE 94 : RESTORE circumflex CASE 96 : RESTORE backaccnt CASE 126: RESTORE manana END SELECT READ HowMany FOR reading = 1 TO HowMany READ table IF table = KeyIn THEN READ KeyIn ' read next data DeadKey = %NO ' skip dead key EXIT FOR ELSE DeadKey = %YES ' save dead key END IF NEXT ELSE IF INSTR(CHR$(34, 39, 58, 59, 94, 96, 126), CHR$(KeyIn)) THEN previous = KeyIn EXIT SELECT END IF END IF IF DeadKey THEN DeadKey = %NO text$ = modify(cursor, text$, previous, length) END IF previous = 0 text$ = modify(cursor, text$, KeyIn, length) CASE %ALTC, %ALTF, %ALTL, %ALTP, %ALTY SELECT CASE KeyIn CASE %ALTC : KeyIn = 155 ' dollar cent CASE %ALTF : KeyIn = 159 ' dutch florin CASE %ALTL : KeyIn = 156 ' sterling CASE %ALTP : KeyIn = 158 ' Sp. peseta CASE %ALTY : KeyIn = 157 ' Jap. yen END SELECT text$ = modify(cursor, text$, KeyIn, length) END SELECT IF cursor > length THEN DECR cursor LOCATE row, col : PRINT SPACE$(length) ' clear field LOCATE row, col : PRINT text$ LOOP IF OldInsert THEN InsertOn ELSE InsertOff ' restore insert modus COLOR 7, 0 LOCATE 25, 75 : PRINT SPACE$(3); ' clear INS-field LOCATE row, col : PRINT text$ ' unbold ready text END SUB FUNCTION GetKey AS INTEGER DO LOOP UNTIL INSTAT FUNCTION = CVI(INKEY$ + CHR$(0)) END FUNCTION SUB InsertOff DEF SEG = 64 POKE 23, PEEK(23) AND 127 DEF SEG END SUB SUB InsertOn DEF SEG = 64 POKE 23, PEEK(23) OR 128 DEF SEG END SUB FUNCTION IsIns AS INTEGER DEF SEG = 64 FUNCTION = (PEEK(23) AND 128) = 128 DEF SEG END FUNCTION FUNCTION modify(cursor, text$, KeyIn, length) AS STRING txt$ = LEFT$(text$, cursor - 1) + CHR$(KeyIn) + _ MID$(text$, cursor + IsIns + 1) IF LEN(txt$) > length THEN txt$ = LEFT$(txt$, length) IF cursor < LEN(txt$) + 1 THEN INCR cursor FUNCTION = txt$ END FUNCTION SUB StartScreen COLOR 15, 0 LOCATE 1, 2 : PRINT "PBINPUT.BAS (Author: Egbert Zijlema)" COLOR 7 LOCATE 3, 2 : PRINT "This line editor includes accented characters "; PRINT "to match the needs of our" LOCATE 4, 2 : PRINT "European friends. It uses 'dead' keys. After "; PRINT "pressing such a key nothing" LOCATE 5, 2 : PRINT "happens until you press another key. "; PRINT "Dead keys are:" COLOR 15 LOCATE 7, 4 : PRINT CHR$(34); PRINT " (double quote) ' (single quote)" LOCATE 8, 4 : PRINT ": (colon) ; (semi colon)" LOCATE 9, 4 : PRINT "^ (circumflex) ` (accent grave)" LOCATE 10, 4 : PRINT "~ (for Spanish users)" COLOR 7 LOCATE 12, 2 : PRINT "Pressing the double quote ("; CHR$(34); PRINT ") followed by an a returns: "; COLOR 15 : PRINT CHR$(132) COLOR 7 LOCATE 13, 2 : PRINT "Single quote ("; CHR$(39); ") followed by e = "; COLOR 15 : PRINT CHR$(130) COLOR 7 LOCATE 14, 2 : PRINT "Circumflex ("; CHR$(94); ") followed by o = "; COLOR 15 : PRINT CHR$(147) COLOR 7 LOCATE 15, 2 : PRINT "Pressing a dead key twice displays the dead key's "; PRINT "character itself." LOCATE 16, 2 : PRINT "A dead key followed by a non-matching character "; PRINT "displays the dead key +" LOCATE 17, 2 : PRINT "that particular character. So: double quote "; PRINT CHR$(40, 34, 41); " followed by H = "; COLOR 15 : PRINT CHR$(34, 72) COLOR 7 LOCATE 19, 2 : PRINT "In addition, some characters can be generated by "; PRINT "pressing the Alt key" LOCATE 20, 2 : PRINT "followed by a character key (see: equates). "; PRINT "Alt-f, for instance, returns" LOCATE 21, 2 : PRINT "Dutch florin "; CHR$(40, 159, 41, 46, 32); PRINT "Alt-c the dollar cent sign "; CHR$(40, 155, 41, 46) LOCATE 25, 2 : PRINT "Press any key to try it yourself"; DO : LOOP UNTIL LEN(INKEY$) END SUB ' main module CLS StartScreen COLOR 7, 0 CLS rows = 1 ' start at first row last = 4 ' edit 4 rows LOCATE 2, 2: PRINT "First line : " LOCATE 3, 2: PRINT "Second line: "; second$ LOCATE 4, 2: PRINT "Third line : " LOCATE 5, 2: PRINT "Fourth line: " DO SELECT CASE rows CASE 1 length = 30 ' maximum 30 chars editor 2, 15, first$, length, rows, last CASE 2 length = 30 editor 3, 15, second$, length, rows, last CASE 3 length = 8 editor rows + 1, 15, third$, length, rows, last CASE 4 length = 15 editor rows + 1, 15, fourth$, length, rows, last END SELECT LOOP UNTIL rows > last LOCATE 10, 2 IF rows = last + 1 THEN ' normal exit ' normally you save your work here PRINT "No, there is no 5th line; we don't compose limericks after all!" ELSE PRINT "You pressed Esc; your work will not be saved" END IF END