Add the isodate utility.
This utility provides a way to display dates in ISO8601 format. The exact output format can be controlled. It can either display dates passed on the commandline or it can display the current date/time.
This commit is contained in:
parent
07a31fd8f7
commit
64c5ce0d65
|
@ -0,0 +1 @@
|
|||
app c isodate bin
|
|
@ -0,0 +1,147 @@
|
|||
/* libiso8601/src/isodate/000_TopSource.c
|
||||
*
|
||||
* (c)2007, Laurence Withers, <l@lwithers.me.uk>.
|
||||
* Released under the GNU GPLv2. See file COPYING or
|
||||
* http://www.gnu.org/copyleft/gpl.html for details.
|
||||
*/
|
||||
|
||||
/* Below are all the includes used throughout the application. */
|
||||
#include <stdio.h>
|
||||
#include <getopt.h>
|
||||
#include <stdlib.h>
|
||||
#include "iso8601.h"
|
||||
|
||||
|
||||
|
||||
void usage(void)
|
||||
{
|
||||
fputs("Usage:\n\n"
|
||||
" isodate [options] [date ...]\n\n"
|
||||
"Valid options:\n"
|
||||
" -h, --help Display this screen.\n"
|
||||
" -e, --extended Use extended display format.\n"
|
||||
" -y, --year Only display year.\n"
|
||||
" -n, --month Display year, month.\n"
|
||||
" -d, --day Display year, month, day [default].\n"
|
||||
" -o, --ordinal Display year, ordinal day.\n"
|
||||
" -w, --week Display ISO year, ISO week.\n"
|
||||
" -W, --week-day Display ISO year, ISO week, ISO weekday.\n"
|
||||
" -r, --hour Display hour.\n"
|
||||
" -R, --hour-fraction Display hour and fraction of hour.\n"
|
||||
" -m, --minute Display hour, minute.\n"
|
||||
" -M, --minute-fraction Display hour, minute and fraction of\n"
|
||||
" minute.\n"
|
||||
" -s, --second Display hour, minute, second.\n"
|
||||
" -S, --second-fraction Display hour, minute, second and fraction\n"
|
||||
" of second [default].\n"
|
||||
" -U, --utc-offset <n> Display time as if timezone offset was\n"
|
||||
" <n> seconds.\n"
|
||||
" -Z, --utc Display time in UTC.\n"
|
||||
"\n"
|
||||
"If specified, one or more ISO8601 dates will be parsed and displayed\n"
|
||||
"in the format given. Otherwise, the system clock will be queried and\n"
|
||||
"its time displayed.\n"
|
||||
"\n", stdout);
|
||||
}
|
||||
|
||||
|
||||
|
||||
struct option options[] = {
|
||||
{ "help", no_argument, 0, 'h' },
|
||||
{ "extended", no_argument, 0, 'e' },
|
||||
{ "year", no_argument, 0, 'y' },
|
||||
{ "month", no_argument, 0, 'n' },
|
||||
{ "day", no_argument, 0, 'd' },
|
||||
{ "ordinal", no_argument, 0, 'o' },
|
||||
{ "week", no_argument, 0, 'w' },
|
||||
{ "week-day", no_argument, 0, 'W' },
|
||||
{ "hour", no_argument, 0, 'r' },
|
||||
{ "hour-fraction", no_argument, 0, 'R' },
|
||||
{ "minute", no_argument, 0, 'm' },
|
||||
{ "minute-fraction", no_argument, 0, 'M' },
|
||||
{ "second", no_argument, 0, 's' },
|
||||
{ "second-fraction", no_argument, 0, 'S' },
|
||||
{ "utc-offset", required_argument, 0, 'U' },
|
||||
{ "utc", no_argument, 0, 'Z' },
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
struct iso8601_details det = {
|
||||
.date_prec = iso8601_prec_day,
|
||||
.time_prec = iso8601_prec_secfrac,
|
||||
.extended = 0,
|
||||
.tz_sec = 0
|
||||
};
|
||||
int override_tz = 0, ret = 0;
|
||||
char* endp, datestr[100];
|
||||
struct iso8601_date date;
|
||||
struct iso8601_details det2;
|
||||
|
||||
while(1) {
|
||||
switch(getopt_long(argc, argv, "heyndowWrRmMsSU:Z", options, 0)) {
|
||||
case -1: goto opts_done;
|
||||
case '?': return 1;
|
||||
case 'h': usage(); return 0;
|
||||
case 'e': det.extended = 1; break;
|
||||
case 'y': det.date_prec = iso8601_prec_year; break;
|
||||
case 'n': det.date_prec = iso8601_prec_month; break;
|
||||
case 'd': det.date_prec = iso8601_prec_day; break;
|
||||
case 'o': det.date_prec = iso8601_prec_ord; break;
|
||||
case 'w': det.date_prec = iso8601_prec_week; break;
|
||||
case 'W': det.date_prec = iso8601_prec_wday; break;
|
||||
case 'r': det.time_prec = iso8601_prec_hour; break;
|
||||
case 'R': det.time_prec = iso8601_prec_hourfrac; break;
|
||||
case 'm': det.time_prec = iso8601_prec_min; break;
|
||||
case 'M': det.time_prec = iso8601_prec_minfrac; break;
|
||||
case 's': det.time_prec = iso8601_prec_sec; break;
|
||||
case 'S': det.time_prec = iso8601_prec_secfrac; break;
|
||||
case 'Z': det.tz_sec = 0; override_tz = 1; break;
|
||||
case 'U':
|
||||
endp = 0;
|
||||
det.tz_sec = strtol(optarg, &endp, 0);
|
||||
if(!endp || *endp || det.tz_sec <= -86400 || det.tz_sec >= 86400) {
|
||||
fputs("Invalid UTC offset. Must be an integral number of seconds\n"
|
||||
"between -86400 and 86400, exclusive.\n", stderr);
|
||||
return 1;
|
||||
}
|
||||
|
||||
override_tz = 1;
|
||||
}
|
||||
}
|
||||
|
||||
opts_done:
|
||||
if(optind == argc) {
|
||||
iso8601_now(&date, &det2);
|
||||
if(!override_tz) det.tz_sec = det2.tz_sec;
|
||||
|
||||
iso8601_print(datestr, sizeof(datestr), &date, &det);
|
||||
fputs(datestr, stdout);
|
||||
putc('\n', stdout);
|
||||
} else {
|
||||
for(; optind != argc; ++optind) {
|
||||
if(iso8601_parse(argv[optind], &date, 0, &det2)) {
|
||||
fputs("Couldn't parse date.\n", stderr);
|
||||
ret = 1;
|
||||
continue;
|
||||
}
|
||||
if(!override_tz) det.tz_sec = det2.tz_sec;
|
||||
|
||||
iso8601_print(datestr, sizeof(datestr), &date, &det);
|
||||
fputs(datestr, stdout);
|
||||
putc('\n', stdout);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* options for text editors
|
||||
kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
vim: expandtab:ts=4:sw=4
|
||||
*/
|
|
@ -0,0 +1,43 @@
|
|||
# These are external variables, and shouldn't clash with anything else
|
||||
# isodate
|
||||
# isodate_BUILT
|
||||
#
|
||||
|
||||
build_target libiso8601
|
||||
|
||||
if [ -z ${isodate_BUILT} ]
|
||||
then
|
||||
isodate="obj/isodate"
|
||||
EXTRAS="${libiso8601} ${libiso8601_DEP_CFLAGS} ${libiso8601_DEP_LIBS}"
|
||||
|
||||
echo "Building application ${isodate}..."
|
||||
|
||||
do_cmd source src/isodate/build.monolithic || return 1
|
||||
|
||||
MODIFIED=0
|
||||
for test in ${MONOLITHIC_TESTS} ${SRC}
|
||||
do
|
||||
if [ ${test} -nt ${isodate} ]
|
||||
then
|
||||
MODIFIED=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${MODIFIED} -ne 0 ]
|
||||
then
|
||||
echo " Compiling..."
|
||||
|
||||
do_cmd ${CC} ${CFLAGS} -I obj -o "${isodate}" ${SRC} ${EXTRAS} || return 1
|
||||
|
||||
print_success "Application built"
|
||||
else
|
||||
print_success "Application up to date"
|
||||
fi
|
||||
|
||||
isodate_BUILT=1
|
||||
|
||||
fi
|
||||
|
||||
# kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
# vim: syntax=sh:expandtab:ts=4:sw=4
|
|
@ -0,0 +1 @@
|
|||
source src/isodate/build.app
|
|
@ -0,0 +1 @@
|
|||
source src/isodate/build.install-app
|
|
@ -0,0 +1,12 @@
|
|||
build_target isodate
|
||||
|
||||
# make paths (this is for Gentoo in particular)
|
||||
build_dir_tree "${BINDIR}" || return 1
|
||||
|
||||
# install binary
|
||||
echo "Installing binaries into '${BINDIR}'"
|
||||
install_file "${isodate}" "${BINDIR}" 0755 || return 1
|
||||
print_success "Done"
|
||||
|
||||
# kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
# vim: syntax=sh:expandtab:ts=4:sw=4
|
|
@ -0,0 +1,18 @@
|
|||
# These are external variables, and shouldn't clash with anything else
|
||||
# isodate_MONOLITHIC
|
||||
#
|
||||
|
||||
SRC="obj/isodate.c"
|
||||
MONOLITHIC_TESTS="src/isodate/build.app src/isodate/build.monolithic"
|
||||
|
||||
if [ -z "${isodate_MONOLITHIC}" ]
|
||||
then
|
||||
MONOLITHIC_SOURCE="$(echo src/isodate/*.c)"
|
||||
make_monolithic ${SRC} C || return 1
|
||||
|
||||
isodate_MONOLITHIC=1
|
||||
MONOLITHIC_DOC="${MONOLITHIC_DOC} ${SRC}"
|
||||
fi
|
||||
|
||||
# kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
# vim: syntax=sh:expandtab:ts=4:sw=4
|
Loading…
Reference in New Issue