/* @@@HEAD@@@ // Miscellaneous operations. */ #include "config.h" #include <stdlib.h> #include <time.h> #include <sys/time.h> /* for mtime() */ #include "defs.h" #include "y.tab.h" #include "cdc_types.h" #include "operators.h" #include "execute.h" #include "util.h" #if defined(sys_ultrix4_4) int gettimeofday (struct timeval *tp, struct timezone *tzp); #endif void op_time(void) { /* Take no arguments. */ if (!func_init_0()) return; push_int(time(NULL)); } void op_localtime(void) { struct tm * tms; data_t * d; list_t * l; time_t t; register int x; if (!func_init_0()) return; time(&t); tms = localtime(&t); #define __LSIZE__ 10 l = list_new(__LSIZE__); d = list_empty_spaces(l, __LSIZE__); for (x=0; x < __LSIZE__; x++) d[x].type = INTEGER; d[0].u.val = (int) t; d[1].u.val = tms->tm_sec; d[2].u.val = tms->tm_min; d[3].u.val = tms->tm_hour; d[4].u.val = tms->tm_mday; d[5].u.val = tms->tm_mon; d[6].u.val = tms->tm_year; d[7].u.val = tms->tm_wday; d[8].u.val = tms->tm_yday; d[9].u.val = tms->tm_isdst; #undef __LSIZE__ push_list(l); list_discard(l); } /* May as well give it to them, the code is in the driver */ void op_timestamp(void) { string_t * str; char * s; /* Take no arguments. */ if (!func_init_0()) return; s = timestamp(NULL); str = string_from_chars(s, strlen(s)); push_string(str); string_discard(str); } void op_strftime(void) { char s[LINE]; char * fmt; data_t * args; string_t * str; int nargs; time_t tt; struct tm * t; if (!func_init_1_or_2(&args, &nargs, STRING, INTEGER)) return; tt = ((nargs == 2) ? (time_t) args[1].u.val : time(NULL)); t = localtime(&tt); fmt = string_chars(args[0].u.str); /* some OS's are weird and do odd things when you end in % (accidentally or no) */ if (fmt[strlen(fmt)] == '%') fmt[strlen(fmt)] = NULL; if (strftime(s, LINE, fmt, t) == (size_t) 0) { cthrow(range_id, "Format results in a string longer than 80 characters."); return; } str = string_from_chars(s, strlen(s)); pop(nargs); push_string(str); string_discard(str); } void op_mtime(void) { #ifdef HAVE_GETTIMEOFDAY struct timeval tp; #endif /* Take no prisoners (bwahaha) */ if (!func_init_0()) return; #ifdef HAVE_GETTIMEOFDAY /* usec is microseconds */ gettimeofday(&tp, NULL); push_int((int) tp.tv_usec); #else push_int(-1); #endif } void op_ctime(void) { data_t *args; int num_args; time_t tval; char *timestr; string_t *str; /* Take an optional integer argument. */ if (!func_init_0_or_1(&args, &num_args, INTEGER)) return; tval = (num_args) ? args[0].u.val : time(NULL); timestr = ctime(&tval); str = string_from_chars(timestr, 24); pop(num_args); push_string(str); string_discard(str); }