[mod.sources] Newsweed: a program to delete unwanted news articles

sources-request@genrad.UUCP (11/12/84)

From: turtlevax!ken (Ken Turkowski)

# This is a shell archive.  Remove anything before this line, then
# unpack it by saving it in a file and typing "sh file".  (Files
# unpacked will be owned by you and have default permissions.)
#
# This archive contains:
# newsweed newsweed.1

echo x - newsweed
cat > "newsweed" << '//E*O*F newsweed//'
#! /bin/sh
TEMP=/tmp/weed$$
: ${NEWSRC=$HOME/.newsrc}
trap 'rm ${TEMP}?; exit' 0 2
echo Making list of article titles
readnews -l $* | sort -o ${TEMP}a
if test -s ${TEMP}a
then
    cp ${TEMP}a ${TEMP}b
    echo Please remove article titles which you do not wish to read
    sleep 1
    # Delete the next line if you don't have reset
    reset	# So that vi's CRLF doesn't get trashed by another vi
    ${EDITOR-vi} ${TEMP}b
    if cmp -s ${TEMP}a ${TEMP}b
    then
	echo No articles deleted.
    else
	comm -23 ${TEMP}a ${TEMP}b | sed 's/ .*//' > ${TEMP}c
	echo Removing unwanted articles
	cp $NEWSRC $NEWSRC.old
	awk 'BEGIN	{
	groupcount = 1
    }

/^options/	{
	options = $0
    }

/^[^/]*:/	{			# .newsrc input -- subscribed group
	j = index($0, ":")
	group = substr($0, 1, j-1)
	i = groupindex[group] = groupcount++
	newsgroup[i] = group
	grouptype[i] = ":"
	newsread[i] = substr($0, j+2)	# list of articles read
    }

/^[^/]*!/	{			# .newsrc input -- unsubscribed group
	j = index($0, "!")
	group = substr($0, 1, j-1)
	i = groupindex[group] = groupcount++
	newsgroup[i] = group
	grouptype[i] = "!"
	newsread[i] = substr($0, j+2)	# list of articles read
    }

/^[^ /]+\/[0-9]+/	{		# readnews -l output
	j = index($0, "/")
	group = substr($0, 1, j-1)
	i = groupindex[group]
	if (!i) {		# not previously encountered
	    i = groupindex[group] = groupcount++
	    newsgroup[i] = group
	    grouptype[i] = ":"
	}
	k = index($0, " ")
	if (k == 0)
	    article = substr($0, j+1)
	else
	    article = substr($0, j+1, k-j-1)
	if (newsread[i])
	    newsread[i] = newsread[i] "," article
	else
	    newsread[i] = article
    }

END	{
	if (options != 0)
	    print options
	for (i = 1; i < groupcount; i++) {
	    n = split(newsread[i], artlist, ",")
	    for (j = 1; j <= n; j++) {
		if (split(artlist[j], range, "-") == 1) {
		    rangelist[j] = artlist[j]
		}
		else {
		    artlist[j] = range[1]
		    rangelist[j] = range[2]
		}
	    }
	    # sort articles
	    sorted = 0
	    start = 1
	    while (sorted == 0) {
		sorted = 1
		for (j = start; j < n; j++) {
		    if (j == start && !artlist[start]) {
			start++
			continue
		    }
		    if (artlist[j+1] < artlist[j]) {	# swap
			temp = artlist[j+1]
			artlist[j+1] = artlist[j]
			artlist[j] = temp
			temp = rangelist[j+1]
			rangelist[j+1] = rangelist[j]
			rangelist[j] = temp
			sorted = 0
		    }
		    if (artlist[j] && rangelist[j]+1 == artlist[j+1]) {	# merge
			artlist[j+1] = artlist[j]
			artlist[j] = ""
			rangelist[j] = ""
		    }
		}
	    }
	    printf "%s%s", newsgroup[i], grouptype[i]
	    first = 1
	    for (j = start; j <= n; j++) {
		if (artlist[j]) {
		    if (first == 0) printf ","
		    else printf " "
		    first = 0
		    if (artlist[j] != rangelist[j])
			printf "%d-%d", artlist[j], rangelist[j]
		    else
			printf "%d", artlist[j]
		}
	    }
	    printf "\n"
	}
    }' $NEWSRC.old ${TEMP}c > ${TEMP}d
	cp ${TEMP}d $NEWSRC
    fi
else
    echo No news.
fi
//E*O*F newsweed//

echo x - newsweed.1
sed 's/^x//' > "newsweed.1" << '//E*O*F newsweed.1//'
x.TH NEWSWEED 1 local
x.SH NAME
xnewsweed
x.SH SYNOPSIS
x.B newsweed
x[readnews options]
x.br
x.B readnews
x.SH DESCRIPTION
x.I Newsweed
xis a program to help in managing the vast number of articles
xin the network news.
xIt is used to delete articles that are not interesting
xbefore using
x.IR readnews ,
x.IR vnews ,
xor
x.I rn
xto read them.
x.PP
xA while after invoking
x.I newsweed,
xthe user is presented with a list of titles of news articles
xin his preferred editor,
xas indicated by the environment variable EDITOR
x(\fIvi\fR is the default).
xThen the user deletes lines containing titles of undesired articles,
xwrites the file,
xand lets
x.I newsweed
xmodify the
x.I .newsrc
xfile so that the undesired articles will not be presented.
xThe previous
x.I .newsrc
xis saved as
x.I .newsrc.old.
xIf a newsrc file other than $HOME/.newsrc is desired,
xone may set the environment variable
x.I NEWSRC
xto an appropriate filename.
x.PP
xTypically, one ends up deleting 80% of new news,
xand saving an immense amount of time.
x.SH FILES
x~/.newsrc
x.SH SEE ALSO
xreadnews(1), vnews(1), rn(1), checknews(1)
x.SH AUTHOR
xKen Turkowski (turtlevax!ken)
x.SH BUGS
xThe title file is presented in alphabetical order
xand should remain in alphabetical order;
xotherwise not all of the uninteresting articles will be deleted
x(this could be fixed with yet one more sort, though).
x.PP
xIt may take a long time to generate the titles file if
x.I newsweed
xis used to catch up on a backlog of news,
xas after returning from vacation;
xthe csh ^Z stop signal is useful to put newsweed into the background
xduring phases other than the EDIT phase.
x.PP
xThe options line must not be continued with tabs on subsequent lines.
x.PP
xSome machines may not like long command lines,
xso the awk program may need to be put into a file.
x.PP
xSmall machines may bomb because of the large amount of memory
xused when there are a lot of newsgroups.
xI suspect that the awk script could be rewritten
xto be more conservative of memory.
//E*O*F newsweed.1//

echo Possible errors detected by \'sum\' [hopefully none]:
temp=/tmp/shar$$
trap "rm -f $temp; exit" 0 1 2 3 15
cat > $temp <<\!!!
30088     3 newsweed
51017     2 newsweed.1
!!!
sum  newsweed newsweed.1 | sed 's=[^ ]*/==' | diff -b $temp -
exit 0