home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / comp / sources / misc / 3814 < prev    next >
Encoding:
Text File  |  1992-08-15  |  60.8 KB  |  2,490 lines

  1. Newsgroups: comp.sources.misc
  2. Path: sparky!kent
  3. From: iain%anl433.uucp@Germany.EU.net (Iain Lea)
  4. Subject:  v31i085:  tin - threaded full screen newsreader v1.1, Patch05f/7
  5. Message-ID: <1992Aug16.012743.12875@sparky.imd.sterling.com>
  6. Followup-To: comp.sources.d
  7. X-Md4-Signature: 8abe47c4b713f9c28961df79a6347391
  8. Sender: kent@sparky.imd.sterling.com (Kent Landfield)
  9. Reply-To: iain%anl433.uucp@Germany.EU.net
  10. Organization: ANL A433, Siemens AG., Germany.
  11. References: <csm-v31i080=tin.201729@sparky.IMD.Sterling.COM>
  12. Date: Sun, 16 Aug 1992 01:27:43 GMT
  13. Approved: kent@sparky.imd.sterling.com
  14. Lines: 2474
  15.  
  16. Submitted-by: iain%anl433.uucp@Germany.EU.net (Iain Lea)
  17. Posting-number: Volume 31, Issue 85
  18. Archive-name: tin/patch05f
  19. Environment: BSD, SCO, ISC, SUNOS, SYSVR3, SYSVR4, ULTRIX, XENIX
  20. Patch-To: tin: Volume 31, Issue 1-15
  21.  
  22. #!/bin/sh
  23. # this is patch-1.15.shar.06 (part 6 of tin-1.15)
  24. # do not concatenate these parts, unpack them in order with /bin/sh
  25. # file tin-1.15.patch continued
  26. #
  27. if test ! -r _shar_seq_.tmp; then
  28.     echo 'Please unpack part 1 first!'
  29.     exit 1
  30. fi
  31. (read Scheck
  32.  if test "$Scheck" != 6; then
  33.     echo Please unpack part "$Scheck" next!
  34.     exit 1
  35.  else
  36.     exit 0
  37.  fi
  38. ) < _shar_seq_.tmp || exit 1
  39. if test ! -f _shar_wnt_.tmp; then
  40.     echo 'x - still skipping tin-1.15.patch'
  41. else
  42. echo 'x - continuing file tin-1.15.patch'
  43. sed 's/^X//' << 'SHAR_EOF' >> 'tin-1.15.patch' &&
  44. *** 560,576 ****
  45. X                  break;
  46. X  
  47. X              case 15:
  48. !                 var_orig = sort_art_type;
  49. X                  show_menu_help (txt_help_sort_type);
  50. X                  do {
  51. X                      MoveCursor (INDEX_TOP+10, COL1 + (int) strlen (txt_opt_sort_type));
  52. X                      if ((ch    = ReadCh()) == ' ') {
  53. !                         if (sort_art_type + 1 > SORT_BY_DATE_ASCEND) {
  54. !                             sort_art_type = SORT_BY_NOTHING;
  55. X                          } else {
  56. !                             sort_art_type++;
  57. X                          }
  58. !                         switch (sort_art_type) {
  59. X                              case SORT_BY_NOTHING:
  60. X                                  str = txt_sort_by_nothing;
  61. X                                  break;
  62. --- 639,655 ----
  63. X                  break;
  64. X  
  65. X              case 15:
  66. !                 var_orig = default_sort_art_type;
  67. X                  show_menu_help (txt_help_sort_type);
  68. X                  do {
  69. X                      MoveCursor (INDEX_TOP+10, COL1 + (int) strlen (txt_opt_sort_type));
  70. X                      if ((ch    = ReadCh()) == ' ') {
  71. !                         if (default_sort_art_type + 1 > SORT_BY_DATE_ASCEND) {
  72. !                             default_sort_art_type = SORT_BY_NOTHING;
  73. X                          } else {
  74. !                             default_sort_art_type++;
  75. X                          }
  76. !                         switch (default_sort_art_type) {
  77. X                              case SORT_BY_NOTHING:
  78. X                                  str = txt_sort_by_nothing;
  79. X                                  break;
  80. ***************
  81. *** 600,607 ****
  82. X                  } while (ch != CR && ch != ESC);
  83. X  
  84. X                  if (ch == ESC) {    /* restore original value */
  85. !                     sort_art_type = var_orig;
  86. !                     switch (sort_art_type) {
  87. X                          case SORT_BY_NOTHING:
  88. X                              str = txt_sort_by_nothing;
  89. X                              break;
  90. --- 679,686 ----
  91. X                  } while (ch != CR && ch != ESC);
  92. X  
  93. X                  if (ch == ESC) {    /* restore original value */
  94. !                     default_sort_art_type = var_orig;
  95. !                     switch (default_sort_art_type) {
  96. X                          case SORT_BY_NOTHING:
  97. X                              str = txt_sort_by_nothing;
  98. X                              break;
  99. ***************
  100. *** 662,671 ****
  101. X      center_line (0, TRUE, txt_options_menu);
  102. X      
  103. X      MoveCursor (INDEX_TOP, 0);
  104. !     printf ("%s%s\r\n\r\n", txt_opt_autosave, (save_archive_name ? "ON " : "OFF"));
  105. X      printf ("%s%s\r\n\r\n", txt_opt_confirm_action, (confirm_action ? "ON " : "OFF"));
  106. X      printf ("%s%s\r\n\r\n", txt_opt_pos_first_unread, (pos_first_unread ? "ON " : "OFF"));
  107. !     printf ("%s%s", txt_opt_thread_arts, (thread_arts ? "ON " : "OFF"));
  108. X  
  109. X      MoveCursor(INDEX_TOP, COL2);
  110. X      printf ("%s%s", txt_opt_start_editor_offset, (start_editor_offset ? "ON " : "OFF"));
  111. --- 741,750 ----
  112. X      center_line (0, TRUE, txt_options_menu);
  113. X      
  114. X      MoveCursor (INDEX_TOP, 0);
  115. !     printf ("%s%s\r\n\r\n", txt_opt_autosave, (default_auto_save ? "ON " : "OFF"));
  116. X      printf ("%s%s\r\n\r\n", txt_opt_confirm_action, (confirm_action ? "ON " : "OFF"));
  117. X      printf ("%s%s\r\n\r\n", txt_opt_pos_first_unread, (pos_first_unread ? "ON " : "OFF"));
  118. !     printf ("%s%s", txt_opt_thread_arts, (default_thread_arts ? "ON " : "OFF"));
  119. X  
  120. X      MoveCursor(INDEX_TOP, COL2);
  121. X      printf ("%s%s", txt_opt_start_editor_offset, (start_editor_offset ? "ON " : "OFF"));
  122. ***************
  123. *** 674,680 ****
  124. X      MoveCursor(INDEX_TOP+4, COL2);
  125. X      printf ("%s%s", txt_opt_page_scroll, (full_page_scroll ? "ON " : "OFF"));
  126. X      MoveCursor(INDEX_TOP+6, COL2);
  127. !     printf ("%s%s", txt_opt_show_only_unread, (show_only_unread ? "ON " : "OFF"));
  128. X  
  129. X      MoveCursor(INDEX_TOP, COL3);
  130. X      printf ("%s%s", txt_opt_mark_saved_read, (mark_saved_read ? "ON " : "OFF"));
  131. --- 753,759 ----
  132. X      MoveCursor(INDEX_TOP+4, COL2);
  133. X      printf ("%s%s", txt_opt_page_scroll, (full_page_scroll ? "ON " : "OFF"));
  134. X      MoveCursor(INDEX_TOP+6, COL2);
  135. !     printf ("%s%s", txt_opt_show_only_unread, (default_show_only_unread ? "ON " : "OFF"));
  136. X  
  137. X      MoveCursor(INDEX_TOP, COL3);
  138. X      printf ("%s%s", txt_opt_mark_saved_read, (mark_saved_read ? "ON " : "OFF"));
  139. ***************
  140. *** 686,692 ****
  141. X      printf ("%s%s", txt_opt_show_description, (show_description ? "ON " : "OFF"));
  142. X  
  143. X      MoveCursor(INDEX_TOP+8, COL1);
  144. !     switch (show_author) {
  145. X          case SHOW_FROM_NONE:
  146. X              str = txt_show_from_none;
  147. X              break;
  148. --- 765,771 ----
  149. X      printf ("%s%s", txt_opt_show_description, (show_description ? "ON " : "OFF"));
  150. X  
  151. X      MoveCursor(INDEX_TOP+8, COL1);
  152. !     switch (default_show_author) {
  153. X          case SHOW_FROM_NONE:
  154. X              str = txt_show_from_none;
  155. X              break;
  156. ***************
  157. *** 702,708 ****
  158. X      }
  159. X      printf ("%s%s", txt_opt_show_author, str);
  160. X      MoveCursor(INDEX_TOP+8, COL2);
  161. !     switch (post_proc_type) {
  162. X          case POST_PROC_NONE:
  163. X              str = txt_post_process_none;
  164. X              break;
  165. --- 781,787 ----
  166. X      }
  167. X      printf ("%s%s", txt_opt_show_author, str);
  168. X      MoveCursor(INDEX_TOP+8, COL2);
  169. !     switch (default_post_proc_type) {
  170. X          case POST_PROC_NONE:
  171. X              str = txt_post_process_none;
  172. X              break;
  173. ***************
  174. *** 723,729 ****
  175. X      printf ("%s%s\r\n\r\n", txt_opt_process_type, str);
  176. X      
  177. X      MoveCursor(INDEX_TOP+10, COL1);
  178. !     switch (sort_art_type) {
  179. X          case SORT_BY_NOTHING:
  180. X              str = txt_sort_by_nothing;
  181. X              break;
  182. --- 802,808 ----
  183. X      printf ("%s%s\r\n\r\n", txt_opt_process_type, str);
  184. X      
  185. X      MoveCursor(INDEX_TOP+10, COL1);
  186. !     switch (default_sort_art_type) {
  187. X          case SORT_BY_NOTHING:
  188. X              str = txt_sort_by_nothing;
  189. X              break;
  190. ***************
  191. *** 841,843 ****
  192. --- 920,955 ----
  193. X      return FALSE;
  194. X  }
  195. X  
  196. + /*
  197. +  *  convert underlines to spaces in a string
  198. +  */
  199. + void quote_dash_to_space (s)
  200. +     char *s;
  201. + {
  202. +     int i;
  203. +     for (i=0 ; i < strlen (s) ; i++) {
  204. +         if (s[i] == '_') {
  205. +             s[i] = ' ';
  206. +         }
  207. +     }
  208. + }
  209. + /*
  210. +  *  convert spaces to underlines in a string
  211. +  */
  212. + char *quote_space_to_dash (s)
  213. +     char *s;
  214. + {
  215. +     int i;
  216. +     static char ds[PATH_LEN];
  217. +     for (i=0 ; i < strlen (s) ; i++) {
  218. +         (s[i] == ' ') ? (ds[i] = '_') : (ds[i] = s[i]);
  219. +     }    
  220. +     ds[i] = '\0';
  221. +     return ds;
  222. + }
  223. diff -rcs ../1.14/save.c ./save.c
  224. *** ../1.14/save.c    Tue Aug 11 21:23:20 1992
  225. --- ./save.c    Thu Jul 23 08:26:19 1992
  226. ***************
  227. *** 3,9 ****
  228. X   *  Module    : save.c
  229. X   *  Author    : I.Lea & R.Skrenta
  230. X   *  Created   : 01-04-91
  231. !  *  Updated   : 09-05-92
  232. X   *  Notes     :
  233. X   *  Copyright : (c) Copyright 1991-92 by Iain Lea & Rich Skrenta
  234. X   *              You may  freely  copy or  redistribute  this software,
  235. --- 3,9 ----
  236. X   *  Module    : save.c
  237. X   *  Author    : I.Lea & R.Skrenta
  238. X   *  Created   : 01-04-91
  239. !  *  Updated   : 23-07-92
  240. X   *  Notes     :
  241. X   *  Copyright : (c) Copyright 1991-92 by Iain Lea & Rich Skrenta
  242. X   *              You may  freely  copy or  redistribute  this software,
  243. ***************
  244. *** 22,33 ****
  245. X  extern int cur_groupnum;
  246. X  
  247. X  int create_subdir = TRUE;
  248. - int save_num=0;
  249. - int max_save;
  250. X  
  251. - struct save_t *save;
  252. X  
  253. X  /*
  254. X   * types of archive programs
  255. X   * 0=archiver, 1=extension, 2=extract option, 3=list option
  256. --- 22,29 ----
  257. ***************
  258. *** 79,85 ****
  259. X      char group_path[LEN];
  260. X      char savefile[LEN];
  261. X      extern FILE *note_fp;
  262. !     FILE *fp;
  263. X      FILE *fp_log = (FILE *) 0;
  264. X      int i, j, print_group;
  265. X      int check_arts = 0;
  266. --- 75,81 ----
  267. X      char group_path[LEN];
  268. X      char savefile[LEN];
  269. X      extern FILE *note_fp;
  270. !     FILE *fp = (FILE *) 0; 
  271. X      FILE *fp_log = (FILE *) 0;
  272. X      int i, j, print_group;
  273. X      int check_arts = 0;
  274. ***************
  275. *** 155,166 ****
  276. X                                  create_path (buf);
  277. X                              }
  278. X                          }
  279. -                         sprintf (buf, "[%5ld]  %s\n", arts[j].artnum, arts[j].subject);
  280. -                         fprintf (fp_log, "%s", buf);
  281. -                         if (verbose) {
  282. -                             wait_message (buf);
  283. -                         }
  284. -                         saved_arts++;
  285. X  
  286. X                          if (check_start_save == MAIL_ANY_NEWS) {
  287. X                              sprintf (savefile, "/tmp/tin.%d", process_id);
  288. --- 151,156 ----
  289. ***************
  290. *** 169,174 ****
  291. --- 159,172 ----
  292. X                                       group_path, arts[j].artnum);
  293. X                          }
  294. X  
  295. +                         if (check_start_save == MAIL_ANY_NEWS) {
  296. +                             fprintf (fp, "To: %s\n", mail_news_user);
  297. +                         }
  298. +                         note_page = art_open (arts[j].artnum, group_path);    
  299. +                         if (note_page == ART_UNAVAILABLE) {
  300. +                             continue;
  301. +                         }
  302. X                          if ((fp = fopen (savefile, "w")) == NULL) {
  303. X                              fprintf (fp_log, txt_cannot_open, savefile);
  304. X                              if (verbose) {
  305. ***************
  306. *** 176,191 ****
  307. X                              }
  308. X                              continue;
  309. X                          }
  310. !                 
  311. !                         if (check_start_save == MAIL_ANY_NEWS) {
  312. !                             fprintf (fp, "To: %s\n", mail_news_user);
  313. X                          }
  314. -                         note_page = art_open (arts[j].artnum, group_path);    
  315. X                          fseek (note_fp, 0L, 0);
  316. X                          copy_fp (note_fp, fp, "");
  317. X                          art_close ();
  318. X                          fclose (fp);
  319. X  
  320. X                          if (check_start_save == MAIL_ANY_NEWS) {
  321. X                              sprintf (buf, "%s \"%s\" < %s", mailer,
  322. --- 174,189 ----
  323. X                              }
  324. X                              continue;
  325. X                          }
  326. !                         sprintf (buf, "[%5ld]  %s\n", arts[j].artnum, arts[j].subject);
  327. !                         fprintf (fp_log, "%s", buf);
  328. !                         if (verbose) {
  329. !                             wait_message (buf);
  330. X                          }
  331. X                          fseek (note_fp, 0L, 0);
  332. X                          copy_fp (note_fp, fp, "");
  333. X                          art_close ();
  334. X                          fclose (fp);
  335. +                         saved_arts++;
  336. X  
  337. X                          if (check_start_save == MAIL_ANY_NEWS) {
  338. X                              sprintf (buf, "%s \"%s\" < %s", mailer,
  339. ***************
  340. *** 285,291 ****
  341. X          my_strncpy (file, filename, sizeof (file));
  342. X          is_mailbox = mailbox;
  343. X          i = index;
  344. !     } else if (save_archive_name && arts[respnum].archive) {
  345. X          my_strncpy (file, arts[respnum].archive, sizeof (file));
  346. X      }
  347. X  
  348. --- 283,289 ----
  349. X          my_strncpy (file, filename, sizeof (file));
  350. X          is_mailbox = mailbox;
  351. X          i = index;
  352. !     } else if (default_auto_save && arts[respnum].archive) {
  353. X          my_strncpy (file, arts[respnum].archive, sizeof (file));
  354. X      }
  355. X  
  356. ***************
  357. *** 342,348 ****
  358. X      int count = 0;
  359. X      int i, ret_code = FALSE;
  360. X  
  361. !     for (i=0 ; i < save_num ; i++) {
  362. X          sprintf (msg, "%s%d", txt_saving, ++count);
  363. X          wait_message (msg);
  364. X  
  365. --- 340,346 ----
  366. X      int count = 0;
  367. X      int i, ret_code = FALSE;
  368. X  
  369. !     for (i=0 ; i < num_save ; i++) {
  370. X          sprintf (msg, "%s%d", txt_saving, ++count);
  371. X          wait_message (msg);
  372. X  
  373. ***************
  374. *** 353,360 ****
  375. X          }
  376. X  
  377. X          note_page = art_open (arts[save[i].index].artnum, group_path);
  378. !         ret_code = save_art_to_file (save[i].index, i, is_mailbox, file);
  379. !         art_close ();            
  380. X      }
  381. X      
  382. X      first_savefile = get_first_savefile ();
  383. --- 351,360 ----
  384. X          }
  385. X  
  386. X          note_page = art_open (arts[save[i].index].artnum, group_path);
  387. !         if (note_page != ART_UNAVAILABLE) {
  388. !             ret_code = save_art_to_file (save[i].index, i, is_mailbox, file);
  389. !             art_close ();            
  390. !         }
  391. X      }
  392. X      
  393. X      first_savefile = get_first_savefile ();
  394. ***************
  395. *** 365,371 ****
  396. X          if (is_mailbox) {
  397. X              sprintf (save_thread_info, txt_saved_to_mailbox, first_savefile);
  398. X          } else {
  399. !             if (save_num == 1) {
  400. X                  sprintf (save_thread_info, txt_art_saved_to, first_savefile);
  401. X              } else {
  402. X                  sprintf (save_thread_info, txt_thread_saved_to_many,
  403. --- 365,371 ----
  404. X          if (is_mailbox) {
  405. X              sprintf (save_thread_info, txt_saved_to_mailbox, first_savefile);
  406. X          } else {
  407. !             if (num_save == 1) {
  408. X                  sprintf (save_thread_info, txt_art_saved_to, first_savefile);
  409. X              } else {
  410. X                  sprintf (save_thread_info, txt_thread_saved_to_many,
  411. ***************
  412. *** 395,401 ****
  413. X      char buf[PATH_LEN];
  414. X      int i, ret_code = FALSE;     
  415. X      
  416. !     for (i=0 ; i < save_num ; i++) {
  417. X          sprintf(msg, "%s%d", txt_saving, i+1);
  418. X          wait_message (msg);
  419. X  
  420. --- 395,401 ----
  421. X      char buf[PATH_LEN];
  422. X      int i, ret_code = FALSE;     
  423. X      
  424. !     for (i=0 ; i < num_save ; i++) {
  425. X          sprintf(msg, "%s%d", txt_saving, i+1);
  426. X          wait_message (msg);
  427. X  
  428. ***************
  429. *** 406,416 ****
  430. X          }
  431. X  
  432. X          note_page = art_open (arts[save[i].index].artnum, group_path);
  433. !         ret_code = save_art_to_file (save[i].index, i, is_mailbox, buf);
  434. !         art_close ();            
  435. X      }
  436. X  
  437. !     if (! save_num) {    
  438. X          info_message (txt_no_match);
  439. X      } else {
  440. X          if (is_mailbox) {
  441. --- 406,418 ----
  442. X          }
  443. X  
  444. X          note_page = art_open (arts[save[i].index].artnum, group_path);
  445. !         if (note_page != ART_UNAVAILABLE) {
  446. !             ret_code = save_art_to_file (save[i].index, i, is_mailbox, buf);
  447. !             art_close ();            
  448. !         }
  449. X      }
  450. X  
  451. !     if (! num_save) {    
  452. X          info_message (txt_no_match);
  453. X      } else {
  454. X          if (is_mailbox) {
  455. ***************
  456. *** 602,629 ****
  457. X      dir[0] = '\0';
  458. X      file[0] = '\0';
  459. X  
  460. !     if (save_num == max_save-1) {
  461. X          expand_save ();
  462. X      }
  463. X  
  464. !     save[save_num].index   = index;
  465. !     save[save_num].saved   = FALSE;
  466. !     save[save_num].is_mailbox = is_mailbox;
  467. !     save[save_num].dir     = (char *) 0;
  468. !     save[save_num].file    = (char *) 0;
  469. !     save[save_num].archive = (char *) 0;
  470. !     save[save_num].part    = (char *) 0;
  471. !     save[save_num].patch   = (char *) 0;
  472. X  
  473. !     save[save_num].subject = str_dup (article->subject);
  474. X      if (article->archive) {
  475. !         save[save_num].archive = str_dup (article->archive);
  476. X      }
  477. X      if (article->part) {
  478. !         save[save_num].part = str_dup (article->part);
  479. X      }
  480. X      if (article->patch) {
  481. !         save[save_num].patch = str_dup (article->patch);
  482. X      }
  483. X  
  484. X      if (is_mailbox) {
  485. --- 604,631 ----
  486. X      dir[0] = '\0';
  487. X      file[0] = '\0';
  488. X  
  489. !     if (num_save == max_save-1) {
  490. X          expand_save ();
  491. X      }
  492. X  
  493. !     save[num_save].index   = index;
  494. !     save[num_save].saved   = FALSE;
  495. !     save[num_save].is_mailbox = is_mailbox;
  496. !     save[num_save].dir     = (char *) 0;
  497. !     save[num_save].file    = (char *) 0;
  498. !     save[num_save].archive = (char *) 0;
  499. !     save[num_save].part    = (char *) 0;
  500. !     save[num_save].patch   = (char *) 0;
  501. X  
  502. !     save[num_save].subject = str_dup (article->subject);
  503. X      if (article->archive) {
  504. !         save[num_save].archive = str_dup (article->archive);
  505. X      }
  506. X      if (article->part) {
  507. !         save[num_save].part = str_dup (article->part);
  508. X      }
  509. X      if (article->patch) {
  510. !         save[num_save].patch = str_dup (article->patch);
  511. X      }
  512. X  
  513. X      if (is_mailbox) {
  514. ***************
  515. *** 636,643 ****
  516. X          } else {
  517. X              my_strncpy (file, glob_group, sizeof (file));
  518. X          }
  519. !         save[save_num].dir = str_dup (active[my_group[cur_groupnum]].attribute.maildir);
  520. !         save[save_num].file = str_dup (file);
  521. X      } else {
  522. X          if (path[0]) {
  523. X              for (i=strlen (path) ; i ; i--) {
  524. --- 638,645 ----
  525. X          } else {
  526. X              my_strncpy (file, glob_group, sizeof (file));
  527. X          }
  528. !         save[num_save].dir = str_dup (active[my_group[cur_groupnum]].attribute.maildir);
  529. !         save[num_save].file = str_dup (file);
  530. X      } else {
  531. X          if (path[0]) {
  532. X              for (i=strlen (path) ; i ; i--) {
  533. ***************
  534. *** 651,672 ****
  535. X          }
  536. X          
  537. X          if (dir[0]) {
  538. !             save[save_num].dir = str_dup (dir);
  539. X          } else {
  540. !             save[save_num].dir = str_dup (active[my_group[cur_groupnum]].attribute.savedir);
  541. X          }
  542. X  
  543. X          if (file[0]) {
  544. !             save[save_num].file = str_dup (file);
  545. X          } else {
  546. X              if (path[0]) {
  547. !                 save[save_num].file = str_dup (path);
  548. X              } else {
  549. !                 save[save_num].file = str_dup (save[save_num].archive);
  550. X              }
  551. X          }
  552. X      }
  553. !     save_num++;
  554. X  
  555. X  #endif /* INDEX_DAEMON */
  556. X  }
  557. --- 653,674 ----
  558. X          }
  559. X          
  560. X          if (dir[0]) {
  561. !             save[num_save].dir = str_dup (dir);
  562. X          } else {
  563. !             save[num_save].dir = str_dup (active[my_group[cur_groupnum]].attribute.savedir);
  564. X          }
  565. X  
  566. X          if (file[0]) {
  567. !             save[num_save].file = str_dup (file);
  568. X          } else {
  569. X              if (path[0]) {
  570. !                 save[num_save].file = str_dup (path);
  571. X              } else {
  572. !                 save[num_save].file = str_dup (save[num_save].archive);
  573. X              }
  574. X          }
  575. X      }
  576. !     num_save++;
  577. X  
  578. X  #endif /* INDEX_DAEMON */
  579. X  }
  580. ***************
  581. *** 677,683 ****
  582. X  
  583. X  void sort_save_list ()
  584. X  {
  585. !     qsort ((char *) save, save_num, sizeof (struct save_t), save_comp);
  586. X  }
  587. X  
  588. X  /*
  589. --- 679,686 ----
  590. X  
  591. X  void sort_save_list ()
  592. X  {
  593. !     qsort ((char *) save, num_save, sizeof (struct save_t), save_comp);
  594. !     debug_save_comp ();
  595. X  }
  596. X  
  597. X  /*
  598. ***************
  599. *** 697,702 ****
  600. --- 700,729 ----
  601. X       */
  602. X      if (s1->archive != (char *) 0) {
  603. X          if (s1->part != (char *) 0) {
  604. +             if (s2->part != (char *) 0) {
  605. +                 if (strcmp (s1->part, s2->part) < 0) {
  606. +                     return -1;
  607. +                 }
  608. +                 if (strcmp (s1->part, s2->part) > 0) {
  609. +                     return 1;
  610. +                 }
  611. +             } else {
  612. +                 return 0;
  613. +             }    
  614. +         } else if (s1->patch != (char *) 0) {
  615. +             if (s2->patch != (char *) 0) {
  616. +                 if (strcmp (s1->patch, s2->patch) < 0) {
  617. +                     return -1;
  618. +                 }
  619. +                 if (strcmp (s1->patch, s2->patch) > 0) {
  620. +                     return 1;
  621. +                 }
  622. +             } else {
  623. +                 return 0;
  624. +             }    
  625. +         }    
  626. + #if 0
  627. +         if (s1->part != (char *) 0) {
  628. X              if (strcmp (s1->part, s2->part) < 0) {
  629. X                  return -1;
  630. X              }
  631. ***************
  632. *** 711,716 ****
  633. --- 738,744 ----
  634. X                  return 1;
  635. X              }
  636. X          }    
  637. + #endif
  638. X      } else {
  639. X          if (strcmp (s1->subject, s2->subject) < 0) {
  640. X              return -1;
  641. ***************
  642. *** 736,743 ****
  643. X          return (filename);
  644. X      }
  645. X      
  646. !     if (! save_archive_name || (! save[i].part && ! save[i].patch)) {
  647. !         if (save_num == 1) {
  648. X              sprintf (filename, "%s/%s", save[i].dir, save[i].file);
  649. X          } else {
  650. X              sprintf (filename, "%s/%s.%02d", save[i].dir, save[i].file, i+1);
  651. --- 764,771 ----
  652. X          return (filename);
  653. X      }
  654. X      
  655. !     if (! default_auto_save || (! save[i].part && ! save[i].patch)) {
  656. !         if (num_save == 1) {
  657. X              sprintf (filename, "%s/%s", save[i].dir, save[i].file);
  658. X          } else {
  659. X              sprintf (filename, "%s/%s.%02d", save[i].dir, save[i].file, i+1);
  660. ***************
  661. *** 771,777 ****
  662. X      char *file;
  663. X      int i;
  664. X  
  665. !     for (i=0 ; i < save_num ; i++) {
  666. X          if (save[i].saved) {
  667. X              file = (char *) my_malloc (PATH_LEN);
  668. X              if (save[i].is_mailbox) {
  669. --- 799,805 ----
  670. X      char *file;
  671. X      int i;
  672. X  
  673. !     for (i=0 ; i < num_save ; i++) {
  674. X          if (save[i].saved) {
  675. X              file = (char *) my_malloc (PATH_LEN);
  676. X              if (save[i].is_mailbox) {
  677. ***************
  678. *** 778,784 ****
  679. X                  sprintf (file, "%s/%s", save[i].dir, save[i].file);
  680. X                  return (file);
  681. X              } else {
  682. !                 if (save[i].archive && save_archive_name) {
  683. X                      if (save[i].part) {
  684. X                          if (create_subdir) {
  685. X                              sprintf (file, "%s/%s.%s%s", save[i].archive, save[i].archive, LONG_PATH_PART, save[i].part);
  686. --- 806,812 ----
  687. X                  sprintf (file, "%s/%s", save[i].dir, save[i].file);
  688. X                  return (file);
  689. X              } else {
  690. !                 if (save[i].archive && default_auto_save) {
  691. X                      if (save[i].part) {
  692. X                          if (create_subdir) {
  693. X                              sprintf (file, "%s/%s.%s%s", save[i].archive, save[i].archive, LONG_PATH_PART, save[i].part);
  694. ***************
  695. *** 793,799 ****
  696. X                          }
  697. X                      }
  698. X                  } else {
  699. !                     if (save_num == 1) {
  700. X                          sprintf (file, "%s", save[i].file);
  701. X                      } else {
  702. X                          sprintf (file, "%s.%02d", save[i].file, i+1);
  703. --- 821,827 ----
  704. X                          }
  705. X                      }
  706. X                  } else {
  707. !                     if (num_save == 1) {
  708. X                          sprintf (file, "%s", save[i].file);
  709. X                      } else {
  710. X                          sprintf (file, "%s.%02d", save[i].file, i+1);
  711. ***************
  712. *** 812,818 ****
  713. X      char *file;
  714. X      int i;
  715. X      
  716. !     for (i=save_num-1 ; i >= 0 ; i--) {
  717. X          if (save[i].saved) {
  718. X              file = (char *) my_malloc (PATH_LEN);
  719. X              if (save[i].is_mailbox) {
  720. --- 840,846 ----
  721. X      char *file;
  722. X      int i;
  723. X      
  724. !     for (i=num_save-1 ; i >= 0 ; i--) {
  725. X          if (save[i].saved) {
  726. X              file = (char *) my_malloc (PATH_LEN);
  727. X              if (save[i].is_mailbox) {
  728. ***************
  729. *** 819,825 ****
  730. X                  sprintf (file, "%s/%s", save[i].dir, save[i].file);
  731. X                  return (file);
  732. X              } else {
  733. !                 if (save[i].archive && save_archive_name) {
  734. X                      if (save[i].part) {
  735. X                          if (create_subdir) {
  736. X                              sprintf (file, "%s/%s.%s%s", save[i].archive, save[i].archive, LONG_PATH_PART, save[i].part);
  737. --- 847,853 ----
  738. X                  sprintf (file, "%s/%s", save[i].dir, save[i].file);
  739. X                  return (file);
  740. X              } else {
  741. !                 if (save[i].archive && default_auto_save) {
  742. X                      if (save[i].part) {
  743. X                          if (create_subdir) {
  744. X                              sprintf (file, "%s/%s.%s%s", save[i].archive, save[i].archive, LONG_PATH_PART, save[i].part);
  745. ***************
  746. *** 834,840 ****
  747. X                          }
  748. X                      }
  749. X                  } else {
  750. !                     if (save_num == 1) {
  751. X                          sprintf (file, "%s", save[i].file);
  752. X                      } else {
  753. X                          sprintf (file, "%s.%02d", save[i].file, i+1);
  754. --- 862,868 ----
  755. X                          }
  756. X                      }
  757. X                  } else {
  758. !                     if (num_save == 1) {
  759. X                          sprintf (file, "%s", save[i].file);
  760. X                      } else {
  761. X                          sprintf (file, "%s.%02d", save[i].file, i+1);
  762. ***************
  763. *** 851,857 ****
  764. X  int post_process_files (proc_type_ch)
  765. X      char proc_type_ch;
  766. X  {
  767. !     if (save_num) {
  768. X          wait_message (txt_post_processing);
  769. X  
  770. X          switch (proc_type_ch) {
  771. --- 879,885 ----
  772. X  int post_process_files (proc_type_ch)
  773. X      char proc_type_ch;
  774. X  {
  775. !     if (num_save) {
  776. X          wait_message (txt_post_processing);
  777. X  
  778. X          switch (proc_type_ch) {
  779. ***************
  780. *** 864,870 ****
  781. X                  break;
  782. X  
  783. X              case 'U':
  784. !                 if (post_proc_type == POST_PROC_UUD_EXT_ZOO) {
  785. X                      post_process_uud (POST_PROC_UUD_EXT_ZOO);
  786. X                  } else {
  787. X                      post_process_uud (POST_PROC_UUD_LST_ZOO);
  788. --- 892,898 ----
  789. X                  break;
  790. X  
  791. X              case 'U':
  792. !                 if (default_post_proc_type == POST_PROC_UUD_EXT_ZOO) {
  793. X                      post_process_uud (POST_PROC_UUD_EXT_ZOO);
  794. X                  } else {
  795. X                      post_process_uud (POST_PROC_UUD_LST_ZOO);
  796. ***************
  797. *** 913,919 ****
  798. X      }
  799. X  
  800. X  
  801. !     for (i=0 ; i < save_num ; i++) {
  802. X          my_strncpy (buf, save_filename (i), sizeof (buf));
  803. X  
  804. X          if ((fp_in = fopen (buf, "r")) != NULL) {
  805. --- 941,947 ----
  806. X      }
  807. X  
  808. X  
  809. !     for (i=0 ; i < num_save ; i++) {
  810. X          my_strncpy (buf, save_filename (i), sizeof (buf));
  811. X  
  812. X          if ((fp_in = fopen (buf, "r")) != NULL) {
  813. ***************
  814. *** 1086,1092 ****
  815. X  
  816. X      sprintf (file_out, "%s/tin.%05d", file_out_dir, process_id);
  817. X  
  818. !     for (j=0 ; j < save_num ; j++) {
  819. X          my_strncpy (file_in, save_filename (j), sizeof (file_in));
  820. X  
  821. X          printf (txt_extracting_shar, file_in);
  822. --- 1114,1120 ----
  823. X  
  824. X      sprintf (file_out, "%s/tin.%05d", file_out_dir, process_id);
  825. X  
  826. !     for (j=0 ; j < num_save ; j++) {
  827. X          my_strncpy (file_in, save_filename (j), sizeof (file_in));
  828. X  
  829. X          printf (txt_extracting_shar, file_in);
  830. ***************
  831. *** 1173,1179 ****
  832. X      if (prompt_yn (LINES, txt_delete_processed_files, 'y')) {
  833. X          wait_message (txt_deleting);
  834. X  
  835. !         for (i=0 ; i < save_num ; i++) {
  836. X              unlink (save_filename (i));
  837. X          }
  838. X      }
  839. --- 1201,1207 ----
  840. X      if (prompt_yn (LINES, txt_delete_processed_files, 'y')) {
  841. X          wait_message (txt_deleting);
  842. X  
  843. !         for (i=0 ; i < num_save ; i++) {
  844. X              unlink (save_filename (i));
  845. X          }
  846. X      }
  847. diff -rcs ../1.14/screen.c ./screen.c
  848. *** ../1.14/screen.c    Tue Aug 11 21:23:21 1992
  849. --- ./screen.c    Mon Jul 20 12:51:09 1992
  850. ***************
  851. *** 56,62 ****
  852. X          fflush (stderr);
  853. X      } else {
  854. X          MoveCursor (LINES, 0);
  855. !         sleep (2);
  856. X      }
  857. X  }
  858. X  
  859. --- 56,62 ----
  860. X          fflush (stderr);
  861. X      } else {
  862. X          MoveCursor (LINES, 0);
  863. !         sleep (3);
  864. X      }
  865. X  }
  866. X  
  867. ***************
  868. *** 65,76 ****
  869. X      char *template;
  870. X      char *str;
  871. X  {
  872. X      char str2[512];
  873. X  
  874. X      clear_message ();      /* Clear any old messages hanging around */
  875. !     
  876. X      sprintf (str2, template, str);
  877. X      perror (str2);
  878. X      errno = 0;
  879. X  
  880. X      if (cmd_line) {
  881. --- 65,84 ----
  882. X      char *template;
  883. X      char *str;
  884. X  {
  885. +     extern char *sys_errlist[];
  886. X      char str2[512];
  887. +     int err = 0;
  888. +     
  889. +     err = errno;
  890. X  
  891. X      clear_message ();      /* Clear any old messages hanging around */
  892. X      sprintf (str2, template, str);
  893. + /*    
  894. X      perror (str2);
  895. + */
  896. +     err = errno;
  897. +     fprintf (stderr, "%s: %s", str2, sys_errlist[err]);
  898. X      errno = 0;
  899. X  
  900. X      if (cmd_line) {
  901. ***************
  902. *** 78,84 ****
  903. X          fflush (stderr);
  904. X      } else {
  905. X          MoveCursor (LINES, 0);
  906. !         sleep (2);
  907. X      }
  908. X  }
  909. X  
  910. --- 86,92 ----
  911. X          fflush (stderr);
  912. X      } else {
  913. X          MoveCursor (LINES, 0);
  914. !         sleep (3);
  915. X      }
  916. X  }
  917. X  
  918. diff -rcs ../1.14/search.c ./search.c
  919. *** ../1.14/search.c    Tue Aug 11 21:23:22 1992
  920. --- ./search.c    Fri Jul 24 21:00:05 1992
  921. ***************
  922. *** 3,9 ****
  923. X   *  Module    : search.c
  924. X   *  Author    : I.Lea & R.Skrenta
  925. X   *  Created   : 01-04-91
  926. !  *  Updated   : 13-03-92
  927. X   *  Notes     :
  928. X   *  Copyright : (c) Copyright 1991-92 by Iain Lea & Rich Skrenta
  929. X   *              You may  freely  copy or  redistribute  this software,
  930. --- 3,9 ----
  931. X   *  Module    : search.c
  932. X   *  Author    : I.Lea & R.Skrenta
  933. X   *  Created   : 01-04-91
  934. !  *  Updated   : 24-07-92
  935. X   *  Notes     :
  936. X   *  Copyright : (c) Copyright 1991-92 by Iain Lea & Rich Skrenta
  937. X   *              You may  freely  copy or  redistribute  this software,
  938. ***************
  939. *** 40,47 ****
  940. X   *  group.c & page.c
  941. X   */
  942. X   
  943. ! int search_author (only_unread, current_art, forward)
  944. !     int only_unread;
  945. X      int current_art;
  946. X      int forward;
  947. X  {
  948. --- 40,47 ----
  949. X   *  group.c & page.c
  950. X   */
  951. X   
  952. ! int search_author (index, current_art, forward)
  953. !     int index;
  954. X      int current_art;
  955. X      int forward;
  956. X  {
  957. ***************
  958. *** 92,98 ****
  959. X                      num_of_responses (top_base - 1);
  960. X          }
  961. X  
  962. !         if (only_unread && arts[i].unread != ART_UNREAD) {
  963. X              continue;
  964. X          }
  965. X              
  966. --- 92,99 ----
  967. X                      num_of_responses (top_base - 1);
  968. X          }
  969. X  
  970. !         if (active[index].attribute.show_only_unread && 
  971. !             arts[i].unread != ART_UNREAD) {
  972. X              continue;
  973. X          }
  974. X              
  975. diff -rcs ../1.14/select.c ./select.c
  976. *** ../1.14/select.c    Tue Aug 11 21:23:23 1992
  977. --- ./select.c    Tue Jul 28 07:10:01 1992
  978. ***************
  979. *** 3,9 ****
  980. X   *  Module    : select.c
  981. X   *  Author    : I.Lea & R.Skrenta
  982. X   *  Created   : 01-04-91
  983. !  *  Updated   : 18-06-92
  984. X   *  Notes     :
  985. X   *  Copyright : (c) Copyright 1991-92 by Iain Lea & Rich Skrenta
  986. X   *              You may  freely  copy or  redistribute  this software,
  987. --- 3,9 ----
  988. X   *  Module    : select.c
  989. X   *  Author    : I.Lea & R.Skrenta
  990. X   *  Created   : 01-04-91
  991. !  *  Updated   : 27-07-92
  992. X   *  Notes     :
  993. X   *  Copyright : (c) Copyright 1991-92 by Iain Lea & Rich Skrenta
  994. X   *              You may  freely  copy or  redistribute  this software,
  995. ***************
  996. *** 57,68 ****
  997. X      set_alarm_signal ();        /* set alarm signal for resync_active_file () */
  998. X      
  999. X      while (TRUE) {
  1000. ! #ifndef NO_RESYNC_ACTIVE_FILE
  1001. X          resync_active_file ();    /* reread active file if alarm set */
  1002. X  #endif
  1003. X          ch = ReadCh ();
  1004. ! #ifndef NO_RESYNC_ACTIVE_FILE
  1005. !         resync_active_file ();    /* reread active file if alarm set */
  1006. X  #endif
  1007. X  
  1008. X          if (ch > '0' && ch <= '9') {
  1009. --- 57,69 ----
  1010. X      set_alarm_signal ();        /* set alarm signal for resync_active_file () */
  1011. X      
  1012. X      while (TRUE) {
  1013. ! #ifndef NO_REREAD_ACTIVE_FILE
  1014. X          resync_active_file ();    /* reread active file if alarm set */
  1015. X  #endif
  1016. X          ch = ReadCh ();
  1017. ! #ifndef NO_REREAD_ACTIVE_FILE
  1018. !         if (ch != 'q' && ch != 'Q')
  1019. !             resync_active_file ();
  1020. X  #endif
  1021. X  
  1022. X          if (ch > '0' && ch <= '9') {
  1023. ***************
  1024. *** 151,157 ****
  1025. X                          n = my_group[cur_groupnum];
  1026. X                          group_page (active[n].name);
  1027. X                      } while (index_point == -3);
  1028. ! #ifndef NO_RESYNC_ACTIVE_FILE                    
  1029. X                      if (! reread_active_file)
  1030. X  #endif                    
  1031. X                          group_selection_page ();
  1032. --- 152,158 ----
  1033. X                          n = my_group[cur_groupnum];
  1034. X                          group_page (active[n].name);
  1035. X                      } while (index_point == -3);
  1036. ! #ifndef NO_REREAD_ACTIVE_FILE                    
  1037. X                      if (! reread_active_file)
  1038. X  #endif                    
  1039. X                          group_selection_page ();
  1040. ***************
  1041. *** 217,228 ****
  1042. X                  sprintf (msg, txt_del_group_in_newsrc, buf);
  1043. X                  if (prompt_yn (LINES, msg, 'y')) {
  1044. X                      delete_group (active[my_group[cur_groupnum]].name);
  1045. !                     active[my_group[cur_groupnum]].flag = UNSUBSCRIBED;    
  1046. X  
  1047. X                      group_top--;
  1048. X                      for (i = cur_groupnum; i < group_top; i++) {
  1049. X                          my_group[i] = my_group[i+1];
  1050. -                         unread[i] = unread[i+1];
  1051. X                      }
  1052. X                      if (cur_groupnum >= group_top)
  1053. X                          cur_groupnum = group_top - 1;    
  1054. --- 218,232 ----
  1055. X                  sprintf (msg, txt_del_group_in_newsrc, buf);
  1056. X                  if (prompt_yn (LINES, msg, 'y')) {
  1057. X                      delete_group (active[my_group[cur_groupnum]].name);
  1058. !                     active[my_group[cur_groupnum]].my_group = UNSUBSCRIBED;    
  1059. X  
  1060. X                      group_top--;
  1061. X                      for (i = cur_groupnum; i < group_top; i++) {
  1062. + #if 0
  1063. +                         active[my_group[i]].unread = 
  1064. +                             active[my_group[i+1]].unread;
  1065. + #endif                            
  1066. X                          my_group[i] = my_group[i+1];
  1067. X                      }
  1068. X                      if (cur_groupnum >= group_top)
  1069. X                          cur_groupnum = group_top - 1;    
  1070. ***************
  1071. *** 374,380 ****
  1072. X  
  1073. X              case 'g':    /* prompt for a new group name */
  1074. X                  if ((n = choose_new_group ()) >= 0) {
  1075. !                     if (active[my_group[n]].flag != SUBSCRIBED) {
  1076. X                          subscribe (active[my_group[n]].name, ':',
  1077. X                              my_group[n], FALSE);
  1078. X                      }
  1079. --- 378,384 ----
  1080. X  
  1081. X              case 'g':    /* prompt for a new group name */
  1082. X                  if ((n = choose_new_group ()) >= 0) {
  1083. !                     if (active[my_group[n]].my_group != SUBSCRIBED) {
  1084. X                          subscribe (active[my_group[n]].name, ':',
  1085. X                              my_group[n], FALSE);
  1086. X                      }
  1087. ***************
  1088. *** 411,417 ****
  1089. X                  break;
  1090. X  
  1091. X              case 'm':    /* reposition group within group list */
  1092. !                 if (active[my_group[cur_groupnum]].flag == SUBSCRIBED) {
  1093. X                      n = cur_groupnum;
  1094. X                      cur_groupnum = reposition_group (active[my_group[n]].name, n);
  1095. X                      if (cur_groupnum < first_group_on_screen ||
  1096. --- 415,421 ----
  1097. X                  break;
  1098. X  
  1099. X              case 'm':    /* reposition group within group list */
  1100. !                 if (active[my_group[cur_groupnum]].my_group == SUBSCRIBED) {
  1101. X                      n = cur_groupnum;
  1102. X                      cur_groupnum = reposition_group (active[my_group[n]].name, n);
  1103. X                      if (cur_groupnum < first_group_on_screen ||
  1104. ***************
  1105. *** 432,437 ****
  1106. --- 436,443 ----
  1107. X              case 'M':    /* options menu */
  1108. X                  set_alarm_clock_off ();
  1109. X                  change_rcfile ("", TRUE);
  1110. +                 free_attributes_array ();
  1111. +                 read_attributes_file ();
  1112. X                  group_selection_page ();
  1113. X                  set_alarm_clock_on ();
  1114. X                  break;
  1115. ***************
  1116. *** 441,456 ****
  1117. X                  break;
  1118. X  
  1119. X              case 'q':    /* quit */
  1120. !             case 'Q':    /* quit */
  1121. X                  write_rcfile ();
  1122. X                  tin_done (0);
  1123. X                  break;
  1124. X  
  1125. X              case 's':    /* subscribe to current group */
  1126. X                  if (group_top == 0) {
  1127. X                      break;
  1128. X                  }
  1129. !                 if (active[my_group[cur_groupnum]].flag != SUBSCRIBED) {
  1130. X                      MoveCursor (INDEX_TOP + (cur_groupnum-first_group_on_screen), 2);
  1131. X                      if (draw_arrow_mark) {
  1132. X                          fputc (' ', stdout);
  1133. --- 447,474 ----
  1134. X                  break;
  1135. X  
  1136. X              case 'q':    /* quit */
  1137. !             case 'Q':
  1138. X                  write_rcfile ();
  1139. X                  tin_done (0);
  1140. X                  break;
  1141. X  
  1142. +             case 'r':
  1143. +                  /* 
  1144. +                   * If in show_only_unread_groups mode toggle
  1145. +                   * all subscribed to groups and only  groups
  1146. +                   * that contain unread articles
  1147. +                   */
  1148. +                  show_only_unread_groups = !show_only_unread_groups;
  1149. +                 toggle_my_groups (show_only_unread_groups);
  1150. +                 set_groupname_len (FALSE);
  1151. +                 group_selection_page ();
  1152. +                 break;
  1153. X              case 's':    /* subscribe to current group */
  1154. X                  if (group_top == 0) {
  1155. X                      break;
  1156. X                  }
  1157. !                 if (active[my_group[cur_groupnum]].my_group != SUBSCRIBED) {
  1158. X                      MoveCursor (INDEX_TOP + (cur_groupnum-first_group_on_screen), 2);
  1159. X                      if (draw_arrow_mark) {
  1160. X                          fputc (' ', stdout);
  1161. ***************
  1162. *** 478,484 ****
  1163. X  #else        
  1164. X                          if (wildmat (active[my_group[i]].name, buf)) {
  1165. X  #endif        
  1166. !                                 if (active[my_group[i]].flag != SUBSCRIBED) {
  1167. X  #ifndef SLOW_SCREEN_UPDATE
  1168. X                                  sprintf (msg, txt_subscribing_to, active[my_group[i]].name);
  1169. X                                  wait_message (msg);
  1170. --- 496,502 ----
  1171. X  #else        
  1172. X                          if (wildmat (active[my_group[i]].name, buf)) {
  1173. X  #endif        
  1174. !                                 if (active[my_group[i]].my_group != SUBSCRIBED) {
  1175. X  #ifndef SLOW_SCREEN_UPDATE
  1176. X                                  sprintf (msg, txt_subscribing_to, active[my_group[i]].name);
  1177. X                                  wait_message (msg);
  1178. ***************
  1179. *** 505,511 ****
  1180. X                  if (group_top == 0) {
  1181. X                      break;
  1182. X                  }
  1183. !                 if (active[my_group[cur_groupnum]].flag == SUBSCRIBED) {
  1184. X                      MoveCursor(INDEX_TOP + (cur_groupnum-first_group_on_screen), 2);
  1185. X                      if (draw_arrow_mark) {
  1186. X                          fputc ('u', stdout);
  1187. --- 523,529 ----
  1188. X                  if (group_top == 0) {
  1189. X                      break;
  1190. X                  }
  1191. !                 if (active[my_group[cur_groupnum]].my_group == SUBSCRIBED) {
  1192. X                      MoveCursor(INDEX_TOP + (cur_groupnum-first_group_on_screen), 2);
  1193. X                      if (draw_arrow_mark) {
  1194. X                          fputc ('u', stdout);
  1195. ***************
  1196. *** 533,539 ****
  1197. X  #else        
  1198. X                          if (wildmat (active[my_group[i]].name, buf)) {
  1199. X  #endif        
  1200. !                                 if (active[my_group[i]].flag == SUBSCRIBED) {
  1201. X  #ifndef SLOW_SCREEN_UPDATE
  1202. X                                  sprintf (msg, txt_unsubscribing_from, active[my_group[i]].name);
  1203. X                                  wait_message (msg);
  1204. --- 551,557 ----
  1205. X  #else        
  1206. X                          if (wildmat (active[my_group[i]].name, buf)) {
  1207. X  #endif        
  1208. !                                 if (active[my_group[i]].my_group == SUBSCRIBED) {
  1209. X  #ifndef SLOW_SCREEN_UPDATE
  1210. X                                  sprintf (msg, txt_unsubscribing_from, active[my_group[i]].name);
  1211. X                                  wait_message (msg);
  1212. ***************
  1213. *** 588,603 ****
  1214. X              case 'y':    /* pull in rest of groups from active */
  1215. X                  if (yank_active_file) {
  1216. X                      wait_message (txt_yanking_all_groups);
  1217. X                      n = group_top;
  1218. X                      for (i = 0; i < num_active; i++) {
  1219. !                         active[i].flag = UNSUBSCRIBED;
  1220. X                      }
  1221. X                      read_newsrc (FALSE);
  1222. X                      for (i = 0; i < num_active; i++) {
  1223. !                         if (active[i].flag & UNSUBSCRIBED) {
  1224. !                             active[i].flag &= ~UNSUBSCRIBED;
  1225. X                              my_group[group_top] = i;
  1226. -                             unread[group_top] = -1;
  1227. X                              group_top++;
  1228. X                          }
  1229. X                      }
  1230. --- 606,622 ----
  1231. X              case 'y':    /* pull in rest of groups from active */
  1232. X                  if (yank_active_file) {
  1233. X                      wait_message (txt_yanking_all_groups);
  1234. +                     set_alarm_clock_off ();
  1235. X                      n = group_top;
  1236. X                      for (i = 0; i < num_active; i++) {
  1237. !                         active[i].my_group = UNSUBSCRIBED;
  1238. X                      }
  1239. X                      read_newsrc (FALSE);
  1240. X                      for (i = 0; i < num_active; i++) {
  1241. !                         if (active[i].my_group & UNSUBSCRIBED) {
  1242. !                             active[i].my_group &= ~UNSUBSCRIBED;
  1243. !                             active[i].unread = -1;
  1244. X                              my_group[group_top] = i;
  1245. X                              group_top++;
  1246. X                          }
  1247. X                      }
  1248. ***************
  1249. *** 618,623 ****
  1250. --- 637,643 ----
  1251. X                      set_groupname_len (yank_active_file);
  1252. X                      group_selection_page ();
  1253. X                      yank_active_file = TRUE;
  1254. +                     set_alarm_clock_on ();
  1255. X                  }
  1256. X                  break;
  1257. X  
  1258. ***************
  1259. *** 636,643 ****
  1260. X                  group_top = 0;
  1261. X                  read_newsrc (TRUE);            
  1262. X                  cur_groupnum = n;
  1263. !                 if (unread[cur_groupnum]) {
  1264. !                     sprintf (msg, "%5d", unread[cur_groupnum]);
  1265. X                  } else {    
  1266. X                      strcpy (msg, "     ");
  1267. X                  }
  1268. --- 656,663 ----
  1269. X                  group_top = 0;
  1270. X                  read_newsrc (TRUE);            
  1271. X                  cur_groupnum = n;
  1272. !                 if (active[my_group[cur_groupnum]].unread) {
  1273. !                     sprintf (msg, "%5d", active[my_group[cur_groupnum]].unread);
  1274. X                  } else {    
  1275. X                      strcpy (msg, "     ");
  1276. X                  }
  1277. ***************
  1278. *** 687,695 ****
  1279. X  #endif
  1280. X  
  1281. X      if (xspooldir_supported) {
  1282. !         sprintf (buf, "%s (%s  %d)", txt_group_selection, spooldir_alias, group_top);
  1283. X      } else {
  1284. !         sprintf (buf, "%s (%d)", txt_group_selection, group_top);
  1285. X      }    
  1286. X      show_title (buf);
  1287. X  
  1288. --- 707,718 ----
  1289. X  #endif
  1290. X  
  1291. X      if (xspooldir_supported) {
  1292. !         sprintf (buf, "%s (%s  %d%s)", 
  1293. !             txt_group_selection, spooldir_alias, group_top,
  1294. !             (show_only_unread_groups ? " R" : ""));
  1295. X      } else {
  1296. !         sprintf (buf, "%s (%d%s)", txt_group_selection, group_top,
  1297. !             (show_only_unread_groups ? " R" : ""));
  1298. X      }    
  1299. X      show_title (buf);
  1300. X  
  1301. ***************
  1302. *** 739,746 ****
  1303. X  
  1304. X      blank_len = (COLS - (groupname_len + SELECT_MISC_COLS)) + 2;
  1305. X      
  1306. !     for (j=0, i = first_group_on_screen; i < last_group_on_screen; i++,j++) {
  1307. !         switch (unread[i]) {
  1308. X              case -2:
  1309. X                  strcpy (new, "    ?");
  1310. X                  break;
  1311. --- 762,769 ----
  1312. X  
  1313. X      blank_len = (COLS - (groupname_len + SELECT_MISC_COLS)) + 2;
  1314. X      
  1315. !     for (j=0, i=first_group_on_screen; i < last_group_on_screen; i++, j++) {
  1316. !         switch (active[my_group[i]].unread) {
  1317. X              case -2:
  1318. X                  strcpy (new, "    ?");
  1319. X                  break;
  1320. ***************
  1321. *** 754,764 ****
  1322. X                  break;
  1323. X  
  1324. X              default:
  1325. !                 sprintf (new, "%5.d", unread[i]);
  1326. X          }
  1327. X          
  1328. X          n = my_group[i];
  1329. !         if (active[n].flag & SUBSCRIBED) {    /* subscribed? */
  1330. X              subs = ' ';
  1331. X          } else {
  1332. X              subs = 'u';    /* u next to unsubscribed groups */
  1333. --- 777,787 ----
  1334. X                  break;
  1335. X  
  1336. X              default:
  1337. !                 sprintf (new, "%5.d", active[my_group[i]].unread);
  1338. X          }
  1339. X          
  1340. X          n = my_group[i];
  1341. !         if (active[n].my_group & SUBSCRIBED) {    /* subscribed? */
  1342. X              subs = ' ';
  1343. X          } else {
  1344. X              subs = 'u';    /* u next to unsubscribed groups */
  1345. ***************
  1346. *** 892,898 ****
  1347. X  }
  1348. X  
  1349. X  /*
  1350. !  *  Add a group to the selection list (my_group[])
  1351. X   *  Return the index of my_group[] if group is added or was already
  1352. X   *  there.  Return -1 if named group is not in active[].
  1353. X   */
  1354. --- 915,921 ----
  1355. X  }
  1356. X  
  1357. X  /*
  1358. !  *  Add a group to the users selection list (my_group[])
  1359. X   *  Return the index of my_group[] if group is added or was already
  1360. X   *  there.  Return -1 if named group is not in active[].
  1361. X   */
  1362. ***************
  1363. *** 914,929 ****
  1364. X                  }
  1365. X              }
  1366. X  
  1367. !             active[i].flag &= ~UNSUBSCRIBED;   /* mark that we got it */
  1368. !             my_group[group_top] = i;
  1369. X  
  1370. !             if (get_unread)
  1371. !                 unread[group_top] = get_line_unread (s, i);
  1372. !             else
  1373. !                 unread[group_top] = -2;
  1374. X  
  1375. X              group_top++;
  1376. !             return group_top - 1;
  1377. X          }
  1378. X      }
  1379. X  
  1380. --- 937,954 ----
  1381. X                  }
  1382. X              }
  1383. X  
  1384. !             active[i].my_group &= ~UNSUBSCRIBED;   /* mark that we got it */
  1385. X  
  1386. !             my_group[group_top] = i;
  1387. X  
  1388. +             if (get_unread) {
  1389. +                 active[my_group[group_top]].unread = get_line_unread (s, i);
  1390. +             } else {
  1391. +                 active[my_group[group_top]].unread = -1;
  1392. +             }
  1393. X              group_top++;
  1394. !             return (group_top - 1);
  1395. X          }
  1396. X      }
  1397. X  
  1398. ***************
  1399. *** 984,991 ****
  1400. X      int goto_next_unread_group;
  1401. X  {    
  1402. X      sprintf (msg, txt_mark_group_read, active[my_group[cur_groupnum]].name);
  1403. !     if (!confirm_action || prompt_yn (LINES, msg, 'y')) {
  1404. !         unread[cur_groupnum] = 0;
  1405. X          mark_group_read (active[my_group[cur_groupnum]].name,
  1406. X              my_group[cur_groupnum]);
  1407. X          
  1408. --- 1009,1016 ----
  1409. X      int goto_next_unread_group;
  1410. X  {    
  1411. X      sprintf (msg, txt_mark_group_read, active[my_group[cur_groupnum]].name);
  1412. !     if (! confirm_action || prompt_yn (LINES, msg, 'y')) {
  1413. !         active[my_group[cur_groupnum]].unread = 0;
  1414. X          mark_group_read (active[my_group[cur_groupnum]].name,
  1415. X              my_group[cur_groupnum]);
  1416. X          
  1417. ***************
  1418. *** 1014,1034 ****
  1419. X  void next_unread_group (enter_group)
  1420. X      int enter_group;
  1421. X  {
  1422. !     int i;
  1423. !     
  1424. !     for (i = cur_groupnum; i < group_top; i++) {
  1425. !         if (unread[i] != 0) {
  1426. X              break;
  1427. X          }
  1428. X      }
  1429. !     if (i >= group_top) {
  1430. X          info_message (txt_no_groups_to_read);
  1431. X          return;
  1432. X      }
  1433. X  
  1434. !     erase_group_arrow ();
  1435. X      cur_groupnum = i;
  1436. !     if (cur_groupnum >= last_group_on_screen) {
  1437. X          group_selection_page ();
  1438. X      } else {
  1439. X          draw_group_arrow ();
  1440. --- 1039,1074 ----
  1441. X  void next_unread_group (enter_group)
  1442. X      int enter_group;
  1443. X  {
  1444. !     int i, all_groups_read = TRUE;
  1445. !     for (i = cur_groupnum ; i < group_top ; i++) {
  1446. !         if (active[my_group[i]].unread != 0) {
  1447. !             all_groups_read = FALSE;
  1448. !             erase_group_arrow ();
  1449. X              break;
  1450. X          }
  1451. X      }
  1452. !     if (all_groups_read) {
  1453. !         for (i = 0 ; i < cur_groupnum ; i++) {
  1454. !             if (active[my_group[i]].unread != 0) {
  1455. !                 all_groups_read = FALSE;
  1456. !                 break;
  1457. !             }
  1458. !         }
  1459. !     }
  1460. !     
  1461. !     if (all_groups_read) {
  1462. X          info_message (txt_no_groups_to_read);
  1463. X          return;
  1464. X      }
  1465. X  
  1466. !     if (i != cur_groupnum) {
  1467. !         erase_group_arrow ();
  1468. !     }
  1469. X      cur_groupnum = i;
  1470. !     if (cur_groupnum < first_group_on_screen ||
  1471. !         cur_groupnum >= last_group_on_screen) {
  1472. X          group_selection_page ();
  1473. X      } else {
  1474. X          draw_group_arrow ();
  1475. ***************
  1476. *** 1081,1093 ****
  1477. X              groupname_len = 0;
  1478. X          }    
  1479. X      }
  1480. X  
  1481. ! /*    
  1482. !     if (groupname_len > (COLS - SELECT_MISC_COLS)) {
  1483. !         groupname_len = COLS - SELECT_MISC_COLS;
  1484. !         if (groupname_len < 0) {
  1485. !             groupname_len = 0;
  1486. !         }    
  1487. X      }
  1488. ! */        
  1489. X  }
  1490. --- 1121,1158 ----
  1491. X              groupname_len = 0;
  1492. X          }    
  1493. X      }
  1494. + }
  1495. X  
  1496. ! void toggle_my_groups (only_unread_groups)
  1497. !     int only_unread_groups;
  1498. ! {
  1499. ! #ifndef INDEX_DAEMON
  1500. !     char buf[8192];
  1501. !     char *ptr;
  1502. !     FILE *fp;
  1503. !     int i;
  1504. !     if ((fp = fopen (newsrc, "r")) != (FILE *) 0) {
  1505. !         group_top = 0;
  1506. !         while (fgets (buf, sizeof (buf), fp) != (char *) 0) {
  1507. !             if (ptr = strchr (buf, ':')) {
  1508. !                 *ptr = '\0';
  1509. !                 if (i = find_group_index (buf)) {
  1510. !                     if (only_unread_groups) {                    
  1511. !                         if (active[i].unread) {
  1512. !                             my_group[group_top] = i;
  1513. !                             group_top++;
  1514. !                         }
  1515. !                     } else {
  1516. !                         my_group[group_top] = i;
  1517. !                         group_top++;
  1518. !                     }    
  1519. !                 }
  1520. !             }
  1521. !         }        
  1522. !         fclose (fp);
  1523. X      }
  1524. ! #endif    /* INDEX_DAEMON */
  1525. X  }
  1526. Files ../1.14/server.patch and ./server.patch are identical
  1527. diff -rcs ../1.14/signal.c ./signal.c
  1528. *** ../1.14/signal.c    Tue Aug 11 21:23:23 1992
  1529. --- ./signal.c    Mon Jul 20 12:51:09 1992
  1530. ***************
  1531. *** 3,9 ****
  1532. X   *  Module    : signal.c
  1533. X   *  Author    : I.Lea
  1534. X   *  Created   : 01-04-91
  1535. !  *  Updated   : 22-06-92
  1536. X   *  Notes     : signal handlers for different modes and window resizing
  1537. X   *  Copyright : (c) Copyright 1991-92 by Iain Lea
  1538. X   *              You may  freely  copy or  redistribute  this software,
  1539. --- 3,9 ----
  1540. X   *  Module    : signal.c
  1541. X   *  Author    : I.Lea
  1542. X   *  Created   : 01-04-91
  1543. !  *  Updated   : 20-07-92
  1544. X   *  Notes     : signal handlers for different modes and window resizing
  1545. X   *  Copyright : (c) Copyright 1991-92 by Iain Lea
  1546. X   *              You may  freely  copy or  redistribute  this software,
  1547. ***************
  1548. *** 105,117 ****
  1549. X  
  1550. X  void set_alarm_signal ()
  1551. X  {
  1552. ! #ifndef NO_RESYNC_ACTIVE_FILE
  1553. X      /*
  1554. X       * Only reread active file if news is not static (ie. CD-ROM)
  1555. X       */
  1556. X      if (strcmp (spooldir_alias, "news") == 0) {
  1557. X          signal (SIGALRM, signal_handler);
  1558. !         alarm (RESYNC_ACTIVE_SECS);
  1559. X      }    
  1560. X      reread_active_file = FALSE;
  1561. X  #endif
  1562. --- 105,118 ----
  1563. X  
  1564. X  void set_alarm_signal ()
  1565. X  {
  1566. ! #ifndef NO_REREAD_ACTIVE_FILE
  1567. X      /*
  1568. X       * Only reread active file if news is not static (ie. CD-ROM)
  1569. X       */
  1570. +     (void) alarm (0);
  1571. X      if (strcmp (spooldir_alias, "news") == 0) {
  1572. X          signal (SIGALRM, signal_handler);
  1573. !         alarm (reread_active_file_secs);
  1574. X      }    
  1575. X      reread_active_file = FALSE;
  1576. X  #endif
  1577. ***************
  1578. *** 120,126 ****
  1579. X  
  1580. X  void set_alarm_clock_on ()
  1581. X  {
  1582. ! #ifndef NO_RESYNC_ACTIVE_FILE
  1583. X      alarm (time_remaining);
  1584. X  #endif
  1585. X  }
  1586. --- 121,127 ----
  1587. X  
  1588. X  void set_alarm_clock_on ()
  1589. X  {
  1590. ! #ifndef NO_REREAD_ACTIVE_FILE
  1591. X      alarm (time_remaining);
  1592. X  #endif
  1593. X  }
  1594. ***************
  1595. *** 128,134 ****
  1596. X  
  1597. X  void set_alarm_clock_off ()
  1598. X  {
  1599. ! #ifndef NO_RESYNC_ACTIVE_FILE
  1600. X      time_remaining = alarm (0);
  1601. X  #endif
  1602. X  }
  1603. --- 129,135 ----
  1604. X  
  1605. X  void set_alarm_clock_off ()
  1606. X  {
  1607. ! #ifndef NO_REREAD_ACTIVE_FILE
  1608. X      time_remaining = alarm (0);
  1609. X  #endif
  1610. X  }
  1611. ***************
  1612. *** 176,182 ****
  1613. X          case SIGSEGV:
  1614. X              sigtext = "SIGSEGV ";
  1615. X              break;
  1616. ! #ifndef NO_RESYNC_ACTIVE_FILE
  1617. X          case SIGALRM:
  1618. X              set_alarm_signal ();
  1619. X              reread_active_file = TRUE;
  1620. --- 177,183 ----
  1621. X          case SIGSEGV:
  1622. X              sigtext = "SIGSEGV ";
  1623. X              break;
  1624. ! #ifndef NO_REREAD_ACTIVE_FILE
  1625. X          case SIGALRM:
  1626. X              set_alarm_signal ();
  1627. X              reread_active_file = TRUE;
  1628. ***************
  1629. *** 200,208 ****
  1630. X          unlink (index_file);
  1631. X      }
  1632. X  
  1633. ! #ifdef INDEX_DAEMON
  1634. !     unlink (LOCK_FILE);
  1635. ! #endif
  1636. X      exit (1);
  1637. X  }
  1638. X  
  1639. --- 201,208 ----
  1640. X          unlink (index_file);
  1641. X      }
  1642. X  
  1643. !     unlink (lock_file);
  1644. X      exit (1);
  1645. X  }
  1646. X  
  1647. ***************
  1648. *** 296,301 ****
  1649. --- 296,315 ----
  1650. X  }
  1651. X  
  1652. X  
  1653. + void set_signals_help ()
  1654. + {
  1655. + #ifdef SIGTSTP
  1656. +     if (do_sigtstp) {
  1657. +         sigdisp (SIGTSTP, help_suspend);
  1658. +     }
  1659. + #endif
  1660. + #ifdef SIGWINCH
  1661. +     signal (SIGWINCH, help_resize);
  1662. + #endif
  1663. + }
  1664. X  void set_signals_page ()
  1665. X  {
  1666. X  #ifdef SIGTSTP
  1667. ***************
  1668. *** 455,460 ****
  1669. --- 469,494 ----
  1670. X  
  1671. X  
  1672. X  /* ARGSUSED0 */
  1673. + void help_suspend (sig)
  1674. +     int sig;
  1675. + {
  1676. +     set_keypad_off ();
  1677. +     Raw (FALSE);
  1678. +     wait_message (txt_suspended_message);
  1679. +     kill (0, SIGSTOP);
  1680. +     sigdisp (SIGTSTP, help_suspend);
  1681. +     if (! update) {
  1682. +         Raw (TRUE);
  1683. +         help_resize (0);        
  1684. +     }
  1685. +     set_keypad_on ();
  1686. + }
  1687. + /* ARGSUSED0 */
  1688. X  void page_suspend (sig)
  1689. X      int sig;
  1690. X  {
  1691. ***************
  1692. *** 558,564 ****
  1693. X      ClearScreen ();
  1694. X  #endif
  1695. X      mail_setup ();
  1696. !     if (resized) {
  1697. X          group_selection_page ();
  1698. X      }    
  1699. X  }
  1700. --- 592,598 ----
  1701. X      ClearScreen ();
  1702. X  #endif
  1703. X      mail_setup ();
  1704. !     if (resized || sig == 0) {
  1705. X          group_selection_page ();
  1706. X      }    
  1707. X  }
  1708. ***************
  1709. *** 579,585 ****
  1710. X      ClearScreen ();
  1711. X  #endif
  1712. X      mail_setup ();
  1713. !     if (resized) {
  1714. X          show_spooldir_page ();
  1715. X      }
  1716. X  }
  1717. --- 613,619 ----
  1718. X      ClearScreen ();
  1719. X  #endif
  1720. X      mail_setup ();
  1721. !     if (resized || sig == 0) {
  1722. X          show_spooldir_page ();
  1723. X      }
  1724. X  }
  1725. ***************
  1726. *** 600,606 ****
  1727. X      ClearScreen ();
  1728. X  #endif
  1729. X      mail_setup ();
  1730. !     if (resized) {
  1731. X          show_group_page (glob_group);
  1732. X      }    
  1733. X  }
  1734. --- 634,640 ----
  1735. X      ClearScreen ();
  1736. X  #endif
  1737. X      mail_setup ();
  1738. !     if (resized || sig == 0) {
  1739. X          show_group_page (glob_group);
  1740. X      }    
  1741. X  }
  1742. ***************
  1743. *** 607,612 ****
  1744. --- 641,662 ----
  1745. X  
  1746. X  
  1747. X  /* ARGSUSED0 */
  1748. + void help_resize (sig)
  1749. +     int sig;
  1750. + {
  1751. +     int resized = TRUE;
  1752. +     
  1753. + #ifdef SIGWINCH
  1754. +     resized = set_win_size (&LINES, &COLS);
  1755. +     signal (SIGWINCH, help_resize);
  1756. + #endif
  1757. +     
  1758. +     if (resized || sig == 0) {
  1759. +         display_info_page ();
  1760. +     }
  1761. + }
  1762. + /* ARGSUSED0 */
  1763. X  void page_resize (sig)
  1764. X      int sig;
  1765. X  {
  1766. ***************
  1767. *** 621,627 ****
  1768. X      ClearScreen ();
  1769. X  #endif
  1770. X      mail_setup ();
  1771. !     if (resized) {
  1772. X          redraw_page (glob_respnum, glob_page_group);
  1773. X      }    
  1774. X  }
  1775. --- 671,677 ----
  1776. X      ClearScreen ();
  1777. X  #endif
  1778. X      mail_setup ();
  1779. !     if (resized || sig == 0) {
  1780. X          redraw_page (glob_respnum, glob_page_group);
  1781. X      }    
  1782. X  }
  1783. ***************
  1784. *** 642,648 ****
  1785. X      ClearScreen ();
  1786. X  #endif
  1787. X      mail_setup ();
  1788. !     if (resized) {
  1789. X          show_thread_page ();
  1790. X      }    
  1791. X  }
  1792. --- 692,698 ----
  1793. X      ClearScreen ();
  1794. X  #endif
  1795. X      mail_setup ();
  1796. !     if (resized || sig == 0) {
  1797. X          show_thread_page ();
  1798. X      }    
  1799. X  }
  1800. diff -rcs ../1.14/spooldir.c ./spooldir.c
  1801. *** ../1.14/spooldir.c    Tue Aug 11 21:23:24 1992
  1802. --- ./spooldir.c    Mon Jul 20 12:51:09 1992
  1803. ***************
  1804. *** 3,9 ****
  1805. X   *  Module    : spooldir.c
  1806. X   *  Author    : I.Lea & Tom Theel
  1807. X   *  Created   : 08-05-92
  1808. !  *  Updated   : 20-06-92
  1809. X   *  Notes     : Changes spooldir to read news from (ie. news, nntp, cdrom)
  1810. X   *  Copyright : (c) Copyright 1991-92 by Iain Lea & Tom Theel
  1811. X   *              You may  freely  copy or  redistribute  this software,
  1812. --- 3,9 ----
  1813. X   *  Module    : spooldir.c
  1814. X   *  Author    : I.Lea & Tom Theel
  1815. X   *  Created   : 08-05-92
  1816. !  *  Updated   : 30-06-92
  1817. X   *  Notes     : Changes spooldir to read news from (ie. news, nntp, cdrom)
  1818. X   *  Copyright : (c) Copyright 1991-92 by Iain Lea & Tom Theel
  1819. X   *              You may  freely  copy or  redistribute  this software,
  1820. ***************
  1821. *** 14,34 ****
  1822. X  
  1823. X  #include    "tin.h"
  1824. X  
  1825. - #define NUM_SPOOLDIRS    50
  1826. X  int cur_spoolnum = 0;
  1827. X  int first_spooldir_on_screen;
  1828. X  int last_spooldir_on_screen;
  1829. - int num_spooldirs = 0;
  1830. X  int spool_top = 0;
  1831. X  
  1832. X  /*
  1833. -  * needs to be dynamic but no time 
  1834. -  */
  1835. - struct spooldir_t spooldirs[NUM_SPOOLDIRS];
  1836. - /*
  1837. X   * Change spooldir via menu of available choices
  1838. X   */
  1839. X  
  1840. --- 14,25 ----
  1841. ***************
  1842. *** 40,54 ****
  1843. X      int n;
  1844. X      int scroll_lines;
  1845. X      
  1846. !     spool_top = num_spooldirs;
  1847. X  
  1848. X      if (! xspooldir_supported) {
  1849. !         info_message ("Multiple spooldirs are not supported");
  1850. X          return FALSE;
  1851. X      }
  1852. X  
  1853. X      if (! spool_top) {
  1854. !         info_message ("No spooldirs");
  1855. X          return FALSE;
  1856. X      }
  1857. X  
  1858. --- 31,45 ----
  1859. X      int n;
  1860. X      int scroll_lines;
  1861. X      
  1862. !     spool_top = num_spooldir;
  1863. X  
  1864. X      if (! xspooldir_supported) {
  1865. !         info_message (txt_spooldirs_not_supported);
  1866. X          return FALSE;
  1867. X      }
  1868. X  
  1869. X      if (! spool_top) {
  1870. !         info_message (txt_no_spooldirs);
  1871. X          return FALSE;
  1872. X      }
  1873. X  
  1874. ***************
  1875. *** 300,306 ****
  1876. X  
  1877. X              case 'q':    /* quit */
  1878. X                  return TRUE;
  1879. -                 break;
  1880. X                  
  1881. X              case 'Q':    /* quit */
  1882. X                  write_rcfile ();
  1883. --- 291,296 ----
  1884. ***************
  1885. *** 337,343 ****
  1886. X      CleartoEOLN ();
  1887. X  #endif
  1888. X  
  1889. !     sprintf (buf, txt_spooldir_selection, num_spooldirs);
  1890. X      show_title (buf);
  1891. X  
  1892. X  #ifndef USE_CLEARSCREEN
  1893. --- 327,333 ----
  1894. X      CleartoEOLN ();
  1895. X  #endif
  1896. X  
  1897. !     sprintf (buf, txt_spooldir_selection, num_spooldir);
  1898. X      show_title (buf);
  1899. X  
  1900. X  #ifndef USE_CLEARSCREEN
  1901. ***************
  1902. *** 462,476 ****
  1903. X      char *ptr;
  1904. X      int i, state;
  1905. X  
  1906. ! #if 0
  1907. !     spooldirs = (struct spooldir_t *) 0;
  1908. ! #else
  1909. !     for (i = 0 ; i < NUM_SPOOLDIRS ; i++) {
  1910. X          spooldirs[i].state = 0;
  1911. X          spooldirs[i].name = (char *) 0;
  1912. X      }
  1913. - #endif
  1914. X  
  1915. X      xspooldir_supported = FALSE;
  1916. X      
  1917. X      if (! read_news_via_nntp) {
  1918. --- 452,464 ----
  1919. X      char *ptr;
  1920. X      int i, state;
  1921. X  
  1922. !     for (i = 0 ; i < max_spooldir ; i++) {
  1923. X          spooldirs[i].state = 0;
  1924. X          spooldirs[i].name = (char *) 0;
  1925. +         spooldirs[i].comment = (char *) 0;
  1926. X      }
  1927. X  
  1928. +     num_spooldir = 0;
  1929. X      xspooldir_supported = FALSE;
  1930. X      
  1931. X      if (! read_news_via_nntp) {
  1932. ***************
  1933. *** 483,490 ****
  1934. X          xspooldir_supported = FALSE;
  1935. X          if (debug > 0) {
  1936. X              fprintf (stderr, "%s", line);
  1937. !             fprintf (stderr, "Server does not appear to support the spooldir command\n");
  1938. !             fprintf (stderr, "Reconfigure the news reader or the server & try again.\n");
  1939. X          }
  1940. X          return (xspooldir_supported);
  1941. X      }
  1942. --- 471,478 ----
  1943. X          xspooldir_supported = FALSE;
  1944. X          if (debug > 0) {
  1945. X              fprintf (stderr, "%s", line);
  1946. !             fprintf (stderr, txt_spooldir_server_error_1);
  1947. !             fprintf (stderr, txt_spooldir_server_error_2);
  1948. X          }
  1949. X          return (xspooldir_supported);
  1950. X      }
  1951. ***************
  1952. *** 514,540 ****
  1953. X                  *ptr = '\0';                
  1954. X              }
  1955. X  
  1956. ! /*                
  1957. !             spooldirs = (struct spooldir_t *) my_realloc ((char *) spooldirs,
  1958. !                 (unsigned) sizeof (struct spooldir_t) * num_spooldirs + 1);
  1959. !             if (spooldirs != (struct spooldir_t *) 0) {
  1960. !                 spooldirs[num_spooldirs].state = state;
  1961. !                 spooldirs[num_spooldirs].name = str_dup (name);
  1962. !                 spooldirs[num_spooldirs].comment = str_dup (comment);
  1963. !                 num_spooldirs++;
  1964. !             }    
  1965. ! */                
  1966. X  
  1967. !             spooldirs[num_spooldirs].state = state;
  1968. !             spooldirs[num_spooldirs].name = str_dup (name);
  1969. !             spooldirs[num_spooldirs].comment = str_dup (comment);
  1970. X  
  1971. X              if (debug == 1) {
  1972. !                 printf ("ALIAS=[%s] COMMENT=[%s]\n", 
  1973. !                     spooldirs[num_spooldirs].name,
  1974. !                     spooldirs[num_spooldirs].comment);
  1975. X              }
  1976. !             num_spooldirs++;
  1977. X          }
  1978. X      } while (!((line[0] == '.') && ((line[1] == '\0') || (line[1] == '\r'))));
  1979. X  
  1980. --- 502,522 ----
  1981. X                  *ptr = '\0';                
  1982. X              }
  1983. X  
  1984. !             if (num_spooldir > max_spooldir) {
  1985. !                 expand_spooldirs ();
  1986. !             }
  1987. X  
  1988. !             spooldirs[num_spooldir].state = state;
  1989. !             spooldirs[num_spooldir].name = str_dup (name);
  1990. !             spooldirs[num_spooldir].comment = str_dup (comment);
  1991. X  
  1992. X              if (debug == 1) {
  1993. !                 printf ("STATE=[%d] ALIAS=[%s] COMMENT=[%s]\n", 
  1994. !                     spooldirs[num_spooldir].state,
  1995. !                     spooldirs[num_spooldir].name,
  1996. !                     spooldirs[num_spooldir].comment);
  1997. X              }
  1998. !             num_spooldir++;
  1999. X          }
  2000. X      } while (!((line[0] == '.') && ((line[1] == '\0') || (line[1] == '\r'))));
  2001. X  
  2002. ***************
  2003. *** 549,556 ****
  2004. --- 531,540 ----
  2005. X  void get_spooldir ()
  2006. X  {
  2007. X  #ifdef NNTP_ABLE
  2008. + #if 0
  2009. X      char line[NNTP_STRLEN];
  2010. X      char alias[32];
  2011. + #endif    
  2012. X      char default_alias[32];
  2013. X      int i, set_alias = FALSE;
  2014. X      
  2015. ***************
  2016. *** 585,591 ****
  2017. X              }
  2018. X          }
  2019. X          if (! set_alias) {
  2020. !             error_message ("%s: Cannot change to valid spooldir. Exiting...", progname);
  2021. X              exit (1);            
  2022. X          }
  2023. X      }
  2024. --- 569,575 ----
  2025. X              }
  2026. X          }
  2027. X          if (! set_alias) {
  2028. !             error_message (txt_cannot_change_spooldir, progname);
  2029. X              exit (1);            
  2030. X          }
  2031. X      }
  2032. ***************
  2033. *** 625,633 ****
  2034. X      int respcode;
  2035. X  
  2036. X      if (cmd_line) {
  2037. !         sprintf (line, "Changing spooldir to %s...\n", name);
  2038. X      } else {
  2039. !         sprintf (line, "Changing spooldir to %s...", name);
  2040. X      }    
  2041. X      wait_message (line);
  2042. X  
  2043. --- 609,617 ----
  2044. X      int respcode;
  2045. X  
  2046. X      if (cmd_line) {
  2047. !         sprintf (line, "%s %s...\n", txt_changing_sppoldir_to, name);
  2048. X      } else {
  2049. !         sprintf (line, "%s %s...", txt_changing_sppoldir_to, name);
  2050. X      }    
  2051. X      wait_message (line);
  2052. X  
  2053. ***************
  2054. *** 642,654 ****
  2055. X              my_strncpy (spooldir_alias, name, sizeof (spooldir_alias));
  2056. X              set_tindir ();
  2057. X              return TRUE;
  2058. -             break;
  2059. X          case OK_SPNOCHANGE:    /* Still using same spooldir */
  2060. X              break;
  2061. X          default:
  2062. X              error_message ("%s", nntp_respcode (respcode));
  2063. X              clear_message ();
  2064. !             return FALSE;
  2065. !             break;        
  2066. X      }
  2067. X  }
  2068. --- 626,637 ----
  2069. X              my_strncpy (spooldir_alias, name, sizeof (spooldir_alias));
  2070. X              set_tindir ();
  2071. X              return TRUE;
  2072. X          case OK_SPNOCHANGE:    /* Still using same spooldir */
  2073. X              break;
  2074. X          default:
  2075. X              error_message ("%s", nntp_respcode (respcode));
  2076. X              clear_message ();
  2077. !             break;
  2078. X      }
  2079. +     return FALSE;
  2080. X  }
  2081. diff -rcs ../1.14/thread.c ./thread.c
  2082. *** ../1.14/thread.c    Tue Aug 11 21:23:25 1992
  2083. --- ./thread.c    Fri Aug  7 19:10:52 1992
  2084. ***************
  2085. *** 3,9 ****
  2086. X   *  Module    : thread.c
  2087. X   *  Author    : I.Lea
  2088. X   *  Created   : 01-04-91
  2089. !  *  Updated   : 20-06-92
  2090. X   *  Notes     :
  2091. X   *  Copyright : (c) Copyright 1991-92 by Iain Lea
  2092. X   *              You may  freely  copy or  redistribute  this software,
  2093. --- 3,9 ----
  2094. X   *  Module    : thread.c
  2095. X   *  Author    : I.Lea
  2096. X   *  Created   : 01-04-91
  2097. !  *  Updated   : 24-07-92
  2098. X   *  Notes     :
  2099. X   *  Copyright : (c) Copyright 1991-92 by Iain Lea
  2100. X   *              You may  freely  copy or  redistribute  this software,
  2101. ***************
  2102. *** 35,50 ****
  2103. X      int i;
  2104. X  {
  2105. X  #ifndef INDEX_DAEMON
  2106. !     int j;
  2107. X      char mark;
  2108. X      char new_resps[8];
  2109. X      char from[LEN];
  2110. X      int len_from;
  2111. X      int len_subj = 0;
  2112. X      int off_subj = 0;
  2113. X      int off_both = 0;
  2114. -     char *spaces = "XXX";
  2115. X  
  2116. X      if (! draw_arrow_mark) {
  2117. X          off_subj = 2;
  2118. --- 35,50 ----
  2119. X      int i;
  2120. X  {
  2121. X  #ifndef INDEX_DAEMON
  2122. !     extern int cur_groupnum;
  2123. X      char mark;
  2124. X      char new_resps[8];
  2125. X      char from[LEN];
  2126. !     char *spaces = "XXX";
  2127. !     int j;
  2128. X      int len_from;
  2129. X      int len_subj = 0;
  2130. X      int off_subj = 0;
  2131. X      int off_both = 0;
  2132. X  
  2133. X      if (! draw_arrow_mark) {
  2134. X          off_subj = 2;
  2135. ***************
  2136. *** 72,80 ****
  2137. X          sprintf (new_resps, "%3d", arts[i].tagged);
  2138. X      } else {
  2139. X          if (arts[i].unread == ART_UNREAD) {
  2140. !             mark = (arts[i].hot ? HOT_ART_MARK : UNREAD_ART_MARK);
  2141. X          } else if (arts[i].unread == ART_WILL_RETURN) {
  2142. !             mark =  RETURN_ART_MARK;
  2143. X          } else {
  2144. X              mark = READ_ART_MARK;
  2145. X          }
  2146. --- 72,80 ----
  2147. X          sprintf (new_resps, "%3d", arts[i].tagged);
  2148. X      } else {
  2149. X          if (arts[i].unread == ART_UNREAD) {
  2150. !             mark = (arts[i].hot ? hot_art_mark : unread_art_mark);
  2151. X          } else if (arts[i].unread == ART_WILL_RETURN) {
  2152. !             mark =  return_art_mark;
  2153. X          } else {
  2154. X              mark = READ_ART_MARK;
  2155. X          }
  2156. ***************
  2157. *** 82,89 ****
  2158. X      }
  2159. X      
  2160. X      from[0] = '\0';
  2161. !     if (threaded_on_subject || show_author != SHOW_FROM_NONE)
  2162. X          get_author (TRUE, i, from);
  2163. X  
  2164. X      sprintf (screen[j].col, "  %4d%3s  %-*.*s%s%-*.*s",
  2165. X           l, new_resps, len_subj, len_subj, arts[i].subject, 
  2166. --- 82,90 ----
  2167. X      }
  2168. X      
  2169. X      from[0] = '\0';
  2170. !     if (threaded_on_subject || show_author != SHOW_FROM_NONE) {
  2171. X          get_author (TRUE, i, from);
  2172. +     }    
  2173. X  
  2174. X      sprintf (screen[j].col, "  %4d%3s  %-*.*s%s%-*.*s",
  2175. X           l, new_resps, len_subj, len_subj, arts[i].subject, 
  2176. ***************
  2177. *** 121,127 ****
  2178. X      /* it is somewhat less efficient to go back and redo that art mark
  2179. X       * if hot, but it is quite readable as to what is happening 
  2180. X       */
  2181. !     if (screen[j].col[k] == HOT_ART_MARK) {
  2182. X          MoveCursor (INDEX2LNUM(i), k);
  2183. X          ToggleInverse ();
  2184. X          fputc (screen[j].col[k], stdout);
  2185. --- 122,128 ----
  2186. X      /* it is somewhat less efficient to go back and redo that art mark
  2187. X       * if hot, but it is quite readable as to what is happening 
  2188. X       */
  2189. !     if (screen[j].col[k] == hot_art_mark) {
  2190. X          MoveCursor (INDEX2LNUM(i), k);
  2191. X          ToggleInverse ();
  2192. X          fputc (screen[j].col[k], stdout);
  2193. ***************
  2194. *** 168,174 ****
  2195. X  
  2196. X      thread_index_point = top_thread;
  2197. X      if (space_mode) {
  2198. !         if (i = new_responses (thread_basenote)) {
  2199. X              for (n=0, i = base[thread_basenote]; i >= 0 ;
  2200. X                   i = arts[i].thread, n++) {
  2201. X                  if (arts[i].unread == ART_UNREAD) {
  2202. --- 169,176 ----
  2203. X  
  2204. X      thread_index_point = top_thread;
  2205. X      if (space_mode) {
  2206. !         i = new_responses (thread_basenote);
  2207. !         if (i) {
  2208. X              for (n=0, i = base[thread_basenote]; i >= 0 ;
  2209. X                   i = arts[i].thread, n++) {
  2210. X                  if (arts[i].unread == ART_UNREAD) {
  2211. ***************
  2212. *** 446,452 ****
  2213. X                      arts[i].unread = ART_READ;
  2214. X                  }
  2215. X                  goto thread_done;
  2216. -                 break;
  2217. X  
  2218. X              case 'd':    /* toggle display of subject & subj/author */
  2219. X                  if (! threaded_on_subject) {
  2220. --- 448,453 ----
  2221. ***************
  2222. *** 500,508 ****
  2223. --- 501,519 ----
  2224. X              case 'Z':    /* mark thread as unread */
  2225. X                  n = choose_response (thread_basenote, thread_index_point);
  2226. X                  if (ch == 'z') {
  2227. +                     if (arts[n].unread == ART_READ) {
  2228. +                         if (arts[n].hot) {
  2229. +                             num_of_hot_arts++;
  2230. +                         }
  2231. +                     }
  2232. X                      arts[n].unread = ART_UNREAD;
  2233. X                  } else {
  2234. X                      for (i = (int) base[thread_basenote] ; i != -1; i = arts[i].thread) {
  2235. +                         if (arts[n].unread == ART_READ) {
  2236. +                             if (arts[n].hot) {
  2237. +                                 num_of_hot_arts++;
  2238. +                             }
  2239. +                         }
  2240. X                          arts[i].unread = ART_UNREAD;
  2241. X                      }
  2242. X                  }
  2243. ***************
  2244. *** 571,583 ****
  2245. X  #ifndef INDEX_DAEMON
  2246. X  
  2247. X      extern int index_point;
  2248. -     char new_resps[8];
  2249. -     char from[LEN];
  2250. X      int i, j;
  2251. -     int len_from;
  2252. -     int len_subj = 0;
  2253. -     int off_subj = 0;
  2254. -     int off_both = 0;
  2255. X      static int index = 0;
  2256. X  
  2257. X      set_signals_thread ();
  2258. --- 582,588 ----
  2259. ***************
  2260. *** 629,651 ****
  2261. X      index = choose_response (thread_basenote, first_thread_on_screen);
  2262. X      assert(first_thread_on_screen != 0 || index == thread_respnum);
  2263. X  
  2264. -     if (! draw_arrow_mark) {
  2265. -         off_subj = 2;
  2266. -         off_both = 5;
  2267. -     }    
  2268. -     if (threaded_on_subject) {
  2269. -         len_from = max_subj+max_from+off_both;
  2270. -     } else {
  2271. -         if (show_author != SHOW_FROM_NONE) {
  2272. -             len_from = max_from;
  2273. -             len_subj = max_subj+off_subj;
  2274. -         } else {
  2275. -             len_from = 0;
  2276. -             len_subj = max_from+max_subj+off_subj;
  2277. -         }
  2278. -     }    
  2279. X      for (j=0, i = first_thread_on_screen; j < NOTESLINES && i < last_thread_on_screen; i++, j++) {
  2280. X          bld_tline (i, index);
  2281. X          draw_tline (i, TRUE);
  2282. --- 634,639 ----
  2283. ***************
  2284. *** 759,765 ****
  2285. X      int sum = 0;
  2286. X  
  2287. X      for (i = (int) base[thread]; i >= 0; i = arts[i].thread) {
  2288. !         if (arts[i].unread) {
  2289. X              sum++;
  2290. X          }
  2291. X      }
  2292. --- 747,753 ----
  2293. X      int sum = 0;
  2294. X  
  2295. X      for (i = (int) base[thread]; i >= 0; i = arts[i].thread) {
  2296. !         if (arts[i].unread != ART_READ) {
  2297. X              sum++;
  2298. X          }
  2299. X      }
  2300. ***************
  2301. *** 885,895 ****
  2302. X  
  2303. X  
  2304. X      if (sbuf->hot_unread)
  2305. !         sbuf->art_mark = HOT_ART_MARK;
  2306. X      else if (sbuf->unread)
  2307. !         sbuf->art_mark = UNREAD_ART_MARK;
  2308. X      else if (sbuf->seen)
  2309. !         sbuf->art_mark = RETURN_ART_MARK;
  2310. X      else
  2311. X          sbuf->art_mark = READ_ART_MARK;
  2312. X  
  2313. --- 873,883 ----
  2314. X  
  2315. X  
  2316. X      if (sbuf->hot_unread)
  2317. !         sbuf->art_mark = hot_art_mark;
  2318. X      else if (sbuf->unread)
  2319. !         sbuf->art_mark = unread_art_mark;
  2320. X      else if (sbuf->seen)
  2321. !         sbuf->art_mark = return_art_mark;
  2322. X      else
  2323. X          sbuf->art_mark = READ_ART_MARK;
  2324. X  
  2325. ***************
  2326. *** 907,920 ****
  2327. X  {
  2328. X      int i;
  2329. X  
  2330. !     if (arts[n].thread >= 0)
  2331. X          return arts[n].thread;
  2332. X      i = which_thread (n) + 1;
  2333. X  
  2334. !     if (i >= top_base)
  2335. X          return -1;
  2336. X      return (int) base[i];
  2337. X  }
  2338. X  
  2339. --- 895,910 ----
  2340. X  {
  2341. X      int i;
  2342. X  
  2343. !     if (arts[n].thread >= 0) {
  2344. X          return arts[n].thread;
  2345. !     }
  2346. !     
  2347. X      i = which_thread (n) + 1;
  2348. X  
  2349. !     if (i >= top_base) {
  2350. X          return -1;
  2351. !     }
  2352. !     
  2353. X      return (int) base[i];
  2354. X  }
  2355. X  
  2356. ***************
  2357. *** 979,990 ****
  2358. X  }
  2359. X  
  2360. X  /*
  2361. !  *  Find the next unread response in this group 
  2362. X   */
  2363. X  
  2364. X  int next_unread (n)
  2365. X      int n;
  2366. X  {
  2367. X      while (n >= 0) {
  2368. X          if (arts[n].unread == ART_UNREAD) {
  2369. X              return n;
  2370. --- 969,983 ----
  2371. X  }
  2372. X  
  2373. X  /*
  2374. !  *  Find the next unread response in this group. If no response is found
  2375. !  *  from current point to the end restart from beginning of articles.
  2376. X   */
  2377. X  
  2378. X  int next_unread (n)
  2379. X      int n;
  2380. X  {
  2381. +     int cur_base_art = n;
  2382. +     
  2383. X      while (n >= 0) {
  2384. X          if (arts[n].unread == ART_UNREAD) {
  2385. X              return n;
  2386. ***************
  2387. *** 992,1000 ****
  2388. X          n = next_response (n);
  2389. X      }
  2390. X  
  2391. X      return -1;
  2392. X  }
  2393. X  
  2394. X  /*
  2395. X   *  Find the previous unread response in this thread
  2396. --- 985,1000 ----
  2397. X          n = next_response (n);
  2398. X      }
  2399. X  
  2400. +     n = base[0];
  2401. +     while (n != cur_base_art) {
  2402. +         if (arts[n].unread == ART_UNREAD) {
  2403. +             return n;
  2404. +         }
  2405. +         n = next_response (n);
  2406. +     }
  2407. +     
  2408. X      return -1;
  2409. X  }
  2410. X  
  2411. X  /*
  2412. X   *  Find the previous unread response in this thread
  2413. Only in .: tin-1.15.diff
  2414. diff -rcs ../1.14/tin.1 ./tin.1
  2415. *** ../1.14/tin.1    Tue Aug 11 21:22:58 1992
  2416. --- ./tin.1    Tue Aug 11 20:52:10 1992
  2417. ***************
  2418. *** 6,12 ****
  2419. X  .if t .ll 6.85i
  2420. X  .if n .ll 7.2i
  2421. X  .if \n(mo=1 .ds mo January
  2422. ! .if \n(mo=2 .ds mo Febraury
  2423. X  .if \n(mo=3 .ds mo March
  2424. X  .if \n(mo=4 .ds mo April
  2425. X  .if \n(mo=5 .ds mo May
  2426. --- 6,12 ----
  2427. X  .if t .ll 6.85i
  2428. X  .if n .ll 7.2i
  2429. X  .if \n(mo=1 .ds mo January
  2430. ! .if \n(mo=2 .ds mo February
  2431. X  .if \n(mo=3 .ds mo March
  2432. X  .if \n(mo=4 .ds mo April
  2433. X  .if \n(mo=5 .ds mo May
  2434. ***************
  2435. *** 17,23 ****
  2436. X  .if \n(mo=10 .ds mo October
  2437. X  .if \n(mo=11 .ds mo November
  2438. X  .if \n(mo=12 .ds mo December
  2439. ! .TH TIN 1 "Version 1.1 PL4" "" "LOCAL"
  2440. SHAR_EOF
  2441. true || echo 'restore of tin-1.15.patch failed'
  2442. fi
  2443. echo 'End of tin-1.15 part 6'
  2444. echo 'File tin-1.15.patch is continued in part 7'
  2445. echo 7 > _shar_seq_.tmp
  2446. exit 0
  2447.  
  2448. --
  2449. NAME   Iain Lea 
  2450. EMAIL  iain%anl433.uucp@Germany.EU.net
  2451. SNAIL  Siemens AG, ANL A433SZ, Gruendlacher Str. 248, 8510 Fuerth, Germany.
  2452. PHONE  +49-911-3089-407 (work) +49-911-331963 (home) +49-911-3089-290 (FAX)  
  2453. exit 0 # Just in case...
  2454.