Category : BBS Programs+Doors
Archive   : TONSMOD.ZIP
Filename : HOLY!2.MOD

 
Output of file : HOLY!2.MOD contained in archive : TONSMOD.ZIP
C

Time: 02:14:05 Time Left: 00:53:59
[45] The WWIV Modification Net



85/100: A fix for the file for my file tagging mod!
Name: Blackbeard #39 @3518 -=ð 5th Black Belt ð=-
Date: Friday, October 2, 1992  8:27 pm
From: The Samurai Palace [305-587-0185]


[Msg. Status]: Please respond to this message.
-------------------------------------------------------
I have made a modification to my input1 function, and it has given some people
problems... To fix it make all the input1(s,"",2,0,0); to input1(s,2,0,0); the
extra parameter is for another mod, so it isn't nessecary....

A lot of people also asked if it could be used for 4.21 and it can just need to
remove the string parameter from mallocx and it works fine!


 --========The Samurai Palace BBS========--
  (305)587-0185
  Davie, Florida
 -====WWIVnet @3518/Virtual Net @3050/WWIVlink @13500/Ice Net @3500====-




Time: 02:14:12 Time Left: 00:53:52
[45] The WWIV Modification Net



86/100: greeny02.mod adds graphs to onliners.
Name: Mack #87 @2361
Date: Fri Oct 02 10:36:43 1992
From: Miracle Programmer's Oasis [213-732-1405]

GREENY02.MOD

Greeny's online monstrosity.


This mod evolved out of a mutant crossbreeding between somebody's onliner
timelock mod, and the mod that puts a purple box around transfers. Now it's
a boxed, color-coded timelock mod with bar graphs of comparative usage for
each onliner. Tacky, eh? What else are onliners for?

You set a timelock for each onliner. I.E. this onliner can only be played
from 11:00 pm to 3:00 am. This is done in //chainedit, and yes I know
entering it in minutes from midnight is annoying. Sheer lazines on my part.
I made this entire mod under protest and only decided to release it because
it had been so much work. Anyway, all onliners that are currently
accessible will show up as green to everyone with ansi. If it's timelocked,
it'll be dark red. If someone tries to play a timelocked onliner, a message
will appear informing them from when to when the onliner is accessible. If
they select a green one, it'll just load it up and go. If you leave the on
and off times at midnight (the default), that onliner will always be green.
If start time is after end time, the available time will continue through
midnight and into the next day.

For those users who don't have ansi, the box will be made out of stuff like
plusses and minuses. Plus, they can tell timelocked onliners by the
asterisk that appears in the appropriate row all the way to the right.

The bar graphs should be self explanatory. To zero out the count, remove
and re-install the onliner. Why you'd want to is beyond me, but it can be
done.

A program called subcnvt is included to convert your chains.dat file to the
new format. Yes, it is yet another use for black dragon's convert
program. Somebody give him a medal or something. To use the
program, block read it out, compile it, go to your data directory,
rename chains.dat chains.old, and subcnvt chains.old chains.dat. Then if
you're feeling industrious, delete chains.old.

Oh, by the way: exemption 16 exempts people from the timelock. If you're
already using this for something else, change the #define...


The actual mod comes next. If you don't back up your source code, you're
dumb.


In the function void modify_chain(int n), which is found in the file
CHNEDIT.C, add/edit the following lines:

/* Key: == already there, ++ add, += change */


== npr("I. Disable pause: %s\r\n",
== (c.ansir & ansir_no_pause)?"Yes":"No");
++ npr("J. Switch on at : %d:%02d\r\n",c.lowtime/60,
++ c.lowtime-((c.lowtime/60)*60));
++ npr("K. Switch off at: %d:%02d\r\n",c.hightime/60,
++ c.hightime-((c.hightime/60)*60));
== nl();
+= prt(2,"Which (A-K,Q) ? ");
+= ch=onek("QABCDEFGHIJK");


Farther down in the same function, add the following lines. (I'd suggest
you block read them in and delete the plusses, but it's up to you.)

== c.ansir &= ~ansir_no_pause;
== break;
++ case 'J':
++ nl();
++ prt(5,"Chain Low Time (Mins from midnight)? ");
++ input(s,4);
++ i=atoi(s);
++ if(i>=0 && i<24*60) c.lowtime=i;
++ break;
++ case 'K':
++ nl();
++ prt(5,"Chain High Time (Mins from midnight)? ");
++ input(s,4);
++ i=atoi(s);
++ if(i>=0 && i<24*60) c.hightime=i;
++ break;
== }
==} while ((!done) && (!hangup));

The next function to modify in is void insert_chain(int n). Add the
following three lines...

== c.ansir=0;
++ c.lowtime=0;
++ c.hightime=0;
++ c.usage=0;
== chains[n]=c;

Now save it off and load up the file BBSUTL1.C. Delete the entire functions
show_chains and run_chains and replace them with the following:



/* Begin block read for GREENY02.MOD */

