home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / WWIVMODS / PRE412.ZIP / MODNET.MOD < prev    next >
Text File  |  1990-08-05  |  84KB  |  2,284 lines

  1. MODNET 9/10 -- Message Base Mods
  2. This is the biggest of the current crop of mods.  All here are for the message 
  3. base.
  4. -=>mtb<=-
  5. ═════════════════════════════════════════════════════════════════════════════
  6. Lt. Hytiek #1 @3504
  7. 03/23/90 at 1:28 pm <EST>
  8.  
  9.                  Profanity Restriction Mod
  10.                  Original Code Work by:
  11.                  The Copy Jockey & Bones
  12.  
  13.       Ok, what this mod does, is restricts the users from cussing, to an
  14.       extent.  You can use AR's to control the Profanity Restriction by
  15.       adding a 'C' to the users AR if you want them to cuss, or leave the
  16.       'C' off to turn on the restrictor.  The restriction is used in the
  17.       following places: ONE-WAY CHAT(REG), EMAIL, and POSTING.  The way
  18.       it checks for profanity is by checking every FORTH letter typed,
  19.       such as if you were to type: bitc  it would erase it(backspace 4 times)
  20.       before you could hit the 'H'.  I think I have covered all the
  21.       possibilities of spelling the words...  If there are more, email 1@3504
  22.       with the updated word.
  23.  
  24.       Ok, enough about the mod,  now load up BBSUTL.C  add to the '#include'
  25.       section this include:  #include <ctype.h>
  26.       now serach for 'void inli' after you find it, delete the entire void,
  27.       and replace it with mine. Should Work Fine!
  28.  
  29. ****************************************************************************/
  30.  
  31. void inli(char *s, char *rollover, int maxlen, int crend)
  32. {
  33.   int cp,i,i1,done,cm,begx,remove,count,posit;
  34.   char s1[255],s2[255];
  35.   unsigned char ch;
  36.  
  37.   cm=chatting;
  38.  
  39.   begx=wherex(); if (rollover[0]!=0) { if (charbufferpointer) {
  40.       strcpy(s1,rollover); strcat(s1,&charbuffer[charbufferpointer]);
  41.       strcpy(&charbuffer[1],s1); charbufferpointer=1; } else {
  42.       strcpy(&charbuffer[1],rollover); charbufferpointer=1; } rollover[0]=0;
  43.   }
  44.   cp=0; done=0; do { ch=getkey(); if (two_color) if (lastcon) ansic(1);
  45.       else ansic(0); if (cm) if (chatting==0) ch=13;
  46.     if ((ch>=32)) {if ((wherex()<(thisuser.screenchars-1)) && (cp<maxlen)) {
  47.     s[cp++]=ch; outchr(ch); if (wherex()==(thisuser.screenchars-1))
  48.       done=1; } else { if (wherex()>=(thisuser.screenchars-1)) done=1; }
  49.     } else
  50.         switch(ch) {
  51.       case 7: if ((chatting) && (outcom)) outcomch(7); break;
  52.       case 13: /* C/R */s[cp]=0; done=1; break;
  53.       case 8:  /* Backspace */if (cp) {if (s[cp-2]==3) {cp-=2;ansic(0);
  54.           } else if (s[cp-1]==8) { cp--; outchr(32); } else { cp--;
  55.           backspace(); } } break;
  56.       case 24: /* Ctrl-X */while (wherex()>begx) {backspace();cp=0;}
  57.         ansic(0); break;
  58.       case 23: /* Ctrl-W */if (cp) { do {if (s[cp-2]==3) {cp-=2;ansic(0);
  59.         } else if (s[cp-1]==8) { cp--; outchr(32); } else { cp--;
  60.             backspace(); }
  61.               } while ((cp) && (s[cp-1]!=32) && (s[cp-1]!=8) && (s[cp-2]!=3));
  62.         } break;
  63.       case 14: /* Ctrl-N */if ((wherex()) && (cp<maxlen)) {outchr(8);
  64.           s[cp++]=8; } break;
  65.       case 16: /* Ctrl-P */if (cp<maxlen-1) {ch=getkey();
  66.         if ((ch>='0') && (ch<='9')) {s[cp++]=3;s[cp++]=ch;ansic(ch-'0');}
  67.         } break;
  68.       case 9:  /* Tab */i=5-(cp % 5);if (((cp+i)<maxlen) && ((wherex()+i)<thisuser.screenchars)) {
  69.           i=5-((wherex()+1) % 5);for (i1=0; i1<i; i1++) {s[cp++]=32;
  70.         outchr(32); } } break;
  71.         }
  72.   /*Profanity restrictor*/
  73.   if ((thisuser.ar & 4)==0)
  74.    {
  75.     remove=0;
  76.     strcpy(s2,"    ");
  77.     if (cp>=4) {
  78.        posit=1;count=0;
  79.        while ((posit<=cp) && (count<4))
  80.     if (isdigit(s[cp-posit]) && (s[cp-(posit+1)]==3)) posit+=2;
  81.       else if (s[cp-posit]==8) {posit++;remove++;}
  82.         else if (remove>0) {remove--;posit++;}
  83.              else {s2[3-count]=s[cp-posit];count++;posit++;}
  84.        strupr(s2);
  85.        if ((strcmp(s2,"FUCK")==0) || (strcmp(s2,"SHIT")==0) ||
  86.        (strcmp(s2,"FUC|")==0) || (strcmp(s2,"SHI+")==0) ||
  87.        (strcmp(s2,"DIC|")==0) || (strcmp(s2,"PU$$")==0) ||
  88.        (strcmp(s2,"PU$S")==0) || (strcmp(s2,"PUS$")==0) ||
  89.        (strcmp(s2,"COC|")==0) || (strcmp(s2,"PVSS")==0) ||
  90.        (strcmp(s2,"CRAP")==0) || (strcmp(s2,"PISS")==0) ||
  91.        (strcmp(s2,"PUSS")==0) || (strcmp(s2,"CUNT")==0) ||
  92.        (strcmp(s2,"DAMN")==0) || (strcmp(s2,"BITC")==0) ||
  93.        (strcmp(s2,"DICK")==0) || (strcmp(s2,"ASSH")==0) ||
  94.        (strcmp(s2,"A$$ ")==0) || (strcmp(s2,"CHYT")==0) ||
  95.        (strcmp(s2,"AS$ ")==0) || (strcmp(s2," AS$")==0) ||
  96.        (strcmp(s2," ASS")==0) || (strcmp(s2,"FUKI")==0) ||
  97.        (strcmp(s2,"FUK ")==0) || (strcmp(s2,"SHLT")==0) ||
  98.        (strcmp(s2,"SH1T")==0) || (strcmp(s2,"SHYT")==0) ||
  99.        (strcmp(s2,"COCK")==0) || (strcmp(s2,"BAST")==0) ||
  100.        (strcmp(s2,"SH!T")==0) || (strcmp(s2,"SHT ")==0) ||
  101.        (strcmp(s2,"ASSS")==0) || (strcmp(s2,"PUSY")==0))
  102.        {backspace();backspace();backspace();backspace();
  103.        for (count=1;count<posit;count++) cp--;
  104.        outstr("\a6[CENSORED]0\a\b \b\b \b\b \b\b \b\b \b\b \b\b \b\b \b\b \b\b \b");}
  105.     }
  106.    }
  107.   } while ((done==0) && (hangup==0));
  108.   if (ch!=13) {
  109.     i=cp-1;
  110.     while ((i>0) && (s[i]!=32) && (s[i]!=8) || (s[i-1]==3))
  111.       i--;
  112.     if ((i>(wherex()/2)) && (i!=(cp-1))) {
  113.       i1=cp-i-1;
  114.       for (i=0; i<i1; i++) outchr(8);
  115.       for (i=0; i<i1; i++) outchr(32);
  116.       for (i=0; i<i1; i++) rollover[i]=s[cp-i1+i];
  117.       rollover[i1]=0; cp -= i1; } s[cp++]=1; s[cp]=0; }
  118.   if (crend) nl();
  119.  
  120. }
  121.  
  122. /***************************************************************************/
  123. /*    Now recompile and your done!  If you find this useful...           */
  124. /*                                       */
  125. /*        Tell 1@3504 that you're using it!                          */
  126. /*                                       */
  127. /* And thats all there is to it!  If you have any problems, contact 1@3504 */
  128. /***************************************************************************/
  129.  
  130. ────────────────────────────────────────────────────────────────────────────
  131.  
  132. Goose #14 @7303
  133. Sat Apr 07 08:39:58 1990
  134.                           Backspace to Previous Line
  135.  
  136. This is an update to my previous versions of the mod.  I've made the following
  137. changes and enhancements to the mod for this release of the PREVLINE mod:
  138.  
  139.   - The calling of the inli void is unchanged, since there are other mods
  140.     that may use this "standard" function.  Instead, I've added an inli2
  141.     that controls the backspacing capabilities.
  142.  
  143.   - I've fixed the problem where colors are not displayed correctly when
  144.     backspacing to the previous line.
  145.  
  146.   - This mod also has all the fixes I've previously released.  Hey, what can
  147.     I say?  I'm not perfect, unlike some people <grin>...
  148.  
  149. OK, on with the mod itself.  What this mod does is allow users to backspace to
  150. the previous line while posting a message.  When the user gets to the
  151. beginning of the line, the message:
  152.  
  153. [*> Previous Line <*]
  154.  
  155. is displayed, the previous line is shown, and the cursor is placed at the end
  156. of the line.  This makes it much easier to fix mistakes that are made at the
  157. end of a line, since it saves the user from having to type /ED and re-enter
  158. the entire line.  This mod will sure be a blessing to those users who have not
  159. yet learned to use a full screen editor (which, by the way, is the reason I
  160. didn't bother to try to update the tiny editor that Wayne built in to the
  161. source.  Sysops should know enough to use a full screen editor).
  162.  
  163. First, load up FCNS.H and make the following change (note: - designates
  164. existing code, + designates new or modified code.  The & symbol indicates
  165. lines that were split by the message editor to make it fit into the 80
  166. column width.  All these should be removed before trying to compile.  They
  167. are there to make your life easier):
  168.  
  169. - char *mmkey(int dl);
  170. + int inli2(char *s, char *rollover, int maxlen, int crend, int wb); /* mod -
  171. & add */
  172. - void inli(char *s, char *rollover, int maxlen, int crend);
  173. - void getuser();
  174.  
  175. Now, load up BBSUTL.C and add the following external variable declaration at
  176. the top of the file:
  177.  
  178. - extern char charbuffer[161];
  179. - extern userrec thisuser;
  180. + extern int charbufferpointer,chatting,curatr;              /* mod - change */
  181. - extern int usernum,useron,num_sec,helpl;
  182.  
  183. Now find the inli(..) void to and rename it to inli2(..), and make the
  184. following changes to it.  Note also that it is being changed from a void to an
  185. int function:
  186.  
  187. + int inli2(char *s, char *rollover, int maxlen, int crend, int wb) /* mod -
  188. & change */
  189. - {
  190. -   int cp,i,i1,done,cm,begx;
  191. -   char s1[255];
  192. -   unsigned char ch;
  193.  
  194. And a little farther down in the code:
  195.  
  196. -                   backspace();
  197. -                 }
  198. +             } else                                       /* mod - change */
  199. +               if (wb) {                                  /* mod - add */
  200. +                 i=curatr;                                /* mod - add */
  201. +                 ansic(3);                                /* mod - add */
  202. +                 pl("[*> Previous Line <*]");             /* mod - add */
  203. +                 setc(i);                                 /* mod - add */
  204. +                 return(1);                               /* mod - add */
  205. +               }                                          /* mod - add */
  206. -             break;
  207. -           case 24: /* Ctrl-X */
  208.  
  209. And at the very bottom of the function:
  210.  
  211. -   }
  212. -   if (crend)
  213. -     nl();
  214. +   return(0);                                               /* mod - add */
  215. - }
  216.  
  217. Then, add a replacement inli function as shown.  This will allow other mods to
  218. call this function in the same way they always have:
  219.  
  220. + void inli(char *s, char *rollover, int maxlen, int crend) /* mod - change
  221. & entire void */
  222. + {
  223. +   inli2(s,rollover,maxlen,crend,0);
  224. + }
  225.  
  226. - void getuser()
  227.  
  228. Next, load COM.C and make the following change in char inkey() to fix the
  229. problem with changing colors in the line:
  230.  
  231. -   if (charbufferpointer) {
  232. -     if (!charbuffer[charbufferpointer])
  233. -       charbufferpointer = charbuffer[0] = 0;
  234. +     else {                                                 /* mod - change */
  235. +       if ((charbuffer[charbufferpointer])==3)              /* mod - add */
  236. +         charbuffer[charbufferpointer]=16;                  /* mod - add */
  237. -       return(charbuffer[charbufferpointer++]);
  238. +     }                                                      /* mod - add */
  239. -   }
  240.  
  241. OK, now for the change to MSGBASE.C to allow the user to actually to the
  242. backspace.  Make the following changes in void inmsg(...):
  243.  
  244. -     while (!done) {
  245. -       helpl=27;
  246. +       while (inli2(s,ro,160,1,curli)) {         /* mod - change */
  247. +         --curli;                                /* mod - add */
  248. +         strcpy(ro,&(lin[(curli)*LEN]));         /* mod - add */
  249. +         if (strlen(ro)>thisuser.screenchars-1)  /* mod - add */
  250. +           ro[thisuser.screenchars-2]=0;         /* mod - add */
  251. +       }                                         /* mod - add */
  252. -       if (hangup)
  253. -         done=1;
  254. -       savel=1;
  255.  
  256. And one more change in XFER.C to allow the user to back up when entering the
  257. extended file description in void modify_extended_description(...).  The first
  258. part is in the variable declarations:
  259.  
  260. - void modify_extended_description(char **sss)
  261. - {
  262. -   char s[161],s1[161];
  263. +   int f,ii,i,i1,i2,i3;                           /* mod - change */
  264. -
  265. -   if (*sss)
  266.  
  267. Then, a little farther down in the code:
  268.  
  269. -       i=1;
  270. +       i3=0;                                              /* mod - add */
  271. -       nl();
  272. -       sprintf(s,"Enter up to %d lines, %d chars
  273. & each.",MAX_LINES,78-INDENTION);
  274. -       pl(s);
  275. -       nl();
  276. -       s[0]=0;
  277. -       i1=thisuser.screenchars;
  278. -       if (thisuser.screenchars>(76-INDENTION))
  279. -         thisuser.screenchars=76-INDENTION;
  280. -       do {
  281. -         itoa(i,s1,10);
  282. -         strcat(s1,": ");
  283. -         prt(2,s1);
  284. -         s1[0]=0;
  285. +         while (inli2(s1,s,90,1,i3)) {              /* mod - change */
  286. +           --i;                                     /* mod - add */
  287. +           itoa(i,s1,10);                           /* mod - add */
  288. +           strcat(s1,": ");                         /* mod - add */
  289. +           prt(2,s1);                               /* mod - add */
  290. +           i2=0;                                    /* mod - add */
  291. +           i3-=2;                                   /* mod - add */
  292. +           do {                                     /* mod - add */
  293. +             s[i2]=*(sss[0]+i3-1);                  /* mod - add */
  294. +             ++i2;                                  /* mod - add */
  295. +             --i3;                                  /* mod - add */
  296. +           } while ((*(sss[0]+i3)!=10) && (i3!=0)); /* mod - add */
  297. +           if (i3)                                  /* mod - add */
  298. +             ++i3;                                  /* mod - add */
  299. +           *(sss[0]+i3)=0;                          /* mod - add */
  300. +           s[i2]=0;                                 /* mod - add */
  301. +           strrev(s);                               /* mod - add */
  302. +           if (strlen(s)>thisuser.screenchars-1)    /* mod - add */
  303. +             s[thisuser.screenchars-2]=0;           /* mod - add */
  304. +         }                                          /* mod - add */
  305. -         i2=strlen(s1);
  306. -         if (i2 && (s1[i2-1]==1))
  307. -           s1[i2-1]=0;
  308. -         if (s1[0]) {
  309. -           strcat(s1,"En");
  310. +           i3+=strlen(s1);                         /* mod - add */
  311. -           strcat(*sss,s1);
  312. -         }
  313. -       } while ((i++<10) && (s1[0]));
  314.  
  315. (NOTE: There may have been an easier way to accomplish this part of the code,
  316. but I sure can't figure it out!).
  317.  
  318. That's it.  You will need to recompile the entire BBS due to the change to
  319. FCNS.H.
  320.  
  321. NOTE: If you have installed the previous version of this mod, you will
  322.       probably get the error "too many parameters in call to inli" or
  323.       something very similar to that.  Well, if you look at the end of these
  324.       lines you will notice that there is a ",0" (comma followed by a zero)
  325.       just before the right parenthesis.  Remove this and it should compile
  326.       just fine.
  327.  
  328. ────────────────────────────────────────────────────────────────────────────
  329.  
  330. Φ∩Σ Σ¥Σδ (/\)죣¥ #1 @18852
  331. (One Eyed Willy)
  332. Sun Apr 08 16:38:31 1990
  333. A very simple mod to do is to add the //UPLOAD command to the Read: prompt.  
  334. However, this mod is somewhat useless for the sysop, as he cannot use 
  335. //UPLOAD.  This mod knows if there is a user online, and will use //LOAD if 
  336. either there is no user online (a local logon) or you have Comm Disable turned 
  337. on.
  338.  
  339. In MSGBASE1.C, in function void scan(blah blah)...
  340.  
  341.   case 'Q':
  342.     quit=1;                              /* Search */
  343.     done=1;
  344.     *nextsub=0;
  345.     break;
  346.   case 'X':                              /* Add from here */
  347.     if (incom)
  348.       upload_post();
  349.     else {
  350.       nl();
  351.       prt(2,"Filename? ");
  352.       input(s1,50);
  353.       if (s1[0]) {
  354.         nl();
  355.         load_workspace(s1,1);
  356.       }
  357.     }
  358.   break;                                 /* To here */
  359.   case 'B':
  360.     if (*nextsub!   .. blah blah   
  361.  
  362. I am in no way responsible for damages caused by this mod, although I really 
  363. dont know how one could have damages caused by it, but since everyone else 
  364. makes the same type of disclaimer.. welp.. here's mine!
  365.                               
  366. ────────────────────────────────────────────────────────────────────────────
  367.  
  368. The Hermit #1 @18408
  369. Sat Apr 14 10:33:17 1990
  370.             DELETING NETWORK POSTS FROM P0.NET AND THE MSGBASE
  371.              The Most Excellent Hermit, @18408, @18412, @8403
  372.                                04/14/90
  373.  
  374.  
  375.     Aha!  I'll bet you're saying "here comes another dumb introduction to
  376. a stupid mod."  Well, you're right on both counts--this is indeed a dumb
  377. introduction, but I think you'll find this mod very useful.
  378.  
  379.     I've been running a WWIV network for a long time.  All of that time has
  380. seen me running LNET if I wanted to delete a networked post off of the
  381. network as well as off of the local base.
  382.  
  383.     WRONG!
  384.  
  385.     This mod deletes a networked post from P0.NET when the users 'D'eletes it
  386. or 'R'emoves it.  No LNET, no LNETPLUS, no DEL DATA\P0.NET...
  387.  
  388.     This mod has been thoroughly tested on all three of my systems, and it
  389. works fine.  If there's a problem, you can reach me at the following locations:
  390.  
  391.     WWIVlink 1 @18408
  392.     WWIVnet  1 @8403
  393.     Fidonet  John Wash 1:264/172
  394.     Internet eng9rxw@hibbs.vcu.edu
  395.  
  396.         Feel free to use the more obscure ones (in terms of WWIV), 'cuz I'm
  397.     testing all of my connections.
  398.  
  399. Put the following block of code right after the externs at the beginning of
  400. MSGBASE.C:
  401.  
  402. ------------------------- BEGIN CODE ---------------------------
  403. void backlseek (int handle, long seek, int loc)
  404. /* This lseek () seeks backwards "seek" bytes; it's easier than doing an:
  405.  * lseek (handle, seek*-1, loc);
  406.  * not by much, admittedly, but I'm real big on modular code.
  407.  */
  408. {
  409.     lseek (handle, seek* (-1L), loc);
  410. }
  411.  
  412.  
  413. int delete_this_message (long daten)
  414. /* Deletes the message from P0.NET with the date "daten".  Returns TRUE
  415.  * if successful; otherwise, returns false.
  416.  */
  417. {
  418.     int handle;
  419.     char s[81];
  420.     net_header_rec nh;
  421.  
  422.     nh.daten = -1; /* Init nh.daten with an ordinal value */
  423.     sprintf (s, "%sP0.NET", syscfg.datadir);
  424.     if (!exist (s))  /* Check for existence of P0.NET */
  425.     {
  426.         return (0);
  427.     }
  428.     handle = open (s, O_RDWR | O_BINARY); /* Open P0 for read/write */
  429.     if (handle < 0) /* Check success of opening P0 */
  430.     {
  431.         return (0);
  432.     }
  433.     while (!eof (handle)) /* While messages to be processed... */
  434.     {
  435.         read (handle, &(nh), sizeof (net_header_rec)); /* Read header */
  436.         if (nh.daten == daten) /* If this is the message.... */
  437.         {
  438.             backlseek (handle, sizeof(net_header_rec), SEEK_CUR); /* Go back */
  439.             nh.main_type = 65535; /* Mark message as deleted */
  440.             write (handle, &(nh), sizeof (net_header_rec)); /* Write header */
  441.             close (handle); /* Close P0 */
  442.             return (1); /* Exit function and return SUCCESS */
  443.         }
  444.         lseek (handle, (long) (sizeof (int) * nh.list_len), SEEK_CUR);
  445.         lseek (handle, nh.length, SEEK_CUR); /* Go to next message */
  446.     } /* Endwhile "checking P0.NET" */
  447.     close (handle);
  448.     return (0); /* Return FAILED */
  449. } /* Endfunc delete_this_message () */
  450. -------------------------- END CODE ----------------------------
  451.  
  452.     One more modification:
  453.  
  454.     At the end of MSGBASE.C, there's a function called delete ().  Change
  455. it to look like this:
  456.  
  457.  
  458.  
  459.  
  460. void delete(int mn)
  461. {
  462.     postrec p1;
  463.     int i;
  464.  
  465.     iscan(cursub);
  466.     if ((mn>0) && (mn<=nummsgs)) {
  467.         p1=msgs[mn];
  468.         if (subboards[curlsub].type)        /* Add this line */
  469.         {                                   /* Add this line */
  470.             delete_this_message (p1.daten)  /* Add this line */
  471.         }                                   /* Add this line */
  472.         remove_link(&p1.msg,(subboards[curlsub].filename));
  473.         for (i=mn; i<nummsgs; i++)
  474.             msgs[i]=msgs[i+1];
  475.         nummsgs--;
  476.         bchanged=1;
  477.     }
  478. }
  479.  
  480. ******************************************************************************
  481. ...well, that about wraps it up for this mod.  Simple; useful; efficient.
  482. JUST DO IT!
  483.  
  484. ────────────────────────────────────────────────────────────────────────────
  485.  
  486. Scott Estrin #7 @2116
  487. Sun Apr 15 17:36:26 1990
  488. * The POST WITH ALIAS Mod
  489. * By The Hitchhiker 1@9807
  490. * For WWIV v4.11 (will NOT work with 4.10)
  491.  
  492. WHAT: This mod will allow users to choose a name to post under, providing that
  493. you (the sysop) have allowed it on that sub.
  494.  
  495. PURPOSE:  This mod has no real, practical purpose.  I saw it on another board
  496. (not WWIV), and the sub was definately the most interesting I've ever seen, so
  497. I added it to WWIV.  It is an interesting alternative to Dear Abby and/or the
  498. Forced Anonymous subs.
  499.  
  500. HOW: Install the mod as instructed later in this message.  Adding this mod will
  501. make the following changes to the BBS:
  502.            - The "Real Name" option which Wayne added to version 4.11 is no
  503.                  longer active.
  504.            - The Dear Abby format now allows messages to be saved as the user's
  505.                  name, Abby, or Anonymous.  The Problemed Person name has been
  506.                  eliminated, so that the PP flag can be used for another
  507.                  purpose.  Any messages posted as "Problemed Person" before
  508.                  the mod was installed will appear as normal messages when
  509.                  read, but Anonymous messages in all other regards (replies,
  510.                  etc.)
  511. To set up a sub using this format, go to BOARDEDIT and set the Anony option
  512. to "Real Name" (which is a misnomer, since it is actually a FAKE name that
  513. the users are using).  After a message is posted on that sub, and before it
  514. is saved, the user will be prompted with "Enter name to post under:".  If a
  515. name is typed, that name will be used at the message header, and the message
  516. will be considered Anonymous in all other regards.  If you have MrBill's
  517. BY-LINE mod installed, all replies will refer to the name that the user has
  518. entered when saving the message.  If you have Bruce Guthrie's "User Name in
  519. Sub Title Scan" mod installed, these messages will have an author of >UNKNOWN<.
  520. (If the user just hits ENTER or RETURN at this prompt, it will be a regular
  521. message:   Name: Sysop Hitchhiker #1 @9807)
  522.  
  523. THE MOD: Finally!
  524.  
  525. * Step One *
  526. Make a backup of your files!  I use PKZIP -F BACKUP.ZIP *.C *.H, but you may
  527. use a different compressor and/or filename (if you don't have a backup file
  528. yet, omit the -F switch).
  529.  
  530. * Step Two *
  531. Load up the MSGBASE.C file, and go to void inmsg (blah).
  532.  
  533. =  Existing Line
  534. +  Add line
  535. *  Change Line
  536. -  Delete line
  537.  
  538. = void inmsg(messagerec *m1, etc..)
  539. = {
  540. * char s[LEN],s1[LEN],s2[LEN],ro[81],fnx[81],chx,*ss,*ss1,nombre[20];
  541. = int maxli,curli,done,save,savel,i,i1,i2,i3,i4,i5,f,setanon,gati[50],gatp;
  542.  
  543. Skip down a bit and make the following changes:
  544.  
  545. =    case anony_enable_dear_abby:
  546. =      nl();
  547. =      print("1. ",nam(&thisuser,usernum),"");
  548. =      pl("2. Abby");
  549. *      pl("3. Anonymous");
  550. =      nl();
  551. =      prt(5,"Which? ");
  552. =      chx=onek("\r123");
  553. =      switch (chx) {
  554. =        case '\r':
  555. =        case '1':
  556. =          *anony=0;
  557. =          break;
  558. =        case '2':
  559. =          *anony=anony_sender_da;
  560. =          break;
  561. =        case '3':
  562. *          *anony=anony_sender;
  563.  
  564. And a bit farther down...
  565.  
  566. =  l1=0;
  567. *  if (real_name) {   /*Note the brace at the end */
  568. -    addline(b,thisuser.realname,&l1);  /*Dont want this line*/
  569. +    nl();
  570. +    *anony=anony_sender_pp;
  571. +    prt(2,"Enter name to save under: ");
  572. +    inputl(nombre,20);
  573. +    if (nombre[0]==0)  {
  574. +      *anony=0;
  575. +      addline(b,nam1(&thisuser,usernum,syscfg,systemnumber),&l1);
  576. +    }
  577. +    else addline(b,nombre,&li);
  578. +  }
  579. =  else
  580. =    addline(b,nam1(&thisuser,usernum,syscfg,systemnumber),&l1);
  581.  
  582. * Step Three *
  583. Find void read_message1 (blah...) and make the following changes:
  584. =  if (m.storage_type!=255) switch (an) {
  585. =    default:
  586. =    case 0:
  587. +    case anony_sender_pp:
  588.  
  589. And a little farther down:
  590.  
  591. =  case anony_sender_da:
  592. -  case anony_sender_pp:
  593. =      osan("Name: ",&abort,next);
  594. =      ansic(MSG_COLOR);
  595. =      plan("Abby",&abort,next);
  596. =      strcpy(byline,"BY: Abby");  /* If you have MrBill's BY-LINE mod */
  597. -    } else {
  598. -      osan("Name: ",&abort,next);
  599. -      ansic(MSG_COLOR);
  600. -      plan("Problemed Person",&abort,next);
  601. -      strcpy(byline,"BY: Problemed Person"); /* If BY-LINE mod installed */
  602. -    }
  603. =    if (readit) {
  604.  
  605. * Step Four *
  606. Hit F9 and compile
  607.  
  608. Well, that's the mod (I'm pretty sure I got it all in there).  If you have any
  609. questions or comments, send me mail.  Or just send me mail to let me know if
  610. you're using the mod.  My WWIVnet address is 1@9807 (this is my first mod, I
  611. want to know if I should continue, even with my zero knowledge of C... all the
  612. C I learned was by reading the source to WWIV).
  613.  
  614. And the usual disclaimer stuff.  I take no responsibility for anything that may
  615. happen to you, your computer, your BBS, your users, your kids, your house, your
  616. town council, or anything else as a result of this mod.
  617.  
  618. One side note:  When you read a message, it looks like this:
  619.  
  620. 46/50: This is the title
  621. Name: The Funky Chicken
  622. Date: today's date.. I forgot WWIV's weird format
  623.  
  624. This is the Ctrl-D Macro
  625. This is the Ctrl-F Macro
  626.  
  627. Read (1-50,^46,?):
  628.  
  629. You'll notice that the real name or handle is not shown, not even to the sysop
  630. (that ruins all the fun!).  Some smart-alec might decide to take advantage of
  631. this and post something inappropriate, or, God forbid, illegal.  If that
  632. happens, type "A" at the end of the message, and it will give you the name of
  633. the person (If you don't want to send them mail, hit ENTER at the title).
  634. You need sysop access, obviously, otherwise you'll be sending E-mail to
  635. Anonymous.
  636.  
  637. Oh yeah, for the record, I hate tag lines and long signoffs, but I'm just
  638. trying to remind you to, in some way, let me know if you use the mod.  I don't
  639. expect you to send money, but if you happen to have a $100 bill in your wallet
  640. saying "Spend me! Spend me!", leave me a message and we can work something out.
  641.  
  642. ────────────────────────────────────────────────────────────────────────────
  643.  
  644. Goose #1 @7312
  645. Wed Apr 11 20:01:34 1990
  646.  
  647.                              Fix ANSI Lockup Mod
  648.  
  649. This mod fixes a problem where WWIV may hang when invalid ANSI strings are
  650. displayed.  I decided to figure out what the problem was after my board
  651. crashed after a user was trying to upload an ANSI screen, and seeing other
  652. weird things happen during the display of ANSI characters.
  653.  
  654. This is a really simple mod, and I'm sure it'll be fixed in the next release
  655. of WWIV (at least I hope so).  Load up COM.C, and find void execute_ansi().
  656. Go down about 20 lines to where he starts to parse the ANSI string, and make
  657. the following one line change:
  658.  
  659.     cmd = ansistr[ansiptr - 1];
  660.     ansistr[ansiptr - 1] = 0;
  661.     while ((ansistr[ptr]) && (tempptr<10) && (argptr<10)) {  /* mod - change */
  662.       if (ansistr[ptr] == ';') {
  663.         temp[tempptr] = 0;
  664.  
  665. Basically, the problem was that the code didn't check the length of the ANSI
  666. string, since all *valid* ANSI strings will be less than the ten characters
  667. declared.  However, with a little garbage in there (we all have heard of line
  668. noise) it can overwrite many different variables and cause all sorts of
  669. strange things to happen.  If you have any problems with this mod... well, I'm
  670. sure you won't so I'll leave off the normal closing line.
  671.  
  672. T.T.F.N.
  673.  
  674. ────────────────────────────────────────────────────────────────────────────
  675.  
  676. Alleykat #1 @8352
  677. Sun Apr 22 12:00:05 1990
  678. With all the sublist mods showing up in this message base I couldn't
  679. decide which one to use.   Therefore I took the best of them and
  680. combined them.   There are at least 4 peoples mods here combined.
  681. The main code is from Lt. Hyteck (sysop of The Morgue) and I can't
  682. remember the others.  The addition made to LH's mod was the addition
  683. of the Number of messages and the number of new.
  684.  
  685. I take no credit for any of this other than the fact I merged them.
  686. I further take no responsibitlity to any damage or ill effects this
  687. mod has on your system or software.
  688.  
  689. Get BBS.C and Block read and replace the function sublist.
  690. Recompile the BBS
  691.  
  692. void sublist()
  693. {
  694.   int ok,i,abort,a,b;
  695.   char s[80],s1[50],sdf[120];
  696.   int sam,tally;
  697.  
  698.   abort=0;
  699.   nl();
  700.   pla("5 Num7  Sub Typ 1Message Base Topic                        2Msg 1New",&abort);
  701.   pla("3╔════╦═══════╦═════════════════════════════════════════╦═══╦═══╗ ",&abort);
  702.   i=0;
  703.   while ((i<32) && (usub[i].subnum!=-1)) {
  704.     if (strcmp(usub[cursub].keys,usub[i].keys))
  705.       strcpy(s1,"Yes");
  706.     else
  707.       strcpy(s1,"No");
  708.     strcpy(s,"3║ 5");
  709.     strcat(s,usub[i].keys);
  710.     s[8]=0;
  711.     if (s[7]==0)
  712.       s[8]=32;
  713.     if (i<=8)
  714.       strcat(s," ");
  715.     strcat(s," 3║ ");
  716.     if (subboards[usub[i].subnum].type)        /* checks whether Networked   */
  717.       strcat(s,"7>Net< 3║ 1");              /* or Local subs.             */
  718.     else                                       /*                            */
  719.       strcat(s,"2Local 3║ 1");              /*                            */
  720.     strcat(s,subboards[usub[i].subnum].name);
  721.     a=(67-(strlen(s)));
  722.     for (b=0; b<a; b++)
  723.       strcat(s," ");
  724.     strcat(s,"3║");
  725.  
  726.     iscan(i);
  727.     sam=1;
  728.     while ((sam<=nummsgs) && (msgs[sam].qscan<=thisuser.qscnptr[usub[i].subnum]))
  729.       ++sam;
  730.     tally=nummsgs-(sam-1);
  731.     sprintf(sdf,"%67s2%3d3║6%3d",s,nummsgs,tally);
  732.  
  733.     strcat(sdf,"3║");
  734.     if (strcmp(s1,"Yes"))                      /* checks current sub - if   */
  735.       strcat(sdf," 6<You're Here");           /* sub name = this position  */
  736.     pla(sdf,&abort);                           /* puts pointer on this line */
  737.     i++;
  738.   }
  739.   pla("3╚════╩═══════╩═════════════════════════════════════════╩═══╩═══╝ ",&abort);
  740.  
  741.   if (i==0)
  742.     pla("6None.",&abort);
  743.   nl();
  744. }
  745.  
  746. ────────────────────────────────────────────────────────────────────────────
  747.  
  748. Merlin #1 @6869
  749. Sat May 05 14:24:33 1990
  750.  
  751. Hello, and welcome to MERLIN2.MOD...
  752.  
  753.         This might have been duplicated by an Elric Mod, but I'm sure.
  754. Anyhow, what this will do is move the regional information to a separate
  755. line, and put the originating BBS's phone number back to make your message
  756. headers look something like this...
  757.  
  758. 1/100:  This is the title.
  759. Name: |\/|erlin #1@6869
  760. Date: Sun Apr 22 15:04 1990
  761. From: |\/|erlin's Tower [618-473-xxxx]
  762. Region: S-Ill. <Belleville>
  763.  
  764. As usual with most of these mods, the author (me) takes no resposibility
  765. what-so-ever if this mod causes your cat to jump on your keyboard and
  766. delete every user you have or if your modem decides it doesn't like you
  767. and fries itself, committing datacide...
  768.  
  769. If you have any questions or comments, either leave mail to 4@6862
  770. or log onto the Lion's Den (618) 746-4534 and tell the SysOp that you
  771. came because I suggested it...<GRIN>...
  772.  
  773. Thanks...
  774. |\/|erlin  4@6862
  775.  
  776. /***********************/
  777. /*     L E G E N D     */
  778. /***********************/
  779. /* - = Deleted Line    */
  780. /* + = New Line        */
  781. /* # = Existing Line   */
  782. /* ! = Modified Line   */
  783. /* * = Search For Line */
  784. /***********************/
  785.  
  786. Part 1:   Replace this SECTION, not just setorigin, but the ENTIRE section
  787.           starting from the row of asterisks!
  788.  
  789.  
  790. /****************************************************************************/
  791. static char origin_str[81], origin_str2[81];
  792.  
  793. void setorigin(int sysnum)
  794. {
  795.   int i,csi;
  796.   char s[81],ch;
  797.  
  798.   origin_str[0]=0;
  799.   origin_str2[0]=0;
  800.  
  801.   if (sysnum) {
  802.     csi=-1;
  803.     for (i=0; i<num_sys_list; i++)
  804.       if (csn[i].sysnum==sysnum)
  805.         csi=i;
  806.     if (csi>-1) {
  807.       if (csn[csi].other & other_coordinator)
  808.         ch='*';
  809.       else
  810.         ch=' ';
  811.  
  812.       describe_area_code(atoi(csn[csi].phone),s);
  813.       if (s[0]) {
  814.         sprintf(origin_str,"%c%s [%s]",ch,csn[csi].name,csn[csi].phone);
  815.         sprintf(origin_str2,"Region: %s",s);
  816.       } else {
  817.         sprintf(origin_str,"%c%s [%s]",ch,csn[csi].name,csn[csi].phone);
  818.         sprintf(origin_str2,"REGIONS.DAT missing!");
  819.       }
  820.     } else
  821.       strcpy(origin_str," Unknown System");
  822.   }
  823. }
  824.  
  825. Part 2:   Now, in void read_message1(blah blah blah), make the following
  826.           changes...
  827.  
  828. #      ansic(MSG_COLOR);
  829. #      strcpy(s,d);
  830. #      plan(s,&abort,next);
  831. *      if (origin_str[0]) {
  832. #        osan("From:",&abort,next);
  833. #        plan(origin_str,&abort,next);
  834. +        if (origin_str2[0])
  835. +         plan(origin_str2,&abort,next);
  836. #      }
  837. #      break;
  838. #    case anony_sender:
  839.  
  840. ────────────────────────────────────────────────────────────────────────────
  841.  
  842. Parker Prospect #1 @9964
  843. Tue May 08 22:09:08 1990
  844.  
  845. This tag line mod will work great, and it is simple (around 7 lines).  This
  846. has no messy misplaced else errors that non-programming sysops give out
  847. either.  I will admit that the original idea was not mine, but the original
  848. idea loaded a file, read one line from it, and used it as a tag line.
  849. The following code is in MSGBASE.C in void inmsg.
  850.  
  851.  
  852. -- Search for this line
  853. ++ Add this line
  854. ********************************* THE MOD *************************************
  855. --    } else {
  856. --      for (i5=0; i5<curli; i5++)
  857. --        addline(b,&(lin[i5*LEN]),&l1);
  858. --    }
  859. ++    if ((subboards[curlsub].type) && (syscfg.systemnumber))
  860. ++      {
  861. ++        addline(b,"",&l1); /* Blank line, leave this alone! */
  862. ++        addline(b,"<insert the first line of your tag here>",&l1);
  863. ++        addline(b,"<insert the next line of your tag here>",&l1);
  864. ++        addline(b,". . .",&l1);
  865.  
  866. /* You may ^^^^ do the above line as little or as much as you wish.  Simply
  867.    add and delete the addline procedures as needed.  The general format for
  868.    addline is "addline(b," message ",&l1);".  I have to yet figure out the
  869.    parameters, but this works!                                             */
  870.  
  871. ++      }
  872. --    if (b[l1-1]!=26)
  873. --      b[l1++]=26;
  874. --    savefile(b,l1,&m,aux);
  875. *******************************************************************************
  876.  
  877. The credit for this mod goes somewhat to Doug Fields, who (indirectly) showed
  878. me how to use addline.  I am a programmer, but in Pascal (C is a close
  879. relative).  Anyway, the good part:
  880.  
  881. If anything happens that is not good because you used this mod,
  882. is not my fault, not is it the fault of my mod.  It was simply your stupidity.
  883. (just kidding).  I am not in any way liable for this mod.
  884.  
  885.  
  886.   < The East Carolina Connection   *MODS GALORE*   919-756-2939   1200/2400 >
  887.  
  888. ────────────────────────────────────────────────────────────────────────────
  889.  
  890. Birdhunter #1 @3451
  891. Tue May 08 22:06:19 1990
  892.  
  893.  
  894.                 !!!!!!!   MAILINMS.MOD    !!!!!
  895.  
  896. Did you ever wind up seeing something in a post that reminds you that you
  897. want to mail ANOTHER user???  And to do so you have to Quit your scan,
  898. Email or Fmail the person and start your scan all over again??!!!
  899. Frustrating!!!!
  900.  
  901. OK, this mod will allow you to both "F"mail the sysop OR to mail ANY
  902. user in the NET or on your board FROM the message WITHOUT quitting the
  903. message base.
  904.  
  905. Search for the following in MSGBASE1.C
  906.  
  907. void scan(int msgnum, int optype, int *nextsub)
  908. {
  909.   char s[81],s1[81],s2[81],*b,*ss1;
  910.   int i,i1,i2,done,quit,abort,next,val,realexpress;
  911.   slrec ss;
  912.  
  913. When you reach that function search for the following:
  914.  
  915.               case 'B':
  916.                 if (*nextsub!=0) {
  917.                   *nextsub=1;
  918.                   done=1;
  919.                   quit=1;
  920.                 }
  921.  
  922. ADD this code BEFORE case 'B': as shown below:
  923.  
  924.         case 'F':                     /* BH mod */
  925.         feedback();                   /* BH mod */
  926.         break;                        /* BH mod */
  927.  
  928.         case '=':                      /* BH mod */
  929. /* Note the = can be replaced by ANY unused function that you like */
  930.         send_email();                  /* BH mod */
  931.         break;                         /* BH mod */
  932.  
  933.               case 'B':                /* the rest is existing code */
  934.                 if (*nextsub!=0) {
  935.                   *nextsub=1;
  936.                   done=1;
  937.                   quit=1;
  938.                 }
  939.                 break;
  940.               case 'T':
  941.                 optype=1;
  942.                 break;
  943.  
  944.  
  945.  
  946.       That's it.  I don't normally publish mods, just hack.  So any
  947.       problems with this, let me know but do NOT hold me responsible!!
  948.                                 Birdhunter
  949.                                 
  950. Birdhunter #1 @3451
  951. Tue May 08 22:08:55 1990
  952.  
  953.     Don't forget to add the = function to your menus and let the users know it
  954. is available.
  955.                              <<<<~~~~BIRDHUNTER~~~~>>>>
  956.  
  957.  
  958. ────────────────────────────────────────────────────────────────────────────
  959.  
  960. The Tyrant #1 @6909
  961. Sat May 12 14:44:18 1990
  962.  
  963. This is the first ever mod by The Tyrant!
  964. It changes the Read Prompt in MSGBASE1.C (search for "/* Read Prompt */") so
  965. that the newer users (and the old pro's too) can understand what info is
  966. actually there.  Just load the above file, search like it says, and replace
  967. whatever is different.  A few extra lines were thrown in on either side of the
  968. mod to know where to begin and where to end REPLACEMENT (since the old stuff
  969. will have to be tossed).  Enjoy...
  970.  
  971.  
  972.     switch(optype) {
  973.       case 0: /* Read Prompt */
  974.     if (express) {
  975.       s[0]=0;
  976.           nl();
  977.           nl();
  978.         } else {
  979.       sprintf(s,"[-<1-%u Available>-]",nummsgs);
  980.           pl(s);
  981.           i3=msgnum+1;
  982.           if (nummsgs<i3)
  983.        pl("[-<Enter=Done>-]");
  984.           else  {
  985.        sprintf(s,"[-<Enter=Read %u>-]",i3);
  986.            pl(s);
  987.           }
  988.       prt(2,"[-<?=Help>-]: ");
  989.           helpl=16;
  990.           input(s,3);
  991.           while (s[0]==32) {
  992.             strcpy(s1,&(s[1]));
  993.             strcpy(s,s1);
  994.           }
  995.         }
  996.         optype=0;
  997.         i=atoi(s);
  998.         if (s[0]==0) {
  999.           i=msgnum+1;
  1000.  
  1001. ────────────────────────────────────────────────────────────────────────────
  1002.  
  1003. Parker Prospect #1 @9964
  1004. Mon May 14 22:37:32 1990
  1005.  
  1006. Mod Name        : Message Editor Mod v2.0
  1007. Mod Filename    : EX20.MOD
  1008. Mod Author      : Parker Prospect #1 @9964
  1009. Mod Description : Since this mod had been thoroughly requested, either
  1010. out of a need to have nice editing features for WWIV, that it obviously
  1011. lacks, or a wave of nostalgia hit some of the old WWIV v3.21d sysops
  1012. (yes I was one of them) and they wanted the old editor back.  Well, Tau
  1013. Ceti made the first version of this mod, and the last version he had
  1014. released worked, but was not bulletproof.  I did so.  Also, I could
  1015. never get the /T: command to work.  I finally did that also.  Enjoy!
  1016.  
  1017. ************** Legend **************
  1018. * %% Delete Line                   *
  1019. * -- Search for Line, DON'T CHANGE *
  1020. * ++ Add Line                      *
  1021. * -+ Modify Line                   *
  1022. * ## Line is part of another mod   *
  1023. ************************************
  1024.  
  1025. ------------------------------------------------------------------------
  1026. Step #1 <MSGBASE.C>: Add the following code (a lot) where specified.
  1027.  
  1028. --        done=1;
  1029. --      savel=1;
  1030. --      if (s[0]=='/') {
  1031. --        if (stricmp(s,"/HELP")==0) {
  1032. --          savel=0;
  1033. --          printmenu(2);
  1034. --        }
  1035. ++        if (stricmp(s,"/EX")==0) {
  1036. ++          exloop = 1;
  1037. ++          while (exloop) {
  1038. ++            nl();
  1039. ++            prt(5,"Message Editor {?} : ");
  1040. ++            c[0] = onek("CA?SLNRTDIU");
  1041. ++            switch(c[0]) {
  1042. ++              case '?' :
  1043. ++                prhelp();
  1044. ++                break;
  1045. ++              case 'S' :
  1046. ++                save=1;
  1047. ++                done=1;
  1048. ++                savel=0;
  1049. ++                exloop=0;
  1050. ++                break;
  1051. ++              case 'L' :
  1052. ++                savel=0;
  1053. ++                prt(5,"With line numbers? ");
  1054. ++                i1=yn();
  1055. ++                i2=0;
  1056. ++                for (i=0; (i<curli) && (!i2); i++) {
  1057. ++                  if (i1) {
  1058. ++                    itoa(i+1,s1,10);
  1059. ++                    strcat(s1,":");
  1060. ++                    pl(s1);
  1061. ++                  }
  1062. ++                  strcpy(s1,&(lin[i*LEN]));
  1063. ++                  i3=strlen(s1);
  1064. ++                  if (s1[i3-1]==1)
  1065. ++                    s1[i3-1]=0;
  1066. ++                  if (s1[0]==2) {
  1067. ++                    strcpy(s1,&(s1[1]));
  1068. ++                    i5=0;
  1069. ++                    for(i4=0; i4<strlen(s1); i4++)
  1070. ++                      if ((s1[i4]==8) || (s1[i4]==3))
  1071. ++                        --i5;
  1072. ++                      else
  1073. ++                        ++i5;
  1074. ++                    for (i4=0; (i4<(thisuser.screenchars-i5)/2) && (!i2);
  1075. i4++)
  1076. ++                      osan(" ",&i2,&i1);
  1077. ++                  }
  1078. ++                  pla(s1,&i2);
  1079. ++                }
  1080. ++                break;
  1081. ++              case 'A' :
  1082. ++                prt(5, "Abort message? ");
  1083. ++                if (yn()) {
  1084. ++                  done=1;
  1085. ++                  savel=0;
  1086. ++                  exloop=0;
  1087. ++                }
  1088. ++                break;
  1089. ++              case 'N' :
  1090. ++                prt(5, "Are you sure? ");
  1091. ++                if (yn()) {
  1092. ++                  savel=0;
  1093. ++                  curli=0;
  1094. ++                  nl();
  1095. ++                  pl("Message cleared... Start over...");
  1096. ++                } else {
  1097. ++                 pl("Continue...");
  1098. ++                nl();
  1099. ++                nl();
  1100. ++                exloop=0;
  1101. ++                break;
  1102. ++              case 'C' :
  1103. ++                nl();
  1104. ++                prt(5,"Continue editing...");
  1105. ++                nl();
  1106. ++                nl();
  1107. ++                exloop=0;
  1108. ++                break;
  1109. ++              case 'R' :
  1110. ++                savel=0;
  1111. ++                i2=0;
  1112. ++                nl();
  1113. ++                itoa(curli,s1,10);
  1114. ++                prt(5,"Replace line 1-");
  1115. ++                prt(5,s1);
  1116. ++                prt(5,"? ");
  1117. ++                input(c,2);
  1118. ++                i=atoi(c);
  1119. ++                if ((i>0) && (i<=curli)) {
  1120. ++                  i=i-1;
  1121. ++                  strcpy(s1,&(lin[i*LEN]));
  1122. ++                  i3=strlen(s1);
  1123. ++                  if (s1[i3-1]==1)
  1124. ++                    s1[i3-1]=0;
  1125. ++                  if (s1[0]==2) {
  1126. ++                    strcpy(s1,&(s1[1]));
  1127. ++                    i5=0;
  1128. ++                    for(i4=0; i4<strlen(s1); i4++)
  1129. ++                      if ((s1[i4]==8) || (s1[i4]==3))
  1130. ++                        --i5;
  1131. ++                      else
  1132. ++                        ++i5;
  1133. ++                  for (i4=0; (i4<(thisuser.screenchars-i5)/2) && (!i2); i4++)
  1134. ++                      osan(" ",&i2,&i1);
  1135. ++                  }
  1136. ++                  pla(s1,&i2);
  1137. ++                }
  1138. ++                prt(5,"Enter replacement line:");
  1139. ++                nl();
  1140. ++                inli(s,ro,160,1);
  1141. ++                strcpy(&(lin[(i)*LEN]),s);
  1142. ++                break;
  1143. ++              case 'T' :
  1144. ++                savel=0;
  1145. ++                if (okansi()) {
  1146. ++                  prt(2,"Title: ");
  1147. ++                  mpl(60);
  1148. ++                  inputl(title,60);
  1149. ++                } else {
  1150. ++                  pl("
  1151. (---=----=----=----=----=----=----=----=----=----=----=----)");
  1152. ++                  outstr("Title: ");
  1153. ++                  inputl(title,60);
  1154. ##                  if ((subboards[curlsub].type == 2370) && (aux != "EMAIL"))
  1155. {
  1156. ##                    prt(5, "Is this post a mod? ");
  1157. ##                    if (yn()) {
  1158. ##                      title[strlen(title)] = 32;
  1159. ##                      title[55] = 60;
  1160. ##                      title[56] = 77;
  1161. ##                      title[57] = 79;
  1162. ##                      title[58] = 68;
  1163. ##                      title[59] = 62;
  1164. ##                      title[60] = 0;
  1165. ##                    }
  1166. ##                  }
  1167. ++                }
  1168. ++                break;
  1169. ++              case 'D' :
  1170. ++                savel=0;
  1171. ++                itoa(curli,s1,10);
  1172. ++                prt(5,"Delete line 1-");
  1173. ++                prt(5,s1);
  1174. ++                prt(5,"? ");
  1175. ++                input(c,2);
  1176. ++                n=atoi(c);
  1177. ++                if ((n > 0) && (n <=curli)) {
  1178. ++                  n=n-1;
  1179. ++                  i= &(lin[curli*LEN])+LEN-&(lin[(n+1)*LEN]);
  1180. ++
  1181. memmove(&lin[(n)*LEN],&lin[(n+1)*LEN],&(lin[curli*LEN])+LEN-&(lin[(n+1)*LEN]));
  1182. ++                  --curli;
  1183. ++                }
  1184. ++                break;
  1185. ++              case 'I' :
  1186. ++                savel=0;
  1187. ++                if (curli==maxli){
  1188. ++                  prt(5,"No room to insert a line");
  1189. ++                  nl();
  1190. ++                } else {
  1191. ++                       itoa(curli,s1,10);
  1192. ++                  prt(5,"Insert line before 1-");
  1193. ++                  prt(5,s1);
  1194. ++                  prt(5,"? ");
  1195. ++                  input(c,2);
  1196. ++                  n=atoi(c);
  1197. ++                  if ((n>0) && (n<=curli)) {
  1198. ++
  1199. memmove(&lin[(n)*LEN],&lin[(n-1)*LEN],&(lin[curli*LEN])+LEN-&(lin[(n)*LEN]));
  1200. ++                    curli++;
  1201. ++                    prt(5,"Enter insert line:");
  1202. ++                    nl();
  1203. ++                    inli(s,ro,160,1);
  1204. ++                    strcpy(&(lin[(n-1)*LEN]),s);
  1205. ++                  }
  1206. ++                }
  1207. ++                break;
  1208. ++              case 'U' :
  1209. ++                savel=0;
  1210. ++                i2=0;
  1211. ++                nl();
  1212. ++                itoa(curli,s1,10);
  1213. ++                prt(5,"Update line 1-");
  1214. ++                prt(5,s1);
  1215. ++                prt(5,"? ");
  1216. ++                input(c,2);
  1217. ++                i=atoi(c);
  1218. ++                if ((i>0) && (i<=curli)) {
  1219. ++                  i=i-1;
  1220. ++                  strcpy(s1,&(lin[i*LEN]));
  1221. ++                  i3=strlen(s1);
  1222. ++                  if (s1[i3-1]==1)
  1223. ++                    s1[i3-1]=0;
  1224. ++                  if (s1[0]==2) {
  1225. ++                    strcpy(s1,&(s1[1]));
  1226. ++                    i5=0;
  1227. ++                    for(i4=0; i4<strlen(s1); i4++)
  1228. ++                      if ((s1[i4]==8) || (s1[i4]==3))
  1229. ++                        --i5;
  1230. ++                      else
  1231. ++                        ++i5;
  1232. ++                    for (i4=0; (i4<(thisuser.screenchars-i5)/2) && (!i2);
  1233. i4++)
  1234. ++                      osan(" ",&i2,&i1);
  1235. ++                  }
  1236. ++                  pla(s1,&i2);
  1237. ++                }
  1238. ++                prt(5,"Enter in form oldstring/newstring");
  1239. ++                nl();
  1240. ++                inli(s,ro,160,1);
  1241. ++                if (!s[0])
  1242. ++                  break;
  1243. ++                ss=strstr(s,"/");
  1244. ++                ss1=&(ss[1]);
  1245. ++                ss[0]=0;
  1246. ++                stuff(&(lin[(i)*LEN]),s,ss1);
  1247. ++                prt(5,"Line now reads:");
  1248. ++                nl();
  1249. ++                pl(&(lin[(i)*LEN]));
  1250. ++                break;
  1251. ++            }
  1252. ++          }
  1253. ++        }
  1254. --        if (stricmp(s,"/LI")==0) {
  1255. --          savel=0;
  1256. --          prt(5,"With line numbers? ");
  1257. --          i1=yn();
  1258. --          i2=0;
  1259.  
  1260. ------------------------------------------------------------------------
  1261. Step #2 <MSGBASE.C>: Add the following code where specified.
  1262.  
  1263. --          pl("Continue...");
  1264. --          nl();
  1265. --        }
  1266. --        strcpy(s1,s);
  1267. --        s1[3]=0;
  1268. ++        if (stricmp(s1,"/T:")==0) {
  1269. ++          savel=0;
  1270. ++          i3=strlen(s)-3;
  1271. ++          if ((i3 > 0) && (i3 < 71) && (curli < (maxli-3))) {
  1272. ++            s1[0]=2;
  1273. ++            s1[1]='+';
  1274. ++            memset(&s1[2], '-', (i3+2));
  1275. ++            s1[i3+4]=0;
  1276. ++            strcat(s1,"+");
  1277. ++            strcpy(&(lin[(curli++)*LEN]),s1);
  1278. ++            s2[0]=2;
  1279. ++            s2[1]=0;
  1280. ++            strcat(s2,"| ");
  1281. ++            strcat((&s2[3]),&(s[3]));
  1282. ++            strcat(s2," |");
  1283. ++            strcpy(&(lin[(curli++)*LEN]),s2);
  1284. ++            strcpy(&(lin[(curli++)*LEN]),s1);
  1285. ++          } else
  1286. ++             pl("*Length of boxed string must be between 1 and 70
  1287. characters*");
  1288. ++        }
  1289. --        if (stricmp(s1,"/C:")==0) {
  1290. --          s1[0]=2;
  1291.  
  1292.  
  1293. ------------------------------------------------------------------------
  1294. Step #3 <MSGBASE.C>: Add the following code where specified.
  1295.  
  1296. -- void inmsg(messagerec *m1, char *title, int *anony, int needtitle,
  1297. --            char *aux, int fsed)
  1298. -- {
  1299. --   char s[LEN],s1[LEN],s2[LEN],ro[81],fnx[81],chx,*ss,*ss1;
  1300. --   int maxli,curli,done,save,savel,i,i1,i2,i3,i4,i5,f,setanon,gati[50],
  1301. --       gatp;
  1302. --   messagerec m;
  1303. --   long ll,l1;
  1304. --   char *lin, *b;
  1305. --   int real_name=0;
  1306. ++   int exloop, n;
  1307. ++   char c[LEN];
  1308.  
  1309. ------------------------------------------------------------------------
  1310. Step #4 <MSGBASE.C>: Add the following code BEFORE void inmsg.
  1311.  
  1312. void prhelp()
  1313. {
  1314.   pl("? - This menu      S - Save message");
  1315.   pl("L - List lines     A - Abort message");
  1316.   pl("N - New message    C - Continue");
  1317.   pl("R - Replace a line T - new Title");
  1318.   pl("D - Delete a line  I - Insert a line");
  1319.   pl("U - Update a line (search & replace)");
  1320.   nl();
  1321. }
  1322.  
  1323. ------------------------------------------------------------------------
  1324. Final Step
  1325.  
  1326. Compile the BBS and update your menus to reflect the changes you made...
  1327.  
  1328.  
  1329. ------------------------------------------------------------------------
  1330. Disclaimer
  1331.  
  1332. I, Jeff Garzik, claim no liability for this mod, or for any damage that
  1333. may have resulted from the use of this mod.  I also attach no warranty,
  1334. expressed OR implied, to this product.  This type of warranty and
  1335. liability disclaimer is prohibited by law in certain states, and is
  1336. therefore void in those states.
  1337.  
  1338. ────────────────────────────────────────────────────────────────────────────
  1339.  
  1340. Shadow-Starr #1 @2374
  1341. Thursday, May 17, 1990   6:52 pm
  1342.  
  1343.                               The Ulti-mail Mod
  1344.  
  1345.         This mod takes care of one silly little occurance in WWIV that I
  1346. personally found wasteful.  It combines the Email, Multiple SysOp Feedback,
  1347. and Multi-mail into one useful little menu.
  1348.         One little note:  all the case 'x' (where is x is a number)
  1349. instances are the locations for my myself, my two remote sysops, and my 4
  1350. co-sysops.  You will need to eliminate or change these as necessary for your
  1351. management cadre (mine is somewhat large).
  1352.  
  1353.  
  1354.         Ok... now, let's get to it...
  1355.  
  1356. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1357.  
  1358. STEP UN (ONE):
  1359.  
  1360.         In BBSUTIL.C, block read in the following code immediately following
  1361. the external calls.
  1362.  
  1363.  
  1364.  
  1365. void feedback()
  1366. {
  1367.   char ch,s1[80];
  1368.  
  1369.   nl();
  1370.   printmenu(16);
  1371.   tleft(1);
  1372.   print("Time remaining - ",ctim(nsl()),"");
  1373.   ansic(1);
  1374.   outstr("() Phoenix Express Feedback (> ");  /*  The name of your bbs here */
  1375.   ch=onek("1234567EMQ");         /*  Make sure each CASE '?' is listed here */
  1376.   switch(ch) {
  1377.     case '1':
  1378.        strcpy(irt,"Feedback");                    /*  This is your account  */
  1379.        email(1,0,0,0);
  1380.       break;
  1381.     case '2':
  1382.        strcpy(irt,"Feedback to Remote SysOp");   /*  These will be the RE:s */
  1383.        email(9,0,0,0);
  1384.       break;
  1385.     case '3':
  1386.        strcpy(irt,"Feedback to Remote SysOp (MESSAGE BASE)");
  1387.        email(3,0,0,0);                  /*  Change 1st number to account #  */
  1388.        break;
  1389.     case '4':
  1390.        strcpy(irt,"Co-SysOp Feedback (USER MEETS)");
  1391.        email(2,0,0,0);
  1392.       break;
  1393.     case '5':
  1394.        strcpy(irt,"Co-SysOp Feedback (TRANSFERS)");
  1395.        email(18,0,0,0);
  1396.       break;
  1397.     case '6':
  1398.        strcpy(irt,"Co-SysOp Feedback (USER ENFORCEMENT)");
  1399.        email(8,0,0,0);
  1400.       break;
  1401.     case '7':
  1402.        strcpy(irt,"Co-SysOp Feedback (PUBLIC RELATIONS)");
  1403.        email(2,0,0,0);
  1404.       break;
  1405.     case 'E':
  1406.       send_email();                  /*  standard email  */
  1407.       break;
  1408.     case 'M':
  1409.       slash_e();                     /*    multi-mail    */
  1410.       break;
  1411.     case 'Q':                        /*       quit       */
  1412.       break;
  1413.   }
  1414. }
  1415.  
  1416.  
  1417. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1418. STEP DEUX (TWO):
  1419.  
  1420.         In BBS.C, search for 'slash_e()' and delete that line and the one
  1421. above it (they make the call to the multi-mail, and since this is no longer
  1422. needed...), and then search down to "case 'E':" and replace case 'E' and case
  1423. 'F' with:
  1424.  
  1425.     case 'E':
  1426.       feedback();
  1427.       break;
  1428.  
  1429.  
  1430.         Notice that there is no more case 'F'....
  1431.  
  1432. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1433. STEP TROIS (THREE):
  1434.  
  1435.         Compile that puppy and watch it go... and all should go well.
  1436.  
  1437. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1438. STEP QUATRE (FOUR):
  1439.  
  1440.         Use TheDraw or something to make menu16.msg and or menu16.ans.  Mine
  1441. look like this:
  1442.  
  1443. /-----------------------------------\
  1444. | 1 Shadow-Starr                (SY)|
  1445. | 2 FrenChem                    (RS)|
  1446. | 3 Baron Ferd Von Die Welten   (RS)|
  1447. | 4 Lady Astra                  (CO)|
  1448. | 5 Rangerlord K                (CO)|
  1449. | 6 The Galaxative              (CO)|
  1450. | 7 Howard the Flaming Propoise (CO)|
  1451. \-----------------------------------/
  1452.          /-----------------\
  1453.          |E  Standard Email|
  1454.          |M  Multi-Mail    |
  1455.          |Q  Quit          |
  1456.          \-----------------/
  1457.  
  1458.         That being my ASCII version of the menu.
  1459.  
  1460. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1461.  
  1462. UPCOMING FEATURES:
  1463.  
  1464.         *  //MAILR command (hotkey) for sysops at prompt
  1465.         *  Kill command in menu
  1466.         *  Read mail command in menu
  1467.         *  Multi-mail to sysops (management)
  1468.  
  1469. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1470.  
  1471. DISCLAIMER:
  1472.  
  1473.         I, in no way force or imply to force, you to use this mod of mine,
  1474. nor at any point do I ask for your money (I, like many sysops out there,
  1475. am utterly broke, but still proud) and thus, claim no responsibility for any
  1476. damages that may occur to your system do to faulty programming skills.
  1477.         This mod does work with 100% accuracy on Phoenix Express (WWIV @2374)
  1478. and thus, any fault must lie in translation or reinstillation.
  1479.  
  1480.         If you do use this mod, however, I would like to know what you think
  1481. about it, so please email me at 1@2374.
  1482.  
  1483.                 And thank you for your support....
  1484.  
  1485. ────────────────────────────────────────────────────────────────────────────
  1486.  
  1487. Merlin #4 @6862
  1488. Fri May 25 10:37:23 1990
  1489.  
  1490.                        Multi-Tagline for 4.11
  1491.                           (MERLIN1.MOD)
  1492. Now, we all know that there are TONS of tag line modifications out in the
  1493. world today.  Two that I always liked were Doug Field's TAGLINE, and Parker
  1494. Prospect's TAGMOD2 (or, at least, that's what the file name where that I
  1495. got).  Anyhow, one day I decided that I wanted to combine both to create a
  1496. most triumphant (yeah Bill and Ted!) mod.
  1497. ~~~~~~~~~~~~~~~
  1498. Now, if you aren't familiar with the above-mentioned mods, then you
  1499. probably have no idea what these mods do.  P.Prospect's mod allows the tag
  1500. to be added to even FSED messages because it uses the 'addline' routine.
  1501. D.Field's mod created a separate tagline for EACH subtype by the use of a
  1502. tag file (and thus, you DON'T have to recompile the BBS everytime you want
  1503. to change it...YEAH!).  (BTW, hi to MtB--for the ORIGINIAL Tagline idea!)
  1504.  
  1505. Merlin 4@6862
  1506.  
  1507. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1508.  
  1509.         Well, after closer look at my code, I realized that i forgot
  1510.         a few statements here and there so that EMail wouldn't be
  1511.         affected by the TAG.  Well, that's been killed off.  Enjoy.
  1512.  
  1513. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1514.  
  1515. /***********************/
  1516. /*     L E G E N D     */
  1517. /***********************/
  1518. /* - = Deleted Line    */
  1519. /* + = New Line        */
  1520. /* # = Existing Line   */
  1521. /* ! = Modified Line   */
  1522. /* * = Search For Line */
  1523. /***********************/
  1524.  
  1525. In MSGBASE.C:          void inmsg();
  1526.  
  1527. = messagerec m;
  1528. = long ll,l1;
  1529. = char *lin, *b;
  1530. + char s8[181];                /* MERLIN1 --> TAG MOD */
  1531. + FILE *nettagfile;            /* MERLIN1 --> TAG MOD */
  1532. = int real_name=0;
  1533.  
  1534. Later on in MSGBASE.C:  void inmsg();
  1535. =   } else {
  1536. =     for (i5=0; i5<curli; i5++)
  1537. =    addline(b,&(lin[i5*LEN]),&l1);
  1538. =   }
  1539. +   /* MERLIN1.MOD --> THE ULTIMATE TAG MOD */
  1540. +   if ((subboards[cursub].type) && (syscfg.systemnumber) &&
  1541. !(strcmp(aux,"EMAIL"))) {
  1542. +     addline(b,"",&l1);  /* Blank Line */
  1543. +     sprintf(s8, "%sTAG%u.MSG", syscfg.datadir,subboards[cursub].type);
  1544. +     if ((nettagfile =  fopen(s8, "rt"))==NULL) {
  1545. +       sprintf(s8, "%sTAG-GEN.MSG", syscfg.datadir);
  1546. +       nettagfile = fopen(s8,"rt");
  1547. +     }
  1548. +     if (nettagfile !=NULL) {
  1549. +       while (!feof(nettagfile) && (curli < maxli)) {
  1550. +         fgets(s8, 180, nettagfile);
  1551. +         if (!feof(nettagfile))  addline(b, s8, &l1);
  1552. +       }
  1553. +       fclose(nettagfile);
  1554. +     }
  1555. +     addline(b, "", &l1);
  1556. +   }
  1557. +   /* MERLIN1.MOD --> THE ULTIMATE TAG MOD */
  1558. =   if (b[l1-1]!=26)
  1559. =     b[l1++]=26;
  1560.  
  1561. Oh, and BTW, I messed up on MERLIN1 (again...<GRIN>)...replace the line  that
  1562. said...
  1563.  
  1564. +   if ((subboards[cursub].type) && (syscfg.systemnumber) &&
  1565. !(strcmp(aux,"EMAIL"))) {
  1566.  
  1567. with this
  1568.  
  1569. +   if ((subboards[cursub].type) && (syscfg.systemnumber) &&
  1570. (strcmp(aux,"EMAIL")!=0)) {
  1571.  
  1572.  
  1573. Thanks all!
  1574. |\/|erlin!         4@6862
  1575.  
  1576. (Someday, I'll be able to post mod's w/out having to correct them 3 or 4
  1577. times...<GRIN>)
  1578.  
  1579. ────────────────────────────────────────────────────────────────────────────
  1580.  
  1581. Tarl Cabot #46 @8352
  1582. Sun May 27 20:14:36 1990
  1583.  
  1584. Hi there everyone.  This is somewhat of a surprise for me, but none the less
  1585. here I am...a surprise in that I am NOT a TC programmer - yet - but have
  1586. picked up a tad here and a bit there...
  1587. This isn't a modification on its own, but rather a correction to a previously
  1588. release modification release by Parker Prospect.  The mod that needed
  1589. correction for my system was the EX20.MOD file or Message Editor Mod v2.0.
  1590. What follows is basically all Parker Prospect's work with my alterations
  1591. and corrections installed and I am NOT taking credit for this work, only for
  1592. the ability to have found and corrected two bugs in it and making a "nice"
  1593. alteration to save on BBS code space.
  1594.  
  1595.         Tarl Cabot
  1596.         1@8350
  1597.  
  1598. /*** Updated Message Editor Mod v2.0**/
  1599.  
  1600. Parker Prospect #1 @9964
  1601. Mon May 14 22:37:32 1990
  1602. Mod Name        : Message Editor Mod v2.0
  1603. Mod Filename    : EX20.MOD
  1604. Mod Author      : Parker Prospect #1 @9964
  1605. Mod Description : Since this mod had been thoroughly requested, either
  1606. out of a need to have nice editing features for WWIV, that it obviously
  1607. lacks, or a wave of nostalgia hit some of the old WWIV v3.21d sysops
  1608. (yes I was one of them) and they wanted the old editor back.  Well, Tau
  1609. Ceti made the first version of this mod, and the last version he had
  1610. released worked, but was not bulletproof.  I did so.  Also, I could
  1611. never get the /T: command to work.  I finally did that also.  Enjoy!
  1612.  
  1613. ************** Legend **************
  1614. * %% Delete Line                   *
  1615. * -- Search for Line, DON'T CHANGE *
  1616. * ++ Add Line                      *
  1617. * -+ Modify Line                   *
  1618. * ## Line is part of another mod   *
  1619. ************************************
  1620.  
  1621. ------------------------------------------------------------------------
  1622. Step #1 <MSGBASE.C>: Add the following code (a lot) where specified.
  1623.  
  1624. --        done=1;
  1625. --      savel=1;
  1626. --      if (s[0]=='/') {
  1627. --        if (stricmp(s,"/HELP")==0) {
  1628. --          savel=0;
  1629. --          printmenu(2);
  1630. --        }
  1631. ++        if (stricmp(s,"/EX")==0) {
  1632. ++                    if ((msgnum > 0) && (msgnum <= nummsgs)) {
  1633. ++                      b =
  1634. readfile(&(msgs[msgnum].msg),(subboards[curlsub].filename),&len);
  1635. ++                      write_out_to_msg(b,len);
  1636. ++                    }
  1637. ++                    load_workspace("OUTPUT.MSG", 0);
  1638. ++                    unlink("OUTPUT.MSG");
  1639. ++                  }
  1640. ++                }
  1641. --                if ((msgs[msgnum].ownersys) && (!msgs[msgnum].owneruser))
  1642. --
  1643. grab_user_name(&(msgs[msgnum].msg),subboards[curlsub].filename);
  1644. --                ss=syscfg.sl[thisuser.sl];
  1645. --                if ((lcs()) || (ss.ability & ability_read_post_anony) ||
  1646. (msgs[msgnum].anony==0))
  1647. --                  email(msgs[msgnum].owneruser,msgs[msgnum].ownersys,0,0);
  1648. --                else
  1649. --
  1650. email(msgs[msgnum].owneruser,msgs[msgnum].ownersys,0,msgs[msgnum].anony);
  1651. --                break;
  1652. --              case 'P':
  1653. ##                byline[0]=0;
  1654. --                irt[0]=0;
  1655. --              case 'W':
  1656. --                deleted_flag = 0;
  1657. ++                if (s[0] != 'P')
  1658. ++                  if (okfsed()) {
  1659. ++                    prt(2, "Quote from message? ");
  1660. ++                    if (yn()) {
  1661. ++                      if ((msgnum > 0) && (msgnum <= nummsgs)) {
  1662. ++                        b =
  1663. readfile(&(msgs[msgnum].msg),(subboards[curlsub].filename),&len);
  1664. ++                        write_out_to_msg(b,len);
  1665. ++                      }
  1666. ++                      load_workspace("OUTPUT.MSG", 0);
  1667. ++                      unlink("OUTPUT.MSG");
  1668. ++                    }
  1669. ++                  }
  1670. --                post();
  1671. --                if (deleted_flag && (deleted_flag<=msgnum))
  1672. --                  --msgnum;
  1673. --                break;
  1674.  
  1675. ------------------------------------------------------------------------
  1676. Step #2 <MSGBASE1.C>: Add the following function BEFORE void scan.
  1677.  
  1678. void write_out_to_msg(char *b, long len)
  1679. {
  1680.   char s2[81];
  1681.   int i;
  1682.  
  1683.   sprintf(s2, "OUTPUT.MSG", syscfg.tempdir);
  1684.   i=open(s2,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  1685.   write(i,(void *)b,len);
  1686.   close(i);
  1687.   farfree(b);
  1688. }
  1689.  
  1690.  
  1691. ------------------------------------------------------------------------
  1692. Step #3 <MSGBASE1.C>: Edit the following code in void readmail.
  1693.  
  1694. --            nl();
  1695. --          }
  1696. --          break;
  1697. --        case 'A':
  1698. --        case 'S':
  1699. ##          byline[0]=0;
  1700. --          if (!okmail)
  1701. --            break;
  1702. --          close(f);
  1703. ++          if (okfsed()) {
  1704. ++            prt(2, "Quote from message? ");
  1705. ++            if ((yn()) && (okmail)) {
  1706. ++              b = readfile(&(m.msg),"EMAIL",&len);
  1707. ++              write_out_to_msg(b,len);
  1708. ++              load_workspace("OUTPUT.MSG", 0);
  1709. ++              unlink("OUTPUT.MSG");
  1710. ++            }
  1711. ++          }
  1712. --          num_mail=((long) thisuser.feedbacksent) +
  1713. --                   ((long) thisuser.emailsent) +
  1714. --                   ((long) thisuser.emailnet);
  1715.  
  1716.  
  1717. ------------------------------------------------------------------------
  1718. Final Step
  1719.  
  1720. Compile the BBS and update your menus to reflect the changes you made...
  1721.  
  1722.  
  1723. ------------------------------------------------------------------------
  1724. Disclaimer
  1725.  
  1726. I, Jeff Garzik, claim no liability for this mod, or for any damage that
  1727. may have resulted from the use of this mod.  I also attach no warranty,
  1728. expressed OR implied, to this product.  This type of warranty and
  1729. liability disclaimer is prohibited by law in certain states, and is
  1730. therefore void in those states.
  1731.  
  1732. ────────────────────────────────────────────────────────────────────────────
  1733.  
  1734. Joe Barry #1 @6905
  1735. Sunday, May 27, 1990 11:41 am
  1736.  
  1737.                         ╓────────────────────────────╖
  1738.                         ║        FSEDTAG.MOD         ║
  1739.                         ║       for WWIV 4.10        ║
  1740.                         ║           v.1.0            ║
  1741.                         ╙────────────────────────────╜
  1742.  
  1743.  
  1744. This mod is based on Doug Fields tag mod for WWIV 4.07 BUT this version
  1745. redone & running on my system WILL work with all FSED & ofcourse the WWIV
  1746. builtin editor. IF you have Doug's original mod in your code you will have to
  1747. 1st remove it since this version goes in a different area & also has been
  1748. changed too. For those that aren't fimilar with this mod, this is what
  1749. it does. You can have a different TAG for EACH netted sub you have on
  1750. your system. You will need to keep a number of files in your DATA directory,
  1751. each bearing the name TAGxxxxx.MSG,where the xxxxx is the subtype of the
  1752. linked sub. If the file does not exist, then it will try to print a file
  1753. TAG-GEN.MSG for a general tag. If this in turn does not exist, then it does not
  1754. try to add a tag. So, for example, I could put a TAG6902.MSG and & it would
  1755. append that tag to a post in that subtype, IF I didn't have a subtype tag for
  1756. that sub, it would then default to TAG-GEN.MSG and when someone posts a message
  1757. it would append that tag instead. Also IF a sub doesn't allow tags, then all
  1758. you have to do is make up that tag subtype with a 1 byte 'blank' & that will
  1759. help you to solve that problem. The files can be of unlimited length, but only
  1760. the number of lines up to that user's maximum number of lines will be appended.
  1761.  
  1762.  
  1763. OK so here we go, load up MSGBASE.C and then search for void inmsg
  1764.  
  1765.                                                         KEY
  1766.                                                  == Original Line
  1767.                                                  ++ New line
  1768.                                                  =+ modified line
  1769.  
  1770. void inmsg(messagerec *m1, char *title, int *anony, int needtitle, char *aux,
  1771. int fsed)
  1772. {
  1773. ==  char s[LEN],s1[LEN],ro[81],fnx[81],chx,*ss,*ss1;
  1774. ==  int maxli,curli,done,save,savel,i,i1,i2,i3,i4,i5,setanon;
  1775. ==  messagerec m;
  1776. ==  long ll,l1;
  1777. ==  char *lin, *b;
  1778. ++  char s8[181];
  1779. ++  FILE *nettagfile;
  1780.  
  1781. A little further down in the code also in void inmsg look for this section of
  1782. code & add the stuff with the ++ next to those lines.
  1783.  
  1784. ==    if (fsed) {
  1785. ==      ll=filelength(i5);
  1786. ==      read(i5, (void *) (& (b[l1]) ),ll);
  1787. ==      l1 += ll;
  1788. ==      close(i5);
  1789. ==    } else {
  1790. ==      for (i5=0; i5<curli; i5++)
  1791. ==      addline(b,&(lin[i5*LEN]),&l1);
  1792. ==    }
  1793. ++    if ((subboards[curlsub].type) && (syscfg.systemnumber))  /*SEE NOTE*/
  1794. ++     {
  1795. ++      addline(b,"",&l1);
  1796. ++      sprintf(s8, "%sTAG%u.MSG", syscfg.datadir,subboards[cursub].type );
  1797. ++      if ((nettagfile = fopen(s8, "rt")) == NULL)
  1798. ++        {
  1799. ++        sprintf(s8, "%sTAG-GEN.MSG", syscfg.datadir);
  1800. ++        nettagfile = fopen(s8, "rt");
  1801. ++        }
  1802. ++      if (nettagfile != NULL)
  1803. ++        {
  1804. ++          fgets(s8, 180, nettagfile);
  1805. ++          addline(b,s8,&l1);
  1806. ++            fclose(nettagfile);
  1807. ++         }
  1808. ==    }
  1809. ==    if (b[l1-1]!=26)  /*code continues*/
  1810. ==      b[l1++]=26;
  1811.     savefile(b,l1,&m,aux);
  1812.     if (fsed)
  1813.       unlink(fnx);
  1814.   } else {
  1815.     if (fsed)
  1816.       unlink(fnx);
  1817.  
  1818. *******************************************************************************
  1819. NOTE:
  1820.  IF you DON'T won't the tag to be placed in e-mail then use this line for the
  1821. above area line that I marked SEE NOTE & it won't add the tag to e-mail.
  1822.  
  1823.  if ((subboards[curlsub].type) && (aux!="EMAIL"))  /*NO E-MAIL TAG*/
  1824.  
  1825.  
  1826. Hit F-9 & it will recompile msgbase.c & your all done, any questions OR
  1827. problems E-MAIL me at 1@6905. I have been useing this for a month now & it
  1828. works perfectly.
  1829.  
  1830. ────────────────────────────────────────────────────────────────────────────
  1831.  
  1832. Tarl Cabot #46 @8352
  1833. Tue May 29 03:26:39 1990
  1834.  
  1835. Hello there again...so soon after I added that modification by Parker Prospect
  1836. into my own system, I figured out how to correct the color addition into the
  1837. /T: option and here I am again.  This is an update to EX201.MOD that has been
  1838. posted here in this message base.  The modification file when released will
  1839. contain this update in it already, but for those that have been looking over
  1840. the code in this base, this is for you.  Basically, what I did was trial and
  1841. error until I figured out how to get the loop and checking done to check for
  1842. that little heart symbol and remove two characters from the string length
  1843. calculation, otherwise the box would have the top and bottom too long for the
  1844. actual string.  The small modified line in the code is so that any color added
  1845. into the text will not spoil the color-less box on the right side.  Even if you
  1846. do not want to have the /EX mod installed, but want to add the boxed text mod,
  1847. this will do it for you nicely.  Simply search out the area in the INMSG
  1848. function in the MESSAGE.C file and add this set of code around the area of the
  1849. /LI section.  This code works for me, and it should work for you too.  Enjoy.
  1850.  
  1851.     David "Tarl Cabot" Stidham
  1852.              1@8350
  1853.  
  1854. @@@@@    Legend   @@@@@
  1855. @@  -- Existing Line @@
  1856. @@  -+ Modified Line @@
  1857. @@  ++ Added Line    @@
  1858. @@@@@@@@@@@@@@@@@@@@@@@
  1859.  
  1860. /* Update to EX201.MOD */
  1861.  
  1862. --      if (stricmp(s1,"/T:")==0) {
  1863. --        savel=0;
  1864. --        i3=strlen(s)-3;
  1865. ++        for (i4=0; i4<strlen(s); i4++)
  1866. ++          if (s[i4]==3)
  1867. ++            i3-=2;
  1868. --        if ((i3 > 0) && (i3 < 71) && (curli < (maxli-3))) {
  1869. --          s1[0]=2;
  1870. --          s1[1]='+';
  1871. --          memset(&s1[2], '-', (i3+2));
  1872. --          s1[i3+4]=0;
  1873. --          strcat(s1,"+");
  1874. --          strcpy(&(lin[(curli++)*LEN]),s1);
  1875. --          s2[0]=2;
  1876. --          s2[1]=0;
  1877. --          strcat(s2,"| ");
  1878. --          strcat((&s2[3]),&(s[3]));
  1879. -+          strcat(s2,"<alt3+0> |");
  1880. /* the above <alt3+0> should be replaced with the actual keystrokes */
  1881. --          strcpy(&(lin[(curli++)*LEN]),s2);
  1882. --          strcpy(&(lin[(curli++)*LEN]),s1);
  1883. --        } else
  1884. --           pl("*Length of boxed string must be between 1 and 70
  1885. characters*");
  1886. --      }
  1887.  
  1888. ────────────────────────────────────────────────────────────────────────────
  1889.  
  1890. Tolkien #1 @3456
  1891. Wed May 30 01:04:10 1990
  1892.  
  1893. /*
  1894. Whoops, sorry 'bout the first version of this I posted. I totally forgot
  1895. to check on what colors are assigned if the the user number is the same as
  1896. whoever is logged on but from another system. Caused erratic behavior. This
  1897. fixes it.
  1898.  
  1899. This small modification will add color to your list of titles when you hit
  1900. "T" from the read prompt, in an informative way; if the caller posted the
  1901. message from your own board it will be one color, if from another board then
  1902. it will be in another color. And it's still a square bracket if YOU posted it
  1903. yourself and parenthesis if someone else did.
  1904.  
  1905. This serves a decent purpose -- you can quickly see which posts on any net
  1906. sub came from YOUR board and see if you are going to be embarassed or already
  1907. have been.
  1908.  
  1909. The idea behind it came from Sandman 1@3462 and he deserves all the credit as
  1910. the actual writing of the mod was quite simple.
  1911.  
  1912. As always take the proper precautions, back up your source, use a condom, etc.
  1913. We won't be responsible if your computer starts giving off radiation that
  1914. attracts UFO's or anything, but none have come for us yet.
  1915.  
  1916. So. Here it is:
  1917.  
  1918. Look for void scan() in msgbase1.c and find this hunk of code. Replace with
  1919. the following and it will show those who posted from your BBS in a different
  1920. color than those who didn't, and square brackets as usual if it is you who
  1921. posted it.
  1922.  
  1923. Replace all occurrences of "^P^C" with the heart character, which you can get
  1924. with control-p control-c from the TC Integrated Environment.
  1925. */
  1926.  
  1927. /***************************************************************************/
  1928.  
  1929.      case 1: /* List Titles */
  1930.        i=0;
  1931.        abort=0;
  1932.        if (msgnum>=nummsgs)
  1933.          abort=1;
  1934.        nl();
  1935.        while ((!abort) && (!hangup) && (++i<=10)) {
  1936.          ++msgnum;
  1937.                         itoa(msgnum,s,10);
  1938.                         if ((msgs[msgnum].ownersys!=0) && 
  1939. (msgs[msgnum].owneruser==usernum))
  1940.               sprintf(s1,"^P^C1(^P^C0%s^P^C1)",s);
  1941.          if ((msgs[msgnum].ownersys==0) && (msgs[msgnum].owneruser==usernum))
  1942.               sprintf(s1,"^P^C7[^P^C0%s^P^C7]",s);
  1943.                         if ((msgs[msgnum].ownersys==0) && 
  1944. (msgs[msgnum].owneruser!=usernum))
  1945.               sprintf(s1,"^P^C7(^P^C0%s^P^C7)",s);
  1946.                         if ((msgs[msgnum].ownersys!=0) && 
  1947. (msgs[msgnum].owneruser!=usernum))
  1948.               sprintf(s1,"^P^C1(^P^C0%s^P^C1)",s);
  1949.                         for (i1=0; i1<16; i1++)
  1950.            s[i1]=32;
  1951.          if (msgs[msgnum].qscan>thisuser.qscnptr[curlsub])
  1952.            s[0]='*';
  1953.                         strcpy(&s[12-strlen(s1)],s1);
  1954.          strcat(s," ^P^C2");
  1955.          strcat(s,msgs[msgnum].title);
  1956.          pla(s,&abort);
  1957.          if (msgnum>=nummsgs)
  1958.            abort=1;
  1959.        }
  1960.                  optype=0;
  1961.        ■   Normal code from here on down.
  1962.        ■
  1963.        ■
  1964.  
  1965. /***************************************************************************
  1966.       Concept:  Sandman 1@3462           Code Changes: Tolkien 1@3456
  1967. */
  1968.  
  1969. ────────────────────────────────────────────────────────────────────────────
  1970.  
  1971. Ed O'Brien #1 @7701
  1972. Thu May 31 19:11:35 1990
  1973.                           ** AUTOSIGN.MOD **
  1974.  
  1975.  
  1976. DISCLAIMER - I offer this mod with NO guarantees.  Use it at your own risk.
  1977. It works fine on my heavily modded WWIV4.11 with NO problems.  It will work
  1978. on WWIV4.10 but other than that I won't say.  If it damages your computer,
  1979. WWIV software or anything else I will NOT be held responsible.
  1980.  
  1981. By using this mod you agree to do so at your own risk.
  1982. ===========================================================================
  1983.  
  1984. Welcome to my first GREAT, publicly released MOD for WWIV4.1+.  I cannot
  1985. claim full credit for this mod as it is a combination of MODS done by others
  1986. and edited by me to work as I prefer on my system.  It is a combination of
  1987. the message status mod and the auto signature mod.  I liked the idea of
  1988. having the ability for my users as well as myself to be able to tag E-Mail
  1989. with the Message Status -> Reply requested or No reply necessary message and
  1990. also like the ability to have the tag line added to the bottom of my systems
  1991. posts.  Unfortunately, as written the message status mod only worked with the
  1992. built in WWIV line editor but NOT with FSED.  I use FSED exclusively as do
  1993. MOST of my users so I made the necessary changes.
  1994.  
  1995. My version of these two fine mods auto signs any E-Mail with the users name
  1996. and node number and gives the user the ability to ask for a response to their
  1997. mail when necessary.  This mod unlike some of the others does NOT allow for
  1998. the [Message Status] line in a NET post but restricts it to E-Mail ONLY.  In
  1999. addition this mod adds the users name and node number, the name of the NET
  2000. sub as well as a customized TAG line for your BBS.
  2001. ============================================================================
  2002.  
  2003. All changes are in MSGBASE.C  void inmsg(blah blah blah)
  2004.  
  2005.         Legend
  2006.         ~~~~~~
  2007.         !=existing line
  2008.         +=add line
  2009.  
  2010.  
  2011. !    } else {
  2012. !      for (i5=0; i5<curli; i5++)
  2013. !      addline(b,&(lin[i5*LEN]),&l1);         /* search for */
  2014. !    }
  2015.  
  2016. +      addline(b," ",&l1);                    /* Begin Mod */
  2017. +      strcpy(s,"[Message Author] ");
  2018. +      strcat(s,nam1(&thisuser,usernum,syscfg.systemnumber));
  2019. +      addline(b,s,&l1);
  2020. +      if ((subboards[curlsub].type) && (syscfg.systemnumber) &&
  2021. +         (aux!="EMAIL")) {
  2022. +      strcpy(s,"[Net Sub Origin] ");
  2023. +      strcat(s,subboards[curlsub].name);
  2024. +      addline(b,s,&l1);
  2025. +      addline(b,"[System] << Your custom TAG line goes here >>",&l1);
  2026. +    } else {
  2027. +      if (aux=="EMAIL") {
  2028. +      outstr("Do you want a response to this message? [y/N] : ");
  2029. +      if (yn()) {
  2030. +      addline(b,"[Message Status] Please respond to this message.
  2031. +        Thanks!",&l1);
  2032. +    } else {
  2033. +      addline(b,"[Message Status] No response necessary.",&l1);
  2034. +       }
  2035. +      }
  2036. +    }                                        /* End mod */
  2037.  
  2038. !    if (b[l1-1]!=26)
  2039. !      b[l1++]=26;
  2040. !    savefile(b,l1,&m,aux);
  2041. !    if (fsed)
  2042. !      unlink(fnx);
  2043. !  } else {
  2044.  
  2045. =============================================================================
  2046.  
  2047. I hope you can use and enjoy this mod.
  2048.  
  2049. ────────────────────────────────────────────────────────────────────────────
  2050.  
  2051. Parker Prospect #1 @9964
  2052. Thu May 31 22:11:13 1990
  2053.  
  2054. Mod Name        : Basic Message Quoting w/ FSEDs v1.2
  2055. Mod Filename    : QUOTE1_2.MOD
  2056. Mod Author      : Parker Prospect #1 @9964
  2057. Mod Description : I live in a small town, with relatively few BBSes (total
  2058. number = 5). Four of those are IBM BBSes, and one is SearchLight.  I am
  2059. quite taken with SearchLight, and love its editor to death.  One of the
  2060. features in this editor is the ability to "Get reply text".  What this does
  2061. is you press two keys (^KG) and the message you are replying to appears in
  2062. the editor, with quote characters '>' on the beginning of each line.  I
  2063. decided I wanted to do this, but it wouldn't be of real use unless you
  2064. could delete the unwanted lines.  Hence, the full-screen editor restriction
  2065. on quoting messages here (you need one in order to be able to edit it).
  2066. This works both locally and remotely, as long as the user supports a full
  2067. screen editor.
  2068.  
  2069. ************** Legend **************
  2070. * %% Delete Line                   *
  2071. * -- Search for Line, DON'T CHANGE *
  2072. * ++ Add Line                      *
  2073. * -+ Modify Line                   *
  2074. * ## Line is part of another mod   *
  2075. ************************************
  2076.  
  2077. ------------------------------------------------------------------------
  2078. Step #1 <MSGBASE1.C>: In void scan, edit the code below as shown.
  2079.  
  2080. ++              case 'A':
  2081. ##                byline[0]=0;
  2082. ++                if (okfsed()) {
  2083. ++                  prt(2, "Quote from message? ");
  2084. ++                  if (yn()) {
  2085. ++                    if ((msgnum > 0) && (msgnum <= nummsgs)) {
  2086. ++                      b =
  2087. readfile(&(msgs[msgnum].msg),(subboards[curlsub].filename),&len);
  2088. ++                      write_out_to_msg(b,len);
  2089. ++                    }
  2090. ++                    load_workspace("OUTPUT.MSG", 0);
  2091. ++                    unlink("OUTPUT.MSG");
  2092. ++                  }
  2093. ++                }
  2094. --                if ((msgs[msgnum].ownersys) && (!msgs[msgnum].owneruser))
  2095. --
  2096. grab_user_name(&(msgs[msgnum].msg),subboards[curlsub].filename);
  2097. --                ss=syscfg.sl[thisuser.sl];
  2098. --                if ((lcs()) || (ss.ability & ability_read_post_anony) ||
  2099. (msgs[msgnum].anony==0))
  2100. --                  email(msgs[msgnum].owneruser,msgs[msgnum].ownersys,0,0);
  2101. --                else
  2102. --
  2103. email(msgs[msgnum].owneruser,msgs[msgnum].ownersys,0,msgs[msgnum].anony);
  2104. --                break;
  2105. --              case 'P':
  2106. ##                byline[0]=0;
  2107. --                irt[0]=0;
  2108. --              case 'W':
  2109. --                deleted_flag = 0;
  2110. ++                if (s[0] != 'P')
  2111. ++                  if (okfsed()) {
  2112. ++                    prt(2, "Quote from message? ");
  2113. ++                    if (yn()) {
  2114. ++                      if ((msgnum > 0) && (msgnum <= nummsgs)) {
  2115. ++                        b =
  2116. readfile(&(msgs[msgnum].msg),(subboards[curlsub].filename),&len);
  2117. ++                        write_out_to_msg(b,len);
  2118. ++                      }
  2119. ++                      load_workspace("OUTPUT.MSG", 0);
  2120. ++                      unlink("OUTPUT.MSG");
  2121. ++                    }
  2122. ++                  }
  2123. --                post();
  2124. --                if (deleted_flag && (deleted_flag<=msgnum))
  2125. --                  --msgnum;
  2126. --                break;
  2127.  
  2128. ------------------------------------------------------------------------
  2129. Step #2 <MSGBASE1.C>: Add the following function BEFORE void scan.
  2130.  
  2131. void write_out_to_msg(char *b, long len)
  2132. {
  2133.   char s2[81];
  2134.   int i;
  2135.  
  2136.   sprintf(s2, "OUTPUT.MSG", syscfg.tempdir);
  2137.   i=open(s2,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  2138.   write(i,(void *)b,len);
  2139.   close(i);
  2140.   farfree(b);
  2141. }
  2142.  
  2143.  
  2144. ------------------------------------------------------------------------
  2145. Step #3 <MSGBASE1.C>: Edit the following code in void readmail.
  2146.  
  2147. --            nl();
  2148. --          }
  2149. --          break;
  2150. --        case 'A':
  2151. --        case 'S':
  2152. ##          byline[0]=0;
  2153. --          if (!okmail)
  2154. --            break;
  2155. --          close(f);
  2156. ++          if (okfsed()) {
  2157. ++            prt(2, "Quote from message? ");
  2158. ++            if ((yn()) && (okmail)) {
  2159. ++              b = readfile(&(m.msg),"EMAIL",&len);
  2160. ++              write_out_to_msg(b,len);
  2161. ++              load_workspace("OUTPUT.MSG", 0);
  2162. ++              unlink("OUTPUT.MSG");
  2163. ++            }
  2164. ++          }
  2165. --          num_mail=((long) thisuser.feedbacksent) +
  2166. --                   ((long) thisuser.emailsent) +
  2167. --                   ((long) thisuser.emailnet);
  2168.  
  2169.  
  2170. ------------------------------------------------------------------------
  2171. Final Step
  2172.  
  2173. Compile the BBS and update your menus to reflect the changes you made...
  2174.  
  2175.  
  2176. ------------------------------------------------------------------------
  2177. Disclaimer
  2178.  
  2179. I, Jeff Garzik, claim no liability for this mod, or for any damage that
  2180. may have resulted from the use of this mod.  I also attach no warranty,
  2181. expressed OR implied, to this product.  This type of warranty and
  2182. liability disclaimer is prohibited by law in certain states, and is
  2183. therefore void in those states.
  2184.  
  2185. If you like this mod, you can call my board at:
  2186.  
  2187.   The East Carolina Connection
  2188.   919-756-2939 :::: 2400 baud MNP level 4
  2189.   24hrs a day -- 7 days a week
  2190.   Autovalidation of WWIV sysops (first call)
  2191.   
  2192. ────────────────────────────────────────────────────────────────────────────
  2193.   
  2194. Scott Lockwood #1 @15906
  2195. Sun Jun 03 20:09:05 1990
  2196. /*===========================================================================*/
  2197.                         AUTOSAVE WITH HANGUP MESSAGE
  2198.                            by Midnight Tree Bandit
  2199.  
  2200. [Ed.'s note: of course, this originally appeared in VARIOUS1 with a former 
  2201. handle.  I took the liberty of changing it to my current handle.  -=>mtb]
  2202.  
  2203. Doug said he thought he'd taken care of this, but I haven't seen an autosave 
  2204. feature that saved messages at (hangup) anywhere, so here it is.  I find this 
  2205. handy for those with call waiting or bosses who look in, who find them selves 
  2206. hanging up on the 28th line of a 30-line magnum opus.  Happened to me plenty 
  2207. when I was living in my old apartment, with five roommates and call waiting.  
  2208. This mod will not only automatically save the message (very simple), but leave 
  2209. a line at the end of the message that informs the readers that the writer hung 
  2210. up (in case they get confused by an abrupt ending).
  2211.  
  2212. 1. Load (or keep) MSGBASE.C.
  2213.  
  2214. 2. Search in 'void inmsg(..)' for:
  2215.  
  2216.       if (hangup)
  2217.         save=1;
  2218.  
  2219.  
  2220. 3. Replace it with:
  2221.  
  2222.       if (hangup) {
  2223.         save=1;
  2224.         done=1;
  2225.       }
  2226.  
  2227. And that takes care of the autosave (said it was simple).  To add in the extra 
  2228. line:
  2229.  
  2230. 4. Search for:
  2231.  
  2232.       if (savel) {
  2233.         strcpy(&(lin[(curli++)*LEN]),s);
  2234.         if (curli==maxli) {
  2235.           nl();
  2236.           pl("-= No more lines =-");
  2237.           pl("/ES to save");
  2238.           nl();
  2239.           --curli;
  2240.         }
  2241.       }
  2242.     }
  2243.     if (curli==0) {
  2244.  
  2245. [Note: If you added my two-line-warning, then that will also appear in this 
  2246. block of code.]
  2247.  
  2248.  
  2249. 5. And replace it with (= is same line, + is add line, * is amend line):
  2250.  
  2251. =    if (savel) {
  2252. =       strcpy(&(lin[(curli++)*LEN]),s);
  2253. =       if (curli==maxli) {
  2254. =         nl();
  2255. =         pl("-= No more lines =-");
  2256. =         pl("/ES to save");
  2257. =         nl();
  2258. =         --curli;
  2259. +       } else {
  2260. +         if (hangup) {
  2261. +           curli+=2;
  2262. +           strcpy(&(lin[(curli++) *LEN]),"[*> *clik*  They Hung up!  Thppt! <*]");
  2263. +         }
  2264. =       }
  2265. =     }
  2266. =   }
  2267. =   if (curli==0) {
  2268.  
  2269. NOTES:
  2270. Again, if you have the two-line-warning in your program, it will also appear 
  2271. here.  
  2272. Also again, this will not appear in FSED.  If you figure out how...
  2273. Make sure you have all four closing brackets at the end.  When I forgot them, 
  2274. I got a "Misplaced else" error, and kept getting it because I though it was on 
  2275. the brackets in the next set (which is the tag line mod).  It was because I 
  2276. only had three brackets.
  2277. There was, as I said, an odd effect on E-mail.  When I tested these, the 
  2278. e-mail behaved as it should when I entered a regulr message to 1@8400 from 
  2279. here.  But then I tested the hangup in e-mail, and the "They Hung up!" message 
  2280. appeared as it should, but the tag line ALSO appeared.  Hmm...  If anyone 
  2281. knows how the code could fix this, let me know.
  2282.  
  2283. /*===========================================================================*/
  2284.