- // 10 20 30 = 35
- // 01234567890123456789012345678901234
- // Date(2014, 04, 01, 03, 28, 20, 065)
-
- buffer_need_bytes(wb, 36);
-
- char *b = &wb->buffer[wb->len];
-
- int i = 0;
- b[i++]='D';
- b[i++]='a';
- b[i++]='t';
- b[i++]='e';
- b[i++]='(';
- b[i++]= 48 + year / 1000; year -= (year / 1000) * 1000;
- b[i++]= 48 + year / 100; year -= (year / 100) * 100;
- b[i++]= 48 + year / 10;
- b[i++]= 48 + year % 10;
- b[i++]=',';
- //b[i++]=' ';
- b[i]= 48 + month / 10; if(b[i] != '0') i++;
- b[i++]= 48 + month % 10;
- b[i++]=',';
- //b[i++]=' ';
- b[i]= 48 + day / 10; if(b[i] != '0') i++;
- b[i++]= 48 + day % 10;
- b[i++]=',';
- //b[i++]=' ';
- b[i]= 48 + hours / 10; if(b[i] != '0') i++;
- b[i++]= 48 + hours % 10;
- b[i++]=',';
- //b[i++]=' ';
- b[i]= 48 + minutes / 10; if(b[i] != '0') i++;
- b[i++]= 48 + minutes % 10;
- b[i++]=',';
- //b[i++]=' ';
- b[i]= 48 + seconds / 10; if(b[i] != '0') i++;
- b[i++]= 48 + seconds % 10;
- b[i++]=')';
- b[i]='\0';
-
- wb->len += i;
-
- // terminate it
- buffer_need_bytes(wb, 1);
- wb->buffer[wb->len] = '\0';
-
- buffer_overflow_check(wb);
+ // 10 20 30 = 35
+ // 01234567890123456789012345678901234
+ // Date(2014,04,01,03,28,20)
+
+ buffer_need_bytes(wb, 30);
+
+ char *b = &wb->buffer[wb->len], *p;
+ unsigned int *q = (unsigned int *)b;
+
+ #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ *q++ = 0x65746144; // "Date" backwards.
+ #else
+ *q++ = 0x44617465; // "Date"
+ #endif
+ p = (char *)q;
+
+ *p++ = '(';
+ *p++ = '0' + year / 1000; year %= 1000;
+ *p++ = '0' + year / 100; year %= 100;
+ *p++ = '0' + year / 10;
+ *p++ = '0' + year % 10;
+ *p++ = ',';
+ *p = '0' + month / 10; if (*p != '0') p++;
+ *p++ = '0' + month % 10;
+ *p++ = ',';
+ *p = '0' + day / 10; if (*p != '0') p++;
+ *p++ = '0' + day % 10;
+ *p++ = ',';
+ *p = '0' + hours / 10; if (*p != '0') p++;
+ *p++ = '0' + hours % 10;
+ *p++ = ',';
+ *p = '0' + minutes / 10; if (*p != '0') p++;
+ *p++ = '0' + minutes % 10;
+ *p++ = ',';
+ *p = '0' + seconds / 10; if (*p != '0') p++;
+ *p++ = '0' + seconds % 10;
+
+ unsigned short *r = (unsigned short *)p;
+
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ *r++ = 0x0029; // ")\0" backwards.
+ #else
+ *r++ = 0x2900; // ")\0"
+ #endif
+
+ wb->len += (size_t)((char *)r - b - 1);
+
+ // terminate it
+ wb->buffer[wb->len] = '\0';
+ buffer_overflow_check(wb);