aboutsummaryrefslogtreecommitdiff
path: root/editors
diff options
context:
space:
mode:
authorLeonid Lisovskiy <lly.dev@gmail.com>2009-09-21 04:08:08 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2009-09-21 04:08:08 +0200
commit46a0be5304fb44e07e5066540f8e4061a3ecc438 (patch)
treeb33c7b41a27d9da28111d5571fcd31fad6223032 /editors
parentd8dd25a2a70ed0bc7d3f708683aa7ce733dc29cf (diff)
downloadbusybox-w32-46a0be5304fb44e07e5066540f8e4061a3ecc438.tar.gz
busybox-w32-46a0be5304fb44e07e5066540f8e4061a3ecc438.tar.bz2
busybox-w32-46a0be5304fb44e07e5066540f8e4061a3ecc438.zip
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 <lly.dev@gmail.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'editors')
-rw-r--r--editors/awk.c40
1 files 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 {
250 250
251/* builtins */ 251/* builtins */
252enum { 252enum {
253 B_a2, B_ix, B_ma, B_sp, B_ss, B_ti, B_lo, B_up, 253 B_a2, B_ix, B_ma, B_sp, B_ss, B_ti, B_mt, B_lo, B_up,
254 B_ge, B_gs, B_su, 254 B_ge, B_gs, B_su,
255 B_an, B_co, B_ls, B_or, B_rs, B_xo, 255 B_an, B_co, B_ls, B_or, B_rs, B_xo,
256}; 256};
@@ -299,7 +299,7 @@ static const char tokenlist[] ALIGN1 =
299 "\4rand" "\3sin" "\4sqrt" "\5srand" 299 "\4rand" "\3sin" "\4sqrt" "\5srand"
300 "\6gensub" "\4gsub" "\5index" "\6length" 300 "\6gensub" "\4gsub" "\5index" "\6length"
301 "\5match" "\5split" "\7sprintf" "\3sub" 301 "\5match" "\5split" "\7sprintf" "\3sub"
302 "\6substr" "\7systime" "\10strftime" 302 "\6substr" "\7systime" "\10strftime" "\6mktime"
303 "\7tolower" "\7toupper" NTC 303 "\7tolower" "\7toupper" NTC
304 "\7getline" NTC 304 "\7getline" NTC
305 "\4func" "\10function" NTC 305 "\4func" "\10function" NTC
@@ -353,7 +353,7 @@ static const uint32_t tokeninfo[] = {
353 OC_FBLTIN|F_rn, OC_FBLTIN|Nx|F_si, OC_FBLTIN|Nx|F_sq, OC_FBLTIN|Nx|F_sr, 353 OC_FBLTIN|F_rn, OC_FBLTIN|Nx|F_si, OC_FBLTIN|Nx|F_sq, OC_FBLTIN|Nx|F_sr,
354 OC_B|B_ge|P(0xd6), OC_B|B_gs|P(0xb6), OC_B|B_ix|P(0x9b), OC_FBLTIN|Sx|F_le, 354 OC_B|B_ge|P(0xd6), OC_B|B_gs|P(0xb6), OC_B|B_ix|P(0x9b), OC_FBLTIN|Sx|F_le,
355 OC_B|B_ma|P(0x89), OC_B|B_sp|P(0x8b), OC_SPRINTF, OC_B|B_su|P(0xb6), 355 OC_B|B_ma|P(0x89), OC_B|B_sp|P(0x8b), OC_SPRINTF, OC_B|B_su|P(0xb6),
356 OC_B|B_ss|P(0x8f), OC_FBLTIN|F_ti, OC_B|B_ti|P(0x0b), 356 OC_B|B_ss|P(0x8f), OC_FBLTIN|F_ti, OC_B|B_ti|P(0x0b), OC_B|B_mt|P(0x0b),
357 OC_B|B_lo|P(0x49), OC_B|B_up|P(0x49), 357 OC_B|B_lo|P(0x49), OC_B|B_up|P(0x49),
358 OC_GETLINE|SV|P(0), 358 OC_GETLINE|SV|P(0),
359 0, 0, 359 0, 0,
@@ -2001,7 +2001,35 @@ static int awk_sub(node *rn, const char *repl, int nm, var *src, var *dest, int
2001 return i; 2001 return i;
2002} 2002}
2003 2003
2004static var *exec_builtin(node *op, var *res) 2004static NOINLINE int do_mktime(const char *ds)
2005{
2006 struct tm then;
2007 int count;
2008
2009 /*memset(&then, 0, sizeof(then)); - not needed */
2010 then.tm_isdst = -1; /* default is unknown */
2011
2012 /* manpage of mktime says these fields are ints,
2013 * so we can sscanf stuff directly into them */
2014 count = sscanf(ds, "%u %u %u %u %u %u %d",
2015 &then.tm_year, &then.tm_mon, &then.tm_mday,
2016 &then.tm_hour, &then.tm_min, &then.tm_sec,
2017 &then.tm_isdst);
2018
2019 if (count < 6
2020 || (unsigned)then.tm_mon < 1
2021 || (unsigned)then.tm_year < 1900
2022 ) {
2023 return -1;
2024 }
2025
2026 then.tm_mon -= 1;
2027 then.tm_year -= - 1900;
2028
2029 return mktime(&then);
2030}
2031
2032static NOINLINE var *exec_builtin(node *op, var *res)
2005{ 2033{
2006#define tspl (G.exec_builtin__tspl) 2034#define tspl (G.exec_builtin__tspl)
2007 2035
@@ -2150,6 +2178,10 @@ static var *exec_builtin(node *op, var *res)
2150 setvar_s(res, g_buf); 2178 setvar_s(res, g_buf);
2151 break; 2179 break;
2152 2180
2181 case B_mt:
2182 setvar_i(res, do_mktime(as[0]));
2183 break;
2184
2153 case B_ma: 2185 case B_ma:
2154 re = as_regex(an[1], &sreg); 2186 re = as_regex(an[1], &sreg);
2155 n = regexec(re, as[0], 1, pmatch, 0); 2187 n = regexec(re, as[0], 1, pmatch, 0);