]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
modern C: use strftime enforcing C locale instead of reinventing it
authorBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 20 Apr 2022 09:33:38 +0000 (11:33 +0200)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Thu, 20 Oct 2022 11:16:43 +0000 (13:16 +0200)
src/strgen.c

index 673f44a2a291e7ebb3fbe0733b3f42ae6b78533c..f8e05a79972e0b6f6fe8b71accf8c2573c6f86e8 100644 (file)
@@ -31,6 +31,7 @@
 #include <time.h>
 #include <ctype.h>
 #include <errno.h>
+#include <locale.h>
 
 #include "mlmmj.h"
 #include "strgen.h"
@@ -256,80 +257,18 @@ char *genmsgid(const char *fqdn)
 char *gendatestr()
 {
        time_t t;
-       struct tm gmttm, lttm;
-       int dayyear;
+       locale_t l = newlocale(LC_TIME_MASK, "C", NULL);
+       struct tm lttm;
        char *timestr;
-       const char *weekday = NULL, *month = NULL;
 
        /* 6 + 26 + ' ' + timezone which is 5 + '\n\0' == 40 */
        timestr = (char *)mymalloc(40);
        t = time(NULL);
 
        localtime_r(&t, &lttm);
-       gmtime_r(&t, &gmttm);
 
-       t = (((lttm.tm_hour - gmttm.tm_hour) * 60) +
-           (lttm.tm_min - gmttm.tm_min)) * 60;
-       
-       dayyear = lttm.tm_yday - gmttm.tm_yday;
-       if(dayyear) {
-               if (dayyear == -1 || dayyear > 1)
-                       t -= 24 * 60 * 60;
-               else
-                       t += 24 * 60 * 60;
-       }
-
-       switch(lttm.tm_wday) {
-               case 0: weekday = "Sun";
-                       break;
-               case 1: weekday = "Mon";
-                       break;
-               case 2: weekday = "Tue";
-                       break;
-               case 3: weekday = "Wed";
-                       break;
-               case 4: weekday = "Thu";
-                       break;
-               case 5: weekday = "Fri";
-                       break;
-               case 6: weekday = "Sat";
-                       break;
-               default:
-                       break;
-       }
-       switch(lttm.tm_mon) {
-               case 0: month = "Jan";
-                       break;
-               case 1: month = "Feb";
-                       break;
-               case 2: month = "Mar";
-                       break;
-               case 3: month = "Apr";
-                       break;
-               case 4: month = "May";
-                       break;
-               case 5: month = "Jun";
-                       break;
-               case 6: month = "Jul";
-                       break;
-               case 7: month = "Aug";
-                       break;
-               case 8: month = "Sep";
-                       break;
-               case 9: month = "Oct";
-                       break;
-               case 10: month = "Nov";
-                        break;
-               case 11: month = "Dec";
-                        break;
-               default:
-                        break;
-       }
-
-       
-       snprintf(timestr, 40, "Date: %s, %02d %s %04d %02d:%02d:%02d %+05d\n",  
-                       weekday, lttm.tm_mday, month, lttm.tm_year + 1900,
-                       lttm.tm_hour, lttm.tm_min, lttm.tm_sec, ((int)t)/36);
+       strftime_l(timestr, 40, "Date: %a, %d %b %Y %T %z", &lttm, l);
+       freelocale(l);
 
        return timestr;
 }