forked from cory/tildefriends
quickjs-2021-03-27.tar.xz
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3649 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
95
deps/quickjs/quickjs-libc.c
vendored
95
deps/quickjs/quickjs-libc.c
vendored
@ -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
|
||||
|
Reference in New Issue
Block a user