mirror of
https://github.com/janet-lang/janet
synced 2024-11-06 00:36:17 +00:00
Merge branch 'master' into compile-opt
This commit is contained in:
commit
f08874e65e
5
.gitignore
vendored
5
.gitignore
vendored
@ -34,8 +34,11 @@ local
|
|||||||
|
|
||||||
# Common test files I use.
|
# Common test files I use.
|
||||||
temp.janet
|
temp.janet
|
||||||
temp*.janet
|
temp.c
|
||||||
|
temp*janet
|
||||||
|
temp*.c
|
||||||
scratch.janet
|
scratch.janet
|
||||||
|
scratch.c
|
||||||
|
|
||||||
# Emscripten
|
# Emscripten
|
||||||
*.bc
|
*.bc
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## Unreleased - ???
|
## 1.32.1 - 2023-10-15
|
||||||
|
- Fix return value from C function `janet_dobytes` when called on Janet functions that yield to event loop.
|
||||||
- Change C API for event loop interaction - get rid of JanetListener and instead use `janet_async_start` and `janet_async_end`.
|
- Change C API for event loop interaction - get rid of JanetListener and instead use `janet_async_start` and `janet_async_end`.
|
||||||
- Rework event loop to make fewer system calls on kqueue and epoll.
|
- Rework event loop to make fewer system calls on kqueue and epoll.
|
||||||
- Expose atomic refcount abstraction in janet.h
|
- Expose atomic refcount abstraction in janet.h
|
||||||
|
4
Makefile
4
Makefile
@ -197,9 +197,9 @@ build/%.bin.o: src/%.c $(JANET_HEADERS) $(JANET_LOCAL_HEADERS) Makefile
|
|||||||
########################
|
########################
|
||||||
|
|
||||||
ifeq ($(UNAME), Darwin)
|
ifeq ($(UNAME), Darwin)
|
||||||
SONAME=libjanet.1.31.dylib
|
SONAME=libjanet.1.32.dylib
|
||||||
else
|
else
|
||||||
SONAME=libjanet.so.1.31
|
SONAME=libjanet.so.1.32
|
||||||
endif
|
endif
|
||||||
|
|
||||||
build/c/shell.c: src/mainclient/shell.c
|
build/c/shell.c: src/mainclient/shell.c
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
project('janet', 'c',
|
project('janet', 'c',
|
||||||
default_options : ['c_std=c99', 'build.c_std=c99', 'b_lundef=false', 'default_library=both'],
|
default_options : ['c_std=c99', 'build.c_std=c99', 'b_lundef=false', 'default_library=both'],
|
||||||
version : '1.31.0')
|
version : '1.32.1')
|
||||||
|
|
||||||
# Global settings
|
# Global settings
|
||||||
janet_path = join_paths(get_option('prefix'), get_option('libdir'), 'janet')
|
janet_path = join_paths(get_option('prefix'), get_option('libdir'), 'janet')
|
||||||
|
@ -2333,26 +2333,36 @@
|
|||||||
(def default-peg-grammar
|
(def default-peg-grammar
|
||||||
`The default grammar used for pegs. This grammar defines several common patterns
|
`The default grammar used for pegs. This grammar defines several common patterns
|
||||||
that should make it easier to write more complex patterns.`
|
that should make it easier to write more complex patterns.`
|
||||||
~@{:d (range "09")
|
~@{:a (range "az" "AZ")
|
||||||
:a (range "az" "AZ")
|
:d (range "09")
|
||||||
|
:h (range "09" "af" "AF")
|
||||||
:s (set " \t\r\n\0\f\v")
|
:s (set " \t\r\n\0\f\v")
|
||||||
:w (range "az" "AZ" "09")
|
:w (range "az" "AZ" "09")
|
||||||
:h (range "09" "af" "AF")
|
|
||||||
:S (if-not :s 1)
|
|
||||||
:W (if-not :w 1)
|
|
||||||
:A (if-not :a 1)
|
:A (if-not :a 1)
|
||||||
:D (if-not :d 1)
|
:D (if-not :d 1)
|
||||||
:H (if-not :h 1)
|
:H (if-not :h 1)
|
||||||
:d+ (some :d)
|
:S (if-not :s 1)
|
||||||
|
:W (if-not :w 1)
|
||||||
:a+ (some :a)
|
:a+ (some :a)
|
||||||
|
:d+ (some :d)
|
||||||
|
:h+ (some :h)
|
||||||
:s+ (some :s)
|
:s+ (some :s)
|
||||||
:w+ (some :w)
|
:w+ (some :w)
|
||||||
:h+ (some :h)
|
:A+ (some :A)
|
||||||
:d* (any :d)
|
:D+ (some :D)
|
||||||
|
:H+ (some :H)
|
||||||
|
:S+ (some :S)
|
||||||
|
:W+ (some :W)
|
||||||
:a* (any :a)
|
:a* (any :a)
|
||||||
:w* (any :w)
|
:d* (any :d)
|
||||||
|
:h* (any :h)
|
||||||
:s* (any :s)
|
:s* (any :s)
|
||||||
:h* (any :h)})
|
:w* (any :w)
|
||||||
|
:A* (any :A)
|
||||||
|
:D* (any :D)
|
||||||
|
:H* (any :H)
|
||||||
|
:S* (any :S)
|
||||||
|
:W* (any :W)})
|
||||||
|
|
||||||
(setdyn *peg-grammar* default-peg-grammar)
|
(setdyn *peg-grammar* default-peg-grammar)
|
||||||
|
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
#define JANETCONF_H
|
#define JANETCONF_H
|
||||||
|
|
||||||
#define JANET_VERSION_MAJOR 1
|
#define JANET_VERSION_MAJOR 1
|
||||||
#define JANET_VERSION_MINOR 31
|
#define JANET_VERSION_MINOR 32
|
||||||
#define JANET_VERSION_PATCH 0
|
#define JANET_VERSION_PATCH 1
|
||||||
#define JANET_VERSION_EXTRA ""
|
#define JANET_VERSION_EXTRA ""
|
||||||
#define JANET_VERSION "1.31.0"
|
#define JANET_VERSION "1.32.1"
|
||||||
|
|
||||||
/* #define JANET_BUILD "local" */
|
/* #define JANET_BUILD "local" */
|
||||||
|
|
||||||
|
@ -135,8 +135,7 @@ void janet_buffer_extra(JanetBuffer *buffer, int32_t n) {
|
|||||||
|
|
||||||
/* Push a cstring to buffer */
|
/* Push a cstring to buffer */
|
||||||
void janet_buffer_push_cstring(JanetBuffer *buffer, const char *cstring) {
|
void janet_buffer_push_cstring(JanetBuffer *buffer, const char *cstring) {
|
||||||
int32_t len = 0;
|
int32_t len = strlen(cstring);
|
||||||
while (cstring[len]) ++len;
|
|
||||||
janet_buffer_push_bytes(buffer, (const uint8_t *) cstring, len);
|
janet_buffer_push_bytes(buffer, (const uint8_t *) cstring, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -505,7 +505,15 @@ JanetAtomicInt janet_atomic_dec(JanetAtomicInt volatile *x) {
|
|||||||
#ifdef JANET_WINDOWS
|
#ifdef JANET_WINDOWS
|
||||||
return InterlockedDecrement(x);
|
return InterlockedDecrement(x);
|
||||||
#else
|
#else
|
||||||
return __atomic_add_fetch(x, -1, __ATOMIC_RELAXED);
|
return __atomic_add_fetch(x, -1, __ATOMIC_ACQ_REL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
JanetAtomicInt janet_atomic_load(JanetAtomicInt volatile *x) {
|
||||||
|
#ifdef JANET_WINDOWS
|
||||||
|
return InterlockedOr(x, 0);
|
||||||
|
#else
|
||||||
|
return __atomic_load_n(x, __ATOMIC_ACQUIRE);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1284,7 +1284,7 @@ void janet_loop1_impl(int has_timeout, JanetTimestamp timeout);
|
|||||||
int janet_loop_done(void) {
|
int janet_loop_done(void) {
|
||||||
return !((janet_vm.spawn.head != janet_vm.spawn.tail) ||
|
return !((janet_vm.spawn.head != janet_vm.spawn.tail) ||
|
||||||
janet_vm.tq_count ||
|
janet_vm.tq_count ||
|
||||||
janet_vm.listener_count);
|
janet_atomic_load(&janet_vm.listener_count));
|
||||||
}
|
}
|
||||||
|
|
||||||
JanetFiber *janet_loop1(void) {
|
JanetFiber *janet_loop1(void) {
|
||||||
@ -1346,7 +1346,7 @@ JanetFiber *janet_loop1(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Poll for events */
|
/* Poll for events */
|
||||||
if (janet_vm.tq_count || janet_vm.listener_count) {
|
if (janet_vm.tq_count || janet_atomic_load(&janet_vm.listener_count)) {
|
||||||
JanetTimeout to;
|
JanetTimeout to;
|
||||||
memset(&to, 0, sizeof(to));
|
memset(&to, 0, sizeof(to));
|
||||||
int has_timeout;
|
int has_timeout;
|
||||||
@ -1365,7 +1365,7 @@ JanetFiber *janet_loop1(void) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Run polling implementation only if pending timeouts or pending events */
|
/* Run polling implementation only if pending timeouts or pending events */
|
||||||
if (janet_vm.tq_count || janet_vm.listener_count) {
|
if (janet_vm.tq_count || janet_atomic_load(&janet_vm.listener_count)) {
|
||||||
janet_loop1_impl(has_timeout, to.when);
|
janet_loop1_impl(has_timeout, to.when);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -999,13 +999,13 @@ typedef struct {
|
|||||||
uint64_t x;
|
uint64_t x;
|
||||||
} sysv64_sseint_return;
|
} sysv64_sseint_return;
|
||||||
typedef sysv64_int_return janet_sysv64_variant_1(uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e, uint64_t f,
|
typedef sysv64_int_return janet_sysv64_variant_1(uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e, uint64_t f,
|
||||||
double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8);
|
double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8);
|
||||||
typedef sysv64_sse_return janet_sysv64_variant_2(uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e, uint64_t f,
|
typedef sysv64_sse_return janet_sysv64_variant_2(uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e, uint64_t f,
|
||||||
double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8);
|
double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8);
|
||||||
typedef sysv64_intsse_return janet_sysv64_variant_3(uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e, uint64_t f,
|
typedef sysv64_intsse_return janet_sysv64_variant_3(uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e, uint64_t f,
|
||||||
double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8);
|
double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8);
|
||||||
typedef sysv64_sseint_return janet_sysv64_variant_4(uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e, uint64_t f,
|
typedef sysv64_sseint_return janet_sysv64_variant_4(uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e, uint64_t f,
|
||||||
double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8);
|
double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8);
|
||||||
|
|
||||||
static Janet janet_ffi_sysv64(JanetFFISignature *signature, void *function_pointer, const Janet *argv) {
|
static Janet janet_ffi_sysv64(JanetFFISignature *signature, void *function_pointer, const Janet *argv) {
|
||||||
union {
|
union {
|
||||||
|
@ -239,8 +239,8 @@ int janet_fiber_funcframe(JanetFiber *fiber, JanetFunction *func) {
|
|||||||
fiber->data + tuplehead,
|
fiber->data + tuplehead,
|
||||||
oldtop - tuplehead)
|
oldtop - tuplehead)
|
||||||
: janet_wrap_tuple(janet_tuple_n(
|
: janet_wrap_tuple(janet_tuple_n(
|
||||||
fiber->data + tuplehead,
|
fiber->data + tuplehead,
|
||||||
oldtop - tuplehead));
|
oldtop - tuplehead));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,8 +370,8 @@ int janet_fiber_funcframe_tail(JanetFiber *fiber, JanetFunction *func) {
|
|||||||
fiber->data + tuplehead,
|
fiber->data + tuplehead,
|
||||||
fiber->stacktop - tuplehead)
|
fiber->stacktop - tuplehead)
|
||||||
: janet_wrap_tuple(janet_tuple_n(
|
: janet_wrap_tuple(janet_tuple_n(
|
||||||
fiber->data + tuplehead,
|
fiber->data + tuplehead,
|
||||||
fiber->stacktop - tuplehead));
|
fiber->stacktop - tuplehead));
|
||||||
}
|
}
|
||||||
stacksize = tuplehead - fiber->stackstart + 1;
|
stacksize = tuplehead - fiber->stackstart + 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1395,6 +1395,34 @@ JANET_CORE_FN(os_posix_exec,
|
|||||||
return os_execute_impl(argc, argv, JANET_EXECUTE_EXEC);
|
return os_execute_impl(argc, argv, JANET_EXECUTE_EXEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JANET_CORE_FN(os_posix_fork,
|
||||||
|
"(os/posix-fork)",
|
||||||
|
"Make a `fork` system call and create a new process. Return nil if in the new process, otherwise a core/process object (as returned by os/spawn). "
|
||||||
|
"Not supported on all systems (POSIX only).") {
|
||||||
|
janet_sandbox_assert(JANET_SANDBOX_SUBPROCESS);
|
||||||
|
janet_fixarity(argc, 0);
|
||||||
|
(void) argv;
|
||||||
|
#ifdef JANET_WINDOWS
|
||||||
|
janet_panic("not supported");
|
||||||
|
#else
|
||||||
|
pid_t result;
|
||||||
|
do {
|
||||||
|
result = fork();
|
||||||
|
} while (result == -1 && errno == EINTR);
|
||||||
|
if (result == -1) {
|
||||||
|
janet_panic(strerror(errno));
|
||||||
|
}
|
||||||
|
if (result) {
|
||||||
|
JanetProc *proc = janet_abstract(&ProcAT, sizeof(JanetProc));
|
||||||
|
memset(proc, 0, sizeof(JanetProc));
|
||||||
|
proc->pid = result;
|
||||||
|
proc->flags = JANET_PROC_ALLOW_ZOMBIE;
|
||||||
|
return janet_wrap_abstract(proc);
|
||||||
|
}
|
||||||
|
return janet_wrap_nil();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef JANET_EV
|
#ifdef JANET_EV
|
||||||
/* Runs in a separate thread */
|
/* Runs in a separate thread */
|
||||||
static JanetEVGenericMessage os_shell_subr(JanetEVGenericMessage args) {
|
static JanetEVGenericMessage os_shell_subr(JanetEVGenericMessage args) {
|
||||||
@ -2371,34 +2399,6 @@ JANET_CORE_FN(os_permission_int,
|
|||||||
return janet_wrap_integer(os_get_unix_mode(argv, 0));
|
return janet_wrap_integer(os_get_unix_mode(argv, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
JANET_CORE_FN(os_posix_fork,
|
|
||||||
"(os/posix-fork)",
|
|
||||||
"Make a `fork` system call and create a new process. Return nil if in the new process, otherwise a core/process object (as returned by os/spawn). "
|
|
||||||
"Not supported on all systems (POSIX only).") {
|
|
||||||
janet_sandbox_assert(JANET_SANDBOX_SUBPROCESS);
|
|
||||||
janet_fixarity(argc, 0);
|
|
||||||
(void) argv;
|
|
||||||
#ifdef JANET_WINDOWS
|
|
||||||
janet_panic("not supported");
|
|
||||||
#else
|
|
||||||
pid_t result;
|
|
||||||
do {
|
|
||||||
result = fork();
|
|
||||||
} while (result == -1 && errno == EINTR);
|
|
||||||
if (result == -1) {
|
|
||||||
janet_panic(strerror(errno));
|
|
||||||
}
|
|
||||||
if (result) {
|
|
||||||
JanetProc *proc = janet_abstract(&ProcAT, sizeof(JanetProc));
|
|
||||||
memset(proc, 0, sizeof(JanetProc));
|
|
||||||
proc->pid = result;
|
|
||||||
proc->flags = JANET_PROC_ALLOW_ZOMBIE;
|
|
||||||
return janet_wrap_abstract(proc);
|
|
||||||
}
|
|
||||||
return janet_wrap_nil();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef JANET_EV
|
#ifdef JANET_EV
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
/* Implements a pretty printer for Janet. The pretty printer
|
/* Implements a pretty printer for Janet. The pretty printer
|
||||||
* is simple and not that flexible, but fast. */
|
* is simple and not that flexible, but fast. */
|
||||||
@ -38,11 +39,15 @@
|
|||||||
/* Temporary buffer size */
|
/* Temporary buffer size */
|
||||||
#define BUFSIZE 64
|
#define BUFSIZE 64
|
||||||
|
|
||||||
|
/* Preprocessor hacks */
|
||||||
|
#define STR_HELPER(x) #x
|
||||||
|
#define STR(x) STR_HELPER(x)
|
||||||
|
|
||||||
static void number_to_string_b(JanetBuffer *buffer, double x) {
|
static void number_to_string_b(JanetBuffer *buffer, double x) {
|
||||||
janet_buffer_ensure(buffer, buffer->count + BUFSIZE, 2);
|
janet_buffer_ensure(buffer, buffer->count + BUFSIZE, 2);
|
||||||
const char *fmt = (x == floor(x) &&
|
const char *fmt = (x == floor(x) &&
|
||||||
x <= JANET_INTMAX_DOUBLE &&
|
x <= JANET_INTMAX_DOUBLE &&
|
||||||
x >= JANET_INTMIN_DOUBLE) ? "%.0f" : "%g";
|
x >= JANET_INTMIN_DOUBLE) ? "%.0f" : ("%." STR(DBL_DIG) "g");
|
||||||
int count;
|
int count;
|
||||||
if (x == 0.0) {
|
if (x == 0.0) {
|
||||||
/* Prevent printing of '-0' */
|
/* Prevent printing of '-0' */
|
||||||
|
@ -32,6 +32,7 @@ int janet_dobytes(JanetTable *env, const uint8_t *bytes, int32_t len, const char
|
|||||||
int errflags = 0, done = 0;
|
int errflags = 0, done = 0;
|
||||||
int32_t index = 0;
|
int32_t index = 0;
|
||||||
Janet ret = janet_wrap_nil();
|
Janet ret = janet_wrap_nil();
|
||||||
|
JanetFiber *fiber = NULL;
|
||||||
const uint8_t *where = sourcePath ? janet_cstring(sourcePath) : NULL;
|
const uint8_t *where = sourcePath ? janet_cstring(sourcePath) : NULL;
|
||||||
|
|
||||||
if (where) janet_gcroot(janet_wrap_string(where));
|
if (where) janet_gcroot(janet_wrap_string(where));
|
||||||
@ -47,7 +48,7 @@ int janet_dobytes(JanetTable *env, const uint8_t *bytes, int32_t len, const char
|
|||||||
JanetCompileResult cres = janet_compile(form, env, where);
|
JanetCompileResult cres = janet_compile(form, env, where);
|
||||||
if (cres.status == JANET_COMPILE_OK) {
|
if (cres.status == JANET_COMPILE_OK) {
|
||||||
JanetFunction *f = janet_thunk(cres.funcdef);
|
JanetFunction *f = janet_thunk(cres.funcdef);
|
||||||
JanetFiber *fiber = janet_fiber(f, 64, 0, NULL);
|
fiber = janet_fiber(f, 64, 0, NULL);
|
||||||
fiber->env = env;
|
fiber->env = env;
|
||||||
JanetSignal status = janet_continue(fiber, janet_wrap_nil(), &ret);
|
JanetSignal status = janet_continue(fiber, janet_wrap_nil(), &ret);
|
||||||
if (status != JANET_SIGNAL_OK && status != JANET_SIGNAL_EVENT) {
|
if (status != JANET_SIGNAL_OK && status != JANET_SIGNAL_EVENT) {
|
||||||
@ -112,9 +113,14 @@ int janet_dobytes(JanetTable *env, const uint8_t *bytes, int32_t len, const char
|
|||||||
#ifdef JANET_EV
|
#ifdef JANET_EV
|
||||||
/* Enter the event loop if we are not already in it */
|
/* Enter the event loop if we are not already in it */
|
||||||
if (janet_vm.stackn == 0) {
|
if (janet_vm.stackn == 0) {
|
||||||
janet_gcroot(ret);
|
if (fiber) {
|
||||||
|
janet_gcroot(janet_wrap_fiber(fiber));
|
||||||
|
}
|
||||||
janet_loop();
|
janet_loop();
|
||||||
janet_gcunroot(ret);
|
if (fiber) {
|
||||||
|
janet_gcunroot(janet_wrap_fiber(fiber));
|
||||||
|
ret = fiber->last_value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (out) *out = ret;
|
if (out) *out = ret;
|
||||||
|
@ -647,6 +647,7 @@ typedef int32_t JanetAtomicInt;
|
|||||||
#endif
|
#endif
|
||||||
JANET_API JanetAtomicInt janet_atomic_inc(JanetAtomicInt volatile *x);
|
JANET_API JanetAtomicInt janet_atomic_inc(JanetAtomicInt volatile *x);
|
||||||
JANET_API JanetAtomicInt janet_atomic_dec(JanetAtomicInt volatile *x);
|
JANET_API JanetAtomicInt janet_atomic_dec(JanetAtomicInt volatile *x);
|
||||||
|
JANET_API JanetAtomicInt janet_atomic_load(JanetAtomicInt volatile *x);
|
||||||
|
|
||||||
/* We provide three possible implementations of Janets. The preferred
|
/* We provide three possible implementations of Janets. The preferred
|
||||||
* nanboxing approach, for 32 or 64 bits, and the standard C version. Code in the rest of the
|
* nanboxing approach, for 32 or 64 bits, and the standard C version. Code in the rest of the
|
||||||
|
@ -502,10 +502,10 @@ static void kright(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void krightw(void) {
|
static void krightw(void) {
|
||||||
while (gbl_pos != gbl_len && !isspace(gbl_buf[gbl_pos])) {
|
while (gbl_pos != gbl_len && isspace(gbl_buf[gbl_pos])) {
|
||||||
gbl_pos++;
|
gbl_pos++;
|
||||||
}
|
}
|
||||||
while (gbl_pos != gbl_len && isspace(gbl_buf[gbl_pos])) {
|
while (gbl_pos != gbl_len && !isspace(gbl_buf[gbl_pos])) {
|
||||||
gbl_pos++;
|
gbl_pos++;
|
||||||
}
|
}
|
||||||
refresh();
|
refresh();
|
||||||
|
Loading…
Reference in New Issue
Block a user