diff -r 000000000000 -r 2e3d3ce01487 openenvutils/commandshell/shell/src/modules/datetime.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openenvutils/commandshell/shell/src/modules/datetime.c Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,140 @@ +// datetime.c - parameter interface to langinfo via curses +// +// © Portions Copyright (c) Symbian Software Ltd 2007. All rights reserved. +// +/* + * This file is part of zsh, the Z shell. + * + * Copyright (c) 2002 Peter Stephenson, Clint Adams + * All rights reserved. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and to distribute modified versions of this software for any + * purpose, provided that the above copyright notice and the following + * two paragraphs appear in all copies of this software. + * + * In no event shall Peter Stephenson, Clint Adams or the Zsh Development Group + * be liable to any party for direct, indirect, special, incidental, or + * consequential damages arising out of the use of this software and its + * documentation, even if Peter Stephenson, Clint Adams and the Zsh + * Development Group have been advised of the possibility of such damage. + * + * Peter Stephenson, Clint Adams and the Zsh Development Group specifically + * disclaim any warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. + * The software provided hereunder is on an "as is" basis, and Peter + * Stephenson, Clint Adams and the Zsh Development Group have no obligation + * to provide maintenance, support, updates, enhancements, or modifications. + * + */ +#include "datetime.mdh" +#include "datetime.pro" +#include + +#ifdef __SYMBIAN32__ +#ifdef __WINSCW__ +#pragma warn_unusedarg off +#endif//__WINSCW__ +#endif//__SYMBIAN32__ + +static int +bin_strftime(char *nam, char **argv, Options ops, UNUSED(int func)) +{ + int bufsize, x; + char *endptr = NULL, *scalar = NULL, *buffer; + time_t secs; + struct tm *t; + + if (OPT_ISSET(ops,'s')) { + scalar = OPT_ARG(ops, 's'); + if (!isident(scalar)) { + zwarnnam(nam, "not an identifier: %s", scalar, 0); + return 1; + } + } + + secs = (time_t)strtoul(argv[1], &endptr, 10); + if (secs == (time_t)ULONG_MAX) { + zwarnnam(nam, "%s: %e", argv[1], errno); + return 1; + } else if (*endptr != '\0') { + zwarnnam(nam, "%s: invalid decimal number", argv[1], 0); + return 1; + } + + t = localtime(&secs); + bufsize = strlen(argv[0]) * 2; + buffer = zalloc(bufsize); + + for (x=0; x < 4; x++) { + if (ztrftime(buffer, bufsize, argv[0], t) >= 0) + break; + buffer = zrealloc(buffer, bufsize *= 2); + } + + if (scalar) { + setsparam(scalar, ztrdup(buffer)); + } else { + printf("%s\n", buffer); + } + zfree(buffer, bufsize); + + return 0; +} + +static zlong +getcurrentsecs(Param pm) +{ + return (zlong) time(NULL); +} + +static struct builtin bintab[] = { + BUILTIN("strftime", 0, bin_strftime, 2, 2, 0, "s:", NULL), +}; + +static const struct gsu_integer epochseconds_gsu = +{ getcurrentsecs, NULL, stdunsetfn }; + +static struct paramdef patab[] = { + PARAMDEF("EPOCHSECONDS", PM_INTEGER|PM_SPECIAL|PM_READONLY, + NULL, &epochseconds_gsu), +}; + +/**/ +int +setup_(UNUSED(Module m)) +{ + return 0; +} + +/**/ +int +boot_(Module m) +{ + return !(addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab)) | + addparamdefs(m->nam, patab, sizeof(patab)/sizeof(*patab)) + ); +} + +/**/ +int +cleanup_(Module m) +{ + Param pm; + + deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab)); + pm = (Param) paramtab->getnode(paramtab, "EPOCHSECONDS"); + if (pm && (pm->flags & PM_SPECIAL)) { + pm->flags &= ~PM_READONLY; + unsetparam_pm(pm, 0, 1); + } + return 0; +} + +/**/ +int +finish_(UNUSED(Module m)) +{ + return 0; +}