X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fexpressions%2Fparse.c;h=fcfd8ef3fb44a7d36ccc028f381feb53766b155f;hb=dcf9b154cbcaa35c3d8459a201b77eec8bcb30bd;hp=14dedfc998e8add71b4a65668b4d44dbf2a911a9;hpb=6eea9310493902d3b06b25c612c7ba89d467b6fa;p=pspp-builds.git diff --git a/src/expressions/parse.c b/src/expressions/parse.c index 14dedfc9..fcfd8ef3 100644 --- a/src/expressions/parse.c +++ b/src/expressions/parse.c @@ -86,6 +86,19 @@ expr_parse (struct dictionary *dict, enum expr_type type) } } +/* Parses and returns an expression of the given TYPE, as + expr_parse(), and sets up so that destroying POOL will free + the expression as well. */ +struct expression * +expr_parse_pool (struct pool *pool, + struct dictionary *dict, enum expr_type type) +{ + struct expression *e = expr_parse (dict, type); + if (e != NULL) + pool_add_subpool (pool, e->expr_pool); + return e; +} + /* Free expression E. */ void expr_free (struct expression *e) @@ -718,6 +731,7 @@ parse_sysvar (struct expression *e) "JUL", "AUG", "SEP", "OCT", "NOV", "DEC", }; + time_t last_vfm_invocation = vfm_last_invocation (); struct tm *time; char temp_buf[10]; @@ -735,21 +749,23 @@ parse_sysvar (struct expression *e) return expr_allocate_number (e, SYSMIS); else if (lex_match_id ("$JDATE")) { - struct tm *time = localtime (&last_vfm_invocation); - return expr_allocate_number (e, expr_ymd_to_ofs (time->tm_year + 1900, - time->tm_mon + 1, - time->tm_mday)); + time_t time = vfm_last_invocation (); + struct tm *tm = localtime (&time); + return expr_allocate_number (e, expr_ymd_to_ofs (tm->tm_year + 1900, + tm->tm_mon + 1, + tm->tm_mday)); } else if (lex_match_id ("$TIME")) { - struct tm *time = localtime (&last_vfm_invocation); + time_t time = vfm_last_invocation (); + struct tm *tm = localtime (&time); return expr_allocate_number (e, - expr_ymd_to_date (time->tm_year + 1900, - time->tm_mon + 1, - time->tm_mday) - + time->tm_hour * 60 * 60. - + time->tm_min * 60. - + time->tm_sec); + expr_ymd_to_date (tm->tm_year + 1900, + tm->tm_mon + 1, + tm->tm_mday) + + tm->tm_hour * 60 * 60. + + tm->tm_min * 60. + + tm->tm_sec); } else if (lex_match_id ("$LENGTH")) return expr_allocate_number (e, get_viewlength ());