930 lines
23 KiB
Text
930 lines
23 KiB
Text
$NetBSD: patch-af,v 1.6 2014/10/08 22:52:04 christos Exp $
|
|
|
|
*** old/commands.c Fri Sep 4 11:22:06 1998
|
|
--- commands.c Fri Sep 4 11:21:28 1998
|
|
***************
|
|
*** 493,499 ****
|
|
--- 493,503 ----
|
|
char **argv, *list;
|
|
{
|
|
register char *cmd = *argv;
|
|
+ #ifndef MSGS_DYNAMIC
|
|
char list1[MAXMSGS_BITS];
|
|
+ #else
|
|
+ char *list1 = (char *) alloca(MSGS_BITS(msg_cnt));
|
|
+ #endif
|
|
int cur_msg = current_msg, save_cnt = msg_cnt;
|
|
|
|
if (*++argv && !strcmp(*argv, "-?"))
|
|
***************
|
|
*** 502,508 ****
|
|
return -1;
|
|
|
|
/* make into our own list so ~: commands don't overwrite this list */
|
|
! bitput(list, list1, MAXMSGS, =);
|
|
|
|
/* back up one arg to replace "cmd" in the new argv[0] */
|
|
argv += (n-1);
|
|
--- 506,512 ----
|
|
return -1;
|
|
|
|
/* make into our own list so ~: commands don't overwrite this list */
|
|
! bitput(list, list1, msg_cnt, =);
|
|
|
|
/* back up one arg to replace "cmd" in the new argv[0] */
|
|
argv += (n-1);
|
|
***************
|
|
*** 533,539 ****
|
|
if (istool)
|
|
(void) do_hdrs(0, DUBL_NULL, NULL);
|
|
/* copy the specified list back into msg_list */
|
|
! bitput(list1, list, MAXMSGS, =);
|
|
return 0;
|
|
}
|
|
|
|
--- 537,543 ----
|
|
if (istool)
|
|
(void) do_hdrs(0, DUBL_NULL, NULL);
|
|
/* copy the specified list back into msg_list */
|
|
! bitput(list1, list, msg_cnt, =);
|
|
return 0;
|
|
}
|
|
|
|
*** old/doproc.c Fri Sep 4 11:22:05 1998
|
|
--- doproc.c Fri Sep 4 11:21:28 1998
|
|
***************
|
|
*** 859,865 ****
|
|
int value;
|
|
Event *event;
|
|
{
|
|
! char *argv[3], list[MAXMSGS_BITS];
|
|
char *p = (char *)panel_get_value(msg_num_item);
|
|
int n = 0;
|
|
|
|
--- 859,869 ----
|
|
int value;
|
|
Event *event;
|
|
{
|
|
! #ifndef MSGS_DYNAMIC
|
|
! char list[MAXMSGS_BITS];
|
|
! #else
|
|
! char *list = (char *) alloca(MSGS_BITS(msg_cnt));
|
|
! #endif
|
|
char *p = (char *)panel_get_value(msg_num_item);
|
|
int n = 0;
|
|
|
|
*** old/expr.c Thu May 3 15:40:10 1990
|
|
--- expr.c Fri Sep 4 11:21:28 1998
|
|
***************
|
|
*** 17,23 ****
|
|
--- 17,27 ----
|
|
{
|
|
register int num1 = -1, num2 = -1, except = 0;
|
|
register char *p2;
|
|
+ #ifndef MSGS_DYNAMIC
|
|
char list2[MAXMSGS_BITS];
|
|
+ #else
|
|
+ char *list2 = (char *) alloca(MSGS_BITS(msg_cnt));
|
|
+ #endif
|
|
|
|
if (!p)
|
|
return "";
|
|
*** old/folders.c Fri Sep 4 11:22:09 1998
|
|
--- folders.c Fri Sep 4 11:21:28 1998
|
|
***************
|
|
*** 138,145 ****
|
|
--- 138,153 ----
|
|
xfree(msg[msg_cnt].m_subject);
|
|
xfree(msg[msg_cnt].m_to);
|
|
xfree(msg[msg_cnt].m_from);
|
|
+ xfree(msg[msg_cnt].m_name);
|
|
+ xfree(msg[msg_cnt].m_addr);
|
|
msg[msg_cnt].m_subject = NULL;
|
|
msg[msg_cnt].m_to = msg[msg_cnt].m_from = NULL;
|
|
+ msg[msg_cnt].m_name = msg[msg_cnt].m_addr = NULL;
|
|
+ msg[msg_cnt].m_author = 0;
|
|
+ msg[msg_cnt].m_flags = 0;
|
|
+ msg[msg_cnt].m_size = 0;
|
|
+ msg[msg_cnt].m_offset = 0;
|
|
+ msg[msg_cnt].m_lines = 0;
|
|
}
|
|
msg_cnt = 0, msg[0].m_offset = 0L;
|
|
turnoff(glob_flags, CONT_PRNT);
|
|
***************
|
|
*** 268,274 ****
|
|
register char **argv;
|
|
{
|
|
register char *p;
|
|
! char buf[128], unused[MAXMSGS_BITS];
|
|
|
|
if (argv && argv[1] && !strcmp(argv[1], "-?"))
|
|
return help(0, "folders", cmd_help);
|
|
--- 276,287 ----
|
|
register char **argv;
|
|
{
|
|
register char *p;
|
|
! char buf[128];
|
|
! #ifndef MSGS_DYNAMIC
|
|
! char *unused[MAXMSGS_BITS];
|
|
! #else
|
|
! char *unused = (char *) alloca(MSGS_BITS(msg_cnt));
|
|
! #endif
|
|
|
|
if (argv && argv[1] && !strcmp(argv[1], "-?"))
|
|
return help(0, "folders", cmd_help);
|
|
***************
|
|
*** 418,424 ****
|
|
char *argv[], list[];
|
|
{
|
|
int r, articles = 0, merge = 0, appending = 0;
|
|
! char buf[MAXPATHLEN], cmdbuf[MAXPATHLEN], newlist[MAXMSGS_BITS], *dir;
|
|
char *art_sep = ARTICLE_SEP;
|
|
FILE *fp;
|
|
|
|
--- 431,442 ----
|
|
char *argv[], list[];
|
|
{
|
|
int r, articles = 0, merge = 0, appending = 0;
|
|
! char buf[MAXPATHLEN], cmdbuf[MAXPATHLEN], *dir;
|
|
! #ifndef MSGS_DYNAMIC
|
|
! char newlist[MAXMSGS_BITS];
|
|
! #else
|
|
! char *newlist = (char *) alloca(MSGS_BITS(msg_cnt));
|
|
! #endif
|
|
char *art_sep = ARTICLE_SEP;
|
|
FILE *fp;
|
|
|
|
*** old/loop.c Fri Sep 4 11:22:07 1998
|
|
--- loop.c Fri Sep 4 11:21:28 1998
|
|
***************
|
|
*** 251,257 ****
|
|
--- 251,261 ----
|
|
|
|
/* Return values from commands, see check_internal() */
|
|
static int last_status; /* Changes after every command */
|
|
+ #ifndef MSGS_DYNAMIC
|
|
static char last_output[MAXMSGS]; /* Changes after SUCCESSFUL command */
|
|
+ #else
|
|
+ char* last_output; /* Changes after SUCCESSFUL command */
|
|
+ #endif
|
|
|
|
/*
|
|
* do the command specified by the argument vector, argv.
|
|
***************
|
|
*** 1196,1203 ****
|
|
--- 1200,1211 ----
|
|
struct history *hist;
|
|
#ifndef REGCMP
|
|
# ifdef REGCOMP
|
|
+ # ifdef REG_EXTENDED
|
|
+ regex_t rex;
|
|
+ # else
|
|
char *rex = NULL;
|
|
extern char *regcomp();
|
|
+ # endif
|
|
# else
|
|
extern char *re_comp();
|
|
# endif
|
|
***************
|
|
*** 1222,1228 ****
|
|
--- 1230,1240 ----
|
|
if (*str) {
|
|
#ifndef REGCMP
|
|
# ifdef REGCOMP
|
|
+ # ifdef REG_EXTENDED
|
|
+ if (regcomp(&rex, str, REG_EXTENDED) != 0) /* Assign and test */
|
|
+ # else
|
|
if (!(rex = regcomp(str))) /* Assign and test */
|
|
+ # endif
|
|
# else
|
|
if (re_comp(str))
|
|
# endif
|
|
***************
|
|
*** 1256,1262 ****
|
|
--- 1268,1278 ----
|
|
found =
|
|
#ifndef REGCMP
|
|
# ifdef REGCOMP
|
|
+ # ifdef REG_EXTENDED
|
|
+ regexec(&rex, buf, 0, NULL, 0) == 0
|
|
+ # else
|
|
!!regexec(rex, buf)
|
|
+ # endif
|
|
# else
|
|
re_exec(buf)
|
|
# endif
|
|
***************
|
|
*** 1273,1279 ****
|
|
--- 1289,1299 ----
|
|
free(rex);
|
|
#else
|
|
# ifdef REGCOMP
|
|
+ # ifdef REG_EXTENDED
|
|
+ regfree(&rex);
|
|
+ # else
|
|
free(rex);
|
|
+ # endif
|
|
# endif
|
|
#endif
|
|
return (*p == '?' ? p + 1 : p);
|
|
***************
|
|
*** 1286,1292 ****
|
|
--- 1306,1316 ----
|
|
#else
|
|
# ifdef REGCOMP
|
|
/* XXX: regfree */
|
|
+ # ifdef REG_EXTENDED
|
|
+ regfree(&rex);
|
|
+ # else
|
|
free(rex);
|
|
+ # endif
|
|
# endif
|
|
#endif
|
|
return NULL;
|
|
--- old/mail.c 2014-10-08 18:47:38.000000000 -0400
|
|
+++ mail.c 2014-10-08 18:48:42.000000000 -0400
|
|
@@ -34,7 +34,12 @@
|
|
char firstchar = (argv)? **argv: 'm';
|
|
char *to = NULL, *cc = NULL, *addcc = NULL, *bcc = NULL, *subj = NULL;
|
|
char *route = NULL;
|
|
- char inc_list[MAXMSGS_BITS], buf[HDRSIZ];
|
|
+ char buf[HDRSIZ];
|
|
+#ifndef MSGS_DYNAMIC
|
|
+ char inc_list[MAXMSGS_BITS];
|
|
+#else
|
|
+ char *inc_list = (char *) alloca(MSGS_BITS(msg_cnt));
|
|
+#endif
|
|
u_long flgs = 0;
|
|
|
|
if (ison(glob_flags, IS_GETTING)) {
|
|
@@ -350,7 +355,11 @@
|
|
|
|
/* If forwarding w/o editing, start a new file for each. */
|
|
if (ison(flags, FORWARD) && ison(flags, SEND_NOW)) {
|
|
+#ifndef MSGS_DYNAMIC
|
|
char fwd[MAXMSGS_BITS];
|
|
+#else
|
|
+ char *fwd = (char *) alloca(MSGS_BITS(msg_cnt));
|
|
+#endif
|
|
register int i;
|
|
clear_msg_list(fwd);
|
|
for (i = 0; i < msg_cnt; i++)
|
|
@@ -694,7 +703,11 @@
|
|
putstring(p2, ed_fp);
|
|
}
|
|
when ':': {
|
|
+#ifndef MSGS_DYNAMIC
|
|
char new[MAXMSGS_BITS];
|
|
+#else
|
|
+ char *new = (char *) alloca(MSGS_BITS(msg_cnt));
|
|
+#endif
|
|
u_long save_flags = glob_flags;
|
|
|
|
turnon(glob_flags, IGN_SIGS);
|
|
@@ -706,7 +719,11 @@
|
|
when 'i': case 'f': case 'I': case 'm': {
|
|
int n;
|
|
u_long copy_flgs = 0;
|
|
+#ifndef MSGS_DYNAMIC
|
|
char list[MAXMSGS_BITS];
|
|
+#else
|
|
+ char *list = (char *) alloca(MSGS_BITS(msg_cnt));
|
|
+#endif
|
|
|
|
if (!msg_cnt) {
|
|
wprint("No messages.\n");
|
|
@@ -962,6 +979,7 @@
|
|
register char *p;
|
|
int c;
|
|
char buf[MAXPATHLEN];
|
|
+ static char gpat[] = "{,{,*[ \\,]}mail{,[ \\,]*}}";
|
|
|
|
/* forwarded mail has no additional personalized text */
|
|
if (ison(flags, FORWARD)) {
|
|
@@ -985,8 +1003,7 @@
|
|
p = NULL;
|
|
if (!strncmp(Cc, "~v", 2) ||
|
|
/* Flashy test for $verify either empty or set to "mail" */
|
|
- glob(p = do_set(set_options, "verify"),
|
|
- "{,{,*[ \\,]}mail{,[ \\,]*}}")) {
|
|
+ glob(p = do_set(set_options, "verify"), gpat)) {
|
|
if (!p) /* so we don't Cc to ~v! */
|
|
*Cc = 0;
|
|
for (;;) {
|
|
@@ -1679,6 +1696,7 @@
|
|
else if (!lcase_strncmp(p, "subject:", 8))
|
|
(print_hdr = FALSE), strdup(subj, p);
|
|
else if (!lcase_strncmp(p, "from:", 5)) {
|
|
+#if 0
|
|
char not_me[BUFSIZ];
|
|
(void) strcpy(not_me, buf + 5);
|
|
take_me_off(not_me);
|
|
@@ -1692,6 +1710,7 @@
|
|
(void) no_newln(buf);
|
|
}
|
|
}
|
|
+#endif
|
|
got_from = TRUE;
|
|
#ifdef PICKY_MAILER
|
|
/* don't send From: to mta -- fool "for loop" below
|
|
*** old/main.c Fri Sep 4 11:22:09 1998
|
|
--- main.c Fri Sep 4 11:21:28 1998
|
|
***************
|
|
*** 30,36 ****
|
|
char buf[MAXPATHLEN];
|
|
register char *p;
|
|
struct mush_flags Flags;
|
|
!
|
|
#ifndef INTERNAL_MALLOC
|
|
extern char *stackbottom; /* used by xfree() */
|
|
|
|
--- 30,36 ----
|
|
char buf[MAXPATHLEN];
|
|
register char *p;
|
|
struct mush_flags Flags;
|
|
! static char gpat[] = "{,{,*[ \\,]}startup{,[ \\,]*}}";
|
|
#ifndef INTERNAL_MALLOC
|
|
extern char *stackbottom; /* used by xfree() */
|
|
|
|
***************
|
|
*** 59,64 ****
|
|
--- 59,80 ----
|
|
malloc_debug(0);
|
|
#endif /* sun && debug */
|
|
|
|
+ #ifdef MSGS_DYNAMIC
|
|
+ {
|
|
+ extern char *last_output;
|
|
+ msg_max = MSGS_INCR;
|
|
+ msg = (struct msg *) malloc(sizeof(struct msg) * msg_max);
|
|
+ bzero(msg, sizeof(struct msg) * msg_max);
|
|
+ msg_list = (char *) malloc(MSGS_BITS(msg_max));
|
|
+ last_output = (char *) malloc(sizeof(char) * msg_max);
|
|
+ if (msg == (struct msg *) 0 || msg_list == NULL ||
|
|
+ last_output == NULL) {
|
|
+ (void) fprintf(stderr, "%s: Out of memory.\n", prog_name);
|
|
+ exit(1);
|
|
+ }
|
|
+ }
|
|
+ #endif
|
|
+
|
|
if (!isatty(0))
|
|
turnon(glob_flags, REDIRECT);
|
|
else
|
|
***************
|
|
*** 255,261 ****
|
|
(void) signal(SIGHUP, catch);
|
|
|
|
if (!hdrs_only && !istool && (!Flags.src_file || !Flags.src_n_exit) &&
|
|
! !glob(do_set(set_options, "quiet"), "{,{,*[ \\,]}startup{,[ \\,]*}}"))
|
|
(void) printf("%s: Type '?' for help.\n", check_internal("version"));
|
|
|
|
(void) sprintf(buf, "folder %s %s", Flags.f_flags, mailfile);
|
|
--- 271,277 ----
|
|
(void) signal(SIGHUP, catch);
|
|
|
|
if (!hdrs_only && !istool && (!Flags.src_file || !Flags.src_n_exit) &&
|
|
! !glob(do_set(set_options, "quiet"), gpat))
|
|
(void) printf("%s: Type '?' for help.\n", check_internal("version"));
|
|
|
|
(void) sprintf(buf, "folder %s %s", Flags.f_flags, mailfile);
|
|
*** old/misc.c Fri Sep 4 11:22:08 1998
|
|
--- misc.c Fri Sep 4 11:21:28 1998
|
|
***************
|
|
*** 201,207 ****
|
|
--- 201,211 ----
|
|
int argc, ret_val = -1;
|
|
u_long save_do_pipe = ison(glob_flags, DO_PIPE);
|
|
u_long save_is_pipe = ison(glob_flags, IS_PIPE);
|
|
+ #ifndef MSGS_DYNAMIC
|
|
char dummy_list[MAXMSGS_BITS];
|
|
+ #else
|
|
+ char *dummy_list = (char *) alloca(MSGS_BITS(msg_cnt));
|
|
+ #endif
|
|
|
|
turnoff(glob_flags, DO_PIPE);
|
|
turnoff(glob_flags, IS_PIPE);
|
|
*** old/msgs.c Fri Sep 4 11:22:08 1998
|
|
--- msgs.c Fri Sep 4 11:21:28 1998
|
|
***************
|
|
*** 843,848 ****
|
|
--- 843,849 ----
|
|
}
|
|
#endif /* MMDF */
|
|
buf[0] = 0;
|
|
+ date[0] = 0;
|
|
while (fgets(buf, sizeof (buf), fp)) {
|
|
#ifndef MSG_SEPARATOR
|
|
turnoff(glob_flags, WARNING);
|
|
***************
|
|
*** 875,880 ****
|
|
--- 876,882 ----
|
|
{
|
|
msg_found++;
|
|
had_error = 0;
|
|
+ #ifndef MSGS_DYNAMIC
|
|
if (append && cnt == MAXMSGS-append) {
|
|
wprint("WARNING: exceeded %d messages.\n", MAXMSGS-append);
|
|
wprint("Not all messages have been loaded.\n");
|
|
***************
|
|
*** 882,887 ****
|
|
--- 884,931 ----
|
|
had_error++;
|
|
break;
|
|
}
|
|
+ #else
|
|
+ if (append && cnt == msg_max-append) {
|
|
+ /*
|
|
+ * XXX: should really ignore signals here but instead
|
|
+ * are careful with the order we do things
|
|
+ * so if we get interrupted, we only lose memory
|
|
+ */
|
|
+ int nmsg_max = msg_max + MSGS_INCR;
|
|
+ struct msg* m;
|
|
+ char* b, *l;
|
|
+ extern char* last_output;
|
|
+
|
|
+ m = (struct msg *) realloc(msg, sizeof(struct msg) *
|
|
+ nmsg_max);
|
|
+ if (m == (struct msg *) 0) {
|
|
+ bad:
|
|
+ wprint("Out of memory for %d messages.\n", nmsg_max);
|
|
+ wprint("Not all messages have been loaded.\n");
|
|
+ msg_cnt--;
|
|
+ had_error++;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ b = (char *) realloc(msg_list, MSGS_BITS(nmsg_max));
|
|
+ if (b == NULL)
|
|
+ goto bad;
|
|
+
|
|
+ l = (char *) realloc(last_output, sizeof(char) * nmsg_max);
|
|
+ if (l == NULL)
|
|
+ goto bad;
|
|
+
|
|
+
|
|
+ msg = m;
|
|
+ msg_list = b;
|
|
+ last_output = l;
|
|
+
|
|
+ bzero(&msg[msg_max], sizeof(struct msg) * MSGS_INCR);
|
|
+
|
|
+ msg_max = nmsg_max;
|
|
+
|
|
+ }
|
|
+ #endif /* MSGS_DYNAMIC */
|
|
if (ison(glob_flags, READ_ONLY))
|
|
bytes = ftell(fp) - strlen(buf);
|
|
else {
|
|
***************
|
|
*** 1058,1064 ****
|
|
}
|
|
close_lock(file, fp);
|
|
if (isoff(glob_flags, READ_ONLY)) {
|
|
! if (had_error && msg_found && append == 1 && cnt == MAXMSGS-append) {
|
|
wprint("Using read-only mode.\n");
|
|
turnon(glob_flags, READ_ONLY);
|
|
had_error = 0; /* return successfully anyway */
|
|
--- 1102,1113 ----
|
|
}
|
|
close_lock(file, fp);
|
|
if (isoff(glob_flags, READ_ONLY)) {
|
|
! #ifndef MSGS_DYNAMIC
|
|
! if (had_error && msg_found && append == 1 && cnt == MAXMSGS-append)
|
|
! #else
|
|
! if (had_error && msg_found && append == 1 && cnt == msg_max-append)
|
|
! #endif
|
|
! {
|
|
wprint("Using read-only mode.\n");
|
|
turnon(glob_flags, READ_ONLY);
|
|
had_error = 0; /* return successfully anyway */
|
|
|
|
--- version.h.orig Mon Jan 3 15:49:04 2000
|
|
+++ version.h Mon Jan 3 15:50:42 2000
|
|
@@ -1,7 +1,11 @@
|
|
/* @(#)version.h (c) Copyright 1989, 1990, 1991 (Dan Heller) */
|
|
|
|
#define MUSHNAME "Mail User's Shell"
|
|
-#define RELEASE_DATE "beta(4) 03/19/98"
|
|
+#ifdef MSGS_DYNAMIC
|
|
+#define RELEASE_DATE "beta(4.pl1)+dynamic 20000103"
|
|
+#else
|
|
+#define RELEASE_DATE "beta(4.pl1) 20000103"
|
|
+#endif
|
|
#define RELEASE 7
|
|
#define REVISION "2"
|
|
#define PATCHLEVEL 6
|
|
*** old/pick.c Fri Sep 4 12:07:59 1998
|
|
--- pick.c Fri Sep 4 13:12:17 1998
|
|
***************
|
|
*** 11,19 ****
|
|
static int pick();
|
|
static void month_day_year();
|
|
|
|
! #ifdef REGCOMP
|
|
regerror(msg)
|
|
! char *msg;
|
|
{
|
|
printf("regcomp error: %s\n", msg);
|
|
}
|
|
--- 11,20 ----
|
|
static int pick();
|
|
static void month_day_year();
|
|
|
|
! #if defined(REGCOMP) && !defined(REG_EXTENDED)
|
|
! void
|
|
regerror(msg)
|
|
! const char *msg;
|
|
{
|
|
printf("regcomp error: %s\n", msg);
|
|
}
|
|
***************
|
|
*** 23,29 ****
|
|
--- 24,34 ----
|
|
register int n;
|
|
register char **argv, list[];
|
|
{
|
|
+ #ifndef MSGS_DYNAMIC
|
|
char ret_list[MAXMSGS_BITS];
|
|
+ #else
|
|
+ char *ret_list = (char *) alloca(MSGS_BITS(msg_cnt));
|
|
+ #endif
|
|
|
|
if (n > 1 && !strcmp(argv[1], "-?"))
|
|
return help(0, "pick", cmd_help);
|
|
***************
|
|
*** 72,78 ****
|
|
register char c;
|
|
int matches = 0;
|
|
char pattern[256];
|
|
! short head_first, head_cnt, tail_cnt, search = TRUE;
|
|
int n;
|
|
|
|
if (!msg_cnt) {
|
|
--- 77,83 ----
|
|
register char c;
|
|
int matches = 0;
|
|
char pattern[256];
|
|
! short head_first, head_cnt, tail_cnt, search = TRUE, dups = FALSE;
|
|
int n;
|
|
|
|
if (!msg_cnt) {
|
|
***************
|
|
*** 166,171 ****
|
|
--- 171,177 ----
|
|
turnon(match_priority, M_PRIORITY(c - 'A' + 1));
|
|
when 'x' : xflg = 1;
|
|
when 'i' : icase = 1;
|
|
+ when 'D' : dups = TRUE;
|
|
otherwise:
|
|
print("pick: unknown flag: %c\n", argv[0][1]);
|
|
clear_msg_list(ret_list);
|
|
***************
|
|
*** 175,181 ****
|
|
print("Can't specify -x and head/tail options together.\n");
|
|
return -1;
|
|
}
|
|
! if (!mdy[1]) {
|
|
(void) argv_to_string(pattern, argv);
|
|
if (pattern[0] == '\0' && match_priority == 0 &&
|
|
head_cnt + tail_cnt < 0) {
|
|
--- 181,187 ----
|
|
print("Can't specify -x and head/tail options together.\n");
|
|
return -1;
|
|
}
|
|
! if (!mdy[1] && !dups) {
|
|
(void) argv_to_string(pattern, argv);
|
|
if (pattern[0] == '\0' && match_priority == 0 &&
|
|
head_cnt + tail_cnt < 0) {
|
|
***************
|
|
*** 184,190 ****
|
|
return -1;
|
|
}
|
|
}
|
|
! search = (pattern[0] || mdy[1] || (match_priority != 0));
|
|
if (verbose) {
|
|
if (head_cnt + tail_cnt >= 0) {
|
|
print("Finding the ");
|
|
--- 190,196 ----
|
|
return -1;
|
|
}
|
|
}
|
|
! search = (pattern[0] || mdy[1] || (match_priority > 0));
|
|
if (verbose) {
|
|
if (head_cnt + tail_cnt >= 0) {
|
|
print("Finding the ");
|
|
***************
|
|
*** 209,216 ****
|
|
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))
|
|
--- 215,224 ----
|
|
print_more(" of the last %d", tail_cnt);
|
|
} else
|
|
print_more("Searching for %smessages",
|
|
! match_priority > 0 ? "priority " : "");
|
|
! if (dups) {
|
|
! print_more(" that are duplicates");
|
|
! } else if (!search) {
|
|
if (tail_cnt > 0 && head_cnt > 0)
|
|
print_more(" messages");
|
|
if (ison(glob_flags, IS_PIPE))
|
|
***************
|
|
*** 241,247 ****
|
|
}
|
|
if (mdy[1] > 0 && icase)
|
|
print("using date: -i flag ignored.\n");
|
|
! if (!search) {
|
|
for (n = 0; n < msg_cnt && (!head_first || matches < head_cnt); n++)
|
|
if (msg_bit(list, n))
|
|
++matches, set_msg_bit(ret_list, n);
|
|
--- 249,258 ----
|
|
}
|
|
if (mdy[1] > 0 && icase)
|
|
print("using date: -i flag ignored.\n");
|
|
! if (dups)
|
|
! matches = find_dups(head_first? head_cnt : msg_cnt,
|
|
! list, ret_list);
|
|
! else if (!search) {
|
|
for (n = 0; n < msg_cnt && (!head_first || matches < head_cnt); n++)
|
|
if (msg_bit(list, n))
|
|
++matches, set_msg_bit(ret_list, n);
|
|
***************
|
|
*** 284,289 ****
|
|
--- 295,424 ----
|
|
return matches;
|
|
}
|
|
|
|
+
|
|
+ static int
|
|
+ cmplines(m1, m2)
|
|
+ struct msg **m1;
|
|
+ struct msg **m2;
|
|
+ {
|
|
+ int z = (int) (*m2)->m_lines - (int) (*m1)->m_lines;
|
|
+ if (z > 0)
|
|
+ return 1;
|
|
+ else if (z < 0)
|
|
+ return -1;
|
|
+ else
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+
|
|
+ /*
|
|
+ * find_dups searches for messages with the same body as others
|
|
+ */
|
|
+ find_dups(cnt, check_list, ret_list)
|
|
+ int cnt;
|
|
+ char check_list[], ret_list[];
|
|
+ {
|
|
+ int i, j, n, lcur, mcur;
|
|
+ int matches = 0;
|
|
+ #ifndef MSGS_DYNAMIC
|
|
+ struct msg *mlist[MAXMSGS];
|
|
+ #else
|
|
+ struct msg **mlist = (struct msg **) alloca(msg_cnt *
|
|
+ sizeof(struct msg *));
|
|
+ #endif
|
|
+ char *omsg = NULL, *nmsg = NULL, *otext = NULL, *ntext = NULL;
|
|
+ size_t otsize = 0, ntsize = 0, omsize = 0, nmsize = 0, mid;
|
|
+
|
|
+ if (cnt == -1)
|
|
+ cnt = msg_cnt;
|
|
+
|
|
+ for (i = 0, n = 0; i < cnt && n < msg_cnt; n++)
|
|
+ if (msg_bit(check_list, n)) {
|
|
+ mlist[i] = &msg[n];
|
|
+ mlist[i]->m_spare = n;
|
|
+ i++;
|
|
+ }
|
|
+
|
|
+ cnt = i;
|
|
+ qsort((char *) mlist, cnt, sizeof(struct msg *), cmplines);
|
|
+
|
|
+ clear_msg_list(ret_list);
|
|
+
|
|
+ lcur = -1;
|
|
+
|
|
+ for (i = 0; i < cnt - 1; i++) {
|
|
+ lcur = mlist[i]->m_lines;
|
|
+ mcur = mlist[i]->m_spare;
|
|
+
|
|
+ if (mlist[i + 1]->m_lines != lcur)
|
|
+ /* Next message has not the same number of lines, skip */
|
|
+ continue;
|
|
+
|
|
+ (void) msg_get(mcur, NULL, 0);
|
|
+ if (otsize < mlist[i]->m_size) {
|
|
+ otsize = mlist[i]->m_size;
|
|
+ otext = otext ? (char *) malloc(otsize) :
|
|
+ (char *) realloc(otext, otsize);
|
|
+ if (otext == NULL) {
|
|
+ print("Out of memory in find_dups\n");
|
|
+ goto bad;
|
|
+ }
|
|
+ }
|
|
+ if (fread(otext, 1, mlist[i]->m_size, tmpf) != mlist[i]->m_size) {
|
|
+ print("fread old for %d failed %d\n", mcur, sys_errlist[errno]);
|
|
+ goto bad;
|
|
+ }
|
|
+ if ((omsg = (char *) strstr(otext, "\n\n")) == NULL) {
|
|
+ printf("could not find start of message %d\n", mcur);
|
|
+ continue;
|
|
+ }
|
|
+ omsize = mlist[i]->m_size - (omsg - otext);
|
|
+ for (j = i + 1; j < cnt; j++) {
|
|
+ if (mlist[j]->m_lines != lcur)
|
|
+ /* Next message has not the same number of lines, skip */
|
|
+ break;
|
|
+ mid = mlist[j]->m_spare;
|
|
+ (void) msg_get(mid, NULL, 0);
|
|
+ if (ntsize < mlist[j]->m_size) {
|
|
+ ntsize = mlist[j]->m_size;
|
|
+ ntext = ntext ? (char *) malloc(ntsize) :
|
|
+ (char *) realloc(ntext, ntsize);
|
|
+ if (ntext == NULL) {
|
|
+ print("Out of memory in find_dups\n");
|
|
+ goto bad;
|
|
+ }
|
|
+ }
|
|
+ if (fread(ntext, 1, mlist[j]->m_size, tmpf) != mlist[j]->m_size) {
|
|
+ print("fread new for %d failed %d\n", mid, sys_errlist[errno]);
|
|
+ goto bad;
|
|
+ }
|
|
+ if ((nmsg = (char *) strstr(ntext, "\n\n")) == NULL) {
|
|
+ printf("could not find start of message %d\n", mid);
|
|
+ continue;
|
|
+ }
|
|
+ nmsize = mlist[j]->m_size - (nmsg - ntext);
|
|
+ if (nmsize != omsize)
|
|
+ continue;
|
|
+ if (memcmp(nmsg, omsg, nmsize) == 0) {
|
|
+ ++matches;
|
|
+ set_msg_bit(ret_list, mid);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ if (otext)
|
|
+ free(otext);
|
|
+ if (ntext)
|
|
+ free(ntext);
|
|
+ return matches;
|
|
+ bad:
|
|
+ clear_msg_list(ret_list);
|
|
+ if (otext)
|
|
+ free(otext);
|
|
+ if (ntext)
|
|
+ free(ntext);
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
/*
|
|
* find_pattern will search thru all the messages set in the check_list
|
|
* until the list runs out or "cnt" has been exhasted. ret_list contains
|
|
***************
|
|
*** 307,313 ****
|
|
--- 442,452 ----
|
|
#endif
|
|
#else /* REGCMP */
|
|
# ifdef REGCOMP
|
|
+ # ifdef REG_EXTENDED
|
|
+ regex_t rex;
|
|
+ # else
|
|
char *regcomp(), *regexec();
|
|
+ # endif
|
|
# else
|
|
char *re_comp();
|
|
# endif
|
|
***************
|
|
*** 328,334 ****
|
|
--- 467,478 ----
|
|
}
|
|
#else /* REGCMP */
|
|
# ifdef REGCOMP
|
|
+ # ifdef REG_EXTENDED
|
|
+ if (regcomp(&rex, p, REG_EXTENDED) != 0)
|
|
+ # else
|
|
if ((err = regcomp(p)) == NULL) {
|
|
+ # endif
|
|
+ {
|
|
clear_msg_list(ret_list);
|
|
return -1;
|
|
}
|
|
***************
|
|
*** 348,354 ****
|
|
/* 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;
|
|
--- 492,498 ----
|
|
/* 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;
|
|
***************
|
|
*** 421,427 ****
|
|
--- 565,575 ----
|
|
val = !!regex(err, p, NULL); /* convert value to a boolean */
|
|
#else /* REGCMP */
|
|
# ifdef REGCOMP
|
|
+ # ifdef REG_EXTENDED
|
|
+ val = regexec(&rex, p, 0, NULL, 0) == 0;
|
|
+ # else
|
|
val = !!regexec(err, p);
|
|
+ # endif
|
|
# else
|
|
val = re_exec(p);
|
|
# endif
|
|
***************
|
|
*** 448,455 ****
|
|
--- 596,607 ----
|
|
#else
|
|
# ifdef REGCOMP
|
|
if (err)
|
|
+ # ifdef REG_EXTENDED
|
|
+ regfree(&rex);
|
|
+ # else
|
|
/* XXX: regfree soon */
|
|
free(err);
|
|
+ # endif
|
|
# endif
|
|
#endif /* REGCMP */
|
|
return matches;
|
|
***************
|
|
*** 476,482 ****
|
|
--- 628,638 ----
|
|
#endif
|
|
#else /* REGCMP */
|
|
# ifdef REGCOMP
|
|
+ # ifdef REG_EXTENDED
|
|
+ regex_t rex;
|
|
+ # else
|
|
char *regcomp(), *regexec();
|
|
+ # endif
|
|
# else
|
|
char *re_comp();
|
|
# endif
|
|
***************
|
|
*** 509,515 ****
|
|
}
|
|
#else /* REGCMP */
|
|
# ifdef REGCOMP
|
|
! if (*pattern && !(err = regcomp(pattern, NULL))) {
|
|
print("Error in regcomp in %s", pattern);
|
|
return 0;
|
|
}
|
|
--- 665,676 ----
|
|
}
|
|
#else /* REGCMP */
|
|
# ifdef REGCOMP
|
|
! # ifdef REG_EXTENDED
|
|
! if (*pattern && regcomp(&rex, pattern, REG_EXTENDED))
|
|
! # else
|
|
! if (*pattern && !(err = regcomp(pattern, NULL)))
|
|
! # endif
|
|
! {
|
|
print("Error in regcomp in %s", pattern);
|
|
return 0;
|
|
}
|
|
***************
|
|
*** 534,540 ****
|
|
--- 695,705 ----
|
|
val = !!regex(err, p, NULL); /* convert value to a boolean */
|
|
#else /* REGCMP */
|
|
# ifdef REGCOMP
|
|
+ # ifdef REG_EXTENDED
|
|
+ val = regexec(&rex, p, 0, NULL, 0) == 0;
|
|
+ # else
|
|
val = !!regexec(err, p);
|
|
+ # endif
|
|
# else
|
|
val = re_exec(p);
|
|
# endif
|
|
***************
|
|
*** 549,556 ****
|
|
--- 714,725 ----
|
|
#else
|
|
# ifdef REGCOMP
|
|
if (err)
|
|
+ # ifdef REG_EXTENDED
|
|
+ regfree(&rex);
|
|
+ # else
|
|
/* XXX: regfree soon */
|
|
free(err);
|
|
+ # endif
|
|
# endif
|
|
#endif /* REGCMP */
|
|
|