aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2024-11-30 04:48:35 +0000
committerWarner Losh <imp@FreeBSD.org>2024-11-30 04:48:35 +0000
commit45af733dbd17548ea0051a665f50143aadd3b2a6 (patch)
treeae9f6d53d1b2eabfc1ef3394182e4dc764b2d6e3
parent381c116afc1f4a775483a1b1a864488d37cc4b8a (diff)
awk: Update to 20240728 bsd-feature 3319c34a8713 (add mktime)vendor/one-true-awk/3319c34a8713
Jul 28, 2024 Fixed readcsvrec resize segfault when reading csv records longer than 8k. Thanks to Ozan Yigit. mktime() added to bsd-features branch. Thanks to Todd Miller.
-rw-r--r--FIXES5
-rw-r--r--awk.h1
-rw-r--r--b.c2
-rw-r--r--lex.c1
-rw-r--r--lib.c2
-rw-r--r--main.c2
-rw-r--r--run.c22
7 files changed, 31 insertions, 4 deletions
diff --git a/FIXES b/FIXES
index b59f32831e2c..ad8bce2645fd 100644
--- a/FIXES
+++ b/FIXES
@@ -25,6 +25,11 @@ THIS SOFTWARE.
This file lists all bug fixes, changes, etc., made since the
second edition of the AWK book was published in September 2023.
+Jul 28, 2024
+ Fixed readcsvrec resize segfault when reading csv records longer
+ than 8k. Thanks to Ozan Yigit.
+ mktime() added to bsd-features branch. Thanks to Todd Miller.
+
Jun 23, 2024
Fix signal for system-status test. Thanks to Tim van der Molen.
Rewrite if-else chain as switch. Thanks to Andrew Sukach.
diff --git a/awk.h b/awk.h
index 76c2a772b4ce..a57c1598d67e 100644
--- a/awk.h
+++ b/awk.h
@@ -162,6 +162,7 @@ extern Cell *symtabloc; /* SYMTAB */
#define FRSHIFT 20
#define FSYSTIME 21
#define FSTRFTIME 22
+#define FMKTIME 23
/* Node: parse tree is made of nodes, with Cell's at bottom */
diff --git a/b.c b/b.c
index a8f67785a6ea..455e6f812d3e 100644
--- a/b.c
+++ b/b.c
@@ -616,7 +616,7 @@ static void resize_gototab(fa *f, int state)
if (p == NULL)
overflo(__func__);
- // need to initialized the new memory to zero
+ // need to initialize the new memory to zero
size_t orig_size = f->gototab[state].allocated; // 2nd half of new mem is this size
memset(p + orig_size, 0, orig_size * sizeof(gtte)); // clean it out
diff --git a/lex.c b/lex.c
index 7c61bba46d13..c135db4dfb67 100644
--- a/lex.c
+++ b/lex.c
@@ -74,6 +74,7 @@ const Keyword keywords[] = { /* keep sorted: binary searched */
{ "log", FLOG, BLTIN },
{ "lshift", FLSHIFT, BLTIN },
{ "match", MATCHFCN, MATCHFCN },
+ { "mktime", FMKTIME, BLTIN },
{ "next", NEXT, NEXT },
{ "nextfile", NEXTFILE, NEXTFILE },
{ "or", FFOR, BLTIN },
diff --git a/lib.c b/lib.c
index 81582d357473..a2731d63d12b 100644
--- a/lib.c
+++ b/lib.c
@@ -231,7 +231,7 @@ int readrec(char **pbuf, int *pbufsize, FILE *inf, bool newflag) /* read one rec
char *rs = getsval(rsloc);
if (CSV) {
- c = readcsvrec(pbuf, pbufsize, inf, newflag);
+ c = readcsvrec(&buf, &bufsize, inf, newflag);
isrec = (c == EOF && rr == buf) ? false : true;
} else if (*rs && rs[1]) {
bool found;
diff --git a/main.c b/main.c
index 02d02991bce7..7d3ef84a580f 100644
--- a/main.c
+++ b/main.c
@@ -22,7 +22,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
****************************************************************/
-const char *version = "version 20240623";
+const char *version = "version 20240728";
#define DEBUG
#include <stdio.h>
diff --git a/run.c b/run.c
index 3f9f3d8626fc..286a601f3311 100644
--- a/run.c
+++ b/run.c
@@ -2069,7 +2069,7 @@ Cell *bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg lis
FILE *fp;
int status = 0;
time_t tv;
- struct tm *tm;
+ struct tm *tm, tmbuf;
int estatus = 0;
t = ptoi(a[0]);
@@ -2223,6 +2223,26 @@ Cell *bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg lis
else
u = fflush(fp);
break;
+ case FMKTIME:
+ memset(&tmbuf, 0, sizeof(tmbuf));
+ tm = &tmbuf;
+ t = sscanf(getsval(x), "%d %d %d %d %d %d %d",
+ &tm->tm_year, &tm->tm_mon, &tm->tm_mday, &tm->tm_hour,
+ &tm->tm_min, &tm->tm_sec, &tm->tm_isdst);
+ switch (t) {
+ case 6:
+ tm->tm_isdst = -1; /* let mktime figure it out */
+ /* FALLTHROUGH */
+ case 7:
+ tm->tm_year -= 1900;
+ tm->tm_mon--;
+ u = mktime(tm);
+ break;
+ default:
+ u = -1;
+ break;
+ }
+ break;
case FSYSTIME:
u = time((time_t *) 0);
break;