home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / ONLINE / ELM23-2 / ELM23-2.ZIP / src / elm.c < prev    next >
C/C++ Source or Header  |  1996-07-22  |  24KB  |  848 lines

  1.  
  2. static char rcsid[] = "@(#)$Id: elm.c,v 4.1.1.1 90/12/19 09:44:06 syd Exp $";
  3.  
  4. /*******************************************************************************
  5.  *  The Elm Mail System  -  $Revision: 4.1.1.1 $   $State: Exp $
  6.  *
  7.  * This file and all associated files and documentation:
  8.  *             Copyright (c) 1986, 1987 Dave Taylor
  9.  *             Copyright (c) 1988, 1989, 1990 USENET Community Trust
  10.  *******************************************************************************
  11.  * Bug reports, patches, comments, suggestions should be sent to:
  12.  *
  13.  *    Syd Weinstein, Elm Coordinator
  14.  *    elm@DSI.COM            dsinc!elm
  15.  *
  16.  *******************************************************************************
  17.  * $Log:    elm.c,v $
  18.  * Revision 4.1.1.1  90/12/19  09:44:06  syd
  19.  * Fix not checking for mail before scanning
  20.  * From: Syd via report from Joern Lubkoll
  21.  *
  22.  * Revision 4.1  90/04/28  22:42:54  syd
  23.  * checkin of Elm 2.3 as of Release PL0
  24.  *
  25.  *
  26.  ******************************************************************************/
  27.  
  28. /* Main program of the ELM mail system!
  29. */
  30.  
  31. #include "elm.h"
  32.  
  33. #ifdef BSD
  34. #undef        toupper
  35. #undef        tolower
  36. #endif
  37.  
  38. long bytes();
  39. char *format_long(), *parse_arguments();
  40.  
  41. main(argc, argv)
  42. int argc;
  43. char *argv[];
  44.     {
  45.     int  ch;
  46.     char address[SLEN], to_whom[SLEN], *req_mfile;
  47.     int  key_offset;        /** Position offset within keyboard string   **/
  48.     int  redraw,         /** do we need to rewrite the entire screen? **/
  49.          nucurr,         /** change message list or just the current message pointer...   **/
  50.          nufoot;         /** clear lines 16 thru bottom and new menu  **/
  51.     int  i,j;              /** Random counting variables (etc)          **/
  52.     int  pageon,         /** for when we receive new mail...          **/
  53.          last_in_folder;    /** for when we receive new mail too...      **/
  54.     long num;        /** another variable for fun..               **/
  55.     extern char version_buff[];
  56. #ifndef OS2
  57.     extern int errno;
  58. #endif
  59.  
  60.         initpaths();
  61.  
  62.     req_mfile = parse_arguments(argc, argv, to_whom);
  63.  
  64.     initialize(req_mfile);
  65.  
  66.     if (mail_only) {
  67.        dprint(3, (debugfile, "Mail-only: mailing to\n-> \"%s\"\n",
  68.            format_long(to_whom, 3)));
  69.        if(!batch_only) {
  70.          sprintf(address, "Send only mode [ELM %s]", version_buff);
  71.          Centerline(1, address);
  72.        }
  73.        (void) sendmsg(to_whom, "", batch_subject, TRUE,
  74.          (batch_only ? NO : allow_forms), FALSE);
  75.        leave(0);
  76.     } else if (check_only) {
  77.        do_check_only(to_whom);
  78.        leave(0);
  79.     }
  80.  
  81.     ScreenSize(&LINES, &COLUMNS);
  82.  
  83.     showscreen();
  84.  
  85.     while (1) {
  86.       redraw = 0;
  87.       nufoot = 0;
  88.       nucurr = 0;
  89.       /* move_incoming_mail(); */
  90.       if ((num = bytes(cur_folder)) != mailfile_size) {
  91.         dprint(2, (debugfile, "Just received %d bytes more mail (elm)\n",
  92.             num - mailfile_size));
  93.         error("New mail has arrived! Hang on...");
  94.         fflush(stdin);    /* just to be sure... */
  95.         last_in_folder = message_count;
  96.         pageon = header_page;
  97.  
  98.         if ((errno = can_access(cur_folder, READ_ACCESS)) != 0) {
  99.           dprint(1, (debugfile,
  100.             "Error: given file %s as folder - unreadable (%s)!\n",
  101.             cur_folder, error_name(errno)));
  102.           fprintf(stderr,"Can't open folder '%s' for reading!\n", cur_folder);
  103.           leave();
  104.           }
  105.  
  106.         newmbox(cur_folder, TRUE);    /* last won't be touched! */
  107.         clear_error();
  108.         header_page = pageon;
  109.  
  110.         if (on_page(current))   /* do we REALLY have to rewrite? */
  111.           showscreen();
  112.         else {
  113.           update_title();
  114.           ClearLine(LINES-1);         /* remove reading message... */
  115.           error2("%d new message%s received.",
  116.              message_count - last_in_folder,
  117.              plural(message_count - last_in_folder));
  118.         }
  119.         /* mailfile_size = num; */
  120.         if (cursor_control)
  121.           transmit_functions(ON);    /* insurance */
  122.       }
  123.  
  124.       prompt("Command: ");
  125.  
  126.       CleartoEOLN();
  127.       ch = GetPrompt();
  128.       CleartoEOS();
  129. #ifdef DEBUG
  130.       if (! movement_command(ch))
  131.         dprint(4, (debugfile, "\nCommand: %c [%d]\n\n", ch, ch));
  132. #endif
  133.  
  134.       set_error("");    /* clear error buffer */
  135.  
  136.       MoveCursor(LINES-3,strlen("Command: "));
  137.  
  138.       switch (ch) {
  139.  
  140.         case '?'     :  if (help(FALSE))
  141.                    redraw++;
  142.                else
  143.                  nufoot++;
  144.                break;
  145.  
  146.         case '$'    :  PutLine0(LINES-3, strlen("Command: "),
  147.                      "Resynchronize folder");
  148.                redraw = resync();
  149.                break;
  150.  
  151. next_page:
  152.         case '+'    :  /* move to next page if we're not on the last */
  153.                if((selected &&
  154.                  ((header_page+1)*headers_per_page < selected))
  155.                ||(!selected &&
  156.                  ((header_page+1)*headers_per_page<message_count))){
  157.  
  158.                  header_page++;
  159.                  nucurr = NEW_PAGE;
  160.  
  161.                  if(move_when_paged) {
  162.                    /* move to first message of new page */
  163.                    if(selected)
  164.                  current = visible_to_index(
  165.                    header_page * headers_per_page + 1) + 1;
  166.                    else
  167.                  current = header_page * headers_per_page + 1;
  168.                  }
  169.                } else error("Already on last page.");
  170.                break;
  171.  
  172. prev_page:
  173.         case '-'    :  /* move to prev page if we're not on the first */
  174.                if(header_page > 0) {
  175.                  header_page--;
  176.                  nucurr = NEW_PAGE;
  177.  
  178.                  if(move_when_paged) {
  179.                    /* move to first message of new page */
  180.                    if(selected)
  181.                  current = visible_to_index(
  182.                    header_page * headers_per_page + 1) + 1;
  183.                    else
  184.                  current = header_page * headers_per_page + 1;
  185.                  }
  186.                } else error("Already on first page.");
  187.                break;
  188.  
  189. first_msg:
  190.         case '='    :  if (selected)
  191.                  current = visible_to_index(1)+1;
  192.                else
  193.                  current = 1;
  194.                nucurr = get_page(current);
  195.                break;
  196.  
  197. last_msg:
  198.         case '*'    :  if (selected)
  199.                  current = (visible_to_index(selected)+1);
  200.                else
  201.                  current = message_count;
  202.                nucurr = get_page(current);
  203.                break;
  204.  
  205.         case '|'    :  Writechar('|');
  206.                if (message_count < 1) {
  207.                  error("No mail to pipe!");
  208.                  fflush(stdin);
  209.                } else {
  210.                      softkeys_off();
  211.                              redraw = do_pipe();
  212.                  softkeys_on();
  213.                }
  214.                break;
  215.  
  216. #ifdef ALLOW_SUBSHELL
  217.         case '!'    :  Writechar('!');
  218.                            redraw = subshell();
  219.                break;
  220. #endif
  221.  
  222.         case '%'    :  if (current > 0) {
  223.                  get_return(address, current-1);
  224.                  clear_error();
  225.                  PutLine1(LINES,(COLUMNS-strlen(address))/2,
  226.                       "%.78s", address);
  227.                } else {
  228.                  error("No mail to get return address of!");
  229.                  fflush(stdin);
  230.                }
  231.                break;
  232.  
  233.         case '/'    :  /* scan mbox for string */
  234.                if  (message_count < 1) {
  235.                  error("No mail to scan!");
  236.                  fflush(stdin);
  237.                }
  238.                else if (pattern_match())
  239.                  nucurr = get_page(current);
  240.                else {
  241.                  error("pattern not found!");
  242.                  fflush(stdin);
  243.                }
  244.                break;
  245.  
  246.         case '<'    :  /* scan current message for calendar information */
  247. #ifdef ENABLE_CALENDAR
  248.                if  (message_count < 1) {
  249.                  error("No mail to scan!");
  250.                  fflush(stdin);
  251.                }
  252.                else {
  253.                    PutLine0(LINES-3, strlen("Command: "),
  254.                    "Scan message for calendar entries...");
  255.                    scan_calendar();
  256.                }
  257. #else
  258.                 error("Sorry. Calendar function disabled.");
  259.                fflush(stdin);
  260. #endif
  261.                break;
  262.  
  263.         case 'a'    :  if(alias()) redraw++;
  264.                else nufoot++;
  265.                define_softkeys(MAIN);     break;
  266.  
  267.         case 'b'    :  PutLine0(LINES-3, strlen("Command: "),
  268.                  "Bounce message");
  269.                fflush(stdout);
  270.                if (message_count < 1) {
  271.                    error("No mail to bounce!");
  272.                  fflush(stdin);
  273.                }
  274.                else
  275.                  nufoot = remail();
  276.                break;
  277.  
  278.         case 'c'    :  PutLine0(LINES-3, strlen("Command: "),
  279.                   "Change folder");
  280.                define_softkeys(CHANGE);
  281.                redraw = change_file();
  282.                define_softkeys(MAIN);
  283.                break;
  284.  
  285.         case ctrl('D') :
  286.         case '^'    :
  287.         case 'd'    :  if (message_count < 1) {
  288.                  error("No mail to delete!");
  289.                  fflush(stdin);
  290.                }
  291.                else {
  292.                  if(ch == ctrl('D')) {
  293.  
  294.                    /* if current message did not become deleted,
  295.                 * don't to move to the next undeleted msg. */
  296.                    if(!meta_match(DELETED)) break;
  297.  
  298.                  } else
  299.                     delete_msg((ch == 'd'), TRUE);
  300.  
  301.                  if (resolve_mode)     /* move after mail resolved */
  302.                    if((i=next_message(current-1, TRUE)) != -1) {
  303.                  current = i+1;
  304.                  nucurr = get_page(current);
  305.                    }
  306.                }
  307.                break;
  308.  
  309.  
  310. #ifdef ALLOW_MAILBOX_EDITING
  311.         case 'e'    :  PutLine0(LINES-3,strlen("Command: "),"Edit folder");
  312.                if (current > 0) {
  313.                  edit_mailbox();
  314.                      if (cursor_control)
  315.                    transmit_functions(ON);    /* insurance */
  316.                   }
  317.                else {
  318.                  error("Folder is empty!");
  319.                  fflush(stdin);
  320.                }
  321.                break;
  322. #else
  323.         case 'e'    : error(
  324.             "Folder editing isn't configured in this version of ELM.");
  325.               fflush(stdin);
  326.               break;
  327. #endif
  328.  
  329.         case 'f'    :  PutLine0(LINES-3, strlen("Command: "), "Forward");
  330.                define_softkeys(YESNO);
  331.                if (current > 0) {
  332.                  if(forward()) redraw++;
  333.                  else nufoot++;
  334.                } else {
  335.                  error("No mail to forward!");
  336.                  fflush(stdin);
  337.                }
  338.                define_softkeys(MAIN);
  339.                break;
  340.  
  341.         case 'g'    :  PutLine0(LINES-3,strlen("Command: "), "Group reply");
  342.                fflush(stdout);
  343.                if (current > 0) {
  344.                  if (headers[current-1]->status & FORM_LETTER) {
  345.                    error("Can't group reply to a Form!!");
  346.                    fflush(stdin);
  347.                  }
  348.                  else {
  349.                    define_softkeys(YESNO);
  350.                    redraw = reply_to_everyone();
  351.                    define_softkeys(MAIN);
  352.                  }
  353.                }
  354.                else {
  355.                  error("No mail to reply to!");
  356.                  fflush(stdin);
  357.                }
  358.                break;
  359.  
  360.         case 'h'    :  if (filter)
  361.                  PutLine0(LINES-3, strlen("Command: "),
  362.                 "Message with headers...");
  363.                else
  364.                  PutLine0(LINES-3, strlen("Command: "),"Display message");
  365.                if(current > 0) {
  366.                  fflush(stdout);
  367.                  j = filter;
  368.                  filter = FALSE;
  369.                  i = show_msg(current);
  370.                  while (i)
  371.                 i = process_showmsg_cmd(i);
  372.                  filter = j;
  373.                  redraw++;
  374.                  (void)get_page(current);
  375.                } else error("No mail to read!");
  376.                break;
  377.  
  378.         case 'J'    :  if(current > 0) {
  379.                  if((i=next_message(current-1, FALSE)) != -1) {
  380.                    current = i+1;
  381.                    nucurr = get_page(current);
  382.                  } else error("No more messages below.");
  383.                } else error("No mail in folder!");
  384.                break;
  385.  
  386. next_undel_msg:
  387.         case 'j'    :  if(current > 0) {
  388.                  if((i=next_message(current-1, TRUE)) != -1) {
  389.                    current = i+1;
  390.                    nucurr = get_page(current);
  391.                  } else error("No more undeleted messages below.");
  392.                } else error("No mail in folder!");
  393.                break;
  394.  
  395.         case 'K'    :  if(current > 0) {
  396.                  if((i=prev_message(current-1, FALSE)) != -1) {
  397.                    current = i+1;
  398.                    nucurr = get_page(current);
  399.                  } else error("No more messages above.");
  400.                } else error("No mail in folder!");
  401.                break;
  402.  
  403. prev_undel_msg:
  404.         case 'k'    :  if(current > 0) {
  405.                  if((i=prev_message(current-1, TRUE)) != -1) {
  406.                    current = i+1;
  407.                    nucurr = get_page(current);
  408.                  } else error("No more undeleted messages above.");
  409.                } else error("No mail in folder!");
  410.                break;
  411.  
  412.         case 'l'    :  PutLine0(LINES-3, strlen("Command: "),
  413.                    "Limit displayed messages by...");
  414.                clear_error();
  415.                if (limit() != 0) {
  416.                  get_page(current);
  417.                  redraw++;
  418.                } else {
  419.                  nufoot++;
  420.                }
  421.                break;
  422.  
  423.         case 'm'    :  PutLine0(LINES-3, strlen("Command: "), "Mail");
  424.                redraw = sendmsg("", "", "", TRUE,allow_forms,FALSE);
  425.                break;
  426.  
  427.         case ' '    :
  428.         case ctrl('J'):
  429.         case ctrl('M'):PutLine0(LINES-3, strlen("Command: "),
  430.                       "Display message");
  431.                fflush(stdout);
  432.                if(current > 0 ) {
  433.                  define_softkeys(READ);
  434.  
  435.                  i = show_msg(current);
  436.                  while (i)
  437.                 i = process_showmsg_cmd(i);
  438.                  redraw++;
  439.                  (void)get_page(current);
  440.                }else error ("No mail to read!");
  441.                break;
  442.  
  443.         case 'n'    :  PutLine0(LINES-3,strlen("Command: "),"Next Message");
  444.                fflush(stdout);
  445.                define_softkeys(READ);
  446.  
  447.                if(current > 0 ) {
  448.                  define_softkeys(READ);
  449.  
  450.                  i = show_msg(current);
  451.                  while (i)
  452.                    i = process_showmsg_cmd(i);
  453.                  redraw++;
  454.                  if (++current > message_count)
  455.                    current = message_count;
  456.                  (void)get_page(current);
  457.                }else error ("No mail to read!");
  458.                break;
  459.  
  460.         case 'o'    :  PutLine0(LINES-3, strlen("Command: "), "Options");
  461.                if((i=options()) > 0)
  462.                  get_page(current);
  463.                else if(i < 0)
  464.                  leave();
  465.                redraw++;    /* always fix da screen... */
  466.                break;
  467.  
  468.         case 'p'    :  PutLine0(LINES-3, strlen("Command: "), "Print mail");
  469.                fflush(stdout);
  470.                if (message_count < 1) {
  471.                  error("No mail to print!");
  472.                  fflush(stdin);
  473.                }
  474.                else
  475.                  print_msg();
  476.                break;
  477.  
  478.         case 'q'    :  PutLine0(LINES-3, strlen("Command: "), "Quit");
  479.  
  480.                if (mailfile_size != bytes(cur_folder)) {
  481.                  error("New Mail!  Quit cancelled...");
  482.                  fflush(stdin);
  483.                    if (folder_type == SPOOL) unlock();
  484.                }
  485.                else
  486.                  quit(TRUE);
  487.  
  488.                break;
  489.  
  490.         case 'Q'    :  PutLine0(LINES-3, strlen("Command: "), "Quick quit");
  491.  
  492.                if (mailfile_size != bytes(cur_folder)) {
  493.                  error("New Mail!  Quick Quit cancelled...");
  494.                    if (folder_type == SPOOL) unlock();
  495.                }
  496.                else
  497.                  quit(FALSE);
  498.  
  499.                break;
  500.  
  501.         case 'r'    :  PutLine0(LINES-3, strlen("Command: "),
  502.                   "Reply to message");
  503.                if (current > 0)
  504.                  redraw = reply();
  505.                else {
  506.                  error("No mail to reply to!");
  507.                  fflush(stdin);
  508.                }
  509.                softkeys_on();
  510.                break;
  511.  
  512.         case '>'    : /** backwards compatibility **/
  513.  
  514.         case 'C'    :
  515.         case 'S'    :
  516.         case 's'    :  if  (message_count < 1) {
  517.                  error1("No mail to %s!",
  518.                    ch != 'C' ? "save" : "copy");
  519.                  fflush(stdin);
  520.                }
  521.                else {
  522.                  PutLine1(LINES-3, strlen("Command: "),
  523.                       "%s to folder",
  524.                       ch != 'C' ? "Save" : "Copy");
  525.                  PutLine0(LINES-3,COLUMNS-40,
  526.                 "(Use '?' to list your folders)");
  527.                  if (save(&redraw, FALSE, ch)
  528.                  && resolve_mode && ch != 'C') {
  529.                    if((i=next_message(current-1, TRUE)) != -1) {
  530.                  current = i+1;
  531.                  nucurr = get_page(current);
  532.                    }
  533.                  }
  534.                }
  535.                ClearLine(LINES-2);
  536.                break;
  537.  
  538.             case ctrl('T') :
  539.         case 't'       :  if (message_count < 1) {
  540.                 error("No mail to tag!");
  541.                 fflush(stdin);
  542.                   }
  543.                   else if (ch == 't')
  544.                 tag_message(TRUE);
  545.                   else
  546.                 meta_match(TAGGED);
  547.                   break;
  548.  
  549.         case 'u'    :  if (message_count < 1) {
  550.                  error("No mail to mark as undeleted!");
  551.                  fflush(stdin);
  552.                }
  553.                else {
  554.                  undelete_msg(TRUE);
  555.                  if (resolve_mode)     /* move after mail resolved */
  556.                    if((i=next_message(current-1, FALSE)) != -1) {
  557.                  current = i+1;
  558.                  nucurr = get_page(current);
  559.                    }
  560. /*************************************************************************
  561.  **  What we've done here is to special case the "U)ndelete" command to
  562.  **  ignore whether the next message is marked for deletion or not.  The
  563.  **  reason is obvious upon usage - it's a real pain to undelete a series
  564.  **  of messages without this quirk.  Thanks to Jim Davis @ HPLabs for
  565.  **  suggesting this more intuitive behaviour.
  566.  **
  567.  **  The old way, for those people that might want to see what the previous
  568.  **  behaviour was to call next_message with TRUE, not FALSE.
  569. **************************************************************************/
  570.                }
  571.                break;
  572.  
  573.         case ctrl('U') : if (message_count < 1) {
  574.                    error("No mail to undelete!");
  575.                    fflush(stdin);
  576.                  }
  577.                  else
  578.                    meta_match(UNDELETE);
  579.                  break;
  580.  
  581.         case 'X'    :  PutLine0(LINES-3, strlen("Command: "), "Quick Exit");
  582.                            fflush(stdout);
  583.                leave();
  584.                break;
  585.  
  586.         case ctrl('Q') :
  587.         case 'x'    :  PutLine0(LINES-3, strlen("Command: "), "Exit");
  588.                            fflush(stdout);
  589.                exit_prog();
  590.                break;
  591.  
  592.         case ctrl('L') : redraw++;    break;
  593.  
  594.             case EOF :  leave();  /* Read failed, control tty died? */
  595.                         break;
  596.  
  597.         case '@'    : debug_screen();  redraw++;    break;
  598.  
  599.         case '#'    : if (message_count) {
  600.                 debug_message();
  601.                 redraw++;
  602.               }
  603.               else {
  604.                 error("No mail to check.");
  605.                 fflush(stdin);
  606.               }
  607.               break;
  608.  
  609.         case NO_OP_COMMAND : break;    /* noop for timeout loop */
  610.  
  611.         case ESCAPE : if (cursor_control) {
  612.                 key_offset = 1;
  613.                 ch = ReadCh();
  614.  
  615.                             if ( ch == '[' || ch == 'O')
  616.                             {
  617.                               ch = ReadCh();
  618.                               key_offset++;
  619.                             }
  620.  
  621.                 if(ch == up[key_offset]) goto prev_undel_msg;
  622.                 else if(ch == down[key_offset]) goto next_undel_msg;
  623.                 else if(ch == right[key_offset]) goto next_page;
  624.                 else if(ch == left[key_offset]) goto prev_page;
  625.                 else if (hp_terminal) {
  626.                   switch (ch) {
  627.                   case 'U':        goto next_page;
  628.                   case 'V':        goto prev_page;
  629.                   case 'h':
  630.                   case 'H':        goto first_msg;
  631.                   case 'F':        goto last_msg;
  632.                   case 'A':
  633.                   case 'D':
  634.                   case 'i':        goto next_undel_msg;
  635.                   case 'B':
  636.                   case 'I':
  637.                   case 'C':        goto prev_undel_msg;
  638.                   default: PutLine2(LINES-3, strlen("Command: "),
  639.                     "%c%c", ESCAPE, ch);
  640.                   }
  641.                 } else /* false hit - output */
  642.                   PutLine2(LINES-3, strlen("Command: "),
  643.                       "%c%c", ESCAPE, ch);
  644.               }
  645.  
  646.               /* else fall into the default error message! */
  647.  
  648.         default    : if (ch > '0' && ch <= '9') {
  649.                 PutLine0(LINES-3, strlen("Command: "),
  650.                     "New Current Message");
  651.                 i = read_number(ch);
  652.  
  653.                 if( i > message_count)
  654.                   error("Not that many messages.");
  655.                 else if(selected
  656.                 && isoff(headers[i-1]->status, VISIBLE))
  657.                   error("Message not in limited display.");
  658.                 else {
  659.                   current = i;
  660.                   nucurr = get_page(current);
  661.                 }
  662.               }
  663.               else {
  664.                  error("Unknown command. Use '?' for help.");
  665.                 fflush(stdin);
  666.               }
  667.       }
  668.  
  669.       if (redraw)
  670.         showscreen();
  671.  
  672.       if ((current < 1) || (selected && compute_visible(current) < 1)) {
  673.         if (message_count > 0) {
  674.           /* We are out of range! Get to first message! */
  675.           if (selected)
  676.         current = compute_visible(1);
  677.           else
  678.         current = 1;
  679.         }
  680.         else
  681.           current = 0;
  682.       }
  683.       else if ((current > message_count)
  684.            || (selected && compute_visible(current) > selected)) {
  685.         if (message_count > 0) {
  686.           /* We are out of range! Get to last (visible) message! */
  687.           if (selected)
  688.         current = visible_to_index(selected)+1;
  689.           else
  690.         current = message_count;
  691.         }
  692.         else
  693.           current = 0;
  694.       }
  695.  
  696.       if (nucurr == NEW_PAGE)
  697.         show_headers();
  698.       else if (nucurr == SAME_PAGE)
  699.         show_current();
  700.       else if (nufoot) {
  701.         if (mini_menu) {
  702.           MoveCursor(LINES-7, 0);
  703.               CleartoEOS();
  704.           show_menu();
  705.         }
  706.         else {
  707.           MoveCursor(LINES-4, 0);
  708.           CleartoEOS();
  709.         }
  710.         show_last_error();    /* for those operations that have to
  711.                  * clear the footer except for a message.
  712.                  */
  713.       }
  714.  
  715.     } /* the BIG while loop! */
  716. }
  717.  
  718. debug_screen()
  719. {
  720.     /**** spit out all the current variable settings and the table
  721.           entries for the current 'n' items displayed. ****/
  722.  
  723.     register int i, j;
  724.     char     buffer[SLEN];
  725.  
  726.     ClearScreen();
  727.     Raw(OFF);
  728.  
  729.     PutLine2(0,0,"Current message number = %d\t\t%d message(s) total\r\n",
  730.         current, message_count);
  731.     PutLine2(2,0,"Header_page = %d           \t\t%d possible page(s)\r\n",
  732.         header_page, (int) (message_count / headers_per_page) + 1);
  733.  
  734.     PutLine1(4,0,"\r\nCurrent mailfile is %s.\n\r\n\r", cur_folder);
  735.  
  736.     i = header_page*headers_per_page;    /* starting header */
  737.  
  738.     if ((j = i + (headers_per_page-1)) >= message_count)
  739.       j = message_count-1;
  740.  
  741.     Write_to_screen(
  742. "Num      From                  Subject                         Lines  Offset\n\r\n\r",0);
  743.  
  744.     while (i <= j) {
  745.        sprintf(buffer,
  746.        "%3d  %-16.16s  %-40.40s  %4d  %ld\n\r",
  747.             i+1,
  748.             headers[i]->from,
  749.             headers[i]->subject,
  750.             headers[i]->lines,
  751.             headers[i]->offset);
  752.         Write_to_screen(buffer, 0);
  753.       i++;
  754.     }
  755.  
  756.     Raw(ON);
  757.  
  758.     PutLine0(LINES,0,"Press any key to return.");
  759.     (void) ReadCh();
  760. }
  761.  
  762.  
  763. debug_message()
  764. {
  765.     /**** Spit out the current message record.  Include EVERYTHING
  766.           in the record structure. **/
  767.  
  768.     char buffer[SLEN];
  769.     register struct header_rec *current_header = headers[current-1];
  770.  
  771.     ClearScreen();
  772.     Raw(OFF);
  773.  
  774.     Write_to_screen("\t\t\t----- Message %d -----\n\r\n\r\n\r\n\r", 1,
  775.         current);
  776.  
  777.     Write_to_screen("Lines : %-5d\t\t\tStatus: A  C  D  E  F  N  O  P  T  U  V\n\r", 1,
  778.         current_header->lines);
  779.     Write_to_screen("            \t\t\t        c  o  e  x  o  e  l  r  a  r  i\n\r", 0);
  780.     Write_to_screen("            \t\t\t        t  n  l  p  r  w  d  i  g  g  s\n\r", 0);
  781.     Write_to_screen("            \t\t\t        n  f  d  d  m        v  d  n  i\n\r", 0);
  782.  
  783.     sprintf(buffer,
  784.         "\n\rOffset: %ld\t\t\t        %d  %d  %d  %d  %d",
  785.         current_header->offset,
  786.         (current_header->status & ACTION) != 0,
  787.         (current_header->status & CONFIDENTIAL) != 0,
  788.         (current_header->status & DELETED) != 0,
  789.         (current_header->status & EXPIRED) != 0,
  790.         (current_header->status & FORM_LETTER) != 0);
  791.     sprintf(buffer + strlen(buffer),
  792.         "  %d  %d  %d  %d  %d  %d\n",
  793.         (current_header->status & NEW) != 0,
  794.         (current_header->status & UNREAD) != 0,
  795.         (current_header->status & PRIVATE) != 0,
  796.         (current_header->status & TAGGED) != 0,
  797.         (current_header->status & URGENT) != 0,
  798.         (current_header->status & VISIBLE) != 0);
  799.  
  800.     Write_to_screen(buffer, 0);
  801.  
  802.     sprintf(buffer, "\n\rReceived on: %d/%d/%d at %d:%02d\n\r",
  803.         current_header->received.month+1,
  804.         current_header->received.day,
  805.         current_header->received.year,
  806.         current_header->received.hour,
  807.         current_header->received.minute);
  808.     Write_to_screen(buffer, 0);
  809.  
  810.     sprintf(buffer, "Message sent on: %s, %s %s, %s at %s\n\r",
  811.         current_header->dayname,
  812.         current_header->month,
  813.         current_header->day,
  814.         current_header->year,
  815.         current_header->time);
  816.     Write_to_screen(buffer, 0);
  817.  
  818.     Write_to_screen("From: %s\n\rSubject: %s", 2,
  819.         current_header->from,
  820.         current_header->subject);
  821.  
  822.     Write_to_screen("\n\rPrimary Recipient: %s\nInternal Index Reference Number = %d\n\r", 2,
  823.         current_header->to,
  824.         current_header->index_number);
  825.  
  826.     Write_to_screen("Message-ID: %s\n\r", 1,
  827.         strlen(current_header->messageid) > 0 ?
  828.         current_header->messageid : "<none>");
  829.  
  830.     Write_to_screen("Status: %s\n\r", 1, current_header->mailx_status);
  831.  
  832.     Raw(ON);
  833.  
  834.     PutLine0(LINES,0,"Please Press any key to return.");
  835.     (void) ReadCh();
  836. }
  837.  
  838. do_check_only(to_whom)
  839. char *to_whom;
  840.     {
  841.     char buffer[VERY_LONG_STRING];
  842.  
  843.     dprint(3, (debugfile, "Check-only: checking \n-> \"%s\"\n",
  844.         format_long(to_whom, 3)));
  845.     (void) build_address(strip_commas(to_whom), buffer);
  846.     printf("\r\nExpands to: %s\r\n", format_long(buffer, strlen("Expands to: ")));
  847.     }
  848.