mirror of
https://github.com/johnkerl/miller.git
synced 2026-08-01 04:01:58 +00:00
73 lines
1.9 KiB
C
73 lines
1.9 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "mlr_globals.h"
|
|
#include "mlr_arch.h"
|
|
#include "mlrutil.h"
|
|
#include "netbsd_strptime.h"
|
|
#include "nlnet_timegm.h"
|
|
|
|
// For some Linux distros, in spite of including time.h:
|
|
char *strptime(const char *s, const char *format, struct tm *ptm);
|
|
|
|
// ----------------------------------------------------------------
|
|
int mlr_arch_setenv(const char *name, const char *value) {
|
|
#ifdef MLR_ON_MSYS2
|
|
fprintf(stderr, "%s: setenv is not supported on this architecture.\n", MLR_GLOBALS.bargv0);
|
|
exit(1);
|
|
#else
|
|
return setenv(name, value, 1 /*overwrite*/);
|
|
#endif
|
|
}
|
|
|
|
// ----------------------------------------------------------------
|
|
int mlr_arch_unsetenv(const char *name) {
|
|
#ifdef MLR_ON_MSYS2
|
|
fprintf(stderr, "%s: unsetenv is not supported on this architecture.\n", MLR_GLOBALS.bargv0);
|
|
exit(1);
|
|
#else
|
|
return unsetenv(name);
|
|
#endif
|
|
}
|
|
|
|
// ----------------------------------------------------------------
|
|
char *mlr_arch_strptime(const char *s, const char *format, struct tm *ptm) {
|
|
#ifdef MLR_ON_MSYS2
|
|
return netbsd_strptime(s, format, ptm);
|
|
#else
|
|
return strptime(s, format, ptm);
|
|
#endif
|
|
}
|
|
|
|
// ----------------------------------------------------------------
|
|
// See the GNU timegm manpage -- this is what it does.
|
|
time_t mlr_arch_timegmlocal(struct tm* ptm, timezone_handling_t timezone_handling) {
|
|
#ifdef MLR_ON_MSYS2
|
|
// Crap, we're offering limited Windows support :(
|
|
if (timezone_handling != TIMEZONE_HANDLING_GMT) {
|
|
fprintf(stderr, "%s: Local timezone is not handled for output.\n",
|
|
MLR_GLOBALS.bargv0);
|
|
exit(1);
|
|
}
|
|
return nlnet_timegm(ptm);
|
|
#else
|
|
time_t ret;
|
|
|
|
if (timezone_handling == TIMEZONE_HANDLING_GMT) {
|
|
char* tz = getenv("TZ");
|
|
mlr_arch_setenv("TZ", "GMT0");
|
|
tzset();
|
|
ret = mktime(ptm);
|
|
if (tz) {
|
|
mlr_arch_setenv("TZ", tz);
|
|
} else {
|
|
mlr_arch_unsetenv("TZ");
|
|
}
|
|
tzset();
|
|
} else {
|
|
ret = mktime(ptm);
|
|
}
|
|
|
|
return ret;
|
|
#endif
|
|
}
|