home *** CD-ROM | disk | FTP | other *** search
- /* $Header: E:\SRC\UUPC\RN\RCS/KFILE.C 1.1 1992/11/21 06:14:58 ahd Exp $
- *
- * $Log: KFILE.C $
- * Revision 1.1 1992/11/21 06:14:58 ahd
- * Initial
- *
- *
- * Rev 1.0 18 Nov 1990 0:22:16
- * Initial revision.
- * Revision 1.2 90/03/22 23:04:41 sob
- * Fixes provided by Wayne Davison <drivax!davison>
- *
- * Revision 4.3.1.3 85/05/29 09:11:52 lwall
- * Suppressed some killing messages on -t.
- *
- * Revision 4.3.1.2 85/05/10 14:21:29 lwall
- * Prevented THRU from setting art < absfirst.
- *
- * Revision 4.3.1.1 85/05/10 11:34:33 lwall
- * Branch for patches.
- *
- * Revision 4.3 85/05/01 11:41:53 lwall
- * Baseline for release with 4.3bsd.
- *
- */
-
- #include "EXTERN.h"
- #include "common.h"
- #include "term.h"
- #include "util.h"
- #include "artsrch.h"
- #include "ng.h"
- #include "bits.h"
- #include "intrp.h"
- #include "ngstuff.h"
- #include "rcstuff.h"
- #include "rn.h"
- #include "INTERN.h"
- #include "kfile.h"
-
- static bool exitcmds = FALSE;
-
- void
- kfile_init()
- {
- ;
- }
-
- #ifndef KILLFILES
- int
- edit_kfile()
- {
- notincl("^K");
- return -1;
- }
-
- #else /* KILLFILES */
-
- char killglobal[] = KILLGLOBAL;
- char killlocal[] = KILLLOCAL;
-
- void
- mention(str)
- char *str;
- {
-
- #ifdef VERBOSE
- IF(verbose)
- {
-
- #ifdef NOFIREWORKS
- no_sofire();
- #endif
-
- standout();
- fputs(str, stdout);
- un_standout();
- putchar('\n');
- }
- ELSE
- #endif
-
- #ifdef TERSE
- putchar('.');
- #endif
-
- fflush(stdout);
- }
-
- bool kill_mentioned;
-
- int
- do_kfile(kfp, entering)
- FILE *kfp;
- int entering;
- {
- art = lastart + 1;
- fseek(kfp, 0L, 0); /* rewind file */
- while (fgets(buf, LBUFLEN, kfp) != Nullch)
- {
- buf[strlen(buf) - 1] = '\0';
- if (strnEQ(buf, "THRU", 4))
- {
- ART_NUM tmpart;
-
- tmpart = atol(buf + 4) + 1;
- if (tmpart < absfirst)
- tmpart = absfirst;
- check_first(tmpart);
- firstart = tmpart;
- continue;
- }
- if (*buf == 'X')
- { /* exit command? */
- if (entering)
- {
- exitcmds = TRUE;
- continue;
- }
- strcpy(buf, buf + 1);
- }
- else
- {
- if (!entering)
- continue;
- }
- if (*buf == '&')
- {
- mention(buf);
- switcheroo();
- }
- else if (*buf == '/' && firstart <= lastart)
- {
- mention(buf);
- kill_mentioned = TRUE;
- switch (art_search(buf, (sizeof buf), FALSE))
- {
- case SRCH_ABORT:
- continue;
- case SRCH_INTR:
-
- #ifdef VERBOSE
- IF(verbose)
- printf("\n(Interrupted at article %ld)\n", (long) art)
- FLUSH;
- ELSE
- #endif
-
- #ifdef TERSE
- printf("\n(Intr at %ld)\n", (long) art) FLUSH;
- #endif
-
- return -1;
- case SRCH_DONE:
- break;
- case SRCH_SUBJDONE:
- fputs("\tsubject not found (???)\n", stdout) FLUSH;
- break;
- case SRCH_NOTFOUND:
- fputs("\tnot found\n", stdout) FLUSH;
- break;
- case SRCH_FOUND:
- fputs("\tfound\n", stdout) FLUSH;
- }
- }
- }
- return 0;
- }
-
- void
- kill_unwanted(starting, message, entering)
- ART_NUM starting;
- char *message;
- int entering;
- {
- bool intr = FALSE; /* did we get an
- * interrupt? */
- ART_NUM oldfirst;
- bool anytokill = (toread[ng] > 0);
-
- if (localkfp || globkfp)
- {
- if (!entering && !exitcmds)
- return;
- exitcmds = FALSE;
- oldfirst = firstart;
- firstart = starting;
- clear();
-
- #ifdef VERBOSE
-
- #ifdef TERSE
- if (message && (verbose || entering))
- #else
- if (message)
- #endif
-
- #else
- if (message && entering)
- #endif
-
- fputs(message, stdout) FLUSH;
-
- kill_mentioned = FALSE;
- if (localkfp)
- intr = do_kfile(localkfp, entering);
- if (globkfp && !intr)
- intr = do_kfile(globkfp, entering);
- if (entering && localkfp && !intr)
- setthru(lastart);
- putchar('\n') FLUSH;
- if (entering && kill_mentioned)
-
- #ifdef VERBOSE
- IF(verbose)
- get_anything();
- ELSE
- #endif
-
- #ifdef TERSE
- pad(just_a_sec / 3);
- #endif
-
- if (anytokill) /* if there was anything
- * to kill */
- forcelast = FALSE; /* allow for having
- * killed it all */
- firstart = oldfirst;
- }
- }
-
- void
- setthru(thru)
- ART_NUM thru;
- {
- FILE *newkfp;
-
- fseek(localkfp, 0L, 0); /* rewind current file */
- strcpy(buf, filexp(getval("KILLLOCAL", killlocal)));
- UNLINK(buf); /* to prevent file reuse */
- if (newkfp = fopen(buf, "w"))
- {
- fprintf(newkfp, "THRU %ld\n", (long) thru);
- while (fgets(buf, LBUFLEN, localkfp) != Nullch)
- {
- if (strnEQ(buf, "THRU", 4))
- continue;
- fputs(buf, newkfp);
- }
- fclose(newkfp);
- open_kfile(KF_LOCAL); /* and reopen local file */
- }
- else
- printf(cantcreate, buf) FLUSH;
- }
-
- /* edit KILL file for newsgroup */
-
- int
- edit_kfile()
- {
- int r = -1;
-
- if (in_ng)
- strcpy(buf, filexp(getval("KILLLOCAL", killlocal)));
- else
- strcpy(buf, filexp(getval("KILLGLOBAL", killglobal)));
- if ((r = makedir(buf, MD_FILE)) >= 0)
- {
- sprintf(cmd_buf, "%s %s",
- filexp(getval("VISUAL", getval("EDITOR", defeditor))), buf);
- printf("\nEditing %s KILL file:\n%s\n",
- (in_ng ? "local" : "global"), cmd_buf) FLUSH;
- resetty(); /* make sure tty is
- * friendly */
- r = doshell(sh, cmd_buf); /* invoke the shell */
- noecho(); /* and make terminal */
- crmode(); /* unfriendly again */
- open_kfile(in_ng);
- }
- else
- printf("Can't make %s\n", buf) FLUSH;
- return r;
- }
-
- void
- open_kfile(local)
- int local;
- {
- char *kname = filexp(local ?
- getval("KILLLOCAL", killlocal) :
- getval("KILLGLOBAL", killglobal)
- );
-
- stat(kname, &filestat);
- if (!filestat.st_size) /* nothing in the file? */
- UNLINK(kname); /* delete the file */
- if (local)
- {
- if (localkfp)
- fclose(localkfp);
- localkfp = fopen(kname, "r");
- }
- else
- {
- if (globkfp)
- fclose(globkfp);
- globkfp = fopen(kname, "r");
- }
- }
-
- void
- kf_append(cmd)
- char *cmd;
- {
- strcpy(cmd_buf, filexp(getval("KILLLOCAL", killlocal)));
- if (makedir(cmd_buf, MD_FILE) >= 0)
- {
-
- #ifdef VERBOSE
- IF(verbose)
- printf("\nDepositing command in %s...", cmd_buf);
- ELSE
- #endif
-
- #ifdef TERSE
- printf("\n--> %s...", cmd_buf);
- #endif
-
- fflush(stdout);
- if ((tmpfp = fopen(cmd_buf, "a")) != Nullfp)
- {
- fseek(tmpfp, 0L, 2);/* get to EOF for sure */
- fprintf(tmpfp, "%s\n", cmd);
- fclose(tmpfp);
- fputs("done\n", stdout) FLUSH;
- }
- else
- printf(cantopen, cmd_buf) FLUSH;
- }
- }
-
- #endif /* KILLFILES */
-