REM ************************************************************ REM ********* M 2 C B R I O . B A S Ver 1.0 ************* REM ********* M2CBASIC TM Ver 1.4 ************* REM ********* ************* REM ********* ALL RIGHTS RESERVED ************* REM ********* 07-21-84 ************* REM ************************************************************ DEF RANDOM.OPEN (FNUM%,FNAME$,REC.LEN%) INTEGER FNUM%,REC.LEN% STRING FNAME$ IF SIZE(FNAME$) > 0 \ 8 = 2 QUOTES AND 4 FLAG BYTES THEN OPEN FNAME$ RECL REC.LEN%+8 AS FNUM% \ ELSE CREATE FNAME$ RECL REC.LEN%+8 AS FNUM% M2CB.RAND.BUF$(FNUM%) = SPACE$(REC.LEN%) M2CB.LOC%(FNUM%) = 0 RETURN FEND DEF FIELD (FNUM%,OLD.ADDR%,ADDR%,WIDTH%) INTEGER FNUM%,OLD.ADDR%,ADDR%,WIDTH%,FOUND%,I% FOUND% = 0 IF M2CB.NUM.FLDVARS% > 0 THEN \ FOR I% = 1 TO M2CB.NUM.FLDVARS%: \ IF M2CB.ADDR%(I%) = OLD.ADDR% \ THEN FOUND% = -1 : GOTO END.SEARCH: \ NEXT I% \ ELSE FOUND% = 0 END.SEARCH: IF FOUND% \ THEN GOSUB REPLACE.FLD \ ELSE GOSUB ADD.FLD M2CB.CUR.POS% = M2CB.CUR.POS% + WIDTH% RETURN : REM *** EXIT *** REPLACE.FLD: REM REPLACE FIELD VAR CONTENTS M2CB.FNUM%(I%) = FNUM% M2CB.ADDR%(I%) = ADDR% M2CB.START%(I%) = M2CB.CUR.POS% RETURN ADD.FLD: REM ADD FIELD VAR M2CB.NUM.FLDVARS% = M2CB.NUM.FLDVARS% + 1 IF M2CB.NUM.FLDVARS% > M2CB.MAX.FLDVARS% \ THEN PRINT "*** MAX. # OF FIELD VARS EXCEEDED ***":\ PRINT "*** INCREASE M2CB.MAX.FLDVARS% ***":\ STOP M2CB.FNUM%(M2CB.NUM.FLDVARS%) = FNUM% M2CB.ADDR%(M2CB.NUM.FLDVARS%) = ADDR% M2CB.START%(M2CB.NUM.FLDVARS%) = M2CB.CUR.POS% RETURN FEND DEF RANDOM.PUT (FNUM%,REC.NUM%) INTEGER FNUM%,REC.NUM% STRING BUF$ BUF$ = APNDCH(M2CB.RAND.BUF$(FNUM%)) :REM APPEND FLAGS IF REC.NUM% < 0 \ THEN PRINT # FNUM%; BUF$ : M2CB.LOC%(FNUM%) = M2CB.LOC%(FNUM%)+1\ ELSE PRINT # FNUM%, REC.NUM%; BUF$ : M2CB.LOC%(FNUM%) = REC.NUM% RETURN FEND DEF RANDOM.GET (FNUM%,REC.NUM%) INTEGER FNUM%,REC.NUM%,I% STRING BUF$ IF REC.NUM% < 0 \ THEN READ # FNUM%; BUF$ :\ M2CB.LOC%(FNUM%) = M2CB.LOC%(FNUM%)+1\ ELSE READ # FNUM%, REC.NUM%; BUF$ :\ M2CB.LOC%(FNUM%) = REC.NUM% M2CB.RAND.BUF$(FNUM%) = REMVCH(BUF$) :REM REMOVE FLAGS IF M2CB.NUM.FLDVARS% = 0 \ THEN RETURN :REM *** EXIT *** FOR I% = 1 TO M2CB.NUM.FLDVARS% IF M2CB.FNUM%(I%) = FNUM% \ THEN \ SET FIELDED VAR CALL SETFDV (M2CB.ADDR%(I%), \ SADD(M2CB.RAND.BUF$(FNUM%)), \ M2CB.START%(I%)) NEXT I% RETURN FEND DEF LRSET$ (MODE$,F.V.ADDR%,EXP$) INTEGER F.V.ADDR%,I% STRING MODE$,EXP$,T$ F.V.LEN% = PEEK(F.V.ADDR%+1) + 256*PEEK(F.V.ADDR%) EXP.LEN% = LEN(EXP$) IF EXP.LEN% >= F.V.LEN% \ THEN T$ = MID$(EXP$,1,F.V.LEN%) \ ELSE IF MODE$ = "L" \ THEN T$ = EXP$ + SPACE$(F.V.LEN%-EXP.LEN%) \ ELSE T$ = SPACE$(F.V.LEN%-EXP.LEN%) + EXP$ CALL LRSETV (F.V.ADDR%, T$) :REM SET FIELD VAR TO T$ IF M2CB.NUM.FLDVARS% = 0 \ THEN RETURN :REM *** EXIT *** FOR I% = 1 TO M2CB.NUM.FLDVARS% IF M2CB.ADDR%(I%) = F.V.ADDR% \ THEN \ SET RANDOM BUFFER CALL SETRBF (SADD(M2CB.RAND.BUF$(M2CB.FNUM%(I%))), \ M2CB.START%(I%), \ T$) NEXT I% RETURN FEND