This is elm.c in view mode; [Download] [Up]
static char rcsid[] = "@(#)$Id: elm.c,v 5.8 1992/12/11 01:45:04 syd Exp $";
/*******************************************************************************
* The Elm Mail System - $Revision: 5.8 $ $State: Exp $
*
* This file and all associated files and documentation:
* Copyright (c) 1988-1992 USENET Community Trust
* Copyright (c) 1986,1987 Dave Taylor
*******************************************************************************
* Bug reports, patches, comments, suggestions should be sent to:
*
* Syd Weinstein, Elm Coordinator
* elm@DSI.COM dsinc!elm
*
*******************************************************************************
* $Log: elm.c,v $
* Revision 5.8 1992/12/11 01:45:04 syd
* remove sys/types.h include, it is now included by defs.h
* and this routine includes defs.h or indirectly includes defs.h
* From: Syd
*
* Revision 5.7 1992/12/07 02:58:13 syd
* fix long -> time_t
* From: Syd
*
* Revision 5.6 1992/11/26 00:46:13 syd
* changes to first change screen back (Raw off) and then issue final
* error message.
* From: Syd
*
* Revision 5.5 1992/11/22 00:03:56 syd
* Fix segmentation violation on restricted alias page jump.
* From: "Robert L. Howard" <robert.howard@matd.gatech.edu>
*
* Revision 5.4 1992/11/07 19:37:21 syd
* Enhanced printing support. Added "-I" to readmsg to
* suppress spurious diagnostic messages.
* From: chip@chinacat.unicom.com (Chip Rosenthal)
*
* Revision 5.3 1992/10/31 20:02:26 syd
* remove duplicate ScreenSize call
* From: Syd
*
* Revision 5.2 1992/10/25 01:47:45 syd
* fixed a bug were elm didn't call metamail on messages with a characterset,
* which could be displayed by elm itself, but message is encoded with QP
* or BASE64
* From: Klaus Steinberger <Klaus.Steinberger@Physik.Uni-Muenchen.DE>
*
* Revision 5.1 1992/10/03 22:58:40 syd
* Initial checkin as of 2.4 Release at PL0
*
*
******************************************************************************/
/* Main program of the ELM mail system!
*/
#include "elm.h"
#include "s_elm.h"
#ifdef I_TIME
# include <time.h>
#endif
#ifdef I_SYSTIME
# include <sys/time.h>
#endif
#ifdef BSD
# include <sys/timeb.h>
#undef toupper
#undef tolower
#endif
long bytes();
char *format_long(), *parse_arguments(), *error_description();
main(argc, argv)
int argc;
char *argv[];
{
int ch;
char address[SLEN], to_whom[SLEN], *req_mfile;
int i,j; /** Random counting variables (etc) **/
int pageon, /** for when we receive new mail... **/
last_in_folder; /** for when we receive new mail too... **/
long num; /** another variable for fun.. **/
extern int errno;
#ifdef I_LOCALE
setlocale(LC_ALL, "");
#endif
elm_msg_cat = catopen("elm2.4", 0);
req_mfile = parse_arguments(argc, argv, to_whom);
initialize(req_mfile);
if (mail_only) {
dprint(3, (debugfile, "Mail-only: mailing to\n-> \"%s\"\n",
format_long(to_whom, 3)));
if(!batch_only) {
sprintf(address, catgets(elm_msg_cat, ElmSet, ElmSendOnlyMode,
"Send only mode [ELM %s]"), version_buff);
Centerline(1, address);
}
(void) send_msg(to_whom, "", batch_subject, TRUE,
(batch_only ? NO : allow_forms), FALSE);
leave(0);
} else if (check_only) {
do_check_only(to_whom);
leave(0);
}
showscreen();
while (1) {
#ifdef SIGWINCH
if (resize_screen) {
int newLINES, newCOLUMNS;
ScreenSize(&newLINES, &newCOLUMNS);
resize_screen = 0;
if (newLINES != LINES || newCOLUMNS != COLUMNS) {
LINES = newLINES, COLUMNS = newCOLUMNS;
#define max(a,b) ((a) < (b) ? (b) : (a))
if (mini_menu)
headers_per_page = max (LINES - 13, 1);
else
headers_per_page = max (LINES - 8, 1); /* 5 more headers! */
#undef max
redraw++;
}
}
else redraw = 0;
#else
redraw = 0;
#endif
nufoot = 0;
nucurr = 0;
if ((num = bytes(cur_folder)) != mailfile_size) {
dprint(2, (debugfile, "Just received %d bytes more mail (elm)\n",
num - mailfile_size));
error(catgets(elm_msg_cat, ElmSet, ElmNewMailHangOn,
"New mail has arrived! Hang on..."));
fflush(stdin); /* just to be sure... */
last_in_folder = message_count;
pageon = header_page;
if ((errno = can_access(cur_folder, READ_ACCESS)) != 0) {
dprint(1, (debugfile,
"Error: given file %s as folder - unreadable (%s)!\n",
cur_folder, error_description(errno)));
Raw(OFF);
fprintf(stderr, catgets(elm_msg_cat, ElmSet, ElmCantOpenFolderRead,
"Can't open folder '%s' for reading!\n"), cur_folder);
leave(0);
}
newmbox(cur_folder, TRUE); /* last won't be touched! */
clear_error();
header_page = pageon;
if (on_page(current)) /* do we REALLY have to rewrite? */
showscreen();
else {
update_title();
ClearLine(LINES-1); /* remove reading message... */
if ((message_count - last_in_folder) == 1)
error(catgets(elm_msg_cat, ElmSet, ElmNewMessageRecv,
"1 new message received."));
else
error1(catgets(elm_msg_cat, ElmSet, ElmNewMessageRecvPlural,
"%d new messages received."),
message_count - last_in_folder);
}
/* mailfile_size = num; */
if (cursor_control)
transmit_functions(ON); /* insurance */
}
prompt(Prompt);
CleartoEOLN();
ch = GetPrompt();
#ifdef SIGWINCH
if (resize_screen) {
int newLINES, newCOLUMNS;
ScreenSize(&newLINES, &newCOLUMNS);
resize_screen = 0;
if (newLINES != LINES || newCOLUMNS != COLUMNS) {
LINES = newLINES, COLUMNS = newCOLUMNS;
#define max(a,b) ((a) < (b) ? (b) : (a))
if (mini_menu)
headers_per_page = max (LINES - 13, 1);
else
headers_per_page = max (LINES - 8, 1); /* 5 more headers! */
#undef max
redraw++;
}
}
#endif
CleartoEOS();
#ifdef DEBUG
if (! movement_command(ch))
dprint(4, (debugfile, "\nCommand: %c [%d]\n\n", ch, ch));
#endif
set_error(""); /* clear error buffer */
MoveCursor(LINES-3,strlen(Prompt));
switch (ch) {
case '?' : if (help(FALSE))
redraw++;
else
nufoot++;
break;
case '$' : PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmResyncFolder,
"Resynchronize folder"));
redraw += resync();
nucurr = get_page(current);
break;
case '|' : Writechar('|');
if (message_count < 1) {
error(catgets(elm_msg_cat, ElmSet, ElmNoMailToPipe,
"No mail to pipe!"));
fflush(stdin);
} else {
softkeys_off();
redraw += do_pipe();
softkeys_on();
}
break;
#ifdef ALLOW_SUBSHELL
case '!' : Writechar('!');
redraw += subshell();
break;
#endif
case '%' : if (current > 0) {
get_return(address, current-1);
clear_error();
PutLine1(LINES,(COLUMNS-strlen(address))/2,
"%.78s", address);
} else {
error(catgets(elm_msg_cat, ElmSet, ElmNoMailReturnAddress,
"No mail to get return address of!"));
fflush(stdin);
}
break;
case '<' : /* scan current message for calendar information */
#ifdef ENABLE_CALENDAR
if (message_count < 1) {
error(catgets(elm_msg_cat, ElmSet, ElmNoMailToScan,
"No mail to scan!"));
fflush(stdin);
}
else {
PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmScanForCalendar,
"Scan message for calendar entries..."));
scan_calendar();
}
#else
error(catgets(elm_msg_cat, ElmSet, ElmSorryNoCalendar,
"Sorry. Calendar function disabled."));
fflush(stdin);
#endif
break;
case 'a' : alias();
redraw++;
define_softkeys(MAIN); break;
case 'b' : PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmBounceMessage,
"Bounce message"));
fflush(stdout);
if (message_count < 1) {
error(catgets(elm_msg_cat, ElmSet, ElmNoMailToBounce,
"No mail to bounce!"));
fflush(stdin);
}
else
nufoot = remail();
break;
case 'c' : PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmChangeFolder,
"Change folder"));
define_softkeys(CHANGE);
redraw += change_file();
define_softkeys(MAIN);
break;
#ifdef ALLOW_MAILBOX_EDITING
case 'e' : PutLine0(LINES-3,strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmEditFolder,
"Edit folder"));
if (current > 0) {
edit_mailbox();
if (cursor_control)
transmit_functions(ON); /* insurance */
}
else {
error(catgets(elm_msg_cat, ElmSet, ElmFolderIsEmpty,
"Folder is empty!"));
fflush(stdin);
}
break;
#else
case 'e' : error(catgets(elm_msg_cat, ElmSet, ElmNoFolderEdit,
"Folder editing isn't configured in this version of ELM."));
fflush(stdin);
break;
#endif
case 'f' : PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmForward,
"Forward"));
define_softkeys(YESNO);
if (current > 0) {
if(forward()) redraw++;
else nufoot++;
} else {
error(catgets(elm_msg_cat, ElmSet, ElmNoMailToForward,
"No mail to forward!"));
fflush(stdin);
}
define_softkeys(MAIN);
break;
case 'g' : PutLine0(LINES-3,strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmGroupReply,
"Group reply"));
fflush(stdout);
if (current > 0) {
if (headers[current-1]->status & FORM_LETTER) {
error(catgets(elm_msg_cat, ElmSet, ElmCantGroupReplyForm,
"Can't group reply to a Form!!"));
fflush(stdin);
}
else {
define_softkeys(YESNO);
redraw += reply_to_everyone();
define_softkeys(MAIN);
}
}
else {
error(catgets(elm_msg_cat, ElmSet, ElmNoMailToReply,
"No mail to reply to!"));
fflush(stdin);
}
break;
case 'h' : if (filter)
PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmMessageWithHeaders,
"Message with headers..."));
else
PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmDisplayMessage,
"Display message"));
if(current > 0) {
fflush(stdout);
j = filter;
filter = FALSE;
i = show_msg(current);
while (i)
i = process_showmsg_cmd(i);
filter = j;
redraw++;
(void)get_page(current);
} else
error(catgets(elm_msg_cat, ElmSet, ElmNoMailToRead,
"No mail to read!"));
break;
case 'm' : PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmMail,
"Mail"));
redraw += send_msg("", "", "", TRUE,allow_forms,FALSE);
break;
case ' ' :
case ctrl('J'):
case ctrl('M'): PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmDisplayMessage,
"Display message"));
fflush(stdout);
if(current > 0 ) {
define_softkeys(READ);
i = show_msg(current);
while (i)
i = process_showmsg_cmd(i);
redraw++;
(void)get_page(current);
} else
error(catgets(elm_msg_cat, ElmSet, ElmNoMailToRead,
"No mail to read!"));
break;
case 'n' : PutLine0(LINES-3,strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmNextMessage,
"Next Message"));
fflush(stdout);
define_softkeys(READ);
if(current > 0 ) {
define_softkeys(READ);
i = show_msg(current);
while (i)
i = process_showmsg_cmd(i);
redraw++;
if (++current > message_count)
current = message_count;
(void)get_page(current);
} else
error(catgets(elm_msg_cat, ElmSet, ElmNoMailToRead,
"No mail to read!"));
break;
case 'o' : PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmOptions,
"Options"));
if((i=options()) > 0)
get_page(current);
else if(i < 0)
leave(0);
redraw++; /* always fix da screen... */
break;
case 'p' : PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmPrintMail,
"Print mail"));
fflush(stdout);
if (message_count < 1) {
error(catgets(elm_msg_cat, ElmSet, ElmNoMailToPrint,
"No mail to print!"));
fflush(stdin);
} else if (print_msg(TRUE) != 0)
redraw++;
break;
case 'q' : PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmQuit,
"Quit"));
if (mailfile_size != bytes(cur_folder)) {
error(catgets(elm_msg_cat, ElmSet, ElmNewMailQuitCancelled,
"New Mail! Quit cancelled..."));
fflush(stdin);
if (folder_type == SPOOL) unlock();
}
else
quit(TRUE);
break;
case 'Q' : PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmQuickQuit,
"Quick quit"));
if (mailfile_size != bytes(cur_folder)) {
error(catgets(elm_msg_cat, ElmSet, ElmNewMailQuickQuitCancelled,
"New Mail! Quick Quit cancelled..."));
if (folder_type == SPOOL) unlock();
}
else
quit(FALSE);
break;
case 'r' : PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmReplyToMessage,
"Reply to message"));
if (current > 0)
redraw += reply();
else {
error(catgets(elm_msg_cat, ElmSet, ElmNoMailToReplyTo,
"No mail to reply to!"));
fflush(stdin);
}
softkeys_on();
break;
case '>' : /** backwards compatibility **/
case 'C' :
case 's' : if (message_count < 1) {
if (ch != 'C')
error(catgets(elm_msg_cat, ElmSet, ElmNoMailToSave,
"No mail to save!"));
else
error(catgets(elm_msg_cat, ElmSet, ElmNoMailToCopy,
"No mail to copy!"));
fflush(stdin);
}
else {
if (ch != 'C')
PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmSaveToFolder,
"Save to folder"));
else
PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmCopyToFolder,
"Copy to folder"));
PutLine0(LINES-3,COLUMNS-40,
catgets(elm_msg_cat, ElmSet, ElmUseForHelp,
"(Use '?' for help)"));
if (save(&redraw, FALSE, (ch != 'C'))
&& resolve_mode && ch != 'C') {
if((i=next_message(current-1, TRUE)) != -1) {
current = i+1;
nucurr = get_page(current);
}
}
}
ClearLine(LINES-2);
break;
case 'X' : PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmQuickExit,
"Quick Exit"));
fflush(stdout);
leave(0);
break;
case ctrl('Q') :
case 'x' : PutLine0(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmExit,
"Exit"));
fflush(stdout);
exit_prog();
break;
case EOF : leave(0); /* Read failed, control tty died? */
break;
case '@' : debug_screen(); redraw++; break;
case '#' : if (message_count) {
debug_message();
redraw++;
}
else {
error(catgets(elm_msg_cat, ElmSet, ElmNoMailToCheck,
"No mail to check."));
fflush(stdin);
}
break;
/* None of the menu specific commands were chosen, therefore
* it must be a "motion" command (or an error). */
default : motion(ch);
}
if (redraw)
showscreen();
check_range();
if (nucurr == NEW_PAGE)
show_headers();
else if (nucurr == SAME_PAGE)
show_current();
else if (nufoot) {
if (mini_menu) {
MoveCursor(LINES-7, 0);
CleartoEOS();
show_menu();
}
else {
MoveCursor(LINES-4, 0);
CleartoEOS();
}
show_last_error(); /* for those operations that have to
* clear the footer except for a message.
*/
}
} /* the BIG while loop! */
}
debug_screen()
{
/**** spit out all the current variable settings and the table
entries for the current 'n' items displayed. ****/
register int i, j;
char buffer[SLEN];
ClearScreen();
PutLine2(0,0,"Current message number = %d\t\t%d message(s) total\n",
current, message_count);
PutLine2(2,0,"Header_page = %d \t\t%d possible page(s)\n",
header_page, (int) (message_count / headers_per_page) + 1);
PutLine1(4,0,"\nCurrent mailfile is %s.\n\r\n", cur_folder);
i = header_page*headers_per_page; /* starting header */
if ((j = i + (headers_per_page-1)) >= message_count)
j = message_count-1;
Write_to_screen(
"Num From Subject Lines Offset Content\n\r\n\r",0);
while (i <= j) {
sprintf(buffer,
"%3d %-16.16s %-35.35s %4d %8d %8d\n\r",
i+1,
headers[i]->from,
headers[i]->subject,
headers[i]->lines,
headers[i]->offset,
headers[i]->content_length);
Write_to_screen(buffer, 0);
i++;
}
PutLine0(LINES,0,"Press any key to return.");
(void) ReadCh();
}
debug_message()
{
/**** Spit out the current message record. Include EVERYTHING
in the record structure. **/
char buffer[SLEN];
time_t header_time;
register struct header_rec *current_header = headers[current-1];
ClearScreen();
Write_to_screen("\t\t\t----- Message %d -----\n\r\n\r\n\r\n\r", 1,
current);
Write_to_screen( "Lines : %-5d\t\t\tStatus: A C D E F M D N N O P T U V\n\r", 1,
current_header->lines);
Write_to_screen("Content-Length: %-12d\t c o e x o i e p e l r a r i\n\r", 1,
current_header->content_length);
Write_to_screen( " \t\t\t t n l p r m c l w d i g g s\n\r", 0);
Write_to_screen( " \t\t\t n f d d m e o a v d n i\n\r", 0);
sprintf(buffer,
"\n\rOffset: %ld\t\t\t %d %d %d %d %d %d %d %d",
current_header->offset,
(current_header->status & ACTION) != 0,
(current_header->status & CONFIDENTIAL) != 0,
(current_header->status & DELETED) != 0,
(current_header->status & EXPIRED) != 0,
(current_header->status & FORM_LETTER) != 0,
(current_header->status & MIME_MESSAGE) != 0,
(current_header->status & MIME_NEEDDECOD) != 0,
(current_header->status & MIME_NOTPLAIN) != 0);
sprintf(buffer + strlen(buffer),
" %d %d %d %d %d %d\n",
(current_header->status & NEW) != 0,
(current_header->status & UNREAD) != 0,
(current_header->status & PRIVATE) != 0,
(current_header->status & TAGGED) != 0,
(current_header->status & URGENT) != 0,
(current_header->status & VISIBLE) != 0);
Write_to_screen(buffer, 0);
sprintf(buffer, "\n\rReceived on: %s\r",
asctime(localtime(¤t_header->received_time)));
Write_to_screen(buffer, 0);
header_time = current_header->time_sent + current_header->tz_offset;
sprintf(buffer, "Message sent on: %s\rFrom timezone: %s (%d)\n\r",
asctime(gmtime(&header_time)),
current_header->time_zone,
current_header->tz_offset);
Write_to_screen(buffer, 0);
Write_to_screen("From: %s\n\rSubject: %s", 2,
current_header->from,
current_header->subject);
Write_to_screen("\n\rPrimary Recipient: %s\nInternal Index Reference Number = %d\n\r", 2,
current_header->to,
current_header->index_number);
Write_to_screen("Message-ID: %s\n\r", 1,
strlen(current_header->messageid) > 0 ?
current_header->messageid : "<none>");
Write_to_screen("Status: %s\n\r", 1, current_header->mailx_status);
PutLine0(LINES,0,"Please Press any key to return.");
(void) ReadCh();
}
do_check_only(to_whom)
char *to_whom;
{
char buffer[VERY_LONG_STRING], *msg;
dprint(3, (debugfile, "Check-only: checking \n-> \"%s\"\n",
format_long(to_whom, 3)));
(void) build_address(strip_commas(to_whom), buffer);
msg = catgets(elm_msg_cat, ElmSet, ElmExpandsTo,
"Expands to: ");
printf(msg);
printf("%s", format_long(buffer, strlen(msg)));
}
check_range()
{
int i;
i = compute_visible(current);
if ((current < 1) || (selected && i < 1)) {
if (message_count > 0) {
/* We are out of range! Get to first message! */
if (selected)
current = compute_visible(1);
else
current = 1;
}
else
current = 0;
}
else if ((current > message_count)
|| (selected && i > selected)) {
if (message_count > 0) {
/* We are out of range! Get to last (visible) message! */
if (selected)
current = visible_to_index(selected)+1;
else
current = message_count;
}
else
current = 0;
}
}
static char *no_mail = NULL;
static char *no_aliases = NULL;
motion(ch)
char ch;
{
/* Consolidated the standard menu navigation and delete/tag
* commands to a function. */
int key_offset; /** Position offset within keyboard string **/
int i;
if (no_mail == NULL) {
no_mail = catgets(elm_msg_cat, ElmSet, ElmNoMailInFolder,
"No mail in folder!");
no_aliases = catgets(elm_msg_cat, ElmSet, ElmNoAliases,
"No aliases!");
}
switch (ch) {
case '/' : /* scan mbox or aliases for string */
if (message_count < 1) {
error1(catgets(elm_msg_cat, ElmSet,
ElmNoMailToScan, "No %s to scan!"), items);
fflush(stdin);
}
else if (pattern_match())
nucurr = get_page(current);
else {
error(catgets(elm_msg_cat, ElmSet, ElmPatternNotFound,
"pattern not found!"));
fflush(stdin);
}
break;
next_page:
case '+' : /* move to next page if we're not on the last */
if((selected &&
((header_page+1)*headers_per_page < selected))
||(!selected &&
((header_page+1)*headers_per_page<message_count))){
header_page++;
nucurr = NEW_PAGE;
if(move_when_paged) {
/* move to first message of new page */
if(selected)
current = visible_to_index(
header_page * headers_per_page + 1) + 1;
else
current = header_page * headers_per_page + 1;
}
} else
error(catgets(elm_msg_cat, ElmSet, ElmAlreadyOnLastPage,
"Already on last page."));
break;
prev_page:
case '-' : /* move to prev page if we're not on the first */
if(header_page > 0) {
header_page--;
nucurr = NEW_PAGE;
if(move_when_paged) {
/* move to first message of new page */
if(selected)
current = visible_to_index(
header_page * headers_per_page + 1) + 1;
else
current = header_page * headers_per_page + 1;
}
} else
error(catgets(elm_msg_cat, ElmSet, ElmAlreadyOnFirstPage,
"Already on first page."));
break;
first_msg:
case '=' : if (selected)
current = visible_to_index(1)+1;
else
current = 1;
nucurr = get_page(current);
break;
last_msg:
case '*' : if (selected)
current = (visible_to_index(selected)+1);
else
current = message_count;
nucurr = get_page(current);
break;
case ctrl('D') :
case '^' :
case 'd' : if (message_count < 1) {
error1(catgets(elm_msg_cat, ElmSet, ElmNoItemToDelete,
"No %s to delete!"), item);
fflush(stdin);
}
else {
if(ch == ctrl('D')) {
/* if current item did not become deleted,
* don't to move to the next undeleted item */
if(!meta_match(DELETED)) break;
} else
delete_msg((ch == 'd'), TRUE);
if (resolve_mode) /* move after mail resolved */
if((i=next_message(current-1, TRUE)) != -1) {
current = i+1;
nucurr = get_page(current);
}
}
break;
case 'J' : if(current > 0) {
if((i=next_message(current-1, FALSE)) != -1) {
current = i+1;
nucurr = get_page(current);
} else
error1(catgets(elm_msg_cat, ElmSet, ElmNoMoreItemBelow,
"No more %s below."), items);
} else error(ifmain(no_mail, no_aliases));
break;
next_undel_msg:
case 'j' : if(current > 0) {
if((i=next_message(current-1, TRUE)) != -1) {
current = i+1;
nucurr = get_page(current);
} else
error1(catgets(elm_msg_cat, ElmSet, ElmNoItemUndeletedBelow,
"No more undeleted %s below."), items);
} else error(ifmain(no_mail, no_aliases));
break;
case 'K' : if(current > 0) {
if((i=prev_message(current-1, FALSE)) != -1) {
current = i+1;
nucurr = get_page(current);
} else
error1(catgets(elm_msg_cat, ElmSet, ElmNoMoreItemAbove,
"No more %s above."), items);
} else error(ifmain(no_mail, no_aliases));
break;
prev_undel_msg:
case 'k' : if(current > 0) {
if((i=prev_message(current-1, TRUE)) != -1) {
current = i+1;
nucurr = get_page(current);
} else
error1(catgets(elm_msg_cat, ElmSet, ElmNoMoreUndeletedAbove,
"No more undeleted %s above."), items);
} else error(ifmain(no_mail, no_aliases));
break;
case 'l' : PutLine1(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmLimitDisplayBy,
"Limit displayed %s by..."), items);
clear_error();
if (limit() != 0) {
get_page(current);
redraw++;
} else {
nufoot++;
}
break;
case ctrl('T') :
case 't' : if (message_count < 1) {
error1(catgets(elm_msg_cat, ElmSet, ElmNoItemToTag,
"No %s to tag!"), items);
fflush(stdin);
}
else if (ch == 't')
tag_message(TRUE);
else
meta_match(TAGGED);
break;
case 'u' : if (message_count < 1) {
error1(catgets(elm_msg_cat, ElmSet, ElmNoItemToMarkUndeleted,
"No %s to mark as undeleted!"), items);
fflush(stdin);
}
else {
undelete_msg(TRUE);
if (resolve_mode) /* move after mail resolved */
if((i=next_message(current-1, FALSE)) != -1) {
current = i+1;
nucurr = get_page(current);
}
/*************************************************************************
** What we've done here is to special case the "U)ndelete" command to
** ignore whether the next message is marked for deletion or not. The
** reason is obvious upon usage - it's a real pain to undelete a series
** of messages without this quirk. Thanks to Jim Davis @ HPLabs for
** suggesting this more intuitive behaviour.
**
** The old way, for those people that might want to see what the previous
** behaviour was to call next_message with TRUE, not FALSE.
**************************************************************************/
}
break;
case ctrl('U') : if (message_count < 1) {
error1(catgets(elm_msg_cat, ElmSet, ElmNoItemToUndelete,
"No %s to undelete!"), items);
fflush(stdin);
}
else
meta_match(UNDELETE);
break;
case ctrl('L') : redraw++; break;
case NO_OP_COMMAND : break; /* noop for timeout loop */
case ESCAPE : if (cursor_control) {
key_offset = 1;
ch = ReadCh();
if ( ch == '[' || ch == 'O')
{
ch = ReadCh();
key_offset++;
}
if(ch == up[key_offset]) goto prev_undel_msg;
else if(ch == down[key_offset]) goto next_undel_msg;
else if(ch == right[key_offset]) goto next_page;
else if(ch == left[key_offset]) goto prev_page;
else if (hp_terminal) {
switch (ch) {
case 'U': goto next_page;
case 'V': goto prev_page;
case 'h':
case 'H': goto first_msg;
case 'F': goto last_msg;
case 'A':
case 'D':
case 'i': goto next_undel_msg;
case 'B':
case 'I':
case 'C': goto prev_undel_msg;
default: PutLine2(LINES-3, strlen(Prompt),
"%c%c", ESCAPE, ch);
}
} else /* false hit - output */
PutLine2(LINES-3, strlen(Prompt),
"%c%c", ESCAPE, ch);
}
/* else fall into the default error message! */
default : if (ch > '0' && ch <= '9') {
PutLine1(LINES-3, strlen(Prompt),
catgets(elm_msg_cat, ElmSet, ElmNewCurrentItem,
"New Current %s"), Item);
i = read_number(ch, item);
if( i > message_count)
error1(catgets(elm_msg_cat, ElmSet, ElmNotThatMany,
"Not that many %s."), items);
else if(selected
&& isoff(ifmain(headers[i-1]->status,
aliases[i-1]->status), VISIBLE))
error1(catgets(elm_msg_cat, ElmSet, ElmNotInLimitedDisplay,
"%s not in limited display."), Item);
else {
current = i;
nucurr = get_page(current);
}
}
else {
error(catgets(elm_msg_cat, ElmSet, ElmUnknownCommand,
"Unknown command. Use '?' for help."));
fflush(stdin);
}
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.