TreeProg

A keyword-in-context indexing tool (you capitalize key words)
using a sequential file binary sort in QuickBASIC 4.50


DECLARE SUB frame (left%, right%, top%, bottom%)
DECLARE SUB oldfile ()
DECLARE SUB mark ()
DECLARE SUB scan ()
DECLARE SUB traverse ()
DECLARE SUB pointers ()
DECLARE SUB rotate ()
DECLARE SUB intake ()
DECLARE SUB bldfile ()
DECLARE SUB newfile ()
REM BINARY TREE
TYPE kwicRec
  lf AS INTEGER
  hl AS STRING * 60
  pg AS STRING * 3
  dt AS STRING * 14
  rt AS INTEGER
  END TYPE
DIM SHARED kwic AS kwicRec
COMMON SHARED hl$, pg$, dt$, q$
COMMON SHARED pt%, ef%, n%
CLEAR , , 2000
CLS
LOCATE 5
PRINT TAB(29); "WELCOME TO TREEPROG": PRINT
PRINT TAB(28); "Please specify a file"
PRINT TAB(23); "(Example==> C:\TEMP.DAT)"
PRINT TAB(27); "and press ENTER to begin"
PRINT : PRINT TAB(27); "use ";
COLOR 0, 7
PRINT "C";
COLOR 7, 0
PRINT "aps for entry ";
COLOR 0, 7
PRINT "T";
COLOR 7, 0
PRINT "erms"
frame 18, 58, 2, 14
PRINT : PRINT : PRINT
DO
  LINE INPUT "File specification==> "; z$
LOOP UNTIL LEFT$(RIGHT$(z$, 4), 1) = "."
OPEN z$ FOR RANDOM AS #1 LEN = LEN(kwic)
y$ = LEFT$(z$, LEN(z$) - 3) + "TXT"
OPEN y$ FOR OUTPUT AS #2
DO
  CLS
  BEEP
  LINE INPUT "(B)uild or (M)anip or (X)Stop==> "; q$
  PRINT
  SELECT CASE UCASE$(q$)
    CASE "B"
      LINE INPUT "(N)ew file or (A)ppend to old==> "; q$
      SELECT CASE UCASE$(q$)
        CASE "N"
          newfile
          bldfile
        CASE "A"
          oldfile
          bldfile
      END SELECT
    CASE "M"
      LINE INPUT "(S)earch (D)elete (L)ist (X)==> "; q$
      q$ = UCASE$(q$)
      PRINT
      SELECT CASE q$
        CASE "S"
          CLOSE #2
          OPEN y$ FOR OUTPUT AS #2
          oldfile
          scan
          traverse
          IF hl$ <> "@" THEN
            LINE INPUT z$
          END IF
        CASE "D"
          oldfile
          scan
          mark
        CASE "L"
          CLOSE #2
          OPEN y$ FOR OUTPUT AS #2
          oldfile
          traverse
          LINE INPUT z$
        CASE "X"
      END SELECT
    CASE "X"
      CLOSE
      CLS
      END
  END SELECT
LOOP

SUB bldfile
  ef% = VAL(kwic.dt)
  DO
    ef% = ef% + 1
    intake
    rotate
  LOOP UNTIL hl$ = ""
  GET #1, 1, kwic
  kwic.dt = STR$(ef%)
  PUT #1, 1, kwic
END SUB

SUB frame (left%, right%, top%, bottom%)
  LOCATE top%, left%: PRINT CHR$(201)
  LOCATE top%, right%: PRINT CHR$(187)
  LOCATE bottom%, left%: PRINT CHR$(200)
  LOCATE bottom%, right%: PRINT CHR$(188)
  FOR vert% = top% + 1 TO bottom% - 1
    LOCATE vert%, left%: PRINT CHR$(186);
    LOCATE vert%, right%: PRINT CHR$(186);
  NEXT vert%
  horiz% = right% - left% - 1
  hline$ = STRING$(horiz%, 205)
  LOCATE top%, left% + 1: PRINT hline$
  LOCATE bottom%, left% + 1: PRINT hline$
END SUB

SUB intake
  PRINT
  LINE INPUT "HEADLINE==> "; hl$
  IF hl$ = "" THEN EXIT SUB
  LINE INPUT "PAGE==> "; pg$
  IF LEN(pg$) = 1 THEN
    pg$ = " " + pg$
  END IF
  PRINT "DATE==> "; kwic.dt;
  LINE INPUT "  OK? "; q$
  IF UCASE$(q$) = "N" THEN LINE INPUT "DATE==> "; dt$
  dt$ = UCASE$(dt$)
  pt% = 1
END SUB

SUB mark
  IF hl$ <> "@" THEN
    PRINT kwic.hl; kwic.dt; "P."; kwic.pg
    IF RIGHT$(kwic.hl, 1) = "@" THEN
      PRINT : PRINT "DELETED"
      LINE INPUT z$
    ELSE
      PRINT
      LINE INPUT "DELETE? "; q$
    END IF
    IF UCASE$(q$) = "Y" THEN
      kwic.hl = LEFT$(kwic.hl, 59) + "@"
      PUT #1, pt%, kwic
    END IF
  END IF
END SUB

SUB newfile
  LINE INPUT "Are you sure? "; q$
  IF UCASE$(q$) <> "Y" THEN EXIT SUB
  kwic.lf = 0
  kwic.hl = "*ROOT*" + SPACE$(53) + "@"
  kwic.pg = ""
  kwic.dt = "1"
  kwic.rt = 0
  ef% = 1
  PUT #1, ef%, kwic
END SUB

SUB oldfile
  GET #1, 1, kwic
  hl$ = ""
  pg$ = ""
  dt$ = ""
  n% = 0
END SUB

