home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / APPS / elm.lzh / ELM / SRC / ELM.C < prev    next >
C/C++ Source or Header  |  1991-01-11  |  23KB  |  833 lines

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