summaryrefslogtreecommitdiff
path: root/quickjs-libc.c
diff options
context:
space:
mode:
authorbellard <6490144+bellard@users.noreply.github.com>2021-03-27 11:17:31 +0100
committerbellard <6490144+bellard@users.noreply.github.com>2021-03-27 11:17:31 +0100
commitb5e62895c619d4ffc75c9d822c8d85f1ece77e5b (patch)
treec47bdf65103103b4f716ac52730d9cc24f398ca6 /quickjs-libc.c
parent204682fb87ab9312f0cf81f959ecd181180457bc (diff)
downloadquickjs-b5e62895c619d4ffc75c9d822c8d85f1ece77e5b.tar.gz
quickjs-b5e62895c619d4ffc75c9d822c8d85f1ece77e5b.zip
2021-03-27 release
Diffstat (limited to 'quickjs-libc.c')
-rw-r--r--quickjs-libc.c95
1 files changed, 70 insertions, 25 deletions
diff --git a/quickjs-libc.c b/quickjs-libc.c
index e8b81e9..e180dd0 100644
--- a/quickjs-libc.c
+++ b/quickjs-libc.c
@@ -1,8 +1,8 @@
/*
* QuickJS C library
*
- * Copyright (c) 2017-2020 Fabrice Bellard
- * Copyright (c) 2017-2020 Charlie Gordon
+ * Copyright (c) 2017-2021 Fabrice Bellard
+ * Copyright (c) 2017-2021 Charlie Gordon
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -1663,7 +1663,7 @@ static JSValue js_os_isatty(JSContext *ctx, JSValueConst this_val,
int fd;
if (JS_ToInt32(ctx, &fd, argv[0]))
return JS_EXCEPTION;
- return JS_NewBool(ctx, isatty(fd) == 1);
+ return JS_NewBool(ctx, (isatty(fd) != 0));
}
#if defined(_WIN32)
@@ -1689,6 +1689,10 @@ static JSValue js_os_ttyGetWinSize(JSContext *ctx, JSValueConst this_val,
return obj;
}
+/* Windows 10 built-in VT100 emulation */
+#define __ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
+#define __ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200
+
static JSValue js_os_ttySetRaw(JSContext *ctx, JSValueConst this_val,
int argc, JSValueConst *argv)
{
@@ -1698,8 +1702,12 @@ static JSValue js_os_ttySetRaw(JSContext *ctx, JSValueConst this_val,
if (JS_ToInt32(ctx, &fd, argv[0]))
return JS_EXCEPTION;
handle = (HANDLE)_get_osfhandle(fd);
-
- SetConsoleMode(handle, ENABLE_WINDOW_INPUT);
+ SetConsoleMode(handle, ENABLE_WINDOW_INPUT | __ENABLE_VIRTUAL_TERMINAL_INPUT);
+ _setmode(fd, _O_BINARY);
+ if (fd == 0) {
+ handle = (HANDLE)_get_osfhandle(1); /* corresponding output */
+ SetConsoleMode(handle, ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT | __ENABLE_VIRTUAL_TERMINAL_PROCESSING);
+ }
return JS_UNDEFINED;
}
#else
@@ -1772,7 +1780,19 @@ static JSValue js_os_remove(JSContext *ctx, JSValueConst this_val,
filename = JS_ToCString(ctx, argv[0]);
if (!filename)
return JS_EXCEPTION;
- ret = js_get_errno(remove(filename));
+#if defined(_WIN32)
+ {
+ struct stat st;
+ if (stat(filename, &st) == 0 && S_ISDIR(st.st_mode)) {
+ ret = rmdir(filename);
+ } else {
+ ret = unlink(filename);
+ }
+ }
+#else
+ ret = remove(filename);
+#endif
+ ret = js_get_errno(ret);
JS_FreeCString(ctx, filename);
return JS_NewInt32(ctx, ret);
}
@@ -2588,7 +2608,47 @@ static JSValue js_os_utimes(JSContext *ctx, JSValueConst this_val,
return JS_NewInt32(ctx, ret);
}
-#if !defined(_WIN32)
+/* sleep(delay_ms) */
+static JSValue js_os_sleep(JSContext *ctx, JSValueConst this_val,
+ int argc, JSValueConst *argv)
+{
+ int64_t delay;
+ int ret;
+
+ if (JS_ToInt64(ctx, &delay, argv[0]))
+ return JS_EXCEPTION;
+ if (delay < 0)
+ delay = 0;
+#if defined(_WIN32)
+ {
+ if (delay > INT32_MAX)
+ delay = INT32_MAX;
+ Sleep(delay);
+ ret = 0;
+ }
+#else
+ {
+ struct timespec ts;
+
+ ts.tv_sec = delay / 1000;
+ ts.tv_nsec = (delay % 1000) * 1000000;
+ ret = js_get_errno(nanosleep(&ts, NULL));
+ }
+#endif
+ return JS_NewInt32(ctx, ret);
+}
+
+#if defined(_WIN32)
+static char *realpath(const char *path, char *buf)
+{
+ if (!_fullpath(buf, path, PATH_MAX)) {
+ errno = ENOENT;
+ return NULL;
+ } else {
+ return buf;
+ }
+}
+#endif
/* return [path, errorcode] */
static JSValue js_os_realpath(JSContext *ctx, JSValueConst this_val,
@@ -2612,6 +2672,7 @@ static JSValue js_os_realpath(JSContext *ctx, JSValueConst this_val,
return make_string_error(ctx, buf, err);
}
+#if !defined(_WIN32)
static JSValue js_os_symlink(JSContext *ctx, JSValueConst this_val,
int argc, JSValueConst *argv)
{
@@ -3031,22 +3092,6 @@ static JSValue js_os_kill(JSContext *ctx, JSValueConst this_val,
return JS_NewInt32(ctx, ret);
}
-/* sleep(delay_ms) */
-static JSValue js_os_sleep(JSContext *ctx, JSValueConst this_val,
- int argc, JSValueConst *argv)
-{
- int64_t delay;
- struct timespec ts;
- int ret;
-
- if (JS_ToInt64(ctx, &delay, argv[0]))
- return JS_EXCEPTION;
- ts.tv_sec = delay / 1000;
- ts.tv_nsec = (delay % 1000) * 1000000;
- ret = js_get_errno(nanosleep(&ts, NULL));
- return JS_NewInt32(ctx, ret);
-}
-
/* dup(fd) */
static JSValue js_os_dup(JSContext *ctx, JSValueConst this_val,
int argc, JSValueConst *argv)
@@ -3598,9 +3643,10 @@ static const JSCFunctionListEntry js_os_funcs[] = {
#endif
JS_CFUNC_MAGIC_DEF("stat", 1, js_os_stat, 0 ),
JS_CFUNC_DEF("utimes", 3, js_os_utimes ),
+ JS_CFUNC_DEF("sleep", 1, js_os_sleep ),
+ JS_CFUNC_DEF("realpath", 1, js_os_realpath ),
#if !defined(_WIN32)
JS_CFUNC_MAGIC_DEF("lstat", 1, js_os_stat, 1 ),
- JS_CFUNC_DEF("realpath", 1, js_os_realpath ),
JS_CFUNC_DEF("symlink", 2, js_os_symlink ),
JS_CFUNC_DEF("readlink", 1, js_os_readlink ),
JS_CFUNC_DEF("exec", 1, js_os_exec ),
@@ -3608,7 +3654,6 @@ static const JSCFunctionListEntry js_os_funcs[] = {
OS_FLAG(WNOHANG),
JS_CFUNC_DEF("pipe", 0, js_os_pipe ),
JS_CFUNC_DEF("kill", 2, js_os_kill ),
- JS_CFUNC_DEF("sleep", 1, js_os_sleep ),
JS_CFUNC_DEF("dup", 1, js_os_dup ),
JS_CFUNC_DEF("dup2", 2, js_os_dup2 ),
#endif