void show_chains(int *mapp, int *map)
{
int abort,next,i,i1,j,k,macks=0,padington;
char s[81],tempomatic[10];

abort=0;
for(i=0;i<*mapp;i++)
if(chains[map[i]].usage>macks) macks=chains[map[i]].usage;
nl();
osan("\0031 Title",&abort,&next);
for(i=0;i<37;i++) osan(" ",&abort,&next);
pla(" Popularity Times run",&abort);
osan(okansi() ? "\0033ÚÄÄÂ" : "+--+",&abort,&next);
for(i=0;i<42;i++) osan(okansi() ? "Ä" : "-",&abort,&next);
osan(okansi() ? "Â" : "+",&abort,&next);
for(i=0;i<10;i++) osan(okansi() ? "Ä" : "-",&abort,&next);
pla(okansi() ? "ÂÄ¿" : "+-+" ,&abort);
for (i=0; (i<*mapp) && (!abort) && (!hangup); i++) {
strcpy(s,okansi() ? "\0033³\0032" : "|");
if(i<9) strcat(s," ");
itoa(i+1,tempomatic,10);
strcat(s,tempomatic);
osan(s,&abort,&next);
osan(okansi() ? "\0033³ " : "| ",&abort,&next);
k=1;

if((chains[map[i]].lowtime!=chains[map[i]].hightime) &&
!(thisuser.exempt & exempt_timelock))
if(chains[map[i]].hightime>chains[map[i]].lowtime) {
if((timer()<=(chains[map[i]].lowtime*60.0)) ||
(timer()>=(chains[map[i]].hightime*60.0))) k=0;
} else {
k=0;
if((timer()>(chains[map[i]].lowtime*60.0)) ||
(timer()<(chains[map[i]].hightime*60))) k=1;
}
if(!abort && okansi()) {
if(k) setc(10);
else setc(4);
}
osan(chains[map[i]].description,&abort,&next);
for(padington=0,j=0;j if(chains[map[i]].description[j]==3) padington+=2;
for(j=strlen(chains[map[i]].description); j<=40+padington;j++)
osan(" ",&abort,&next);
osan(okansi() ? "\0033³\0037" : "|",&abort,&next);
j=0;
if(chains[map[i]].usage)
if((macks/chains[map[i]].usage)*10)
for(j=1;j<=((float) chains[map[i]].usage/macks)*10; j++)
osan(okansi() ? "ß" : "#",&abort,&next);
if(j==0) j++;
while(++j<=11) osan(okansi() ? " " : ":",&abort,&next);
osan(okansi() ? "\0033³" : "|",&abort,&next);
if(okansi()) setc(4);
osan(k ? " " : "*",&abort,&next);
osan(okansi() ? "\0033³ \0031" : "| ",&abort,&next);
sprintf(s,"%05d",chains[map[i]].usage);
pla(s,&abort);
}
osan(okansi() ? "\0033ÀÄÄÁ" : "+--+",&abort,&next);
for(i=0;i<42;i++) osan(okansi() ? "Ä" : "-",&abort,&next);
osan(okansi() ? "Á" : "+",&abort,&next);
for(i=0;i<10;i++) osan(okansi() ? "Ä" : "-",&abort,&next);
pla(okansi() ? "ÁÄÙ" : "+-+",&abort);
nl();
}


void run_chain(int cn)
{
char s[255],s1[81],s2[81],s3[81];
int oc,f,blat;
unsigned int toph,topm,topf,both,botm,botf;
long l;

blat=0;
if((chains[cn].lowtime!=chains[cn].hightime) &&
!(thisuser.exempt & exempt_timelock))
if(chains[cn].hightime>chains[cn].lowtime) {
if((timer()<=(chains[cn].lowtime*60.0)) ||
(timer()>=(chains[cn].hightime*60.0))) blat=1;
} else {
blat=1;
if((timer()>(chains[cn].lowtime*60.0)) ||
(timer()<(chains[cn].hightime*60.00))) blat=0;
}
if(blat) {
topf=botf=0;
toph=chains[cn].hightime/60;
topm=chains[cn].hightime-(60*toph);
if(!toph) toph=12;
if(chains[cn].hightime>=720) {
toph-=12;
topf=1;
}
both=chains[cn].lowtime/60;
botm=chains[cn].lowtime-(60*both);
if(!both) both=12;
if(chains[cn].lowtime>=720) {
both-=12;
botf=1;
}
ansic(1);
npr("\0031%s is only available from %d:%02d%cm to %d:%02d%cm\r\n",
chains[cn].description,both,botm,botf?'p':'a',toph,topm,topf?'p':'a');
sprintf(s2,"!Timelock on '%s'",chains[cn].description);
sysoplog(s2);
return;
}
chains[cn].usage++;
sprintf(s,"%sCHAINS.DAT",syscfg.datadir);
f=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
write(f,(void *)chains, numchain * sizeof(chainfilerec));
close(f);
itoa(com_speed, s1, 10);
itoa(syscfg.primaryport,s2,10);
itoa(modem_speed, s3, 10);
stuff_in(s,chains[cn].filename,create_chain_file("CHAIN.TXT"),s1,s2,s3,"");
sprintf(s2,"!Ran '%s'",chains[cn].description);
sysoplog(s2);
oc=chatcall;
chatcall=0;
l=thisuser.sysstatus;
if (chains[cn].ansir & ansir_no_pause)
thisuser.sysstatus &= ~sysstatus_pause_on_page;
if (chains[cn].ansir & ansir_no_DOS) {
set_protect(0);
if (chains[cn].ansir & ansir_shrink)
shrink_out(s,1,0,1,1);
else
run_external(s);
topscreen();
} else
if (chains[cn].ansir & ansir_shrink)
shrink_out(s,1,1,1,1);
else
full_external(s,0,1);
thisuser.sysstatus = l;
chatcall=oc;
}

/* End block read for GREENY02.mod */



Save it off. Load up VARS.H (I know, I know...) and change/add this...

== /* DATA FOR OTHER PROGRAMS AVAILABLE */
== typedef struct {
== char filename[81], /* filename for .chn file */
== description[81]; /* description of it */
== unsigned char sl, /* seclev restriction */
== ansir; /* if ANSI required */
+= unsigned short ar, /* AR restriction */
++ lowtime,
++ hightime,
++ usage;
== } chainfilerec;

Farther down, find...

== #define exempt_post 0x08
++ #define exempt_timelock 0x10

Save it. Compile it. Get some tea. Then block read out and compile the
subcnvt program which follows. You need to use it on your chains.dat file
in the data directory. Usage subcnvt oldfile newfile.



/* Begin subcnvt.c for greeny's online monstrosity */

/* CONVERT USERLIST PROGRAM */
/* Written by The Black Dragon, 1989 */
/* Mangled by Greeny to do something totally different. */

#include
#include
#include
#include
#include
#include
struct {char f[81],d[81],s,an;
unsigned ar,l,h,u;} new;
struct {char f[81],d[81],s,an;
unsigned ar;} old;
void main(int argc, char *argv[])
{
int f,g,i;
unsigned int loop,num=0;
unsigned long len;

if (argc<3) {
printf("\nRequires 2 parameters.\n");
printf("Usage: SUBCNVT oldfile newfile \n");
exit(0);
}
if ((f=open(argv[1],O_RDWR|O_BINARY,S_IREAD|S_IWRITE))<=0) {
printf("\nCould not open chain list %s\n",argv[1]);
abort();
}
if ((g=open(argv[2],O_RDWR|O_BINARY|O_CREAT|O_TRUNC,S_IREAD|S_IWRITE))<=0) {
printf("\nCould not open output file %s\n",argv[2]);
abort();
}
printf("\n\nSize of old record %d",sizeof(old));
printf("\nSize of new record %d\n\n",sizeof(new));

len=filelength(f);
num=(len/sizeof(old))+!(len%sizeof(old));
for (loop=0;loop if (sizeof(old)==read(f,&old,sizeof(old))) {
printf("\015Processing user #%u of %u",loop,num-1);

memset(&new,0,sizeof(new)); /* Nice to clear out garbage */
strcpy(new.f,old.f); /* Now copy all data over */
strcpy(new.d,old.d);
new.s=old.s;
new.an=old.an;
new.ar=old.ar;
new.l=new.h=new.u=0;
write(g,&new,sizeof(new)); /* record converted here */
}
}
close(f);
close(g);
}

/* End subcnvt.c for greeny's online monstrosity */



Try it. The bar graphs should establish themselves in a few days, and will
be continuously updated each time someone runs an onliner. The most popular
one will go all the way accross, the rest will be in proportion to it.
(Onliners a user does not have access to will not affect the bar graph
generated for that user.)

Mail about this can be sent to 8@6910. I don't run a board myself, just
mangle code for people who do.

(GREENY)
THE PROMISED LAND Delran NJ 609-764-7144 Reg. #91223
HOST OF SUB 42 - DEEP THOUGHT: THE INTERNATIONAL MENSA NET
USR 38400/HST/HST/V.32/V.32-BIS/LAPM/V.42/V.42-BIS/MNP/ARQ/ASL



Time: 02:15:07 Time Left: 00:52:57
[45] The WWIV Modification Net



87/100: An update to the filetagging mod
Name: Blackbeard #39 @3518 -=ð 5th Black Belt ð=-
Date: Saturday, October 3, 1992  7:22 pm
From: The Samurai Palace [305-587-0185]


[Msg. Status]: Please respond to this message.
-------------------------------------------------------

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Mod Name: FILETAG.MOD Mod Authors: álackáeard (WWIVnet 1@3517) ³
³ Difficulty: ÛÛÛÛ±±±±±± Date: Oct. 2, 1992 (July 12, 1992) ³
³ WWIV Version: 4.21, and 4.21a (maybe some others) ³
³ Files Affected: XFER.C, XINIT.C, VARDEC.H, COM.C, ³
³ VARS.H, FCNS.H, BBSUTL.C, XFEROVL.C (optional) ³
³ Description: This mod allows users to tag files for downloading ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

ÍÍÍ[ Disclaimer ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

If your computer blows up because of this mod, it is time for you to buy a
new one.

ÍÍÍ[ Opening notes ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

This is my first published mod so go easy... Whelp when I thought up
this mod i was thinking in the line of wildcat-like file tagging. Where
you press a number that represents a filename, because i thought that
typing out the filename is LAME (and easier). With this in mind I started
work on the mod, and found 2 ways of doing it one was pass the filenames as
a parameter (which caused major rewrite of parameters in existing procedures)
and second by allocating some memory. I tried parameter style, and failed so
here goes the other way.

This is kinda backward compatible, this mod uses ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
WWIV's batch download. If your older version ³ Legend ³
supports this is can be easily installed, with ÆÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͵
a little tweaking. ³ + Add Line ³
I made this mod cuz i could never find a file ³ - Remove Line ³
tagging mod. AND IT CAME OUT DOPE, it looks really ³ @ Modify Line ³
Nice check it out won't you. ³ = Existing line ³
ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;

What's new in version 2.0? Well... It has been updated for WWIV 4.21a, but can
easily be used for a any version... (really what is different in 4.21a is the
mallocx function...) and it has bug fixes! Since ver 1.0 wasn't released to
the general public, i will not go in details about the differences.

What's new in version 2.1? Well... a slight oversight on my part with the
input1
function, Just Look for /* FILETAG.MOD 2.1 */ for the part your have to CHANGE!
It also shows the one different step you have to take to make it work for 4.21.
Plus I have adopted the header they recommend as a standard (happy?)!

Whoops, some of you might have notice a [C1] or something cuz i forgot to
remove the color in the mod, sorry!

This mod is fairly simple, if you have any problems installing it send me mail.
But before you do so make sure that you double check that you did everything
the mod said.

Let's get it rolling...

ÍÍÍ[ Step 1 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

Back up your source!!!! I never do because i like a challenge, but if your
not up to a head breaking challenge BACKUP!!!!

ÍÍÍ[ Step 2 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

Open up "VARDEC.H", and do these following steps.

= #define sysstatus_nscan_file_system 0x0080
= #define sysstatus_funky_colors 0x0100
= #define sysstatus_clr_scrn 0x0200
+ #define sysstatus_no_tag 0x1000

= /* slrec.ability */
= #define ability_post_anony 0x0001
= #define ability_email_anony 0x0002

Add this typedef any where you want (if those with low IQ's i will show you a
good spot).

= typedef struct
= {
= char tlen,
= ttl[81],
= anon;
= } infstruct;

+ /* Tag record Structure */
+ typedef struct {
+ int directory;
+ char filename[13];
+ } tag_rec;

= #define max_buf 1024

Then add this define right here:

= #define max_buf 1024
= #define MSG_COLOR 13
+ #define MAX_FILES 61 /* See note */
= #define MAX_BATCH 50

Note: This number represents the maximum screen length a user can have. This
is wwiv's standard size if you have changed this standard, then change this!

Close "VARDEC.H"

ÍÍÍ[ Step 3 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

Open "VARS.H" and add these variables.

= smwcheck, statusfile, sysop_alert, tempio, topdata, topline,
= two_color, userfile, usernum, useron, use_workspace, using_modem,
@ wfc, x_only, file_ptr, in_tag; /* Add these two vars */

= long hanguptime1, nscandate, this_date, timelastchar1, dir_dates[MAX_DIRS],

then go down a little futher and add this last var:

= char far *point_shrink;
+ tag_rec *file_index;

Repeat this for the extern bit, go down a few screen in the same file...

= smwcheck, statusfile, sysop_alert, tempio, topdata, topline,
= two_color, userfile, usernum, useron, use_workspace, using_modem,
@ wfc, x_only, file_ptr, in_tag; /* Add these two vars */

= extern long hanguptime1, nscandate, this_date, timelastchar1,

then go down a little futher and add this last var: (desavooo)

= extern char far *point_shrink;
+ extern tag_rec *file_index;

Close "VARS.H"

ÍÍÍ[ Step 4 (4.21) ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

This step is for 4.21 only, use the next for 4.21a!

Open up "XINIT.C" and add the following:

= }
= batch=mallocx(MAX_BATCH * sizeof(batchrec));
+ file_index=mallocx(MAX_FILES * sizeof(tag_rec));

= read_user(1,&thisuser);

Close "XINIT.C"

ÍÍÍ[ Step 4 (4.21a)]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

Open up "XINIT.C" and add the following:

= }
= batch=mallocx(MAX_BATCH * sizeof(batchrec));
+ file_index=mallocx(MAX_FILES * sizeof(tag_rec),"filetag index");

= read_user(1,&thisuser);

Close "XINIT.C"

ÍÍÍ[ Step 5 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

Open up "COM.C", and do the following...

Find the void outchr:

= if ((sysstatus_pause_on_page & thisuser.sysstatus) &&
= (lines_listed >= screenlinest - 1)) {
+ if (in_tag)
+ tag_files();
+ else
= pausescr();
= lines_listed = 0;
@ } else
+ if ((!(thisuser.sysstatus & sysstatus_no_tag)) && (in_tag) &&
+ (lines_listed >= screenlinest - 1)) {
+ tag_files();
+ lines_listed=0;
+ }
= }
= } else

Close up "COM.C".

ÍÍÍ[ Step 6 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

Open "BBSUTL.C" and modify checka()...

= void checka(int *abort, int *next)
= {
= char ch;
=
+ if (in_tag>=3)
+ *abort=1;
= while ((!empty()) && (!(*abort)) && (!hangup)) {

Close "BBSUTL.C"

ÍÍÍ[ Step 7 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

Open "XFER.C" and let the fun begin ...

Find ok_ratio and add the following:

= if ((syscfg.req_ratio>0.0001) && (ratio() = ok=0;
+ if (!in_tag) {
= nl();
= nl();
= sprintf(s,"Your up/download ratio is %-5.3f. You need a ratio
of %-5.3f to download.", /* Chopped off by editor! */
= ratio(), syscfg.req_ratio);

A little futher down in the same procedure:

= if ((syscfg.post_call_ratio>0.0001) &&
= (post_ratio() = ok=0;
+ if (!in_tag) {
= nl();
= nl();
= sprintf(s,"Your post/call ratio is %-5.3f. You need a ratio of
%-5.3f to download.", /* Chopped off by editor! */
= post_ratio(), syscfg.post_call_ratio);


Add these lines to printinfo

= int i,next,fc;

= fc=thisuser.sysstatus & sysstatus_funky_colors;

+ if (file_ptr>=MAX_FILES)
+ file_ptr=0;
+ if ((in_tag) && !(thisuser.sysstatus&sysstatus_no_tag) && (!x_only)) {
+ file_index[file_ptr].directory=udir[curdir].subnum;
+ if (fc)
+ sprintf(s,"^Cd[^C%c%2d^C] ", /* FILETAG.MOD 4.21 */
+ (check_batch_queue(u->filename))?'8':'a', file_ptr+1);
+ else
+ sprintf(s,"[%2d] ",file_ptr+1);
+ file_ptr++;
+ osan(s,abort,&next);
+ }

Note: ^C means to press control P and control C in your editor, you should
get a little heart!

Go futher down into printinfo

= strcpy(s,u->description);
+ if ((in_tag) && !(thisuser.sysstatus&sysstatus_no_tag) && (!x_only))
+ if (strlen(s)>53)
+ s[53]=0;
= pla(s,abort);

Find listfiles and add the following:

= uploadsrec u;

+ in_tag=1;
+ file_ptr=0;
= dliscan();

and at the end of it add

}
in_tag=0;
}

Next look for nscandir...

= if ((dir_dates[udir[d].subnum]) && (dir_dates[udir[d].subnum] = return;

+ in_tag=1;
+ file_ptr=0;
= od=curdir;

Next find "void searchall()"

= if (x_only) {
= strcpy(s,"*.*");
= align(s);
= } else {
+ in_tag=1;
+ file_ptr=0;
= nl();
= nl();
= pl("Search all directories.");
= file_mask(s);
= }

at the end of it...

= }
+ in_tag=0;
=}

Next find "void finddescription"

= nl();
= nl();
+ in_tag=1;
+ file_ptr=0;
= pl("Find description -");

and finally

}
in_tag=0;
}

Almost there.... Find "void xfer_defaults()" and do the following...

= sprintf(s,"4. Number of lines of extended description to print
(%d line%s).", /* Chopped off by editor! */
= thisuser.num_extended,thisuser.num_extended==1?"":"s");
= pl(s);
+ npr("5. %sable file tagging.\r\n",thisuser.sysstatus & sysstatus_no_tag?
+ "En":"Dis");
= pl("Q. Quit.");
= nl();
= prt(2,"Which? ");
= helpl=32;
@ ch=onek("Q12345");
= switch(ch) {

add the following inside that switch statement...

= thisuser.num_extended=i;
= }
= break;
+ case '5':
+ if (thisuser.sysstatus & sysstatus_no_tag)
+ thisuser.sysstatus -= sysstatus_no_tag;
+ else
+ thisuser.sysstatus += sysstatus_no_tag;
+ break;

Close "XFER.C"

ÍÍÍ[ Step 8 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

Insert the following procedures in xfer.c or xferovl.c it doesn't matter,
the only difference is one is overlaied one isn't.... (no dah!) I have made
xfer.c overlaid also so it really doesn't matter to me...

char onek2(char *s)
{
char ch;

while (!strchr(s, ch = upcase(getkey())) && !hangup)
;
if (hangup)
ch = s[0];
if (ch!=13)
outchr(ch);
return(ch);
}

void backline()
{
int i;

ansic(0);
outchr(32);
for(i=wherex(); i>0; i--)
backspace();
}

void tag_files(void)
{
int i, done=0, had, fp, oh;
char s[161],s1[161];
double t;
long fs;

if (x_only) {
file_ptr=0;
return;
}
if (in_tag==2) {
file_ptr=0;
return;
}
if (thisuser.sysstatus&sysstatus_no_tag) {
if (thisuser.sysstatus&sysstatus_pause_on_page)
pausescr();
file_ptr=0;
return;
}
in_tag=0;
oh=helpl;
helpl=43;
while ((!done) && (!hangup)) {
prt(12,"C)ontinue T)ag D)ownload V)iew S)top N)on-stop? ");
switch (onek2("CTDVSN \r")) {
case 'S':
in_tag=3;
done=1;
break;
case 'N':
in_tag=2;
done=1;
break;
case 'T':
if (numbatch>=MAX_BATCH) {
backline();
prt(6,"No room left in batch queue.");
getkey();
backline();
break;
}
backline();
npr("Tag which file? ");
mpl(2);
input1(s,2,0,0); /* FILETAG.MOD 2.1 */
i=atoi(s)-1;
if ((s[0]) && (i>=0) && (i if (check_batch_queue(file_index[i].filename)) {
backline();
prt(6,"That file is already in the batch queue.");
getkey();
backline();
break;
}
sprintf(s,"%s%s",directories[file_index[i].directory].path,
stripfn(file_index[i].filename));
fp=open(s,O_RDONLY | O_BINARY); /* FILETAG.MOD 2.1 */
if (fp<0) {
backline();
prt(6,"File not there.");
getkey();
backline();
break;
}
fs=filelength(fp);
close(fp);

t=(12.656) / ((double) (modem_speed)) * ((double)(fs));
if (nsl()<=(batchtime + t)) {
backline();
prt(6,"Not enough time left in queue.");
getkey();
backline();
break;
} else {
batchtime += t;
strcpy(batch[numbatch].filename,file_index[i].filename);
batch[numbatch].dir=file_index[i].directory;
batch[numbatch].time=t;
batch[numbatch].sending=1;
batch[numbatch].len=fs;

numbatch++;
++numbatchdl;
backline();
prt(10,"File added to batch queue.");
getkey();
backline();
}
} else
backline();
break;
case 'D':
if (numbatchdl==0) {
backline();
prt(6,"Nothing in batch download queue.");
getkey();
backline();
break;
}
if (!ratio_ok()) {
backline();
prt(6,"Sorry, your ratio is too low.");
getkey();
backline();
break;
}

nl();
listbatch();
nl();
prt(5,"Hang up after transfer? ");
had=yn();
nl();

i=get_protocol(xf_down_batch);
if (i>0) {

if (i==4)
ymbatchdl(had);
else
dszbatchdl(had,externs[i-6].sendbatchfn,externs[i-6].description);

if (!had) {
nl();
npr("Your ratio is now: %-6.3f",ratio());
nl();
}
}
nl();
pausescr();
done=1;
break;
case 'V':
backline();
npr("View which file? ");
mpl(2);
input1(s,2,0,0); /* FILETAG.MOD 2.1 */
i=atoi(s)-1;
if ((s[0]) && (i>=0) && (i sprintf(s1,"%s%s",directories[file_index[i].directory].path,
stripfn(file_index[i].filename));
if (!exist(s1)) {
backline();
prt(6,"File not there.");
getkey();
backline();
break;
}
get_arc_cmd(s,s1,0,"");
if (!okfn(stripfn(file_index[i].filename)))
s[0]=0;
if (s[0]!=0) {
nl();
do_external(s,1);
nl();
pausescr();
done=1;
} else {
backline();
prt(6,"Unknown archive.");
getkey();
backline();
break;
}
} else
backline();
break;
default:
done=1;
break;
}
}
backline();
helpl=oh;
}

ÍÍÍ[ Step 9 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

This one is easy run "MAKE FCNS" and let it do the work... else if your
makeafobic just add the previous functions' declarations in fcns.h.

ÍÍÍ[ Step 10 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

It's over just sit back and recompile. (Take in a movie if you don't have
a 486!)

ÍÍÍ[ Final notes ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

This mod works on my system, blah, blah, blah... if you have any problems
let me know... I am in the WWIVnet as 1@3517... One known bug is that it
doesn't stop at the end of the file list so you can't tag the last few, but
nobody's perfect...

Future Features: Ability to scroll back the screen after you view a file or
download one... Currently i am working on this, and have
done it through fancy programming (sloppy but it works)...
after i make sure there are no bugs in it i will release it
as ver 3.0.

I have my tag routine set up with a gold mod. As soon as i
decide to release it with support for a gold mod i will...
(one way to get me to do it is to get a lot of people to
install the mod!)

Later...
álackáeard WWIVnet 1@3517


P.S. I have other mods that i might release if enough people bug me! So start
sending me mail! (I even have one that stick the name.lst, subs.dat, and
dirs.dat into XMS... Saving around 30k of memory and allow up to 65535
users!) But for me to release it enough poeple have to want it, and bug me
for it! By the way, this feature will come in REAL handy when WWIV 4.22
comes out, you won't lose any real memory and have 999 subs and dirs! So,
this is very handy! The big problem is that the routines for XMS i have
are in assembly! So if i release it i would need to send an uuencoded obj
file with it! I can make it do it directly from Turbo C, but i will do it
for ver 2.0!

P.S.S. If you use this mod, drop Wayne a letter saying that you would like to
see a file tagging feature in the next version of WWIV! I know the BIG
guy might get upset so say i sent you! I owe a lot to WWIV, and
would like to give something back... So if your reading this Wayne, I
don't care if you use this mod in the next WWIV (i want nothing in
return) or if you write your own routines... As long as it has file
tagging routines... I mean if a sh*t software like Spitfire has file
tagging ablities, along with every other bullitan board out there...
You know it is popular, and people want it!



Time: 02:16:33 Time Left: 00:51:31
[45] The WWIV Modification Net



88/100: VoteBase v1.75
Name: Bilbo #1 @9714
Date: Fri Oct 02 21:10:08 1992
From: The Burrow [907-561-7209]

section 1 of uuencode 5.15 of file vbase175.arj by R.E.M.

begin 644 vbase175.arj
M8.HL`!X#`0````(,#*E"&0```````````````````````%9"05-%,3 M2@``4?C&A```8.HL`!X#`0`0`0`,DEPP&2\B``"00```._VK7P``(````%9/
M5$5"05-%+D5810``!F=LTP``&]>&\+PZQ)2V<_LS,SAC@&(JH,*API M%0Q55`*W5$A5%6&TEQDH0;,S@3=D1AVDS%?MJZVT;6^5;:[(MHT=H5IP$$%5
M9`=M65UE5:X."Z(""J.9__N?P6LDD<<
M[)9K]1(`GZTV@)4JJG]V@5$QI"9N_D)?2$(N!B`<<#&@Y8'-`RX+('SP9T'4
M`WQ,0F`!Q`.*!C@ M@?/[email protected]!W0/!!^H'E`_8"W!QZ@5F#D0=""Q!F@?V`ZT']P/.!3*2$>`7\'!
M`X4'1`G`Z4'3@_K!UP/P@_(#MP?H!X0/$!/!L`;4&_*B$\$'PP<0#C08P',`
MR8/E`^<#[@.O!]\&C!I`=T#S`3P>@"X!,,(1W!@`5P+0'8`_$#S@>>#U04SL
M0CT#>@9$&2!J@?I!3*Q0X-Z!OP/R`TX.\!>[H0E_!@0<"L(3"`XH''@[H'>@
M_4#R@;T[D(^@^0#Y@,P#ZX/L@^^#^\'?@\H&\/`P'!PH/D@Z@'K`N05+R*W!
MO@)H,@#E@&#QP>9=
M1B.#T`5#T0BL%Y!S8/Z`6`,T#Z(.F!V(/[P:(&O!Z8/6!\2["X8.)!\D&5!E
MP?1!TP.J!]8'X`?A!^,&I!WX.`NX4O!D0<7>"$R8-2#OP:L%P"KO(NV##`Y8
M'D`G@]<&[WHA(\'*`Y@'Y0?F!/!Z`-J"I>PEV#?P8<&*!R0,B#I0?5!]X'C@
MYU\"G8/I`^H#ZH/L`^Z#\`/^H.V!WX-6#_$$\'H`V`*F]D)=`5H.#!A08@'Q
M0`0D2#C`8X'(@^.#G0
M=`#H0=*#IP9X&B!VH.X!J@?I!XH+^^C`L&!!B@<:#&`R@.?!\T$X'T`=(--3
MT@?4!]P'7@^^#M0=P#3`V8-^OP3+!\,'%`X\&.!]`%H#_F#\H/S`TH-D"^/P
MEX,*#DP MD`-!,'#@TX.\!^@&&\$08*\'W0?@!^$%]\(8-@W\'C`YP:Z;('3`ZP'Y0:4&
MH!^L&M!Z0-F#UP4^`(1V!?`88''`Y,'*@S`,T#I@?3!]H']H.T!^0'=`\`'A
M@\<'K`T`V3$Q-.GZ(.I5:<:V*/YXR^3RL9C\=E(R#R.3CLM/<[35Q$]/-J3)
M+5;@CE[DJ-R20G]BKTZ<>SA[DFP2,DI__-.Z]Y]:HTZ>?Q@][I2,WI*#NA8.
M-MI&C1$+22$_\A@B/M5=F-G\XZEL]72>Y4D%@IVN3M(U2O(<941KF$;Q:],A
MXX5O$KTZ'C#-X1>H0\8ANN7J4/&%;WU>J0\<,WNZ]:AXP[=6ONIRD>.':1KD
MM/IR)KXGS<.GBL*FT*-[%$YB_L(1F MTR0/\AS(3](()"';=.XD/8+(5,@?$]F0]1U(;;`)W,^Z^0QQ75"HE29(OI%;
M:1?7Z2GPITGUTB^X!R0L9J%192G>5@EB%JFVS3+9+NTC)TSM@9"4.9,(%0K-
M5B6'\!S0JI"A)('K7*,XJ^_.&QY'Z2/9.9S%GC8,Z5096D3-U+@?2,U^KOS6
M1)#G.%0YUJ2'*6+. M"Q4/AXK"PB63Z9')^.N MC7"8B-_)EP6_AK%>7ZTK+#3LVXB]+A&CV>1K&N!=E1U%VHO3F-<(6*UIY)`M
M097M5!F1#KU9WAB=IIM_1PZLT_>PZ MR+&^*B@F?7]A'#U5&2,C$FHY")N]D(?4=BANLA0A)QV[`BBKE5"A+$5&5(89
M'Q#C\8WD=>%I)^M(Z2X6&R\PS-S\P=+YXS"%_&F&H?:;)(6*3IFU8^%RU<"D
M:-,+%6-U%SRZ'R$1/J;C0]OO;DS9>I2S'/7.49=9#`W85Y)_:NM$)"&;18R\
M0O1-EPMVMOHOEH]M'*72%A9.BA%'VU-/'7N4Z?QHXJ=2<[B7%B>C_U8E"';9
M8M::P5H<[5!G.%9JB_1/^Z_4W-?Z_GW%?__KBST:XMXTJ15"0Y-C=?]B-#=G
M6=*O(6IR(U/K:TD)S=M&$M.6UZE1^DV[D+3=Y.YM09O'P75WQ?C>E^-^7XJW
MQ,A0$[7/>JF^>-A6;KB_'1+\=8(ORPT[M5-UY?:P+\63J(UZ$0A,;,>V73>:
MG:QMFUR_4GHVUGLNX:QMJUR[A*SI_N.=A?;O//;]=VTCX#]):ZS)[4C(3Y+J
MZR'+"-ODNPNO*K1>VG4I:F9=50L7/QSJ5;"S)KJ\FP^2[?=?`MZZ.[(7KSIU
M:?/.;>>T?F#&[Y'EUIL_`C%0M)L+(4`Y,LB?=1=7R6N[H\$2T761&O44=6%I
M)[],>F1Q%XT[B[(5!O).FN^5E):68:.5E_+-F9AFP90<'!H8C*:DRS(Y M[+9(_2];MV_PB8D[Q2#"*%I(J-M9E16ZX>CANH+I?%E(T0X6L_K@WY5Q@WW;
M_-!?[7MQ@`W&LM!(H"8)!`1R+>ZUNE=>YB%'5-]P6"&
M,H^1:`::^> M3:DC-4?YHO4?PW!=_#LT.^9V4E_#9FS&B82YO?I_E?^:?9JVW1$@/UG6DZ9W
M\7
MY;!DSE9B7'I*2^>-\XY+V%!1+[CY66\J8-P,IYLH;DI7.Z"482QL7*Z&5EYB
M!6970,#<> MQLO+L&<2;"XW$X>%PN0\;/EL(;+2OFL#+0BNV7FHV;RFC93&B+;]DP
M%CM"P-O\+"%]F+#RY5DS8,395F5&AM6%17@UKI-7^#@_66J*-EM"-L3=!@I2
M]/7."01G4)%&$3,\N?B^HELXZRS;1A9!Q;0_&VE"F08C--9MOTE@ZBT;:TOW
MN+1M0%^_DM&VV+]_#:-MX7[]ZT/>+1M]1?+]EH?!VA[BS15P+9;767;7?+"-
MC;OW%W[WD&+"49E5"ML](O'95%4EMSE@IS%VB$\H_B57*X3SU[A;T_U'**RE
M@+AGRW8/,M;E*44@ZLNVQCNZ1%MJ4N4151_IN6YA MFS.\W2N4&W'L7$(T],G8B8U3,X@0]JZC0U4.*0+GU18V$YL%N9`0,)S9"?XZ
MMTUEW%*IG"+"70FR$_]=U0@2T&)TE0A9W!;EKU-5MT&R="DY"?^82H16H],C
M@03DMA%51Z:9QG$6TZGFUAEO4I6%,PCME9C12N=B34^+-38%/@(&(D&+!DR-
MP..PF5@2I/%3)-S>,##JQ-T#"6T6#-89A%8=F6 MD65[]3QWVOU"++C7_1JB:V1^HLKC=@23"W%BBT$%TZ%6-[S0:C2OL]^L;G<]
MG/G&YZ<8?X-E6WQ-0J$*=_1<4ZE)M-4_?:!J$E9SYQM*35VG,7SR.6:R M$X:J>](DW]W>QN6S_]@LC M-_$MH9K[@U^_Z;:='GB6G[H]-"UEI8C8T1ND78B+L^%J7(NW=PP]SOX8'J;%
M#<:%UM&X/M+"A6H79Q%@C--;WYHDP+AOGG,7OWQ,<[3F+#+DS\$OJG2]3KSK
M=Z^0G-BC.B2:NFMWCY$F<\<8:AB2R*\BA?X?*9%Y!IK\ZU2C9F%@\/AC34$K
MPE!(2GEL#<$;,9\W#0(;!3 M]M.+*,)9AG6:*=*%._>G>-G>X3HJK!).CP^DC@A"77^R=&MKAD#C?:[^0,>)
ML?"6!_L=+N;_6[0F^VO(0S44HU%CXOKI*%?'7W"A6._!0K1]^R9_D.%=(S]&
M MZ\J+EX"+BUR?/UZ2+G&_FC82=NO^R+EOK_^+D9`K4#XO21;?\9=DN$H[KG3=
MD8*VX29O$HP&N=DH!72'>'_AQ0/:5[>H[;=*>\5\G3%X=:[J2&D_O^N_\"5[
MAR_IN]%EVD$'Q!A_,KW+/REV#C8>0OFVX1;K1COIT[-X14A#F(>3T$(NQMHN
MD/DOYE>K_$9NQ?K&!G4Y;A!8EP97!HZ&UZ-@@>1$81:E"33L7Z(R0BU*$67=
MY0W=IM4AO%G\'J(H4/!^`M0AL)5]I>`D^T+K<(OFC23E:C-B:0RI%`YTA_Z[
M:;]#K]N;UB4W=8`?\8,9'H]S!AXO#J_G'/S71DZ;!1DN5E$E#9=A-(-W`9]6
M4T($+CR,9E M,"IS_U=%))>\=Y)>H,BR$25&\#H(H5W89'B%9^8DI!Z=X=/BJ##`@^%DKDHS
MV748AK5=G9]1E/\6Z%*]V.HXMUP-^:LRJ/+"Z8F>-F)?LW0*MZ@XC5J#J.1F
M^][8Z>[=\UNE&2MY_]7?L^>6WC_&9
MX:M,UH!K;.LF2ZT:.L#`H:O2.0U\O7?TUN#V"I^9AFM"$$)S<)C2# M:1EC_WUY^%Z?_;PF?)6/?=YM1&ZRA)$QNLFIH8HI<`(63H4A_1WFU4W[#WVF
ME0N'M1D/9_YFURVLB4BMCM7VW`]"C2ODJ"L:6\&CS+'>:LNZTN)-8CBY:Q.T
MTC7 MI<]!FFE:=DZB%&]`G48=0HPV!3J(1*X!_CV2&B* M7;ZW*AY2V`TD?.:]]SBC_^MB>Z]N`1V(^@]]_?H0B^SN>_;VN*LM/PF]NSK?
MI*S=]]@H0H/K?A0>NL"?C.5#YWIS;5Q;M&\18%4W0FGXM'*%*7FYI3M7NM_:
MX;R>ZW"**W"NN2T0Z.]\?+;E!BY>VS?9;\^__MCT^OGX9+7[\(NXJ?LZ3%#&
M2!]':_VSG_WQ-_^-SO__&-TW-?Z.$9+?_[Y$V[%;T^L@VI9*5EY70G:$W*9$
MJQQ5AAJTPF$AL,&TG-J`UR+,RAP6.1-Q1L2/(W0G,F9K!UNP':'RAX2Q6T-G
MH)27+NPL/..E)8N[`AP=4Q-2XGD&]91@S-#;U!EHDN[&^NJX*W=6U M:VE98LLLP^1#=LS1D9>&T-P,-`FY]AH926'"JX&%@34?&8+;J!'.,#A>!+XE
M)F%=O[,Q)C"59Z!@Q6%GS(;E,MHWA&E4O0MB&3#ST+!XB1%V)5BPN+"H,+7E
M,`X/"%E6$T7@Y!1YK-#D-3 M,0=__*1YD/@Z5YRY28O=5S4F+5]_!R9WCY_N\-ZY]_
M)CQ\/FHL>+_]B#'B<[#="')\W="%U4V7L M][/\_[E';=-NA$V/L^:?Y'-0OH6G0H@GYL(GL^7 M(V9M?^+^P/,1O[`^OQLX^7SNV!O
MG>LNE9+V.6BV:/G,[C9I*7RV;-$:N0D)=5H_9EEJ^$.O3;3"26]FB[ZH[?Z%
M$1J.[$/B^&.O#;U^Y$)7,UO]+F+.4BS/0A-?OWQ*Z_,Y27:Q_C=?< M?IR6[R7V(VP1?;S^2??6Y=1BX MCS[UT#X^P0K3VW]U6D+<-.%RUQ(;<0Y'V:LF[QK M6!FO;QJ^#.5'^E8-\4OQ8\-'8-\*OP8\/?L!V6"\>'[;!OX*_%#PM;)OX"_!
M#PP?3;O2^`'A_&S;NR^_AWOZ?70=6QNH9MRDZO0/<=$D>.R[[HB\HNB+-%FN
MN70W['2/N*Y+;S31A?Z265NL-_)1UWY**CJCEHNAN6/TW/;>R6@U/UI,SWO&
M]U"+[>0CUX/: MYZ+1KXZ^M`=]QUS/21<=7
M]!`3M<-IA,<0KZ%J:T_:!R&\+(3$OGY7RSAKA_XJWK_?5K>O1JU=^%6OU:B^
M\*#^5U9.F-BQQ;K/_FL=%X/?K'1I5C`?A6/[;!TCC(3`8*!QKITLS9%WX?\5
MK_+[ZU4?XK7C6*5:WS+,@P:1)IN=B?(*G,A\>47D,L!"X*:&_67P-E62&]/G
MSAU%FBE&>@EY30E40-R'BX[QH^#RN8RM^0[]/'RF>*I!H95DR+OM:*48B3A4
M8ML,IX02YT_(;3!?OT>0?R_Y-I\OEYW(2[Z:3IGU'J\!R/$N&,?/!@[SK.88
MZ,M4/:%/I.@>>E1U"[+12F=86_%HY"-CK[<^AN?E99A;]_E!_EI/#^+"TZ=)
M;6W_D!$._;[.LXCP)<6,4)!#O_< M7/(`_7X7<7'[K4>EA-/X\4*/ZS0)1>^X&A//\@=SG.]8GHNVEO.*P/A,KJVZ
MQ<5GW^24O;5E["%-VO]MT\@]J/+]SL*GX2`_S.0C+>H3M]..A#7'6L;_D'U7
M*/V_<[HBP)^7=E]FE>T_$H)(H<;0?]-:?@*Y#8HBK^ZV*(O\$S=!SC]T>.2(
M=B\>^:WO:*X:H]IU1L=Y%UL=OG7[^QW>JY+8[>*Y+8[O= M';S:I;'?H6J6QW/6VQWXKD_T.8-4]+'@(J9S-9G-T,!(93QY'+Y9^:UWM[>,
M(MRD/QM7QFF<>*OF5?,W3^_93=3*NUV7UZ@^-72/^<
MS'6WWMF266:UU/-O5K0-::@:TM`UW-!F*!K4#XU/$'QF*!_D]Z802.BP7`@(
M;FC@MZ!IN1P+5`TJ*>;6T'JT\W=Z"3WKT60M8]8TF5;3+F44%P(!U-<&6:EF
M)B$Q$WI2S=INKB<-)=X:6T[PA9VK0AAZQ'`@&M5BG+EFIM.5:YB.+W
M8H5/:M8UXVETX1ZKYG:@+Y*N$?@+J0OE@'\OTLVCOPCT/LL3C$((1-7R:!*M
MW[=3*RUV>$^9V%"\GUMF)-R5%5LP!..3ZZ/OQ-G5GJ*9_+=;UD)N/ZK_VU&K
MXNI,Q!(?H-:=5>";13PC]36*-SL%A-@\$4&*2;!:387LFPOI-A?R+FKVG)//
M9H_FZ<$3X":E;@QU"=]W'13;6\$_5:P>RHL-P(">OVIC$\[4J>7_-^6O^V^L
ME&3`<"`VWV$H_"+]_"2COY?OADH\8/M_H\^^OT@_2%'>TZV06GJ4ZT_1)Z,:
M`]O!UZ9:?*)]]#T@PKZ\[3F9B=^U_TU3[!)RUQ+)0VTV8S
M>9S6<\F3?W;@T=402INHH]V3,YMN[#B4(?>0_&0O9U]A#$:TKO3,W_7/1'<<
M--JZ1=%/ST1F8NUUY(WZ&IIH)^Q!)UN]3RW"DGGZ()3OT&34T@F%XAZ3809-
MA"$V"\7-3+9`S*;Y"WZT^](VT6GO"?M8(8!^W5Z%YBX'U^NPH_NFH@C.!VZ9
M.?@B:Z&(?#$V[TG/?B:Z((?C24,2?EB"2GX8FWO2<]V+(J+(\"`@VCLLI&9A
M^()D&]C3;3/")VBP]..0KAN;9])3"2`H',-*>FD&E.>F)F)#:*:P\]03,7^Z
MJ81?$L4ZEV:55$9P("F(GOD!X5_PN&B,/B,3$Q2_%8O&'2)TNSE1M=,!_!1,
M32&RC,TD&\K"2$PQ1_@W[?K",#G8$=89B(?!XF%-Q\PQEA_"#P])ZAB\F^G<
M6O"]Z;?:Y>2MU;AK91&KBTZZ*RR?2NWHWE=%*F-U'H9Z*O2NRZ*C%,TFWU'O
M"5N?']]DH*.AX=!1
MSA*`>5!0:J,9T&I$'0**#4[L06U6DL:#9+\G,IZ')M-W#="Q]V&I-B_A-IKQ
MQ0:R(:QRE=/1BD?9@^W@?:L?:V'I!\E\5@_OL-MM.&W5[;XN&W4;;X^&BL M:QB?%;3AL[OBOBX;-YQ5#PV;U4B]&?(WO\B9)+3\`3-%H++)W5#;=Z(?D2HA
MU,8GH>')[U22A'^*O0IDJ.TVD3BC;V7[%(*RT7Y8_MRY#;WDO]T[F!FZ\;>^
MD/6$MY^9)&22YSX`2A4!&_R7:F+@MNM*IA]Y//-&3%(TB\T*=RJ'E\?#9IZ)
M?.:2$(SNFJRT)P(!CDYY51^H)8U^I&4P+6_49(O@0%'QU+7=ZG?6>YG#KLA.
M!K8+B4?RH2H5Y\7#GHR\ZG)/<]DKW/2;[4QE]M5.IR3]#TC^+)0]8))?J-/C
M^!`82<+S7+)3#TD/6-=ZUJBTZ(;5:R<)M9PC6_46,X$`R3B-XT5Q&9LX(-]9
MJ,@WL&O"@JK:N7*5"EHZBQH281SR4KMUEGA M\1_BL-^C<2^'WB[U,DK7(T0Q=H*E9J*-@A+/[21.C M1"*9RM'+4YY7-9,3K++%U/I'BF+EUH"-V\5Q6:I MXIU=0OO5IKB?_%;S]3;3^5$_7:A-D!0:9*?^/EWY#2=73TFK1SYD[S;9]!(U
M9 MTK(6]=_2X.6GV3A
MBZJV3WU"^M[)".'/C'V;@Z\-8\SQIMVH33WESR^JTC59ZI*M4JR?J>;>!*FK
M@;^NU%57H_W7"]Y9K1<]9D,=&ZA3%1YAS>"Z6H>$9LZWV4IOZ[@[`" M0W-@MW-O`JK7N!546YA@R-'&X%:0!_B.!6#ZO-F
MBI2'P#A>;,O&0G7!K.QU&/Y,:WZ",^:_1S+OJIODO;L?"JF*?F+"YF>82'I`
MG_SI/?(TNUC5;7+K$9+ZJE&TO0[!S^UC3(*EFWEKTFN[%HG/8Y?5:_1JIGDV
ML1LC[#L M5G2IV;LC;;FHZ.-OBZUW88;*]KUK3E2$BUJ+3F->(UJ;3E-=WFLPHX2BK%KJ
MUW;L_T._&]O1K+2KM.%.TJ:=X1'>L+[55I6*AU3=806NZY=SKYX`E75U?"@O
MHOGULE*CZ+Q]?3JZJKK,D=S_^DQO!UNCZD[RG]F9
M5\^KXG+ZV^1\^35U@\W>LTEQ+M]:M>/J>*ZU_=EL4==+5\47-1B=U-+!&F1#
M7)J=E$TLRG:4MO(UCI=%HJAN;;3>KP)JK:# MI:'=]YI$\/O(JEF3&M*W&@!L6N[0HY63LV,7-'F&Z&R7$5,E8_OZW+2ELZI1
MU8YIN[>SS\6IT;`"5RL/A.ON3;OX2/JX*J8W;'BH/>9K8+
M=J.D*!_,=7P](W5P74:U,1!1RE_MJW2HS9+FF`%31._%[-^LWC,P7M]XY/$T
M[JT1<#Z%-L8AI'*=B&2-U;18*`,+M_NKGH)\%ZP5%UB1ZVD.QP28\4,7-4/[
MR-:7;;5N;CKBG,R87KC5HX'%:?T7"4&K6GS#@J5;PZI.=FS"3>0[E,JRTS,N
M+BD!!J!_C#(TIY`I3VG%MU^:T_P$*55_=<3R5+3@PW0AJ2QV+3?6/N[0W!;[
M!<&QV*%TT<`%.U>@L-8T&^1P.+@6TXD,YVBCA-VF[G.4[4*:LY*Y6F&#R$@5
MB0"222G!53%_<;GO2JJI`F>XWIUEW4>D;&J.D6Q=PCL*35]VB=.F1M);HD"U
M6S7.ZJ@Y?5N$U[B+M*I=X0C;3[XU"+^^ MVG"M*R=IDP5SH<)L=QD`X^0<5E4[%VFGB#BKZR=IVH4N-X=7.*6A\1Q20<%?
M8.^95.RZ<&HOL'>,JG$9L1&\UKP?)@N#3$WL_%$Y7353GL>R3&X^ZDUOIIB/
M7AAZR'_1=G@XQ#>P(7^&/*P50]GS,RNG,5!,W8?.$.51L=XW,\4>5_9Q:YI?
MIQO$SE,L98&TW)*\Z%RA="&1D"_)3FU%-F[QPLW#.5%,+:>?=X[E\"/.N-#K
MJ4W5IA1O6+0_7E&*B<;FHT>Q=YQN^3E,8RJAZ?*I+1;'^#C@G6:RFCN75M]L
MZUMEK7+O2.MMQ7#\UM'L.DXUR1_9SO$5N9M.UW,5O1\[V*I=(G:TMKL0PSJ_
M'+KE6.QS-C[K_;*&!,Q!?Z.YET%US3E$=R[0]0Y&Q;=&O!@H]87`4K0C//,F
M@U2]QKJ#6F]_U:T];CR46*AZQN91D7[9,C5J##*&I]]7(M`RM)JGPL@@U49$
MF:S"Y!H7N[\&A@Q_A]X'(YD8-\9O=O6*TV_'PUT\J&@&5LF+L^(IF!QK.6AD
MU19,61=_:V9,3[Z0Y\29-KH5DV0CD6KDK!TC8@Q%KDIJ+&;;/$;JJ+&[9@E@
M^?QW)U\?I'=9,VI9K\>-VJ4U>C_> M/>H8A+Z_>.NM&`:Q]UEWAIS$*`S+^Q?X>L76AQ?ZU?4[EWX89G9Y4WOL5&K&
M;Y/+2WM%,VT65N\52>]6NK(_F M;3O53,S(?C+3_EZ@M"I;YPF*JA3#WAJ1UB08
MCA2=!#=@K"U2F%4R,@Z]2MD&;S,C(%I1&PN9S=,CBH5$3JTWW;B%K%6C)V+L
MIQ^3[%SI,JR[>Y=1*UL=BCP%@36=ZP<0;XQ&\)1!PM7J*,?^^6`U8X`==JS,
M&2'RG:E0UM-J1-8?#ZMG5/QA5&+78^J$]2\%_#U@>B?7
MWQ9VVG"(I]P_&13]FBI^M;1'TF4/2I@JAFIR'YCN13(;',X1^U4S./;^TC7A
M8/[_^B\#@0#BD:52G&ZA3&U*F)\B-C:*.+C]4*2"3E61CQBU:[(KX?D`VA\O
MIKM1?G]'8T2I`^4'^$K."08* M#C$J**/_.0M`*;:@#246)/B.W".Y**)/@$H0<+:9JIN<>PTNK]*Q3T.E]DN[
M(5::F?M5EQ<\JLB#96,@1CROE&)B_T)I/@S=ZG)^7YRY)_]_=JCP8.HL`!X#
M`0`0`0`,E%PP&1D0``!@&@``[P7T>```(````%9"0T].1DE'+D5810``B'S7
M$0``#D)\WOO6)..J_O>WV^-=--A%4C&#N^+%](HNT35(INBD0-))RJ15!6))
MVQ-5.B@]N^\,>Z(;*2U3?"Y9)EEZG3,Y:3);4)(#-S)HMZ&CHH(<1$9<(JSI
M$&=/3-6=%)$5";O[_WV@CCSTLG=>N7,MN7Y.^*_!?AN7^`U=WEK&W))[2Z[[
MX+PIP_D"8,F/6M"@F0#3*@"1``U(GQQ\_+$[(3^$33"=V)W@GTA/JB=^)]H3
M^<3R1.`)^L268`=\)RXG-B943X0G0B?)$_B$^B)]H2]$V0E^)Y`GX1-\)^D3
MUQ*U6`8\3EA.8$LA,R)G!/C"=4)UXEN)\P3MA/XA-0)]$3Z@G\HGV!/!$^X)
MY`GWQ/+$EF@$8)7"3A.7$YD3G1.@$S0GQ!.N$^4)HA-,)_&)=B?2$_UB?5$^
MT)>B;(3`$VXGF"?B$]`3U1.$)",&5Q./$]X)DA)XG/[email protected]$ZT3Y(G9B=
ML)1$U`GT!/J"?RB=\)X(GW!/^(GC"?>$\H3\(F^$]03@B35@`O$Y,3E1/@"2
M@W0?.)JU>Z#N?H4/%_5' M;83QMA2G02ZSS^>;">LQ>M!6%+=T")@J`#5BEH\MWH9L%=-LG=/#!!OOIP)3
MH9N>!*WWS8?%*[WTZ/U@WV#SZIMA\9MA&=QK2G0*;8;NGPC4?E(R#::-WQ*3
[email protected]!%;OP*5#X5L(*KHT,"=GZ5!QHV[IP=-4M)L:/9(N6Z%'2TAT
M\YI=DY;[4ZFSC*4SQQPUNVW#FCV6S0.SF@T$J=H]P=I:/8;-NXVATW1[6CI*
M5AJZ1OY>T<'(4IPTU)LG!U%1N7&P0I7.X)1KIJ7U]!0>+/Z^;\/5>'(3FHU$
MN=2HH'4NQ%&=>8 M4E+1.#J1':^6-12N3I0ZCV)$`ZBI:3P$#MFWIG!U+2.&1>A.F<657+C94;I"
M+*GBS;(X99<.G1S5RX01P\[J.TKS[AS1[&C<43)D*_JAE[S(BGL1@1
M1OC7TFRDLW$JG42GVVT;[@:,[9(D=J&S_;!,EG_V3"=1-T&^-9KMZ-#9DLC(
MMZ\84B>#BDHF4A.>:WVNVVCB7&Y7&M5T"C/(BC MC>BHCFYU(XVX^FVH]@=X,IFY7/9[,,I?^*RWI'6W%+Q%K&>E$XV+=':(=Q:I
MAN))'K?]CTK`'+$.3+S^B!5G[Q;"@K/E'+?6-B]T'V^UG_D.3'./YZLVIHTW
M^B5O/="'(1$8Q>-9/@PH'V^">K-C&1?7?3XY$)Y\4-']:S=!$]DNL[_//AKT
M?T_:@Q*.L^$6;6:(7!CGZ&?B/-1TV>5*'./I,1NUG+'Q^R),X_K/F`GU6]8+
M8WL`7I;8W##J9>V-A`=IGTSZL]6>P.@44/L*&-AS46K9EE#'GB18\XQOWBA^
M-(3XTI06`TP!4A4]@/.C*CP9@#G7?J63>*5]MDT6`;/3"T[/[Y(SU*Z+[/I\
M67YZ[LR_DNS3/%T5?@]XHM=8DR2T=N@J;4S&N;VI7\+F[/^_M5<:;BU8LZLK
MA]AL3K++_:_GN-"N_[=G&-FP4>-G-DP(QXRUGB5F*]R:EP(>,FT[&_A!)CJ.
MM!U,T6"C4Z/W/"#(J5LD7_UB7^Z2-/_JLV>[+_\M1[.#3MR_]S__,7_[=K_;
MI"O]V[R__F[I?^&[D57_[=)CFSC_.7FHGJSWX[M4BF/N8[6/LE-6%XB*.Z;%
MRS8G`/2Z+R?->RUU))7 MJKR`6)G*3J[Q5Q*U:%:N!4:8%:O"MR85LB%;E@/2D"PJI`X=&',A_@%6OS0R
MVJ]WYRK+(!_3ALJ][GKJ2JLK5SA=3;&7WZV"]CPOB!\&7NI+A?J!]WY/OV0?
M98GW>@^T0_;%\-F,\PGGV3+7SR],PM>GMBWPV7=FC^@I>FW+N6;\8YPJFU-U
ME3\K'S[;U`=X>@=*K.'#H'NJ&8^B[TT@5K/(UNN\GRJ%C& M;Y$&,?0P9\=GS8DV85;*@E:1L!!COX\(U^AW>]?GM&$>"!I^_R(0>E5P)-AG
MPJ8,?5+\Z%4PE@M6#(*M^*AD&;^M9!6R@5K49-*7SQNIN8D?KT\DI&B]-<7V
M[$,NPXN2&9B6'_1O\Z$:;+`AF.&46GF0W\J" M>>#AY(M.,(A/=)=23)Y&+7Z!J>?":@X$"QHAJ;%:F6$$R5Z'5Z9DI/"P=8\M
M8$\\M4R@UD]8F7B::H-9ENZ,E&LNY+,C'EV]-NI*`!??27?Y;.YZ6\+/Z"7:
M-9C0Z)'4(TB%'M1W]'+D>"B!S=`X&4I7)."(ZQN,IX.PS`\9C/L\UH,X
M=HZ5SM&])1,W^Z-:APDOIEM[-EGM-6741GG9$]HK<]T
M/H;YRRHC#VDX9MRKE]QP^;8PE8%N8Z3M76.P?@:&RX.1I[@/FTT)+G,):UJ%
MDMQ=N9ALW]<^L+VN?.PKA\JZNWDXA758T=6\
MKTL#UI5_P&-PL!+G"PULLE.F'U4X8/V:/VN'[6#]KV;\?DGBMN%H<*QO8*SA
M<&]@JN%[=Z.3>UIS3TIPN8L;U#'S'!O4(Z8L+U"/MAFC8A!RVH-H%Z>7#7$8
M6K+Q&-PX\$](3"';3A=A>T-P8.Y]!+L"HK.\_ M">2#6#>ZNX MJQ\O;O4"WK5WN90$,=O-7*74DYT]4K?;H4Q+EJ).82RKX)NZDGW.,2MZNYZO
M$=H]W$6$529X/O MRKXO1W4EFW85/,!T8S?L[Q*X2NR-T:;>?U.PLG8)95[HKJ2=%C6\UI\"!SL:
M/*(*IJ#U$N5)W=E#AQ6*1G/9D<3"E^1A_%U:X]+2F'J,!S'DM:&VBVG!ZF1(
M!'Q6@$'Y\9/9\<_=:58>HR',9)VB"I\XB)G\$0M23HF"(CKJ<(RF->Z%2I&H
M4QG+%+M48X]*A%:U:T^UW*Z`2[[email protected]@K/>%=:`EARUKN2TY@$KMIS$>C
M893KP,9?X/97S,5?HQ7S]V5-"PRHJ_X\^PB:3I]50K%+^:'(XM_0XC5O:8C'
MR=;`4PL&T"?CPT MR;N'8+4_QPXJ'W>,AIF1/0^IW.4'.C%DJ.B0ADXL($?;"UIUPL[WX7%IEED*
M#DD^E":QR"\8&6S7AMMV8TTQJ,&3Z>[7*.-C0W!H=E7YT)'+BLI:8W#KY7H2
M=O3KK`Y.#"ONN\FX_C,.O3YH^_;7:GHG*2-KX7NB]))/S80O#*-3MN
M3"VG^"$U.IETU4PCD,#=Z/XVT'I*+R7O7^/WE/\ M;Y*&Y4:Z398E/K5$7,F*1++0D6*38V3M*>.2Z:5N,1>(,))>]O*;X\.6KTVD
M*^ZT5P?(2(,-+G5?,Q-+FOX"FD=O>8-IJE3Q=NM&M-EDM.97R]I3%O+3LH:W
M$Q&O%#KSBJFQO'J%5D4"KIR=HYR$R1CQO'W);/CM+2F-2M
M((XO.`E;Q&>"MTL/XRN&\M.K=JNO.O+?LP\P(YU(`%*O\Q.
MU[4ISW^W65_4]E&1T\%B-RG)D[MSW>C%P>N@OD[=5TQ8/C(_0S?P5DGUDK:6
MDYTQCBO>*S*\]YEQ M+18!I-;O$D^)?Z/7%+4ZB5K3K3:`G4^&YWQ!W=;N%:TZ\FLNLAB@0HJ!#IC1
MW^!KK&$O3^>%%HUB].EA$NP78C3J::_:V5A&S30L9H#1JFQL\HU->+4_
ML4:BE!WL1JK.Y(GE&/.1*]*5?X'`>7.!ZUB=F;G,\C`X$24U+`#+*/'$7@5U
MRI8<2PMY\$K#L57*@O+=WSXRP*O/C/6%#8]$0%@H`HE`9F;MRQA<3[4J[?U/
M*"%<(_3]F'I2#573)!>-AV%IK/L9/H%=S&J,5>P?&JZZ^Z^-C7QJO!NS^_&M
MP?W5L2K_`_9
M'!U>,[16\F_Y-Y"M[[`E7[O]51 M%SSX>_T(),)D?\OIE@GRL;R>>3^+^95R57*%AWZKE%X%BKY5^7@*R@J;P*W0
MCR^9D("OT'N:'ERKU/:YH,-+X(V\W,=@\K!O*F`4*189O@>[Z<;8XYDTU1;F
M,VZYDTD7494\8R%QT>C"M+#^6$_92@ER/*D
M^1`"XK&@<_ZE;OU/R!,Z/N@WW]!01_@``\=$*(>=D.X`/^A\`$W>F?5O]:>[
MF)-",'YS:*MM.^+?^(/EED)L]YE7<&7=P%KKP<'B!]". MJ!Y&0Y7D2L-5`&-/-Q\[?76F16X-W@WBDW]:!UX`LWL$8^$W M![QW`-=78^GN&$9;GWX7(1ZJV!.WW)@\+_/C?#QIY#]_&GWVC![,,[R":^!K
MPBE-H2)NIPVED7B]YV>B<7S2!KM8?$X=>/8#P[#6+/CCS8G1H[34'
MN_2)Q0?;O3ZI6.@V3C]$UF5,<@\S]%>/`)4X`KHFV5B\`5.1!'O(O`*QQ.`5
M$KE.,:3<.4@@U3C<0'NBX5$$%6]F>$X4C%:GSH:/?,-1Q9\V+PO[J2US%R:T
MM$%:7$%DDW4_;T5D15]N9LHJK'I^O#1T239:.ZQ(L/'/P7`\9OBSZYY?Q&!K
M6+EBSO#\%$=HXVKXD;>CP<:I7!D6C9:AWE4O)-HMG%JR M.EBHU26&#X*AXU1\7C5Q)A)I8"GI3YL;>(*T_%"#*/1Y'S54^`'.7WH]A@_>
MFYH& MZ37IW)%NS=A$V3YUGS;_'#B6'>GG;[!2P5/2FB>EM)\9`R:\9'],")K'.P8;
MRF=R#%XV7+7Z)KWO;J2A/WEV9,[LQM;&2^O;-GLZ2.^,8`HXO@>"&SYN'7DZ
MD$T/%4OOJ/W>58J:Q,5H)MP2;.Q0,R[PY=$[+?%FO#'J'K[J2(W)?B*87NZ"
M#&NZ?^8$%;UHG]X",`S%8!P/=`.C-VZ2-![+IR46D8<6F-WE.[D!X6[6H M%1^0FUR3''`8;R?&3R8H8G$\#_G]#AA_']V^^>!@ZBL`'@,!`!`!``V67#`9
MA!0``,`A``"O"VEB```@````0TA+5D]412Y%6$4``*J$&74``!&\?>%X>S2;
MDU_Y]/I](0"*JTKFK#XU6:U%.$C36A`51(VW5695!51N.$5+6@])/AKM49:;
M6TGP/6[;;VQ[K[R)M=L!;@M-M%NR08*"F+0#>X>5]JJMM^2"\HM`5&3^__OH
M`-S<]M>W:^WO=^'OP[O=^;G=SLC;DCVEUSU5D";XD:2^'^I,(:0GZ%Y"98A"
M(@?O`?R@?8`_J`V`&R`\4#\0&]`]0"P5$)&`60&-`\HPA.8!^$#TP/Q@5JLA
M(@#D`/?@?``YP#],"T`Z8#J0.L`^4!H`+D#Z(%$#Z@'?`?R`:P#P0+X#:`>0
M!]\#SP-^![($KEK0.:`R@'Q0.H`N@/V@/^8'[H'\@&N`\$#Q`-J!Z`'I`>J!
M-6!MP.0`Y@#X(&.`R@&>`SX%P!^R!I0/J@?S@:\#OP/&`W(&[`]$#?`9@X.^
M!H@-N#)@68'3`
M=2!G`.U`^B!1`TX'?`?]0/)`Y>&&58&/`ZH#K0.U`[<"T&@/0@=6!UP&;`O`
M-D!XX&^`DAR$R8'Z0'P@/C`?+`H`?K@?N`?6`_C`U0'\X']('@@4@/1`X0$V
M(&C\#D@-N!J%7ND5$O"=(#2K+PG;_:ND^"CO3';4UH1`[B-8,>_T;14G1SS^
M2:&)T9!_'M%:=&1?LFAJ='.O\LT6)T?"?Y%HP3HLWZYICD#11^F[:P:2]FN$
M815WQFO9FR>>C_,"I\^](8ZE?A&H74V$4O8S--P208J9L/K$83-.1=>$L/\2
MT:841PG<,ASKUM3^8<+:'+X:F7A%%@9$KPJ4T]
M87`+.Z3S3Y-BM\2RHC3@P>Q#!O-Z1M3Y4J@49?H
MIO9'T#<_S)YPXGI_:'[>;;S?F3KF=;G:MQ-[2=DHH\^ M/S.=/\TZ9VLZWG9)D>6K/.#W.UG3]FAMML#]SM9\($]S0'RWBZ'QM-':K6:J
M///\T^4/SN;/D,V>S*KL]''GZI,SGYQS/4$^X/H-F?N-K/3FU/FPEPRYY^=S
MAY^CGG&WVTWN7!\W/[D)+;STX55S;D]!Q.MS]K-N)_Z3D\K*AQ)\_ MG4A\IU/SNX^0^*U_;03B=G5#[0E/F8/FM`WG)UPH23T^'-F`I=%-N)T^>V93
MYO.E:D]"?FY]QN!5V4)/QR;=Y[^Z!Q6:CL3/2158V>GQ+(672=WW*UAJ_ZE5
MAL/[H9Q\Z&^O\]W4?/=W/SW<29_6[\CY[O>?SN\Z]I^@0NQ58GK44V-JOY;&
MTOQX0L1N7L( M`(-XJ"5K6`83[I6@+<4YJL5L^*T,] MKB')$5/S8`])D-AHR,5&^\(KY8A.ZE4B*T./C(6]QKW^QTG;V$Z5BU@XE$%O
M$.^`+-87U_\OS>VO]]T/_W%,[:%I&L#%O:.B@*JTB"K0;[X86+NQ5XO)07D"
M*IR**?>I$C^?P)7QCEJI-`4=[%
M4U%>14S345Z7QTB^.P-!H[124U%TRUKXOCK8=Q(IW"9C?BM>"LBUOT9C!I&N
M%23$!%KA(S$"$SJ7K0:G7*J2*V`T:+F,S47Q/PZAM3]:)Q,I!:6'6&#-/-"S
MH[(W%YVT[NGDV$(JJ;XE1TB5/6)\KX%>N_(F] MF@PGP,LSKXD M8$&"HIIC#4RYZAI*.5%ZAH(+6`G>(M8']&TF,9M*CK$DS
MND.W\%X:Q_ZZB&5I2!>FY]$3&GU4OHM#J9>.U>IU&&T%A4K1J"<1$)*)M?41
M&)L^0.=41I'*Q+.07ZM*6@E[&?D0_>SDV7F[H-N.;O^:??_V3[E=88(($K?L
MJ89^H7`KZ.&\Z3R"E)J8!8UIM,&MQS9+`P,4QJ.GW,U"VEAL57\ MF,\X)W3(EZ4&CE>F,
MZKZM5-DOT0$LA`[>+@2&&R]@2&PW\Q$IVW\6)>C!?G5I&R5!`_\ M+J57K52"UU*C@X<_1+5,A54,GO5RV/Y\F=>DW$-O5JV2.Z!*&)=2O0)!<%A9
MPYX\JE(6-]F6VVG2]C"<"^.\A.!.H-MMJ#<%PO4['4^=8N/NYO[#A!VTL*_K
M5;9+R[]*YO^(=\1%-Y[J5$D"-.US!3;5*[O^W@_+ZR74APE7 MO.I]$1.>+T'/E(FQB3^G[*J:CIS:S<_M)T_93S>=G'-`W+!;'Y&@0 M./+/<;>;G)V.'##>$A,93P0KI0PB'>PF",A,%Y*UDZE%3E6ES\#N7.+RH%ZU
M=[+DWS\F]?D;6&T#D4_Z%]X7`3V81J7LP[IHG5WNC'"(V3?.N'06G61P77[-
M&38(?O_D0IV=/28[%TD^'VXP?TE^'&#ID_R1 M$/<+K#?!`)2F"EZF"DS[7_?)MV]2?*3BTWMX7HPR8Z,%=
MB-L"78PDO`[2YZYFW4J.CUSKD1MH=?L'*XAIQBRTSJ"Q+UNT_EFD@AE:B'6H
MQ42MDQSL[M=YT-)G:Y50JTMWVG^9:,P34_:$BSGD,I\Q-YW:+S6Y)RKZ'^4%
MU*WA#11V$%+['9&F2%@S_#]JT;VOS5M&2'/LJ(ZK=\*RHE]6[XEE1,*OU;*B
MR-7-<;'E(4=,O=T*YW,'5\;;1DUQCDS7-E-2F)R9B#>Q*;N^'C'#N?B'>(=Y
MPIVN3MA5D;:,1MY2#! M,XXA:69BR^E]=#W22?LMSGT[(7-QRZN$MV/#H5^%[&<_6M"%Y?V_8!-RU=O[
M``''+^XI7X_L7"2M]%E=;[>&;TC+(PU+%9.&\^]@$WC'PR5&;$"7?12W""/I
MJ+T*QIIVYE;I_P>KU?Q2#VJX="=3<$R#6-*(6E%5%M:V)JHJ+IOTF0:2AZU+
ML;]K347-I*+!I6O8>*O!MHRFHKFDHL*E:P%*LQZ%-L;YX3ZEM&-S&;W@7JK>
M M(K.-)4L"5.4)4Y8E3F",D8HPE)%'DLSLT3\Q*5AFQ%]0_!Z2K?Y(GJ84=65_
MA6T929>EES*.S-YO^[%A%\#WR/"9FVC.!\)'G?E]^R1YF"^[LCS/CW%O(J&8
MMF+9YE# @D:8P2VYCP;L\6SZ:I@E-F6K-Z,Q^S1V1VLH_BB_/L_OD=87B.
M%=A!@S-?JAGC>NM-%*M9K];KMCY,U%K?>>6XV]G/U;RT)K=>_6O()&?%9\E-
M[.S4R!$;&'?.8NHQY(=ZYR&\>LI-CCR.3F51DR/^C2OHT914;_'TC#/$I&,B
M2R8QQ*5Z##),WM3'$J8\E2T#FJF#8[4VJ;?L$N\4;1@E$&?PP0S+'A]X'F+@
M?TZC/$ASI$CGP?<5&)9HE1($2D">YCS$F)*B1(EH"5LDEJR`E2\(GN=X8DM*
M15_D6T9'.UJ]ZY.2\,DL_ZKZNV0N:Y>D8.#*0Y]_U#8]L$#K'=D^;.[))436
M-JXVY225DUF8QQL>TDFYAJUW;UYUM&/B&=]&=_F,]X4C]/P_$DI-I*2N?0U"
M$^YGA.)SK=N)OLAXF@"1T2O(VH&ZDWY+4&WW+>>VFU"?G?$\-GF_$S
MI^BH&^VFY_9,WOI'-"6M'*M!Q%*K6H:$Z&\@(]:1WFC,92>K,W:WSLFRDUC?
M'"H=YR[=K64G+F[A5:O.*3H;.`L(8WB8VR<0V!QY,Z2(W%OQB=#30$>4QD;+
M=KI'A[@W"9O:MY6W=6\=$JQ2JZNFEW-72BSJU=72V@LM^P)U:L;0*$;0'=I(
M=%/:%%C7$CR@@U\BCI#65)+FCVV#-Z/):*_C+R<"NNWZ[@>U=OU?
M`]N[4X*F2,N9*5UVYR,I[5VYB92MNW./LP]&S(_S&H.F6"69)KBH+5F8:&]S
M'D2\@ND.SES*V[FN,:.D%^96JH2.\_=&!&Y0OL)!<5%[0C_*-O M[$>YEB)+R8I^=,G3+*#]`:H58TW^2M?%P6X>[-9\6DB7A)11(Q-:9!6"E[=V
MY,KVCK=1Y',-3:N/&_O3TBQYZ0+$?]E"GP4 M`[BV1'GZDRH+SVKNDE\G2Z6*I-+E*2:RMG+Y;"-I=*Q9O8L,DSN029=X9HK:
M,SCHE'R".#6;UG5 M9_?(W4;;[^#!A(4J.K]`-3"F>1K+AZN(9(Z4UDH@&^/+BT,:+.7'Q_Q6!%$?
M'D/^EC%[/BLO2TJYDHB&ZV-L7*MY.IEG_1(8HYR>B(JKH^R;0G5\JI M+E,M4(EDC-`ZU:]E9;J(?%RZVI'[^3Y#E8R=JL%\CA2-ENC$I0B-O)\A"]K<
MKUWV,?^UBGYN(?SP/V7IJI8(-5"/_JS#%/B=94DTN4SYFLGB9]#4:O[:$B]C
MK7RFE@Z92^K!0R:6W@M,JYB99I$H=9+906B]!5+`V"+'"4729B%LY!07UL2D
MZ@UJ]+[$&$1Y#&(TC4ZC*CW65&]&$Y42FR&4A,@5=L;*BB`COW0.'0KM^"'O
M$NC`:1+E@&&7RVA:^F;)Z8Y!_&]3TXA11Q<+OVA&_*@(9D'*.F.PJR0Y\;:4
M416GI/X'-Z[O1P9`0?_.6X58ER17_@>T=Z>HXVP@<$+2,2\V`%AE6A^X+I;2
M\J`T/H8B6HX![GJ^GHN6U?]%0^1]WG9&FHN7%+4KPUN9SEY<@_*(S>C5M\$U
M:J)=%JN1F%ZA+XYJC2R,!"+1:G1MC11*/41M`T7BADD?=IJ'EX4C6"6"YN#"
M4'P%:!&T$#QTT>Q@)@!S$;37:Q7=*[@*?H0[]S]:'Y/^FY7
MX%Q@75'8JJ.Z)#W):UO@7*Q42CN2!3]DO55^R,)<7%Q=1ON]][[@U7[N2]_X
M[BWN+G2H7GK;G'8IYZVY6/XGUNV?S5K-#KSZ$-UZ/F1;DZXO+CC\WL6JE/EW
M%R*X7B].D4=.;625C0F.['%(U
M^'M!=K)#GXAC9;N(!JN=CJ;!J=#\7=J]^J(KZD;8M\EH"H>'XNZ,9\63L:$Y
M&Q?C;A5(VB:.7$^1C&3N)D.C6,B+'"YEQ%D%W8W]NKZ^D=VF*SS$JG48`%7.
M\'25C14W[_<+JR^]E#+:=_%C21<1MNWR&B"@]=RPC;17U`@?'0Z;-Z_71N"C
M9R,;I#8O$6\)&5C)WF0II+]H>S]J_BN3@]OKH&25EAM$7`^M554B[TAM4()/
M#;1>$`<7IOPW/3U8E^>24D?A%Q')RX`TH^*("FW@"+N+TEKH*GSQJ9!!H3A!
M6"^KH#!+I0(5FN8"<)+IDB,-)T8^F(HI;^*97%3-#`QD@+-6U.;*)38!*?A4
M2BEA]!-*KOE<3R37?O2'1D'O5JG=KU?Q5Q^:M MI@<7`MWQY"#7*[I^[M'7,6UJJYY;) M'&0ZW=T]*,:KZA6+QM.P2:[NHG[*I1I,720&J]AE#K*OF]?&UKXUW@6[+OQ>
MX'S7J=W\QSU?R=W5K"5GYT#$T@N),X2/'&W.)P+K`N:-\J&W.MSE5P?;AZZ&
MCI/5&-UNXB(Z3RSA;1\0V!Q4+V!8UO^$!['1N6CN^U1CCXXY7EH[):HP7E4+
MWGH^]Y,;[SXG&IY,G,^-8Z^_^`F@T6.)O?15$Q_TA]5$/L0MD(](OU=(^S1(
M7N:9W_.UHGIHUR6>LSB"QKI/&YWBBEF'.C9.\NZ?R3I\O<>!@<(G30SNI+P0
MZAL7R4=>K?:_)76OD(*M\&T\W(Z3FVVF0QN#K!?==\$;V"H?LS;=6Z?GJ(]O
M#NG_>NGQSBW%3]1I46W_=`]Y"_7OM)S;A_P/^(=X0X\5_S#C[W1$KY1G MA&G`5*=4B?:R(9/*LE(/I="AF\\V3AG/()KM8R3A"\BQ$(8=%L^*(X)P<.KI
M_D/MEA8?;NV5(L&X M=\I#6E[+E&(.4AV'U?G^!LB/UE?H.!.J-BO2Y4%#OF.HX M[%RL1X01)>W/V\_ORFOMZ#?PC7'I>O!0SXFA1V\99C]5E@3HAN^',1#OG)H#
M6Q;>+9W++`0'5<=2\*'NQ!(TBQ_EI-JO<][2,"O:$SB798K!9-<9AALCX\%"
M,'`ZHE2X&"@K$.4RA0Y:;PEX'$M&01X(;:CZZIR M?)=91.ZR)&\/&V/?73=96JA7D'N'B0 M5**,+K=>^4Q4+K.ZY8'I&8.A[D?(1^,1_'UXBZFBMX0C?,[P38C+>'9LC.#A
M,I)8Y6B)FOO9?]:CLU:.!OR*K[V?5O[=B<)YE=A50G5(LOP##.Y$J-]RU*=V
M#HB?2/I&?)YT,-D0@4])S(Y-EO'0_>^3YAG1&--0NHJ+=M8
MA>/F$J_Z%M&0'KNW-T'IFM;,V2V#5K7Z0N(X^^D!.%P(.]GR<*L++F2PB`.;
M\;+T\O%JR=`@S3K"DD#\Q[^;T(ENV%M&%3DEPE-=6.(_AW5%Z`
M^9_KY-+ZA"H`W$0!Y*_Q$I'N6D.2ODDHR%:,2_`Q43H?`_UC3=CX&3=_@+U8
MEVWOF--,!SR[+4X>CYOD3(,$G_OXSY"P8.HL`!X#`0`0`0`-O)9!&0T(``",
M$P``?4'Y%@``(````%9/5$5"05-%+D1/0P``TTHU#@``!I%SO7:1-QS;SB1Z
M;XOFKW*M\F#8V/I6)1*#&-P5HY.ZJ)58;N`9STW-[ MBO6V6Q55*JR]:K;?!?!77WNM;;;>+X\\_[N5:G\13%=Z[T&/%;QWL.`KV#JP
MXNQW7\A3XFFK4]2VIZ$,22F$@F9T3)U#_E$M MO461:)HF5R+[5SEH1KJU)DUHE,;,K).U)-SF3IH M2![8XP#)+*J-+!TH:6I,R:M1 M'R-7>$[:##%Q!']YT,B93+*YVO1!
M<<:]2@DLR M8Z(DS,"`A2Y8TALW`&&VC;N]S/8J'.A,9=*M"I%T^6S8XRNH8TK/,"W;TIDG
M27Y^2GW6Y( M:0C8`F%JSA!C>,61)+R-0J1,06MI8PP_HGFF7J+?RS)"?!6V+T`&#*IBZ.B!
M[1B;:YBTJ0"4J,M_Z.;@KFBE6I6K5BAC5*0$TD.U_FV0]XMR8]3FT'_8D
MHC+`C0FT7[/APB](<='[_:3HHY$MV^@R;`T*`TK<44R6,_$I?/ADZXINO]Y$
M(H&H;\$8+]88)<7%[?5\F2%_3GSH=4)
M'[0F$D%#) MT.A`H82)$[G<(%*8'>(^C`'J0IE,[Z(7/]*-_4,ZKU^Z5\59O^%D0
M)^G]7JPX[M>[]ETBK%<=0-"R,2*4>4V1A[)TRPQ`IY$2,.GE$;`)$Z@$RJA8
M%6@[NB#G\UBS7OP8P1[XD<)>4F3Y&%G6QH$LFO=,YZ##1*AT7,.#JO=;D`K;
M&@E"N3*K-/1+!175!G-+.BW!=KW.KK^(>=:$H9DHH.^XR[B)TX;@(F,Z_1B6
M[U/0\TPV&/X(+Z;_:`6!&@5*Q(+'*34^#?<2[^$TKOKS.1<,6V%(6&%:5-4E
MGR@:\_\^?B*]W;UXK?3>P=9=6+#V%VXKOJO8>Z`O5=Q0"\!!_\UU:FFQ7\W,
M%2%)[email protected]^"T>)#&/LP#LE.T^LMS!Z[QRR!SK6=QI;Y(=C$8E3)A:N;6
M=Q\HDQI=>V"M M#M)S)Q9;0*MZ`?\J)XVE!?=05-!Q;V5HGT'XID_?.HY#0HIHR=[A#Y$Z%GY2
M.WX>"24*![&,5F,#^9$)\3<%_:CFB<2LBWH+^"31`%4(P"&* MT(%R!M6)6;.*1N5H]*-LW#L4$WA/J&#""F?=]!?0_!:?/AXL;$JH;8*#6=/$
MS.]5J4V4V@YV#@;<,L<`&3W05"B+JKA=5S^XU/>]^8=*-(O$.K"LC72
M3N,$[L3-F-D@":*6?U.FC?C&.A(\:989R+Q0-^0\2/.LUPVJ(J1C:< MA[V9'&1(:R\[_7S@[BNN%$&$ M&)$/<12H!I2\HALYX_03Z5844^@PG9(-M34#1X<[[2GC26 MY4#GDBW`O0$JA/*=\26(-\R?>;'H>,140,'*?EF7H_M:S_*DILY>P08[=^^=
M)ZFA!_XQU:E[L[<.+';P8[5.;"<^-#XS9:O2Z/:69.E2YV4Y(O"'DHV.7-YO
MD?Q!UI=&K/*(&(C)!L.^!(?%UO;V\:&V`XGL1WG1RVM6RTX%_X.T,0Y`(7%R
MZ]FB][0,W1NE7JU.6C!FXN*YZ;=[!=Z;V,>$TT17*`[email protected],TT\K7#.'
M``%P%D>!2H.&VB<4P#JZJ"&*-L&>94G?3#`>92(!WU'T1US!(GD6FL?((QCT
M'@H-KV&\7V4O*+Z;%#3?6]E;EDKX_LQ
MTWFR M&HQI3NHMO0C^5KI]GH0P9J+<0FU=KWG/4\>H7_0?D$4C\G072#K^/V%Q6E=6
M02-4QMJEGU/[AM>PZNOLAS][JOH:KX>X#H;S^3 MN3A+E.SC9>L@UF9'2=L/#7?K+"7ZU[YRK%89Y"F2QHUL=DF/R.ME0&8]9"3]
M#763(G;@26U_>1N3W$;;E"O)6RV103F''1^TE M'+XV9>/X$VS_@F^69Q_?0/+_.@<4'=VG43_V5Z-XLXE1#BP?!]3YLR6/Q'71
M>_?/1W4[O+X\7X7>^J1_P'H@(JU!4CRA;Y(4\%HGK#8X'080;/AL+;M7QCBT
M^[,-"XM^"?)6;KE25@]"+A+TC0^+FL6>`R)R]98=H@G$58]',?1)3
MNB&#\NP'R*CR+]&1VCK7A7]PQBV#]Z';^UXZEM`E9V"5>OO3SCR[T*XXLB_#
M>>.[SB4X7[NZYVF)\W!Y?`X<_'YN#F^NQ6\W)Q\X2NR/A8.A$\1%OC/\5):+
M,;07*1]?`0SBG&[?,HNQ;'[]#[/0!?S`8.HL`!X#`0`0`0`-)!CZ&-$!``#R
M`P``9E5_C```(````%9/5$5"05-%+DA,4```%#B#%P```;5CMXVVI-YXE/2>
M+A(2`%2[`EO"(`1 MC3'(HA`K[KFN,@ON`VA\.?G#:TUL[D];EU%B`556!@L[`/`6'X! M+`7%CGFIL%R>Z=G@T-BEL`JG"+"^0*C20V"R])*M`$L(Q]XPN,`H8!V#&*GF
MB-B"Q9P&M$S%P-U<(1/%1AX-O1-E8]=PJK7TS-JW76>:MHDSUF`]ZR,-371F
M(U'$^GLE1;;0THQ"UC6^G$:G&E'8.$:6CGDI=Z_\U#4USA*YK*XY"@7'$\;*
MV^VL+5ZWL6>:%(1)R6;-T5_UI4^2KK1ZBB=GF#\Y>W0" MY^FG-1G@/V44Y?(9)7[A[PI0U*5S$-HU'+,(\5`DF_G\3M%$^-#)DT!QY
MN'X;\GFQ@C)^J&,'O,+E=PPVE#YHA*0'AA26O<3Y'YH3I55K31GG)R'XR?,^
M3^R%G8L@L&VX-2T^KM_.0\,;Z.W11U>.*O9H_3[-\>CH]LG7Z4[)6T03;]]I
MEQ=?$>4=[D[<.QNT>62@\AY1WT3NJQ3$;JO](;Q_[GOU<";E.5L%/ADN4CP'
'GF]`8.H``.H`
`
end
sum -r/size 47373/28935 section (from "begin" to "end")
sum -r/size 50406/20977 entire input file



Time: 02:18:57 Time Left: 00:49:07
[45] The WWIV Modification Net



89/100: MultiNetwork MultiMail - v1.2
Name: Buckaroo Banzai #1 @3452
Date: Sat Oct 03 23:57:58 1992
From: The BuckBoard Saloon and BBS [314-631-4069]

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Mod Name: NetMultiMail v1.2 Mod Author: Buckaroo Banzai ³
³ Difficulty: 5/10 Date: ³
³ WWIV Version: 4.21a or greater ³
³ Files Affected: BBS.C, MULTMAIL.C, MSGBASE.C, FCNS.H, VARS.H ³
³ Description: Allows use of Mailing Lists for Multiple-Network MultiMail, ³
³ including adding CC lists. ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Back when I first purchased the source to WWIV, oh, I think that was 4.12, I
found a mod that I really got along with. It was called "NSMAIL". Written by
8-Ball, it allowed SubHosts to send mail to the sysops of all subscribing
systems of any sub they hosted. The only thing it lacked, however, was the
ability to send mail to COsysops, or Limited CoSysOps who ran other message
bases. Well, I was teaching myself C, so I sat down and put a few things
together (don't ask me how, I lost the old source code) and it worked! Then, as
luck would have it, I was laid off. My Laptop, company property, was
stolen(given back to the company), and with it, my only copy of the modified
source code (since zapped by WIPEINFO). Real Drag. So when I got the source to
4.21a, I decided to try and figure out how it was done (again), maybe with a
little improvements. I re-installed NSMAIL, made a few changes due to the
fact that NSMAIL was written for 4.11, and then sat down to figure out what I
had done before. After fruitless hours of effort, I trashed that Idea and
started from scratch. This Mod, based loosly on (and compatible with) NSMAIL,
will allow you to create a mailing list in your data directory with up to 100
addresses.

UPDATE & BUG FIXES, v1.2:
FIRST: BIG NOTE: if you are upgrading from a previous version of
NetMultiMail, DON'T FORGET the change in Step 7. This is Nescessary for
the new version to work. Now onto the standard Upgrades and bug fixes:
Oops. My fault. If you've installed v1.1, any file you send would be
deleted after it's sent. That's corrected. Now unlink() is only called
if the temporary file is used, while inputting a message on-line. BIG
UPDATE, new feature: after the message is entered or found, you have
two options: You may include a note at the end of the file saying
"NetMultiMail sent to xxx Addresses", and/or a list of all addresses
(with networks) that were included (commonly called a CC list). You may
select one or both or none of these options. Also included is Paladin's
addition to access NetMultiMail from WFC (Thanks!). Last but not least,
the Long-Awaited Title version is available now. I have recieved some
reports of this mod not working correctly with a Color Title Mod. I
don't know if this will fix it or not, as I have still not SEEN any
color title mods.

UPDATE & BUG FIXES, v1.1:
I was told by someone that entering nothing at the "File to Send"
prompt could lead to trashed EMAIL.DAT files. This Shouldn't have
happened, but since then, I've put in further blocks to it. I also have
improved it in a few different ways. If you enter no "File to Send",
you are prompted as to whether or not you would like to enter a message
manualy (only once). If you do, this will be using either tedit or your
full-screen editor (if defined). Also, if you enter a file that isn't
there, it will tell you about it. You may also now define the MAX_ADDR
for the maximum # of addresses in a mailing list.

FUTURE FEATURES:
Next release will have a utility, similar to /E, which will allow you
to edit the Mailing Lists or enter one while online.

On to the Mod:

STEP ONE:
Erase your source code. Yep, all of it. (Yea, right. if you did that,
you DESERVE what you've got comming.)

STEP ONE and ONE HALF:
Grab your handy backup copy of your source, and unzip it into a good
working directory. Or skip this step if you skipped #1. In short, MAKE
SURE YOU HAVE A BACK-UP!

STEP TWO:
Fire up your trusty copy of Qedit and load BBS.C. Look for the
following code in function mainmenu, and make changes as appropriate.

if (strcmp(s, "CHAT")==0) {
nl();
pl(((*(char far *)0x00000417L ^= 0x10) & 0x10) ?
"Sysop now available" :
"Sysop now unavailable");
sysoplog("@ Changed sysop avail status");
topscreen();
}
if (strcmp(s,"NMM")==0) { /*_+_MNMM_*/
sysoplog("@ Used NetMultiMail"); /*_+_MNMM_*/
nmmail(); /*_+_MNMM_*/
} /*_+_MNMM_*/
}
/**************************************************/

Now skip down to void get_caller(void), and search for case 'Y':
and put the few following lines after the BREAK;

case 'X':
okskey=1; /* add on by : THE PALADIN */
if (ok_local()) {
holdphone(1);
nmmail();
holdphone(0);
cleanup_net(); /* Hey Paladin, you forgot this one */
}
okskey=0;
break; /* end of add by The Paladin 1@15455 */


Save BBS.C.

STEP THREE:
Load up MULTMAIL.C, and step down to the end of the file. Block read
the next two items into the file. The first is a structure declaration
for holding the addresses of each person on the list. The second is the
void called by the 'NMM' command above.

typedef struct {
int thisuser,
thisnode,
thisnet;
} address_rec;

#define MAX_ADDR 100 /* Changed from v1.0, defines */
/* Max number of Addresses */
void nmmail(void)
{
char s[81],s1[50],s2[81],s3[91],s4[91],s5[60];
int i,q,x,m,max,done=0,cc=0;
FILE *fp;
address_rec add[MAX_ADDR];

nl();
prt(1,"(*> NetMultiMail <*)");
nl(); nl();

outstr("Which mailing list? ");
mpl(8); input(s2,8);
nl();
sprintf(s,"%s%s.NMM\0",syscfg.datadir,s2);
outstr("Reading in Distribution Control File: ");
pl(s);
if (!exist(s)) {
prt(6,"ERROR!\7");
pl(" The specified file does not exist.");
return;
}
if ((fp=fopen(s,"r"))<0) {
prt(6,"ERROR!\7");
pl(" Could not open Distribution Control File");
return;
}
for (i=0;((!feof(fp)) & (i q=fscanf(fp,"%d@%d=%d",&add[i].thisuser,&add[i].thisnode,&add[i].thisnet);
if (q!=-1)
npr("\r\n%i @ %i, %s",
add[i].thisuser,
add[i].thisnode,
net_networks[add[i].thisnet].name);
}
fclose(fp);
max=(i-1);
npr("\r\n\nTotal Addresses in List: %i\r\n",max);

nl();
npr("Title: ");
mpl(60); inputl(s5,60);
if (!s5[0])
return;

nl();
prt(2,"Enter name of file to send: ");
input(s1,50);
if (!s1[0]) {
npr("Would you like to input a message? (y/N):");
if (yn()) {
sprintf(s1,"MULTMAIL.$$$");
if ((okansi()) && (thisuser.defed))
external_edit(s1,"",thisuser.defed-1,500,".",s1,1);
else
tedit(s1);
} else
return;
}
if (!exist(s1)) {
prt(6,"ERROR!\7");
npr("%s does not exist.\r\n",s1);
return;
}

nl();
npr("Include number of addresses? ");
if (yn())
cc |= 1;
npr("Include list of addresses? ");
if (yn())
cc |= 2;
if (cc) {
fp=fopen(s1,"at");
if (cc & 1) {
pl("Adding number of addresses...");
sprintf(s4,"\rNetMultiMail sent to %d addresses.",max);
fprintf(fp,s4);
}
if (cc & 2) {
pl("Adding CC List...");
sprintf(s4,"\rCC: ");
for (m=0;!done;m++) {
if (m sprintf(s3,"%d@%d (%s)%20s",
add[m].thisuser,
add[m].thisnode,
net_networks[add[m].thisnet].name,(char) " ");
strncat(s4,s3,(int)25);
}
if (((m+1)%3)==0) {
strcat(s4,"\r");
fprintf(fp,s4);
sprintf(s4," ");
}
if (m>=max) done=1;
}
}
fclose(fp);
}

for (i=0;i set_net_num(add[i].thisnet);
strcpy(irt,s5);
if (add[i].thisnode) {
load_workspace(s1,1);
email(add[i].thisuser,add[i].thisnode,-1,0);
}
}

if (strcmp(s1,"MULTMAIL.$$$")==0)
unlink(s1);
nl(); pl("Done!");
}


For those of you upgrading from v1.0, this is the only change. Replace the
ENTIRE function, as well as the #define MAX_ADDR above it.
If you are upgrading from v1.1, replace the entire void, but the lines above
the void haven't changed.

Save MULTMAIL.C.

STEP FOUR:
If you already have installed 8Ball's NSMAIL, you're done. Just MAKE
FCNS, MAKE, and call it a day. Otherwise, you're in for some fun. I
will not lie, the rest of the directions (with a few upgrade changes)
are taken straight from NSMAIL, as they are the exact commands
needed. Why waste good ascii when it's already been typed once?


Step 5: Now we get into the nitty gritty of the mod. Load up MSGBASE.C and
search for void email(unsigned short un, unsigned short sy, int forceit, int
anony).

*** ADD TO THE LIST OF VARIABLE DECLARATIONS (you would be surprised how many
people miss this instruction in my other mods. So I'm putting it in all caps
for the vision-impaired)

int nsmail=0;

Don't forget the =0 or it will won't work.

Step 6: Still in MSGBASE.C (we'll be here for the rest of the mod) add the
code shown at the very beginning of the existint code. /*==*/ shows existing
lines, /*++*/ shows lines to add.

/*++*/ if (forceit<0) {
/*++*/ forceit=1;
/*++*/ nsmail=1;
/*++*/ }
/*++*/
/*==*/ if (freek1(syscfg.msgsdir)<10.0) {
/*==*/ nl();
/*==*/ pl("Sorry, not enough disk space left.");

Step 7: Look down (still in void email) for the lines below. It's about
110 lines in my source but I've played around with it, so somewhere around
100 lines. /*==*/ shows existing lines, /*++*/ shows lines to add.

/*==*/ m.msg.storage_type=EMAIL_STORAGE;
/*++*/ if (nsmail) { /* Changed for v1.2 */
/*++*/ strcpy(t,irt);
/*++*/ irt[0]=0;
/*++*/ inmsg(&msg,t,&i,!forceit,"NSMAIL",ALLOW_FULLSCREEN,s2,0);
/*++*/ } else
/*==*/ inmsg(&msg,t,&i,!forceit,"EMAIL",ALLOW_FULLSCREEN, s2, 0);
/*==*/ if (m.msg.stored_as==0xffffffff)
/*==*/ return;
/*--*/ if (nsmail) /* DELETE THIS SECTION FOR V1.2 */
/*--*/ strcpy(t,"Multi-Mail from Buckaroo Banzai");
/* These lines were part of NetMultiMail v1.0 - v1.1 */
/* They MUST be removed for v1.2 to work correctly. */
/*==*/ if (anony & anony_sender)
/*==*/ i|=anony_receiver;

Step 8: We're done with void email. It would probably be a good idea to
save the file now, just to be safe. In any case, you now should find
void inmsg(messagerec *m1, char *title, int *anony, int needtitle,
char *aux, int fsed). It's above void email but it's a long-ass function.
Once again,

*** ADD TO THE LIST OF VARIABLE DECLARATIONS

int nsmail=0;

Step 9: Now add the following code right before the existing code, just
like you did for void email.

/*++*/ if (strcmp(aux,"NSMAIL")==0) {
/*++*/ nsmail=1;
/*++*/ strcpy(aux,"EMAIL");
/*++*/ }
/*==*/ if ((fsed!=0) && (!okfsed()))
/*==*/ fsed=0;

Step 10: Hop down about 30 lines and look for and mod as shown:

/*==*/ nl();
/*==*/ helpl=6;
/*++*/ if (!nsmail) { /* this is the only line added here */
/*==*/ if (okansi()) {
/* after this it inputs the title. I forget how it looks because */
/* mine is modified but the helpl=6 should be enough to find it */

Step 11: Look down about another 25-35 lines (this is after the title
input. Again, mine is modified so I can't show you what an unmodded
version looks like but the fsed part should be enough to find it)

/*==*/ }
/*==*/ }
/*++*/ } /* this is the only line to add */
/*==*/ if (!fsed) {
/*==*/ sprintf(s,"Enter message now, max %u lines.",maxli);
/*==*/ pl(s);

Step 12: Save everything and re-compile.

*** USE OF THE MOD ***


Ok, I take over again here. The mod is fairly user-friendly. Go into your data
directory, and create a file (any file) with an extension of .NMM. This will be
your NetMultiMail List. The format of the file is as follows.

xxx@yyyy=z
xx@yyyyy=z
x@y=z

Any number of digits, as long as the UserNumber (xxx) and the Node Number(yyyy)
are both less that 37200. Standard limit. The '@' and '=' MUST be there, as
format controls. The Network(z) is the one that's gonna give people trouble.
This number is determined by subtracting 1 from the number listed in the 'N'
section of INIT for any Network you belong to. FOR INSTANCE: Say you run a
three-net system. Your first network is WWIVNet, your second, WWIVLink, and
your third, IceNET. If you were sending mail to 1@1 WWIVNet, 1@3050 IceNET, and
143@13900 WWIVLink, your file would be as follows:

1@1=0
1@3050=2
143@13900=1

Get it? If not, feel free to Email me.
The mod will ask you for a title, then a filename to send. If you don't
have a file ready, just hit ENTER and you will be asked if you would like to
enter a message. Hit Y, and you're off. You'll only have to enter that message
once for each mailing list, not for each address (like in the original NSMAIL).
If you hit 'N', back to the Main Menu you go. After the message is entered, or
read in, you will be asked which CC information you wish to include, either a
note indicating how many addresses the mail was sent to, the list of addresses,
or both, or neither. Then everything gets sent out, and you're back where you
started.




My thanks go out to 8Ball, whereever he
may be, for not suing me for using his words (and code),
to Paladin for the WFC addition I was to bored to write,
and to my lovely CoSysOp (and wife!) Arianna for long hours of backrubs.

DISCLAMER: If your Cat barfs on your keyboard, or your baby dumps Pepsi in your
new Tape Backup Unit, IT AINT MY FAULT.

ÚÄÄÄÄÄÄÄÄ¿ÚÄÄÄÄÄÄ¿ ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
ÚÄÄÄÄÄÄ¿ÚÄÄÄÄÄÄÄ¿
Õ͵ @13467 Ƶ14.4KBÆ
͹ The BuckBoard Saloon and BBS Ì͵@3
467 Ƶ @3452 Æ͸
Ô͵WWIVLinkƵv32bisÆÍÎÍÍÍÍÍÍ͵(
314) 631-4069ÆÍÍÍÍÍÍÍÎ͵
IceNETƵWWIVNetÆ;
ÀÄÄÄÄÄÄÄÄÙÀÄÄÄÄÄÄÙ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ À
ÄÄÄÄÄÄÙÀÄÄÄÄÄÄÄÙ




Time: 02:20:07 Time Left: 00:47:57
[45] The WWIV Modification Net



90/100: EZ-QUOTE.MOD (easiest quoter to install and use)
Name: Smaug #1 @9828
Date: Sat Oct 03 10:48:08 1992
From: Deep Thought [908-723-0589]

EZ-QUOTE.MOD
Descrip: The easiest Quoter for the wwiv regular editor that I've ever seen.
no problems, no difficulties, this is it. And it even allows you
to select what you will be quoting instead of forcing you to /DEL
unwanted lines (but you can do it that way to).
Difficulty: Can you BLOCK READ??? How about block reading a mere 45 lines
ALL IN THE SAME PLACE?
Version: It works on 4.21a. That's what i wrote it for.
Note: If you can't do this you have seriosu problems.
But of course that's why im here, so if you can't do it, email
Smaug #1@9828*WWIVNet
Affects: msgbase.c and msgbase1.c

Load up MSGBASE.C
Add to the chars at the top of inmsg:
quote[255],quote2[255],
add to the ints right below the chars:
qyn,qques,qdone,
Add to the "long" 's a little bit further down:
len,pos,

Now here comes the easy parts.
First locate the commands for the editor (/LI, /ES, etc) and block read in
there the following command:

if(stricmp(s,"/QUOTE")==0) {
savel=0;
qyn=0;
qdone=0;
qques=0;
prt(2,"Selective Quoting (y/N)? ");
qyn=yn();
if(qyn) {
pl("At the end of each line type:");
pl("Q to stop quoting");
pl("N NOT to quote that line");
pl("Y or space to quote that line");
}
sprintf(quote,"QUOTES.IND");
ss=get_file(quote,&len);
pos=0;
if(ss!=NULL) {
do {
copy_line(quote1,ss,&pos,len);
if (qyn) {
prt(1,quote1);
qques=onek("QYN ");
switch(qques) {
case ' ':
case 'Y':
strcpy(&(lin[(curli)*LEN]),quote1);
++curli;
break;
case 'N':
break;
case 'Q':
qdone=1;
break;
}
} else {
strcpy(&(lin[(curli)*LEN]),quote1);
++curli;
}
} while ((posmaxli) && !(qdone));
if (curli>=maxli) {
pl("Ran out of lines, quote cut short.");
} else {
pl("Quote entered, type /DEL to delete lines");
}
}
}


Good, now load up MSGBASE1.C
find the grab_quotes void.
got it? good. see right at the top where it has
char *pfx="> ";
well the "> " is what is place in front of any quoted line. I suggest you make
it 1 character long, not two. Personally, i use "¯" (alt-175) but i think if
SysOps try to keep theirs original, it won't look like the same thing
everywhere.
Good, now if you want to allow users to quote messages that they read on
another sub, comment (with /* and */) out the
unlink("quotes.ind");
so it should look like:
/* unlink("quotes.ind");*/
if this seriously messes something up just take the comment signs off it.
Thats it. Yes, im serious, thats it. You finsished. No, im not kidding you,
yah don't need a three meg mod to quote. Thats all it takes. It can even be
cut down further if you want to remove the selective quoting... i think that
makes the main function.... 18 lines instead of 45.
Smaug #1@9828*WWIVNet
#1@1*DrakeNet



Time: 02:20:24 Time Left: 00:47:40
[45] The WWIV Modification Net



91/100: PRTULST.MOD Print User list to text file
Name: Smaug #1 @9828
Date: Sat Oct 03 15:29:32 1992
From: Deep Thought [908-723-0589]


Descrip: Another of my quick blcok read in mods. This one merely takes your
ENTIRE user list and writes it to a file called USERLST.PRT in your
gfiles dir. It writes it in english instead of whatever the bleep
it is in regularly... basically looks like you had capture on and
went through the entire list in uedit... probably because thats what
it nearly is 🙂
Then you can either keep that file in cold storage or you can print
out a hard copy of it (the main purpose of the mod...)
Difficulty: Like, BLOCK READING, man... 😉
Affects: BBS.C, uedit.c, fcns.h
Info: For help etc. w/ the mod email Smaug #1@9828*WWIVNet, 1@1*DrakeNet

First, to BBS.C
put this right before the "DIREDIT" 'if' in the main menu.
if(strcmp(s,"PRINTULST")==0) {
prt(6,"Are you SURE (y/N)? ");
if(yn())
printulst();
}


Remember, it takes a WHILE when it writes the file, about 3 mins every
150 users. But then again i have a 6mhz puter 🙁

Ok, now load FCNS.H
Find uedit.c and add to the end:
void printulst(void);
void udattolst(char *s);

Good, last step. Load UEDIT.C and add to the end these two voids:

void printulst(void)
{
int un,i,i1;
char s[81],s1[81],s2[81],s3[81],s4[81],ch1;
userrec u;
i=0;
i1=0;
un=0;
for(i=0; i<(status.users+1); i++) {
un=i;
read_user(un,&u);

sprintf(s,"ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ\r\n");
udattolst(s);
sprintf(s,"Name: %s\r\n",nam(&u,un));
udattolst(s);
sprintf(s,"RN: %s\r\n",(u.realname));
udattolst(s);
sprintf(s,"ICode: %s\r\n",(u.callsign));
udattolst(s);
sprintf(s,"PH: %s\r\n",(u.phone));
udattolst(s);
sprintf(s,"Age:%d %c
(%02d/%02d/%02d)\r\n",u.age,u.sex,u.month,u.day,u.year);
udattolst(s);
sprintf(s,"Comp: %s\r\n",&(ctypes[u.comp_type][0]));
udattolst(s);
if (u.forwardusr) {
if (u.forwardsys) {
if (net_num_max>1) {
sprintf(s,"Forw: %s #%d @%d\r\n", net_networks[u.net_num].name,
u.forwardusr, u.forwardsys);
} else {
sprintf(s,"Forw: #%d @%d\r\n",u.forwardusr, u.forwardsys);
}
} else {
sprintf(s,"Forw: #%d\r\n",u.forwardusr);
}
udattolst(s);
}

sprintf(s,"PW: %s\r\n",u.pw);
udattolst(s);
if (u.emailnet)
sprintf(s,"Msgs: P=%d E=%d F=%d W=%d O=%d\r\n",u.msgpost, u.emailsent,
u.feedbacksent, u.waiting, u.emailnet);
else
sprintf(s,"Msgs: P=%d E=%d F=%d W=%d\r\n",u.msgpost, u.emailsent,
u.feedbacksent, u.waiting);
udattolst(s);
sprintf(s,"Log: %d %d I=%d Last: %s First: %s\r\n",u.logons,
(strcmp(u.laston,date()))?0:u.ontoday,
u.illegal,u.laston,u.firston);
udattolst(s);
sprintf(s,"UpDn: U=%d-%ldk D=%d-%ldk\r\n",u.uploaded,u.uk,
u.downloaded, u.dk);
udattolst(s);
sprintf(s,"Baud: %u WWIVReg#: %ld\r\n", u.lastrate, u.wwiv_regnum);
udattolst(s);
sprintf(s,"Note: %s\r\n",(u.note));
udattolst(s);
sprintf(s,"SL=%d DSL=%d Ass=%d Exem=%d SysSub=%d\r\n", u.sl,
u.dsl,u.ass_pts,u.exempt,u.sysopsub);
udattolst(s);
strcpy(s3,restrict_string);
for (i1=0; i1<=15; i1++) {
if (u.ar & (1 << i1))
s4[i1]='A'+i1;
else
s4[i1]=32;
if (u.dar & (1 << i1))
s1[i1]='A'+i1;
else
s1[i1]=32;
if (u.restrict & (1 << i1))
s2[i1]=s3[i1];
else
s2[i1]=32;
}
s4[16]=0;
s1[16]=0;
s2[16]=0;
sprintf(s,"AR : %s\r\n",s4);
udattolst(s);
sprintf(s,"DAR: %s\r\n",s1);
udattolst(s);
sprintf(s,"Rest: %s\r\n",s2);
}

sprintf(s,"ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ\r\n");
udattolst(s);
}

void udattolst(char *s)
{
int f,i,i1;
char s1[81],ch1;

sprintf(s1,"%sUSERLST.PRT",syscfg.gfilesdir);
f=open(s1,O_RDWR | O_CREAT | O_BINARY, S_IREAD | S_IWRITE);
if (filelength(f)) {
lseek(f, -1L, SEEK_END);
read(f,((void *)&ch1),1);
if(ch1==26)
lseek(f,-1L,SEEK_END);
}
write(f,(void *)s,strlen(s));
close(f);
}



Time: 02:20:45 Time Left: 00:47:19
[45] The WWIV Modification Net



92/100: TESTUL15.MOD:Test,SCAN,add cmt,delete ads! Now ANSI boxed!!
Name: David Morse #15 @8305
Date: Sunday, October 4, 1992  1:26 am
From: Times Square BBS [803-788-4351]

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Mod Name: Test Upload Mod Mod Author: David Morse ³
³ Difficulty: Simple (just adding) Original Authors: Cpt. Learjet,etc ³
³ WWIV Versions: 4.20 and up Date: October 4th, 1992 ³
³ Affected Files: BBS.C, XFER.C, BBSADS.TXT (you make this) ³
³ Steps: 5 BLOCK-READS! What could be easier? ³
³ Version: 1.5 ³
³ Description: Test integrity, scan virii, add BBS comment, and delete ³
³ BBS advertisement files from the popular arc formats! ³
³ NEW FEATURES: * Now has a beautiful ANSI BOX shown to users!!! ³
³ * Code optimization to make it faster. ³
³ * Fixed ARJ and LHA command lines to not extract dirs. ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

***** If upgrading from 1.4, just re-read the TEST_UPLOAD function. ******

COMPLEX DESCRIPTION:

o Tests ARJ, ZIP, LHarc, and ARC integrity.
o Scans ARJ, ZIP, LHarc, ARC, EXE, and COMs for virii with SCAN.
o Adds an ANSI comment that you make to .ZIPs and .ARJs.
o Deletes BBS advertisements (such as Rusty & Edie's thousands of ads
like U-CAN.REG, ALWAYS.1ST) from a text file provided (which you can
modify).
o Does ALL this in an ANSI box that can't be beat! 🙂

Captain Learjet combined several archive manipulating mods to make Test
Upload 1.3. Since he's no longer around, I decided to take the mod into
my own hands and update it to today's standards. The test_upload function
was not written by me, although I have majorly modified it.

Version 1.5 (10/03/92)

* Totally revised box-style interface for users (SysOps see the DOS commands
due to the WWIV shell commands). It looks like this:

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄ¿
³ Testing MULTTEST.ZIP's integrity... ³ Passed! ³
³ Scanning MULTTEST.ZIP for virii.... ³ FAILED! ³
³ Adding BBS comment to MULTTEST.ZIP... ³ Done! ³
³ Deleting other ads from MULTTEST.ZIP..³ Done! ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÙ


Version 1.4 (9/6/92)

o Updated to work with v4.21a (for one thing, I changed the archaic "print"
statements to the new "npr" statements).
o Now supports the ARJ format for testing, virus scanning, adding comments.
o Deletes annoying BBS banners (i.e. READTHIS.COM, UGLY.COM, 10GIG.DOC).
This is very flexible, considering you have a text file where you can
update/change/delete the names as you see fit.
-----------------------------------------------------------------------------
You must have ARJ, PKUNPAK, LHA, PKZIP, PKUNZIP, and McAfee's SCAN in
your PATH (WWIV would be good). If you don't have all of these, get
them (or take out their command lines).

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Step one: ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Load BBS.C and do this in void dlmainmenu() :

if (strcmp(s,"/O")==0)
hangup=1;
if ((strcmp(s,"/?")==0) && (dcs())) /* <-- Search for this. */
printmenu(8);
if (strcmp(s,"/T")==0) /* ADD */
test_arc(); /* ADD */
if (strcmp(s,"/V")==0) /* ADD */
check_for_virus(); /* ADD */
if ((strcmp(s,"/K")==0) && (dcs())) /* ADD */
add_comment(); /* ADD */
if ((strcmp(s,"/D")==0) && (dcs())) /* ADD - DM */
delete_ads(); /* ADD - DM */
if ((strcmp(s,"UPLOADALL")==0) && (dcs())) { /* original code */

Save it.


ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Step two: ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Load XFER.C and add the following five functions near the top of the file:


void test_upload(int l, int sysop, char *s)
{
char s1[81],s2[81],s3[81];
int i,i1,abort,next,arctype;
uploadsrec u;

abort=next=arctype=0;

if (l) {
align(s);
dliscan();
}
i=recno(s);
do {
if (i>0) {
SETREC(i);
read(dlf,(void *)&u,sizeof(uploadsrec));
if ((strstr(u.filename,".ARC") != NULL) ||
(strstr(u.filename,".LZH") != NULL) ||
(strstr(u.filename,".ARJ") != NULL) ||
(strstr(u.filename,".ZIP") != NULL))
arctype=1;
if ((strstr(u.filename,".EXE") != NULL) ||
(strstr(u.filename,".COM") != NULL))
arctype=2;

if (arctype==1) {
outchr(12);
pl("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄ¿");
}
if (l==0 || l==1) {
if (arctype==1) {
if (!sysop)
sprintf(s1,"%s%s",directories[udir[curdir].subnum].path,
stripfn(u.filename));
else
sprintf(s1,"%s%s",directories[0].path,stripfn(u.filename));
if (exist(s1)) {
npr("³ Testing %s's integrity... ³ ",u.filename);
if (strstr(u.filename,".ARJ"))
sprintf(s2,"ARJ t %s",s1);
if (strstr(u.filename,".ARC"))
sprintf(s2,"PKUNPAK -t %s",s1);
if (strstr(u.filename,".LZH"))
sprintf(s2,"LHA t %s",s1);
if (strstr(u.filename,".ZIP"))
sprintf(s2,"PKUNZIP -t %s",s1);
i1=run_external1(s2);
if (i1) {
pl("FAILED! ³");
sprintf(s2,"%s FAILED an archive test. Check it!",u.filename);
ssm(1,0,s2);
sysoplog(s2);
} else {
pl("Passed! ³");
}
}
checka(&abort,&next);
}
}
if (l==0 || l==2) {
if (arctype>0) {
if (!sysop)
sprintf(s1,"%s%s",directories[udir[curdir].subnum].path,
stripfn(u.filename));
else
sprintf(s1,"%s%s",directories[0].path,stripfn(u.filename));
if (exist(s1)) {
if (arctype==1) {
npr("³ Scanning %s for virii.... ³ ",u.filename);
if (strstr(u.filename,".ARC"))
sprintf(s2,"PKUNPAK %s %s",s1,syscfg.tempdir);
if (strstr(u.filename,".ARJ"))
sprintf(s2,"ARJ E %s %s",s1,syscfg.tempdir);
if (strstr(u.filename,".LZH"))
sprintf(s2,"LHA E %s %s",s1,syscfg.tempdir);
if (strstr(u.filename,".ZIP"))
sprintf(s2,"PKUNZIP -o %s %s",s1,syscfg.tempdir);
run_external(s2);
sprintf(s3,"SCAN /nomem %s*.*",syscfg.tempdir);
i1=run_external1(s3);
}
if (arctype==2) {
outchr(12);
pl("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄ¿");
npr("³ Scanning %s for virii.... ³ ",u.filename);
sprintf(s2,"SCAN /nomem %s",s1);
i1=run_external1(s2);
}
if (i1==1) {
pl("FAILED! ³");
sprintf(s2,"%s FAILED the virus test. Please delete the file!",u.filename);
ssm(1,0,s2);
sysoplog(s2);
} else {
pl("Passed! ³");
}
if (arctype==2)
pl("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÙ");
}
checka(&abort,&next);
}
}
if (l==0 || l==3) {
if (strstr(u.filename,".ZIP") != NULL) {
npr("³ Adding BBS comment to %s... ³ ",u.filename);
if (!sysop)
sprintf(s1,"PKZIP -kz %s%s < %sCOMMENT.TXT",
directories[udir[curdir].subnum].path,stripfn(u.filename),
syscfg.gfilesdir);
else
sprintf(s1,"PKZIP -kz %s%s < %sCOMMENT.TXT",
directories[0].path,stripfn(u.filename),syscfg.gfilesdir);
run_external(s1);
pl("Done! ³");
}
if (strstr(u.filename,".ARJ") != NULL) {
npr("³ Adding BBS comment to %s... ³ ",u.filename);
if (!sysop)
sprintf(s1,"ARJ c %s%s -z%sCOMMENT.TXT",
directories[udir[curdir].subnum].path,stripfn(u.filename),
syscfg.gfilesdir);
else
sprintf(s1,"ARJ c %s%s -z%sCOMMENT.TXT",
directories[0].path,stripfn(u.filename),syscfg.gfilesdir);
run_external(s1);
pl("Done! ³");
}
checka(&abort,&next);
}
if (l==0 || l==4) {
if (strstr(u.filename,".ZIP") != NULL) {
npr("³ Deleting other ads from %s..³ ",u.filename);
if (!sysop)
sprintf(s2,"PKZIP -kd %s%s @BBSADS.TXT",
directories[udir[curdir].subnum].path,stripfn(u.filename));
else
sprintf(s2,"PKZIP -kd %s%s @BBSADS.TXT",
directories[0].path,stripfn(u.filename));
run_external(s2);
pl("Done! ³");
}
if (strstr(u.filename,".ARJ") != NULL) {
npr("³ Deleting other ads from %s..³ ",u.filename);
if (!sysop)
sprintf(s2,"ARJ d %s%s !BBSADS.TXT",
directories[udir[curdir].subnum].path,stripfn(u.filename));
else
sprintf(s2,"ARJ d %s%s !BBSADS.TXT",
directories[0].path,stripfn(u.filename));
run_external(s2);
pl("Done! ³");
}
checka(&abort,&next);
}
}
i=nrecno(s,i);
} while ((i>0) && (!hangup) && (!abort));
if (arctype==1)
pl("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÙ");
if (l)
closedl();
remove_from_temp("*.*",syscfg.tempdir,0);
}

void test_arc()
{
char s[81];

nl();
prt(2,"Archive to Test: ");
mpl(12);
input(s,12);
if (strchr(s,'.')==NULL)
strcat(s,".*");
test_upload(1,0,s);
topscreen();
}

void check_for_virus()
{
char s[81];

nl();
prt(2,"Archive to Scan: ");
mpl(12);
input(s,12);
if (strchr(s,'.')==NULL)
strcat(s,".*");
test_upload(2,0,s);
topscreen();
}

void add_comment()
{
char s[81];

nl();
prt(2,"Add Comment to: ");
mpl(12);
input(s,12);
if (strchr(s,'.')==NULL)
strcat(s,".*");
test_upload(3,0,s);
topscreen();
}

void delete_ads()
{
char s[81];

nl();
prt(2,"Delete BBS ads from: ");
mpl(12);
input(s,12);
if (strchr(s,'.')==NULL)
strcat(s,".*");
test_upload(4,0,s);
topscreen();
}

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Step three: ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

In the function void upload(int dn) add this stuff:


sprintf(s,"+%s uploaded on %s",u.filename,directories[dn].name);
sysoplog(s); /* search for the above line */
if (!incom) { /* ADD */
nl(); /* ADD */
prt(5,"Test the File? "); /* ADD */
if (yn()) /* ADD */
test_upload(0,0,u.filename); /* ADD */
} else { /* ADD */
if (!dn) /* ADD */
test_upload(0,1,u.filename); /* ADD */
else /* ADD */
test_upload(0,0,u.filename); /* ADD */
} /* ADD */
nl();
pl("File uploaded."); /* Original code continues */

Save it.


ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Step four: ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Load up a text editor and block read this into a separate file called
BBSADS.TXT and stick it in your WWIV directory (this is a text file
listing all files you wish to be deleted from archives when uploaded).
Add, delete, or edit as you wish:

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ- START OF BBSADS.TXT ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
!RUN_ME.COM
*.BBS
*.GIG
1?GIGS.DOC
ALWAYS.1ST
BESTBBS.TXT
CIMMERIA.TXT
DO-READ.ME
FINE.TXT
GOT-TO.*
IMPORTNT.COM
INTRO.TXT
LATENEWS.COM
MUSTREAD.COM
NASTY.COM
RAZOR.NFO
READNOW.COM
READTHS.COM
RUNIT.COM
RUNME.COM
SNAKE.COM
THANKS.COM
THE*.PSE
TSRI.COM
U-CAN.REG
U-READ.ME
U-READ.NOW
UGLY.COM
ZZZ_READ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ- END OF BBSADS.TXT ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Step five: ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Make a file called COMMENT.TXT and place it in your GFILES
directory. This is added to your ARJs and ZIPs and can include
extended ANSI characters (but no colors).

Recompile w/ MAKE FCNS and MAKE! Vous avez fini! Any problems,
suggestions, etc. can be directed to this address, 15@8305.

Thanks go out to Caps Lock, 1@8305, who helped me thoroughly test this monster!



Time: 02:21:48 Time Left: 00:46:16
[45] The WWIV Modification Net



93/100: This is a fix...
Name: Blackbeard #39 @3518 -=ð 5th Black Belt ð=-
Date: Sunday, October 4, 1992  8:15 pm
From: The Samurai Palace [305-587-0185]


[Msg. Status]: Please respond to this message.
-------------------------------------------------------
Fix
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Mod Name: FIX-1.MOD Mod Authors: álackáeard WWIVnet 1@3517 ³
³ Difficulty: Simple Date: Oct. 4, 1992 ³
³ WWIV Version: WWIV 4.21a, maybe 4.21 ³
³ Files Affected: BBS.C and XFEROVL.C ³
³ Description: There is a slight bug in WWIV with the //UPLOAD and ³
³ //UPLOADALL, this fixes it. ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

ÍÍÍ[ Disclaimer ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

If your computer blows up because of this mod, it is time for you to buy a
new one.

Use this mod at your own RISK!

ÍÍÍ[ Opening Notes ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

WWIV has a problem that when you //UPLOAD or //UPLOAD all files, and the
person doing does not have access to all the Directory sections it sends
a -1 to the varible directories[], which is a big NO-NO. This mod takes care
of the problem.

You might say what's the point, the only people who use //UPLOAD has access
to all the directory sections. Well, the problem comes in when people use
mods such as DINO's conferencing mod, where the user might have access to all
the sections BUT in different conferences. And this does pose a problem!

If you use my FREEME.MOD, this is already built in and you don't need to
install it. (In fact i discovered the error because of my mod, and DINO's!)

If you use my FREEME.MOD, this is already built in ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸
and you don't need to install it. (In fact i ³ Legend ³
discovered the error because of my mod, ÆÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͵
and DINO's!) ³ + Add Line ³
³ - Remove Line ³
I have published 2 mods, one which tags files for ³ @ Modify Line ³
d/l, and another that moves the subs, dirs, and ³ = Existing line ³
names.lst into XMS. Both are avaible on my board. ³ % Cut by Editor ³
At the end of the mod it says how to contact me. ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;

ÍÍÍ[ Step 1 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

Open "BBS.C"

= nl();
= outstr("Now uploading files for: ");
= pl(directories[udir[i].subnum].name);
= nl();
@ i1=uploadall(i);
= }
= }
= if ((strcmp(s,"UPLOAD")==0) && (dcs()))
@ uploadall(curdir);

Close "BBS.C"

ÍÍÍ[ Step 2 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

Open "XFEROVL.C"

Find int maybe_upload, and do the following

= if (i==-1) {
@ ok=upload_file(s,udir[dn].subnum,desc);
= } else {
= SETREC(i);
= read(dlf,(void *)&u, sizeof(uploadsrec));
= ocd=curdir; /* this supposedly takes care of the problem of -1, but */
= curdir=dn; /* doesn't becuase printinfo does a call like so */
= printinfo(&u,&i1); /* udir[curdir].subnum, this was done in the begining
*/
= curdir=ocd; /* so dn is the ACTUAL number, and not the index for */
= if (i1) /* for udir (NOTE: this is only a problem if you check
*/
= ok=0; /* to see if the file exists) */
= }

Find int uploadall, and do the following

= struct ffblk ff;

@ dliscan1(udir[dn].subnum);
= nl();
= nl();
= strcpy(s,"*.*");
@ strcpy(s1,directories[udir[dn].subnum].path);
@ maxf=directories[udir[dn].subnum].maxfiles;
= strcat(s1,s);

Close "XFEROVL.C"

ÍÍÍ[ Final Notes ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

That's it, not too hard huh? This will take care of that problem. You might
have had the problem for a while, and never really noticed!

If you have any problem send me mail, or call my board "The CrossSkulls BBS"
at 1-305-595-8060.

Later....
álackáeard (WWIVnet 1@3517)

P.S. It would be nice if this bug is fixed in 4.22, if your reading this
Wayne!




Time: 02:22:09 Time Left: 00:45:55
[45] The WWIV Modification Net



94/100: Sub-board specific info display
Name: Steve Duncan #1 @2930 [Defragged Dude]
Date: Sun Oct 04 13:23:55 1992
From: The Assassin's Guilde BBS [209-526-5899]

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Mod Name: DUNCAN1.MOD Mod Author: Stephen A. Duncan ³
³ Difficulty: Ultra-Superduper Easy Date: 04/OCT/92 ³
³ WWIV Version: 4.21a ³
³ Description: Allows a user to call up a sub-specific file/display in ³
³ which the sysop has placed information //ABOUT the current sub-board. ³
³ I thought this might be a good one to place sub-specific rules and ³
³ information into a file for the user. For visiting sysops that find the ³
³ sub of interest, the sysop could also place the host system and subtype in ³
³ the message for their reference. The files use the same filename as the ³
³ sub in question (ie: MSGS\filename.DAT in your MSGS dir), with the exten- ³
³ sion of .MSG (or .ANS if you'd rather use an ANSI pic) and are placed off ³
³ the GFILES directory in a dir called ABOUTSUB (or to whatever if you ³
³ change the code below). ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Step 1:
-------
Need I really say it?

Step 2:
-------
...In BBS.C's mainmenu(), after the //CLS function:

if ((strcmp(s,"ABO")==0) || (strcmp(s,"ABOUT")==0)) {
/* checks for both an //ABO _or_ an //ABOUT command */
print_about(usub[cursub].subnum);
/* pass the current sub-number to the print_about() function */
}

Step 3:
-------
...and at the end of MISCCMD.C:

void print_about(int n)
{
char s[81]; /* set aside a string (s) for the filespec */
subboardrec r; /* read sub info into "r" */

r=subboards[n]; /* grab the current sub-number */
sprintf(s,"ABOUTSUB\\%s",(r.filename)); /* assemble the filename */
nl(); /* add a newline for appearance */
printfile(s); /* print the assembled filename */
}

Step 4:
-------
...MAKE FCNS, and then compile.

Step 5:
-------
Add "//ABOut" = ABOUT the current Sub-board to your MENUSANS.MSG and MENUS.MSG
files in the appropriate help screen (You can type //ABO or //ABOUT to call the
function), and then MD C:\BBS\GFILES\ABOUTSUB and CD \BBS\GFILES\ABOUTSUB and
create a file for each sub-board with the info you want the user to know about
the sub (ie: Subtype, Host system, Host, Rules, Intended content, etc.). Use
the same filename as displayed in //BOARDEDIT, with a .MSG or .ANS extension
for each sub you want to display info/help on. The mod works flawlessly on my
4.21a system, so if you have any problems, give me a yell.

Steve Duncan #1 @2930



Time: 02:22:24 Time Left: 00:45:39
[45] The WWIV Modification Net



95/100: FORNAX07.MOD - Exemption menu from UEDIT
Name: Fornax #2 @4705
Date: Mon Oct 05 13:29:19 1992
From: Castle Aspect [407-351-4809]


ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Mod Name : FORNAX07.MOD Date : October 5, 1992 ³
³ Difficulty : Novice Mod Author : Dan Hering (Fornax) ³
³ WWIV Version : 4.xx @4705 WWIVNet ³
³ Files Affected : UEDIT.C @4700 ICENet ³
³ Description : Supplies a menu for Exemption selection allowing an easy ³
³ toggle scheme for the SysOp. ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Step : 1
File : UEDIT.C
Function : void uedit(int usern, int other)

char s[81],s1[81],s2[81],ch,ch1; /* Existing */
int i,i1,i2,i3,un,done,nu,done1,full,temp_full,tempu; /* Existing */
userrec u; /* Existing */
int ok; /* Add (Fornax07) */

char *exemptions[] = { /* Add (Fornax07) */
"Ratio", /* Add (Fornax07) */
"Time", /* Add (Fornax07) */
"All", /* Add (Fornax07) */
"Post", /* Add (Fornax07) */
"Delete", /* Add (Fornax07) */
0L, /* Add (Fornax07) */
}; /* Add (Fornax07) */


case 'E': /* Search for */
nl(); /* Delete */
prt(2,"New Exemption? "); /* Delete */
input(s,3); /* Delete */
i=atoi(s); /* Delete */
if ((i>=0) && (i<=255) && (s[0])) { /* Delete */
u.exempt=i; /* Delete */
write_user(un,&u); /* Delete */
} /* Delete */
break; /* Delete */

ok = 0; /* Add (Fornax07) */
do { /* Add (Fornax07) */
npr("\r\nUser Exemptions:\r\n"); /* Add (Fornax07) */
npr("(* denotes usage)\r\n\n"); /* Add (Fornax07) */
for (i=0; exemptions[i]; i++) { /* Add (Fornax07) */
npr("%s %c) %s\r\n", /* Add (Fornax07) */
(u.exempt & (1L << i)) ? "*" : " ", /* Add (Fornax07) */
i+'1', /* Add (Fornax07) */
exemptions[i]); /* Add (Fornax07) */
} /* Add (Fornax07) */
npr("\r\nToggle which ? (Q to quit) : "); /* Add (Fornax07) */
ch1=onek("\rQ12345"); /* Add (Fornax07) */
if ((ch1=='\r') || (ch1=='Q')) /* Add (Fornax07) */
ok = 1; /* Add (Fornax07) */
else { /* Add (Fornax07) */
ch1-='1'; /* Add (Fornax07) */
u.exempt ^= (1L << ch1); /* Add (Fornax07) */
} /* Add (Fornax07) */
} while ((!ok) && (!hangup)); /* Add (Fornax07) */
write_user(un,&u); /* Add (Fornax07) */
break; /* Add (Fornax07) */



Step : 2

Compile.

Questions concerning this, or any other of my productions, should be
directed toward the following:

Fornax (Dan Hering)
Castle Aspect
(407) 351-4809
TelePath 14.4 v.32 - v.32bis / v.42 - v.42bis
1@4705 WWIVNet
1@4700 ICENet



Time: 02:22:45 Time Left: 00:45:19
[45] The WWIV Modification Net



96/100: Morgul09.mod - Sends newusers mail on their first logon!
Name: Morgul #1 @8315
Date: Sunday, October 4, 1992  5:01 pm EST
From: The Trading Post [SOUTH] [803-731-0690]



ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Mod Name: Morgul09.mod Mod Authors: Morgul 1@8315 WWIVNet/IceNet ³
³ Difficulty: Reasonably Simple Date: October 4, 1992 ³
³ WWIV Version: 4.21a (should work on others, though) ³
³ Files Affected: VARS.H, NEWUSER.C, MSGBASE.C ³
³ Description: Sends a piece of email to a new user when they log on, ³
³ similar to VBBS ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

One of the few things I like about VBBS is the way it sends email to a new
user when they logon and go through the new user process...I've always thought
it was neat to have a piece of mail waiting for me as soon as I log on. So, I
decided to do it for WWIV, and after a few hours of sweat, I finally got it to
work. It's simple to install, and has the capability of working around other
mods you may have in...this will be explained later.
So, here's the mod.

<< Step 1 >>
Back up your Source Code!!!

<< Step 2 >>
Make sure your source code backed up correctly. This can't be stressed
enough!

<< Step 3 >>
Load up VARS.H and look for the INT variable listings. At the end of them,
add the variable NEWMAIL. Make sure that you have a comma seperating it and
the last variable, and a semicolon after NEWMAIL.

<< Step 4 >>
Still in VARS.H, look even furthur down for the extern int variable
declarations. Again, add NEWMAIL to the end of the list, and make sure that
all commas and semicolons are where they belong.

<< Step 5 >>
Save VARS.H

<< Step 6 >>
Load up NEWUSER.C. Look at the end of the file for these lines:

if (syscfg.newuser_c[0]) {
stuff_in(s,syscfg.newuser_c,create_chain_file("CHAIN.TXT"),"","","","");
full_external(s,0,1);
}

and add this block of code immediately after it.
sprintf(fn,"%sNEWMAIL.MSG",syscfg.gfilesdir);
if (!exist(fn)) {
prt(1,"NEWMAIL.MSG Not Found");
return;
}
fp=open(fn,O_RDONLY | O_BINARY);
len=filelength(fp);
buf=(char *)malloca(len+1);
read(fp,(void *)buf,len);
close(fp);
sprintf(fn,"%sINPUT.MSG",syscfg.tempdir);
unlink(fn);
fp=open(fn,O_RDWR | O_BINARY | O_CREAT,S_IREAD | S_IWRITE);
write(fp,(void *)buf,len);
close(fp);
free(buf);
use_workspace=1;
strcpy(forcetitle,"Welcome to The Trading Post [SOUTH]");
newmail=1;
email(usernum,0,0,0);
forcetitle[0]=0;
newmail=0;
read_user(usernum,&thisuser);

Naturally changing the BBS name to whatever yours is.

<< Step 7 >>
Save NEWUSER.C

<< Step 8 >>
Load up MSGBASE.C

Search for these lines in void inmsg:

/* There */ if (save) {
/* ADDME */ If (!newmail) /* Added Morgul09.mod */
/* There */ pl("Reading in file...");
/* There */ }
/* There */ use_workspace=0;
/* There */ }

<< Step 9 >>
Still in void inmsg, search for
outstr("Saving...");

and add this line right above it:
/* ADDME */ if (!newmail)
/* There */ outstr("Saving...");

<< Step 10 >>
Still in void inmsg, search for the following:
/* There */ if (real_name)
/* There */ addline(b,thisuser.realname,&l1);
/* There */ else
/* ADDME */ {
/* ADDME */ if (newmail) {
/* ADDME */ strcpy(s,"Morgul #1"); /* Be sure to change the sysop
name!*/
/* ADDME */ addline(b,s,&l1);
/* ADDME */ }
/* There */ addline(b,nam1(&thisuser,usernum,net_sysnum),&l1);
/* ADDME */ }
/* There */ strcpy(s,atime());
/* There */ addline(b,s,&l1);

<< Step 11 >>
In void sendout_email, down near the bottom, look for the lines

/* There */ if (!wfc)
/* There */ topscreen();
/* ADDME */ if (!newmail)
/* There */ pl(s);
/* There */ if (s2[0])

<< Step 12 >>
In void email, search for the lines:

/* There */ }
/* ADDME */ if (!newmail)
/* There */ npr("E-mailing %s\r\n",s2);
/* There */ if (ss.ability & ability_email_anony)

<< Step 13 >>
Save MSGBASE.C.

<< Step 14 >>
Now, You'll need to install Trader Jack's Forcetitle mod, which will allow
you to force titles on messages. It's an excellent mod anyway, but when
combined with this one, it's AWESOME. I use it to force titles on
validation messages, so that all validation messages have the same,
distinctive title. It is included at the end of this file.

<< Step 15 >>
Compile your board. Almost forgot about that part! Since you fiddled with
VARS.H, it'll do a complete compile, but if you're running a 386, you've
got just enough time to grab a quick snack. If you're running on a 286,
grab a snack, go to the bathroom, and check your mail. If you're running
on a XT, go grocery shopping, rent some movies, stop in at the local
bookstore, and by the time you get back, you *MIGHT* be finished.

<< Step 16 >>
Make a message called NEWMAIL.MSG in your gfiles directory that has what
you want to tell new users. Frank Reid (1@870) had an interesting suggestion:
Install the MCI mod, then make up a message using the MCI commands so that the
message appears personalized to the user.

<< Step 17 >>
Earlier, I mentioned that this mod was portable. What that means is, if
you have added mods that do things like request replies, etc., you can
disable those things for this mail...after all, you don't want to ask the
user if he wants a reply to the mail you send him. Simple find these
various mods, and add the line IF (!NEWMAIL) before it...it will check to
see if this piece of mail is the newuser mail. If it is, it will skip
printing that part...otherwise, it will act normally. Simple to do.

That's all there is to it. Thanks go out to Frank Reid (1@870) and to Dr.
Diversity (1@8433) for their help and suggestions on this. Also, thanks as
usual to Trader Jack (2@8315), who was a big help on this, even though he
doesn't know it yet!

Standard Disclaimer. If it don't work, you screwed up somewhere, and it
ain't my fault. If you use this mod, please give me a holler at The Trading
Post [SOUTH], WWIVNEt @8315, IceNet @8315.

************************** TJ-MOD04 (Forcetitle mod) *************************
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Mod Name: TJ-MOD04.MOD Mod Author: Trader Jack 1@8315 ³
³ Difficulty: Easy Date: 23 June 1992 ³
³ WWIV Version: Tested on 4.21 ³
³ Files affected: VARS.H, MSGBASE.C, NEWUSER.C ³
³ Description: Forces a standard, sysop defineable title on E-mail. ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

I use Bruce Guthrie's Email Titles Mod which shows the titles of your
waiting Email. What I disliked was the misleading titles or that lack thereof
in validation letters and feedbacks, hence this mod. What it does is force a
predefined title on a specific type of E-mail. I saw this on another system,
I think it was either PCB or Maximus. Anyway, on with the mod...

Legend:
/*==*/ Search for this
/*++*/ Add this line
/*--*/ Delete this line
/*&&*/ Change this line
/*@@*/ Split lines
<> Back up dem sourcies!!!

<> Open VARS.H and add forcetitle[81] to the 'char' and
'extern char' defenitions. I am not putting any code in for this as it is a
simple insertion. REMEMBER, it goes in twice! Close and save VARS.H.

<> Open up MSGBASE.C and at the top, add:

/*==*/#include
/*==*/
/*++*/extern char forcetitle[81];
/*==*/
/*==*/#define ALLOW_FULLSCREEN 1

Search down for void inmsg and make the following changes:

/*==*/ helpl=6;
/*==*/
/*==*/ if (okansi()) {
/*++*/ if (forcetitle[0]==0){
/*==*/ prt(2,"Title: ");
/*==*/ mpl(60);
/*==*/ inputl(title,60);
/*++*/ } else {
/*++*/ strcpy(title,forcetitle);
/*++*/ }
/*==*/ } else {
/*++*/ if (forcetitle[0]==0){
/*==*/ pl(" [=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
/*@@*/ =-=-=]"); /*Your's is different, I know*/
/*==*/ outstr("Title: ");
/*==*/ inputl(title,60);
/*++*/ } else {
/*++*/ strcpy(title,forcetitle);
/*++*/ }
/*==*/ }

Close and save MSGBASE.C.

<> Add forcetitle to the areas that you desire to force the title.
I am including a section of NEWUSER.C where I have installed it as an example.
Be sure to place the strcpy line BEFORE the email line.

/*==*/ sprintf(irt,"Validation Feedback (%d slots left)",syscfg.maxusers
/*@@*/ -status.users);
/*==*/ irt_name[0]=0;
/*++*/ strcpy(forcetitle,"Validation Request!!");
/*==*/ email(1,0,1,0);
/*++*/ forcetitle[0]=0; /* IMPORTANT TO ADD! */
/*==*/ }

Add anywhere else you like in the same manner.

<> Recompile the entire BBS.

Insert your favorite disclaimer here--->

If you use this mod, please drop me a line at 2@8315 or 2@1061. I am in
transit at this writing and won't have a board up til October. Look for more
nifty TJ Mods then!




Time: 02:23:29 Time Left: 00:44:35
[45] The WWIV Modification Net



97/100: Oops. Fix to Morgul09.mod
Name: Morgul #1 @8315
Date: Monday, October 5, 1992 12:13 am EST
From: The Trading Post [SOUTH] [803-731-0690]



 Found a couple of bugs in it. In Step six, add the marked lines:
<< Step 6 >>

newmail=1;
> i=thisuser.defed;
> thisuser.defed=0;
email(usernum,0,0,0);
forcetitle[0]=0;
> thisuser.defed=i;
newmail=0;
read_user(usernum,&thisuser);

 And in step 10, add the marked line
<< Step 10 >>
Still in void inmsg, search for the following:
/* There */ if (real_name)
/* There */ addline(b,thisuser.realname,&l1);
/* There */ else
/* ADDME */ {
/* ADDME */ if (newmail) {
/* ADDME */ strcpy(s,"Morgul #1"); /* Be sure to change the sysop name!*/
/* ADDME */ addline(b,s,&l1);
/* ADDME */ } else < Add the ELSE
/* There */ addline(b,nam1(&thisuser,usernum,net_sysnum),&l1);
/* ADDME */ }
/* There */ strcpy(s,atime());
/* There */ addline(b,s,&l1);


 And that should fix the known bugs.

°±²¯ Morg–l ®²±°
-=ð Sysop of The Trading Post [SOUTH] ð=-

==============================================================================
°°±±²²¯¯ The Trading Post [SOUTH] - Columbia, S.C. - (803) 731-0690 ®®²²±±°°
°°±±²²¯¯ WWIVNet @8315 - AdventNet @8315 - ICENET @8315 ®®²²±±°°
°°±±²²¯¯ AutoSysop Validation - 800+ Mods Online - WWIV Utility Files ®®²²±±°°



Time: 02:23:41 Time Left: 00:44:23
[45] The WWIV Modification Net



98/100: GATECLR.MOD v1.1 small fixes
Name: Gate Keeper #1 @8143
Date: Sun Oct 04 16:13:42 1992
From: California Beach House [801-771-9422]

[ Keeper of da' Place ]

<<<<< Make your BBS look more colorful! >>>>>
New Version v1.1

Has VERY minor fixes...But they are all in this one file.

Name: Gate Keeper
Date: 10-4-92
Mod Name: GATECLR.MOD
Dificulty: Mostly Block Reading...
Why?: Because of TONS Of email requesting it (Grin)

Mod: Add 32 Or So Extended colors to your BBS Using Keys 8,9 and A-Z
This was originally not my mod. I just upgraded it and made it work
with WWIV v4.2+. This will work with that version unlike the old one.
Anyway..On with the Mod:


As usual, == Original Code, leave as is.
-- Delete Code
++ Add Code
=+ Modify Code

In BBSUTL.C, at VOID INLI(..., do the following:

case 14: /* Ctrl-N */
if ((wherex()) && (cp outchr(8);
s[cp++]=8;
}
break;
/*==*/ case 16: /* Ctrl-P */
/*==*/ if (cp ch=getkey();
/*=+*/ if (((ch>='0') && (ch<='9')) || ((ch>='A') &&
/*=+*/ (ch<='Z')) || ((ch>='a') && (ch<='z'))) {
s[cp++]=3;
s[cp++]=ch;
/*++*/ if((ch>='0') && (ch<='9'))
ansic(ch-'0');
/*++*/ else if ((ch>='A') && (ch<='Z'))
/*++*/ ansic(ch-'A'+10);
/*++*/ else ansic(ch-'a'+10);
}
}
break;
case 9: /* Tab */
i=5-(cp % 5);
if (((cp+i) i=5-((wherex()+1) % 5);
for (i1=0; i1

Then, in COM.C, at VOID OUTCHR(..., replace the whole function with the
following:

void outchr(char c)
/* This function outputs one character to the screen, and if output to the
* com port is enabled, the character is output there too. ANSI graphics
* are also trapped here, and the ansi function is called to execute the
* ANSI codes
*/
{
int i, i1;

if (change_color) {
change_color = 0;
if ((c >= '0') && (c <= '9'))
ansic(c - '0');
else if ((c >='A') && (c <='Z'))
ansic(c-'A'+10);
else if ((c >='a') && (c <='z'))
ansic(c-'a'+10);
return;
}
if (c == 3) {
change_color = 1;
return;
}
if ((c == 10) && endofline[0]) {
if (!in_extern)
outstr(endofline);
endofline[0] = 0;
}

if (global_handle) {
if (echo)
global_char(c);
}

if (chatcall && !x_only && !(syscfg.sysconfig & sysconfig_no_beep))
setbeep(1);

if (outcom && !x_only && (c != 9))
outcomch(echo ? c : 'X');
if (ansiptr) {
ansistr[ansiptr++] = c;
ansistr[ansiptr] = 0;
if ((((c < '0') || (c > '9')) && (c!='[') && (c!=';')) ||
(ansistr[1] != '[') || (ansiptr>75))
execute_ansi();
} else if (c == 27) {
ansistr[0] = 27;
ansiptr = 1;
ansistr[ansiptr]=0;
} else {
if (c == 9) {
i1 = wherex();
for (i = i1; i< (((i1 / 8) + 1) * 8); i++)
outchr(32);
} else if (echo || lecho) {
out1ch(c);
if (c == 10) {
++lines_listed;
if ((sysstatus_pause_on_page & thisuser.sysstatus) &&
(lines_listed >= screenlinest - 1)) {
pausescr();
lines_listed = 0;
}
}
} else
out1ch('X');
}
if (chatcall)
setbeep(0);
}



Then, at VOID ANSIC(..., replace with the following code:

void ansic(int n)
{
char s[81], c;

if ((n>=0) && (n<=7))
c = ((thisuser.sysstatus & sysstatus_color) ? thisuser.colors[n] :
thisuser.bwcolors[n]);
if ((n>=8) && (n<=36))
c = ((thisuser.sysstatus & sysstatus_color) ? status.resx[n-8] :
thisuser.bwcolors[n-8]);
if (c == curatr)
return;
setc(c);
makeansi((thisuser.sysstatus & sysstatus_color) ? thisuser.colors[0] :
thisuser.bwcolors[0],endofline, 0);
}


Then, in CONIO.C, at VOID TWO_WAY_CHAT(..., replace the CTRL-P switch with
the following:

case 16: /* Ctrl-P */
if (side==0)
{
if (cp0 {
ch=getkey();
if ((ch>='0') && (ch<='9'))
{
side0[wherey()][cp0++]=3;
side0[wherey()][cp0++]=ch;
ansic(ch-'0');
}
else if ((ch>='A') && (ch<='Z'))
{
side0[wherey()][cp0++]=3;
side0[wherey()][cp0++]=ch;
ansic(ch-'A'+10);
}
else if ((ch>='a') && (ch<='z'))
{
side0[wherey()][cp0++]=3;
side0[wherey()][cp0++]=ch;
ansic(ch-'a'+10);
}
}
}
else
{
if (cp1 {
ch=getkey();
if ((ch>='0') && (ch<='9'))
{
side1[wherey()-13][cp1++]=3;
side1[wherey()-13][cp1++]=ch;
ansic(ch-'0');
}
else if ((ch>='A') && (ch<='Z'))
{
side1[wherey()-13][cp1++]=3;
side1[wherey()-13][cp1++]=ch;
ansic(ch-'A'+10);
}

else if ((ch>='a') && (ch<='z'))
{
side1[wherey()-13][cp1++]=3;
side1[wherey()-13][cp1++]=ch;
ansic(ch-'a'+10);
}
}
}
break;


Now in the file XINIT.C, at the very bottom of the file
before the end brace, add the following code:

/* Already there */ }
/* Add all this below */
status.resx[0]=1; /* The color of ctrl-p 8 */
status.resx[1]=3; /* Ctrl-p 9 */
status.resx[2]=15; /* Ctrl-p A */
status.resx[3]=6; /* Ctrl-p B */
status.resx[4]=8; /* Ctrl-p C */
status.resx[5]=13; /* Etc... */
status.resx[6]=10;
status.resx[7]=12;
status.resx[8]=133;
status.resx[9]=4;
status.resx[10]=137;
status.resx[11]=138;
status.resx[12]=139;
status.resx[13]=134;
status.resx[14]=141;
status.resx[15]=142;
status.resx[16]=143;
status.resx[17]=30;
status.resx[18]=95;
status.resx[19]=79;
status.resx[20]=89;
status.resx[21]=46;
status.resx[22]=56;
status.resx[23]=47;
status.resx[24]=251;
status.resx[25]=352;
status.resx[26]=453;
status.resx[27]=554; /* To Ctrl-P Z */

} /* -<<< Already there...its the last } in the file */

The status.resx[whatever]=number, you change the number for other colors. The
above was just my selection of extended colors which you may wish to keep.

Here's how to select the colors. This key was by The druid.:

Colors are as followed:

0 Black 9 Lightblue
1 Blue 10 Lightgreen
2 Green 11 Lightcyan
3 Cyan 12 Lightred
4 Red 13 Lightmagenta
5 Magenta 14 Yellow
6 Brown 15 White
7 Lightgray
8 Darkgray


For the background colors you can have colors 0-7 from above. All you do is
multiply the color numbre you want by 16.

For a blinkng foreground color, you add 128 to the number.

So, for a BLINKING WHITE on BLUE BACKGROUND would be:
128 + 15 + (1 * 16) = 159

A LIGHTGREEN on a RED BACKGROUND would be:
10 + ( 4 * 16) = 74

/** Still more.. **/

This is optional. But if you want your users to have a color list I suggest
doing this:

/** Clrlst.msg **/

WWIV Color Key: Colors are established by hitting the Ctrl-P combination on
keyboard, letting go of the keys then selecting a number or a letter:

Color Listing:

Ctrl-P 1: ^P1This Color ^P0Ctrl-P 2: ^P2This Color ^P0Ctrl-P 3:
^P3This Color
Ctrl-P 4: ^P4This Color ^P0Ctrl-P 5: ^P5This Color ^P0Ctrl-P 6:
^P6This Color
Ctrl-P 7: ^P7This Color ^P0Ctrl-P 8: ^P8This Color ^P0Ctrl-P 9:
^P9This Color
Ctrl-P A: ^PaThis Color ^P0Ctrl-P B: ^PbThis Color ^P0Ctrl-P C:
^PcThis Color
Ctrl-P D: ^PdThis Color ^P0Ctrl-P E: ^PeThis Color ^P0Ctrl-P F:
^PeThis Color
Ctrl-P G: ^PgThis Color ^P0Ctrl-P H: ^PhThis Color ^P0Ctrl-P I:
^PiThis Color
Ctrl-P J: ^PjThis Color ^P0Ctrl-P K: ^PkThis Color ^P0Ctrl-P L:
^PlThis Color
Ctrl-P M: ^PmThis Color ^P0Ctrl-P N: ^PnThis Color ^P0Ctrl-P O:
^PoThis Color
Ctrl-P P: ^PpThis Color ^P0Ctrl-P Q: ^PqThis Color ^P0Ctrl-P R:
^PrThis Color
Ctrl-P S: ^PsThis Color ^P0Ctrl-P T: ^PtThis Color ^P0Ctrl-P U:
^PuThis Color
Ctrl-P V: ^PvThis Color ^P0Ctrl-P W: ^PwThis Color ^P0Ctrl-P X:
^PxThis Color
Ctrl-P Y: ^PyThis Color ^P0Ctrl-P Z: ^PzThis Color

Information About Extended Colors:
Using these colors will just change your text in your message. This
can be good for signatures (Macros) or to show expression in your message.

/** End of Clrlst.msg */

You need to change the ^P to a heart (CTRl-P C in most editors): This will
word wrap in a message so you will have to connect lines back together.
Put this file in your GFILES Directory. Or when you change the ^P to a heart
that should also fix. Now, For the last step load up msgbase.c and in void
inmsg(blah blah) do this:


/* =+ */ pl("Enter '/HELP' for help. '/CL' For Color Listing.");
/* == */
strcpy(s,"[---=----=----=----=----=----=----=----]----=----=----=----=----=----=----=----]");
/* == */ s[thisuser.screenchars]=0;
/* == */ pl(s);

/* == */ while (!done && !hangup) {
/* == */ helpl=27;
/* == */ inli(s,ro,160,1);
/* == */ if (hangup)
/* == */ done=1;
/* == */ savel=1;
/* == */ if (s[0]=='/') {
/* == */ if (stricmp(s,"/HELP")==0) {
/* == */ savel=0;
/* == */ printmenu(2);
/* == */ }
/* ++ */ if (stricmp(s,"/CL")==0) {
/* ++ */ savel=0;
/* ++ */ outstr("\x0c"); /* Clears screen..optional */
/* ++ */ printfile("Clrlst.msg");
/* ++ */ }
/* == */ if (stricmp(s,"/LI")==0) {
/* == */ savel=0;
/* == */ prt(5,"With line numbers? ");

Lastly..Load up VARDEC.H and search for:

/* DYNAMIC SYSTEM STATUS */
typedef struct {
char date1[9], /* last date active */
date2[9], /* date before now */
date3[9], /* two days ago */
log1[13], /* yesterday's log */
log2[13], /* two days ago log */
gfiledate[9], /* date gfiles last updated */
resx[9]; /* reserved for nothing */
unsigned short users, /* Current number of users */

Change the resx[9] to resx[50]; You will have to recompile the WHOLE BBS
do to this change.

Now, for your very last step log on the bbs, Using F for
fast logon, Run //RESETF to fix your screwed user list that this will
create. It doesn't WRITE to your user list just reads wrong untill
//RESETF is used.



Thats the end of the mod. It should work *Perfectly* If not Email
Me at 1@8143 and tell me what your problems were. Or if you enjoy the mod
or at least use it(GRIN) please tell me so. Good luck and enjoy your new
colorful bbs!

Gate Keeper



Time: 02:24:35 Time Left: 00:43:29
[45] The WWIV Modification Net



99/100: DeNetNam Mod ------- NEW By Deltigar! (Yes, I'm BACK!)
Name: Deltigar #211 @8301
Date: Sun Oct 04 23:30:25 1992
From: The Thieves Market BBS [803-723-7254]

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Mod Name: DeNetNam Mod Mod Author: Deltigar 1@8306 ³
³ Difficulty: Simple Date: 5 OCT 92 ³
³ WWIV Version: 4.21a ³
³ Description: This is what I am using as my READ PROMPT. It tells the user ³
³ What sub they are in and what NET in only one added line. ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

File: MSGBASE1.C

///// Add these variables in void scan.

void scan(int msgnum, int optype, int *nextsub)
{
char s[81],s1[81],s2[81],*b,*ss1;
char s3[81],s4[81]; /* DeNetNam Mod */

///// Then, a little further down, add the marked lines. (NOTE 1)

if (subboards[curlsub].type) {
if (subboards[curlsub].age & 0x80) {
set_net_num(subboards[curlsub].name[40]);
strcpy(s4,net_name); /* DeNetNam Mod */
}
else {
set_net_num(0);
strcpy(s4,net_name); /* DeNetNam Mod */
}
}
else {
set_net_num(0);
s4[0]=0; /* DeNetNam Mod */
}
switch(optype) {
case 0: /* Read Prompt */
nl();
if(nsl() < 5*60) { /* DeLoTime Mod */
npr("Time Left: %s",ctim(nsl())); /* DeLoTime Mod */
outchr(7); /* DeLoTime Mod */
} /* DeLoTime Mod */

/* DeNetNam Mod */
sprintf(s3,"Sub: %s [%s] ",subboards[curlsub].name,
(subboards[curlsub].type)?s4:"Local");
sprintf(s,"Message %u of %u (?=Help) ? ",
msgnum,nummsgs);
/* DeNetNam Mod */

nl();
if (express) {
s4[0]=0; /* DeNetNam Mod */
s3[0]=0; /* DeNetNam Mod */
s[0]=0;
nl();
nl();
} else {
prt(7,s3); /* DeNetNam Mod */
nl(); /* DeNetNam Mod */
prt(7,s);
helpl=16;
ansic(1);


NOTE 1 : DeLoTime Mod is another little mod that is really
someone elses stretch of code, but I needed to keep straight what I
added when I upgraded. You may also want to fiddle with the color
codes for that exact color combination that is most pleasing to YOUR
eyes.

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

And that is all there is to it. Make & Bake it and let 'er rip.
I have gotten enough positive feedback on this one that I feel it is
worht the effort to send it out. Although many of the advanced
modders can tell at a glance that this is an EASY mod, I'll bet you
don't have it! Try it and see how it looks. You might be surprised at
the improvement it makes in readability.


ÔÄÄÄÍÍ͵ Deltigar ÆÍÍÍÄÄľ


Post Script

I know it has been a while,
and a lot has happened while I was
gone. I am still waiting on a net
node number, but my board is back
up. In any case, I am glad to be
back where I can see the stars
again.... I missed them.

ÔÄ͵ D ÆÍľ


 <<* Pocket Universe * North Charleston, SC * (803)552-8654 *>>




Time: 02:24:54 Time Left: 00:43:10
[45] The WWIV Modification Net



100/100: EZ-QUOTE.MOD (Revised ... )
Name: Smaug #1 @9828
Date: Sun Oct 04 06:49:43 1992
From: Deep Thought [908-723-0589]

EZ-QUOTE.MOD
Descrip: The easiest Quoter for the wwiv regular editor that I've ever seen.
no problems, no difficulties, this is it. And it even allows you
to select what you will be quoting instead of forcing you to /DEL
unwanted lines (but you can do it that way to).
Difficulty: Can you BLOCK READ??? How about block reading a mere 45 lines
ALL IN THE SAME PLACE?
Version: It works on 4.21a. That's what i wrote it for.
Note: If you can't do this you have seriosu problems.
But of course that's why im here, so if you can't do it, email
Smaug #1@9828*WWIVNet
Affects: msgbase.c and msgbase1.c

Load up MSGBASE.C
Add to the chars at the top of inmsg:
quote[255],quote2[255],
add to the ints right below the chars:
qyn,qques,qdone,
Add to the "long" 's a little bit further down:
len,pos,

Now here comes the easy parts.
First locate the commands for the editor (/LI, /ES, etc) and block read in
there the following command:

if(stricmp(s,"/QUOTE")==0) {
savel=0;
qyn=0;
qdone=0;
qques=0;
prt(2,"Selective Quoting (y/N)? ");
qyn=yn();
if(qyn) {
pl("At the end of each line type:");
pl("Q to stop quoting");
pl("N NOT to quote that line");
pl("Y or space to quote that line");
}
sprintf(quote,"QUOTES.IND");
ss=get_file(quote,&len);
pos=0;
if(ss!=NULL) {
do {
copy_line(quote1,ss,&pos,len);
if (qyn) {
prt(1,quote1);
qques=onek("QYN ");
switch(qques) {
case ' ':
case 'Y':
strcpy(&(lin[(curli)*LEN]),quote1);
++curli;
break;
case 'N':
break;
case 'Q':
qdone=1;
break;
}
} else {
strcpy(&(lin[(curli)*LEN]),quote1);
++curli;
}
} while ((posmaxli) && !(qdone));
if (curli>=maxli) {
pl("Ran out of lines, quote cut short.");
} else {
pl("Quote entered, type /DEL to delete lines");
}
}
}


Good, now load up MSGBASE1.C
find the grab_quotes void.
got it? good. see right at the top where it has
char *pfx="> ";
well the "> " is what is place in front of any quoted line. I suggest you make
it 1 character long, not two. Personally, i use "¯" (alt-175) but i think if
SysOps try to keep theirs original, it won't look like the same thing
everywhere.
Cool, now howza bout for some fancy thangs. You don't need em but they are
easy enough.
Find the "P"ost function in msgbase1.c See it? good. See how it doesn't have
a break; but instead runs into the 'W' case? Well copy all the stuff after the
'W' case to its break and put a copy of it between the end of the 'P'ost case
and the
case 'W':
and THEN remove all the grab_quotes from the post section.
Basically, it should look like:
case 'P':
irt[0]=0;
irt_name[0]=0;
deleted_flag=0;
prt(6,"upload a message (y/N)? ");
if(yn())
upload_post();
post();
if (deleted_flag && (deleted_flag<=msgnum))
--msgnum;
break;
case 'W':
deleted_flag=0;
grab_quotes(&(msgs[msgnum].msg),subboards[curlsub].filename);
prt(6,"upload a message (y/N)? ");
if(yn())
upload_post();
post();
if (deleted_flag && (deleted_flag<=msgnum))
--msgnum;
grab_quotes(NULL, NULL);
break;

Now, add in this case, 'G' for Grab quotes.
case 'G':
grab_quotes(&(msgs[msgnum].msg),subboards[curlsub].filename);
break;
Ok, now go to BBS.C and find the "P"ost command THERE and delete the
grab_quotes(NULL, NULL);
in there.
Ok, all this stuff will basically allow you to read a message in one sub and
quote from it in a diffy one. Just type "G" after you have read the message
you want to quote, then go to the sub you want and Post on it.
Of course you don't have to type G when quoting from the same sub, this is
just for diffy ones.

Thats it. Yes, im serious, thats it. You finsished. No, im not kidding you,
yah don't need a three meg mod to quote. Thats all it takes. It can even be
cut down further if you want to remove the selective quoting... i think that
makes the main function.... 18 lines instead of 45.
Smaug #1@9828*WWIVNet
#1@1*DrakeNet



Time: 02:25:18 Time Left: 00:42:46
[45] The WWIV Modification Net



Post on The WWIV Modification Net? 

  3 Responses to “Category : BBS Programs+Doors
Archive   : TONSMOD.ZIP
Filename : HOLY!2.MOD

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/