Newsgroups: comp.sources.misc From: iain@estevax.uucp (Iain J. Lea) Subject: v23i018: tin - threaded full screen newsreader v1.0 PL2, Part04/09 Message-ID: <1991Sep25.205148.1988@sparky.imd.sterling.com> X-Md4-Signature: 44783ae61f011f09163da4c5a3db8556 Date: Wed, 25 Sep 1991 20:51:48 GMT Approved: kent@sparky.imd.sterling.com Submitted-by: iain@estevax.uucp (Iain J. Lea) Posting-number: Volume 23, Issue 18 Archive-name: tin/part04 Environment: BSD, SCO, ISC, SUNOS, SYSVR3, SYSVR4, ULTRIX, XENIX #!/bin/sh # this is tin.shar.04 (part 4 of tin1.02) # do not concatenate these parts, unpack them in order with /bin/sh # file kill.c continued # if touch 2>&1 | fgrep '[-amc]' > /dev/null then TOUCH=touch else TOUCH=true fi if test ! -r shar3_seq_.tmp; then echo "Please unpack part 1 first!" exit 1 fi (read Scheck if test "$Scheck" != 4; then echo "Please unpack part $Scheck next!" exit 1 else exit 0 fi ) < shar3_seq_.tmp || exit 1 echo "x - Continuing file kill.c" sed 's/^X//' << 'SHAR_EOF' >> kill.c && X int kill_every_group; X X sprintf (kill_group, "%s only", group_name); X my_strncpy (text, arts[index].subject, 45); X sprintf (kill_subj, txt_kill_subject, text); X my_strncpy (text, arts[index].from, 45); X sprintf (kill_from, txt_kill_from, text); X text[0] = '\0'; X X ClearScreen (); X X center_line (1, TRUE, txt_kill_menu); X X MoveCursor(INDEX_TOP, 0); X printf ("%s\r\n\r\n", txt_kill_text); X printf ("%s\r\n\r\n\r\n", txt_kill_text_type); X printf ("%s\r\n\r\n", kill_subj); X printf ("%s\r\n\r\n\r\n", kill_from); X printf ("%s%s", txt_kill_group, kill_group); X fflush(stdout); X X show_menu_help (txt_help_kill_text); X parse_menu_string (INDEX_TOP, strlen (txt_kill_text), text); X X if (text[0]) { X show_menu_help (txt_help_kill_text_type); X counter = 1; X MoveCursor (INDEX_TOP+2, strlen (txt_kill_text_type)); X str = "Subject: line only "; X printf ("%s", str); X fflush(stdout); X do { X MoveCursor (INDEX_TOP+2, strlen (txt_kill_text_type)); X if ((ch = ReadCh()) == ' ') { X counter++; X if (counter == KILL_BOTH+1) { X counter = KILL_SUBJ; X } X switch (counter) { X case KILL_SUBJ: X str = "Subject: line only "; X break; X case KILL_FROM: X str = "From: line only "; X break; X case KILL_BOTH: X str = "Subject: & From: lines"; X break; X } X printf ("%s", str); X fflush(stdout); X } X } while (ch != CR); X } X X if (! text[0]) { X show_menu_help (txt_help_kill_subject); X kill_subj_ok = prompt_yn (INDEX_TOP+5, kill_subj, 'y'); X X show_menu_help (txt_help_kill_from); X kill_from_ok = prompt_yn (INDEX_TOP+7, kill_from, 'n'); X } X X if (text[0] || kill_subj_ok || kill_from_ok) { X show_menu_help (txt_help_kill_group); X kill_every_group = FALSE; X MoveCursor (INDEX_TOP+10, strlen (txt_kill_group)); X str = kill_group; X printf ("%s", str); X fflush(stdout); X do { X MoveCursor (INDEX_TOP+10, strlen (txt_kill_group)); X if ((ch = ReadCh()) == ' ') { X kill_every_group = !kill_every_group; X if (kill_every_group) { X str = "All groups"; X } else { X str = kill_group; X } X CleartoEOLN (); X printf ("%s", str); X fflush(stdout); X } X } while (ch != CR); X } X X while (1) { X do { X sprintf (msg, "%s%c", txt_abort_edit_save_killfile, ch_default); X wait_message (msg); X MoveCursor(LINES, strlen (txt_abort_edit_save_killfile)); X if ((ch = ReadCh()) == CR) X ch = ch_default; X } while (ch != 'a' && ch != 'e' && ch != 's'); X switch (ch) { X case 'e': X start_line_offset = 2; X invoke_editor (killfile); X untag_all_articles (); X read_kill_file (); X reload_index_file (group_name, FALSE); X return TRUE; X X case 'a': X return FALSE; X X case 's': X if (kill_num > max_kill-1) { X expand_kill (); X } X if (text[0]) { X switch (counter) { X case KILL_SUBJ: X killf[kill_num].kill_subj = str_dup (text); X break; X case KILL_FROM: X killf[kill_num].kill_from = str_dup (text); X break; X case KILL_BOTH: X killf[kill_num].kill_subj = str_dup (text); X killf[kill_num].kill_from = str_dup (text); X break; X } X killf[kill_num].kill_type = counter; X if (kill_every_group) { X killf[kill_num].kill_group= 0L; X } else { X killf[kill_num].kill_group= hash_s (group_name); X } X kill_num++; X } else { X if (kill_subj_ok) { X killf[kill_num].kill_type = KILL_SUBJ; X killf[kill_num].kill_subj = str_dup (arts[index].subject); X } X if (kill_from_ok) { X killf[kill_num].kill_type |= KILL_FROM; X killf[kill_num].kill_from = str_dup (arts[index].from); X } X if (killf[kill_num].kill_type) { X if (kill_every_group) { X killf[kill_num].kill_group= 0L; X } else { X killf[kill_num].kill_group= hash_s (group_name); X } X kill_num++; X } X } X write_kill_file (); X return TRUE; X } X } X /* NOTREACHED */ X} X X Xint untag_all_articles () X{ X int untagged = FALSE; X register int i; X X for (i=0 ; i < top ; i++) { X if (arts[i].tagged) { X arts[i].tagged = FALSE; X untagged = TRUE; X } X } X num_of_tagged_files = 0; X X return (untagged); X} X X Xint kill_any_articles (group) X char *group; X{ X int killed = FALSE; X int run_ok = FALSE; X long group_hash; X register int i, j; X X if (! kill_articles) { X return killed; X } X X if (kill_num) { X group_hash = hash_s (group); X for (i=0 ; i < kill_num ; i++) { X if (killf[i].kill_group == 0L || X killf[i].kill_group == group_hash) { X run_ok = TRUE; X } X } X if (! run_ok) { X return (killed); X } X if (debug && ! update) { X wait_message ("Killing articles..."); X } X for (i=0 ; i < top ; i++) { X for (j=0 ; j < kill_num && ! arts[i].tagged ; j++) { X if (killf[j].kill_group == 0L || X killf[j].kill_group == group_hash) { X switch (killf[j].kill_type) { X case KILL_SUBJ: X#ifdef DONT_USE_REGEX X if (str_str (arts[i].subject, killf[j].kill_subj) != 0) { X#else X if (wildmat (arts[i].subject, killf[j].kill_subj)) { X#endif X X arts[i].tagged = TRUE; X killed = TRUE; X } X break; X case KILL_FROM: X#ifdef DONT_USE_REGEX X if (str_str (arts[i].from, killf[j].kill_from) != 0) { X#else X if (wildmat (arts[i].from, killf[j].kill_from)) { X#endif X arts[i].tagged = TRUE; X killed = TRUE; X } X break; X case KILL_BOTH: X#ifdef DONT_USE_REGEX X if (str_str (arts[i].subject, killf[j].kill_subj) != 0) { X#else X if (wildmat (arts[i].subject, killf[j].kill_subj)) { X#endif X arts[i].tagged = TRUE; X killed = TRUE; X } X#ifdef DONT_USE_REGEX X if (str_str (arts[i].from, killf[j].kill_from) != 0) { X#else X if (wildmat (arts[i].from, killf[j].kill_from)) { X#endif X arts[i].tagged = TRUE; X killed = TRUE; X } X break; X } X } X } X } X } X return (killed); X} SHAR_EOF echo "File kill.c is complete" && $TOUCH -am 0923175591 kill.c && chmod 0600 kill.c || echo "restore of kill.c failed" set `wc -c kill.c`;Wc_c=$1 if test "$Wc_c" != "9529"; then echo original size 9529, current size $Wc_c fi # ============= lang.c ============== echo "x - extracting lang.c (Text)" sed 's/^X//' << 'SHAR_EOF' > lang.c && X/* X * Project : tin - a visual threaded usenet newsreader X * Module : lang.c X * Author : R.Skrenta / I.Lea X * Created : 01-04-91 X * Updated : 24-09-91 X * Release : 1.0 X * Notes : X * Copyright : (c) Copyright 1991 by Rich Skrenta & Iain Lea X * You may freely copy or redistribute this software, X * so long as there is no profit made from its use, sale X * trade or reproduction. You may not change this copy- X * right notice, and it must be included in any copy made X */ X X#ifdef LANG_GERMAN X X#else X X/* X * art.c X */ X Xchar txt_group[] = "Group %s... "; Xchar txt_cannot_open_art[] = "can't open article %s: "; Xchar txt_indexing[] = "Indexing...%4d"; Xchar txt_corrupt_index[] = "Index file %s corrupted. error %d on article %d"; X X/* X * feed.c X */ X Xchar txt_art_thread_regex_tag[] = " a)rticle, t)hread, r)egex pattern, T)agged articles, e)xit: "; Xchar txt_post_procees_type[] = "Process n)one, s)har, u)udecode, U)udecode & zoo, p)atch: "; X#ifdef DONT_USE_REGEX Xchar txt_feed_pattern[] = "Enter pattern [%s]> "; X#else Xchar txt_feed_pattern[] = "Enter regex pattern [%s]> "; X#endif Xchar txt_no_command[] = "No command"; X X/* X * group.c X */ X Xchar txt_tagged_art[] = "tagged article"; Xchar txt_untagged_art[] = "untagged article"; Xchar txt_inverse_on[] = "Inverse video enabled"; Xchar txt_inverse_off[] = "Inverse video disabled"; Xchar txt_subscribed_to[] = "subscribed to %s"; Xchar txt_unsubscribed_to[] = "unsubscribed from %s"; Xchar txt_mark_all_read[] = "Mark everything as read? (y/n): "; Xchar txt_marked_as_read[] = "All articles marked as read"; Xchar txt_no_more_groups[] = "No more groups"; Xchar txt_no_prev_group[] = "No previous group"; Xchar txt_no_arts[] = "*** No Articles ***"; Xchar txt_no_groups[] = "*** No Groups ***"; Xchar txt_end_of_arts[] = "*** End of Articles ***"; Xchar txt_end_of_groups[] = "*** End of Groups ***"; Xchar txt_no_next_unread_art[] = "No next unread article"; Xchar txt_no_prev_unread_art[] = "No previous unread article"; Xchar txt_no_last_message[] = "No last message"; Xchar txt_bad_command[] = "Bad command. Type 'h' for help."; Xchar txt_you_have_mail[] = " You have mail\n"; Xchar txt_type_h_for_help[] = "Type 'h' for help\n"; Xchar txt_read_art[] = "Read article> "; Xchar txt_search_forwards[] = "Search forwards [%s]> "; Xchar txt_search_backwards[] = "Search backwards [%s]> "; Xchar txt_author_search_forwards[] = "Author search forwards [%s]> "; Xchar txt_author_search_backwards[] = "Author search backwards [%s]> "; Xchar txt_no_search_string[] = "No search string"; Xchar txt_no_match[] = "No match"; Xchar txt_post_subject[] = "Post Subject: "; Xchar txt_no_subject[] = "No subject"; Xchar txt_cannot_open[] = "can't open %s"; Xchar txt_posting[] = "Posting..."; Xchar txt_art_posted[] = "-- Article posted --"; Xchar txt_art_rejected[] = "-- Article rejected (saved to %s) --"; Xchar txt_abort_edit_post[] = "a)bort, e)dit, p)ost: "; Xchar txt_help_i_4[] = "4$ Select article 4 ($=select last article)\r\n"; Xchar txt_help_ctrl_k[] = "^K Kill current article\r\n"; Xchar txt_help_ctrl_l[] = "^L Redraw page\r\n"; Xchar txt_help_ctrl_d[] = "^D^U Down (^U=up) a page\r\n"; Xchar txt_help_i_cr[] = " Read current article\r\n"; Xchar txt_help_i_tab[] = " View next unread article or group\r\n"; Xchar txt_help_m[] = "m Move current group within group selection list\r\n"; Xchar txt_help_M[] = "M Menu of configurable options\r\n"; Xchar txt_help_a[] = "aA Author forward (A=backward) search\r\n"; Xchar txt_help_sel_c[] = "cC Mark group read (C=and goto next unread group)\r\n"; Xchar txt_help_c[] = "c Mark all articles as read and goto group selection menu\r\n"; Xchar txt_help_g[] = "g Choose a new group by name\r\n"; Xchar txt_help_I[] = "I Toggle inverse video\r\n"; Xchar txt_help_K[] = "K Mark article/thread as read & goto next unread\r\n"; Xchar txt_help_j[] = "jk Down (k=up) a line\r\n"; Xchar txt_help_i_n[] = "nN Goto next (N=next unread) group\r\n"; Xchar txt_help_i_p[] = "pP Goto previous (P=previous unread) group\r\n"; Xchar txt_help_q[] = "q Quit\r\n"; Xchar txt_help_s[] = "su Subscribe (u=unsubscribe) to current group\r\n"; Xchar txt_help_S[] = "SU Subscribe (U=unsubscribe) to groups that match pattern\r\n"; Xchar txt_help_t[] = "t Return to group selection index\r\n"; Xchar txt_help_T[] = "T Tag current article for mailing/piping/printing/saving\r\n"; Xchar txt_help_U[] = "U Untag all tagged articles\r\n"; Xchar txt_help_v[] = "v Show version information\r\n"; Xchar txt_help_w[] = "w Post an article to current group\r\n"; Xchar txt_help_i_search[] = "/? Subject forward (?=backward) search\r\n"; Xchar txt_help_thread[] = "<> Goto first (>=last) article in current thread"; Xchar txt_help_dash[] = "- Show last message\r\n"; X#ifdef DONT_USE_REGEX Xchar txt_save_pattern[] = "Enter save pattern [%s]> "; X#else Xchar txt_save_pattern[] = "Enter regex save pattern [%s]> "; X#endif Xchar txt_base_subdir[] = "Enter sub directory name> "; Xchar txt_saved_pattern_to[] = "-- Saved pattern to %s - %s --"; Xchar txt_saved_to_mailbox[] = "-- Saved to mailbox %s --"; Xchar txt_switch_on_kill_art_menu[] = "Kill Article Menu is switched OFF. Select Options Menu to switch it ON."; X X/* X * help.c: X */ X Xchar txt_group_select_com[] = "Group Selection Commands (page %d of %d)"; Xchar txt_index_page_com[] = "Index Page Commands (page %d of %d)"; Xchar txt_art_pager_com[] = "Article Pager Commands (page %d of %d)"; Xchar txt_hit_space_for_more[] = "PgDn,End,,^D - page down. PgUp,Home,b,^U - page up. ,q - quit"; Xchar txt_post_history_menu[] = "Posted articles history (page %d of %d)"; X X/* X * kill.c: X */ X Xchar txt_kill_menu[] = "Kill Article Menu"; Xchar txt_kill_subject[] = "Kill Subject [%-45s] (y/n): "; Xchar txt_kill_from[] = "Kill From [%-45s] (y/n): "; Xchar txt_kill_text[] = "Kill text pattern : "; Xchar txt_kill_text_type[] = "Apply pattern to : "; Xchar txt_kill_group[] = "Kill pattern scope: "; Xchar txt_help_kill_subject[] = "Subject: line to add to kill file. Press backspace key to clear field."; Xchar txt_help_kill_from[] = "From: line to add to kill file. Press backspace key to clear field."; Xchar txt_help_kill_text[] = "Enter text pattern to kill if Subject: & From: lines are not what you want."; Xchar txt_help_kill_text_type[] = "Select where text pattern should be applied. toggles & sets."; Xchar txt_help_kill_group[] = "Apply kill to current group only or all groups. toggles & sets."; Xchar txt_abort_edit_save_killfile[] = "a)bort e)dit s)ave killfile: "; X X X/* X * main.c: X */ X Xchar txt_not_in_active_file[] = "Group %s not found in active file"; Xchar txt_screen_init_failed[] = "Screen initialization failed"; Xchar txt_bad_active_file[] = "Active file corrupt"; X X/* X * misc.c X */ X Xchar txt_cannot_find_base_art[] = "Cannot find base article %s"; Xchar txt_out_of_memory[] = "%s: out of memory"; Xchar txt_rename_error[] = "Error: rename %s to %s"; Xchar txt_shell_escape[] = "Enter shell command> "; X X/* X * nntp_open.c X */ X Xchar txt_cannot_get_nntp_server_name[] = "Cannot get nntp server name\n"; Xchar txt_server_name_in_file_env_var[] = "Either put the name in the file %s,\nor put it in the environment variable NNTPSERVER\n"; Xchar txt_failed_to_connect_to_server[] = "failed to connect to (%s) server\n"; Xchar txt_rejected_by_nntpserver[] = "rejected by server, nntp error %d\n"; Xchar txt_connection_to_server_broken[] = "connection to server broken\n"; Xchar txt_stuff_nntp_cannot_open[] = "stuff_nntp: can't open %s: "; Xchar txt_nntp_to_fp_cannot_reopen[] = "nntp_to_fp: can't reopen %s: "; Xchar txt_nntp_to_fd_cannot_reopen[] = "nntp_to_fd: can't reopen %s: "; X X/* X * page.c X */ X Xchar txt_quit[] = "Do you really want to quit? (y/n): "; Xchar txt_art_unavailable[] = "[Article %ld unvailable]\r\r"; Xchar txt_art_marked_as_unread[] = "Article marked as unread"; Xchar txt_thread_marked_as_unread[] = "Thread marked as unread"; Xchar txt_begin_of_art[] = "*** Beginning of article ***"; Xchar txt_next_resp[] = "-- Next response --"; Xchar txt_last_resp[] = "-- Last response --"; Xchar txt_more[] = "--More--"; Xchar txt_more_percent[] = "--More--(%d%%) [%ld/%ld]"; Xchar txt_thread_x_of_n[] = "%sThread %3d of %3d\r\n"; Xchar txt_art[] = "Article %ld "; Xchar txt_resp_x_of_n[] = "Respno %3d of %3d\r\n"; Xchar txt_no_resp[] = "No responses\r\n"; Xchar txt_1_resp[] = "1 Response\r\n"; Xchar txt_x_resp[] = "%d Responses\r\n"; Xchar txt_s_at_s[] = "%s at %s"; Xchar txt_thread_resp_page[] = "Thread %d of %d, Resp %d (page %d): %s"; Xchar txt_thread_page[] = "Thread %d of %d (page %d): %s"; Xchar txt_read_resp[] = "Read response> "; Xchar txt_help_p_0[] = "0 Read the base article in current thread\r\n"; Xchar txt_help_p_4[] = "4 Read response 4 in current thread\r\n"; Xchar txt_help_p_cr[] = " Goto to next thread\r\n"; Xchar txt_help_p_tab[] = " Advance to next page or unread article\r\n"; Xchar txt_help_b[] = "b Back (=forward) a page\r\n"; Xchar txt_help_bug[] = "B Mail bug/gripe/comment to %s\r\n"; Xchar txt_help_p_f[] = "fF Post (F=copy text) a followup\r\n"; Xchar txt_help_C[] = "C Cancel current article that must have been posted by you\r\n"; Xchar txt_help_ctrl_h[] = "^H Show articles header\r\n"; Xchar txt_help_h[] = "hH Command (H=context sensitive) help\r\n"; Xchar txt_help_p_i[] = "i Return to index page\r\n"; Xchar txt_help_p_k[] = "kK Mark article (K=thread) as read & advance to next unread\r\n"; Xchar txt_help_p_m[] = "m Mail article/thread/pattern/tagged articles to someone\r\n"; Xchar txt_help_p_n[] = "nN Goto to the next (N=unread) article\r\n"; Xchar txt_help_o[] = "o Output article/thread/pattern/tagged articles to printer\r\n"; Xchar txt_help_p_p[] = "pP Goto the previous (P=unread) article\r\n"; Xchar txt_help_p_r[] = "rR Reply through mail (R=copy text) to author\r\n"; Xchar txt_help_p_s[] = "s Save article/thread/pattern/tagged articles to file\r\n"; Xchar txt_help_p_z[] = "zZ Mark article (Z=thread) as unread\r\n"; Xchar txt_help_p_ctrl_r[] = "^R$ Redisplay first ($=last) page of article\r\n"; Xchar txt_help_p_g[] = "gG Goto first (G=last) page of article\r\n"; Xchar txt_help_p_d[] = "d Toggle rot-13 decoding for current article\r\n"; Xchar txt_help_pipe[] = "| Pipe article/thread/pattern/tagged articles into command\r\n"; Xchar txt_help_p_search[] = "/ Article forward search\r\n"; Xchar txt_mail_art_to[] = "Mail article to [%s]> "; Xchar txt_no_mail_address[] = "No mail address"; Xchar txt_abort_edit_send[] = "a)bort, e)dit, s)end"; Xchar txt_abort_edit_cancel[] = "a)bort, e)dit, c)ancel"; Xchar txt_cancelling[] = "Cancelling article..."; Xchar txt_art_cancelled[] = "Article cancelled"; Xchar txt_mailing_to[] = "Mailing to %s..."; Xchar txt_message_sent[] = "-- Article(s) Mailed --"; Xchar txt_command_failed_s[] = "Command failed: %s\n"; Xchar txt_in_art_you_write[] = "In article %s you write:\n"; Xchar txt_resp_to_poster[] = "Responses have been directed to the poster. Post anyway? (y/n): "; Xchar txt_resp_redirect[] = "Responses have been directed to the following newsgroups"; Xchar txt_continue[] = "Continue? (y/n): "; Xchar txt_writes[] = "%s writes:\n"; Xchar txt_save_filename[] = "Save filename [%s]> "; Xchar txt_art_not_saved[] = "-- Article not saved --"; Xchar txt_no_filename[] = "No filename"; Xchar txt_saving[] = "Saving..."; Xchar txt_art_saved_to[] = "-- Article saved to %s --"; Xchar txt_thread_not_saved[] = "-- Thread not saved --"; Xchar txt_thread_saved_to_many[] = "-- Thread saved to %s - %s --"; Xchar txt_thread_saved_to[] = "-- Thread saved to %s --"; Xchar txt_pipe_to_command[] = "Pipe to command [%s]: "; Xchar txt_error_printing_art[] = "-- Error printing article --"; Xchar txt_printing[] = "Printing..."; Xchar txt_printed[] = "-- Article(s) printed --"; Xchar txt_append_to_file[] = "File %s exists. Append? (y/n): "; Xchar txt_toggled_rot13[] = "Toggled rot13 encoding"; X X/* X * post.c X */ X Xchar txt_no_arts_posted[] = "No articles have been posted"; X X/* X * prompt.c X */ X Xchar txt_hit_any_key[] = "-- Hit any key to continue --"; X X/* X * rcfile.c X */ X Xchar txt_opt_autosave[] = " 1. Auto save : "; Xchar txt_opt_save_separate[] = " 2. Save separate : "; Xchar txt_opt_mark_saved_read[] = " 3. Mark saved read : "; Xchar txt_opt_kill_articles[] = " 4. Kill articles : "; Xchar txt_opt_show_author[] = " 5. Show Author : "; Xchar txt_opt_draw_arrow[] = " 6. Draw arrow : "; Xchar txt_opt_print_header[] = " 7. Print header : "; Xchar txt_opt_pos_first_unread[] = " 8. Goto 1st unread : "; Xchar txt_opt_process_type[] = " 9. Process type : "; Xchar txt_opt_sort_type[] = " 10 Sort article by : "; Xchar txt_opt_savedir[] = " 11 Save directory : "; Xchar txt_opt_maildir[] = " 12 Mail directory : "; Xchar txt_opt_printer[] = " 13 Printer : "; Xchar txt_options_menu[] = "Options Menu"; Xchar txt_post_process_none[] = "None"; Xchar txt_post_process_sh[] = "Shell archive"; Xchar txt_post_process_uudecode[] = "Uudecode"; Xchar txt_post_process_uud_lst_zoo[] = "Uudecode & list zoo archive"; Xchar txt_post_process_uud_ext_zoo[] = "Uudecode & extract zoo archive"; Xchar txt_post_process_patch[] = "Patch"; Xchar txt_sort_by_nothing[] = "Nothing"; Xchar txt_sort_by_subj_descend[] = "Subject: field (descending)"; Xchar txt_sort_by_subj_ascend[] = "Subject: field (ascending)"; Xchar txt_sort_by_from_descend[] = "From: field (descending)"; Xchar txt_sort_by_from_ascend[] = "From: field (ascending)"; Xchar txt_sort_by_date_descend[] = "Date: field (descending)"; Xchar txt_sort_by_date_ascend[] = "Date: field (ascending)"; Xchar txt_help_autosave[] = "Auto save article/thread by Archive-name: header. toggles & sets."; Xchar txt_help_save_separate[] = "Save articles/threads to separate files. toggles & sets."; Xchar txt_help_print_header[] = "Print complete mail header or Subject: & From:. toggles & sets."; Xchar txt_help_pos_first_unread[] = "Put cursor at first/last unread art in groups. toggles & sets."; Xchar txt_help_show_author[] = "Show Subject & From (author) fields in group menu. toggles & sets."; Xchar txt_help_draw_arrow[] = "Draw -> or highlighted bar for selection. toggles & sets."; Xchar txt_help_kill_articles[] = "Kill articles that match entries in kill file. toggles & sets."; Xchar txt_help_mark_saved_read[] = "Mark saved articles/threads as read. toggles & sets."; Xchar txt_help_post_proc_type[] = "Post process (ie. unshar) saved article/thread. toggles & sets."; Xchar txt_help_sort_type[] = "Sort articles by Subject, From or Date fields. toggles & sets."; Xchar txt_help_savedir[] = "The directory where you want articles/threads saved."; Xchar txt_help_maildir[] = "The directory where articles/threads are to be saved in mailbox format."; Xchar txt_help_printer[] = "The printer program with options that is to be used to print articles/threads."; Xchar txt_select_rcfile_option[] = "Select option by entering number before text. Any other key to save."; Xchar txt_save_options[] = "Save options? (y/n): "; X X/* X * save.c X */ X Xchar txt_post_processing[] = "Post processing..."; Xchar txt_post_processing_finished[] = "-- post processing completed --"; Xchar txt_deleting[] = "Deleting..."; X X/* X * search.c X */ X Xchar txt_searching[] = "Searching..."; X X/* X * select.c X */ X Xchar txt_moving[] = "Moving..."; X#ifdef DONT_USE_REGEX Xchar txt_subscribe_pattern[] = "Enter subscribe pattern> "; Xchar txt_unsubscribe_pattern[] = "Enter unsubscribe pattern> "; X#else Xchar txt_subscribe_pattern[] = "Enter regex subscribe pattern> "; Xchar txt_unsubscribe_pattern[] = "Enter regex unsubscribe pattern> "; X#endif Xchar txt_subscribing[] = "Subscribing..."; Xchar txt_subscribing_to[] = "Subscribing to %s..."; Xchar txt_unsubscribing[] = "Unsubscribing..."; Xchar txt_unsubscribing_from[] = "Unsubscribing from %s..."; Xchar txt_subscribed_num_groups[] = "subscribed to %d groups"; Xchar txt_unsubscribed_num_groups[] = "unsubscribed from %d groups"; Xchar txt_del_group_in_newsrc[] = "Delete %s from .newsrc? (y/n): "; Xchar txt_group_deleted[] = "Group %s deleted"; Xchar txt_group_undeleted[] = "Group undeleted"; Xchar txt_mark_group_read[] = "Mark group as read? (y/n): "; Xchar txt_no_groups_to_delete[] = "No groups to delete"; Xchar txt_reset_newsrc[] = "Reset newsrc? (y/n): "; Xchar txt_no_groups_to_read[] = "No more groups to read"; Xchar txt_added_groups[] = "Added %d group%s"; Xchar txt_plural[] = "s"; Xchar txt_no_groups_to_yank_in[] = "No more groups to yank in"; Xchar txt_group_selection[] = "Group Selection"; Xchar txt_select_group[] = "Select group> "; Xchar txt_help_g_4[] = "4$ Select group 4 ($=select last group)\r\n"; Xchar txt_help_g_ctrl_r[] = "^R Reset .newsrc\r\n"; Xchar txt_help_g_ctrl_k[] = "^KZ Delete (Z=undelete) group from .newsrc\r\n"; Xchar txt_help_g_cr[] = " Read current group\r\n"; Xchar txt_help_g_tab[] = " View next unread group\r\n"; Xchar txt_help_g_c[] = "c Mark group as all read\r\n"; Xchar txt_help_W[] = "W List articles posted by user\r\n"; Xchar txt_help_g_z[] = "z Mark current group as unread\r\n"; Xchar txt_help_g_y[] = "y Yank in groups that are not in the .newsrc\r\n"; Xchar txt_help_g_dollar[] = "Y Reread group list from .newsrc\r\n"; Xchar txt_help_g_search[] = "/? Group forward (?=backward) search\r\n"; Xchar txt_newsgroup[] = "Newsgroup> "; Xchar txt_newsgroup_position[] = "Position %s in group list [1,2,..,$]> "; X X/* X * signal.c X */ X Xchar txt_resizing_window[] = "resizing window"; X X#endif X SHAR_EOF $TOUCH -am 0924140191 lang.c && chmod 0600 lang.c || echo "restore of lang.c failed" set `wc -c lang.c`;Wc_c=$1 if test "$Wc_c" != "17911"; then echo original size 17911, current size $Wc_c fi # ============= main.c ============== echo "x - extracting main.c (Text)" sed 's/^X//' << 'SHAR_EOF' > main.c && X/* X * Project : tin - a visual threaded usenet newsreader X * Module : main.c X * Author : R.Skrenta / I.Lea X * Created : 01-04-91 X * Updated : 24-09-91 X * Release : 1.0 X * Notes : X * Copyright : (c) Copyright 1991 by Rich Skrenta & Iain Lea X * You may freely copy or redistribute this software, X * so long as there is no profit made from its use, sale X * trade or reproduction. You may not change this copy- X * right notice, and it must be included in any copy made X */ X X#include "tin.h" X Xchar *version = "v1.0"; Xchar cvers[LEN+1]; Xchar nntp_server[LEN+1]; X Xint NOTESLINES; /* set in set_win_size () */ Xint RIGHT_POS; /* set in set_win_size () */ Xint MORE_POS; /* set in set_win_size () */ Xint max_subj = 0; Xint max_from = 0; Xint max_active; Xint group_hash[TABLE_SIZE]; /* group name --> active[] */ Xint *my_group; /* .newsrc --> active[] */ Xint *unread; /* highest art read in group */ Xint num_active; /* one past top of active */ Xint local_top; /* one past top of my_group */ Xint catchup = FALSE; /* mark all arts read in all subscribed groups */ Xint update = FALSE; /* update index files only mode */ Xint update_fork = FALSE; /* update index files by forked tin -u */ Xint verbose = FALSE; /* update index files only mode */ Xint start_line_offset; /* used by invoke_editor for line no. */ Xint read_news_via_nntp = FALSE; /* read news locally or via NNTP */ Xint max_art; Xint top = 0; Xint top_base; Xint tin_uid; Xint tin_gid; Xint real_uid; Xint real_gid; Xint local_index; /* do private indexing? */ X Xlong *base; X Xstruct group_ent *active; /* active file */ Xstruct header *arts; X X Xvoid main (argc, argv) X int argc; X char *argv[]; X{ X extern int optind; X extern char *optarg; X int c, i, created; X int notify_new_groups = FALSE; X struct stat st; X X debug = FALSE; X X set_signal_handlers (); X X basename (argv[0], progname); X X tin_uid = geteuid (); X tin_gid = getegid (); X real_uid = getuid (); X real_gid = getgid (); X X /* X * we're setuid, so index in /usr/spool/news unless user root X */ X if (tin_uid != real_uid && real_uid != 0) { X local_index = FALSE; X } else { /* index in users home directory ~/.tin/.index */ X local_index = TRUE; X } X X init_selfinfo (); /* set up char *'s: homedir, newsrc, etc. */ X init_alloc (); /* allocate initial array sizes */ X X while ((c = getopt (argc, argv, "cd:Df:hm:M:np:rs:SuUv")) != EOF) { X switch(c) { X case 'c': X catchup = TRUE; X update = TRUE; X break; X X case 'd': X my_strncpy (savedir, optarg, LEN); X set_real_uid_gid (); X if (stat (savedir, &st) == -1) { X mkdir (savedir, 0755); X } X set_tin_uid_gid (); X break; X X case 'D': /* debug mode */ X debug = TRUE; X break; X X case 'f': X my_strncpy (newsrc, optarg, LEN); X break; X X case 'm': X my_strncpy (mailer, optarg, LEN); X break; X X case 'M': X my_strncpy (maildir, optarg, LEN); X set_real_uid_gid (); X if (stat (maildir, &st) == -1) { X mkdir (maildir, 0755); X } X set_tin_uid_gid (); X break; X X case 'n': X notify_new_groups = TRUE; X break; X X case 'p': X my_strncpy (printer, optarg, LEN); X default_printer = FALSE; X break; X X case 'r': /* read news remotely from default NNTP server */ X#ifdef USE_NNTP X read_news_via_nntp = TRUE; X#else X printf ("Option not enabled. Recompile %s with -DUSE_NNTP.\n", progname); X exit (1); X#endif X break; X X case 's': X my_strncpy (spooldir, optarg, LEN); X break; X X case 'S': /* save new news to dir structure */ X save_news = TRUE; X update = TRUE; X break; X X case 'u': X update = TRUE; X break; X X case 'U': X update_fork = TRUE; X update = TRUE; X break; X X case 'v': X verbose = TRUE; X update = TRUE; X break; X X case 'h': X case '?': X default: X usage (progname); X exit (1); X } X } X X sprintf (page_header, "%s %s PL%d%s", progname, version, PATCHLEVEL, is_remote ()); X sprintf (cvers, "%s (c) Copyright 1991 Iain Lea.", page_header); X X if (! update) { X printf ("%s\n", cvers); X fflush (stdout); X } X X hash_init (); X for (i = 0; i < TABLE_SIZE; i++) { X group_hash[i] = -1; X } X X nntp_startup (); /* connect server if we are using nntp */ X created = read_active (); /* load the active file into active[] */ X X if (optind < argc) { X while (optind < argc) { X if (add_group (argv[optind], TRUE) < 0) { X error_message (txt_not_in_active_file, argv[optind]); X } X optind++; X } X } else { X backup_newsrc (); X read_newsrc (TRUE); X } X X if (kill_articles) { /* read in users kill file */ X read_kill_file (); X } X X /* X * save any new articles to savedir structure for later reading X */ X if (save_news) { X do_update (); X save_any_news (); X exit (0); X } X X /* X * update index files X */ X X if (update || update_fork) { X COLS = DEFAULT_COLS; /* set because curses has not started */ X if (update_fork) { X catchup = FALSE; /* turn off msgs when running forked */ X verbose = FALSE; X if (fork () == 0) { /* fork child to update indexes in background */ X do_update (); X exit (0); X } X } else { X do_update (); X exit (0); X } X } X X if (! InitScreen ()) { X error_message (txt_screen_init_failed, ""); X exit (1); X } X X ScreenSize (&LINES, &COLS); /* screen size from termcap entry */ X Raw (TRUE); X X set_win_size (&LINES, &COLS); /* screen size doing ioctl() call */ X X if (notify_new_groups && ! created) { /* check for new groups */ X notify_groups (); X } X X mail_setup (); /* record mailbox size for "you have mail" */ X X selection_index (); X X tin_done (0); X} X X/* X * usage X */ X Xvoid usage (progname) X char *progname; X{ X sprintf (msg, "%s %s PL%d - threaded usenet newsreader. Copyright 1991 Iain Lea.\n", progname, version, PATCHLEVEL); X error_message (msg, ""); X error_message ("Usage: %s [options] [newsgroups]", progname); X error_message (" -c mark all articles as read in subscribed newsgroups", ""); X error_message (" -d dir save articles to directory [default=%s]", savedir); X error_message (" -f file subscribed newsgroups file [default=%s]", newsrc); X error_message (" -h help", ""); X error_message (" -m file mail program [default=%s]", DEFAULT_MAILER); X error_message (" -n notify user of any new newsgroups since last session", ""); X error_message (" -M dir mailbox directory [default=%s]", maildir); X error_message (" -p file print program with options [default=%s]", DEFAULT_PRINTER); X error_message (" -r read news remotely from default NNTP server", DEFAULT_PRINTER); X error_message (" -s dir spool directory [default=%s]", SPOOLDIR); X error_message (" -S save all new articles for later reading"); X error_message (" -u update index files only", ""); X error_message (" -U fork %s -u to update index files in background", progname); X error_message (" -v update index files only (verbose)", ""); X error_message ("\nMail bug reports/gripes/comments to %s", BUG_REPORT_ADDRESS); X} SHAR_EOF $TOUCH -am 0924140991 main.c && chmod 0600 main.c || echo "restore of main.c failed" set `wc -c main.c`;Wc_c=$1 if test "$Wc_c" != "7015"; then echo original size 7015, current size $Wc_c fi # ============= memory.c ============== echo "x - extracting memory.c (Text)" sed 's/^X//' << 'SHAR_EOF' > memory.c && X/* X * Project : tin - a visual threaded usenet newsreader X * Module : memory.c X * Author : R.Skrenta / I.Lea X * Created : 01-04-91 X * Updated : 10-09-91 X * Release : 1.0 X * Notes : X * Copyright : (c) Copyright 1991 by Rich Skrenta & Iain Lea X * You may freely copy or redistribute this software, X * so long as there is no profit made from its use, sale X * trade or reproduction. You may not change this copy- X * right notice, and it must be included in any copy made X */ X X#include "tin.h" X Xint active_num = 0; Xint article_num = 0; X X/* X * Dynamic table management X * These settings are memory conservative: small initial allocations X * and a 50% expansion on table overflow. A fast vm system with X * much memory might want to start with higher initial allocations X * and a 100% expansion on overflow, especially for the arts[] array. X */ X Xvoid init_alloc () X{ X if (active_num) { /* initial alloc */ X max_active = active_num; X } else { X max_active = DEFAULT_ACTIVE_NUM; X } X X active = (struct group_ent *) my_malloc ((unsigned) sizeof(*active) * max_active); X my_group = (int *) my_malloc ((unsigned) sizeof(int) * max_active); X unread = (int *) my_malloc ((unsigned) sizeof(int) * max_active); X X if(article_num) { /* initial alloc */ X max_art = article_num; X } else { X max_art = DEFAULT_ARTICLE_NUM; X } X X arts = (struct header *) my_malloc ((unsigned) sizeof(*arts) * max_art); X base = (long *) my_malloc ((unsigned) sizeof(long) * max_art); X X max_kill = DEFAULT_KILL_NUM; X X killf = (struct kill_t *) my_malloc ((unsigned) sizeof(*killf) * max_kill); X X max_save = DEFAULT_SAVE_NUM; X X save = (struct save_t *) my_malloc ((unsigned) sizeof(*save) * max_save); X X screen = (struct screen_t *) 0; X} X X Xvoid expand_art() X{ X max_art += max_art / 2; /* increase by 50% */ X X arts = (struct header *) my_realloc ((char *) arts, (unsigned) sizeof(*arts) * max_art); X base = (long *) my_realloc ((char *) base, (unsigned) sizeof(long) * max_art); X} X X Xvoid free_art_array () X{ X register int i; X X for (i=0 ; i < top ; i++) { X arts[i].artnum = 0L; X arts[i].thread = ART_NORMAL; X arts[i].inthread = FALSE; X arts[i].unread = ART_UNREAD; X arts[i].tagged = FALSE; X if (arts[i].part != (char *) 0) { X free (arts[i].part); X arts[i].part = (char *) 0; X } X if (arts[i].patch != (char *) 0) { X free (arts[i].patch); X arts[i].patch = (char *) 0; X } X } X} X X Xvoid expand_active() X{ X max_active += max_active / 2; /* increase by 50% */ X X active = (struct group_ent *) my_realloc((char *) active, X (unsigned) sizeof(*active) * max_active); X my_group = (int *) my_realloc((char *) my_group, (unsigned) sizeof(int) * max_active); X unread = (int *) my_realloc((char *) unread, (unsigned) sizeof(int) * max_active); X} X X Xvoid expand_kill() X{ X max_kill += max_kill / 2; /* increase by 50% */ X X killf = (struct kill_t *) my_realloc((char *) killf, (unsigned) sizeof(struct kill_t) * max_kill); X} X X Xvoid expand_save() X{ X max_save += max_save / 2; /* increase by 50% */ X X save = (struct save_t *) my_realloc((char *) save, (unsigned) sizeof(struct save_t) * max_save); X} X X Xvoid init_screen_array (allocate) X int allocate; X{ X int i; X X if (allocate) { X screen = (struct screen_t *) my_malloc((unsigned) sizeof(*screen) * LINES); X X for (i=0 ; i < LINES ; i++) { X screen[i].col = (char *) my_malloc ((unsigned) COLS+1); X } X } else { X if (screen != (struct screen_t *) 0) { X for (i=0 ; i < LINES ; i++) { X if (screen[i].col != (char *) 0) { X free (screen[i].col); X screen[i].col = (char *) 0; X } X } X X free (screen); X screen = (struct screen_t *) 0; X } X } X} X X Xvoid free_all_arrays () X{ X register int i; X X hash_reclaim (); X X init_screen_array (FALSE); X X free_art_array (); X X if (my_group != (int *) 0) { X free (my_group); X my_group = (int *) 0; X } X X if (unread != (int *) 0) { X free (unread); X unread = (int *) 0; X } X X if (base != (long *) 0) { X free (base); X base = (long *) 0; X } X X if (killf != (struct kill_t *) 0) { X free_kill_array (); X if (killf != (struct kill_t *) 0) { X free (killf); X killf = (struct kill_t *) 0; X } X } X X if (save != (struct save_t *) 0) { X free_save_array (); X if (save != (struct save_t *) 0) { X free (save); X save = (struct save_t *) 0; X } X } X X if (active != (struct group_ent *) 0) { X for (i=0 ; i < max_active ; i++) { X if (active[i].name != (char *) 0) { X free (active[i].name); X active[i].name = (char *) 0; X } X } X if (active != (struct group_ent *) 0) { X free (active); X active = (struct group_ent *) 0; X } X } X X if (arts != (struct header *) 0) { X free (arts); X arts = (struct header *) 0; X } X} X X Xvoid free_kill_array () X{ X int i; X X for (i=0 ; i < kill_num ; i++) { X if (killf[i].kill_subj != (char *) 0) { X free (killf[i].kill_subj); X killf[i].kill_subj = (char *) 0; X } X if (killf[i].kill_from != (char *) 0) { X free (killf[i].kill_from); X killf[i].kill_from = (char *) 0; X } X } X} X X X/* X * reset save list array to 0 and free's all its allocated memory X */ X Xvoid free_save_array () X{ X int i; X X for (i=0 ; i < save_num ; i++) { X if (save[i].subject != (char *) 0) { X free (save[i].subject); X save[i].subject = (char *) 0; X } X if (save[i].archive != (char *) 0) { X free (save[i].archive); X save[i].archive = (char *) 0; X } X if (save[i].dir != (char *) 0) { X free (save[i].dir); X save[i].dir = (char *) 0; X } X if (save[i].file != (char *) 0) { X free (save[i].file); X save[i].file = (char *) 0; X } X if (save[i].part != (char *) 0) { X free (save[i].part); X save[i].part = (char *) 0; X } X if (save[i].patch != (char *) 0) { X free (save[i].patch); X save[i].patch = (char *) 0; X } X save[i].index = -1; X save[i].saved = FALSE; X save[i].is_mailbox = FALSE; X } X X save_num = 0; X} X Xchar *my_malloc (size) X unsigned size; X{ X char *p; X X if ((p = (char *) calloc (1, (int) size)) == NULL) { X error_message (txt_out_of_memory, progname); X exit (1); X } X return p; X} X X Xchar *my_realloc (p, size) X char *p; X unsigned size; X{ X if (! p) { X p = (char *) calloc (1, (int) size); X } else { X p = (char *) realloc (p, (int) size); X } X X if (! p) { X error_message (txt_out_of_memory, progname); X exit (1); X } X return p; X} SHAR_EOF $TOUCH -am 0923175591 memory.c && chmod 0600 memory.c || echo "restore of memory.c failed" set `wc -c memory.c`;Wc_c=$1 if test "$Wc_c" != "6239"; then echo original size 6239, current size $Wc_c fi # ============= misc.c ============== echo "x - extracting misc.c (Text)" sed 's/^X//' << 'SHAR_EOF' > misc.c && X/* X * Project : tin - a visual threaded usenet newsreader X * Module : misc.c X * Author : R.Skrenta / I.Lea X * Created : 01-04-91 X * Updated : 23-09-91 X * Release : 1.0 X * Notes : X * Copyright : (c) Copyright 1991 by Rich Skrenta & Iain Lea X * You may freely copy or redistribute this software, X * so long as there is no profit made from its use, sale X * trade or reproduction. You may not change this copy- X * right notice, and it must be included in any copy made X */ X X#include "tin.h" X X Xchar *mailbox_name = (char *) 0; Xint mailbox_size; X Xchar rcdir[LEN+1]; Xchar rcfile[LEN+1]; Xchar indexdir[LEN+1]; Xchar killfile[LEN+1]; Xchar postfile[LEN+1]; X Xchar active_file[LEN+1]; Xchar homedir[LEN+1]; Xchar userid[LEN+1]; Xchar delgroups[LEN+1]; Xchar newsrc[LEN+1]; Xchar newnewsrc[LEN+1]; Xchar add_addr[LEN+1]; /* address to add to rR reply to author with mail */ Xchar bug_addr[LEN+1]; /* address to add send bug reports to */ Xchar txt_help_bug_report[LEN+1]; /* address to add send bug reports to */ Xchar reply_to[LEN+1]; /* reply-to address */ Xchar my_org[LEN+1]; /* organization */ Xchar sig[LEN+1]; Xchar signature[LEN+1]; Xchar killsubj[LEN+1]; /* contains Subject:'s not to be shown */ Xchar killfrom[LEN+1]; /* conatins From:'s not to be shown */ Xchar page_header[LEN+1]; /* page header of pgm name and version */ Xchar savedir[LEN+1]; /* directory to save articles to */ Xchar spooldir[LEN+1]; /* directory where new is */ Xchar mailer[LEN+1]; /* mail program */ Xchar maildir[LEN+1]; /* mailbox dir where = saves are stored */ Xchar mailbox[LEN+1]; /* system mailbox for each user */ Xchar printer[LEN+1]; /* printer program */ Xchar article[LEN+1]; /* ~/.article file */ Xchar dead_article[LEN+1]; /* ~/dead.article file */ Xchar progname[LEN+1]; /* program name */ Xint sort_art_type; /* sort arts[] array by subject,from or date field */ Xint save_separate; /* save a each part of a thread to a separate file */ Xint save_archive_name; /* save thread with name from Archive-name: field */ Xint print_header; /* print all of mail header or just Subject: & From lines */ Xint pos_first_unread; /* position cursor at first/last unread article */ Xint show_author; /* show Subject & From or only Subject in group menu */ Xint draw_arrow_mark; /* draw -> or highlighted bar */ Xint kill_articles; /* kill articles matching kill file contents */ Xint mark_saved_read; /* mark saved article/thread as read */ Xint post_proc_type; /* type of post processing to be performed */ Xint default_printer; /* set to false if user give a printer with -p switch */ Xint save_news; /* save all arts to savedir structure */ Xint num_of_tagged_files; X X/* X * init_selfinfo X * Deterimines users home directory, userid, and a path X * for an rc file in the home directory X */ X Xvoid init_selfinfo () X{ X char nam[LEN+1]; X char *p; X extern char *getenv(); X extern struct passwd *getpwuid(); X FILE *fp; X struct passwd *myentry; X struct stat sb; X X myentry = getpwuid (getuid ()); X strcpy (userid, myentry->pw_name); X X if ((p = getenv("HOME")) != NULL) { X strcpy (homedir, p); X } else { X strcpy (homedir, myentry->pw_dir); X } X X#ifdef USE_INVERSE_HACK X draw_arrow_mark = TRUE; X#else X draw_arrow_mark = FALSE; X#endif X#ifdef BSD X default_printer = TRUE; X#else X default_printer = FALSE; X#endif X kill_articles = FALSE; X mark_saved_read = TRUE; X num_of_tagged_files = 0; X post_proc_type = POST_PROC_NONE; X pos_first_unread = TRUE; X print_header = FALSE; X save_separate = TRUE; X save_archive_name = TRUE; X show_author = TRUE; X sort_art_type = SORT_BY_NOTHING; X save_news = FALSE; X X killsubj[0] = '\0'; X killfrom[0] = '\0'; X X nntp_server[0] = '\0'; X author_search_string[0] = '\0'; X group_search_string[0] = '\0'; X subject_search_string[0] = '\0'; X art_search_string[0] = '\0'; X default_mail_address[0] = '\0'; X default_regex_pattern[0] = '\0'; X default_save_file[0] = '\0'; X X sprintf (rcdir, "%s/%s", get_val ("TINDIR", homedir), RCDIR); X sprintf (indexdir, "%s/%s", rcdir, INDEXDIR); X sprintf (rcfile, "%s/%s", rcdir, RCFILE); X sprintf (killfile, "%s/%s", rcdir, KILLFILE); X sprintf (postfile, "%s/%s", rcdir, POSTFILE); X X sprintf (signature, "%s/.signature", homedir); X sprintf (sig, "%s/.Sig", homedir); X sprintf (newsrc, "%s/.newsrc", homedir); X sprintf (newnewsrc, "%s/.newnewsrc", homedir); X sprintf (delgroups, "%s/.delgroups", homedir); X sprintf (active_file, "%s/active", LIBDIR); X sprintf (savedir, "%s/News", homedir); X sprintf (maildir, "%s/%s", homedir, DEFAULT_MAILDIR); X sprintf (mailbox, "%s/%s", DEFAULT_MAILBOX, userid); X sprintf (dead_article, "%s/dead.article", homedir); X sprintf (article, "%s/.article", homedir); X X strcpy (mailer, DEFAULT_MAILER); X strcpy (printer, DEFAULT_PRINTER); X strcpy (spooldir, SPOOLDIR); X strcpy (bug_addr, BUG_REPORT_ADDRESS); X X set_real_uid_gid (); X X if (stat (rcdir, &sb) == -1) { X mkdir (rcdir, 0755); X } X if (stat (indexdir, &sb) == -1) { X mkdir (indexdir, 0755); X } X if (stat (postfile, &sb) == -1) { X if ((fp = fopen (postfile, "w")) != NULL) { X fclose (fp); X } X } X X read_rcfile (); X X if (stat (savedir, &sb) == -1) { X mkdir (savedir, 0755); X } X if (stat (maildir, &sb) == -1) { X mkdir (maildir, 0755); X } X if (stat (active_file, &sb) >= 0) X goto got_active; X X/* X * I hate forgetting to define LIBDIR correctly. Guess a X * couple of likely places if it's not where LIBDIR says it is. X */ X X strcpy (active_file, "/usr/lib/news/active"); X if (stat (active_file, &sb) >= 0) X goto got_active; X X strcpy (active_file, "/usr/local/lib/news/active"); X if (stat (active_file, &sb) >= 0) X goto got_active; X X strcpy (active_file, "/usr/public/lib/news/active"); X if (stat (active_file, &sb) >= 0) X goto got_active; X X/* X * Oh well. Revert to what LIBDIR says it is to produce a X * useful error message when read_active () fails later. X */ X X sprintf (active_file, "%s/active", LIBDIR); X Xgot_active: X X/* X * check enviroment for organization X */ X my_org[0] = '\0'; X if ((p = getenv ("ORGANIZATION")) != NULL) { X my_strncpy (my_org, p, LEN); X goto got_org; X } X X/* X * check ~/.org for organization X */ X sprintf (nam, "%s/organization", rcdir); X fp = fopen (nam, "r"); X X/* X * check LIBDIR/organization for system wide organization X */ X if (fp == NULL) { X sprintf (nam, "%s/organization", LIBDIR); X fp = fopen (nam, "r"); X } X X if (fp == NULL) { X sprintf (nam, "/usr/lib/news/organization"); X fp = fopen (nam, "r"); X } X X if (fp == NULL) { X sprintf (nam, "/usr/local/lib/news/organization"); X fp = fopen (nam, "r"); X } X X if (fp == NULL) { X sprintf (nam, "/usr/public/lib/news/organization"); X fp = fopen (nam, "r"); X } X X if (fp == NULL) { X sprintf (nam, "/etc/organization"); X fp = fopen (nam, "r"); X } X X if (fp != NULL) { X if (fgets (my_org, sizeof (my_org), fp) != NULL) { X for (p = my_org; *p && *p != '\n'; p++) X continue; X *p = '\0'; X } X fclose (fp); X } X Xgot_org:; X X/* X * check enviroment for REPLYTO X */ X reply_to[0] = '\0'; X if ((p = getenv ("REPLYTO")) != NULL) { X my_strncpy (reply_to, p, LEN); X goto got_reply; X } X X sprintf (nam, "%s/reply_to", rcdir); X if ((fp = fopen (nam, "r")) != NULL) { X if (fgets (reply_to, sizeof (reply_to), fp) != NULL) { X for (p = reply_to; *p && *p != '\n'; p++) X continue; X *p = '\0'; X } X fclose (fp); X } X Xgot_reply:; X X/* X * check enviroment for ADD_ADDRESS X */ X add_addr[0] = '\0'; X if ((p = getenv ("ADD_ADDRESS")) != NULL) { X my_strncpy (add_addr, p, LEN); X goto got_add_addr; X } X X sprintf (nam, "%s/add_addr", rcdir); X if ((fp = fopen (nam, "r")) != NULL) { X if (fgets (add_addr, sizeof (add_addr), fp) != NULL) { X for (p = add_addr; *p && *p != '\n'; p++) X continue; X *p = '\0'; X } X fclose (fp); X } X Xgot_add_addr:; X X/* X * check enviroment for BUG_ADDRESS X */ X if ((p = getenv ("BUG_ADDRESS")) != NULL) { X my_strncpy (bug_addr, p, LEN); X goto got_bug_addr; X } X X sprintf (nam, "%s/bug_address", rcdir); X if ((fp = fopen (nam, "r")) != NULL) { X if (fgets (bug_addr, sizeof (bug_addr), fp) != NULL) { X for (p = bug_addr; *p && *p != '\n'; p++) X continue; X *p = '\0'; X } X fclose (fp); X } X Xgot_bug_addr:; X sprintf (txt_help_bug_report, txt_help_bug, bug_addr); X X set_tin_uid_gid (); X} X X X/* X * Which base note (an index into base[]) does a respnum X * (an index into arts[]) corresponsd to? X * X * In other words, base[] points to an entry in arts[] which is X * the head of a thread, linked with arts[].thread. For any q: arts[q], X * find i such that base[i]->arts[n]->arts[o]->...->arts[q] X */ X Xint which_base (n) X int n; X{ X register int i, j; X X for (i = 0; i < top_base; i++) { X for (j = base[i] ; j >= 0 ; j = arts[j].thread) { X if (j == n) { X return i; X } X } X } X X error_message (txt_cannot_find_base_art, (char *) atoi (n)); X return -1; X} X X/* X * Find how deep in a thread a response is. Start counting at zero X */ X Xint which_resp (n) X int n; X{ X int i, j; X int num = 0; X X i = which_base (n); X X for (j = base[i]; j != -1; j = arts[j].thread) X if (j == n) X break; X else X num++; X X return num; X} X X/* X * Given an index into base[], find the number of responses for X * that basenote X */ X Xint nresp (n) X int n; X{ X int i; X int oldi = -3; X int sum = 0; X X assert(n < top_base); X X for (i = base[n]; i != -1; i = arts[i].thread) { X assert(i != -2); X assert(i != oldi); X oldi = i; X sum++; X } X X return sum - 1; X} X X Xvoid asfail(file, line, cond) X char *file; SHAR_EOF echo "End of tin1.02 part 4" echo "File misc.c is continued in part 5" echo "5" > shar3_seq_.tmp exit 0 exit 0 # Just in case... -- Kent Landfield INTERNET: kent@sparky.IMD.Sterling.COM Sterling Software, IMD UUCP: uunet!sparky!kent Phone: (402) 291-8300 FAX: (402) 291-4362 Please send comp.sources.misc-related mail to kent@uunet.uu.net.