From 1bb6166bdb5e2a92b50e0ea178fa55a5f0d7261f Mon Sep 17 00:00:00 2001 From: Steve Bennett Date: Mon, 27 Jul 2009 11:04:16 +1000 Subject: Add clock command --- jim-clock.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 jim-clock.c (limited to 'jim-clock.c') diff --git a/jim-clock.c b/jim-clock.c new file mode 100644 index 0000000..fb3c433 --- /dev/null +++ b/jim-clock.c @@ -0,0 +1,110 @@ +/* + * tcl_clock.c + * + * Implements the clock command + */ + +/* For strptime() */ +#define _XOPEN_SOURCE + +#include +#include +#include +#include + +#include "jim.h" +#include "jim-subcmd.h" + +static int clock_cmd_format(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +{ + /* How big is big enough? */ + char buf[100]; + time_t t; + long seconds; + + const char *format = "%a %b %d %H:%M:%S %Z %Y"; + + if (argc == 2 || (argc == 3 && !Jim_CompareStringImmediate(interp, argv[1], "-format"))) { + return -1; + } + + if (argc == 3) { + format = Jim_GetString(argv[2], NULL); + } + + if (Jim_GetLong(interp, argv[0], &seconds) != JIM_OK) { + return JIM_ERR; + } + t = seconds; + + strftime(buf, sizeof(buf), format, localtime(&t)); + + Jim_SetResultString(interp, buf, -1); + + return JIM_OK; +} + +static int clock_cmd_scan(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +{ + char *pt; + struct tm tm; + time_t now = time(0); + + if (!Jim_CompareStringImmediate(interp, argv[1], "-format")) { + return -1; + } + + /* Initialise with the current date/time */ + tm = *localtime(&now); + + pt = strptime(Jim_GetString(argv[0], NULL), Jim_GetString(argv[2], NULL), &tm); + if (pt == 0 || *pt != 0) { + Jim_SetResultString(interp, "Failed to parse time according to format", -1); + return JIM_ERR; + } + + /* Now convert into a time_t */ + Jim_SetResult(interp, Jim_NewIntObj(interp, (jim_wide)mktime(&tm))); + + return JIM_OK; +} + +static int clock_cmd_seconds(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +{ + Jim_SetResult(interp, Jim_NewIntObj(interp, (jim_wide)time(NULL))); + + return JIM_OK; +} + +static const jim_subcmd_type command_table[] = { + { .cmd = "seconds", + .function = clock_cmd_seconds, + .minargs = 0, + .maxargs = 0, + .description = "Returns the current time as seconds since the epoch" + }, + { .cmd = "format", + .args = "seconds ?-format format?", + .function = clock_cmd_format, + .minargs = 1, + .maxargs = 3, + .description = "Format the given time" + }, + { .cmd = "scan", + .args = "str -format format", + .function = clock_cmd_scan, + .minargs = 3, + .maxargs = 3, + .description = "Determine the time according to the given format" + }, + { 0 } +}; + +int Jim_ClockInit(Jim_Interp *interp) +{ + if (Jim_PackageProvide(interp, "clock", "1.0", JIM_ERRMSG) != JIM_OK) { + return JIM_ERR; + } + Jim_CreateCommand(interp, "clock", Jim_SubCmdProc, (void *)command_table, NULL); + return JIM_OK; +} -- cgit v1.1