 Makefile           |    2 
 doc/CHANGES        |   57 +++
 doc/INSTALL        |    9 
 doc/TODO           |   13 
 doc/WHATSNEW       |  128 ++++---
 doc/filtering      |   17 
 doc/internals.txt  |   27 -
 doc/tin.1          |  953 ++++++++++++++++++++++++++---------------------------
 include/extern.h   |   35 +
 include/menukeys.h |    6 
 include/proto.h    |    4 
 include/tin.h      |  528 ++++++++++++++---------------
 include/version.h  |    6 
 makefile.in        |    2 
 src/active.c       |  245 +++++++------
 src/art.c          |   41 +-
 src/attrib.c       |    4 
 src/auth.c         |    2 
 src/charset.c      |   14 
 src/color.c        |    2 
 src/config.c       |   33 -
 src/curses.c       |  166 ++++-----
 src/debug.c        |    2 
 src/feed.c         |    8 
 src/filter.c       |   66 ---
 src/group.c        |   32 -
 src/inews.c        |    8 
 src/init.c         |    2 
 src/lang.c         |   13 
 src/main.c         |   20 -
 src/makecfg.c      |    5 
 src/misc.c         |   57 ++-
 src/newsrc.c       |   49 +-
 src/open.c         |   51 ++
 src/page.c         |    8 
 src/pgp.c          |   30 +
 src/post.c         |    5 
 src/refs.c         |    2 
 src/save.c         |   23 -
 src/select.c       |  121 +++---
 src/string.c       |    4 
 src/thread.c       |   27 -
 src/tincfg.tbl     |  145 ++++----
 43 files changed, 1566 insertions, 1406 deletions

diff -Nur tin-980105/Makefile tin-980117/Makefile
--- tin-980105/Makefile	Mon Jan  5 18:52:18 1998
+++ tin-980117/Makefile	Sat Jan 17 04:03:38 1998
@@ -8,7 +8,7 @@
 EXE		= tin
 MANEXT		= 1
 LVER		= 1.4
-PVER		= 980105
+PVER		= 980117
 VER		= pre-$(LVER)-$(PVER)
 
 # directory structure
diff -Nur tin-980105/doc/CHANGES tin-980117/doc/CHANGES
--- tin-980105/doc/CHANGES	Mon Jan  5 18:55:01 1998
+++ tin-980117/doc/CHANGES	Sat Jan 17 21:14:42 1998
@@ -1,3 +1,60 @@
+-- pre-1.4 release 980117 --
+
+540) Jason Faultless <jason@radar.demon.co.uk>
+     ADD. 'Try again (y/n)' loop if writing newsrc fails due to full disk
+     ADD. Abort save of newsrc file if 0 groups written
+     BUG. Couple of very obscure problems related to new newsgroup
+          handling
+     BUG. Groups mistakenly reported as new by the server could
+          appear more than once in selection list
+     FIX. tin.1, extern.h, proto.h, active.c, config.c, lang.c, misc.c
+          newsrc.c, select.c
+
+539) Borislav Deianov <borislav@CS.Cornell.EDU>
+     BUG. the rest of the keycodes of an arrow key which triggers
+          rereading of the active file at group selection level disappear
+          by the time get_arrow_key is called
+     FIX. select.c
+
+538) Darrell Tangman <darrelltman@mindspring.com>
+     BUG. local caching of newsgroups file didn't try to read newsgroups
+          via nntp if no local copy exists and -q falg was used
+     FIX. main.c, open.c
+
+537) Sven Paulus <sven@tin.org>
+     ADD. cosmetic-patch for start-up message
+     ADD. rearranged order of options 'M'enu items
+     FIX. open.c, tincfg.tbl
+
+536) Christian Haul <haul@informatik.tu-darmstadt.de>
+     Urs Janssen <urs@tin.org>
+     ADD. use mail_address for pgp-key if set
+     FIX. pgp.c, misc.c, proto.h
+
+535) Urs Janssen <urs@tin.org>
+     BUG. 'u'nsubscribing from bogus groups ('D') resets the .newsrc
+     BUG. 'u'nsubscribing and falls in show_only_unread=OFF mode
+     ADD. joined GLOBAL OPTIONS MENU and TINRC CONFIGURABLE VARIABLES
+          in the man page
+     ADD. info_in_last_line ('i')
+     FIX. extern.h, menukeys.h, config.c, group.c, init.c, select.c
+          thread.c, tin.1
+
+534) Jason Faultless <jason@radar.demon.co.uk>
+     BUG. missing set_signals_page() call added
+     ADD. check against active-file if using AUTOSUBSCRIBE and reading from
+          local spool.
+     ADD. documentation updated
+     FIX. several supplied patches
+
+533) Ralf Doeblitz <doeblitz@gmx.de>
+     BUG. commandline flags overridden by tinrc values
+     BUG. screen not initialized to default attributes when using color
+     BUG. documentation for default_filter_kill_header and
+          default_filter_select_header outdated in man page
+     ADD. whitespace quoting and cleanup
+     FIX. filter.c, main.c, tin.1
+
 -- pre-1.4 release 980105 --
 
 532) Jason Faultless <jason@radar.demon.co.uk>
diff -Nur tin-980105/doc/INSTALL tin-980117/doc/INSTALL
--- tin-980105/doc/INSTALL	Sun Jan  4 04:02:20 1998
+++ tin-980117/doc/INSTALL	Fri Jan 16 12:45:07 1998
@@ -14,7 +14,7 @@
   --enable-forgery	     --with-ncurses		NNTP_SERVER_FILE
   --enable-locale	     --with-nntp-default-server NO_POSTING
   --enable-mh-mail-handling  --with-nov-dir		NO_SHELL_ESCAPE
-  --enable-nntp		     --with-pgp			NO_WILDMAT
+  --enable-nntp		     --with-pgp
   --enable-nntp-only	     --with-spooldir		SMALL_MEMORY_MACHINE
   --with-domain-name	     DONT_HAVE_PIPING		USE_INVERSE_HACK
   --with-inews-dir	     DONT_REREAD_ACTIVE_FILE
@@ -60,7 +60,6 @@
 Otherwise tin will create its own NOV style index files on the local machine
 for each user in $HOME/.tin/.index
 
-
 Many machines require the name of the news gateway machine or the news
 domain to be set via the --with-mail-gateway or the --with-mail-domain
 configure options.  This is true of both NNTP and local news systems.
@@ -80,7 +79,8 @@
 Building the Index daemon version:
 ----------------------------------
 
