$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 */