SUB pointers
  hl$ = UCASE$(hl$)
  GET #1, pt%, kwic
  IF hl$ <= kwic.hl THEN
    IF kwic.lf = 0 THEN
      kwic.lf = ef%
      PUT #1, pt%, kwic
      kwic.lf = 0
      kwic.hl = hl$
      kwic.pg = pg$
      kwic.dt = dt$
      kwic.rt = 0
      PUT #1, ef%, kwic
      EXIT SUB
    ELSE
      pt% = kwic.lf
    END IF
  ELSE
    IF kwic.rt = 0 THEN
      kwic.rt = ef%
      PUT #1, pt%, kwic
      kwic.lf = 0
      kwic.hl = hl$
      kwic.pg = pg$
      kwic.dt = dt$
      kwic.rt = 0
      PUT #1, ef%, kwic
      EXIT SUB
    ELSE
      pt% = kwic.rt
    END IF
  END IF
  pointers
END SUB

SUB rotate
  IF hl$ = "" THEN EXIT SUB
  FOR i = 1 TO LEN(hl$)
    t$ = hl$
    p = ASC(MID$(hl$, i, 1))
    IF p > 64 AND p < 91 THEN
      IF i = 1 THEN
        pointers
      ELSE
        pt% = 1
        ef% = ef% + 1
        hl$ = MID$(hl$, i) + "/ " + LEFT$(hl$, i - 1)
        pointers
      END IF
    END IF
    hl$ = t$
  NEXT i
END SUB

SUB scan
  CLS
  LINE INPUT "TARGET KEY==> "; hl$
  hl$ = UCASE$(hl$)
  PRINT
  IF q$ = "S" THEN
    LINE INPUT "OUTPUT TO PRINTER? "; q$
    q$ = UCASE$(q$)
    PRINT
  END IF
  DO
    IF hl$ > LEFT$(kwic.hl, LEN(hl$)) THEN
      IF kwic.rt = 0 THEN
        PRINT "STEM NOT FOUND"
        hl$ = "@"
        LINE INPUT z$
        EXIT SUB
      ELSE
        pt% = kwic.rt
        GET #1, pt%, kwic
      END IF
    ELSE
      IF hl$ < LEFT$(kwic.hl, LEN(hl$)) THEN
        IF kwic.lf = 0 THEN
          PRINT "STEM NOT FOUND"
          hl$ = "@"
          LINE INPUT z$
          EXIT SUB
        ELSE
          pt% = kwic.lf
          GET #1, pt%, kwic
        END IF
      ELSE
        EXIT SUB
      END IF
    END IF
  LOOP
END SUB

SUB traverse
  IF RIGHT$(kwic.hl, 1) <> "@" THEN
    kwic.hl = LEFT$(kwic.hl, LEN(kwic.hl) - 2) + "  "
  END IF
  IF kwic.lf = 0 AND kwic.rt = 0 THEN
    IF RIGHT$(kwic.hl, 1) <> "@" AND LEFT$(kwic.hl, LEN(hl$)) = hl$ THEN
      PRINT kwic.hl; kwic.dt; "P."; kwic.pg
      IF q$ = "Y" THEN
        LPRINT kwic.hl; kwic.dt; "P."; kwic.pg
      END IF
      w$ = kwic.hl + kwic.dt + "P." + kwic.pg
      WRITE #2, w$
      n% = n% + 1
      IF n% = 23 THEN
        n% = 0
        LINE INPUT z$
      END IF
    END IF
  END IF
  IF kwic.lf <> 0 AND kwic.rt <> 0 THEN
    lh$ = kwic.hl
    gp$ = kwic.pg
    td$ = kwic.dt
    rt% = kwic.rt
    GET #1, kwic.lf, kwic
    traverse
    IF RIGHT$(lh$, 1) <> "@" AND LEFT$(lh$, LEN(hl$)) = hl$ THEN
      PRINT lh$; td$; "P."; gp$
      IF q$ = "Y" THEN
        LPRINT lh$; td$; "P."; gp$
      END IF
      w$ = lh$ + td$ + "P." + gp$
      WRITE #2, w$
      n% = n% + 1
      IF n% = 23 THEN
        n% = 0
        LINE INPUT z$
      END IF
    END IF
    GET #1, rt%, kwic
    traverse
  END IF
  IF kwic.lf <> 0 AND kwic.rt = 0 THEN
    lh$ = kwic.hl
    gp$ = kwic.pg
    td$ = kwic.dt
    GET #1, kwic.lf, kwic
    traverse
    IF RIGHT$(lh$, 1) <> "@" AND LEFT$(lh$, LEN(hl$)) = hl$ THEN
      PRINT lh$; td$; "P."; gp$
      IF q$ = "Y" THEN
        LPRINT lh$; td$; "P."; gp$
      END IF
      w$ = lh$ + td$ + "P." + gp$
      WRITE #2, w$
      n% = n% + 1
      IF n% = 23 THEN
        n% = 0
        LINE INPUT z$
      END IF
    END IF
  END IF
  IF kwic.lf = 0 AND kwic.rt <> 0 THEN
    IF RIGHT$(kwic.hl, 1) <> "@" AND LEFT$(kwic.hl, LEN(hl$)) = hl$ THEN
      PRINT kwic.hl; kwic.dt; "P."; kwic.pg
      IF q$ = "Y" THEN
        LPRINT kwic.hl; kwic.dt; "P."; kwic.pg
      END IF
      w$ = kwic.hl + kwic.dt + "P." + kwic.pg
      WRITE #2, w$
      n% = n% + 1
      IF n% = 23 THEN
        n% = 0
        LINE INPUT z$
      END IF
    END IF
    GET #1, kwic.rt, kwic
    traverse
  END IF
END SUB