schaefer@ogicse.cse.ogi.edu (Barton E. Schaefer) (11/05/90)
This is Part 3 of the Official Patch Kit for conversion of Mush 7.1.2 to Mush 7.2.0. See Part 1 for a complete manifest and other information. *** /tmp/,RCSt1009504 Sun Nov 4 20:01:58 1990 --- addrs.c Sun Oct 21 19:24:39 1990 *************** *** 195,203 **** /* Make a copy of the address so we can mangle it freely. */ if (addr && *addr) { /* Skip any leading whitespace. */ ! for (i = addr; *i && (r = any(i, " \t")) == i;) ! if (r) ! i = r + 1; if (*i == '\0') return NULL; /* Skip any leading double-quoted comment. */ --- 195,202 ---- /* Make a copy of the address so we can mangle it freely. */ if (addr && *addr) { /* Skip any leading whitespace. */ ! for (i = addr; *i && index(" \t", *i); i++) ! ; if (*i == '\0') return NULL; /* Skip any leading double-quoted comment. */ *************** *** 206,214 **** return NULL; } /* Skip any more whitespace. */ ! for (; *i && (r = any(i, " \t")) == i;) ! if (r) ! i = r + 1; if (*i == '\0') return NULL; /* Check for angle braces around the address. */ --- 205,212 ---- return NULL; } /* Skip any more whitespace. */ ! while (*i && index(" \t", *i)) ! i++; if (*i == '\0') return NULL; /* Check for angle braces around the address. */ *** /tmp/,RCSt1009486 Sun Nov 4 20:01:51 1990 --- bind.c Sun Oct 21 19:24:40 1990 *************** *** 66,71 **** --- 66,72 ---- /* Folder modification commands */ add_bind("\025", C_UPDATE, NULL, &cmd_map); /* ^U */ add_bind("\020", C_PRESERVE, NULL, &cmd_map); /* ^P */ + add_bind("*", C_MARK_MSG, NULL, &cmd_map); add_bind("W", C_WRITE_LIST, NULL, &cmd_map); add_bind("w", C_WRITE_MSG, NULL, &cmd_map); add_bind("U", C_UNDEL_LIST, NULL, &cmd_map); *************** *** 173,178 **** --- 174,180 ---- { C_MAP_BANG, "map!", NULL, NULL_MAP }, { C_MAP, "map", NULL, NULL_MAP }, { C_MACRO, "macro", NULL, NULL_MAP }, + { C_MARK_MSG, "mark", NULL, NULL_MAP }, /* C_HELP Must be the last one! */ { C_HELP, "help", NULL, NULL_MAP } }; *** /tmp/,RCSt1009594 Sun Nov 4 20:02:54 1990 --- compose.icon Mon Oct 29 19:05:18 1990 *************** *** 0 **** --- 1,34 ---- + /* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 + */ + 0xFFFF,0xFFFF,0xFFFF,0xF89C,0xFFFF,0xFFFF,0xFFFF,0xF8A2, + 0xC000,0x0000,0x0000,0x1A61,0xC000,0x0000,0x0000,0x1A91, + 0xC000,0x0000,0x0000,0x1989,0xC000,0x0000,0x0000,0x1A46, + 0xC000,0x0000,0x0000,0x1E26,0xC000,0x0000,0x0000,0x1B1A, + 0xC003,0x0FDE,0x0000,0x1498,0xC003,0x8FFF,0x0000,0x2968, + 0xC000,0x0000,0x0000,0x5262,0xC000,0x0000,0x0000,0xA4A2, + 0xC000,0x0000,0x0001,0x4988,0xC000,0x0000,0x0002,0x9288, + 0xC000,0x0000,0x0005,0x2622,0xC0E6,0xEFCF,0x79FA,0x4A22, + 0xC0F7,0xEFEF,0xFDF4,0x9888,0xC000,0x0000,0x0029,0x3888, + 0xC000,0x0000,0x0052,0x5A22,0xC7B9,0xEF9D,0x9DA4,0x9A22, + 0xC7FD,0xFFDF,0xDF49,0x1888,0xC000,0x0000,0x0292,0x1888, + 0xC000,0x0000,0x0524,0x1A22,0xC73F,0x3CEC,0xFA48,0x1A22, + 0xC7BF,0xBEFE,0xF490,0x1888,0xC000,0x0000,0x2920,0x1888, + 0xC000,0x0000,0x5240,0x1A22,0xC6E7,0x67E7,0xA4E0,0x1A22, + 0xC7F7,0xF7F7,0x49F0,0x1888,0xC000,0x0002,0x9200,0x1888, + 0xC000,0x0005,0x2400,0x1A22,0xC79D,0x99EA,0x4F00,0x1A22, + 0xC7DF,0xDDF4,0x9F80,0x1888,0xC000,0x0029,0x2000,0x1888, + 0xC000,0x0052,0x4000,0x1A22,0xC738,0x00E4,0x8000,0x1A22, + 0xC7BC,0x0129,0x0000,0x1888,0xC000,0x0112,0x0000,0x1888, + 0xC000,0x020C,0x0000,0x1A22,0xC000,0x0218,0x0000,0x1A22, + 0xC000,0x0660,0x0000,0x1888,0xC000,0x0780,0x0000,0x1888, + 0xC000,0x0E00,0x0000,0x1A22,0xC000,0x0800,0x0000,0x1A22, + 0xC000,0x0000,0x0000,0x1888,0xC000,0x0000,0x0000,0x1888, + 0xC000,0x0000,0x0000,0x1A22,0xC000,0x0000,0x0000,0x1A22, + 0xC000,0x0000,0x2000,0x1888,0xC000,0x0000,0x2000,0x1888, + 0xC006,0x888E,0x2C00,0x1A22,0xC005,0x4891,0x3200,0x1A22, + 0xC005,0x4890,0x2200,0x1888,0xC005,0x488E,0x2200,0x1888, + 0xC005,0x4881,0x2200,0x1A22,0xC005,0x4991,0x2200,0x1A22, + 0xC005,0x468E,0x2200,0x1888,0xC000,0x0000,0x0000,0x1888, + 0xC000,0x0000,0x0000,0x1A22,0xC000,0x0000,0x0000,0x1A22, + 0xC000,0x0000,0x0000,0x1888,0xC000,0x0000,0x0000,0x1888, + 0xFFFF,0xFFFF,0xFFFF,0xFA22,0xFFFF,0xFFFF,0xFFFF,0xFA22 *** /tmp/,RCSt1009401 Sun Nov 4 20:01:09 1990 --- config.h-dist Sun Oct 21 19:24:43 1990 *************** *** 25,32 **** --- 25,37 ---- * tzname nor the BSD timezone() function. The example below is for * Gould BSD4.3 systems; others should define it as a string, e.g. "PST" * If TIMEZONE is defined, DAYLITETZ can also be defined, e.g. "PDT" + * + * Define USA if you are using US/NorthAmerican time zone abbreviations. + * If USA is not defined, dates in outgoing mail will include timezones + * specified as offsets from GMT, e.g. Pacific Standard Time is -0800. */ /* #define TIMEZONE T->tm_zone /**/ + #define USA /**/ /* mail delivery system macros and defines... */ *************** *** 104,110 **** /* #define PICKY_MAILER /**/ /* Headers that will NOT be included when forwarding mail */ ! #define IGNORE_ON_FWD "status" /* comma or space separated list */ #define MAXMSGS 1000 /* maximum number of messages we can read */ #define HDRSIZ BUFSIZ /* This should not be < BUFSIZ! (but can be >) */ --- 109,115 ---- /* #define PICKY_MAILER /**/ /* Headers that will NOT be included when forwarding mail */ ! #define IGNORE_ON_FWD "status,priority" /* comma or space separated list */ #define MAXMSGS 1000 /* maximum number of messages we can read */ #define HDRSIZ BUFSIZ /* This should not be < BUFSIZ! (but can be >) */ *************** *** 116,121 **** --- 121,131 ---- #if defined(SYSV) || defined(sun) #define VPRINTF #endif /* SYSV || sun */ + + /* If your system uses the getwd() system call (as opposed to getcwd()), + * and your system is not a BSD system (e.g. MIPS), define GETWD below. + */ + /* #define GETWD /**/ #define LS_COMMAND "ls" #define FORTUNE "/usr/games/fortune" *** /tmp/,RCSt1009480 Sun Nov 4 20:01:48 1990 --- curses.c Sun Nov 4 16:59:57 1990 *************** *** 10,16 **** register char **argv; { char buf[80]; ! extern char *UP, ttytype[]; if (argv && *++argv && !strcmp(*argv, "-?")) return help(0, "curses", cmd_help); --- 10,19 ---- register char **argv; { char buf[80]; ! extern char *UP; ! #ifndef M_UNIX ! extern char ttytype[]; ! #endif /* M_UNIX */ if (argv && *++argv && !strcmp(*argv, "-?")) return help(0, "curses", cmd_help); *************** *** 365,371 **** for (n = 0; n < msg_cnt; n++) if (msg_bit(msg_list, n)) { if (c == C_DELETE_MSG || c == C_DELETE_LIST) ! turnon(msg[n].m_flags, DELETE); else turnoff(msg[n].m_flags, DELETE); if (isoff(glob_flags, CNTD_CMD) && (msg_cnt < screen || --- 368,374 ---- for (n = 0; n < msg_cnt; n++) if (msg_bit(msg_list, n)) { if (c == C_DELETE_MSG || c == C_DELETE_LIST) ! turnon(msg[n].m_flags, DELETE|DO_UPDATE); else turnoff(msg[n].m_flags, DELETE); if (isoff(glob_flags, CNTD_CMD) && (msg_cnt < screen || *************** *** 450,457 **** } } ! /* preserve message */ ! when C_PRESERVE : if (!msg_cnt) { print("No messages."); if (ison(glob_flags, CNTD_CMD)) --- 453,460 ---- } } ! /* preserve message or place mark on message */ ! when C_PRESERVE : case C_MARK_MSG : if (!msg_cnt) { print("No messages."); if (ison(glob_flags, CNTD_CMD)) *************** *** 458,468 **** putchar('\n'); break; } ! if (ison(msg[current_msg].m_flags, PRESERVE)) ! turnoff(msg[current_msg].m_flags, PRESERVE); else ! turnon(msg[current_msg].m_flags, PRESERVE); ! turnon(glob_flags, DO_UPDATE); if (ison(glob_flags, CNTD_CMD)) { wprint("%-.*s\n", COLS-1, compose_hdr(current_msg)); redo = 1; --- 461,475 ---- putchar('\n'); break; } ! if (ison(msg[current_msg].m_flags, ! c == C_MARK_MSG ? M_PRIORITY(0) : PRESERVE)) ! turnoff(msg[current_msg].m_flags, ! c == C_MARK_MSG ? M_PRIORITY(0) : PRESERVE); else ! turnon(msg[current_msg].m_flags, ! c == C_MARK_MSG ? M_PRIORITY(0) : PRESERVE); ! if (c != C_MARK_MSG) ! turnon(glob_flags, DO_UPDATE); if (ison(glob_flags, CNTD_CMD)) { wprint("%-.*s\n", COLS-1, compose_hdr(current_msg)); redo = 1; *************** *** 479,488 **** (void) strcat(file, " -"); } print( ! "Order messages by [author, date, length, Status, subject]: " ); if ((c = m_getchar()) == 'a' || c == 'd' || c == 'l' || ! c == 'S' || c == 's' || c == 'R') { print("reordering messages..."); (void) cmd_line(sprintf(buf, "%s %c", file, c), msg_list); print_more("done."); --- 486,495 ---- (void) strcat(file, " -"); } print( ! "Order messages by [author, date, length, Status, subject, priority]: " ); if ((c = m_getchar()) == 'a' || c == 'd' || c == 'l' || ! c == 'S' || c == 's' || c == 'R' || c == 'p') { print("reordering messages..."); (void) cmd_line(sprintf(buf, "%s %c", file, c), msg_list); print_more("done."); *** /tmp/,RCSt1009567 Sun Nov 4 20:02:43 1990 --- doproc.c Tue Oct 30 13:29:23 1990 *************** *** 301,307 **** if (!event || event_id(event) == MS_LEFT) value = 0; switch(value) { ! case 1: p = "help"; when 2: p = "mouse"; when 3: p = "windows"; when 4: p = "hdr_format", helpfile = cmd_help; --- 301,308 ---- if (!event || event_id(event) == MS_LEFT) value = 0; switch(value) { ! case 0: p = "about", helpfile = cmd_help; ! when 1: p = "help"; when 2: p = "mouse"; when 3: p = "windows"; when 4: p = "hdr_format", helpfile = cmd_help; *************** *** 354,359 **** --- 355,361 ---- mail_status(0); /* lower flag (if up) print current num of msgs */ /* wmgr_changestate (window_get(tool, WIN_FD), rootfd, TRUE); */ /* wmgr_changelevel (window_get(tool, WIN_FD), parentfd, TRUE); */ + close_frame(); window_set(tool, FRAME_CLOSED, TRUE, NULL); is_iconic = ((int) window_get(tool, FRAME_CLOSED)); return; *************** *** 366,372 **** */ if (isoff(glob_flags, DO_UPDATE) || ask("Folder has been modified -- update?")) { ! if (!copyback("Quit anyway?")) return; } cleanup(0); --- 368,374 ---- */ if (isoff(glob_flags, DO_UPDATE) || ask("Folder has been modified -- update?")) { ! if (!copyback("Quit anyway?", TRUE)) return; } cleanup(0); *************** *** 374,379 **** --- 376,408 ---- /*ARGSUSED*/ void + do_mark(item, value, event) + Panel_item item; + int value; + Event *event; + { + if (event && (event_id(event) == MS_LEFT) || value == 0) { + int msg_num = event? current_msg : (int)item; + /* mark message */ + if (ison(msg[msg_num].m_flags, M_PRIORITY(0))) + turnoff(msg[msg_num].m_flags, M_PRIORITY(0)); + else + turnon(msg[msg_num].m_flags, M_PRIORITY(0)); + (void) do_hdrs(0, DUBL_NULL, NULL); + } else if (value < 7) { + /* set priority */ + char buf[90]; + (void) cmd_line(sprintf(buf, "mark -%c %s", + value < 6? value + 'A' - 1 : ' ', + panel_get_value(msg_num_item)), NULL); + } else + (void) help(0, "mark", tool_help); + if (value != 7 && item) + panel_set_value(item, 0); + } + + /*ARGSUSED*/ + void do_lpr(item, value, event) Panel_item item; int value; *************** *** 381,387 **** { char buf[128]; ! if (event && (event_id(event) == MS_LEFT || value == 1)) { wprint("Sending message %d to printer...\n", current_msg+1); (void) strcpy(buf, "lpr "); if (value) --- 410,416 ---- { char buf[128]; ! if (event && (event_id(event) == MS_LEFT)) { wprint("Sending message %d to printer...\n", current_msg+1); (void) strcpy(buf, "lpr "); if (value) *************** *** 416,422 **** char *argv[5], buf[64]; char *file = (char *)window_get(textsw, TEXTSW_CLIENT_DATA); char *p, *oldsign = NULL, *oldfortune = NULL; - Textsw save_sw = wprint_sw; if (textsw_store_file(textsw, file, 0, 0)) { error("Can't save to %s", file); --- 445,450 ---- *************** *** 432,442 **** if (p = do_set(set_options, "fortune")) oldfortune = savestr(p); if (panel_get_value(fortune_item) && !oldfortune) ! (void) cmd_line(strcpy(buf, "set fortune"), NULL); else if (!panel_get_value(fortune_item) && oldfortune) (void) cmd_line(strcpy(buf, "\\unset fortune"), NULL); - wprint_sw = NULL; - wprint_sw = save_sw; turnoff(glob_flags, IS_GETTING); argv[0] = "mail"; argv[1] = "-Uh"; --- 460,468 ---- if (p = do_set(set_options, "fortune")) oldfortune = savestr(p); if (panel_get_value(fortune_item) && !oldfortune) ! (void) cmd_line(strcpy(buf, "\\set fortune"), NULL); else if (!panel_get_value(fortune_item) && oldfortune) (void) cmd_line(strcpy(buf, "\\unset fortune"), NULL); turnoff(glob_flags, IS_GETTING); argv[0] = "mail"; argv[1] = "-Uh"; *************** *** 842,858 **** argv[2] = NULL; if (event_id(event) == MS_LEFT) ! argv[1] = do_set(set_options, "sort"); ! else switch(value) { ! case 0: argv[1] = "d"; when 1: argv[1] = "a"; when 2: argv[1] = "l"; when 3: argv[1] = "R"; when 4: argv[1] = "s"; ! when 5: argv[1] = "S"; ! when 6: (void) help(0, "sort", tool_help); } ! if (value != 6) { if (n > 0) { turnon(glob_flags, IS_PIPE); (void) sort(2, argv, list); --- 868,886 ---- argv[2] = NULL; if (event_id(event) == MS_LEFT) ! value = 0; ! switch(value) { ! case 0: argv[1] = "S"; when 1: argv[1] = "a"; when 2: argv[1] = "l"; when 3: argv[1] = "R"; when 4: argv[1] = "s"; ! when 5: argv[1] = "d"; ! when 6: argv[1] = "p"; ! when 7: do_set(set_options, "sort"); ! when 8: (void) help(0, "sort", tool_help); } ! if (value != 8) { if (n > 0) { turnon(glob_flags, IS_PIPE); (void) sort(2, argv, list); *** /tmp/,RCSt1009489 Sun Nov 4 20:01:53 1990 --- file.c Sun Oct 21 19:24:46 1990 *************** *** 393,401 **** c = *p, *p = 0; /* See if it's a file. This doesn't get written back * onto "buf" since it is supposed to be extracted anyway. */ if (force || *file == '+' || *file == '~' || ! *file == '|' || *file == '/') { int isdir; /* open either "file" or &file[1] */ if (*file == '|') { --- 393,403 ---- c = *p, *p = 0; /* See if it's a file. This doesn't get written back * onto "buf" since it is supposed to be extracted anyway. + * The check for '@' in names beginning with '/' is to + * avoid mis-identifying X.400 addresses as file names. */ if (force || *file == '+' || *file == '~' || ! *file == '|' || *file == '/' && !index(file, '@')) { int isdir; /* open either "file" or &file[1] */ if (*file == '|') { *** /tmp/,RCSt1009470 Sun Nov 4 20:01:41 1990 --- folders.c Sun Oct 21 19:24:47 1990 *************** *** 85,98 **** */ n = 0; if (*tmp != '/') { ! #ifdef SYSV ! extern char *getcwd(); ! if (!getcwd(buf, MAXPATHLEN)) ! #else /* SYSV */ ! extern char *getwd(); ! if (!getwd(buf)) ! #endif /* SYSV */ ! { error("getcwd: %s",buf); return -1; } --- 85,91 ---- */ n = 0; if (*tmp != '/') { ! if (!GetCwd(buf, sizeof buf)) { error("getcwd: %s",buf); return -1; } *************** *** 117,123 **** if (!(statbuf.st_mode & 0200)) do_read_only = 1; ! if (!(n = copyback(updating ? "Update folder?" : "Change anyway?"))) { #ifdef SUNTOOL if (istool > 1) timeout_cursors(FALSE); --- 110,116 ---- if (!(statbuf.st_mode & 0200)) do_read_only = 1; ! if (!(n=copyback(updating?"Update folder?":"Change anyway?",!updating))) { #ifdef SUNTOOL if (istool > 1) timeout_cursors(FALSE); *************** *** 151,156 **** --- 144,153 ---- if (!(tmpf = mask_fopen(tempfile, "w"))) { error("error truncating %s", tempfile); turnoff(glob_flags, IGN_SIGS); + #ifdef SUNTOOL + if (istool > 1) + timeout_cursors(FALSE); + #endif /* SUNTOOL */ return -1; } } *************** *** 160,170 **** --- 157,175 ---- last_msg_cnt = 0; last_size = statbuf.st_size; /* Disable check_new_mail() */ turnoff(glob_flags, IGN_SIGS); + #ifdef SUNTOOL + if (istool > 1) + timeout_cursors(FALSE); + #endif /* SUNTOOL */ return -1; } if (do_read_only && !(tmpf = fopen(mailfile, "r"))) { error(mailfile); turnoff(glob_flags, IGN_SIGS); + #ifdef SUNTOOL + if (istool > 1) + timeout_cursors(FALSE); + #endif /* SUNTOOL */ return -1; } } *************** *** 235,240 **** --- 240,249 ---- if (msg_cnt) { display_msg(current_msg, (long)0); do_hdrs(0, DUBL_NULL, NULL); + /* Automatic display should not "touch" this message */ + turnoff(msg[current_msg].m_flags, DO_UPDATE); + /* don't update folder just because a message is displayed */ + turnoff(glob_flags, DO_UPDATE); } timeout_cursors(FALSE); } *************** *** 369,374 **** --- 378,385 ---- Debug("newest_msg = %d\n", newest_msg); last_msg_cnt = msg_cnt; /* for check_new_mail */ Debug("msg_cnt = %d\n", msg_cnt); + if (current_msg < 0) + current_msg = 0; (void) mail_size(); turnoff(glob_flags, IGN_SIGS); *** /tmp/,RCSt1009435 Sun Nov 4 20:01:22 1990 --- hdrs.c Tue Oct 23 16:14:31 1990 *************** *** 295,300 **** --- 295,301 ---- when 'r': special = REPLIED; when 's': special = SAVED; when 'p': special = PRESERVE; + when 'm': special = M_PRIORITY(0); otherwise: print("choose from n,u,o,d,r,s,p or a"); return -1; } if (debug) *************** *** 378,383 **** --- 379,385 ---- status[1] = 'r'; else status[1] = ' '; + status[2] = 0; to[0] = from[0] = subject[0] = date[0] = lines[0] = addr[0] = name[0] = Day[0] = Mon[0] = Tm[0] = Yr[0] = Wkday[0] = 0; *************** *** 433,448 **** /* now, construct a header out of a format string */ if (!hdr_fmt) hdr_fmt = hdr_format; ! ! (void) sprintf(buf, "%4.d ", cnt+1); ! b = buf+5; ! *b++ = ((cnt == current_msg && !iscurses)? '>': ' '); ! *b++ = status[0], *b++ = status[1]; ! *b++ = ' '; /* Count chars since beginning of buf. Initialize to 9 (strlen(buf) so far) * This magic number is used in other places in msgs.c and mail.c */ n = 9; for (p = hdr_fmt; *p; p++) if (*p == '\\') switch (*++p) { --- 435,459 ---- /* now, construct a header out of a format string */ if (!hdr_fmt) hdr_fmt = hdr_format; ! { ! int i; ! for (i = MAX_PRIORITY; i > 0; i--) ! if (ison(msg[cnt].m_flags, M_PRIORITY(i))) { ! p2 = sprintf(lines, "%d", i); ! break; ! } ! (void) sprintf(buf, "%c%3.d%s%c%s ", ! ((cnt == current_msg && !iscurses)? '>': ' '), ! cnt+1, cnt < 999 ? " " : "", ! (ison(msg[cnt].m_flags, M_PRIORITY(0)) ? '+' : ! i > 0 ? 'A' + i - 1 : ' '), ! status); ! } /* Count chars since beginning of buf. Initialize to 9 (strlen(buf) so far) * This magic number is used in other places in msgs.c and mail.c */ n = 9; + b = buf+9; for (p = hdr_fmt; *p; p++) if (*p == '\\') switch (*++p) { *************** *** 525,534 **** --- 536,547 ---- } if (do_pad && pad && strlen(p2) > pad) { char *old_p2 = p2, *p3; + int is_bangform = 0; /* if addr is too long, move pointer forward till the * "important" part is readable only for ! paths/addresses. */ while (p3 = index(p2, '!')) { + is_bangform = 1; len = strlen(p3+1); /* xenix has compiler problems */ p2 = p3+1; if (len + isauthor*4 < pad) { *************** *** 539,545 **** } if (isauthor && p2 > old_p2+4 && !p3 && strlen(p2) + 4 > pad) p2 -= 4; ! if (p3 && (p3 = rindex(p2, '@'))) { len = strlen(p3); while (len-- && --p2 > old_p2) { if (*(p2 + isauthor*4 - 1) == '!') --- 552,558 ---- } if (isauthor && p2 > old_p2+4 && !p3 && strlen(p2) + 4 > pad) p2 -= 4; ! if (is_bangform && (p3 = rindex(p2, '@'))) { len = strlen(p3); while (len-- && --p2 > old_p2) { if (*(p2 + isauthor*4 - 1) == '!') *** /tmp/,RCSt1009495 Sun Nov 4 20:01:55 1990 --- lock.c Sun Nov 4 17:04:33 1990 *************** *** 92,101 **** #endif /* USG */ #define LOCK_NB 0 /* Always non-blocking in this case */ ! #ifdef HPUX #undef EWOULDBLOCK ! #endif /* HPUX */ #define EWOULDBLOCK EAGAIN flock(fd, op) int fd, op; --- 92,105 ---- #endif /* USG */ #define LOCK_NB 0 /* Always non-blocking in this case */ ! #ifdef EWOULDBLOCK #undef EWOULDBLOCK ! #endif /* EWOULDBLOCK */ ! #ifdef M_UNIX ! #define EWOULDBLOCK EACCESS /* SCO bug that may eventually be fixed */ ! #else /* !M_UNIX */ #define EWOULDBLOCK EAGAIN + #endif /* M_UNIX */ flock(fd, op) int fd, op; *************** *** 215,221 **** #ifdef M_XENIX (void) unlink(sprintf(buf, "/tmp/%.10s.mlk", login)); #else /* M_XENIX */ ! (void) unlink(sprintf(buf, "%s.lock", filename)); #endif /* M_XENIX */ #ifdef BSD setregid(sgid, rgid); --- 219,236 ---- #ifdef M_XENIX (void) unlink(sprintf(buf, "/tmp/%.10s.mlk", login)); #else /* M_XENIX */ ! { ! /* If the file was locked through open_file(), we may not have ! * a complete pathname to work with here. Expand it and test ! * whether we need to unlink at all. This should really be ! * handled by having open_file() return the name it used, but ! * that breaks too many other things at the moment. ! */ ! int isdir = 0; ! char *p = getpath(sprintf(buf, "%s.lock", filename), &isdir); ! if (isdir == 0) ! (void) unlink(p); ! } #endif /* M_XENIX */ #ifdef BSD setregid(sgid, rgid); *** /tmp/,RCSt1009474 Sun Nov 4 20:01:43 1990 --- loop.c Sun Oct 21 19:24:50 1990 *************** *** 50,56 **** (void) signal(SIGINT, catch); (void) signal(SIGQUIT, catch); (void) signal(SIGHUP, catch); - #ifndef SUNTOOL (void) signal(SIGTERM, catch); (void) signal(SIGCHLD, #ifndef SYSV --- 50,55 ---- *************** *** 59,65 **** SIG_DFL #endif /* SYSV */ ); - #endif /* SUNTOOL*/ turnoff(glob_flags, IGN_SIGS); if (hist_size == 0) /* if user didn't set history in .rc file */ --- 58,63 ---- *************** *** 650,665 **** } /* - * Structure for expansions - * (move to a header file?) - */ - struct expand { - char *orig; /* string beginning with substring to be expanded */ - char *exp; /* result of expansion of substring */ - char *rest; /* rest of the original string beyond substring */ - }; - - /* * Parse and expand a single variable reference. Variable references * begin with a '$' and thereafter look like any of: * $ $$ is the pid of the current process --- 648,653 ---- *************** *** 1182,1187 **** --- 1170,1176 ---- #ifndef REGCMP extern char *re_comp(); #else + char *rex = NULL; extern char *regcmp(); #endif /* REGCMP */ *************** *** 1202,1208 **** #ifndef REGCMP if (re_comp(str)) #else ! if (!regcmp(str, NULL)) #endif /* REGCMP */ { if (c) --- 1191,1197 ---- #ifndef REGCMP if (re_comp(str)) #else ! if (!(rex = regcmp(str, NULL))) /* Assign and test */ #endif /* REGCMP */ { if (c) *************** *** 1232,1238 **** #ifndef REGCMP re_exec(buf) #else ! !!regex(str, buf, NULL) /* convert to boolean value */ #endif /* REGCMP */ == 1; if (found) { --- 1221,1227 ---- #ifndef REGCMP re_exec(buf) #else ! !!regex(rex, buf, NULL) /* convert to boolean value */ #endif /* REGCMP */ == 1; if (found) { *** /tmp/,RCSt1009421 Sun Nov 4 20:01:14 1990 --- main.c Sun Oct 21 19:24:52 1990 *************** *** 188,196 **** mailv[n++] = recipients; mailv[n] = NULL; /* set now in case user is not running shell, but is running debug */ ! #ifndef SUNTOOL ! (void) signal(SIGCHLD, sigchldcatcher); ! #endif /* SUNTOOL */ if (!setjmp(jmpbuf)) (void) do_mail(n, mailv, msg_list); /* do shell set from above: "mush -S user" perhaps */ --- 188,195 ---- mailv[n++] = recipients; mailv[n] = NULL; /* set now in case user is not running shell, but is running debug */ ! if (!istool) ! (void) signal(SIGCHLD, sigchldcatcher); if (!setjmp(jmpbuf)) (void) do_mail(n, mailv, msg_list); /* do shell set from above: "mush -S user" perhaps */ *************** *** 280,287 **** } turnon(glob_flags, DO_SHELL); - if (istool && msg_cnt) - set_isread(current_msg); /* finally, if the user wanted to source a file to execute, do it now */ if (Flags.src_file) { --- 279,284 ---- *************** *** 311,317 **** (void) notify_set_itimer_func(tool, do_check, ITIMER_REAL, &mail_timer, (struct itimerval *) 0); timeout_cursors(FALSE); - turnoff(glob_flags, DO_UPDATE); window_main_loop(tool); cleanup(0); } --- 308,313 ---- *************** *** 329,346 **** set_cwd() { char cwd[MAXPATHLEN]; - #ifndef SYSV - extern char *getwd(); - #else /* SYSV */ - extern char *getcwd(); - #endif /* SYSV */ ! #ifndef SYSV ! if (getwd(cwd) == NULL) ! #else ! if (getcwd(cwd, MAXPATHLEN) == NULL) ! #endif /* SYSV */ ! { error("set_cwd: %s", cwd); (void) un_set(&set_options, "cwd"); } else { --- 325,332 ---- set_cwd() { char cwd[MAXPATHLEN]; ! if (GetCwd(cwd, MAXPATHLEN) == NULL) { error("set_cwd: %s", cwd); (void) un_set(&set_options, "cwd"); } else { *** /tmp/,RCSt1009561 Sun Nov 4 20:02:41 1990 --- makefile.sys.v Sun Oct 21 19:24:53 1990 *************** *** 17,23 **** OBJS2= bind.o curs_io.o curses.o file.o strings.o macros.o \ addrs.o malloc.o glob.o ! HELP= README README-7.0 README-7.1 mush.1 cmd_help \ Mushrc Mailrc Gnurc sample.mushrc advanced.mushrc digestify # Sun OS systems who wish to compile with sys-v options: --- 17,23 ---- OBJS2= bind.o curs_io.o curses.o file.o strings.o macros.o \ addrs.o malloc.o glob.o ! HELP= README README-7.0 README-7.1 README-7.2 mush.1 cmd_help \ Mushrc Mailrc Gnurc sample.mushrc advanced.mushrc digestify # Sun OS systems who wish to compile with sys-v options: *** /tmp/,RCSt1009558 Sun Nov 4 20:02:40 1990 --- makefile.xenix Sun Oct 21 19:24:54 1990 *************** *** 20,26 **** signals.o setopts.o msgs.o pick.o sort.o expr.o strings.o \ folders.o dates.o loop.o viewopts.o bind.o curses.o curs_io.o \ lock.o macros.o options.o addrs.o malloc.o glob.o ! HELP_FILES= README README-7.0 README-7.1 mush.1 cmd_help \ Mushrc Mailrc Gnurc sample.mushrc advanced.mushrc digestify # Memory model. Use -M3e for 80386 machines. --- 20,26 ---- signals.o setopts.o msgs.o pick.o sort.o expr.o strings.o \ folders.o dates.o loop.o viewopts.o bind.o curses.o curs_io.o \ lock.o macros.o options.o addrs.o malloc.o glob.o ! HELP_FILES= README README-7.0 README-7.1 README-7.2 mush.1 cmd_help \ Mushrc Mailrc Gnurc sample.mushrc advanced.mushrc digestify # Memory model. Use -M3e for 80386 machines. *** /tmp/,RCSt1009427 Sun Nov 4 20:01:17 1990 --- misc.c Thu Oct 25 17:46:52 1990 *************** *** 51,65 **** print_help(argc, argv) register char **argv; { ! #ifdef SUNTOOL ! if (istool) ! return help(0, "general", tool_help); ! #endif /* SUNTOOL */ if (!argc || !*++argv) ! return help(0, "general", cmd_help); if (argv[0][0] == '-') ! return help(0, "help", cmd_help); return help(0, *argv, cmd_help); } --- 51,62 ---- print_help(argc, argv) register char **argv; { ! int about = (argv && *argv && **argv == 'a'); if (!argc || !*++argv) ! return help(0, about? "about": "general", cmd_help); if (argv[0][0] == '-') ! return help(0, about? "about": "help", cmd_help); return help(0, *argv, cmd_help); } *************** *** 282,287 **** --- 279,287 ---- * The + implies: add this flag to the current message's flag bits * The - implies: delete this flag to the current message's flag bits * No + or - implies that the msg's flag bits are set explicitly. + * Marks and priorities are preserved in the m_flags field despite + * what we're doing here. Thus, other actions taken by this function + * do not affect marks and priorities. */ msg_flags(c, v, list) register char **v, *list; *************** *** 327,332 **** --- 327,333 ---- had_list = 1; } } + /* If we haven't got a msglist, use current_msg */ if (had_list == 0 && isoff(glob_flags, IS_PIPE)) set_msg_bit(list, current_msg); *************** *** 355,371 **** wprint(" FORWARD"); if (ison(msg[i].m_flags, UPDATE_STATUS)) wprint(" UPDATE_STATUS"); (void) strcpy(sent, date_to_ctime(msg[i].m_date_sent)); (void) strcpy(recv, date_to_ctime(msg[i].m_date_recv)); wprint("\n\tsent: %s\trecv: %s", sent, recv); } else { ! if (isoff(glob_flags, READ_ONLY)) ! turnon(glob_flags, DO_UPDATE); switch (modify) { case 0: msg[i].m_flags = newflag; when 1: msg[i].m_flags |= newflag; when 2: msg[i].m_flags &= ~newflag; } } } return 0; --- 356,386 ---- wprint(" FORWARD"); if (ison(msg[i].m_flags, UPDATE_STATUS)) wprint(" UPDATE_STATUS"); + for (modify = MAX_PRIORITY; modify > 0; modify--) + if (ison(msg[i].m_flags, M_PRIORITY(modify))) + wprint(" %c", 'A' + modify - 1); (void) strcpy(sent, date_to_ctime(msg[i].m_date_sent)); (void) strcpy(recv, date_to_ctime(msg[i].m_date_recv)); wprint("\n\tsent: %s\trecv: %s", sent, recv); } else { ! u_long save_priority = 0L; ! if (modify == 0) { ! int j; ! for (j = 0; j < MAX_PRIORITY; j++) ! if (ison(msg[i].m_flags, M_PRIORITY(j))) ! turnon(save_priority, M_PRIORITY(j)); ! } switch (modify) { case 0: msg[i].m_flags = newflag; when 1: msg[i].m_flags |= newflag; when 2: msg[i].m_flags &= ~newflag; } + if (save_priority) + msg[i].m_flags |= save_priority; + if (isoff(glob_flags, READ_ONLY)) { + turnon(glob_flags, DO_UPDATE); + turnon(msg[i].m_flags, DO_UPDATE); + } } } return 0; *************** *** 398,407 **** char *buf; { static FILE *pp; - static char file[MAXPATHLEN]; static int cnt, len; static u_long save_echo_flag; #ifdef SUNTOOL static Textsw sw; /* pipe_msg will pass -1 for start_pager to avoid this block */ --- 413,422 ---- char *buf; { static FILE *pp; static int cnt, len; static u_long save_echo_flag; #ifdef SUNTOOL + static char file[MAXPATHLEN]; static Textsw sw; /* pipe_msg will pass -1 for start_pager to avoid this block */ *************** *** 551,559 **** if (!p) p = "--more--"; print_more(p); ! while ((c = getchar()) >= 0 && c != CTRL('D') && !isspace(c) && ! c != '\n' && c != '\r' && lower(c) != 'q' && lower(c) != 'd') bell(); if (ison(glob_flags, ECHO_FLAG) && c != '\n' && c != '\r') while (getchar() != '\n'); --- 566,574 ---- if (!p) p = "--more--"; print_more(p); ! while ((c = getchar()) >= 0 && c != CTRL('D') && !isspace(c) && ! c != '\n' && c != '\r' && lower(c) != 'q' && lower(c) != 'd') bell(); if (ison(glob_flags, ECHO_FLAG) && c != '\n' && c != '\r') while (getchar() != '\n'); *************** *** 676,683 **** error(buf+1); else { turnon(glob_flags, IGN_SIGS); ! while (fgets(buf, sizeof(buf), pp2)) (void) fputs(buf, fp), lines++; (void) pclose(pp2); (void) fflush(fp); turnoff(glob_flags, IGN_SIGS); --- 691,702 ---- error(buf+1); else { turnon(glob_flags, IGN_SIGS); ! while (fgets(buf, sizeof(buf), pp2)) { ! int len = strlen(buf); (void) fputs(buf, fp), lines++; + if (len < sizeof buf - 1 && buf[len - 1] != '\n') + (void) fputc('\n', fp); + } (void) pclose(pp2); (void) fflush(fp); turnoff(glob_flags, IGN_SIGS); *** /tmp/,RCSt1009461 Sun Nov 4 20:01:37 1990 --- pick.c Sun Oct 21 19:25:01 1990 *************** *** 3,8 **** --- 3,9 ---- #include "mush.h" static int before, after, search_from, search_subj, search_to, xflg, icase; + static u_long match_priority; static char search_hdr[64]; static int mdy[3]; static int pick(); *************** *** 71,76 **** --- 72,78 ---- head_first = TRUE; head_cnt = tail_cnt = -1; + match_priority = 0; icase = before = after = search_from = search_subj = search_to = xflg = 0; mdy[0] = mdy[1] = search_hdr[0] = 0; while (*argv && *++argv && (**argv == '-' || **argv == '+')) *************** *** 89,100 **** } } else if ((c = argv[0][1]) == 'e') { if (!*++argv) { ! print("use: -e expression...\n"); return -1; } break; } else switch (c) { ! /* users specifies a range */ case 'r': { int X = 2; /* if not a pipe, then clear all bits cuz we only want --- 91,102 ---- } } else if ((c = argv[0][1]) == 'e') { if (!*++argv) { ! print("usage: -e expression...\n"); return -1; } break; } else switch (c) { ! /* user specifies a range */ case 'r': { int X = 2; /* if not a pipe, then clear all bits cuz we only want *************** *** 144,149 **** --- 146,159 ---- (void) lcase_strcpy(search_hdr, *argv); else search_to = 1; + when 'p' : /* Select on priority field */ + if (!*++argv || (c = upper(**argv)) < 'A' || + c > MAX_PRIORITY + 'A') { + print("pick: invalid priority: %s\n", argv[0]); + clear_msg_list(ret_list); + return -1; + } + turnon(match_priority, M_PRIORITY(c - 'A' + 1)); when 'x' : xflg = 1; when 'i' : icase = 1; otherwise: *************** *** 155,163 **** print("Can't specify -x and head/tail options together.\n"); return -1; } ! pattern[0] = 0; ! (void) argv_to_string(pattern, argv); ! search = (pattern[0] || head_cnt + tail_cnt < 0); if (verbose) { if (head_cnt + tail_cnt >= 0) { print("Finding the "); --- 165,181 ---- print("Can't specify -x and head/tail options together.\n"); return -1; } ! if (!mdy[1]) { ! pattern[0] = 0; ! (void) argv_to_string(pattern, argv); ! if (pattern[0] == '\0' && match_priority == 0 && ! head_cnt + tail_cnt < 0) { ! print("No pattern specified\n"); ! clear_msg_list(ret_list); /* doesn't matter really */ ! return -1; ! } ! } ! search = (pattern[0] || mdy[1] || match_priority > 0); if (verbose) { if (head_cnt + tail_cnt >= 0) { print("Finding the "); *************** *** 181,195 **** else print_more(" of the last %d", tail_cnt); } else ! print_more("Searching for messages"); if (!search) { if (tail_cnt > 0 && head_cnt > 0) print_more(" messages"); if (ison(glob_flags, IS_PIPE)) print_more(" from the input list"); ! } else if (mdy[1] == 0) { ! print(" that %scontain \"%s\"", (xflg)? "do not ": "", ! (*pattern)? pattern: "<previous expression>"); if (search_subj) print_more(" in subject line"); else if (search_from) --- 199,214 ---- else print_more(" of the last %d", tail_cnt); } else ! print_more("Searching for %smessages", ! match_priority > 0 ? "priority " : ""); if (!search) { if (tail_cnt > 0 && head_cnt > 0) print_more(" messages"); if (ison(glob_flags, IS_PIPE)) print_more(" from the input list"); ! } else if (pattern[0]) { ! print_more(" that %scontain \"%s\"", (xflg)? "do not ": "", ! pattern); if (search_subj) print_more(" in subject line"); else if (search_from) *************** *** 198,204 **** print_more(" from the To: field"); else if (search_hdr[0]) print_more(" from the message header \"%s:\"", search_hdr); ! } else { extern char *month_names[]; /* from dates.c */ print_more(" dated "); if (before || after) --- 217,223 ---- print_more(" from the To: field"); else if (search_hdr[0]) print_more(" from the message header \"%s:\"", search_hdr); ! } else if (mdy[1]) { extern char *month_names[]; /* from dates.c */ print_more(" dated "); if (before || after) *************** *** 300,306 **** return -1; } #endif /* REGCMP */ ! } else if (err == (char *)-1 && mdy[1] <= 0) { print("No previous regular expression\n"); clear_msg_list(ret_list); /* doesn't matter really */ return -1; --- 319,325 ---- return -1; } #endif /* REGCMP */ ! } else if (err == (char *)-1 && mdy[1] <= 0 && match_priority == 0) { print("No previous regular expression\n"); clear_msg_list(ret_list); /* doesn't matter really */ return -1; *************** *** 308,313 **** --- 327,337 ---- /* start searching: set bytes, and message number: n */ for (n = 0; cnt && n < msg_cnt; n++) if (msg_bit(check_list, n)) { + if (match_priority > 0) { + if (msg[n].m_flags & match_priority) + ++matches, set_msg_bit(ret_list, n); + continue; + } if (mdy[1] > 0) { int msg_mdy[3]; if (ison(glob_flags, DATE_RECV)) *** /tmp/,RCSt1009445 Sun Nov 4 20:01:28 1990 --- print.c Sun Oct 21 19:25:01 1990 *************** *** 119,126 **** /* * wprint prints stuff to a scrollable textsw. This is intended for * print statements that need to be recalled since print() overwrites ! * its last message. Messages are printed to whatever wprint_sw ! * currently points to. If you set it to null, nothing prints. * For non-suntool mode, wprint() is just like printf(). For curses mode, * wprint() does -not- act like print() -- lines length is not counted * and newlines are not stripped. --- 119,125 ---- /* * wprint prints stuff to a scrollable textsw. This is intended for * print statements that need to be recalled since print() overwrites ! * its last message. * For non-suntool mode, wprint() is just like printf(). For curses mode, * wprint() does -not- act like print() -- lines length is not counted * and newlines are not stripped. *************** *** 149,160 **** (void) fflush(stdout); return; } - if (!compose_frame || !window_get(compose_frame, WIN_SHOW) || !cprint_sw) - wprint_sw = mfprint_sw; - else - wprint_sw = cprint_sw; ! if (!wprint_sw) return; va_start(args); fmt = va_arg(args, char *); --- 148,155 ---- (void) fflush(stdout); return; } ! if (!mfprint_sw) return; va_start(args); fmt = va_arg(args, char *); *************** *** 168,174 **** _doprnt(fmt, args, &foo); /* format like printf into msgbuf via foo */ *foo._ptr = '\0'; /* plant terminating null character */ #endif /* VPRINTF */ ! textsw_insert(wprint_sw, msgbuf, strlen(msgbuf)); } va_end(args); } --- 163,169 ---- _doprnt(fmt, args, &foo); /* format like printf into msgbuf via foo */ *foo._ptr = '\0'; /* plant terminating null character */ #endif /* VPRINTF */ ! textsw_insert(mfprint_sw, msgbuf, strlen(msgbuf)); } va_end(args); } *** /tmp/,RCSt1009454 Sun Nov 4 20:01:34 1990 --- setopts.c Thu Oct 25 16:17:44 1990 *************** *** 493,500 **** else if (argv[argc][0] == '*') { alternates[argc] = savestr(argv[argc]); } else { ! p = buf + Strcpy(buf, argv[argc]); ! *p++ = '!', p += Strcpy(p, login); alternates[argc] = savestr(reverse(buf)); } } --- 493,504 ---- else if (argv[argc][0] == '*') { alternates[argc] = savestr(argv[argc]); } else { ! if (index(argv[argc], '@')) ! bang_form(buf, argv[argc]); ! else { ! p = buf + Strcpy(buf, argv[argc]); ! *p++ = '!', p += Strcpy(p, login); ! } alternates[argc] = savestr(reverse(buf)); } } *** /tmp/,RCSt1009451 Sun Nov 4 20:01:32 1990 --- signals.c Sun Oct 21 19:25:03 1990 *************** *** 59,65 **** --- 59,67 ---- if (sig == SIGHUP && window_get(tool, WIN_SHOW)) return; #endif /* SUNTOOL && !SUN_4_0 */ + #ifdef SUNTOOL istool = 1; + #endif /* SUNTOOL */ } (void) setjmp(jmpbuf); if (ison(glob_flags, IS_GETTING)) *************** *** 184,190 **** } if (c != 'n' && *tempfile) { if (sig == SIGHUP && do_set(set_options, "hangup") && ! copyback(NULL) && isoff(glob_flags, CORRUPTED)) (void) unlink(tempfile); else if (unlink(tempfile) && !sig && errno != ENOENT) error(tempfile); --- 186,192 ---- } if (c != 'n' && *tempfile) { if (sig == SIGHUP && do_set(set_options, "hangup") && ! copyback(NULL, TRUE) && isoff(glob_flags, CORRUPTED)) (void) unlink(tempfile); else if (unlink(tempfile) && !sig && errno != ENOENT) error(tempfile); *************** *** 253,270 **** } /* Prevent both bogus "new mail" messages and missed new mail */ last_size = msg[msg_cnt].m_offset; ! if (!strcmp(mailfile, spoolfile)) spool_size = last_size; if (last_spool_size != spool_size) { if (update_size) last_spool_size = spool_size; - if (msg_cnt < last_msg_cnt) - turnoff(glob_flags, NEW_MAIL); - else { - turnon(glob_flags, NEW_MAIL); - if (current_msg < 0) - current_msg = 0; - } return 1; } return 0; --- 255,271 ---- } /* Prevent both bogus "new mail" messages and missed new mail */ last_size = msg[msg_cnt].m_offset; ! if (!strcmp(mailfile, spoolfile)) { spool_size = last_size; + if (last_spool_size != spool_size) + turnon(glob_flags, NEW_MAIL); + } else if (last_spool_size < spool_size) + turnon(glob_flags, NEW_MAIL); + if (msg_cnt && current_msg < 0) + current_msg = 0; if (last_spool_size != spool_size) { if (update_size) last_spool_size = spool_size; return 1; } return 0; *************** *** 359,365 **** { int ret_value; - /* if fullscreen access in progress (help), don't do anything */ if (ret_value = mail_size()) { #ifdef SUNTOOL /* if our status has changed from icon to open window, then --- 360,365 ---- *** /tmp/,RCSt1009464 Sun Nov 4 20:01:39 1990 --- sort.c Sun Oct 21 19:25:03 1990 *************** *** 39,46 **** case 'R': /* sort by subject including Re: */ case 'l': /* sort by length in bytes */ case 'S': /* sort by message status */ /* skip consecutive repeats of the same flag */ ! if (subsort[depth-1] != argv[0][n]) subsort[depth++] = argv[0][n]; when 'i': ignore_case = TRUE; otherwise: return help(0, "sort", cmd_help); --- 39,47 ---- case 'R': /* sort by subject including Re: */ case 'l': /* sort by length in bytes */ case 'S': /* sort by message status */ + case 'p': /* sort by message priority */ /* skip consecutive repeats of the same flag */ ! if (depth < 1 || subsort[depth-1] != argv[0][n]) subsort[depth++] = argv[0][n]; when 'i': ignore_case = TRUE; otherwise: return help(0, "sort", cmd_help); *************** *** 60,72 **** on_intr(); if (list && ison(glob_flags, IS_PIPE)) { for (n = 0; n < msg_cnt; n++) if (msg_bit(list, n)) { if (offset < 0) offset = n; range++; } else if (offset >= 0) ! break; } else offset = 0, range = msg_cnt; --- 61,80 ---- on_intr(); if (list && ison(glob_flags, IS_PIPE)) { + int consec = 1; for (n = 0; n < msg_cnt; n++) if (msg_bit(list, n)) { + if (!consec) { + ok_box("Listed messages not consecutive\n"); + turnoff(glob_flags, IGN_SIGS); + off_intr(); + return -1; + } if (offset < 0) offset = n; range++; } else if (offset >= 0) ! consec = 0; } else offset = 0, range = msg_cnt; *************** *** 151,157 **** if (isoff(msg1->m_flags,FORWARD) && ison(msg2->m_flags,FORWARD)) return order; ! return order; } author_cmp(msg1, msg2) --- 159,165 ---- if (isoff(msg1->m_flags,FORWARD) && ison(msg2->m_flags,FORWARD)) return order; ! return pri_cmp(msg1, msg2); } author_cmp(msg1, msg2) *************** *** 244,250 **** date_cmp(msg1, msg2) register struct msg *msg1, *msg2; { - int retval; long tm1, tm2; if (ison(glob_flags, DATE_RECV)) { --- 252,257 ---- *************** *** 257,262 **** --- 264,284 ---- return tm1 < tm2 ? -order : (tm1 > tm2) ? order : msg_cmp(msg1, msg2); } + pri_cmp(msg1, msg2) + register struct msg *msg1, *msg2; + { + int i; + u_long pr1 = 0, pr2 = 0; + + for (i = 0; pr1 == pr2 && i <= MAX_PRIORITY; i++) { + if (ison(msg1->m_flags, M_PRIORITY(i))) + turnon(pr1, ULBIT(i)); + if (ison(msg2->m_flags, M_PRIORITY(i))) + turnon(pr2, ULBIT(i)); + } + return pr1 > pr2 ? -order : (pr1 < pr2) ? order : msg_cmp(msg1, msg2); + } + static msg_cmp(msg1, msg2) register struct msg *msg1, *msg2; *************** *** 283,288 **** --- 305,311 ---- when 's': retval = subject_cmp(msg1, msg2); when 'R': retval = subj_with_re(msg1, msg2); when 'l': retval = size_cmp(msg1, msg2); /* length compare */ + when 'p': retval = pri_cmp(msg1, msg2); otherwise: retval = status_cmp(msg1, msg2); } depth = sv_depth; *** /tmp/,RCSt1009597 Sun Nov 4 20:02:55 1990 --- tool_help Sun Oct 21 19:25:04 1990 *************** *** 401,403 **** --- 401,420 ---- use the RIGHT mouse button on the Include item and select Forward Message from the menu. %% + + %mark% + Marks can be used to tag messages for later reference. They are + temporary and will not be saved when the folder is updated. A + priority setting beteween A and E may also be set on message(s). + Priorities are saved across updated folders. Sorting by marks + and priorities is also available (marks having highest priority, + followed by A, B, etc.). + + Marks are set on the current message only while priorities are set + (or unset) on the message list specified in the Range: text field. + + Messages may have both a temporary mark and a priority, but may not + have more than one priority. The presence of a mark or a priority + setting is shown by a `+' character immediately following the message + number in the "headers" command display. + %%