// generate a javascript date, the fastest possible way...
void buffer_jsdate(BUFFER *wb, int year, int month, int day, int hours, int minutes, int seconds)
{
- // 10 20 30 = 35
+ // 10 20 30 = 35
// 01234567890123456789012345678901234
// Date(2014,04,01,03,28,20)
buffer_need_bytes(wb, 30);
- 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++]= (char) (48 + year / 1000); year -= (year / 1000) * 1000;
- b[i++]= (char) (48 + year / 100); year -= (year / 100) * 100;
- b[i++]= (char) (48 + year / 10);
- b[i++]= (char) (48 + year % 10);
- b[i++]=',';
- b[i]= (char) (48 + month / 10); if(b[i] != '0') i++;
- b[i++]= (char) (48 + month % 10);
- b[i++]=',';
- b[i]= (char) (48 + day / 10); if(b[i] != '0') i++;
- b[i++]= (char) (48 + day % 10);
- b[i++]=',';
- b[i]= (char) (48 + hours / 10); if(b[i] != '0') i++;
- b[i++]= (char) (48 + hours % 10);
- b[i++]=',';
- b[i]= (char) (48 + minutes / 10); if(b[i] != '0') i++;
- b[i++]= (char) (48 + minutes % 10);
- b[i++]=',';
- b[i]= (char) (48 + seconds / 10); if(b[i] != '0') i++;
- b[i++]= (char) (48 + seconds % 10);
- b[i++]=')';
- b[i]='\0';
-
- wb->len += i;
+ 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 % 100;
+ *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_need_bytes(wb, 36);
char *b = &wb->buffer[wb->len];
-
- int i = 0;
- b[i++]= (char) (48 + year / 1000); year -= (year / 1000) * 1000;
- b[i++]= (char) (48 + year / 100); year -= (year / 100) * 100;
- b[i++]= (char) (48 + year / 10);
- b[i++]= (char) (48 + year % 10);
- b[i++]='-';
- b[i++]= (char) (48 + month / 10);
- b[i++]= (char) (48 + month % 10);
- b[i++]='-';
- b[i++]= (char) (48 + day / 10);
- b[i++]= (char) (48 + day % 10);
- b[i++]=' ';
- b[i++]= (char) (48 + hours / 10);
- b[i++]= (char) (48 + hours % 10);
- b[i++]=':';
- b[i++]= (char) (48 + minutes / 10);
- b[i++]= (char) (48 + minutes % 10);
- b[i++]=':';
- b[i++]= (char) (48 + seconds / 10);
- b[i++]= (char) (48 + seconds % 10);
- b[i]='\0';
-
- wb->len += i;
+ char *p = b;
+
+ *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;
+ *p++ = '0' + month % 10;
+ *p++ = '-';
+ *p++ = '0' + day / 10;
+ *p++ = '0' + day % 10;
+ *p++ = ' ';
+ *p++ = '0' + hours / 10;
+ *p++ = '0' + hours % 10;
+ *p++ = ' ';
+ *p++ = '0' + minutes / 10;
+ *p++ = '0' + minutes % 10;
+ *p++ = ' ';
+ *p++ = '0' + seconds / 10;
+ *p++ = '0' + seconds % 10;
+ *p = '\0';
+
+ wb->len += (size_t)(p - b);
// terminate it
wb->buffer[wb->len] = '\0';