To make the handling of errors easier I have used the principal of INDIRECTION VECTORS (See Documentation and article) |[ |CARD#T~E .J REM NEAR TOP OF FILE INCLUDE THE FOLLOWING DIM cvI 4:cvSdim=40:DIM cvS cvSdim REM THIS PROVIDES "COMMON" VARIABLES FOR ONE INTERGER REM AND ONE STRING OF 40 CHARACTERS -----PROColdopen----------- REM ONERROR:index=INKEY(0):PROCbadfile(cvS,winerr,winret) REM RETURNS TO HERE ON ERROR REM PROColdopen("prompt",winprompt,winret,cvI,cvS,cvSdim) REM ONERROR:index=INKEY(0):PROCgenerror(winerr,winret) REM oldname$=$cvS:oldchan=!cvI:REM GET VALUES |[ |CARD#T~E .J DEFPROColdopen(p$,p,r,i,s,sd) LOCAL of$ PRINTCHR$(1);"2I";p; REPEAT:PRINTCHR$(1);"2C";CHR$(253);p$;:INPUTof$ of$=LEFT$(of$,sd):$s=of$ p=OPENINof$:!i=p IFp=0THENPRINTCHR$(1);"2C";CHR$(253);"FILE "+of$+" NOT FOUND":CLOSE#p UNTILp<>0 PRINTCHR$(1);"2I";r; ENDPROC -----PROCoutopen----------- REM ONERROR:index=INKEY(0):PROCbadfile(cvS,winerr,winret) REM RETURNS TO HERE ON ERROR REM PROCoutopen("prompt",winprompt,winret,cvI,cvS,cvSdim) REM ONERROR:index=INKEY(0):PROCgenerror(winerr,winret) REM outname$=$cvS:outchan=!cvI:REM GET VALUES |[ |CARD#T~E .J DEFPROCoutopen(p$,p,r,i,s,sd) LOCAL of$,ex$ PRINTCHR$(1);"2I";p; REPEAT:PRINTCHR$(1);"2C";CHR$(253);p$;:INPUTof$ of$=LEFT$(of$,sd):$s=of$:p=OPENINof$ ex$=CHR$(1)+"2C"+CHR$(253)+"FILE EXISTS : CONTINUE Y ? " IFp>0PRINTex$;:ex$=CHR$(GETAND&5F):IFex$<>"Y"UNTILFALSE CLOSE#p p=OPENOUTof$:!i=p:IFp=0PRINTCHR$(1);"2C";CHR$(253);"INVALID FILE NAME" UNTILp<>0 PRINTCHR$(1);"2I";r; ENDPROC -----PROCnewopen----------- REM ONERROR:index=INKEY(0):PROCbadfile(cvS,winerr,winret) REM RETURNS TO HERE ON ERROR REM PROCnewopen("prompt",winprompt,winret,cvI,cvS,cvSdim) REM ONERROR:index=INKEY(0):PROCgenerror(winerr,winret) REM newname$=$cvS:newchan=!cvI:REM GET VALUES |[ |CARD#T~E .J DEFPROCnewopen(p$,p,r,i,s,sd) LOCAL nf$,ex$ PRINTCHR$(1);"2I";p; REPEAT:PRINTCHR$(1);"2C";CHR$(253);p$;:INPUTnf$ nf$=LEFT$(nf$,sd):$s=nf$:p=OPENINof$ ex$=CHR$(1)+"2C"+CHR$(253)+"FILE EXISTS : PRESS A KEY TO CONTINUE " IFp>0PRINTex$;:ex$=GET:UNTILFALSE CLOSE#p p=OPENOUTef$:!i=p:IFp=0PRINTCHR$(1);"2C";CHR$(253);"INVALID FILE NAME" UNTILp<>0 PRINTCHR$(1);"2I";r; ENDPROC -----PROCbadname----------- |[ |CARD#T~E .J DEFPROCbadfile(n,e,r) PRINTCHR$(1);"2I";e; IF ERR<>252 PROCgenerror(e,r) PRINTCHR$(1);"2C";CHR$(253);$n;" is not a valid filename" PRINTCHR$(1);"2C";CHR$(253);"PRESS A KEY TO CONTINUE":e=GET PRINTCHR$(1);"2I";r; ENDPROC |[ |CARD#T~E .J DEFPROCgenerror(e,r) CLOSE#0 IF ERR=17STOP:REM FOR USE WITH Z081 OR Z163 USE IF ERR=17PROCmenuRET PRINTCHR$(1);"2I";e; CLS:REPORT:PRINT" at line ";ERL PRINT"Press a key to restart"; PRINTCHR$(1);"2I";r; e=GET CLEAR RUN ENDPROC -----PROCmenuRET------------ |[ |CARD#T~E .J DEFPROCmenuRET ON ERROR OFF IF HIMEM<>&B000:CHAIN"Z081/MENU.BAS" *CLI CALL &B000~E END ENDPROC -----PROCbadlink----------- REM example piece of programme. In this case lines 1 and 4 of the REM "control" file contains the link filenames. REM Note use of line I%=1/I% is not appropriate if link file is for REM output, and hence may not exist. In that case a FOR NEXT loop can REM not be used so the ONERROR OPtN & CLOSE lines will have to repeated REM FORC%=1TO4STEP3 REM ONERROR:index=INKEY(0):PROCbadlink(control$,link$(L%),E%,R%) REM I%=OPENINlink$(L%) REM CLOSE#I% REM I%=1/I% REM NEXT REM ONERROR:index=INKEY(0):PROCgenerror(E%,R%) |[ |CARD#T~E .J DEFPROCbadlink(c$,l$,e,r) PRINTCHR$(1);"2I";e;CHR$(1);"2C";CHR$(253); PRINT";l$;" in ";c$'CHR$(1);"2C";CHR$(253); IF ERR=252PRINT" is a ";:REPORT:PRINT':ELSEPRINT" Does not exist " PRINTCHR$(1);"2C";CHR$(253);"Press a key to restart"; CLOSE#0 PRINTCHR$(1);"2I";r; e=GET CLEAR RUN ENDPROC