Newsweed: a program to delete unwanted news articles
sources-request at genrad.UUCP
sources-request at genrad.UUCP
Mon Nov 12 23:58:36 AEST 1984
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
More information about the Mod.sources
mailing list