#include <stdlib.h>
#include <unistd.h>
#include <string.h>
+#include <time.h>
#include <float.h>
#include <ctype.h>
format_literal (ans, a, mstr, 1, 12);
}
+static const char* WStr_a[] = {
+ "Sun", "Mon", "Tue", "Wed",
+ "Thu", "Fri", "Sat"
+};
+
+static const char* WStr[] = {
+ "Sunday", "Monday", "Tuesday", "Wednesday",
+ "Thursday", "Friday", "Saturday"
+};
+
static void format_week (ustring& ans, MNode* a, std::vector<ustring>& par) {
- static const char* wstr_a[] = {
- "Sun", "Mon", "Tue", "Wed",
- "Thu", "Fri", "Sat"
- };
- format_literal (ans, a, wstr_a, 0, 7);
+ format_literal (ans, a, WStr_a, 0, 7);
}
static void format_Week (ustring& ans, MNode* a, std::vector<ustring>& par) {
- static const char* wstr[] = {
- "Sunday", "Monday", "Tuesday", "Wednesday",
- "Thursday", "Friday", "Saturday"
- };
- format_literal (ans, a, wstr, 0, 7);
+ format_literal (ans, a, WStr, 0, 7);
}
ustring formatString (const ustring& format, boost::ptr_vector<MNodePtr>& par) {
return ans;
}
+static ustring colpad0 (int n, const ustring& src) {
+ int m;
+
+ if (n > 0) {
+ n = std::min (32, n);
+ m = n - src.length ();
+ if (m > 0) {
+ ustring ans;
+ ans.reserve (n);
+ ans.append (m, '0');
+ ans.append (src);
+ return ans;
+ } else if (m == 0) {
+ return src;
+ } else {
+ return ustring (src.end () - n, src.end ());
+ }
+ } else {
+ return src;
+ }
+}
+
/*
${Y:4}, ${Y:2}
${M:2}, ${M}
${s:2}, ${s}
${W}, ${w}
*/
-ustring formatDateString (const ustring& format, boost::ptr_vector<MNodePtr>& par) {
+ustring formatDateString (const ustring& format, time_t tm) {
ustring ans;
+ struct tm v;
uiterator b, e;
umatch m;
- u_int i;
- MNode* a;
+ int pc;
static uregex re ("\\$\\{([YMDhmsWw])(:([0-9]))?\\}");
+ std::vector<ustring> fpar;
+ localtime_r (&tm, &v);
b = format.begin ();
e = format.end ();
while (usearch (b, e, m, re)) {
- std::vector<ustring> fpar;
ans.append (b, m[0].first);
b = m[0].second;
+ if (m[2].matched) {
+ pc = strtol (ustring (m[3].first, m[3].second));
+ } else {
+ pc = 0;
+ }
switch (*m[1].first) {
case 'Y':
- a = par[0] ();
+ ans.append (colpad0 (pc, to_ustring (v.tm_year + 1900)));
break;
case 'M':
- a = par[1] ();
+ ans.append (colpad0 (pc, to_ustring (v.tm_mon + 1)));
break;
case 'D':
- a = par[2] ();
+ ans.append (colpad0 (pc, to_ustring (v.tm_mday)));
break;
case 'h':
- a = par[3] ();
+ ans.append (colpad0 (pc, to_ustring (v.tm_hour)));
break;
case 'm':
- a = par[4] ();
+ ans.append (colpad0 (pc, to_ustring (v.tm_min)));
break;
case 's':
- a = par[5] ();
+ ans.append (colpad0 (pc, to_ustring (v.tm_sec)));
break;
case 'W':
+ ans.append (WStr [v.tm_wday]);
+ break;
case 'w':
- a = par[6] ();
+ ans.append (WStr_a [v.tm_wday]);
break;
- default:
- a = NULL;
- }
-
- if (! m[2].matched) {
- switch (*m[1].first) {
- case 'W':
- format_Week (ans, a, fpar);
- break;
- case 'w':
- format_week (ans, a, fpar);
- break;
- default:
- if (a)
- ans.append (to_string (a));
- }
- } else {
- format_int (ans, a, strtol (ustring (m[3].first, m[3].second)), true);
}
}
ans.append (b, e);