%%HP: T(3)A(D)F(.);
@ Version 1.1
@ Copyright 1990 Ross Barnes
DIR
  XQDB
    \<< RCLMENU \-> m
      \<< :0: { DB
INIT.0 } EVAL { USE
FIND EDIT ADD DEL
EXIT } \-> m1
        \<<
          DO m1
TMENU :0: { DB VU.0
} EVAL -1 WAIT \-> k
            \<<
              CASE
k 25.1 SAME
THEN DBINFO 2 GET 1
- :0: { DB MOV.0 }
EVAL 0
END k 25.3 SAME
THEN 1 :0: { DB
MOV.0 } EVAL 0
END k 35.1 SAME
THEN DBINFO 2 GET 1
+ :0: { DB MOV.0 }
EVAL 0
END k 35.3 SAME
THEN MAXR \->NUM :0:
{ DB MOV.0 } EVAL 0
END k 51.1 SAME
THEN DBINFO OBJ\->
DROP2 GET 0
END k 11.1 SAME
THEN :0: { DB USE.0
} EVAL 0
END k 11.2 SAME
THEN :0: { DB NUDB
} EVAL 1 "" 3 \->LIST
'DBINFO' STO 0
END k 12.1 SAME
THEN :0: { DB FND.0
} EVAL 0
END k 13.1 SAME
THEN :0: { DB EDT.0
} EVAL 0
END k 14.1 SAME
THEN :0: { DB ADD.0
} EVAL 0
END k 15.1 SAME
THEN :0: { DB DEL.0
} EVAL 0
END k 16.1 SAME
THEN -1
END 0
              END
            \>>
          UNTIL
          END
        \>> m MENU
      \>>
    \>>
  DEL.0
    \<< "Yy"
"Delete record?" {
"N" \Ga } INPUT POS
      IF
      THEN DBINFO
OBJ\-> DROP2 \-> db
recno
        \<<
          IF recno
1 >
          THEN db
RCL 1 recno 1 - SUB
db RCL recno 1 +
MAXR \->NUM SUB + db
STO
          END recno
1 - :0: { DB MOV.0
} EVAL
        \>>
      END
    \>>
  INIT.0
    \<<
      IF VARS
'DBINFO' POS
      THEN
        IF DBINFO
SIZE 3 ==
        THEN
         IF DBINFO \->
d
          \<< d TYPE
5 \=/ d 1 GET TYPE 6
\=/ OR d 3 GET TYPE 2
\=/ OR d 2 GET TYPE 0
\=/ OR
          \>>
         THEN
"DBINFO is invalid"
KILL
         END
      ELSE
       "DBINFO is invalid"
        KILL
      END
      ELSE { "" 1
"" } 'DBINFO' STO
:0: { DB USE.0 }
EVAL
      END
    \>>
  NUDB
    \<<
"New database name?"
{ ".DB" 1 \Ga } INPUT
OBJ\->
"Number of fields?"
{ "" \Ga } INPUT OBJ\->
\-> n
      \<< 1 n
        FOR i "FLD"
i \->STR +
        NEXT n
\->LIST 1 \->LIST OVER
STO
      \>>
    \>>
  EDT.0
    \<< DBINFO OBJ\->
DROP2 OVER 1 GET \->
db recno flds
      \<< 1 flds SIZE
        FOR i flds
i GET "?" + db
recno GET i GET '\Ga'
2 \->LIST INPUT
        NEXT flds
SIZE \->LIST db recno
ROT PUT
      \>>
    \>>
  VU.0
    \<< DBINFO OBJ\->
DROP2 GET \-> rec
      \<< 3 7
        FOR i "" i
DISP
        NEXT 1 rec
SIZE 7 MIN
        FOR i rec i
GET i 2 + DISP
        NEXT
      \>>
    \>>
  USE.1
    \<< { } VARS \-> vl
      \<< 1 vl SIZE
        FOR i vl i
GET DUP \->STR ".DB"
POS
          IF
          THEN +
          ELSE DROP
          END
        NEXT
      \>>
    \>>
  USE.0
    \<< :0: { DB
USE.1 } EVAL DUP
TMENU
      IF SIZE
      THEN
"What database?"
DBINFO 1 GET \->STR 2
OVER SIZE 1 - SUB 1
\->LIST INPUT "'"
SWAP OVER + + OBJ\->
      ELSE :0: { DB
NUDB } EVAL
      END 1 "" 3
\->LIST 'DBINFO' STO
    \>>
  ADD.0
    \<< DBINFO 1 GET
DUP 1 GET SIZE { }
1 ROT
      START { "" }
+
      NEXT 1 \->LIST
STO+ MAXR \->NUM :0:
{ DB MOV.0 } EVAL
:0: { DB EDT.0 }
EVAL
    \>>
  MOV.0
    \<< 'DBINFO' SWAP
OVER 1 GET RCL SIZE
MIN 1 MAX 2 SWAP
PUT
    \>>
  FND.0
    \<< DBINFO OBJ\->
DROP '\Ga' 2 \->LIST
"Find what?" SWAP
INPUT 'DBINFO' OVER
3 SWAP PUT 3 ROLLD
1 + OVER RCL SIZE
MIN ROT :0: { DB
FND.1 } EVAL DUP
      IF
      THEN 'DBINFO'
2 ROT PUT
      ELSE DROP
      END
    \>>
  FND.1
    \<< \-> fs
      \<<
        DO \-> i
          \<< i GETI
\->STR fs POS
            IF
            THEN
DROP2 i 1
            ELSE
DUP 1 ==
              IF
              THEN
DROP2 0 1
              ELSE
0
              END
            END
          \>>
        UNTIL
        END
      \>>
    \>>
END
