Changeset View
Changeset View
Standalone View
Standalone View
contrib/tzcode/date.c
Show All 36 Lines | |||||
#endif | #endif | ||||
static int retval = EXIT_SUCCESS; | static int retval = EXIT_SUCCESS; | ||||
static void display(const char *, time_t); | static void display(const char *, time_t); | ||||
static void dogmt(void); | static void dogmt(void); | ||||
static void errensure(void); | static void errensure(void); | ||||
static void timeout(FILE *, const char *, const struct tm *); | static void timeout(FILE *, const char *, const struct tm *); | ||||
static ATTRIBUTE_NORETURN void usage(void); | ATTRIBUTE_NORETURN static void usage(void); | ||||
int | int | ||||
main(const int argc, char *argv[]) | main(const int argc, char *argv[]) | ||||
{ | { | ||||
register const char * format = "+%+"; | register const char * format = "+%+"; | ||||
register int ch; | register int ch; | ||||
register bool rflag = false; | register bool rflag = false; | ||||
time_t t; | time_t t; | ||||
Show All 27 Lines | case 'r': /* seconds since 1970 */ | ||||
rflag = true; | rflag = true; | ||||
errno = 0; | errno = 0; | ||||
secs = strtoimax(optarg, &endarg, 0); | secs = strtoimax(optarg, &endarg, 0); | ||||
if (*endarg || optarg == endarg) | if (*endarg || optarg == endarg) | ||||
errno = EINVAL; | errno = EINVAL; | ||||
else if (! (TIME_T_MIN <= secs && secs <= TIME_T_MAX)) | else if (! (TIME_T_MIN <= secs && secs <= TIME_T_MAX)) | ||||
errno = ERANGE; | errno = ERANGE; | ||||
if (errno) { | if (errno) { | ||||
perror(optarg); | char const *e = strerror(errno); | ||||
fprintf(stderr, _("date: %s: %s\n"), | |||||
optarg, e); | |||||
errensure(); | errensure(); | ||||
exit(retval); | exit(retval); | ||||
} | } | ||||
t = secs; | t = secs; | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
if (optind < argc) { | if (optind < argc) { | ||||
Show All 21 Lines | dogmt(void) | ||||
if (fakeenv == NULL) { | if (fakeenv == NULL) { | ||||
static char tzeutc0[] = "TZ=UTC0"; | static char tzeutc0[] = "TZ=UTC0"; | ||||
ptrdiff_t from, to, n; | ptrdiff_t from, to, n; | ||||
for (n = 0; environ[n] != NULL; ++n) | for (n = 0; environ[n] != NULL; ++n) | ||||
continue; | continue; | ||||
#if defined ckd_add && defined ckd_mul | #if defined ckd_add && defined ckd_mul | ||||
if (!ckd_add(&n, n, 2) && !ckd_mul(&n, n, sizeof *fakeenv) | if (!ckd_add(&n, n, 2) && !ckd_mul(&n, n, sizeof *fakeenv) | ||||
&& n <= SIZE_MAX) | && n <= INDEX_MAX) | ||||
fakeenv = malloc(n); | fakeenv = malloc(n); | ||||
#else | #else | ||||
if (n <= min(PTRDIFF_MAX, SIZE_MAX) / sizeof *fakeenv - 2) | if (n <= INDEX_MAX / sizeof *fakeenv - 2) | ||||
fakeenv = malloc((n + 2) * sizeof *fakeenv); | fakeenv = malloc((n + 2) * sizeof *fakeenv); | ||||
#endif | #endif | ||||
if (fakeenv == NULL) { | if (fakeenv == NULL) { | ||||
fprintf(stderr, _("date: Memory exhausted\n")); | fprintf(stderr, _("date: Memory exhausted\n")); | ||||
errensure(); | errensure(); | ||||
exit(retval); | exit(retval); | ||||
} | } | ||||
to = 0; | to = 0; | ||||
▲ Show 20 Lines • Show All 50 Lines • ▼ Show 20 Lines | |||||
timeout(FILE *fp, char const *format, struct tm const *tmp) | timeout(FILE *fp, char const *format, struct tm const *tmp) | ||||
{ | { | ||||
char *cp = NULL; | char *cp = NULL; | ||||
ptrdiff_t result; | ptrdiff_t result; | ||||
ptrdiff_t size = 1024 / 2; | ptrdiff_t size = 1024 / 2; | ||||
for ( ; ; ) { | for ( ; ; ) { | ||||
#ifdef ckd_mul | #ifdef ckd_mul | ||||
bool bigger = !ckd_mul(&size, size, 2) && size <= SIZE_MAX; | bool bigger = !ckd_mul(&size, size, 2) && size <= INDEX_MAX; | ||||
#else | #else | ||||
bool bigger = (size <= min(PTRDIFF_MAX, SIZE_MAX) / 2 | bool bigger = size <= INDEX_MAX / 2 && (size *= 2, true); | ||||
&& (size *= 2, true)); | |||||
#endif | #endif | ||||
char *newcp = bigger ? realloc(cp, size) : NULL; | char *newcp = bigger ? realloc(cp, size) : NULL; | ||||
if (!newcp) { | if (!newcp) { | ||||
fprintf(stderr, | fprintf(stderr, | ||||
_("date: error: can't get memory\n")); | _("date: error: can't get memory\n")); | ||||
errensure(); | errensure(); | ||||
exit(retval); | exit(retval); | ||||
} | } | ||||
cp = newcp; | cp = newcp; | ||||
result = strftime(cp, size, format, tmp); | result = strftime(cp, size, format, tmp); | ||||
if (result != 0) | if (result != 0) | ||||
break; | break; | ||||
} | } | ||||
fwrite(cp + 1, 1, result - 1, fp); | fwrite(cp + 1, 1, result - 1, fp); | ||||
free(cp); | free(cp); | ||||
} | } |