10
20 Q%=PAGE:DIMctrl%127,name%127,data%511:A$=FNOS_GetEnv:X%=ctrl%:Y%=X%DIV256
30 ver$="0.38"
40 quit$=FNcl(" -q",1):debug%=FNcl("-d",0):ONERROROSCLI"Spool":REPORT:PROCClose_All:PROCexit(ERR):END
50 IFFNcl("-?",0):PRINT"Syntax: "run$" -path <path> -home <path> -navbar -quit quitcmd":PROCexit(0):END
60 verbose%=FNcl("-v",0):php%=FNcl("-ph",0):path$=FNcl("-p",1):nav%=FNcl("-n",0)
70 iconpath$=FNcl("-i",1):IFiconpath$="":iconpath$="/icons/"
80 home$=FNcl("-h",1):IFhome$="":home$="/"
90 root$=FNcl("-r",1):IFroot$="":root$="/"
100 site$=FNcl("-s",1):IFsite$="":site$="/"
110 sfx$=FNcl("-S",1):sfx%=0
120 text%=0:html%=TRUE:long%=0:short%=TRUE
130 dir$=A$
140 IFdebug%:PRINT"verbose%=";verbose%;" nav%=";nav%'"home$='"home$"'"'"root$='"root$"'"'"site$='"site$"'"'"path$='"path$"'"'"icon$='"iconpath$"'"'" dir$='"dir$"'"'"quit$='"quit$"'"
150 IFsfx$<>"":IFFNfile(sfx$,5)<>1:PRINT"Suffix file '"sfx$"' not found":PROCexit(214)
160 IFsfx$<>"":DIMsfx% X%!10:sfx%?(X%!10)=13:OSCLI"Load "+sfx$+" "+STR$~sfx%
170 IFdir$<>"":OSCLI"Dir "+dir$
180 IFRIGHT$(site$,2)<>"::":site$=site$+"::"
190 IFpath$="":path$=FNPath_Name:path$=FNs(FNgbpb(5))+MID$(path$,INSTR(path$,"$")-1)
200 IFpath$="""""":path$=""
210 ver$="0.39"
220 PROCver_Scan
230 IdxHeadr$="Automatic BBC Tree Crawler"
240 IFos%<6:ver_mos$=MID$("ElectronBBCMasterCompact",VALMID$("010909121218",os%*2+1,2),VALMID$("833667",os%+1,1))+" "+ver_mos$
250 index$="index/htm":out$=index$+"_":dirs%=0
260 f$="."+path$:REPEATf$=MID$(f$,2):UNTILINSTR(f$,".")=0:path$=LEFT$(path$,LENpath$-LENf$-1)
270 A%=1:REPEAThome$="/.."+home$:A%=INSTR(path$,".",A%+1):UNTILA%=0:home$=MID$(home$,5)
280 fs%=FNfs:CLS:VDU15:PROCDoDir:PROCexit(0):END
290 DEFPROCScan(f%,path$):LOCALp%,t%,r%,f$
300 REPEAT:f$=FNgbpb8(p%):p%=X%!9:r%=LENf$:IFr%:PROCRdName
310 UNTILr%=0:ENDPROC
320 DEFPROCRdName:IFASCf$=46:ENDPROC
330 IFASCf$=95ORf$=index$ORRIGHT$(f$,1)="_"ORf$=out$:ENDPROC
340 t%=FNfile(f$,5):l%=X%!2:e%=X%!6:n%=X%!10:a%=X%!14:IFt%=3:t%=1
350 IFfs%=5:A%=FNNetFS_Op(&12,CHR$64+f$):X%?9=a%:a%=X%!9
360 X%!2=l%:X%!6=e%:X%!10=n%:X%!14=a%
370 IFf$<>"$":IFt%=2AND(X%?14AND8):ENDPROC
380 IFt%=1:IF(X%?14AND&13)<>&11:ENDPROC
390 IFt%=1:IF(X%?14AND&10)<>&10:ENDPROC
400 IFt%=2:IFLEFT$(f$,1)="!":t%=3
410 IFt%=1ORt%=2:PROCDoObject:IFf%:IFf%<>t%:ENDPROC
420 IFverbose%:PRINTt$(t%)": ";f$
430 IFt%=1:PROCDoFile:ENDPROC
440 IFINKEY-1:PRINTpath$;".";f$:ENDPROC
450 IFt%<>2:ENDPROC
460 dirs%=dirs%+1:OSCLI"Dir "+f$:PROCDoDir:OSCLI"Dir ^":dirs%=dirs%-1
470 ENDPROC
480 DEFFNCheckIndex
490 A%=FNfile("@."+index$,5):IFA%=0:=TRUE
500 IFNOTFNRdTop(index$):=FALSE
510 A%=data%:REPEAT:A%=A%+1+LEN$A%:UNTILLEN$A%=0ORINSTR($A%,IdxHeadr$)ORA%>data%+510
520 IFLEN$A%=0:=FALSE
530 IFINSTR($A%,IdxHeadr$)=0:=FALSE
540 A%=A%+INSTR($A%,IdxHeadr$)
550 A%=A%+INSTR($A%,"""")-3
560 IF?A%=ASC";":=VAL$(A%+1)ELSE=TRUE
570 DEFFNRdTop(A$):in%=OPENIN(A$):IFEXT#in%<256:CLOSE#in%:in%=0:=FALSE
580 FORA%=0TO511:IFNOTEOF#in%:data%?A%=BGET#in%:IFdata%?A%=10:data%?A%=13
590 NEXT:CLOSE#in%:in%=0:data%?511=13:=TRUE
600 DEFFNNoRoot(A$):A%=INSTR(A$,".$"):IFA%:A$=LEFT$(A$,A%-1)+MID$(A$,A%+2)
610 IFLEFT$(A$,2)="..":A$=MID$(A$,3)
620 =A$
630 DEFPROCDoDir
640 CLS:PRINTpath$;".";f$
650 index%=FNCheckIndex:IFindex%:PROCScanIndex
660 PROCScan(2,path$+"."+f$):PROCDoDirPost
670 ENDPROC
680 DEFPROCScanIndex
690 IFindex%=-1:PROCDoDirPre:PROCScan(1,path$+"."+f$):PROCDoDirMid:ENDPROC
700 IFindex%=2:PROCScanAddrs:ENDPROC
710 ENDPROC
720 DEFPROCScanAddrs
730 soft%=0:OSCLI"Spool "+out$
740 in%=OPENIN("@."+index$)
750 REPEAT:A$=FNrd(in%):IFINSTR(A$,"application/riscos;"):PROCScanAddr2
760 PRINTA$;FNlf;:UNTILEOF#in%:CLOSE#in%:in%=0:*Spool
770 PROCDoDirMidUpdate(TRUE,soft%=0,FALSE)
780 ENDPROC
790 DEFPROCScanAddr2
800 B$=A$:A%=INSTR(A$,"a href="""):F$=MID$(A$,A%+10):F$=LEFT$(F$,INSTR(F$,"""")-1)
810 IFFNfile(F$,5)<>1:ENDPROC
820 L%=X%!2:E%=X%!6
830 A%=INSTR(B$,"load=&"):B%=INSTR(B$," ",A%):IFA%:B$=LEFT$(B$,A%+9)+STR$~L%+";"+MID$(B$,B%)
840 A%=INSTR(B$,"exec=&"):B%=INSTR(B$,"""",A%):IFA%:A$=LEFT$(B$,A%+9)+STR$~E%+";"+MID$(B$,B%)
850 IFA$<>B$:soft%=soft%+1
860 ENDPROC
870 DEFPROCDoObject:IFf%<>1:ENDPROC
880 f1$=f$
890 PROCFileType
900 f2$=FNunixname(FNfn_sfx(f1$,type%))
910 IFtype%=&FC0:PROCLinkELSEf$=f$+MID$(f2$,LENf$+1)
920 PROCMimeType
930 PRINT" <A href="""f2$;LEFT$("/",t%=2)"""";LEFT$(">",mime$="");:IFmime$<>"":PRINT" TYPE="""+mime$+""">";
940 PRINTf$;LEFT$("</A> ",html%);
950 bas%=0
960 IFbas%=0:bas%=RIGHT$(f2$,4)=".bbc":IFbas%:f2$=LEFT$(f2$,LENf2$-4)
970 IFbas%=0:bas%=RIGHT$(f2$,3)=".bb":IFbas%:f2$=LEFT$(f2$,LENf2$-3)
980 IFbas%=0:bas%=RIGHT$(f2$,2)=".b"ANDtype%=&1C7:IFbas%:f2$=LEFT$(f2$,LENf2$-2)
990 IFbas%=0:bas%=RIGHT$(f2$,1)="."ANDtype%=&1C7:IFbas%:f2$=LEFT$(f2$,LENf2$-1)
1000 bas%=bas%ORtype%=&1C7ORtype%=&FFBORINSTR(mime$,"exec=&FFFF7B00")
1010 IFbas%:IFhtml%:PRINT"(<a href=""";FNbas(f2$);".bas"">L</a>)";ELSEPRINTFNspc(3);
1020 PRINTFNspc(13-LENf$);:x%=(x%+1)AND(x%<4)
1030 PRINTLEFT$("DL/"+FNspc(1),t%=2)LEFT$("wr/R",t%<>2);LEFT$("<BR>",x%=0);FNcr;
1040 IFmime$<>""ORbas%:soft%=soft%+1
1050 ENDPROC
1060 DEFPROCDoFile
1070 ENDPROC
1080 DEFPROCDoDirPre
1090 OSCLI"Spool "+out$:PROChtmlHdr
1100 soft%=0:x%=0:ENDPROC
1110 DEFPROCDoDirMid:PRINT"</TT>";:IFnav%:PROCnavbot
1120 PRINT"</BODY>"FNcr"</HTML>"FNcr;:*Spool
1130 A%=FNfile(out$,5):len%=X%!10:A%=FNfile("@",5)
1140 IFA%=2:A%=FNfile("@."+index$,5)ELSEA%=FNfile(index$,5)
1150 PROCDoDirMidUpdate(A%,(A%<>0)AND(len%=X%!10),(A%=0)AND(php%<>0)AND(soft%=0)):ENDPROC
1160 DEFPROCDoDirMidUpdate(found%,same%,notneeded%)
1170 IFsame%:PRINT"No change":OSCLI"Delete "+out$:ENDPROC
1180 IFnotneeded%:PRINT"Not needed":OSCLI"Delete "+out$:ENDPROC
1190 PRINT"Updated":IFfound%:OSCLI"Delete "+index$
1200 OSCLI"Rename "+out$+" "+index$:OSCLI"Access "+index$+" R/r"
1210 X%!14=0:X%!18=0:type%=FNfile(index$,5)
1220 IFfs%=5:A%=FNNetFS_Op(18,CHR$64+index$):X%?19=X%?14:X%!15=X%!10
1230 Sdy%=X%?15AND31:Smn%=X%?16AND15:Syr%=1981+(X%?16DIV16)+(X%?15AND&E0)/2
1240 Sh%=X%?17:Sm%=X%?18:Ss%=X%?19
1250 PROCDate_FromOrd(data%,Sdy%,Smn%,Syr%,Sh%,Sm%,Ss%,0)
1260 X%!6=!data%:X%!2=&FFFFAF00:X%?2=data%?4:X%?14=&11:A%=FNfile(index$,1)
1270 ENDPROC
1280 DEFPROCDoDirPost
1290 ENDPROC
1300 DEFPROChtmlHdr
1310 PRINT"<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">";FNcr;
1320 PRINT"<HTML><HEAD>"FNcr;
1330 PRINT"<META http-equiv=""Content-Type"" content=""text/html; charset=ISO-8859-1"">";FNcr;
1340 PRINT"<META name=""Generator"" content=""";IdxHeadr$;" ";ver$"; ";ver_mos$;:IFindex%<>-1:PRINT";";index%;
1350 PRINT""">";STRING$(16-LENLEFT$(ver_mos$,16)," ");FNcr;
1360 PRINT"<META name=""Author"" content=""Jonathan Graham Harston"">"FNcr;
1370 PRINT"<META name=""Date"" content=""";:A%=FNdate
1380 PRINTFNh0(A%DIV65536,4);"-";FNh0(A%DIV256,2);"-";FNh0(A%,2);
1390 PRINT" ";RIGHT$(FNtime,8);""">"FNcr;
1400 PRINT"<TITLE>";site$;FNNoRoot(path$+"."+f$);"</TITLE>";FNcr;
1410 PRINT"</HEAD>"FNcr;FNcr"<BODY>"FNcr;
1420 IFnav%:PROCnavtop:ENDPROC
1430 PRINT"<TT>";site$;path$"."f$"<BR>";FNcr;
1440 PRINT"<A href=""../"">Parent"+FNspc(1)+"Directory</A>";FNcr;
1450 PRINTFNspc(16);FNcr;
1460 PRINT"<A href=""";STRING$(dirs%,"../");home$;LEFT$("./",dirs%=0ANDhome$="");""">";
1470 PRINT"Home"+FNspc(1)+"Page"LEFT$("</A>",html%)FNcr;
1480 PRINT"<BR><BR>";FNcr;
1490 ENDPROC
1500 DEFPROCnavtop
1510 A$=FNNoRoot(path$+"."+f$)
1520 D%=-1:A%=0:REPEATA%=INSTR(A$,".",A%+1):D%=D%+1:UNTILA%=0
1530 PRINT"<TABLE bgcolor=""#ffff66"" width=""100%""><TR><TD>";FNcr;
1540 PRINT"<SMALL> <A href=""../";STRING$(D%,"../");"""";FNcr;
1550 PRINT"target=""_top"">";LEFT$(site$,LENsite$-2);"</A>::";
1560 REPEAT:A%=INSTR(A$,"."):P$=LEFT$(A$,A%-1):A$=MID$(A$,A%+1)
1570 IFD%:PRINT"<A href=""";STRING$(D%,"../");"""";FNcr;"target=""_top"">";P$;"</A>.";
1580 D%=D%-1:UNTILD%<1
1590 PRINT"<B>";A$;"</B>";FNcr;
1600 PRINT"</SMALL><TD align=""right"">"FNcr;
1610 PRINT"<SMALL><A href=""http://google.co.uk/custom?domains=mdfs.net&sitesearch=mdfs.net"">Search</A>";FNcr;
1620 PRINT" </SMALL></TABLE><P>";FNcr;
1630 PRINT"<TT>";
1640 ENDPROC
1650 DEFPROCnavbot
1660 PRINT"<CENTER><HR width=""100%"">";FNcr;
1670 PRINT"Authored by <A href=""";STRING$(dirs%,"../");home$;LEFT$("./",dirs%=0ANDhome$="");
1680 PRINT"User/JGH/"">J.G.Harston</A>";
1690 A$=MID$(FNTime,5,11):A$=LEFT$(A$,2)+"-"+MID$(A$,4,3)+"-"+RIGHT$(A$,4)
1700 PRINT"<BR>Last update: ";A$;"</CENTER>";FNcr;
1710 ENDPROC
1720 DEFFNunixname(A$):FORA%=1TOLENA$
1730 IFINSTR("./",MID$(A$,A%,1)):A$=LEFT$(A$,A%-1)+CHR$(ASCMID$(A$,A%,1)EOR1)+MID$(A$,A%+1)
1740 IFMID$(A$,A%,1)="^":A$=LEFT$(A$,A%-1)+".."+MID$(A$,A%+1):A%=A%+1
1750 NEXT:=A$
1760 DEFPROCMimeType
1770 IFt%=2:icon$="folder":mime$="":ENDPROC
1780 xt$=FNuc(RIGHT$(f2$,4))
1790 IFxt$=".HTM":icon$="html":mime$="":ENDPROC
1800 IFxt$=".TXT":icon$="text":mime$="":ENDPROC
1810 IFxt$=".GIF":icon$="gif":mime$="":ENDPROC
1820 IFxt$=".ZIP":icon$="compressed":mime$="application/zip":soft%=soft%-1:ENDPROC
1830 IFtype%=&FFF:icon$="text":mime$="text/plain":soft%=soft%-1:ENDPROC
1840 IFtype%=&FFB:icon$="basic":mime$="application/basic":ENDPROC
1850 IFtype%=&FAF:icon$="html":mime$="text/html":soft%=soft%-1:ENDPROC
1860 IFtype%=&BBC:icon$="rom":mime$="":ENDPROC
1870 IFtype%=&700:icon$="rom":mime$="":ENDPROC
1880 IFtype%=-1:IFX%!2<&10000:IFX%!6<&10000:icon$="unknown":mime$="application/riscos; load=&"+STR$~(X%!2)+"; exec=&"+STR$~(X%!6):ENDPROC
1890 IFtype%=-1:icon$="unknown":mime$="application/riscos; load=&"+STR$~(X%!2)+"; exec=&"+STR$~(X%!6):ENDPROC
1900 icon$="unknown":mime$=""
1910 ENDPROC
1920 DEFPROCFileType:type%=-1
1930 IFX%!2<>X%!6:type%=(X%!2AND&FFF00)DIV256:IFtype%=&FFFORtype%=&FC0ORX%!6=&FFFF0000ORX%!6=-1:ENDPROC
1940 IF(X%!4AND&FFFF)=(X%!8AND&FFFF):IF(((X%!4AND&FFFF)+1)AND&FFFF)<2:type%=-1
1950 IFX%!2=X%!6:IF(X%!2AND&FFFF)=&8000:type%=&BBC
1960 IFX%?2=0:IF(X%!4AND&FFFF)=(X%!8AND&FFFF):IF(((X%!4AND&FFFF)+1)AND&FFFF)<2:IF(X%?7AND&C0)=&80:type%=&FFB
1970 IFtype%>&F0DANDtype%<&F20:type%=&FFB
1980 ENDPROC
1990 DEFPROCLink
2000 soft%=soft%+1:OSCLI"Load "+f$+" "+STR$~data%:data%?253=13
2010 f1$=$data%+CHR$0+CHR$10
2020 A%=INSTR(f1$,CHR$0):B%=INSTR(f1$,CHR$10):IFB%<A%:A%=B%
2030 f1$=LEFT$(f1$,A%-1)
2040 t%=FNfile(f1$,5):PROCFileType:IFLEFT$(f1$,1)=":":f1$="."+MID$(f1$,2)
2050 f2$=FNunixname(f1$):ENDPROC
2060 DEFFNbas(f2$):LOCALB$:IFINSTR(f2$,".")=0:=f2$
2070 A%=LENf2$+1:REPEATA%=A%-1:UNTILMID$(f2$,A%,1)=".":B$=LEFT$(f2$,A%-1):A$=FNuc(MID$(f2$,A%))
2080 IFFNfile("@."+B$,5)=1:=f2$
2090 IFA$=".SRC"ORA$=".SR"ORA$=".S":=B$
2100 IFA$=".BBC"ORA$=".BB"ORA$=".B":=B$
2110 =f2$
2120 DEFFNlf:OSCLI"FX3,16":VDU13:OSCLI"FX3":VDU10:=""
2130 DEFFNcr:OSCLI"FX3,16":PRINT:OSCLI"FX3":VDU13:=""
2140 DEFFNspc(A%):=STRING$(A%AND(A%>0),LEFT$(" ",html%)+LEFT$(" ",text%))
2150 DEFPROCClose_All
2160 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
2170 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
2180 ENDPROC
2190 DEFFNOS_GetEnv:A%=0:X%=1:os%=((USR&FFF4)AND&FF00)DIV256
2200 A%=&600-&7B00*(PAGE>&8000):IF!(PAGE-&100)=@%:A%=PAGE-&300
2210 IF?(TOP-3)=0:A%=&100:IFHIMEM<&FFFF:A%=PAGE-&300:IF!(HIMEM+512)=@%:A%=HIMEM
2220 A$=$A%:IFPAGE=&8F00:run$=A$:SYS16TOA$,,A%:SYS72,"",A%:A$=MID$(A$,1+INSTR(A$+" "," ",1+INSTR(A$," "))):IFLENA$=0:A$=run$
2230 FORY%=-1TO0:A$=" "+A$:REPEATA$=MID$(A$,2):UNTILASCA$<>32:IFASCA$=34:A%=INSTR(A$,"""",2)+1ELSEA%=INSTR(A$+" "," ")
2240 IFY%:run$=MID$(A$,1-(ASCA$=34),A%-1+2*(ASCA$=34)):A$=MID$(A$,A%+1)
2250 NEXT:=A$
2260 DEFPROCos(A$):IFASCA$=42:OSCLIA$ELSEIFLENA$:CHAINA$
2270 ENDPROC
2280 DEFPROCexit(A%):OSCLI"FX1,"+STR$A%:quit$=quit$:A$=quit$:quit$="":PROCos(A$)
2290 IFPAGE>&FFFFF:QUITA%ELSEEND
2300 ENDPROC
2310 DEFFNcl(l$,n%):IFl$="":A$=FNs(A$):IFASCA$=34:A%=INSTR(A$+" "" ",""" ",2):l$=MID$(A$,2,A%-2):A$=FNs(MID$(A$,A%+1)):=l$
2320 IFl$="":A%=INSTR(A$+" "," "):l$=LEFT$(A$,A%-1):A$=FNs(MID$(A$,A%+1)):=l$
2330 IFn%=0:IFl$<>"":A%=INSTR(A$,l$):IFA%:A$=FNs(LEFT$(A$,A%-1)+MID$(A$,INSTR(A$," ",A%)+1))+" ":=TRUE
2340 IFn%=0:IFl$<>"":=FALSE
2350 A%=INSTR(LEFT$(" ",ASCl$=32)+A$,l$):IFA%=0:=""
2360 A$=LEFT$(A$,A%-1)+FNs(MID$(A$,INSTR(A$," ",A%)+1))
2370 IFASCl$=32:l$=MID$(A$,A%):A$=LEFT$(A$,A%-1):=MID$(l$,1-(ASCl$=34),LENl$+2*(ASCl$=34))
2380 IFASCMID$(A$,A%,1)<>34:l$=MID$(A$,A%,INSTR(A$+" "," ",A%)-A%):A$=LEFT$(A$,A%-1)+MID$(A$,A%+LENl$+1):=l$
2390 l$=MID$(A$,A%+1,INSTR(A$+" ",""" ",A%+1)-A%-1):A$=LEFT$(A$,A%-1)+MID$(A$,A%+LENl$+3):=l$
2400 DEFFNs(A$):IFLEFT$(A$,1)=" ":REPEATA$=MID$(A$,2):UNTILLEFT$(A$,1)<>" "
2410 IFRIGHT$(A$,1)=" ":REPEATA$=LEFT$(A$,LENA$-1):UNTILRIGHT$(A$,1)<>" "
2420 =A$
2430 DEFFNuc(A$):LOCALB$:IFA$="":=""
2440 REPEATB$=B$+CHR$(ASCA$AND((A$<"@")OR&DF)):A$=MID$(A$,2):UNTILA$="":=B$
2450 DEFFNlc(A$):LOCALB$:IFA$="":=""
2460 REPEATB$=B$+CHR$(ASCA$OR((A$<"_")AND&20)):A$=MID$(A$,2):UNTILA$="":=B$
2470 DEFFNh0(A%,N%):=RIGHT$("0000000"+STR$~A%,N%)
2480 DEFFNfile(A$,A%):$name%=A$:?X%=name%:X%?1=name%DIV256:=(USR&FFDD)AND&FF
2490 DEFFNgbpb(A%):X%!1=name%:CALL&FFD1:A%=name%+((1+?name%)AND((A%AND-2)=6)):A%?(1+?A%)=13:=$(A%+1)
2500 DEFFNgbpb8(ptr%):X%!1=name%:X%!5=1:X%!9=ptr%:A%=8:CALL&FFD1:IFX%!5=1:=""
2510 A%=name%+1:A%!(A%?-1)=&D20:A%?(INSTR($A%," ")-1)=13:=$A%
2520 DEFFNfs:LOCALA%,Y%,E%:=(USR&FFDA)AND&FF
2530 DEFFNtime:?X%=0:A%=14:CALL&FFF1:IF?X%=0:=""
2540 X%?24=13:A%=VAL$(X%+4):$(X%+4)=RIGHT$("0"+STR$(A%AND31),2):$(X%+11)=STR$(INTVAL$(X%+11)+(A%AND&E0)DIV2-100*(INTVAL$(X%+11)<1981)):X%?6=32:X%?15=46:=$X%
2550 DEFFNTime:!X%=1:A%=14:CALL&FFF1:FORA%=0TO7:X%?A%=VALSTR$~X%?A%:NEXT
2560 ?X%=?X%+((X%?2)AND&E0)DIV2:X%?2=X%?2AND31:IF?X%<81:?X%=?X%+100
2570 IF!X%=101:!X%=&10000700:X%!4=0:A%=20:CALL&FFF1:!X%=0:IFX%!4:?X%=81+(X%?5DIV16)+((X%?4AND&E0)DIV2):X%?1=X%?5AND15:X%?2=X%?4AND31:X%!4=X%!6
2580 IFX%?3=0:IFX%?2:X%?3=FNDate_DayOfWeek(X%?2,X%?1,1900+X%?0)
2590 =FNDay(X%?3)+","+FNd0(X%?2,2)+" "+FNMon(X%?1)+" "+FNd0(1900+X%?0,4)+"."+FNd0(X%?4,2)+":"+FNd0(X%?5,2)+":"+FNd0(X%?6,2)
2600 DEFFNdate:A%=14:!X%=1:CALL&FFF1:IF!X%=1:=0
2610 ?X%=EVAL("&"+STR$((VALSTR$~?X%+(((VALSTR$~X%?2)DIV2)AND&F0))MOD100))
2620 =(VALSTR$~X%?2AND31)+256*VALSTR$~X%?1+65536*(&1900+?X%-&700*(?X%<128))
2630 DEFFNd0(A%,N%)=RIGHT$("00000000"+STR$A%,N%)
2640 DEFFNDay(A%):=MID$("000SunMonTueWedThuFriSat",A%*3+1,3)
2650 DEFFNMon(A%):=MID$("000JanFebMarAprMayJunJulAugSepOctNovDecDDDEEEFFF",A%*3+1,3)
2660 DEFFNDate_DayOfWeek(d%,m%,y%):y%=y%MOD400
2670 =(y%*365.25+m%*30+d%+VALMID$("120112234455",m%,1)+((y%MOD4)=0)-((y%-1)DIV100)-(m%>2AND((y%MOD4)=0AND(y%MOD100)<>0ORy%=0))+3)MOD7+1
2680 DEFPROCDate_FromOrd(mem%,d%,m%,y%,hr%,mn%,sc%,cs%):y%=y%MOD400
2690 d%=y%*365.25+m%*30+d%+VALMID$("120112234455",m%,1)+((y%MOD4)=0)-((y%-1)DIV100)-(m%>2AND((y%MOD4)=0AND(y%MOD100)<>0ORy%=0))+36493
2700 IFd%>146066:d%=d%-146097
2710 d%=d%*&41EB:mem%!1=d%+d%:d%=((hr%*60+mn%)*60+sc%)*100+cs%
2720 ?mem%=d%:mem%!1=mem%!1+d%DIV256:ENDPROC
2730 DEFFNfn_sfx(n$,t%):LOCALe%,f%,sp%,xt$:IFLENn$<10ORsfx%=0:=n$
2740 A%=0:REPEATe%=A%+1:A%=INSTR(n$,".",e%):UNTILA%=0:IFLENn$-e%<9:=n$ELSEe%=INSTR(n$,"/",e%):IFe%=0:=n$
2750 xt$=FNlc(MID$(n$,e%+1)):sp%=sfx%:REPEAT:f%=LEFT$($sp%,LENxt$)=xt$:IFsp%?3=44:f%=f%ANDt%=EVAL("&"+$(sp%+4))
2760 A%=sp%:sp%=sp%+1+LEN$sp%:UNTIL?sp%=13ORf%:IFf%:xt$=LEFT$($A%,3)
2770 IFRIGHT$(n$,1)<="_":IFRIGHT$(n$,1)<>"/":xt$=FNuc(xt$)
2780 =LEFT$(n$,e%-1)+"/"+xt$
2790 DEFFNPath_Name:A%=6
2800 DEFFNPath_Full:A%=&106
2810 LOCALn$,p$:REPEAT:X%!1=name%:CALL&FFD1
2820 ?(name%+2+?name%+?(name%+?name%+1))=13
2830 n$=$(name%+2+?name%):*DIR ^
2840 n$=LEFT$(n$,INSTR(n$+" "," ")-1)
2850 p$=n$+"."+p$:UNTILn$="$"ORn$="&"
2860 p$=LEFT$(p$,LENp$-1):OSCLI"DIR "+p$
2870 IFA%=6:X%!1=name%:CALL&FFD1:?(name%+1+?name%)=13:n$=$(name%+1):IFn$<>"":=":"+n$+"."+p$
2880 X%!1=name%:A%=5:CALL&FFD1
2890 ?(name%+1+?name%)=13:n$=$(name%+1)
2900 n$=LEFT$(n$,INSTR(n$+" "," ")-1):=":"+n$+"."+p$
2910 DEFFNNetFS_Op(A%,A$):!X%=0:X%?1=8+LENA$:X%!3=A%:$(X%+7)=A$:A%=&14:CALL&FFF1:=X%?3
2920 DEFPROCver_Scan:LOCALtmp$,in%:ver_mos$=""
2930 REPEAT:tmp$="tmp"+RIGHT$(STR$TIME,4):in%=OPENIN(tmp$):IFin%:CLOSE#in%
2940 UNTILin%=0:OSCLI"Spool "+tmp$:OSCLI"FX3,70":OSCLI"HELP":OSCLI"FX3":*Spool
2950 in%=OPENIN(tmp$):FORA%=0TO1:IFA%:DIMver_ttl$(ver_num%)
2960 PTR#in%=0:ver_num%=-1:REPEAT:A$=FNrd(in%):IFRIGHT$(A$,1)=")":A$=LEFT$(A$,INSTR(A$+"(","(")-1)
2970 IFLENA$>2:IFASCA$<>32:ver_num%=ver_num%+1:IFA%:ver_ttl$(ver_num%)=A$:IFLEFT$(A$,3)="OS "ORLEFT$(A$,4)="MOS ":ver_mos$=A$
2980 UNTILEOF#in%:NEXT:CLOSE#in%:in%=0:OSCLI"Delete "+tmp$
2990 IFos%=6SYS"XOS_Byte"TOA%:SYS"OS_WriteN",A%+4TOA$:ver_mos$=LEFT$(A$,INSTR(A$+" ("," (")-1)
3000 ENDPROC
3010 DEFFNrd(i%):LOCALA%,B%,A$:REPEAT:A%=BGET#i%:IFA%<>10ANDA%<>13:A$=A$+CHR$A%
3020 UNTILA%=10ORA%=13OREOF#i%:IFNOTEOF#i%:B%=BGET#i%:IFA%=B%OR(B%<>13ANDB%<>10):PTR#i%=PTR#i%-1
3030 =A$