home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / misc / volume31 / tin / part07 < prev    next >
Encoding:
Text File  |  1992-07-07  |  53.8 KB  |  1,777 lines

  1. Newsgroups: comp.sources.misc
  2. From: iain%anl433.uucp@Germany.EU.net (Iain Lea)
  3. Subject:  v31i007:  tin - threaded full screen newsreader v1.1 PL4, Part07/15
  4. Message-ID: <1992Jul7.181655.7489@sparky.imd.sterling.com>
  5. X-Md4-Signature: 199428a450d4ac8b840e05bce76b730b
  6. Date: Tue, 7 Jul 1992 18:16:55 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: iain%anl433.uucp@Germany.EU.net (Iain Lea)
  10. Posting-number: Volume 31, Issue 7
  11. Archive-name: tin/part07
  12. Environment: BSD, SCO, ISC, SUNOS, SYSVR3, SYSVR4, ULTRIX, XENIX
  13. Supersedes: tin: Volume 30, Issue 1-14
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then feed it
  17. # into a shell via "sh file" or similar.  To overwrite existing files,
  18. # type "sh file -c".
  19. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  20. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  21. # Contents:  page.c proto.h
  22. # Wrapped by kent@sparky on Mon Jun 29 23:35:12 1992
  23. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  24. echo If this archive is complete, you will see the following message:
  25. echo '          "shar: End of archive 7 (of 15)."'
  26. if test -f 'page.c' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'page.c'\"
  28. else
  29.   echo shar: Extracting \"'page.c'\" \(22481 characters\)
  30.   sed "s/^X//" >'page.c' <<'END_OF_FILE'
  31. X/*
  32. X *  Project   : tin - a threaded Netnews reader
  33. X *  Module    : page.c
  34. X *  Author    : I.Lea & R.Skrenta
  35. X *  Created   : 01-04-91
  36. X *  Updated   : 20-06-92
  37. X *  Notes     :
  38. X *  Copyright : (c) Copyright 1991-92 by Iain Lea & Rich Skrenta
  39. X *              You may  freely  copy or  redistribute  this software,
  40. X *              so  long as there is no profit made from its use, sale
  41. X *              trade or  reproduction.  You may not change this copy-
  42. X *              right notice, and it must be included in any copy made
  43. X */
  44. X
  45. X#include    "tin.h"
  46. X
  47. Xextern int cur_groupnum;
  48. X
  49. Xchar note_h_path[LEN];            /* Path:    */
  50. Xchar note_h_date[LEN];            /* Date:    */
  51. Xchar note_h_subj[LEN];            /* Subject:    */
  52. Xchar note_h_org[LEN];            /* Organization: */
  53. Xchar note_h_newsgroups[LEN];        /* Newsgroups:    */
  54. Xchar note_h_messageid[LEN];        /* Message-ID:    */
  55. Xchar note_h_distrib[LEN];        /* Distribution: */
  56. Xchar note_h_followup[LEN];        /* Followup-To: */
  57. X
  58. Xchar *glob_page_group;
  59. X
  60. XFILE *note_fp;                    /* the body of the current article */
  61. X
  62. Xint glob_respnum;
  63. Xint last_resp;                    /* current & previous article for - command */
  64. Xint note_end;                    /* we're done showing this article */
  65. Xint note_line;
  66. Xint note_page;                    /* what page we're on */
  67. Xint rotate;                        /* 0=normal, 13=rot13 decode */
  68. Xint this_resp;
  69. X
  70. Xlong note_mark[MAX_PAGES];        /* ftells on beginnings of pages */
  71. Xlong note_size;                    /* stat size in bytes of article */
  72. X
  73. X
  74. Xint show_page (respnum, threadnum, group, group_path)
  75. X    int respnum;
  76. X    int *threadnum;        /* to allow movement in thread mode */
  77. X    char *group;
  78. X    char *group_path;
  79. X{
  80. X#ifndef INDEX_DAEMON
  81. X
  82. X    char ch;
  83. X    int i, n = 0;
  84. X    int copy_text;
  85. X    int kill_state = NO_KILLING;
  86. X    int old_sort_art_type = sort_art_type;
  87. X    int old_top;
  88. X    int posted;
  89. X    int ret_code;
  90. X    long old_artnum;
  91. X    long art;
  92. X
  93. Xrestart:
  94. X
  95. X    glob_respnum = respnum;
  96. X    glob_page_group = group;
  97. X
  98. X    set_signals_page ();
  99. X    
  100. X    if (respnum != this_resp) {       /* remember current & previous */
  101. X        last_resp = this_resp;       /* articles for - command */
  102. X        this_resp = respnum;
  103. X    }
  104. X
  105. X    rotate = 0;            /* normal mode, not rot13 */
  106. X    art = arts[respnum].artnum;
  107. X    arts[respnum].unread = ART_READ;    /* mark article as read */
  108. X
  109. X    if ((note_page = art_open (art, group_path)) == ART_UNAVAILABLE) {
  110. X        sprintf (msg, txt_art_unavailable, art);
  111. X        error_message (msg, "");
  112. X        return (which_thread (respnum));
  113. X    } else {
  114. X        show_note_page (respnum, group);
  115. X    }
  116. X
  117. X    while (TRUE) {
  118. X        ch = (char) ReadCh();
  119. X
  120. X        if (ch >= '0' && ch <= '9') {
  121. X            n = prompt_response (ch, respnum);
  122. X            if (n != -1) {
  123. X                respnum = n;
  124. X                goto restart;
  125. X            }
  126. X            continue;
  127. X        }
  128. X        switch (ch) {
  129. X            case ESC:
  130. X                switch (get_arrow_key ()) {
  131. X                    case KEYMAP_PAGE_UP:
  132. X                        goto page_up;
  133. X
  134. X                    case KEYMAP_PAGE_DOWN:
  135. X                        goto page_down;
  136. X
  137. X                    case KEYMAP_HOME:
  138. X                        goto begin_of_article;
  139. X
  140. X                    case KEYMAP_END:
  141. X                        goto end_of_article;
  142. X                }
  143. X                break;
  144. X
  145. X#ifndef NO_SHELL_ESCAPE
  146. X            case '!':
  147. X                shell_escape ();
  148. X                redraw_page (respnum, group);
  149. X                break;
  150. X#endif
  151. X
  152. X            case '$':    /* goto end of article */
  153. X            case 'G':    /* 'less' compatible */
  154. Xend_of_article:            
  155. X                if (show_last_page ()) {
  156. X                    show_note_page (respnum, group);
  157. X                }
  158. X                break;
  159. X
  160. X            case '-':    /* show last viewed article */
  161. X                if (last_resp < 0) {
  162. X                    info_message (txt_no_last_message);
  163. X                    break;
  164. X                }
  165. X                art_close ();
  166. X                respnum = last_resp;
  167. X                goto restart;
  168. X
  169. X            case '|':    /* pipe article/thread/tagged arts to command */
  170. X                feed_articles (FEED_PIPE, PAGE_LEVEL, "Pipe", respnum, group_path);
  171. X                break;
  172. X
  173. X            case '/':    /* search forwards in article */
  174. X                if (search_article (TRUE)) {
  175. X                    show_note_page (respnum, group);
  176. X                }
  177. X                break;
  178. X
  179. X            case '<':    /* goto first article in current thread */
  180. X                if (arts[respnum].inthread) {
  181. X                    n = which_thread (respnum);
  182. X                    if (n >= 0 && base[n] != respnum) {
  183. X                        assert (n < top_base);
  184. X                        respnum = base[n];
  185. X                        art_close ();
  186. X                        goto restart;
  187. X                    }
  188. X                }
  189. X                break;
  190. X
  191. X            case '>':    /* goto last article in current thread */
  192. X                for (i = respnum; i >= 0; i = arts[i].thread) {
  193. X                    n = i;
  194. X                }
  195. X                if (n != respnum) {
  196. X                    respnum = n;
  197. X                    art_close ();
  198. X                    goto restart;
  199. X                }
  200. X                break;
  201. X
  202. X            case ' ':        /* page down or next response */
  203. X            case ctrl('D'):
  204. X            case ctrl('F'):        /* vi style */
  205. Xpage_down:
  206. X                if (note_page == ART_UNAVAILABLE) {
  207. X                    n = next_response (respnum);
  208. X                    if (n == -1) {
  209. X                        return (which_thread (respnum));
  210. X                    }
  211. X                    respnum = n;
  212. X                    goto restart;
  213. X                } else if (note_end) {
  214. X                    art_close ();
  215. X                    n = next_response (respnum);
  216. X                    if (n == -1) {
  217. X                        return (which_thread (respnum));
  218. X                    }
  219. X                    respnum = n;
  220. X                    goto restart;
  221. X                } else
  222. X                    show_note_page (respnum, group);
  223. X                break;
  224. X
  225. X            case '\r':
  226. X            case '\n':    /* go to start of next thread */
  227. X                art_close ();
  228. X                n = next_thread (respnum);
  229. X                if (n == -1)
  230. X                    return (which_thread (respnum));
  231. X                respnum = n;
  232. X                goto restart;
  233. X
  234. X            case '\t':     /* goto next unread article */
  235. X#ifndef TAB_GOTO_NEXT_UNREAD
  236. X                if (note_page == ART_UNAVAILABLE) {
  237. X                    n = next_unread (next_response (respnum));
  238. X                    if (n == -1) {
  239. X                        return (which_thread (respnum));
  240. X                    }
  241. X                    respnum = n;
  242. X                    goto restart;
  243. X                } else if (note_end) {
  244. X                    art_close ();
  245. X                    n = next_unread (next_response (respnum));
  246. X                    if (n == -1) {
  247. X                        return (which_thread (respnum));
  248. X                    }
  249. X                    respnum = n;
  250. X                    goto restart;
  251. X                } else {
  252. X                    show_note_page (respnum, group);
  253. X                }    
  254. X#else
  255. X                if (note_page != ART_UNAVAILABLE) {
  256. X                    art_close();
  257. X                }
  258. X                n = next_unread (next_response (respnum));
  259. X                if (n == -1) {
  260. X                    return (which_thread (respnum));
  261. X                }
  262. X                respnum = n;
  263. X                goto restart;
  264. X#endif
  265. X                break;
  266. X
  267. X            case ctrl('H'):    /* show article headers */
  268. X                if (note_page == ART_UNAVAILABLE) {
  269. X                    n = next_response (respnum);
  270. X                    if (n == -1)
  271. X                        return (which_thread (respnum));
  272. X                    respnum = n;
  273. X                    goto restart;
  274. X                } else {
  275. X                    note_page = 0;
  276. X                    note_end = FALSE;
  277. X                    fseek(note_fp, 0L, 0);
  278. X                    show_note_page(respnum, group);
  279. X                }
  280. X                break;
  281. X
  282. X            case ctrl('K'):        /* kill article */
  283. X                if (kill_art_menu (group, respnum)) {
  284. X                    i = which_thread (respnum);
  285. X                    if (kill_any_articles (group)) {
  286. X                        make_threads (FALSE);
  287. X                        find_base (show_only_unread);
  288. X                        if (i >= top_base)
  289. X                            i = top_base - 1;
  290. X                        respnum = base[i];    
  291. X                    }
  292. X                }
  293. X                redraw_page (respnum, group);
  294. X                break;
  295. X
  296. X            case ctrl('L'):        /* redraw current page of article */
  297. X                redraw_page (respnum, group);
  298. X                break;
  299. X
  300. X            case ctrl('R'):        /* redraw beginning of article */
  301. X            case 'g':            /* 'less' compatible */
  302. Xbegin_of_article:            
  303. X                if (note_page == ART_UNAVAILABLE) {
  304. X                    ClearScreen ();
  305. X                    printf (txt_art_unavailable, arts[respnum].artnum);
  306. X                    fflush (stdout);
  307. X                } else {
  308. X                    note_page = 0;
  309. X                    note_end = FALSE;
  310. X                    fseek (note_fp, note_mark[0], 0);
  311. X                    show_note_page (respnum, group);
  312. X                }
  313. X                break;
  314. X
  315. X            case ctrl('X'):
  316. X            case '%':
  317. X            case 'd':    /* toggle rot-13 mode */
  318. X                if (rotate)
  319. X                    rotate = 0;
  320. X                else
  321. X                    rotate = 13;
  322. X                redraw_page (respnum, group);
  323. X                info_message (txt_toggled_rot13);
  324. X                break;
  325. X
  326. X            case 'a':    /* author search forward */
  327. X            case 'A':    /* author search backward */
  328. X                i = (ch == 'a');
  329. X                n = search_author (show_only_unread, respnum, i);
  330. X                if (n < 0)
  331. X                    break;
  332. X                respnum = n;
  333. X                goto restart;
  334. X                /* NOTREACHED */
  335. X
  336. X            case 'b':        /* page up */
  337. X            case ctrl('U'):
  338. X            case ctrl('B'):        /* vi style */
  339. Xpage_up:
  340. X                if (note_page == ART_UNAVAILABLE) {
  341. X                    art_close ();
  342. X                    n = prev_response (respnum);
  343. X                    if (n == -1)
  344. X                        return (which_response (respnum));
  345. X                    respnum = n;
  346. X                    goto restart;
  347. X
  348. X                } else {
  349. X                    if (note_page <= 1) {
  350. X                        info_message (txt_begin_of_art);
  351. X                    } else {
  352. X                        note_page -= 2;
  353. X                        note_end = FALSE;
  354. X                        fseek (note_fp, note_mark[note_page], 0);
  355. X                        show_note_page (respnum, group);
  356. X                    }
  357. X                }
  358. X                break;
  359. X
  360. X            case 'B':    /* bug/gripe/comment mailed to author */
  361. X                mail_bug_report ();
  362. X                redraw_page (respnum, group);
  363. X                break;
  364. X                
  365. X            case 'c':    /* catchup--mark all articles as read */
  366. X                if (!confirm_action || prompt_yn (LINES, txt_mark_all_read, 'y')) {
  367. X                    for (n = 0; n < top; n++) {
  368. X                        arts[n].unread = ART_READ;
  369. X                    }
  370. X                    fix_new_highest (cur_groupnum);
  371. X                    if (cur_groupnum + 1 < group_top) {
  372. X                        cur_groupnum++;
  373. X                    }
  374. X                    art_close ();
  375. X                    return -1;
  376. X                }
  377. X                break;
  378. X
  379. X            case 'C':    /* cancel an article */
  380. X                if (cancel_article (group, respnum)) {
  381. X                    redraw_page (respnum, group);
  382. X                }
  383. X                break;
  384. X    
  385. X            case 'f':    /* post a followup to this article */
  386. X            case 'F':
  387. X                if (! can_post) {
  388. X                    info_message (txt_cannot_post);
  389. X                    break;
  390. X                }
  391. X                copy_text = (ch == 'f' ? FALSE : TRUE);
  392. X                ret_code = post_response (group, respnum, copy_text);
  393. X                redraw_page (respnum, group);
  394. X                break;
  395. X
  396. X            case 'h':    /* help */
  397. X                show_info_page (HELP_INFO, help_page, txt_art_pager_com);
  398. X                redraw_page (respnum, group);
  399. X                break;
  400. X
  401. X            case 'q':    /* return to index page */
  402. Xreturn_to_index:
  403. X                art_close ();
  404. X                if (kill_state == NO_KILLING &&
  405. X                    sort_art_type != old_sort_art_type) {
  406. X                    make_threads (TRUE);
  407. X                    find_base (show_only_unread);
  408. X                }
  409. X                i = which_thread (respnum);
  410. X                *threadnum = which_response (respnum);
  411. X                if (kill_state == KILLING) {
  412. X                    old_top = top;
  413. X                    old_artnum = arts[respnum].artnum;
  414. X                    kill_any_articles (group);
  415. X                    make_threads (FALSE);
  416. X                    find_base (show_only_unread);
  417. X                    i = find_new_pos (old_top, old_artnum, i);
  418. X                }
  419. X                return (i);
  420. X
  421. X            case 'I':    /* toggle inverse video */
  422. X                toggle_inverse_video ();
  423. X                redraw_page (respnum, group);
  424. X                break;
  425. X
  426. X            case 'k':
  427. X                if (note_page == ART_UNAVAILABLE) {
  428. X                    n = next_unread (next_response(respnum));
  429. X                    if (n == -1)
  430. X                        return (which_thread (respnum));
  431. X                } else {
  432. X                    art_close ();
  433. X                    n = next_unread (next_response (respnum));
  434. X                    if (n == -1)
  435. X                        return (which_thread (respnum));
  436. X                }
  437. X                respnum = n;
  438. X                goto restart;
  439. X                /* NOTREACHED */
  440. X
  441. X            case 'K':    /* mark rest of thread as read */
  442. X                for (n = respnum; n >= 0; n = arts[n].thread)
  443. X                    arts[n].unread = ART_READ;
  444. X                n = next_unread (next_response (respnum));
  445. X                if (n == -1)
  446. X                    goto return_to_index;
  447. X                art_close ();
  448. X                respnum = n;
  449. X                goto restart;
  450. X                /* NOTREACHED */
  451. X
  452. X            case 'm':    /* mail article/thread/tagged articles to somebody */
  453. X                feed_articles (FEED_MAIL, PAGE_LEVEL, "Mail", respnum, group_path);
  454. X                break;
  455. X
  456. X            case 'M':    /* options menu */
  457. X                if (change_rcfile (group, FALSE) == KILLING) {
  458. X                    kill_state = KILLING;
  459. X                } 
  460. X                redraw_page (respnum, group);
  461. X                break;
  462. X
  463. X            case 'n':    /* skip to next article */
  464. X                art_close ();
  465. X                n = next_response (respnum);
  466. X                if (n == -1)
  467. X                    return (which_thread(respnum));
  468. X                respnum = n;
  469. X                goto restart;
  470. X                /* NOTREACHED */
  471. X                
  472. X            case 'N':    /* next unread article */
  473. X                n = next_unread (next_response (respnum));
  474. X                if (n == -1)
  475. X                    info_message (txt_no_next_unread_art);
  476. X                else {
  477. X                    art_close ();
  478. X                    respnum = n;
  479. X                    goto restart;
  480. X                }
  481. X                break;
  482. X
  483. X            case 'o':    /* output art/thread/tagged arts to printer */
  484. X                feed_articles (FEED_PRINT, PAGE_LEVEL, "Print", respnum, group_path);
  485. X                break;
  486. X
  487. X            case 'p':    /* previous article */
  488. X                art_close ();
  489. X                n = prev_response (respnum);
  490. X                if (n == -1)
  491. X                    return (which_response (respnum));
  492. X                respnum = n;
  493. X                goto restart;
  494. X
  495. X            case 'P':    /* previous unread article */
  496. X                n = prev_unread (prev_response (respnum));
  497. X                if (n == -1)
  498. X                    info_message (txt_no_prev_unread_art);
  499. X                else {
  500. X                    art_close ();
  501. X                    respnum = n;
  502. X                    goto restart;
  503. X                }
  504. X                break;
  505. X
  506. X            case 'Q':    /* quit */
  507. X                return -2;
  508. X                break;
  509. X    
  510. X            case 'r':    /* reply to author through mail */
  511. X            case 'R':
  512. X                copy_text = (ch == 'r' ? FALSE : TRUE);
  513. X                mail_to_author (group, respnum, copy_text);
  514. X                redraw_page (respnum, group);
  515. X                break;
  516. X
  517. X            case 's':    /* save article/thread/tagged articles */
  518. X                feed_articles (FEED_SAVE, PAGE_LEVEL, "Save", respnum, group_path);
  519. X                break;
  520. X
  521. X            case 't':    /* return to group selection page */
  522. X                art_close ();
  523. X                if (kill_state == KILLING) {
  524. X                    kill_any_articles (group);
  525. X                    make_threads (FALSE);
  526. X                    find_base (show_only_unread);
  527. X                }
  528. X                update_newsrc (group, my_group[cur_groupnum], FALSE);
  529. X                fix_new_highest (cur_groupnum);
  530. X                return -1;
  531. X
  532. X            case 'T':    /* tag/untag article for saving */
  533. X                if (arts[respnum].tagged) {
  534. X                    arts[respnum].tagged = 0;
  535. X                    info_message (txt_untagged_art);
  536. X                } else {
  537. X                    arts[respnum].tagged = ++num_of_tagged_arts;
  538. X                    info_message (txt_tagged_art);
  539. X                }
  540. X                break;
  541. X
  542. X            case 'v':
  543. X                info_message (cvers);
  544. X                break;
  545. X
  546. X            case 'w':    /* post a basenote */
  547. X                if (! can_post) {
  548. X                    info_message (txt_cannot_post);
  549. X                    break;
  550. X                }
  551. X                if (post_base (group, &posted)) {
  552. X                    redraw_page (respnum, group);
  553. X                }
  554. X                break;
  555. X
  556. X            case 'W':    /* display messages posted by user */
  557. X                if (user_posted_messages ()) {
  558. X                    redraw_page (respnum, group);
  559. X                }
  560. X                break;
  561. X
  562. X            case 'x':    /* crosspost current article */
  563. X                feed_articles (FEED_XPOST, PAGE_LEVEL, "Crosspost", respnum, group_path);
  564. X                break;
  565. X
  566. X            case 'z':    /* mark article as unread (to return) */
  567. X                arts[respnum].unread = ART_WILL_RETURN;
  568. X                info_message (txt_art_marked_as_unread);
  569. X                break;
  570. X
  571. X            default:
  572. X                info_message(txt_bad_command);
  573. X        }
  574. X    }
  575. X
  576. X#endif /* INDEX_DAEMON */
  577. X}
  578. X
  579. X
  580. Xvoid redraw_page (respnum, group)
  581. X    int respnum;
  582. X    char *group;
  583. X{
  584. X    if (note_page == ART_UNAVAILABLE) {
  585. X        ClearScreen ();
  586. X        printf (txt_art_unavailable, arts[respnum].artnum);
  587. X        fflush (stdout);
  588. X    } else if (note_page > 0) {
  589. X        note_page--;
  590. X        fseek (note_fp, note_mark[note_page], 0);
  591. X        show_note_page (respnum, group);
  592. X    }
  593. X}
  594. X
  595. X
  596. Xvoid show_note_page (respnum, group)
  597. X    int respnum;
  598. X    char *group;
  599. X{
  600. X#ifndef INDEX_DAEMON
  601. X
  602. X    char buf[LEN];
  603. X    char buf2[LEN+50];
  604. X    char *p, *q;
  605. X    int i, j;
  606. X    int ctrl_L;        /* form feed character detected */
  607. X    long tmp_pos;
  608. X
  609. X    ClearScreen ();
  610. X
  611. X    note_line = 1;
  612. X
  613. X    if (note_size == 0L) {
  614. X        tmp_pos = ftell (note_fp);
  615. X        fseek (note_fp, 0L, 2);            /* goto end of article */
  616. X        note_size = ftell (note_fp);
  617. X        fseek (note_fp, tmp_pos, 0);    /* goto old position */
  618. X    }
  619. X    
  620. X    if (note_page == 0)
  621. X        show_first_header (respnum, group);
  622. X    else
  623. X        show_cont_header (respnum);
  624. X
  625. X    ctrl_L = FALSE;
  626. X    while (note_line < LINES) {
  627. X        if (fgets (buf, sizeof (buf), note_fp) == NULL) {
  628. X            note_end = TRUE;
  629. X            break;
  630. X        }
  631. X
  632. X        buf[LEN-1] = '\0';
  633. X        if (rotate)
  634. X            for (p = buf, q = buf2; *p && *p != '\n' && q < &buf2[LEN]; p++) {
  635. X                if (*p == '\b' && q > buf2) {
  636. X                    q--;
  637. X                } else if (*p == 12) {        /* ^L */
  638. X                    *q++ = '^';
  639. X                    *q++ = 'L';
  640. X                    ctrl_L = TRUE;
  641. X                } else if (*p == '\t') {
  642. X                    i = q - buf2;
  643. X                    j = (i|7) + 1;
  644. X
  645. X                    while (i++ < j)
  646. X                        *q++ = ' ';
  647. X                } else if (((*p) & 0xFF) < ' ') {
  648. X                    *q++ = '^';
  649. X                    *q++ = ((*p) & 0xFF) + '@';
  650. X                } else if (*p >= 'A' && *p <= 'Z')
  651. X                    *q++ = 'A' + (*p - 'A' + rotate) % 26;
  652. X                else if (*p >= 'a' && *p <= 'z')
  653. X                    *q++ = 'a' + (*p - 'a' + rotate) % 26;
  654. X                else
  655. X                    *q++ = *p;
  656. X            }
  657. X        else
  658. X            for (p = buf, q = buf2; *p && *p != '\n' && q < &buf2[LEN]; p++) {
  659. X                if (*p == '\b' && q > buf2) {
  660. X                    q--;
  661. X                } else if (*p == 12) {        /* ^L */
  662. X                    *q++ = '^';
  663. X                    *q++ = 'L';
  664. X                    ctrl_L = TRUE;
  665. X                } else if (*p == '\t') {
  666. X                    i = q - buf2;
  667. X                    j = (i|7) + 1;
  668. X
  669. X                    while (i++ < j)
  670. X                        *q++ = ' ';
  671. X                } else if (((*p) & 0xFF) < ' ') {
  672. X                    *q++ = '^';
  673. X                    *q++ = ((*p) & 0xFF) + '@';
  674. X                } else
  675. X                    *q++ = *p;
  676. X            }
  677. X
  678. X        *q = '\0';
  679. X
  680. X        printf("%s\r\n", buf2);
  681. X
  682. X        note_line += ((int) strlen (buf2) / COLS) + 1;
  683. X
  684. X        if (ctrl_L) {
  685. X            break;
  686. X        }
  687. X    }
  688. X
  689. X    note_mark[++note_page] = ftell (note_fp);
  690. X
  691. X    if (note_mark[note_page] == note_size) {
  692. X        note_end = TRUE;
  693. X    }
  694. X
  695. X    if (note_end) {
  696. X        MoveCursor (LINES, MORE_POS-(5+BLANK_PAGE_COLS));
  697. X        StartInverse ();    
  698. X        if (arts[respnum].thread != -1) {
  699. X            fputs (txt_next_resp, stdout);
  700. X            fflush (stdout);
  701. X        } else {
  702. X            fputs (txt_last_resp, stdout);
  703. X            fflush (stdout);
  704. X        }
  705. X        EndInverse ();
  706. X    } else {
  707. X        if (note_size > 0) {
  708. X            draw_percent_mark ((int) note_mark[note_page], (int) note_size);
  709. X        } else {
  710. X            MoveCursor (LINES, MORE_POS-BLANK_PAGE_COLS);
  711. X            StartInverse ();    
  712. X            fputs (txt_more, stdout);
  713. X            fflush (stdout);
  714. X            EndInverse ();
  715. X        }
  716. X    }
  717. X    MoveCursor (LINES, 0);
  718. X
  719. X#endif /* INDEX_DAEMON */
  720. X}
  721. X
  722. X
  723. Xvoid show_first_header (respnum, group)
  724. X    int respnum;
  725. X    char *group;
  726. X{
  727. X    int whichresp;
  728. X    int x_resp;
  729. X    char buf[LEN];
  730. X    char tmp[LEN];
  731. X    int pos, i;
  732. X    int n;
  733. X
  734. X    whichresp = which_response (respnum);
  735. X    x_resp = num_of_responses (which_thread (respnum));
  736. X
  737. X    ClearScreen ();
  738. X
  739. X    strcpy (buf, note_h_date);
  740. X    pos = (COLS - (int) strlen (group)) / 2;
  741. X    for (i = strlen(buf); i < pos; i++)
  742. X        buf[i] = ' ';
  743. X    buf[i] = '\0';
  744. X
  745. X    strcat (buf, group);
  746. X
  747. X    for (i = strlen(buf); i < RIGHT_POS ; i++)
  748. X        buf[i] = ' ';
  749. X    buf[i] = '\0';
  750. X
  751. X    printf (txt_thread_x_of_n, buf, which_thread (respnum) + 1, top_base);
  752. X
  753. X    sprintf (buf, txt_art, arts[respnum].artnum);
  754. X    n = strlen (buf);
  755. X    fputs (buf, stdout);
  756. X
  757. X    strcpy (buf, note_h_subj);
  758. X    buf[RIGHT_POS - 5 - n] = '\0';
  759. X
  760. X    pos = ((COLS - (int) strlen (buf)) / 2) - 2;
  761. X
  762. X    if (pos > n) {
  763. X        MoveCursor (1, pos);
  764. X    } else {
  765. X        MoveCursor (1, n);
  766. X    }
  767. X
  768. X    StartInverse ();
  769. X    fputs (buf, stdout);
  770. X    EndInverse ();
  771. X
  772. X    MoveCursor (1, RIGHT_POS);
  773. X    if (whichresp)
  774. X        printf (txt_resp_x_of_n, whichresp, x_resp);
  775. X    else {
  776. X        if (x_resp == 0)
  777. X            fputs (txt_no_resp, stdout);
  778. X        else if (x_resp == 1)
  779. X            fputs (txt_1_resp, stdout);
  780. X        else
  781. X            printf (txt_x_resp, x_resp);
  782. X    }
  783. X
  784. X    if (*note_h_org) {
  785. X        if (strcmp (arts[respnum].from, arts[respnum].name) == 0) {
  786. X            strcpy (tmp, note_h_org);
  787. X        } else {
  788. X            sprintf (tmp, txt_s_at_s, arts[respnum].name, note_h_org);
  789. X        }
  790. X    } else {
  791. X        strcpy (tmp, arts[respnum].name);
  792. X    }
  793. X
  794. X    tmp[LEN-1] = '\0';
  795. X
  796. X    sprintf (buf, "%s  ", arts[respnum].from);
  797. X
  798. X    pos = COLS - 1 - (int) strlen(tmp);
  799. X    if ((int) strlen (buf) + (int) strlen (tmp) >= COLS - 1) {
  800. X        strncat (buf, tmp, COLS - 1 - (int) strlen(buf));
  801. X        buf[COLS-1] = '\0';
  802. X    } else {
  803. X        for (i = strlen(buf); i < pos; i++)
  804. X            buf[i] = ' ';
  805. X        buf[i] = '\0';
  806. X        strcat (buf, tmp);
  807. X    }
  808. X    printf ("%s\r\n\r\n", buf);
  809. X
  810. X    note_line += 4;
  811. X}
  812. X
  813. X
  814. Xvoid show_cont_header (respnum)
  815. X    int respnum;
  816. X{
  817. X    int whichresp;
  818. X    int whichbase;
  819. X    char buf[LEN];
  820. X
  821. X    whichresp = which_response (respnum);
  822. X    whichbase = which_thread (respnum);
  823. X
  824. X    assert (whichbase < top_base);
  825. X
  826. X    if (whichresp)
  827. X        sprintf(buf, txt_thread_resp_page,
  828. X            whichbase + 1,
  829. X            top_base,
  830. X            whichresp,
  831. X            note_page + 1,
  832. X            note_h_subj);
  833. X    else
  834. X        sprintf(buf, txt_thread_page,
  835. X            whichbase + 1,
  836. X            top_base,
  837. X            note_page + 1,
  838. X            note_h_subj);
  839. X
  840. X    buf[COLS-1] = '\0';
  841. X    printf("%s\r\n\r\n", buf);
  842. X
  843. X    note_line += 2;
  844. X}
  845. X
  846. X
  847. Xint art_open (art, group_path)
  848. X    long art;
  849. X    char *group_path;
  850. X{
  851. X    char buf[1025];
  852. X    char *p;
  853. X
  854. X    note_page = 0;
  855. X
  856. X    art_close ();    /* just in case */
  857. X
  858. X    if ((note_fp = open_art_fp (group_path, art)) == NULL) {
  859. X        return (ART_UNAVAILABLE);
  860. X    }
  861. X
  862. X    note_h_path[0] = '\0';
  863. X    note_h_subj[0] = '\0';
  864. X    note_h_org[0] = '\0';
  865. X    note_h_date[0] = '\0';
  866. X    note_h_newsgroups[0] = '\0';
  867. X    note_h_messageid[0] = '\0';
  868. X    note_h_distrib[0] = '\0';
  869. X    note_h_followup[0] = '\0';
  870. X
  871. X    while (fgets(buf, sizeof buf, note_fp) != NULL) {
  872. X        buf[1024] = '\0';
  873. X
  874. X        for (p=buf ; *p && *p != '\n' ; p++) {
  875. X            if (((*p) & 0xFF) < ' ')
  876. X                *p = ' ';
  877. X        }
  878. X        *p = '\0';
  879. X        
  880. X        if (*buf == '\0')
  881. X            break;
  882. X
  883. X          if (match_header (buf, "Path", note_h_path, LEN))
  884. X              continue;
  885. X          if (match_header (buf, "Subject", note_h_subj, LEN))
  886. X              continue;
  887. X          if (match_header (buf, "Organization", note_h_org, LEN))
  888. X              continue;
  889. X          if (match_header (buf, "Date", note_h_date, LEN))
  890. X              continue;
  891. X          if (match_header (buf, "Newsgroups", note_h_newsgroups, LEN))
  892. X              continue;
  893. X          if (match_header (buf, "Message-ID", note_h_messageid, LEN))
  894. X              continue;
  895. X          if (match_header (buf, "Message-Id", note_h_messageid, LEN))
  896. X              continue;
  897. X          if (match_header (buf, "Distribution", note_h_distrib, LEN))
  898. X              continue;
  899. X          if (match_header (buf, "Followup-To", note_h_followup, LEN))
  900. X              continue;
  901. X    }
  902. X
  903. X    note_mark[0] = ftell (note_fp);
  904. X    note_end = FALSE;
  905. X
  906. X    return (0);
  907. X}
  908. X
  909. X
  910. Xvoid art_close ()
  911. X{
  912. X    if (note_fp && note_page != ART_UNAVAILABLE) {
  913. X        fclose (note_fp);
  914. X        note_fp = (FILE *) 0;
  915. X    }
  916. X}
  917. X
  918. X
  919. Xint prompt_response (ch, respnum)
  920. X    int ch;
  921. X    int respnum;
  922. X{
  923. X    int num;
  924. X
  925. X    clear_message ();
  926. X
  927. X    if ((num = prompt_num (ch, txt_read_resp)) == -1) {
  928. X        clear_message ();
  929. X        return -1;
  930. X    }
  931. X
  932. X    return choose_response (which_thread (respnum), num);
  933. X}
  934. X
  935. X
  936. Xvoid yank_to_addr (orig, addr)
  937. X    char *orig;
  938. X    char *addr;
  939. X{
  940. X    char *p;
  941. X
  942. X    for (p = orig; *p; p++)
  943. X        if (((*p) & 0xFF) < ' ')
  944. X            *p = ' ';
  945. X
  946. X    while (*addr)
  947. X        addr++;
  948. X
  949. X    while (*orig) {
  950. X        while (*orig && (*orig == ' ' || *orig == '"' || *orig == ','))
  951. X            orig++;
  952. X        *addr++ = ' ';
  953. X        while (*orig && (*orig != ' ' && *orig != ',' && *orig != '"'))
  954. X            *addr++ = *orig++;
  955. X        while (*orig && (*orig == ' ' || *orig == '"' || *orig == ','))
  956. X            orig++;
  957. X        if (*orig == '(') {
  958. X            while (*orig && *orig != ')')
  959. X                orig++;
  960. X            if (*orig == ')')
  961. X                orig++;
  962. X        }
  963. X    }
  964. X    *addr = '\0';
  965. X}
  966. X
  967. X
  968. Xint show_last_page ()
  969. X{
  970. X    char buf[LEN];
  971. X    char buf2[LEN+50];
  972. X    char *p, *q;
  973. X    int ctrl_L;        /* form feed character detected */
  974. X    int i, j;
  975. X    long tmp_pos;
  976. X    
  977. X    if (note_end) {
  978. X        return FALSE;
  979. X    }
  980. X
  981. X    if (note_size == 0L) {
  982. X        tmp_pos = ftell (note_fp);
  983. X        fseek (note_fp, 0L, 2);            /* goto end of article */
  984. X        note_size = ftell (note_fp);
  985. X        fseek (note_fp, tmp_pos, 0);    /* goto old position */
  986. X    }
  987. X
  988. X    while (! note_end) {
  989. X        note_line = 1;
  990. X        ctrl_L = FALSE;
  991. X
  992. X        if (note_page == 0) {
  993. X            note_line += 4;
  994. X        } else {
  995. X            note_line += 2;
  996. X        }
  997. X        while (note_line < LINES) {
  998. X            if (fgets (buf, sizeof buf, note_fp) == NULL) {
  999. X                note_end = TRUE;
  1000. X                break;
  1001. X            }
  1002. X            buf[LEN-1] = '\0';
  1003. X            for (p = buf, q = buf2;    *p && *p != '\n' && q<&buf2[LEN]; p++) {
  1004. X                if (*p == '\b' && q > buf2) {
  1005. X                    q--;
  1006. X                } else if (*p == 12) {        /* ^L */
  1007. X                    *q++ = '^';
  1008. X                    *q++ = 'L';
  1009. X                    ctrl_L = TRUE;
  1010. X                } else if (*p == '\t') {
  1011. X                    i = q - buf2;
  1012. X                    j = (i|7) + 1;
  1013. X
  1014. X                    while (i++ < j) {
  1015. X                        *q++ = ' ';
  1016. X                    }
  1017. X                } else if (((*p) & 0xFF) < ' ') {
  1018. X                    *q++ = '^';
  1019. X                    *q++ = ((*p) & 0xFF) + '@';
  1020. X                } else {
  1021. X                    *q++ = *p;
  1022. X                }
  1023. X            }
  1024. X            *q = '\0';
  1025. X            note_line += ((int) strlen (buf2) / COLS) + 1;
  1026. X
  1027. X            if (ctrl_L) {
  1028. X                break;
  1029. X            }
  1030. X        }
  1031. X        if (note_mark[note_page] == note_size) {
  1032. X            note_end = TRUE;
  1033. X            note_page--;
  1034. X            break;
  1035. X        } else if (! note_end) {
  1036. X            note_mark[++note_page] = ftell(note_fp);
  1037. X        }
  1038. X    }
  1039. X    fseek (note_fp, note_mark[note_page], 0);
  1040. X    return TRUE;
  1041. X}
  1042. X
  1043. X
  1044. Xint match_header (buf, pat, body, len)
  1045. X    char *buf;
  1046. X    char *pat;
  1047. X    char *body;
  1048. X    int    len;
  1049. X{
  1050. X    int    plen = strlen (pat);
  1051. X
  1052. X    if(strncmp (buf, pat, plen) == 0 && buf[plen] == ':' && buf[plen + 1] == ' ') {
  1053. X        plen += 2;
  1054. X        while (buf[plen] == ' ')
  1055. X            plen++;
  1056. X        strncpy (body, &buf[plen], len);
  1057. X        body[len - 1] = '\0';
  1058. X        return TRUE;
  1059. X    }
  1060. X    return FALSE;
  1061. X}
  1062. END_OF_FILE
  1063.   if test 22481 -ne `wc -c <'page.c'`; then
  1064.     echo shar: \"'page.c'\" unpacked with wrong size!
  1065.   fi
  1066.   # end of 'page.c'
  1067. fi
  1068. if test -f 'proto.h' -a "${1}" != "-c" ; then 
  1069.   echo shar: Will not clobber existing file \"'proto.h'\"
  1070. else
  1071.   echo shar: Extracting \"'proto.h'\" \(28626 characters\)
  1072.   sed "s/^X//" >'proto.h' <<'END_OF_FILE'
  1073. X#if __STDC__
  1074. X/* active.c */
  1075. Xextern void resync_active_file(void);
  1076. Xextern int read_active_file(void);
  1077. Xextern int backup_active(int create);
  1078. Xextern void notify_groups(void);
  1079. Xextern void mark_unthreaded_groups(void);
  1080. Xextern void read_newsgroups_file(void);
  1081. X/* art.c */
  1082. Xextern void find_base(int only_unread);
  1083. Xextern int num_of_arts(void);
  1084. Xextern int valid_artnum(long art);
  1085. Xextern int purge_needed(void);
  1086. Xextern void index_group(char *group, char *group_path);
  1087. Xextern int read_group(char *group, char *group_path);
  1088. Xextern void make_threads(int rethread);
  1089. Xextern int parse_headers(FILE *fp, struct article_t *h);
  1090. Xextern void write_index_file(char *group);
  1091. Xextern int read_index_file(char *group_name);
  1092. Xextern void find_index_file(char *group);
  1093. Xextern void do_update(void);
  1094. Xextern char *parse_date(char *date, char *str);
  1095. Xextern int artnum_comp(char *p1, char *p2);
  1096. Xextern int subj_comp(char *p1, char *p2);
  1097. Xextern int from_comp(char *p1, char *p2);
  1098. Xextern int date_comp(char *p1, char *p2);
  1099. Xextern void set_article(struct article_t *art);
  1100. X/* curses.c */
  1101. Xextern int InitScreen(void);
  1102. Xextern void ScreenSize(int *num_lines, int *num_columns);
  1103. Xextern void InitWin(void);
  1104. Xextern void EndWin(void);
  1105. Xextern void set_keypad_on(void);
  1106. Xextern void set_keypad_off(void);
  1107. Xextern void ClearScreen(void);
  1108. Xextern void MoveCursor(int row, int col);
  1109. Xextern void CleartoEOLN(void);
  1110. Xextern void CleartoEOS(void);
  1111. Xextern void StartInverse(void);
  1112. Xextern void EndInverse(void);
  1113. Xextern void ToggleInverse(void);
  1114. Xextern int RawState(void);
  1115. Xextern void Raw(int state);
  1116. Xextern int ReadCh(void);
  1117. Xextern int outchar(int c);
  1118. X/* debug.c */
  1119. Xextern void debug_nntp(char *func, char *line);
  1120. Xextern void debug_nntp_respcode(int respcode);
  1121. Xextern void debug_print_arts(void);
  1122. Xextern void debug_print_header(struct article_t *s);
  1123. Xextern void debug_print_comment(char *comment);
  1124. Xextern void debug_print_base(void);
  1125. Xextern void debug_print_active(void);
  1126. X/* feed.c */
  1127. Xextern void feed_articles(int function, int level, char *prompt, int respnum, char *group_path);
  1128. Xextern int print_file(char *command, int respnum, int count);
  1129. X/* getline.c */
  1130. Xextern char *getline(char *prompt, int number_only, char *str);
  1131. X/* group.c */
  1132. Xextern void group_page(char *group);
  1133. Xextern void fix_new_highest(int groupnum);
  1134. Xextern void show_group_page(char *group);
  1135. Xextern void update_group_page(char *group);
  1136. Xextern void draw_subject_arrow(void);
  1137. Xextern void erase_subject_arrow(void);
  1138. Xextern void prompt_subject_num(int ch, char *group);
  1139. Xextern void clear_note_area(void);
  1140. Xextern int find_new_pos(int old_top, long old_artnum, int cur_pos);
  1141. Xextern void mark_screen(int level, int screen_row, int screen_col, char *value);
  1142. Xextern void set_subj_from_size(int num_cols);
  1143. Xextern void toggle_subject_from(void);
  1144. X/* hashstr.c */
  1145. Xextern char *hash_str(char *s);
  1146. Xextern struct hashnode *add_string(char *s);
  1147. Xextern void hash_init(void);
  1148. Xextern void hash_reclaim(void);
  1149. X/* help.c */
  1150. Xextern void show_info_page(int type, char *help[], char *title);
  1151. X/* inews.c */
  1152. Xextern int submit_inews(char *name);
  1153. Xextern void get_host_name(char *host_name);
  1154. Xextern void get_from_name(char *from_name);
  1155. X/* init.c */
  1156. Xextern void init_selfinfo(void);
  1157. Xextern void set_tindir(void);
  1158. Xextern int create_mail_save_dirs(void);
  1159. X/* kill.c */
  1160. Xextern int read_kill_file(void);
  1161. Xextern void write_kill_file(void);
  1162. Xextern int kill_art_menu(char *group_name, int index);
  1163. Xextern int unkill_all_articles(void);
  1164. Xextern int kill_any_articles(char *group);
  1165. Xextern int auto_select_articles(char *group);
  1166. X/* lang.c */
  1167. X/* main.c */
  1168. Xextern void main(int argc, char *argv[]);
  1169. Xextern void read_cmd_line_options(int argc, char *argv[]);
  1170. Xextern void usage(char *progname);
  1171. Xextern int check_for_any_new_news(int check_any_unread, int start_any_unread);
  1172. Xextern void save_or_mail_new_news(void);
  1173. Xextern void update_index_files(void);
  1174. Xextern void show_intro_page(void);
  1175. X/* memory.c */
  1176. Xextern void init_alloc(void);
  1177. Xextern void expand_art(void);
  1178. Xextern void expand_active(void);
  1179. Xextern void expand_kill(void);
  1180. Xextern void expand_save(void);
  1181. Xextern void init_screen_array(int allocate);
  1182. Xextern void free_all_arrays(void);
  1183. Xextern void free_art_array(void);
  1184. Xextern void free_active_arrays(void);
  1185. Xextern void free_kill_array(void);
  1186. Xextern void free_save_array(void);
  1187. Xextern char *my_malloc(unsigned size);
  1188. Xextern char *my_realloc(char *p, unsigned size);
  1189. X/* misc.c */
  1190. Xextern void asfail(char *file, int line, char *cond);
  1191. Xextern void copy_fp(FILE *fp_ip, FILE *fp_op, char *prefix);
  1192. Xextern char *get_val(char *env, char *def);
  1193. Xextern int invoke_editor(char *nam);
  1194. Xextern void shell_escape(void);
  1195. Xextern void tin_done(int ret);
  1196. Xextern long hash_groupname(char *group);
  1197. Xextern void rename_file(char *old_filename, char *new_filename);
  1198. Xextern char *str_dup(char *str);
  1199. Xextern int invoke_cmd(char *nam);
  1200. Xextern void draw_percent_mark(int cur_num, int max_num);
  1201. Xextern void set_real_uid_gid(void);
  1202. Xextern void set_tin_uid_gid(void);
  1203. Xextern void basename(char *dirname, char *program);
  1204. Xextern void mail_setup(void);
  1205. Xextern int mail_check(void);
  1206. Xextern void parse_from(char *str, char *addr, char *name);
  1207. Xextern long my_atol(char *s, int n);
  1208. Xextern int my_stricmp(char *p, char *q);
  1209. Xextern char *eat_re(char *s);
  1210. Xextern long hash_s(char *s);
  1211. Xextern void my_strncpy(char *p, char *q, int n);
  1212. Xextern int untag_all_articles(void);
  1213. Xextern char *str_str(char *text, char *pattern, int patlen);
  1214. Xextern void get_author(int thread, int respnum, char *str);
  1215. Xextern void toggle_inverse_video(void);
  1216. Xextern int get_arrow_key(void);
  1217. X/* newsrc.c */
  1218. Xextern int auto_subscribe_groups(void);
  1219. Xextern void backup_newsrc(void);
  1220. Xextern void read_newsrc(int sub_only);
  1221. Xextern void write_newsrc(void);
  1222. Xextern void rewrite_newsrc(void);
  1223. Xextern void read_newsrc_line(char *group);
  1224. Xextern void update_newsrc(char *group, int groupnum, int mark_unread);
  1225. Xextern void subscribe(char *group, int ch, int num, int out_seq);
  1226. Xextern void reset_newsrc(void);
  1227. Xextern void delete_group(char *group);
  1228. Xextern int undel_group(void);
  1229. Xextern void mark_group_read(char *group, int groupnum);
  1230. Xextern void parse_seq(char *s);
  1231. Xextern int parse_unread(char *s, int groupnum);
  1232. Xextern int get_line_unread(char *group, int groupnum);
  1233. Xextern void print_seq(FILE *fp, int groupnum);
  1234. Xextern int pos_group_in_newsrc(char *group, int pos);
  1235. Xextern void mark_all_xref_read(char *xref_line);
  1236. X/* nntplib.c */
  1237. Xextern char *getserverbyfile(char *file);
  1238. Xextern int server_init(char *machine);
  1239. Xextern int get_tcp_socket(char *machine);
  1240. Xextern int handle_server_response(int response, char *nntpserver);
  1241. Xextern void put_server(char *string);
  1242. Xextern int get_server(char *string, int size);
  1243. Xextern void close_server(void);
  1244. X/* open.c */
  1245. Xextern void nntp_open(void);
  1246. Xextern void nntp_close(void);
  1247. Xextern FILE *open_active_fp(void);
  1248. Xextern FILE *open_subscription_fp(void);
  1249. Xextern FILE *open_newsgroups_fp(void);
  1250. Xextern FILE *open_index_fp(char *group_name);
  1251. Xextern FILE *open_art_fp(char *group_path, long art);
  1252. Xextern FILE *open_header_fp(char *group_path, long art);
  1253. Xextern int base_comp(char *p1, char *p2);
  1254. Xextern void setup_base(char *group, char *group_path);
  1255. Xextern int get_respcode(void);
  1256. Xextern int stuff_nntp(char *fnam);
  1257. Xextern FILE *nntp_to_fp(void);
  1258. Xextern void log_user(void);
  1259. Xextern char *nntp_respcode(int respcode);
  1260. X/* page.c */
  1261. Xextern int show_page(int respnum, int *threadnum, char *group, char *group_path);
  1262. Xextern void redraw_page(int respnum, char *group);
  1263. Xextern void show_note_page(int respnum, char *group);
  1264. Xextern void show_first_header(int respnum, char *group);
  1265. Xextern void show_cont_header(int respnum);
  1266. Xextern int art_open(long art, char *group_path);
  1267. Xextern void art_close(void);
  1268. Xextern int prompt_response(int ch, int respnum);
  1269. Xextern void yank_to_addr(char *orig, char *addr);
  1270. Xextern int show_last_page(void);
  1271. Xextern int match_header(char *buf, char *pat, char *body, int len);
  1272. X/* post.c */
  1273. Xextern int user_posted_messages(void);
  1274. Xextern void update_art_posted_file(char *group, int action, char *subj);
  1275. Xextern int post_header_ok(char *article);
  1276. Xextern int post_base(char *group, int *posted);
  1277. Xextern int post_response(char *group, int respnum, int copy_text);
  1278. Xextern int mail_to_someone(char *address, int mail_to_poster, int confirm_to_mail, int *mailed_ok);
  1279. Xextern int mail_bug_report(void);
  1280. Xextern int mail_to_author(char *group, int respnum, int copy_text);
  1281. Xextern void find_mail_header(int header, char *file, char *value);
  1282. Xextern int cancel_article(char *group, int respnum);
  1283. Xextern int crosspost_article(char *group, int respnum);
  1284. Xextern int submit_file(char *name);
  1285. Xextern void add_signature(FILE *fp, int flag);
  1286. Xextern void insert_x_headers(char *infile);
  1287. Xextern void find_reply_to_addr(int respnum, char *from_addr);
  1288. X/* prompt.c */
  1289. Xextern int prompt_num(int ch, char *prompt);
  1290. Xextern int prompt_string(char *prompt, char *buf);
  1291. Xextern int prompt_menu_string(int line, int col, char *var);
  1292. Xextern int prompt_yn(int line, char *prompt, int prompt_ch);
  1293. Xextern void prompt_on_off(int row, int col, int *var, char *help_text, char *prompt_text);
  1294. Xextern void continue_prompt(void);
  1295. X/* rcfile.c */
  1296. Xextern int read_rcfile(void);
  1297. Xextern void write_rcfile(void);
  1298. Xextern int change_rcfile(char *group, int kill_at_once);
  1299. Xextern void show_rcfile_menu(void);
  1300. Xextern void expand_rel_abs_pathname(int line, int col, char *str);
  1301. Xextern void show_menu_help(char *help_message);
  1302. Xextern int match_boolean(char *line, char *pat, int *dst);
  1303. Xextern int match_number(char *line, char *pat, int *dst);
  1304. Xextern int match_string(char *line, char *pat, char *dst, int dstlen);
  1305. X/* save.c */
  1306. Xextern int check_start_save_any_news(int check_start_save);
  1307. Xextern int save_art_to_file(int respnum, int index, int mailbox, char *filename);
  1308. Xextern int save_thread_to_file(int is_mailbox, char *group_path);
  1309. Xextern int save_regex_arts(int is_mailbox, char *group_path);
  1310. Xextern int append_to_existing_file(int i);
  1311. Xextern int create_path(char *path);
  1312. Xextern int create_sub_dir(int i);
  1313. Xextern void add_to_save_list(int index, struct article_t *article, int is_mailbox, char *path);
  1314. Xextern void sort_save_list(void);
  1315. Xextern int save_comp(char *p1, char *p2);
  1316. Xextern char *save_filename(int i);
  1317. Xextern char *get_first_savefile(void);
  1318. Xextern char *get_last_savefile(void);
  1319. Xextern int post_process_files(int proc_type_ch);
  1320. Xextern void post_process_uud(int pp);
  1321. Xextern void post_process_sh(void);
  1322. Xextern char *get_archive_file(char *dir, char *ext);
  1323. Xextern void delete_processed_files(void);
  1324. X/* screen.c */
  1325. Xextern void info_message(char *str);
  1326. Xextern void wait_message(char *str);
  1327. Xextern void error_message(char *template, char *str);
  1328. Xextern void perror_message(char *template, char *str);
  1329. Xextern void clear_message(void);
  1330. Xextern void center_line(int line, int inverse, char *str);
  1331. Xextern void draw_arrow(int line);
  1332. Xextern void erase_arrow(int line);
  1333. Xextern void show_title(char *title);
  1334. Xextern void ring_bell(void);
  1335. X/* search.c */
  1336. Xextern int search_author(int only_unread, int current_art, int forward);
  1337. Xextern void search_group(int forward);
  1338. Xextern void search_subject(int forward, char *group);
  1339. Xextern int search_article(int forward);
  1340. Xextern void make_lower(char *s, char *t);
  1341. X/* select.c */
  1342. Xextern void selection_index(int start_groupnum);
  1343. Xextern void group_selection_page(void);
  1344. Xextern int prompt_group_num(int ch);
  1345. Xextern void erase_group_arrow(void);
  1346. Xextern void draw_group_arrow(void);
  1347. Xextern int choose_new_group(void);
  1348. Xextern int add_group(char *s, int get_unread);
  1349. Xextern int reposition_group(char *group, int default_num);
  1350. Xextern void catchup_group(int goto_next_unread_group);
  1351. Xextern void next_unread_group(int enter_group);
  1352. Xextern void set_groupname_len(int all_groups);
  1353. X/* signal.c */
  1354. Xextern sigtype_t (*sigdisp(int sig, sigtype_t (*func)()))();
  1355. Xextern void set_signal_handlers(void);
  1356. Xextern void set_alarm_signal(void);
  1357. Xextern void set_alarm_clock_on(void);
  1358. Xextern void set_alarm_clock_off(void);
  1359. Xextern void signal_handler(int sig);
  1360. Xextern int set_win_size(int *num_lines, int *num_cols);
  1361. Xextern void set_signals_art(void);
  1362. Xextern void set_signals_group(void);
  1363. Xextern void set_signals_page(void);
  1364. Xextern void set_signals_select(void);
  1365. Xextern void set_signals_spooldir(void);
  1366. Xextern void set_signals_thread(void);
  1367. Xextern void art_suspend(int sig);
  1368. Xextern void main_suspend(int sig);
  1369. Xextern void select_suspend(int sig);
  1370. Xextern void spooldir_suspend(int sig);
  1371. Xextern void group_suspend(int sig);
  1372. Xextern void page_suspend(int sig);
  1373. Xextern void thread_suspend(int sig);
  1374. Xextern void rcfile_suspend(int sig);
  1375. Xextern void art_resize(int sig);
  1376. Xextern void main_resize(int sig);
  1377. Xextern void select_resize(int sig);
  1378. Xextern void spooldir_resize(int sig);
  1379. Xextern void group_resize(int sig);
  1380. Xextern void page_resize(int sig);
  1381. Xextern void thread_resize(int sig);
  1382. X/* spooldir.c */
  1383. Xextern int spooldir_index(void);
  1384. Xextern void show_spooldir_page(void);
  1385. Xextern int prompt_spooldir_num(int ch);
  1386. Xextern void erase_spooldir_arrow(void);
  1387. Xextern void draw_spooldir_arrow(void);
  1388. Xextern int load_spooldirs(void);
  1389. Xextern void get_spooldir(void);
  1390. Xextern int set_spooldir(char *name);
  1391. X/* thread.c */
  1392. Xextern int show_thread(int respnum, char *group, char *group_path);
  1393. Xextern void show_thread_page(void);
  1394. Xextern void update_thread_page(void);
  1395. Xextern void draw_thread_arrow(void);
  1396. Xextern void erase_thread_arrow(void);
  1397. Xextern int prompt_thread_num(int ch);
  1398. Xextern int new_responses(int thread);
  1399. Xextern int which_thread(int n);
  1400. Xextern int which_response(int n);
  1401. Xextern int num_of_responses(int n);
  1402. Xextern int stat_thread(int n, struct art_stat_t *sbuf);
  1403. Xextern int next_response(int n);
  1404. Xextern int next_thread(int n);
  1405. Xextern int prev_response(int n);
  1406. Xextern int choose_response(int i, int n);
  1407. Xextern int next_unread(int n);
  1408. Xextern int prev_unread(int n);
  1409. X/* wildmat.c */
  1410. Xextern int wildmat(char *text, char *p);
  1411. X#else
  1412. X/* active.c */
  1413. Xextern void resync_active_file(/*void*/);
  1414. Xextern int read_active_file(/*void*/);
  1415. Xextern int backup_active(/*int create*/);
  1416. Xextern void notify_groups(/*void*/);
  1417. Xextern void mark_unthreaded_groups(/*void*/);
  1418. Xextern void read_newsgroups_file(/*void*/);
  1419. X/* art.c */
  1420. Xextern void find_base(/*int only_unread*/);
  1421. Xextern int num_of_arts(/*void*/);
  1422. Xextern int valid_artnum(/*long art*/);
  1423. Xextern int purge_needed(/*void*/);
  1424. Xextern void index_group(/*char *group, char *group_path*/);
  1425. Xextern int read_group(/*char *group, char *group_path*/);
  1426. Xextern void make_threads(/*int rethread*/);
  1427. Xextern int parse_headers(/*FILE *fp, struct article_t *h*/);
  1428. Xextern void write_index_file(/*char *group*/);
  1429. Xextern int read_index_file(/*char *group_name*/);
  1430. Xextern void find_index_file(/*char *group*/);
  1431. Xextern void do_update(/*void*/);
  1432. Xextern char *parse_date(/*char *date, char *str*/);
  1433. Xextern int artnum_comp(/*char *p1, char *p2*/);
  1434. Xextern int subj_comp(/*char *p1, char *p2*/);
  1435. Xextern int from_comp(/*char *p1, char *p2*/);
  1436. Xextern int date_comp(/*char *p1, char *p2*/);
  1437. Xextern void set_article(/*struct article_t *art*/);
  1438. X/* curses.c */
  1439. Xextern int InitScreen(/*void*/);
  1440. Xextern void ScreenSize(/*int *num_lines, int *num_columns*/);
  1441. Xextern void InitWin(/*void*/);
  1442. Xextern void EndWin(/*void*/);
  1443. Xextern void set_keypad_on(/*void*/);
  1444. Xextern void set_keypad_off(/*void*/);
  1445. Xextern void ClearScreen(/*void*/);
  1446. Xextern void MoveCursor(/*int row, int col*/);
  1447. Xextern void CleartoEOLN(/*void*/);
  1448. Xextern void CleartoEOS(/*void*/);
  1449. Xextern void StartInverse(/*void*/);
  1450. Xextern void EndInverse(/*void*/);
  1451. Xextern void ToggleInverse(/*void*/);
  1452. Xextern int RawState(/*void*/);
  1453. Xextern void Raw(/*int state*/);
  1454. Xextern int ReadCh(/*void*/);
  1455. Xextern int outchar(/*int c*/);
  1456. X/* debug.c */
  1457. Xextern void debug_nntp(/*char *func, char *line*/);
  1458. Xextern void debug_nntp_respcode(/*int respcode*/);
  1459. Xextern void debug_print_arts(/*void*/);
  1460. Xextern void debug_print_header(/*struct article_t *s*/);
  1461. Xextern void debug_print_comment(/*char *comment*/);
  1462. Xextern void debug_print_base(/*void*/);
  1463. Xextern void debug_print_active(/*void*/);
  1464. X/* feed.c */
  1465. Xextern void feed_articles(/*int function, int level, char *prompt, int respnum, char *group_path*/);
  1466. Xextern int print_file(/*char *command, int respnum, int count*/);
  1467. X/* getline.c */
  1468. Xextern char *getline(/*char *prompt, int number_only, char *str*/);
  1469. X/* group.c */
  1470. Xextern void group_page(/*char *group*/);
  1471. Xextern void fix_new_highest(/*int groupnum*/);
  1472. Xextern void show_group_page(/*char *group*/);
  1473. Xextern void update_group_page(/*char *group*/);
  1474. Xextern void draw_subject_arrow(/*void*/);
  1475. Xextern void erase_subject_arrow(/*void*/);
  1476. Xextern void prompt_subject_num(/*int ch, char *group*/);
  1477. Xextern void clear_note_area(/*void*/);
  1478. Xextern int find_new_pos(/*int old_top, long old_artnum, int cur_pos*/);
  1479. Xextern void mark_screen(/*int level, int screen_row, int screen_col, char *value*/);
  1480. Xextern void set_subj_from_size(/*int num_cols*/);
  1481. Xextern void toggle_subject_from(/*void*/);
  1482. X/* hashstr.c */
  1483. Xextern char *hash_str(/*char *s*/);
  1484. Xextern struct hashnode *add_string(/*char *s*/);
  1485. Xextern void hash_init(/*void*/);
  1486. Xextern void hash_reclaim(/*void*/);
  1487. X/* help.c */
  1488. Xextern void show_info_page(/*int type, char *help[], char *title*/);
  1489. X/* inews.c */
  1490. Xextern int submit_inews(/*char *name*/);
  1491. Xextern void get_host_name(/*char *host_name*/);
  1492. Xextern void get_from_name(/*char *from_name*/);
  1493. X/* init.c */
  1494. Xextern void init_selfinfo(/*void*/);
  1495. Xextern void set_tindir(/*void*/);
  1496. Xextern int create_mail_save_dirs(/*void*/);
  1497. X/* kill.c */
  1498. Xextern int read_kill_file(/*void*/);
  1499. Xextern void write_kill_file(/*void*/);
  1500. Xextern int kill_art_menu(/*char *group_name, int index*/);
  1501. Xextern int unkill_all_articles(/*void*/);
  1502. Xextern int kill_any_articles(/*char *group*/);
  1503. Xextern int auto_select_articles(/*char *group*/);
  1504. X/* lang.c */
  1505. X/* main.c */
  1506. Xextern void main(/*int argc, char *argv[]*/);
  1507. Xextern void read_cmd_line_options(/*int argc, char *argv[]*/);
  1508. Xextern void usage(/*char *progname*/);
  1509. Xextern int check_for_any_new_news(/*int check_any_unread, int start_any_unread*/);
  1510. Xextern void save_or_mail_new_news(/*void*/);
  1511. Xextern void update_index_files(/*void*/);
  1512. Xextern void show_intro_page(/*void*/);
  1513. X/* memory.c */
  1514. Xextern void init_alloc(/*void*/);
  1515. Xextern void expand_art(/*void*/);
  1516. Xextern void expand_active(/*void*/);
  1517. Xextern void expand_kill(/*void*/);
  1518. Xextern void expand_save(/*void*/);
  1519. Xextern void init_screen_array(/*int allocate*/);
  1520. Xextern void free_all_arrays(/*void*/);
  1521. Xextern void free_art_array(/*void*/);
  1522. Xextern void free_active_arrays(/*void*/);
  1523. Xextern void free_kill_array(/*void*/);
  1524. Xextern void free_save_array(/*void*/);
  1525. Xextern char *my_malloc(/*unsigned size*/);
  1526. Xextern char *my_realloc(/*char *p, unsigned size*/);
  1527. X/* misc.c */
  1528. Xextern void asfail(/*char *file, int line, char *cond*/);
  1529. Xextern void copy_fp(/*FILE *fp_ip, FILE *fp_op, char *prefix*/);
  1530. Xextern char *get_val(/*char *env, char *def*/);
  1531. Xextern int invoke_editor(/*char *nam*/);
  1532. Xextern void shell_escape(/*void*/);
  1533. Xextern void tin_done(/*int ret*/);
  1534. Xextern long hash_groupname(/*char *group*/);
  1535. Xextern void rename_file(/*char *old_filename, char *new_filename*/);
  1536. Xextern char *str_dup(/*char *str*/);
  1537. Xextern int invoke_cmd(/*char *nam*/);
  1538. Xextern void draw_percent_mark(/*int cur_num, int max_num*/);
  1539. Xextern void set_real_uid_gid(/*void*/);
  1540. Xextern void set_tin_uid_gid(/*void*/);
  1541. Xextern void basename(/*char *dirname, char *program*/);
  1542. Xextern void mail_setup(/*void*/);
  1543. Xextern int mail_check(/*void*/);
  1544. Xextern void parse_from(/*char *str, char *addr, char *name*/);
  1545. Xextern long my_atol(/*char *s, int n*/);
  1546. Xextern int my_stricmp(/*char *p, char *q*/);
  1547. Xextern char *eat_re(/*char *s*/);
  1548. Xextern long hash_s(/*char *s*/);
  1549. Xextern void my_strncpy(/*char *p, char *q, int n*/);
  1550. Xextern int untag_all_articles(/*void*/);
  1551. Xextern char *str_str(/*char *text, char *pattern, int patlen*/);
  1552. Xextern void get_author(/*int thread, int respnum, char *str*/);
  1553. Xextern void toggle_inverse_video(/*void*/);
  1554. Xextern int get_arrow_key(/*void*/);
  1555. X/* newsrc.c */
  1556. Xextern int auto_subscribe_groups(/*void*/);
  1557. Xextern void backup_newsrc(/*void*/);
  1558. Xextern void read_newsrc(/*int sub_only*/);
  1559. Xextern void write_newsrc(/*void*/);
  1560. Xextern void rewrite_newsrc(/*void*/);
  1561. Xextern void read_newsrc_line(/*char *group*/);
  1562. Xextern void update_newsrc(/*char *group, int groupnum, int mark_unread*/);
  1563. Xextern void subscribe(/*char *group, int ch, int num, int out_seq*/);
  1564. Xextern void reset_newsrc(/*void*/);
  1565. Xextern void delete_group(/*char *group*/);
  1566. Xextern int undel_group(/*void*/);
  1567. Xextern void mark_group_read(/*char *group, int groupnum*/);
  1568. Xextern void parse_seq(/*char *s*/);
  1569. Xextern int parse_unread(/*char *s, int groupnum*/);
  1570. Xextern int get_line_unread(/*char *group, int groupnum*/);
  1571. Xextern void print_seq(/*FILE *fp, int groupnum*/);
  1572. Xextern int pos_group_in_newsrc(/*char *group, int pos*/);
  1573. Xextern void mark_all_xref_read(/*char *xref_line*/);
  1574. X/* nntplib.c */
  1575. Xextern char *getserverbyfile(/*char *file*/);
  1576. Xextern int server_init(/*char *machine*/);
  1577. Xextern int get_tcp_socket(/*char *machine*/);
  1578. Xextern int handle_server_response(/*int response, char *nntpserver*/);
  1579. Xextern void put_server(/*char *string*/);
  1580. Xextern int get_server(/*char *string, int size*/);
  1581. Xextern void close_server(/*void*/);
  1582. X/* open.c */
  1583. Xextern void nntp_open(/*void*/);
  1584. Xextern void nntp_close(/*void*/);
  1585. Xextern FILE *open_active_fp(/*void*/);
  1586. Xextern FILE *open_subscription_fp(/*void*/);
  1587. Xextern FILE *open_newsgroups_fp(/*void*/);
  1588. Xextern FILE *open_index_fp(/*char *group_name*/);
  1589. Xextern FILE *open_art_fp(/*char *group_path, long art*/);
  1590. Xextern FILE *open_header_fp(/*char *group_path, long art*/);
  1591. Xextern int base_comp(/*char *p1, char *p2*/);
  1592. Xextern void setup_base(/*char *group, char *group_path*/);
  1593. Xextern int get_respcode(/*void*/);
  1594. Xextern int stuff_nntp(/*char *fnam*/);
  1595. Xextern FILE *nntp_to_fp(/*void*/);
  1596. Xextern void log_user(/*void*/);
  1597. Xextern char *nntp_respcode(/*int respcode*/);
  1598. X/* page.c */
  1599. Xextern int show_page(/*int respnum, int *threadnum, char *group, char *group_path*/);
  1600. Xextern void redraw_page(/*int respnum, char *group*/);
  1601. Xextern void show_note_page(/*int respnum, char *group*/);
  1602. Xextern void show_first_header(/*int respnum, char *group*/);
  1603. Xextern void show_cont_header(/*int respnum*/);
  1604. Xextern int art_open(/*long art, char *group_path*/);
  1605. Xextern void art_close(/*void*/);
  1606. Xextern int prompt_response(/*int ch, int respnum*/);
  1607. Xextern void yank_to_addr(/*char *orig, char *addr*/);
  1608. Xextern int show_last_page(/*void*/);
  1609. Xextern int match_header(/*char *buf, char *pat, char *body, int len*/);
  1610. X/* post.c */
  1611. Xextern int user_posted_messages(/*void*/);
  1612. Xextern void update_art_posted_file(/*char *group, int action, char *subj*/);
  1613. Xextern int post_header_ok(/*char *article*/);
  1614. Xextern int post_base(/*char *group, int *posted*/);
  1615. Xextern int post_response(/*char *group, int respnum, int copy_text*/);
  1616. Xextern int mail_to_someone(/*char *address, int mail_to_poster, int confirm_to_mail, int *mailed_ok*/);
  1617. Xextern int mail_bug_report(/*void*/);
  1618. Xextern int mail_to_author(/*char *group, int respnum, int copy_text*/);
  1619. Xextern void find_mail_header(/*int header, char *file, char *value*/);
  1620. Xextern int cancel_article(/*char *group, int respnum*/);
  1621. Xextern int crosspost_article(/*char *group, int respnum*/);
  1622. Xextern int submit_file(/*char *name*/);
  1623. Xextern void add_signature(/*FILE *fp, int flag*/);
  1624. Xextern void insert_x_headers(/*char *infile*/);
  1625. Xextern void find_reply_to_addr(/*int respnum, char *from_addr*/);
  1626. X/* prompt.c */
  1627. Xextern int prompt_num(/*int ch, char *prompt*/);
  1628. Xextern int prompt_string(/*char *prompt, char *buf*/);
  1629. Xextern int prompt_menu_string(/*int line, int col, char *var*/);
  1630. Xextern int prompt_yn(/*int line, char *prompt, int prompt_ch*/);
  1631. Xextern void prompt_on_off(/*int row, int col, int *var, char *help_text, char *prompt_text*/);
  1632. Xextern void continue_prompt(/*void*/);
  1633. X/* rcfile.c */
  1634. Xextern int read_rcfile(/*void*/);
  1635. Xextern void write_rcfile(/*void*/);
  1636. Xextern int change_rcfile(/*char *group, int kill_at_once*/);
  1637. Xextern void show_rcfile_menu(/*void*/);
  1638. Xextern void expand_rel_abs_pathname(/*int line, int col, char *str*/);
  1639. Xextern void show_menu_help(/*char *help_message*/);
  1640. Xextern int match_boolean(/*char *line, char *pat, int *dst*/);
  1641. Xextern int match_number(/*char *line, char *pat, int *dst*/);
  1642. Xextern int match_string(/*char *line, char *pat, char *dst, int dstlen*/);
  1643. X/* save.c */
  1644. Xextern int check_start_save_any_news(/*int check_start_save*/);
  1645. Xextern int save_art_to_file(/*int respnum, int index, int mailbox, char *filename*/);
  1646. Xextern int save_thread_to_file(/*int is_mailbox, char *group_path*/);
  1647. Xextern int save_regex_arts(/*int is_mailbox, char *group_path*/);
  1648. Xextern int append_to_existing_file(/*int i*/);
  1649. Xextern int create_path(/*char *path*/);
  1650. Xextern int create_sub_dir(/*int i*/);
  1651. Xextern void add_to_save_list(/*int index, struct article_t *article, int is_mailbox, char *path*/);
  1652. Xextern void sort_save_list(/*void*/);
  1653. Xextern int save_comp(/*char *p1, char *p2*/);
  1654. Xextern char *save_filename(/*int i*/);
  1655. Xextern char *get_first_savefile(/*void*/);
  1656. Xextern char *get_last_savefile(/*void*/);
  1657. Xextern int post_process_files(/*int proc_type_ch*/);
  1658. Xextern void post_process_uud(/*int pp*/);
  1659. Xextern void post_process_sh(/*void*/);
  1660. Xextern char *get_archive_file(/*char *dir, char *ext*/);
  1661. Xextern void delete_processed_files(/*void*/);
  1662. X/* screen.c */
  1663. Xextern void info_message(/*char *str*/);
  1664. Xextern void wait_message(/*char *str*/);
  1665. Xextern void error_message(/*char *template, char *str*/);
  1666. Xextern void perror_message(/*char *template, char *str*/);
  1667. Xextern void clear_message(/*void*/);
  1668. Xextern void center_line(/*int line, int inverse, char *str*/);
  1669. Xextern void draw_arrow(/*int line*/);
  1670. Xextern void erase_arrow(/*int line*/);
  1671. Xextern void show_title(/*char *title*/);
  1672. Xextern void ring_bell(/*void*/);
  1673. X/* search.c */
  1674. Xextern int search_author(/*int only_unread, int current_art, int forward*/);
  1675. Xextern void search_group(/*int forward*/);
  1676. Xextern void search_subject(/*int forward, char *group*/);
  1677. Xextern int search_article(/*int forward*/);
  1678. Xextern void make_lower(/*char *s, char *t*/);
  1679. X/* select.c */
  1680. Xextern void selection_index(/*int start_groupnum*/);
  1681. Xextern void group_selection_page(/*void*/);
  1682. Xextern int prompt_group_num(/*int ch*/);
  1683. Xextern void erase_group_arrow(/*void*/);
  1684. Xextern void draw_group_arrow(/*void*/);
  1685. Xextern int choose_new_group(/*void*/);
  1686. Xextern int add_group(/*char *s, int get_unread*/);
  1687. Xextern int reposition_group(/*char *group, int default_num*/);
  1688. Xextern void catchup_group(/*int goto_next_unread_group*/);
  1689. Xextern void next_unread_group(/*int enter_group*/);
  1690. Xextern void set_groupname_len(/*int all_groups*/);
  1691. X/* signal.c */
  1692. Xextern sigtype_t (*sigdisp(/*int sig, sigtype_t (*func)()*/))();
  1693. Xextern void set_signal_handlers(/*void*/);
  1694. Xextern void set_alarm_signal(/*void*/);
  1695. Xextern void set_alarm_clock_on(/*void*/);
  1696. Xextern void set_alarm_clock_off(/*void*/);
  1697. Xextern void signal_handler(/*int sig*/);
  1698. Xextern int set_win_size(/*int *num_lines, int *num_cols*/);
  1699. Xextern void set_signals_art(/*void*/);
  1700. Xextern void set_signals_group(/*void*/);
  1701. Xextern void set_signals_page(/*void*/);
  1702. Xextern void set_signals_select(/*void*/);
  1703. Xextern void set_signals_spooldir(/*void*/);
  1704. Xextern void set_signals_thread(/*void*/);
  1705. Xextern void art_suspend(/*int sig*/);
  1706. Xextern void main_suspend(/*int sig*/);
  1707. Xextern void select_suspend(/*int sig*/);
  1708. Xextern void spooldir_suspend(/*int sig*/);
  1709. Xextern void group_suspend(/*int sig*/);
  1710. Xextern void page_suspend(/*int sig*/);
  1711. Xextern void thread_suspend(/*int sig*/);
  1712. Xextern void rcfile_suspend(/*int sig*/);
  1713. Xextern void art_resize(/*int sig*/);
  1714. Xextern void main_resize(/*int sig*/);
  1715. Xextern void select_resize(/*int sig*/);
  1716. Xextern void spooldir_resize(/*int sig*/);
  1717. Xextern void group_resize(/*int sig*/);
  1718. Xextern void page_resize(/*int sig*/);
  1719. Xextern void thread_resize(/*int sig*/);
  1720. X/* spooldir.c */
  1721. Xextern int spooldir_index(/*void*/);
  1722. Xextern void show_spooldir_page(/*void*/);
  1723. Xextern int prompt_spooldir_num(/*int ch*/);
  1724. Xextern void erase_spooldir_arrow(/*void*/);
  1725. Xextern void draw_spooldir_arrow(/*void*/);
  1726. Xextern int load_spooldirs(/*void*/);
  1727. Xextern void get_spooldir(/*void*/);
  1728. Xextern int set_spooldir(/*char *name*/);
  1729. X/* thread.c */
  1730. Xextern int show_thread(/*int respnum, char *group, char *group_path*/);
  1731. Xextern void show_thread_page(/*void*/);
  1732. Xextern void update_thread_page(/*void*/);
  1733. Xextern void draw_thread_arrow(/*void*/);
  1734. Xextern void erase_thread_arrow(/*void*/);
  1735. Xextern int prompt_thread_num(/*int ch*/);
  1736. Xextern int new_responses(/*int thread*/);
  1737. Xextern int which_thread(/*int n*/);
  1738. Xextern int which_response(/*int n*/);
  1739. Xextern int num_of_responses(/*int n*/);
  1740. Xextern int stat_thread(/*int n, struct art_stat_t *sbuf*/);
  1741. Xextern int next_response(/*int n*/);
  1742. Xextern int next_thread(/*int n*/);
  1743. Xextern int prev_response(/*int n*/);
  1744. Xextern int choose_response(/*int i, int n*/);
  1745. Xextern int next_unread(/*int n*/);
  1746. Xextern int prev_unread(/*int n*/);
  1747. X/* wildmat.c */
  1748. Xextern int wildmat(/*char *text, char *p*/);
  1749. X#endif
  1750. END_OF_FILE
  1751.   if test 28626 -ne `wc -c <'proto.h'`; then
  1752.     echo shar: \"'proto.h'\" unpacked with wrong size!
  1753.   fi
  1754.   # end of 'proto.h'
  1755. fi
  1756. echo shar: End of archive 7 \(of 15\).
  1757. cp /dev/null ark7isdone
  1758. MISSING=""
  1759. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
  1760.     if test ! -f ark${I}isdone ; then
  1761.     MISSING="${MISSING} ${I}"
  1762.     fi
  1763. done
  1764. if test "${MISSING}" = "" ; then
  1765.     echo You have unpacked all 15 archives.
  1766.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1767. else
  1768.     echo You still must unpack the following archives:
  1769.     echo "        " ${MISSING}
  1770. fi
  1771. exit 0
  1772. exit 0 # Just in case...
  1773.