home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / bbs / af108 / af.gfa (.txt) < prev    next >
GFA-BASIC Atari  |  1994-08-30  |  75KB  |  2,955 lines

  1. ' AutoFile TIC File Processor
  2. ' Copyright David John Thomas, B.Sc.(Hons.); 1992, 1993, 1994.
  3. '
  4. ' This program is free software; you can redistribute it and/or modify
  5. ' it under the terms of the GNU General Public License as published by
  6. ' the Free Software Foundation; either version 2 of the License, or
  7. ' (at your option) any later version.
  8. '
  9. ' This program is distributed in the hope that it will be useful,
  10. ' but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. ' GNU General Public License for more details.
  13. '
  14. ' You should have received a copy of the GNU General Public License
  15. ' along with this program; if not, write to the Free Software
  16. ' Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. '
  18. ' I can be contacted via email to David J. Thomas at 2:442/600@fidonet.org,
  19. ' 90:103/103@nest.ftn, 100:104/0@turbonet.ftn, or as davtom@dream.embassy.co.uk.
  20. ' My address for paper mail is currently 56 Forrest Road, CARDIFF, CF5 1HQ, UK
  21. ' UK until October/November 1994.
  22. '
  23. DEFINT "a-z"
  24. ver$="1.08"
  25. dist!=-1 !set this to TRUE for releases
  26. CLS
  27. ON ERROR GOSUB errout
  28. ' ## INLINE:
  29. ' $0000: 53 54 41 54 55 53 2e 4c 4f 47 00 00 00 00 00 03 
  30. ' $0010: 00 e0 3a 8a e7 20 40 0f 1c 36 00 00 86 f1 53 54 
  31. ' $0020: 41 54 55 53 2e 4c 4f 47 00 34 00 00 
  32. ' 44  Bytes.
  33. INLINE dta%,44
  34. envp%=LPEEK(BASEPAGE+&H2C)
  35. ~FSETDTA(dta%)
  36. DIM fjd%(11,1),hold$(999),autofix$(499,3),fixname$(99),inparr$(1),rept$(15,10),reptn%(15),okfile$(2,1),reg%(15)
  37. fixnames%=1
  38. fixname$(0)="FILEFIX"
  39. FOR l%=0 TO 1
  40.   d%=0
  41.   FOR i%=0 TO 11
  42.     fjd%(i%,l%)=d%
  43.     READ x%
  44.     d%=d%+x%
  45.   NEXT i%
  46. NEXT l%
  47. DATA 31,28,31,30,31,30,31,31,30,31,30,31
  48. DATA 31,29,31,30,31,30,31,31,30,31,30,31
  49. lf$=CHR$(10)
  50. HIDEM
  51. MODE 0
  52. DIM area$(999),secarea$(999),cpos%(999),addr$(99),pvtnet%(99),info$(999,9),info!(999)
  53. DIM autosend$(99),autoarea$(99),autodesc$(99),automagic$(99)
  54. DEFINT "a-z"
  55. rev$=CHR$(27)+"p"
  56. nor$=CHR$(27)+"q"
  57. PRINT "AutoFile TIC File Processor version ";ver$;" - Created using GFA Basic v3.5E E"
  58. PRINT "Copyright David J. Thomas, B.Sc.(Hons.); 1992, 1993, 1994."
  59. PRINT
  60. PRINT "Use and distribution of this program is governed by the GNU General Public"
  61. PRINT "License (see file COPYING for details). This means that the program is freely"
  62. PRINT "usable and distributable, under the conditions contained therein."
  63. PRINT
  64. PRINT "Initialising"
  65. PRINT
  66. ctl$=@fullpath$("")+"AUTOFILE.CTL"
  67. IF NOT EXIST(ctl$)
  68.   ctl$=@fullpath$(@env$("MAILER="))+"AUTOFILE.CTL"
  69.   IF NOT EXIST(ctl$)
  70.     PRINT "Control file does not exist - aborting"
  71.     fin(255)
  72.   ENDIF
  73. ENDIF
  74. inpctl(ctl$)
  75. IF BYTE{BASEPAGE+128}=0
  76.   ' no commandline
  77.   log(">No command line specified")
  78. ELSE
  79.   x$=CHAR{BASEPAGE+129}
  80.   log(">Command line: "+x$)
  81.   nohatchfilechk!=-1
  82.   nocheckfortics!=-1
  83.   nocheckfix!=-1
  84.   nocheckauto!=-1
  85.   IF INSTR(x$,"?")
  86.     PRINT "Usage: autofile [?|send|[auto[x]][filefix][hatch][report][search]]"
  87.     PRINT "?       - display this list of options"
  88.     PRINT "auto[x] - look for files to AutoHatch [only look at AutoSend line x]"
  89.     PRINT "filefix - check netmail for AutoFile, FileFix etc messages"
  90.     PRINT "hatch   - look for HATCH file and process if it exists"
  91.     PRINT "report  - send report to all nodes with a Fix statement"
  92.     PRINT "search  - search for files in inbound"
  93.     PRINT "send    - hatch a file with data input from the console"
  94.     PRINT
  95.     PRINT "Default operation is as with ""autofile auto filefix hatch search""."
  96.     PRINT
  97.     PRINT "Press a key to continue"
  98.     ~INP(2)
  99.     fin(99)
  100.   ENDIF
  101.   IF INSTR(UPPER$(x$),"SEND")
  102.     lochatch
  103.     IF rep_make!
  104.       rep_make
  105.     ENDIF
  106.     fin(0)
  107.   ENDIF
  108.   IF INSTR(UPPER$(x$),"AUTO")
  109.     nocheckauto!=0
  110.     autono%=VAL(MID$(x$,INSTR(UPPER$(x$),"A")+1))
  111.   ENDIF
  112.   IF INSTR(UPPER$(x$),"HATCH")
  113.     nohatchfilechk!=0
  114.   ENDIF
  115.   IF INSTR(UPPER$(x$),"FILEFIX")
  116.     nocheckfix!=0
  117.   ENDIF
  118.   IF INSTR(UPPER$(x$),"REPORT")
  119.     sendreport!=-1
  120.   ENDIF
  121.   IF INSTR(UPPER$(x$),"SEARCH")
  122.     nocheckfortics!=0
  123.   ENDIF
  124. ENDIF
  125. IF NOT nocheckfix!
  126.   checkfix
  127. ENDIF
  128. IF NOT nocheckfortics!
  129.   checkfortics
  130. ENDIF
  131. IF NOT nocheckauto!
  132.   checkauto(autono%)
  133. ENDIF
  134. IF NOT nohatchfilechk!
  135.   checkhatchfile
  136. ENDIF
  137. IF sendreport!
  138.   report
  139. ENDIF
  140. IF rep_make!
  141.   rep_make
  142. ENDIF
  143. fin(-netmail!-2*echomail!)
  144. ' input control file info
  145. > PROCEDURE inpctl(c$)
  146.   LOCAL x$,np%,l$,com$,par$
  147.   filup$="AutoFile Automated Upload"
  148.   DIM par$(9),upr$(9)
  149.   OPEN "I",#0,c$
  150.   DO UNTIL EOF(#0)
  151.     x%=LOC(#0)
  152.     l$=@inl$(0)
  153.     ' convert tabs into spaces, get rid of comments
  154.     IF INSTR(l$,";")
  155.       l$=LEFT$(l$,INSTR(l$,";")-1)
  156.     ENDIF
  157.     l$=TRIM$(l$)
  158.     DO WHILE INSTR(l$,CHR$(9))
  159.       BYTE{V:l$+INSTR(l$,CHR$(9))-1}=32
  160.     LOOP
  161.     DO WHILE INSTR(l$,"  ")
  162.       l$=LEFT$(l$,INSTR(l$,"  "))+MID$(l$,INSTR(l$,"  ")+2)
  163.     LOOP
  164.     IF INSTR(l$," ")
  165.       com$=UPPER$(LEFT$(l$,INSTR(l$," ")-1))
  166.       par$=MID$(l$,INSTR(l$," ")+1)
  167.     ELSE
  168.       com$=UPPER$(l$)
  169.       par$=""
  170.     ENDIF
  171.     x$=par$
  172.     np%=0
  173.     DO WHILE INSTR(x$," ")
  174.       par$(np%)=LEFT$(x$,INSTR(x$," ")-1)
  175.       upr$(np%)=UPPER$(par$(np%))
  176.       x$=MID$(x$,INSTR(x$," ")+1)
  177.       INC np%
  178.     LOOP UNTIL np%=9
  179.     IF x$>""
  180.       par$(np%)=x$
  181.       upr$(np%)=UPPER$(par$(np%))
  182.       INC np%
  183.     ENDIF
  184.     upr$=UPPER$(par$)
  185.     IF com$="ADDRESS"
  186.       IF np%=1 OR np%=2
  187.         IF np%=2
  188.           pvtnet%(naddr%)=VAL(par$(1))
  189.         ENDIF
  190.         IF naddr%=0
  191.           defzone%=VAL(par$(0))
  192.         ENDIF
  193.         addr$(naddr%)=@stdaddr$(par$(0),defzone%)
  194.         INC naddr%
  195.       ELSE
  196.         er$=er$+"!Address line has no parameters"+CHR$(10)+"Syntax: Address [zone:]<net>/<node>[.point] [fakenet]"+CHR$(10)
  197.       ENDIF
  198.     ELSE IF com$="BINK"
  199.       IF mailer!=-1
  200.         er$=er$+"!Mailer type specified twice"+CHR$(10)
  201.         fin(254)
  202.       ENDIF
  203.       mailer!=-1
  204.       bink!=-1
  205.     ELSE IF com$="THE-BOX"
  206.       IF mailer!=-1
  207.         er$=er$+"!Mailer type specified twice"+CHR$(10)
  208.         fin(254)
  209.       ENDIF
  210.       mailer!=-1
  211.     ELSE IF com$="AREA"
  212.       IF np%=2 OR np%=3
  213.         area$(nareas%)=par$(1)
  214.         IF np%=3
  215.           secarea$(nareas%)=par$(2)
  216.         ENDIF
  217.         cpos%(nareas%)=x%
  218.         INC nareas%
  219.       ELSE
  220.         er$=er$+"!Area line has wrong number of parameters"+CHR$(10)+"Syntax: Area [drive;]<path> <area_name> [secondary_name]"+CHR$(10)
  221.       ENDIF
  222.     ELSE IF com$="INBOUND"
  223.       IF np%=1
  224.         inbag$=inbag$+@fullpath$(par$)+"£"
  225.       ELSE
  226.         er$=er$+"!Inbound line has no parameters"+CHR$(10)+"Syntax: Inbound [drive:]<path_to_inbound_dir>"+CHR$(10)
  227.       ENDIF
  228.     ELSE IF com$="ZONE"
  229.       IF np%=2
  230.         hold$(VAL(par$(0)))=@fullpath$(par$(1))
  231.       ELSE
  232.         er$=er$+"!Zone line has wrong number of parameters"+CHR$(10)+"Syntax: Zone <zone> [drive:]<path_to_holding_area>"+CHR$(10)
  233.       ENDIF
  234.     ELSE IF com$="HOLD"
  235.       IF np%=1
  236.         hold$=@fullpath$(par$)
  237.       ELSE
  238.         er$=er$+"!Hold line has no parameters"+CHR$(10)+"Syntax: Hold [drive:]<path_to_hold_area>"+CHR$(10)
  239.       ENDIF
  240.     ELSE IF com$="TICDIR"
  241.       IF np%=1
  242.         ticdir$=@fullpath$(par$)
  243.       ELSE
  244.         er$=er$+"!TicDir line has no parameters"+CHR$(10)+"Syntax: TicDir [drive:]<path_to_TIC_storage_dir>"+CHR$(10)
  245.       ENDIF
  246.     ELSE IF com$="FLEA"
  247.       flea!=-1
  248.     ELSE IF com$="KEY"
  249.       key$=upr$
  250.     ELSE IF com$="NAME"
  251.       nam$=upr$
  252.     ELSE IF com$="STATUSLOG"
  253.       IF np%=1
  254.         log$=par$
  255.       ELSE
  256.         er$=er$+"!StatusLog line has no parameters"+CHR$(10)+"Syntax: StatusLog [drive:][path]<log_filename>"+CHR$(10)
  257.       ENDIF
  258.     ELSE IF com$="LOGLEVEL"
  259.       IF np%=1
  260.         loglevel%=VAL(par$)
  261.       ELSE
  262.         er$=er$+"!LogLevel line has no parameters"+CHR$(10)+"Syntax: LogLevel <1-5>"+CHR$(10)
  263.       ENDIF
  264.     ELSE IF com$="DEBUG"
  265.       debug!=-1
  266.     ELSE IF com$="USE4D"
  267.       use4d!=-1
  268.     ELSE IF com$="AUTOSEND"
  269.       IF np%>1
  270.         autosend$(aut%)=upr$(0)
  271.         autoarea$(aut%)=upr$(1)
  272.         FOR i%=2 TO np%-1
  273.           autodesc$(aut%)=autodesc$(aut%)+par$(i%)+" "
  274.         NEXT i%
  275.         autodesc$(aut%)=TRIM$(autodesc$(aut%))
  276.         INC aut%
  277.       ELSE
  278.         er$=er$+"!AutoSend line has wrong number of parameters"+CHR$(10)+"Syntax: AutoSend [drive:][path]<filename> <area> [desc]"+CHR$(10)
  279.       ENDIF
  280.     ELSE IF com$="AUTOMAGIC"
  281.       IF aut%>0
  282.         automagic$(aut%-1)=upr$(0)
  283.       ELSE
  284.         er$=er$+"AutoMagic defined before AutoSend"+CHR$(10)
  285.       ENDIF
  286.     ELSE IF com$="NETMAIL"
  287.       IF np%=1
  288.         netmail$=upr$
  289.       ELSE
  290.         er$=er$+"!Netmail line has no parameters"+CHR$(10)+"!Syntax: Netmail <path_to_netmail_base>"+CHR$(10)
  291.       ENDIF
  292.     ELSE IF com$="FIX"
  293.       IF np%=3 OR np%=4
  294.         autofix$(afix%,0)=upr$(0) !node number
  295.         autofix$(afix%,1)=upr$(1) !password
  296.         autofix$(afix%,2)=upr$(2) !valid groups
  297.         autofix$(afix%,3)=upr$(3) !default flags
  298.         IF autofix$(afix%,3)=""
  299.           autofix$(afix%,3)="OH"
  300.         ENDIF
  301.         INC afix%
  302.       ELSE
  303.         er$=er$+"Fix line has wrong number of parameters"+CHR$(10)+"!Syntax: Fix <node> <password> <groups> [flags]"+CHR$(10)
  304.       ENDIF
  305.     ELSE IF com$="ADVISE"
  306.       advise!=-1
  307.     ELSE IF com$="FIXNAME"
  308.       IF np%>0
  309.         fixname$(fixnames%)=upr$
  310.         INC fixnames%
  311.       ELSE
  312.         er$=er$+"!FixName line has no parameters"+CHR$(10)+"Syntax: FixName <name>"+CHR$(10)
  313.       ENDIF
  314.     ELSE IF com$="REPLACE-DEL"
  315.       rep_del!=-1
  316.     ELSE IF com$="RENUSEDTICS"
  317.       rentics!=-1
  318.     ELSE IF com$="TURBOFIL"
  319.       IF np%=1 OR np%=2
  320.         turbo!=-1
  321.         filpath$=@fullpath$(upr$(0))
  322.         IF np%=2
  323.           turboacc%=VAL(upr$(1))
  324.         ENDIF
  325.       ELSE
  326.         er$=er$+"!TurboFil line has wrong number of parameters"+CHR$(10)+"Syntax: TurboFil <path_to_FIL_files> [security_level]"+CHR$(10)
  327.       ENDIF
  328.     ELSE IF com$="PROBBS"
  329.       IF np%=1
  330.         probbs!=-1
  331.         probbs$=@fullpath$(upr$(0))
  332.       ELSE
  333.         er$=er$+"!ProBBS line has wrong number of parameters"+CHR$(10)+"Syntax: TurboFil <path_to_FIL_files> [security_level]"+CHR$(10)
  334.       ENDIF
  335.     ELSE IF com$="FILUPLOAD"
  336.       filup$=LEFT$(par$,30)
  337.     ELSE IF com$="REPAREA"
  338.       IF np%=2 OR np%=3
  339.         reparea!=-1
  340.         rept$(reparea_num%,7)=upr$(0)
  341.         rept$(reparea_num%,8)=par$(1)
  342.         rept$(reparea_num%,9)=upr$(2)
  343.         IF np%=2
  344.           rept$(reparea_num%,9)="REPFILE.TPL"
  345.         ENDIF
  346.         INC reparea_num%
  347.       ELSE
  348.         er$=er$+"!RepArea line has wrong number of parameters"+CHR$(10)+"Syntax: RepArea <path_to_base> <groups> [template_file]"+CHR$(10)
  349.       ENDIF
  350.     ELSE IF com$="STOPDUP"
  351.       IF stopdup!
  352.         er$=er$+"!StopDup line specified twice"+CHR$(10)
  353.       ELSE
  354.         stopdup!=-1
  355.         IF np%=1
  356.           stopdup$=@fullpath$(par$)
  357.         ELSE
  358.           stopdup$=@fullpath$(".")
  359.         ENDIF
  360.       ENDIF
  361.     ELSE IF com$="OKFILE"
  362.       IF okfile%=3
  363.         er$=er$+"!Too many OkFiles"+CHR$(10)
  364.       ELSE
  365.         okfile$(okfile%,0)=upr$(0)
  366.         IF np%=2
  367.           okfile$(okfile%,1)=upr$(1)
  368.         ENDIF
  369.         INC okfile%
  370.       ENDIF
  371.     ENDIF
  372.   LOOP
  373.   FOR i%=0 TO afix%-1
  374.     autofix$(i%,0)=@stdaddr$(autofix$(i%,0),defzone%)
  375.   NEXT i%
  376.   IF log$>""
  377.     log!=-1
  378.     IF EXIST(log$)
  379.       OPEN "A",#9,log$
  380.       PRINT #9
  381.     ELSE
  382.       OPEN "O",#9,log$
  383.     ENDIF
  384.     IF debug!
  385.       CLOSE #9
  386.     ENDIF
  387.   ENDIF
  388.   CLOSE #0
  389.   IF er$>""
  390.     error(er$)
  391.   ENDIF
  392.   log("+begin, AutoFile "+ver$+", "+STR$(FRE(0))+" bytes free")
  393.   ERASE par$(),upr$()
  394. RETURN
  395. > PROCEDURE lochatch
  396.   PRINT "Local manually-operated Hatch command specified"
  397.   PRINT
  398.   a$=@sel_area$
  399.   IF a$>""
  400.     DO
  401.       PRINT "Please specify filename (ESC to quit):"
  402.       f$=@inpline$("","ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._-!""$%&()~#+={[}]:@'<,>\",79)
  403.       IF f$=CHR$(24)
  404.         PRINT
  405.         PRINT "User escape"
  406.         fin(0)
  407.       ELSE IF INSTR(f$,"\")
  408.         f$=@fullpath$(LEFT$(f$,RINSTR(f$,"\")))+MID$(f$,RINSTR(f$,"\")+1)
  409.       ELSE IF MID$(f$,2,1)<>":"
  410.         IF EXIST(f$)
  411.           f$=@fullpath$(".")+f$
  412.         ELSE
  413.           info(@areanum(a$))
  414.           f$=apath$+f$
  415.         ENDIF
  416.       ELSE
  417.         f$=@fullpath$(LEFT$(f$,2))+MID$(f$,3)
  418.       ENDIF
  419.       IF NOT EXIST(f$)
  420.         PRINT "File does not exist!"
  421.       ENDIF
  422.       PRINT
  423.     LOOP UNTIL EXIST(f$)
  424.     DO
  425.       PRINT "Please specify description (ESC to quit):"
  426.       d$=@inpline$("","",79)
  427.       IF d$=""
  428.         PRINT
  429.         PRINT "Description must be supplied"
  430.       ELSE IF d$=CHR$(24)
  431.         PRINT
  432.         PRINT "User escape"
  433.         fin(0)
  434.       ENDIF
  435.       PRINT
  436.     LOOP UNTIL d$>""
  437.     PRINT "If you want to use a magic name, please specify it here:"
  438.     m$=@inpline$("","ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._-!""$%&()~#+={[}]@'<,>",12)
  439.     IF m$=CHR$(24)
  440.       PRINT
  441.       PRINT "User escape"
  442.       fin(0)
  443.     ENDIF
  444.     ~@hatch(f$,a$,d$,m$)
  445.   ELSE
  446.     PRINT "Hatch command cancelled"
  447.   ENDIF
  448. RETURN
  449. > PROCEDURE error(er$)
  450.   log("!Errors in control file as follows:")
  451.   DO WHILE INSTR(er$,CHR$(10))
  452.     log("!Error : "+LEFT$(er$,INSTR(er$,CHR$(10))-1))
  453.     er$=MID$(er$,INSTR(er$,CHR$(10))+1)
  454.   LOOP
  455.   fin(255)
  456. RETURN
  457. ' finish program execution
  458. > PROCEDURE fin(retcode%)
  459.   IF retcode%=99
  460.     PRINT
  461.     PRINT "Apologies for the inconvenience caused."
  462.     PRINT
  463.   ENDIF
  464.   log("+end, AutoFile "+ver$+", Exit with errorlevel "+STR$(retcode%))
  465.   ~XBIOS(21,1,0)
  466.   ~XBIOS(21,2,0)
  467.   CLOSE
  468.   IF dist!
  469.     SYSTEM retcode%
  470.   ELSE
  471.     END
  472.   ENDIF
  473. RETURN
  474. > PROCEDURE log(l$)
  475.   LOCAL llog!,ll$
  476.   ll$=l$
  477.   IF LEFT$(l$)<>">"
  478.     PRINT LEFT$(l$);" ";TIME$;" ";MID$(l$,2,69);
  479.     ll$=MID$(l$,71)
  480.     DO WHILE ll$>""
  481.       PRINT "       ... ";LEFT$(ll$,69);
  482.       ll$=MID$(ll$,70)
  483.     LOOP
  484.     PRINT
  485.   ENDIF
  486.   IF log$>"" AND log!
  487.     llog!=0
  488.     SELECT LEFT$(l$)
  489.     CASE "!"
  490.       llog!=TRUE
  491.     CASE "*"
  492.       llog!=TRUE
  493.     CASE "+"
  494.       llog!=loglevel%>1
  495.     CASE ":"
  496.       llog!=loglevel%>2
  497.     CASE "#"
  498.       llog!=loglevel%>3
  499.     CASE " "
  500.       llog!=loglevel%>4
  501.     CASE ">"
  502.       llog!=debug!
  503.     DEFAULT
  504.       llog!=0
  505.     ENDSELECT
  506.     IF llog!
  507.       IF debug!
  508.         IF EXIST(log$)
  509.           OPEN "A",#9,log$
  510.         ELSE
  511.           OPEN "O",#9,log$
  512.         ENDIF
  513.       ENDIF
  514.       PRINT #9,LEFT$(l$);" ";LEFT$(DATE$,2);" ";MID$("JanFebMarAprMayJunJulAugSepOctNovDec",VAL(MID$(DATE$,4,2))*3-2,3);" ";TIME$;" FILE ";MID$(l$,2)
  515.       IF debug!
  516.         CLOSE #9
  517.       ENDIF
  518.     ENDIF
  519.   ENDIF
  520. RETURN
  521. > PROCEDURE status(l$)
  522.   IF LEN(l$)>68
  523.     PRINT "  ";TIME$;" ";LEFT$(l$,68);
  524.   ELSE IF l$>""
  525.     PRINT "  ";TIME$;" ";l$;SPACE$(68-LEN(l$));
  526.   ELSE
  527.     PRINT SPACE$(79);
  528.   ENDIF
  529.   OUT 2,13
  530. RETURN
  531. > PROCEDURE errout
  532.   ON ERROR
  533.   log("!Error "+STR$(ERR))
  534.   log("!  ("+MID$(ERR$(ERR),INSTR(2,ERR$(ERR),"[")+1,INSTR(6,ERR$(ERR),"]")-5)+")")
  535.   fin(254)
  536. RETURN
  537. ' Check for inbound files
  538. > PROCEDURE checkfortics
  539.   ~FSETDTA(dta%)
  540.   inbt$=inbag$
  541.   IF flea!
  542.     log(":Searching for TICs and FLEs")
  543.   ELSE
  544.     log(":Searching for TICs")
  545.   ENDIF
  546.   DO
  547.     inb$=LEFT$(inbt$,INSTR(inbt$,"£")-1)
  548.     inbt$=MID$(inbt$,INSTR(inbt$,"£")+1)
  549.     log("#Searching in path "+inb$)
  550.     seektic(inb$+"*.TOK",inb$,0)
  551.     seektic(inb$+"*.TIC",inb$,-1)
  552.     x%=FSFIRST(inb$+"*.TXX",0)
  553.     DO UNTIL x%
  554.       tic$=CHAR{dta%+30}
  555.       x$=inb$+tic$
  556.       y$=LEFT$(x$,RINSTR(x$,"."))+"TOK"
  557.       NAME x$ AS y$
  558.       log(" "+x$+" renamed to "+y$)
  559.       x%=FSFIRST(inb$+"*.TIC",0)
  560.     LOOP
  561.     IF flea!
  562.       x%=FSFIRST(inb$+"*.FLE",0)
  563.       IF x%
  564.         log(" No inbound FLE files found")
  565.       ELSE
  566.         DO
  567.           tic$=CHAR{dta%+30}
  568.           log("#"+tic$+" found")
  569.           ' process FLE files here
  570.           OPEN "I",#0,inb$+tic$
  571.           DIM temp$(999)
  572.           RECALL #0,temp$(),-1,ltic%
  573.           CLOSE #0
  574.           area$=""
  575.           file$=temp$(1)
  576.           IF file$>""
  577.             log(" FName:"+file$)
  578.           ENDIF
  579.           desc$=temp$(2)
  580.           IF desc$=""
  581.             desc$="No description specified"
  582.           ENDIF
  583.           log(" FDesc:"+desc$)
  584.           origin$=""
  585.           FOR i%=0 TO ltic%-1
  586.             IF LEFT$(temp$(i%),4)="Area"
  587.               area$=TRIM$(MID$(temp$(i%),6))
  588.               temp$(i%)="-"
  589.               log(" FArea:"+area$)
  590.             ELSE IF LEFT$(temp$(i%),6)="Origin"
  591.               origin$=TRIM$(MID$(temp$(i%),8))
  592.               temp$(i%)="-"
  593.               log(" FOrigin:"+origin$)
  594.             ELSE IF LEFT$(temp$(i%),4)="From"
  595.               from$=TRIM$(MID$(temp$(i%),6))
  596.               pw$=MID$(from$,INSTR(from$," ")+1)
  597.               from$=LEFT$(from$,INSTR(from$," ")-1)
  598.               temp$(i%)="-"
  599.               log(" FFrom:"+from$)
  600.               log(">FPw:"+pw$)
  601.             ELSE IF LEFT$(temp$(i%),10)="Created by"
  602.               log(">FCreatedBy:"+TRIM$(MID$(temp$(i%),12)))
  603.               temp$(i%)="-"
  604.             ELSE IF LEFT$(temp$(i%),6)="Seenby"
  605.               log(">FSeenby:"+TRIM$(MID$(temp$(i%),8)))
  606.             ENDIF
  607.           NEXT i%
  608.           n%=@areanum(area$)
  609.           info(n%)
  610.           IF area$=""
  611.             log("#FLE contains no file echo name")
  612.           ELSE IF from$=""
  613.             log("#FLE contains no From field")
  614.           ELSE IF pw$=""
  615.             log("#FLE contains no Password, not secured")
  616.           ELSE IF file$=""
  617.             log("#FLE contains no filename")
  618.           ELSE IF NOT EXIST(inb$+file$)
  619.             log("#Primary file "+file$+" does not exist")
  620.           ELSE IF n%=-1
  621.             log("#Area "+area$+" does not exist")
  622.           ELSE
  623.             ' check that from node is in list, with correct password
  624.             info(n%)
  625.             IF @accept(from$,pw$)=1
  626.               log("#Node "+from$+" not connected to "+area$+" for input")
  627.             ELSE IF @accept(from$,pw$)=0
  628.               log("#Pwd wrong from "+from$+" in "+area$)
  629.             ELSE
  630.               filecrc%=@crc32(inb$+file$)
  631.               log(">CRC calculated: "+HEX$(x%))
  632.               IF @check_dup(file$,area$,x%)
  633.                 log("#File "+file$+" with CRC "+HEX$(filecrc%)+" has already been hatched")
  634.               ELSE IF @move(inb$+file$,apath$+file$)
  635.                 log("#Error in file move, probably not enough space")
  636.                 x$=inb$+tic$
  637.                 y$=LEFT$(x$,RINSTR(x$,"."))+"FOK"
  638.                 NAME x$ AS y$
  639.                 log("#"+x$+" renamed as "+y$)
  640.               ELSE
  641.                 OPEN "I",#99,apath$+file$
  642.                 size%=LOF(#99)
  643.                 CLOSE #99
  644.                 log(" FSize:"+STR$(size%))
  645.                 log(" "+file$+" moved to "+apath$)
  646.                 IF reparea!
  647.                   rep_area(file$,area$,size%,desc$,grp$,origin$)
  648.                 ENDIF
  649.                 ~@addtofil(file$,desc$,apath$)
  650.                 IF rentics!
  651.                   NAME inb$+tic$ AS inb$+LEFT$(tic$,RINSTR(tic$,"."))+"FPR"
  652.                   log(">"+inb$+tic$+" renamed to "+left$(RINSTR(tic$,"."))+".FPR")
  653.                 ELSE
  654.                   KILL inb$+tic$
  655.                   log(" "+inb$+tic$+" deleted")
  656.                 ENDIF
  657.                 seenby$=""
  658.                 i%=0
  659.                 DO
  660.                   IF LEFT$(temp$(i%),6)="Seenby"
  661.                     seenby$=seenby$+TRIM$(MID$(temp$(i%),8))+CHR$(13)
  662.                     temp$(i%)="-"
  663.                   ENDIF
  664.                   INC i%
  665.                 LOOP UNTIL temp$(i%)=""
  666.                 ' we must send out to any connected nodes now
  667.                 sendnode$=atic$+afle$+anon$
  668.                 iseenby$=seenby$
  669.                 DO WHILE INSTR(sendnode$,",")
  670.                   IF NOT @in(seenby$,LEFT$(sendnode$,INSTR(sendnode$,"!")-1))
  671.                     seenby$=seenby$+LEFT$(sendnode$,INSTR(sendnode$,"!")-1)+CHR$(13)
  672.                   ENDIF
  673.                   sendnode$=MID$(sendnode$,INSTR(sendnode$,",")+1)
  674.                 LOOP
  675.                 x%=@stamp
  676.                 path$=STR$(x%)+" "+MID$("ThuFriSatSunMonTueWed",(x%\86400 MOD 7)*3+1,3)+" "+MID$("JanFebMarAprMayJunJulAugSepOctNovDec",VAL(MID$(DATE$,4))*3-2,3)+" "
  677.                 path$=path$+LEFT$(DATE$,2)+" "+TIME$+" "+RIGHT$(DATE$,4)+CHR$(13)
  678.                 sendnode$=atic$+afle$+anon$
  679.                 DO WHILE INSTR(sendnode$,",")
  680.                   n$=@stdaddr$(LEFT$(sendnode$,INSTR(sendnode$,"!")-1),defzone%)
  681.                   p$=MID$(sendnode$,INSTR(sendnode$,"!")+1)
  682.                   p$=LEFT$(p$,INSTR(p$,",")-1)
  683.                   IF NOT @in(iseenby$,n$)
  684.                     ' then the node hasn't seen it
  685.                     z%=VAL(n$)
  686.                     from$=@defaddr$(z%)
  687.                     sb$=seenby$
  688.                     IF INSTR(sb$,from$)=0
  689.                       sb$=sb$+from$+CHR$(13)
  690.                     ENDIF
  691.                     tic(n%,file$,desc$,origin$,from$,n$,p$,sb$,from$+" "+path$,crc%,"","","","")
  692.                   ENDIF
  693.                   sendnode$=MID$(sendnode$,INSTR(sendnode$,",")+1)
  694.                 LOOP
  695.                 add_dup(file$,area$,filecrc%)
  696.               ENDIF
  697.             ENDIF
  698.           ENDIF
  699.           IF EXIST(inb$+tic$)
  700.             x$=inb$+tic$
  701.             y$=LEFT$(x$,RINSTR(x$,"."))+"FBD"
  702.             NAME x$ AS y$
  703.             log("#"+x$+" renamed as "+y$)
  704.           ELSE IF aautohatch$>""
  705.             ~@hatchs(apath$+file$,aautohatch$,desc$,seenby$,area$,"")
  706.           ENDIF
  707.           ERASE temp$()
  708.           x%=FSFIRST(inb$+"*.FLE",0)
  709.         LOOP UNTIL x%
  710.       ENDIF
  711.     ENDIF
  712.   LOOP UNTIL inbt$=""
  713. RETURN
  714. > PROCEDURE seektic(seek$,inb$,chk!)
  715.   x%=FSFIRST(seek$,0)
  716.   IF x%
  717.     log(" No inbound "+RIGHT$(seek$,3)+" files found")
  718.   ELSE
  719.     DO
  720.       tic$=CHAR{dta%+30}
  721.       log("#"+tic$+" found")
  722.       ' process TIC files here
  723.       OPEN "I",#0,inb$+tic$
  724.       DIM temp$(999)
  725.       RECALL #0,temp$(),-1,ltic%
  726.       CLOSE #0
  727.       area$=""
  728.       origin$=""
  729.       from$=""
  730.       file$=""
  731.       desc$=""
  732.       rel$=""
  733.       rep$=""
  734.       mag$=""
  735.       crc!=0
  736.       pw$=""
  737.       FOR i%=0 TO ltic%-1
  738.         IF LEFT$(temp$(i%),4)="Area"
  739.           area$=TRIM$(MID$(temp$(i%),6))
  740.           temp$(i%)="-"
  741.           IF chk!
  742.             log(" FArea:"+area$)
  743.           ENDIF
  744.         ELSE IF LEFT$(temp$(i%),6)="Origin"
  745.           origin$=TRIM$(MID$(temp$(i%),8))
  746.           temp$(i%)="-"
  747.           IF chk!
  748.             log(" FOrigin:"+origin$)
  749.           ENDIF
  750.         ELSE IF LEFT$(temp$(i%),4)="From"
  751.           from$=TRIM$(MID$(temp$(i%),6))
  752.           temp$(i%)="-"
  753.           IF chk!
  754.             log(" FFrom:"+from$)
  755.           ENDIF
  756.         ELSE IF LEFT$(temp$(i%),4)="File"
  757.           file$=TRIM$(MID$(temp$(i%),6))
  758.           temp$(i%)="-"
  759.           IF chk!
  760.             log(" FName:"+file$)
  761.           ENDIF
  762.         ELSE IF LEFT$(temp$(i%),4)="Desc"
  763.           desc$=TRIM$(MID$(temp$(i%),6))
  764.           temp$(i%)="-"
  765.           IF chk!
  766.             log(" FDesc:"+desc$)
  767.           ENDIF
  768.         ELSE IF LEFT$(temp$(i%),3)="CRC"
  769.           crc%=VAL("&H"+TRIM$(MID$(temp$(i%),5)))
  770.           crc!=-1
  771.           temp$(i%)="-"
  772.           IF chk!
  773.             log(" FCRC:"+HEX$(crc%))
  774.           ENDIF
  775.         ELSE IF LEFT$(temp$(i%),10)="Created by"
  776.           log(">FCreatedBy:"+TRIM$(MID$(temp$(i%),12)))
  777.           temp$(i%)="-"
  778.         ELSE IF LEFT$(temp$(i%),2)="Pw"
  779.           pw$=TRIM$(MID$(temp$(i%),4))
  780.           temp$(i%)="-"
  781.           IF chk!
  782.             log(">FPw:"+pw$)
  783.           ENDIF
  784.         ELSE IF LEFT$(temp$(i%),7)="Release"
  785.           rel$=TRIM$(MID$(temp$(i%),9))
  786.           temp$(i%)="-"
  787.           IF chk!
  788.             log(" FRelease:"+rel$)
  789.           ENDIF
  790.         ELSE IF LEFT$(temp$(i%),8)="Replaces"
  791.           log(" FReplaces:"+TRIM$(MID$(temp$(i%),10)))
  792.           rep$=rep$+TRIM$(MID$(temp$(i%),10))+CHR$(13)
  793.         ELSE IF LEFT$(temp$(i%),6)="Seenby"
  794.           log(">FSeenby:"+TRIM$(MID$(temp$(i%),8)))
  795.         ELSE IF LEFT$(temp$(i%),6)="Path"
  796.           log(">FPath:"+TRIM$(MID$(temp$(i%),6)))
  797.         ELSE IF LEFT$(temp$(i%),5)="Magic"
  798.           mag$=TRIM$(MID$(temp$(i%),7))
  799.           temp$(i%)="-"
  800.           IF chk!
  801.             log(">FMagic:"+mag$)
  802.           ENDIF
  803.         ENDIF
  804.       NEXT i%
  805.       n%=@areanum(area$)
  806.       info(n%)
  807.       ok!=-1
  808.       IF chk!
  809.         IF area$=""
  810.           log("#TIC contains no file echo name")
  811.           ok!=0
  812.         ELSE IF from$=""
  813.           log("#TIC contains no ""From"" field")
  814.           ok!=0
  815.         ELSE IF pw$=""
  816.           log("#TIC contains no password, not secured")
  817.           ok!=0
  818.         ELSE IF file$=""
  819.           log("#TIC contains no filename")
  820.           ok!=0
  821.         ELSE IF NOT EXIST(inb$+file$)
  822.           log("#Primary file "+file$+" does not exist")
  823.           ok!=0
  824.         ELSE IF n%=-1
  825.           log("#Area "+area$+" does not exist")
  826.           ok!=0
  827.         ENDIF
  828.       ENDIF
  829.       IF ok!
  830.         info(n%)
  831.         IF chk!
  832.           IF @accept(from$,pw$)=1
  833.             log("#Node "+from$+" not connected to "+area$+" for input")
  834.             ok!=0
  835.           ELSE IF @accept(from$,pw$)=0
  836.             log("#Pwd wrong from "+from$+" in "+area$)
  837.             ok!=0
  838.           ENDIF
  839.         ENDIF
  840.         IF ok!
  841.           IF desc$=""
  842.             desc$="No description specified"
  843.           ENDIF
  844.           filecrc%=@crc32(inb$+file$)
  845.           log(">CRC calculated: "+HEX$(filecrc%))
  846.           IF chk!
  847.             IF crc! AND crccheck! AND crc%<>filecrc%
  848.               log("#File "+file$+" failed CRC check")
  849.               ok!=0
  850.             ELSE IF @check_dup(file$,area$,filecrc%)
  851.               log("#File "+file$+" with CRC "+HEX$(filecrc%)+" has already been hatched")
  852.               ok!=0
  853.             ENDIF
  854.           ENDIF
  855.           IF ok!
  856.             OPEN "I",#99,inb$+file$
  857.             size%=LOF(#99)
  858.             CLOSE #99
  859.             log(" FSize:"+STR$(size%))
  860.             crc%=filecrc%
  861.             IF rep_del! AND rep$>""
  862.               x$=rep$
  863.               DO WHILE x$>""
  864.                 y$=LEFT$(x$,INSTR(x$,CHR$(13))-1)
  865.                 x$=MID$(x$,INSTR(x$,CHR$(13))+1)
  866.                 IF INSTR(y$,"?") OR INSTR(y$,"*")
  867.                   log(" Replace line "+y$+" contains wildcard(s) - ignored")
  868.                 ELSE
  869.                   log(">Searching for "+y$)
  870.                   IF FSFIRST(apath$+y$,0)=0
  871.                     KILL apath$+CHAR{dta%+30}
  872.                     log(" "+CHAR{dta%+30}+" found and deleted")
  873.                   ENDIF
  874.                 ENDIF
  875.               LOOP
  876.             ENDIF
  877.             x%=@move(inb$+file$,apath$+file$)
  878.             IF x%
  879.               IF chk!
  880.                 log("#Error in file move, probably not enough space")
  881.               ELSE
  882.                 log("#Still not enough space for file")
  883.               ENDIF
  884.               x$=inb$+tic$
  885.               y$=LEFT$(x$,RINSTR(x$,"."))+"TXX"
  886.               NAME x$ AS y$
  887.               log(">ren "+x$+" "+y$)
  888.             ELSE
  889.               addmagic(mag$,apath$+file$)
  890.               log(" "+file$+" moved to "+apath$)
  891.               ~@addtofil(file$,desc$,apath$)
  892.               IF reparea!
  893.                 rep_area(file$,area$,size%,desc$,grp$,origin$)
  894.               ENDIF
  895.               IF rentics!
  896.                 NAME inb$+tic$ AS inb$+LEFT$(tic$,RINSTR(tic$,"."))+"TPR"
  897.                 log(">"+inb$+tic$+" renamed to "+LEFT$(tic$,RINSTR(tic$,"."))+".TPR")
  898.               ELSE
  899.                 KILL inb$+tic$
  900.                 log(" "+inb$+tic$+" deleted")
  901.               ENDIF
  902.               seenby$=""
  903.               path$=""
  904.               other$=""
  905.               i%=0
  906.               DO
  907.                 IF LEFT$(temp$(i%),6)="Seenby"
  908.                   seenby$=seenby$+TRIM$(MID$(temp$(i%),8))+CHR$(13)
  909.                 ELSE IF LEFT$(temp$(i%),4)="Path"
  910.                   path$=path$+TRIM$(MID$(temp$(i%),6))+CHR$(13)
  911.                 ELSE
  912.                   other$=other$+temp$(i%)+CHR$(13)
  913.                 ENDIF
  914.                 INC i%
  915.               LOOP UNTIL temp$(i%)=""
  916.               ' now we have seenby and path information in two strings
  917.               ' we must send out to any connected nodes now
  918.               sendnode$=atic$+afle$+anon$
  919.               iseenby$=seenby$
  920.               DO WHILE INSTR(sendnode$,",")
  921.                 IF NOT @in(seenby$,LEFT$(sendnode$,INSTR(sendnode$,"!")-1))
  922.                   seenby$=seenby$+LEFT$(sendnode$,INSTR(sendnode$,"!")-1)+CHR$(13)
  923.                 ENDIF
  924.                 sendnode$=MID$(sendnode$,INSTR(sendnode$,",")+1)
  925.               LOOP
  926.               x%=@stamp
  927.               addpath$=STR$(x%)+" "+MID$("ThuFriSatSunMonTueWed",(x%\86400 MOD 7)*3+1,3)+" "+MID$("JanFebMarAprMayJunJulAugSepOctNovDec",VAL(MID$(DATE$,4))*3-2,3)+" "
  928.               addpath$=addpath$+LEFT$(DATE$,2)+" "+TIME$+" "+RIGHT$(DATE$,4)+CHR$(13)
  929.               sendnode$=atic$+afle$+anon$
  930.               DO WHILE INSTR(sendnode$,",")
  931.                 n$=@stdaddr$(LEFT$(sendnode$,INSTR(sendnode$,"!")-1),defzone%)
  932.                 p$=MID$(sendnode$,INSTR(sendnode$,"!")+1)
  933.                 p$=LEFT$(p$,INSTR(p$,",")-1)
  934.                 IF NOT @in(iseenby$,n$)
  935.                   ' then the node hasn't seen it
  936.                   z%=VAL(n$)
  937.                   from$=@defaddr$(z%)
  938.                   sb$=seenby$
  939.                   IF INSTR(sb$,from$)=0
  940.                     sb$=sb$+from$+CHR$(13)
  941.                   ENDIF
  942.                   tic(n%,file$,desc$,origin$,from$,n$,p$,sb$,path$+from$+" "+addpath$,crc%,other$,rel$,"",mag$)
  943.                 ENDIF
  944.                 sendnode$=MID$(sendnode$,INSTR(sendnode$,",")+1)
  945.               LOOP
  946.               add_dup(file$,area$,filecrc%)
  947.             ENDIF
  948.           ENDIF
  949.         ENDIF
  950.         IF aautohatch$>""
  951.           ~@hatchs(apath$+file$,aautohatch$,desc$,seenby$,area$,mag$)
  952.         ENDIF
  953.       ENDIF
  954.       IF EXIST(inb$+tic$) AND chk!
  955.         x$=inb$+tic$
  956.         y$=LEFT$(x$,RINSTR(x$,"."))+"TBD"
  957.         NAME x$ AS y$
  958.         log("#"+x$+" renamed as "+y$)
  959.       ENDIF
  960.       ERASE temp$()
  961.       x%=FSFIRST(seek$,0)
  962.     LOOP UNTIL x%
  963.   ENDIF
  964. RETURN
  965. > PROCEDURE checkauto(n%)
  966.   LOCAL i%,x%
  967.   ~FSETDTA(dta%)
  968.   IF n%=0
  969.     log(":Checking all AutoSend lines")
  970.     all!=-1
  971.     FOR i%=1 TO aut%
  972.       checkauto(i%)
  973.     NEXT i%
  974.     all!=0
  975.   ELSE
  976.     IF NOT all!
  977.       log(":Checking single AutoSend line")
  978.     ENDIF
  979.     log(">(File "+autosend$(n%-1)+" in area "+autoarea$(n%-1)+")")
  980.     x%=FSFIRST(autosend$(n%-1),0)
  981.     DO UNTIL x%
  982.       f$=CHAR{dta%+30}
  983.       x$=autosend$(n%-1)
  984.       IF INSTR(x$,"\")
  985.         x$=@fullpath$(LEFT$(x$,RINSTR(x$,"\")))
  986.       ELSE IF MID$(x$,2,1)=":"
  987.         x$=@fullpath$(LEFT$(x$,2))
  988.       ELSE
  989.         x$=@fullpath$(".")
  990.       ENDIF
  991.       IF @hatch(x$+f$,autoarea$(n%-1),autodesc$(n%-1),automagic$(n%-1))=0
  992.         KILL x$+f$
  993.         log(" "+x$+f$+" deleted")
  994.         x%=FSFIRST(autosend$(n%-1),0)
  995.       ELSE
  996.         log("!Automatic Hatch failed")
  997.         x%=-1
  998.       ENDIF
  999.     LOOP
  1000.   ENDIF
  1001. RETURN
  1002. > PROCEDURE tic(n%,f$,d$,o$,fr$,n$,p$,s$,pth$,crc%,o$,rel$,fp$,m$)
  1003.   ' n = area number (as given by @areanum())
  1004.   ' f$ = file
  1005.   ' d$ = description
  1006.   ' o$ = origin node
  1007.   ' fr$ = from node
  1008.   ' n$ = to node
  1009.   ' p$ = password
  1010.   ' s$ = seenbys
  1011.   ' pth$ = paths
  1012.   ' crc = crc-32 of file
  1013.   ' o$ = other lines to include in TIC
  1014.   ' rel$ = release date
  1015.   ' fp$ = file path if present
  1016.   ' m$ = magic name if present
  1017.   LOCAL x$,tic$,flo$,i%,t$,x%,nm$,pp$,xx$,fl%
  1018.   IF advise!
  1019.     nm$="Filename: "+f$+CHR$(10)
  1020.     nm$=nm$+"Area    : "+area$(n%)+CHR$(10)
  1021.     nm$=nm$+"Desc    : "+d$+CHR$(10)
  1022.     nm$=nm$+"Origin  : "+o$+CHR$(10)
  1023.     nm$=nm$+"From    : "+fr$+CHR$(10)
  1024.     pp$=pth$
  1025.     DO WHILE INSTR(pp$,CHR$(13))
  1026.       xx$=MID$(pp$,INSTR(xx$,CHR$(13))+1)
  1027.       pp$=LEFT$(pp$,INSTR(pp$,CHR$(13))-1)
  1028.       IF INSTR(pp$,o$)=0 AND INSTR(pp$,fr$)=0
  1029.         nm$=nm$+"Route   : "+pp$+CHR$(10)
  1030.       ENDIF
  1031.       pp$=xx$
  1032.     LOOP
  1033.   ENDIF
  1034.   tic$=""
  1035.   SELECT @send(n$,area$(n%))
  1036.   CASE 1 !TIC file attach
  1037.     DO
  1038.       x%=(offs%+VAL(TIME$)*10000+VAL(MID$(TIME$,4))*100+VAL(MID$(TIME$,7))) MOD 1E+06
  1039.       tic$=ticdir$+"TK"+RIGHT$("00000"+STR$(x%),6)+".TIC"
  1040.       offs%=offs%+100000
  1041.     LOOP UNTIL NOT EXIST(tic$)
  1042.     OPEN "O",#0,tic$
  1043.     PRINT #0,"Area ";area$(n%)
  1044.     PRINT #0,"File ";f$
  1045.     PRINT #0,"Desc ";d$
  1046.     PRINT #0,"Origin ";@d3$(o$)
  1047.     PRINT #0,"From ";@d3$(fr$)
  1048.     PRINT #0,"CRC ";HEX$(crc%)
  1049.     IF rel$>""
  1050.       PRINT #0,"Release ";rel$
  1051.     ENDIF
  1052.     PRINT #0,"Created by AutoFile v";ver$;" (c) David J.Thomas, 1992, 1993"
  1053.     DO WHILE INSTR(pth$,CHR$(13))
  1054.       PRINT #0,"Path ";@d3$(LEFT$(pth$,INSTR(pth$,CHR$(13))-1))
  1055.       pth$=MID$(pth$,INSTR(pth$,CHR$(13))+1)
  1056.     LOOP
  1057.     DO WHILE INSTR(s$,CHR$(13))
  1058.       PRINT #0,"Seenby ";@d3$(LEFT$(s$,INSTR(s$,CHR$(13))-1))
  1059.       s$=MID$(s$,INSTR(s$,CHR$(13))+1)
  1060.     LOOP
  1061.     PRINT #0,"Pw ";p$
  1062.     DO WHILE INSTR(o$,CHR$(13))
  1063.       PRINT #0,LEFT$(o$,INSTR(o$,CHR$(13))-1)
  1064.       o$=MID$(o$,INSTR(o$,CHR$(13))+1)
  1065.     LOOP
  1066.     IF m$>""
  1067.       PRINT #0,"Magic ";m$
  1068.     ENDIF
  1069.     CLOSE #0
  1070.     log(" Sent to "+n$+" (TIC)")
  1071.   CASE 2 !FLE
  1072.     DO
  1073.       x%=(offs%+VAL(TIME$)*10000+VAL(MID$(TIME$,4))*100+VAL(MID$(TIME$,7))) MOD 1E+06
  1074.       tic$=ticdir$+"FL"+RIGHT$("00000"+STR$(x%),6)+".FLE"
  1075.       offs%=offs%+100000
  1076.     LOOP UNTIL NOT EXIST(tic$)
  1077.     OPEN "O",#0,tic$
  1078.     PRINT #0,"Area: ";area$(n%)
  1079.     PRINT #0,f$
  1080.     PRINT #0,d$
  1081.     PRINT #0,"Origin: ";@addr2d$(o$)
  1082.     PRINT #0,"From: ";@addr2d$(fr$);" ";p$
  1083.     PRINT #0,"Created by AutoFile v";ver$;" (c) David J.Thomas, 1992"
  1084.     DO WHILE INSTR(s$,CHR$(13))
  1085.       t$=@addr2d$(LEFT$(s$,INSTR(s$,CHR$(13))-1))
  1086.       IF t$>""
  1087.         PRINT #0,"Seenby ";t$
  1088.       ENDIF
  1089.       s$=MID$(s$,INSTR(s$,CHR$(13))+1)
  1090.     LOOP
  1091.     CLOSE #0
  1092.     log(" Sent to "+n$+" (FLE)")
  1093.   CASE 3 !No TIC/FLE
  1094.     log(" Sent to "+n$)
  1095.   ENDSELECT
  1096.   flo$=""
  1097.   IF INSTR(n$,":") AND bink!
  1098.     flo$=hold$(VAL(n$))
  1099.   ENDIF
  1100.   IF flo$=""
  1101.     flo$=hold$
  1102.     IF bink! AND VAL(n$)<>defzone% AND INSTR(n$,":")
  1103.       flo$=LEFT$(flo$,LEN(flo$)-1)+"."+HEX$(VAL(n$),3)+"\"
  1104.     ENDIF
  1105.   ENDIF
  1106.   IF bink!
  1107.     IF INSTR(n$,".")=0 OR INSTR(n$,".0")
  1108.       flo$=flo$+HEX$(VAL(MID$(n$,INSTR(n$,":")+1)),4)+HEX$(VAL(MID$(n$,INSTR(n$,"/")+1)),4)+"."
  1109.     ELSE
  1110.       flo$=flo$+HEX$(@pvtnet(n$),4)+HEX$(VAL(MID$(n$,INSTR(n$,".")+1)),4)+"."
  1111.     ENDIF
  1112.     SELECT @pri(n$,area$(n%))
  1113.     CASE -1
  1114.       flo$=flo$+"HLO"
  1115.     CASE 0
  1116.       flo$=flo$+"FLO"
  1117.     CASE 1
  1118.       flo$=flo$+"CLO"
  1119.     ENDSELECT
  1120.     IF EXIST(flo$)
  1121.       OPEN "A",#0,flo$
  1122.     ELSE
  1123.       OPEN "O",#0,flo$
  1124.     ENDIF
  1125.     IF fp$>""
  1126.       PRINT #0,fp$;f$
  1127.     ELSE
  1128.       PRINT #0,apath$;f$
  1129.     ENDIF
  1130.     IF tic$>""
  1131.       PRINT #0,"^";tic$
  1132.     ENDIF
  1133.     CLOSE #0
  1134.   ELSE
  1135.     IF INSTR(n$,":")
  1136.       IF INSTR(n$,".")=0 OR INSTR(n$,".0")
  1137.         flo$=flo$+@base36$(VAL(n$),2)+@base36$(VAL(MID$(n$,INSTR(n$,":")+1)),3)+@base36$(VAL(MID$(n$,INSTR(n$,"/")+1)),3)
  1138.       ELSE
  1139.         flo$=flo$+@base36$(VAL(n$),2)+@base36$(@pvtnet(n$),3)+@base36$(VAL(MID$(n$,INSTR(n$,".")+1)),3)
  1140.       ENDIF
  1141.     ELSE
  1142.       IF INSTR(n$,".")=0 OR INSTR(n$,".0")
  1143.         flo$=flo$+@base36$(defzone%,2)+@base36$(VAL(n$),3)+@base36$(VAL(MID$(n$,INSTR(n$,"/")+1)),3)
  1144.       ELSE
  1145.         flo$=flo$+@base36$(defzone%,2)+@base36$(@pvtnet(n$),3)+@base36$(VAL(MID$(n$,INSTR(n$,".")+1)),3)
  1146.       ENDIF
  1147.     ENDIF
  1148.     SELECT @pri(n$,area$(n%))
  1149.     CASE -1
  1150.       flo$=flo$+".HF"
  1151.     CASE 0
  1152.       flo$=flo$+".HF"
  1153.     CASE 1
  1154.       flo$=flo$+".IF"
  1155.     ENDSELECT
  1156.     IF EXIST(flo$)
  1157.       OPEN "A",#0,flo$
  1158.     ELSE
  1159.       OPEN "O",#0,flo$
  1160.     ENDIF
  1161.     IF fp$>""
  1162.       PRINT #0,fp$;f$
  1163.     ELSE
  1164.       PRINT #0,apath$;f$
  1165.     ENDIF
  1166.     IF tic$>""
  1167.       PRINT #0,".";tic$
  1168.     ENDIF
  1169.     CLOSE #0
  1170.   ENDIF
  1171.   IF advise!
  1172.     SELECT @pri(n$,area$(n%))
  1173.     CASE -1
  1174.       fl%=512
  1175.     CASE 0
  1176.       fl%=0
  1177.     CASE 1
  1178.       fl%=2
  1179.     ENDSELECT
  1180.     nm(fr$,n$,"AutoFile","SysOp",TRIM$(f$+" "+RIGHT$(tic$,LEN(tic$)-LEN(ticdir$))),385+fl%,nm$)
  1181.   ENDIF
  1182. RETURN
  1183. > PROCEDURE info(n%)
  1184.   LOCAL a$,p$,f$,l$,g$,x%
  1185.   aacc$=""
  1186.   anon$=""
  1187.   afle$=""
  1188.   atic$=""
  1189.   ahld$=""
  1190.   acra$=""
  1191.   grp$=""
  1192.   adesc$=""
  1193.   IF n%>-1
  1194.     IF info!(n%)
  1195.       log(">Retreiving information for area '"+area$(n%)+"'")
  1196.       area$=area$(n%)
  1197.       apath$=info$(n%,0)
  1198.       aacc$=info$(n%,1)
  1199.       anon$=info$(n%,2)
  1200.       afle$=info$(n%,3)
  1201.       atic$=info$(n%,4)
  1202.       ahld$=info$(n%,5)
  1203.       acra$=info$(n%,6)
  1204.       grp$=info$(n%,7)
  1205.       adesc$=info$(n%,8)
  1206.       aautohatch$=info$(n%,9)
  1207.     ELSE
  1208.       log(">Getting information for area '"+area$(n%)+"'")
  1209.       area$=area$(n%)
  1210.       OPEN "I",#1,ctl$
  1211.       SEEK #1,cpos%(n%)
  1212.       LINE INPUT #1,apath$
  1213.       apath$=MID$(apath$,INSTR(apath$," ")+1)
  1214.       apath$=@fullpath$(LEFT$(apath$,INSTR(apath$," ")-1))
  1215.       log(">Path "+apath$)
  1216.       aautohatch$=secarea$(n%)
  1217.       IF aautohatch$>""
  1218.         log(">Secondary area "+aautohatch$)
  1219.       ELSE
  1220.         log(">No secondary area")
  1221.       ENDIF
  1222.       LINE INPUT #1,l$
  1223.       DO WHILE INSTR("0123456789",LEFT$(l$)) OR UPPER$(LEFT$(l$,5))="LOCAL"
  1224.         IF UPPER$(LEFT$(l$,5))="LOCAL"
  1225.           l$=TRIM$(MID$(l$,6))
  1226.           IF UPPER$(LEFT$(l$,5))="GROUP"
  1227.             grp$=MID$(l$,7)
  1228.             log(">Local area group "+grp$)
  1229.           ELSE IF UPPER$(LEFT$(l$,4))="DESC"
  1230.             adesc$=MID$(l$,6)
  1231.             log(">Local area desc "+adesc$)
  1232.             adesc$=" ("+adesc$+")"
  1233.           ENDIF
  1234.         ELSE
  1235.           a$=TRIM$(LEFT$(l$,INSTR(l$," ")))
  1236.           p$=MID$(l$,INSTR(l$," ")+1)
  1237.           f$=""
  1238.           g$=""
  1239.           IF INSTR(p$," ")
  1240.             f$=UPPER$(MID$(p$,INSTR(p$," ")+1))
  1241.             p$="!"+TRIM$(UPPER$(LEFT$(p$,INSTR(p$," ")-1)))
  1242.           ENDIF
  1243.           IF INSTR(f$,"I")
  1244.             aacc$=aacc$+a$+p$+","
  1245.             g$="I"
  1246.           ENDIF
  1247.           IF INSTR(f$,"O")
  1248.             g$=g$+"O"
  1249.             IF INSTR(f$,"T")
  1250.               anon$=anon$+a$+p$+","
  1251.               g$=g$+"T"
  1252.             ELSE IF INSTR(f$,"F")
  1253.               afle$=afle$+a$+p$+","
  1254.               g$=g$+"F"
  1255.             ELSE
  1256.               atic$=atic$+a$+p$+","
  1257.             ENDIF
  1258.             IF INSTR(f$,"H")
  1259.               ahld$=ahld$+a$+","
  1260.               g$=g$+"H"
  1261.             ELSE IF INSTR(f$,"C")
  1262.               acra$=acra$+a$+","
  1263.               g$=g$+"C"
  1264.             ENDIF
  1265.           ENDIF
  1266.           x%=LOC(#1)
  1267.           log(">Node "+a$+": Flags "+g$+", Pw "+MID$(p$,2))
  1268.         ENDIF
  1269.         l$=@inl$(1)
  1270.       LOOP
  1271.       CLOSE #1
  1272.       info!(n%)=-1
  1273.       info$(n%,0)=apath$
  1274.       info$(n%,1)=aacc$
  1275.       info$(n%,2)=anon$
  1276.       info$(n%,3)=afle$
  1277.       info$(n%,4)=atic$
  1278.       info$(n%,5)=ahld$
  1279.       info$(n%,6)=acra$
  1280.       info$(n%,7)=grp$
  1281.       info$(n%,8)=adesc$
  1282.       info$(n%,9)=aautohatch$
  1283.     ENDIF
  1284.   ENDIF
  1285. RETURN
  1286. > PROCEDURE nmsend(oz%,one%,ono%,op%,dz%,dne%,dno%,dp%,fr$,to$,sb$,flags%,txt$)
  1287.   LOCAL i%
  1288.   netmail!=-1
  1289.   ' attr : bit  0 -> Private
  1290.   '             1 -> Crash
  1291.   '             2 -> Recv
  1292.   '             3 -> Sent
  1293.   '             4 -> With File
  1294.   '             5 -> Forwarded
  1295.   '             6 -> Orphan
  1296.   '             7 -> Kill/Sent
  1297.   '             8 -> Local
  1298.   '             9 -> Hold
  1299.   '            15 -> Deleted
  1300.   txt$=CHR$(1)+"PID: AtFl "+ver$+CHR$(10)+txt$
  1301.   DO WHILE RIGHT$(txt$)=lf$
  1302.     txt$=LEFT$(txt$,LEN(txt$)-1)
  1303.   LOOP
  1304.   txt$=txt$+lf$+lf$+"--- AutoFile "+ver$+CHR$(10)+CHR$(0)
  1305.   IF EXIST(netmail$+".HDR")
  1306.     OPEN "A",#0,netmail$+".HDR"
  1307.   ELSE
  1308.     OPEN "O",#0,netmail$+".HDR"
  1309.   ENDIF
  1310.   IF EXIST(netmail$+".MSG")
  1311.     OPEN "A",#1,netmail$+".MSG"
  1312.   ELSE
  1313.     OPEN "O",#1,netmail$+".MSG"
  1314.   ENDIF
  1315.   tofile(fr$,36)
  1316.   tofile(to$,36)
  1317.   tofile(sb$,72)
  1318.   x%=@stamp
  1319.   tofile(MID$("ThuFriSatSunMonTueWed",(x%\86400 MOD 7)*3+1,3)+" "+LEFT$(DATE$,2)+" "+MID$("JanFebMarAprMayJunJulAugSepOctNovDec",VAL(MID$(DATE$,4))*3-2,3)+" "+RIGHT$(DATE$,2)+" "+LEFT$(TIME$,5),20)
  1320.   OUT #0,x%\256\256\256,x%\256\256,x%\256,x%
  1321.   x%=LOF(#1)
  1322.   OUT #0,x%\256\256\256,x%\256\256,x%\256,x%
  1323.   OUT #0,0,0,0,0
  1324.   OUT #0,flags%\256,flags%
  1325.   OUT #0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1326.   OUT #0,LEN(txt$)\256,LEN(txt$)
  1327.   OUT #0,0,0,0,0
  1328.   OUT #0,oz%\256,oz%,one%\256,one%,ono%\256,ono%,op%\256,op%
  1329.   OUT #0,dz%\256,dz%,dne%\256,dne%,dno%\256,dno%,dp%\256,dp%
  1330.   FOR i%=0 TO LEN(txt$)-1
  1331.     OUT #1,BYTE{V:txt$+i%}
  1332.   NEXT i%
  1333.   CLOSE #0
  1334.   CLOSE #1
  1335. RETURN
  1336. > PROCEDURE nm_notag(oz%,one%,ono%,op%,dz%,dne%,dno%,dp%,fr$,to$,sb$,flags%,txt$,area$)
  1337.   LOCAL i%
  1338.   echomail!=-1
  1339.   txt$=CHR$(1)+"PID: AtFl "+ver$+CHR$(10)+txt$
  1340.   txt$=txt$+CHR$(10)+CHR$(0)
  1341.   IF EXIST(area$+".HDR")
  1342.     OPEN "A",#0,area$+".HDR"
  1343.   ELSE
  1344.     OPEN "O",#0,area$+".HDR"
  1345.   ENDIF
  1346.   IF EXIST(area$+".MSG")
  1347.     OPEN "A",#1,area$+".MSG"
  1348.   ELSE
  1349.     OPEN "O",#1,area$+".MSG"
  1350.   ENDIF
  1351.   tofile(fr$,36)
  1352.   tofile(to$,36)
  1353.   tofile(sb$,72)
  1354.   x%=@stamp
  1355.   tofile(MID$("ThuFriSatSunMonTueWed",(x%\86400 MOD 7)*3+1,3)+" "+LEFT$(DATE$,2)+" "+MID$("JanFebMarAprMayJunJulAugSepOctNovDec",VAL(MID$(DATE$,4))*3-2,3)+" "+RIGHT$(DATE$,2)+" "+LEFT$(TIME$,5),20)
  1356.   OUT #0,x%\256\256\256,x%\256\256,x%\256,x%
  1357.   x%=LOF(#1)
  1358.   OUT #0,x%\256\256\256,x%\256\256,x%\256,x%
  1359.   OUT #0,0,0,0,0
  1360.   OUT #0,flags%\256,flags%
  1361.   OUT #0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1362.   OUT #0,LEN(txt$)\256,LEN(txt$)
  1363.   OUT #0,0,0,0,0
  1364.   OUT #0,oz%\256,oz%,one%\256,one%,ono%\256,ono%,op%\256,op%
  1365.   OUT #0,dz%\256,dz%,dne%\256,dne%,dno%\256,dno%,dp%\256,dp%
  1366.   FOR i%=0 TO LEN(txt$)-1
  1367.     OUT #1,BYTE{V:txt$+i%}
  1368.   NEXT i%
  1369.   CLOSE #0
  1370.   CLOSE #1
  1371. RETURN
  1372. > PROCEDURE nm(fraddr$,toaddr$,fr$,to$,sb$,flags%,txt$)
  1373.   LOCAL oz%,one%,ono%,op%,o$,dz%,dne%,dno%,dp%,d$
  1374.   o$=@stdaddr$(fraddr$,defzone%)
  1375.   d$=@stdaddr$(toaddr$,defzone%)
  1376.   oz%=VAL(o$)
  1377.   one%=VAL(MID$(o$,INSTR(o$,":")+1))
  1378.   ono%=VAL(MID$(o$,INSTR(o$,"/")+1))
  1379.   op%=VAL(MID$(o$,INSTR(o$,".")+1))
  1380.   dz%=VAL(d$)
  1381.   dne%=VAL(MID$(d$,INSTR(d$,":")+1))
  1382.   dno%=VAL(MID$(d$,INSTR(d$,"/")+1))
  1383.   dp%=VAL(MID$(d$,INSTR(d$,".")+1))
  1384.   nmsend(oz%,one%,ono%,op%,dz%,dne%,dno%,dp%,fr$,to$,sb$,flags%,txt$)
  1385. RETURN
  1386. > PROCEDURE tofile(s$,l%)
  1387.   FOR i%=1 TO LEN(s$)
  1388.     OUT #0,ASC(MID$(s$,i%))
  1389.   NEXT i%
  1390.   FOR i%=1 TO l%-LEN(s$)
  1391.     OUT #0,0
  1392.   NEXT i%
  1393. RETURN
  1394. > PROCEDURE checkfix
  1395.   IF EXIST(netmail$+".HDR") AND afix%>0
  1396.     log(":Checking for FileFix messages")
  1397.     OPEN "R",#5,netmail$+".HDR",216
  1398.     msgs%=LOF(#5)\216
  1399.     FIELD #5,216 AS record$
  1400.     FOR m%=1 TO LOF(#5)\216
  1401.       GET #5,m%
  1402.       IF AND(ASC(MID$(record$,178,1)),4)=0 AND AND(ASC(MID$(record$,177,1)),128)=0 !not Recv or Del
  1403.         to$=MID$(record$,37,36)
  1404.         to$=TRIM$(UPPER$(to$))
  1405.         FOR i%=0 TO fixnames%-1
  1406.           IF LEFT$(to$,LEN(fixname$(i%)))=fixname$(i%)
  1407.             fr$=LEFT$(record$,36)
  1408.             subj$=MID$(record$,73,72)
  1409.             offs%=CVL(MID$(record$,169,4))
  1410.             lmsg%=CVI(MID$(record$,195,2))
  1411.             org$=STR$(CVI(MID$(record$,201,2)))+":"+STR$(CVI(MID$(record$,203,2)))+"/"+STR$(CVI(MID$(record$,205,2)))+"."+STR$(CVI(MID$(record$,207,2)))
  1412.             dest$=STR$(CVI(MID$(record$,209,2)))+":"+STR$(CVI(MID$(record$,211,2)))+"/"+STR$(CVI(MID$(record$,213,2)))+"."+STR$(CVI(MID$(record$,215,2)))
  1413.             r$=record$
  1414.             CLOSE #5
  1415.             @procfix(fr$,subj$,offs%,lmsg%,org$,dest$)
  1416.             OPEN "R",#5,netmail$+".HDR",216
  1417.             FIELD #5,216 AS record$
  1418.             record$=r$
  1419.             MID$(record$,178,1)=CHR$(OR(ASC(MID$(record$,178,1)),4)) ! set Recv
  1420.             PUT #5,m%
  1421.             i%=fixnames%
  1422.           ENDIF
  1423.         NEXT i%
  1424.       ENDIF
  1425.     NEXT m%
  1426.     CLOSE #5
  1427.   ENDIF
  1428. RETURN
  1429. > PROCEDURE procfix(fr$,subj$,offs%,lmsg%,org$,dest$)
  1430.   here!=0
  1431.   FOR i%=0 TO naddr%-1
  1432.     IF dest$=addr$(i%)
  1433.       here!=-1
  1434.     ENDIF
  1435.   NEXT i%
  1436.   IF here!
  1437.     FOR i%=0 TO afix%-1
  1438.       IF @stdaddr$(autofix$(i%,0),defzone%)=org$ AND INSTR(UPPER$(subj$),autofix$(i%,1))
  1439.         log("#File control request from "+org$+" detected")
  1440.         rsp$="This is a response to your recent file control request on this system."+CHR$(10)+CHR$(10)
  1441.         IF INSTR(UPPER$(subj$),"-I") OR INSTR(UPPER$(subj$),"/I") OR INSTR(subj$,"/?") OR INSTR(subj$,"-?")
  1442.           log("#Help information requested")
  1443.           rsp$=rsp$+"Instructions for use: Send a message to AutoFile on this system, including your password on the subject line, "
  1444.           rsp$=rsp$+"and either or both of the switches /? and /L. /? will produce this instructions page; and "
  1445.           rsp$=rsp$+"/L will produce a list of the areas you are connected to, and a list of those you can connect to."+CHR$(10)+CHR$(10)
  1446.           rsp$=rsp$+"The message body should contain a list of any areas you wish to connect to (optionally preceded by a plus sign), and any you wish to disconnect from "
  1447.           rsp$=rsp$+"which MUST be preceded by a minus sign. For example, if you want to connect to SOFTDIST and disconnect from "
  1448.           rsp$=rsp$+"SDSXBBS, your message body could contain ""+SOFTDIST -SDSXBBS""."+CHR$(10)+CHR$(10)
  1449.         ELSE
  1450.           rsp$=rsp$+"Put /? on the subject line of FileFix messages for instructions"+CHR$(10)+CHR$(10)
  1451.         ENDIF
  1452.         OPEN "I",#6,netmail$+".MSG"
  1453.         SEEK #6,offs%
  1454.         msg$=INPUT$(lmsg%,#6)
  1455.         IF INSTR(msg$,CHR$(0))
  1456.           msg$=LEFT$(msg$,INSTR(msg$,CHR$(0))-1)
  1457.         ENDIF
  1458.         CLOSE #6
  1459.         DO WHILE msg$>""
  1460.           ' condition y$ to one parameter/one line if starts with ^A
  1461.           IF INSTR(msg$," ")<INSTR(msg$,CHR$(10)) AND INSTR(msg$," ")>0 AND LEFT$(msg$)<>CHR$(1)
  1462.             y$=LEFT$(msg$,INSTR(msg$," ")-1)
  1463.             msg$=MID$(msg$,INSTR(msg$," ")+1)
  1464.           ELSE IF INSTR(msg$,CHR$(10))
  1465.             y$=LEFT$(msg$,INSTR(msg$,CHR$(10))-1)
  1466.             msg$=MID$(msg$,INSTR(msg$,CHR$(10))+1)
  1467.           ELSE
  1468.             y$=msg$
  1469.             msg$=""
  1470.           ENDIF
  1471.           y$=TRIM$(y$)
  1472.           IF LEFT$(y$,1)=CHR$(1)
  1473.             log(">^A line "+MID$(y$,2))
  1474.           ELSE IF y$="---"
  1475.             log(">--- detected, ignoring rest of message")
  1476.             msg$=""
  1477.           ELSE IF LEFT$(y$)="-"
  1478.             rsp$=rsp$+@disconnect$(org$,MID$(y$,2),autofix$(i%,2))
  1479.           ELSE IF LEFT$(y$)="+"
  1480.             rsp$=rsp$+@connect$(org$,MID$(y$,2),autofix$(i%,2),autofix$(i%,3),autofix$(i%,1))
  1481.             ' ELSE IF LEFT$(y$)="/"
  1482.             ' rsp$=rsp$+@find$(org$,MID$(y$,2))
  1483.           ELSE IF y$>""
  1484.             rsp$=rsp$+@connect$(org$,y$,autofix$(i%,2),autofix$(i%,3),autofix$(i%,1))
  1485.           ENDIF
  1486.         LOOP
  1487.         log(">Sending response netmail")
  1488.         IF INSTR(UPPER$(subj$),"-L") OR INSTR(UPPER$(subj$),"/L")
  1489.           log("#List of echo connections requested")
  1490.           DO UNTIL RIGHT$(rsp$,2)=CHR$(10)+CHR$(10)
  1491.             rsp$=rsp$+CHR$(10)
  1492.           LOOP
  1493.           rsp$=rsp$+"Here is the requested file echo connections report:"+CHR$(10)+CHR$(10)
  1494.           rsp$=rsp$+"I - Files can be input into this echo from you"+CHR$(10)
  1495.           rsp$=rsp$+"O - Files are output to you from this echo"+CHR$(10)
  1496.           rsp$=rsp$+"T - .TIC file accompanies file output"+CHR$(10)
  1497.           rsp$=rsp$+"F - .FLE file accompanies file output"+CHR$(10)+CHR$(10)
  1498.           rsp$=rsp$+"Echoes you attach yourself into will be given the flags "
  1499.           IF INSTR(autofix$(i%,3),"I")
  1500.             rsp$=rsp$+"I"
  1501.           ENDIF
  1502.           IF INSTR(autofix$(i%,3),"O")
  1503.             rsp$=rsp$+"O"
  1504.           ENDIF
  1505.           IF INSTR(autofix$(i%,3),"T")=0
  1506.             IF INSTR(autofix$(i%,3),"F")
  1507.               rsp$=rsp$+"F"
  1508.             ELSE
  1509.               rsp$=rsp$+"T"
  1510.             ENDIF
  1511.           ENDIF
  1512.           rsp$=rsp$+CHR$(10)+CHR$(10)
  1513.           FOR j%=0 TO nareas%-1
  1514.             info(j%)
  1515.             t$=" "
  1516.             IF @in(aacc$,org$)
  1517.               t$="I"
  1518.             ENDIF
  1519.             IF @in(anon$+atic$+afle$,org$)
  1520.               t$=t$+"O"
  1521.             ENDIF
  1522.             IF @in(atic$,org$)
  1523.               t$=t$+"T"
  1524.             ELSE IF @in(afle$,org$)
  1525.               t$=t$+"F"
  1526.             ENDIF
  1527.             IF t$<>" " OR INSTR(autofix$(i%,2),grp$) OR grp$=""
  1528.               rsp$=rsp$+t$+SPACE$(3-LEN(t$))+" - "+area$+adesc$+CHR$(10)
  1529.             ENDIF
  1530.           NEXT j%
  1531.         ENDIF
  1532.         f$=@defaddr$(VAL(org$))
  1533.         nm(f$,org$,"AutoFile",fr$,"Response to file control request",257,rsp$)
  1534.       ELSE IF @stdaddr$(autofix$(i%,0),defzone%)=org$ !wrong password
  1535.         log("#File control request from "+org$+" detected")
  1536.         log("#Wrong password")
  1537.         rsp$="This is a response to your recent file control request on this system."+CHR$(10)+CHR$(10)
  1538.         rsp$=rsp$+"Unfortunately, you have not specified the correct password on the subject line. This can exist anywhere on"
  1539.         rsp$=rsp$+" the subject line, upper/lower case do not matter. Please contact the sysop of this system in the event"
  1540.         rsp$=rsp$+" of further difficulty."+CHR$(10)
  1541.         log(">Sending response netmail")
  1542.         CLOSE #5
  1543.         f$=@defaddr$(VAL(org$))
  1544.         nm(f$,org$,"AutoFile",fr$,"Password wrong - Failed file echo control request",257,rsp$)
  1545.       ENDIF
  1546.     NEXT i%
  1547.   ENDIF
  1548. RETURN
  1549. > PROCEDURE report
  1550.   LOCAL i%,j%,z%,txt$
  1551.   DIM rpt$(afix%-1)
  1552.   log(":Sending periodic echo connections reports")
  1553.   IF afix%=0
  1554.     log("#No nodes to send report to")
  1555.   ELSE
  1556.     FOR i%=0 TO afix%-1
  1557.       addr$=autofix$(i%,0)
  1558.       txt$="This is your periodic file echo connections report from "+@defaddr$(VAL(addr$))+". "
  1559.       txt$=txt$+"Please take a few moments to compare this with your local connections, and correct any differences as you need. "
  1560.       txt$=txt$+"If you need any help with the use of AutoFile, please send a message to AutoFile on this system "
  1561.       txt$=txt$+"with your password followed by '-I' on the subject line."+CHR$(10)+CHR$(10)
  1562.       txt$=txt$+"I - Files can be input into this echo from you"+CHR$(10)
  1563.       txt$=txt$+"O - Files are output to you from this echo"+CHR$(10)
  1564.       txt$=txt$+"T - .TIC file accompanies file output"+CHR$(10)
  1565.       txt$=txt$+"F - .FLE file accompanies file output"+CHR$(10)+CHR$(10)
  1566.       txt$=txt$+"Echoes you attach yourself into will be given the flags "
  1567.       IF INSTR(autofix$(i%,3),"I")
  1568.         txt$=txt$+"I"
  1569.       ENDIF
  1570.       IF INSTR(autofix$(i%,3),"O")
  1571.         txt$=txt$+"O"
  1572.       ENDIF
  1573.       IF INSTR(autofix$(i%,3),"T")=0
  1574.         IF INSTR(autofix$(i%,3),"F")
  1575.           txt$=txt$+"F"
  1576.         ELSE
  1577.           txt$=txt$+"T"
  1578.         ENDIF
  1579.       ENDIF
  1580.       rpt$(i%)=txt$+CHR$(10)+CHR$(10)
  1581.     NEXT i%
  1582.     FOR j%=0 TO nareas%-1
  1583.       info(j%)
  1584.       FOR i%=0 TO afix%-1
  1585.         addr$=autofix$(i%,0)
  1586.         t$=" "
  1587.         IF @in(aacc$,addr$)
  1588.           t$="I"
  1589.         ENDIF
  1590.         IF @in(anon$+atic$+afle$,addr$)
  1591.           t$=t$+"O"
  1592.         ENDIF
  1593.         IF @in(atic$,addr$)
  1594.           t$=t$+"T"
  1595.         ELSE IF @in(afle$,addr$)
  1596.           t$=t$+"F"
  1597.         ENDIF
  1598.         IF t$<>" " OR INSTR(autofix$(i%,2),grp$) OR grp$=""
  1599.           rpt$(i%)=rpt$(i%)+t$+SPACE$(3-LEN(t$))+" - "+area$+adesc$+CHR$(10)
  1600.         ENDIF
  1601.       NEXT i%
  1602.     NEXT j%
  1603.     FOR i%=0 TO afix%-1
  1604.       nm(@defaddr$(VAL(autofix$(i%,0))),autofix$(i%,0),"AutoFile","SysOp","Periodic File Echo Connections Report",257,rpt$(i%))
  1605.     NEXT i%
  1606.   ENDIF
  1607.   ERASE rpt$()
  1608. RETURN
  1609. > PROCEDURE checkhatchfile
  1610.   LOCAL p$,a$,d$,x$,m$
  1611.   IF EXIST("HATCH")
  1612.     log(":Automatic HATCH file detected, processing")
  1613.     OPEN "I",#3,"HATCH"
  1614.     DO
  1615.       x$=""
  1616.       LINE INPUT #3,p$
  1617.       LINE INPUT #3,a$
  1618.       LINE INPUT #3,d$
  1619.       IF EOF(#3)=0
  1620.         LINE INPUT #3,m$
  1621.       ENDIF
  1622.       IF m$<>"---"
  1623.         DO UNTIL EOF(#3) OR x$="---"
  1624.           LINE INPUT #3,x$
  1625.         LOOP
  1626.       ELSE
  1627.         m$=""
  1628.       ENDIF
  1629.       ~@hatch(p$,a$,d$,m$)
  1630.     LOOP UNTIL EOF(#3)
  1631.     CLOSE #3
  1632.     KILL "HATCH"
  1633.     log(" HATCH file deleted")
  1634.   ENDIF
  1635. RETURN
  1636. > PROCEDURE rep_area(f$,e$,s%,d$,group$,org$)
  1637.   LOCAL report$,origin$,x$,x%,y%,i%,com$,par$,desc$
  1638.   log(" Preparing report for "+f$)
  1639.   log(">Report details: File:"+f$)
  1640.   log(">Echo:"+e$)
  1641.   log(">Size:"+STR$(s%))
  1642.   log(">Desc:"+d$)
  1643.   log(">Group:"+group$)
  1644.   log(">Origin:"+org$)
  1645.   desc$=d$
  1646.   FOR i%=0 TO reparea_num%-1
  1647.     IF INSTR(rept$(i%,8),group$)
  1648.       rept$(i%,6)="SEND"
  1649.       INC reptn%(i%)
  1650.       IF rept$(i%,0)=""
  1651.         rept$(i%,0)="AutoFile"
  1652.         rept$(i%,1)="All"
  1653.         rept$(i%,2)="New Files"
  1654.         IF EXIST(rept$(i%,9))
  1655.           OPEN "I",#1,rept$(i%,9)
  1656.           DO UNTIL EOF(#1)
  1657.             x$=@inl$(1)
  1658.             com$=UPPER$(LEFT$(x$,INSTR(x$," ")-1))
  1659.             par$=MID$(x$,INSTR(x$," ")+1)
  1660.             IF com$="FROM" AND par$>""
  1661.               rept$(i%,0)=par$
  1662.             ELSE IF com$="TO"
  1663.               rept$(i%,1)=par$
  1664.             ELSE IF com$="SUBJ" OR com$="SUBJECT"
  1665.               rept$(i%,2)=par$
  1666.             ELSE IF com$="HEADER"
  1667.               rept$(i%,3)=rept$(i%,3)+par$+CHR$(10)
  1668.             ELSE IF com$="REPORT"
  1669.               rept$(i%,4)=rept$(i%,4)+par$+CHR$(10)
  1670.             ELSE IF com$="FOOTER"
  1671.               rept$(i%,5)=rept$(i%,5)+par$+CHR$(10)
  1672.             ELSE IF com$="ORIGIN"
  1673.               origin$=par$
  1674.             ENDIF
  1675.           LOOP
  1676.           CLOSE #1
  1677.         ENDIF
  1678.         IF rept$(i%,3)=""
  1679.           rept$(i%,3)="The following files have been received:"+CHR$(10)+"."+CHR$(10)
  1680.         ENDIF
  1681.         IF rept$(i%,4)=""
  1682.           rept$(i%,4)="%f (%e): %s bytes, hatched by %o"+CHR$(10)+"  \d                                                                 \"+CHR$(10)+"  \d                                                                 \"+CHR$(10)+"."+CHR$(10)
  1683.         ENDIF
  1684.         rept$(i%,5)=rept$(i%,5)+"."+CHR$(10)+"--- AutoFile "+ver$+CHR$(10)
  1685.         IF origin$>""
  1686.           rept$(i%,5)=rept$(i%,5)+" * Origin: "+origin$+CHR$(10)
  1687.         ENDIF
  1688.       ENDIF
  1689.       report$=rept$(i%,4)
  1690.       x%=INSTR(report$,"%f")
  1691.       DO WHILE x%
  1692.         report$=LEFT$(report$,x%-1)+f$+MID$(report$,x%+2)
  1693.         x%=INSTR(report$,"%f")
  1694.       LOOP
  1695.       x%=INSTR(report$,"%e")
  1696.       DO WHILE x%
  1697.         report$=LEFT$(report$,x%-1)+e$+MID$(report$,x%+2)
  1698.         x%=INSTR(report$,"%e")
  1699.       LOOP
  1700.       x%=INSTR(report$,"%o")
  1701.       DO WHILE x%
  1702.         report$=LEFT$(report$,x%-1)+org$+MID$(report$,x%+2)
  1703.         x%=INSTR(report$,"%o")
  1704.       LOOP
  1705.       x%=INSTR(report$,"%s")
  1706.       DO WHILE x%
  1707.         report$=LEFT$(report$,x%-1)+STR$(s%)+MID$(report$,x%+2)
  1708.         x%=INSTR(report$,"%s")
  1709.       LOOP
  1710.       x%=INSTR(report$,"%d")
  1711.       DO WHILE x%
  1712.         report$=LEFT$(report$,x%-1)+d$+MID$(report$,x%+2)
  1713.         x%=INSTR(report$,"%d")
  1714.       LOOP
  1715.       x%=INSTR(report$,"\d")
  1716.       DO WHILE x%
  1717.         y%=INSTR(MID$(report$,x%+1),"\")+1
  1718.         IF LEN(d$)<y%
  1719.           MID$(report$,x%)=d$+SPACE$(y%-LEN(d$))
  1720.           d$=""
  1721.         ELSE
  1722.           x$=LEFT$(d$,y%)
  1723.           IF RINSTR(x$," ")
  1724.             x$=LEFT$(x$,RINSTR(x$," ")-1)
  1725.           ENDIF
  1726.           d$=TRIM$(MID$(d$,LEN(x$)+1))
  1727.           MID$(report$,x%)=x$+SPACE$(y%-LEN(x$))
  1728.         ENDIF
  1729.         x%=INSTR(report$,"\d")
  1730.       LOOP
  1731.       rept$(i%,10)=rept$(i%,10)+report$
  1732.       d$=desc$
  1733.     ENDIF
  1734.   NEXT i%
  1735.   rep_make!=-1
  1736. RETURN
  1737. > PROCEDURE rep_make
  1738.   LOCAL txt$,x%,l$,x$,y$,i%,lg!
  1739.   FOR i%=0 TO reparea_num%-1
  1740.     IF rept$(i%,6)="SEND"
  1741.       IF lg!=0
  1742.         lg!=-1
  1743.         log(":Sending file receipt reports to echoes")
  1744.       ENDIF
  1745.       txt$=""
  1746.       x$=rept$(i%,3)+rept$(i%,10)+rept$(i%,5)
  1747.       x%=INSTR(x$,CHR$(10))
  1748.       DO WHILE x%
  1749.         l$=LEFT$(x$,x%-1)
  1750.         x$=MID$(x$,x%+1)
  1751.         IF l$="."
  1752.           txt$=txt$+CHR$(10)
  1753.         ELSE IF TRIM$(l$)<>""
  1754.           txt$=txt$+l$+CHR$(10)
  1755.         ENDIF
  1756.         x%=INSTR(x$,CHR$(10))
  1757.       LOOP
  1758.       x%=INSTR(txt$,"%n")
  1759.       DO WHILE x%
  1760.         txt$=LEFT$(txt$,x%-1)+STR$(reptn%(i%))+MID$(txt$,x%+2)
  1761.         x%=INSTR(txt$,"%n")
  1762.       LOOP
  1763.       x%=INSTR(rept$(i%,2),"%n")
  1764.       DO WHILE x%
  1765.         rept$(i%,2)=LEFT$(rept$(i%,2),x%-1)+STR$(reptn%(i%))+MID$(rept$(i%,2),x%+2)
  1766.         x%=INSTR(rept$(i%,2),"%n")
  1767.       LOOP
  1768.       log(">Sending msg in echo of:"+rept$(i%,7))
  1769.       log(">From:"+rept$(i%,0))
  1770.       log(">To:"+rept$(i%,1))
  1771.       log(">Subj:"+rept$(i%,2))
  1772.       nm_notag(0,0,0,0,0,0,0,0,rept$(i%,0),rept$(i%,1),rept$(i%,2),256,txt$,rept$(i%,7))
  1773.     ENDIF
  1774.   NEXT i%
  1775. RETURN
  1776. > PROCEDURE add_dup(f$,e$,crc%)
  1777.   IF stopdup!
  1778.     IF LEN(e$)<9
  1779.       log(" Adding to DUP file "+stopdup$+LEFT$(e$,8)+".DUP")
  1780.       IF EXIST(stopdup$+LEFT$(e$,8)+".DUP")
  1781.         OPEN "A",#2,stopdup$+LEFT$(e$,8)+".DUP"
  1782.       ELSE
  1783.         OPEN "O",#2,stopdup$+LEFT$(e$,8)+".DUP"
  1784.       ENDIF
  1785.       PRINT #2,f$;" ";HEX$(crc%)
  1786.       CLOSE #2
  1787.     ELSE
  1788.       log("!Cannot add to DUP file -- area name too long")
  1789.     ENDIF
  1790.   ENDIF
  1791. RETURN
  1792. > PROCEDURE addmagic(m$,fp$)
  1793.   IF m$>"" AND okfile%>0
  1794.     FOR i%=0 TO okfile%-1
  1795.       done!=0
  1796.       OPEN "I",#98,okfile$(i%,0)
  1797.       x$=okfile$(i%,0)
  1798.       IF INSTR(x$,"\")
  1799.         x$=LEFT$(x$,INSTR(x$,"\"))
  1800.       ELSE IF INSTR(x$,":")
  1801.         x$=LEFT$(x$,INSTR(x$,":"))
  1802.       ELSE
  1803.         x$=""
  1804.       ENDIF
  1805.       x$=x$+"$TEMP"
  1806.       OPEN "O",#99,x$
  1807.       DO UNTIL EOF(#98)
  1808.         y$=@inl$(98)
  1809.         IF UPPER$(LEFT$(y$,LEN(m$)+1))="@"+m$
  1810.           done!=-1
  1811.           IF okfile$(i%,1)>""
  1812.             PRINT #99,"@";m$;" !";okfile$(i%,1);" ";fp$
  1813.           ELSE
  1814.             PRINT #99,"@";m$;" ";fp$
  1815.           ENDIF
  1816.         ELSE
  1817.           PRINT #99,y$
  1818.         ENDIF
  1819.       LOOP
  1820.       IF done!=0
  1821.         IF okfile$(i%,1)>""
  1822.           PRINT #99,"@";m$;" !";okfile$(i%,1);" ";fp$
  1823.         ELSE
  1824.           PRINT #99,"@";m$;" ";fp$
  1825.         ENDIF
  1826.       ENDIF
  1827.       CLOSE #98
  1828.       CLOSE #99
  1829.       KILL okfile$(i%,0)
  1830.       NAME x$ AS okfile$(i%,0)
  1831.     NEXT i%
  1832.   ENDIF
  1833. RETURN
  1834. > FUNCTION check_dup(f$,e$,crc%)
  1835.   LOCAL x$
  1836.   IF stopdup! AND LEN(e$)<9
  1837.     log(">Checking DUP file "+stopdup$+LEFT$(e$,8)+".DUP")
  1838.     IF EXIST(stopdup$+LEFT$(e$,8)+".DUP")
  1839.       OPEN "I",#2,stopdup$+LEFT$(e$,8)+".DUP"
  1840.       DO UNTIL EOF(#2)
  1841.         x$=@inl$(2)
  1842.         IF UPPER$(x$)=UPPER$(f$+" "+HEX$(crc%))
  1843.           log(">This file is a duplicate")
  1844.           CLOSE #2
  1845.           RETURN -1
  1846.         ENDIF
  1847.       LOOP
  1848.       CLOSE #2
  1849.     ELSE
  1850.       log(">DUP file does not exist")
  1851.     ENDIF
  1852.   ENDIF
  1853.   RETURN 0
  1854. ENDFUNC
  1855. > FUNCTION sel_area$
  1856.   LOCAL a$
  1857.   DO
  1858.     PRINT "Please specify area (ESC to quit): "
  1859.     a$=@inpline$("","ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-",79)
  1860.     a$=UPPER$(a$)
  1861.     IF a$=CHR$(24)
  1862.       PRINT
  1863.       PRINT "User escape"
  1864.       fin(0)
  1865.     ELSE IF a$>"" AND @areanum(a$)=-1
  1866.       PRINT "That area does not exist!"
  1867.     ENDIF
  1868.     PRINT
  1869.   LOOP UNTIL @areanum(a$)>-1 OR a$=""
  1870.   RETURN a$
  1871. ENDFUNC
  1872. > FUNCTION inl$(channel%)
  1873.   LOCAL v%
  1874.   RECALL #channel%,inparr$(),1,v%
  1875.   RETURN inparr$(0)
  1876. ENDFUNC
  1877. > FUNCTION getyn(def%)
  1878.   DO
  1879.     x%=INP(2)
  1880.     SELECT x%
  1881.     CASE 13 !CR
  1882.       RETURN def%
  1883.     CASE 78,110 !N
  1884.       RETURN 0
  1885.     CASE 89,121 !Y
  1886.       RETURN -1
  1887.     ENDSELECT
  1888.   LOOP
  1889. ENDFUNC
  1890. > FUNCTION pvtnet(n$)
  1891.   LOCAL i%
  1892.   n$=@stdaddr$(n$,defzone%)
  1893.   n$=LEFT$(n$,INSTR(n$,"."))+"0"
  1894.   FOR i%=0 TO naddr%-1
  1895.     IF addr$(i%)=n$
  1896.       RETURN pvtnet%(i%)
  1897.     ENDIF
  1898.   NEXT i%
  1899. ENDFUNC
  1900. > FUNCTION defaddr$(zone%)
  1901.   LOCAL i%
  1902.   FOR i%=0 TO naddr%-1
  1903.     IF VAL(addr$(i%))=zone%
  1904.       RETURN addr$(i%)
  1905.     ENDIF
  1906.   NEXT i%
  1907.   RETURN addr$(0)
  1908. ENDFUNC
  1909. > FUNCTION connect$(node$,area$,group$,flag$,pw$)
  1910.   LOCAL a$,x%,x$,i%
  1911.   IF LEN(area$)>40
  1912.     a$=area$+"..."
  1913.   ELSE
  1914.     a$=area$+STRING$(43-LEN(area$),".")
  1915.   ENDIF
  1916.   x%=@areanum(area$)
  1917.   IF x%=-1
  1918.     log("#"+area$+" does not exist")
  1919.     RETURN a$+"Does not exist"+CHR$(10)
  1920.   ELSE
  1921.     info(x%)
  1922.   ENDIF
  1923.   IF INSTR(group$,grp$)=0 AND grp$>""
  1924.     log("#"+area$+" cannot be accessed by node")
  1925.     RETURN a$+"You do not have access to this area"+CHR$(10)
  1926.   ELSE IF @in(aacc$+atic$+afle$+anon$,node$)
  1927.     log("#"+area$+" is already connected")
  1928.     RETURN a$+"Already connected"+CHR$(10)
  1929.   ELSE
  1930.     log("#Connecting "+node$+" to "+area$+" (Flags: "+flag$+")")
  1931.     info!(x%)=0 !will have to re-read data if required
  1932.     IF EXIST("$TEMP")
  1933.       KILL "$TEMP"
  1934.     ENDIF
  1935.     NAME ctl$ AS "$TEMP"
  1936.     OPEN "I",#6,"$TEMP"
  1937.     OPEN "O",#7,ctl$
  1938.     DO UNTIL cpos%(x%)<=LOC(#6)
  1939.       LINE INPUT #6,x$
  1940.       PRINT #7,x$
  1941.     LOOP
  1942.     LINE INPUT #6,x$
  1943.     PRINT #7,x$
  1944.     PRINT #7,node$;" ";pw$;" ";flag$
  1945.     DO UNTIL EOF(#6)
  1946.       LINE INPUT #6,x$
  1947.       PRINT #7,x$
  1948.     LOOP
  1949.     CLOSE #6
  1950.     CLOSE #7
  1951.     KILL "$TEMP"
  1952.     log("#"+area$+" connected with flags "+flag$)
  1953.     FOR i%=x%+1 TO nareas%-1
  1954.       cpos%(i%)=cpos%(i%)+LEN(node$+pw$+flag$)+4
  1955.     NEXT i%
  1956.     IF INSTR(flag$,"T")=0
  1957.       flag$=flag$+"T"
  1958.     ELSE
  1959.       flag$=LEFT$(flag$,INSTR(flag$,"T")-1)+MID$(flag$,INSTR(flag$,"T")+1)
  1960.     ENDIF
  1961.     RETURN a$+"Connected with flags "+flag$+CHR$(10)
  1962.   ENDIF
  1963. ENDFUNC
  1964. > FUNCTION disconnect$(node$,area$,group$)
  1965.   LOCAL a$,x%,x$,t%
  1966.   a$=area$+STRING$(11-LEN(area$)+(14-LEN(area$) AND LEN(area$)>8),".")
  1967.   x%=@areanum(area$)
  1968.   IF x%=-1
  1969.     log("#"+area$+" does not exist")
  1970.     RETURN a$+"Does not exist"+CHR$(10)
  1971.   ELSE
  1972.     info(x%)
  1973.   ENDIF
  1974.   IF @in(aacc$+atic$+afle$+anon$,node$)=0
  1975.     log("#"+area$+" is already disconnected")
  1976.     RETURN a$+"Already disconnected"+CHR$(10)
  1977.   ELSE
  1978.     log("#Disconnecting "+node$+" from "+area$)
  1979.     info!(x%)=0 !will have to re-read data
  1980.     IF EXIST("$TEMP")
  1981.       KILL "$TEMP"
  1982.     ENDIF
  1983.     NAME ctl$ AS "$TEMP"
  1984.     OPEN "I",#6,"$TEMP"
  1985.     OPEN "O",#7,ctl$
  1986.     DO UNTIL cpos%(x%)<=LOC(#6)
  1987.       LINE INPUT #6,x$
  1988.       PRINT #7,x$
  1989.     LOOP
  1990.     LINE INPUT #6,x$
  1991.     DO UNTIL @stdaddr$(LEFT$(x$,INSTR(x$," ")-1),defzone%)=node$
  1992.       PRINT #7,x$
  1993.       LINE INPUT #6,x$
  1994.     LOOP
  1995.     t%=LEN(x$)
  1996.     DO UNTIL EOF(#6)
  1997.       LINE INPUT #6,x$
  1998.       PRINT #7,x$
  1999.     LOOP
  2000.     CLOSE #6
  2001.     CLOSE #7
  2002.     KILL "$TEMP"
  2003.     FOR i%=x%+1 TO nareas%-1
  2004.       cpos%(i%)=cpos%(i%)-t%-2
  2005.     NEXT i%
  2006.     RETURN a$+"Disconnected"+CHR$(10)
  2007.   ENDIF
  2008. ENDFUNC
  2009. > FUNCTION d3$(x$)
  2010.   IF RIGHT$(x$,2)=".0"
  2011.     RETURN LEFT$(x$,LEN(x$)-2)
  2012.   ELSE
  2013.     RETURN x$
  2014.   ENDIF
  2015. ENDFUNC
  2016. > FUNCTION hatch(fp$,a$,d$,m$)
  2017.   ' fp$=filename with path
  2018.   ' d$=description
  2019.   ' a$=area
  2020.   ' m$=magic name
  2021.   LOCAL f$,crc%,x$,seenby$,x%,n%,i%,y$,done!
  2022.   m$=UPPER$(m$)
  2023.   fp$=UPPER$(fp$)
  2024.   f$=MID$(fp$,RINSTR(fp$,"\")+1)
  2025.   IF INSTR(f$,":")
  2026.     f$=MID$(f$,INSTR(f$,":")+1)
  2027.   ENDIF
  2028.   n%=@areanum(a$)
  2029.   ~FSETDTA(dta%)
  2030.   x%=FSFIRST(fp$,1)
  2031.   IF x%
  2032.     log("!File "+fp$+" does not exist, aborting hatch")
  2033.     RETURN -1
  2034.   ELSE IF d$=""
  2035.     log("!No description specified, aborting hatch")
  2036.     RETURN -1
  2037.   ELSE IF n%=-1
  2038.     log("!Area "+a$+" does not exist, aborting hatch")
  2039.     RETURN -1
  2040.   ELSE
  2041.     f$=CHAR{dta%+30}
  2042.     info(n%)
  2043.     crc%=@crc32(fp$)
  2044.     IF @check_dup(fp$,a$,crc%)
  2045.       log("!File has already been hatched")
  2046.       RETURN -1
  2047.     ELSE IF INSTR(fp$,"\")
  2048.       fp$=LEFT$(fp$,RINSTR(fp$,"\"))+f$
  2049.     ELSE IF MID$(fp$,2)=":"
  2050.       fp$=LEFT$(fp$,2)+f$
  2051.     ELSE
  2052.       fp$=f$
  2053.     ENDIF
  2054.     IF fp$<>apath$+f$
  2055.       IF @copy(fp$,apath$+f$)
  2056.         log("#Error in file copy")
  2057.         RETURN -1
  2058.       ENDIF
  2059.     ENDIF
  2060.     log(":Local File Hatch data")
  2061.     log(" FName:"+fp$)
  2062.     log(" FArea:"+a$)
  2063.     log(" FDesc:"+d$)
  2064.     log(" FMagic:"+m$)
  2065.     log(" FCRC:"+HEX$(crc%))
  2066.     OPEN "I",#99,fp$
  2067.     siz%=LOF(#99)
  2068.     CLOSE #99
  2069.     log(" FSize:"+STR$(siz%))
  2070.     ~@addtofil(f$,d$,apath$)
  2071.     seenby$=""
  2072.     x%=@stamp
  2073.     rel$=STR$(x%)+" "+MID$("ThuFriSatSunMonTueWed",(x%\86400 MOD 7)*3+1,3)+" "+MID$("JanFebMarAprMayJunJulAugSepOctNovDec",VAL(MID$(DATE$,4))*3-2,3)+" "
  2074.     rel$=rel$+LEFT$(DATE$,2)+" "+TIME$+" "+RIGHT$(DATE$,4)
  2075.     log(" FRelease:"+rel$)
  2076.     ' we must send out to any connected nodes now
  2077.     sendnode$=atic$+afle$+anon$
  2078.     DO WHILE INSTR(sendnode$,",")
  2079.       seenby$=seenby$+LEFT$(sendnode$,INSTR(sendnode$,"!")-1)+CHR$(13)
  2080.       sendnode$=MID$(sendnode$,INSTR(sendnode$,",")+1)
  2081.     LOOP
  2082.     sendnode$=atic$+afle$+anon$
  2083.     IF reparea!
  2084.       IF INSTR(sendnode$,",")
  2085.         n$=@stdaddr$(LEFT$(sendnode$,INSTR(sendnode$,"!")-1),defzone%)
  2086.       ELSE
  2087.         n$=""
  2088.       ENDIF
  2089.       from$=@defaddr$(VAL(n$))
  2090.       rep_area(f$,area$,siz%,d$,grp$,from$)
  2091.     ENDIF
  2092.     DO WHILE INSTR(sendnode$,",")
  2093.       n$=@stdaddr$(LEFT$(sendnode$,INSTR(sendnode$,"!")-1),defzone%)
  2094.       p$=MID$(sendnode$,INSTR(sendnode$,"!")+1)
  2095.       p$=LEFT$(p$,INSTR(p$,",")-1)
  2096.       from$=@defaddr$(VAL(n$))
  2097.       tic(n%,f$,d$,from$,from$,n$,p$,from$+CHR$(13)+seenby$,from$+" "+rel$+CHR$(13),crc%,"",rel$,"",m$)
  2098.       sendnode$=MID$(sendnode$,INSTR(sendnode$,",")+1)
  2099.     LOOP
  2100.     add_dup(f$,a$,crc%)
  2101.   ENDIF
  2102.   IF @areanum(aautohatch$)>-1
  2103.     ~@hatchs(apath$+f$,aautohatch$,d$,seenby$,a$,m$)
  2104.   ENDIF
  2105.   addmagic(m$,apath$+f$)
  2106.   RETURN 0
  2107. ENDFUNC
  2108. > FUNCTION hatchs(fp$,a$,d$,seenby$,aseen$,m$)
  2109.   ' fp$=filename with path
  2110.   ' d$=description
  2111.   ' a$=area
  2112.   ' seenby$=nodes already seen file
  2113.   ' aseen$=areas that have already seen file
  2114.   ' m$=magic name
  2115.   LOCAL f$,crc%,x$,x%,n%,i%,iseenby$
  2116.   IF INSTR(aseen$,a$)
  2117.     log(":Area "+a$+" has already seen the file")
  2118.     RETURN 0
  2119.   ENDIF
  2120.   log(":File hatching into secondary area "+a$)
  2121.   fp$=UPPER$(fp$)
  2122.   f$=MID$(fp$,RINSTR(fp$,"\")+1)
  2123.   IF INSTR(f$,":")
  2124.     f$=MID$(f$,INSTR(f$,":")+1)
  2125.   ENDIF
  2126.   n%=@areanum(a$)
  2127.   ~FSETDTA(dta%)
  2128.   x%=FSFIRST(fp$,1)
  2129.   IF x%
  2130.     log("!File "+fp$+" does not exist, aborting hatch")
  2131.     RETURN -1
  2132.   ELSE IF d$=""
  2133.     log("!No description specified, aborting hatch")
  2134.     RETURN -1
  2135.   ELSE IF n%=-1
  2136.     log("!Area "+a$+" does not exist, aborting hatch")
  2137.     RETURN -1
  2138.   ELSE
  2139.     f$=CHAR{dta%+30}
  2140.     info(n%)
  2141.     crc%=@crc32(fp$)
  2142.     IF @check_dup(fp$,a$,crc%)
  2143.       log("!File has already been hatched")
  2144.       RETURN -1
  2145.     ELSE IF INSTR(fp$,"\")
  2146.       fp$=LEFT$(fp$,RINSTR(fp$,"\"))+f$
  2147.       fpa$=@fullpath$(LEFT$(fp$,RINSTR(fp$,"\")))
  2148.     ELSE IF MID$(fp$,2)=":"
  2149.       fp$=LEFT$(fp$,2)+f$
  2150.       fpa$=@fullpath$(LEFT$(fp$,2))
  2151.     ELSE
  2152.       fp$=f$
  2153.       fpa$=@fullpath$(".")
  2154.     ENDIF
  2155.     seenby$=""
  2156.     x%=@stamp
  2157.     rel$=STR$(x%)+" "+MID$("ThuFriSatSunMonTueWed",(x%\86400 MOD 7)*3+1,3)+" "+MID$("JanFebMarAprMayJunJulAugSepOctNovDec",VAL(MID$(DATE$,4))*3-2,3)+" "
  2158.     rel$=rel$+LEFT$(DATE$,2)+" "+TIME$+" "+RIGHT$(DATE$,4)
  2159.     ' we must send out only to nodes that have not seen file
  2160.     sendnode$=atic$+afle$+anon$
  2161.     iseenby$=seenby$
  2162.     DO WHILE INSTR(sendnode$,",")
  2163.       IF NOT @in(seenby$,LEFT$(sendnode$,INSTR(sendnode$,"!")-1))
  2164.         seenby$=seenby$+LEFT$(sendnode$,INSTR(sendnode$,"!")-1)+CHR$(13)
  2165.       ENDIF
  2166.       sendnode$=MID$(sendnode$,INSTR(sendnode$,",")+1)
  2167.     LOOP
  2168.     sendnode$=atic$+afle$+anon$
  2169.     DO WHILE INSTR(sendnode$,",")
  2170.       n$=@stdaddr$(LEFT$(sendnode$,INSTR(sendnode$,"!")-1),defzone%)
  2171.       p$=MID$(sendnode$,INSTR(sendnode$,"!")+1)
  2172.       p$=LEFT$(p$,INSTR(p$,",")-1)
  2173.       IF NOT @in(iseenby$,n$)
  2174.         ' then the node hasn't seen it
  2175.         z%=VAL(n$)
  2176.         from$=@defaddr$(z%)
  2177.         sb$=seenby$
  2178.         IF INSTR(sb$,from$)=0
  2179.           sb$=sb$+from$+CHR$(13)
  2180.         ENDIF
  2181.         tic(n%,f$,d$,from$,from$,n$,p$,sb$,path$+from$+" "+addpath$,crc%,other$,rel$,fpa$,m$)
  2182.       ENDIF
  2183.       sendnode$=MID$(sendnode$,INSTR(sendnode$,",")+1)
  2184.     LOOP
  2185.     add_dup(file$,a$,crc%)
  2186.   ENDIF
  2187.   IF @areanum(aautohatch$)>-1
  2188.     ~@hatchs(apath$+f$,aautohatch$,d$,seenby$,aseen$+","+a$,m$)
  2189.   ENDIF
  2190.   RETURN 0
  2191. ENDFUNC
  2192. > FUNCTION stdaddr$(x$,z%)
  2193.   ' z = default zone
  2194.   ' x$ = address
  2195.   LOCAL zo%,ne%,no%,po%,y$
  2196.   y$=x$
  2197.   x$=TRIM$(x$)
  2198.   IF INSTR(x$,":")>0 AND INSTR(x$,".")>0 !will always have a / in it
  2199.     RETURN x$
  2200.   ENDIF
  2201.   IF INSTR(x$,":")=0
  2202.     x$=STR$(z%)+":"+x$
  2203.   ENDIF
  2204.   IF INSTR(x$,".")=0
  2205.     x$=x$+".0"
  2206.   ENDIF
  2207.   log(">Expanded "+y$+" to "+x$)
  2208.   RETURN x$
  2209. ENDFUNC
  2210. > FUNCTION addr2d$(x$)
  2211.   x$=@stdaddr$(x$,0)
  2212.   x$=MID$(x$,INSTR(x$,":")+1)
  2213.   IF INSTR(x$,".0")
  2214.     RETURN LEFT$(x$,INSTR(x$,".0")-1)
  2215.   ENDIF
  2216.   FOR i%=0 TO naddr%-1
  2217.     IF INSTR(addr$(i%),LEFT$(x$,INSTR(x$,".")-1))
  2218.       RETURN STR$(pvtnet%(i%))+MID$(x$,INSTR(x$,"."))
  2219.     ENDIF
  2220.   NEXT i%
  2221.   RETURN ""
  2222. ENDFUNC
  2223. > FUNCTION accept(from$,pw$)
  2224.   IF RIGHT$(pw$)=CHR$(13)
  2225.     pw$=LEFT$(pw$,LEN(pw$)-1)
  2226.   ENDIF
  2227.   IF @in(aacc$,from$)=0
  2228.     RETURN 1 !not connected
  2229.   ELSE
  2230.     RETURN @in(aacc$,from$+"!"+UPPER$(pw$)) !0 => bad password, -1 => OK
  2231.   ENDIF
  2232. ENDFUNC
  2233. > FUNCTION send(node$,area$)
  2234.   LOCAL n%
  2235.   n%=@areanum(area$)
  2236.   IF @in(atic$,node$)
  2237.     RETURN 1
  2238.   ELSE IF @in(afle$,node$)
  2239.     RETURN 2
  2240.   ELSE IF @in(anon$,node$)
  2241.     RETURN 3
  2242.   ELSE
  2243.     RETURN 0
  2244.   ENDIF
  2245. ENDFUNC
  2246. > FUNCTION pri(node$,area$)
  2247.   LOCAL n%
  2248.   n%=@areanum(area$)
  2249.   IF @in(ahld$,node$)
  2250.     RETURN -1
  2251.   ELSE IF @in(acra$,node$)
  2252.     RETURN 1
  2253.   ELSE
  2254.     RETURN 0
  2255.   ENDIF
  2256. ENDFUNC
  2257. > FUNCTION in(lst$,number$)
  2258.   LOCAL zo%,ne%,no%,po%,p$,x%,x$
  2259.   x$=","
  2260.   IF INSTR(lst$,CHR$(13))
  2261.     x$=CHR$(13)
  2262.   ENDIF
  2263.   lst$=x$+UPPER$(lst$)
  2264.   number$=UPPER$(number$)
  2265.   zo%=-1
  2266.   IF INSTR(number$,"!")
  2267.     p$=UPPER$(MID$(number$,INSTR(number$,"!")+1))
  2268.     number$=LEFT$(number$,INSTR(number$,"!")-1)
  2269.   ENDIF
  2270.   IF INSTR(number$,":")
  2271.     zo%=VAL(number$)
  2272.     number$=MID$(number$,INSTR(number$,":")+1)
  2273.   ENDIF
  2274.   IF INSTR(number$,".")
  2275.     po%=VAL(MID$(number$,INSTR(number$,".")+1))
  2276.   ENDIF
  2277.   ne%=VAL(number$)
  2278.   no%=VAL(MID$(number$,INSTR(number$,"/")+1))
  2279.   IF p$>""
  2280.     IF INSTR(lst$,x$+STR$(zo%)+":"+STR$(ne%)+"/"+STR$(no%)+"."+STR$(po%)+"!"+p$+x$)
  2281.       RETURN -1
  2282.     ELSE IF INSTR(lst$,x$+STR$(ne%)+"/"+STR$(no%)+"."+STR$(po%)+"!"+p$+x$)
  2283.       RETURN -1
  2284.     ELSE IF INSTR(lst$,x$+STR$(zo%)+":"+STR$(ne%)+"/"+STR$(no%)+"!"+p$+x$) AND po%=0
  2285.       RETURN -1
  2286.     ELSE IF INSTR(lst$,x$+STR$(ne%)+"/"+STR$(no%)+"!"+p$+x$) AND po%=0
  2287.       RETURN -1
  2288.     ENDIF
  2289.   ELSE IF INSTR(lst$,x$+STR$(zo%)+":"+STR$(ne%)+"/"+STR$(no%)+"."+STR$(po%)+x$) OR INSTR(lst$,","+STR$(zo%)+":"+STR$(ne%)+"/"+STR$(no%)+"."+STR$(po%)+"!")
  2290.     RETURN -1
  2291.   ELSE IF INSTR(lst$,x$+STR$(ne%)+"/"+STR$(no%)+"."+STR$(po%)+x$) OR INSTR(lst$,","+STR$(ne%)+"/"+STR$(no%)+"."+STR$(po%)+"!")
  2292.     RETURN -1
  2293.   ELSE IF INSTR(lst$,x$+STR$(zo%)+":"+STR$(ne%)+"/"+STR$(no%)+x$) AND po%=0 OR INSTR(lst$,","+STR$(zo%)+":"+STR$(ne%)+"/"+STR$(no%)+"!") AND po%=0
  2294.     RETURN -1
  2295.   ELSE IF INSTR(lst$,x$+STR$(ne%)+"/"+STR$(no%)+x$) AND po%=0 OR INSTR(lst$,","+STR$(ne%)+"/"+STR$(no%)+"!") AND po%=0
  2296.     RETURN -1
  2297.   ENDIF
  2298.   RETURN 0
  2299. ENDFUNC
  2300. > FUNCTION areanum(a$)
  2301.   LOCAL i%
  2302.   FOR i%=0 TO nareas%-1
  2303.     IF UPPER$(area$(i%))=UPPER$(a$)
  2304.       RETURN i%
  2305.     ENDIF
  2306.   NEXT i%
  2307.   RETURN -1
  2308. ENDFUNC
  2309. > FUNCTION copy(fr$,to$)
  2310.   log(">Copy "+fr$+" to "+to$)
  2311.   LOCAL l%,ll%,ram%,addr%,x%
  2312.   t!=0
  2313. ' ## INLINE:
  2314. ' $0000: 6c 0d 0a 44 3a 5c 4d 53 47 5c 30 30 32 38 20 54 
  2315. ' $0010: 44 4d 5f 47 45 4e 46 49 4c 45 53 20 0d 0a 2d 44 
  2316. ' $0020: 65 73 63 20 41 75 74 6f 6d 61 74 69 63 61 6c 6c 
  2317. ' $0030: 79 20 61 64 64 65 64 20 61 72 65 61 20 62 79 20 
  2318. ' $0040: 4a 65 74 4d 61 69 6c 0d 0a 44 3a 5c 4d 53 47 5c 
  2319. ' $0050: 56 5f 43 52 59 50 54 20 56 5f 43 52 59 50 54 20 
  2320. ' $0060: 20 34 36 3a 31 34 34 2f 31 40 76 6e 65 74 2e 66 
  2321. ' $0070: 74 6e 0d 0a 2d 44 65 73 63 20 41 75 74 6f 6d 61 
  2322. ' $0080: 74 69 63 61 6c 6c 79 20 61 64 64 65 64 20 61 72 
  2323. ' $0090: 65 61 20 62 79 20 4a 65 74 4d 61 69 6c 0d 0a 44 
  2324. ' $00a0: 3a 5c 4d 53 47 5c 56 5f 43 4f 4d 50 47 41 20 56 
  2325. ' $00b0: 5f 43 4f 4d 50 47 41 4d 45 20 20 34 36 3a 31 34 
  2326. ' $00c0: 34 2f 31 40 76 6e 65 74 2e 66 74 6e 0d 0a 5f 53 
  2327. ' $00d0: 54 46 49 4c 45 53 20 0d 0a 2d 4c 6f 63 61 6c 0d 
  2328. ' $00e0: 0a 44 3a 5c 4d 53 47 5c 30 30 32 37 20 54 44 4d 
  2329. ' $00f0: 5f 41 4d 46 49 4c 45 53 20 0d 0a 2d 4c 6f 63 61 
  2330. ' 256  Bytes.
  2331.   INLINE addr%,256
  2332.   ram%=256
  2333.   OPEN "I",#6,fr$
  2334.   l%=LOF(#6)
  2335.   ll%=l%
  2336.   IF MID$(to$,2,1)=":"
  2337.     x%=DFREE(ASC(UPPER$(to$))-64)
  2338.   ELSE
  2339.     x%=DFREE(0)
  2340.   ENDIF
  2341.   log(" Copy from "+fr$+" to "+to$)
  2342.   IF x%>=l%
  2343.     OPEN "O",#7,to$
  2344.     DO WHILE l%>ram%
  2345.       BGET #6,addr%,ram%
  2346.       BPUT #7,addr%,ram%
  2347.       l%=l%-ram%
  2348.     LOOP
  2349.     BGET #6,addr%,l%
  2350.     BPUT #7,addr%,l%
  2351.     CLOSE #6
  2352.     CLOSE #7
  2353.     ret%=0
  2354.   ELSE
  2355.     log("!No disk space for copy")
  2356.     CLOSE #6
  2357.     ret%=-39
  2358.   ENDIF
  2359.   RETURN ret%
  2360. ENDFUNC
  2361. > FUNCTION move(fr$,to$)
  2362.   log(">Move "+fr$+" to "+to$)
  2363.   IF LEFT$(@fullpath$(LEFT$(fr$,RINSTR(fr$,"\"))))=LEFT$(@fullpath$(LEFT$(to$,RINSTR(to$,"\"))))
  2364.     IF EXIST(to$)
  2365.       KILL to$
  2366.     ENDIF
  2367.     NAME fr$ AS to$
  2368.   ELSE IF @copy(fr$,to$)
  2369.     log("!"+fr$+" not deleted")
  2370.     RETURN -39
  2371.   ELSE
  2372.     KILL fr$
  2373.   ENDIF
  2374.   RETURN 0
  2375. ENDFUNC
  2376. > FUNCTION base36$(number%,digits%)
  2377.   RETURN RIGHT$(STRING$(digits%-1,"0")+@b36$(number%),digits%)
  2378. ENDFUNC
  2379. > FUNCTION b36$(number%)
  2380.   LOCAL x$,n%
  2381.   n%=number% MOD 36
  2382.   IF n%<10
  2383.     x$=CHR$(n%+48)
  2384.   ELSE
  2385.     x$=CHR$(n%+55)
  2386.   ENDIF
  2387.   IF number%<36
  2388.     RETURN x$
  2389.   ELSE
  2390.     RETURN @b36$(number%\36)+x$
  2391.   ENDIF
  2392. ENDFUNC
  2393. > FUNCTION fullpath$(d$)
  2394.   LOCAL cwd$,ret$
  2395.   cwd$=CHR$(ASC("A")+GEMDOS(25))+":"+DIR$(0)
  2396.   IF MID$(d$,2,1)=":"
  2397.     IF (BIOS(10) AND 2^(ASC(UPPER$(d$))-65))=0
  2398.       log("!Drive "+LEFT$(d$)+" doesn't exist!")
  2399.       fin(255)
  2400.     ENDIF
  2401.     CHDRIVE d$
  2402.     d$=MID$(d$,3)
  2403.   ENDIF
  2404.   IF LEFT$(d$)="\"
  2405.     CHDIR "\"
  2406.     d$=MID$(d$,2)
  2407.   ENDIF
  2408.   DO WHILE d$>""
  2409.     IF INSTR(d$,"\")
  2410.       c$=LEFT$(d$,INSTR(d$,"\")-1)
  2411.       d$=MID$(d$,INSTR(d$,"\")+1)
  2412.     ELSE
  2413.       c$=d$
  2414.       d$=""
  2415.     ENDIF
  2416.     IF FSFIRST(c$,16) AND c$<>"."
  2417.       MKDIR c$
  2418.     ENDIF
  2419.     CHDIR c$
  2420.   LOOP
  2421.   ret$=CHR$(ASC("A")+GEMDOS(25))+":"+DIR$(0)
  2422.   CHDRIVE cwd$
  2423.   CHDIR cwd$
  2424.   RETURN ret$+"\"
  2425. ENDFUNC
  2426. > FUNCTION crc32(f$)
  2427.   '
  2428.   ' This position-independent code (DevpacST 2) exists in the inline.
  2429.   '
  2430.   ' * Enter with d0 set to point to an ASCIIZ string (ASCII+NULL) containing the
  2431.   ' * filename of the file to calculate CRC for, which is then returned in d0.
  2432.   '
  2433.   '         moveq   #-1,d4       start with -1 when calculating crc-32
  2434.   '         clr.w   -(sp)
  2435.   '         move.l  d0,-(sp)
  2436.   '         move.w  #$3d,-(sp)
  2437.   '         trap    #1           open file for reading
  2438.   '         addq.l  #8,sp
  2439.   '         tst.l   d0
  2440.   '         bmi     done
  2441.   '         move.w  d0,d7
  2442.   '         lea     crc32tb(pc),a6
  2443.   ' get     lea     storage(pc),a3
  2444.   '         move.l  a3,-(a7)
  2445.   '         move.l  #$100,-(sp)
  2446.   '         move.w  d7,-(sp)
  2447.   '         move.w  #$3f,-(sp)
  2448.   '         trap    #1           read up to 256 bytes
  2449.   '         lea     $c(sp),sp
  2450.   '         tst.l   d0           more bytes?
  2451.   '         bne     more         yes
  2452.   '         move.w  d7,-(sp)
  2453.   '         move.w  #$3E,-(sp)
  2454.   '         trap    #1           close file
  2455.   '         addq.l  #4,a7
  2456.   '         move.l  d4,d0
  2457.   '         not.l   d0
  2458.   ' done    rts
  2459.   ' more    subq.l  #1,d0
  2460.   ' next    moveq   #0,d5        carry out the processing
  2461.   '         move.b  (a3)+,d5
  2462.   '         eor.b   d4,d5
  2463.   '         lsr.l   #8,d4
  2464.   '         lsl.w   #2,d5
  2465.   '         move.l  0(a6,d5.w),d5
  2466.   '         eor.l   d5,d4
  2467.   '         dbf     d0,next
  2468.   '         bra     get
  2469.   '
  2470.   '         data
  2471.   ' crc32tb dc.l    $00000000,$77073096,$EE0E612C,$990951BA
  2472.   '         dc.l    $076DC419,$706AF48F,$E963A535,$9E6495A3
  2473.   '         dc.l    $0EDB8832,$79DCB8A4,$E0D5E91E,$97D2D988
  2474.   '         dc.l    $09B64C2B,$7EB17CBD,$E7B82D07,$90BF1D91
  2475.   '         dc.l    $1DB71064,$6AB020F2,$F3B97148,$84BE41DE
  2476.   '         dc.l    $1ADAD47D,$6DDDE4EB,$F4D4B551,$83D385C7
  2477.   '         dc.l    $136C9856,$646BA8C0,$FD62F97A,$8A65C9EC
  2478.   '         dc.l    $14015C4F,$63066CD9,$FA0F3D63,$8D080DF5
  2479.   '         dc.l    $3B6E20C8,$4C69105E,$D56041E4,$A2677172
  2480.   '         dc.l    $3C03E4D1,$4B04D447,$D20D85FD,$A50AB56B
  2481.   '         dc.l    $35B5A8FA,$42B2986C,$DBBBC9D6,$ACBCF940
  2482.   '         dc.l    $32D86CE3,$45DF5C75,$DCD60DCF,$ABD13D59
  2483.   '         dc.l    $26D930AC,$51DE003A,$C8D75180,$BFD06116
  2484.   '         dc.l    $21B4F4B5,$56B3C423,$CFBA9599,$B8BDA50F
  2485.   '         dc.l    $2802B89E,$5F058808,$C60CD9B2,$B10BE924
  2486.   '         dc.l    $2F6F7C87,$58684C11,$C1611DAB,$B6662D3D
  2487.   '         dc.l    $76DC4190,$01DB7106,$98D220BC,$EFD5102A
  2488.   '         dc.l    $71B18589,$06B6B51F,$9FBFE4A5,$E8B8D433
  2489.   '         dc.l    $7807C9A2,$0F00F934,$9609A88E,$E10E9818
  2490.   '         dc.l    $7F6A0DBB,$086D3D2D,$91646C97,$E6635C01
  2491.   '         dc.l    $6B6B51F4,$1C6C6162,$856530D8,$F262004E
  2492.   '         dc.l    $6C0695ED,$1B01A57B,$8208F4C1,$F50FC457
  2493.   '         dc.l    $65B0D9C6,$12B7E950,$8BBEB8EA,$FCB9887C
  2494.   '         dc.l    $62DD1DDF,$15DA2D49,$8CD37CF3,$FBD44C65
  2495.   '         dc.l    $4DB26158,$3AB551CE,$A3BC0074,$D4BB30E2
  2496.   '         dc.l    $4ADFA541,$3DD895D7,$A4D1C46D,$D3D6F4FB
  2497.   '         dc.l    $4369E96A,$346ED9FC,$AD678846,$DA60B8D0
  2498.   '         dc.l    $44042D73,$33031DE5,$AA0A4C5F,$DD0D7CC9
  2499.   '         dc.l    $5005713C,$270241AA,$BE0B1010,$C90C2086
  2500.   '         dc.l    $5768B525,$206F85B3,$B966D409,$CE61E49F
  2501.   '         dc.l    $5EDEF90E,$29D9C998,$B0D09822,$C7D7A8B4
  2502.   '         dc.l    $59B33D17,$2EB40D81,$B7BD5C3B,$C0BA6CAD
  2503.   '         dc.l    $EDB88320,$9ABFB3B6,$03B6E20C,$74B1D29A
  2504.   '         dc.l    $EAD54739,$9DD277AF,$04DB2615,$73DC1683
  2505.   '         dc.l    $E3630B12,$94643B84,$0D6D6A3E,$7A6A5AA8
  2506.   '         dc.l    $E40ECF0B,$9309FF9D,$0A00AE27,$7D079EB1
  2507.   '         dc.l    $F00F9344,$8708A3D2,$1E01F268,$6906C2FE
  2508.   '         dc.l    $F762575D,$806567CB,$196C3671,$6E6B06E7
  2509.   '         dc.l    $FED41B76,$89D32BE0,$10DA7A5A,$67DD4ACC
  2510.   '         dc.l    $F9B9DF6F,$8EBEEFF9,$17B7BE43,$60B08ED5
  2511.   '         dc.l    $D6D6A3E8,$A1D1937E,$38D8C2C4,$4FDFF252
  2512.   '         dc.l    $D1BB67F1,$A6BC5767,$3FB506DD,$48B2364B
  2513.   '         dc.l    $D80D2BDA,$AF0A1B4C,$36034AF6,$41047A60
  2514.   '         dc.l    $DF60EFC3,$A867DF55,$316E8EEF,$4669BE79
  2515.   '         dc.l    $CB61B38C,$BC66831A,$256FD2A0,$5268E236
  2516.   '         dc.l    $CC0C7795,$BB0B4703,$220216B9,$5505262F
  2517.   '         dc.l    $C5BA3BBE,$B2BD0B28,$2BB45A92,$5CB36A04
  2518.   '         dc.l    $C2D7FFA7,$B5D0CF31,$2CD99E8B,$5BDEAE1D
  2519.   '         dc.l    $9B64C2B0,$EC63F226,$756AA39C,$026D930A
  2520.   '         dc.l    $9C0906A9,$EB0E363F,$72076785,$05005713
  2521.   '         dc.l    $95BF4A82,$E2B87A14,$7BB12BAE,$0CB61B38
  2522.   '         dc.l    $92D28E9B,$E5D5BE0D,$7CDCEFB7,$0BDBDF21
  2523.   '         dc.l    $86D3D2D4,$F1D4E242,$68DDB3F8,$1FDA836E
  2524.   '         dc.l    $81BE16CD,$F6B9265B,$6FB077E1,$18B74777
  2525.   '         dc.l    $88085AE6,$FF0F6A70,$66063BCA,$11010B5C
  2526.   '         dc.l    $8F659EFF,$F862AE69,$616BFFD3,$166CCF45
  2527.   '         dc.l    $A00AE278,$D70DD2EE,$4E048354,$3903B3C2
  2528.   '         dc.l    $A7672661,$D06016F7,$4969474D,$3E6E77DB
  2529.   '         dc.l    $AED16A4A,$D9D65ADC,$40DF0B66,$37D83BF0
  2530.   '         dc.l    $A9BCAE53,$DEBB9EC5,$47B2CF7F,$30B5FFE9
  2531.   '         dc.l    $BDBDF21C,$CABAC28A,$53B39330,$24B4A3A6
  2532.   '         dc.l    $BAD03605,$CDD70693,$54DE5729,$23D967BF
  2533.   '         dc.l    $B3667A2E,$C4614AB8,$5D681B02,$2A6F2B94
  2534.   '         dc.l    $B40BBE37,$C30C8EA1,$5A05DF1B,$2D02EF8D
  2535.   '
  2536.   '         bss
  2537.   ' storage ds.b    256
  2538.   '
  2539.   ' This was derived from Binkley's crc checking routines, which were in turn
  2540.   ' derived from code written by Chuck Forsberg of Omen Technologies. So don't
  2541.   ' go asking me about the theory behind how it works ;-)
  2542.   '
  2543.   LOCAL fl$,h%,crc%,crc32chk%
  2544. ' ## INLINE:
  2545. ' $0000: 60 1a 00 00 05 62 00 00 00 00 00 00 00 00 00 00 
  2546. ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 78 ff 42 67 
  2547. ' $0020: 2f 00 3f 3c 00 3d 4e 41 50 8f 4a 80 6b 00 00 34 
  2548. ' $0030: 3e 00 4d fa 00 4a 47 fa 04 46 2f 0b 2f 3c 00 00 
  2549. ' $0040: 01 00 3f 07 3f 3c 00 3f 4e 41 4f ef 00 0c 4a 80 
  2550. ' $0050: 66 00 00 12 3f 07 3f 3c 00 3e 4e 41 58 8f 20 04 
  2551. ' $0060: 46 80 4e 75 53 80 7a 00 1a 1b b9 05 e0 8c e5 4d 
  2552. ' $0070: 2a 36 50 00 bb 84 51 c8 ff ee 60 00 ff ba 00 00 
  2553. ' $0080: 00 00 77 07 30 96 ee 0e 61 2c 99 09 51 ba 07 6d 
  2554. ' $0090: c4 19 70 6a f4 8f e9 63 a5 35 9e 64 95 a3 0e db 
  2555. ' $00a0: 88 32 79 dc b8 a4 e0 d5 e9 1e 97 d2 d9 88 09 b6 
  2556. ' $00b0: 4c 2b 7e b1 7c bd e7 b8 2d 07 90 bf 1d 91 1d b7 
  2557. ' $00c0: 10 64 6a b0 20 f2 f3 b9 71 48 84 be 41 de 1a da 
  2558. ' $00d0: d4 7d 6d dd e4 eb f4 d4 b5 51 83 d3 85 c7 13 6c 
  2559. ' $00e0: 98 56 64 6b a8 c0 fd 62 f9 7a 8a 65 c9 ec 14 01 
  2560. ' $00f0: 5c 4f 63 06 6c d9 fa 0f 3d 63 8d 08 0d f5 3b 6e 
  2561. ' $0100: 20 c8 4c 69 10 5e d5 60 41 e4 a2 67 71 72 3c 03 
  2562. ' $0110: e4 d1 4b 04 d4 47 d2 0d 85 fd a5 0a b5 6b 35 b5 
  2563. ' $0120: a8 fa 42 b2 98 6c db bb c9 d6 ac bc f9 40 32 d8 
  2564. ' $0130: 6c e3 45 df 5c 75 dc d6 0d cf ab d1 3d 59 26 d9 
  2565. ' $0140: 30 ac 51 de 00 3a c8 d7 51 80 bf d0 61 16 21 b4 
  2566. ' $0150: f4 b5 56 b3 c4 23 cf ba 95 99 b8 bd a5 0f 28 02 
  2567. ' $0160: b8 9e 5f 05 88 08 c6 0c d9 b2 b1 0b e9 24 2f 6f 
  2568. ' $0170: 7c 87 58 68 4c 11 c1 61 1d ab b6 66 2d 3d 76 dc 
  2569. ' $0180: 41 90 01 db 71 06 98 d2 20 bc ef d5 10 2a 71 b1 
  2570. ' $0190: 85 89 06 b6 b5 1f 9f bf e4 a5 e8 b8 d4 33 78 07 
  2571. ' $01a0: c9 a2 0f 00 f9 34 96 09 a8 8e e1 0e 98 18 7f 6a 
  2572. ' $01b0: 0d bb 08 6d 3d 2d 91 64 6c 97 e6 63 5c 01 6b 6b 
  2573. ' $01c0: 51 f4 1c 6c 61 62 85 65 30 d8 f2 62 00 4e 6c 06 
  2574. ' $01d0: 95 ed 1b 01 a5 7b 82 08 f4 c1 f5 0f c4 57 65 b0 
  2575. ' $01e0: d9 c6 12 b7 e9 50 8b be b8 ea fc b9 88 7c 62 dd 
  2576. ' $01f0: 1d df 15 da 2d 49 8c d3 7c f3 fb d4 4c 65 4d b2 
  2577. ' $0200: 61 58 3a b5 51 ce a3 bc 00 74 d4 bb 30 e2 4a df 
  2578. ' $0210: a5 41 3d d8 95 d7 a4 d1 c4 6d d3 d6 f4 fb 43 69 
  2579. ' $0220: e9 6a 34 6e d9 fc ad 67 88 46 da 60 b8 d0 44 04 
  2580. ' $0230: 2d 73 33 03 1d e5 aa 0a 4c 5f dd 0d 7c c9 50 05 
  2581. ' $0240: 71 3c 27 02 41 aa be 0b 10 10 c9 0c 20 86 57 68 
  2582. ' $0250: b5 25 20 6f 85 b3 b9 66 d4 09 ce 61 e4 9f 5e de 
  2583. ' $0260: f9 0e 29 d9 c9 98 b0 d0 98 22 c7 d7 a8 b4 59 b3 
  2584. ' $0270: 3d 17 2e b4 0d 81 b7 bd 5c 3b c0 ba 6c ad ed b8 
  2585. ' $0280: 83 20 9a bf b3 b6 03 b6 e2 0c 74 b1 d2 9a ea d5 
  2586. ' $0290: 47 39 9d d2 77 af 04 db 26 15 73 dc 16 83 e3 63 
  2587. ' $02a0: 0b 12 94 64 3b 84 0d 6d 6a 3e 7a 6a 5a a8 e4 0e 
  2588. ' $02b0: cf 0b 93 09 ff 9d 0a 00 ae 27 7d 07 9e b1 f0 0f 
  2589. ' $02c0: 93 44 87 08 a3 d2 1e 01 f2 68 69 06 c2 fe f7 62 
  2590. ' $02d0: 57 5d 80 65 67 cb 19 6c 36 71 6e 6b 06 e7 fe d4 
  2591. ' $02e0: 1b 76 89 d3 2b e0 10 da 7a 5a 67 dd 4a cc f9 b9 
  2592. ' $02f0: df 6f 8e be ef f9 17 b7 be 43 60 b0 8e d5 d6 d6 
  2593. ' $0300: a3 e8 a1 d1 93 7e 38 d8 c2 c4 4f df f2 52 d1 bb 
  2594. ' $0310: 67 f1 a6 bc 57 67 3f b5 06 dd 48 b2 36 4b d8 0d 
  2595. ' $0320: 2b da af 0a 1b 4c 36 03 4a f6 41 04 7a 60 df 60 
  2596. ' $0330: ef c3 a8 67 df 55 31 6e 8e ef 46 69 be 79 cb 61 
  2597. ' $0340: b3 8c bc 66 83 1a 25 6f d2 a0 52 68 e2 36 cc 0c 
  2598. ' $0350: 77 95 bb 0b 47 03 22 02 16 b9 55 05 26 2f c5 ba 
  2599. ' $0360: 3b be b2 bd 0b 28 2b b4 5a 92 5c b3 6a 04 c2 d7 
  2600. ' $0370: ff a7 b5 d0 cf 31 2c d9 9e 8b 5b de ae 1d 9b 64 
  2601. ' $0380: c2 b0 ec 63 f2 26 75 6a a3 9c 02 6d 93 0a 9c 09 
  2602. ' $0390: 06 a9 eb 0e 36 3f 72 07 67 85 05 00 57 13 95 bf 
  2603. ' $03a0: 4a 82 e2 b8 7a 14 7b b1 2b ae 0c b6 1b 38 92 d2 
  2604. ' $03b0: 8e 9b e5 d5 be 0d 7c dc ef b7 0b db df 21 86 d3 
  2605. ' $03c0: d2 d4 f1 d4 e2 42 68 dd b3 f8 1f da 83 6e 81 be 
  2606. ' $03d0: 16 cd f6 b9 26 5b 6f b0 77 e1 18 b7 47 77 88 08 
  2607. ' $03e0: 5a e6 ff 0f 6a 70 66 06 3b ca 11 01 0b 5c 8f 65 
  2608. ' $03f0: 9e ff f8 62 ae 69 61 6b ff d3 16 6c cf 45 a0 0a 
  2609. ' $0400: e2 78 d7 0d d2 ee 4e 04 83 54 39 03 b3 c2 a7 67 
  2610. ' $0410: 26 61 d0 60 16 f7 49 69 47 4d 3e 6e 77 db ae d1 
  2611. ' $0420: 6a 4a d9 d6 5a dc 40 df 0b 66 37 d8 3b f0 a9 bc 
  2612. ' $0430: ae 53 de bb 9e c5 47 b2 cf 7f 30 b5 ff e9 bd bd 
  2613. ' $0440: f2 1c ca ba c2 8a 53 b3 93 30 24 b4 a3 a6 ba d0 
  2614. ' $0450: 36 05 cd d7 06 93 54 de 57 29 23 d9 67 bf b3 66 
  2615. ' $0460: 7a 2e c4 61 4a b8 5d 68 1b 02 2a 6f 2b 94 b4 0b 
  2616. ' $0470: be 37 c3 0c 8e a1 5a 05 df 1b 2d 02 ef 8d 5e 2c 
  2617. ' $0480: 41 5d 6d 0f 9e f2 3e be 0c 4b 69 38 03 f2 db 8e 
  2618. ' $0490: 15 35 a0 dc 06 fe 97 ad 18 cc fd a1 8a 5a 34 1a 
  2619. ' $04a0: 4f 00 33 84 89 32 e0 8e 09 1e 39 fd e0 8f 00 05 
  2620. ' $04b0: 6d 41 43 55 4f 23 06 76 13 07 c6 c0 29 c2 16 63 
  2621. ' $04c0: 7f 2a ac 81 0f 75 4e 19 47 94 1a b3 7e 96 72 f8 
  2622. ' $04d0: b0 7e 02 cd b6 08 9f c9 3e ba d0 f9 51 25 02 9e 
  2623. ' $04e0: 3c 5b 82 76 38 22 4c 62 33 8f 09 ef 48 fa 41 85 
  2624. ' $04f0: 82 8b a0 cd ac a4 75 8a 39 6f 6c 02 99 35 d9 37 
  2625. ' $0500: 06 b1 b9 ad cb 3a d3 7b c7 e4 e1 18 ec 3f db 89 
  2626. ' $0510: 26 02 e4 a3 2b cc 30 ef bc ce 78 b8 c0 8e d6 ba 
  2627. ' $0520: 2e 1a 0b 32 1f ae 5f de e4 f9 eb 1f ac d5 5f fb 
  2628. ' $0530: 19 85 d8 f1 65 76 b9 bf f0 00 91 75 44 c4 ba a5 
  2629. ' $0540: 0f f8 6d 2d 76 0d 2b 68 32 c6 eb 15 da 85 68 16 
  2630. ' $0550: d1 04 b9 87 c0 0c a6 cc 65 a7 3a d0 49 a5 69 0d 
  2631. ' $0560: a1 69 06 02 b3 2d 06 7c e0 7e e1 02 ab 45 22 c3 
  2632. ' $0570: 21 05 89 bc 84 fc e8 45 8a 30 23 e4 c5 10 00 00 
  2633. ' $0580: 00 00 
  2634. ' 1410  Bytes.
  2635.   INLINE crc32chk%,1410
  2636.   log(">CRC check on file "+f$)
  2637.   fl$=f$+CHR$(0)
  2638.   reg%(0)=V:fl$
  2639.   RCALL crc32chk%,reg%()
  2640.   crc%=reg%(0)
  2641.   RETURN crc%
  2642. ENDFUNC
  2643. > FUNCTION stamp
  2644.   LOCAL d$,y%,m%,d%,h%,mi%,s%,l%,x%,i%
  2645.   x%=0
  2646.   d$=DATE$
  2647.   y%=VAL(MID$(d$,7))
  2648.   m%=VAL(MID$(d$,4,2))
  2649.   d%=VAL(LEFT$(d$,2))
  2650.   FOR i%=1970 TO y%-1
  2651.     l%=(i%/4=i%\4)*((i% MOD 100)>0)+(i%/400=i%\400)*((i% MOD 100)=0)
  2652.     IF l%
  2653.       ADD x%,31622400
  2654.     ELSE
  2655.       ADD x%,31536000
  2656.     ENDIF
  2657.   NEXT i%
  2658.   l%=(y%\4=y%/4)*((y% MOD 100)>0)+(y%\400=y%/400)*((y% MOD 100)=0)
  2659.   ADD x%,86400*fjd%(m%-1,l%)
  2660.   ADD x%,86400*(d%-1)
  2661.   d$=TIME$
  2662.   h%=VAL(d$)
  2663.   mi%=VAL(MID$(d$,4))
  2664.   s%=VAL(MID$(d$,7))
  2665.   ADD x%,3600*h%
  2666.   ADD x%,60*mi%
  2667.   ADD x%,s%
  2668.   RETURN x%
  2669. ENDFUNC
  2670. > FUNCTION xcrc(crc%,cp%)
  2671.   '
  2672.   ' This position independent code (DevpacST 2) exists in the inline.
  2673.   '
  2674.   ' * crc16 routine: D0 is running CRC-16, D1.b is data to shift in
  2675.   ' * bits 8-15 of D1 are assumed to be reset (zero)
  2676.   '
  2677.   ' crc16   lea     crc16tb(pc),a0
  2678.   '         move.w  d0,d2
  2679.   '         lsr.w   #8,d0
  2680.   '         eor.w   d1,d0
  2681.   '         lsl.w   d0
  2682.   '         move.w  0(a0,d0.w),d0
  2683.   '         lsl.w   #8,d2
  2684.   '         eor.w   d2,d0
  2685.   '         rts
  2686.   '
  2687.   '         data
  2688.   ' crc16tb dc.w    $0000,$1021,$2042,$3063,$4084,$50a5,$60c6,$70e7
  2689.   '         dc.w    $8108,$9129,$a14a,$b16b,$c18c,$d1ad,$e1ce,$f1ef
  2690.   '         dc.w    $1231,$0210,$3273,$2252,$52b5,$4294,$72f7,$62d6
  2691.   '         dc.w    $9339,$8318,$b37b,$a35a,$d3bd,$c39c,$f3ff,$e3de
  2692.   '         dc.w    $2462,$3443,$0420,$1401,$64e6,$74c7,$44a4,$5485
  2693.   '         dc.w    $a56a,$b54b,$8528,$9509,$e5ee,$f5cf,$c5ac,$d58d
  2694.   '         dc.w    $3653,$2672,$1611,$0630,$76d7,$66f6,$5695,$46b4
  2695.   '         dc.w    $b75b,$a77a,$9719,$8738,$f7df,$e7fe,$d79d,$c7bc
  2696.   '         dc.w    $48c4,$58e5,$6886,$78a7,$0840,$1861,$2802,$3823
  2697.   '         dc.w    $c9cc,$d9ed,$e98e,$f9af,$8948,$9969,$a90a,$b92b
  2698.   '         dc.w    $5af5,$4ad4,$7ab7,$6a96,$1a71,$0a50,$3a33,$2a12
  2699.   '         dc.w    $dbfd,$cbdc,$fbbf,$eb9e,$9b79,$8b58,$bb3b,$ab1a
  2700.   '         dc.w    $6ca6,$7c87,$4ce4,$5cc5,$2c22,$3c03,$0c60,$1c41
  2701.   '         dc.w    $edae,$fd8f,$cdec,$ddcd,$ad2a,$bd0b,$8d68,$9d49
  2702.   '         dc.w    $7e97,$6eb6,$5ed5,$4ef4,$3e13,$2e32,$1e51,$0e70
  2703.   '         dc.w    $ff9f,$efbe,$dfdd,$cffc,$bf1b,$af3a,$9f59,$8f78
  2704.   '         dc.w    $9188,$81a9,$b1ca,$a1eb,$d10c,$c12d,$f14e,$e16f
  2705.   '         dc.w    $1080,$00a1,$30c2,$20c3,$5004,$4025,$7046,$6067
  2706.   '         dc.w    $83b9,$9398,$a3fb,$b3da,$c33d,$d31c,$e37f,$f35e
  2707.   '         dc.w    $02b1,$1290,$22f3,$32d2,$4235,$5214,$6277,$7256
  2708.   '         dc.w    $b5ea,$a5cb,$95a8,$8589,$f56e,$e54f,$d52c,$c50d
  2709.   '         dc.w    $34e2,$24c3,$14a0,$0481,$7466,$6447,$5424,$4405
  2710.   '         dc.w    $a7db,$b7fa,$8799,$97b8,$e75f,$f77e,$c71d,$d73c
  2711.   '         dc.w    $26d3,$36f2,$0691,$16b0,$6657,$7676,$4615,$5634
  2712.   '         dc.w    $d94c,$c96d,$f90e,$e92f,$99c8,$89e9,$b98a,$a9ab
  2713.   '         dc.w    $5844,$4865,$7806,$6827,$18c0,$08e1,$3882,$28a3
  2714.   '         dc.w    $cb7d,$db5c,$eb3f,$fb1e,$8bf9,$9bd8,$abbb,$bb9a
  2715.   '         dc.w    $4a75,$5a54,$6a37,$7a16,$0af1,$1ad0,$2ab3,$3a92
  2716.   '         dc.w    $fd2e,$ed0f,$dd6c,$cd4d,$bdaa,$ad8b,$9de8,$8dc9
  2717.   '         dc.w    $7c26,$6c07,$5c64,$4c45,$3ca2,$2c83,$1ce0,$0cc1
  2718.   '         dc.w    $ef1f,$ff3e,$cf5d,$df7c,$af9b,$bfba,$8fd9,$9ff8
  2719.   '         dc.w    $6e17,$7e36,$4e55,$5e74,$2e93,$3eb2,$0ed1,$1ef0
  2720.   '
  2721.   ' Once again, Chuck Forsberg of Omen Technologies has had a hand in it! (See
  2722.   ' the CRC32 routine for more details.)
  2723.   '
  2724.   LOCAL crc16%
  2725. ' ## INLINE:
  2726. ' $0000: 41 fa 00 14 34 00 e0 48 b3 40 e3 48 30 30 00 00 
  2727. ' $0010: e1 4a b5 40 4e 75 00 00 10 21 20 42 30 63 40 84 
  2728. ' $0020: 50 a5 60 c6 70 e7 81 08 91 29 a1 4a b1 6b c1 8c 
  2729. ' $0030: d1 ad e1 ce f1 ef 12 31 02 10 32 73 22 52 52 b5 
  2730. ' $0040: 42 94 72 f7 62 d6 93 39 83 18 b3 7b a3 5a d3 bd 
  2731. ' $0050: c3 9c f3 ff e3 de 24 62 34 43 04 20 14 01 64 e6 
  2732. ' $0060: 74 c7 44 a4 54 85 a5 6a b5 4b 85 28 95 09 e5 ee 
  2733. ' $0070: f5 cf c5 ac d5 8d 36 53 26 72 16 11 06 30 76 d7 
  2734. ' $0080: 66 f6 56 95 46 b4 b7 5b a7 7a 97 19 87 38 f7 df 
  2735. ' $0090: e7 fe d7 9d c7 bc 48 c4 58 e5 68 86 78 a7 08 40 
  2736. ' $00a0: 18 61 28 02 38 23 c9 cc d9 ed e9 8e f9 af 89 48 
  2737. ' $00b0: 99 69 a9 0a b9 2b 5a f5 4a d4 7a b7 6a 96 1a 71 
  2738. ' $00c0: 0a 50 3a 33 2a 12 db fd cb dc fb bf eb 9e 9b 79 
  2739. ' $00d0: 8b 58 bb 3b ab 1a 6c a6 7c 87 4c e4 5c c5 2c 22 
  2740. ' $00e0: 3c 03 0c 60 1c 41 ed ae fd 8f cd ec dd cd ad 2a 
  2741. ' $00f0: bd 0b 8d 68 9d 49 7e 97 6e b6 5e d5 4e f4 3e 13 
  2742. ' $0100: 2e 32 1e 51 0e 70 ff 9f ef be df dd cf fc bf 1b 
  2743. ' $0110: af 3a 9f 59 8f 78 91 88 81 a9 b1 ca a1 eb d1 0c 
  2744. ' $0120: c1 2d f1 4e e1 6f 10 80 00 a1 30 c2 20 e3 50 04 
  2745. ' $0130: 40 25 70 46 60 67 83 b9 93 98 a3 fb b3 da c3 3d 
  2746. ' $0140: d3 1c e3 7f f3 5e 02 b1 12 90 22 f3 32 d2 42 35 
  2747. ' $0150: 52 14 62 77 72 56 b5 ea a5 cb 95 a8 85 89 f5 6e 
  2748. ' $0160: e5 4f d5 2c c5 0d 34 e2 24 c3 14 a0 04 81 74 66 
  2749. ' $0170: 64 47 54 24 44 05 a7 db b7 fa 87 99 97 b8 e7 5f 
  2750. ' $0180: f7 7e c7 1d d7 3c 26 d3 36 f2 06 91 16 b0 66 57 
  2751. ' $0190: 76 76 46 15 56 34 d9 4c c9 6d f9 0e e9 2f 99 c8 
  2752. ' $01a0: 89 e9 b9 8a a9 ab 58 44 48 65 78 06 68 27 18 c0 
  2753. ' $01b0: 08 e1 38 82 28 a3 cb 7d db 5c eb 3f fb 1e 8b f9 
  2754. ' $01c0: 9b d8 ab bb bb 9a 4a 75 5a 54 6a 37 7a 16 0a f1 
  2755. ' $01d0: 1a d0 2a b3 3a 92 fd 2e ed 0f dd 6c cd 4d bd aa 
  2756. ' $01e0: ad 8b 9d e8 8d c9 7c 26 6c 07 5c 64 4c 45 3c a2 
  2757. ' $01f0: 2c 83 1c e0 0c c1 ef 1f ff 3e cf 5d df 7c af 9b 
  2758. ' $0200: bf ba 8f d9 9f f8 6e 17 7e 36 4e 55 5e 74 2e 93 
  2759. ' $0210: 3e b2 0e d1 1e f0 
  2760. ' 534  Bytes.
  2761.   INLINE crc16%,534
  2762.   reg%(0)=crc%
  2763.   reg%(1)=cp%
  2764.   RCALL crc16%,reg%()
  2765.   RETURN reg%(0)
  2766. ENDFUNC
  2767. > FUNCTION get$(st%,no%)
  2768.   LOCAL i%,x$
  2769.   x$=""
  2770.   FOR i%=st% TO st%+no%-1
  2771.     x$=x$+CHR$(b_|(i%))
  2772.   NEXT i%
  2773.   RETURN x$
  2774. ENDFUNC
  2775. > FUNCTION addtofil(n$,d$,p$)
  2776.   ' n$ - filename
  2777.   ' d$ - description
  2778.   ' p$ - destination file path
  2779.   LOCAL dd$,c$,x$,y$,x%,i%,l%
  2780.   log(">addtofil details:")
  2781.   log(">Filename:"+n$)
  2782.   log(">Desc:"+d$)
  2783.   log(">Path:"+p$)
  2784.   IF turbo!
  2785.     y$=LEFT$(p$,LEN(p$)-1)
  2786.     y$=MID$(y$,RINSTR(y$,"\")+1)
  2787.     x$=filpath$+y$+".FIL"
  2788.     IF EXIST(x$)
  2789.       log(">Check for "+n$+" in "+x$)
  2790.       OPEN "I",#1,x$
  2791.       DO UNTIL EOF(#1)
  2792.         dd$=INPUT$(478,#1)
  2793.         IF UPPER$(LEFT$(dd$,INSTR(y$,CHR$(0))-1))=UPPER$(n$)
  2794.           log(" Record for "+n$+" already exists in "+x$)
  2795.           RETURN 0
  2796.         ENDIF
  2797.       LOOP
  2798.       CLOSE #1
  2799.       log(">Add to "+x$)
  2800.       c$=LEFT$(filpath$,LEN(filpath$)-1)
  2801.       c$=LEFT$(c$,RINSTR(c$,"\"))+"CONFIG.DAT"
  2802.       log(">Read file number from "+c$)
  2803.       OPEN "U",#1,c$
  2804.       SEEK #1,3452
  2805.       x%=INP%(#1)
  2806.       INC x%
  2807.       log(">This is file no "+STR$(x%))
  2808.       SEEK #1,3452
  2809.       OUT% #1,x%
  2810.       CLOSE #1
  2811.       OPEN "I",#1,p$+n$
  2812.       l%=LOF(#1)
  2813.       CLOSE #1
  2814.       OPEN "A",#1,x$
  2815.       PRINT #1,n$;STRING$(13-LEN(n$),0);
  2816.       OUT #1,VAL(MID$(DATE$,4)),VAL(DATE$),VAL(MID$(DATE$,7))-1900
  2817.       OUT% #1,l%
  2818.       PRINT #1,"Unknown";CHR$(0);
  2819.       OUT& #1,0
  2820.       OUT #1,50
  2821.       FOR i%=1 TO 5
  2822.         IF LEN(d$)>79
  2823.           dd$=LEFT$(d$,RINSTR(LEFT$(d$,79)," "))
  2824.           IF dd$=""
  2825.             dd$=LEFT$(d$,79)
  2826.             d$=MID$(d$,80)
  2827.           ELSE
  2828.             d$=LEFT$(d$,LEN(d$)-1)
  2829.             d$=MID$(d$,RINSTR(LEFT$(d$,79)," ")+1)
  2830.           ENDIF
  2831.         ELSE
  2832.           dd$=d$
  2833.           d$=""
  2834.         ENDIF
  2835.         PRINT #1,dd$;STRING$(80-LEN(dd$),0);
  2836.       NEXT i%
  2837.       OUT #1,0
  2838.       IF INSTR(f$,".ASC")
  2839.         OUT& #1,0
  2840.       ELSE
  2841.         OUT& #1,256
  2842.       ENDIF
  2843.       OUT& #1,turboacc%
  2844.       OUT% #1,0,x%+1
  2845.       PRINT #1,filup$;STRING$(31-LEN(filup$),0);
  2846.       OUT #1,0,0,89
  2847.       CLOSE #1
  2848.       log(" Record appended to "+y$)
  2849.       RETURN 0
  2850.     ENDIF
  2851.   ELSE IF probbs!
  2852.     log(">Finding size of "+p$+n$)
  2853.     OPEN "I",#1,p$+n$ !find size of file
  2854.     size%=LOF(#1)
  2855.     CLOSE #1
  2856.     x$=p$+"FILES.DAT"
  2857.     log(">Reading "+probbs$+"BBSINFO.DAT")
  2858.     OPEN "U",#2,probbs$+"BBSINFO.DAT" !find file number
  2859.     SEEK #2,116
  2860.     x%=INP%(#2)
  2861.     log(">File number read="+STR$(x%))
  2862.     INC x%
  2863.     log(">This is file no "+STR$(x%))
  2864.     log(">Adding record to "+x$)
  2865.     OPEN "A",#1,x$
  2866.     PRINT #1,n$;STRING$(13-LEN(n$),0);
  2867.     PRINT #1,LEFT$(d$,243);STRING$(244-LEN(LEFT$(d$,243)),0);
  2868.     PRINT #1,LEFT$(filup$,35);STRING$(36-LEN(LEFT$(filup$,35)),0);
  2869.     OUT #1,0,VAL(LEFT$(DATE$,2)),VAL(MID$(DATE$,4,2)),VAL(MID$(DATE$,9,2)),0,0,0
  2870.     OUT% #1,0,size%
  2871.     OUT% #1,x%
  2872.     OUT #1,0,0
  2873.     size%=0
  2874.     num%=0
  2875.     dnld&=0
  2876.     CLOSE #1
  2877.     log(">Writing updated file no to BBSINFO.DAT")
  2878.     log(">File number writing back="+STR$(x%))
  2879.     SEEK #2,116
  2880.     OUT% #2,x%
  2881.     CLOSE #2
  2882.     RETURN 0
  2883.   ENDIF
  2884.   log(">Add to "+p$+"FILES.BBS")
  2885.   IF EXIST(p$+"FILES.BBS")
  2886.     OPEN "A",#1,p$+"FILES.BBS"
  2887.   ELSE
  2888.     OPEN "O",#1,p$+"FILES.BBS"
  2889.     log(" Creating "+p$+"FILES.BBS")
  2890.   ENDIF
  2891.   PRINT #1,n$;STRING$(13-LEN(n$),32);d$
  2892.   CLOSE #1
  2893.   log(" Record appended to FILES.BBS")
  2894.   RETURN 0
  2895. ENDFUNC
  2896. > FUNCTION in$(dev%)
  2897.   LOCAL z%
  2898.   RECALL #dev%,inparr$(),-1,z%
  2899.   RETURN inparr$(0)
  2900. ENDFUNC
  2901. > FUNCTION env$(s$)
  2902.   LOCAL x%,x$
  2903.   x%=envp%
  2904.   DO WHILE PEEK(x%)<>0 AND PEEK(x%+1)<>0
  2905.     x$=CHAR{x%}
  2906.     IF LEFT$(x$,LEN(s$))=s$
  2907.       RETURN MID$(x$,LEN(s$)+1)
  2908.     ENDIF
  2909.     x%=x%+LEN(x$)+1
  2910.   LOOP
  2911.   RETURN ""
  2912. ENDFUNC
  2913. > FUNCTION inpline$(d$,a$,l%)
  2914.   LOCAL x%,x$,i%,ox%,ox$
  2915.   PRINT d$;STRING$(l%-LEN(d$),".");STRING$(l%-LEN(d$),8);
  2916.   x%=LEN(d$)
  2917.   x$=d$
  2918.   ~XBIOS(21,1,0)
  2919.   DO
  2920.     ox%=x%
  2921.     ox$=x$
  2922.     i%=INP(2)
  2923.     IF i%=8 AND x%>0
  2924.       x$=LEFT$(x$,x%-1)+MID$(x$,x%+1)
  2925.       DEC x%
  2926.       PRINT CHR$(8);MID$(x$,x%+1);".";STRING$(LEN(x$)-x%+1,8);
  2927.     ELSE IF i%=127
  2928.       x$=LEFT$(x$,x%)+MID$(x$,x%+2)
  2929.       PRINT MID$(x$,x%+1);".";STRING$(LEN(x$)-x%+1,8);
  2930.     ELSE IF i%=203 AND x%>0
  2931.       DEC x%
  2932.       PRINT CHR$(8);
  2933.     ELSE IF i%=205 AND x%<LEN(x$)
  2934.       INC x%
  2935.       PRINT MID$(x$,x%,1);
  2936.     ELSE IF (INSTR(a$,CHR$(i%)) OR a$="") AND (LEN(x$)<l% AND (i%>31 AND i%<128))
  2937.       x$=LEFT$(x$,x%)+CHR$(i%)+MID$(x$,x%+1)
  2938.       INC x%
  2939.       PRINT MID$(x$,x%);STRING$(LEN(x$)-x%,8);
  2940.     ELSE IF INSTR(a$,UPPER$(CHR$(i%))) AND LEN(x$)<l% AND a$=UPPER$(a$)
  2941.       x$=LEFT$(x$,x%)+UPPER$(CHR$(i%))+MID$(x$,x%+1)
  2942.       INC x%
  2943.       PRINT MID$(x$,x%);STRING$(LEN(x$)-x%,8);
  2944.     ENDIF
  2945.   LOOP UNTIL i%=13 OR i%=27
  2946.   ~XBIOS(21,0,0)
  2947.   OUT 2,13
  2948.   PRINT x$;STRING$(l%-LEN(x$)," ")
  2949.   IF i%=27
  2950.     RETURN CHR$(24) !CAN
  2951.   ELSE
  2952.     RETURN x$
  2953.   ENDIF
  2954. ENDFUNC
  2955.