' Dos Database ' made by Svjatoslav Agejenko ' in 2002 DECLARE SUB box (x1%, y1%, x2%, y2%) DECLARE SUB ssort (s%, m%) DECLARE SUB sort (s%, w%) REM $DYNAMIC DECLARE SUB cmp (a$, b$, r%) DECLARE SUB boss () DECLARE SUB std (a$) DECLARE FUNCTION cnum$ (a%) DECLARE SUB fload (a$, b%, c%, d%) DECLARE SUB putfs (f%, l%, s%, c$) DECLARE SUB gets (l%, s%, a$) DECLARE SUB puts (l%, s%, a$) DECLARE SUB runf (a$) DECLARE SUB getfil (a%) DEFINT A-Y DECLARE SUB mkson (a$) DECLARE SUB title (a$) DECLARE SUB strip (a$, b$) DECLARE SUB cmd (a$) DECLARE SUB conkey (a$) DECLARE SUB conn (a$) DECLARE SUB ch () DECLARE SUB chkey (a$) DECLARE SUB getkey (a$) DECLARE SUB conm (a$, c) DECLARE SUB start () DIM SHARED con$(1 TO 50) DIM SHARED conc(1 TO 50) DIM SHARED concmd$ DIM SHARED conx DIM SHARED sona$(1 TO 20) DIM SHARED mitus DIM SHARED buf$(1 TO 5000) DIM SHARED bufu(1 TO 5000) DIM SHARED bufl(1 TO 1000, 1 TO 30) DIM SHARED buflu(1 TO 1000) DIM SHARED lng DIM SHARED opf(1 TO 30) DIM SHARED hist$(1 TO 20) DIM SHARED histp, histk DIM SHARED buff(1 TO 30, 1 TO 1000) DIM SHARED stack(1 TO 2000, 1 TO 10) DIM SHARED stackl(1 TO 10) DIM SHARED stdl start 1 ch GOTO 1 REM $STATIC SUB boss y1 = 0 yp1 = 100 y2 = 0 yp2 = 100 lx = 160 ly = 100 lxp = 1 lyp = -1 SCREEN 13 GOSUB 18 16 a$ = INKEY$ IF a$ = CHR$(0) + "H" THEN yp1 = yp1 - 25 IF a$ = CHR$(0) + "P" THEN yp1 = yp1 + 25 IF a$ = CHR$(27) THEN GOTO 17 LINE (10, y1 - 35)-(20, y1 + 35), 0, B LINE (11, y1 - 34)-(19, y1 + 34), 15, B LINE (310, y2 - 35)-(300, y2 + 35), 0, B LINE (309, y2 - 34)-(301, y2 + 34), 15, B LINE (lx - 10, ly - 10)-(lx + 10, ly + 10), 0, B LINE (lx - 9, ly - 9)-(lx + 9, ly + 9), 15, B lx = lx + lxp ly = ly + lyp IF ly < 20 THEN lyp = 1 IF ly > 180 THEN lyp = -1 IF lx < 30 THEN lxp = 1 IF ly < y1 - 35 OR ly > y1 + 35 THEN SOUND 1000, 1 END IF IF lx > 290 THEN lxp = -1: GOSUB 18 IF yp1 > 0 THEN y1 = y1 + 1: yp1 = yp1 - 1 IF yp1 < 0 THEN y1 = y1 - 1: yp1 = yp1 + 1 IF yp2 > 0 THEN y2 = y2 + 1: yp2 = yp2 - 1 IF yp2 < 0 THEN y2 = y2 - 1: yp2 = yp2 + 1 SOUND 0, .1 GOTO 16 18 tlx = lx tly = ly tlyp = lyp tlxp = lxp 19 lx = lx + lxp ly = ly + lyp IF ly < 20 THEN lyp = 1 IF ly > 180 THEN lyp = -1 IF lx < 30 THEN lxp = 1 IF lx > 290 THEN yp2 = ly - y2 ELSE GOTO 19 END IF SWAP lx, tlx SWAP ly, tly SWAP lyp, tlyp SWAP lxp, tlxp RETURN 17 SCREEN 0 WIDTH 80, 50 VIEW PRINT 1 TO 50 END SUB SUB box (x1, y1, x2, y2) b$ = "" c$ = "" FOR a = x1 TO x2 b$ = b$ + " " c$ = c$ + "-" NEXT a b$ = "|" + b$ + "|" c$ = "|" + c$ + "|" COLOR 14, 0 LOCATE y1, x1 PRINT c$ LOCATE y2, x1 PRINT c$ FOR a = y1 + 1 TO y2 - 1 LOCATE a, y1 PRINT b$ NEXT a END SUB SUB ch chkey a$ IF a$ <> "" THEN conkey a$ END SUB SUB chkey (a$) a$ = INKEY$ IF a$ <> "" THEN IF a$ = CHR$(0) + "M" THEN a$ = "pa" IF a$ = CHR$(0) + "K" THEN a$ = "va" IF a$ = CHR$(0) + "H" THEN a$ = "ul" IF a$ = CHR$(0) + "P" THEN a$ = "al" END IF END SUB SUB cmd (a$) IF a$ = SPACE$(LEN(a$)) THEN GOTO 5 conm a$, 14 mkson a$ IF mitus = 0 THEN GOTO 5 SELECT CASE sona$(1) CASE "help" title "help" conm "help - for help", 7 conm "quit - quit program", 7 conm "b - boss screen", 7 conm "memstat- show info about memory blocks", 7 conm "memput - put data to specified memoy block", 7 conm "memlist - show memory blocks, starting from ", 7 conm "runf - run script file", 7 conm "lnstat - show info about memory lines", 7 conm "lnput ... put data in starting from ", 7 conm "lnlist - show contenc of memory lines", 7 conm "fstat - show info about memory files", 7 conm "fput ... put data in memory file", 7 conm "fload - load data file into memory file", 7 conm "cls - clear screen", 7 conm "stclear - clear stack", 7 conm "chklin - determine used line numbers to STDOUT", 7 conm "stacksize - determine stack size to STDOUT", 7 conm "filtand ... filters out lines to STDOUT", 7 conm "filtor ... filters out lines to STDOUT", 7 conm "disp ... display formatted selected cells to STDOUT", 7 conm "sort - sort elements by value, lower first", 7 conm "swap - swap stack elements (backwards)", 7 conm "ssort - sort stack in alphabetical order", 7 conm "memget - allocates memory block, and puts there -", 7 conm "liststack - show stack values to STDOUT", 7 conm "ask - asks question, and stores result", 7 conm "flnget - get unused line in file", 7 GOTO 5 CASE "quit" SYSTEM CASE "memstat" title "memory blocks summary" c = 0 lng = 0 FOR b = 1 TO 5000 IF bufu(b) > 0 THEN c = c + 1 lng = lng + LEN(buf$(b)) NEXT b d$ = "memory blocks used:" + STR$(c) + " total 5000" conm d$, 7 d$ = "data size:" + STR$(lng) conm d$, 7 GOTO 5 CASE "memput" b = VAL(sona$(2)) strip sona$(3), c$ IF c$ = "" THEN bufu(b) = 0 buf$(b) = "" ELSE bufu(b) = 1 buf$(b) = sona$(3) END IF GOTO 5 CASE "memlist" b = VAL(sona$(2)) c = VAL(sona$(3)) IF b = 0 THEN b = 1 IF c = 0 THEN c = 1 FOR d = b TO 5000 IF c = 0 THEN GOTO 5 IF bufu(d) > 0 THEN e$ = cnum(d) + ":" + SPACE$(5 - LEN(cnum(d))) e$ = e$ + buf$(d) conm e$, 7 c = c - 1 END IF NEXT d GOTO 5 CASE "runf" runf sona$(2) GOTO 5 CASE "lnstat" title "memory lines summary" c = 0 d = 0 FOR b = 1 TO 1000 IF buflu(b) > 0 THEN c = c + 1: d = d + buflu(b) NEXT b d$ = "memory lines used:" + STR$(c) + " total 1000" conm d$, 7 d$ = "total number of words in lines:" + STR$(d) conm d$, 7 GOTO 5 CASE "lnput" b = VAL(sona$(2)) c = VAL(sona$(3)) e = mitus IF e < 4 THEN e = 4 FOR d = 4 TO e puts b, c + d - 4, sona$(d) NEXT d GOTO 5 CASE "lnlist" b = VAL(sona$(2)) c = VAL(sona$(3)) FOR d = b TO 1000 IF c = 0 THEN GOTO 5 IF buflu(d) > 0 THEN e$ = cnum(d) + ":" e$ = e$ + SPACE$(5 - LEN(e$)) e$ = e$ + cnum(buflu(d)) e$ = e$ + SPACE$(8 - LEN(e$)) FOR g = 1 TO 10 gets d, g, f$ e$ = e$ + " >" + f$ NEXT g conm e$, 7 c = c - 1 END IF NEXT d GOTO 5 CASE "fstat" title "Memory files summary" FOR b = 1 TO 30 e = 0 FOR c = 1 TO 1000 IF buff(b, c) > -1 THEN IF e = 0 THEN d$ = "File number:" + STR$(b) conm d$, 7 e = e + 1 END IF d$ = "on line:" + STR$(c) + " allocated memory line: " + STR$(buff(b, c)) conm d$, 7 END IF NEXT c NEXT b GOTO 5 CASE "fput" b = VAL(sona$(2)) c = VAL(sona$(3)) d = VAL(sona$(4)) f = mitus IF f < 5 THEN f = 5 FOR e = 5 TO f putfs b, c, d + e - 5, sona$(e) NEXT e GOTO 5 CASE "cls" FOR b = 1 TO 50 conm " ", 7 NEXT b GOTO 5 CASE "fload" b = VAL(sona$(3)) c = VAL(sona$(4)) d = VAL(sona$(5)) IF b = 0 THEN b = 1 IF c = 0 THEN c = 1 IF d = 0 THEN d = 1 fload sona$(2), b, c, d GOTO 5 CASE "stclear" b = VAL(sona$(2)) IF b = 0 THEN b = 1 stackl(b) = 0 GOTO 5 CASE "chklin" b = VAL(sona$(2)) c = VAL(sona$(3)) d = VAL(sona$(4)) IF b = 0 THEN b = 1 IF c = 0 THEN c = 1 IF d = 0 THEN d = 1000 FOR e = c TO d IF buff(b, e) > 0 THEN std cnum(buff(b, e)) NEXT e GOTO 5 CASE "stacksize" b = VAL(sona$(2)) IF b = 0 THEN b = 1 std cnum(stackl(b)) GOTO 5 CASE "b" boss conm "returning", 7 GOTO 5 CASE "filtor" b = VAL(sona$(2)) FOR e = 1 TO stackl(b) FOR c = 3 TO mitus STEP 2 gets stack(e, b), VAL(sona$(c)), f$ cmp f$, sona$(c + 1), d IF d = 1 THEN std cnum(stack(e, b)) GOTO 20 END IF NEXT c 20 NEXT e GOTO 5 CASE "disp" b = VAL(sona$(2)) DIM tmp1(1 TO 100) DIM tmp2(1 TO 100) FOR d = 1 TO 100 tmp2(d) = 0 NEXT d d = 0 FOR e = 3 TO mitus d = d + 1 tmp1(d) = VAL(sona$(e)) NEXT e FOR c = 1 TO stackl(b) FOR e = 1 TO d gets stack(c, b), tmp1(e), f$ IF tmp2(e) < LEN(f$) THEN tmp2(e) = LEN(f$) NEXT e NEXT c FOR c = 1 TO stackl(b) g$ = "" FOR e = 1 TO d gets stack(c, b), tmp1(e), f$ f$ = f$ + SPACE$(tmp2(e) - LEN(f$)) g$ = g$ + f$ + " # " NEXT e conm g$, 10 NEXT c ERASE tmp2 ERASE tmp1 GOTO 5 CASE "filtand" b = VAL(sona$(2)) FOR e = 1 TO stackl(b) FOR c = 3 TO mitus STEP 2 gets stack(e, b), VAL(sona$(c)), f$ cmp f$, sona$(c + 1), d IF d = 0 THEN GOTO 21 NEXT c std cnum(stack(e, b)) 21 NEXT e GOTO 5 CASE "sort" b = VAL(sona$(2)) c = VAL(sona$(3)) sort b, c GOTO 5 CASE "swap" b = VAL(sona$(2)) c = stackl(b) FOR d = 1 TO c / 2 SWAP stack(d, b), stack(c - d + 1, b) NEXT d GOTO 5 CASE "ssort" b = VAL(sona$(2)) c = VAL(sona$(3)) IF b = 0 THEN b = 1 IF c = 0 THEN c = 1 ssort b, c GOTO 5 CASE "memget" b = VAL(sona$(2)) IF b = 0 THEN b = 1 FOR c = 1 TO 5000 IF bufu(c) = 0 THEN bufu(c) = 1: buf$(c) = "-": stack(b, 10) = c: GOTO 23 NEXT c 23 IF stackl(10) < b THEN stackl(10) = b GOTO 5 CASE "liststack" b = VAL(sona$(2)) c = VAL(sona$(3)) d = VAL(sona$(4)) IF b = 0 THEN b = 1 IF c = 0 THEN c = 1 IF d = 0 THEN d = stackl(b) FOR e = c TO d std cnum(stack(e, b)) NEXT e GOTO 5 CASE "ask" b$ = sona$(2) IF b$ = "" THEN b$ = "input" c = VAL(sona$(3)) d = VAL(sona$(4)) e = VAL(sona$(5)) box 5, 5, 75, 11 LOCATE 7, 7 PRINT b$ LOCATE 9, 7 INPUT "", f$ putfs c, d, e, f$ conm "'" + f$ + "' accepted", 7 GOTO 5 CASE "flnget" b = VAL(sona$(2)) c = VAL(sona$(3)) FOR d = 1 TO 1000 IF buff(b, d) = -1 THEN stack(c, 10) = d IF stackl(10) < c THEN stackl(10) = c GOTO 24 END IF NEXT d 24 GOTO 5 END SELECT conm "Invalid command", 12 5 END SUB SUB cmp (a$, b$, r) IF a$ = b$ THEN r = 1 ELSE r = 0 END SUB FUNCTION cnum$ (a) b$ = STR$(a) cnum$ = RIGHT$(b$, LEN(b$) - 1) END FUNCTION SUB conkey (a$) b$ = concmd$ + SPACE$(85) b$ = LEFT$(b$, 80) IF a$ = "va" THEN conx = conx - 1 IF a$ = "pa" THEN conx = conx + 1 IF a$ = "ul" THEN b$ = hist$(histk) histk = histk - 1 IF histk < 1 THEN histk = 20 END IF IF a$ = "al" THEN b$ = hist$(histk) histk = histk + 1 IF histk > 20 THEN histk = 1 END IF IF LEN(a$) = 1 THEN IF a$ = CHR$(13) THEN strip b$, c$ histp = histp + 1 IF histp > 20 THEN histp = 1 histk = histp hist$(histp) = c$ cmd c$ b$ = "" conx = 1 GOTO 4 END IF IF a$ = CHR$(8) THEN IF conx > 1 THEN b$ = LEFT$(b$, conx - 2) + RIGHT$(b$, 81 - conx) conx = conx - 1 END IF GOTO 4 END IF b$ = LEFT$(b$, conx - 1) + a$ + RIGHT$(b$, 81 - conx) conx = conx + 1 END IF 4 IF conx < 1 THEN conx = 1 IF conx > 80 THEN conx = 80 b$ = b$ + SPACE$(85) concmd$ = LEFT$(b$, 80) LOCATE 50, 1 COLOR 15, 1 PRINT concmd$; LOCATE 50, conx COLOR 0, 14 PRINT RIGHT$(LEFT$(concmd$, conx), 1); END SUB SUB conm (d$, c) a$ = d$ 14 IF LEN(a$) > 78 THEN b$ = LEFT$(a$, 78) conm b$, c a$ = " >> " + RIGHT$(a$, LEN(a$) - 78) GOTO 14 END IF b$ = a$ + SPACE$(80 - LEN(a$)) con$(50) = b$ conc(50) = c FOR a = 1 TO 49 con$(a) = con$(a + 1) conc(a) = conc(a + 1) NEXT a FOR a = 1 TO 49 LOCATE a, 1 COLOR conc(a), 0 PRINT con$(a) NEXT a END SUB SUB fload (a$, b, c, d) getfil h j = c l = 0 OPEN a$ FOR INPUT AS #h 12 IF EOF(h) <> 0 THEN GOTO 13 LINE INPUT #h, e$ IF LEFT$(e$, 3) = "// " THEN conm e$, 10 GOTO 12 END IF IF e$ = SPACE$(LEN(e$)) THEN GOTO 12 e$ = e$ + "|" l = l + 1 h$ = "" i = d FOR f = 1 TO LEN(e$) g$ = RIGHT$(LEFT$(e$, f), 1) IF g$ = "|" THEN putfs b, j, i, h$ h$ = "" g$ = "" i = i + 1 END IF IF g$ = CHR$(9) THEN g$ = "" h$ = h$ + g$ NEXT f j = j + 1 GOTO 12 13 CLOSE #h opf(h) = 0 k$ = "file: " + a$ + " loaded." + STR$(l) + " lines in file" conm k$, 7 END SUB SUB getfil (a) FOR b = 1 TO 30 IF opf(b) = 0 THEN opf(b) = 1: a = b: GOTO 7 NEXT b 7 END SUB SUB gets (l, s, a$) b = bufl(l, s) IF b = -1 THEN a$ = "" ELSE a$ = buf$(b) END IF END SUB SUB mkson (a$) mitus = 0 d = 1 FOR b = 1 TO LEN(a$) c$ = RIGHT$(LEFT$(a$, b), 1) IF c$ = " " THEN d = 1 ELSE IF d = 1 THEN mitus = mitus + 1 sona$(mitus) = "" d = 0 END IF sona$(mitus) = sona$(mitus) + c$ END IF NEXT b 'conm "sonad_______", 10 'FOR b = 1 TO mitus 'conm sona$(b), 14 'NEXT b FOR a = 1 TO mitus IF LEFT$(sona$(a), 2) = "|>" THEN IF sona$(a + 1) = "c" THEN stdl = 1 IF sona$(a + 1) = "s" THEN stdl = 10 + VAL(sona$(a + 2)) mitus = a - 1 GOTO 15 END IF IF LEFT$(sona$(a), 2) = "|@" THEN sona$(a) = cnum(stack(VAL(RIGHT$(sona$(a), LEN(sona$(a)) - 2)), 10)) END IF NEXT a 15 FOR a = mitus + 1 TO 20 sona$(a) = "" NEXT a END SUB SUB putfs (f, l, s, c$) 'DIM SHARED buff(1 TO 30, 1 TO 1000) la = buff(f, l) IF la = -1 THEN FOR a = 1 TO 1000 IF buflu(a) = 0 THEN la = a: GOTO 10 NEXT a 10 END IF puts la, s, c$ IF buflu(la) = 0 THEN buff(f, l) = -1 ELSE buff(f, l) = la END SUB SUB puts (l, s, a$) 'PRINT l, s IF a$ = "|" THEN a$ = "" IF a$ = "||" THEN GOTO 11 'conm a$, 13 b = bufl(l, s) IF b = -1 THEN 'DIM SHARED buf$(1 TO 10000) 'DIM SHARED bufu(1 TO 10000) FOR c = 1 TO 10000 IF bufu(c) = 0 THEN GOTO 6 NEXT c 6 b = c bufu(b) = 1 buflu(l) = buflu(l) + 1 END IF strip a$, c$ IF c$ = "" THEN bufu(b) = 0 buf$(b) = "" bufl(l, s) = -1 buflu(l) = buflu(l) - 1 ELSE buf$(b) = c$ bufl(l, s) = b END IF 11 END SUB SUB runf (a$) getfil h OPEN a$ FOR INPUT AS #h 9 IF EOF(h) <> 0 THEN GOTO 8 LINE INPUT #h, b$ cmd b$ GOTO 9 8 CLOSE #h opf(h) = 0 END SUB SUB sort (s, w) DIM tmp1(1 TO 10000) DIM tmp2(1 TO 10000) b = stackl(s) FOR a = 1 TO b gets stack(a, s), w, c$ tmp1(a) = VAL(c$) tmp2(a) = a NEXT a d = 1 FOR a = 1 TO b e = 32000 FOR c = d TO b IF tmp1(c) < e THEN e = tmp1(c): f = c NEXT c SWAP tmp1(a), tmp1(f) SWAP tmp2(a), tmp2(f) d = d + 1 NEXT a FOR a = 1 TO b stack(a, s) = tmp2(a) NEXT a END SUB SUB ssort (s, m) DIM tbti(1 TO 2000) DIM tbtp(1 TO 2000) DIM tbt$(1 TO 2000) FOR a = 1 TO stackl(s) gets stack(a, s), m, b$ tbt$(a) = b$ tbtp(a) = a NEXT a b = stackl(s) FOR a = 1 TO stackl(s) d$ = tbt$(1) e = 1 f = ASC(LEFT$(d$, 1)) FOR c = 2 TO b IF ASC(LEFT$(tbt$(c), 1)) = f THEN IF d$ <> tbt$(c) THEN g$ = d$ + CHR$(0) h$ = tbt$(c) + CHR$(0) i = LEN(g$) IF LEN(h$) > i THEN i = LEN(h$) FOR j = 1 TO i k = ASC(RIGHT$(LEFT$(g$, j), 1)) l = ASC(RIGHT$(LEFT$(h$, j), 1)) IF k < l THEN GOTO 22 IF l < k THEN e = c: d$ = tbt$(c): f = ASC(LEFT$(d$, 1)): GOTO 22 NEXT j END IF END IF IF ASC(LEFT$(tbt$(c), 1)) < f THEN f = ASC(LEFT$(tbt$(c), 1)): e = c: d$ = tbt$(c) 22 NEXT c tbti(a) = tbtp(e) tbt$(e) = tbt$(b) tbtp(e) = tbtp(b) b = b - 1 NEXT a FOR a = 1 TO stackl(s) stack(a, s) = tbti(a) NEXT a conm "done", 7 END SUB SUB start WIDTH 80, 50 VIEW PRINT 1 TO 50 CLS conx = 1 histp = 1 histk = 1 stdl = 1 conm "DDBASE, (Dos Data BASE) 0.0", 7 conm "Copyright Svjatoslav Agejenko. All Rights Reserved.", 7 conm "starting...", 7 FOR a = 1 TO 5000 bufu(a) = 0 buf$(a) = "" NEXT a FOR a = 1 TO 30 FOR b = 1 TO 1000 bufl(b, a) = -1 buff(a, b) = -1 NEXT b opf(a) = 0 NEXT a FOR a = 1 TO 1000 buflu(a) = 0 NEXT a FOR a = 1 TO 10 stackl(a) = 0 NEXT a a$ = "runf auto.scr" FOR b = 1 TO LEN(a$) c$ = RIGHT$(LEFT$(a$, b), 1) conkey c$ NEXT b conkey CHR$(13) END SUB SUB std (a$) 'conm a$, 2 SELECT CASE stdl CASE 1 conm a$, 10 CASE 11 TO 20 b = stdl - 10 stackl(b) = stackl(b) + 1 stack(stackl(b), b) = VAL(a$) c$ = a$ + " > " + cnum(stackl(b)) + " ! " + cnum(b) END SELECT END SUB SUB strip (a$, b$) b$ = a$ 2 IF LEFT$(b$, 1) = " " THEN b$ = RIGHT$(b$, LEN(b$) - 1): GOTO 2 3 IF RIGHT$(b$, 1) = " " THEN b$ = LEFT$(b$, LEN(b$) - 1): GOTO 3 END SUB SUB title (a$) conm " ", 10 conm "================> " + a$ + " <===============", 7 END SUB