diff options
author | Leonid Lisovskiy <lly.dev@gmail.com> | 2009-09-21 04:08:08 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-09-21 04:08:08 +0200 |
commit | 46a0be5304fb44e07e5066540f8e4061a3ecc438 (patch) | |
tree | b33c7b41a27d9da28111d5571fcd31fad6223032 /editors | |
parent | d8dd25a2a70ed0bc7d3f708683aa7ce733dc29cf (diff) | |
download | busybox-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.c | 40 |
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 */ |
252 | enum { | 252 | enum { |
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 | ||
2004 | static var *exec_builtin(node *op, var *res) | 2004 | static 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 | |||
2032 | static 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); |