1000 REM MERGE.BAS: A simple file used to create MERGE type data files. 1002 REM Decrease DELAY.VAL in line 3060 if using the MBASIC interpreter. 1004 REM Line 3060 also has dimension statements that restrict the number of 1006 REM allowable records and fields per record. To substantially increase 1008 REM either value probably isn't worth the effort, but if you have time... 1009 ' 1010 OFST=16: LINE.WIDTH=44: WIDTH 255: CR$=CHR$(13) 1020 DEF FNMSG$(X$)=SPACE$(OFST)+"|| "+X$+SPACE$(LINE.WIDTH-4-LEN(X$))+" ||" 1030 DEF FNLIN$=STRING$(LINE.WIDTH,ASC("=")) 1040 DEF FNTOP$=SPACE$(OFST)+"/:"+FNLIN$+":\" 1050 DEF FNBOT$=SPACE$(OFST)+"\:"+FNLIN$+":/" 1060 FOR I=1 TO 20: PRINT: NEXT I 1070 PRINT FNTOP$ 1080 PRINT FNMSG$("") 1090 PRINT FNMSG$("MERGE.BAS, Version 1.2") 1100 PRINT FNMSG$("Bill Norris, Oct. 6, 1983") 1110 PRINT FNMSG$("") 1120 PRINT FNMSG$("Action: Edit MERGE file for SECRETARY") 1130 PRINT FNMSG$("From: CPMUG Volume 92") 1140 PRINT FNMSG$("") 1150 PRINT FNBOT$ 1160 FOR I=1 TO 6: PRINT: NEXT I: WIDTH 78 1170 LINE.WIDTH=30: OFST=22 1180 ' 2000 GOSUB 3000 '............................... Initialize. 2010 GOSUB 3100 '............................... Get filename. 2020 GOSUB 3200 '............................... See if file exists. 2030 IF NOT.FOUND THEN GOSUB 3300 '.......... Want to continue? 2035 IF RE.TRY THEN GOTO 2010 '............. Try again. 2040 IF QUITTING THEN GOTO 9000 '............ Return to CP/M. 2050 IF CREATE.FILE THEN GOSUB 3400 '........ Create empty file. 2060 GOSUB 3500 '............................... Open files. 2070 GOSUB 3600 '............................... Copy data file. 2080 GOSUB 5000 '............................... Edit the data. 2090 GOTO 9000 '................................ End. 2999 STOP 3000 REM ***** Initialize strings and things... ***** 3010 FALSE=0: TRUE=NOT FALSE: NO=FALSE: YES=TRUE: OFF=NO: ONN=YES 3020 SMALL.A=ASC("a"): SMALL.Z=ASC("z") 3030 CR$=CHR$(13): LF$=CHR$(10): NL$=CR$+LF$ 3040 BEL$=CHR$(7): ER.LIN$=BEL$+NL$+"***** ERROR ***** " 3050 QUOT$=CHR$(34) 3060 DIM LIN$(200), ED.LIN$(20): DELAY.VAL=800 3090 RETURN 3099 ' 3100 REM ***** Get filename. ***** 3110 PRINT: PRINT: INPUT "Enter MERGE-DATA filename: ", X$ 3120 GOSUB 4000: FILI$=X$: REM Filename converted to UPPER-case. 3130 IF FILI$="" THEN FILI$="DEFAULT" 3140 X=INSTR(FILI$,".") 3150 IF X THEN FILI$=LEFT$(FILI$,X-1) 3160 EXT$=".DAT" 3170 RETURN 3199 ' 3200 REM ***** Check for existance of file. ***** 3205 QUITTING=FALSE: CREATE.FILE=FALSE: RE.TRY=FALSE 3210 ON ERROR GOTO 3240 3220 OPEN "i",#1,FILI$+EXT$: NOT.FOUND=FALSE 3230 ON ERROR GOTO 0: CLOSE: RETURN 3240 NOT.FOUND=TRUE: RESUME 3230 3299 ' 3300 REM ***** File not found. Want to continue? ***** 3310 PRINT ERLIN$; FILI$; " not found. [A]ccept, [R]etry or [Q]uit: ";: 3320 X$="AQR": GOSUB 4100 3330 QUITTING=FALSE: CREATE.FILE=FALSE: RE.TRY=FALSE 3340 IF XX$="Q" THEN QUITTING=TRUE: PRINT "uit." 3350 IF XX$="A" THEN CREATE.FILE=TRUE: PRINT "ccept." 3360 IF XX$="R" THEN RE.TRY=TRUE: PRINT "e-try." 3390 RETURN 3399 ' 3400 REM ***** Create empty input data file. ***** 3410 OPEN "r",#1,FILI$+EXT$: CLOSE 3420 RETURN 3499 ' 3500 REM ***** Open disk files. ***** 3510 OPEN "i",#1,FILI$+".DAT" 3520 OPEN "o",#2,FILI$+".TMP" 3530 PRINT 3540 RETURN 3599 ' 3600 REM ***** Read the input data file. ***** 3610 LIN.NUM=0 3620 IF EOF(1) THEN 3670 ELSE LIN.NUM=LIN.NUM+1 3625 LINE INPUT #1, X$: X=LEN(X$) 3630 LIN$(LIN.NUM)=MID$(X$,2,X-2) 3635 XX$=LIN$(LIN.NUM): GOSUB 4200 3640 PRINT LIN$(LIN.NUM) 3645 IF LIN.ER THEN FOR I=1 TO DELAY.VAL*8: NEXT I 3650 REM PRINT #2, LIN$(LIN.NUM) 3660 GOTO 3620 3670 CLOSE #1: PRINT 3680 IF LIN.NUM=0 THEN PRINT BEL$;"New file..." 3690 RETURN 3699 ' 4000 REM ***** Convert X$ to UPPER-case. ***** 4010 IF X$="" THEN RETURN 4020 FOR I%=1 TO LEN(X$) 4030 X=ASC(MID$(X$,I%)) 4040 IF X>=SMALL.A AND X<=SMALL.Z THEN MID$(X$,I%,1)=CHR$(X-32) 4050 NEXT I% 4060 RETURN 4099 ' 4100 REM ***** Return in XX$ the first element of X$ that is typed. ***** 4110 XX$=INPUT$(1) 4120 SWAP X$,XX$: GOSUB 4000: REM Convert to UPPER-case. 4130 SWAP X$,XX$ 4140 IF INSTR(X$,XX$)=0 THEN PRINT BEL$;: GOTO 4110 4150 PRINT XX$; 4160 RETURN 4199 ' 4200 REM ***** Check validity of input line. ***** 4210 LIN.ER1=FALSE: LIN.ER2=FALSE 4220 IF ASC(X$)<>34 OR ASC(RIGHT$(X$,1))<>34 THEN LIN.ER1=TRUE 4230 IF INSTR(XX$,CHR$(34)) THEN LIN.ER2=TRUE 4240 IF LIN.ER1 OR LIN.ER2 THEN LIN.ER=TRUE ELSE LIN.ER=FALSE: RETURN 4250 IF LIN.ER1 THEN PRINT ER.LIN$; "Missing surrounding quotes." 4260 IF LIN.ER2 THEN PRINT ER.LIN$; "Internal quote(s) found." 4270 RETURN 4299 ' 5000 REM ***** Edit the file. ***** 5010 PRINT NL$;"Command (a,d,e,h,l,q): "; 5015 X=FRE("") 5020 X$="ADEHLQ": GOSUB 4100 5030 IF XX$="A" THEN GOSUB 5100 '***** Append lines ***** 5040 IF XX$="D" THEN GOSUB 5300 '***** Delete lines ***** 5045 IF XX$="E" THEN GOSUB 6500 '***** Edit a line ***** 5050 IF XX$="H" THEN GOSUB 5500 '***** Help message ***** 5060 IF XX$="L" THEN GOSUB 5900 '***** List lines ***** 5070 IF XX$="Q" THEN GOSUB 6000: RETURN '** Quit program ***** 5080 PRINT NL$: GOTO 5010 5099 ' 5100 REM ***** Add/Append lines. ***** 5102 PRINT "dd/Append data lines."; NL$ 5104 IF FRE("")<1000 THEN PRINT NL$;ER.LIN$;"Insufficient space.";NL$: RETURN 5110 PRINT NL$; "Line"; LIN.NUM+1; ":" 5115 GOSUB 5200: REM ** Get line ** 5120 IF X$="" THEN PRINT: RETURN 5130 LIN.NUM=LIN.NUM+1 5140 LIN$(LIN.NUM)=X$ 5150 GOTO 5110 5199 ' 5200 REM ***** Get a MERGE data line. ***** 5205 LINS=0: X$="": PLUS$="" 5210 REM ***** Loop-back point. ***** 5215 LINS=LINS+1: PRINT CHR$(LINS+64); ":"; TAB(5); 5220 LINE INPUT "", XX$: IF INSTR(XX$,"+") THEN GOSUB 5250: GOTO 5215 5222 IF INSTR(XX$,QUOT$) THEN GOSUB 5265: GOTO 5215 5225 IF XX$="" THEN RETURN 5230 IF LEN(X$)+LEN(XX$)<250 THEN X$=X$+PLUS$+XX$: PLUS$="+": GOTO 5210 5235 PRINT ER.LIN$; "Total line too long." 5240 LINS=LINS-1: GOTO 5210 5245 ' 5250 PRINT ER.LIN$; "Plus sign not allowed."; NL$ 5255 LINS=LINS-1 5260 RETURN 5265 PRINT ER.LIN$; "Quote character not allowed."; NL$ 5270 LINS=LINS-1 5275 RETURN 5299 ' 5300 REM ***** Delete lines. ***** 5310 PRINT "elete lines."; NL$ 5320 GOSUB 6200: REM Get line number range. Check ENTERED for True/False. 5325 IF NOT ENTERED THEN PRINT NL$; "***** Delete abandoned *****": RETURN 5330 PRINT: FOR I%=NSTART TO LIN.NUM 5335 IF NSTOP>=LIN.NUM THEN LIN$(I%)="": GOTO 5350 5340 NSTOP=NSTOP+1: SWAP LIN$(I%),LIN$(NSTOP) 5345 GOTO 5355 5350 LIN.NUM=LIN.NUM-1 5355 NEXT I% 5360 RETURN 5399 ' 5500 REM ***** HELP command ***** 5508 FOR I=1 TO 6: PRINT: NEXT I 5510 PRINT FNTOP$ 5512 PRINT FNMSG$("") 5520 PRINT FNMSG$("A - Append/Add lines") 5530 PRINT FNMSG$("D - Delete lines") 5535 PRINT FNMSG$("E - Edit line") 5540 PRINT FNMSG$("H - Help (this display)") 5560 PRINT FNMSG$("L - List data file") 5570 PRINT FNMSG$("Q - Quit") 5572 PRINT FNMSG$("") 5580 PRINT FNBOT$; 5590 FOR I=1 TO 4: PRINT: NEXT I 5595 RETURN 5599 ' 5900 REM ***** List the data file. ***** 5905 PRINT "ist the MERGE data file." 5910 FOR I=1 TO LIN.NUM: GOSUB 5920: PRINT NL$; I: J=0 5912 J=J+1: IF ED.LIN$(J)="" THEN GOTO 5917 5914 PRINT TAB(8); CHR$(J+64); ":";TAB(12),ED.LIN$(J): GOTO 5912 5917 NEXT I: RETURN 5919 ' ***** Subroutine: Place fields of current line into array ***** 5920 X$=LIN$(I)+"+": J=0 5930 FLD.NUM=J: J=J+1: IF X$="" THEN ED.LIN$(J)="": GOTO 5980 5940 X=INSTR(X$,"+") 5950 ED.LIN$(J)=LEFT$(X$,X-1) 5960 X$=MID$(X$,X+1) 5970 GOTO 5930 5980 FOR J=1 TO DELAY.VAL: NEXT J 5990 RETURN 5999 ' 6000 REM ***** Quit program ***** 6010 PRINT "uit." 6020 FOR I=1 TO LIN.NUM 6030 PRINT #2, QUOT$; LIN$(I); QUOT$ 6040 PRINT "+"; 6050 NEXT I 6055 CLOSE 6060 OPEN "r",#1,FILI$+".BAK": CLOSE 1: KILL FILI$+".BAK" 6070 NAME FILI$+".DAT" AS FILI$+".BAK" 6080 NAME FILI$+".TMP" AS FILI$+".DAT" 6090 OPEN "i", #1, FILI$+".BAK" 6100 IF EOF(1) THEN CLOSE: KILL FILI$+".BAK": RETURN 6110 CLOSE: RETURN 6199 ' 6200 REM ***** Get line number range ( NSTART, NSTOP ) ***** 6210 INPUT;"From: ",NSTART: INPUT;" To: ",NSTOP 6220 IF NSTART<1 OR NSTOP<1 THEN ENTERED=NO: RETURN 6230 IF NSTOPLIN.NUM THEN NSTOP=LIN.NUM: PRINT " To: set to"; NSTOP 6250 ENTERED=YES 6260 RETURN 6299 ' 6500 REM ***** Edit a line ***** 6505 PRINT "dit"; NL$ 6510 INPUT "Enter line number: ", I 6515 IF I<1 OR I>LIN.NUM THEN PRINT ER.LIN$;"Not a valid line number": RETURN 6520 GOSUB 5920: J=0: REM ***** Sub 5920 expects line # in variable I ***** 6525 J=J+1: IF ED.LIN$(J)<>"" THEN PRINT CHR$(J+64);":",ED.LIN$(J): GOTO 6525 6530 PRINT NL$; "Field to change: ";: X$=INPUT$(1): GOSUB 4000 6535 PRINT X$: IF X=13 THEN RETURN ELSE X=ASC(X$)-64 6540 IF X<1 OR X>FLD.NUM THEN PRINT ER.LIN$;"Invalid field": GOTO 6530 6542 INPUT "Enter new field: ", ED.LIN$(X) 6545 LIN$(I)="": FOR J=1 TO FLD.NUM 6550 LIN$(I)=LIN$(I)+ED.LIN$(J)+"+" 6555 NEXT J 6560 LIN$(I)=LEFT$(LIN$(I),LEN(LIN$(I))-1) 6565 GOTO 6520 9000 REM ***** Program exit point. ***** 9010 PRINT: PRINT TAB(10); "End of program. Returning to CP/M." 9020 CALL IT.QUITS ' and ignore L80 error message if compiling... 9030 END T TAB(10); "End of program. Returning to CP/M." 9020 CALL IT.QUITS ' and ign