From 46a0be5304fb44e07e5066540f8e4061a3ecc438 Mon Sep 17 00:00:00 2001 From: Leonid Lisovskiy Date: Mon, 21 Sep 2009 04:08:08 +0200 Subject: [PATCH] awk: implement mktime function old new delta exec_builtin - 1466 +1466 do_mktime - 116 +116 tokenlist 441 448 +7 tokeninfo 396 400 +4 evaluate 5395 3755 -1640 ------------------------------------------------------------------------------ (add/remove: 2/0 grow/shrink: 2/1 up/down: 1593/-1640) Total: -47 bytes Signed-off-by: Leonid Lisovskiy Signed-off-by: Denys Vlasenko --- editors/awk.c | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/editors/awk.c b/editors/awk.c index cb98a67b6..aa2fd484c 100644 --- a/editors/awk.c +++ b/editors/awk.c @@ -250,7 +250,7 @@ enum { /* builtins */ enum { - B_a2, B_ix, B_ma, B_sp, B_ss, B_ti, B_lo, B_up, + B_a2, B_ix, B_ma, B_sp, B_ss, B_ti, B_mt, B_lo, B_up, B_ge, B_gs, B_su, B_an, B_co, B_ls, B_or, B_rs, B_xo, }; @@ -299,7 +299,7 @@ static const char tokenlist[] ALIGN1 = "\4rand" "\3sin" "\4sqrt" "\5srand" "\6gensub" "\4gsub" "\5index" "\6length" "\5match" "\5split" "\7sprintf" "\3sub" - "\6substr" "\7systime" "\10strftime" + "\6substr" "\7systime" "\10strftime" "\6mktime" "\7tolower" "\7toupper" NTC "\7getline" NTC "\4func" "\10function" NTC @@ -353,7 +353,7 @@ static const uint32_t tokeninfo[] = { OC_FBLTIN|F_rn, OC_FBLTIN|Nx|F_si, OC_FBLTIN|Nx|F_sq, OC_FBLTIN|Nx|F_sr, OC_B|B_ge|P(0xd6), OC_B|B_gs|P(0xb6), OC_B|B_ix|P(0x9b), OC_FBLTIN|Sx|F_le, OC_B|B_ma|P(0x89), OC_B|B_sp|P(0x8b), OC_SPRINTF, OC_B|B_su|P(0xb6), - OC_B|B_ss|P(0x8f), OC_FBLTIN|F_ti, OC_B|B_ti|P(0x0b), + OC_B|B_ss|P(0x8f), OC_FBLTIN|F_ti, OC_B|B_ti|P(0x0b), OC_B|B_mt|P(0x0b), OC_B|B_lo|P(0x49), OC_B|B_up|P(0x49), OC_GETLINE|SV|P(0), 0, 0, @@ -2001,7 +2001,35 @@ static int awk_sub(node *rn, const char *repl, int nm, var *src, var *dest, int return i; } -static var *exec_builtin(node *op, var *res) +static NOINLINE int do_mktime(const char *ds) +{ + struct tm then; + int count; + + /*memset(&then, 0, sizeof(then)); - not needed */ + then.tm_isdst = -1; /* default is unknown */ + + /* manpage of mktime says these fields are ints, + * so we can sscanf stuff directly into them */ + count = sscanf(ds, "%u %u %u %u %u %u %d", + &then.tm_year, &then.tm_mon, &then.tm_mday, + &then.tm_hour, &then.tm_min, &then.tm_sec, + &then.tm_isdst); + + if (count < 6 + || (unsigned)then.tm_mon < 1 + || (unsigned)then.tm_year < 1900 + ) { + return -1; + } + + then.tm_mon -= 1; + then.tm_year -= - 1900; + + return mktime(&then); +} + +static NOINLINE var *exec_builtin(node *op, var *res) { #define tspl (G.exec_builtin__tspl) @@ -2150,6 +2178,10 @@ static var *exec_builtin(node *op, var *res) setvar_s(res, g_buf); break; + case B_mt: + setvar_i(res, do_mktime(as[0])); + break; + case B_ma: re = as_regex(an[1], &sreg); n = regexec(re, as[0], 1, pmatch, 0);