home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume23 / tin / patch04a < prev    next >
Text File  |  1991-10-19  |  50KB  |  1,865 lines

  1. Newsgroups: comp.sources.misc
  2. From: iain@norisc.siemens.de (Iain J. Lea)
  3. Subject:  v23i082:  tin - threaded full screen newsreader, Patch04a/2
  4. Message-ID: <csm-v23i082=tin.222227@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: 7a071d53a42a6808654be4c0601be0b5
  6. Date: Sun, 20 Oct 1991 03:22:51 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: iain@norisc.siemens.de (Iain J. Lea)
  10. Posting-number: Volume 23, Issue 82
  11. Archive-name: tin/patch04a
  12. Environment: BSD, SCO, ISC, SUNOS, SYSVR3, SYSVR4, ULTRIX, XENIX
  13. Patch-To: tin: Volume 23, Issue 15-23
  14.  
  15. This patch updates tin 1.0 PL3 to PL4 (patchlevel 4).
  16.  
  17. To apply unpack all 2 parts of this patch and then enter:
  18.  
  19.   patch < tin.patch04
  20.  
  21. Major changes over tin 1.0 PL3 are the following:
  22.  
  23. o  ESC key now aborts most operations.
  24. o  added rtin link to tin. rtin aliases to tin -r to read news via NNTP.
  25. o  added speedup to screen display for slow baud rate terminals.
  26.  
  27. Iain
  28.  
  29. --cut here--
  30. #!/bin/sh
  31. # This is tin1.0, a shell archive (shar 3.24)
  32. # made 10/02/1991 18:50 UTC by iain@estevax.uucp
  33. # Source directory /piez/iain/tin
  34. #
  35. # existing files WILL be overwritten
  36. #
  37. # This is part 1 of a multipart archive                                    
  38. # do not concatenate these parts, unpack them in order with /bin/sh        
  39. #
  40. # This shar contains:
  41. # length  mode       name
  42. # ------ ---------- ------------------------------------------
  43. #  58972 -rw------- tin.patch04
  44. #
  45. if touch 2>&1 | fgrep '[-amc]' > /dev/null
  46.  then TOUCH=touch
  47.  else TOUCH=true
  48. fi
  49. if test -r shar3_seq_.tmp; then
  50.     echo "Must unpack archives in sequence!"
  51.     next=`cat shar3_seq_.tmp`; echo "Please unpack part $next next"
  52.     exit 1
  53. fi
  54. # ============= tin.patch04 ==============
  55. echo "x - extracting tin.patch04 (Text)"
  56. sed 's/^X//' << 'SHAR_EOF' > tin.patch04 &&
  57. Xdiff -rcs 103/CHANGES 104/CHANGES
  58. X*** 103/CHANGES    Mon Sep 30 14:52:28 1991
  59. X--- 104/CHANGES    Wed Oct  2 19:35:59 1991
  60. X***************
  61. X*** 1,3 ****
  62. X--- 1,31 ----
  63. X+ CHANGES tin v1.0 PL3 -> tin 1.0 PL4
  64. X+ -----------------------------------
  65. X+ 
  66. X+ 1)  iain@estevax.uucp (Iain Lea)
  67. X+     ADD. post.c - added default subject to post_base() routine.
  68. X+ 
  69. X+ 2)  iain@estevax.uucp (Iain Lea)
  70. X+     ADD. prompt.c - added ESC key to data entry routines for easy aborting.
  71. X+ 
  72. X+ 3)  oelhaf@norisc.uucp (Reiner Oelhaf)
  73. X+     BUG. man page said to put add address in file ~/.tin/add_address but
  74. X+          this does not work.
  75. X+     FIX. misc.c - changed ~/.tin/add_addr to ~/.tin/add_address
  76. X+     
  77. X+ 4)  pgf@cayman.com (Paul Fox)
  78. X+     ADD. add code to tin to recognize if progname was tin / rtin. If
  79. X+          rtin read news via NNTP (ie. like tin -r).
  80. X+     FIX. main.c - check if 1st letter of argv[0] is 'r' and if so read
  81. X+          news via NNTP. 
  82. X+ 
  83. X+ 5)  hakanl@lulea.telesoft.se (Hakan Lennestal)
  84. X+     BUG. In some places set_real_uid_gid()/set_tin_uid_gid() are needed
  85. X+          when tin is setuid. Thanx for the supplied patch.
  86. X+     FIX. feed.c save.c - applied supplied patch file. 
  87. X+ 
  88. X+ 6)  iain@estevax.uucp (Iain Lea)
  89. X+     ADD. group.c - added speedup when displaying articles over slow line.
  90. X+ 
  91. X  CHANGES tin v1.0 PL2 -> tin 1.0 PL3
  92. X  -----------------------------------
  93. X  
  94. Xdiff -rcs 103/MANIFEST 104/MANIFEST
  95. X*** 103/MANIFEST    Mon Sep 30 07:58:33 1991
  96. X--- 104/MANIFEST    Wed Oct  2 19:49:03 1991
  97. X***************
  98. X*** 1,39 ****
  99. X! MANIFEST for tin newsreader (Mon Sep 30 07:55:48 MET 1991)
  100. X! --------------------------------------------------------------
  101. X!     4698 README
  102. X!    17602 CHANGES
  103. X!     2060 TODO
  104. X       530 UPDATE_INDEX
  105. X!     9042 Makefile
  106. X!    27729 tin.1
  107. X      2247 wildmat.3
  108. X!     9798 tin.h
  109. X!     9739 lang.h
  110. X      3720 nntp.h
  111. X!    17303 proto.h
  112. X        21 patchlevel.h
  113. X!    28499 art.c
  114. X      6043 curses.c
  115. X      2631 debug.c
  116. X!    11387 feed.c
  117. X!    19434 group.c
  118. X!     2818 hashstr.c
  119. X!     5150 help.c
  120. X!    10301 kill.c
  121. X!    17947 lang.c
  122. X!     8130 main.c
  123. X      6239 memory.c
  124. X!    20999 misc.c
  125. X!    19676 newsrc.c
  126. X!     6791 open.c
  127. X!    24789 page.c
  128. X!    17279 post.c
  129. X!     3098 prompt.c
  130. X!    18671 rcfile.c
  131. X!    19589 save.c
  132. X!     2171 screen.c
  133. X!     7830 search.c
  134. X!    19856 select.c
  135. X      7531 signal.c
  136. X      4749 wildmat.c
  137. X!   396097 total
  138. X--- 1,40 ----
  139. X! MANIFEST for tin newsreader (Wed Oct  2 19:49:00 MET 1991)
  140. X! ----------------------------------------------------------
  141. X!     4609 README
  142. X!    19208 CHANGES
  143. X!     2347 TODO
  144. X       530 UPDATE_INDEX
  145. X!     9247 Makefile
  146. X!    27771 tin.1
  147. X      2247 wildmat.3
  148. X!    36873 tin.nrf
  149. X!     9785 tin.h
  150. X!     9432 lang.h
  151. X      3720 nntp.h
  152. X!    17299 proto.h
  153. X        21 patchlevel.h
  154. X!    28457 art.c
  155. X      6043 curses.c
  156. X      2631 debug.c
  157. X!    11964 feed.c
  158. X!    19344 group.c
  159. X!     2829 hashstr.c
  160. X!     5149 help.c
  161. X!    10484 kill.c
  162. X!    17723 lang.c
  163. X!     8373 main.c
  164. X      6239 memory.c
  165. X!    21726 misc.c
  166. X!    19741 newsrc.c
  167. X!     6825 open.c
  168. X!    24865 page.c
  169. X!    17675 post.c
  170. X!     4469 prompt.c
  171. X!    17871 rcfile.c
  172. X!    19595 save.c
  173. X!     2168 screen.c
  174. X!     7808 search.c
  175. X!    18951 select.c
  176. X      7531 signal.c
  177. X      4749 wildmat.c
  178. X!   436299 total
  179. Xdiff -rcs 103/Makefile 104/Makefile
  180. X*** 103/Makefile    Mon Sep 30 19:07:47 1991
  181. X--- 104/Makefile    Wed Oct  2 19:48:41 1991
  182. X***************
  183. X*** 69,76 ****
  184. X  #
  185. X  EXE=tin
  186. X  
  187. X- #BINDIR = /piez/iain/bin
  188. X  BINDIR = /usr/local/bin
  189. X  STRIP = strip
  190. X  ROFF = + drf -F Helvetica -man3 
  191. X  PRINT= -Pps0
  192. X--- 69,77 ----
  193. X  #
  194. X  EXE=tin
  195. X  
  196. X  BINDIR = /usr/local/bin
  197. X+ #BINDIR = /piez/iain/bin
  198. X+ 
  199. X  STRIP = strip
  200. X  ROFF = + drf -F Helvetica -man3 
  201. X  PRINT= -Pps0
  202. X***************
  203. X*** 175,182 ****
  204. X      @echo "Installing $(EXE)..."
  205. X      @$(STRIP) $(EXE)
  206. X      @-mv $(EXE) $(BINDIR)
  207. X!     @chmod 755 $(BINDIR)/$(EXE)
  208. X!     @ls -l $(BINDIR)/$(EXE)
  209. X  
  210. X  install_setuid:
  211. X      @echo "Installing SETUID $(EXE)..."
  212. X--- 176,185 ----
  213. X      @echo "Installing $(EXE)..."
  214. X      @$(STRIP) $(EXE)
  215. X      @-mv $(EXE) $(BINDIR)
  216. X!     @-rm $(BINDIR)/r$(EXE)
  217. X!     @ln $(BINDIR)/$(EXE) $(BINDIR)/r$(EXE)
  218. X!     @chmod 755 $(BINDIR)/$(EXE) $(BINDIR)/r$(EXE)  
  219. X!     @ls -l $(BINDIR)/$(EXE) $(BINDIR)/r$(EXE)
  220. X  
  221. X  install_setuid:
  222. X      @echo "Installing SETUID $(EXE)..."
  223. X***************
  224. X*** 183,190 ****
  225. X      @$(STRIP) $(EXE)
  226. X      @mv $(EXE) $(BINDIR)
  227. X      @chown news $(BINDIR)/$(EXE) 
  228. X      @su news -c "chmod 4755 $(BINDIR)/$(EXE)"
  229. X!     @ls -l $(BINDIR)/$(EXE)
  230. X  
  231. X  proto:
  232. X      @echo "Generating function prototypes for proto.h..."
  233. X--- 186,196 ----
  234. X      @$(STRIP) $(EXE)
  235. X      @mv $(EXE) $(BINDIR)
  236. X      @chown news $(BINDIR)/$(EXE) 
  237. X+     @-rm $(BINDIR)/r$(EXE)
  238. X+     @ln $(BINDIR)/$(EXE) $(BINDIR)/r$(EXE)
  239. X      @su news -c "chmod 4755 $(BINDIR)/$(EXE)"
  240. X!     @su news -c "chmod 755 $(BINDIR)/r$(EXE)"
  241. X!     @ls -l $(BINDIR)/$(EXE) $(BINDIR)/r$(EXE)
  242. X  
  243. X  proto:
  244. X      @echo "Generating function prototypes for proto.h..."
  245. X***************
  246. X*** 205,212 ****
  247. X      @nroff -man $(EXE).1 > $(EXE).nrf
  248. X      @echo "Creating MANIFEST..."
  249. X      @echo "MANIFEST for tin newsreader (`date`)" > MANIFEST
  250. X!     @echo "--------------------------------------------------------------" >> MANIFEST
  251. X!     @wc -c README CHANGES TODO UPDATE_INDEX Makefile *.[13] $(HFILES) $(CFILES) >> MANIFEST
  252. X      @shar -a -n $(EXE)1.02 -s iain@estevax.uucp -L50 -o ../$(EXE).shar $(SUPPORT) $(CFILES) $(HFILES)
  253. X  
  254. X  uuencode:
  255. X--- 211,218 ----
  256. X      @nroff -man $(EXE).1 > $(EXE).nrf
  257. X      @echo "Creating MANIFEST..."
  258. X      @echo "MANIFEST for tin newsreader (`date`)" > MANIFEST
  259. X!     @echo "----------------------------------------------------------" >> MANIFEST
  260. X!     @wc -c README CHANGES TODO UPDATE_INDEX Makefile *.[13] $(EXE).nrf $(HFILES) $(CFILES) >> MANIFEST
  261. X      @shar -a -n $(EXE)1.02 -s iain@estevax.uucp -L50 -o ../$(EXE).shar $(SUPPORT) $(CFILES) $(HFILES)
  262. X  
  263. X  uuencode:
  264. Xdiff -rcs 103/README 104/README
  265. X*** 103/README    Mon Sep 30 14:53:14 1991
  266. X--- 104/README    Wed Oct  2 19:44:00 1991
  267. X***************
  268. X*** 1,21 ****
  269. X! This is version 1.0 PL3 (patchlevel 3) of the tin newsreader.
  270. X  
  271. X! Major improvements over tin 1.0 PL2 are the following:
  272. X  
  273. X! o  added -z and -Z options.
  274. X  
  275. X! o  added 'g' and `G` commands to pager for 'less' users.
  276. X  
  277. X! o  added option to switch threading off on a group basis.
  278. X  
  279. X- o  added nroff formatted man page for SCO Unix users without troff.
  280. X- 
  281. X- o  fixed auto-save articles routine that I broke in PL2.
  282. X- 
  283. X- o  fixed -U option that was causing char echo if a ^Z was done.
  284. X- 
  285. X- o  fixed a memory leak in 'W' command.
  286. X- 
  287. X  For more bugs fixes, other changes & additions read the CHANGES & TODO files.
  288. X  
  289. X  I am still looking for people to send me ideas/comments & bug reports.
  290. X--- 1,13 ----
  291. X! This is version 1.0 PL4 (patchlevel 4) of the tin newsreader.
  292. X  
  293. X! Major improvements over tin 1.0 PL3 are the following:
  294. X  
  295. X! o  ESC key now aborts most operations
  296. X  
  297. X! o  added rtin link to tin. rtin aliases to tin -r to read news via NNTP
  298. X  
  299. X! o  added speedup to screen display for slow baud rate terminals.
  300. X  
  301. X  For more bugs fixes, other changes & additions read the CHANGES & TODO files.
  302. X  
  303. X  I am still looking for people to send me ideas/comments & bug reports.
  304. X***************
  305. X*** 111,120 ****
  306. X  
  307. X  Klaus Arzig, Anton Aylward, Reiner Balling, Volker Beyer, Roger Binns,
  308. X  Georg Biehler, Andreas Brosig, Peter Dressler, Gerhard Ermer, Hugh Fader,
  309. X! Joachim Feld, Bernhard Gmelch, Viet Hoang, Torsten Homeyer, Andy Jackson,
  310. X! Joe Johnson, Cyrill Jung, Karl-Koenig Koenigsson, Hans-Juergen Knopp,
  311. X! Hakan Lennestal, Bob Lukas, Clifford Luke, Phillip Molloy, Toni Metz,
  312. X! Greg Miller, Klaus Neuberger, Otto Niesser, Wolf Paul, Nickolay Saukh,
  313. X! Rich Salz, Fredy Schwatz, Bernd Schwerin, Klamer Schutte, Karl-Olav
  314. X! Serrander, Chris Smith, Steve Spearman, Cliff Stanford, Adri Verhoef,
  315. X! Cary Whitney
  316. X--- 103,112 ----
  317. X  
  318. X  Klaus Arzig, Anton Aylward, Reiner Balling, Volker Beyer, Roger Binns,
  319. X  Georg Biehler, Andreas Brosig, Peter Dressler, Gerhard Ermer, Hugh Fader,
  320. X! Joachim Feld, Paul Fox, Bernhard Gmelch, Viet Hoang, Torsten Homeyer,
  321. X! Andy Jackson, Joe Johnson, Cyrill Jung, Karl-Koenig Koenigsson,
  322. X! Hans-Juergen Knopp, Hakan Lennestal, Bob Lukas, Clifford Luke,
  323. X! Phillip Molloy, Toni Metz, Greg Miller, Klaus Neuberger, Otto Niesser,
  324. X! Reiner Oelhaf, Wolf Paul, Nickolay Saukh, Rich Salz, Fredy Schwatz,
  325. X! Bernd Schwerin, Klamer Schutte, Karl-Olav Serrander, Chris Smith,
  326. X! Steve Spearman, Cliff Stanford, Adri Verhoef, Cary Whitney
  327. Xdiff -rcs 103/TODO 104/TODO
  328. X*** 103/TODO    Mon Sep 30 18:59:59 1991
  329. X--- 104/TODO    Wed Oct  2 19:40:10 1991
  330. X***************
  331. X*** 17,23 ****
  332. X  
  333. X  o  Fix -s <savedir> -S so that an active is constructed when new
  334. X     articles are saved to private news dir.
  335. X!  
  336. X  ADD FEATURES
  337. X  ------------
  338. X  o  Add 2nd page to 'M' Options menu and put on the options:
  339. X--- 17,26 ----
  340. X  
  341. X  o  Fix -s <savedir> -S so that an active is constructed when new
  342. X     articles are saved to private news dir.
  343. X! 
  344. X! o  Fix code to display only groups with unread news and only threads
  345. X!    with unread news. (Make settable option).
  346. X! 
  347. X  ADD FEATURES
  348. X  ------------
  349. X  o  Add 2nd page to 'M' Options menu and put on the options:
  350. X***************
  351. X*** 25,31 ****
  352. X       2) thread/unthread groups (read from ~/.tin/unthread)
  353. X  
  354. X  o  Add elm style print command with %s in it for printing in 'M'.
  355. X- 
  356. X  
  357. X  o  Add mail/save to -S option. Selectable by 'M' menu.
  358. X  
  359. X--- 28,33 ----
  360. XFiles 103/UPDATE_INDEX and 104/UPDATE_INDEX are identical
  361. Xdiff -rcs 103/art.c 104/art.c
  362. X*** 103/art.c    Mon Sep 30 18:33:02 1991
  363. X--- 104/art.c    Wed Oct  2 19:29:27 1991
  364. X***************
  365. X*** 281,298 ****
  366. X          top++;
  367. X  
  368. X          if (++count % 10 == 0 && ! update) {
  369. X              if (display_groupname) {
  370. X                  MoveCursor (0, 0);
  371. X                  CleartoEOLN ();
  372. X                  center_line (0, TRUE, group);
  373. X                  display_groupname = FALSE;
  374. X- #ifdef SLOW_SCREEN_UPDATE
  375. X-                 wait_message (txt_indexing);
  376. X- #endif
  377. X              }
  378. X- #ifndef SLOW_SCREEN_UPDATE
  379. X              sprintf (msg, txt_indexing_num, count);
  380. X              wait_message (msg);
  381. X  #endif
  382. X          }
  383. X      }
  384. X--- 281,297 ----
  385. X          top++;
  386. X  
  387. X          if (++count % 10 == 0 && ! update) {
  388. X+ #ifndef SLOW_SCREEN_UPDATE
  389. X              if (display_groupname) {
  390. X                  MoveCursor (0, 0);
  391. X                  CleartoEOLN ();
  392. X                  center_line (0, TRUE, group);
  393. X                  display_groupname = FALSE;
  394. X              }
  395. X              sprintf (msg, txt_indexing_num, count);
  396. X              wait_message (msg);
  397. X+ #else
  398. X+             wait_message (txt_indexing);
  399. X  #endif
  400. X          }
  401. X      }
  402. XFiles 103/curses.c and 104/curses.c are identical
  403. XFiles 103/debug.c and 104/debug.c are identical
  404. Xdiff -rcs 103/feed.c 104/feed.c
  405. X*** 103/feed.c    Mon Sep 30 18:33:52 1991
  406. X--- 104/feed.c    Wed Oct  2 19:01:46 1991
  407. X***************
  408. X*** 3,9 ****
  409. X   *  Module    : feed.c
  410. X   *  Author    : I.Lea
  411. X   *  Created   : 31-08-91
  412. X!  *  Updated   : 30-09-91
  413. X   *  Release   : 1.0
  414. X   *  Notes     : provides same interface to mail,pipe,print and save commands
  415. X   *  Copyright : (c) Copyright 1991 by Iain Lea
  416. X--- 3,9 ----
  417. X   *  Module    : feed.c
  418. X   *  Author    : I.Lea
  419. X   *  Created   : 31-08-91
  420. X!  *  Updated   : 02-10-91
  421. X   *  Release   : 1.0
  422. X   *  Notes     : provides same interface to mail,pipe,print and save commands
  423. X   *  Copyright : (c) Copyright 1991 by Iain Lea
  424. X***************
  425. X*** 76,89 ****
  426. X              MoveCursor (LINES, (int) strlen (msg)-1);
  427. X              if ((ch = ReadCh ()) == CR)
  428. X                  ch = ch_default;
  429. X!         } while (ch != 'a' && ch != 't' && ch != 'T' && ch != 'r' && ch != 'e');
  430. X      } else {
  431. X          file[0] = '\0';
  432. X          ch = ch_default;
  433. X!         proc_ch = 's'; 
  434. X      }
  435. X  
  436. X!     if (ch == 'e') {    /* exit */
  437. X          clear_message ();
  438. X          return;
  439. X      }
  440. X--- 76,91 ----
  441. X              MoveCursor (LINES, (int) strlen (msg)-1);
  442. X              if ((ch = ReadCh ()) == CR)
  443. X                  ch = ch_default;
  444. X!         } while (ch != ESC && ch != 'a' && ch != 't' && ch != 'T' && ch != 'r' && ch != 'e');
  445. X      } else {
  446. X          file[0] = '\0';
  447. X          ch = ch_default;
  448. X!         if (proc_ch == 'n') {    /* none so set to unshar */
  449. X!             proc_ch = 's';
  450. X!         }
  451. X      }
  452. X  
  453. X!     if (ch == 'e' || ch == ESC) {    /* exit */
  454. X          clear_message ();
  455. X          return;
  456. X      }
  457. X***************
  458. X*** 140,149 ****
  459. X--- 142,155 ----
  460. X                      return;
  461. X                  }
  462. X              }
  463. X+             set_real_uid_gid ();
  464. X+ 
  465. X              if ((fp = popen (command, "w")) == NULL) {
  466. X+                 set_tin_uid_gid ();
  467. X                  error_message (txt_command_failed_s, command);
  468. X                  return;
  469. X              }
  470. X+             set_tin_uid_gid ();
  471. X              wait_message ("Piping...");
  472. X              Raw (FALSE);
  473. X              break;
  474. X***************
  475. X*** 154,163 ****
  476. X--- 160,172 ----
  477. X              } else {
  478. X                  sprintf (command, "%s > /dev/null 2>&1", printer);
  479. X              }
  480. X+             set_real_uid_gid ();
  481. X              if ((fp = popen (command, "w")) == NULL) {
  482. X+                 set_tin_uid_gid ();
  483. X                  error_message (txt_command_failed_s, command);
  484. X                  return;
  485. X              }
  486. X+             set_tin_uid_gid ();
  487. X              break;
  488. X          case FEED_SAVE:        /* ask user for filename */
  489. X              free_save_array ();
  490. X***************
  491. X*** 256,265 ****
  492. X--- 265,277 ----
  493. X          case 't':         /* thread */
  494. X              for (i = (int) base[b]; i >= 0; i = arts[i].thread) {
  495. X                  if (function == FEED_PRINT) {
  496. X+                     set_real_uid_gid ();
  497. X                      if ((fp = popen (command, "w")) == NULL) {
  498. X+                         set_tin_uid_gid ();
  499. X                          error_message (txt_command_failed_s, command);
  500. X                          return;
  501. X                      }
  502. X+                     set_tin_uid_gid ();
  503. X                  }
  504. X                  if (level == PAGE_LEVEL) {
  505. X                      note_cleanup ();
  506. X***************
  507. X*** 302,311 ****
  508. X--- 314,326 ----
  509. X                  for (j=0 ; j < top ; j++) {
  510. X                      if (arts[j].tagged && arts[j].tagged == i) { 
  511. X                          if (function == FEED_PRINT) {
  512. X+                             set_real_uid_gid ();
  513. X                              if ((fp = popen (command, "w")) == NULL) {
  514. X+                                 set_tin_uid_gid ();
  515. X                                  error_message (txt_command_failed_s, command);
  516. X                                  return;
  517. X                              }
  518. X+                             set_tin_uid_gid ();
  519. X                          }
  520. X                          if (level == PAGE_LEVEL) {
  521. X                              note_cleanup ();
  522. X***************
  523. X*** 352,361 ****
  524. X--- 367,379 ----
  525. X                  if (wildmat (arts[i].subject, pattern)) {
  526. X  #endif        
  527. X                      if (function == FEED_PRINT) {
  528. X+                         set_real_uid_gid ();
  529. X                          if ((fp = popen (command, "w")) == NULL) {
  530. X+                             set_tin_uid_gid ();
  531. X                              error_message (txt_command_failed_s, command);
  532. X                              return;
  533. X                          }
  534. X+                         set_tin_uid_gid ();
  535. X                      }
  536. X                      if (level == PAGE_LEVEL) {
  537. X                          note_cleanup ();
  538. Xdiff -rcs 103/group.c 104/group.c
  539. X*** 103/group.c    Mon Sep 30 18:35:39 1991
  540. X--- 104/group.c    Wed Oct  2 19:34:20 1991
  541. X***************
  542. X*** 158,164 ****
  543. X                  show_group_page(group);
  544. X                  break;
  545. X      
  546. X!             case 27:    /* common arrow keys */
  547. X                  ch = ReadCh();
  548. X                  if (ch == '[' || ch == 'O')
  549. X                      ch = ReadCh();
  550. X--- 158,164 ----
  551. X                  show_group_page(group);
  552. X                  break;
  553. X      
  554. X!             case ESC:    /* common arrow keys */
  555. X                  ch = ReadCh();
  556. X                  if (ch == '[' || ch == 'O')
  557. X                      ch = ReadCh();
  558. X***************
  559. X*** 703,721 ****
  560. X      }
  561. X  
  562. X      if (show_author) {
  563. X- #ifdef RESP_AT_END
  564. X         len_from = max_from-BLANK_GROUP_COLS;
  565. X! #else
  566. X!        len_from = max_from-BLANK_GROUP_COLS;
  567. X! #endif
  568. X!         } else {
  569. X! #ifdef RESP_AT_END
  570. X!         len_subj = (max_subj+max_from)-BLANK_GROUP_COLS;
  571. X! #else
  572. X          len_subj = (max_subj+max_from+3)-BLANK_GROUP_COLS;
  573. X- #endif
  574. X      }
  575. X  
  576. X      for (j=0, i = first_subj_on_screen; i < last_subj_on_screen; i++, j++) {
  577. X          respnum = (int) base[i];
  578. X  
  579. X--- 703,717 ----
  580. X      }
  581. X  
  582. X      if (show_author) {
  583. X         len_from = max_from-BLANK_GROUP_COLS;
  584. X!     } else {
  585. X          len_subj = (max_subj+max_from+3)-BLANK_GROUP_COLS;
  586. X      }
  587. X  
  588. X+     if (draw_arrow_mark) {
  589. X+         CleartoEOS ();
  590. X+     }
  591. X+ 
  592. X      for (j=0, i = first_subj_on_screen; i < last_subj_on_screen; i++, j++) {
  593. X          respnum = (int) base[i];
  594. X  
  595. X***************
  596. X*** 736,763 ****
  597. X  
  598. X          my_strncpy (from, arts[respnum].from, max_from);
  599. X  
  600. X!         if (show_author) {
  601. X! #ifdef RESP_AT_END
  602. X!             my_strncpy (subject, arts[respnum].subject, max_subj);
  603. X!             sprintf (screen[j].col, "  %4d%3s  %-*s%s %-*s\r\n",
  604. X!                    i+1, new_resps, max_subj, subject, resps, len_from, from);
  605. X! #else
  606. X!             my_strncpy (subject, arts[respnum].subject, max_subj);
  607. X!             sprintf (screen[j].col, "  %4d%3s %s%-*s   %-*s\r\n",
  608. X!                    i+1, new_resps, resps, max_subj, subject, len_from, from);
  609. X! #endif
  610. X          } else {
  611. X! #ifdef RESP_AT_END
  612. X!             my_strncpy (subject, arts[respnum].subject, max_subj+max_from);
  613. X!             sprintf(screen[j].col, "  %4d%3s  %-*s %s\r\n",
  614. X!                    i+1, new_resps, len_subj, subject, resps);
  615. X! #else
  616. X!             my_strncpy (subject, arts[respnum].subject, max_subj+max_from+3);
  617. X!             sprintf(screen[j].col, "  %4d%3s %s%-*s\r\n",
  618. X!                    i+1, new_resps, resps, len_subj, subject);
  619. X! #endif
  620. X          }
  621. X-         printf("%s", screen[j].col);
  622. X      }
  623. X  
  624. X  #ifndef USE_CLEARSCREEN
  625. X--- 732,759 ----
  626. X  
  627. X          my_strncpy (from, arts[respnum].from, max_from);
  628. X  
  629. X!         if (draw_arrow_mark) {
  630. X!             if (show_author) {
  631. X!                 my_strncpy (subject, arts[respnum].subject, max_subj);
  632. X!                 printf ("  %4d%3s %s%-*s   %-s\r\n",
  633. X!                        i+1, new_resps, resps, max_subj, subject, from);
  634. X!             } else {
  635. X!                 my_strncpy (subject, arts[respnum].subject, max_subj+max_from+3);
  636. X!                 printf ("  %4d%3s %s%-s\r\n",
  637. X!                        i+1, new_resps, resps, subject);
  638. X!             }
  639. X          } else {
  640. X!             if (show_author) {
  641. X!                 my_strncpy (subject, arts[respnum].subject, max_subj);
  642. X!                 sprintf (screen[j].col, "  %4d%3s %s%-*s   %-*s\r\n",
  643. X!                        i+1, new_resps, resps, max_subj, subject, len_from, from);
  644. X!             } else {
  645. X!                 my_strncpy (subject, arts[respnum].subject, max_subj+max_from+3);
  646. X!                 sprintf (screen[j].col, "  %4d%3s %s%-*s\r\n",
  647. X!                        i+1, new_resps, resps, len_subj, subject);
  648. X!             }
  649. X!             printf ("%s", screen[j].col);
  650. X          }
  651. X      }
  652. X  
  653. X  #ifndef USE_CLEARSCREEN
  654. XFiles 103/hashstr.c and 104/hashstr.c are identical
  655. Xdiff -rcs 103/help.c 104/help.c
  656. X*** 103/help.c    Mon Sep 30 12:35:19 1991
  657. X--- 104/help.c    Mon Sep 30 20:43:04 1991
  658. X***************
  659. X*** 193,199 ****
  660. X          
  661. X          ch = ReadCh ();
  662. X          switch (ch) {
  663. X!             case 27:    /* (ESC) common arrow keys */
  664. X                  ch = ReadCh();
  665. X                  if (ch == '[' || ch == 'O')
  666. X                      ch = ReadCh();
  667. X--- 193,199 ----
  668. X          
  669. X          ch = ReadCh ();
  670. X          switch (ch) {
  671. X!             case ESC:    /* (ESC) common arrow keys */
  672. X                  ch = ReadCh();
  673. X                  if (ch == '[' || ch == 'O')
  674. X                      ch = ReadCh();
  675. Xdiff -rcs 103/kill.c 104/kill.c
  676. X*** 103/kill.c    Mon Sep 30 18:14:57 1991
  677. X--- 104/kill.c    Mon Sep 30 20:37:10 1991
  678. X***************
  679. X*** 180,186 ****
  680. X      
  681. X      ClearScreen ();
  682. X  
  683. X!     center_line (1, TRUE, txt_kill_menu);
  684. X      
  685. X      MoveCursor(INDEX_TOP, 0);
  686. X      printf ("%s\r\n\r\n", txt_kill_text);
  687. X--- 180,186 ----
  688. X      
  689. X      ClearScreen ();
  690. X  
  691. X!     center_line (0, TRUE, txt_kill_menu);
  692. X      
  693. X      MoveCursor(INDEX_TOP, 0);
  694. X      printf ("%s\r\n\r\n", txt_kill_text);
  695. X***************
  696. X*** 191,197 ****
  697. X      fflush(stdout);
  698. X  
  699. X      show_menu_help (txt_help_kill_text);
  700. X!     parse_menu_string (INDEX_TOP, (int) strlen (txt_kill_text), text);
  701. X  
  702. X      if (text[0]) {
  703. X          show_menu_help (txt_help_kill_text_type);
  704. X--- 191,199 ----
  705. X      fflush(stdout);
  706. X  
  707. X      show_menu_help (txt_help_kill_text);
  708. X!     if (! parse_menu_string (INDEX_TOP, (int) strlen (txt_kill_text), text)) {
  709. X!         return FALSE;
  710. X!     }
  711. X  
  712. X      if (text[0]) {
  713. X          show_menu_help (txt_help_kill_text_type);
  714. X***************
  715. X*** 221,227 ****
  716. X                  printf ("%s", str);
  717. X                  fflush(stdout);
  718. X              }
  719. X!         } while (ch != CR);
  720. X      }
  721. X  
  722. X      if (! text[0]) {
  723. X--- 223,232 ----
  724. X                  printf ("%s", str);
  725. X                  fflush(stdout);
  726. X              }
  727. X!         } while (ch != CR && ch != ESC);
  728. X!         if (ch == ESC) {
  729. X!             return FALSE;
  730. X!         }
  731. X      }
  732. X  
  733. X      if (! text[0]) {
  734. X***************
  735. X*** 252,258 ****
  736. X                  printf ("%s", str);
  737. X                  fflush(stdout);
  738. X              }
  739. X!         } while (ch != CR);
  740. X      }
  741. X  
  742. X      while (1) {
  743. X--- 257,266 ----
  744. X                  printf ("%s", str);
  745. X                  fflush(stdout);
  746. X              }
  747. X!         } while (ch != CR && ch != ESC);
  748. X!         if (ch == ESC) {
  749. X!             return FALSE;
  750. X!         }
  751. X      }
  752. X  
  753. X      while (1) {
  754. X***************
  755. X*** 262,268 ****
  756. X              MoveCursor(LINES, (int) strlen (txt_abort_edit_save_killfile));
  757. X              if ((ch = ReadCh()) == CR)
  758. X                  ch = ch_default;
  759. X!         } while (ch != 'a' && ch != 'e' && ch != 's');
  760. X          switch (ch) {
  761. X              case 'e':
  762. X                  start_line_offset = 2;
  763. X--- 270,276 ----
  764. X              MoveCursor(LINES, (int) strlen (txt_abort_edit_save_killfile));
  765. X              if ((ch = ReadCh()) == CR)
  766. X                  ch = ch_default;
  767. X!         } while (ch != ESC && ch != 'a' && ch != 'e' && ch != 's');
  768. X          switch (ch) {
  769. X              case 'e':
  770. X                  start_line_offset = 2;
  771. X***************
  772. X*** 274,279 ****
  773. X--- 282,288 ----
  774. X                  goto kill_done;
  775. X  
  776. X              case 'a':
  777. X+             case ESC:
  778. X                  killed = FALSE;
  779. X                  goto kill_done;
  780. X              
  781. Xdiff -rcs 103/lang.c 104/lang.c
  782. X*** 103/lang.c    Mon Sep 30 18:29:55 1991
  783. X--- 104/lang.c    Mon Sep 30 19:33:00 1991
  784. X***************
  785. X*** 70,76 ****
  786. X  char txt_author_search_backwards[] = "Author search backwards [%s]> ";
  787. X  char txt_no_search_string[] = "No search string";
  788. X  char txt_no_match[] = "No match";
  789. X! char txt_post_subject[] = "Post Subject: ";
  790. X  char txt_no_subject[] = "No subject";
  791. X  char txt_cannot_open[] = "can't open %s";
  792. X  char txt_posting[] = "Posting...";
  793. X--- 70,76 ----
  794. X  char txt_author_search_backwards[] = "Author search backwards [%s]> ";
  795. X  char txt_no_search_string[] = "No search string";
  796. X  char txt_no_match[] = "No match";
  797. X! char txt_post_subject[] = "Post Subject [%s]> ";
  798. X  char txt_no_subject[] = "No subject";
  799. X  char txt_cannot_open[] = "can't open %s";
  800. X  char txt_posting[] = "Posting...";
  801. XFiles 103/lang.h and 104/lang.h are identical
  802. Xdiff -rcs 103/main.c 104/main.c
  803. X*** 103/main.c    Mon Sep 30 12:35:49 1991
  804. X--- 104/main.c    Wed Oct  2 09:50:17 1991
  805. X***************
  806. X*** 3,9 ****
  807. X   *  Module    : main.c
  808. X   *  Author    : R.Skrenta / I.Lea
  809. X   *  Created   : 01-04-91
  810. X!  *  Updated   : 29-09-91
  811. X   *  Release   : 1.0
  812. X   *  Notes     :
  813. X   *  Copyright : (c) Copyright 1991 by Rich Skrenta & Iain Lea
  814. X--- 3,9 ----
  815. X   *  Module    : main.c
  816. X   *  Author    : R.Skrenta / I.Lea
  817. X   *  Created   : 01-04-91
  818. X!  *  Updated   : 02-10-91
  819. X   *  Release   : 1.0
  820. X   *  Notes     :
  821. X   *  Copyright : (c) Copyright 1991 by Rich Skrenta & Iain Lea
  822. X***************
  823. X*** 69,74 ****
  824. X--- 69,83 ----
  825. X      set_signal_handlers ();        /* all except SIGINT ctrl-C */
  826. X  
  827. X      basename (argv[0], progname);
  828. X+ 
  829. X+     if (progname[0] == 'r') {    /* rtin so read news remotely via NNTP */
  830. X+ #ifdef USE_NNTP            
  831. X+         read_news_via_nntp = TRUE;
  832. X+ #else
  833. X+         error_message ("Reading news via NNTP is not enabled. Recompile %s with -DUSE_NNTP.\n", progname);
  834. X+         exit (1);
  835. X+ #endif
  836. X+     }
  837. X  
  838. X      tin_uid = geteuid ();
  839. X      tin_gid = getegid ();
  840. XFiles 103/memory.c and 104/memory.c are identical
  841. Xdiff -rcs 103/misc.c 104/misc.c
  842. X*** 103/misc.c    Mon Sep 30 18:42:28 1991
  843. X--- 104/misc.c    Wed Oct  2 18:43:09 1991
  844. X***************
  845. X*** 3,9 ****
  846. X   *  Module    : misc.c
  847. X   *  Author    : R.Skrenta / I.Lea
  848. X   *  Created   : 01-04-91
  849. X!  *  Updated   : 30-09-91
  850. X   *  Release   : 1.0
  851. X   *  Notes     :
  852. X   *  Copyright : (c) Copyright 1991 by Rich Skrenta & Iain Lea
  853. X--- 3,9 ----
  854. X   *  Module    : misc.c
  855. X   *  Author    : R.Skrenta / I.Lea
  856. X   *  Created   : 01-04-91
  857. X!  *  Updated   : 02-10-91
  858. X   *  Release   : 1.0
  859. X   *  Notes     :
  860. X   *  Copyright : (c) Copyright 1991 by Rich Skrenta & Iain Lea
  861. X***************
  862. X*** 127,132 ****
  863. X--- 127,133 ----
  864. X      default_regex_pattern[0] = '\0';
  865. X      default_save_file[0] = '\0';
  866. X      default_shell_command[0] = '\0';
  867. X+     default_post_subject[0] = '\0';
  868. X      
  869. X      sprintf (rcdir,  "%s/%s", get_val ("TINDIR", homedir), RCDIR);
  870. X      sprintf (indexdir, "%s/%s", rcdir, INDEXDIR);
  871. X***************
  872. X*** 292,298 ****
  873. X          goto got_add_addr;
  874. X      }
  875. X  
  876. X!     sprintf (nam, "%s/add_addr", rcdir);
  877. X      if ((fp = fopen (nam, "r")) != NULL) {
  878. X          if (fgets (add_addr, sizeof (add_addr), fp) != NULL) {
  879. X              for (p = add_addr; *p && *p != '\n'; p++)
  880. X--- 293,299 ----
  881. X          goto got_add_addr;
  882. X      }
  883. X  
  884. X!     sprintf (nam, "%s/add_address", rcdir);
  885. X      if ((fp = fopen (nam, "r")) != NULL) {
  886. X          if (fgets (add_addr, sizeof (add_addr), fp) != NULL) {
  887. X              for (p = add_addr; *p && *p != '\n'; p++)
  888. X***************
  889. X*** 881,886 ****
  890. X--- 882,895 ----
  891. X  
  892. X  void set_real_uid_gid ()
  893. X  {
  894. X+ #ifdef BSD
  895. X+     if (seteuid (real_uid) == -1) {
  896. X+         error_message ("Error seteuid(real) failed", (char *) 0);
  897. X+     }
  898. X+     if (setegid (real_gid) == -1) {
  899. X+         error_message ("Error setegid(real) failed", (char *) 0);
  900. X+     }
  901. X+ #else
  902. X      if (setuid (real_uid) == -1) {
  903. X          error_message ("Error setuid(real) failed", (char *) 0);
  904. X      }
  905. X***************
  906. X*** 887,897 ****
  907. X--- 896,915 ----
  908. X      if (setgid (real_gid) == -1) {
  909. X          error_message ("Error setgid(real) failed", (char *) 0);
  910. X      }
  911. X+ #endif
  912. X  }
  913. X  
  914. X  
  915. X  void set_tin_uid_gid ()
  916. X  {
  917. X+ #ifdef BSD
  918. X+     if (seteuid (tin_uid) == -1) {
  919. X+         error_message ("Error seteuid(tin) failed", (char *) 0);
  920. X+     }
  921. X+     if (setegid (tin_gid) == -1) {
  922. X+         error_message ("Error setegid(tin) failed", (char *) 0);
  923. X+     }
  924. X+ #else
  925. X      if (setuid (tin_uid) == -1) {
  926. X          error_message ("Error setuid(tin) failed", (char *) 0);
  927. X      }
  928. X***************
  929. X*** 898,903 ****
  930. X--- 916,922 ----
  931. X      if (setgid (tin_gid) == -1) {
  932. X          error_message ("Error setgid(tin) failed", (char *) 0);
  933. X      }
  934. X+ #endif
  935. X  }
  936. X  
  937. X  
  938. XFiles 103/newsrc.c and 104/newsrc.c are identical
  939. XFiles 103/nntp.h and 104/nntp.h are identical
  940. Xdiff -rcs 103/open.c 104/open.c
  941. X*** 103/open.c    Mon Sep 30 18:44:17 1991
  942. X--- 104/open.c    Wed Oct  2 09:38:15 1991
  943. X***************
  944. X*** 3,9 ****
  945. X   *  Module    : open.c
  946. X   *  Author    : R.Skrenta / I.Lea
  947. X   *  Created   : 01-04-91
  948. X!  *  Updated   : 27-09-91
  949. X   *  Release   : 1.0
  950. X   *  Notes     : reads news locally (/usr/spool/news) or via NNTP
  951. X   *  Copyright : (c) Copyright 1991 by Rich Skrenta & Iain Lea
  952. X--- 3,9 ----
  953. X   *  Module    : open.c
  954. X   *  Author    : R.Skrenta / I.Lea
  955. X   *  Created   : 01-04-91
  956. X!  *  Updated   : 02-10-91
  957. X   *  Release   : 1.0
  958. X   *  Notes     : reads news locally (/usr/spool/news) or via NNTP
  959. X   *  Copyright : (c) Copyright 1991 by Rich Skrenta & Iain Lea
  960. X***************
  961. X*** 90,99 ****
  962. X              exit(1);
  963. X          }
  964. X  
  965. X!         wait_message ("Connecting...");
  966. X          
  967. X          ret = server_init (server);
  968. X!         putchar ('\n');
  969. X  /*
  970. X          handle_server_response (ret, server);
  971. X  */        
  972. X--- 90,104 ----
  973. X              exit(1);
  974. X          }
  975. X  
  976. X!         if (update == FALSE) {
  977. X!             printf ("Connecting...");
  978. X!             fflush (stdout);
  979. X!         }
  980. X          
  981. X          ret = server_init (server);
  982. X!         if (update == FALSE) {
  983. X!             putchar ('\n');
  984. X!         }
  985. X  /*
  986. X          handle_server_response (ret, server);
  987. X  */        
  988. Xdiff -rcs 103/page.c 104/page.c
  989. X*** 103/page.c    Mon Sep 30 18:45:06 1991
  990. X--- 104/page.c    Mon Sep 30 20:43:13 1991
  991. X***************
  992. X*** 112,118 ****
  993. X              }
  994. X  
  995. X          } else switch (ch) {
  996. X!             case 27:
  997. X                  ch = ReadCh ();
  998. X                  if (ch == '[' || ch == 'O')
  999. X                      ch = ReadCh ();
  1000. X--- 112,118 ----
  1001. X              }
  1002. X  
  1003. X          } else switch (ch) {
  1004. X!             case ESC:
  1005. X                  ch = ReadCh ();
  1006. X                  if (ch == '[' || ch == 'O')
  1007. X                      ch = ReadCh ();
  1008. Xdiff -rcs 103/patchlevel.h 104/patchlevel.h
  1009. X*** 103/patchlevel.h    Mon Sep 30 07:58:07 1991
  1010. X--- 104/patchlevel.h    Mon Sep 30 19:38:32 1991
  1011. X***************
  1012. X*** 1 ****
  1013. X! #define PATCHLEVEL    3
  1014. X--- 1 ----
  1015. X! #define PATCHLEVEL    4
  1016. Xdiff -rcs 103/post.c 104/post.c
  1017. X*** 103/post.c    Mon Sep 30 18:19:01 1991
  1018. X--- 104/post.c    Wed Oct  2 08:28:24 1991
  1019. X***************
  1020. X*** 29,34 ****
  1021. X--- 29,36 ----
  1022. X  
  1023. X  extern long note_mark[MAX_PAGES];        /* ftells on beginnings of pages */
  1024. X  
  1025. X+ char default_post_subject[LEN];        /* offers user default choice */
  1026. X+ 
  1027. X  struct posted_t *posted;
  1028. X  
  1029. X  
  1030. X***************
  1031. X*** 150,165 ****
  1032. X      int redraw_screen = FALSE;
  1033. X  
  1034. X      start_line_offset = 4;
  1035. X      
  1036. X!     if (! parse_string (txt_post_subject, subj)) {
  1037. X          clear_message ();
  1038. X          return (redraw_screen);
  1039. X-     }    
  1040. X-     if (subj[0] == '\0') {
  1041. X-         info_message (txt_no_subject);
  1042. X-         return (redraw_screen);
  1043. X      }
  1044. X  
  1045. X      set_real_uid_gid ();
  1046. X  
  1047. X      if ((fp = fopen (article, "w")) == NULL) {
  1048. X--- 152,176 ----
  1049. X      int redraw_screen = FALSE;
  1050. X  
  1051. X      start_line_offset = 4;
  1052. X+ 
  1053. X+     sprintf (msg, txt_post_subject, default_post_subject);
  1054. X      
  1055. X!     if (! parse_string (msg, subj)) {
  1056. X          clear_message ();
  1057. X          return (redraw_screen);
  1058. X      }
  1059. X  
  1060. X+     if (strlen (subj)) {
  1061. X+         my_strncpy (default_post_subject, subj, LEN);
  1062. X+     } else {
  1063. X+         if (default_post_subject[0]) {
  1064. X+             my_strncpy (subj, default_post_subject, LEN);
  1065. X+         } else {
  1066. X+             info_message (txt_no_subject);
  1067. X+             return (redraw_screen);
  1068. X+         }
  1069. X+     }
  1070. X+     
  1071. X      set_real_uid_gid ();
  1072. X  
  1073. X      if ((fp = fopen (article, "w")) == NULL) {
  1074. X***************
  1075. X*** 194,199 ****
  1076. X--- 205,211 ----
  1077. X              break;
  1078. X  
  1079. X          case 'a':
  1080. X+         case ESC:
  1081. X              unlink (article);
  1082. X              clear_message ();
  1083. X              set_tin_uid_gid ();
  1084. X***************
  1085. X*** 227,233 ****
  1086. X              MoveCursor (LINES, (int) strlen (txt_abort_edit_post));
  1087. X              if ((ch = ReadCh ()) == CR)
  1088. X                  ch = ch_default;
  1089. X!         } while (ch != 'a' && ch != 'e' && ch != 'p');
  1090. X      }
  1091. X  
  1092. X  post_base_done:
  1093. X--- 239,245 ----
  1094. X              MoveCursor (LINES, (int) strlen (txt_abort_edit_post));
  1095. X              if ((ch = ReadCh ()) == CR)
  1096. X                  ch = ch_default;
  1097. X!         } while (ch != ESC && ch != 'a' && ch != 'e' && ch != 'p');
  1098. X      }
  1099. X  
  1100. X  post_base_done:
  1101. X***************
  1102. X*** 332,337 ****
  1103. X--- 344,350 ----
  1104. X              break;
  1105. X  
  1106. X          case 'a':
  1107. X+         case ESC:
  1108. X              unlink (article);
  1109. X              clear_message ();
  1110. X              set_tin_uid_gid ();
  1111. X***************
  1112. X*** 365,371 ****
  1113. X              MoveCursor(LINES, (int) strlen (txt_abort_edit_post));
  1114. X              if ((ch = ReadCh()) == CR)
  1115. X                  ch = ch_default;
  1116. X!         } while (ch != 'a' && ch != 'e' && ch != 'p');
  1117. X      }
  1118. X  
  1119. X  post_response_done:
  1120. X--- 378,384 ----
  1121. X              MoveCursor(LINES, (int) strlen (txt_abort_edit_post));
  1122. X              if ((ch = ReadCh()) == CR)
  1123. X                  ch = ch_default;
  1124. X!         } while (ch != ESC && ch != 'a' && ch != 'e' && ch != 'p');
  1125. X      }
  1126. X  
  1127. X  post_response_done:
  1128. X***************
  1129. X*** 406,412 ****
  1130. X      chmod (nam, 0600);
  1131. X  
  1132. X      fprintf (fp, "To: %s\n", mail_to);
  1133. X!     fprintf (fp, "Subject: %s\n", note_h_subj);
  1134. X      if (*note_h_followup) {
  1135. X          fprintf (fp, "Newsgroups: %s\n\n", note_h_followup);
  1136. X      } else {
  1137. X--- 419,425 ----
  1138. X      chmod (nam, 0600);
  1139. X  
  1140. X      fprintf (fp, "To: %s\n", mail_to);
  1141. X!     fprintf (fp, "Subject: (fwd) %s\n", note_h_subj);
  1142. X      if (*note_h_followup) {
  1143. X          fprintf (fp, "Newsgroups: %s\n\n", note_h_followup);
  1144. X      } else {
  1145. X***************
  1146. X*** 436,442 ****
  1147. X              MoveCursor (LINES, (int) strlen (msg)-1);
  1148. X              if ((ch = ReadCh ()) == CR)
  1149. X                  ch = ch_default;
  1150. X!         } while (ch != 'a' && ch != 'e' && ch != 's');
  1151. X  
  1152. X          switch (ch) {
  1153. X          case 'e':
  1154. X--- 449,455 ----
  1155. X              MoveCursor (LINES, (int) strlen (msg)-1);
  1156. X              if ((ch = ReadCh ()) == CR)
  1157. X                  ch = ch_default;
  1158. X!         } while (ch != ESC && ch != 'a' && ch != 'e' && ch != 's');
  1159. X  
  1160. X          switch (ch) {
  1161. X          case 'e':
  1162. X***************
  1163. X*** 445,450 ****
  1164. X--- 458,464 ----
  1165. X              break;
  1166. X  
  1167. X          case 'a':
  1168. X+         case ESC:
  1169. X              unlink (nam);
  1170. X              clear_message ();
  1171. X              set_tin_uid_gid ();
  1172. X***************
  1173. X*** 527,532 ****
  1174. X--- 541,547 ----
  1175. X              break;
  1176. X  
  1177. X          case 'a':
  1178. X+         case ESC:
  1179. X              unlink (nam);
  1180. X              clear_message ();
  1181. X              set_tin_uid_gid ();
  1182. X***************
  1183. X*** 553,559 ****
  1184. X              MoveCursor (LINES, (int) strlen (msg)-1);
  1185. X              if ((ch = ReadCh ()) == CR)
  1186. X                  ch = ch_default;
  1187. X!         } while (ch != 'a' && ch != 'e' && ch != 's');
  1188. X      }
  1189. X  
  1190. X  mail_bug_report_done:
  1191. X--- 568,574 ----
  1192. X              MoveCursor (LINES, (int) strlen (msg)-1);
  1193. X              if ((ch = ReadCh ()) == CR)
  1194. X                  ch = ch_default;
  1195. X!         } while (ch != ESC && ch != 'a' && ch != 'e' && ch != 's');
  1196. X      }
  1197. X  
  1198. X  mail_bug_report_done:
  1199. X***************
  1200. X*** 619,624 ****
  1201. X--- 634,640 ----
  1202. X              break;
  1203. X  
  1204. X          case 'a':
  1205. X+         case ESC:
  1206. X              unlink (nam);
  1207. X              clear_message ();
  1208. X              set_tin_uid_gid ();
  1209. X***************
  1210. X*** 645,651 ****
  1211. X              MoveCursor (LINES, (int) strlen (msg)-1);
  1212. X              if ((ch = ReadCh ()) == CR)
  1213. X                  ch = ch_default;
  1214. X!         } while (ch != 'a' && ch != 'e' && ch != 's');
  1215. X      }
  1216. X  
  1217. X  mail_to_author_done:
  1218. X--- 661,667 ----
  1219. X              MoveCursor (LINES, (int) strlen (msg)-1);
  1220. X              if ((ch = ReadCh ()) == CR)
  1221. X                  ch = ch_default;
  1222. X!         } while (ch != ESC && ch != 'a' && ch != 'e' && ch != 's');
  1223. X      }
  1224. X  
  1225. X  mail_to_author_done:
  1226. X***************
  1227. X*** 756,762 ****
  1228. X              MoveCursor (LINES, (int) strlen (msg)-1);
  1229. X              if ((ch = ReadCh ()) == CR)
  1230. X                  ch = ch_default;
  1231. X!         } while (ch != 'a' && ch != 'e' && ch != 'c');
  1232. X  
  1233. X          switch (ch) {
  1234. X          case 'e':
  1235. X--- 772,778 ----
  1236. X              MoveCursor (LINES, (int) strlen (msg)-1);
  1237. X              if ((ch = ReadCh ()) == CR)
  1238. X                  ch = ch_default;
  1239. X!         } while (ch != ESC && ch != 'a' && ch != 'e' && ch != 'c');
  1240. X  
  1241. X          switch (ch) {
  1242. X          case 'e':
  1243. X***************
  1244. X*** 765,770 ****
  1245. X--- 781,787 ----
  1246. X              break;
  1247. X  
  1248. X          case 'a':
  1249. X+         case ESC:
  1250. X              unlink (cancel);
  1251. X              clear_message ();
  1252. X              set_tin_uid_gid ();
  1253. Xdiff -rcs 103/prompt.c 104/prompt.c
  1254. X*** 103/prompt.c    Mon Sep 30 07:58:07 1991
  1255. X--- 104/prompt.c    Mon Sep 30 20:51:37 1991
  1256. X***************
  1257. X*** 3,9 ****
  1258. X   *  Module    : prompt.c
  1259. X   *  Author    : R.Skrenta / I.Lea
  1260. X   *  Created   : 01-04-91
  1261. X!  *  Updated   : 10-08-91
  1262. X   *  Release   : 1.0
  1263. X   *  Notes     :
  1264. X   *  Copyright : (c) Copyright 1991 by Rich Skrenta & Iain Lea
  1265. X--- 3,9 ----
  1266. X   *  Module    : prompt.c
  1267. X   *  Author    : R.Skrenta / I.Lea
  1268. X   *  Created   : 01-04-91
  1269. X!  *  Updated   : 30-09-91
  1270. X   *  Release   : 1.0
  1271. X   *  Notes     :
  1272. X   *  Copyright : (c) Copyright 1991 by Rich Skrenta & Iain Lea
  1273. X***************
  1274. X*** 38,43 ****
  1275. X--- 38,47 ----
  1276. X      len = 1;
  1277. X      ch = ReadCh ();
  1278. X      while (ch != '\n' && ch != '\r') {
  1279. X+         if (ch == ESC) {        /* Esc pressed so return */
  1280. X+             clear_message ();
  1281. X+             return -1;
  1282. X+         }
  1283. X          if (ch == 8 || ch == 127) {
  1284. X              if (len) {
  1285. X                  len--;
  1286. X***************
  1287. X*** 89,107 ****
  1288. X      char *prompt;
  1289. X      char *buf;
  1290. X  {
  1291. X-     int len;
  1292. X-     int i;
  1293. X      char ch;
  1294. X  
  1295. X!     clear_message();
  1296. X!     MoveCursor(LINES,0);
  1297. X!     printf("%s", prompt);
  1298. X!     fflush(stdout);
  1299. X  
  1300. X      buf[0] = '\0';
  1301. X      len = 0;
  1302. X      ch = ReadCh();
  1303. X      while (ch != '\n' && ch != '\r') {
  1304. X          if (ch == 8 || ch == 127) {
  1305. X              if (len) {
  1306. X                  len--;
  1307. X--- 93,179 ----
  1308. X      char *prompt;
  1309. X      char *buf;
  1310. X  {
  1311. X      char ch;
  1312. X+     int i, len;
  1313. X+     int max_len;
  1314. X  
  1315. X!     clear_message ();
  1316. X!     MoveCursor (LINES,0);
  1317. X!     printf ("%s", prompt);
  1318. X!     fflush (stdout);
  1319. X  
  1320. X      buf[0] = '\0';
  1321. X      len = 0;
  1322. X+     max_len = (COLS - strlen (prompt))-2;
  1323. X+     ch = ReadCh ();
  1324. X+ 
  1325. X+     while (ch != '\n' && ch != '\r') {
  1326. X+         if (ch == ESC) {        /* Esc pressed so abort */
  1327. X+             clear_message ();
  1328. X+             return FALSE;
  1329. X+         }
  1330. X+         if (ch == 8 || ch == 127) {
  1331. X+             if (len) {
  1332. X+                 len--;
  1333. X+                 buf[len] = '\0';
  1334. X+                 putchar ('\b');
  1335. X+                 putchar (' ');
  1336. X+                 putchar ('\b');
  1337. X+             } else {
  1338. X+                 MoveCursor (LINES, 0);
  1339. X+                 CleartoEOLN ();
  1340. X+                 return (FALSE);
  1341. X+             }
  1342. X+         } else if (ch == 21) {    /* control-U    */
  1343. X+             for (i = len ; i > 0 ; i--) {
  1344. X+                 putchar ('\b');
  1345. X+                 putchar (' ');
  1346. X+                 putchar ('\b');
  1347. X+             }
  1348. X+             buf[0] = '\0';
  1349. X+             len = 0;
  1350. X+         } else if (ch >= ' ' && len < max_len) {
  1351. X+             buf[len++] = ch;
  1352. X+             buf[len] = '\0';
  1353. X+             putchar (ch);
  1354. X+         } else {
  1355. X+             putchar (7);
  1356. X+         }
  1357. X+         fflush (stdout);
  1358. X+         ch = ReadCh ();
  1359. X+     }
  1360. X+     MoveCursor (LINES,0);
  1361. X+     CleartoEOLN ();
  1362. X+ 
  1363. X+     return TRUE;
  1364. X+ }
  1365. X+ 
  1366. X+ /*
  1367. X+  *  parse_menu_string
  1368. X+  *  get a string from the user
  1369. X+  *  Return TRUE if a valid string was typed, FALSE otherwise
  1370. X+  */
  1371. X+ 
  1372. X+ int parse_menu_string (line, col, var)
  1373. X+     int line;
  1374. X+     int col;
  1375. X+     char *var;
  1376. X+ {
  1377. X+     char buf[LEN];
  1378. X+     char ch;
  1379. X+     int i, len;
  1380. X+     int max_len;
  1381. X+ 
  1382. X+     MoveCursor (line, col);
  1383. X+     buf[0] = '\0';
  1384. X+     len = 0;
  1385. X+     max_len = (COLS - col)-2;
  1386. X      ch = ReadCh();
  1387. X+ 
  1388. X      while (ch != '\n' && ch != '\r') {
  1389. X+         if (ch == ESC) {        /* Esc pressed so abort */
  1390. X+             return FALSE;
  1391. X+         }
  1392. X          if (ch == 8 || ch == 127) {
  1393. X              if (len) {
  1394. X                  len--;
  1395. X***************
  1396. X*** 110,118 ****
  1397. X                  putchar(' ');
  1398. X                  putchar('\b');
  1399. X              } else {
  1400. X!                 MoveCursor(LINES, 0);
  1401. X                  CleartoEOLN();
  1402. X-                 return(FALSE);
  1403. X              }
  1404. X          } else if (ch == 21) {    /* control-U    */
  1405. X              for (i = len;i>0;i--) {
  1406. X--- 182,190 ----
  1407. X                  putchar(' ');
  1408. X                  putchar('\b');
  1409. X              } else {
  1410. X!                 strcpy (var, buf);
  1411. X!                 MoveCursor(line, col);
  1412. X                  CleartoEOLN();
  1413. X              }
  1414. X          } else if (ch == 21) {    /* control-U    */
  1415. X              for (i = len;i>0;i--) {
  1416. X***************
  1417. X*** 122,128 ****
  1418. X              }
  1419. X              buf[0] = '\0';
  1420. X              len = 0;
  1421. X!         } else if (ch >= ' ' && len < 60) {
  1422. X              buf[len++] = ch;
  1423. X              buf[len] = '\0';
  1424. X              putchar (ch);
  1425. X--- 194,200 ----
  1426. X              }
  1427. X              buf[0] = '\0';
  1428. X              len = 0;
  1429. X!         } else if (ch >= ' ' && len < max_len) {
  1430. X              buf[len++] = ch;
  1431. X              buf[len] = '\0';
  1432. X              putchar (ch);
  1433. X***************
  1434. X*** 131,139 ****
  1435. X          fflush(stdout);
  1436. X          ch = ReadCh();
  1437. X      }
  1438. X-     MoveCursor(LINES,0);
  1439. X-     CleartoEOLN();
  1440. X  
  1441. X      return TRUE;
  1442. X  }
  1443. X  
  1444. X--- 203,212 ----
  1445. X          fflush(stdout);
  1446. X          ch = ReadCh();
  1447. X      }
  1448. X  
  1449. X+     if (buf[0]) {
  1450. X+         strcpy (var, buf);
  1451. X+     }
  1452. X      return TRUE;
  1453. X  }
  1454. X  
  1455. X***************
  1456. X*** 159,165 ****
  1457. X          clear_message();
  1458. X      } else {
  1459. X          MoveCursor (line, (int) strlen (prompt));
  1460. X!         printf ("%c", ch);
  1461. X          fflush (stdout);
  1462. X      }
  1463. X  
  1464. X--- 232,242 ----
  1465. X          clear_message();
  1466. X      } else {
  1467. X          MoveCursor (line, (int) strlen (prompt));
  1468. X!         if (ch == ESC) {
  1469. X!             printf ("%c", default_ch);
  1470. X!         } else {
  1471. X!             printf ("%c", ch);
  1472. X!         }
  1473. X          fflush (stdout);
  1474. X      }
  1475. X  
  1476. Xdiff -rcs 103/proto.h 104/proto.h
  1477. X*** 103/proto.h    Mon Sep 30 07:58:07 1991
  1478. X--- 104/proto.h    Mon Sep 30 20:32:10 1991
  1479. X***************
  1480. X*** 113,119 ****
  1481. X  void set_real_uid_gid(void);
  1482. X  void set_tin_uid_gid(void);
  1483. X  void notify_groups(void);
  1484. X! void basename(char *dirname, char *basename);
  1485. X  void mail_setup(void);
  1486. X  int mail_check(void);
  1487. X  /* newsrc.c */
  1488. X--- 113,119 ----
  1489. X  void set_real_uid_gid(void);
  1490. X  void set_tin_uid_gid(void);
  1491. X  void notify_groups(void);
  1492. X! void basename(char *dirname, char *program);
  1493. X  void mail_setup(void);
  1494. X  int mail_check(void);
  1495. X  /* newsrc.c */
  1496. X***************
  1497. X*** 176,181 ****
  1498. X--- 176,182 ----
  1499. X  /* prompt.c */
  1500. X  int parse_num(int ch, char *prompt);
  1501. X  int parse_string(char *prompt, char *buf);
  1502. X+ int parse_menu_string(int line, int col, char *var);
  1503. X  int prompt_yn(int line, char *prompt, int default_ch);
  1504. X  void continue_prompt(void);
  1505. X  /* rcfile.c */
  1506. X***************
  1507. X*** 183,189 ****
  1508. X  void write_rcfile(void);
  1509. X  int change_rcfile(char *group, int kill_at_once);
  1510. X  void show_rcfile_menu(void);
  1511. X- void parse_menu_string(int line, int col, char *var);
  1512. X  void expand_rel_abs_pathname(int line, int col, char *str);
  1513. X  void show_menu_help(char *help_message);
  1514. X  /* save.c */
  1515. X--- 184,189 ----
  1516. X***************
  1517. X*** 206,214 ****
  1518. X  void delete_processed_files(void);
  1519. X  void post_process_patch(void);
  1520. X  /* screen.c */
  1521. X! void info_message(char *msg);
  1522. X! void wait_message(char *msg);
  1523. X! void error_message(char *template, char *msg);
  1524. X  void clear_message(void);
  1525. X  void center_line(int line, int inverse, char *str);
  1526. X  void draw_arrow(int line);
  1527. X--- 206,214 ----
  1528. X  void delete_processed_files(void);
  1529. X  void post_process_patch(void);
  1530. X  /* screen.c */
  1531. X! void info_message(char *str);
  1532. X! void wait_message(char *str);
  1533. X! void error_message(char *template, char *str);
  1534. X  void clear_message(void);
  1535. X  void center_line(int line, int inverse, char *str);
  1536. X  void draw_arrow(int line);
  1537. X***************
  1538. X*** 366,372 ****
  1539. X  void set_real_uid_gid(/*void*/);
  1540. X  void set_tin_uid_gid(/*void*/);
  1541. X  void notify_groups(/*void*/);
  1542. X! void basename(/*char *dirname, char *basename*/);
  1543. X  void mail_setup(/*void*/);
  1544. X  int mail_check(/*void*/);
  1545. X  /* newsrc.c */
  1546. X--- 366,372 ----
  1547. X  void set_real_uid_gid(/*void*/);
  1548. X  void set_tin_uid_gid(/*void*/);
  1549. X  void notify_groups(/*void*/);
  1550. X! void basename(/*char *dirname, char *program*/);
  1551. X  void mail_setup(/*void*/);
  1552. X  int mail_check(/*void*/);
  1553. X  /* newsrc.c */
  1554. X***************
  1555. X*** 429,434 ****
  1556. X--- 429,435 ----
  1557. X  /* prompt.c */
  1558. X  int parse_num(/*int ch, char *prompt*/);
  1559. X  int parse_string(/*char *prompt, char *buf*/);
  1560. X+ int parse_menu_string(/*int line, int col, char *var*/);
  1561. X  int prompt_yn(/*int line, char *prompt, int default_ch*/);
  1562. X  void continue_prompt(/*void*/);
  1563. X  /* rcfile.c */
  1564. X***************
  1565. X*** 436,442 ****
  1566. X  void write_rcfile(/*void*/);
  1567. X  int change_rcfile(/*char *group, int kill_at_once*/);
  1568. X  void show_rcfile_menu(/*void*/);
  1569. X- void parse_menu_string(/*int line, int col, char *var*/);
  1570. X  void expand_rel_abs_pathname(/*int line, int col, char *str*/);
  1571. X  void show_menu_help(/*char *help_message*/);
  1572. X  /* save.c */
  1573. X--- 437,442 ----
  1574. X***************
  1575. X*** 459,467 ****
  1576. X  void delete_processed_files(/*void*/);
  1577. X  void post_process_patch(/*void*/);
  1578. X  /* screen.c */
  1579. X! void info_message(/*char *msg*/);
  1580. X! void wait_message(/*char *msg*/);
  1581. X! void error_message(/*char *template, char *msg*/);
  1582. X  void clear_message(/*void*/);
  1583. X  void center_line(/*int line, int inverse, char *str*/);
  1584. X  void draw_arrow(/*int line*/);
  1585. X--- 459,467 ----
  1586. X  void delete_processed_files(/*void*/);
  1587. X  void post_process_patch(/*void*/);
  1588. X  /* screen.c */
  1589. X! void info_message(/*char *str*/);
  1590. X! void wait_message(/*char *str*/);
  1591. X! void error_message(/*char *template, char *str*/);
  1592. X  void clear_message(/*void*/);
  1593. X  void center_line(/*int line, int inverse, char *str*/);
  1594. X  void draw_arrow(/*int line*/);
  1595. Xdiff -rcs 103/rcfile.c 104/rcfile.c
  1596. X*** 103/rcfile.c    Mon Sep 30 12:39:57 1991
  1597. X--- 104/rcfile.c    Mon Sep 30 20:24:53 1991
  1598. X***************
  1599. X*** 3,9 ****
  1600. X   *  Module    : rcfile.c
  1601. X   *  Author    : I.Lea
  1602. X   *  Created   : 01-04-91
  1603. X!  *  Updated   : 29-09-91
  1604. X   *  Release   : 1.0
  1605. X   *  Notes     :
  1606. X   *  Copyright : (c) Copyright 1991 by Iain Lea
  1607. X--- 3,9 ----
  1608. X   *  Module    : rcfile.c
  1609. X   *  Author    : I.Lea
  1610. X   *  Created   : 01-04-91
  1611. X!  *  Updated   : 30-09-91
  1612. X   *  Release   : 1.0
  1613. X   *  Notes     :
  1614. X   *  Copyright : (c) Copyright 1991 by Iain Lea
  1615. X***************
  1616. X*** 274,280 ****
  1617. X                          printf ("%s", (save_archive_name ? "ON " : "OFF"));
  1618. X                          fflush(stdout);
  1619. X                      }
  1620. X!                 } while (ch != CR);
  1621. X                  break;
  1622. X  
  1623. X              case 2:        /* save sperate */
  1624. X--- 274,280 ----
  1625. X                          printf ("%s", (save_archive_name ? "ON " : "OFF"));
  1626. X                          fflush(stdout);
  1627. X                      }
  1628. X!                 } while (ch != CR && ch != ESC);
  1629. X                  break;
  1630. X  
  1631. X              case 2:        /* save sperate */
  1632. X***************
  1633. X*** 286,292 ****
  1634. X                          printf ("%s", (save_separate ? "ON " : "OFF"));
  1635. X                          fflush(stdout);
  1636. X                      }
  1637. X!                 } while (ch != CR);
  1638. X                  break;
  1639. X              
  1640. X              case 3:        /* mark saved articles read */
  1641. X--- 286,292 ----
  1642. X                          printf ("%s", (save_separate ? "ON " : "OFF"));
  1643. X                          fflush(stdout);
  1644. X                      }
  1645. X!                 } while (ch != CR && ch != ESC);
  1646. X                  break;
  1647. X              
  1648. X              case 3:        /* mark saved articles read */
  1649. X***************
  1650. X*** 298,304 ****
  1651. X                          printf ("%s", (mark_saved_read ? "ON " : "OFF"));
  1652. X                          fflush(stdout);
  1653. X                      }
  1654. X!                 } while (ch != CR);
  1655. X                  break;
  1656. X  
  1657. X              case 4:        /* kill articles */
  1658. X--- 298,304 ----
  1659. X                          printf ("%s", (mark_saved_read ? "ON " : "OFF"));
  1660. X                          fflush(stdout);
  1661. X                      }
  1662. X!                 } while (ch != CR && ch != ESC);
  1663. X                  break;
  1664. X  
  1665. X              case 4:        /* kill articles */
  1666. X***************
  1667. X*** 312,318 ****
  1668. X                          printf ("%s", (kill_articles ? "ON " : "OFF"));
  1669. X                          fflush(stdout);
  1670. X                      }
  1671. X!                 } while (ch != CR);
  1672. X                  break;
  1673. X  
  1674. X              case 5:        /* show subject & author / subject only */
  1675. X--- 312,318 ----
  1676. X                          printf ("%s", (kill_articles ? "ON " : "OFF"));
  1677. X                          fflush(stdout);
  1678. X                      }
  1679. X!                 } while (ch != CR && ch != ESC);
  1680. X                  break;
  1681. X  
  1682. X              case 5:        /* show subject & author / subject only */
  1683. X***************
  1684. X*** 324,330 ****
  1685. X                          printf ("%s", (show_author ? "ON " : "OFF"));
  1686. X                          fflush(stdout);    
  1687. X                      }
  1688. X!                 } while (ch != CR);
  1689. X                  break;
  1690. X              
  1691. X              case 6:        /* draw -> / highlighted bar */
  1692. X--- 324,330 ----
  1693. X                          printf ("%s", (show_author ? "ON " : "OFF"));
  1694. X                          fflush(stdout);    
  1695. X                      }
  1696. X!                 } while (ch != CR && ch != ESC);
  1697. X                  break;
  1698. X              
  1699. X              case 6:        /* draw -> / highlighted bar */
  1700. X***************
  1701. X*** 336,342 ****
  1702. X                          printf ("%s", (draw_arrow_mark ? "ON " : "OFF"));
  1703. X                          fflush(stdout);
  1704. X                      }
  1705. X!                 } while (ch != CR);
  1706. X                  if (draw_arrow_mark == FALSE && inverse_okay == FALSE) {
  1707. X                      inverse_okay = TRUE;
  1708. X                  }
  1709. X--- 336,342 ----
  1710. X                          printf ("%s", (draw_arrow_mark ? "ON " : "OFF"));
  1711. X                          fflush(stdout);
  1712. X                      }
  1713. X!                 } while (ch != CR && ch != ESC);
  1714. X                  if (draw_arrow_mark == FALSE && inverse_okay == FALSE) {
  1715. X                      inverse_okay = TRUE;
  1716. X                  }
  1717. X***************
  1718. X*** 351,357 ****
  1719. X                          printf ("%s", (print_header ? "ON " : "OFF"));
  1720. X                          fflush(stdout);
  1721. X                      }
  1722. X!                 } while (ch != CR);
  1723. X                  break;
  1724. X              
  1725. X              case 8:        /* position cursor at first / last unread art */
  1726. X--- 351,357 ----
  1727. X                          printf ("%s", (print_header ? "ON " : "OFF"));
  1728. X                          fflush(stdout);
  1729. X                      }
  1730. X!                 } while (ch != CR && ch != ESC);
  1731. X                  break;
  1732. X              
  1733. X              case 8:        /* position cursor at first / last unread art */
  1734. X***************
  1735. X*** 363,369 ****
  1736. X                          printf ("%s", (pos_first_unread ? "ON " : "OFF"));
  1737. X                          fflush(stdout);
  1738. X                      }
  1739. X!                 } while (ch != CR);
  1740. X                  break;
  1741. X  
  1742. X              case 9:
  1743. X--- 363,369 ----
  1744. X                          printf ("%s", (pos_first_unread ? "ON " : "OFF"));
  1745. X                          fflush(stdout);
  1746. X                      }
  1747. X!                 } while (ch != CR && ch != ESC);
  1748. X                  break;
  1749. X  
  1750. X              case 9:
  1751. X***************
  1752. X*** 406,412 ****
  1753. X                          printf ("%s", str);
  1754. X                          fflush(stdout);
  1755. X                      }
  1756. X!                 } while (ch != CR);
  1757. X                  break;
  1758. X              case 10:
  1759. X                  show_menu_help (txt_help_sort_type);
  1760. X--- 406,412 ----
  1761. X                          printf ("%s", str);
  1762. X                          fflush(stdout);
  1763. X                      }
  1764. X!                 } while (ch != CR && ch != ESC);
  1765. X                  break;
  1766. X              case 10:
  1767. X                  show_menu_help (txt_help_sort_type);
  1768. X***************
  1769. X*** 445,451 ****
  1770. X                          printf ("%s", str);
  1771. X                          fflush(stdout);
  1772. X                      }
  1773. X!                 } while (ch != CR);
  1774. X                  break;
  1775. X              case 11:
  1776. X                  show_menu_help (txt_help_savedir);
  1777. X--- 445,451 ----
  1778. X                          printf ("%s", str);
  1779. X                          fflush(stdout);
  1780. X                      }
  1781. X!                 } while (ch != CR && ch != ESC);
  1782. X                  break;
  1783. X              case 11:
  1784. X                  show_menu_help (txt_help_savedir);
  1785. X***************
  1786. X*** 547,608 ****
  1787. X  
  1788. X      show_menu_help (txt_select_rcfile_option);
  1789. X      MoveCursor (LINES, 0);
  1790. X- }
  1791. X- 
  1792. X- /*
  1793. X-  *  parse_menu_string
  1794. X-  *  get a string from the user
  1795. X-  *  Return TRUE if a valid string was typed, FALSE otherwise
  1796. X-  */
  1797. X- 
  1798. X- void parse_menu_string (line, col, var)
  1799. X-     int line;
  1800. X-     int col;
  1801. X-     char *var;
  1802. X- {
  1803. X-     char buf[LEN];
  1804. X-     char ch;
  1805. X-     int len;
  1806. X-     int i;
  1807. X- 
  1808. X-     MoveCursor (line, col);
  1809. X-     buf[0] = '\0';
  1810. X-     len = 0;
  1811. X-     ch = ReadCh();
  1812. X-     while (ch != '\n' && ch != '\r') {
  1813. X-         if (ch == 8 || ch == 127) {
  1814. X-             if (len) {
  1815. X-                 len--;
  1816. X-                 buf[len] = '\0';
  1817. X-                 putchar('\b');
  1818. X-                 putchar(' ');
  1819. X-                 putchar('\b');
  1820. X-             } else {
  1821. X-                 strcpy (var, buf);
  1822. X-                 MoveCursor(line, col);
  1823. X-                 CleartoEOLN();
  1824. X-             }
  1825. X-         } else if (ch == 21) {    /* control-U    */
  1826. X-             for (i = len;i>0;i--) {
  1827. X-                 putchar('\b');
  1828. X-                 putchar(' ');
  1829. X-                 putchar('\b');
  1830. X-             }
  1831. X-             buf[0] = '\0';
  1832. X-             len = 0;
  1833. X-         } else if (ch >= ' ' && len < 60) {
  1834. X-             buf[len++] = ch;
  1835. X-             buf[len] = '\0';
  1836. X-             putchar (ch);
  1837. X-         } else
  1838. X-             putchar(7);
  1839. X-         fflush(stdout);
  1840. X-         ch = ReadCh();
  1841. X-     }
  1842. X- 
  1843. X-     if (buf[0]) {
  1844. X-         strcpy (var, buf);
  1845. X-     }
  1846. X  }
  1847. X  
  1848. X  /*
  1849. X--- 547,552 ----
  1850. Xdiff -rcs 103/save.c 104/save.c
  1851. X*** 103/save.c    Mon Sep 30 12:40:22 1991
  1852. X--- 104/save.c    Wed Oct  2 18:52:25 1991
  1853. SHAR_EOF
  1854. echo "End of tin1.0 part 1"
  1855. echo "File tin.patch04 is continued in part 2"
  1856. echo "2" > shar3_seq_.tmp
  1857. exit 0
  1858.  
  1859. exit 0 # Just in case...
  1860. -- 
  1861. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1862. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1863. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1864. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1865.