home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / SYSPC22.ZIP / FILEXFER.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-02-14  |  37.4 KB  |  1,493 lines

  1.  
  2. overlay procedure udsection;
  3.  
  4. var ud:udrec;
  5.     area:arearec;
  6.     curarea:integer;
  7.  
  8.   procedure beepbeep (ok:integer);
  9.   begin
  10.     write (^B^M);
  11.     case ok of
  12.       0:write ('Done');
  13.       1:write ('Aborted just before EOF');
  14.       2:write ('Aborted')
  15.     end;
  16.     writeln ('!');
  17.   end;
  18.  
  19.   function unsigned (i:integer):real;
  20.   begin
  21.     if i>=0
  22.       then unsigned:=i
  23.       else unsigned:=65536.0+i
  24.   end;
  25.  
  26.   procedure writefreespace (path:lstr);
  27.   var drive:byte;
  28.       r:regs;
  29.       csize,free,total:real;
  30.   begin
  31.     r.ah:=$36;
  32.     r.dl:=ord(upcase(path[1]))-64;
  33.     intr ($21,r);
  34.     if r.ax=-1 then begin
  35.       writeln ('Invalid drive');
  36.       exit
  37.     end;
  38.     csize:=unsigned(r.ax)*unsigned(r.cx);
  39.     free:=csize*unsigned(r.bx);
  40.     total:=csize*unsigned(r.dx);
  41.     free:=free/1024;
  42.     total:=total/1024;
  43.     writeln (free:0:0,'k out of ',total:0:0,'k')
  44.   end;
  45.  
  46.   procedure seekafile (n:integer);
  47.   begin
  48.     seek (afile,n-1)
  49.   end;
  50.  
  51.   function numareas:integer;
  52.   begin
  53.     numareas:=filesize (afile)
  54.   end;
  55.  
  56.   procedure seekudfile (n:integer);
  57.   begin
  58.     seek (udfile,n-1)
  59.   end;
  60.  
  61.   function numuds:integer;
  62.   begin
  63.     numuds:=filesize (udfile)
  64.   end;
  65.  
  66.   procedure assignud;
  67.   begin
  68.     close (udfile);
  69.     assign (udfile,'AREA'+strr(curarea))
  70.   end;
  71.  
  72.   function sponsoron:boolean;
  73.   begin
  74.     sponsoron:=match(area.sponsor,unam) or issysop or (urec.udlevel>=sysoplevel);
  75.   end;
  76.  
  77. function convtime(blxs:integer):integer;
  78.  
  79. var c,d:integer;
  80.     e,f,k:real;
  81.     g:integer;
  82.  
  83. begin
  84. k:=(BLXS*1.0);
  85. c:=BAUDrate;
  86. e:=(c*0.8);
  87. c:=trunc(e);
  88. CONVTIME:=trunc (k/((e/10)*60)*128);
  89.  
  90. end;
  91.   function getapath:lstr;
  92.   var q,r:integer;
  93.       f:file;
  94.       b:boolean;
  95.       p:lstr;
  96.   begin
  97.     getapath:=area.xmodemdir;
  98.     repeat
  99.       writestr ('Upload path [CR for '+area.xmodemdir+']:');
  100.       if hungupon then exit;
  101.       if length(input)=0 then input:=area.xmodemdir;
  102.       p:=input;
  103.       if input[length(p)]<>'\' then p:=p+'\';
  104.       b:=true;
  105.       assign (f,p+'CON');
  106.       reset (f);
  107.       q:=ioresult;
  108.       close (f);
  109.       r:=ioresult;
  110.       if q<>0 then begin
  111.         writestr ('  Path doesn''t exist!  Create it? *');
  112.         b:=yes;
  113.         if b then begin
  114.           mkdir (copy(p,1,length(p)-1));
  115.           q:=ioresult;
  116.           b:=q=0;
  117.           if b
  118.             then writestr ('Directory created')
  119.             else writestr ('Unable to create directory')
  120.         end
  121.       end
  122.     until b;
  123.     getapath:=p
  124.   end;
  125.  
  126.   function makearea:boolean;
  127.   var num,n:integer;
  128.       a:arearec;
  129.   begin
  130.     makearea:=false;
  131.     num:=numareas+1;
  132.     n:=numareas;
  133.     writestr ('Create area '+strr(num)+' [Y/N]? *');
  134.     if yes then begin
  135.       writestr ('Area name:');
  136.       if length(input)=0 then exit;
  137.       a.name:=input;
  138.       writestr ('Access level:');
  139.       if length(input)=0 then exit;
  140.       a.level:=valu(input);
  141.       writestr ('Sponsor [CR for '+unam+']:');
  142.       if length(input)=0 then input:=unam;
  143.       a.sponsor:=input;
  144.       writestr ('Allow Uploads:');
  145.       a.upload:=yes;
  146.       a.xmodemdir:=getapath;
  147.       seekafile (num);
  148.       write (afile,a);
  149.       area:=a;
  150.       curarea:=num;
  151.       assignud;
  152.       rewrite (udfile);
  153.       writeln ('Area created');
  154.       makearea:=true;
  155.       writelog (15,4,a.name)
  156.     end
  157.   end;
  158.  
  159.   procedure setarea (n:integer);
  160.   begin
  161.     curarea:=n;
  162.     if (n>numareas) or (n<1) then begin
  163.       writeln (^B'No such area: ',n,'!');
  164.       if issysop
  165.         then if makearea
  166.           then setarea (curarea)
  167.           else setarea (1)
  168.         else setarea (1);
  169.       exit
  170.     end;
  171.     seekafile (n);
  172.     read (afile,area);
  173.     if (urec.udlevel<area.level) and (not issysop)
  174.       then if curarea=1
  175.         then error ('User can''t access first area','','')
  176.         else
  177.           begin
  178.             reqlevel (area.level);
  179.             setarea (1);
  180.             exit
  181.           end;
  182.     assignud;
  183.     close (udfile);
  184.     reset (udfile);
  185.     if ioresult<>0 then rewrite (udfile);
  186.     writeln (^B^M'File Area: [',curarea,']:[',area.name,']');
  187.     if sponsoron then writeln ('%: Sponsor commands');
  188.     writeln
  189.   end;
  190.  
  191.   procedure listareas;
  192.   var a:arearec;
  193.       cnt:integer;
  194.   begin
  195.     writehdr ('Area List');
  196.     seekafile (1);
  197.     writeln ('[Area]   [Level]      [Name]');
  198.     for cnt:=1 to numareas do begin
  199.       read (afile,a);
  200.       if a.level<=urec.udlevel
  201.         then begin
  202.         write ('[',cnt:2,']     [',a.level:5,']      ');
  203.         tab ('['+a.name,26);
  204.         writeln (']');
  205.         end;
  206.       if break then exit
  207.     end
  208.   end;
  209.  
  210.   function getareanum:integer;
  211.   var areastr:sstr;
  212.       areanum:integer;
  213.   begin
  214.     getareanum:=0;
  215.     if length(input)>1
  216.       then areastr:=copy(input,2,255)
  217.       else begin
  218.         listareas;
  219.         repeat
  220.           writestr (^M'Area # [?=list]:');
  221.           if input='?' then listareas else areastr:=input
  222.         until (input<>'?') or hungupon;
  223.         end;
  224.     if length(areastr)=0 then exit;
  225.     areanum:=valu(areastr);
  226.     if (areanum>0) and (areanum<=numareas)
  227.       then getareanum:=areanum
  228.       else begin
  229.         writestr ('No such area!');
  230.         if issysop then if makearea then getareanum:=numareas
  231.       end
  232.   end;
  233.  
  234.   procedure getarea;
  235.   var areanum:integer;
  236.   begin
  237.     areanum:=getareanum;
  238.     if areanum<>0 then setarea (areanum)
  239.   end;
  240.  
  241.  function getfname (path:lstr; name:mstr):lstr;
  242.   var l:lstr;
  243.   begin
  244.     l:=path;
  245.     if length(l)<>0
  246.       then if not (upcase(l[length(l)]) in [':','\'])
  247.         then l:=l+'\';
  248.     l:=l+name;
  249.     getfname:=l
  250.   end;
  251.  
  252.  
  253.  function searchforfile (f:sstr):integer;
  254.   var ud:udrec;
  255.       cnt:integer;
  256.   begin
  257.     for cnt:=1 to numuds do begin
  258.       seekudfile (cnt);
  259.       read (udfile,ud);
  260.       if match(ud.filename,f) then begin
  261.         searchforfile:=cnt;
  262.         exit
  263.       end
  264.     end;
  265.     searchforfile:=0
  266.   end;
  267.  
  268.  function nofiles:boolean;
  269.   begin
  270.     if numuds=0 then begin
  271.       nofiles:=true;
  272.       writestr (^M'Sorry, no files!')
  273.     end else nofiles:=false
  274.   end;
  275.  
  276.   procedure addfile (ud:udrec);
  277.   begin
  278.     seekudfile (numuds+1);
  279.     write (udfile,ud)
  280.   end;
  281.  
  282.    overlay procedure listfiles (uploader:boolean; n:integer);
  283.   var cnt,max,r1,r2:integer;
  284.  
  285.     procedure listfile (n:integer; uploader:boolean);
  286.     var ud:udrec;
  287.          q:sstr;
  288.   begin
  289.     seekudfile (n);
  290.     read (udfile,ud);
  291.     tab (strr(n)+'.',4);
  292.     if break then exit;
  293.     tab (ud.filename,14);
  294.     if break then exit;
  295.      if ud.newfile then
  296.      write ('New  ');
  297.      if ud.points>0
  298.           then tab (strr(ud.points),5)
  299.           else write ('Free ');
  300.     if break then exit;
  301.     if ud.specialfile
  302.         then tab ('Offline',10)
  303.       else if ud.sysfile then
  304.         tab ('SysOp',10)
  305.         else
  306.           if exist (ud.path+ud.filename) then tab (streal(ud.filesize),10) else
  307.         tab ('Offline',10);
  308.     if break then exit;
  309.     if uploader
  310.      then writeln (ud.sentby)
  311.       else writeln (ud.descrip)
  312.   end;
  313.  
  314.  
  315.  
  316.   begin
  317.     if nofiles then exit;
  318.     if n>0 then begin
  319.     listfile (n,uploader);
  320.     exit;
  321.     end;
  322.     writehdr ('File List'^M);
  323.     max:=numuds;
  324.     thereare (max,'file','files');
  325.     parserange (max,r1,r2);
  326.     if r1=0 then exit;
  327.     write ('#   ');
  328.     tab ('Filename',14);
  329.     write ('Pts. ');
  330.     tab ('Filesize',10);
  331.     if uploader then writeln ('Uploader') else writeln ('Description');
  332.     writeln ('[---------------------------------------------------------------------------]');
  333.     for cnt:=r1 to r2 do begin
  334.       listfile (cnt,uploader);
  335.       if break then exit
  336.     end
  337.   end;
  338.  
  339.   overlay function allowxfer:boolean;
  340.   var cnt:baudratetype;
  341.       k:char;
  342.   begin
  343.     allowxfer:=false;
  344.     if not carrier then begin
  345.       writeln ('You may only transfer from remote!');
  346.       exit
  347.     end;
  348.     for cnt:=firstbaud to lastbaud do
  349.       if baudrate=baudarray[cnt]
  350.         then if not (cnt in downloadrates)
  351.           then begin
  352.             writeln ('You may not transfer at ',baudrate,' baud.');
  353.             exit
  354.           end;
  355.     if parity then begin
  356.       writeln ('Please select NO parity and press return...');
  357.       parity:=false;
  358.       setparam (usecom,baudrate,parity);
  359.       repeat
  360.         k:=getchar;
  361.         if hungupon then exit
  362.       until k in [#13,#141];
  363.       if k=#141 then begin
  364.         parity:=true;
  365.         setparam (usecom,baudrate,parity);
  366.         writeln ('You did not turn off parity.  Transfer aborted.');
  367.         exit
  368.       end
  369.     end;
  370.     allowxfer:=true
  371.   end;
  372.  
  373.  
  374. overlay function wildcardmatch (w,f:sstr):boolean;
  375.   var a,b:sstr;
  376.  
  377.     procedure transform (t:sstr; var q:sstr);
  378.     var p:integer;
  379.  
  380.       procedure filluntil (k:char; n:integer);
  381.       begin
  382.         while length(q)<n do q:=q+k
  383.       end;
  384.  
  385.       procedure dopart (mx:integer);
  386.       var k:char;
  387.       begin
  388.         repeat
  389.           if p>length(t)
  390.             then k:='.'
  391.             else k:=t[p];
  392.           p:=p+1;
  393.           case k of
  394.             '.':begin
  395.                   filluntil (' ',mx);
  396.                   exit
  397.                 end;
  398.             '*':filluntil ('?',mx);
  399.             else if length(q)<mx then q:=q+k
  400.           end
  401.         until 0=1
  402.       end;
  403.  
  404.     begin
  405.       p:=1;
  406.       q:='';
  407.       dopart (8);
  408.       dopart (11)
  409.     end;
  410.  
  411.     function theymatch:boolean;
  412.     var cnt:integer;
  413.     begin
  414.       theymatch:=false;
  415.       for cnt:=1 to 11 do
  416.         if (a[cnt]<>'?') and (b[cnt]<>'?') and
  417.            (upcase(a[cnt])<>upcase(b[cnt])) then exit;
  418.       theymatch:=true
  419.     end;
  420.  
  421.   begin
  422.     transform (w,a);
  423.     transform (f,b);
  424.     wildcardmatch:=theymatch
  425.   end;
  426.  
  427.   overlay procedure directory;
  428.   type dosstr=array [1..100] of char;
  429.        ffinfotype=record
  430.          reserved:array [1..21] of byte;
  431.          attrib:byte;
  432.          time,date,fsizelow,fsizehi:integer;
  433.          name:dosstr
  434.        end;
  435.   var r:regs;
  436.       ffinfo:ffinfotype;
  437.  
  438.     function defaultdrive:byte;
  439.     var r:regs;
  440.     begin
  441.       r.ah:=$19;
  442.       intr ($21,r);
  443.       defaultdrive:=r.al+1
  444.     end;
  445.  
  446.   var tpath:anystr;
  447.       b:byte;
  448.       fname:sstr;
  449.       cnt:integer;
  450.  
  451.   begin
  452.     getdir (defaultdrive,tpath);
  453.     if tpath[length(tpath)]<>'\' then tpath:=tpath+'\';
  454.     tpath:=tpath+'*.*';
  455.     writestr ('Path/wildcard [CR for '+tpath+']:');
  456.     writeln (^M);
  457.     if length(input)<>0 then tpath:=input;
  458.     dos_shell ('dir '+tpath+' > temp.txt');
  459.     if exist ('temp.txt') then printfile ('temp.txt')
  460.     else writeln ('*> Shell Error. Code: ',shell_return_code,' <*');
  461.   end;
  462.  
  463.  
  464.  
  465.   overlay function doext (mode,proto:char;uddir,fn:lstr;baud,comm:integer):integer;
  466.   var cmdline,dirsave,cddir:anystr;
  467.       baudst,commst:mstr;
  468.       retcd:integer;
  469.   begin
  470.     getdir (0, dirsave);   (* drive: 0 = cur. 1 = A: etc. - save cur. dir. *)
  471.     cddir:=copy(uddir,1,length(uddir)-1);
  472.     chdir (cddir);                (* cd to rcv/snd dir *)
  473.     if mode='R' then begin        (* receive stuff *)
  474.       case proto of
  475.         'Z':cmdline:=dirsave+'\DSZ port '+strr(comm)+' speed '+strr(baud)+' restrict rz';
  476.         'W':cmdline:=dirsave+'\WXMODEM -b '+strr(baud)+' -l com'+strr(comm)+' -p W -r -f '+fn+' -c';
  477.         'S':cmdline:=dirsave+'\CLINK R';
  478.         'M':cmdline:=dirsave+'\MLINK PORT '+strr(comm)+' SPEED '+strr(baud)+' RM'
  479.       end
  480.     end;
  481.     if mode='S' then begin        (* xmit stuff *)
  482.       case proto of
  483.         'Z':cmdline:=dirsave+'\DSZ port '+strr(comm)+' speed '+strr(baud)+' sz '+fn;
  484.         'W':cmdline:=dirsave+'\WXMODEM -s -b '+strr(baud)+' -l com'+strr(comm)+' -p y -f '+fn;
  485.         'S':cmdline:=dirsave+'\CLINK T '+fn;
  486.         'M':cmdline:=dirsave+'\MLINK PORT '+strr(comm)+' SPEED '+strr(baud)+' SM '+fn
  487.       end
  488.     end;
  489.     dos_shell (cmdline);         (* actually do external call... *)
  490.     chdir (dirsave);                (* back from whence we came... *)
  491.     doext:=shell_return_code;
  492.   end;
  493.  
  494.   procedure getfsize (var ud:udrec);
  495.   var df:file of byte;
  496.   begin
  497.     ud.filesize:=-1;
  498.     assign (df,getfname(ud.path,ud.filename));
  499.     reset (df);
  500.     if ioresult<>0 then exit;
  501.     ud.filesize:=longfilesize(df);
  502.     close(df)
  503.   end;
  504.  
  505.  function getfilenum (t:mstr):integer;
  506.   var n,s:integer;
  507.   begin
  508.     getfilenum:=0;
  509.     if length(input)>1 then input:=copy(input,2,255) else
  510.       repeat
  511.         writestr ('File name/number to '+t+' [?=List]:');
  512.         if hungupon or (length(input)=0) then exit;
  513.         if input='?' then begin
  514.           listfiles (false,0);
  515.           input:=''
  516.         end
  517.       until input<>'';
  518.     val (input,n,s);
  519.     if s<>0 then begin
  520.       n:=searchforfile(input);
  521.       if n=0 then begin
  522.         writeln ('File not found.');
  523.         exit
  524.       end
  525.     end;
  526.     if (n<1) or (n>numuds)
  527.       then writeln ('File number out of range!')
  528.       else getfilenum:=n
  529.   end;
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  overlay procedure listarchive;
  536.   var n:integer;
  537.       ud:udrec;
  538.       f:file of byte;
  539.       fname:lstr;
  540.       b:byte;
  541.       sg:boolean;
  542.       size:real;
  543.  
  544.   label done;
  545.   begin
  546.     if nofiles then exit;
  547.     n:=getfilenum('list');
  548.     if n=0 then exit;
  549.     seekudfile (n);
  550.     read (udfile,ud);
  551.     fname:=getfname(ud.path,ud.filename);
  552.     dos_shell (arcview+' '+fname+' >temp.txt');
  553.     if exist ('temp.txt') then printfile ('temp.txt')
  554.     else writeln ('*> Archive View Error <*');
  555.   end;
  556.  
  557.  
  558.  
  559.   overlay procedure download (autoselect:integer);
  560.   var totaltime:sstr;
  561.       extra,num,fsize,mins:integer;
  562.       ud:udrec;
  563.       fname:lstr;
  564.       ymodem:boolean;
  565.       i,b:integer;
  566.       f:file;
  567.       extrnproto:char;
  568.       x1,x2,x3:integer;
  569.       y1,y2,y3:real;
  570.  
  571.  
  572.  
  573.   begin
  574.   if not allowxfer then exit;
  575. x1:=urec.uploads;
  576. x2:=urec.downloads;
  577. if x1<1 then x1:=1;
  578. if x2<1 then x2:=1;
  579.    y1:=int(x1);
  580.    y2:=int(x2);
  581.    y1:=y1;
  582.    y2:=y2;
  583.  
  584.    y3:=y1/y2;
  585.    Y3:=Y3*100;
  586.   x3:=trunc(y3);
  587.  
  588. if udratio >0 then
  589.   if (X3<udratio) and not issysop and (ulvl<nopcr) then begin
  590.   dontstop:=true;
  591.   nobreak:=true;
  592.   if exist (textfiledir+'udratio') then printfile (textfiledir+'udratio') else begin
  593.   writeln (^T'          *> Upload/Download Ratio <*');
  594.   writeln ('      You''ve uploaded ',urec.uploads,' files');
  595.   writeln ('      And have downloaded ',urec.downloads,' files.');
  596.   writeln ('      You have a ',x3,'% ratio now.');
  597.   writeln ('      Minimum Ratio is ',udratio,'%.');
  598.   Writeln (^M' Your Upload/Download ratio is too low,Post a message or two!');
  599.   end;
  600.   exit;
  601.   end;
  602.     if nofiles then exit;
  603.     if autoselect=0
  604.       then num:=getfilenum('download')
  605.       else num:=autoselect;
  606.     if num=0 then exit;
  607.     writeln;
  608.     seekudfile (num);
  609.     read (udfile,ud);
  610.     if (not sponsoron) and (ud.points>urec.udpoints) then begin
  611.       writeln ('*> Not enough file points <*');
  612.       exit
  613.     end;
  614.     if (ud.newfile) and (not sponsoron) then begin
  615.       writeln ('*> Un-Validated File <*');
  616.       exit
  617.     end;
  618.     if (ud.specialfile) and (not sponsoron) then begin
  619.       writeln ('*> File Offline. Request using [F] command <*');
  620.       exit
  621.     end;
  622.     if (ud.sysfile) and (not sponsoron) then begin
  623.       writeln ('*> Must be a SysOp/Sponsor to download <*');
  624.       exit
  625.     end;
  626.     if not exist (ud.path+ud.filename) then begin
  627.       writeln ('*> Error: File Offline. Inform Sysop <*');
  628.       exit
  629.     end;
  630.     if tempsysop then begin
  631.       ulvl:=regularlevel;
  632.       tempsysop:=false;
  633.       writeurec;
  634.       bottomline
  635.     end;
  636.     ymodem:=false;
  637.     extrnproto:='N';
  638.     i:=menu('Protocol','PROTO','XYZBWMSQ');
  639.     if hungupon then exit;
  640.     case i of
  641.       1:ymodem:=false;
  642.       2:ymodem:=true;
  643.       3:extrnproto:='Z';
  644.       4:;(***
  645.       begin
  646.           extrnproto:='B';
  647.           ymodem:=true end
  648.           ***)
  649.       5:extrnproto:='W';
  650.       6:extrnproto:='M';
  651.       7:extrnproto:='S';
  652.       8:exit;
  653.     end;
  654.     fname:=getfname(ud.path,ud.filename);
  655.     assign (f,fname);
  656.     reset (f);
  657.     iocode:=ioresult;
  658.     if iocode<>0 then
  659.       begin
  660.         fileerror ('DOWNLOAD',fname);
  661.         exit
  662.       end;
  663.     fsize:=filesize(f);
  664.     close (f);
  665.     totaltime:=minstr(fsize);
  666.     mins:=valu(copy(totaltime,1,pos(':',totaltime)));
  667.     extra:=convtime(fsize);
  668. if (extra  > timeleft) and (not sponsoron) then begin
  669.       writeln ('*> Not Enough Time Left <*');
  670.       exit
  671.     end;
  672.     writeln (^B^M'*> Filename:       '^S,'[',ud.filename,']');
  673.     writeln     ('*> Uploaded by:    '^S,'[',ud.sentby,']');
  674.     write       ('*> Downloaded:     '^S,'[',ud.downloaded,' time');
  675.     if ud.downloaded=1 then writeln (']') else writeln ('s]');
  676.     if ymodem then fsize:=(fsize+7) div 8;
  677.     if (extrnproto='Z') and (baudrate=2400) then fsize:=fsize div 4;
  678.     if (extrnproto='Z') and (baudrate=1200) then fsize:=fsize div 2;
  679.     if (extrnproto='M') then fsize:=fsize div 4;
  680.     if fsize = 0 then fsize:= 1;
  681.     writeln ('*> Blocks to send:'^S,' [',fsize,']');
  682.     writeln ('*> Transfer time: '^S,' [',totaltime,']');
  683.     writeln (^M'*> CRC use will be automatically selected <*');
  684.     writeln (^B'*>  Press [Ctrl-X] to abort the transfer  <*'^B);
  685.     if extrnproto='N' then begin
  686.       b:=protocolxfer (true,false,ymodem,fname);
  687.       beepbeep (b)
  688.     end;
  689.     if extrnproto<>'N' then begin
  690.       b:=doext('S',extrnproto,ud.path,ud.filename,baudrate,usecom);
  691.       if b<>0 then b:=2;
  692.       modeminlock:=false;
  693.       beepbeep (b)
  694.     end;
  695.     if (b=0) or (b=1) then begin
  696.       writelog (15,1,fname);
  697.       ud.downloaded:=ud.downloaded+1;
  698.       urec.downloads:=urec.downloads+1;
  699.       seekudfile (num);
  700.       write (udfile,ud);
  701.       if (ud.points>0) and (not sponsoron) then begin
  702.         urec.udpoints:=urec.udpoints-ud.points;
  703.         writeln (^B'You now have ',
  704.                  numthings (urec.udpoints,'point','points'),'.')
  705.       end;
  706.       writeurec
  707.     end
  708.   end;
  709.  
  710.  
  711.   overlay procedure upload;
  712.   var ud:udrec;
  713.       ok,crcmode,ymodem:boolean;
  714.       i,b,sm,fd:integer;
  715.       fn,sf:lstr;
  716.       extrnproto:char;
  717.  
  718.   begin
  719.     if not allowxfer then exit;
  720.     ok:=false;
  721.     write ('Free disk space: ');
  722.     writefreespace (area.xmodemdir);
  723.     writeln;
  724.     repeat
  725.       writestr ('Target filename:');
  726.       if length(input)=0 then exit;
  727.       if not validfname(input) then begin
  728.         writeln ('Invalid filename!');
  729.         exit
  730.       end;
  731.       ud.filename:=input;
  732.       ud.path:=area.xmodemdir;
  733.       fn:=getfname(ud.path,ud.filename);
  734.       if hungupon then exit;
  735.       if exist(fn)
  736.         then writeln ('Sorry!  File exists!')
  737.         else ok:=true
  738.     until ok;
  739.     writestr ('Description of File: &');
  740.     ud.descrip:=input;
  741.     crcmode:=false;
  742.     ymodem:=false;
  743.     extrnproto:='N';
  744.     i:=menu('Protocol','PROTO','XYZBWMSQ');
  745.     if hungupon then exit;
  746.     case i of
  747.       1:ymodem:=false;
  748.       2:ymodem:=true;
  749.       3:extrnproto:='Z';
  750.       4:;(*** begin
  751.           extrnproto:='B';
  752.           ymodem:=true;
  753.         end;
  754.         ***)
  755.       5:extrnproto:='W';
  756.       6:extrnproto:='M';
  757.       7:extrnproto:='S';
  758.       8:exit;
  759.     end;
  760.     if extrnproto='N' then if ymodem then crcmode:=true else begin
  761.       writestr ('CRC Mode? *');
  762.       crcmode:=yes
  763.     end;
  764.     write (^B^M);
  765.     write ('*> ');
  766.     if extrnproto='Z' then write ('Z');
  767.     if extrnproto='W' then write ('WX');
  768.     if ymodem then write ('Y') else if extrnproto='N' then write ('X');
  769.     case extrnproto of
  770.       'M':write ('MegaLink');
  771.       'S':write ('SEALink');
  772.       else write ('modem')
  773.     end;
  774.     if crcmode then write ('-CRC');
  775.     if extrnproto='B' then write ('-Batch');
  776.     writeln (' receive ready.  Press [Ctrl-X] to abort <*');
  777.     if tempsysop then begin
  778.       ulvl:=regularlevel;
  779.       tempsysop:=false;
  780.       writeurec;
  781.       bottomline
  782.     end;
  783.     sf:=timestr;
  784.     sm:=timeval(sf);
  785.     if extrnproto='N' then begin
  786.       b:=protocolxfer (false,crcmode,ymodem,fn);
  787.       beepbeep (b)
  788.     end;
  789.     if extrnproto<>'N' then begin
  790.       b:=doext('R',extrnproto,ud.path,ud.filename,baudrate,usecom);
  791.       modeminlock:=false;
  792.       modemoutlock:=false;
  793.       beepbeep (b)
  794.     end;
  795.     sf:=timestr;
  796.     fd:=timeval(sf);
  797.     if b=0 then begin
  798.       writelog (15,2,ud.filename);
  799.       buflen:=40;
  800.       if fd>sm then urec.timetoday:=urec.timetoday+(fd-sm);
  801.       if sm>fd then urec.timetoday:=urec.timetoday+10;
  802.       ud.sentby:=unam;
  803.       ud.sentda:=datestr;
  804.       ud.sentti:=timestr;
  805.       ud.points:=0;
  806.       ud.downloaded:=0;
  807.       ud.newfile:=true;
  808.       ud.specialfile:=false;
  809.       ud.sysfile:=false;
  810.       ud.downloaded:=0;
  811.       writeln ('Thanks for uploading!');
  812.       getfsize (ud);
  813.       addfile (ud);
  814.       urec.uploads:=urec.uploads+1;
  815.       newuploads:=newuploads+1;
  816.       writestatus;
  817.     end
  818.   end;
  819.  
  820.       Overlay procedure SortArea;
  821.     var Recs:Array [1..1000] of String[15];
  822.         LastPos:Array [1..1000] of Integer;
  823.         Swap:String[15];
  824.         U:UDRec;
  825.         OldUDFile,NewUDFile:File of UDRec;
  826.         Cnt,Cnt2,Swap2:Integer;
  827.  
  828.       Function Nums:Integer;
  829.       begin
  830.         Nums:=FileSize(OldUDFile);
  831.       end;
  832.  
  833.     begin
  834.       Close(UDFile);
  835.       writeln;
  836.       writestr('Sort area? *');
  837.       if not yes then exit;
  838.       Assign(OldUDFile,'Area'+strr(curarea));
  839.       Assign(NewUDFile,'Area'+strr(Curarea)+'.New');
  840.       if Nums>1000 then begin
  841.         writeln('Sorry.. Too many files..');
  842.         exit;
  843.       end;
  844.       reset(OldUDFile);
  845.       For Cnt:=1 to Nums do begin
  846.         Seek(OldUDFile,Cnt-1);
  847.         read(OldUDFile,U);
  848.         Recs[Cnt]:=U.Filename;
  849.         LastPos[Cnt]:=Cnt;
  850.       end;
  851.       For Cnt:=1 to Nums-1 do
  852.         For Cnt2:=Cnt+1 to Nums do begin
  853.           if upstring(Recs[Cnt])>upstring(Recs[Cnt2]) then begin
  854.           Swap:=Recs[Cnt];
  855.           Swap2:=LastPos[Cnt];
  856.           Recs[Cnt]:=Recs[Cnt2];
  857.           LastPos[Cnt]:=LastPos[Cnt2];
  858.           Recs[Cnt2]:=Swap;
  859.           LastPos[Cnt2]:=Swap2;
  860.         end;
  861.       end;
  862.     Close(OldUDFile);
  863.     Reset(OldUDFile);
  864.     Rewrite(NewUDFile);
  865.     For Cnt:=1 to Nums do begin
  866.       seek(OldUDFile,LastPos[Cnt]-1);
  867.       read(OldUDFile,U);
  868.       seek(NewUDFile,Cnt-1);
  869.       write(NewUDFile,U);
  870.     end;
  871.     close(NewUDFile);
  872.     close(OldUDFile);
  873.     erase(OldUDFile);
  874.     rename(NewUDFile,'Area'+Strr(Curarea)+'.');
  875.     writeln;
  876.     writeln('Sort complete.');
  877.     reset(UDFile);
  878.   end;
  879.  
  880.  
  881.  
  882.  
  883.  
  884.  
  885.   overlay procedure yourudstatus(a:integer; heh:boolean);
  886.   var x1,x2,x3:integer;
  887.       y1,y2,y3:real;
  888.  
  889.  
  890.  
  891.   begin
  892.  
  893.    if (not heh) or (not ansi) or (not urec.windows) then begin
  894.     writeln (^B^M'Access level:    '^S,urec.udlevel,
  895.                ^M'Transfer points: '^S,urec.udpoints,
  896.                ^M'Uploads:         '^S,urec.uploads,
  897.                ^M'Downloads:       '^S,urec.downloads);
  898.     exit;
  899.   end;
  900.  
  901.   windowit (30,8,6,2);
  902.   movexy (10,3);
  903.   writeln ('File Transfer Section');
  904.   movexy (8,5);
  905.   writeln ('Current Xfer Level: '^S,urec.udlevel);
  906.   movexy (15,6);
  907.   writeln ('Xfer Points: '^S,urec.udpoints);
  908.   movexy (19,7);
  909.   writeln ('Uploads: '^S,urec.uploads);
  910.   movexy (17,8);
  911.   writeln ('Downloads: '^S,urec.downloads);
  912.   windowit (28,6,33,7);
  913.   movexy (43,8);
  914.   writeln ('# of Calls: '^S,urec.numon);
  915.   movexy (43,9);
  916.   writeln ('# of Posts: '^S,urec.nbu);
  917.   movexy (36,10);
  918.   writeln ('Current P/C Ratio: '^S,a,'%');
  919.   movexy (36,11);
  920.   writeln ('Minimum P/C Ratio: '^S,xferratio,'%');
  921.   windowit (32,4,37,3);
  922.   movexy (39,4);
  923. x1:=urec.uploads;
  924. x2:=urec.downloads;
  925. if x1<1 then x1:=1;
  926. if x2<1 then x2:=1;
  927.    y1:=int(x1);
  928.    y2:=int(x2);
  929.    y1:=y1;
  930.    y2:=y2;
  931.  
  932.    y3:=y1/y2;
  933.    Y3:=Y3*100;
  934.   x3:=trunc(y3);
  935.   writeln ('Current U/L D/L Ratio: '^S,x3,'%');
  936.   movexy (39,5);
  937.   writeln ('Minimum U/L D/L Ratio: '^S,udratio,'%');
  938.   movexy (1,14);
  939.   end;
  940.  
  941.  
  942.  
  943.   overlay procedure searchfile;
  944.   var cnt:integer;
  945.       searchall:boolean;
  946.       wildcard:sstr;
  947.       a:arearec;
  948.  
  949.     procedure searcharea;
  950.     var cnt:integer;
  951.         u:udrec;
  952.     begin
  953.       for cnt:=1 to numuds do begin
  954.         seekudfile (cnt);
  955.         read (udfile,u);
  956.         if wildcardmatch (wildcard,u.filename) then listfiles (false,cnt)
  957.       end
  958.     end;
  959.  
  960.   begin
  961.     writestr (^M'Search all areas? *');
  962.     searchall:=yes;
  963.     writestr ('File name (wildcards OK):');
  964.     if length(input)=0 then exit;
  965.     wildcard:=input;
  966.     if not searchall then begin
  967.       searcharea;
  968.       exit
  969.     end;
  970.     for cnt:=1 to numareas do begin
  971.       seekafile (cnt);
  972.       read (afile,a);
  973.       if urec.udlevel>=a.level then begin
  974.         setarea (cnt);
  975.         searcharea
  976.       end
  977.     end
  978.   end;
  979.  
  980.   overlay procedure sysopcommands;
  981.  
  982.     procedure getstr (t:lstr; var m);
  983.     var q:lstr absolute m;
  984.         mm:lstr;
  985.     begin
  986.       writeln ('Old ',t,': ',q);
  987.       writestr ('Enter new '+t+' [CR for no change]:');
  988.       mm:=input;
  989.       if length(mm)<>0 then q:=mm;
  990.       writeln
  991.     end;
  992.  
  993.     procedure getint (t:lstr; var i:integer);
  994.     var s:sstr;
  995.     begin
  996.       s:=strr(i);
  997.       getstr (t,s);
  998.       i:=valu(s)
  999.     end;
  1000.  
  1001.     procedure getboo (t:lstr; var b:boolean);
  1002.     var s:sstr;
  1003.     begin
  1004.       s:=yesno (b);
  1005.       getstr (t,s);
  1006.       b:=upcase(s[1])='Y'
  1007.     end;
  1008.  
  1009.     procedure removefile (n:integer);
  1010.     var cnt:integer;
  1011.     begin
  1012.       for cnt:=n to numuds-1 do begin
  1013.         seekudfile (cnt+1);
  1014.         read (udfile,ud);
  1015.         seekudfile (cnt);
  1016.         write (udfile,ud)
  1017.       end;
  1018.       seekudfile (numuds);
  1019.       truncate (udfile)
  1020.     end;
  1021.  
  1022.     procedure sysopadd;
  1023.     var ud:udrec;
  1024.         fn:lstr;
  1025.     begin
  1026.       writehdr ('Add Resident File');
  1027.       buflen:=12;
  1028.       writestr ('Name of file:');
  1029.       if length(input)=0 then exit;
  1030.       ud.filename:=input;
  1031.       writestr ('        Path:');
  1032.       if length(input)=0 then exit;
  1033.       ud.path:=input;
  1034.       if ud.path[length(ud.path)]<>'\' then ud.path:=ud.path+'\';
  1035.       fn:=getfname(ud.path,ud.filename);
  1036.       writestr ('Confirm: '+fn+' (Y/N):');
  1037.       if not yes then exit;
  1038.       getfsize(ud);
  1039.       if ud.filesize=-1 then begin
  1040.         writeln ('File can''t be opened!');
  1041.       end;
  1042.       writestr ('Point value:');
  1043.       if length(input)=0 then input:='0';
  1044.       ud.points:=valu(input);
  1045.       writestr ('Sent by [CR='+unam+']:');
  1046.       if length(input)=0 then input:=unam;
  1047.       ud.sentby:=input;
  1048.       ud.sentda:=datestr;
  1049.       ud.sentti:=timestr;
  1050.       ud.downloaded:=0;
  1051.       writestr ('Description: &');
  1052.       ud.descrip:=input;
  1053.       writestr ('Special request only? *');
  1054.       ud.specialfile:=yes;
  1055.       writestr ('Sysop File? *');
  1056.       ud.sysfile:=yes;
  1057.       ud.newfile:=false;
  1058.       addfile (ud);
  1059.       writelog (16,8,fn)
  1060.     end;
  1061.  
  1062.     procedure changef;
  1063.     var n:integer;
  1064.         ud:udrec;
  1065.     begin
  1066.       n:=getfilenum ('Change');
  1067.       if n=0 then exit;
  1068.       seekudfile (n);
  1069.       read (udfile,ud);
  1070.       writelog (16,4,ud.filename);
  1071.       getstr ('filename',ud.filename);
  1072.       getstr ('path',ud.path);
  1073.       getfsize(ud);
  1074.       if ud.filesize=-1 then writestr ('Warning:  Can''t open file!');
  1075.       getint ('points',ud.points);
  1076.       getstr ('uploader',ud.sentby);
  1077.       getstr ('time sent',ud.sentti);
  1078.       getstr ('date sent',ud.sentda);
  1079.       nochain:=true;
  1080.       getstr ('description',ud.descrip);
  1081.       getboo ('special request only',ud.specialfile);
  1082.       getboo ('sysop file',ud.sysfile);
  1083.       getboo ('new file (unrated)',ud.newfile);
  1084.       seekudfile (n);
  1085.       write (udfile,ud)
  1086.     end;
  1087.  
  1088.     procedure deletef;
  1089.     var n,cnt:integer;
  1090.         fn:lstr;
  1091.         ud:udrec;
  1092.         f:file;
  1093.     begin
  1094.       n:=getfilenum ('delete');
  1095.       if n=0 then exit;
  1096.       seekudfile (n);
  1097.       read (udfile,ud);
  1098.       fn:=getfname(ud.path,ud.filename);
  1099.       writelog (16,7,fn);
  1100.       writestr ('Confirm: File '+fn+' ('+ud.descrip+') ? *');
  1101.       if not yes then exit;
  1102.       removefile (n);
  1103.       writestr ('Erase disk file '+fn+'? *');
  1104.       if not yes then exit;
  1105.       assign (f,fn);
  1106.       erase (f)
  1107.     end;
  1108.  
  1109.     procedure killarea;
  1110.     var a:arearec;
  1111.         cnt,n:integer;
  1112.         oldname,newname:sstr;
  1113.     begin
  1114.       writestr ('Delete area #'+strr(curarea)+' ('+area.name+')? *');
  1115.       if not yes then exit;
  1116.       writelog (16,2,'');
  1117.       close (udfile);
  1118.       oldname:='Area'+strr(curarea);
  1119.       assign (udfile,oldname);
  1120.       erase (udfile);
  1121.       for cnt:=curarea to numareas-1 do begin
  1122.         newname:=oldname;
  1123.         oldname:='Area'+strr(cnt+1);
  1124.         assign (udfile,oldname);
  1125.         rename (udfile,newname);
  1126.         n:=ioresult;
  1127.         seekafile (cnt+1);
  1128.         read (afile,a);
  1129.         seekafile (cnt);
  1130.         write (afile,a)
  1131.       end;
  1132.       seekafile (numareas);
  1133.       truncate (afile);
  1134.       setarea (1)
  1135.     end;
  1136.  
  1137.     procedure modarea;
  1138.     var a:arearec;
  1139.     begin
  1140.       a:=area;
  1141.       getstr ('area name',a.name);
  1142.       writelog (16,3,a.name);
  1143.       getint ('access level',a.level);
  1144.       writelog (16,11,strr(a.level));
  1145.       getstr ('sponsor',a.sponsor);
  1146.       writelog (16,12,a.sponsor);
  1147.       getboo ('allow uploads',a.upload);
  1148.       if issysop then begin
  1149.         a.xmodemdir:=getapath;
  1150.         writelog (16,13,a.xmodemdir)
  1151.       end;
  1152.       seekafile (curarea);
  1153.       write (afile,a);
  1154.       area:=a
  1155.     end;
  1156.  
  1157.     procedure newfiles (makelist:boolean);
  1158.     var a,fn,p,un:integer;
  1159.         ud:udrec;
  1160.         u:userrec;
  1161.         flag:boolean;
  1162.         other:integer;
  1163.  
  1164.       procedure doarea;
  1165.       begin
  1166.         for fn:=1 to numuds do begin
  1167.           seekudfile (fn);
  1168.           read (udfile,ud);
  1169.           if ud.newfile then begin
  1170.             flag:=false;
  1171.             listfiles (false,fn);
  1172.             if true then begin
  1173.               writestr (^M'How many points for '+ud.filename+' [CR to continue]: @');
  1174.               if length(input)<>0 then begin
  1175.                 p:=valu(input);
  1176.                 ud.points:=p;
  1177.                 ud.newfile:=false;
  1178.                 seekudfile (fn);
  1179.                 write (udfile,ud);
  1180.                 p:=p*uploadfactor;
  1181.                 if p>0 then begin
  1182.                   un:=lookupuser (ud.sentby);
  1183.                   if un=0
  1184.                     then writeln (ud.sentby,' has vanished!')
  1185.                     else begin
  1186.                 writestr ('Points to grant '+ud.sentby+' [CR for '+strr(p)+']: @');
  1187.                       if (length(input)>0) then p:=valu(input);
  1188.                       writeln (^M'Granting ',ud.sentby,' ',p,' points.');
  1189.                       if un=unum then writeurec;
  1190.                       seek (ufile,un);
  1191.                       read (ufile,u);
  1192.                       u.udpoints:=u.udpoints+p;
  1193.                       seek (ufile,un);
  1194.                       write (ufile,u);
  1195.                       if un=unum then readurec
  1196.                     end
  1197.                 end
  1198.               end
  1199.             end
  1200.           end
  1201.         end
  1202.       end;
  1203.  
  1204.     label exit;
  1205.     begin
  1206.       flag:=true;
  1207.       writelog (16,1,'');
  1208.       if issysop then begin
  1209.         writestr ('Scan all areas? *');
  1210.         if yes then begin
  1211.           for a:=1 to numareas do begin
  1212.             setarea (a);
  1213.             doarea
  1214.           end;
  1215.           goto exit
  1216.         end
  1217.       end;
  1218.       doarea;
  1219.       exit:
  1220.       if flag then writeln (^B'No new files.')
  1221.     end;
  1222.  
  1223.  
  1224.  
  1225.  
  1226.  
  1227.  
  1228.     procedure movefile;
  1229.     var an,fn,oldn:integer;
  1230.         ud:udrec;
  1231.     begin
  1232.       oldn:=curarea;
  1233.       fn:=getfilenum ('move');
  1234.       if fn=0 then exit;
  1235.       input:='';
  1236.       an:=getareanum;
  1237.       if an=0 then exit;
  1238.       writeln ('Moving...');
  1239.       seekudfile (fn);
  1240.       read (udfile,ud);
  1241.       writelog (16,5,ud.filename);
  1242.       removefile (fn);
  1243.       setarea (an);
  1244.       addfile (ud);
  1245.       setarea (oldn);
  1246.       writeln (^B'Done.')
  1247.     end;
  1248.  
  1249.     procedure reorderareas;
  1250.     var numa,cura,newa:integer;
  1251.         a1,a2:arearec;
  1252.         f1,f2:file;
  1253.         fn1,fn2:sstr;
  1254.     label exit;
  1255.     begin
  1256.       writelog (16,9,'');
  1257.       writehdr ('Re-order Areas');
  1258.       numa:=filesize (afile);
  1259.       writeln ('Number of areas: ',numa);
  1260.       for cura:=0 to numa-2 do begin
  1261.         repeat
  1262.           writestr ('New area #'+strr(cura+1)+' [?=List, CR to quit]:');
  1263.           if length(input)=0 then goto exit;
  1264.           if input='?'
  1265.             then
  1266.               begin
  1267.                 listareas;
  1268.                 newa:=-1
  1269.               end
  1270.             else
  1271.               begin
  1272.                 newa:=valu(input)-1;
  1273.                 if (newa<0) or (newa>=numa) then begin
  1274.                   writeln ('Not found!  Please re-enter...');
  1275.                   newa:=-1
  1276.                 end
  1277.               end
  1278.         until (newa>0);
  1279.         seek (afile,cura);
  1280.         read (afile,a1);
  1281.         seek (afile,newa);
  1282.         read (afile,a2);
  1283.         seek (afile,cura);
  1284.         write (afile,a2);
  1285.         seek (afile,newa);
  1286.         write (afile,a1);
  1287.         fn1:='Area';
  1288.         fn2:=fn1+strr(newa+1);
  1289.         fn1:=fn1+strr(cura+1);
  1290.         assign (f1,fn1);
  1291.         assign (f2,fn2);
  1292.         rename (f1,'Temp$$$$');
  1293.         rename (f2,fn1);
  1294.         rename (f1,fn2)
  1295.       end;
  1296.       exit:
  1297.       setarea (1)
  1298.     end;
  1299.  
  1300.   var i:integer;
  1301.   begin
  1302.     if not sponsoron then begin
  1303.       reqlevel (sysoplevel);
  1304.       exit
  1305.     end;
  1306.     writelog (15,3,area.name);
  1307.     repeat
  1308.       i:=menu('File sponsor','FSYSOP','A@CDF@G@KRNSMLO@Q');
  1309.       case i of
  1310.         1:sysopadd;
  1311.         2:changef;
  1312.         3:deletef;
  1313.         4:directory;
  1314. {        5:generatelist; }
  1315.         6:killarea;
  1316.         7:modarea;
  1317.         8:newfiles (false);
  1318.         9:sortarea;
  1319.         10:movefile;
  1320.         11:;
  1321.         12:reorderareas
  1322.       end
  1323.     until hungupon or (i=13)
  1324.   end;
  1325.  
  1326.  
  1327.  
  1328.   const beenaborted:boolean=false;
  1329.  
  1330.   function aborted:boolean;
  1331.   begin
  1332.     if beenaborted then begin
  1333.       aborted:=true;
  1334.       exit
  1335.     end;
  1336.     aborted:=xpressed or hungupon;
  1337.     if xpressed then begin
  1338.       beenaborted:=true;
  1339.       writeln (^B'Newscan aborted!')
  1340.     end
  1341.   end;
  1342.  
  1343.   procedure newscan;
  1344.   var cnt:integer;
  1345.       u:udrec;
  1346.       first:integer;
  1347.   label notlater;
  1348.   begin
  1349.     beenaborted:=false;
  1350.     first:=0;
  1351.     for cnt:=filesize(udfile) downto 1 do begin
  1352.       seekudfile (cnt);
  1353.       read (udfile,u);
  1354.       if later (u.sentda,u.sentti,lastonda,lastonti)
  1355.         then first:=cnt
  1356.         else goto notlater
  1357.     end;
  1358.     notlater:
  1359.     if first<>0
  1360.       then for cnt:=first to filesize(udfile) do begin
  1361.         if aborted then exit;
  1362.         listfiles (false,cnt)
  1363.       end
  1364.   end;
  1365.  
  1366.   procedure newscanall;
  1367.   var cnt:integer;
  1368.       a:arearec;
  1369.   begin
  1370.     writehdr ('Newscanning... press [X] to abort.');
  1371.     if aborted then exit;
  1372.     for cnt:=1 to filesize(afile) do begin
  1373.       seekafile (cnt);
  1374.       read (afile,a);
  1375.       if urec.udlevel>=a.level then begin
  1376.         if aborted then exit;
  1377.         setarea (cnt);
  1378.         if aborted then exit;
  1379.         newscan
  1380.       end;
  1381.       if aborted then exit
  1382.     end
  1383.   end;
  1384.  
  1385. var prompt:lstr;
  1386.     n:integer;
  1387.     k:char;
  1388.     x1,x2,x3,i:integer;
  1389.     y1,y2,y3:real;
  1390.     q1:mstr;
  1391.     a:arearec;
  1392.     ms:boolean;
  1393.     dammit:boolean;
  1394.  
  1395. label ok,exit;
  1396. begin
  1397. dammit:=false;
  1398. x1:=urec.nbu;
  1399. x2:=urec.numon;
  1400. if x1<1 then x1:=1;
  1401. if x2<1 then x2:=1;
  1402.    y1:=int(x1);
  1403.    y2:=int(x2);
  1404.    y1:=y1;
  1405.    y2:=y2;
  1406.  
  1407.    y3:=y1/y2;
  1408.    Y3:=Y3*100;
  1409.   x3:=trunc(y3);
  1410.  
  1411.     IF ANSI THEN ANSICLS;
  1412. if xferratio >0 then
  1413.   if (X3<xferratio) and not issysop and (ulvl<nopcr) then begin
  1414.   dontstop:=true;
  1415.   nobreak:=true;
  1416.   if exist (textfiledir+'XFratio') then printfile (textfiledir+'XFratio') else begin
  1417.   writeln (^T'          *> Post/Call Ratio <*');
  1418.   writeln ('      You''ve posted ',urec.nbu,' messages');
  1419.   writeln ('      And have called ',urec.numon,' times.');
  1420.   writeln ('      You have a ',x3,'% ratio now.');
  1421.   writeln ('      Minimum Ratio is ',xferratio,'%.');
  1422.  
  1423.   Writeln (^M' Your Posts/Call ratio is too low,Post a message or two!');
  1424.   end;
  1425.   dammit:=true;
  1426.   end;
  1427.   if dammit then goto exit;
  1428.   cursection:=udsysop;
  1429.   ms:=false;
  1430.   if (not urec.windows) or (not ansi) then writeln   ('       *> File Transfer Section <*');
  1431.   input:='';
  1432.   assign (afile,'areadir');
  1433.   if exist ('Areadir')
  1434.     then
  1435.       begin
  1436.         reset (afile);
  1437.         if filesize (afile)>0 then goto ok
  1438.       end
  1439.     else rewrite (afile);
  1440.     writeln ('No areas have been defined!');
  1441.   area.xmodemdir:=forumdir+'XMODEM\';
  1442.   if issysop
  1443.     then if makearea
  1444.       then goto ok;
  1445.   goto exit;
  1446.   ok:
  1447.   seekafile (1);
  1448.   read (afile,a);
  1449.   if urec.udlevel<a.level then begin
  1450.     writeln ('*> Access level too low <*');
  1451.     goto exit
  1452.   end;
  1453.   yourudstatus(x3,true);
  1454.   setarea (1);
  1455.   repeat
  1456.     if not withintime (xmodemopentime,xmodemclosetime) then
  1457.       if not issysop then begin
  1458.         writestr (^M^M'Sorry, the Transfer section is closed now!');
  1459.         writeln ('The time now is: '^S,timestr);
  1460.         writeln ('It will open at: '^S,xmodemopentime);
  1461.         goto exit
  1462.       end else if not ms then begin
  1463.         writeln ('(The Transfer section is closed until ',xmodemopentime,')');
  1464.         ms:=true
  1465.       end;
  1466.     write (^B^M^M,'[',curarea,'] [',area.name,']'^B);
  1467.     i:=menu('File','FILE','UDLFYA*SQ%NVHRW_');
  1468.     if hungupon then goto exit;
  1469.     case i of
  1470.       1:if area.upload then upload else
  1471.         Writeln ('*> Uploads not allowed in this area <*');
  1472.       2:download (0);
  1473.       3:listfiles (false,0);
  1474.       4:sendmailto (area.sponsor,false);
  1475.       5:yourudstatus(0,false);
  1476.       6,7:getarea;
  1477.       8:searchfile;
  1478.       10:sysopcommands;
  1479.       11:newscanall;
  1480.       12:newscan;
  1481.       13:;
  1482.       14:listarchive;
  1483.       15:listfiles (true,0);
  1484.       16:;
  1485.     end
  1486.   until hungupon or (i=9);
  1487.   exit:
  1488.   close (afile);
  1489.   close (udfile);
  1490.   i:=ioresult
  1491. end;
  1492.  
  1493.