MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

proper date library (mini)

+92 -5
+1 -1
meson.build
··· 40 40 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 41 41 42 42 version_conf = configuration_data() 43 - version_conf.set('ANT_VERSION', '0.0.5.35') 43 + version_conf.set('ANT_VERSION', '0.0.5.36') 44 44 version_conf.set('ANT_GIT_HASH', git_hash) 45 45 version_conf.set('ANT_BUILD_DATE', build_date) 46 46
+91 -4
src/ant.c
··· 160 160 static jsval_t builtin_array_slice(struct js *js, jsval_t *args, int nargs); 161 161 static jsval_t builtin_array_join(struct js *js, jsval_t *args, int nargs); 162 162 static jsval_t builtin_array_includes(struct js *js, jsval_t *args, int nargs); 163 + static jsval_t builtin_array_every(struct js *js, jsval_t *args, int nargs); 163 164 static jsval_t builtin_Error(struct js *js, jsval_t *args, int nargs); 164 165 static jsval_t builtin_string_indexOf(struct js *js, jsval_t *args, int nargs); 165 166 static jsval_t builtin_string_substring(struct js *js, jsval_t *args, int nargs); ··· 251 252 return n + cpy(buf + n, len - n, "]", 1); 252 253 } 253 254 255 + static size_t strdate(struct js *js, jsval_t obj, char *buf, size_t len) { 256 + jsoff_t time_off = lkp(js, obj, "__time", 6); 257 + if (time_off == 0) return cpy(buf, len, "Invalid Date", 12); 258 + 259 + jsval_t time_val = resolveprop(js, mkval(T_PROP, time_off)); 260 + if (vtype(time_val) != T_NUM) return cpy(buf, len, "Invalid Date", 12); 261 + 262 + double timestamp_ms = tod(time_val); 263 + time_t timestamp_sec = (time_t)(timestamp_ms / 1000.0); 264 + struct tm *tm_local = localtime(&timestamp_sec); 265 + 266 + if (!tm_local) return cpy(buf, len, "Invalid Date", 12); 267 + 268 + char date_part[64]; 269 + strftime(date_part, sizeof(date_part), "%a %b %d %Y %H:%M:%S", tm_local); 270 + 271 + time_t now = timestamp_sec; 272 + struct tm *gm = gmtime(&now); 273 + struct tm local_copy = *tm_local; 274 + time_t local_time = mktime(&local_copy); 275 + time_t gmt_time = mktime(gm); 276 + long offset_sec = (long)difftime(local_time, gmt_time); 277 + int offset_hours = (int)(offset_sec / 3600); 278 + int offset_mins = (int)(labs(offset_sec) % 3600) / 60; 279 + 280 + char tz_name[64]; 281 + strftime(tz_name, sizeof(tz_name), "%Z", tm_local); 282 + 283 + return (size_t) snprintf(buf, len, "%s GMT%+03d%02d (%s)", date_part, offset_hours, offset_mins, tz_name); 284 + } 285 + 254 286 static size_t strobj(struct js *js, jsval_t obj, char *buf, size_t len) { 287 + jsoff_t time_off = lkp(js, obj, "__time", 6); 288 + if (time_off != 0) return strdate(js, obj, buf, len); 289 + 255 290 size_t n = cpy(buf, len, "{", 1); 256 291 jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK); 257 292 ··· 270 305 271 306 static size_t strnum(jsval_t value, char *buf, size_t len) { 272 307 double dv = tod(value), iv; 273 - const char *fmt = modf(dv, &iv) == 0.0 ? "%.17g" : "%g"; 274 - return (size_t) snprintf(buf, len, fmt, dv); 308 + double frac = modf(dv, &iv); 309 + 310 + if (dv >= -9007199254740991.0 && dv <= 9007199254740991.0) { 311 + if (frac == 0.0) { 312 + return (size_t) snprintf(buf, len, "%.0f", dv); 313 + } else { 314 + return (size_t) snprintf(buf, len, "%.17g", dv); 315 + } 316 + } 317 + return (size_t) snprintf(buf, len, "%g", dv); 275 318 } 276 319 277 320 static jsoff_t vstr(struct js *js, jsval_t value, jsoff_t *len) { ··· 1080 1123 return js_mkfun(builtin_array_join); 1081 1124 } else if (streq(ptr, codereflen(r), "includes", 8)) { 1082 1125 return js_mkfun(builtin_array_includes); 1126 + } else if (streq(ptr, codereflen(r), "every", 5)) { 1127 + return js_mkfun(builtin_array_every); 1083 1128 } 1084 1129 } 1085 1130 ··· 3690 3735 if (nargs == 0) { 3691 3736 struct timeval tv; 3692 3737 gettimeofday(&tv, NULL); 3693 - timestamp_ms = (double)tv.tv_sec * 1000.0 + (double)tv.tv_usec / 1000.0; 3738 + timestamp_ms = (double)tv.tv_sec * 1000.0 + (double)(tv.tv_usec / 1000); 3694 3739 } else if (nargs == 1) { 3695 3740 if (vtype(args[0]) == T_NUM) { 3696 3741 timestamp_ms = tod(args[0]); ··· 3716 3761 3717 3762 struct timeval tv; 3718 3763 gettimeofday(&tv, NULL); 3719 - double timestamp_ms = (double)tv.tv_sec * 1000.0 + (double)tv.tv_usec / 1000.0; 3764 + double timestamp_ms = (double)tv.tv_sec * 1000.0 + (double)(tv.tv_usec / 1000); 3720 3765 3721 3766 return tov(timestamp_ms); 3722 3767 } ··· 3977 4022 } 3978 4023 } 3979 4024 return mkval(T_BOOL, 0); 4025 + } 4026 + 4027 + static jsval_t builtin_array_every(struct js *js, jsval_t *args, int nargs) { 4028 + jsval_t arr = js->this_val; 4029 + if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) { 4030 + return js_mkerr(js, "every called on non-array"); 4031 + } 4032 + 4033 + if (nargs == 0 || vtype(args[0]) != T_FUNC) { 4034 + return js_mkerr(js, "every requires a function argument"); 4035 + } 4036 + 4037 + jsval_t callback = args[0]; 4038 + jsoff_t off = lkp(js, arr, "length", 6); 4039 + jsoff_t len = 0; 4040 + 4041 + if (off != 0) { 4042 + jsval_t len_val = resolveprop(js, mkval(T_PROP, off)); 4043 + if (vtype(len_val) == T_NUM) len = (jsoff_t) tod(len_val); 4044 + } 4045 + 4046 + for (jsoff_t i = 0; i < len; i++) { 4047 + char idxstr[16]; 4048 + snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 4049 + jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 4050 + 4051 + jsval_t elem = js_mkundef(); 4052 + if (elem_off != 0) { 4053 + elem = resolveprop(js, mkval(T_PROP, elem_off)); 4054 + } 4055 + 4056 + jsval_t call_args[3] = { elem, tov((double)i), arr }; 4057 + jsval_t result = call_js_with_args(js, callback, call_args, 3); 4058 + 4059 + if (is_err(result)) return result; 4060 + 4061 + if (!js_truthy(js, result)) { 4062 + return mkval(T_BOOL, 0); 4063 + } 4064 + } 4065 + 4066 + return mkval(T_BOOL, 1); 3980 4067 } 3981 4068 3982 4069 static jsval_t builtin_string_indexOf(struct js *js, jsval_t *args, int nargs) {