home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume18 / mush6.4 / part08 / misc.c next >
C/C++ Source or Header  |  1989-03-12  |  18KB  |  647 lines

  1. /* @(#)misc.c    (c) copyright 10/18/86 (Dan Heller) */
  2.  
  3. #include "mush.h"
  4.  
  5. /* check to see if a string describes a message that is within the range of
  6.  * all messages; if invalid, return 0 and print error. else return msg number
  7.  */
  8. chk_msg(s)
  9. register char *s;
  10. {
  11.     register int n;
  12.  
  13.     if ((n = atoi(s)) > 0 && n <= msg_cnt)
  14.     return n;
  15.     else if (*s == '^' && msg_cnt)
  16.     return 1;
  17.     else if (*s == '$' && msg_cnt)
  18.     return msg_cnt;
  19.     else if (*s == '.' && msg_cnt)
  20.     return current_msg+1;
  21.     print("Invalid message number: %s\n", s);
  22.     return 0;
  23. }
  24.  
  25. /*
  26.  * loop thru all msgs starting with current_msg and find next undeleted and
  27.  * unsaved message.  If the variable "wrap" is set, wrap to the beginning of
  28.  * the message list if we hit the end.  otherwise, stop at the end of the list.
  29.  */
  30. next_msg()
  31. {
  32.     register int n = current_msg;
  33.     register int wrap = !!do_set(set_options, "wrap");
  34.  
  35.     if (!msg_cnt)
  36.     return current_msg = 0;
  37.     for (n++; n != current_msg; n++)
  38.     if (n == msg_cnt)     /* hit the end, start back at the beginning */
  39.         if (!wrap)
  40.         return current_msg;
  41.         else
  42.         n = -1; /* increments to 0 in  loop  */
  43.     else if (isoff(msg[n].m_flags, DELETE) &&
  44.          isoff(msg[n].m_flags, SAVED))
  45.         return current_msg = n;
  46.     return current_msg = 0;
  47. }
  48.  
  49. /* since print_help just prints help, always return help() */
  50. print_help(argc, argv)
  51. register char **argv;
  52. {
  53. #ifdef SUNTOOL
  54.     if (istool)
  55.     return help(tool->tl_windowfd, "general", tool_help);
  56. #endif /* SUNTOOL */
  57.     if (!argc || !*++argv)
  58.     return help(0, "general", cmd_help);
  59.     return help(0, *argv, cmd_help);
  60. }
  61.  
  62. /* since this function does not affect messages, return -1 */
  63. help(fd, str, file)
  64. #ifdef SUNTOOL
  65. caddr_t *str;
  66. #else
  67. char *str;
  68. #endif /* SUNTOOL */
  69. char *file;
  70. {
  71. #ifdef SUNTOOL
  72.     if (istool > 1) {
  73.     int oldmask;
  74.     if (!fd)
  75.         fd = print_sw->ts_windowfd;
  76.     oldmask = sigblock(1 << ((SIGALRM) - 1));
  77.     lock_cursors();
  78.     if (display_help(fd, str, file, fonts[LARGE]) && file)
  79.         error("can't read %s", file);
  80.     unlock_cursors();
  81.     (void) sigsetmask(oldmask);
  82.     } else
  83. #endif /* SUNTOOL */
  84.     if (find_help(str, file) && file)
  85.     error("can't read %s", file);
  86.     return 0; /* doesn't affect any messages */
  87. }
  88.  
  89. #ifdef SUNTOOL
  90. void
  91. unlock_cursors()
  92. {
  93.     if (istool < 2)
  94.     return;
  95.     win_setcursor(print_sw->ts_windowfd, &main_cursor);
  96.     win_setcursor(panel_sw->ts_windowfd, &main_cursor);
  97.     if (getting_opts)
  98.     win_setcursor(msg_sw->ts_windowfd, &checkmark);
  99.     else if (ison(glob_flags, IS_GETTING))
  100.     win_setcursor(msg_sw->ts_windowfd, &write_cursor);
  101.     else
  102.     win_setcursor(msg_sw->ts_windowfd, &read_cursor);
  103.     win_setcursor(hdr_panel_sw->ts_windowfd, &main_cursor);
  104.     win_setcursor(hdr_sw->ts_windowfd, &l_cursor);
  105. }
  106.  
  107. void
  108. lock_cursors()
  109. {
  110.     if (istool < 2)
  111.     return;
  112.     win_setcursor(hdr_sw->ts_windowfd, &coffee);
  113.     win_setcursor(print_sw->ts_windowfd, &coffee);
  114.     win_setcursor(panel_sw->ts_windowfd, &coffee);
  115.     win_setcursor(msg_sw->ts_windowfd, &coffee);
  116.     win_setcursor(hdr_panel_sw->ts_windowfd, &coffee);
  117. }
  118.  
  119. #include <suntool/fullscreen.h>
  120. /* return the event-id that confirmed */
  121. confirm(fd)
  122. {
  123.     struct fullscreen *fs;
  124.  
  125.     struct inputmask im;
  126.     struct inputevent event;
  127.  
  128.     fs = fullscreen_init(fd);
  129.     input_imnull(&im);
  130.     im.im_flags |= IM_ASCII;
  131.     win_setinputcodebit(&im, MS_LEFT);
  132.     win_setinputcodebit(&im, MS_MIDDLE);
  133.     win_setinputcodebit(&im, MS_RIGHT);
  134.     win_setinputmask(fd, &im, &im, WIN_NULLLINK);
  135.     win_setcursor(fd, &l_cursor);
  136.     if (input_readevent(fd, &event) == -1)
  137.     error("confirm failed");
  138.     fullscreen_destroy(fs);
  139.     return ID;
  140. }
  141. #endif /* SUNTOOL */
  142.  
  143. /* return -1 on error or number of arguments in argv that were parsed */
  144. get_msg_list(argv, list)
  145. register char **argv;
  146. char list[];
  147. {
  148.     register char *p2, *p, *end, ch;
  149.     char buf[BUFSIZ];
  150.     register int n;
  151.  
  152.     if (!msg_cnt) {
  153.     print("No messages.\n");
  154.     return -1;
  155.     }
  156.     if (!argv || !*argv) {
  157.     if (isoff(glob_flags, IS_PIPE))
  158.         set_msg_bit(list, current_msg);
  159.     return 0;
  160.     }
  161.     /* first, stuff argv's args into a single char array buffer */
  162.     (void) argv_to_string(buf, argv);
  163.     p = buf;
  164.  
  165.     Debug("get_msg_list: parsing: (%s): ", p);
  166.     /* find the end of the message list */
  167.     skipmsglist(0);
  168.     end = p;
  169.     while (*end && end != buf && !isspace(*end))
  170.     --end;
  171.     ch = *end, *end = '\0'; /* temporarily plug with nul */
  172.     p = buf; /* reset to the beginning */
  173.     /*
  174.      * if do_range returns NULL, an invalid message was specified
  175.      */
  176.     if (!(p2 = do_range(p, list))) {
  177.     *end = ch; /* just in case */
  178.     return -1;
  179.     }
  180.     /*
  181.      * if p2 == p (and p isn't $ or ^ or .), then no message list was
  182.      * specified.  set the current message in such cases if we're not piping
  183.      */
  184.     if (p2 == p) {
  185.     if (*p == '$')
  186.         set_msg_bit(list, msg_cnt-1);
  187.     else if (*p == '^')
  188.         set_msg_bit(list, 0);
  189.     else if (*p == '.' || isoff(glob_flags, IS_PIPE))
  190.         set_msg_bit(list, current_msg);
  191.     }
  192.     for (n = 0; p2 > p && *argv; n++)
  193.     p2 -= (strlen(*argv++)+1);
  194.     Debug("parsed %d args\n", n);
  195.     *end = ch;
  196.     return n;
  197. }
  198.  
  199. /*
  200.  * execute a command from a string.  f'rinstance: "pick -f foobar"
  201.  * The string is made into an argv and then run.  Errors are printed
  202.  * if the command failed to make.
  203.  *   NOTES:
  204.  *     NEVER pass straight text: e.g. "pick -f foobar", ALWAYS strcpy(buf, "...")
  205.  *     no history is expanded (ignore_bang).
  206.  */
  207. cmd_line(buf, list)
  208. char buf[], list[];
  209. {
  210.     register char **argv;
  211.     int argc, ret_val = -1;
  212.     u_long save_do_pipe = ison(glob_flags, DO_PIPE);
  213.     u_long save_is_pipe = ison(glob_flags, IS_PIPE);
  214.     char dummy_list[MAXMSGS_BITS];
  215.  
  216.     turnoff(glob_flags, DO_PIPE);
  217.     turnoff(glob_flags, IS_PIPE);
  218.     if (argv = make_command(buf, TRPL_NULL, &argc))
  219.     ret_val = do_command(argc, argv, list? list : dummy_list);
  220.     if (save_do_pipe)
  221.     turnon(glob_flags, DO_PIPE);
  222.     else
  223.     turnoff(glob_flags, DO_PIPE);
  224.     if (save_is_pipe)
  225.     turnon(glob_flags, IS_PIPE);
  226.     else
  227.     turnoff(glob_flags, IS_PIPE);
  228.     return ret_val;
  229. }
  230.  
  231. glob_test(s)
  232. char *s;
  233. {
  234.     print("%s: glob_flags =", s);
  235.     if (ison(glob_flags, DO_UPDATE))
  236.     print_more(" DO_UPDATE");
  237.     if (ison(glob_flags, REV_VIDEO))
  238.     print_more(" REV_VIDEO");
  239.     if (ison(glob_flags, CONT_PRNT))
  240.     print_more(" CONT_PRNT");
  241.     if (ison(glob_flags, DO_SHELL))
  242.     print_more(" DO_SHELL");
  243.     if (ison(glob_flags, DO_PIPE))
  244.     print_more(" DO_PIPE");
  245.     if (ison(glob_flags, IS_PIPE))
  246.     print_more(" IS_PIPE");
  247.     if (ison(glob_flags, IGN_SIGS))
  248.     print_more(" IGN_SIGS");
  249.     if (ison(glob_flags, IGN_BANG))
  250.     print_more(" IGN_BANG");
  251.     if (ison(glob_flags, ECHO_FLAG))
  252.     print_more(" ECHO_FLAG");
  253.     if (ison(glob_flags, IS_GETTING))
  254.     print_more(" IS_GETTING");
  255.     if (ison(glob_flags, PRE_CURSES))
  256.     print_more(" PRE_CURSES");
  257.     if (ison(glob_flags, READ_ONLY))
  258.     print_more(" READ_ONLY");
  259.     if (ison(glob_flags, REDIRECT))
  260.     print_more(" REDIRECT");
  261.     if (ison(glob_flags, WAS_INTR))
  262.     print_more(" WAS_INTR");
  263.     if (ison(glob_flags, WARNING))
  264.     print_more(" WARNING");
  265.     if (ison(glob_flags, NEW_MAIL))
  266.     print_more(" NEW_MAIL");
  267.     if (ison(glob_flags, CNTD_CMD))
  268.     print_more(" CNTD_CMD");
  269.     if (ison(glob_flags, IS_SENDING))
  270.     print_more(" IS_SENDING");
  271.     if (ison(glob_flags, MIL_TIME))
  272.     print_more(" MIL_TIME");
  273.     if (ison(glob_flags, DATE_RECV))
  274.     print_more(" DATE_RECV");
  275.     if (ison(glob_flags, IN_MACRO))
  276.     print_more(" IN_MACRO");
  277.     if (ison(glob_flags, LINE_MACRO))
  278.     print_more(" LINE_MACRO");
  279.     if (ison(glob_flags, QUOTE_MACRO))
  280.     print_more(" QUOTE_MACRO");
  281.     print_more("\n");
  282. }
  283.  
  284. /*
  285.  * change the status flags for messages.
  286.  *    flags * P        preserves all messages.
  287.  *    flags 4-7 -S    remove the "saved" status on msgs 4-7
  288.  *    flags +r        add the replied-to bit on the current message.
  289.  */
  290. msg_flags(c, v, list)
  291. register char **v, *list;
  292. {
  293.     register int    i, modify = 0;
  294.     register u_long    newflag = 0;
  295.     char sent[32], recv[32];
  296.  
  297.     if (c && *++v && !strcmp(*v, "-?"))
  298.     return help(0, "msg_flags", cmd_help);
  299.     if (c && (c = get_msg_list(v, list)) == -1)
  300.     return -1;
  301.     if (v && *(v += (c-1))) {
  302.     turnon(glob_flags, DO_UPDATE);
  303.     while (*++v)
  304.         for (c = 0; v[0][c]; c++)
  305.         switch (lower(v[0][c])) {
  306.             case 'n' : turnon(newflag, UNREAD), turnoff(newflag, OLD);
  307.             when 'd' : turnon(newflag, DELETE);
  308.             when 'p' : turnon(newflag, PRESERVE);
  309.             when 's' : turnon(newflag, SAVED);
  310.             when 'u' : turnon(newflag, UNREAD); /* fall thru! */
  311.             case 'o' : turnon(newflag, OLD);
  312.             when 'r' :
  313.             if (v[0][c] == 'R')
  314.                 turnoff(newflag, UNREAD), turnon(newflag, OLD);
  315.             else
  316.                 turnon(newflag, REPLIED);
  317.             when '+' : modify = 1;
  318.             when '-' : modify = 2;
  319.             otherwise: return help(0, "msg_flags", cmd_help);
  320.         }
  321.     }
  322.  
  323.     for (i = 0; i < msg_cnt; i++) {
  324.     if (!msg_bit(list, i))
  325.         continue;
  326.     else if (!newflag) {
  327.         wprint("msg %d: offset: %d, lines: %d, bytes: %d, flags:", i+1,
  328.         msg[i].m_offset, msg[i].m_lines, msg[i].m_size);
  329.         if (ison(msg[i].m_flags, UNREAD))
  330.         wprint(" UNREAD");
  331.         if (ison(msg[i].m_flags, OLD))
  332.         wprint(" OLD");
  333.         if (ison(msg[i].m_flags, DELETE))
  334.         wprint(" DELETE");
  335.         if (ison(msg[i].m_flags, PRESERVE))
  336.         wprint(" PRESERVE");
  337.         if (ison(msg[i].m_flags, REPLIED))
  338.         wprint(" REPLIED");
  339.         if (ison(msg[i].m_flags, SAVED))
  340.         wprint(" SAVED");
  341.         if (ison(msg[i].m_flags, UPDATE_STATUS))
  342.         wprint(" UPDATE_STATUS");
  343.         strcpy(sent, date_to_ctime(msg[i].m_date_sent));
  344.         strcpy(recv, date_to_ctime(msg[i].m_date_recv));
  345.         wprint("\n\tsent: %s\trecv: %s", sent, recv);
  346.     } else switch (modify) {
  347.         case 0: msg[i].m_flags = newflag;
  348.         when 1: msg[i].m_flags |= newflag;
  349.         when 2: msg[i].m_flags &= ~newflag;
  350.     }
  351.     }
  352.     return 0;
  353. }
  354.  
  355. /*
  356.  * Internal pager.  Start the internal pager by passing the name of
  357.  * the pager in buf and passing TRUE as start_pager. If the internal
  358.  * pager is desired, pass NULL as buf.  Continue paging by passing
  359.  * FALSE as start_pager and the buf is the stuff to pass thru to the
  360.  * pager.  End paging by passing NULL as buf and FALSE as start_pager.
  361.  * If the pager can't be used, or is null, we're paging ourselves.
  362.  * Windows does nothing but echo buf to the msg window (this will change).
  363.  * The "buf" passed to the pager should be a line at a time so as to
  364.  * count \n's.  If there is more than one newline, the first one is nulled
  365.  * and the next line done by calling do_pager recursively.  WARNING: because
  366.  * "buf" is changed, it is *illegal* for anyone calling this routine to pass
  367.  * _constant_ strings --they should be strcpy'ed or sprintf'ed into a temp
  368.  * buff before passing to this routine!  Otherwise, ANSI-C compilers will
  369.  * core dump.  This is because constant strings are read-only.
  370.  * Return EOF if pager died, user exited pager, or if user types 'q'
  371.  * at the --more-- prompt for the internal pager.
  372.  */
  373. do_pager(buf, start_pager)
  374. register char *buf;
  375. {
  376.     static FILE *pp;
  377.     static int cnt, len;
  378.     static u_long save_echo_flag;
  379.  
  380. #ifdef SUNTOOL
  381.     if (istool) {
  382.     if (buf && !start_pager)
  383.         Addstr(buf);
  384.     return 0;
  385.     }
  386. #endif /* SUNTOOL */
  387.     if (start_pager) {
  388.     turnon(glob_flags, IGN_SIGS);
  389.     if (!buf) {
  390.         /* internal pager */
  391.         save_echo_flag = ison(glob_flags, ECHO_FLAG);
  392.         pp = stdout;
  393.         if (save_echo_flag) {
  394.         turnoff(glob_flags, ECHO_FLAG);
  395.         echo_off();
  396.         }
  397.     } else {
  398.         echo_on();
  399.         if (!(pp = popen(buf, "w")))
  400.         error(buf);
  401.     }
  402.     cnt = len = 0;
  403.     } else if (!buf) {
  404.     if (pp && pp != stdout)
  405.         pclose(pp);
  406.     pp = NULL_FILE;
  407.     if (save_echo_flag) {
  408.         echo_on();
  409.         turnon(glob_flags, ECHO_FLAG);
  410.     } else
  411.         echo_off();
  412.     turnoff(glob_flags, IGN_SIGS);
  413.     } else if (pp != stdout)
  414.     return fputs(buf, pp); /* returns EOF if user exited pager */
  415.     else {
  416.     register char c = 0, *cr = index(buf, '\n');
  417.     len += strlen(buf);
  418.     if (cr) {
  419.         int maxlen =
  420. #ifdef CURSES
  421.         iscurses ? COLS :
  422. #endif /* CURSES */
  423.         80;
  424.         if (len > maxlen)
  425.         cnt += len / maxlen;
  426.         len = 0;
  427.     }
  428.     if (cr && (c = *++cr) != '\0')
  429.         *cr = 0; /* send one line to stdout and prompt for more */
  430.     (void) fputs(buf, pp);
  431.     if (cr && (++cnt / (crt-1))) {
  432.         int n = c_more(NULL);
  433.         if (n == '\n' || n == '\r')
  434.         cnt--; /* go line by line */
  435.         else if (n == CTRL(D) || lower(n) == 'd' || n < 0) {
  436.         clearerr(stdin);
  437.         cnt = ((crt-1)/2);
  438.         } else if (lower(n) == 'q')
  439.         /* could check if "c" is set, but... see warning above */
  440.         return EOF;
  441.         else
  442.         cnt = 1;
  443.     }
  444.     if (c) {
  445.         *cr = c;
  446.         return do_pager(cr, FALSE);
  447.     }
  448.     }
  449.     return 0;
  450. }
  451.  
  452. /* curses based "more" like option */
  453. c_more(p)
  454. register char *p;
  455. {
  456.     register int c;
  457.  
  458.     if (!p)
  459.     p = "--more--";
  460.     print_more(p);
  461.     
  462.     while ((c = getchar()) >= 0 && c != CTRL(D) && !isspace(c) &&
  463.        c != '\n' && c != '\r' && lower(c) != 'q' && lower(c) != 'd')
  464.     bell();
  465.     if (ison(glob_flags, ECHO_FLAG) && c != '\n' && c != '\r')
  466.     while (getchar() != '\n');
  467.     printf("\r%*c\r", strlen(p), ' '), fflush(stdout); /* remove the prompt */
  468.     return c;
  469. }
  470.  
  471. /*
  472.  * Your "signature" is of the type:
  473.  *    file_or_path
  474.  *    $variable
  475.  *    \ literal string preceded by a backslash.
  476.  * The variable will be expanded into its string value.
  477.  * To sign the letter, the list of addresses is passed to this routine
  478.  * (separated by whitespace and/or commas).  No comment fields!
  479.  *
  480.  * If "autosign2" is set, then it must be of the form:
  481.  *    autosign2 = "*user user !host !some!path @dom.ain: ~/.sign2"
  482.  *
  483.  * The colon terminates the user/host lists from the "signature" to the right.
  484.  *
  485.  * Whitespace or commas separate tokens.  If everyone on the list exists in
  486.  * the autosign2 list, the alternate signature is used. In case of syntax
  487.  * error, the alternate signature is used without checks (e.g. if the colon
  488.  * is missing).  The alternate signature == null is the same as not signing
  489.  * the letter. An empty list forces signature2.
  490.  *
  491.  * If autosign2 is not set at all, then autosign is checked and used.
  492.  * autosign = <signature>
  493.  */
  494. sign_letter(list, flags, fp)
  495. register char *list; /* list of addresses -- no comment fields */
  496. u_long flags;
  497. FILE *fp;
  498. {
  499.     char buf[BUFSIZ], *signature;
  500.     register char *p = NULL, *p2;
  501.     FILE     *pp2;
  502.     int     lines = 0;
  503.  
  504.     while (isspace(*list))
  505.     list++;
  506.     if (ison(flags, SIGN)) {
  507.     if (!(p = do_set(set_options, "autosign2")))
  508.         buf[0] = 0;
  509.     else {
  510.         if (!(signature = index(p, ':')))
  511.         (void) strcpy(buf, p); /* No colon; use entire string as sig */
  512.         else {
  513.         int ret_val = 0;
  514.         *signature = 0;
  515.         /* p now points to a list of addresses and p2 points to the
  516.          * signature format to use. Check that each address in the list
  517.          * provided (parameter) matches the "addrs" in autosign2.
  518.          */
  519.         skipspaces(0);
  520.         if (!*p)
  521.             /* autosign2 = " : <signature>"  send to all recipients */
  522.             ret_val = 1;
  523.         else if (p = alias_to_address(p)) {
  524.             rm_cmts_in_addr(p);
  525.             ret_val = compare_addrs(list, p, NULL);
  526.         }
  527.         *signature++ = ':'; /* must reset first! */
  528.         buf[0] = 0;
  529.         if (ret_val) {
  530.             while (isspace(*signature))
  531.             signature++;
  532.             /* Null signatures don't sign anything. */
  533.             if (!*strcpy(buf, signature))
  534.             return;
  535.         }
  536.         }
  537.     }
  538.     if (!buf[0]) {
  539.         if (!(p = do_set(set_options, "autosign")) || !*p) {
  540.         char *home;
  541.         if (!(home = do_set(set_options, "home")) || !*home)
  542.             home = ALTERNATE_HOME;
  543.         (void) sprintf(buf, "%s/%s", home, SIGNATURE);
  544.         } else
  545.         (void) strcpy(buf, p);
  546.         wprint("Signing letter... ");
  547.     } else
  548.         wprint("Using alternate signature... ");
  549.     /* precede _file_ signatures ONLY with "\n-- \n" */
  550.     if (buf[0] != '\\' && buf[0] != '$')
  551.         fputs("\n-- \n", fp);
  552.     else
  553.         fputc('\n', fp);
  554.     fflush(fp);
  555.     (void) fseek(fp, 0L, 2); /* guarantee position at end of file */
  556.     if (*buf == '$')
  557.         if (!(p = do_set(set_options, buf)))
  558.         wprint("(%s isn't set -- letter not signed)\n", buf);
  559.         else {
  560.         putstring(p+1, fp);
  561.         wprint("\n");
  562.         }
  563.     else if (*buf == '\\') {
  564.         putstring(buf, fp);
  565.         wprint("\n");
  566.     } else
  567.         file_to_fp(buf, fp, "r");
  568.     }
  569.  
  570.     fflush(stdout); /* for sys-v and older xenix */
  571.  
  572.     /* if fortune is set, check to see if fortunates is set. If so,
  573.      * check to see if all the recipient are on the fortunates list.
  574.      */
  575.     if (ison(flags, DO_FORTUNE)) {
  576.     if (p = do_set(set_options, "fortunates")) {
  577.         int ret_val;
  578.         if (!(p = alias_to_address(p)))
  579.         return; /* no reason to hang around */
  580.         rm_cmts_in_addr(p);
  581.         if (!compare_addrs(list, p, buf)) {
  582.         wprint("\"fortunates\" does not contain \"%s\".\n", buf);
  583.         wprint("No fortune added.\n");
  584.         return;
  585.         }
  586.     }
  587.     wprint("You may be fortunate... ");
  588.     if ((p = do_set(set_options, "fortune")) && *p == '/')
  589.         (void) strcpy(buf, p);
  590.     else
  591.         (void) sprintf(buf, "%s %s", FORTUNE, (p && *p == '-')? p: "-s");
  592.     if (!(pp2 = popen(buf, "r")))
  593.         error(buf);
  594.     else {
  595.         turnon(glob_flags, IGN_SIGS);
  596.         (void) fseek(fp, 0L, 2); /* go to end of file */
  597.         while (fgets(buf, sizeof(buf), pp2))
  598.         fputs(buf, fp), lines++;
  599.         (void) pclose(pp2);
  600.         turnoff(glob_flags, IGN_SIGS);
  601.         fflush(fp);
  602.         wprint("added %d line%s\n", lines, lines == 1? "" : "s");
  603.     }
  604.     }
  605.     fflush(stdout); /* for sys-v and older xenix */
  606. }
  607.  
  608.  
  609. /* return -1 since function doesn't affect messages */
  610. check_flags(flags)
  611. u_long flags;
  612. {
  613.     print_more(" ");
  614.     if (ison(flags, VERBOSE))
  615.     print_more("VERBOSE ");
  616.     if (ison(flags, INCLUDE))
  617.     print_more("INCLUDE ");
  618.     if (ison(flags, INCLUDE_H))
  619.     print_more("INCLUDE_H ");
  620.     if (ison(flags, EDIT))
  621.     print_more("EDIT ");
  622.     if (ison(flags, SIGN))
  623.     print_more("SIGN ");
  624.     if (ison(flags, DO_FORTUNE))
  625.     print_more("DO_FORTUNE ");
  626.     if (ison(flags, NO_HEADER))
  627.     print_more("NO_HEADER ");
  628.     if (ison(flags, DELETE))
  629.     print_more("DELETE ");
  630.     if (ison(flags, OLD))
  631.     print_more("OLD ");
  632.     if (ison(flags, UNREAD))
  633.     print_more("UNREAD ");
  634.     if (ison(flags, UPDATE_STATUS))
  635.     print_more("UPDATE_STATUS ");
  636.     if (ison(flags, NO_PAGE))
  637.     print_more("NO_PAGE ");
  638.     if (ison(flags, INDENT))
  639.     print_more("INDENT ");
  640.     if (ison(flags, NO_IGNORE))
  641.     print_more("NO_IGNORE ");
  642.     if (ison(flags, PRESERVE))
  643.     print_more("PRESERVE ");
  644.     print_more("\n");
  645.     return -1;
  646. }
  647.