diff options
-rw-r--r-- | jim-clock.c | 110 | ||||
-rw-r--r-- | jimsh.c | 2 |
2 files changed, 112 insertions, 0 deletions
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 <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <time.h> + +#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; +} @@ -126,6 +126,7 @@ extern void Jim_RegexpInit(Jim_Interp *interp); extern void Jim_ReaddirInit(Jim_Interp *interp); extern void Jim_FileInit(Jim_Interp *interp); extern void Jim_ExecInit(Jim_Interp *interp); +extern void Jim_ClockInit(Jim_Interp *interp); int main(int argc, char *const argv[]) { @@ -144,6 +145,7 @@ int main(int argc, char *const argv[]) Jim_ReaddirInit(interp); Jim_FileInit(interp); Jim_ExecInit(interp); + Jim_ClockInit(interp); /* Append the path where the executed Jim binary is contained * in the jim_libpath list. */ |