From 058e4762cf221df70f4c544c5554ea40b0c2a7c2 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Mon, 24 Feb 2020 23:02:22 +0100 Subject: [PATCH 1/2] simple TZ api: bypass sprintf/sscanf: + 7KB --- cores/esp8266/time.cpp | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/cores/esp8266/time.cpp b/cores/esp8266/time.cpp index 7b4ac20f76..9d5f7130c3 100644 --- a/cores/esp8266/time.cpp +++ b/cores/esp8266/time.cpp @@ -133,12 +133,14 @@ int _gettimeofday_r(struct _reent* unused, struct timeval *tp, void *tzp) void configTime(int timezone_sec, int daylightOffset_sec, const char* server1, const char* server2, const char* server3) { - char tzstr [64]; - // There is no way to tell when DST starts or stop with this API // So DST is always integrated in TZ // The other API should be preferred +#if 0 + + // using posix API (calls sprintf here, sscanf internally) + int tzs = daylightOffset_sec + timezone_sec; int tzh = tzs / 3600; tzs -= tzh * 3600; @@ -146,8 +148,43 @@ void configTime(int timezone_sec, int daylightOffset_sec, const char* server1, c tzs -= tzm * 60; // man tzset: + char tzstr [64]; snprintf(tzstr, sizeof tzstr, "ESPUSER<%+d:%02d:%02d>", tzh, tzm, tzs); return configTime(tzstr, server1, server2, server3); + +#else + + // newlib inspection and internal structure hacking + // no sprintf, no sscanf, -7584 flash bytes + + static char gmt[] = "GMT"; + + // newlib inspection and hack + _timezone = timezone_sec + daylightOffset_sec; + _daylight = 0; + _tzname[0] = gmt; + _tzname[1] = gmt; + auto tz = __gettzinfo(); + tz->__tznorth = 1; + tz->__tzyear = 0; + for (int i = 0; i < 2; i++) + { + auto tzr = &tz->__tzrule[i]; + tzr->ch = 74; + tzr->m = 0; + tzr->n = 0; + tzr->d = 0; + tzr->s = 0; + tzr->change = 0; + tzr->offset = _timezone; + } + + // sntp servers + setServer(0, server1); + setServer(1, server2); + setServer(2, server3); + +#endif } void configTime(const char* tz, const char* server1, const char* server2, const char* server3) From b897f74268b2268a0344c6e503eabd4322ba8138 Mon Sep 17 00:00:00 2001 From: David Gauchard Date: Tue, 25 Feb 2020 10:04:21 +0100 Subject: [PATCH 2/2] using obfuscating comments instead of #if 0 --- cores/esp8266/time.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/cores/esp8266/time.cpp b/cores/esp8266/time.cpp index 9d5f7130c3..45481d91b1 100644 --- a/cores/esp8266/time.cpp +++ b/cores/esp8266/time.cpp @@ -137,9 +137,8 @@ void configTime(int timezone_sec, int daylightOffset_sec, const char* server1, c // So DST is always integrated in TZ // The other API should be preferred -#if 0 - - // using posix API (calls sprintf here, sscanf internally) + /*** portable version using posix API + (calls sprintf here, then sscanf internally) int tzs = daylightOffset_sec + timezone_sec; int tzh = tzs / 3600; @@ -152,14 +151,14 @@ void configTime(int timezone_sec, int daylightOffset_sec, const char* server1, c snprintf(tzstr, sizeof tzstr, "ESPUSER<%+d:%02d:%02d>", tzh, tzm, tzs); return configTime(tzstr, server1, server2, server3); -#else + Replaced by light code found from + newlib inspection and internal structure hacking + (no sprintf, no sscanf, -7584 flash bytes): - // newlib inspection and internal structure hacking - // no sprintf, no sscanf, -7584 flash bytes + ***/ static char gmt[] = "GMT"; - // newlib inspection and hack _timezone = timezone_sec + daylightOffset_sec; _daylight = 0; _tzname[0] = gmt; @@ -184,7 +183,7 @@ void configTime(int timezone_sec, int daylightOffset_sec, const char* server1, c setServer(1, server2); setServer(2, server3); -#endif + /*** end of posix replacement ***/ } void configTime(const char* tz, const char* server1, const char* server2, const char* server3)