-(only if your server doesn't support NOV overview files)
+(This feature is deprecated. Use it only if your server doesn't support
+NOV overview files)
 
 Note1: If you want to retrieve tin index files from your NNTP server,
        or if you don't run NNTP but want to install tin setuid and have
@@ -323,9 +323,6 @@
 
 NO_POSTING
 Do not allow posting/followup of articles.
-
-NO_WILDMAT
-Define if you do not want to use wildcard pattern matching.
 
 NO_SHELL_ESCAPE
 Do not allow shell escapes.
diff -Nur tin-980105/doc/TODO tin-980117/doc/TODO
--- tin-980105/doc/TODO	Mon Jan  5 18:36:59 1998
+++ tin-980117/doc/TODO	Mon Jan 12 13:37:42 1998
@@ -1,10 +1,5 @@
 Bugs
 ----
-o  $AUTO[UN]SUBSCRIBE are broken
-   - autosubscribe & autounsubscribe works for all but the last matching
-     pattern
-   [Urs Janssen <urs@tin.org>]
-
 o  ctrl-h doesn't turn off "Skip multipart/alternative parts"
    [Urs Janssen <urs@tin.org>]
 
@@ -151,7 +146,7 @@
    - check if TINRC_VERSION is 'newer' (allreday done) and give a warning
 
 o  if using mailreader_i add In-Reply-To: header and rename Newsgroups:
-   to X-Newsgroups (RFC 822 dosen't define a Newsgroups:-header)
+   to X-Newsgroups (RFC 822 doesn't define a Newsgroups:-header)
 
 o  if using "-n" commandline switch you can't subscribe to newsgroups not
    present in your newsrc - a simple check against the server
@@ -324,12 +319,14 @@
 
 Docs/online help
 ----------------
-o  man page is well out of date and is buggy. update
+o  man page is still out dated and buggy
 
 o  error message when tin -uv and using xover is misleading
 
 Not yet classified
 ------------------
+o  tin in batchmode dumps core if getting a SIGINT, usefull?
+
 o  'u'nsubscribe/'s'ubscribe are inconsistent - bug or feature?
    's' subscribes you to the curent group and does _not_ skip to the next
        group (annoying wehen subscribing to multiple groups, but usefull
@@ -393,7 +390,7 @@
 Filtering enhancements
 ----------------------
 o  add command: mark all articles older than <date> as read
-   (useful when subscribing to a new group with high-traffic...)
+   (usefull when subscribing to a new group with high-traffic...)
 
 o  fix kill/hot mechanism so that it is possible to match articles on
    arbitrary headers
diff -Nur tin-980105/doc/WHATSNEW tin-980117/doc/WHATSNEW
--- tin-980105/doc/WHATSNEW	Fri Dec 26 03:40:59 1997
+++ tin-980117/doc/WHATSNEW	Thu Jan  8 00:39:59 1998
@@ -2,56 +2,96 @@
 in tin-1.4
 
 [ Changes are relative to the last original tin beta, 950824 ]
+[ Changes are included for releases up to pre-1.4-980105 ]
 
-Full details of all the tinrc flags can be found on the man page. (eventually)
+Full details of all the tinrc flags can be found on the man page.
 
 Major additions
----------------
+===============
 
-. Full MIME support
-	New foreign charset support
-	Many new associated tinrc variables
-
-. Colour support
-	& to toggle while online, many variables in tinrc
-	Word highlighting
-
-. References based threading
-	'u' to toggle online, settable in tinrc and in attributes
-	Various thread menu additions & enhancements
+. Better MIME support
+    New foreign charset support
+    Integrated with metamail
+    Many new associated tinrc variables
+
+. Full Colour support
+    & to toggle while online, many new variables in tinrc
+    Word highlighting, can be toggled with '_'
+
+. True References based threading
+    'u' to toggle threading in the group menu, settable in tinrc and
+    as a per-group attribute. Various thread menu additions & enhancements
+    to support this:
 
-. Now auto-configures and builds out of the box
-	Much improved configurability
+    'u' in pager to goto parent
+    'L' in pager to search for a Message-Id
+
+    Graphical threading tree in the Thread menu.
 
+. Now auto-configures and builds out of the box
+     Much improved configurability. No more messy Makefiles to edit.
+    
 . Configuration menu completely rewritten ('M')
+  Most tinrc values can now be set in here.
+  Searchable with '/' and '?'
+
+. Many speed-up improvements
 
 . Article Superseding
 
-. Full PGP support
+. Full PGP and PGP-5 support
 
 . Support for multiple news servers
 
 . Newsserver authorisation fully supported
 
-. Scoring
+. Many enhancements to article filtering: true article
+  scoring and new filter types, such as filtering on crossposts
 
-. Uses libpcre (Perl-compatible regular expression Librarie) for
-  regex-patterns
+. Full regular expression support using libpcre (Perl-compatible
+  regular expression Library)
 
-Plus of course, countless bug fixes and doubtless some new ones.
+. Seperate history is now kept for most input types (eg searching)
+  Cursor keys can be used to scroll back/forwards/left/right through
+  the input.
 
 Other enhancements
-------------------
+==================
+
+   Global keys
+   -----------
+
+   'i' shows group description in main menu or article subject at all other levels
+
+   '^' goes to top of current display
+
+   Group menu
+   ----------
+   'K', 'z', 'Z' now understand ranges
+ 
+   Thread menu
+   -----------
+   '/'
+   'S'
+   'U' same functionality as in the group menu
+
+   Pager
+   -----
+   ':' skips past quoted text in articles
+
+   'L' lookup article by message-id
 
-: skips quoted text in articles
+   'u' goto the parent of this article
 
-i shows group description in main menu or article subject in group menu
 
-^ goes to top of current display
+   Help Screens / Configuration Screen
+   -----------------------------------
+   '/'
+   '?' Searching now works
 
-L lookup article by message-id
 
-article length shown in group menu, can be turned off
+Article length in lines shown in group and thead menu, can be
+turned off
 
 new_quote_format in attributes
 
@@ -59,27 +99,31 @@
 
 locale support
 
-filtering on number of Xposts
-
-article postponement
+article postponement / reposting with ^O
 
 New newsgroup handling completely rewritten
 
+handling for bogus groups in newsrc
+
 -N flag
 
+-p <port> flag
+
+-d flag
+
+-Q flag
+
+user configurable header display in pager
+
+local overview cacheing for speed on slow links
+
+$SPAMTRAP
+
+Can be built with curses, to give gpm support and scrolling option
+and help screens.
+
+Plus of course, countless bug fixes and doubtless some new ones.
+
 New flags in tinrc
 ------------------
-keep_dead_articles
-keep_posted_articles
-no-advertising
-show_xcommentto
-highlight_xcommentto
-xpost_quote_format
-auto_bcc
-post_process_command
-space_goto_next_unread
-news_quote_format enhancements (%C)
-show_lines
-lots for colour/highlighting
-
-loads more...
+Lots....
diff -Nur tin-980105/doc/filtering tin-980117/doc/filtering
--- tin-980105/doc/filtering	Mon Dec 29 06:01:31 1997
+++ tin-980117/doc/filtering	Sun Jan 11 16:18:54 1998
@@ -243,6 +243,23 @@
 lines=<3
 xref_max=10
 
+#####    
+### mark own articles and direct replies based on message-id
+### use 2*hot as score to unkill otherwise killed articles
+group=*  
+type=1         
+case=1
+score=200              
+msgid_last=doeblitz\.ts\.rz\.tu-bs\.de                                          
+#####
+### unmark own articles based on message-id
+### -> only f'ups to own articles keep marked hot
+group=*
+type=0
+case=1
+score=-200
+msgid_only=doeblitz\.ts\.rz\.tu-bs\.de
+
 
 7. TODO
 
diff -Nur tin-980105/doc/internals.txt tin-980117/doc/internals.txt
--- tin-980105/doc/internals.txt	Fri Dec 26 03:41:00 1997
+++ tin-980117/doc/internals.txt	Thu Jan  8 00:24:24 1998
@@ -1,4 +1,4 @@
-I/O in tin (updated 14/04/97)
+I/O in tin (updated 05/01/98)
 ----------
 
 All critical I/O, be it NNTP data or not, should be done with
@@ -8,10 +8,12 @@
 It supports the use of 'q' to abort the operation and 'Q' to exit tin
 without error recovery.
 
-tin_errno will be set to !0 to flag errors.
+tin_errno will be set to !0 to flag errors. Currently the only
+supported error is 'user aborted with q'.
 
 Closing NNTP data files should be done with TIN_FCLOSE(fp) as the NNTP
 socket should be kept open, whereas local spool fd's must be closed.
+TIN_FCLOSE() takes care of this.
 
 If you wish to quit reading an NNTP stream, then call drain_buffer(fp) to
 clear out any pending data on NNTP socket.
@@ -35,7 +37,7 @@
 
 
 
-Hashing in tin (updated 10/02/97)
+Hashing in tin (updated 05/01/98)
 --------------
 
 All the main arrays in tin are dynamically managed by functions in memory.c
@@ -47,7 +49,13 @@
 active[]
 An array of all the groups in the active file
 
-TODO - base[] ??
+arts[]
+This is an array of the article headers for the current group. Only headers
+present in the overview (NOV) database are stored.
+
+base[]
+An array of integers that represent the index in arts[] of the current
+root article for each displayed thread.
 
 group_hash[]
 active[] is hashed for faster access. An entry of -1 denotes no group at
@@ -59,20 +67,17 @@
 List of integer pointers into active[]
 These are the groups that actually appear on the selection screen
 
-arts[]
-This is an array of the article headers for the current group. Only headers
-present in the overview (NOV) database are stored.
-
 msgids[]
 Hashed array of all the individual message-ids in arts[]
 All the Message-ID and Reference headers are broken down and stored here.
 They are linked together by parent, sibling and child pointers
 
 table[]
-Hash of the key headers from the articles, to save space and speed up
+Hash of the key text headers from the articles, to save space and speed up
 searches and compares.
 
 
+The functions that manipulate the above include:
 
 active.c:
 	read_news_active_file() populates active[] using psGrpAdd()
@@ -80,7 +85,7 @@
 
 art.c:
 	Many of the overview headers are stored with hash_str()
-
+    base[] is populated by find_base()
 
 hashstr.c:
 	hash_str() Hashes text strings
@@ -115,7 +120,7 @@
 refs.c:
 	Handling for msgids[]
 	When threading, each msgid in the hash has a pointer back to
-	its article header in arts[] or ART_NORMAL if the article is not
+	its article header in arts[] or ART_UNAVAILABLE if the article is not
 	available
 
 
diff -Nur tin-980105/doc/tin.1 tin-980117/doc/tin.1
--- tin-980105/doc/tin.1	Sun Jan  4 22:46:50 1998
+++ tin-980117/doc/tin.1	Fri Jan 16 12:47:39 1998
@@ -3,11 +3,11 @@
 .\" Module    : tin.1
 .\" Author    : I. Lea, U. Janssen
 .\" Created   : 23.08.1991
-.\" Updated   : 04.01.1998
+.\" Updated   : 08.01.1998
 .\" Notes     : still needs some work
 .\"
 .\"
-.TH tin 1 "January 2nd, 1998" "1.4" "A Usenet newsreader"
+.TH tin 1 "January 8th, 1998" "1.4" "A Usenet newsreader"
 .\"
 .\"
 .SH NAME
@@ -125,7 +125,7 @@
 \fI$HOME/.newsrc\fP.
 .TP
 .BI -g " server"
-Use the in \fI$HOME/.tin/newsrctable\fP specified server and newsrc.
+Use the server and newsrc specified in \fI$HOME/.tin/newsrctable\fP.
 .TP
 .B -h
 Help listing all command line options.
@@ -224,7 +224,7 @@
 .PP
 \fBtin\fR can also dynamically change its options by the `M' menu command.
 Any changes are written to \fI$HOME/.tin/tinrc\fP. For more information see
-section GLOBAL OPTIONS MENU.
+section GLOBAL OPTIONS MENU AND TINRC CONFIGURABLE VARIABLES.
 .PP
 The index daemon version, \fBtind\fR, supports the ``\fB-d\fR'',
 ``\fB-f\fR'', ``\fB-h\fR'', ``\fB-I\fR'' and ``\fB-v\fR'' options.
@@ -297,7 +297,8 @@
 .TP
 .B N
 This is a new newsgroup which has been created since you last used
-\fBtin\fR. New newsgroups are not subscribed to by default. Subscribe to it
+\fBtin\fR. New newsgroups are not subscribed to by default (However, see
+the $\fBAUTOSUBSCRIBE\fR / $\fBAUTOUNSUBSCRIBE\fR environment variables). Subscribe to it
 in the normal way if you wish the group to continue to appear in your
 Selection Menu. Simply ignore new newsgroups and they will be gone the next
 time you start \fBtin\fR. You will have to yank in all the groups to find
@@ -321,8 +322,6 @@
 of conversation threads, the threading-method, the total number of articles,
 the number of killed articles and the number of hot articles. i.e.,
 alt.sources (5T(B) 23A 0K 0H).
-If the group has been setup not to thread articles the title will be
-alt.sources (23U 0K 0H).
 It might also contain an R if your are in 'show_only_unread' mode and an M
 if the group is moderated. (The later does not work with the ``\fB-n\fR''
 command-line switch!).
@@ -331,8 +330,8 @@
 If a thread has hot articles in it (see also section FILTERING ARTICLES)
 it's marked with a `*' in font of the  total number of articles in the thread.
 There might also be shown the number of lines of the first (unread) article
-in the thread right before the subject - this is controlled by the
-'show_lines' option.
+in the thread right before the subject - this is controlled by
+the 'show_lines' option.
 .PP
 .\" FIXME - make this autoscale
 .nf
@@ -487,7 +486,7 @@
 .TP
 .B M
 User configurable options menu (for more information see section
-GLOBAL OPTIONS MENU).
+GLOBAL OPTIONS MENU AND TINRC CONFIGURABLE VARIABLES).
 .TP
 .B q
 Quit \fBtin\fR - ask the user to confirm if 'confirm_to_quit' is on.
@@ -564,11 +563,13 @@
 .TP
 .B [
 Auto select article(s) with a single key. The defaults used for selection
-are set via the following three tinrc config variables:
+are set via the following four tinrc config variables:
 .in +.3i
 default_filter_select_header
 .in +.3i
-0 = ``Subject:'', 1 = ``From:'', 2 = ``Message-ID:''
+0,1 = ``Subject:'', 2,3 = ``From:'', 4 = ``Message-Id:'' & full ``References:'' line,
+5 = ``Message-Id:'' & last ``References:'' entry only,
+6 = ``Message-Id:'' entry only, 7 = ``Lines:''
 .in -.3i
 default_filter_select_global
 .in +.3i
@@ -590,11 +591,13 @@
 .TP
 .B ]
 Kill article(s) with a single key. The defaults used for killing
-are set via the following three tinrc config variables:
+are set via the following four tinrc config variables:
 .in +.3i
 default_filter_kill_header
 .in +.3i
-0 = ``Subject:'', 1 = ``From:'', 2 = ``Message-ID:''
+0,1 = ``Subject:'', 2,3 = ``From:'', 4 = ``Message-Id:'' & full ``References:'' line,
+5 = ``Message-Id:'' & last ``References:'' entry only,
+6 = ``Message-Id:'' entry only, 7 = ``Lines:''
 .in -.3i
 default_filter_kill_global
 .in +.3i
@@ -629,6 +632,9 @@
 .B A
 Author backward search.
 .TP
+.B B
+Search the body of all articles in group (can be slow).
+.TP
 .B c
 Mark all articles as read with confirmation.
 .TP
@@ -666,7 +672,7 @@
 .TP
 .B M
 User configurable options menu (for more information see section
-GLOBAL OPTIONS MENU).
+GLOBAL OPTIONS MENU AND TINRC CONFIGURABLE VARIABLES).
 .TP
 .B n
 Go to next group.
@@ -746,6 +752,9 @@
 .B ?
 Search backward for specified subject.
 .TP
+.B #
+Choose range of articles to be affected by next command.
+.TP
 .B -
 Show last message.
 .TP
@@ -803,19 +812,19 @@
 View next unread article within thread.
 .TP
 .B ^
-choose first article in thread.
+Choose first article in thread.
 .TP
 .B $
-choose last article in thread.
+Choose last article in thread.
 .TP
 \fB/\fR                       
-choose article by subject string forward search
+Choose article by subject string forward search
 .TP
 .B ?
-choose article by subject string backward search
+Choose article by subject string backward search
 .TP
 .B #
-choose range of articles to be affected by next command
+Choose range of articles to be affected by next command.
 .TP
 .B 4
 Select article 4 within thread.
@@ -852,17 +861,17 @@
 getting bugs fixed and features added/changed.
 .TP
 .B s
-save article/thread/hot/pattern/tagged articles to file
+Save article/thread/hot/pattern/tagged articles to file
 .TP
 .B S
-save tagged articles automatically without user prompts
+Save tagged articles automatically without user prompts
 .TP
 .B t
 Toggle tag status of current article for mailing (`m') / piping (`|')
 / printing (`o') / saving (`s') / reposting (`x').
 .TP    
 .B U
-untag all tagged threads
+Untag all tagged threads
 .TP
 .B v
 Print \fBtin\fR version information.
@@ -889,11 +898,13 @@
 .TP
 .B [
 Auto select article(s) with a single key. The defaults used for selection
-are set via the following three tinrc config variables:
+are set via the following four tinrc config variables:
 .in +.3i
 default_filter_select_header
 .in +.3i
-0 = ``Subject:'', 1 = ``From:'', 2 = ``Message-ID:''
+0,1 = ``Subject:'', 2,3 = ``From:'', 4 = ``Message-Id:'' & full ``References:'' line,
+5 = ``Message-Id:'' & last ``References:'' entry only,
+6 = ``Message-Id:'' entry only, 7 = ``Lines:''
 .in -.3i
 default_filter_select_global
 .in +.3i
@@ -918,11 +929,13 @@
 .TP
 .B ]
 Kill article(s) with a single key. The defaults used for killing
-are set via the following three tinrc config variables:
+are set via the following four tinrc config variables:
 .in +.3i
 default_filter_kill_header
 .in +.3i
-0 = ``Subject:'', 1 = ``From:'', 2 = ``Message-ID:''
+0,1 = ``Subject:'', 2,3 = ``From:'', 4 = ``Message-Id:'' & full ``References:'' line,
+5 = ``Message-Id:'' & last ``References:'' entry only,
+6 = ``Message-Id:'' entry only, 7 = ``Lines:''
 .in -.3i
 default_filter_kill_global
 .in +.3i
@@ -957,6 +970,9 @@
 .B A
 Author backward search.
 .TP
+.B B
+Search the body of all articles in group (can be slow).
+.TP
 .B c
 Mark all articles as read with confirmation and return to group selection
 level.
@@ -1014,7 +1030,7 @@
 .TP
 .B M
 User configurable options menu (for more information see section
-GLOBAL OPTIONS MENU).
+GLOBAL OPTIONS MENU AND TINRC CONFIGURABLE VARIABLES).
 .TP
 .B n
 Go to the next article.
@@ -1133,414 +1149,336 @@
 Toggle $\fBTEX2ISO\fR decoding for current article.
 .\"
 .\"
-.SH "GLOBAL OPTIONS MENU"
-This menu is accessed by pressing `M' at all levels. It allows the user
-to customize the behavior of \fBtin\fR. The options are saved to the file
-\fI$HOME/.tin/tinrc\fP. Use <SPACE> to toggle the required option and
-<CR> to set. Use `/', `?' to search for a specific option.
-.TP 4
-.B Auto save
-Automatically save articles/threads by ``Archive-name:'' line in article
-header and post process them if process type is not set to None.
-.TP
-.B Editor offset
-Set ON if the editor used for posting, follow-ups and bug reports has
-the capability of starting and positioning the cursor at a specified line
-within a file.
-.TP
-.B Mark saved read
-Allows saved articles/threads to be automatically marked as read.
-.TP
-.B Confirm Command
-Allows certain commands (i.e., `c' catchup) that require user confirmation
-to be executed immediately if set OFF.
-.TP
-.B Draw arrow
-Allows groups/articles to be selected by an arrow '->' if set ON or
-by an highlighted bar if set OFF.
-.TP
-.B Print header
-This allows the complete mail header or only the ``Subject:'' and ``From:''
-fields to be output when printing articles.
-.TP
-.B Goto 1st unread
-This allows the cursor to be placed at the first / last unread article
-upon entering a newsgroup with unread news.
-.TP
-.B Scroll full page
-If set ON scrolling of groups/articles will be a full page at a time,
-otherwise half a page at a time.
-.TP
-.B Catchup on quit
-If set ON the user is asked when quitting if all groups read during the
-current session should be marked read.
-.TP
-.B Thread articles
-Threading type is possible on a per group basis by setting the group
-attribute variable 'thread_arts' to 0 - 3 in the file
-\fI$HOME/.tin/attributes\fP.
-.TP
-.B Show only unread
-If set ON show only new/unread articles, otherwise show all articles.
-.TP
-.B Show description
-If set ON show a short descriptive text for each displayed newsgroup.
-The text used is taken from the \fI$NEWSLIBDIR/newsgroups\fP file.
-.TP
-.B Show Author
-If set 'None' only the ``Subject:'' line will be displayed. If set 'Addr'
-``Subject:'' line & the address part of the ``From:'' line are displayed. If
-set 'Name' ``Subject:'' line & the authors full name part of the ``From:''
-line are displayed. If set 'Both' ``Subject:'' line & all of the ``From:'' line
-are displayed.
+.SH "GLOBAL OPTIONS MENU AND TINRC CONFIGURABLE VARIABLES"
+.\" FIXME - add missing descriptions
+.\" FIXME - bring into a usefull order
+At startup, \fBtin\fR reads in the configuration file. This contains a list
+of variables that can be used to configure the way \fBtin\fR works. If it
+exists, the global configuration file, \fI/usr/lib/news/tinrc\fP is read.
+After that, the users own configuration file is read from
+\fI$HOME/.tin/tinrc\fP. The global file is useful for distributing
+system-wide defaults to new users who have no private tinrc yet.
 .TP
-.B Process type
-This specifies the default type of post processing to perform on saved
-articles. The following types of processing are allowed:
-.in +.5i
-.ti -\w'\(em'u
-\(emnone.
-.ti -\w'\(em'u
-\(emunpacking of multi-part shell archives.
-.ti -\w'\(em'u
-\(emunpacking of multi-part uuencoded files.
-.ti -\w'\(em'u
-\(emunpacking of multi-part uuencoded files, which produce a *.zoo archive
-whose contents is listed.
-.ti -\w'\(em'u
-\(emunpacking of multi-part uuencoded files, which produce a *.zoo archive
-whose contents is extracted.
-.ti -\w'\(em'u
-\(emunpacking of multi-part uuencoded files, which produce a *.zip archive
-whose contents is listed.
-.ti -\w'\(em'u
-\(emunpacking of multi-part uuencoded files, which produce a *.zip archive
-whose contents is extracted.
-.ti -\w'\(em'u
-\(emunpacking of multi-part uuencoded files, which produce a *.lha archive
-whose contents is listed (AmigaOS version only).
-.ti -\w'\(em'u
-\(emunpacking of multi-part uuencoded files, which produce a *.lha archive
-whose contents is extracted (AmigaOS version only).
-.in -.5i
+The following variables are user configurable by editing \fI$HOME/.tin/tinrc\fP
+directly. Most of them can be set in the GLOBAL OPTIONS MENU which is could 
+be accessed by pressing `M' at all levels. It allows the user to customize the
+behavior of \fBtin\fR. The options are saved to the file \fI$HOME/.tin/tinrc\fP.
+Use <SPACE> to toggle the required option and <CR> to set. Use `/', `?' to search
+for a specific option. The name in braces is the name of the corresponding setting
+in \fI$HOME/.tin/tinrc\fP.
+.TP 4
+.B Add posted articles to filter (add_posted_to_filter)
+If ON add posted articles to filter for highlighting follow-ups.
+Default is ON.
 .TP
-.B Sort articles by
-This specifies how articles should be sorted. The following sort
-types are allowed:
-.in +.5i
-.ti -\w'\(em'u
-\(emdon't sort articles (default).
-.ti -\w'\(em'u
-\(emsort articles by ``Subject:'' field (ascending & descending).
-.ti -\w'\(em'u
-\(emsort articles by ``From:'' field (ascending & descending).
-.ti -\w'\(em'u
-\(emsort articles by ``Date:'' field (ascending & descending).
-.in -.5i
+.B Insert 'User-Agent:'-header (advertising)
+Turn ON advertising in header (``User-Agent:'').
+Default is ON.
 .TP
-.B Save directory
-The directory where articles/threads are to be saved. Default is
-\fI$HOME/News\fP.
+.B Skip multipart/alternative parts (alternative_handling)
+If ON strip multipart/alternative messages automatically.
 .TP
-.B Mail directory
-The directory where articles/threads are to be saved in mailbox format.
-This feature is mainly for use with the Elm mail program. It allows
-the user to save articles/threads/groups simply by giving '=' as
-the filename to save to.
+.B Character to show deleted articles (art_marked_deleted)
+The character used to show that an article was deleted.
+Default is 'D'.
+.TP
+.B Character to show inrange articles (art_marked_inrange)
+The character used to show that an article is in a range.
+Default is '#'.
+.TP
+.B Character to show returning arts (art_marked_return)
+The character used to show that an article will return.
+Default is '-'.
 .TP
-.B Printer
-The printer program with options that is to be used to print
-articles. Default is lpr for BSD machines and lp for SysV machines.
-.\"
-.\"
-.SH "TINRC CONFIGURABLE VARIABLES"
-.\" FIXME - add missing descriptions
-The following variables are user configurable by editing \fI$HOME/.tin/tinrc\fP
-directly. Most of them could be set in the GLOBAL OPTIONS MENU.
-.TP 4
-.B add_posted_to_filter
-If ON add posted articles to filter for highlighting follow-ups. Default is
-ON.
-.TP 4
-.B advertising
-Turn ON advertising in header (``User-Agent:''). Default is ON.
-.TP 4
-.B alternative_handling
-.TP 4
-.B art_marked_deleted
-The character used to show that an article was deleted. Default is 'D'.
-.TP 4
-.B art_marked_inrange
-The character used to show that an article is in a range. Default is '#'.
-.TP 4
-.B art_marked_return
-The character used to show that an article will return. Default is '-'.
-.TP 4
-.B art_marked_selected
+.B Character to show selected articles (art_marked_selected)
 The character used to show that an article/thread is auto-selected (hot).
 Default is '*'.
-.TP 4
-.B art_marked_unread
-The character used to show that an article has not been read. Default is '+'.
-.TP 4
-.B ask_for_metamail
+.TP
+.B Character to show unread articles (art_marked_unread)
+The character used to show that an article has not been read.
+Default is '+'.
+.TP
+.B Ask before using metamail (ask_for_metamail)
 If ON \fBtin\fR will ask before using metamail to display MIME messages. This only
-occurs, if 'use_metamail' is also switched ON. Default is ON.
-.TP 4
-.B auto_bcc
+occurs, if 'use_metamail' is also switched ON.
+Default is ON.
+.TP
+.B Send you a blind cc automatically (auto_bcc)
 If ON automatically put your name in the ``Bcc:'' field when mailing an article.
 Default is OFF
-.TP 4
-.B auto_cc
+.TP
+.B Send you a cc automatically (auto_cc)
 If ON automatically put your name in the ``Cc:'' field when mailing an article.
 Default is OFF
-.TP 4
-.B auto_list_thread
+.TP
+.B List thread using right arrow key (auto_list_thread)
 If ON automatically list thread when entering it using right arrow key.
 Default is ON.
-.TP 4
-.B auto_save
+.TP
+.B Use Archive-name: header for save (auto_save)
 If ON articles/threads with ``Archive-name:'' in header will be
-automatically saved with the Archive-name & part/patch no. Default is OFF
-.TP 4
-.B batch_save
+automatically saved with the Archive-name & part/patch no and
+post processed if process type is not set to none. Default is OFF
+.TP
+.B Save articles in batch mode (-S) (batch_save)
 If set ON articles/threads will be saved in batch mode when save
 ``\fB-S\fR'' or mail ``\fB-M\fR'' is specified on the command line.
 Default is OFF.
-.TP 4
-.B beginner_level
+.TP
+.B Show mini menu at each level (beginner_level)
 If set ON a mini menu of the most useful commands will be displayed at the
 bottom of the screen for each level. Default is ON.
-.TP 4
-.B cache_overview_files
-If ON, create local copies of NNTP overview files.
-.TP 4
-.B catchup_read_groups
-If ON ask user on exit if read groups should all be marked read.
+.TP
+.B Cache NNTP overview files locally (cache_overview_files)
+If ON, create local copies of NNTP overview files. This can be used to
+considerably speed up accessing large groups when using a slow connection.
+.TP
+.B Catchup read groups when quitting (catchup_read_groups)
+If set ON the user is asked when quitting if all groups read during the
+current session should be marked read.
 Default is OFF.
-.TP 4
-.B col_back
-Standard-Background-Color
-.TP 4
-.B col_from
+.\"
+.\" FIXME - I leave this to someone who's using colors
+.TP
+.B Standard background color (col_back)
+Standard background color
+.TP
+.B Color of sender (From:) (col_from)
 Color of sender (From:)
-.TP 4
+.TP
 .B col_head
 Color of header-lines
-.TP 4
+.TP
 .B col_help
 Color of help pages
-.TP 4
+.TP
 .B col_invers_bg
 Color of background for inverse text
-.TP 4
+.TP
 .B col_invers_fg
 Color of foreground for inverse text
-.TP 4
+.TP
 .B col_markdash
 Color of _underdashed_ words.
-TP 4
+.TP
 .B col_markstar
-Color of *stared* words
-.TP 4
+Color of *starred* words
+.TP
 .B col_minihelp
 Color of mini help menu
-.TP 4
+.TP
 .B col_newsheaders
 Color of actual news header fields
-.TP 4
+.TP
 .B col_normal
 Standard foreground color
-.TP 4
+.TP
 .B col_quote
 Color of quote-lines
-.TP 4
+.TP
 .B col_response
 Color of response counter
-.TP 4
+.TP
 .B col_signature
 Color of signature
-.TP 4
+.TP
 .B col_subject
 Color of article subject
-.TP 4
+.TP
 .B col_text
 Color of text-lines
-.TP 4
+.TP
 .B col_title
 Color of Help/Mail-Sign
-.TP 4
-.B confirm_action
-If ON confirm certain commands with ``y''/``n'' before executing. Default is ON.
-.TP 4
-.B confirm_quit
+.TP
+.B Confirm commands before executing (confirm_action)
+Allows certain commands (i.e., `c' catchup) that require user confirmation
+to be executed immediately if set OFF.
+Default is ON.
+.TP
+.B Confirm before quitting (confirm_quit)
 If ON confirm with ``y''/``n'' before quitting. Default is ON.
-.TP 4
+.\"
+.\" most of the default_* settings are not available the 'M'enu
+.TP
 .B default_art_search
-.TP 4
+.TP
 .B default_author_search
-.TP 4
+.TP
 .B default_config_search
-.TP 4
+.TP
 .B default_editor_format
 The format string used to create the editor start command with parameters.
 Default is '%E +%N %F' (i.e., /bin/vi +7 .article).
-.TP 4
+.TP
 .B default_filter_days
 Default is 28.
-.TP 4
+.TP
 .B default_filter_kill_case
 Defaults for quick (1 key) kill filter case.
 ON = filter case sensitive, OFF = ignore case. Default is OFF.
-.TP 4
+.TP
 .B default_filter_kill_expire
 Defaults for quick (1 key) kill filter expire.
 ON = limit to 'default_filter_days',  OFF = don't ever expire. Default is OFF.
-.TP 4
+.TP
 .B default_filter_kill_global
 Defaults for quick (1 key) kill filter global.
 ON=apply to all groups OFF=apply to current group. Default is ON.
-.TP 4
+.TP
 .B default_filter_kill_header
 Defaults for quick (1 key) kill filter header.
-0=``Subject:'' 1=``From:'' 2=``Message-Id:''. Default is 0.
-.TP 4
+0,1 = ``Subject:'', 2,3 = ``From:'', 4 = ``Message-Id:'' & full ``References:'' line,
+5 = ``Message-Id:'' & last ``References:'' entry only,
+6 = ``Message-Id:'' entry only, 7 = ``Lines:''
+.TP
 .B default_filter_select_case
 Defaults for quick (1 key) auto-selection filter case.
 ON=filter case sensitive OFF=ignore case. Default is OFF.
-.TP 4
+.TP
 .B default_filter_select_expire
 Defaults for quick (1 key) auto-selection filter expire.
 ON = limit to 'default_filter_days', OFF = don't ever expire. Default is OFF.
-.TP 4
+.TP
 .B default_filter_select_global
 Defaults for quick (1 key) auto-selection filter global.
 ON=apply to all groups OFF=apply to current group. Default is ON.
-.TP 4
+.TP
 .B default_filter_select_header
 Defaults for quick (1 key) auto-selection filter header.
-0=``Subject:'' 1=``From:'' 2=``Message-Id:''. Default is 0.
-.TP 4
+0,1 = ``Subject:'', 2,3 = ``From:'', 4 = ``Message-Id:'' & full ``References:'' line,
+5 = ``Message-Id:'' & last ``References:'' entry only,
+6 = ``Message-Id:'' entry only, 7 = ``Lines:''
+.TP
 .B default_goto_group
-.TP 4
+.TP
 .B default_group_search
-.TP 4
+.TP
 .B default_mail_address
-.TP 4
-.B default_maildir
-Directory where articles/threads are saved in mailbox format.
+.TP
+.B Mail directory (default_maildir)
+The directory where articles/threads are to be saved in mailbox format.
+This feature is mainly for use with the Elm mail program. It allows
+the user to save articles/threads/groups simply by giving '=' as
+the filename to save to.
 Default is \fI$HOME/Mail\fP.
-.TP 4
-.B default_mailer_format
+.TP
+.B Invocation of your mail command (default_mailer_format)
 The format string used to create the mailer command with parameters that is
 used for mailing articles to other people.
 Default is '%M "%T" < %F' (i.e., /bin/mail "iain" < .article). The flexible
 format allows other mailers with different command line parameters to be used
 such as 'elm -s "%S" "%T" < "%F"' (i.e., elm -s "subject" "iain" < .article).
-.TP 4
+.TP
 .B default_move_group
-.TP 4
+.TP
 .B default_pipe_command
-.TP 4
+.TP
 .B default_post_newsgroups
-.TP 4
+.TP
 .B default_post_subject
-.TP 4
-.B default_printer
-Print program with parameters used to print articles/threads.
-Default is /usr/bin/lpr.
-.TP 4
+.TP
+.B Printer program with options (default_printer)
+The printer program with options that is to be used to print
+articles. Default is lpr for BSD machines and lp for SysV machines.
+.TP
 .B default_range_group
-.TP 4
+.TP
 .B default_range_select
-.TP 4
+.TP
 .B default_range_thread
-.TP 4
+.TP
 .B default_regex_pattern
-.TP 4
+.TP
 .B default_repost_group
-.TP 4
+.TP
 .B default_save_file
-.TP 4
+.TP
 .B default_save_mode
-.TP 4
-.B default_savedir
+.TP
+.B Directory to save arts/threads in (default_savedir)
 Directory where articles/threads are saved. Default is \fI$HOME/News\fP.
-.TP 4
+.TP
 .B default_select_pattern
-.TP 4
+.TP
 .B default_shell_command
-.TP 4
-.B default_sigfile
+.TP
+.B Create signature from path/command (default_sigfile)
 The path that specifies the signature file to use when posting, following up to
 or replying to an article. If the path is a directory then the signature will
 be randomly generated from files that are in the specified directory.
 Default is \fI$HOME/.Sig\fP.
-.TP 4
+.TP
 .B default_subject_search
-.TP 4
-.B display_mime_allheader_asis
+.TP
+.B Show RFC 2047 ^H-header undecoded (display_mime_allheader_asis)
 Similar to \fBdisplay_mime_header_asis\fR, but works on CTRL-h (show all headers)
 instead of \fBnews_headers_to_display\fR.
-.TP 4
-.B display_mime_header_asis
+.TP
+.B Show RFC 2047 header undecoded (display_mime_header_asis)
 If ON, RFC 1522 (now RFC 2047)-style header fields are displayed
 without decoding. No effect on header displayed at the top of
 each page in article mode and summary mode (they are always decoded).
 Default is OFF so that RFC 1522 (RFC 2047)-style headers (designated in
 \fBnews_header_to_display\fR) will be decoded back to 8bit when displayed.
-.TP 4
-.B draw_arrow
-If ON use -> otherwise highlighted bar for selection. Default is OFF.
-.TP 4
-.B force_screen_redraw
+.TP
+.B Draw -> instead of highlighted bar (draw_arrow)
+Allows groups/articles to be selected by an arrow '->' if set ON or
+by an highlighted bar if set OFF.
+.TP
+.B Force redraw after certain commands (force_screen_redraw)
 Specifies whether a screen redraw should always be done after certain
 external commands. Default is OFF.
-.TP 4
-.B full_page_scroll
-If ON scroll full page of groups/threads otherwise half a page. Default is ON.
-This is not implemented in the pager.
-.TP 4
-.B group_catchup_on_exit
+.TP
+.B Scroll full page (OFF=half page) (full_page_scroll)
+If set ON scrolling of groups will be a full page at a time,
+otherwise half a page at a time. Currently this is not implemented in the
+pager and in the GLOBAL OPTIONS MENU.
+.TP
+.B Catchup group using left key (group_catchup_on_exit)
 if ON catchup group when leaving with the left arrow key. Default is ON.
-.TP 4
-.B groupname_max_length
+.TP
+.B Max. length of group names shown (groupname_max_length)
 Maximum length of the names of newsgroups to be displayed so that more of the
 newgroup description can be displayed. Default is 32.
-.TP 4
-.B inverse_okay
+.TP
+.B info_in_last_line
+If ON, show current group description or articles subject in the last line
+(not in the pager and global menu) - `i' toggels setting.
+.TP
+.B Use inverse video for page headers (inverse_okay)
 If ON use inverse video for page headers at different levels. Default is ON.
-.TP 4
-.B keep_dead_articles
+.TP
+.B Keep failed arts in ~/dead.articles (keep_dead_articles)
 If ON keep all failed postings in \fI$HOME/dead.articles\fP besides keeping the
 last failed posting in \fI$HOME/dead.article\fP. Default is ON.
-.TP 4
-.B keep_posted_articles
+.TP
+.B Keep posted arts in ~/Mail/posted (keep_posted_articles)
 If ON keep all postings in \fI$HOME/Mail/posted\fP. Default is ON.
-.TP 4
-.B mail_8bit_header
+.TP
+.B Use 8bit characters in mail headers (mail_8bit_header)
 Allows 8bit characters unencoded in the header of mail message.
 Default is OFF. Turning it ON is effective only if 'mail_mime_encoding' is
 also set to 8bit. Leaving it OFF is safe for most users except for Korean
 users with localized \fBsendmail\fR(8).
-.TP 4
-.B mail_address
+.TP
+.B Mail address (mail_address)
 User's mail address, if not username@host.
-.TP 4
-.B mail_mime_encoding
+.TP
+.B MIME encoding in mail messages (mail_mime_encoding)
 MIME encoding of the body in mail message, if necessary (8bit, base64, quoted-printable, 7bit)
 Default is 8bit. If set to 7bit, CJK text is encoded into ISO-2022-KR/JP/CN.
 Currently, only ISO-2022-KR is implemented. No encoding (or charset conversion)
 is done (i.e., local charset is used as it is) if set to 8bit.
-.TP 4
-.B mail_quote_format
+.TP
+.B Quote line when mailing (mail_quote_format)
 Default is "In article %M you wrote:"
-.TP 4
-.B mark_saved_read
+.TP
+.B Mark saved articles/threads as read (mark_saved_read)
 If ON mark articles that are saved as read. Default is ON.
-.TP 4
-.B mm_charset
-charset supported locally, which is also used for MIME header (charset
+.TP
+.B MM_CHARSET (mm_charset)
+Charset supported locally, which is also used for MIME header (charset
 parameter and charset name in header encoding)
 in mail and news posting unless local charset needs to be encoded into
 other charset as in case of ISO-2022-KR encoding of EUC-KR in mail message.
@@ -1553,17 +1491,19 @@
 sets are regarded as compatible with the display. If it's not set,
 the value of the environment variable $\fBMM_CHARSET\fR is used. US-ASCII
 or compile-time default is used in case neither of them is defined.
-.TP 4
+.TP
 .B newnews
-.TP 4
-.B news_headers_to_display
+These are internal timers used by tin to keep track of new newsgroups. Do not
+change them unless you understand what they are for.
+.TP
+.B Display these header fields (or *) (news_headers_to_display)
 Which news headers you wish to see. If you want to see _all_ the headers, 
 place an '*' as this value. This is the only way a wildcard can be used.
-If you enter 'X-' as the value, you will see all headers beginning with
-'X-' (like X-Alan or X-Pape). You can list more than one by delimiting with
+If you enter 'X-' as the value, you will see all headers beginning
+with 'X-' (like X-Alan or X-Pape). You can list more than one by delimiting with
 spaces. Not defining anything turns off this option.
-.TP 4
-.B news_headers_to_not_display
+.TP
+.B Do not display these header fields (news_headers_to_not_display)
 Same as \fBnews_headers_to_display\fR except it denotes the opposite.
 An example of using both options might be if you thought X- headers were
 A Good Thing(tm), but thought Alan and Pape were miscreants...well then you
@@ -1571,35 +1511,35 @@
 \fInews_headers_to_display=X-\fP
 \fInews_headers_to_not_display=X-Alan X-Pape\fP
 Not defining anything turns off this option.
-.TP 4
-.B news_quote_format
+.TP
+.B Quote line when following up (news_quote_format)
 Format of quote line when posting/following up an article (%A=Address, %D=Date,
 %F=Addr+Name, %G=Groupname, %M=Message-Id, %N=Name).
 Default is "%F wrote:"
-.TP 4
-.B pgdn_goto_next
+.TP
+.B PgDn goes to next artice at EOF (pgdn_goto_next)
 If ON the PGDN or DOWN command will goto next article when pressed
 at end of message
-.TP 4
-.B pos_first_unread
+.TP
+.B Goto first unread article in group (pos_first_unread)
 If ON put cursor at first unread article in group otherwise at last article.
 Default is ON.
-.TP 4
-.B post_8bit_header
+.TP
+.B Use 8bit characters in news headers (post_8bit_header)
 Allows 8bit characters unencoded in the header of news article.
 Default is OFF. Only enacted if 'post_mime_encoding' is also set to 8bit.
-.TP 4
-.B post_mime_encoding
+.TP
+.B MIME encoding in news messages (post_mime_encoding)
 MIME encoding of the body in news message, if necessary. (8bit, base64, quoted-printable, 7bit)
 Default is 8bit, which leads to no encoding (or charset conversion, i.e.,
 local charset is posted as it is). If set to 7bit, Chinese and Japanese
 text is encoded into ISO-2022-CN/JP (not yet implemented). 7bit is
 equivalent to 8bit for Korean news messages.
-.TP 4
+.TP
 .B post_process_command
 Full pathname of a command to be run after successfully uudecoding an
 article / thread. This option should be used in conjunction with
-post processing type 2=(uudecode) (see above)
+post processing type 2=(uudecode)
 A sample script (for Linux) demonstrates a possible use for this:
 .RS
 .nf
@@ -1612,19 +1552,16 @@
 [ ! -f "$1" ] && exit 1
 
 case ${1##*.} in
-
     # View pictures in console mode or X
     #
     gif|jpg|GIF|JPG)
         [ -z "$DISPLAY" ] && zgv $1 || xv $1
         ;;
-
     # List zip archives
     #
     zip)
         unzip -l $1
         ;;
-
     *)
         echo "Unsupported or missing suffix: ${1##*.}"
         file $1
@@ -1639,167 +1576,216 @@
 
 .fi
 .RE
-.TP 4
-.B post_process_type
-Type of post processing to perform after saving articles.
-0=(none) 1=(unshar) 2=(uudecode) 3=(uudecode & list zoo)
-4=(uud & extract zoo) 5=(uud & list zip) 6=(uud & extract zip).
-Default is 0.
-.TP 4
-.B print_header
-If ON print all of mail header otherwise only ``Subject:'' & ``From:'' lines.
+.TP
+.B Post process saved art/thread with (post_process_type)
+This specifies the default type of post processing to perform on saved
+articles. The following types of processing are allowed:
+.in +.5i
+.ti -\w'\(em'u
+\(emnone.
+.ti -\w'\(em'u
+\(emunpacking of multi-part shar files (shell archives).
+.ti -\w'\(em'u
+\(emunpacking of multi-part uuencoded files.
+.ti -\w'\(em'u
+\(emunpacking of multi-part uuencoded files, which produce a *.zoo archive
+whose contents is listed.
+.ti -\w'\(em'u
+\(emunpacking of multi-part uuencoded files, which produce a *.zoo archive
+whose contents is extracted.
+.ti -\w'\(em'u
+\(emunpacking of multi-part uuencoded files, which produce a *.zip archive
+whose contents is listed.
+.ti -\w'\(em'u
+\(emunpacking of multi-part uuencoded files, which produce a *.zip archive
+whose contents is extracted.
+.ti -\w'\(em'u
+\(emunpacking of multi-part uuencoded files, which produce a *.lha archive
+whose contents is listed (AmigaOS version only).
+.ti -\w'\(em'u
+\(emunpacking of multi-part uuencoded files, which produce a *.lha archive
+whose contents is extracted (AmigaOS version only).
+.in -.5i
+.TP
+.B Print all headers when printing (print_header)
+This allows the complete mail header or only the ``Subject:'' and ``From:''
+fields to be output when printing articles.
 Default is OFF.
-.TP 4
-.B process_only_unread
+.TP
+.B Process only unread articles (process_only_unread)
 If ON only save/print/pipe/mail unread articles (tagged articles excepted).
 Default is ON.
-.TP 4
-.B prompt_followupto
+.TP
+.B Show empty Followup-To in editor (prompt_followupto)
 If ON show empty Followup-To header when editing an article
-.TP 4
-.B quote_chars
+.TP
+.B Characters used as quote-marks (quote_chars)
 The character used in quoting included text to article followups and mail
 replies. The '_' character represents a blank character and is replaced
 with ' ' when read. Default is '>_'.
-.TP 4
-.B quote_empty_lines
+.TP
+.B Quote empty lines (quote_empty_lines)
 If ON quote empty lines, too. Default is OFF due to backward compatibility,
 but it is highly recommended to turn it on as it makes quotes much more
 readable.
-.TP 4
-.B quote_signatures
+.TP
+.B Quote signatures (quote_signatures)
 If ON quote signatures, too.
-.TP 4
-.B reread_active_file_secs
+.TP
+.B Interval in secs to reread active (reread_active_file_secs)
 The news active file is reread at regular intervals to show if any new news
-has arrived. Default is 1200.
-.TP 4
-.B save_to_mmdf_mailbox
+has arrived. Default is 1200. Setting this to 0 will disable this feature.
+.TP
+.B Save mail in MMDF style (save_to_mmdf_mailbox)
 Allows articles to be saved to a MMDF style mailbox instead of mbox format.
 Default is OFF unless reading news on SCO Unix which uses MMDF by default.
-.TP 4
-.B show_author
-Part of from field to display 0) none 1) address 2) full name 3) both.
-Default is 2.
-.TP 4
-.B show_description
-If ON show group description text after newsgroup name at group selection
-level. Default is ON.
-.TP 4
-.B show_last_line_prev_page
+.TP
+.B In group menu, show author by (show_author)
+If set 'None' (0) only the ``Subject:'' line will be displayed.
+If set 'Addr' (1) ``Subject:'' line & the address part of the ``From:'' line are displayed.
+If set 'Name' (2) ``Subject:'' line & the authors full name part of the ``From:'' line are displayed.
+If set 'Both' (3) ``Subject:'' line & all of the ``From:'' lin are displayed.
+Default is 2, authors full.
+.TP
+.B Show description of each newsgroup (show_description)
+If ON show a short group description text after newsgroup name at
+the group selection level. The ``\fB-d\fR'' commandline flag will override
+the setting and trun descriptions off.
+The text used is taken from the \fI$NEWSLIBDIR/newsgroups\fP file.
+Default is ON.
+.TP
+.B Show last line of previous page (show_last_line_prev_page)
 The last line of the previous page will be displayed as the first line of
 next page. Default is OFF.
-.TP 4
-.B show_lines
+.TP
+.B Show no. of lines in thread listing (show_lines)
 Show number of lines of first unread article in thread listing (ON/OFF).
-.TP 4
-.B show_only_unread
-If ON show only new/unread articles otherwise show all. Default is ON.
-.TP 4
-.B show_only_unread_groups
+.TP
+.B Show only unread articles (show_only_unread)
+If ON show only new/unread articles otherwise show all articles.
+Default is ON.
+.TP
+.B Show only groups with unread arts (show_only_unread_groups)
 If ON show only subscribed to groups that contain unread articles.
 Default is OFF.
-.TP 4
-.B show_signatures
+.TP
+.B Display signatures (show_signatures)
 If OFF don't show signatures when displaying articles.
-.TP 4
-.B show_xcommentto
+.TP
+.B Display X-Comment-To: header (show_xcommentto)
 If ON, the real name in the ``X-Comment-To:'' header is displayed in the
 upper-right corner. Default is OFF.
-.TP 4
-.B sigdashes
+.TP
+.B Prepend signature with "-- " (sigdashes)
 If ON prepend the signature with dashes '\n-- \n'. Default is ON.
-.TP 4
-.B signature_repost
+.TP
+.B Add signature when reposting (signature_repost)
 If ON add signature to reposted articles.
-.TP 4
-.B sort_article_type
-Sort articles by 0=(nothing) 1=(Subject descend) 2=(Subject ascend)
-3=(From descend) 4=(From ascend) 5=(Date descend) 6=(Date ascend)
-7=(Score descend) 8=(Score ascend).
-Default is 6.
-.TP 4
-.B space_goto_next_unread
+.TP
+.B Sort articles by (sort_article_type)
+This specifies how articles should be sorted. The following sort
+types are allowed:
+.in +.5i
+.ti -\w'\(em'u
+\(emdon't sort articles (none=0).
+.ti -\w'\(em'u
+\(emsort articles by `Subject:'' field (descending=1 & ascending=2).
+.ti -\w'\(em'u
+\(emsort articles by `From:'' field (descending=3 & ascending=4).
+.ti -\w'\(em'u
+\(emsort articles by `Date:'' field (descending=5 & ascending=6).
+.ti -\w'\(em'u
+\(emsort articles by filtering score (descending=7 & ascending=8).
+.in -.5i
+Sort by ascending Date (6) is the default.
+.TP
+.B Space goes to next unread article (space_goto_next_unread)
 If ON the SPACE command will goto next unread article at article viewer
 level when the end of the article is reached (rn-style pager)
-.TP 4
-.B start_editor_offset
-If ON editor will be started with cursor offset into the file otherwise the
-cursor will be positioned at the first line. Default is ON.
-.TP 4
-.B strip_blanks
+.TP
+.B Start editor with line offset (start_editor_offset)
+Set ON if the editor used for posting, follow-ups and bug reports has
+the capability of starting and positioning the cursor at a specified line
+within a file. Default is ON.
+.TP
+.B Strip blanks of end of lines (strip_blanks)
 Strips the blanks from the end of each line therefore speeding up the display
 when reading on a slow terminal or via modem. Default is ON.
-.TP 4
-.B strip_bogus
+.TP
+.B Remove bogus groups from newsrc (strip_bogus)
 Bogus groups are groups that are present in your \fI.newsrc\fP file that
 no longer exist on the news server. There are 3 options. 0 means do
 nothing & always keep bogus groups. 1 means bogus groups will be
 permanently removed. 2 means that bogus groups will appear on the Group
 Selection Menu, prefixed with a 'D'. This allows you to unsubscribe
 from them as and when you wish. Default is 0 (Always Keep).
-.TP 4
-.B strip_newsrc
+.TP
+.B No unsubscribed groups in newsrc (strip_newsrc)
 If ON, then unsubscribed groups will be permanently removed from
 your \fI.newsrc\fP file. Default is OFF.
-.TP 4
-.B tab_after_X_selection
+.TP
+.B Do tab after X automatically (tab_after_X_selection)
 If enabled will automatically goto the first unread article after having
 selected all hot articles and threads with the `X' command at group index
 level. Default is OFF.
-.TP 4
-.B tab_goto_next_unread
+.TP
+.B Tab goes to next unread article (tab_goto_next_unread)
 If enabled pressing <TAB> at the article viewer level will goto the next
 unread article immediately instead of first paging through the current
 one. Default is ON.
-.TP 4
-.B thread_articles
+.TP
+.B Thread articles by (thread_articles)
+.\" FIXME - this looks ugly
 Thread articles by 0=(nothing) 1=(Subject) 2=(References) 3=(Both)
 Default is 3, thread by references and subject.
-.TP 4
-.B thread_catchup_on_exit
+It's also possible to set the threading type on a per group basis by setting
+the group attribute variable 'thread_arts' to 0 - 3 in the file
+\fI$HOME/.tin/attributes\fP. (See also GROUP ATTRIBUTES)
+.TP
+.B Catchup thread by using left key (thread_catchup_on_exit)
 If ON catchup group/thread when leaving with the left arrow key.
 Default is ON.
-.TP 4
-.B unlink_article
+.TP
+.B Remove ~/.article after posting (unlink_article)
 If ON remove \fI~/.article\fP after posting. Default is ON.
-.TP 4
-.B use_builtin_inews
+.TP
+.B Use builtin inews (use_builtin_inews)
 Allows the builtin NNTP inews to be enabled/disabled. This has no effect
 when reading/posting direct to local spool where external \fBinews\fR(1)
 will always be used. Default is ON (enabled).
-.TP 4
-.B use_color
+.TP
+.B Use ANSI color (use_color)
 If enabled \fBtin\fR uses ANSI-colors. Default is OFF.
-.TP 4
-.B use_mailreader_i
+.TP
+.B Use interactive mail reader (use_mailreader_i)
 Interactive mailreader: if ON mailreader will be invoked earlier for
 reply so you can use more of its features (eg. MIME, pgp, ...)
 this option has to suit \fBdefault_mailer_format\fR
-.TP 4
-.B use_metamail
+.TP
+.B Use metamail upon MIME articles (use_metamail)
 If ON metamail can/will be used to display MIME articles. Default is ON.
-.TP 4
-.B use_mouse
+.TP
+.B Use mouse in xterm (use_mouse)
 Allows the mouse key support in a \fBxterm\fR(1x) to be enabled/disabled.
 Default is OFF.
-.TP 4
-.B wildcard
+.TP
+.B Wildcard matching (wildcard)
 Allows you to select how \fBtin\fR matches strings. The default is 0 and
 uses the wildmat notation, which is how this has traditionally been handled.
 Setting this to 1 allows you to use full POSIX regular expressions. You
 will probably want to update your filter file if you use this regularly.
 NB: Newsgroup names will always be matched using the wildmat notation.
-.TP 4
-.B word_h_display_marks
+.TP
+.B What to display instead of mark (word_h_display_marks)
 Should the leading and ending stars and dashes also be displayed,
 even when they are highlighting marks?
 0 - no    1 - yes, display mark    2 - print a space instead
-.TP 4
-.B word_highlight
-Enable word highlighting?
-.TP 4
-.B xpost_quote_format
+.TP
+.B Word highlighting in message body (word_highlight)
+Enable word highlighting. See word_h_display_marks for the options
+available is this is enabled.
+.TP
+.B Quote line when cross-posting (xpost_quote_format)
 Format is the same as for \fBnews_quote_format\fR, this is used when
 answering to a crossposting to several groups with no ``Followup-To:'' set
 .\"
@@ -1815,7 +1801,8 @@
 attributes are specified for that group. All attributes are set to a
 reasonable default so you only have to specify the attribute that you want
 to change (i.e., savedir). All toggle attributes are set by specifying
-ON/OFF. The following group attributes are available:
+ON/OFF. Otherwise, these function exactly the same as their global
+equivalents. The following group attributes are available:
 .TP 4
 \fBscope
 .TP
@@ -1848,24 +1835,12 @@
 .B show_only_unread
 .TP
 .B thread_arts
-The \fBthread_arts\fR attribute is specified by a number from the following
-range: 0=none, 1=subject, 2=references.
 .TP
 .B show_author
-The \fBshow_author\fR attribute is specified by a number from the following
-range: 0=none, 1=username, 2=network address, 3=both.
 .TP
 .B sort_art_type
-The \fBsort_art_type\fR attribute is specified by a number from the following
-range: 0=none, 1=subject descending, 2=subject ascending, 3=from descending,
-4=from ascending, 5=date descending, 6=date ascending.
 .TP
 .B post_proc_type
-The \fBpost_proc_type\fR attribute is specified by a number from the
-following range: 0=none, 1=unshar, 2=uudecode, 3=uudecode & list zoo
-archive, 4=uudecode & extract zoo archive, 5=uudecode & list zip archive,
-6=uudecode & extract zip archive. (note: if running on AmigaOS the zoo
-options are replaced by there corresponding lha archiver options).
 .TP
 .B mailing_list
 .TP
@@ -2023,8 +1998,8 @@
 .fi
 .RE
 The quoted text section of an article is marked by a preceding quote string
-at the beginning of each quoted line. The default quote string is set to
-'>_'. The default can be changed by setting the tinrc variable 'quote_chars'
+at the beginning of each quoted line. The default quote string is set
+to '>_'. The default can be changed by setting the tinrc variable 'quote_chars'
 to ones own preference.  (note that '_' underline is used to represent a
 space).
 .\"
@@ -2054,8 +2029,8 @@
 .PP
 When saving articles you can specify whether the saved files should be
 post processed (i.e., \fBunshar\fR(1) shell archive, \fBuudecode\fR(1)
-multiple parts etc). A default process type can be set by the
-'Process type:' in the `M' options menu.
+multiple parts etc). A default process type can be set by the 'Process type:'
+in the `M' options menu.
 .\"
 .\"
 .SH "AUTOMATIC MAILING AND SAVING NEW NEWS"
@@ -2075,17 +2050,26 @@
 .PP
 .TP 2i
 .B tin -M iain -c -f newsrc.mail
-(mail any unread articles in newsgroups specified in file newsrc.mail)
+(mail any unread articles in newsgroups specified in file newsrc.mail and
+mark them as read)
 .PP
 .TP 2i
 .B tin -S -c -f newsrc.save
-(save any unread articles in newsgroups specified in file newsrc.save)
+(save any unread articles in newsgroups specified in file newsrc.save and
+mark them as read)
 .PP
 .TP 2i
 .B tin -R
 (read any articles saved by \fBtin -S\fR)
 .\"
 .\"
+.SH RANGES
+A range is simply a group of items marked using the range ('#') key. Certain
+\fBtin\fR commands will operate on a range if one exists rather than
+just the current item. Currently the only commands that understand ranges
+are 'K', 'z' and 'Z' at the Group level.
+.PP
+.\"
 .SH SIGNATURES
 \fBtin\fR will recognize a signature in either \fI$HOME/.signature\fP or
 \fI$HOME/.Sig\fP. If \fI$HOME/.signature\fP exists, then the signature
@@ -2146,6 +2130,9 @@
 .PP
 \fBtin\fR will reread the active file at set intervals to show any newly
 arrived news.
+.PP
+If you find large number of New newsgroups cluttering up your screen,
+pressing 'r' will make them go away.
 .\"
 .\"
 .SH "XTERM BUTTONS"
@@ -2370,6 +2357,7 @@
 This variable has precedence over the default editor (i.e., \fBvi\fR(1)) that
 is used in all editing operations within \fBtin\fR (i.e., posting `w',
 replying `r', follow-ups `f', ...).
+.TP
 .B VISUAL
 If $\fBEDITOR\fP is unset, then this variable is looked up for an default
 editor. If $\fBEDITOR\fP and $\fBVISUAL\fR are both unset, tin will uses the
@@ -2412,78 +2400,81 @@
 .TP 2i
 \fI$HOME/.newsrc\fP
 subscribed to newsgroups.
-.TP 2i
+.TP
 \fI$HOME/.newsauth\fP
 "\fInntpserver\fP \fIpassword\fP [\fIuser\fP]" pairs for NNTP servers
 that require authorization.
-.TP 2i
+.TP
 \fI$HOME/.tin/tinrc\fP
 options.
-.TP 2i
+.TP
 \fI$HOME/.tin/attributes\fP
 contains user specified group attributes.
-.TP 2i
+.TP
 \fI$HOME/.tin/.news\fP
 newsgroups index files directory.
-.TP 2i
+.TP
 \fI$HOME/.tin/.mail\fP
 mailgroups index files directory.
-.TP 2i
+.TP
 \fI$HOME/.tin/.save\fP
 saved newsgroups index files directory.
-.TP 2i
+.TP
 \fI$HOME/.tin/active.mail\fP
 active file of user's mailgroups.
-.TP 2i
+.TP
 \fI$HOME/.tin/active.save\fP
 active file of user's saved newsgroups.
-.TP 2i
+.TP
 \fI$HOME/.tin/bug_address\fP
 address to send bug reports to. See also $\fBBUG_ADDRESS\fR.
-.TP 2i
+.TP
 \fI$HOME/.tin/filter\fP
 filtering file for article killing and auto-selection.
-.TP 2i
+.TP
 \fI$HOME/.tin/group.times\fP
 list of last time all groups were updated (used only by \fBtind\fR index
 daemon).
-.TP 2i
+.TP
 \fI$HOME/.tin/headers\fP
 extra header lines to be added to each article to be posted.
-.TP 2i
+.TP
 \fI$HOME/.tin/posted\fP
 history of articles posted by user.
-.TP 2i
+.TP
 \fI$HOME/.tin/newsrctable\fP
 "\fInntpserver\fP \fInewsrc\fP \fIshortname\fP [...]" pairs to use with ``\fB-g\fR'' command-line
 switch.
-.TP 2i
+.TP
 \fI$HOME/.tin/.inputhistory\fP
 history of last used strings.
-.TP 2i
+.TP
 \fI$HOME/.tin/postponed.articles\fP
 postponed articles from the `o' command, reuse via ``\fB-o\fR''
 command-line switch or via CTRL-O from within tin.
-.TP 2i
+.TP
 \fI$HOME/.signature\fP
 signature. If you are not using use_builtin_inews, \fBinews\fR(1)
 automatically appends this file to your article after composing it (you
 won't see your signature in the $\fBEDITOR\fR). See also section SIGNATURES.
-.TP 2i
+.TP
 \fI$HOME/.Sig\fP
 signature. Same as above, but \fBinews\fR(1) won't include it.
-.TP 2i
+.TP
 \fI$HOME/.sigfixed\fP
 fixed part of a randomly generated signature.
-.TP 2i
+.TP
 \fI/usr/lib/news/active.times\fP
 Contains list of new newsgroups as they are added to the news history file.
-.TP 2i
+.TP
 \fI/usr/lib/news/newsgroups\fP
 Short description of all newsgroups.
-.TP 2i
+.TP
 \fI/usr/lib/news/subscriptions\fP
 List of newsgroups to subscribe first time user to.
+.TP 2i
+\fI/usr/lib/news/tinrc\fP
+Global configuration file.
 .\"
 .\"
 .SH BUGS
@@ -2520,56 +2511,56 @@
 .TP 1.5i
 Rich Skrenta
 author of \fBtass\fR v3.2 which this newsreader used as its base.
-.TP 1.5i
+.TP
 Bill Davidsen
 author of envarg.c environment variable reading routine.
-.TP 1.5i
+.TP
 Mike Gleason
 author of sigfile.c random signature generation routines.
-.TP 1.5i
+.TP
 Paul Kramer
 author of \fBtin\fR v1.2 intro.txt and cmdref.txt beginners documentation.
-.TP 1.5i
+.TP
 Markus Kuhn
 author of charset.c and iso2asc.txt ISO-8859-1 documentation.
-.TP 1.5i
+.TP
 Arnold Robbins
 author of strftime.c date formatting routine.
-.TP 1.5i
+.TP
 Jim Robinson
 co-author of original kill.c article kill and auto-selection routines.
-.TP 1.5i
+.TP
 Rich Salz
 author of wildmat.c pattern matching and parsdate.y date parsing routines.
-.TP 1.5i
+.TP
 Rich Stephan
 for translating the manual page to german.
-.TP 1.5i
+.TP
 Dave Taylor
 author of curses.c from the elm mailreader.
-.TP 1.5i
+.TP
 Chris Thewalt
 author of getline.c \fBemacs\fR style editing routine.
-.TP 1.5i
+.TP
 Mark Tomlinson
 for porting \fBtin\fR to the AmigaOS operating system.
-.TP 1.5i
+.TP
 Andreas Wrede
 for porting \fBtin\fR to the OS/2 operating system.
-.TP 1.5i
+.TP
 Nigel Ellis & Piers Haken
 for porting \fBtin\fR to the Windows/NT operating system.
-.TP 1.5i
+.TP
 Andrew Greer
 for porting \fBtin\fR to the VAX/VMS operating system.
-.TP 1.5i
+.TP
 Steven Madsen
 for adding \fBpgp\fR (Pretty Good Privacy) support.
-.TP 1.5i
+.TP
 Dieter Becker
 for generously posting certain releases for me when my net
 connection was removed by a group of very short sighted people.
-.TP 1.5i
+.TP
 Philip Hazel <ph10@cam.ac.uk>
 for \fBlibpcre\fR (Perl-compatible regular expression library).
 .PP
@@ -2589,12 +2580,12 @@
 Hojland Espinosa, Jason Faultless, Michael Faurot, Werner Fleck, John M.
 Flinchbaugh, Andy Gabor, Torsten Gesang, Callum Gibson, Mike Glendinning,
 Philippe Goujard, Dan Greenspan, Karlo Gross, Carl Hage, Paul Halsema, Ed
-Hanway, Scott Hauck, Per Headland, Arnold Hendriks, Daniel Hermans, Jose
-Herrero, Dave Hill, Tom Hite, Torsten Homeyer, Ulli Horlacher, Keith Howell,
-Tommy Hsieh, Shih-Kun Huang, Steve Hunt, Jeff Hurwitt, Pieter Immelman,
-Jarkko Isokungas, Patrick St. Jean, Hal Jespersen, Park Sang Jin, Robbin
-Johnson, Jarkko Jormanainen, Nelson Kading, Geoffrey Keating, Karsten Keil,
-Fritz Kleeman, Andreas Kies, Janne Kiviluoto, Tomasz Kloczko, Dwarven
+Hanway, Scott Hauck, Christian Haul, Per Headland, Arnold Hendriks, Daniel
+Hermans, Jose Herrero, Dave Hill, Tom Hite, Torsten Homeyer, Ulli Horlacher,
+Keith Howell, Tommy Hsieh, Shih-Kun Huang, Steve Hunt, Jeff Hurwitt, Pieter
+Immelman, Jarkko Isokungas, Patrick St. Jean, Hal Jespersen, Park Sang Jin,
+Robbin Johnson, Jarkko Jormanainen, Nelson Kading, Geoffrey Keating, Karsten
+Keil, Fritz Kleeman, Andreas Kies, Janne Kiviluoto, Tomasz Kloczko, Dwarven
 Knight, Thomas Koenig, Karl-Koenig Koenigsson, Martin Kraemer, Thomas
 Kroener, Kris Kugel, Yuri Kuzmenko, Olivier Lacroix, Geoff Lane, Alex Lange,
 Alain Lasserre, Hannu Laurila, Vincent Lefevre, Alexander Lehmann, Marty
diff -Nur tin-980105/include/extern.h tin-980117/include/extern.h
--- tin-980105/include/extern.h	Mon Jan  5 18:51:27 1998
+++ tin-980117/include/extern.h	Fri Jan 16 12:45:07 1998
@@ -51,7 +51,7 @@
 #ifdef DECL_FFLUSH
 extern int fflush (FILE *);
 #endif
-#ifdef DECL_FGETC 
+#ifdef DECL_FGETC
 extern int fgetc (FILE * stream);
 #endif
 #if defined(DECL_FILENO) && !defined(fileno)
@@ -325,7 +325,6 @@
 extern char msg[LEN];
 extern char msg_headers_file[PATH_LEN];
 extern char my_distribution[LEN];
-extern char new_newnews_host[PATH_LEN];
 extern char newnewsrc[PATH_LEN];
 extern char news_active_file[PATH_LEN];
 extern char news_quote_format[PATH_LEN];
@@ -738,6 +737,8 @@
 extern constext txt_news_quote[];
 extern constext txt_newsgroup[];
 extern constext txt_newsgroup_position[];
+extern constext txt_newsrc_again[];
+extern constext txt_newsrc_nogroups[];
 extern constext txt_newsrc_saved[];
 extern constext txt_next_resp[];
 extern constext txt_nntp_authorization_failed[];
@@ -1014,6 +1015,7 @@
 extern constext txt_tinrc_group_catchup_on_exit[];
 extern constext txt_tinrc_groupname_max_length[];
 extern constext txt_tinrc_header[];
+extern constext txt_tinrc_info_in_last_line[];
 extern constext txt_tinrc_inverse_okay[];
 extern constext txt_tinrc_keep_posted_articles[];
 extern constext txt_tinrc_mail_8bit_header[];
@@ -1227,6 +1229,7 @@
 extern t_bool got_sig_pipe;
 extern t_bool group_catchup_on_exit;
 extern t_bool inverse_okay;
+extern t_bool info_in_last_line;
 extern t_bool keep_dead_articles;	/* keep all dead articles in dead.articles */
 extern t_bool keep_posted_articles;	/* keep all posted articles in ~/Mail/posted */
 extern t_bool mail_8bit_header;
@@ -1278,8 +1281,6 @@
 extern t_bool xover_supported;
 extern t_bool xref_supported;
 
-extern time_t new_newnews_time;
-
 #define HIST_SIZE		15
 #define HIST_OTHER		 0
 #define HIST_ART_SEARCH		 1
@@ -1312,19 +1313,19 @@
 
 /* This fixes ambiguities on platforms that don't distinguish extern case */
 #ifdef CASE_PROBLEM
-#define txt_help_B   txt_help_BIGB
-#define txt_help_D   txt_help_BIGD
-#define txt_help_I   txt_help_BIGI
-#define txt_help_K   txt_help_BIGK
-#define txt_help_L   txt_help_BIGL
-#define txt_help_M   txt_help_BIGM
-#define txt_help_S   txt_help_BIGS
-#define txt_help_T   txt_help_BIGT
-#define txt_help_U   txt_help_BIGU
-#define txt_help_W   txt_help_BIGW
-#define txt_help_X   txt_help_BIGX
-#define txt_help_p_S txt_help_p_BIGS
-#define txt_help_t_K txt_help_t_BIGK
+#define txt_help_B	txt_help_BIGB
+#define txt_help_D	txt_help_BIGD
+#define txt_help_I	txt_help_BIGI
+#define txt_help_K	txt_help_BIGK
+#define txt_help_L	txt_help_BIGL
+#define txt_help_M	txt_help_BIGM
+#define txt_help_S	txt_help_BIGS
+#define txt_help_T	txt_help_BIGT
+#define txt_help_U	txt_help_BIGU
+#define txt_help_W	txt_help_BIGW
+#define txt_help_X	txt_help_BIGX
+#define txt_help_p_S	txt_help_p_BIGS
+#define txt_help_t_K	txt_help_t_BIGK
 #endif
 
 #ifndef DONT_HAVE_PIPING
diff -Nur tin-980105/include/menukeys.h tin-980117/include/menukeys.h
--- tin-980105/include/menukeys.h	Fri Dec 26 03:41:05 1997
+++ tin-980117/include/menukeys.h	Thu Jan  8 15:56:24 1998
@@ -103,7 +103,7 @@
  * ' ','!','$','/','?',
  * 'M',
  * '^',
- * 'b','j','k','q','v'
+ * 'b','i','j','k','q','v'
  * ctrl('B'),ctrl('D'),ctrl('F'),ctrl('N'),ctrl('O'),ctrl('P'),ctrl('U')
  */
 
@@ -121,6 +121,7 @@
 #define iKeyQuitTin 'Q'
 #define iKeyFirstPage '^'
 #define iKeyPageUp3 'b'
+#define iKeyToggleInfoLastLine 'i'
 #define iKeyDown2 'j'
 #define iKeyUp2 'k'
 #define iKeyQuit 'q'
@@ -195,7 +196,6 @@
 #define iKeyGroupToggleSubjDisplay 'd'
 #define iKeyGroupGoto 'g'
 #define iKeyGroupHelp 'h'
-#define iKeyGroupDisplaySubject 'i'
 #define iKeyGroupListThd 'l'
 #define iKeyGroupMail 'm'
 #define iKeyGroupNextGroup 'n'
@@ -272,7 +272,6 @@
 #define iKeyPageFollowupQuote 'f'
 #define iKeyPageFirstPage2 'g'
 #define iKeyPageHelp 'h'
-#define iKeyPageDisplaySubject 'i'
 #define iKeyPageKillArt 'k' /* overrides iKeyUp3 */
 #define iKeyPageMail 'm'
 #define iKeyPageNextArt 'n'
@@ -352,7 +351,6 @@
 #define iKeySelectToggleSubjDisplay 'd'
 #define iKeySelectGoto 'g'
 #define iKeySelectHelp 'h'
-#define iKeySelectDisplayGroupInfo 'i'
 #define iKeySelectMoveGrp 'm'
 #define iKeySelectEnterNextUnreadGrp2 'n'
 #define iKeySelectToggleReadDisplay 'r'
diff -Nur tin-980105/include/proto.h tin-980117/include/proto.h
--- tin-980105/include/proto.h	Mon Jan  5 18:51:55 1998
+++ tin-980117/include/proto.h	Fri Jan 16 12:45:07 1998
@@ -264,6 +264,7 @@
 extern void set_real_uid_gid (void);
 extern void set_tin_uid_gid (void);
 extern void show_inverse_video_status (void);
+extern void strip_address (char *the_address, char *stripped_address);
 extern void strip_double_ngs (char *ngs_list);
 extern void tin_done (int ret);
 extern void toggle_inverse_video (void);
@@ -306,7 +307,7 @@
 extern void thd_mark_read (struct t_group *group, long thread);
 extern void thd_mark_unread (struct t_group *group, long thread);
 extern void vSetDefaultBitmap (struct t_group *group);
-extern void vWriteNewsrc (void);
+extern t_bool vWriteNewsrc (void);
 #ifdef DEBUG_NEWSRC
 	extern void vNewsrcTestHarness (void);
 #endif /* DEBUG_NEWSRC */
@@ -314,7 +315,6 @@
 	extern void art_mark_deleted (struct t_article *art);
 	extern void art_mark_undeleted (struct t_article *art);
 #endif /* !INDEX_DAEMON && HAVE_MH_MAIL_HANDLING */
-
 
 /* nntplib.c */
 extern char *getserverbyfile (const char *file);
diff -Nur tin-980105/include/tin.h tin-980117/include/tin.h
--- tin-980105/include/tin.h	Wed Dec 31 02:22:30 1997
+++ tin-980117/include/tin.h	Fri Jan 16 18:22:55 1998
@@ -106,9 +106,9 @@
 #include <sys/types.h>
 
 #ifdef M_AMIGA
-#include "include:stat.h"      /* FIXME: Problem with AmiTCP-includes, AmiTCP's fstat() needs */
-#else                          /* a running TCP-Stack. OTOH fstat() ist used with local spool */
-#include <sys/stat.h>
+#	include "include:stat.h"	/* FIXME: Problem with AmiTCP-includes, AmiTCP's fstat() needs */
+#else									/* a running TCP-Stack. OTOH fstat() ist used with local spool */
+#	include <sys/stat.h>
 #endif
 
 #ifdef TIME_WITH_SYS_TIME
@@ -216,54 +216,52 @@
  */
 
 #ifdef HAVE_CONFIG_H
-#if HAVE_DIRENT_H
-#	include <dirent.h>
-#	define	DIR_BUF struct dirent
-#	define	D_NAMLEN(p)	(p)->d_reclen
+#	if HAVE_DIRENT_H
+#		include <dirent.h>
+#		define	DIR_BUF struct dirent
+#		define	D_NAMLEN(p)	(p)->d_reclen
+#	else
+#		if HAVE_SYS_DIR_H
+#			include <sys/dir.h>
+#		endif
+#		if HAVE_SYS_NDIR_H
+#			include <sys/ndir.h>
+#		endif
+#		define	DIR_BUF struct direct
+#		define	D_NAMLEN(p)	(p)->d_namlen
+#	endif
 #else
-#	if HAVE_SYS_DIR_H
-#		include <sys/dir.h>
+#	ifdef M_AMIGA
+#		include "amiga.h"
+#		define	DIR_BUF 	struct dirent
+#		define	D_NAMLEN(p)	(p)->d_reclen
+#	endif
+#	ifdef M_OS2
+#		include "os_2.h"
+#		define	DIR_BUF 	struct dirent
+#		define	D_NAMLEN(p)	(p)->d_reclen
+#	endif
+#	ifdef WIN32
+#		include "win32.h"
+#		define	DIR_BUF 	struct direct
+#		define	D_NAMLEN(p)	(p)->d_namlen
 #	endif
-#	if HAVE_SYS_NDIR_H
+#	ifdef M_XENIX
 #		include <sys/ndir.h>
+#		define	DIR_BUF 	struct direct
+#		define	D_NAMLEN(p)	(p)->d_namlen
+#	endif
+#	ifdef VMS
+#		include "ndir.h"
+#		define 	DIR_BUF 	struct direct
+#		define 	D_NAMLEN(p)	(p)->d_namlen
 #	endif
-#	define	DIR_BUF struct direct
-#	define	D_NAMLEN(p)	(p)->d_namlen
-#endif
-
-#else
-
-#ifdef M_AMIGA
-#	include "amiga.h"
-#	define		DIR_BUF 	struct dirent
-#	define		D_NAMLEN(p)	(p)->d_reclen
-#endif
-#ifdef M_OS2
-#	include "os_2.h"
-#	define		DIR_BUF 	struct dirent
-#	define		D_NAMLEN(p)	(p)->d_reclen
-#endif
-#ifdef WIN32
-#	include "win32.h"
-#	define		DIR_BUF 	struct direct
-#	define		D_NAMLEN(p)	(p)->d_namlen
-#endif
-#ifdef M_XENIX
-#	include <sys/ndir.h>
-#	define		DIR_BUF 	struct direct
-#	define		D_NAMLEN(p)	(p)->d_namlen
-#endif
-#ifdef VMS
-#include "ndir.h"
-#define 	DIR_BUF 	struct direct
-#define 	D_NAMLEN(p)	(p)->d_namlen
-#endif
 #endif	/* !HAVE_CONFIG_H */
 
 #ifndef DIR_BUF
 #	include <dirent.h>
-#	define		DIR_BUF 	struct dirent
-#	define		D_NAMLEN(p)	(p)->d_reclen
+#	define	DIR_BUF 	struct dirent
+#	define	D_NAMLEN(p)	(p)->d_reclen
 #endif
 
 #ifndef HAVE_UNLINK
@@ -306,7 +304,7 @@
 /*
  * Maximum time (seconds) for a VT terminal escape sequence
  */
-#define VT_ESCAPE_TIMEOUT        1
+#define VT_ESCAPE_TIMEOUT	1
 
 /*
  * Index file daemon version of tin. Will create/update index files from cron
@@ -331,43 +329,42 @@
  */
 
 #ifndef HAVE_CONFIG_H
-#ifndef NNTP_ONLY
-#	ifndef SPOOLDIR
-#		ifdef VMS
-#			define	SPOOLDIR	"NEWSSPOOL:[000000]"
-#		else
-#			define	SPOOLDIR	"/usr/spool/news"
-#		endif /* VMS */
-#	endif /* !SPOOLDIR */
-#	ifndef NEWSLIBDIR
-#		ifdef VMS
-#			define	NEWSLIBDIR	"NEWSLIB:[000000]"
-#		else
-#			ifdef M_AMIGA
-#				define	NEWSLIBDIR	"uulib:"
+#	ifndef NNTP_ONLY
+#		ifndef SPOOLDIR
+#			ifdef VMS
+#				define	SPOOLDIR	"NEWSSPOOL:[000000]"
 #			else
-#				define	NEWSLIBDIR	"/usr/lib/news"
-#			endif /* M_AMIGA */
-#		endif /* VMS */
-#	endif /* !NEWSLIBDIR */
-#	ifndef NOVROOTDIR
-#		define	NOVROOTDIR	SPOOLDIR
-#	endif /* !NOVROOTDIR */
-#	ifndef INEWSDIR
-#		define	INEWSDIR	NEWSLIBDIR
-#	endif /* INEWSDIR */
-#else
-#	undef	SPOOLDIR
-#	undef	NEWSLIBDIR
-#	undef	NOVROOTDIR
-#endif /* !NNTP_ONLY */
+#				define	SPOOLDIR	"/usr/spool/news"
+#			endif /* VMS */
+#		endif /* !SPOOLDIR */
+#		ifndef NEWSLIBDIR
+#			ifdef VMS
+#				define	NEWSLIBDIR	"NEWSLIB:[000000]"
+#			else
+#				ifdef M_AMIGA
+#					define	NEWSLIBDIR	"uulib:"
+#				else
+#					define	NEWSLIBDIR	"/usr/lib/news"
+#				endif /* M_AMIGA */
+#			endif /* VMS */
+#		endif /* !NEWSLIBDIR */
+#		ifndef NOVROOTDIR
+#			define	NOVROOTDIR	SPOOLDIR
+#		endif /* !NOVROOTDIR */
+#		ifndef INEWSDIR
+#			define	INEWSDIR	NEWSLIBDIR
+#		endif /* INEWSDIR */
+#	else
+#		undef	SPOOLDIR
+#		undef	NEWSLIBDIR
+#		undef	NOVROOTDIR
+#	endif /* !NNTP_ONLY */
 #endif /* !HAVE_CONFIG_H */
 
 /*
  * Determine machine configuration for external programs & directories
  */
 #if defined(BSD) && !defined(M_AMIGA)
-
 /*
  * To catch 4.3 Net2 code base or newer
  * (e.g. FreeBSD 1.x, 4.3/Reno, NetBSD 0.9, 386BSD, BSD/386 1.1 and below).
@@ -380,38 +377,35 @@
  * #if (defined(BSD) && (BSD >= 199306))
  *
  * (defined in <sys/param.h>)
- *
  */
-
 #	ifndef HAVE_MEMCMP
-#		define		memcmp(s1, s2, n)	bcmp(s2, s1, n)
+#		define	memcmp(s1, s2, n)	bcmp(s2, s1, n)
 #	endif
 #	ifndef HAVE_MEMCPY
-#		define		memcpy(s1, s2, n)	bcopy(s2, s1, n)
+#		define	memcpy(s1, s2, n)	bcopy(s2, s1, n)
 #	endif
 #	ifndef HAVE_MEMSET
-#		define		memset(s1, s2, n)	bfill(s1, n, s2)
+#		define	memset(s1, s2, n)	bfill(s1, n, s2)
 #	endif
 #	ifndef HAVE_STRCHR
-#		define		strchr(str, ch) 	index(str, ch)
-#		define		strrchr(str, ch)	rindex(str, ch)
+#		define	strchr(str, ch) 	index(str, ch)
+#		define	strrchr(str, ch)	rindex(str, ch)
 #	endif
-#	define		DEFAULT_SHELL		"/bin/csh"
+#	define	DEFAULT_SHELL	"/bin/csh"
 #	if defined(__386BSD__) || defined(__bsdi__) || defined(__NetBSD__) || defined(__FreeBSD__)
-#		define	DEFAULT_PRINTER "/usr/bin/lpr"
+#		define	DEFAULT_PRINTER	"/usr/bin/lpr"
 #		define	DEFAULT_MAILER	"/usr/sbin/sendmail"
-#		define	DEFAULT_MAILBOX "/var/mail"
-#		define	DEFAULT_SUM		"/usr/bin/cksum -o 1 <"
-		/* < above, otherwise get filename output too */
+#		define	DEFAULT_MAILBOX	"/var/mail"
+#		define	DEFAULT_SUM	"/usr/bin/cksum -o 1 <" /* use tailing <, otherwise get filename output too */
 #	else
 #		ifndef DEFAULT_EDITOR
 #			define	DEFAULT_EDITOR	"/usr/ucb/vi"
 #		endif
-#		define	DEFAULT_PRINTER "/usr/ucb/lpr"
-#		define	DEFAULT_SUM		"sum"
+#		define	DEFAULT_PRINTER	"/usr/ucb/lpr"
+#		define	DEFAULT_SUM	"sum"
 #	endif
 #	ifdef DGUX
-#		define	DEFAULT_MAILBOX "/usr/mail"
+#		define	DEFAULT_MAILBOX	"/usr/mail"
 #		define	USE_INVERSE_HACK
 #	endif
 #	ifdef pyr
@@ -428,50 +422,50 @@
 #	endif
 #	ifdef M_AMIGA
 #		ifndef DEFAULT_EDITOR
-#			define	DEFAULT_EDITOR		"c:ed"
+#			define	DEFAULT_EDITOR	"c:ed"
 #		endif
-#		define	DEFAULT_MAILBOX 	"uumail:"
-#		define	DEFAULT_MAILER		"uucp:c/sendmail"
-#		define	DEFAULT_POSTER		"uucp:c/postnews %s"
-#		define	DEFAULT_PRINTER 	"c:copy to PRT:"
+#		define	DEFAULT_MAILBOX	"uumail:"
+#		define	DEFAULT_MAILER	"uucp:c/sendmail"
+#		define	DEFAULT_POSTER	"uucp:c/postnews %s"
+#		define	DEFAULT_PRINTER	"c:copy to PRT:"
 #		define	DEFAULT_BBS_PRINTER	"c:copy to NIL:"
-#		define	DEFAULT_SHELL		"c:newshell"	/* Not Yet Implemented */
+#		define	DEFAULT_SHELL	"c:newshell"	/* Not Yet Implemented */
 #		define	DEFAULT_UUDECODE	"uudecode %s"
-#		define	DEFAULT_UNSHAR		"unshar %s"
+#		define	DEFAULT_UNSHAR	"unshar %s"
 #	endif
 #	ifdef VMS
-#		define	DEFAULT_EDITOR		"EDIT/TPU"
-#		define	DEFAULT_MAILBOX 	"SYS$LOGIN:"
-#		define	DEFAULT_MAILER		"MAIL"
-#		define	MAILER_FORMAT		"MAIL /SUBJECT=\"%S\" %F \"IN%%\"\"%T\"\""
-#		define	DEFAULT_POSTER		"inews %s"
-#		define	DEFAULT_PRINTER 	"PRINT/DELETE"
+#		define	DEFAULT_EDITOR	"EDIT/TPU"
+#		define	DEFAULT_MAILBOX	"SYS$LOGIN:"
+#		define	DEFAULT_MAILER	"MAIL"
+#		define	MAILER_FORMAT	"MAIL /SUBJECT=\"%S\" %F \"IN%%\"\"%T\"\""
+#		define	DEFAULT_POSTER	"inews %s"
+#		define	DEFAULT_PRINTER	"PRINT/DELETE"
 #		define	DEFAULT_UUDECODE	"uudecode %s"
-#		define	DEFAULT_UNSHAR		"unshar %s"
+#		define	DEFAULT_UNSHAR	"unshar %s"
 #	endif
 #	ifdef M_OS2
 #		ifndef DEFAULT_EDITOR
-#			define	DEFAULT_EDITOR		"epm /m"
+#			define	DEFAULT_EDITOR	"epm /m"
 #		endif
-#		define	DEFAULT_MAILBOX 	"/mail"
-#		define	DEFAULT_MAILER		"sendmail -af %s -f %s %s"
-#		define	DEFAULT_POSTER		"postnews %s"
-#		define	DEFAULT_PRINTER 	"lpt1"
-#		define	DEFAULT_SHELL		"cmd.exe"
+#		define	DEFAULT_MAILBOX	"/mail"
+#		define	DEFAULT_MAILER	"sendmail -af %s -f %s %s"
+#		define	DEFAULT_POSTER	"postnews %s"
+#		define	DEFAULT_PRINTER	"lpt1"
+#		define	DEFAULT_SHELL	"cmd.exe"
 #		define	DEFAULT_UUDECODE	"uudecode %s"
-#		define	DEFAULT_UNSHAR		"unshar %s"
+#		define	DEFAULT_UNSHAR	"unshar %s"
 #	endif
 #	ifdef WIN32
 #		ifndef DEFAULT_EDITOR
-#			define	DEFAULT_EDITOR		"vi"
+#			define	DEFAULT_EDITOR	"vi"
 #		endif
-#		define	DEFAULT_MAILBOX 	"/mail"
-#		define	DEFAULT_MAILER		"sendmail"
-#		define	DEFAULT_POSTER		"postnews %s"
-#		define	DEFAULT_PRINTER 	"lpt1"
-#		define	DEFAULT_SHELL		"cmd.exe"
+#		define	DEFAULT_MAILBOX	"/mail"
+#		define	DEFAULT_MAILER	"sendmail"
+#		define	DEFAULT_POSTER	"postnews %s"
+#		define	DEFAULT_PRINTER	"lpt1"
+#		define	DEFAULT_SHELL	"cmd.exe"
 #		define	DEFAULT_UUDECODE	"uudecode %s"
-#		define	DEFAULT_UNSHAR		"unshar %s"
+#		define	DEFAULT_UNSHAR	"unshar %s"
 #	endif
 #	ifdef M_XENIX
 #		ifndef DEFAULT_EDITOR
@@ -481,18 +475,18 @@
 #	endif
 #	ifdef QNX42
 #		ifndef DEFAULT_EDITOR
-#			define	DEFAULT_EDITOR		"/bin/vedit"
+#			define	DEFAULT_EDITOR	"/bin/vedit"
 #		endif
 #	endif
 #	ifdef _AIX
-#		define	DEFAULT_PRINTER "/bin/lp"
+#		define	DEFAULT_PRINTER	"/bin/lp"
 #		define	READ_CHAR_HACK
 #	endif
 #	ifdef SCO_UNIX
 #		define	HAVE_MMDF_MAILER
 #	endif
 #	ifdef sinix
-#		define	DEFAULT_PRINTER "/bin/lpr"
+#		define	DEFAULT_PRINTER	"/bin/lpr"
 #	endif
 #	ifdef sysV68
 #		define	DEFAULT_MAILER	"/bin/rmail"
@@ -514,16 +508,16 @@
 #		define	DEFAULT_SHELL	"/bin/sh"
 #	endif
 #	ifndef DEFAULT_MAILBOX
-#		define	DEFAULT_MAILBOX "/usr/mail"
+#		define	DEFAULT_MAILBOX	"/usr/mail"
 #	endif
 #	ifndef DEFAULT_MAILER
 #		define	DEFAULT_MAILER	"/usr/lib/sendmail"
 #	endif
 #	ifndef DEFAULT_PRINTER
-#		define	DEFAULT_PRINTER "/usr/bin/lp"
+#		define	DEFAULT_PRINTER	"/usr/bin/lp"
 #	endif
 #	ifndef PATH_SUM
-#		define		DEFAULT_SUM		"sum -r"
+#		define	DEFAULT_SUM	"sum -r"
 #	endif
 #endif /* BSD */
 
@@ -531,13 +525,13 @@
  * fallback values
  */
 #ifndef DEFAULT_EDITOR
-#	define	DEFAULT_EDITOR		"/usr/bin/vi"
+#	define	DEFAULT_EDITOR	"/usr/bin/vi"
 #endif
 #ifndef DEFAULT_MAILER
-#	define	DEFAULT_MAILER		"/usr/lib/sendmail"
+#	define	DEFAULT_MAILER	"/usr/lib/sendmail"
 #endif
 #ifndef DEFAULT_MAILBOX
-#	define	DEFAULT_MAILBOX		"/usr/spool/mail"
+#	define	DEFAULT_MAILBOX	"/usr/spool/mail"
 #endif
 
 
@@ -546,7 +540,7 @@
  * Miscellaneous program-paths
  */
 #ifndef PATH_ISPELL
-#	define	PATH_ISPELL		"ispell"
+#	define	PATH_ISPELL	"ispell"
 #endif
 
 #ifndef PATH_METAMAIL
@@ -564,11 +558,11 @@
 #endif
 
 #ifdef HAVE_LONG_FILE_NAMES
-#	define		LONG_PATH_PART	"part"
-#	define		LONG_PATH_PATCH "patch"
+#	define	LONG_PATH_PART	"part"
+#	define	LONG_PATH_PATCH	"patch"
 #else
-#	define		LONG_PATH_PART	""
-#	define		LONG_PATH_PATCH "p"
+#	define	LONG_PATH_PART	""
+#	define	LONG_PATH_PATCH	"p"
 #endif
 
 /*
@@ -598,45 +592,46 @@
 #define	DEFAULT_NEWNEWS_NUM	5
 
 #ifdef VMS
-#define 	RCDIR			"TIN"
-#define 	INDEX_MAILDIR		"MAILIDX"
-#define 	INDEX_NEWSDIR		"INDEX"
-#define 	INDEX_SAVEDIR		"SAVE"
-#else
-#define 	RCDIR			".tin"
-#define 	INDEX_MAILDIR		".mail"
-#define 	INDEX_NEWSDIR		".news"
-#define 	INDEX_SAVEDIR		".save"
-#endif
-#define 	ACTIVE_FILE		"active"
-#define 	ACTIVE_MAIL_FILE	"active.mail"
-#define 	ACTIVE_SAVE_FILE	"active.save"
-#define 	ACTIVE_TIMES_FILE	"active.times"
-#define 	ATTRIBUTES_FILE 	"attributes"
-#define 	CONFIG_FILE		"tinrc"
-#define 	FILTER_FILE		"filter"
-#define 	GROUP_TIMES_FILE	"group.times"
-#define 	POSTED_FILE		"posted"
-#define 	POSTPONED_FILE		"postponed.articles"
-#define 	DEFAULT_MAILDIR 	"Mail"
-#define 	DEFAULT_SAVEDIR 	"News"
-#define 	INPUT_HISTORY_FILE	".inputhistory"
-#define 	MAILGROUPS_FILE 	"mailgroups"
-#define 	MSG_HEADERS_FILE	"headers"
-#define 	NEWSRC_FILE		".newsrc"
-#define 	NEWSRCTABLE_FILE	"newsrctable"
+#	define	RCDIR	"TIN"
+#	define	INDEX_MAILDIR	"MAILIDX"
+#	define	INDEX_NEWSDIR	"INDEX"
+#	define	INDEX_SAVEDIR	"SAVE"
+#else
+#	define	RCDIR	".tin"
+#	define	INDEX_MAILDIR	".mail"
+#	define	INDEX_NEWSDIR	".news"
+#	define	INDEX_SAVEDIR	".save"
+#endif
+
+#define	ACTIVE_FILE	"active"
+#define	ACTIVE_MAIL_FILE	"active.mail"
+#define	ACTIVE_SAVE_FILE	"active.save"
+#define	ACTIVE_TIMES_FILE	"active.times"
+#define	ATTRIBUTES_FILE	"attributes"
+#define	CONFIG_FILE	"tinrc"
+#define	DEFAULT_MAILDIR	"Mail"
+#define	DEFAULT_SAVEDIR	"News"
+#define	FILTER_FILE	"filter"
+#define	GROUP_TIMES_FILE	"group.times"
+#define	INPUT_HISTORY_FILE	".inputhistory"
+#define	MAILGROUPS_FILE	"mailgroups"
+#define	MSG_HEADERS_FILE	"headers"
+#define	NEWSRC_FILE	".newsrc"
+#define	NEWSRCTABLE_FILE	"newsrctable"
 /* ifdef APPEND_PID (default) NEWNEWSRC_FILE will be .newnewsrc<pid> */
-#define 	NEWNEWSRC_FILE		".newnewsrc"
-#define 	OLDNEWSRC_FILE		".oldnewsrc"
-#ifndef 	OVERVIEW_FILE
-#define 	OVERVIEW_FILE		".overview"
-#endif
-#define 	OVERVIEW_FMT		"overview.fmt"
-#define 	SUBSCRIPTIONS_FILE	"subscriptions"
-
-#define 	_CONF_FROMHOST		"fromhost"
-#define 	_CONF_ORGANIZATION	"organization"
-#define 	_CONF_SERVER		"server"
+#define	NEWNEWSRC_FILE	".newnewsrc"
+#define	OLDNEWSRC_FILE	".oldnewsrc"
+#ifndef	OVERVIEW_FILE
+#	define	OVERVIEW_FILE	".overview"
+#endif
+#define	OVERVIEW_FMT	"overview.fmt"
+#define	POSTED_FILE	"posted"
+#define	POSTPONED_FILE	"postponed.articles"
+#define	SUBSCRIPTIONS_FILE	"subscriptions"
+
+#define	_CONF_FROMHOST	"fromhost"
+#define	_CONF_ORGANIZATION	"organization"
+#define	_CONF_SERVER	"server"
 
 #ifndef TRUE
 #	define	TRUE	1
@@ -665,45 +660,45 @@
 #endif
 
 /* safe strcpy into fixed-legth buffer */
-#define STRCPY(dst, src)	(dst[sizeof(dst) - 1] = 0, strncpy(dst, src, sizeof(dst) -1))
+#define	STRCPY(dst, src)	(dst[sizeof(dst) - 1] = 0, strncpy(dst, src, sizeof(dst) -1))
 
-#define STRCMPEQ(s1, s2)		(*(s1) == *(s2) && strcmp((s1), (s2)) == 0)
-#define STRNCMPEQ(s1, s2, n)		(*(s1) == *(s2) && strncmp((s1), (s2), n) == 0)
-#define STRNCASECMPEQ(s1, s2, n)	(strncasecmp((s1), (s2), n) == 0)
+#define	STRCMPEQ(s1, s2)	(*(s1) == *(s2) && strcmp((s1), (s2)) == 0)
+#define	STRNCMPEQ(s1, s2, n)	(*(s1) == *(s2) && strncmp((s1), (s2), n) == 0)
+#define	STRNCASECMPEQ(s1, s2, n)	(strncasecmp((s1), (s2), n) == 0)
 
 
 #if defined(VMS) || defined(M_AMIGA)
-#	define	LEN			512
-#	define	PATH_LEN		256
+#	define	LEN	512
+#	define	PATH_LEN	256
 #endif
 #if defined(M_OS2) || defined(M_UNIX)
 #	ifndef MAXPATHLEN
-#		define MAXPATHLEN 	256
+#		define MAXPATHLEN	256
 #	endif
-#	define	PATH_LEN		MAXPATHLEN
-#	define	LEN			1024
+#	define	LEN	1024
+#	define	PATH_LEN	MAXPATHLEN
 #endif
 #if defined(WIN32)
-#	define	PATH_LEN		MAX_PATH
-#	define	LEN			1024
+#	define	LEN	1024
+#	define	PATH_LEN	MAX_PATH
 #endif
-#define		NEWSRC_LINE		8192
 
-#define MAXLINELEN 1024
+#define	NEWSRC_LINE	8192
+#define	MAXLINELEN	1024
 
 #ifdef HAVE_MAIL_HANDLER	/* what is that? */
-#	define	HEADER_LEN		2048
+#	define	HEADER_LEN	2048
 #else
-#	define	HEADER_LEN		1024
+#	define	HEADER_LEN	1024
 #endif
 
-#define 	MODULO_COUNT_NUM	50
-#define 	TABLE_SIZE		1409
-#define 	MAX_PAGES		2000	/* maximum article pages */
+#define	MODULO_COUNT_NUM	50
+#define	TABLE_SIZE	1409
+#define	MAX_PAGES	2000	/* maximum article pages */
 /* when prompting for subject, display no more than 20 characters */
-#define 	DISPLAY_SUBJECT_LEN	20
+#define	DISPLAY_SUBJECT_LEN	20
 
-#define 	ctrl(c) 		((c) & 0x1F)
+#define	ctrl(c)	((c) & 0x1F)
 
 #ifndef DEFAULT_ISO2ASC
 #	define	DEFAULT_ISO2ASC	"-1 "	/* ISO -> Ascii charset conversion */
@@ -739,11 +734,11 @@
 
 #define	SELECT_MISC_COLS	21
 #ifdef USE_INVERSE_HACK
-#	define		BLANK_GROUP_COLS	2
-#	define		BLANK_PAGE_COLS 	2
+#	define	BLANK_GROUP_COLS	2
+#	define	BLANK_PAGE_COLS 	2
 #else
-#	define		BLANK_GROUP_COLS	0
-#	define		BLANK_PAGE_COLS 	0
+#	define	BLANK_GROUP_COLS	0
+#	define	BLANK_PAGE_COLS 	0
 #endif
 
 /*
@@ -765,15 +760,15 @@
 /*
  * Maximum permissible colour number
  */
-#define		MAX_COLOR	15
-#define		MAX_BACKCOLOR	7
+#define	MAX_COLOR	15
+#define	MAX_BACKCOLOR	7
 
 /*
  * Maximal permissible word mark type
  */
-#define		MAX_MARK		2
+#define	MAX_MARK		2
 
-#define		INDEX_TOP	2
+#define	INDEX_TOP	2
 
 #define	GROUP_MATCH(s1, pat, case)		(wildmat (s1, pat, case))
 
@@ -800,8 +795,8 @@
  * Some informational message are only shown if we're running in
  * the background or some other non-curses mode
  */
-#define INTERACTIVE		(!batch_mode || update_fork)
-#define INTERACTIVE2	((cmd_line && !(batch_mode || verbose)) || (batch_mode && update_fork))
+#define	INTERACTIVE	(!batch_mode || update_fork)
+#define	INTERACTIVE2	((cmd_line && !(batch_mode || verbose)) || (batch_mode && update_fork))
 
 /*
  * News/Mail group types
@@ -816,32 +811,32 @@
  */
 
 #ifdef WIN32
-#define	KEYMAP_UNKNOWN		0
-#define	KEYMAP_UP		0xA6
-#define	KEYMAP_DOWN		0xA8
-#define	KEYMAP_LEFT		0xA5
-#define	KEYMAP_RIGHT		0xA7
-#define	KEYMAP_PAGE_UP		0xA1
-#define	KEYMAP_PAGE_DOWN	0xA2
-#define	KEYMAP_HOME		0xA4
-#define	KEYMAP_END		0xA3
-#define	KEYMAP_DEL		0
-#define	KEYMAP_INS		0
-#define	KEYMAP_MOUSE		0
-#else
-#define	KEYMAP_UNKNOWN		0
-#define	KEYMAP_UP		1
-#define	KEYMAP_DOWN		2
-#define	KEYMAP_LEFT		3
-#define	KEYMAP_RIGHT		4
-#define	KEYMAP_PAGE_UP		5
-#define	KEYMAP_PAGE_DOWN	6
-#define	KEYMAP_HOME		7
-#define	KEYMAP_END		8
-#define	KEYMAP_DEL		9
-#define	KEYMAP_INS		10
-#define	KEYMAP_MOUSE		11
-#endif
+#	define	KEYMAP_UNKNOWN		0
+#	define	KEYMAP_UP		0xA6
+#	define	KEYMAP_DOWN		0xA8
+#	define	KEYMAP_LEFT		0xA5
+#	define	KEYMAP_RIGHT		0xA7
+#	define	KEYMAP_PAGE_UP		0xA1
+#	define	KEYMAP_PAGE_DOWN	0xA2
+#	define	KEYMAP_HOME		0xA4
+#	define	KEYMAP_END		0xA3
+#	define	KEYMAP_DEL		0
+#	define	KEYMAP_INS		0
+#	define	KEYMAP_MOUSE		0
+#else
+#	define	KEYMAP_UNKNOWN		0
+#	define	KEYMAP_UP		1
+#	define	KEYMAP_DOWN		2
+#	define	KEYMAP_LEFT		3
+#	define	KEYMAP_RIGHT		4
+#	define	KEYMAP_PAGE_UP		5
+#	define	KEYMAP_PAGE_DOWN	6
+#	define	KEYMAP_HOME		7
+#	define	KEYMAP_END		8
+#	define	KEYMAP_DEL		9
+#	define	KEYMAP_INS		10
+#	define	KEYMAP_MOUSE		11
+#endif /* WIN32 */
 
 
 /*
@@ -849,18 +844,18 @@
  *     it's useless trying to run tin below these sizes
  *     (values acquired by testing ;-) )
  */
-#define MIN_LINES_ON_TERMINAL		 8
-#define MIN_COLUMNS_ON_TERMINAL		50
+#define	MIN_LINES_ON_TERMINAL		 8
+#define	MIN_COLUMNS_ON_TERMINAL		50
 
 
 /*
  * used by feed_articles() & show_mini_help()
  */
 
-#define	SELECT_LEVEL		1
-#define	GROUP_LEVEL		2
-#define	THREAD_LEVEL		3
-#define	PAGE_LEVEL		4
+#define	SELECT_LEVEL	1
+#define	GROUP_LEVEL	2
+#define	THREAD_LEVEL	3
+#define	PAGE_LEVEL	4
 
 #define	MINI_HELP_LINES		5
 
@@ -872,7 +867,7 @@
 #define	FEED_REPOST		6
 
 #if 0
-#	define DEBUG_IO(x)   fprintf x
+#	define DEBUG_IO(x)	fprintf x
 #else
 #	define DEBUG_IO(x)
 #endif
@@ -983,7 +978,6 @@
 /*
  * Assertion verifier
  */
-
 #if !defined(M_OS2) && !defined(WIN32)
 #	undef assert
 #	ifdef CPP_DOES_EXPAND
@@ -994,10 +988,10 @@
 #endif /*!M_OS2 && !WIN32*/
 
 
-#define	ESC		27
+#define	ESC	27
 
 /* Turn on nice progress indicators */
-#define SHOW_PROGRESS
+#define	SHOW_PROGRESS
 
 /*
  * return codes for change_config_file ()
@@ -1076,7 +1070,6 @@
 /*
  * used in checking article header before posting
  */
-
 #define	NGLIMIT		20	/* Max. num. of crossposted groups before warning */
 #define	MAX_COL		78	/* Max. line length before issuing a warning */
 #define	MAX_SIG_LINES	4	/* Max. num. of signature lines before warning */
@@ -1424,18 +1417,18 @@
 
 struct t_header
 {
-	char from[HEADER_LEN];		/* From:         */
-	char path[HEADER_LEN];		/* Path:         */
-	char date[HEADER_LEN];		/* Date:         */
-	char subj[HEADER_LEN];		/* Subject:      */
+	char from[HEADER_LEN];		/* From: */
+	char path[HEADER_LEN];		/* Path: */
+	char date[HEADER_LEN];		/* Date: */
+	char subj[HEADER_LEN];		/* Subject: */
 	char org[HEADER_LEN];		/* Organization: */
-	char newsgroups[HEADER_LEN];	/* Newsgroups:   */
-	char messageid[HEADER_LEN];	/* Message-ID:   */
-	char references[HEADER_LEN];	/* References:   */
+	char newsgroups[HEADER_LEN];	/* Newsgroups: */
+	char messageid[HEADER_LEN];	/* Message-ID: */
+	char references[HEADER_LEN];	/* References: */
 	char distrib[HEADER_LEN];	/* Distribution: */
-	char keywords[HEADER_LEN];	/* Keywords:     */
-	char summary[HEADER_LEN];	/* Summary:      */
-	char followup[HEADER_LEN];	/* Followup-To:  */
+	char keywords[HEADER_LEN];	/* Keywords: */
+	char summary[HEADER_LEN];	/* Summary: */
+	char followup[HEADER_LEN];	/* Followup-To: */
 	char mimeversion[HEADER_LEN];	/* Mime-Version: */
 	char contenttype[HEADER_LEN];	/* Content-Type: */
 	char contentenc[HEADER_LEN];	/* Content-Transfer-Encoding: */
@@ -1572,7 +1565,7 @@
 #	define	_CDECL
 #	define	_FAR_
 #	define	SEPDIR	'/'
-#endif
+#endif /* M_OS2 */
 
 /*
  * mouse buttons for use in xterm
@@ -1615,6 +1608,7 @@
 extern void joinpath (char *result, char *dir, char *file);
 extern void joindir (char *result, char *dir, char *file);
 #endif /* VMS */
+
 #ifdef M_OS2
 #	define	NEWSGROUPS_FILE 	"newsgroups"
 #	define	REDIRECT_OUTPUT 	"> NUL"
@@ -1627,6 +1621,7 @@
 #	define	METAMAIL_CMD		"%s -e -p -m \"tin\""
 extern void joinpath (char *result, char *dir, char *file);
 #endif
+
 #ifdef WIN32
 #	define	NEWSGROUPS_FILE 	"newsgroups"
 #	define	REDIRECT_OUTPUT 	"> NUL"
@@ -1640,6 +1635,7 @@
 #	define	METAMAIL_CMD		"%s -e -p -m \"tin\""
 extern void joinpath (char *result, char *dir, char *file);
 #endif
+
 #ifdef M_UNIX
 #	define	NEWSGROUPS_FILE		"newsgroups"
 #	define	REDIRECT_OUTPUT		"> /dev/null 2>&1"
@@ -1751,27 +1747,27 @@
 #endif
 
 #ifdef USE_DBMALLOC
-#define my_malloc(size) malloc(size)
-#define my_realloc(ptr, size)	realloc((ptr), (size))
+#	define	my_malloc(size)	malloc(size)
+#	define	my_realloc(ptr, size)	realloc((ptr), (size))
 #else
-#define my_malloc(size) my_malloc1(__FILE__, __LINE__, (size))
-#define my_realloc(ptr, size)	my_realloc1(__FILE__, __LINE__, (ptr), (size))
+#	define	my_malloc(size)	my_malloc1(__FILE__, __LINE__, (size))
+#	define	my_realloc(ptr, size)	my_realloc1(__FILE__, __LINE__, (ptr), (size))
 #endif
 
-#define SIZEOF(array)	((int)(sizeof array / sizeof array[0]))
+#define	SIZEOF(array)	((int)(sizeof array / sizeof array[0]))
 
-#define FreeIfNeeded(p) if (p != (char *)0) free((char *)p)
-#define FreeAndNull(p)  if (p != (char *)0) { free((char *)p); p = (char *)0; }
+#define	FreeIfNeeded(p)	if (p != (char *)0) free((char *)p)
+#define	FreeAndNull(p)	if (p != (char *)0) { free((char *)p); p = (char *)0; }
 
-#define my_group_find(x)	add_my_group(x, FALSE)
-#define my_group_add(x)		add_my_group(x, TRUE)
+#define	my_group_find(x)	add_my_group(x, FALSE)
+#define	my_group_add(x)	add_my_group(x, TRUE)
 
 /*
  * Cast for the (few!) places where we need to examine 8-bit characters w/o
  * sign-extension, and a corresponding test-macro.
  */
-#define EIGHT_BIT(ptr) (unsigned char *)ptr
-#define is_EIGHT_BIT(p) ((*EIGHT_BIT(p) < 32 && !isspace(*p)) || *EIGHT_BIT(p) > 127)
+#define	EIGHT_BIT(ptr)	(unsigned char *)ptr
+#define	is_EIGHT_BIT(p)	((*EIGHT_BIT(p) < 32 && !isspace(*p)) || *EIGHT_BIT(p) > 127)
 
 /*
  * function prototypes & extern definitions
@@ -1799,19 +1795,19 @@
  * tputs() function-param
  */
 #ifdef OUTC_RETURN
-#define OUTC_RETTYPE int
+#	define	OUTC_RETTYPE	int
 #else
-#define OUTC_RETTYPE void
+#	define	OUTC_RETTYPE	void
 #endif
 
 #ifndef OUTC_ARGS
-#define OUTC_ARGS int c
+#	define	OUTC_ARGS	int c
 #endif
 
 #if __STDC__ || defined(__cplusplus)
-#define OUTC_FUNCTION(func) OUTC_RETTYPE func (OUTC_ARGS)
+#	define	OUTC_FUNCTION(func)	OUTC_RETTYPE func (OUTC_ARGS)
 #else
-#define OUTC_FUNCTION(func) OUTC_RETTYPE func (c) int c;
+#	define	OUTC_FUNCTION(func)	OUTC_RETTYPE func (c) int c;
 #endif
 
 typedef	OUTC_RETTYPE (*OutcPtr) (OUTC_ARGS);
@@ -1895,14 +1891,14 @@
 #	endif
 #endif
 
-#define IS_PLURAL(x) (x != 1 ? txt_plural : "")
+#define	IS_PLURAL(x)	(x != 1 ? txt_plural : "")
 
 /* FIXME - check also for mktemp/mkstemp/tmpfile */
 #ifdef HAVE_TEMPNAM
-#	define my_tempnam(a,b) tempnam(a,b)
+#	define	my_tempnam(a,b)	tempnam(a,b)
 #else
 #	ifdef HAVE_TMPNAM
-#		define my_tempnam(a,b) tmpnam((char *)0)
+#		define	my_tempnam(a,b)	tmpnam((char *)0)
 #  endif
 #endif
 
diff -Nur tin-980105/include/version.h tin-980117/include/version.h
--- tin-980105/include/version.h	Mon Jan  5 00:17:10 1998
+++ tin-980117/include/version.h	Sat Jan 17 04:03:38 1998
@@ -3,7 +3,7 @@
  *  Module    : version.h
  *  Author    : I. Lea
  *  Created   : 01.04.1991
- *  Updated   : 24.12.1998
+ *  Updated   : 24.12.1997
  *  Notes     :
  *  Copyright : (c) Copyright 1991-98 by Iain Lea
  *              You may  freely  copy or  redistribute  this software,
@@ -17,7 +17,7 @@
 
 #	define PRODUCT		"tin"
 #	define VERSION		"pre-1.4"
-#	define RELEASEDATE	"980105"
+#	define RELEASEDATE	"980117"
 #	define TINRC_VERSION	"1.1"
 
 #	ifdef M_AMIGA
@@ -33,7 +33,7 @@
 #		if !defined( __amiga )
 #			define  OS	"UNIX"
 #		else
-#			define  OS      "AMIGA"
+#			define  OS	"AMIGA"
 #		endif
 #	endif
 
diff -Nur tin-980105/makefile.in tin-980117/makefile.in
--- tin-980105/makefile.in	Mon Jan  5 00:17:11 1998
+++ tin-980117/makefile.in	Sat Jan 17 04:03:39 1998
@@ -7,7 +7,7 @@
 EXE		= tin
 MANEXT		= 1
 LVER		= 1.4
-PVER		= 980105
+PVER		= 980117
 VER		= pre-$(LVER)-$(PVER)
 MAIL_ADDR 	= "urs@tin.org"
 
diff -Nur tin-980105/src/active.c tin-980117/src/active.c
--- tin-980105/src/active.c	Mon Jan  5 18:45:57 1998
+++ tin-980117/src/active.c	Fri Jan 16 12:50:16 1998
@@ -23,20 +23,15 @@
  */
 #define ACTIVE_SEP		" \n"
 
-char new_newnews_host[PATH_LEN];
 int reread_active_file = FALSE;
-time_t new_newnews_time;			/* FIXME: never set */
 
 /* FIXME: make local */
 char	acHomeDir[PATH_LEN];
-char	acMailActiveFile[PATH_LEN];
 char	acSaveActiveFile[PATH_LEN];
-char	acTempActiveFile[PATH_LEN];
-char	acMailDir[PATH_LEN];
 char	acSaveDir[PATH_LEN];
-int	iAllGrps;
-int	iRecursive;
-int	iVerbose;
+int	iAllGrps;		/* Always FALSE */
+int	iRecursive;		/* Does nothing */
+int	iVerbose;		/* Test only ? Always FALSE */
 #ifndef M_AMIGA
 	struct	passwd *psPwd;
 	struct	passwd sPwd;
@@ -348,7 +343,7 @@
 		TIN_FCLOSE (fp);
 
 	/*
-	 *  Exit if active file wasn't read or is empty
+	 *  Exit if active file wasn't read correctly or is empty
 	 */
 	if (tin_errno != 0 || !num_active) {
 		error_message (txt_active_file_is_empty, news_active_file);
@@ -377,17 +372,18 @@
 	char *autosubscribe, *autounsubscribe;
 	char *ptr, buf[NNTP_STRLEN];
 	char old_newnews_host[PATH_LEN];
-	int newnews_index = -1;
-	FILE *fp = (FILE *) 0;
-	time_t the_newnews_time = (time_t) 0;
+	char new_newnews_host[PATH_LEN];
+	int newnews_index;
+	FILE *fp;
 	time_t old_newnews_time;
+	time_t new_newnews_time;
 
 	if (!check_for_new_newsgroups || !INTERACTIVE)
 		return;
 
 	wait_message (0, txt_checking_new_groups);
 
-	time (&the_newnews_time);
+	time (&new_newnews_time);
 
 	if (read_news_via_nntp)
 		strcpy (new_newnews_host, nntp_server);
@@ -397,9 +393,7 @@
 	/*
 	 * find out if we have read news from here before otherwise -1
 	 */
-	newnews_index = find_newnews_index (new_newnews_host);
-
-	if (newnews_index >= 0) {
+	if ((newnews_index = find_newnews_index (new_newnews_host)) >= 0) {
 		strcpy (old_newnews_host, newnews[newnews_index].host);
 		old_newnews_time = newnews[newnews_index].time;
 	} else {
@@ -409,7 +403,7 @@
 
 #ifdef DEBUG
 	if (debug == 2) {
-		error_message("Newnews old=[%ld]  new=[%ld]", old_newnews_time, the_newnews_time);
+		error_message("Newnews old=[%ld]  new=[%ld]", old_newnews_time, new_newnews_time);
 		sleep (2);
 	}
 #endif
@@ -446,12 +440,14 @@
 	}
 
 	/*
-	 * Update or create the in-memory 'last time newgroups checked' array
+	 * Update (if already existing) or create (if new) the in-memory
+	 * 'last time newgroups checked' slot for this server. It will be written
+	 * out as part of tinrc.
 	 */
 	if (newnews_index >= 0)
-		newnews[newnews_index].time = the_newnews_time;
+		newnews[newnews_index].time = new_newnews_time;
 	else {
-		sprintf (buf, "%s %ld", new_newnews_host, the_newnews_time);
+		sprintf (buf, "%s %ld", new_newnews_host, new_newnews_time);
 		load_newnews_info (buf);
 	}
 }
@@ -483,11 +479,14 @@
 	/*
 	 * Try to add the group to our selection list. If this fails, we're
 	 * probably using -n, so we fake an entry with no counts. The count will
-	 * be properly updated when we enter the group
+	 * be properly updated when we enter the group. Otherwise there is some
+	 * mismatch in the active.times data and we ignore the newgroup.
 	 */
 	if ((idx = my_group_add(group)) < 0) {
-		if (!newsrc_active)
-			my_fprintf(stderr, "subscribe_new_group: group not in active[] && !newsrc_active\n");
+		if (!newsrc_active) {
+/*			my_fprintf(stderr, "subscribe_new_group: %s not in active[] && !newsrc_active\n", group); */
+			return;
+		}
 
 		if ((ptr = psGrpAdd(group)) != NULL)
 			active_add(ptr, 0L, 1L, 0L, "y");
@@ -502,7 +501,8 @@
 		subscribe (&active[my_group[idx]], SUBSCRIBED);
 		/*
 		 * Bad kluge to stop group later appearing in New newsgroups. This
-		 * effectively loses the group, and it will be reread by read_newsrc()
+		 * effectively loses the group, and it has now been subscribed to and
+		 * so will be reread later by read_newsrc()
 		 */
 		group_top--;
 	} else
@@ -572,94 +572,20 @@
 }
 
 /*
- *  Load the last updated time for each group in the active file so that
- *  tind is more efficient and only has to stat the group dir and compare
- *  the last changed time with the time read from the ~/.tin/group.times
- *  file to determine if the group needs updating.
- *
- *  alt.sources 71234589
- *  comp.archives 71234890
- */
-
-#ifdef INDEX_DAEMON
-void
-read_group_times_file (void)
-{
-	char *p, *q;
-	char buf[HEADER_LEN];
-	char group[HEADER_LEN];
-	FILE *fp;
-	time_t updated_time;
-	struct t_group *psGrp;
-
-	if ((fp = fopen (group_times_file, "r")) == (FILE *) 0)
-		return;
-
-	while (fgets (buf, sizeof (buf), fp) != (char *) 0) {
-		/*
-		 * read the group name
-		 */
-		for (p = buf, q = group ; *p && *p != ' ' && *p != '\t' ; p++, q++)
-			*q = *p;
-
-		*q = '\0';
-
-		/*
-		 * read the last updated time
-		 */
-		updated_time = (time_t) atol (p);
-
-		/*
-		 * find the group in active[] and set updated time
-		 */
-		psGrp = psGrpFind (group);
-
-		if (psGrp)
-			psGrp->last_updated_time = updated_time;
-
-#ifdef DEBUG
-if (debug == 2)
-	my_printf ("group=[%-40.40s]  [%ld]\n", psGrp->name, psGrp->last_updated_time);
-#endif
-
-	}
-	fclose (fp);
-}
-
-/*
- *  Save the last updated time for each group to ~/.tin/group.times
- */
-
-void
-write_group_times_file (void)
-{
-	FILE *fp;
-	register int i;
-
-	if ((fp = fopen (group_times_file, "w")) == (FILE *) 0)
-		return;
-
-	for (i = 0 ; i < num_active ; i++)
-		fprintf (fp, "%s %ld\n", active[i].name, active[i].last_updated_time);
-
-	fclose (fp);
-}
-#endif	/* INDEX_DAEMON */
-
-/*
- * Add an entry to the in-memory newnews[] array (The times newgroups were last
- * checked for on each news server)
+ * Add or update an entry to the in-memory newnews[] array (The times newgroups
+ * were last checked for a particular news server)
  * If this is first time we've been called, zero out the array.
- * Growing the array if needed
+ *
+ * Side effects:
+ *   'info' is modified. Caller should not depend on it.
  */
 void
 load_newnews_info (
 	char *info)
 {
 	char *ptr;
-	char buf[NNTP_STRLEN];
 	int i;
-	time_t the_time;
+	time_t new_time;
 
 	/*
 	 * initialize newnews[] if no entries
@@ -671,23 +597,32 @@
 		}
 	}
 
-	/* TODO: Surely this is a waste of time, we strdup() this 10 lines lower down */
-	my_strncpy (buf, info, sizeof (buf));
+	/*
+	 * Split 'info' into hostname and time
+	 */
+	if ((ptr = strchr (info, ' ')) == (char *) 0)
+		return;
+
+	new_time = (time_t) atol (ptr);
+	*ptr = '\0';
+
+	/*
+	 * If this is a new host entry, set it up
+	 */
+	if ((i = find_newnews_index (info)) == -1) {
+		i = num_newnews++;
 
-	if ((ptr = strchr (buf, ' ')) != (char *) 0) {
-		the_time = (time_t) atol (ptr);
-		*ptr = '\0';
-		if (num_newnews >= max_newnews)
+		if (i >= max_newnews)
 			expand_newnews ();
+		newnews[i].host = my_strdup (info);
+	}
+
+	newnews[i].time = new_time;
 
-		newnews[num_newnews].host = my_strdup (buf);
-		newnews[num_newnews].time = the_time;
 #ifdef DEBUG
-		if (debug == 2)
-			error_message("ACTIVE host=[%s] time=[%ld]", newnews[num_newnews].host, newnews[num_newnews].time);
+	if (debug == 2)
+		error_message("ACTIVE host=[%s] time=[%ld]", newnews[i].host, newnews[i].time);
 #endif
-		num_newnews++;
-	}
 }
 
 /*
@@ -704,7 +639,7 @@
 			return(i);
 	}
 
-	return (-1);
+	return -1;
 }
 
 /*
@@ -739,7 +674,7 @@
 
 	vInitVariables ();
 
-	iRecursive = TRUE;
+	iRecursive = TRUE;	/* FIXME: vInitVariables() just set this to FALSE */
 
 	vPrintActiveHead (acSaveActiveFile);
 	strcpy (acGrpPath, acSaveDir);
@@ -751,6 +686,9 @@
 vInitVariables (void)
 {
 	char	*pcPtr;
+	char	acTempActiveFile[PATH_LEN];
+	char	acMailActiveFile[PATH_LEN];
+	char	acMailDir[PATH_LEN];
 
 #ifndef M_AMIGA
 	psPwd = (struct passwd *) 0;
@@ -895,4 +833,75 @@
 	for (iNum = 0; iNum < num_active; iNum++)
 		my_group[group_top++] = iNum;
 }
+
+/*
+ *  Load the last updated time for each group in the active file so that
+ *  tind is more efficient and only has to stat the group dir and compare
+ *  the last changed time with the time read from the ~/.tin/group.times
+ *  file to determine if the group needs updating.
+ *
+ *  alt.sources 71234589
+ *  comp.archives 71234890
+ */
+void
+read_group_times_file (void)
+{
+	char *p, *q;
+	char buf[HEADER_LEN];
+	char group[HEADER_LEN];
+	FILE *fp;
+	time_t updated_time;
+	struct t_group *psGrp;
+
+	if ((fp = fopen (group_times_file, "r")) == (FILE *) 0)
+		return;
+
+	while (fgets (buf, sizeof (buf), fp) != (char *) 0) {
+		/*
+		 * read the group name
+		 */
+		for (p = buf, q = group ; *p && *p != ' ' && *p != '\t' ; p++, q++)
+			*q = *p;
+
+		*q = '\0';
+
+		/*
+		 * read the last updated time
+		 */
+		updated_time = (time_t) atol (p);
+
+		/*
+		 * find the group in active[] and set updated time
+		 */
+		psGrp = psGrpFind (group);
+
+		if (psGrp)
+			psGrp->last_updated_time = updated_time;
+
+#ifdef DEBUG
+if (debug == 2)
+	my_printf ("group=[%-40.40s]  [%ld]\n", psGrp->name, psGrp->last_updated_time);
 #endif
+
+	}
+	fclose (fp);
+}
+
+/*
+ *  Save the last updated time for each group to ~/.tin/group.times
+ */
+void
+write_group_times_file (void)
+{
+	FILE *fp;
+	register int i;
+
+	if ((fp = fopen (group_times_file, "w")) == (FILE *) 0)
+		return;
+
+	for (i = 0 ; i < num_active ; i++)
+		fprintf (fp, "%s %ld\n", active[i].name, active[i].last_updated_time);
+
+	fclose (fp);
+}
+#endif	/* INDEX_DAEMON */
diff -Nur tin-980105/src/art.c tin-980117/src/art.c
--- tin-980105/src/art.c	Mon Jan  5 01:04:19 1998
+++ tin-980117/src/art.c	Sun Jan 11 19:00:58 1998
@@ -45,7 +45,7 @@
 #ifdef INDEX_DAEMON
 	static void vCreatePath (char *pcPath);
 #endif /* INDEX_DAEMON */
-   
+
 
 /*
  *  Construct the pointers to the base article in each thread.
@@ -331,7 +331,7 @@
 
 		/*
 		 * Try and open the article
-	 	 */
+		 */
 		if ((fp = open_art_header (art)) == (FILE *) 0)
 			continue;
 
@@ -1126,24 +1126,24 @@
 			psArt = &arts[iNum];
 
 			if (psArt->thread != ART_EXPIRED && psArt->artnum >= psGrp->xmin) {
-			 	fprintf (hFp, "%ld\t%s\t%s\t%s\t%s\t%s\t%d\t%d",
-			 		psArt->artnum,
-			 		psArt->subject,
-			 		pcPrintFrom (psArt),
-			 		pcPrintDate (psArt->date),
-			 		(psArt->msgid ? psArt->msgid : ""),
-			 		(psArt->refs ? psArt->refs : ""),
-			 		0,	/* bytes */
-			 		psArt->lines);
-
-			 	if (psArt->xref)
-				 	fprintf (hFp, "\tXref: %s", psArt->xref);
-
-			 	if (psArt->archive)
-				 	fprintf (hFp, "\tArchive-name: %s/%s%s",
-				 		psArt->archive,
-				 		(psArt->part ? "part" : "patch"),
-				 		(psArt->part ? psArt->part : psArt->patch));
+				fprintf (hFp, "%ld\t%s\t%s\t%s\t%s\t%s\t%d\t%d",
+					psArt->artnum,
+					psArt->subject,
+					pcPrintFrom (psArt),
+					pcPrintDate (psArt->date),
+					(psArt->msgid ? psArt->msgid : ""),
+					(psArt->refs ? psArt->refs : ""),
+					0,	/* bytes */
+					psArt->lines);
+
+				if (psArt->xref)
+					fprintf (hFp, "\tXref: %s", psArt->xref);
+
+				if (psArt->archive)
+					fprintf (hFp, "\tArchive-name: %s/%s%s",
+						psArt->archive,
+						(psArt->part ? "part" : "patch"),
+						(psArt->part ? psArt->part : psArt->patch));
 
 				fprintf (hFp, "\n");
 			}
@@ -1667,4 +1667,3 @@
 	system (acCmd);
 	}
 #endif /* INDEX_DAEMON */
-                  
diff -Nur tin-980105/src/attrib.c tin-980117/src/attrib.c
--- tin-980105/src/attrib.c	Wed Dec 31 04:03:16 1997
+++ tin-980117/src/attrib.c	Sun Jan 11 19:01:28 1998
@@ -39,11 +39,11 @@
 #define	ATTRIB_QUICK_KILL_HEADER	17
 #define	ATTRIB_QUICK_KILL_SCOPE		18
 #define	ATTRIB_QUICK_KILL_EXPIRE	19
-#define	ATTRIB_QUICK_KILL_CASE  	20
+#define	ATTRIB_QUICK_KILL_CASE		20
 #define	ATTRIB_QUICK_SELECT_HEADER	21
 #define	ATTRIB_QUICK_SELECT_SCOPE	22
 #define	ATTRIB_QUICK_SELECT_EXPIRE	23
-#define	ATTRIB_QUICK_SELECT_CASE  	24
+#define	ATTRIB_QUICK_SELECT_CASE	24
 #define	ATTRIB_MAILING_LIST		25
 #define	ATTRIB_X_HEADERS		26
 #define	ATTRIB_X_BODY			27
diff -Nur tin-980105/src/auth.c tin-980117/src/auth.c
--- tin-980105/src/auth.c	Wed Dec 31 04:03:36 1997
+++ tin-980117/src/auth.c	Sun Jan 11 19:01:53 1998
@@ -159,7 +159,7 @@
 			if (ptr == (char *) 0)		/* no passwd, no auth, skip */
 				continue;
 
-			*ptr++ = '\0'; 			/* cut off server part */
+			*ptr++ = '\0';		/* cut off server part */
 
 			if ((strcasecmp (line, server)))
 				continue;		/* wrong server, keep on */
diff -Nur tin-980105/src/charset.c tin-980117/src/charset.c
--- tin-980105/src/charset.c	Fri Dec 26 03:44:22 1997
+++ tin-980117/src/charset.c	Fri Jan 16 17:59:25 1998
@@ -20,15 +20,15 @@
  *  included by  (root@aspic.han.de) on 11/04/93
  */
 
-#define SUB         "?"
-#define ISO_EXTRA   0xa0 /* beginning of second range of printable chars */
+#define SUB	"?"
+#define ISO_EXTRA	0xa0 /* beginning of second range of printable chars */
 
 /*
  * TABSTOP(x) is the column of the character after the TAB
  * at column x. First column is 0, of course.
  */
 
-#define TABSTOP(x)  (((x) - ((x)&7)) + 8)
+#define TABSTOP(x)	(((x) - ((x)&7)) + 8)
 
 static constext *const iso2asc[NUM_ISO_TABLES][256-ISO_EXTRA] =
 {
@@ -136,8 +136,8 @@
 {
 	constext *p;
 	constext *const *tab;
-	int first;   /* flag for first SPACE/TAB after other characters */
-	int i, a;    /* column counters in iso and asc */
+	int first;	/* flag for first SPACE/TAB after other characters */
+	int i, a;	/* column counters in iso and asc */
 
 	if (iso == 0 || asc == 0)
 		return;
@@ -183,8 +183,8 @@
 						/*
 						 * TAB will correct the column difference
 						 */
-						*(asc++) = '\t';   /* = *iso */
-						a = TABSTOP(a);    /* = TABSTOP(i), because i < a < TABSTOP(i) */
+						*(asc++) = '\t';	/* = *iso */
+						a = TABSTOP(a);	/* = TABSTOP(i), because i < a < TABSTOP(i) */
 					}
 					i = TABSTOP(i);
 				}
diff -Nur tin-980105/src/color.c tin-980117/src/color.c
--- tin-980105/src/color.c	Fri Dec 26 03:44:22 1997
+++ tin-980117/src/color.c	Sun Jan 11 19:02:23 1998
@@ -349,7 +349,7 @@
 			if (str[0] == '>'
 				 || str[0] == '|'
 				 || str[0] == ']'
-/*		    	 || str[0] == '»' */
+/*				 || str[0] == '»' */
 				 || (str[0] == ':' && str[1] != '-')
 				 || (str[1] == '>' && str[0] != '-')
 				 || (str[2] == '>' && str[1] != '-')
diff -Nur tin-980105/src/config.c tin-980117/src/config.c
--- tin-980105/src/config.c	Wed Dec 31 04:03:55 1997
+++ tin-980117/src/config.c	Fri Jan 16 17:11:45 1998
@@ -349,6 +349,9 @@
 			break;
 
 		case 'i':
+			if (match_boolean (buf, "info_in_last_line=", &info_in_last_line))
+				break;
+
 			if (match_boolean (buf, "inverse_okay=", &inverse_okay))
 				break;
 
@@ -747,18 +750,19 @@
 
 	fprintf (fp, txt_tinrc_news_headers_to_display);
 	fprintf (fp, "news_headers_to_display=");
-	for (i=0; i<num_headers_to_display; i++) {
+	for (i=0; i<num_headers_to_display; i++)
 		fprintf (fp, "%s ",news_headers_to_display_array[i]);
-	}
 	fprintf (fp, "\n\n");
 
 	fprintf (fp, txt_tinrc_news_headers_to_not_display);
 	fprintf (fp, "news_headers_to_not_display=");
-	for (i=0; i<num_headers_to_not_display; i++) {
+	for (i=0; i<num_headers_to_not_display; i++)
 		fprintf (fp, "%s ",news_headers_to_not_display_array[i]);
-	}
 	fprintf (fp, "\n\n");
 
+	fprintf (fp, txt_tinrc_info_in_last_line);
+	fprintf (fp, "info_in_last_line=%s\n\n", print_boolean(info_in_last_line));
+
 	fprintf (fp, txt_tinrc_sort_article_type);
 	fprintf (fp, "sort_article_type=%d\n\n", default_sort_art_type);
 
@@ -1041,24 +1045,17 @@
 	fprintf (fp, "default_shell_command=%s\n\n", default_shell_command);
 
 	fprintf (fp, txt_tinrc_newnews);
-	if (!num_newnews) {
-		fprintf (fp, "newnews=%s %ld\n", new_newnews_host, new_newnews_time);
-	} else {
-		for (i = 0 ; i < num_newnews ; i++) {
-			fprintf (fp, "newnews=%s %ld\n", newnews[i].host, newnews[i].time);
-		}
-	}
-	if (ferror (fp) | fclose (fp)){
+	for (i = 0 ; i < num_newnews ; i++)
+		fprintf (fp, "newnews=%s %ld\n", newnews[i].host, newnews[i].time);
+
+	if (ferror (fp) | fclose (fp))
 		error_message (txt_filesystem_full, CONFIG_FILE);
-		/* free memory for tmp-filename */
-		free (file_tmp);
-		return;
-	} else {
+	else {
 		rename_file (file_tmp, file);
 		chmod (file, (S_IRUSR|S_IWUSR));
-		/* free memory for tmp-filename */
-		free (file_tmp);
 	}
+	/* free memory for tmp-filename */
+	free (file_tmp);
 }
 
 #define option_lines_per_page (cLINES - INDEX_TOP - 3)
diff -Nur tin-980105/src/curses.c tin-980117/src/curses.c
--- tin-980105/src/curses.c	Fri Dec 26 03:44:28 1997
+++ tin-980117/src/curses.c	Thu Jan 15 16:27:01 1998
@@ -292,10 +292,9 @@
 	if (_columns == -1)
 		_columns = DEFAULT_COLUMNS_ON_TERMINAL;
 
-	if (_lines < MIN_LINES_ON_TERMINAL ||
-	    _columns < MIN_COLUMNS_ON_TERMINAL) {
-	    	my_fprintf(stderr, txt_screen_too_small, progname);
-	    	return (FALSE);
+	if (_lines < MIN_LINES_ON_TERMINAL || _columns < MIN_COLUMNS_ON_TERMINAL) {
+		my_fprintf(stderr, txt_screen_too_small, progname);
+		return (FALSE);
 	}
 	/*
 	 * kludge to workaround no inverse
@@ -402,93 +401,86 @@
 	}
 #endif	/* M_OS2 */
 
-	if (_lines < MIN_LINES_ON_TERMINAL ||
-	    _columns < MIN_COLUMNS_ON_TERMINAL) {
-	    	my_fprintf(stderr, txt_screen_too_small, progname);
-	    	return (FALSE);
+	if (_lines < MIN_LINES_ON_TERMINAL || _columns < MIN_COLUMNS_ON_TERMINAL) {
+		my_fprintf(stderr, txt_screen_too_small, progname);
+		return (FALSE);
 	}
 
 	InitWin ();
 
 #ifdef VMS
 	{
-	  int input_chan, status;
-	  int item_code, eightbit;
-	  struct sensemode {
-	    short status;
-	    unsigned char xmit_baud;
-	    unsigned char rcv_baud;
-	    unsigned char crfill;
-	    unsigned char lffill;
-	    unsigned char parity;
-	    unsigned char unused;
-	    char class;
-	    char type;
-	    short scr_wid;
-	    unsigned long tt_char : 24, scr_len : 8;
-	    unsigned long tt2_char;
-	  } tty;
-	  $DESCRIPTOR (input_dsc, "TT");
-
-	  status = SYS$ASSIGN (&input_dsc, &input_chan, 0, 0);
-	  if (!(status & 1))
-	      LIB$STOP (status);
-	  SYS$QIOW (0, input_chan, IO$_SENSEMODE, &tty, 0, 0,
-		    &tty.class, 12, 0, 0, 0, 0);
-	  item_code = DVI$_TT_EIGHTBIT;
-	  status = LIB$GETDVI(&item_code, &input_chan, 0, &eightbit, 0, 0);
-	  _columns = tty.scr_wid;
-	  _lines = tty.scr_len;
-
-	if (eightbit)
-	 { /* if using eightbit then use CSI (octal 233) rather than ESC "[" */
-	  _clearscreen	= "\2331;1H\233J";
-	  _moveto	= "\233%d;%dH"; /* not a termcap string !*/
-	  _cleartoeoln	= "\233K";
-	  _cleartoeos	= "\233J";
-	  _setinverse	= "\2337m";
-	  _clearinverse = "\2330m";
-	  _setunderline = "\2334m";
-	  _clearunderline	= "\2330m";
-	  _keypadlocal	= "";
-	  _keypadxmit	= "";
-	 }
-	else
-	 {
-	  _clearscreen	= "\033[1;1H\033[J";
-	  _moveto	= "\033[%d;%dH";	/* not a termcap string! */
-	  _cleartoeoln	= "\033[K";
-	  _cleartoeos	= "\033[J";
-	  _setinverse	= "\033[7m";
-	  _clearinverse = "\033[0m";
-	  _setunderline = "\033[4m";
-	  _clearunderline	= "\033[0m";
-	  _keypadlocal	= "";
-	  _keypadxmit	= "";
-	 }
+		int input_chan, status;
+		int item_code, eightbit;
+		struct sensemode {
+			short status;
+			unsigned char xmit_baud;
+			unsigned char rcv_baud;
+			unsigned char crfill;
+			unsigned char lffill;
+			unsigned char parity;
+			unsigned char unused;
+			char class;
+			char type;
+			short scr_wid;
+			unsigned long tt_char : 24, scr_len : 8;
+			unsigned long tt2_char;
+		} tty;
+		$DESCRIPTOR (input_dsc, "TT");
+
+		status = SYS$ASSIGN (&input_dsc, &input_chan, 0, 0);
+		if (!(status & 1))
+			LIB$STOP (status);
+		SYS$QIOW (0, input_chan, IO$_SENSEMODE, &tty, 0, 0, &tty.class, 12, 0, 0, 0, 0);
+		item_code = DVI$_TT_EIGHTBIT;
+		status = LIB$GETDVI(&item_code, &input_chan, 0, &eightbit, 0, 0);
+		_columns = tty.scr_wid;
+		_lines = tty.scr_len;
+
+		if (eightbit) { /* if using eightbit then use CSI (octal 233) rather than ESC "[" */
+			_clearscreen = "\2331;1H\233J";
+			_moveto = "\233%d;%dH"; /* not a termcap string !*/
+			_cleartoeoln = "\233K";
+			_cleartoeos = "\233J";
+			_setinverse = "\2337m";
+			_clearinverse = "\2330m";
+			_setunderline = "\2334m";
+			_clearunderline = "\2330m";
+			_keypadlocal = "";
+			_keypadxmit = "";
+		} else {
+			_clearscreen = "\033[1;1H\033[J";
+			_moveto = "\033[%d;%dH";	/* not a termcap string! */
+			_cleartoeoln = "\033[K";
+			_cleartoeos = "\033[J";
+			_setinverse = "\033[7m";
+			_clearinverse = "\033[0m";
+			_setunderline = "\033[4m";
+			_clearunderline = "\033[0m";
+			_keypadlocal = "";
+			_keypadxmit = "";
+		}
 #ifdef HAVE_IS_XTERM
-	if (is_xterm())
-	 {
-	  xclicks = TRUE;
-	  if (eightbit)
-	   { /* These are the settings for a DECterm but the reply can't easily be parsed */
-	     /* Reply is of the form - CSI Pe ; Pb ; Pr ; Pc & w
-		    Where Pe is the event, Pb the button, Pr and Pc the row and column */
-/**
-	     _xclickinit = "\2331;2'z";
-	     _xclickend = "\2330;0'z";
-**/
-	    }
-	   else
-	    {
-	     _xclickinit = "\033[?9h";
-	     _xclickend  = "\033[?9l";
-	    }
-	 }
-#endif
-
+		if (is_xterm()) {
+			xclicks = TRUE;
+			if (!eightbit) {
+				_xclickinit = "\033[?9h";
+				_xclickend  = "\033[?9l";
+			}
+#if 0
+			else {
+				/* These are the settings for a DECterm but the reply can't easily be parsed
+				 * Reply is of the form - CSI Pe ; Pb ; Pr ; Pc & w
+				 * Where Pe is the event, Pb the button, Pr and Pc the row and column
+				 */
+				_xclickinit = "\2331;2'z";
+				_xclickend = "\2330;0'z";
+			}
+#endif /* 0 */
+		}
+#endif /* HAVE_IS_XTERM */
 	}
-#endif
+#endif /* VMS */
 	Raw (FALSE);
 
 	return (TRUE);
@@ -766,11 +758,11 @@
 {
 #ifdef VMS
 	if (!state && _inraw) {
-/*	  vmsnoraw();*/
-	  _inraw = 0;
+/*		vmsnoraw(); */
+		_inraw = 0;
 	} else if (state && !_inraw) {
-/*	  vmsraw();*/
-	  _inraw = 1;
+/*		vmsraw(); */
+		_inraw = 1;
 	}
 #else
 #if !defined(INDEX_DAEMON) && !defined(M_OS2)
diff -Nur tin-980105/src/debug.c tin-980117/src/debug.c
--- tin-980105/src/debug.c	Wed Dec 31 04:04:20 1997
+++ tin-980117/src/debug.c	Sun Jan 11 19:03:40 1998
@@ -220,8 +220,6 @@
 	if ((fp = fopen (file, "w")) != (FILE *) 0) {
 		for (i = 0; i < num_active; i++) {	/* for each group */
 			group = &active[i];
-/* 			fprintf (fp, "[%4d]=[%-28s] type=[%s] spooldir=[%s]\n",
-*/
 			fprintf (fp, "[%4d]=[%s] type=[%s] spooldir=[%s]\n",
 				i, group->name,
 				(group->type == GROUP_TYPE_NEWS ? "NEWS" : "MAIL"),
diff -Nur tin-980105/src/feed.c tin-980117/src/feed.c
--- tin-980105/src/feed.c	Fri Dec 26 03:44:30 1997
+++ tin-980117/src/feed.c	Sun Jan 11 19:04:43 1998
@@ -399,7 +399,7 @@
 
 			break;
 
-		case iKeyFeedThd: 		/* thread */
+		case iKeyFeedThd:		/* thread */
 			confirm = TRUE;
 			for (i = (int) base[b]; i >= 0; i = arts[i].thread) {
 				if (level == PAGE_LEVEL)
@@ -457,7 +457,7 @@
 			}
 			break;
 
-		case iKeyFeedTag: 		/* tagged articles */
+		case iKeyFeedTag:		/* tagged articles */
 			confirm = TRUE;
 			for (i=1 ; i <= num_of_tagged_arts ; i++) {
 				for (j=0 ; j < top ; j++) {
@@ -517,8 +517,8 @@
 			untag_all_articles ();
 			break;
 
-		case iKeyFeedHot: 		/* hot (auto-selected) articles */
-		case iKeyFeedPat: 		/* regex pattern matched articles */
+		case iKeyFeedHot:		/* hot (auto-selected) articles */
+		case iKeyFeedPat:		/* regex pattern matched articles */
 			confirm = TRUE;
 			for (i = 0 ; i < top_base ; i++) {
 				for (j = (int) base[i]; j >= 0; j = arts[j].thread) {
diff -Nur tin-980105/src/filter.c tin-980117/src/filter.c
--- tin-980105/src/filter.c	Wed Dec 31 02:16:40 1997
+++ tin-980117/src/filter.c	Thu Jan  8 02:08:16 1998
@@ -42,16 +42,6 @@
  * at the end of filter_articles()
  */
 
-#if 0
-/* 
- * format for From: in filter
- * should be "%s1 (%s2)" or "%s2 <%s1>" depending on the format
- * used in the header.
- * disabled because of problems with From:-Lines in name <address> format
- */
-#define iAFR_FORMAT2 ((wildcard) ? "%s\\s\\(%s\\)" : "*%s (%s)*")
-#endif
-
 /*
  * global filter array
  */
@@ -223,7 +213,7 @@
 		return FALSE;
 
 	if (INTERACTIVE)
-			wait_message (0, txt_reading_filter_file, (global ? "global ": "" ));
+		wait_message (0, txt_reading_filter_file, (global ? "global ": "" ));
 
 	time (&current_secs);
 
@@ -308,6 +298,7 @@
 				break;
 			}
 			break;
+
 		case 'm':
 			if (match_string (buf+1, "sgid=", msgid, sizeof (msgid))) {
 				if (arr_ptr) {
@@ -331,6 +322,7 @@
 				break;
 			}
 			break;
+
 		case 's':
 			if (match_string (buf+1, "cope=", scope, sizeof (scope))) {
 #ifdef DEBUG
@@ -344,7 +336,6 @@
 				arr_max = &glob_filter.max;
 				if (*arr_num >= (*arr_max - 1))
 					glob_filter.filter = psExpandFilterArray (glob_filter.filter, arr_max);
-
 				arr_ptr = glob_filter.filter;
 				i = *arr_num;
 				(*arr_num)++;
@@ -407,6 +398,7 @@
 				break;
 			}
 			break;
+
 		case 't':
 			if (match_integer (buf+1, "ype=", &type, 1)) {
 #ifdef DEBUG
@@ -439,6 +431,7 @@
 				break;
 			}
 			break;
+
 		case 'x':
 			if (match_string (buf+1, "ref=", xref, sizeof (xref))) {
 				if (arr_ptr && ! expired_time)
@@ -469,6 +462,7 @@
 				break;
 			}
 			break;
+
 		default:
 			break;
 		}
@@ -493,9 +487,7 @@
 	char *pcFile)
 {
 	FILE *hFp;
-/*	int i; */
 	time_t lCurTime;
-/*	struct t_filters *psFilter; */
 
 	if ((hFp = fopen (pcFile, "w")) == (FILE *) 0)
 		return;
@@ -516,7 +508,6 @@
 	fclose (hFp);
 	chmod (pcFile, (S_IRUSR|S_IWUSR));
 }
-
 #endif/* !INDEX_DAEMON */
 
 #ifndef INDEX_DAEMON
@@ -752,18 +743,7 @@
 	sprintf (text_time, txt_time_default_days, default_filter_days);
 	sprintf (text_subj, ptr_filter_subj, len, len, art->subject);
 
-#if 0
-	/*
-	 * There are two possible formats: from (name) and name <from>
-	 * This segment of code should be disabled as it converts all
-	 * addresses to the first format, even when they are in the second
-	 * format in the header.
-	 */
-	if (art->name != (char *) 0)
-		sprintf (buf, "%s (%s)", art->from, art->name);
-	else
-#endif
-		strcpy (buf, art->from);
+	strcpy (buf, art->from);
 
 	sprintf (text_from, ptr_filter_from, len, len, buf);
 	sprintf (text_msgid, ptr_filter_msgid, len-4, len-4, MSGID(art));
@@ -1251,18 +1231,7 @@
 	}
 
 	if (psRule->text[0]) {
-#if 0
-		/*
-		 * quoting metacharacters and/or wildcards should not be necessary for
-		 * manually entered strings
-		 * we should assume that the users does know what he is doing and allow
-		 * him to enter regular expressions or wilmat patterns
-		 */
-		if (psRule->check_string)
-			sprintf (acBuf, REGEX_FMT, quote_wild(psRule->text));
-		else
-#endif
-			sprintf (acBuf, REGEX_FMT, psRule->text);
+		sprintf (acBuf, REGEX_FMT, quote_wild_whitespace(psRule->text));
 
 		switch (psRule->counter) {
 			case FILTER_SUBJ_CASE_IGNORE:
@@ -1270,21 +1239,22 @@
 				psPtr[*plNum].subj = my_strdup (acBuf);
 				if (psRule->counter == FILTER_SUBJ_CASE_IGNORE)
 					psPtr[*plNum].icase = TRUE;
-
 				break;
+
 			case FILTER_FROM_CASE_IGNORE:
 			case FILTER_FROM_CASE_SENSITIVE:
 				psPtr[*plNum].from = my_strdup (acBuf);
 				if (psRule->counter == FILTER_FROM_CASE_IGNORE)
 					psPtr[*plNum].icase = TRUE;
-
 				break;
+
 			case FILTER_MSGID:
 			case FILTER_MSGID_LAST:
 			case FILTER_MSGID_ONLY:
 				psPtr[*plNum].msgid = my_strdup (acBuf);
 				psPtr[*plNum].fullref = psRule->counter;
 				break;
+
 			default: /* should not happen */
 				assert(0 != 0);
 				break;
@@ -1301,19 +1271,7 @@
 			psPtr[*plNum].subj = my_strdup (acBuf);
 		}
 		if (psRule->from_ok) {
-#if 0
-			/*
-			 * There are two possible formats: from (name) and name <from>
-			 * This segment of code should be disabled as it converts all
-			 * addresses to the first format, even when they are in the second
-			 * format in the header.
-			 */
-			if (psArt->name != (char *) 0)
-				sprintf (acBuf, iAFR_FORMAT2, psArt->from, psArt->name);
-			else
-#endif
-				sprintf (acBuf, REGEX_FMT, quote_wild (psArt->from));
-
+			sprintf (acBuf, REGEX_FMT, quote_wild (psArt->from));
 			psPtr[*plNum].from = my_strdup (acBuf);
 		}
 		/*
diff -Nur tin-980105/src/group.c tin-980117/src/group.c
--- tin-980105/src/group.c	Wed Dec 31 04:04:33 1997
+++ tin-980117/src/group.c	Thu Jan  8 15:38:37 1998
@@ -1222,18 +1222,9 @@
 				show_group_page ();
 				break;
 
-			case iKeyGroupDisplaySubject:
-				if (index_point < 0) {
-					info_message (txt_no_arts);
-				} else {
-					struct t_art_stat statbuf;
-					int j;
-
-					stat_thread(index_point, &statbuf);
-					j = (statbuf.unread) ? next_unread(base[index_point]) : base[index_point];
-					clear_message();
-					center_line (cLINES, FALSE, arts[j].subject);
-				}
+			case iKeyToggleInfoLastLine:
+				info_in_last_line = !info_in_last_line;
+				show_group_page();
 				break;
 
 			default:
@@ -1319,11 +1310,10 @@
 	show_mini_help (GROUP_LEVEL);
 
 	if (top_base <= 0) {
-		info_message(txt_no_arts);
+		info_message (txt_no_arts);
 		return;
-	} else if (last_subj_on_screen == top_base) {
+	} else if (last_subj_on_screen == top_base)
 		info_message(txt_end_of_arts);
-	}
 
 	draw_subject_arrow();
 
@@ -1361,6 +1351,18 @@
 		StartInverse();
 		draw_sline(index_point, TRUE);
 		EndInverse();
+	}
+	if (info_in_last_line) {
+		struct t_art_stat statbuf;
+		int j;
+
+		stat_thread(index_point, &statbuf);
+		j = (statbuf.unread) ? next_unread(base[index_point]) : base[index_point];
+		clear_message();
+		center_line (cLINES, FALSE, arts[j].subject);
+	} else {
+		if (last_subj_on_screen == top_base)
+			info_message(txt_end_of_arts);
 	}
 	stow_cursor();
 }
diff -Nur tin-980105/src/inews.c tin-980117/src/inews.c
--- tin-980105/src/inews.c	Wed Dec 31 04:05:43 1997
+++ tin-980117/src/inews.c	Sun Jan 11 19:13:57 1998
@@ -101,8 +101,8 @@
 	/*
 	 * Check that at least one '.' comes after the '@' in the From: line
 	 */
-	 if ((ptr = strchr (from_name, '@')) != (char *) 0) {
-	 	if ((ptr = strchr (ptr, '.')) == (char *) 0) {
+	if ((ptr = strchr (from_name, '@')) != (char *) 0) {
+		if ((ptr = strchr (ptr, '.')) == (char *) 0) {
 			error_message ("Invalid  From: %s line. Read the INSTALL file again.", from_name);
 			fclose (fp);
 			return ret_code;
@@ -141,8 +141,8 @@
 		/*
 		 * Remove linefeed from line
 		 */
-		 if ((ptr = strrchr (line, '\n')) != (char *) 0)
-		 	*ptr = '\0';
+		if ((ptr = strrchr (line, '\n')) != (char *) 0)
+			*ptr = '\0';
 
 		/*
 		 * If line starts with a '.' add another '.' to stop truncation
diff -Nur tin-980105/src/init.c tin-980117/src/init.c
--- tin-980105/src/init.c	Wed Dec 31 04:07:34 1997
+++ tin-980117/src/init.c	Thu Jan  8 15:21:47 1998
@@ -228,6 +228,7 @@
 t_bool full_page_scroll;	/* page half/full screen of articles/groups */
 t_bool got_sig_pipe = FALSE;
 t_bool group_catchup_on_exit;	/* catchup group with left arrow key or not */
+t_bool info_in_last_line;
 t_bool keep_dead_articles;
 t_bool keep_posted_articles;
 t_bool mail_8bit_header=FALSE;	/* allow 8bit chars. in header of mail message */
@@ -554,6 +555,7 @@
 	groupname_max_length = 32;
 	global_filtered_articles = FALSE;
 	local_filtered_articles = FALSE;
+	info_in_last_line = FALSE;
 	iso2asc_supported = atoi (get_val ("ISO2ASC", DEFAULT_ISO2ASC));
 	if (iso2asc_supported > NUM_ISO_TABLES)
 		iso2asc_supported = 0;
diff -Nur tin-980105/src/lang.c tin-980117/src/lang.c
--- tin-980105/src/lang.c	Mon Jan  5 18:48:30 1998
+++ tin-980117/src/lang.c	Fri Jan 16 12:45:08 1998
@@ -138,7 +138,7 @@
 constext txt_extracting_archive[] = cCRLF cCRLF "Extracting %s archive..." cCRLF;
 constext txt_extracting_shar[] =cCRLF "Extracting %s..." cCRLF;
 constext txt_failed_to_connect_to_server[] = "Failed to connect to NNTP server %s. Exiting...";
-constext txt_filesystem_full[] = "Error writing %s file. Filesystem full? Resetting to previous state.";
+constext txt_filesystem_full[] = "Error writing %s file. Filesystem full? File reset to previous state.";
 constext txt_filesystem_full_backup[] = "Error making backup of %s file. Filesystem full?";
 constext txt_filter_global_rules[] = "Filtering global rules (%d/%d)...";
 constext txt_filter_local_rules[] = "Filtering local rules (%d)...";
@@ -422,7 +422,7 @@
 	constext txt_help_use_metamail[] = "<SPACE> toggles, <CR> sets, <ESC> cancels.";
 #endif
 
-constext txt_help_g_t_p_i[] ="i\t  show subject of selected article" cCRLF;
+constext txt_help_g_t_p_i[] ="i\t  toggle info message in last line (subject/description)" cCRLF;
 constext txt_help_s_i[] ="i\t  show description of chosen newsgroup" cCRLF;
 constext txt_help_use_mouse[] = "<SPACE> toggles, <CR> sets, <ESC> cancels.";
 constext txt_help_v[] = "v\t  show version information" cCRLF;
@@ -499,7 +499,9 @@
 constext txt_news_quote[] = "%F wrote:";
 constext txt_newsgroup[] = "Goto newsgroup [%s]> ";
 constext txt_newsgroup_position[] = "Position %s in group list (1,2,..,$) [%d]> ";
-constext txt_newsrc_saved[] = "newsrc file saved successfully.\n";
+constext txt_newsrc_again[] = "Try and save newsrc file again? (y/n): ";
+constext txt_newsrc_nogroups[] = "Warning: No newsgroups were written to your newsrc file. Save aborted.";
+constext txt_newsrc_saved[] = "newsrc file saved successfully.";
 constext txt_next_resp[] = "-- Next response --";
 constext txt_nntp_authorization_failed[] = "NNTP authorization password not found for %s";
 constext txt_nntp_to_fp_cannot_reopen[] = "nntp_to_fp: can't reopen %s: ";
@@ -560,7 +562,7 @@
 
 constext txt_opt_auto_bcc[] = "Send you a blind cc automatically  : ";
 constext txt_opt_auto_cc[] = "Send you a cc automatically        : ";
-constext txt_opt_auto_list_thread[] = "List thread using right key        : ";
+constext txt_opt_auto_list_thread[] = "List thread using right arrow key  : ";
 constext txt_opt_auto_reconnect[] = "Reconnect to server automatically  : ";
 constext txt_opt_auto_save[] = "Use Archive-name: header for save  : ";
 constext txt_opt_batch_save[] = "Save articles in batch mode (-S)   : ";
@@ -625,7 +627,7 @@
 constext txt_opt_post_8bit_header[] = "Use 8bit characters in news headers: ";
 constext txt_opt_post_mime_encoding[] = "MIME encoding in news messages     : ";
 constext txt_opt_post_proc_type[] = "Post process saved art/thread with : ";
-constext txt_opt_print_header[] = "Print all header when printing     : ";
+constext txt_opt_print_header[] = "Print all headers when printing    : ";
 constext txt_opt_printer[] = "Printer program with options       : ";
 constext txt_opt_process_only_unread[] = "Process only unread articles       : ";
 constext txt_opt_prompt_followupto[] = "Show empty Followup-To in editor   : ";
@@ -797,6 +799,7 @@
 # Do not edit while tin is running, since all your changes to this file\n\
 # will be overwritten when you leave tin.\n#\n\
 ############################################################################\n\n";
+constext txt_tinrc_info_in_last_line[] = "# if ON use print current subject or newsgroup description in the last line\n";
 constext txt_tinrc_inverse_okay[] = "# if ON use inverse video for page headers at different levels\n";
 #ifdef M_UNIX
 	constext txt_tinrc_keep_dead_articles[] = "# if ON keep all failed postings in ~/dead.articles\n";
diff -Nur tin-980105/src/main.c tin-980117/src/main.c
--- tin-980105/src/main.c	Mon Jan  5 18:50:21 1998
+++ tin-980117/src/main.c	Sun Jan 11 19:14:17 1998
@@ -102,16 +102,16 @@
 	}
 
 	/*
-	 *  Process envargs & command line options
-	 */
-	read_cmd_line_options (argc, argv);
-
-	/*
 	 *  Read user local & global config files
 	 */
 	read_config_file (global_config_file, TRUE);
 	read_config_file (local_config_file, FALSE);
 
+	/*
+	 *  Process envargs & command line options
+	 */
+	read_cmd_line_options (argc, argv);
+
 #ifndef INDEX_DAEMON
 	set_up_private_index_cache ();
 #endif
@@ -123,6 +123,7 @@
 			error_message (txt_screen_init_failed, progname);
 			exit (EXIT_ERROR);
 		}
+		EndInverse ();
 	}
 #	endif
 #endif
@@ -301,9 +302,10 @@
 #endif
 
 	/*
-	 *  Set up screen and switch to raw mode
+	 *  Set up screen and switch to raw mode, set default attributes
 	 */
 	setup_screen ();
+	EndInverse ();
 
 	/*
 	 *  If first time print welcome screen and auto-subscribe
@@ -620,6 +622,12 @@
 		wait_message(1, "Assuming -r in order to use -n\n");
 		read_news_via_nntp = TRUE;	/* We won't get here without NNTP support */
 	}
+	/*
+	 *  If we're reading from an NNTP server and we've been asked not to look
+	 *  for new newsgroups, trust our cached copy of the newsgroups file.
+	 */
+	if (read_news_via_nntp)
+		read_local_newsgroups_file = ! check_for_new_newsgroups;
 #endif
 }
 
diff -Nur tin-980105/src/makecfg.c tin-980117/src/makecfg.c
--- tin-980105/src/makecfg.c	Wed Dec 31 04:08:39 1997
+++ tin-980117/src/makecfg.c	Sun Jan 11 19:12:28 1998
@@ -156,9 +156,8 @@
 typename_of(
 	MYDATA *p)
 {
-	if (!strcmp(p->type, "OPT_STRING")
-	 || !strcmp(p->type, "OPT_CHAR"))
-	 	return "char *";
+	if (!strcmp(p->type, "OPT_STRING") || !strcmp(p->type, "OPT_CHAR"))
+		return "char *";
 	if (!strcmp(p->type, "OPT_ON_OFF"))
 		return "t_bool *";
 	return "int *";
diff -Nur tin-980105/src/misc.c tin-980117/src/misc.c
--- tin-980105/src/misc.c	Wed Dec 31 04:15:05 1997
+++ tin-980117/src/misc.c	Fri Jan 16 17:56:18 1998
@@ -376,10 +376,19 @@
 		}
 	}
 
-	vWriteNewsrc ();
+	/*
+	 * Save the newsrc file. If it fails for some reason, give the user a
+	 * chance to try again
+	 */
+	forever {
+		if (vWriteNewsrc ()) {
+			info_message(txt_newsrc_saved);
+			break;
+		}
 
-/* TODO - can we do anything if saving the newsrc failed ? */
-	info_message(txt_newsrc_saved);
+		if (!prompt_yn (cLINES, txt_newsrc_again, TRUE))
+			break;
+	}
 
 	write_input_history_file ();
 #if 0 /* FIXME */
@@ -390,7 +399,7 @@
 	write_mail_active_file ();
 #endif
 
-	/* Do this after we save the newsrc in case this hangs up for any reason */
+	/* Do this sometime after we save the newsrc in case this hangs up for any reason */
 	if (ret != EXIT_NNTP_ERROR)
 		nntp_close ();			/* disconnect from NNTP server */
 
@@ -461,7 +470,7 @@
 										/* any duplicates of the first nwsg */
 	int	ncnt1;			/* counter for the first newsgroup  */
 	int	ncnt2;			/* counter for the second newsgroup */
-	int 	over1;			/* TRUE when the outer loop is over */
+	int	over1;			/* TRUE when the outer loop is over */
 	int	over2;			/* TRUE when the inner loop is over */
 	char	*ptr;				/* start of next (outer) newsgroup  */
 	char	*ptr2;			/* temporary pointer                */
@@ -1054,7 +1063,7 @@
 			else if (*(s+2) == ' ' && *(s+3) == ':')
 				s += 4;
 			else if (*(s+2) == '^' && isdigit((unsigned char)*(s+3)) && *(s+4) == ':')
-				s += 5; 		/* hurray nn */
+				s += 5;	/* hurray nn */
 			else
 				break;
 		} else
@@ -1354,8 +1363,8 @@
 						xmouse = MOUSE_BUTTON_3;
 						break;
 				}
-				xcol = my_event.x; 	/* column */
-				xrow = my_event.y; 	/* row */
+				xcol = my_event.x;	/* column */
+				xrow = my_event.y;	/* row */
 				code = KEYMAP_MOUSE;
 			}
 			break;
@@ -1516,8 +1525,8 @@
 
 		case 'M':		/* xterminal button press */
 			xmouse = ReadCh () - ' ';	/* button */
-			xcol = ReadCh () - '!'; 	/* column */
-			xrow = ReadCh () - '!'; 	/* row */
+			xcol = ReadCh () - '!';		/* column */
+			xrow = ReadCh () - '!';		/* row */
 			return KEYMAP_MOUSE;
 
 		default:
@@ -2660,4 +2669,32 @@
 	}
 	*target = '\0';
 	return (buff);
+}
+
+/*
+ * strip_address () removes the realname part from a given e-mail address
+ */
+void
+strip_address (
+	char *the_address,
+	char *stripped_address)
+{
+	char *start_pos;
+	char *end_pos;
+
+	/* skip realname in address */
+	if ((start_pos = strchr (the_address, '<')) == (char *) 0) {
+		/* address in user@domain (realname) syntax or realname is missing */
+		strcpy (stripped_address, the_address);
+		start_pos = stripped_address;
+		if ((end_pos = strchr (start_pos, ' ')) == (char *) 0)
+			end_pos = start_pos+strlen(start_pos);
+	} else {
+		start_pos++; /* skip '<' */
+		strcpy (stripped_address, start_pos);
+		start_pos=stripped_address;
+		if ((end_pos = strchr (start_pos, '>')) == (char *) 0)
+		end_pos = start_pos+strlen(start_pos); /* skip '>' */
+	}
+	*(end_pos) = '\0';
 }
diff -Nur tin-980105/src/newsrc.c tin-980117/src/newsrc.c
--- tin-980105/src/newsrc.c	Wed Dec 31 04:10:59 1997
+++ tin-980117/src/newsrc.c	Fri Jan 16 17:17:32 1998
@@ -28,11 +28,11 @@
 #endif /* 0 */
 static char *pcParseSubSeq (struct t_group *psGrp, char *pcSeq, long *plLow, long *plHigh, int *piSum);
 static char *pcParseGetSeq (char *pcSeq, long *plLow, long *plHigh);
+static int iWriteNewsrcLine (FILE *fp, char *line);
 static void auto_subscribe_groups (char *newsrc_file);
 static void create_newsrc (char *newsrc_file);
 static void parse_bitmap_seq (struct t_group *group, char *seq);
 static void print_bitmap_seq (FILE *fp, struct t_group *group);
-static void vWriteNewsrcLine (FILE *fp, char *line);
 
 /*
  *  Read $HOME/.newsrc into my_group[]. my_group[] ints point to
@@ -96,8 +96,12 @@
 }
 
 
-static void
-vWriteNewsrcLine (
+/*
+ * Parse a line from the newsrc file and write it back out with updated
+ * sequence information. Return number of lines written (ie, 0 or 1)
+ */
+static int
+iWriteNewsrcLine (
 	FILE *fp,
 	char *line)
 {
@@ -108,7 +112,7 @@
 	seq = pcParseNewsrcLine (line, &sub);
 
 	if (line[0] == 0 || sub == 0)		/* Insurance against blank line */
-		return;
+		return 0;
 
 	/*
 	 * Find the group in active. If we cannot, then junk it if bogus groups
@@ -120,7 +124,7 @@
 	if (strip_bogus == BOGUS_REMOVE) {
 		if (psGrp == NULL || psGrp->bogus) {
 			wait_message(1, txt_remove_bogus, line);
-			return;
+			return 0;
 		}
 	}
 
@@ -131,13 +135,16 @@
 		if (sub == SUBSCRIBED || !strip_newsrc)
 			fprintf (fp, "%s%c %s\n", line, sub, seq);
 	}
+
+	return 1;
 }
 
 /*
- * Read in the users newsrc file and update the line with sessions changes
+ * Read in the users newsrc file and write a new file with all the changes
+ * changes from the current session. If this works, replace the original
+ * newsrc file.
  */
-
-void
+t_bool
 vWriteNewsrc (void)
 {
 #ifndef INDEX_DAEMON
@@ -145,34 +152,40 @@
 	FILE *fp_op;
 	char *line;
 	char buf[HEADER_LEN];
-	int rename_ok = FALSE;
+	int tot = 0;
+	t_bool write_ok = FALSE;
 
 	if ((fp_ip = fopen (newsrc, "r")) == (FILE *) 0)
-		return;
+		return write_ok;
 
 	if ((fp_op = fopen (newnewsrc, "w" FOPEN_OPTS)) != (FILE *) 0) {
 		if (newsrc_mode)
 			chmod (newnewsrc, newsrc_mode);
 
 		while ((line = tin_fgets (buf, sizeof(buf), fp_ip)) != (char *) 0)
-			vWriteNewsrcLine(fp_op,line);
+			tot += iWriteNewsrcLine(fp_op,line);
 
 		/*
 		 * Don't rename if either fclose() fails or ferror() is set
 		 */
 		if (ferror (fp_op) | fclose (fp_op)) {
-/* TODO return here and give user chance to try again */
 			error_message (txt_filesystem_full, NEWSRC_FILE);
 			unlink (newnewsrc);
 		} else
-			rename_ok = TRUE;
+			write_ok = TRUE;
 	}
 
 	fclose (fp_ip);
 
-	if (rename_ok)
+	if (tot == 0) {
+		error_message (txt_newsrc_nogroups);
+		return TRUE;		/* So we don't get prompted to try again */
+	}
+
+	if (write_ok)
 		rename_file (newnewsrc, newsrc);
 
+	return write_ok;
 #endif	/* INDEX_DAEMON */
 }
 
@@ -930,9 +943,9 @@
 			found = TRUE;
 			continue;
 		} else if (strchr (line, SUBSCRIBED) != (char *) 0) {
-			vWriteNewsrcLine(fp_sub,line);
+			iWriteNewsrcLine(fp_sub,line);
 		} else if (strchr (line, UNSUBSCRIBED) != (char *) 0) {
-			vWriteNewsrcLine(fp_unsub,line);
+			iWriteNewsrcLine(fp_unsub,line);
 		} else {								/* options line at beginning of .newsrc */
 			fprintf (fp_sub, "%s\n", line);
 			option_line = TRUE;
@@ -971,7 +984,7 @@
 		}
 
 		if (pos == subscribed_pos) {
-			vWriteNewsrcLine(fp_out, newsgroup);
+			iWriteNewsrcLine(fp_out, newsgroup);
 			repositioned = TRUE;
 		}
 
@@ -981,7 +994,7 @@
 	}
 
 	if (!repositioned) {
-		vWriteNewsrcLine(fp_out, newsgroup);
+		iWriteNewsrcLine(fp_out, newsgroup);
 		repositioned = TRUE;
 	}
 
diff -Nur tin-980105/src/open.c tin-980117/src/open.c
--- tin-980105/src/open.c	Wed Dec 31 04:11:51 1997
+++ tin-980117/src/open.c	Sat Jan 17 21:34:37 1998
@@ -147,7 +147,7 @@
 
 	}
 
-   if (!is_reconnect) {
+	if (!is_reconnect) {
 		if (!can_post)
 			wait_message(0, "%s\n", txt_cannot_post);
 
@@ -157,10 +157,30 @@
 		strncpy(bug_nntpserver2, linep, sizeof(bug_nntpserver2)-1);
 		bug_nntpserver2[sizeof(bug_nntpserver2)-1] = '\0';
 
-		if (sec)
-			wait_message(0, "%s\n", bug_nntpserver2);
-		else
-			wait_message(0, "%s\n", bug_nntpserver1);
+		{
+			char *chr1, *chr2;
+			int j;
+
+			j = atoi(get_val("COLUMNS", "80"));
+
+			if (sec)
+				chr1 = my_strdup(bug_nntpserver2);
+			else
+				chr1 = my_strdup(bug_nntpserver1);
+
+			if (((int)strlen(chr1))>=j) {
+				chr2 = chr1+strlen(chr1)-1;
+				while(chr2-chr1>=j)
+					chr2--;
+				while(chr2>chr1 && *chr2!=' ')
+					chr2--;
+				if (chr2!=chr1)
+					*chr2 = '\n';
+			}
+
+			wait_message(0, "%s\n", chr1);
+			free(chr1);
+		}
 
 		is_reconnect = TRUE;
 	}
@@ -210,11 +230,11 @@
 
 /*
  *  Get a response code from the server.
- * 	Returns:
- *		+ve NNTP return code
- * 		-1  on an error
+ *  Returns:
+ *    +ve NNTP return code
+ *    -1  on an error
  *  If 'message' is not NULL, then any trailing text after the response
- *	code is copied into it.
+ *	 code is copied into it.
  *  Performs authentication if required and repeats the last command if
  *  necessary after a timeout.
  */
@@ -438,14 +458,19 @@
 open_newsgroups_fp (void)
 {
 #ifdef NNTP_ABLE
+	FILE *result;
 	if (read_news_via_nntp) {
 		if (read_local_newsgroups_file) {
+			result = fopen (local_newsgroups_file, "r");
+			if (result != NULL) {
 # ifdef DEBUG
-			debug_nntp ("open_newsgroups_fp", "Using local copy of newsgroups file");
+				debug_nntp ("open_newsgroups_fp", "Using local copy of newsgroups file");
 # endif /* DEBUG */
-			return fopen (local_newsgroups_file, "r");
-		} else
-			return (nntp_command ("LIST NEWSGROUPS", OK_GROUPS, NULL));
+				return result;
+			}
+			read_local_newsgroups_file = FALSE ;
+		}
+		return (nntp_command ("LIST NEWSGROUPS", OK_GROUPS, NULL));
 	} else
 #endif /* NNTP_ABLE */
 		return fopen (newsgroups_file, "r");
diff -Nur tin-980105/src/page.c tin-980117/src/page.c
--- tin-980105/src/page.c	Fri Dec 26 03:44:49 1997
+++ tin-980117/src/page.c	Sun Jan 11 19:08:20 1998
@@ -725,8 +725,10 @@
 				break;
 
 			case iKeyPagePostHist:	/* display messages posted by user */
-				if (user_posted_messages ())
+				if (user_posted_messages ()) {
+					set_signals_page ();
 					redraw_page (group->name, respnum);
+				}
 				break;
 
 			case iKeyPageRepost:	/* repost current article */
@@ -742,7 +744,7 @@
 				skip_include = first_char;
 				goto page_down;
 
-			case iKeyPageDisplaySubject:
+			case iKeyToggleInfoLastLine: /* this is _not_ correct, we do not toggle status here */
 				clear_message();
 				center_line (cLINES, FALSE, arts[respnum].subject);
 				break;
@@ -1602,7 +1604,7 @@
  * Returns:
  *	FALSE	Header was not matched.
  *	TRUE	Header was matched. body contains NULL terminated content
- * 			portion of buf (ie with pat: and leading space removed)
+ *       portion of buf (ie with pat: and leading space removed)
  */
 int
 match_header (
diff -Nur tin-980105/src/pgp.c tin-980117/src/pgp.c
--- tin-980105/src/pgp.c	Wed Dec 31 04:12:03 1997
+++ tin-980117/src/pgp.c	Sat Jan 10 02:00:29 1998
@@ -108,9 +108,9 @@
 	sprintf(pt, PLAINTEXT, TMPDIR, pid);
 	sprintf(ct, CIPHERTEXT, TMPDIR, pid);
 	mask = umask(077);
-	if ((art = fopen(file, "r")) == (FILE *) 0) {
+	if ((art = fopen(file, "r")) == (FILE *) 0)
 		return;
-	}
+
 	if ((header = fopen(hdr, "w")) == (FILE *) 0) {
 		fclose(art);
 		return;
@@ -144,19 +144,25 @@
 	char *mail_to)
 {
 	char cmd[LEN], options[10];
+	char address[LEN];
 
 	split_file(file);
-	strcpy(options, "-at");
+	strcpy (options, "-at");
 
 #	ifdef HAVE_PGP_2
 	if (what & ENCRYPT)
 		strcat(options, "e");
 	if (what & SIGN)
 		strcat(options, "s");
-	sh_format (cmd, sizeof(cmd), "%s %s %s %s %s", PGPNAME, pgpopts, options, pt, mail_to ? mail_to : "");
-#	else
-#		ifdef HAVE_PGP_5
 
+	if (*mail_address) {
+		strip_address (mail_address, address);
+		sh_format (cmd, sizeof(cmd), "%s %s %s %s %s -u %s", PGPNAME, pgpopts, options, pt, mail_to ? mail_to : "", address);
+	} else
+		sh_format (cmd, sizeof(cmd), "%s %s %s %s %s", PGPNAME, pgpopts, options, pt, mail_to ? mail_to : "");
+
+#	else /* FIXME - check mail_address */
+#		ifdef HAVE_PGP_5
 	if (what & ENCRYPT && what & SIGN) {
 		strcat (options, "s");
 		sh_format (cmd, sizeof(cmd), "%se %s %s %s %s", PGPNAME, pgpopts, options, pt, mail_to ? mail_to : "");
@@ -177,16 +183,20 @@
 	char *file)
 {
 	FILE *f, *key;
-	char keyfile[PATH_LEN], cmd[LEN], user[50], buf[LEN];
+	char keyfile[PATH_LEN], cmd[LEN], buf[LEN];
+
+	if (*mail_address)
+		strip_address (mail_address, buf);
+	else
+		sprintf(buf, "%s@%s", userid, host_name);
 
-	sprintf(user, "%s@%s", userid, host_name);
 	sprintf(keyfile, KEYFILE, TMPDIR, (char)getpid());
 
 #	ifdef HAVE_PGP_2
-	sh_format (cmd, sizeof(cmd), "%s %s -kxa %s %s", PGPNAME, pgpopts, user, keyfile);
+	sh_format (cmd, sizeof(cmd), "%s %s -kxa %s %s", PGPNAME, pgpopts, buf, keyfile);
 #	else
 #		ifdef HAVE_PGP_5
-	sh_format (cmd, sizeof(cmd), "%sk %s -xa %s %s", PGPNAME, pgpopts, user, keyfile);
+	sh_format (cmd, sizeof(cmd), "%sk %s -xa %s %s", PGPNAME, pgpopts, buf, keyfile);
 #		endif /* HAVE_PGP_5 */
 #	endif /* HAVE_PGP_2 */
 
diff -Nur tin-980105/src/post.c tin-980117/src/post.c
--- tin-980105/src/post.c	Sat Jan  3 12:55:58 1998
+++ tin-980117/src/post.c	Sun Jan 11 19:09:18 1998
@@ -1558,7 +1558,7 @@
 						info_message (txt_art_rejected, dead_article);
 						ReadCh ();
 					}
-				 	return redraw_screen;
+					return redraw_screen;
 				}
 			case iKeyPostPostpone:
 				postpone_article(article);
@@ -1908,8 +1908,7 @@
 			msg_add_header ("Newsgroups", note_h.newsgroups);
 			if (prompt_followupto)
 				msg_add_header("Followup-To",
-	  			  (strchr(note_h.newsgroups, ',') != (char *) 0) ?
-				    note_h.newsgroups : "");
+				(strchr(note_h.newsgroups, ',') != (char *) 0) ? note_h.newsgroups : "");
 			if (psGrp && psGrp->attribute->followup_to != (char *) 0) {
 				msg_add_header ("Followup-To", psGrp->attribute->followup_to);
 			} else {
diff -Nur tin-980105/src/refs.c tin-980117/src/refs.c
--- tin-980105/src/refs.c	Mon Jan  5 01:11:58 1998
+++ tin-980117/src/refs.c	Mon Jan  5 23:17:43 1998
@@ -863,7 +863,7 @@
 #ifdef DEBUG_REFS
 	dbgfd = fopen("Refs.dump", "w");
 	setvbuf (dbgfd, NULL, 0, _IONBF);
-	fprintf(dbgfd, "MSGID phase\n");
+	fprintf (dbgfd, "MSGID phase\n");
 #endif
 
 	/*
diff -Nur tin-980105/src/save.c tin-980117/src/save.c
--- tin-980105/src/save.c	Mon Jan  5 01:46:32 1998
+++ tin-980117/src/save.c	Sun Jan 11 19:45:08 1998
@@ -285,7 +285,7 @@
 #ifndef INDEX_DAEMON
 
 	char *file;
-	char mode[8];
+	char mode[3];
 	char save_art_info[LEN];
 	FILE *fp;
 	int ch;
@@ -342,25 +342,12 @@
 		 * on top of each article
 		 */
 		char from[HEADER_LEN];
-		char * from_login_pos;
-		char * from_end_pos;
 		time_t epoch;
-	
-		strcpy (from, note_h.from); /* make a working copy */
-	
-		/* skip realname in from */
-		if ((from_login_pos = strchr (from, '<')) == (char *) 0) {
-			/* address in user@domain (realname) syntax or realname is missing */
-			from_login_pos = from;
-			if ((from_end_pos = strchr (from_login_pos, ' ')) == (char *) 0)
-				from_end_pos = from_login_pos+strlen(from_login_pos);
-		} else {
-			from_login_pos++; /* skip '<' */
-			from_end_pos = from_login_pos+strlen(from_login_pos)-1; /* skip '>' */
-		}
-		*(from_end_pos) = '\0';
+
+		strip_address (note_h.from, from);
+
 		time (&epoch);
-		fprintf (fp, "From %s %s", from_login_pos, ctime (&epoch));
+		fprintf (fp, "From %s %s", from, ctime (&epoch));
 	}
 
 	if (fseek (note_fp, 0L, SEEK_SET) == -1)
diff -Nur tin-980105/src/select.c tin-980117/src/select.c
--- tin-980105/src/select.c	Fri Dec 26 03:45:01 1997
+++ tin-980117/src/select.c	Fri Jan 16 12:45:08 1998
@@ -51,7 +51,7 @@
 
 	char buf[LEN];
 	char post_group[LEN];
-	int ch, i, n;
+	int i, n, ch, ch1 = 0;
 	int INDEX_BOTTOM;
 	int posted_flag;
 	int scroll_lines;
@@ -82,6 +82,15 @@
 		}
 		set_xclick_on ();
 		ch = ReadCh ();
+#ifndef WIN32
+		switch(ch) {
+			case ESC:	/* (ESC) common arrow keys */
+#ifdef HAVE_KEY_PREFIX
+			case KEY_PREFIX:
+#endif
+				ch1 = get_arrow_key (ch);
+		}
+#endif /* WIN32 */
 		if (ch != iKeyQuit && ch != iKeySelectQuit2) {
 			(void) resync_active_file ();
 		}
@@ -96,7 +105,7 @@
 #ifdef HAVE_KEY_PREFIX
 			case KEY_PREFIX:
 #endif
-				switch (get_arrow_key (ch)) {
+				switch (ch1) {
 #endif /* WIN32 */
 					case KEYMAP_UP:
 						goto select_up;
@@ -370,13 +379,9 @@
 				break;
 #endif
 
-			case iKeySelectDisplayGroupInfo:	/* display group description */
-				if (!group_top)
-					info_message (txt_no_groups);
-				else {
-					clear_message ();
-					center_line (cLINES, FALSE, CURR_GROUP.description ?  CURR_GROUP.description : txt_no_description);
-				}
+			case iKeyToggleInfoLastLine:	/* display group description */
+				info_in_last_line = !info_in_last_line;
+				show_selection_page ();
 				break;
 
 			case iKeySelectMoveGrp:	/* reposition group within group list */
@@ -443,11 +448,11 @@
 				break;
 
 			case iKeySelectToggleReadDisplay:
-	 			/*
-	 			 * If in show_only_unread_groups mode toggle
-	 			 * all subscribed to groups and only groups
-	 			 * that contain unread articles
-	 			 */
+				/*
+				 * If in show_only_unread_groups mode toggle
+				 * all subscribed to groups and only groups
+				 * that contain unread articles
+				 */
 				show_only_unread_groups = !show_only_unread_groups;
 				wait_message (0, txt_reading_groups, (show_only_unread_groups) ? "unread" : "all");
 
@@ -490,9 +495,11 @@
 				} else if (CURR_GROUP.bogus && strip_bogus == BOGUS_ASK) {
 					/* Bogus groups aren't subscribed to avoid confusion */
 					sprintf (buf, txt_remove_bogus, CURR_GROUP.name);
-					delete_group(CURR_GROUP.name);
-					read_newsrc(newsrc, 1);
-					show_selection_page();
+					vWriteNewsrc();	/* save current newsrc */
+					delete_group(CURR_GROUP.name); /* remove bogus group */
+					read_newsrc(newsrc, 1);	/* reload newsrc*/
+					toggle_my_groups (show_only_unread_groups, ""); /* keep current display-state */
+					show_selection_page(); /* reddraw screen */
 					info_message (buf);
 				}
 
@@ -709,7 +716,7 @@
 		n = my_group[i];
 
 		/*
-	 	 * Display a flag for this group if needed
+		 * Display a flag for this group if needed
 		 * . Bogus groups are dumped immediately
 		 * . Normal subscribed groups may be
 		 *   ' ' normal, 'X' not postable, 'M' moderated, '=' renamed
@@ -723,7 +730,7 @@
 		else if (active[n].newgroup)
 			subs = 'N';		/* New (but unsubscribed) group */
 		else
-	 		subs = 'u';		/* unsubscribed group */
+			subs = 'u';		/* unsubscribed group */
 
 		strncpy(active_name, active[n].name, groupname_len);
 		active_name[groupname_len+1] = '\0';
@@ -825,6 +832,12 @@
 draw_group_arrow (void)
 {
 	draw_arrow (INDEX_TOP + (cur_groupnum-first_group_on_screen));
+	if (!group_top)
+		info_message (txt_no_groups);
+	else if (info_in_last_line) {
+		clear_message ();
+		center_line (cLINES, FALSE, CURR_GROUP.description ?  CURR_GROUP.description : txt_no_description);
+	}
 }
 
 
@@ -909,19 +922,19 @@
 {
 	int i,j;
 
-	i = find_group_index (group);
+	if ((i = find_group_index (group)) < 0)
+		return -1;
 
-	if (i >= 0) {
-		for (j = 0; j < group_top; j++) {
-			if (my_group[j] == i) {
-				return j;
-			}
-		}
-		if (add) {
-			my_group[group_top++] = i;
-			return (group_top - 1);
-		}
+	for (j = 0; j < group_top; j++) {
+		if (my_group[j] == i)
+			return j;
 	}
+
+	if (add) {
+		my_group[group_top++] = i;
+		return (group_top - 1);
+	}
+
 	return -1;
 }
 
@@ -990,10 +1003,8 @@
 		return (default_num);
 	}
 }
-#endif /* INDEX_DAEMON */
 
 
-#ifndef INDEX_DAEMON
 static void
 catchup_group (
 	struct t_group *group,
@@ -1013,10 +1024,8 @@
 		}
 	}
 }
-#endif /* INDEX_DAEMON */
 
 
-#ifndef INDEX_DAEMON
 static int
 next_unread_group (
 	int enter_group)
@@ -1049,8 +1058,7 @@
 		erase_group_arrow ();
 	}
 	cur_groupnum = i;
-	if (cur_groupnum < first_group_on_screen ||
-	    cur_groupnum >= last_group_on_screen) {
+	if (cur_groupnum < first_group_on_screen || cur_groupnum >= last_group_on_screen) {
 		show_selection_page ();
 	} else {
 		draw_group_arrow ();
@@ -1071,7 +1079,7 @@
 
 	return GRP_CONTINUE;
 }
-#endif /* INDEX_DAEMON */
+#endif /* !INDEX_DAEMON */
 
 /*
  *  Calculate max length of groupname field for group selection level.
@@ -1149,20 +1157,18 @@
 
 	if (group_top) {
 		if (!only_unread_groups || reread_active_file) {
-			if (strlen (group)) {
-				if ((i = find_group_index (group)) >= 0) {
+
+			if (group[0] != '\0') {
+				if ((i = find_group_index (group)) >= 0)
 					active_idx = i;
-				}
-			} else {
+			} else
 				active_idx = my_group[group_num];
-			}
-			my_strncpy (old_curr_group, active[active_idx].name,
-				sizeof (old_curr_group));
+
+			my_strncpy (old_curr_group, active[active_idx].name, sizeof (old_curr_group));
 		} else {
 			for (i = group_num ; i < group_top ; i++) {
 				if (active[my_group[i]].newsrc.num_unread) {
-					my_strncpy (old_curr_group, active[my_group[i]].name,
-						sizeof (old_curr_group));
+					my_strncpy (old_curr_group, active[my_group[i]].name, sizeof (old_curr_group));
 					break;
 				}
 			}
@@ -1172,20 +1178,17 @@
 	group_top = skip_newgroups();			/* Reposition after any newgroups */
 
 	while (fgets (buf, sizeof (buf), fp) != (char *) 0) {
-		ptr = strchr (buf, SUBSCRIBED);
-		if (ptr != (char *) 0) {
+		if ((ptr = strchr (buf, SUBSCRIBED)) != (char *) 0) {
 			*ptr = '\0';
-			if ((i = find_group_index (buf)) >= 0) {
-				if (only_unread_groups) {
-/* TODO - no attempt is made here to prevent duplicates */
-					if (active[i].newsrc.num_unread || (active[i].bogus && strip_bogus == BOGUS_ASK)) {
-						my_group[group_top] = i;
-						group_top++;
-					}
-				} else {
-					my_group[group_top] = i;
-					group_top++;
-				}
+
+			if ((i = find_group_index (buf)) < 0)
+				continue;
+
+			if (only_unread_groups) {
+				if (active[i].newsrc.num_unread || (active[i].bogus && strip_bogus == BOGUS_ASK))
+					my_group_add (buf);
+			} else {
+				my_group_add (buf);
 			}
 		}
 	}
diff -Nur tin-980105/src/string.c tin-980117/src/string.c
--- tin-980105/src/string.c	Mon Jan  5 02:26:26 1998
+++ tin-980117/src/string.c	Thu Jan 15 16:53:01 1998
@@ -15,8 +15,8 @@
 #include	"tin.h"
 
 /*
-** this file needs some work
-*/
+ * this file needs some work
+ */
 
 /*
  * special itoa()
diff -Nur tin-980105/src/thread.c tin-980117/src/thread.c
--- tin-980105/src/thread.c	Wed Dec 31 04:13:47 1997
+++ tin-980117/src/thread.c	Thu Jan 15 16:31:23 1998
@@ -156,8 +156,8 @@
 		make_prefix(art->refptr, buff+strlen(buff));
 
 		if ((int)strlen(buff) >= cCOLS) { /* If extremely nested */
-		    WriteLine(INDEX2LNUM(l), buff);
-		    return;
+			WriteLine(INDEX2LNUM(l), buff);
+			return;
 		}
 
 #if 0 /* see #if 0 above */
@@ -178,7 +178,7 @@
 
 		if (i > 0) {
 			if (!(art->refptr->parent &&
-			  art->refptr->parent->article != ART_NORMAL &&
+			  art->refptr->parent->article != ART_UNAVAILABLE &&
 			  arts[art->refptr->parent->article].subject ==
 			  art->subject))
 				strncat(buff, art->subject, i);
@@ -668,7 +668,7 @@
 				show_thread_page ();
 				break;
 
-			case iKeyThreadUntag:  			 /* untag all articles */
+			case iKeyThreadUntag:			/* untag all articles */
 				if (index_point >= 0) {
 					if (untag_all_articles())
 						update_thread_page();
@@ -732,6 +732,11 @@
 					info_message(txt_cannot_post);
 				break;
 
+			case iKeyToggleInfoLastLine:  /* display subject in last line */
+				info_in_last_line = !info_in_last_line;
+				show_thread_page();
+				break;
+
 			default:
 				info_message (txt_bad_command);
 		}
@@ -863,13 +868,11 @@
 	}
 	stow_cursor();
 
-/*
- * show current subject in the last line - this is done a bit to often
- * and could slow down things, but I like it
- */
-	clear_message();
-	/* We do it this way in case there are formatting chars in the subject */
-	center_line (cLINES, FALSE, arts[find_response (thread_basenote, thread_index_point)].subject);
+	if (info_in_last_line) {
+		clear_message();
+		/* We do it this way in case there are formatting chars in the subject */
+		center_line (cLINES, FALSE, arts[find_response (thread_basenote, thread_index_point)].subject);
+	}
 }
 #endif /* INDEX_DAEMON */
 
@@ -1236,7 +1239,7 @@
 
 /*
  * mutt-like subject according. by sjpark@sparcs.kaist.ac.kr
- */  
+ */
 static void
 make_prefix (
 	struct t_msgid *art,
diff -Nur tin-980105/src/tincfg.tbl tin-980117/src/tincfg.tbl
--- tin-980105/src/tincfg.tbl	Fri Dec 26 03:45:11 1997
+++ tin-980117/src/tincfg.tbl	Fri Jan  9 16:24:28 1998
@@ -10,81 +10,53 @@
 ;               trade or  reproduction.  You may not change this copy-
 ;               right notice, and it must be included in any copy made
 
-	default_savedir			OPT_STRING
-	default_auto_save		OPT_ON_OFF
-	mark_saved_read			OPT_ON_OFF
-	default_post_proc_type		txt_post_process POST_PROC_UUD_EXT_ZIP+1
-	process_only_unread		OPT_ON_OFF
-	prompt_followupto		OPT_ON_OFF
-	confirm_action			OPT_ON_OFF
-	confirm_to_quit			OPT_ON_OFF
-	auto_reconnect			OPT_ON_OFF
+; display options
+	beginner_level			OPT_ON_OFF
+	show_description		OPT_ON_OFF
+	default_show_author		txt_show_from	SHOW_FROM_BOTH+1
 	draw_arrow_mark			OPT_ON_OFF
 	inverse_okay			OPT_ON_OFF
+	default_thread_arts		txt_thread	THREAD_MAX+1
+	default_sort_art_type		txt_sort_type	SORT_BY_SCORE_ASCEND+1
 	pos_first_unread		OPT_ON_OFF
 	default_show_only_unread	OPT_ON_OFF
 	show_only_unread_groups		OPT_ON_OFF
 	tab_goto_next_unread		OPT_ON_OFF
 	space_goto_next_unread		OPT_ON_OFF
 	pgdn_goto_next			OPT_ON_OFF
+	auto_list_thread		OPT_ON_OFF
 	tab_after_X_selection		OPT_ON_OFF
-	full_page_scroll		OPT_ON_OFF
-	show_last_line_prev_page	OPT_ON_OFF
-	catchup_read_groups		OPT_ON_OFF
-	group_catchup_on_exit		OPT_ON_OFF
-	thread_catchup_on_exit		OPT_ON_OFF
-	default_thread_arts		txt_thread	THREAD_MAX+1
-	show_description		OPT_ON_OFF
-	default_show_author		txt_show_from	SHOW_FROM_BOTH+1
-	news_headers_to_display		OPT_STRING
-	news_headers_to_not_display	OPT_STRING
-	default_sort_art_type		txt_sort_type	SORT_BY_SCORE_ASCEND+1
-	default_maildir			OPT_STRING
-	save_to_mmdf_mailbox		OPT_ON_OFF
-	show_xcommentto			OPT_ON_OFF
-	print_header			OPT_ON_OFF
-	default_printer			OPT_STRING
-	default_batch_save		OPT_ON_OFF
-	start_editor_offset		OPT_ON_OFF
-	default_editor_format		OPT_STRING
-	default_mailer_format		OPT_STRING
-	use_mailreader_i		OPT_ON_OFF
-	show_lines			OPT_ON_OFF
-	unlink_article			OPT_ON_OFF
-	keep_posted_articles		OPT_ON_OFF
-	add_posted_to_filter		OPT_ON_OFF
-#ifdef	M_UNIX
-	keep_dead_articles		OPT_ON_OFF
-#endif
-	default_sigfile			OPT_STRING
-	sigdashes			OPT_ON_OFF
-	signature_repost		OPT_ON_OFF
-	advertising			OPT_ON_OFF
-	reread_active_file_secs		OPT_NUM
-	quote_chars			OPT_STRING
-	quote_empty_lines		OPT_ON_OFF
-	quote_signatures		OPT_ON_OFF
-	show_signatures			OPT_ON_OFF
-	news_quote_format		OPT_STRING
-	xpost_quote_format		OPT_STRING
-	mail_quote_format		OPT_STRING
-	auto_cc				OPT_ON_OFF
-	auto_bcc			OPT_ON_OFF
 	art_marked_deleted		OPT_CHAR
 	art_marked_inrange		OPT_CHAR
 	art_marked_return		OPT_CHAR
 	art_marked_selected		OPT_CHAR
 	art_marked_unread		OPT_CHAR
-	force_screen_redraw		OPT_ON_OFF
-#if defined(NNTP_ABLE) || defined(NNTP_ONLY)
-	use_builtin_inews		OPT_ON_OFF
+	groupname_max_length		OPT_NUM
+	show_lines			OPT_ON_OFF
+	full_page_scroll		OPT_ON_OFF
+	show_last_line_prev_page	OPT_ON_OFF
+	show_signatures			OPT_ON_OFF
+	news_headers_to_display		OPT_STRING
+	news_headers_to_not_display	OPT_STRING
+	show_xcommentto			OPT_ON_OFF
+	display_mime_header_asis	OPT_ON_OFF
+	display_mime_allheader_asis	OPT_ON_OFF
+	alternative_handling		OPT_ON_OFF
+#ifdef	HAVE_METAMAIL
+	use_metamail			OPT_ON_OFF
+	ask_for_metamail		OPT_ON_OFF
 #endif
-	auto_list_thread		OPT_ON_OFF
+	catchup_read_groups		OPT_ON_OFF
+	group_catchup_on_exit		OPT_ON_OFF
+	thread_catchup_on_exit		OPT_ON_OFF
+	confirm_action			OPT_ON_OFF
+	confirm_to_quit			OPT_ON_OFF
 	use_mouse			OPT_ON_OFF
-	strip_blanks			OPT_ON_OFF
-	groupname_max_length		OPT_NUM
-	beginner_level			OPT_ON_OFF
-	default_filter_days		OPT_NUM
+#ifdef	HAVE_KEYPAD
+	use_keypad			OPT_ON_OFF
+#endif
+
+; colour options
 #ifdef	HAVE_COLOR
 	use_color_tinrc			OPT_ON_OFF
 	col_normal			txt_colors	MAX_COLOR+1
@@ -108,23 +80,60 @@
 	col_markstar			txt_colors	MAX_COLOR+1
 	col_markdash			txt_colors	MAX_COLOR+1
 #endif
+
+; posting/mailing options
 	mail_address			OPT_STRING
+	prompt_followupto		OPT_ON_OFF
+	default_sigfile			OPT_STRING
+	sigdashes			OPT_ON_OFF
+	signature_repost		OPT_ON_OFF
+	quote_chars			OPT_STRING
+	quote_empty_lines		OPT_ON_OFF
+	quote_signatures		OPT_ON_OFF
+	news_quote_format		OPT_STRING
+	xpost_quote_format		OPT_STRING
+	mail_quote_format		OPT_STRING
+	advertising			OPT_ON_OFF
 	mm_charset			OPT_STRING
 	post_mime_encoding		txt_mime_types	NUM_MIME_TYPES
 	post_8bit_header		OPT_ON_OFF
 	mail_mime_encoding		txt_mime_types	NUM_MIME_TYPES
 	mail_8bit_header		OPT_ON_OFF
-	display_mime_header_asis	OPT_ON_OFF
-	display_mime_allheader_asis	OPT_ON_OFF
-#ifdef	HAVE_METAMAIL
-	use_metamail			OPT_ON_OFF
-	ask_for_metamail		OPT_ON_OFF
+	strip_blanks			OPT_ON_OFF
+	auto_cc				OPT_ON_OFF
+	auto_bcc			OPT_ON_OFF
+	default_filter_days		OPT_NUM
+	add_posted_to_filter		OPT_ON_OFF
+
+; saving/printing options
+	default_maildir			OPT_STRING
+	save_to_mmdf_mailbox		OPT_ON_OFF
+	default_batch_save		OPT_ON_OFF
+	default_savedir			OPT_STRING
+	default_auto_save		OPT_ON_OFF
+	mark_saved_read			OPT_ON_OFF
+	default_post_proc_type		txt_post_process POST_PROC_UUD_EXT_ZIP+1
+	process_only_unread		OPT_ON_OFF
+	print_header			OPT_ON_OFF
+	default_printer			OPT_STRING
+
+; expert options
+	wildcard			txt_wildcard	2
+	force_screen_redraw		OPT_ON_OFF
+	start_editor_offset		OPT_ON_OFF
+	default_editor_format		OPT_STRING
+#if defined(NNTP_ABLE) || defined(NNTP_ONLY)
+	use_builtin_inews		OPT_ON_OFF
 #endif
-#ifdef	HAVE_KEYPAD
-	use_keypad			OPT_ON_OFF
+	default_mailer_format		OPT_STRING
+	use_mailreader_i		OPT_ON_OFF
+	unlink_article			OPT_ON_OFF
+	keep_posted_articles		OPT_ON_OFF
+#ifdef	M_UNIX
+	keep_dead_articles		OPT_ON_OFF
 #endif
-	alternative_handling		OPT_ON_OFF
 	strip_newsrc			OPT_ON_OFF
 	strip_bogus			txt_strip_bogus BOGUS_ASK+1
-	wildcard			txt_wildcard	2
+	reread_active_file_secs		OPT_NUM
+	auto_reconnect			OPT_ON_OFF
 	cache_overview_files		OPT_ON_OFF
