home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpm
/
database
/
dims103.ark
/
DIMS.ASC
< prev
next >
Wrap
Text File
|
1986-12-07
|
10KB
|
368 lines
5 ' ***** DIMS *****
6 '
7 '
10 ' INITIALIZATION
20 DEFINT A-Z
30 GOSUB 3420 'cs
40 PRINT:PRINT TAB(29);"DIMS 1.03, January 20, 1984
45 'ACT-5A TERMINAL
50 PRINT
80 ' Dan's Information Management System
85 ' for Basic-80 and CP/M
90 ' originates from PIMS written by Madan L. Gupta
95 ' which comes from A People's Data Base System
96 ' by Gupta and Brent Lander (1977)
100 ' re-written by Dan Dugan, 1979, 1980, 1981, 1982, 1983
110 ' Public Domain - removal of this notice constitutes fraud
120 ' makes random disk records of 128 or 255 bytes
130 ' allows 15 or 30 data fields in record
140 ' makes automatic duplicate file
150 CLEAR,,1000 ' stack space for MBASIC 5.x
155 DEFINT A-Z
160 WIDTH LPRINT 255
170 ' init vars in this order for speed
180 I=0:J=0:K=0:X=0:Y=0:T$="":R$="":T1$="":SKIPPARSE=0:T=0:FT=0:SEARCH=0
190 ' then these for COMMON
200 C=0:N=0:NC=0:P6=0:P7=0:P8=0:P9=0:PI=0:S=0:T1=0:T2=0:F$="":FT$="":S$=""
210 DIM DD$(5)
220 DIM C$(10) ' commands
230 DIM N$(31), B$(32), C(30) ' 30 names + stop + N
240 DIM SEARCHWORD$(10), SEARCHFIELD(10), SKIPWORD$(10), LOOKFIELD(10)
243 NDRIVES=2:GOSUB 1360 ' init disk name strings
245 PRINT TAB(33);NDRIVES"disk system.
250 GOTO 1050
1000 '
WARM ENTRY
1010 DEFINT A-Z
1020 GOSUB 3420'cs
1023 IF C THEN GOSUB 1970 ' save header
1025 IF T=7 THEN CLOSE:GOTO 1650 ' goto
1030 IF T=8 THEN 4200 ' reopen
1033 IF T=9 THEN CLOSE:T=0:GOTO 1050 ' done
1035 IF T=11 THEN 2100 ' backup
1040 IF T=12 THEN 3000 ' renumber
1050 'some not needed but commoned to keep places for speed
1060 COMMON I,J,K,X,Y,T$,R$,S$,T1$,SKIPPARSE,FT,SEARCH,
C,N,NC,P6,P7,P8,P9,PI,S,T,T1,T2,C(),B$(),N$(),
SEARCHWORD$(),SEARCHFIELD(),SKIPWORD$(),LOOKFIELD(),DD$(),F$,FT$
1070 ON ERROR GOTO 3290
1080 '
NO-FILE MENU
1100 WIDTH 70 :RESET 'RESET here for floppy system
1105 IF E$<>"" THEN PRINT E$:PRINT
1110 PRINT:PRINT TAB(22)"Here are the data files on this disk:
1120 PRINT:FILES DD$(3)+"*.D?"
1125 WIDTH 255
1130 PRINT:PRINT:PRINT TAB(16);"************* DIMS NO-FILE MENU **************
1140 PRINT:PRINT TAB(16);"Open any data file shown above ............... 1
1150 PRINT TAB(16);"Install new disks ............................ 2
1160 PRINT
1170 PRINT TAB(16);"Design structure of a new file (DCREATE) ..... 3
1180 PRINT TAB(16);"Change number of disk drives for this session. 4
1190 PRINT
1200 PRINT TAB(16);"Exit DIMS to Basic ........................... 9
1210 PRINT TAB(16);"Exit DIMS to CP/M ............................ 0
1220 PRINT:PRINT TAB(16);STRING$(48,42):PRINT
1230 PRINT TAB(16);:
PRINT"To continue enter a number ................... ";
1240 A$=INPUT$(1): IF A$=CHR$(13) THEN A$="1"
1250 PRINT A$
1255 RESET ' safety for floppies
1260 IF A$="0" THEN SYSTEM
1270 IF A$="1" THEN GOTO 1650
1280 IF A$="2" THEN GOTO 1000
1290 IF A$="3" THEN CHAIN DD$(2)+"DCREATE"
1300 IF A$="4" THEN GOSUB 1330:GOTO 1000
1310 IF A$="9" THEN GOSUB 3420:STOP
1320 GOTO 1230
1330 '
(SUB) ASK # DISKS
1340 PRINT:PRINT TAB(27);:INPUT"Number of disks in system";NDRIVES
1345 PRINT:IF NDRIVES<1 THEN 1000
1350 IF NDRIVES>4 THEN 1340
1360 '
(SUB) INSTALL DISK NAMES
1370 RESTORE 1390
1380 ' DD$(1) (2) (3) (4) (5) ' file groups
1382 ' main trans data dupe misc
1383 ' pgms pgms file file files
1390 DATA 1,"A:","A:","A:","A:","A:"
1400 DATA 2,"A:","B:","A:","B:","B:"
1410 DATA 3,"A:","A:","B:","C:","A:"
1420 DATA 4,"A:","A:","B:","C:","D:"
1430 READ J
1440 FOR K=1 TO 5
1450 READ DD$(K)
1460 NEXT
1470 IF J<>NDRIVES THEN 1430
1480 IF A$<>"4" THEN RETURN
1490 ON NDRIVES GOTO 1500,1510,1540,1580
1500 PRINT"One disk system - all files and programs on A.":GOTO 1630
1510 PRINT"Two disk system: A: = main program and main data files
1520 PRINT TAB(19)"B: = transient programs, backup data files, aux. data files
1530 GOTO 1630
1540 PRINT
"Three disk system: A: = main program, transient programs, aux data files
1550 PRINT TAB(21)"B: = main data files
1560 PRINT TAB(21)"C: = backup data files
1570 GOTO 1630
1580 PRINT"Four disk system: A: = main and transient programs
1590 PRINT TAB(20)"B: = main data files
1600 PRINT TAB(20)"C: = backup data files
1610 PRINT TAB(20)"D: = aux. data files
1630 PRINT:PRINT TAB(29)"Hit return to continue.":A$=INPUT$(1)
1640 RETURN
1650 '
LOAD HEADER
1660 GOSUB 3480 ' get name & open up files
1670 GOSUB 3420 'cs
1690 GOSUB 3750 ' get record
1700 GOSUB 1880 'parse into B$'s
1710 FOR I=1 TO 31
1720 N$(I)=B$(I) 'load names
1730 IF LEFT$(N$(I),4)="stop" GOTO 1760
1740 C(I)=1
1750 NEXT I
1760 N=VAL(B$(I+1))
1770 NC=I-1 ' # cols
1780 PRINT TAB(20)"File "F$" is open. It has"N"records."
1790 '
EXIT TO DEDIT
1795 PRINT:PRINT TAB(24)"Waiting while DEDIT is loading."
1800 CHAIN DD$(1)+"DEDIT",1000
1810 '
(SUB) WRITE T$ AS RECORD # I
1820 ON FT GOTO 1850,1830
1830 LSET R$=MID$(T$,129) ' latter half
1840 PUT #1,FT*I+2
1850 LSET R$=LEFT$(T$,128) ' first half
1860 PUT #1,FT*I+1
1870 RETURN
1880 '
(SUB) PARSE STRING
1890 K=0
1900 J=INSTR(T$,CHR$(126)) ' delimiter
1910 IF J=0 THEN RETURN
1920 K=K+1
1930 B$(K)=MID$(T$,1,J-1)
1940 T$=MID$(T$,J+1)
1950 GOTO 1900
1970 '
(SUB) SAVE HEADERS
1990 PRINT:PRINT TAB(31)"Saving file header":PRINT TAB(39);
2000 T$=""
2010 FOR I=1 TO 31:
T$=T$+N$(I)+CHR$(126):
T1$=LEFT$(N$(I),4):
IF T1$="stop" THEN 2030
2020 NEXT I
2030 T$=T$+STR$(N)+CHR$(126) 'add N at end
2040 I=0
2050 GOSUB 1810 ' put rec 0
2060 PRINT "*";
2062 NR=0:T1$=T$:GOSUB 3960 'put dupe head
2064 PRINT"!"
2070 RETURN
2100 '
BACKUP makes dupe file
2110 CLOSE 2:KILL DD$(4)+F$+".DD"+FT$
2120 GOSUB 3720 ' open up .DD on 2
2130 PRINT"Copying main file to dupe file, same numbers.":PRINT
2140 FOR I=0 TO N
2150 IF INKEY$=CHR$(27) THEN PRINT:PRINT:PRINT"Copy aborted.":GOTO 3260
2160 GOSUB 3750: PRINT"+"; ' get record I in T$
2170 NR=I:T1$=T$:GOSUB 3960:PRINT"*"; ' put record NR
2180 NEXT
2190 PRINT:GOTO 3260 ' to DEDIT
3000 '
RENUMBER
COPY MAIN TO DUPE
3010 CLOSE 2:KILL DD$(4)+F$+".DD"+FT$
3020 GOSUB 3720 ' open 2
3030 PRINT"Copying main file to dupe file, renumbering.":PRINT
3040 NR=0
3050 FOR I=1 TO N
3060 IF INKEY$=CHR$(27) THEN PRINT:PRINT:PRINT"Renumber aborted.":GOTO 3260
3070 GOSUB 3750 ' get rec I in T$
3080 IF ASC(T$)=0 THEN PRINT"0";:GOTO 3100' skip it
3090 PRINT"+";:NR=NR+1:T1$=T$:GOSUB 3960:PRINT"!"; ' put rec NR
3100 NEXT
3110 GOSUB 4030 ' save header (NR)
3120 '
ERASE MAIN FILE AND COPY DUPE TO MAIN
3130 CLOSE
3140 PRINT:PRINT"The following operation removes space from deleted records:
3150 PRINT: PRINT"Erasing main file.
3160 KILL DD$(3)+F$+".D"+FT$
3170 PRINT:PRINT:PRINT"Copying dupe to main file.":PRINT
3180 GOSUB 3680 ' open both files
3190 FOR J=1 TO FT*(NR+1)
3200 GET #2,J
3210 PRINT"&";
3220 LSET R$=S$
3230 PUT #1,J
3240 PRINT"*";
3250 NEXT J
3251 N=NR
3252 PRINT:GOSUB 1970 'put header
3255 '
RETURN TO DEDIT
3260 GOTO 1790
3280 '
GENERAL ERROR ROUTINES
3290 IF ERL=1120 AND ERR=53 THEN RESUME 1130 ' if disk empty
3300 IF ERL=1740 AND ERR=9
THEN CLOSE:E$="CAN'T READ HEADER PROPERLY":RESUME 1000
3310 IF ERR=61 THEN PRINT:PRINT"Out of disk space.":PRINT:CLOSE:RESUME 1000
3312 IF ERR=53 THEN E$="FILE NOT FOUND":RESUME 1080
3320 ON ERROR GOTO 0
3330 '
UCV
3340 Y$=""
3350 FOR K=1 TO LEN(X$)
3360 Y$=Y$+" "
3370 X=ASC(MID$(X$,K, 1))
3380 IF 96<X AND X<123 THEN MID$(Y$,K,1)=CHR$(X-32): GOTO 3400
3390 MID$(Y$,K,1)=MID$(X$,K,1)
3400 NEXT
3410 RETURN
3420 '
(SUB) CLEAR SCREEN (TERM DEP)
3430 PRINT CHR$(12);
3440 RETURN
3480 '
(SUB) OPEN UP FILES
GET NAME
3490 F$=""
3500 C=0 ' clear change flag
3505 IF T=7 THEN F$=B$(0):T=0:GOTO 3525 ' goto commmand
3510 PRINT: PRINT TAB(17);: INPUT"Name of the file you want to open"; F$
3525 IF F$="" THEN 1000
3530 X$=F$
3540 GOSUB 3330 ' UCverter
3550 F$=Y$ ' make UC
3560 '
TEST NAME, EXTRACT FILE TYPE
3570 CLOSE
3580 ON ERROR GOTO 3610
3590 OPEN"I",1,DD$(3)+F$+".D"
3600 FT=1: FT$=" ": GOTO 3690 ' file is type 1
3610 IF ERR=64 THEN 3612 ELSE 3620
3612 E$="BAD FILE NAME":PRINT E$:IF T=7 THEN T=0:RESUME 1000
3614 RESUME 3480
3620 IF ERR=53 THEN CLOSE:RESUME 3630'not found
3630 ON ERROR GOTO 3660
3640 OPEN"I",1,DD$(3)+F$+".D2"
3650 FT=2: FT$="2": GOTO 3690 ' file is type 2
3660 IF ERR=53 THEN 3662 ELSE 3670
3662 E$="FILE NOT FOUND":PRINT E$:IF T=7 THEN T=0:RESUME 1000
3664 RESUME 3480
3670 ON ERROR GOTO 0
3680 '
OPEN UP FILES FOR REAL
3690 CLOSE:I=0:ON ERROR GOTO 3280
3700 OPEN "R",1,DD$(3)+F$+".D"+FT$
3710 FIELD #1,128 AS R$
3720 OPEN "R",2,DD$(4)+F$+".DD"+FT$
3730 FIELD #2, 128 AS S$
3740 RETURN
3750 '
(SUB) GET REC. I IN T$
3760 T$=""
3770 ON FT GOTO 3800,3780
3780 GET#1,FT*I+2 ' latter half
3790 T$=LEFT$(R$,127)
3800 GET#1,FT*I+1 ' whole or first half
3810 T$=R$+T$
3820 RETURN
3830 '
(SUB) SHOW FIELDS
3840 FOR J=1 TO NC
3850 IF C(J)=0 THEN 3880
3860 PRINT TAB(29);
3870 PRINT USING"##";J;:PRINT". "LEFT$(N$(J),4)" "RIGHT$(N$(J),1)
3880 NEXT
3890 PRINT
3900 RETURN
3960 '
(SUB) PUT T1$ AS REC NR
3970 ON FT GOTO 4000,3980
3980 LSET S$=MID$(T1$,129)
3990 PUT#2,FT*NR+2
4000 LSET S$=LEFT$(T1$,128)
4010 PUT#2,FT*NR+1
4020 RETURN
4030 '
(SUB) CLOSE DUPE FILE
4040 IF F2$=F$ THEN C=1:N=NR:GOTO 4130
4050 PRINT:PRINT:PRINT"Closing dupe file,"NR"records.
4060 T$=""
4070 FOR I=1 TO 31
4080 T$=T$+N$(I)+CHR$(126)
4090 IF LEFT$(N$(I),4)="stop" THEN 4110
4100 NEXT
4110 T1$=T$+STR$(NR)+CHR$(126)
4120 N1=NR:NR=0:GOSUB 3960:NR=N1
4130 CLOSE 2
4140 RETURN
4200 '
RE-OPEN AFTER DISK ERR
4210 CLOSE:GOSUB 3700:GOTO 1790