home *** CD-ROM | disk | FTP | other *** search
/ PD ROM 1 / PD ROM Volume I - Macintosh Software from BMUG (1988).iso / Programming / Complete Applications / Telecom / MT Special 3 / TEXT / WWIV MODS.TXT
Encoding:
Text File  |  1987-01-13  |  27.1 KB  |  779 lines  |  [TEXT/ttxt]

  1. WWIVMOD1.TXT
  2.  
  3. Copyright (c) 1986, Mark Pinkstone.  May be distributed freely, with the sole
  4. exception that the file may NOT be posted to a CompuServe software library 
  5. (where subsequent distribution would be prohibited by the CIS "media 
  6. copyright").
  7.  
  8. Additional cautions...
  9. ----------------------
  10. These modifications are provided as tools for the individual WWIV SysOp ONLY!
  11. Public distribution of the resultant modified WWIV source code, or posting 
  12. and distribution of a compiled and modified version of WWIV is prohibited by 
  13. WWIV's copyright.  Respect the original author's skills - change the programs 
  14. for YOUR use only!
  15.  
  16. Authors' and Editor's Disclaimer
  17. --------------------------------
  18. Although these modifications have been repeatedly tested on a number of 
  19. different systems, there can be no way to insure that what you do with them
  20. will yield the same result.  As such, these changes come with no warranty of
  21. any kind, either expressed or implied.
  22.  
  23. Preface
  24. --------
  25. With Wayne Bell's release of WWIV, an unusual step was taken - NO executable
  26. version of the program was made available - only the Turbo Pascal source code
  27. was provided as "shareware".
  28.  
  29. With this source available, a number of devoted (and crazy) WWIV SysOps took 
  30. the necessary time to examine the source code, and modify it for their own 
  31. systems ("...oh, Vanity, Vanity...thy name is SysOp"), adding personal touches
  32. and features not found in the original, while at the same time, deleting or
  33. rewriting some of the code to eliminate confusion.
  34.  
  35. This is the first compilation and explanation of those changes. What you
  36. will see in the pages below are concise (and a tad irreverant) descriptions
  37. of the changes, the intended purpose of the changes, and the changes them-
  38. selves, shown in context with some of the original WWIV source code.  ALL 
  39. of these changes have been thouroughly tested prior to their inclusion in
  40. this document, so if you make the changes, they're likely to work!
  41.  
  42. I tip my hat to Wayne Bell, for having the courage to distribute his work,
  43. rather than just its results.  In addition, the following individuals deserve
  44. prominent mention for their investments of time, jangled nerves, extreme
  45. patience under pressure, and horrendous telephone bills in helpine me make
  46. these WWIV changes available to all:
  47.  
  48.               Dennis Raney, SysOp of The Programmers Exchange
  49.               (816) 228-1957
  50.  
  51.               Richard Douglas, SysOp of BEFCOP BBS
  52.               (713) 781-9285
  53.  
  54. Finally, this set of modifications surely is but the "tip of the iceberg".
  55. If you have made some changes to WWIV that you wish to share with us, please
  56. do!  Contact me by any of the following methods:
  57.  
  58. On GEnie, you can find me in the BBS RoundTable, or send GEmail to PINKSTONE;
  59.  
  60. On MCI Mail, use the address MPINKSTONE;
  61.  
  62. Sign on to LEX-PC, at (215) 569-6975, 24 hours a day, 2400 baud and less, 
  63. where I'm the SysOp.
  64.  
  65. Mark Pinkstone
  66. November 10, 1986
  67.  
  68. =============================================================================
  69. NOTE:  The text comments have been written with a right text margin of 80,
  70.        but the Pascal source code is displayed with a right margin of 127
  71.        in order to preserve the format of the original code.
  72. =============================================================================
  73.  
  74. ANSI graphics display to remote caller
  75. Author: Dennis Raney
  76. --------------------
  77.  
  78.     This will help you add the graphics to your program. You can add
  79. ANSI graphics, but Turbo will not display them correctly on your screen.
  80. They will come out correct on the receiving end, provided that the user is
  81. capable of receiving ANSI graphics and high-order ASCII characters. To 
  82. eliminate the problem with the local display, you must install a screen 
  83. writing routine that uses the normal DOS i/o calls (which can be intercepted
  84. by the ANSI driver). This has the negative effect of significantly slowing down
  85. local screen displays.  It may be best to test your ANSI from remote, and 
  86. avoid the "slowdown".  In any event, you'll be able to test your ANSI screens
  87. by using the DOS TYPE command, with ANSI.SYS (or equivalent) loaded.
  88.  
  89. Ok, here goes......
  90.  
  91. ====================ANSI GRAPHICS DISPLAY TO REMOTE=============================
  92.  
  93. #1. In the file "common.pas" on around line # 188 add this:
  94.  
  95.                         Graphics: Boolean;
  96.  
  97.  
  98. #2. In "part2.pas" overlay function getuser add these lines at the end
  99.     of the function around line #80:
  100.  
  101.                         nl; prompt('Graphics [y/N]?');
  102.                         if yn then Graphics:=true else Graphics:=false;
  103.  
  104. #3. In "bbs.pas" replace the procedure "mainmenu" with the following:
  105.  
  106. procedure mainmenu;
  107. var nb,inte:integer; abort,next:boolean; ii:str; rl:real; mr:mailrec;
  108. begin
  109.   dump;tleft;nl; macok:=true;
  110.   if not expert then if Graphics then printfile('gfiles\mainmenu.msg')
  111.                       else printfile('gfiles\mainmenu');
  112.   print('Time - '+tlef);
  113.   if boards[board].key=' ' then i:='['+cstr(board)+'] ' else
  114.     i:='['+boards[board].key+'] ';
  115.   i:=i+'['+boards[board].name+'] :';
  116.   prompt(i); helpl:='@';
  117.   if onekey in thisuser.defaults then mmkey(i) else input(i,20);
  118.   helpl:=#0;
  119.   if length(i)=1 then case i[1] of
  120.     '?':if expert then
  121.          begin
  122.           nl;
  123.           if Graphics then printfile('gfiles\mainmenu.msg')
  124.            else printfile('gfiles\mainmenu');
  125.          end;
  126.     'O':begin
  127.           helpl:='O';nl;prompt('Hangup?  Sure? ');
  128.           if yn then begin
  129.             cls;
  130.             printfile('gfiles\logoff.msg');
  131.             hangup:=true;
  132.             hungup:=false;
  133.           end;
  134.         end;
  135.     '*':boardlist;
  136.     'X':expert:=not expert;
  137.     'D':default;
  138.     'Y':yourinfo;
  139.     'I':begin printfile('gfiles\logon.msg'); printfile('gfiles\system.msg'); end;
  140.     'C':reqchat;
  141.     '$':chpw;
  142.     'R':removem;
  143.     'U':ulist;
  144.     'E':smail(false);
  145.     'F':begin irt:='Feedback'; imail(1); end;
  146.     'S':scan1;
  147.     'P':post;
  148.     'T':dloads;
  149.     'M':readmail;
  150.     'Q':qscan(next,true);
  151.     'G':gfiles;
  152.     'N':nscan;
  153.     'W':wamsg;
  154.     'V':vote;
  155.     'L':printfile('gfiles\user.log');
  156.     'A':abbs;
  157.     'H':mmacro;
  158.     'K':delmail;
  159.     'J':prg(false);
  160.     'Z':prg(true);
  161.     'B':printfile('gfiles\bbslist.msg');
  162.     '!':if cs then begin
  163.           print('Enter name or number of person.'); prompt(':');
  164.           finduser(inte); if inte>0 then vali(inte);
  165.         end;
  166.  end else
  167.   begin
  168.     if copy(i,1,2)='//' then i:=copy(i,3,length(i)-2);
  169.     if i='/O' then hangup:=true;
  170.     if i='/E' then smail(true);
  171.     if i='/K' then if onekey in thisuser.defaults then thisuser.defaults:=
  172.       thisuser.defaults-[onekey] else
  173. thisuser.defaults:=thisuser.defaults+[onekey];
  174.     if (i='UEDIT') and cs then uedit(usernum);
  175.     if (i='STATUS') and cs THEN PSTAT;
  176.     if (i='IVOTES') AND cs then initvotes;
  177.     if (i='LOG') and cs then printfile('gfiles\sysop.log');
  178.     if (i='YLOG') and cs then printfile('gfiles\ysysop.log');
  179.     if (i='BOARDEDIT') and so then boardedit;
  180.     if (i='DLBOARDEDIT') and so then dlboardedit;
  181.     if (i='MAILR') and so then mailr;
  182.     if (i='TEDIT') and cs then begin ret:=200; dos('E'); end;
  183.     if (i='/?') and cs then printfile('gfiles\sysopmnu.msg');
  184.     if (i='QUIT') and so then begin doneday:=true; hangup:=true; elevel:=1; end;
  185.     if (i='DOS') and cs then begin ret:=200; dos('D'); end;
  186.     if (i='VER') then pver;
  187.     if (i='OLDUSERS') and cs then oldusers;
  188.   end;
  189.   nb:=value(i);
  190.   if nb>0 then
  191.     if nb<=numboards then
  192.       if (boards[nb].key=' ') and boardacpw(nb) then board:=nb
  193.       else
  194.     else
  195.   else begin
  196.     nb:=0;
  197.     for inte:=1 to numboards do if boards[inte].key=i then nb:=inte;
  198.     if (nb<>0) and (i<>' ') then if boardacpw(nb) then board:=nb;
  199.   end;
  200. end;
  201.  
  202.  
  203.  
  204. #5. In the file "dloads.pas" replace the procedure "ftmainmenu" with:
  205.  
  206. procedure ftmainmenu;
  207. var ii,i:str; int:integer;
  208. begin
  209.   dump; tleft; nl;
  210.   if not expert then if Graphics then printfile('gfiles\dlmenu.msg')
  211.                       else printfile('gfiles\dlmenu');
  212.   print('Time - '+tlef);
  213.   i:='('+cstr(culb)+')-('+uboards[culb].name+')  :';
  214.   prompt(i);
  215.   helpl:='T';
  216.   mmkey(i);
  217.   helpl:=#0;
  218.   if length(i)=1 then case i[1] of
  219.     '?':if expert then if Graphics then printfile('gfiles\dlmenu.msg')
  220.                         else printfile('gfiles\dlmenu');
  221.     'Q':doneft:=true;
  222.     'B':browsefiles;
  223.     'U':iul;
  224.     'D':idl;
  225.     'L':listfiles;
  226.     'S':search;
  227.     'F':searchd;
  228.     'C':reqchat;
  229.     'O':begin
  230.           nl;nl;prompt('Hangup?  Sure? '); helpl:='O';
  231.           if yn then begin
  232.             cls;
  233.             printfile('gfiles\logoff.msg');
  234.             hangup:=true;
  235.             hungup:=false;
  236.           end;
  237.         end;
  238.     '*':listboards;
  239.     'P':pointdate;
  240.     'N':nf;
  241.     'R':remove;
  242.     'M':if cs then move;
  243.     'V':lfii;
  244.     'Y':yourinfo;
  245.     'X':expert:=not expert;
  246.   end;
  247.   if i='/O' then hangup:=true;
  248.   if (i='SORT') and cs then sort;
  249.   if (i='REN') and cs then ren;
  250.   if (i='0') and cs then culb:=0;
  251.   int:=value(i); if (int>0) and (int<=maxulb) then
  252.     if thisuser.dsl>=uboards[int].dsl then
  253.       if (uboards[int].password='') or cs then culb:=int else begin
  254.         prompt('Password? '); input(i,10);
  255.         if i<>uboards[int].password then
  256.           print('Wrong.')
  257.         else
  258.           culb:=int;
  259.        end;
  260. end;
  261.  
  262.  
  263. #6. Now compile all the files "bbs.pas", "dloads.pas", and "dos.pas".
  264.     That should do it. The new procedure "ftmainmenu" also adds a toggle
  265.     for expert on/off. It also will display the file menu for those who
  266.     have expert set to off when they enter the file area. For the file
  267.     names of the graphic files I've used the same name, without an
  268.     extension. You may name them anything you choose though. Let me know
  269.     if you have any trouble installing the changes.
  270.  
  271.  
  272. #7. Please note that the graphics files have the same name, but no extension.
  273.     You may change the names to anything you wish.
  274.  
  275. ==========================END OF GRAPHICS ADDITION===========================
  276.  
  277.  
  278. Disabling the "Ctrl-C" function from remote
  279. Author:  Dennis Raney
  280. ---------------------
  281.  
  282.   To disable the spinning cursor when a user presses "Ctrl-C", you can replace
  283. the routine SKEY in the file COMMON.PAS. By commenting it out, you will not
  284. have users freaking every time they attempt to break out of a scroll with the
  285. WRONG key!  Users will still have the option of setting the spinning cursor 
  286. by using the D)efaults command.
  287.  
  288. =====================DEFEATING THE CONTROL-C FUNCTION=========================
  289. procedure skey;
  290. var b:boolean;
  291. begin
  292.   case ord(c) of
  293.  
  294. (*
  295.       3:if spcsr in thisuser.defaults then
  296.           thisuser.defaults:=thisuser.defaults-[spcsr] else
  297.           thisuser.defaults:=thisuser.defaults+[spcsr];
  298. *)
  299.  
  300.      26:phelp;
  301.      20:ptime;
  302.  
  303.             ...the remainder of the procedure is unaltered.....
  304.  
  305. =====================END SPINNING CURSOR DE-INSTALL=========================
  306.  
  307. Changing the maximum age of a posted message
  308. Author:  Mark Pinkstone
  309. -----------------------
  310.  
  311. One of the niceties of WWIV is that many of the functions are "time-driven"
  312. ones, eliminating a number of unpleasant housekeeping chores if properly
  313. understood and used.  My favorite (now) is the 'maxage' function, allowing
  314. your users to post messages that will expire in a predetermined number of 
  315. days.  In my opinion, the original program was far too generous with the 
  316. expiration limit, so I changed it (even for the SysOp!!).  The function
  317. is shown in its entirety below, with the changes marked by vertical bars
  318. (|) in the left margin.  The original function can be found in BBS.PAS.
  319.  
  320. ==================CHANGING THE MAXAGE OF A POSTED MESSAGE===================
  321.  
  322. function maxage(x:integer):integer;
  323. begin
  324. | maxage:=60;
  325. | if x<20 then
  326. |   maxage:=5
  327. | else if x<30 then
  328. |   maxage:=10
  329. | else if x<50 then
  330. |   maxage:=20
  331. | else if x<99 then
  332. |   maxage:=30;
  333. end;
  334.  
  335. ==========================END OF MAXAGE CHANGE===============================
  336.  
  337. Changing the Main Menu Display/Prompt
  338. Author:  Mark Pinkstone
  339. -----------------------
  340.  
  341. Like many other WWIV SysOps, I found the Main Menu to be cryptic and
  342. cumbersome, especially to users who were listed as "non-expert',
  343. where a 24 line menu was displayed each time they pressed a key.
  344. My change to this isn't unique, by any means - I just made EVERYONE
  345. an "expert", and changed the prompt to show not only time remaining
  346. and current place in the BBS, but also how to get help, or a display of
  347. the main menu.  The changes need to be implemented in two places, the
  348. main menu procedure in BBS.PAS, and the ftmainmenu procedure in DLOADS.PAS.
  349. Here's how....
  350.  
  351. ===========================INSTANT EXPERT MODE==============================
  352.  
  353. #1 (FROM BBS.PAS) - the replacements made to the procedure 'mainmenu' are
  354. marked with vertical bars (|) - the entire procedure IS NOT listed here
  355. in the interest of brevity - after all, this change is minor}
  356.  
  357.  
  358. procedure mainmenu;
  359. var nb,inte:integer; abort,next:boolean; ii:str; rl:real; mr:mailrec;
  360. begin
  361.   dump;tleft;nl; macok:=true;
  362. | print('Time Remaining - '+tlef);
  363. | print('?=Menu, ^Z=Help');
  364. |  { 'X':expert:=not expert; this function removed, no longer necessary}
  365.  
  366.    ...remainder of the procedure is unaltered for this modification...
  367.  
  368. #2 (FROM DLOADS.PAS) 
  369.  
  370. procedure ftmainmenu;
  371. var ii,i:str; int:integer;
  372. begin
  373.   dump; tleft; nl; nl;
  374. | print('Time Remaining - '+tlef);
  375. | print('?=Menu, ^Z=Help');
  376.   i:='('+cstr(culb)+')-('+uboards[culb].name+')  :';
  377.   prompt(i);
  378.  
  379.     ...remainder of the procedure is unaltered for this modification...
  380.  
  381. ====================END OF INSTANT EXPERT MODE==============================
  382.  
  383.  
  384. Eliminating High Intensity Local Text Displays
  385. Author:  Richard Douglas
  386. ------------------------
  387. Probably the most significant one-line change in the whole system is this
  388. one -- to get rid of the blasted high-intensity Turbo text default on the 
  389. local screen.  Those of us who multi-task our systems pay homage to you, 
  390. Richard!!!!  The modification is indicated with a vertical bar (|), and 
  391. is made in the last portion of the mainmenu procedure, near the end of
  392. the file BBS.PAS.
  393.  
  394. ==========================EASY ON THE EYEBALLS========================
  395. begin
  396. | TextColor(7);
  397.   getdir(0,i); ovrpath(i);
  398.   if ret>127 then begin
  399.     iport;
  400.     if ret=200 then
  401.       goto reent;
  402.     if ret=201 then
  403.       goto reent1;
  404.   end;
  405.  
  406. {...the remainder of the procedure is unchanged...}
  407.  
  408. ========================END OF EASY ON THE EYEBALLS=====================
  409.  
  410.  
  411. Eliminating E-Mail Options while in Q-Scan or N-Scan
  412. Author:  Mark Pinkstone
  413. -----------------------
  414.  
  415. A great deal of misunderstanding (on the part of users) has been demonstrated
  416. by their use of the Auto-reply function while reading messages posted on
  417. the public boards.  It is generally their assumption that they are posting 
  418. a message by using the "A" function, rather than sending a private E-Mail
  419. message to the author.  In order to eliminate the confusion, I have removed
  420. the Auto-reply option from the scan function.  If someone wants to leave
  421. E-Mail, they may still do so from the main menu prompt.
  422.  
  423. The modification is made to the procedure 'scan2' from BBS.PAS.  Changes to
  424. the procecure are marked with a vertical bar (|).
  425.  
  426. =================REMOVE AUTO-REPLY FROM SCAN FUNCTIONS======================
  427.  
  428. procedure scan2(pl:integer; var cn:integer; iread:newtyp; var quit:boolean);
  429. var unvali,uv,pq,donescan,abort,next:boolean; i:str; t:integer;
  430.  b:messagerec;
  431. begin
  432.   quit:=false;pq:=false; unvali:=false; helpl:='S';
  433.   donescan:=false;
  434.   repeat
  435.     if iread=lt then begin cn:=cn+1; titles(cn,pl); iread:=rp; end;
  436.     if iread=rp then begin
  437. |     tleft; prompt('Read:(1-'+cstr(pl)+',^'+cstr(cn)+'),T,R,Q,P,? :');
  438. |     {note that the "A" option has been removed from the user display}
  439.       input(i,4); t:=value(i);
  440.       if i='R' then begin t:=cn; i:=cstr(t); end;
  441.       if (i<>'') and (t=0) then case i[1] of
  442.         'P':begin close(mf);post; iscan(pl); end;
  443.         'T':iread:=lt;
  444.         'Q':begin quit:=true; donescan:=true; end;
  445.         'B':donescan:=true;
  446.         'D':if lcs and (cn>0) and (cn<=pl) then begin
  447.               deletem(pl,cn); cn:=cn-1;
  448.             end;
  449. |       {'A':autoreply;}
  450.         'V':if cs then vallastuser;
  451.         'M':if cs then movemsg(pl,cn);
  452.         '?':begin
  453.               print('Read:number');
  454.               print('<CR>=next message');
  455.               print('T)itles     Q)uit');
  456.  |            print('P)ost a reply or new message on current board');
  457.               print('R)e-read    B)oard change in N-Scan');
  458.             end;
  459.  
  460. ======================END OF REMOVE AUTO-REPLY==============================
  461.  
  462.  
  463. The "Abort and Pause" Reminder (an RBBS-PC 'Throwback')
  464. Author:  Mark Pinkstone
  465. -----------------------
  466.  
  467. This modification is more 'nostalgia' from my RBBS-PC days than anything else,
  468. but it does provide some useful information to users.  During the display of
  469. any potentially LONG text file in RBBS-PC (Bulletins, f'rinstance), the 
  470. program was kind enough to let you know at the beginning of the display that
  471. "Ctrl-X aborts, Ctrl-S suspends" what you're doing.  There were two ways to
  472. go about this WWIV modification -- either add that text to EVERY bulletin on 
  473. the system, or change the code.  Since my bulletins rotate very frequently, it
  474. made more sense to have WWIV display the message rather than editing every
  475. text file available!  A new, three-line procedure, 'cxcs' was created in
  476. COMMON.PAS, and then invoked in several other places, as you'll see below.
  477.  
  478. =========================THE RBBS-PC THROWBACK=============================
  479.  
  480. #1  The following new procedure was included in COMMON.PAS.  It is marked with
  481. vertical bars (|), and shown in context with other existing procedures both
  482. before and after it.
  483.  
  484.   procedure nl;
  485.   begin
  486.     prompt(chr(13)+chr(10))
  487.   end;
  488.  
  489. | procedure cxcs;
  490. | begin
  491. |  nl;
  492. |   print('[ Ctrl-X aborts, Ctrl-S suspends ]');
  493. | end;
  494.  
  495. procedure tleft;
  496. var x,y:integer;
  497. begin
  498.  if okt then begin
  499.   x:=wherex; y:=wherey; window(1,1,80,4);
  500.   gotoxy(72,3);if chatcall then begin
  501.  
  502.  
  503. #2  The procedure is called several times during 'mainmenu' in
  504.     BBS.PAS - each time at a point where a potentially lengthy file
  505.     might be displayed.  Once again, vertical bars in the left margin
  506.     indicate the changes or additions:
  507.  
  508. procedure mainmenu;
  509. var nb,inte:integer; abort,next:boolean; ii:str; rl:real; mr:mailrec;
  510. begin
  511.   dump;tleft;nl; macok:=true;
  512.   print('Time Remaining - '+tlef);
  513.   print('?=Menu, ^Z=Help');
  514.   if boards[board].key=' ' then i:='['+cstr(board)+'] ' else
  515.     i:='['+boards[board].key+'] ';
  516.   i:=i+'['+boards[board].name+'] :';
  517.   prompt(i); helpl:='@';
  518.   if onekey in thisuser.defaults then mmkey(i) else input(i,20);
  519.   helpl:=#0;
  520.   if length(i)=1 then case i[1] of
  521.     '?':begin nl; if graphics then printfile('gfiles\mainmenu.msg')
  522.                    else printfile('gfiles\mainmenu');
  523.         end;
  524.     'O':begin
  525.           helpl:='O';nl;nl;prompt('Hangup?  Are you sure? ');
  526.           if yn then begin
  527.             cls;
  528.             printfile('gfiles\logoff.msg');
  529.             hangup:=true;
  530.             hungup:=false;
  531.           end;
  532.         end;
  533.     '*':boardlist;
  534.    { 'X':expert:=not expert;}
  535.     'D':default;
  536.     'Y':yourinfo;
  537. |   'I':begin cxcs; printfile('gfiles\logon.msg'); nl; printfile('gfiles\system.msg'); end;
  538. |   {procedure cxcs added to COMMON.PAS}
  539.     'C':reqchat;
  540.     '$':chpw;
  541.     'R':removem;
  542. |   'U':begin cxcs; ulist; end;
  543.     'E':smail(false);
  544.     'F':begin irt:='Feedback'; imail(1); end;
  545.     'S':scan1;
  546.     'P':post;
  547.     'T':dloads;
  548.     'M':readmail;
  549.     'Q':qscan(next,true);
  550.     'G':gfiles;
  551.     'N':nscan;
  552.     'W':wamsg;
  553.     'V':vote;
  554. |   'L':begin cxcs; printfile('gfiles\user.log'); end; { cxcs added in COMMON }
  555.     'A':abbs;
  556.     'H':mmacro;
  557.     'K':delmail;
  558.     'J':prg(false);
  559.     'Z':prg(true);
  560. |   'B':begin cxcs; printfile('gfiles\bbslist.msg'); end; {cxcs added to COMMON.PAS}
  561.     '!':if cs then begin
  562.           print('Enter name or number of person.'); prompt(':');
  563.           finduser(inte); if inte>0 then vali(inte);
  564.         end;
  565.  
  566.  
  567. #3  The procedure is called in PART2.PAS for the display of Gfiles:
  568.  
  569.   procedure lgft;
  570.   var abort,next:boolean; c:integer;
  571.   begin
  572.     nl; print(titl); nl;
  573.     if numgft=0 then print('No G-files.') else begin
  574.       abort:=false; next:=false; c:=1;
  575.       while (c<=numgft) and (not abort) do begin
  576.         printacr(cstr(c)+': '+gftit[c].tit,abort,next);
  577.         c:=c+1;
  578.       end;
  579.     end;
  580.   end;
  581.  
  582. begin
  583.   nl;assign(f,'gfiles\gfiles.dat'); {$I-} reset(f); {$I+}
  584.   if ioresult<>0 then begin
  585.     rewrite(f); b.num:=0; write(f,b);
  586.   end;
  587.   seek(f,0); read(f,b); t:=b.num; helpl:='G';
  588.   if t=0 then print('No G-files yet.') else begin
  589.     gettit(0); exit:=false;
  590.     lgft; lgftn:=0; deep:=false; lgftnt:=0;
  591.     repeat
  592.       nl; nl; prompt('Gfiles: (1-'+cstr(numgft)+', ^'+cstr(lgftn)+'),?,Q : ');
  593.       input(i,3);
  594.       if i='' then if lgftn=numgft then i:='Q' else i:=cstr(lgftn+1);
  595.       if i='?' then lgft;
  596.       if i='Q' then
  597.         if deep then begin
  598.           deep:=false;
  599.           gettit(0);
  600.           lgft;
  601.           lgftn:=lgftnt;
  602.         end else exit:=true;
  603.       c:=value(i);
  604.       if (c>0) and (c<=numgft) then begin
  605.         if gftit[c].gfile=true then begin
  606.           seek(f,gftit[c].arn);
  607.           read(f,b);
  608. |         cxcs;
  609.           printfile('gfiles\'+b.filen);
  610.  
  611.        ...the remainder of the procedure is unchanged....
  612.  
  613. =====================END OF THE RBBS-PC THROWBACK==========================
  614.  
  615.  
  616. "Multi-Mod" to the Upload Procedures
  617. Author:  Mark Pinkstone
  618. -----------------------
  619.  
  620. This series of small modifications accomplishes several things...
  621.  
  622. 1.  It eliminates any guesswork on the users' parts as to what constitutes
  623.     a 60 character file description by providing a graphic "ruler bar" above
  624.     the prompt line for the file description;
  625.  
  626. 2.  It allows more legal DOS filename characters, by changing the array
  627.     of acceptable text characters for file names;
  628.  
  629. 3.  It shows (to the nearest 999 bytes), the available free space on the 
  630.     upload drive BEFORE the user uploads a file (integer limitations and
  631.     remaining .COM file size constraints, coupled with a basically lazy
  632.     programmer, resulted in a rounded number of available bytes free - but
  633.     boy, is it FAST!);
  634.  
  635. 4.  Forces ALL new uploads (for users with a SL of less than 100) into the
  636.     hidden directory, #0(Sysop).  A recent rash of pirated software uploads
  637.     convinced me of its necessity.  WWIV makes moving files easy enough, so
  638.     why not?  In homage to GEnie, the message "File will remain in SysOp's
  639.     area until reviewed" is presented to the uploader BEFORE the file is
  640.     received;
  641.  
  642. 5.  Performs some other general houskeeping and user-friendliness chores.
  643.  
  644. These changes are made only to the procedure dlx1 from the file DLOADS.PAS, 
  645. and are indicated by vertical bars (|) in the left margin.  Comments have
  646. been added where appropriate.
  647.  
  648. ===========================UPLOAD MULTI-MODS================================
  649.  
  650. procedure dlx(f1:ulfrec; var abort:boolean);
  651. var inte,pl,c:integer; ok,tl:boolean; u:userrec; rl:real; i,ii:str;
  652. begin
  653.     nl; nl;
  654.     print('Filename: "'+align(f1.filename)+'"');
  655.     print('Desc.   : '+f1.description);
  656.     print('# blocks: '+cstr(f1.blocks)+'-Xmodem, '+cstr((f1.blocks+7)div 8)+'-Ymodem');
  657. procedure ul(fn:str);
  658. var x,pl,c,cc,ob,np:integer; f,f1:ulfrec; uls,ok:boolean; fi:file of byte;
  659. | var fx,fds:str;
  660. begin
  661.  if freek>80 then begin
  662.  
  663. | str(freek,fx); {prepares freek for use as text}
  664. | fds:=fx;       {       "       "          "   }
  665.  
  666.   uls:=incom;
  667.   ob:=culb;
  668.   ok:=true; fn:=align(fn);
  669.   if (fn[1]=' ') or (fn[10]=' ') then ok:=false;
  670.   for x:=1 to length(fn) do
  671.  
  672. |   if not (fn[x] in ['0'..'9','A'..'Z','.','-','_',' ']) then ok:=false;
  673. |   {adds some more legal ascii filename characters to the array}
  674.  
  675.   np:=0; for x:=1 to length(fn) do if fn[x]='.' then np:=np+1;
  676.   if np<>1 then ok:=false;
  677.   if ok then
  678.     if incom then
  679.       if exist('dloads\'+fn) then
  680.         if cs then begin
  681.           print('There already is one.');
  682.           prompt('Do it anyway? ');
  683.           ok:=yn;
  684.           uls:=false;
  685.         end else
  686.           ok:=false
  687.       else
  688.         ok:=true
  689.     else
  690.       ok:=exist('dloads\'+fn)
  691.   else print('Illegal filename, or file already exists.');
  692.   if (not incom) then
  693.     if ok then print('Am using the file in dloads\')
  694.     else begin print('To put in a file from keyboard, it must already be');
  695.                print('present in the dloads\ directory.'); end;
  696.   nl; nl;
  697.   if ok and incom and uls then begin
  698.     assign(fi,'dloads\'+fn); {$I-} rewrite(fi); {$I+}
  699.     if ioresult<>0 then begin
  700.       {$I-} close(fi); {$I+} cc:=ioresult;
  701.       ok:=false;
  702.     end else begin close(fi); erase(fi); end;
  703.   end;
  704.   if not ok then print('Can''t use that filename, sorry.') else begin
  705.     iscan(pl);
  706.     if pl>=uboards[culb].maxfiles then print('This board is full.') else begin
  707.  
  708. |     print('Drive has '+fds+'000 bytes available for storage.');
  709. |     {displays the available space on the upload drive - nearest thousand}
  710.  
  711.       prompt('Upload "'+fn+'" ? ');
  712.       if yn then begin ok:=true; close(ulff);
  713.  
  714. |       nl; print('|-----Please supply file description.  60 character max-----|.'); prompt(':');
  715. |       {provides visual template for the 60 character file description}
  716.  
  717.         inputl(f.description,60);
  718.  
  719. |       if (f.description[1]='\') or (thisuser.sl<99) then begin
  720. |    culb:=0;
  721. |       print('File will remain in Sysop`s Area until reviewed');
  722. |    end;
  723. |   {forces all users' uploads into #0 unless co-sysop access level granted}
  724.  
  725.         if f.description[1]='\' then f.description:=copy(f.description,2,80);
  726.         iscan(pl);
  727. procedure gfn(var fn:str);
  728. begin
  729.   nl; helpl:='L';
  730.  
  731. | prompt('File mask [Return for ALL files] : '); input(fn,12);
  732. | {general explanation of what the list files function does}
  733.  
  734.   if fn='' then fn:='*.*';
  735.   fn:=align(fn);
  736. end;
  737.  
  738. procedure remove;
  739. var pl,c,rn:integer; f:ulfrec; fn:str; ff:file; u:userrec; tf:boolean;
  740. begin
  741.   print('Enter filename to remove.'); prompt(': ');
  742.   input(fn,12);
  743.   if fn<>'' then begin
  744.     recno(fn,pl,rn);
  745.     if rn<>0 then begin
  746.       seek(ulff,rn); read(ulff,f);
  747.       if (usernum=f.owner) or cs then begin
  748.         print('Filename: "'+f.filename+'"');
  749.         print('Desc.   : '+f.description);
  750.         print('# blocks: '+cstr(f.blocks));
  751.         reset(uf); seek(uf,f.owner); read(uf,u); close(uf);
  752.         print('U/L by  : '+u.name+' #'+cstr(f.owner));
  753.         print('U/L on  : '+f.date);
  754.         prompt('Delete this? ');
  755.         if yn then begin
  756.           delete(rn,pl);
  757.           if cs then begin
  758.             prompt('Erase file too? ');
  759.             tf:=yn;
  760.           end else tf:=true;
  761.           if tf then begin
  762.             assign(ff,'dloads\'+fn);
  763.             {$I-} erase(ff); {$I+}
  764.             c:=ioresult;
  765.           end;
  766.         end;
  767.  
  768. |     end else print('You do not own this file!');
  769. |    {tells user why Remove failed, rather than just returning prompt}
  770.  
  771.     end;
  772.     close(ulff);
  773.   end;
  774.   nl; nl;
  775. end;
  776.  
  777. ===========================END OF UPLOAD MULTI-MODS=======================
  778.  
  779.