- struct tm *tm;
-
- buf[0] = 0;
- tm = localtime(&thetime);
-
- sprintf(buf, "%s, %02d %s %4d %02d:%02d:%02d",
- ascdays[tm->tm_wday],
- tm->tm_mday,
- ascmonths[tm->tm_mon],
- tm->tm_year + 1900, tm->tm_hour, tm->tm_min, tm->tm_sec);
+ time_t t = 0;
+ struct tm tt;
+ char *c;
+ char tz[256];
+
+ /** Skip day of week, to number */
+ for (c = buf; *c != ' '; c++)
+ ;
+ c++;
+
+ /* Get day of month */
+ tt.tm_mday = atoi(c);
+ for (; *c != ' ' && *c != '-'; c++);
+ c++;
+
+ /** Get month */
+ switch (*c) {
+ case 'A': /** April, August */
+ tt.tm_mon = (c[1] == 'p') ? 3 : 7;
+ break;
+ case 'D': /** December */
+ tt.tm_mon = 11;
+ break;
+ case 'F': /** February */
+ tt.tm_mon = 1;
+ break;
+ case 'M': /** March, May */
+ tt.tm_mon = (c[2] == 'r') ? 2 : 4;
+ break;
+ case 'J': /** January, June, July */
+ tt.tm_mon = (c[2] == 'n') ? ((c[1] == 'a') ? 0 : 5) : 6;
+ break;
+ case 'N': /** November */
+ tt.tm_mon = 10;
+ break;
+ case 'O': /** October */
+ tt.tm_mon = 9;
+ break;
+ case 'S': /** September */
+ tt.tm_mon = 8;
+ break;
+ default:
+ return 42;
+ break; /** NOTREACHED */
+ }
+ c += 4;
+
+ tt.tm_year = 0;
+ /** Get year */
+ tt.tm_year = atoi(c);
+ for (; *c != ' '; c++);
+ c++;
+ if (tt.tm_year >= 1900)
+ tt.tm_year -= 1900;
+
+ /** Get hour */
+ tt.tm_hour = atoi(c);
+ for (; *c != ':'; c++);
+ c++;
+
+ /** Get minute */
+ tt.tm_min = atoi(c);
+ for (; *c != ':'; c++);
+ c++;
+
+ /** Get second */
+ tt.tm_sec = atoi(c);
+ for (; *c && *c != ' '; c++);
+
+ /** Got everything; let's go */
+ /** First, change to UTC */
+ if (getenv("TZ"))
+ sprintf(tz, "TZ=%s", getenv("TZ"));
+ else
+ strcpy(tz, "TZ=");
+ putenv("TZ=UTC");
+ tzset();
+ t = mktime(&tt);
+ putenv(tz);
+ tzset();
+ return t;