home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume23 / tin / part08 < prev    next >
Text File  |  1991-09-25  |  51KB  |  2,151 lines

  1. Newsgroups: comp.sources.misc
  2. From: iain@estevax.uucp (Iain J. Lea)
  3. Subject:  v23i022:  tin - threaded full screen newsreader v1.0 PL2, Part08/09
  4. Message-ID: <1991Sep25.205334.2266@sparky.imd.sterling.com>
  5. X-Md4-Signature: 14f65fd5d9549ea44667c8d0f317c5b7
  6. Date: Wed, 25 Sep 1991 20:53:34 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: iain@estevax.uucp (Iain J. Lea)
  10. Posting-number: Volume 23, Issue 22
  11. Archive-name: tin/part08
  12. Environment: BSD, SCO, ISC, SUNOS, SYSVR3, SYSVR4, ULTRIX, XENIX
  13.  
  14. #!/bin/sh
  15. # this is tin.shar.08 (part 8 of tin1.02)
  16. # do not concatenate these parts, unpack them in order with /bin/sh
  17. # file select.c continued
  18. #
  19. if touch 2>&1 | fgrep '[-amc]' > /dev/null
  20.  then TOUCH=touch
  21.  else TOUCH=true
  22. fi
  23. if test ! -r shar3_seq_.tmp; then
  24.     echo "Please unpack part 1 first!"
  25.     exit 1
  26. fi
  27. (read Scheck
  28.  if test "$Scheck" != 8; then
  29.     echo "Please unpack part $Scheck next!"
  30.     exit 1
  31.  else
  32.     exit 0
  33.  fi
  34. ) < shar3_seq_.tmp || exit 1
  35. echo "x - Continuing file select.c"
  36. sed 's/^X//' << 'SHAR_EOF' >> select.c &&
  37. X#endif        
  38. X                                if (active[my_group[i]].flag == SUBS) {
  39. X#ifndef SLOW_SCREEN_UPDATE
  40. X                                sprintf (msg, txt_unsubscribing_from, active[my_group[i]].name);
  41. X                                wait_message (msg);
  42. X#endif                                
  43. X                                subscribe (active[my_group[i]].name,
  44. X                                    '!', my_group[i], FALSE);
  45. X                            }
  46. X                            subscribe_num++;
  47. X                        }
  48. X                    }
  49. X                    if (subscribe_num) {
  50. X                        group_selection_page ();    
  51. X                        sprintf (buf, txt_unsubscribed_num_groups, subscribe_num);
  52. X                        info_message (buf);
  53. X                    } else {
  54. X                        info_message (txt_no_match);
  55. X                    }
  56. X                } else {
  57. X                    clear_message ();
  58. X                }
  59. X                break;
  60. X
  61. X            case 'v':    /* show tin version */
  62. X                info_message (cvers);
  63. X                break;
  64. X
  65. X            case 'w':    /* post a basenote */
  66. X                if (post_base (active[my_group[cur_groupnum]].name)) {
  67. X                    group_selection_page ();
  68. X                }
  69. X                break;
  70. X
  71. X            case 'W':    /* display messages posted by user */
  72. X                if (user_posted_messages ()) {
  73. X                    group_selection_page ();
  74. X                }
  75. X                break;
  76. X
  77. X            case 'y':    /* pull in rest of groups from active */
  78. X                if (reread_active_file) {
  79. X                    n = local_top;
  80. X                    for (i = 0; i < num_active; i++) {
  81. X                        active[i].flag = NOTGOT;
  82. X                    }
  83. X                    read_newsrc (FALSE);
  84. X                    for (i = 0; i < num_active; i++) {
  85. X                        if (active[i].flag & NOTGOT) {
  86. X                            active[i].flag &= ~NOTGOT;
  87. X                            my_group[local_top] = i;
  88. X                            unread[local_top] = -1;
  89. X                            local_top++;
  90. X                        }
  91. X                    }
  92. X                    if (n < local_top) {
  93. X                        sprintf(buf, txt_added_groups, local_top - n,
  94. X                            local_top - n == 1 ? "" : txt_plural);
  95. X                        group_selection_page();
  96. X                        info_message(buf);
  97. X                    } else {
  98. X                        info_message(txt_no_groups_to_yank_in);
  99. X                    }
  100. X                    reread_active_file = FALSE;
  101. X                } else {
  102. X                    read_newsrc (TRUE);
  103. X                    cur_groupnum = local_top - 1;
  104. X                    group_selection_page();
  105. X                    reread_active_file = TRUE;
  106. X                }
  107. X                break;
  108. X
  109. X            case 'Y':    /* reread .newsrc, no unsub groups */
  110. X                cur_groupnum = 0;
  111. X                local_top = 0;
  112. X                for (i = 0; i < num_active; i++)
  113. X                    active[i].flag = NOTGOT;
  114. X                read_newsrc (TRUE);
  115. X                group_selection_page ();
  116. X                break;
  117. X
  118. X            case 'z':    /* mark group unread */
  119. X                n = cur_groupnum;
  120. X                update_newsrc (active[my_group[n]].name, my_group[n], TRUE);
  121. X                cur_groupnum = 0;
  122. X                local_top = 0;
  123. X                read_newsrc (TRUE);            
  124. X                cur_groupnum = n;
  125. X                group_selection_page ();
  126. X                break;
  127. X
  128. X            case 'Z':    /* undelete groups deleted by ctrl-K */
  129. X                if (undel_group ()) {
  130. X                    group_selection_page ();
  131. X                    info_message (txt_group_undeleted);
  132. X                }
  133. X                break;
  134. X
  135. X            default:
  136. X                info_message(txt_bad_command);
  137. X        }
  138. X    }
  139. X}
  140. X
  141. X
  142. Xvoid group_selection_page ()
  143. X{
  144. X    char buf[LEN];
  145. X    char new[10];
  146. X    char subs;
  147. X    int col, i, j, n;
  148. X    
  149. X#ifdef SIGTSTP
  150. X    if (do_sigtstp) {
  151. X#ifdef POSIX_JOB_CONTROL
  152. X        sigemptyset (&select_act.sa_mask);
  153. X        select_act.sa_flags = SA_RESTART | SA_RESETHAND;
  154. X        select_act.sa_handler = select_suspend;
  155. X        sigaction (SIGTSTP, &select_act, 0L);
  156. X#else
  157. X        signal (SIGTSTP, select_suspend);
  158. X#endif
  159. X    }
  160. X#endif
  161. X
  162. X#ifdef SIGWINCH
  163. X    signal (SIGWINCH, select_resize);
  164. X#endif
  165. X
  166. X#ifdef USE_CLEARSCREEN
  167. X    ClearScreen ();
  168. X#else
  169. X    MoveCursor (0, 0);        /* top left corner */
  170. X    CleartoEOLN ();
  171. X#endif
  172. X
  173. X    sprintf (buf, "%s (%d)", txt_group_selection, local_top);
  174. X    center_line (0, TRUE, buf);
  175. X
  176. X    if (col = (COLS - (int) strlen (txt_type_h_for_help))+1) {
  177. X        MoveCursor (0, 0);            /* in upper middle */
  178. X        if (kill_articles) {        /* display KILL on screen */
  179. X            printf ("KILL ON");
  180. X        }
  181. X
  182. X        MoveCursor (0, col);        /* in upper middle */
  183. X        if (mail_check ()) {        /* you have mail message */
  184. X            printf (txt_you_have_mail);
  185. X        } else {
  186. X            printf (txt_type_h_for_help);
  187. X        }
  188. X    }
  189. X
  190. X#ifndef USE_CLEARSCREEN
  191. X    MoveCursor (1, 0);
  192. X    CleartoEOLN ();
  193. X#endif
  194. X
  195. X    MoveCursor (INDEX_TOP, 0);
  196. X
  197. X    first_group_on_screen = (cur_groupnum / NOTESLINES) * NOTESLINES;
  198. X
  199. X    last_group_on_screen = first_group_on_screen + NOTESLINES;
  200. X    if (last_group_on_screen >= local_top)
  201. X        last_group_on_screen = local_top;
  202. X
  203. X    for (j=0, i = first_group_on_screen; i < last_group_on_screen; i++,j++) {
  204. X        switch (unread[i]) {
  205. X            case -2:
  206. X                sprintf (new, "?   ");
  207. X                break;
  208. X
  209. X            case -1:
  210. X                sprintf (new, "-   ");
  211. X                break;
  212. X
  213. X            case 0:
  214. X                sprintf (new, "    ");
  215. X                break;
  216. X
  217. X            default:
  218. X                sprintf (new, "%-4d", unread[i]);
  219. X        }
  220. X        
  221. X        n = my_group[i];
  222. X        if (active[n].flag & SUBS)    /* subscribed? */
  223. X            subs = ' ';
  224. X        else
  225. X            subs = 'u';    /* u next to unsubscribed groups */
  226. X
  227. X        if (draw_arrow_mark) {
  228. X            printf ("   %c %4d  %-40s %s\r\n",
  229. X                   subs, i+1, active[n].name, new);
  230. X        } else {
  231. X            sprintf (screen[j].col, "   %c %4d  %-40s %s%*s\r\n",
  232. X                subs, i+1, active[n].name, new, COLS-BLANK_SELECT_COLS, " ");
  233. X            printf ("%s", screen[j].col);
  234. X        }
  235. X    }
  236. X#ifndef USE_CLEARSCREEN
  237. X    CleartoEOS ();
  238. X#endif
  239. X
  240. X    if (local_top <= 0) {
  241. X        info_message (txt_no_groups);
  242. X        return;
  243. X    } else if (last_group_on_screen == local_top) {
  244. X        info_message (txt_end_of_groups);
  245. X    }
  246. X    
  247. X    draw_group_arrow ();
  248. X}
  249. X
  250. X
  251. Xint prompt_group_num (ch)
  252. X    char ch;
  253. X{
  254. X    int num;
  255. X
  256. X    clear_message ();
  257. X
  258. X    if ((num = parse_num (ch, txt_select_group)) == -1) {
  259. X        clear_message ();
  260. X        return FALSE;
  261. X    }
  262. X    num--;        /* index from 0 (internal) vs. 1 (user) */
  263. X
  264. X    if (num >= local_top)
  265. X        num = local_top - 1;
  266. X
  267. X    if (num >= first_group_on_screen
  268. X    &&  num < last_group_on_screen) {
  269. X        erase_group_arrow ();
  270. X        cur_groupnum = num;
  271. X        draw_group_arrow ();
  272. X    } else {
  273. X#ifndef USE_CLEARSCREEN
  274. X        erase_group_arrow ();
  275. X#endif        
  276. X        cur_groupnum = num;
  277. X        group_selection_page ();
  278. X    }
  279. X
  280. X    return TRUE;
  281. X}
  282. X
  283. X
  284. Xvoid erase_group_arrow ()
  285. X{
  286. X    erase_arrow (INDEX_TOP + (cur_groupnum-first_group_on_screen) );
  287. X}
  288. X
  289. X
  290. Xvoid draw_group_arrow()
  291. X{
  292. X    draw_arrow (INDEX_TOP + (cur_groupnum-first_group_on_screen) );
  293. X}
  294. X
  295. X
  296. Xint choose_new_group ()
  297. X{
  298. X    char buf[LEN+1];
  299. X    char *p;
  300. X    int ret;
  301. X
  302. X    if (! parse_string (txt_newsgroup, buf))
  303. X        return -1;
  304. X
  305. X    for (p = buf; *p && (*p == ' ' || *p == '\t'); p++)
  306. X        continue;
  307. X    if (*p == '\0')
  308. X        return -1;
  309. X
  310. X    clear_message ();
  311. X
  312. X    if ((ret = add_group (p, TRUE)) < 0) {
  313. X        sprintf (msg, txt_not_in_active_file, p);
  314. X        info_message (msg);
  315. X    }
  316. X
  317. X    return ret;
  318. X}
  319. X
  320. X
  321. X/*
  322. X *  Add a group to the selection list (my_group[])
  323. X *  Return the index of my_group[] if group is added or was already
  324. X *  there.  Return -1 if named group is not in active[].
  325. X */
  326. X
  327. Xint add_group (s, get_unread)
  328. X    char *s;
  329. X    int get_unread;            /* look in .newsrc for sequencer unread info? */
  330. X{
  331. X    long h;
  332. X    int i, j;
  333. X
  334. X    h = hash_groupname (s);
  335. X
  336. X    for (i = group_hash[h]; i >= 0; i = active[i].next) {
  337. X        if (strcmp (s, active[i].name) == 0) {
  338. X            for (j = 0; j < local_top; j++) {
  339. X                if (my_group[j] == i) {
  340. X                    return j;
  341. X                }
  342. X            }
  343. X
  344. X            active[i].flag &= ~NOTGOT;   /* mark that we got it */
  345. X            my_group[local_top] = i;
  346. X
  347. X            if (get_unread)
  348. X                unread[local_top] = get_line_unread (s, i);
  349. X            else
  350. X                unread[local_top] = -2;
  351. X
  352. X            local_top++;
  353. X            return local_top - 1;
  354. X        }
  355. X    }
  356. X
  357. X    return -1;
  358. X}
  359. X
  360. X/*
  361. X *  Find the next unread response in this group 
  362. X */
  363. X
  364. Xint next_unread(n)
  365. X    int n;
  366. X{
  367. X    while (n >= 0) {
  368. X        if (arts[n].unread == ART_UNREAD)
  369. X            return n;
  370. X        n = next_response (n);
  371. X    }
  372. X
  373. X    return -1;
  374. X}
  375. X
  376. X
  377. X/*
  378. X *  Find the previous unread response in this thread
  379. X */
  380. X
  381. Xint prev_unread(n)
  382. X    int n;
  383. X{
  384. X    while (n >= 0) {
  385. X        if (arts[n].unread == ART_UNREAD)
  386. X            return n;
  387. X        n = prev_response(n);
  388. X    }
  389. X
  390. X    return -1;
  391. X}
  392. X
  393. X
  394. Xint reposition_group (group, default_num)
  395. X    char *group;
  396. X    int default_num;
  397. X{
  398. X    char buf[LEN+1];
  399. X    char pos[LEN+1];
  400. X    int pos_num = 0;
  401. X
  402. X    sprintf (buf, txt_newsgroup_position, group);
  403. X    
  404. X    if (! parse_string (buf, pos)) 
  405. X        return default_num;
  406. X
  407. X    if (pos[0] == '\0')
  408. X        return default_num;
  409. X        
  410. X    if (pos[0] == '$') {
  411. X        pos_num = local_top;
  412. X    } else {
  413. X        pos_num = atoi (pos);
  414. X        if (pos_num > local_top) {
  415. X            pos_num = local_top;
  416. X        } else if (pos_num <= 0) {
  417. X            pos_num = 1;
  418. X        }
  419. X    }
  420. X
  421. X    wait_message (txt_moving);
  422. X    
  423. X    if (pos_group_in_newsrc (group, pos_num)) {
  424. X        read_newsrc (TRUE);
  425. X        return (pos_num-1);
  426. X    } else {
  427. X        return (default_num);
  428. X    }
  429. X}
  430. X
  431. X
  432. Xvoid catchup_group (goto_next_unread_group)
  433. X    int goto_next_unread_group;
  434. X{    
  435. X    int i;
  436. X    
  437. X    if (prompt_yn (LINES, txt_mark_group_read, 'y')) {
  438. X        unread[cur_groupnum] = 0;
  439. X        mark_group_read (active[my_group[cur_groupnum]].name,
  440. X                        my_group[cur_groupnum]);
  441. X        if (draw_arrow_mark) {    
  442. X            MoveCursor (INDEX_TOP+(cur_groupnum - first_group_on_screen), 51);
  443. X            printf ("     ");
  444. X            MoveCursor (LINES, 0);
  445. X            fflush (stdout);
  446. X        } else {
  447. X            i = cur_groupnum - first_group_on_screen;
  448. X            screen[i].col[51] = ' ';
  449. X            screen[i].col[52] = ' ';
  450. X            screen[i].col[53] = ' ';
  451. X            screen[i].col[54] = ' ';
  452. X            screen[i].col[55] = ' ';
  453. X        }
  454. X        erase_group_arrow ();
  455. X        if (cur_groupnum+1 < last_group_on_screen) {
  456. X            cur_groupnum++;
  457. X        }
  458. X        draw_group_arrow ();
  459. X
  460. X        if (goto_next_unread_group) {
  461. X            next_unread_group (FALSE);    
  462. X        }
  463. X    }
  464. X}
  465. X
  466. X
  467. Xvoid next_unread_group (enter_group)
  468. X    int enter_group;
  469. X{
  470. X    int i;
  471. X    
  472. X    for (i = cur_groupnum; i < local_top; i++) {
  473. X        if (unread[i] != 0) {
  474. X            break;
  475. X        }
  476. X    }
  477. X    if (i >= local_top) {
  478. X        info_message (txt_no_groups_to_read);
  479. X        return;
  480. X    }
  481. X
  482. X    erase_group_arrow ();
  483. X    cur_groupnum = i;
  484. X    if (cur_groupnum >= last_group_on_screen) {
  485. X        group_selection_page ();
  486. X    } else {
  487. X        draw_group_arrow ();
  488. X    }
  489. X    space_mode = pos_first_unread;
  490. X
  491. X    if (enter_group) {
  492. X        clear_message ();
  493. X        index_point = -1;
  494. X        do {
  495. X            group_page (active[my_group[cur_groupnum]].name);
  496. X        } while (index_point == -3);
  497. X        group_selection_page ();
  498. X    }
  499. X}
  500. X
  501. X#ifdef TEST
  502. X                    do {
  503. X                        n = my_group[cur_groupnum];
  504. X                        if (active[n].min <= active[n].max) {
  505. X                            group_page (active[n].name);
  506. X                        } else {
  507. X                            if (cur_groupnum > n) {    /* next group */ 
  508. X                                n = my_group[cur_groupnum];
  509. X                                while (active[n].min <= active[n].max) {
  510. X                                    cur_groupnum++;
  511. X                                    if (cur_groupnum >= local_top) {
  512. X                                        cur_groupnum = local_top - 1;
  513. X                                        index_point = -1;
  514. X                                        break;
  515. X                                    }
  516. X                                    n = my_group[cur_groupnum];
  517. X                                }
  518. X                            } else {    /* previous group */
  519. X                                n = my_group[cur_groupnum];
  520. X                                while (active[n].min <= active[n].max) {
  521. X                                    cur_groupnum--;
  522. X                                    if (cur_groupnum < 0) {
  523. X                                        cur_groupnum = 0;
  524. X                                        index_point = -1;
  525. X                                        break;
  526. X                                    }
  527. X                                    n = my_group[cur_groupnum];
  528. X                                }
  529. X                            }
  530. X                        }
  531. X                    } while (index_point == -3);
  532. X#endif
  533. SHAR_EOF
  534. echo "File select.c is complete" &&
  535. $TOUCH -am 0923175591 select.c &&
  536. chmod 0600 select.c ||
  537. echo "restore of select.c failed"
  538. set `wc -c select.c`;Wc_c=$1
  539. if test "$Wc_c" != "19579"; then
  540.     echo original size 19579, current size $Wc_c
  541. fi
  542. # ============= signal.c ==============
  543. echo "x - extracting signal.c (Text)"
  544. sed 's/^X//' << 'SHAR_EOF' > signal.c &&
  545. X/*
  546. X *  Project   : tin - a visual threaded usenet newsreader
  547. X *  Module    : signal.c
  548. X *  Author    : R.Skrenta / I.Lea
  549. X *  Created   : 01-04-91
  550. X *  Updated   : 10-09-91
  551. X *  Release   : 1.0
  552. X *  Notes     : signal handlers for different modes and window resizing
  553. X *  Copyright : (c) Copyright 1991 by Rich Skrenta & Iain Lea
  554. X *                You may  freely  copy or  redistribute  this software,
  555. X *              so  long as there is no profit made from its use, sale
  556. X *              trade or  reproduction.  You may not change this copy-
  557. X *              right notice, and it must be included in any copy made
  558. X */
  559. X
  560. X#include    "tin.h"
  561. X
  562. Xextern char *glob_art_group;
  563. Xextern char *glob_group;
  564. Xextern int glob_respnum;
  565. Xextern char *glob_page_group;
  566. X
  567. X#ifdef SIGTSTP
  568. Xint do_sigtstp = 0;
  569. X#endif
  570. X
  571. X#ifdef POSIX_JOB_CONTROL
  572. Xstruct sigaction art_act;
  573. Xstruct sigaction group_act;
  574. Xstruct sigaction main_act;
  575. Xstruct sigaction page_act;
  576. Xstruct sigaction rcfile_act;
  577. Xstruct sigaction select_act;
  578. Xstruct sigaction old_act;
  579. X#endif
  580. X
  581. X
  582. Xvoid set_signal_handlers ()
  583. X{
  584. X    signal (SIGINT, signal_handler);        /* ctrl-C */
  585. X    signal (SIGQUIT, signal_handler);        /* ctrl-\ */
  586. X    signal (SIGILL, signal_handler);
  587. X    signal (SIGBUS, signal_handler);
  588. X    signal (SIGSEGV, signal_handler);
  589. X     
  590. X    signal (SIGPIPE, SIG_IGN);
  591. X
  592. X#ifdef SIGTSTP
  593. X    {
  594. X        void (*ptr)();
  595. X        ptr = signal (SIGTSTP, SIG_DFL);
  596. X        signal (SIGTSTP, ptr);
  597. X        if (ptr != SIG_IGN) {
  598. X            /*
  599. X             *  SIGTSTP is ignored when starting from shells
  600. X             *  without job-control
  601. X             */
  602. X            do_sigtstp = 1; 
  603. X            signal (SIGTSTP, main_suspend);
  604. X        }
  605. X    }
  606. X#endif
  607. X
  608. X#ifdef SIGWINCH
  609. X    signal (SIGWINCH, main_resize);
  610. X#endif
  611. X}
  612. X
  613. X
  614. Xvoid signal_handler (sig)
  615. X    int sig;
  616. X{
  617. X    switch (sig) {
  618. X        case SIGINT:
  619. X            signal (SIGINT, signal_handler);
  620. X            break;
  621. X        default:
  622. X            Raw (FALSE);
  623. X            printf ("\n%s: signal handler caught signal %d\n", progname,sig);
  624. X            exit (1);
  625. X    }
  626. X}
  627. X
  628. X
  629. Xvoid set_win_size (num_lines, num_cols)
  630. X    int *num_lines;
  631. X    int *num_cols;
  632. X{
  633. X#ifdef TIOCGWINSZ
  634. X    char buf[64];
  635. X    int old_lines, old_cols;
  636. X    struct winsize win;
  637. X
  638. X    if (debug) {
  639. X        old_lines = *num_lines;
  640. X        old_cols = *num_cols;
  641. X    }
  642. X#endif
  643. X
  644. X    init_screen_array (FALSE);        /* deallocate screen array */
  645. X
  646. X#ifdef TIOCGWINSZ
  647. X    if (ioctl (0, TIOCGWINSZ, &win) == 0) {
  648. X        if (win.ws_row != 0) {
  649. X            *num_lines = win.ws_row - 1;
  650. X        }
  651. X        if (win.ws_col != 0) {
  652. X            *num_cols = win.ws_col;
  653. X        }
  654. X    }
  655. X
  656. X    if (debug) {
  657. X        sprintf (buf, "RESIZED lines %d to %d  cols %d to %d",
  658. X            old_lines, *num_lines, old_cols, *num_cols);
  659. X        info_message (buf);
  660. X    }
  661. X#endif
  662. X
  663. X    init_screen_array (TRUE);        /* allocate screen array for resize */
  664. X
  665. X    max_subj = (*num_cols / 2) - 2;
  666. X    max_from = (*num_cols - max_subj) - 17;
  667. X    RIGHT_POS = *num_cols - 18;
  668. X    MORE_POS  = *num_cols - 15;
  669. X    NOTESLINES = *num_lines - INDEX_TOP - 1;
  670. X    if (NOTESLINES <= 0) {
  671. X        NOTESLINES = 1;
  672. X    }
  673. X}
  674. X
  675. X
  676. X#ifdef SIGTSTP
  677. X
  678. X/* ARGSUSED0 */
  679. Xvoid art_suspend (sig)
  680. X    int sig;
  681. X{
  682. X    char buf[LEN];
  683. X    
  684. X    Raw (FALSE);
  685. X    putchar ('\n');
  686. X
  687. X#ifdef POSIX_JOB_CONTROL
  688. X    sigsetmask(0);
  689. X#else
  690. X    signal(SIGTSTP, SIG_DFL);
  691. X#ifdef BSD
  692. X    sigsetmask (sigblock(0) & ~(1 << (SIGTSTP -1)));
  693. X#endif
  694. X#endif
  695. X
  696. X    kill (0, SIGTSTP);
  697. X
  698. X#ifdef POSIX_JOB_CONTROL
  699. X    sigemptyset (&art_act.sa_mask);
  700. X    art_act.sa_flags = SA_RESTART | SA_RESETHAND;
  701. X    art_act.sa_handler = art_suspend;
  702. X    sigaction (SIGTSTP, &art_act, 0L);
  703. X#else
  704. X    signal (SIGTSTP, art_suspend);
  705. X#endif
  706. X
  707. X    if (! update) {
  708. X        mail_setup ();
  709. X    
  710. X        Raw (TRUE);
  711. X
  712. X        ClearScreen ();
  713. X        sprintf (buf, txt_group, glob_art_group);
  714. X        wait_message (buf);
  715. X    }
  716. X}
  717. X
  718. X
  719. X/* ARGSUSED0 */
  720. Xvoid main_suspend (sig)
  721. X    int sig;
  722. X{
  723. X    Raw (FALSE);
  724. X    putchar ('\n');
  725. X
  726. X#ifdef POSIX_JOB_CONTROL
  727. X    sigsetmask(0);
  728. X#else
  729. X    signal(SIGTSTP, SIG_DFL);
  730. X#ifdef BSD
  731. X    sigsetmask (sigblock(0) & ~(1 << (SIGTSTP -1)));
  732. X#endif
  733. X#endif
  734. X
  735. X    kill (0, SIGTSTP);
  736. X
  737. X#ifdef POSIX_JOB_CONTROL
  738. X    sigemptyset (&main_act.sa_mask);
  739. X    main_act.sa_flags = SA_RESTART | SA_RESETHAND;
  740. X    main_act.sa_handler = main_suspend;
  741. X    sigaction (SIGTSTP, &main_act, 0L);
  742. X#else
  743. X    signal (SIGTSTP, main_suspend);
  744. X#endif
  745. X
  746. X    mail_setup ();
  747. X    if (! update) {
  748. X        Raw (TRUE);
  749. X    }
  750. X}
  751. X
  752. X
  753. X/* ARGSUSED0 */
  754. Xvoid select_suspend (sig)
  755. X    int sig;
  756. X{
  757. X
  758. X    Raw (FALSE);
  759. X    putchar ('\n');
  760. X
  761. X#ifdef POSIX_JOB_CONTROL
  762. X    sigsetmask(0);
  763. X#else
  764. X    signal(SIGTSTP, SIG_DFL);
  765. X#ifdef BSD
  766. X    sigsetmask (sigblock(0) & ~(1 << (SIGTSTP -1)));
  767. X#endif
  768. X#endif
  769. X
  770. X    kill (0, SIGTSTP);
  771. X
  772. X#ifdef POSIX_JOB_CONTROL
  773. X    sigemptyset (&select_act.sa_mask);
  774. X    select_act.sa_flags = SA_RESTART | SA_RESETHAND;
  775. X    select_act.sa_handler = select_suspend;
  776. X    sigaction (SIGTSTP, &select_act, 0L);
  777. X#else
  778. X    signal (SIGTSTP, select_suspend);
  779. X#endif
  780. X
  781. X    if (! update) {
  782. X        Raw (TRUE);
  783. X    }
  784. X
  785. X#ifndef USE_CLEARSCREEN
  786. X    ClearScreen ();
  787. X#endif
  788. X    mail_setup ();
  789. X    group_selection_page ();
  790. X}
  791. X
  792. X
  793. X/* ARGSUSED0 */
  794. Xvoid group_suspend (sig)
  795. X    int sig;
  796. X{
  797. X    Raw (FALSE);
  798. X    putchar ('\n');
  799. X
  800. X#ifdef POSIX_JOB_CONTROL
  801. X    sigsetmask(0);
  802. X#else
  803. X    signal(SIGTSTP, SIG_DFL);
  804. X#ifdef BSD
  805. X    sigsetmask (sigblock(0) & ~(1 << (SIGTSTP -1)));
  806. X#endif
  807. X#endif
  808. X
  809. X    kill (0, SIGTSTP);
  810. X
  811. X#ifdef POSIX_JOB_CONTROL
  812. X    sigemptyset (&group_act.sa_mask);
  813. X    group_act.sa_flags = SA_RESTART | SA_RESETHAND;
  814. X    group_act.sa_handler = group_suspend;
  815. X    sigaction (SIGTSTP, &group_act, 0L);
  816. X#else
  817. X    signal (SIGTSTP, group_suspend);
  818. X#endif
  819. X
  820. X    if (! update) {
  821. X        Raw (TRUE);
  822. X    }
  823. X    
  824. X#ifndef USE_CLEARSCREEN
  825. X    ClearScreen ();
  826. X#endif
  827. X    mail_setup ();
  828. X    show_group_page (glob_group);
  829. X}
  830. X
  831. X
  832. X/* ARGSUSED0 */
  833. Xvoid page_suspend (sig)
  834. X    int sig;
  835. X{
  836. X
  837. X    Raw (FALSE);
  838. X    putchar ('\n');
  839. X
  840. X#ifdef POSIX_JOB_CONTROL
  841. X    sigsetmask(0);
  842. X#else
  843. X    signal(SIGTSTP, SIG_DFL);
  844. X#ifdef BSD
  845. X    sigsetmask (sigblock(0) & ~(1 << (SIGTSTP -1)));
  846. X#endif
  847. X#endif
  848. X
  849. X    kill (0, SIGTSTP);
  850. X
  851. X#ifdef POSIX_JOB_CONTROL
  852. X    sigemptyset (&page_act.sa_mask);
  853. X    page_act.sa_flags = SA_RESTART | SA_RESETHAND;
  854. X    page_act.sa_handler = page_suspend;
  855. X    sigaction (SIGTSTP, &page_act, 0L);
  856. X#else
  857. X    signal (SIGTSTP, page_suspend);
  858. X#endif
  859. X
  860. X    mail_setup ();
  861. X
  862. X    if (! update) {
  863. X        Raw (TRUE);
  864. X    }
  865. X    
  866. X#ifndef USE_CLEARSCREEN
  867. X    ClearScreen ();
  868. X#endif
  869. X    redraw_page (glob_respnum, glob_page_group);
  870. X}
  871. X
  872. X
  873. X/* ARGSUSED0 */
  874. Xvoid rcfile_suspend (sig)
  875. X    int sig;
  876. X{
  877. X    Raw (FALSE);
  878. X    putchar ('\n');
  879. X
  880. X#ifdef POSIX_JOB_CONTROL
  881. X    sigsetmask(0);
  882. X#else
  883. X    signal(SIGTSTP, SIG_DFL);
  884. X#ifdef BSD
  885. X    sigsetmask (sigblock(0) & ~(1 << (SIGTSTP -1)));
  886. X#endif
  887. X#endif
  888. X
  889. X    kill (0, SIGTSTP);
  890. X
  891. X#ifdef POSIX_JOB_CONTROL
  892. X    sigemptyset (&rcfile_act.sa_mask);
  893. X    rcfile_act.sa_flags = SA_RESTART | SA_RESETHAND;
  894. X    rcfile_act.sa_handler = rcfile_suspend;
  895. X    sigaction (SIGTSTP, &rcfile_act, 0L);
  896. X#else
  897. X    signal (SIGTSTP, rcfile_suspend);
  898. X#endif
  899. X
  900. X    Raw (TRUE);
  901. X    show_rcfile_menu ();    
  902. X}
  903. X
  904. X#endif /* SIGTSTP */    
  905. X
  906. X
  907. X#ifdef SIGWINCH
  908. X
  909. X/* ARGSUSED0 */
  910. Xvoid art_resize (sig)
  911. X    int sig;
  912. X{
  913. X    char buf[LEN];
  914. X
  915. X    info_message (txt_resizing_window);
  916. X    set_win_size (&LINES, &COLS);
  917. X    signal (SIGWINCH, art_resize);
  918. X
  919. X    ClearScreen ();
  920. X    sprintf (buf, txt_group, glob_art_group);
  921. X    wait_message (buf);
  922. X}
  923. X
  924. X
  925. X/* ARGSUSED0 */
  926. Xvoid main_resize (sig)
  927. X    int sig;
  928. X{
  929. X    info_message (txt_resizing_window);
  930. X    set_win_size (&LINES, &COLS);
  931. X    signal (SIGWINCH, main_resize);
  932. X}
  933. X
  934. X
  935. X/* ARGSUSED0 */
  936. Xvoid select_resize (sig)
  937. X    int sig;
  938. X{
  939. X    info_message (txt_resizing_window);
  940. X    set_win_size (&LINES, &COLS);
  941. X    signal (SIGWINCH, select_resize);
  942. X    
  943. X#ifndef USE_CLEARSCREEN
  944. X    ClearScreen ();
  945. X#endif
  946. X    group_selection_page ();
  947. X}
  948. X
  949. X
  950. X/* ARGSUSED0 */
  951. Xvoid group_resize (sig)
  952. X    int sig;
  953. X{
  954. X    info_message (txt_resizing_window);
  955. X    set_win_size (&LINES, &COLS);
  956. X    signal (SIGWINCH, group_resize);
  957. X    
  958. X#ifndef USE_CLEARSCREEN
  959. X    ClearScreen ();
  960. X#endif
  961. X    show_group_page (glob_group);
  962. X}
  963. X
  964. X
  965. X/* ARGSUSED0 */
  966. Xvoid page_resize (sig)
  967. X    int sig;
  968. X{
  969. X    info_message (txt_resizing_window);
  970. X    set_win_size (&LINES, &COLS);
  971. X    signal (SIGWINCH, page_resize);
  972. X    
  973. X#ifndef USE_CLEARSCREEN
  974. X    ClearScreen ();
  975. X#endif
  976. X    redraw_page (glob_respnum, glob_page_group);
  977. X}
  978. X
  979. X#endif /* SIGWINCH */    
  980. X
  981. SHAR_EOF
  982. $TOUCH -am 0923175591 signal.c &&
  983. chmod 0600 signal.c ||
  984. echo "restore of signal.c failed"
  985. set `wc -c signal.c`;Wc_c=$1
  986. if test "$Wc_c" != "7569"; then
  987.     echo original size 7569, current size $Wc_c
  988. fi
  989. # ============= wildmat.c ==============
  990. echo "x - extracting wildmat.c (Text)"
  991. sed 's/^X//' << 'SHAR_EOF' > wildmat.c &&
  992. X/*  $Revision: 1.5 $
  993. X**
  994. X**  Do shell-style pattern matching for ?, \, [], and * characters.
  995. X**  Might not be robust in face of malformed patterns; e.g., "foo[a-"
  996. X**  could cause a segmentation violation.  It is 8bit clean.
  997. X**
  998. X**  Written by Rich $alz, mirror!rs, Wed Nov 26 19:03:17 EST 1986.
  999. X**  Rich $alz is now <rsalz@bbn.com>.
  1000. X**  April, 1991:  Replaced mutually-recursive calls with in-line code
  1001. X**  for the star character.
  1002. X**
  1003. X**  Special thanks to Lars Mathiesen <thorinn@diku.dk> for the ABORT code.
  1004. X**  This can greatly speed up failing wildcard patterns.  For example:
  1005. X**    pattern: -*-*-*-*-*-*-12-*-*-*-m-*-*-*
  1006. X**    text 1:     -adobe-courier-bold-o-normal--12-120-75-75-m-70-iso8859-1
  1007. X**    text 2:     -adobe-courier-bold-o-normal--12-120-75-75-X-70-iso8859-1
  1008. X**  Text 1 matches with 51 calls, while text 2 fails with 54 calls.  Without
  1009. X**  the ABORT, then it takes 22310 calls to fail.  Ugh.  The following
  1010. X**  explanation is from Lars:
  1011. X**  The precondition that must be fulfilled is that DoMatch will consume
  1012. X**  at least one character in text.  This is true if *p is neither '*' nor
  1013. X**  '\0'.)  The last return has ABORT instead of FALSE to avoid quadratic
  1014. X**  behaviour in cases like pattern "*a*b*c*d" with text "abcxxxxx".  With
  1015. X**  FALSE, each star-loop has to run to the end of the text; with ABORT
  1016. X**  only the last one does.
  1017. X**
  1018. X**  Once the control of one instance of DoMatch enters the star-loop, that
  1019. X**  instance will return either TRUE or ABORT, and any calling instance
  1020. X**  will therefore return immediately after (without calling recursively
  1021. X**  again).  In effect, only one star-loop is ever active.  It would be
  1022. X**  possible to modify the code to maintain this context explicitly,
  1023. X**  eliminating all recursive calls at the cost of some complication and
  1024. X**  loss of clarity (and the ABORT stuff seems to be unclear enough by
  1025. X**  itself).  I think it would be unwise to try to get this into a
  1026. X**  released version unless you have a good test data base to try it out
  1027. X**  on.
  1028. X*/
  1029. X
  1030. X#define TRUE            1
  1031. X#define FALSE            0
  1032. X#define ABORT            -1
  1033. X
  1034. X
  1035. X    /* What character marks an inverted character class? */
  1036. X#define NEGATE_CLASS        '^'
  1037. X    /* Is "*" a common pattern? */
  1038. X#define OPTIMIZE_JUST_STAR
  1039. X    /* Do tar(1) matching rules, which ignore a trailing slash? */
  1040. X#undef MATCH_TAR_PATTERN
  1041. X
  1042. X
  1043. X/*
  1044. X**  Match text and p, return TRUE, FALSE, or ABORT.
  1045. X*/
  1046. Xstatic int
  1047. XDoMatch(text, p)
  1048. X    register char    *text;
  1049. X    register char    *p;
  1050. X{
  1051. X    register int    last;
  1052. X    register int    matched;
  1053. X    register int    reverse;
  1054. X
  1055. X    for ( ; *p; text++, p++) {
  1056. X    if (*text == '\0' && *p != '*')
  1057. X        return ABORT;
  1058. X    switch (*p) {
  1059. X    case '\\':
  1060. X        /* Literal match with following character. */
  1061. X        p++;
  1062. X        /* FALLTHROUGH */
  1063. X    default:
  1064. X        if (*text != *p)
  1065. X        return FALSE;
  1066. X        continue;
  1067. X    case '?':
  1068. X        /* Match anything. */
  1069. X        continue;
  1070. X    case '*':
  1071. X        while (*++p == '*')
  1072. X        /* Consecutive stars act just like one. */
  1073. X        continue;
  1074. X        if (*p == '\0')
  1075. X        /* Trailing star matches everything. */
  1076. X        return TRUE;
  1077. X        while (*text)
  1078. X        if ((matched = DoMatch(text++, p)) != FALSE)
  1079. X            return matched;
  1080. X        return ABORT;
  1081. X    case '[':
  1082. X        reverse = p[1] == NEGATE_CLASS ? TRUE : FALSE;
  1083. X        if (reverse)
  1084. X        /* Inverted character class. */
  1085. X        p++;
  1086. X        matched = FALSE;
  1087. X        if (p[1] == ']' || p[1] == '-')
  1088. X        if (*++p == *text)
  1089. X            matched = TRUE;
  1090. X        for (last = *p; *++p && *p != ']'; last = *p)
  1091. X        /* This next line requires a good C compiler. */
  1092. X        if (*p == '-' && p[1] != ']'
  1093. X            ? *text <= *++p && *text >= last : *text == *p)
  1094. X            matched = TRUE;
  1095. X        if (matched == reverse)
  1096. X        return FALSE;
  1097. X        continue;
  1098. X    }
  1099. X    }
  1100. X
  1101. X#ifdef    MATCH_TAR_PATTERN
  1102. X    if (*text == '/')
  1103. X    return TRUE;
  1104. X#endif    /* MATCH_TAR_ATTERN */
  1105. X    return *text == '\0';
  1106. X}
  1107. X
  1108. X
  1109. X/*
  1110. X**  User-level routine.  Returns TRUE or FALSE.
  1111. X*/
  1112. Xint
  1113. Xwildmat(text, p)
  1114. X    char    *text;
  1115. X    char    *p;
  1116. X{
  1117. X#ifdef    OPTIMIZE_JUST_STAR
  1118. X    if (p[0] == '*' && p[1] == '\0')
  1119. X    return TRUE;
  1120. X#endif    /* OPTIMIZE_JUST_STAR */
  1121. X    return DoMatch(text, p) == TRUE;
  1122. X}
  1123. X
  1124. X
  1125. X
  1126. X#ifdef    TEST
  1127. X#include <stdio.h>
  1128. X
  1129. X/* Yes, we use gets not fgets.  Sue me. */
  1130. Xextern char    *gets();
  1131. X
  1132. X
  1133. Xmain()
  1134. X{
  1135. X    char     p[80];
  1136. X    char     text[80];
  1137. X
  1138. X    printf("Wildmat tester.  Enter pattern, then strings to test.\n");
  1139. X    printf("A blank line gets prompts for a new pattern; a blank pattern\n");
  1140. X    printf("exits the program.\n");
  1141. X
  1142. X    for ( ; ; ) {
  1143. X    printf("\nEnter pattern:  ");
  1144. X    (void)fflush(stdout);
  1145. X    if (gets(p) == NULL || p[0] == '\0')
  1146. X        break;
  1147. X    for ( ; ; ) {
  1148. X        printf("Enter text:  ");
  1149. X        (void)fflush(stdout);
  1150. X        if (gets(text) == NULL)
  1151. X        exit(0);
  1152. X        if (text[0] == '\0')
  1153. X        /* Blank line; go back and get a new pattern. */
  1154. X        break;
  1155. X        printf("      %s\n", wildmat(text, p) ? "YES" : "NO");
  1156. X    }
  1157. X    }
  1158. X
  1159. X    exit(0);
  1160. X    /* NOTREACHED */
  1161. X}
  1162. X#endif    /* TEST */
  1163. SHAR_EOF
  1164. $TOUCH -am 0923175591 wildmat.c &&
  1165. chmod 0600 wildmat.c ||
  1166. echo "restore of wildmat.c failed"
  1167. set `wc -c wildmat.c`;Wc_c=$1
  1168. if test "$Wc_c" != "4749"; then
  1169.     echo original size 4749, current size $Wc_c
  1170. fi
  1171. # ============= tin.h ==============
  1172. echo "x - extracting tin.h (Text)"
  1173. sed 's/^X//' << 'SHAR_EOF' > tin.h &&
  1174. X/*
  1175. X *  Project   : tin - a visual threaded usenet newsreader
  1176. X *  Module    : tin.h
  1177. X *  Author    : R.Skrenta / I.Lea
  1178. X *  Created   : 01-04-91
  1179. X *  Updated   : 24-09-91
  1180. X *  Release   : 1.0
  1181. X *  Notes     :
  1182. X *  Copyright : (c) Copyright 1991 by Rich Skrenta & Iain Lea
  1183. X *                You may  freely  copy or  redistribute  this software,
  1184. X *              so  long as there is no profit made from its use, sale
  1185. X *              trade or  reproduction.  You may not change this copy-
  1186. X *              right notice, and it must be included in any copy made
  1187. X */
  1188. X
  1189. X#include    <stdio.h>
  1190. X#include    <signal.h>
  1191. X#include    <pwd.h>
  1192. X#include    <sys/types.h>
  1193. X#include    <memory.h>
  1194. X#include    <ctype.h>
  1195. X#include    <time.h>
  1196. X#include    <sys/stat.h>
  1197. X
  1198. X#ifdef BSD
  1199. X#include    <strings.h>
  1200. X#else
  1201. X#include    <string.h>
  1202. X#include    <malloc.h>
  1203. X#endif
  1204. X
  1205. X#ifdef SCO_UNIX
  1206. X#include    <sys/streams.h>
  1207. X#include    <sys/ptem.h>
  1208. X#endif
  1209. X
  1210. X#ifdef SIGWINCH
  1211. X#include    <sys/ioctl.h>
  1212. X#ifdef AUTO_RESIZE
  1213. X#include    <sys/ttold.h>        /* needed for resizing under an xterm */
  1214. X#endif
  1215. X#endif
  1216. X
  1217. X#include    "patchlevel.h"
  1218. X
  1219. X
  1220. X#define BUG_REPORT_ADDRESS    "iain@estevax.uucp"
  1221. X
  1222. X#ifndef SPOOLDIR
  1223. X#define        SPOOLDIR        "/usr/spool/news"
  1224. X#endif
  1225. X#ifndef LIBDIR
  1226. X#define        LIBDIR            "/usr/lib/news"
  1227. X#endif
  1228. X#ifndef INEWSDIR
  1229. X#define        INEWSDIR        LIBDIR
  1230. X#endif
  1231. X
  1232. X#define        RCDIR            ".tin"
  1233. X#define        RCFILE            "tinrc"
  1234. X#define        INDEXDIR        ".index"
  1235. X#define        KILLFILE        "kill"
  1236. X#define        POSTFILE        "posted"
  1237. X
  1238. X#define        DEFAULT_SHELL    "/bin/sh"
  1239. X#define        DEFAULT_MAILDIR    "Mail"
  1240. X
  1241. X#ifdef BSD
  1242. X#define     DEFAULT_EDITOR    "/usr/ucb/vi"
  1243. X#define        DEFAULT_MAILER    "/bin/rmail"
  1244. X#define        DEFAULT_MAILBOX    "/usr/spool/mail"
  1245. X#define        DEFAULT_PRINTER    "/usr/ucb/lpr"
  1246. X#define        DEFAULT_SUM        "sum"
  1247. X#ifndef USE_LONG_FILENAMES
  1248. X#define USE_LONG_FILENAMES
  1249. X#endif
  1250. X#else
  1251. X#ifdef M_XENIX
  1252. X#define     DEFAULT_EDITOR    "/bin/vi"
  1253. X#define        DEFAULT_MAILBOX    "/usr/spool/mail"
  1254. X#else
  1255. X#define     DEFAULT_EDITOR    "/usr/bin/vi"
  1256. X#define        DEFAULT_MAILBOX    "/usr/mail"
  1257. X#endif
  1258. X#define        DEFAULT_MAILER    "/usr/bin/rmail"
  1259. X/*
  1260. X#define        DEFAULT_MAILER    "/usr/lib/sendmail -t"
  1261. X*/
  1262. X#define        DEFAULT_PRINTER    "/usr/bin/lp"
  1263. X#define        DEFAULT_SUM        "sum -r"
  1264. X#endif
  1265. X
  1266. X#define        DEFAULT_ACTIVE_NUM    100        /* initial size of active array */
  1267. X#define        DEFAULT_ARTICLE_NUM    400        /* initial size of art array */ 
  1268. X#define        DEFAULT_KILL_NUM    10        /* initial size of kill array */ 
  1269. X#define        DEFAULT_SAVE_NUM    10        /* initial size of save array */ 
  1270. X
  1271. X#define        TRUE        1
  1272. X#define        FALSE        0
  1273. X
  1274. X#define        LEN        200
  1275. X
  1276. X#ifdef USE_LONG_FILENAMES
  1277. X#define        LONG_PATH_PART    "part"
  1278. X#define        LONG_PATH_PATCH    "patch"
  1279. X#else
  1280. X#define        LONG_PATH_PART    ""
  1281. X#define        LONG_PATH_PATCH    "p"
  1282. X#endif
  1283. X
  1284. X#define        DEFAULT_COMMENT    ": "    /* used when by follow-ups & replys */
  1285. X
  1286. X/*
  1287. X *  used by feed.c - feed_articles()
  1288. X */
  1289. X#define        SELECT_LEVEL            1
  1290. X#define        GROUP_LEVEL                2
  1291. X#define        PAGE_LEVEL                3
  1292. X
  1293. X#define        FEED_MAIL                1
  1294. X#define        FEED_PIPE                2
  1295. X#define        FEED_PRINT                3
  1296. X#define        FEED_SAVE                4
  1297. X
  1298. X
  1299. X#ifdef USE_INVERSE_HACK
  1300. X#define        BLANK_SELECT_COLS        59
  1301. X#define        BLANK_GROUP_COLS        2
  1302. X#define        BLANK_PAGE_COLS            2
  1303. X#else
  1304. X#define        BLANK_SELECT_COLS        57
  1305. X#define        BLANK_GROUP_COLS        0
  1306. X#define        BLANK_PAGE_COLS            0
  1307. X#endif
  1308. X
  1309. X#define        SCREEN_READ_UNREAD        6        /* position for "  +" / "   " */
  1310. X#define        DEFAULT_COLS            132        /* used when updating indexes */
  1311. X#define        INDEX_TOP                2
  1312. X
  1313. X#define        SORT_BY_NOTHING            0        /* sort types on arts[] array */
  1314. X#define        SORT_BY_SUBJ_DESCEND    1
  1315. X#define        SORT_BY_SUBJ_ASCEND        2
  1316. X#define        SORT_BY_FROM_DESCEND    3
  1317. X#define        SORT_BY_FROM_ASCEND        4
  1318. X#define        SORT_BY_DATE_DESCEND    5
  1319. X#define        SORT_BY_DATE_ASCEND        6
  1320. X
  1321. X#define        HELP_INFO    0     
  1322. X#define        POST_INFO    1     
  1323. X
  1324. Xextern int sort_art_type;
  1325. X
  1326. Xextern int NOTESLINES;
  1327. Xextern int RIGHT_POS;
  1328. Xextern int MORE_POS;
  1329. X
  1330. Xextern int max_subj;
  1331. Xextern int max_from;
  1332. X
  1333. X#define        TABLE_SIZE        1409
  1334. X#define        MAX_PAGES        1000
  1335. X
  1336. X#ifdef BSD
  1337. X#define CR    '\r'
  1338. X#else
  1339. X#define CR    10
  1340. X#endif
  1341. X
  1342. X/*
  1343. X * return codes for change_rcfile ()
  1344. X */
  1345. X
  1346. X#define        NO_KILLING        0
  1347. X#define        KILLING            1
  1348. X
  1349. X/*
  1350. X *  art.thread
  1351. X */
  1352. X
  1353. X#define        ART_NORMAL        -1
  1354. X#define        ART_EXPIRED        -2
  1355. X
  1356. X/*
  1357. X *  art.unread
  1358. X */
  1359. X
  1360. X#define        ART_READ        0
  1361. X#define        ART_UNREAD        1
  1362. X#define        ART_WILL_RETURN    2
  1363. X
  1364. Xstruct header {
  1365. X    long artnum;
  1366. X    char *subject;    /* Subject: line from mail header */
  1367. X    char *from;        /* From: line from mail header */
  1368. X    int thread;
  1369. X    int inthread;
  1370. X    int unread;        /* 0 = read, 1 = unread, 2 = will return */
  1371. X    char date[16];    /* Date: line from mail header */
  1372. X    char *archive;    /* Archive-name: line from mail header */
  1373. X    char *part;        /* part no. of archive */
  1374. X    char *patch;    /* patch no. of archive */
  1375. X    int tagged;        /* 0 = not killed/tagged, 1 = killed/tagged */
  1376. X};
  1377. X
  1378. X/*
  1379. X *  header.artnum:
  1380. X *    article number in spool directory for group
  1381. X *
  1382. X *  header.thread:
  1383. X *    initially -1
  1384. X *    points to another arts[] (struct header): zero and up
  1385. X *    -2 means article has expired (wasn't found in file search
  1386. X *    of spool directory for the group)
  1387. X *
  1388. X *  header.inthread:
  1389. X *    FALSE for the first article in a thread, TRUE for all
  1390. X *    following articles in thread
  1391. X *
  1392. X *  header.read:
  1393. X *    boolean, has this article been read or not
  1394. X *
  1395. X *  header.date
  1396. X *  date: line used for sorting articles by date order
  1397. X *
  1398. X *  header.archive:
  1399. X *    archive name used in *source* groups
  1400. X *
  1401. X *  header.part:
  1402. X *    part no. of archive
  1403. X *
  1404. X *  header.patch:
  1405. X *    patch no. of archive
  1406. X *
  1407. X *  header.tagged:
  1408. X *    boolean, has this article been killed/tagged for saving or not
  1409. X */
  1410. X
  1411. Xstruct group_ent {
  1412. X    char *name;
  1413. X    long max;
  1414. X    long min;
  1415. X    int next;        /* next active entry in hash chain */
  1416. X    int flag;
  1417. X};
  1418. X
  1419. X#define        NOTGOT            0x01    /* haven't put in my_group yet */
  1420. X#define        SUBS            0x02    /* subscribed to */
  1421. X
  1422. X#define KILL_SUBJ    1
  1423. X#define KILL_FROM    2
  1424. X#define KILL_BOTH    3
  1425. X
  1426. Xstruct kill_t {
  1427. X    int kill_type;
  1428. X    long kill_group;
  1429. X    char *kill_subj;
  1430. X    char *kill_from;
  1431. X};
  1432. X
  1433. Xextern struct kill_t *killf;
  1434. Xextern int kill_num;
  1435. Xextern int max_kill;
  1436. X
  1437. X#define POST_PROC_NONE            0
  1438. X#define POST_PROC_SHAR            1
  1439. X#define POST_PROC_UUDECODE        2
  1440. X#define POST_PROC_UUD_LST_ZOO    3
  1441. X#define POST_PROC_UUD_EXT_ZOO    4
  1442. X#define POST_PROC_PATCH            5
  1443. X
  1444. Xstruct save_t {
  1445. X    char *subject;
  1446. X    char *dir;
  1447. X    char *file;
  1448. X    char *archive;
  1449. X    char *part;
  1450. X    char *patch;
  1451. X    int index;    
  1452. X    int saved;    
  1453. X    int is_mailbox;    
  1454. X};
  1455. X
  1456. Xextern struct save_t *save;
  1457. Xextern int save_num;
  1458. Xextern int max_save;
  1459. X
  1460. Xstruct screen_t {
  1461. X    char *col;
  1462. X};
  1463. X
  1464. Xextern struct screen_t *screen;
  1465. X
  1466. Xstruct posted_t {
  1467. X    char date[LEN];
  1468. X    char group[LEN];
  1469. X    char subj[LEN];
  1470. X};
  1471. X
  1472. Xextern struct posted_t *posted;
  1473. X
  1474. X#ifdef POSIX_JOB_CONTROL
  1475. Xextern struct sigaction art_act;
  1476. Xextern struct sigaction group_act;
  1477. Xextern struct sigaction main_act;
  1478. Xextern struct sigaction page_act;
  1479. Xextern struct sigaction select_act;
  1480. Xextern struct sigaction rcfile_act;
  1481. Xextern struct sigaction old_act;
  1482. X#endif
  1483. X
  1484. Xextern int debug;
  1485. Xextern int active_num;
  1486. Xextern int article_num;
  1487. Xextern int start_line_offset;
  1488. X
  1489. Xextern int read_news_via_nntp;
  1490. Xextern char nntp_server[LEN+1];
  1491. Xextern int top;
  1492. Xextern struct header *arts;
  1493. Xextern long *base;
  1494. Xextern int max_art;
  1495. X
  1496. Xextern int index_file_killed;
  1497. Xextern int save_separate;
  1498. Xextern int save_archive_name;
  1499. Xextern int show_author;
  1500. Xextern int draw_arrow_mark;
  1501. Xextern int kill_articles;
  1502. Xextern int mark_saved_read;
  1503. Xextern int post_proc_type;
  1504. Xextern int default_printer;
  1505. Xextern int print_header;
  1506. Xextern int pos_first_unread;
  1507. Xextern int num_of_tagged_files;
  1508. Xextern int compiled_with_nntp;
  1509. Xextern int save_news;
  1510. X
  1511. Xextern char rcdir[LEN+1];
  1512. Xextern char rcfile[LEN+1];
  1513. Xextern char indexdir[LEN+1];
  1514. Xextern char killfile[LEN+1];
  1515. Xextern char postfile[LEN+1];
  1516. X
  1517. Xextern char msg[LEN+1];
  1518. Xextern char userid[LEN+1];
  1519. Xextern char homedir[LEN+1];
  1520. Xextern char add_addr[LEN+1];
  1521. Xextern char bug_addr[LEN+1];
  1522. Xextern char txt_help_bug_report[LEN+1];
  1523. Xextern char reply_to[LEN+1];
  1524. Xextern char my_org[LEN+1];
  1525. Xextern char active_file[LEN+1];
  1526. Xextern char newsrc[LEN+1];
  1527. Xextern char newnewsrc[LEN+1];
  1528. Xextern char delgroups[LEN+1];
  1529. X
  1530. Xextern char *version;
  1531. Xextern char cvers[LEN+1];
  1532. Xextern char progname[LEN+1];
  1533. Xextern char article[LEN+1];
  1534. Xextern char dead_article[LEN+1];
  1535. Xextern char mailer[LEN+1];
  1536. Xextern char printer[LEN+1];
  1537. Xextern char spooldir[LEN+1];
  1538. Xextern char savedir[LEN+1];
  1539. Xextern char maildir[LEN+1];
  1540. Xextern char mailbox[LEN+1];
  1541. Xextern char page_header[LEN+1];
  1542. Xextern char signature[LEN+1];
  1543. Xextern char sig[LEN+1];
  1544. Xextern char killsubj[LEN+1];
  1545. Xextern char killfrom[LEN+1];
  1546. Xextern char author_search_string[LEN+1];
  1547. Xextern char group_search_string[LEN+1];
  1548. Xextern char subject_search_string[LEN+1];
  1549. Xextern char art_search_string[LEN+1];
  1550. Xextern char default_mail_address[LEN];
  1551. Xextern char default_pipe_command[LEN];
  1552. Xextern char default_regex_pattern[LEN];
  1553. Xextern char default_save_file[LEN];
  1554. Xextern char proc_ch_default;                /* set in change_rcfile () */
  1555. X
  1556. Xextern char *help_select[];
  1557. Xextern char *help_group[];
  1558. Xextern char *help_page[];
  1559. X
  1560. Xextern int top_base;
  1561. Xextern int LINES, COLS;
  1562. Xextern int group_hash[TABLE_SIZE];
  1563. Xextern int num_active;
  1564. Xextern struct group_ent *active;
  1565. Xextern int *my_group;
  1566. Xextern int *unread;
  1567. Xextern int max_active;
  1568. X
  1569. Xextern int local_top;
  1570. Xextern int catchup;
  1571. Xextern int update;
  1572. Xextern int verbose;
  1573. Xextern int inverse_okay;
  1574. X
  1575. Xextern int tin_uid;
  1576. Xextern int tin_gid;
  1577. Xextern int real_uid;
  1578. Xextern int real_gid;
  1579. Xextern int local_index;
  1580. X
  1581. X#ifdef SIGTSTP
  1582. Xextern int do_sigtstp;
  1583. X#endif
  1584. X
  1585. X#define        ctrl(c)            ((c) & 0x1F)
  1586. X
  1587. X/*
  1588. X *  Assertion verifier
  1589. X */
  1590. X
  1591. X#ifdef __STDC__
  1592. X#define    assert(p)    if(! (p)) asfail(__FILE__, __LINE__, #p); else
  1593. X#else
  1594. X#define    assert(p)    if(! (p)) asfail(__FILE__, __LINE__, "p"); else
  1595. X#endif
  1596. X
  1597. X/*
  1598. X *  function prototypes    & language definitions    
  1599. X */ 
  1600. X
  1601. X#include    "proto.h"
  1602. X#include    "lang.h"
  1603. SHAR_EOF
  1604. $TOUCH -am 0924140291 tin.h &&
  1605. chmod 0600 tin.h ||
  1606. echo "restore of tin.h failed"
  1607. set `wc -c tin.h`;Wc_c=$1
  1608. if test "$Wc_c" != "9348"; then
  1609.     echo original size 9348, current size $Wc_c
  1610. fi
  1611. # ============= lang.h ==============
  1612. echo "x - extracting lang.h (Text)"
  1613. sed 's/^X//' << 'SHAR_EOF' > lang.h &&
  1614. X/*
  1615. X *  Project   : tin - a visual threaded usenet newsreader
  1616. X *  Module    : lang.h
  1617. X *  Author    : I.Lea
  1618. X *  Created   : 01-04-91
  1619. X *  Updated   : 24-09-91
  1620. X *  Release   : 1.0
  1621. X *  Notes     :
  1622. X *  Copyright : (c) Copyright 1991 by Iain Lea
  1623. X *                You may  freely  copy or  redistribute  this software,
  1624. X *              so  long as there is no profit made from its use, sale
  1625. X *              trade or  reproduction.  You may not change this copy-
  1626. X *              right notice, and it must be included in any copy made
  1627. X */
  1628. X
  1629. X/*
  1630. X *  art.c
  1631. X */
  1632. X
  1633. Xextern char txt_group[];
  1634. Xextern char txt_cannot_open_art[];
  1635. Xextern char txt_indexing[];
  1636. Xextern char txt_corrupt_index[];
  1637. X
  1638. X/*
  1639. X *  feed.c
  1640. X */
  1641. X
  1642. Xextern char txt_art_thread_regex_tag[];
  1643. Xextern char txt_post_procees_type[];
  1644. Xextern char txt_feed_pattern[];
  1645. Xextern char txt_no_command[];
  1646. X
  1647. X/*
  1648. X *  group.c
  1649. X */
  1650. X
  1651. Xextern char txt_tagged_art[];
  1652. Xextern char txt_untagged_art[];
  1653. Xextern char txt_inverse_on[];
  1654. Xextern char txt_inverse_off[];
  1655. Xextern char txt_subscribed_to[];
  1656. Xextern char txt_unsubscribed_to[];
  1657. Xextern char txt_mark_all_read[];
  1658. Xextern char txt_marked_as_read[];
  1659. Xextern char txt_no_more_groups[];
  1660. Xextern char txt_no_prev_group[];
  1661. Xextern char txt_no_arts[];
  1662. Xextern char txt_no_groups[];
  1663. Xextern char txt_end_of_arts[];
  1664. Xextern char txt_end_of_groups[];
  1665. Xextern char txt_no_next_unread_art[];
  1666. Xextern char txt_no_prev_unread_art[];
  1667. Xextern char txt_no_last_message[];
  1668. Xextern char txt_bad_command[];
  1669. Xextern char txt_you_have_mail[];
  1670. Xextern char txt_type_h_for_help[];
  1671. Xextern char txt_read_art[];
  1672. Xextern char txt_author_search_forwards[];
  1673. Xextern char txt_author_search_backwards[];
  1674. Xextern char txt_search_forwards[];
  1675. Xextern char txt_search_backwards[];
  1676. Xextern char txt_no_search_string[];
  1677. Xextern char txt_no_match[];
  1678. Xextern char txt_post_subject[];
  1679. Xextern char txt_no_subject[];
  1680. Xextern char txt_cannot_open[];
  1681. Xextern char txt_posting[];
  1682. Xextern char txt_art_posted[];
  1683. Xextern char txt_art_rejected[];
  1684. Xextern char txt_abort_edit_post[];
  1685. Xextern char txt_index_page_com[];
  1686. Xextern char txt_help_i_4[];
  1687. Xextern char txt_help_ctrl_k[];
  1688. Xextern char txt_help_ctrl_l[];
  1689. Xextern char txt_help_ctrl_d[];
  1690. Xextern char txt_help_i_cr[];
  1691. Xextern char txt_help_i_tab[];
  1692. Xextern char txt_help_m[];
  1693. Xextern char txt_help_M[];
  1694. Xextern char txt_help_a[];
  1695. Xextern char txt_help_sel_c[];
  1696. Xextern char txt_help_c[];
  1697. Xextern char txt_help_g[];
  1698. Xextern char txt_help_I[];
  1699. Xextern char txt_help_K[];
  1700. Xextern char txt_help_j[];
  1701. Xextern char txt_help_i_n[];
  1702. Xextern char txt_help_i_p[];
  1703. Xextern char txt_help_q[];
  1704. Xextern char txt_help_s[];
  1705. Xextern char txt_help_S[];
  1706. Xextern char txt_help_t[];
  1707. Xextern char txt_help_T[];
  1708. Xextern char txt_help_U[];
  1709. Xextern char txt_help_v[];
  1710. Xextern char txt_help_i_u[];
  1711. Xextern char txt_help_w[];
  1712. Xextern char txt_help_i_search[];
  1713. Xextern char txt_help_thread[];
  1714. Xextern char txt_help_dash[];
  1715. Xextern char txt_save_pattern[];
  1716. Xextern char txt_base_subdir[];
  1717. Xextern char txt_saved_pattern_to[];
  1718. Xextern char txt_saved_to_mailbox[];
  1719. Xextern char txt_switch_on_kill_art_menu[];
  1720. X
  1721. X/* 
  1722. X *  help.c:
  1723. X */
  1724. X
  1725. Xextern char txt_post_history_menu[];
  1726. Xextern char txt_hit_space_for_more[];
  1727. X
  1728. X/* 
  1729. X *  kill.c:
  1730. X */
  1731. X
  1732. Xextern char txt_kill_menu[];
  1733. Xextern char txt_kill_subject[];
  1734. Xextern char txt_kill_from[];
  1735. Xextern char txt_kill_text[];
  1736. Xextern char txt_kill_text_type[];
  1737. Xextern char txt_kill_group[];
  1738. Xextern char txt_help_kill_subject[];
  1739. Xextern char txt_help_kill_from[];
  1740. Xextern char txt_help_kill_text[];
  1741. Xextern char txt_help_kill_text_type[];
  1742. Xextern char txt_help_kill_group[];
  1743. Xextern char txt_abort_edit_save_killfile[];
  1744. X
  1745. X/*
  1746. X *  page.c
  1747. X */
  1748. X
  1749. Xextern char txt_quit[];
  1750. Xextern char txt_art_unavailable[];
  1751. Xextern char txt_art_marked_as_unread[];
  1752. Xextern char txt_thread_marked_as_unread[];
  1753. Xextern char txt_begin_of_art[];
  1754. Xextern char txt_next_resp[];
  1755. Xextern char txt_last_resp[];
  1756. Xextern char txt_more_percent[];
  1757. Xextern char txt_more[];
  1758. Xextern char txt_thread_x_of_n[];
  1759. Xextern char txt_art[];
  1760. Xextern char txt_resp_x_of_n[];
  1761. Xextern char txt_no_resp[];
  1762. Xextern char txt_1_resp[];
  1763. Xextern char txt_x_resp[];
  1764. Xextern char txt_s_at_s[];
  1765. Xextern char txt_thread_resp_page[];
  1766. Xextern char txt_thread_page[];
  1767. Xextern char txt_read_resp[];
  1768. Xextern char txt_art_pager_com[];
  1769. Xextern char txt_help_p_0[];
  1770. Xextern char txt_help_p_4[];
  1771. Xextern char txt_help_p_cr[];
  1772. Xextern char txt_help_p_tab[];
  1773. Xextern char txt_help_b[];
  1774. Xextern char txt_help_C[];
  1775. Xextern char txt_help_bug[];
  1776. Xextern char txt_help_p_f[];
  1777. Xextern char txt_help_ctrl_h[];
  1778. Xextern char txt_help_h[];
  1779. Xextern char txt_help_p_i[];
  1780. Xextern char txt_help_p_k[];
  1781. Xextern char txt_help_p_m[];
  1782. Xextern char txt_help_p_n[];
  1783. Xextern char txt_help_o[];
  1784. Xextern char txt_help_p_p[];
  1785. Xextern char txt_help_p_r[];
  1786. Xextern char txt_help_p_s[];
  1787. Xextern char txt_help_p_z[];
  1788. Xextern char txt_help_p_ctrl_r[];
  1789. Xextern char txt_help_p_g[];
  1790. Xextern char txt_help_p_d[];
  1791. Xextern char txt_help_pipe[];
  1792. Xextern char txt_help_p_search[];
  1793. Xextern char txt_mail_art_to[];
  1794. Xextern char txt_no_mail_address[];
  1795. Xextern char txt_abort_edit_send[];
  1796. Xextern char txt_abort_edit_cancel[];
  1797. Xextern char txt_cancelling[];
  1798. Xextern char txt_art_cancelled[];
  1799. Xextern char txt_mailing_to[];
  1800. Xextern char txt_message_sent[];
  1801. Xextern char txt_command_failed_s[];
  1802. Xextern char txt_in_art_you_write[];
  1803. Xextern char txt_resp_to_poster[];
  1804. Xextern char txt_resp_redirect[];
  1805. Xextern char txt_continue[];
  1806. Xextern char txt_writes[];
  1807. Xextern char txt_save_filename[];
  1808. Xextern char txt_art_not_saved[];
  1809. Xextern char txt_no_filename[];
  1810. Xextern char txt_saving[];
  1811. Xextern char txt_art_saved_to[];
  1812. Xextern char txt_thread_not_saved[];
  1813. Xextern char txt_thread_saved_to_many[];
  1814. Xextern char txt_thread_saved_to[];
  1815. Xextern char txt_pipe_to_command[];
  1816. Xextern char txt_command_failed[];
  1817. Xextern char txt_error_printing_art[];
  1818. Xextern char txt_printing[];
  1819. Xextern char txt_printed[];
  1820. Xextern char txt_append_to_file[];
  1821. X
  1822. X/*
  1823. X *  prompt.c
  1824. X */
  1825. X
  1826. Xextern char txt_hit_any_key[];
  1827. X/* 
  1828. X *  main.c:
  1829. X */
  1830. X
  1831. Xextern char txt_not_in_active_file[];
  1832. Xextern char txt_screen_init_failed[];
  1833. Xextern char txt_bad_active_file[];
  1834. X
  1835. X/*
  1836. X *  misc.c
  1837. X */
  1838. X
  1839. Xextern char txt_cannot_find_base_art[];
  1840. Xextern char txt_out_of_memory[];
  1841. Xextern char txt_rename_error[];
  1842. Xextern char txt_shell_escape[];
  1843. X
  1844. X/*
  1845. X *  nntp.c
  1846. X */
  1847. X
  1848. Xextern char txt_cannot_get_nntp_server_name[];
  1849. Xextern char txt_server_name_in_file_env_var[];
  1850. Xextern char txt_failed_to_connect_to_server[];
  1851. Xextern char txt_rejected_by_nntpserver[];
  1852. Xextern char txt_connection_to_server_broken[];
  1853. Xextern char txt_stuff_nntp_cannot_open[];
  1854. Xextern char txt_nntp_to_fp_cannot_reopen[];
  1855. Xextern char txt_nntp_to_fd_cannot_reopen[];
  1856. Xextern char txt_toggled_rot13[];
  1857. X
  1858. X/*
  1859. X *  post.c
  1860. X */
  1861. X
  1862. Xextern char txt_no_arts_posted[];
  1863. X
  1864. X/*
  1865. X *  rcfile.c
  1866. X */
  1867. X
  1868. Xextern char txt_opt_autosave[];
  1869. Xextern char txt_opt_save_separate[];
  1870. Xextern char txt_opt_mark_saved_read[];
  1871. Xextern char txt_opt_kill_articles[];
  1872. Xextern char txt_opt_show_author[];
  1873. Xextern char txt_opt_draw_arrow[];
  1874. Xextern char txt_opt_post_process[];
  1875. Xextern char txt_opt_print_header[];
  1876. Xextern char txt_opt_pos_first_unread[];
  1877. Xextern char txt_opt_process_type[];
  1878. Xextern char txt_opt_sort_type[];
  1879. Xextern char txt_post_process_none[];
  1880. Xextern char txt_post_process_sh[];
  1881. Xextern char txt_post_process_uudecode[];
  1882. Xextern char txt_post_process_uud_lst_zoo[];
  1883. Xextern char txt_post_process_uud_ext_zoo[];
  1884. Xextern char txt_post_process_patch[];
  1885. Xextern char txt_sort_by_nothing[];
  1886. Xextern char txt_sort_by_subj_descend[];
  1887. Xextern char txt_sort_by_subj_ascend[];
  1888. Xextern char txt_sort_by_from_descend[];
  1889. Xextern char txt_sort_by_from_ascend[];
  1890. Xextern char txt_sort_by_date_descend[];
  1891. Xextern char txt_sort_by_date_ascend[];
  1892. Xextern char txt_opt_savedir[];
  1893. Xextern char txt_opt_maildir[];
  1894. Xextern char txt_opt_printer[];
  1895. Xextern char txt_opt_kill_subj[];
  1896. Xextern char txt_opt_kill_from[];
  1897. Xextern char txt_options_menu[];
  1898. Xextern char txt_help_autosave[];
  1899. Xextern char txt_help_save_separate[];
  1900. Xextern char txt_help_print_header[];
  1901. Xextern char txt_help_pos_first_unread[];
  1902. Xextern char txt_help_show_author[];
  1903. Xextern char txt_help_draw_arrow[];
  1904. Xextern char txt_help_kill_articles[];
  1905. Xextern char txt_help_post_process[];
  1906. Xextern char txt_help_mark_saved_read[];
  1907. Xextern char txt_help_post_proc_type[];
  1908. Xextern char txt_help_sort_type[];
  1909. Xextern char txt_help_savedir[];
  1910. Xextern char txt_help_maildir[];
  1911. Xextern char txt_help_printer[];
  1912. Xextern char txt_select_rcfile_option[];
  1913. Xextern char txt_save_options[];
  1914. X
  1915. X/*
  1916. X *  save.c
  1917. X */
  1918. X
  1919. Xextern char txt_post_processing[];
  1920. Xextern char txt_post_processing_finished[];
  1921. Xextern char txt_deleting[];
  1922. X
  1923. X/*
  1924. X *  search.c
  1925. X */
  1926. X
  1927. Xextern char txt_searching[];
  1928. X
  1929. X/*
  1930. X *  select.c
  1931. X */
  1932. X
  1933. Xextern char txt_moving[];
  1934. Xextern char txt_subscribe_pattern[];
  1935. Xextern char txt_unsubscribe_pattern[];
  1936. Xextern char txt_subscribing[];
  1937. Xextern char txt_subscribing_to[];
  1938. Xextern char txt_unsubscribing[];
  1939. Xextern char txt_unsubscribing_from[];
  1940. Xextern char txt_subscribed_num_groups[];
  1941. Xextern char txt_unsubscribed_num_groups[];
  1942. Xextern char txt_del_group_in_newsrc[];
  1943. Xextern char txt_group_deleted[];
  1944. Xextern char txt_group_undeleted[];
  1945. Xextern char txt_mark_group_read[];
  1946. Xextern char txt_no_groups_to_delete[];
  1947. Xextern char txt_reset_newsrc[];
  1948. Xextern char txt_no_groups_to_read[];
  1949. Xextern char txt_added_groups[];
  1950. Xextern char txt_rewriting_newsrc_file[];
  1951. Xextern char txt_plural[];
  1952. Xextern char txt_no_groups_to_yank_in[];
  1953. Xextern char txt_group_selection[];
  1954. Xextern char txt_select_group[];
  1955. Xextern char txt_group_select_com[];
  1956. Xextern char txt_help_g_4[];
  1957. Xextern char txt_help_g_ctrl_r[];
  1958. Xextern char txt_help_g_ctrl_k[];
  1959. Xextern char txt_help_g_cr[];
  1960. Xextern char txt_help_g_tab[];
  1961. Xextern char txt_help_g_c[];
  1962. Xextern char txt_help_W[];
  1963. Xextern char txt_help_g_y[];
  1964. Xextern char txt_help_g_z[];
  1965. Xextern char txt_help_g_dollar[];
  1966. Xextern char txt_help_g_search[];
  1967. Xextern char txt_newsgroup[];
  1968. Xextern char txt_newsgroup_position[];
  1969. X
  1970. X/*
  1971. X *  signal.c
  1972. X */
  1973. X
  1974. Xextern char txt_resizing_window[];
  1975. SHAR_EOF
  1976. $TOUCH -am 0924083791 lang.h &&
  1977. chmod 0600 lang.h ||
  1978. echo "restore of lang.h failed"
  1979. set `wc -c lang.h`;Wc_c=$1
  1980. if test "$Wc_c" != "9707"; then
  1981.     echo original size 9707, current size $Wc_c
  1982. fi
  1983. # ============= nntp.h ==============
  1984. echo "x - extracting nntp.h (Text)"
  1985. sed 's/^X//' << 'SHAR_EOF' > nntp.h &&
  1986. X/*
  1987. X *  Project   : tin - a visual threaded usenet newsreader
  1988. X *  Module    : nntp.h
  1989. X *  Author    : R.Skrenta
  1990. X *  Created   : 01-04-91
  1991. X *  Updated   : 10-08-91
  1992. X *  Release   : 1.0
  1993. X *  Notes     : Changed a bit so nntp knows about Tass
  1994. X *              This file is originally from the nntp 1.5 source.
  1995. X *  Copyright : (c) Copyright 1991 by Rich Skrenta
  1996. X *                You may  freely  copy or  redistribute  this software,
  1997. X *              so  long as there is no profit made from its use, sale
  1998. X *              trade or  reproduction.  You may not change this copy-
  1999. X *              right notice, and it must be included in any copy made
  2000. X */
  2001. X
  2002. X#define    NNTP_SERVER_FILE    "/etc/nntpserver"
  2003. X
  2004. X/*
  2005. X *  External routine declarations
  2006. X */
  2007. X
  2008. Xextern char *getserverbyfile();
  2009. Xextern int server_init();
  2010. Xextern int get_tcp_socket();
  2011. Xextern int handle_server_response();
  2012. Xextern void put_server();
  2013. Xextern int get_server();
  2014. Xextern void close_server();
  2015. X
  2016. X/*
  2017. X *  External file descriptors for the server connection
  2018. X */
  2019. X
  2020. Xextern FILE *ser_wr_fp;
  2021. Xextern FILE *ser_wr_fp;
  2022. X
  2023. X
  2024. X/*
  2025. X * Response codes for NNTP server
  2026. X *
  2027. X * @(#)nntp.h    1.7    (Berkeley) 1/11/88
  2028. X *
  2029. X * First digit:
  2030. X *
  2031. X *    1xx    Informative message
  2032. X *    2xx    Command ok
  2033. X *    3xx    Command ok so far, continue
  2034. X *    4xx    Command was correct, but couldn't be performed
  2035. X *        for some specified reason.
  2036. X *    5xx    Command unimplemented, incorrect, or a
  2037. X *        program error has occured.
  2038. X *
  2039. X * Second digit:
  2040. X *
  2041. X *    x0x    Connection, setup, miscellaneous
  2042. X *    x1x    Newsgroup selection
  2043. X *    x2x    Article selection
  2044. X *    x3x    Distribution
  2045. X *    x4x    Posting
  2046. X */
  2047. X
  2048. X#define    CHAR_INF    '1'
  2049. X#define    CHAR_OK        '2'
  2050. X#define    CHAR_CONT    '3'
  2051. X#define    CHAR_ERR    '4'
  2052. X#define    CHAR_FATAL    '5'
  2053. X
  2054. X#define    INF_HELP    100    /* Help text on way */
  2055. X#define    INF_DEBUG    199    /* Debug output */
  2056. X
  2057. X#define    OK_CANPOST    200    /* Hello; you can post */
  2058. X#define    OK_NOPOST    201    /* Hello; you can't post */
  2059. X#define    OK_SLAVE    202    /* Slave status noted */
  2060. X#define    OK_GOODBYE    205    /* Closing connection */
  2061. X#define    OK_GROUP    211    /* Group selected */
  2062. X#define    OK_GROUPS    215    /* Newsgroups follow */
  2063. X
  2064. X#define OK_TASSINDEX    218    /* Tass index follows */
  2065. X
  2066. X#define    OK_ARTICLE    220    /* Article (head & body) follows */
  2067. X#define    OK_HEAD        221    /* Head follows */
  2068. X#define    OK_BODY        222    /* Body follows */
  2069. X#define    OK_NOTEXT    223    /* No text sent -- stat, next, last */
  2070. X#define    OK_NEWNEWS    230    /* New articles by message-id follow */
  2071. X#define    OK_NEWGROUPS    231    /* New newsgroups follow */
  2072. X#define    OK_XFERED    235    /* Article transferred successfully */
  2073. X#define    OK_POSTED    240    /* Article posted successfully */
  2074. X
  2075. X#define CONT_XFER    335    /* Continue to send article */
  2076. X#define    CONT_POST    340    /* Continue to post article */
  2077. X
  2078. X#define    ERR_GOODBYE    400    /* Have to hang up for some reason */
  2079. X#define    ERR_NOGROUP    411    /* No such newsgroup */
  2080. X#define    ERR_NCING    412    /* Not currently in newsgroup */
  2081. X
  2082. X#define ERR_NOTASS    418    /* No tin index for this group */
  2083. X
  2084. X#define    ERR_NOCRNT    420    /* No current article selected */
  2085. X#define    ERR_NONEXT    421    /* No next article in this group */
  2086. X#define    ERR_NOPREV    422    /* No previous article in this group */
  2087. X#define    ERR_NOARTIG    423    /* No such article in this group */
  2088. X#define ERR_NOART    430    /* No such article at all */
  2089. X#define ERR_GOTIT    435    /* Already got that article, don't send */
  2090. X#define ERR_XFERFAIL    436    /* Transfer failed */
  2091. X#define    ERR_XFERRJCT    437    /* Article rejected, don't resend */
  2092. X#define    ERR_NOPOST    440    /* Posting not allowed */
  2093. X#define    ERR_POSTFAIL    441    /* Posting failed */
  2094. X
  2095. X#define    ERR_COMMAND    500    /* Command not recognized */
  2096. X#define    ERR_CMDSYN    501    /* Command syntax error */
  2097. X#define    ERR_ACCESS    502    /* Access to server denied */
  2098. X#define ERR_FAULT    503    /* Program fault, command not performed */
  2099. X
  2100. X/* RFC 977 defines this; don't change it. */
  2101. X
  2102. X#define    NNTP_STRLEN    512
  2103. SHAR_EOF
  2104. $TOUCH -am 0923175591 nntp.h &&
  2105. chmod 0600 nntp.h ||
  2106. echo "restore of nntp.h failed"
  2107. set `wc -c nntp.h`;Wc_c=$1
  2108. if test "$Wc_c" != "3688"; then
  2109.     echo original size 3688, current size $Wc_c
  2110. fi
  2111. # ============= proto.h ==============
  2112. echo "x - extracting proto.h (Text)"
  2113. sed 's/^X//' << 'SHAR_EOF' > proto.h &&
  2114. X#ifdef __STDC__
  2115. X/* art.c */
  2116. Xlong my_atol(char *s, int n);
  2117. Xvoid find_base(void);
  2118. Xint num_of_arts(void);
  2119. Xint valid_artnum(long art);
  2120. Xint purge_needed(void);
  2121. Xvoid index_group(char *group, char *group_path);
  2122. Xint read_group(char *group, char *group_path);
  2123. Xvoid make_threads(int rethread);
  2124. Xchar *eat_re(char *s);
  2125. Xlong hash_s(char *s);
  2126. Xint parse_headers(int fd, struct header *h);
  2127. Xvoid dump_index(char *group, int killed);
  2128. Xvoid my_strncpy(char *p, char *q, int n);
  2129. Xint load_index(void);
  2130. Xvoid find_local_index(char *group);
  2131. Xvoid do_update(void);
  2132. Xvoid save_any_news(void);
  2133. Xvoid reload_index_file(char *group, int killed);
  2134. Xchar *parse_date(char *date, char *str);
  2135. Xint artnum_comp(char *p1, char *p2);
  2136. SHAR_EOF
  2137. echo "End of tin1.02 part 8"
  2138. echo "File proto.h is continued in part 9"
  2139. echo "9" > shar3_seq_.tmp
  2140. exit 0
  2141.  
  2142. exit 0 # Just in case...
  2143. -- 
  2144. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  2145. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  2146. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  2147. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  2148.