From 6f99b580990817696fd999a070b13461970cd166 Mon Sep 17 00:00:00 2001 From: dzaima Date: Tue, 21 Sep 2021 16:44:23 +0300 Subject: [PATCH] argument "-" for stdin file --- src/core/chrarr.h | 3 +++ src/core/stuff.h | 2 -- src/main.c | 20 +++++++++++++++----- src/utils/file.c | 20 ++++++++++++++++---- src/utils/file.h | 2 ++ src/utils/utf.c | 6 ++++++ 6 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/core/chrarr.h b/src/core/chrarr.h index d80f1847..f808fa21 100644 --- a/src/core/chrarr.h +++ b/src/core/chrarr.h @@ -1,6 +1,9 @@ B m_str8(usz sz, char* s); B m_str8l(char* s); B m_str32(u32* s); +B m_str8l(char* s); +B fromUTF8l(char* x); +B fromUTF8a(I8Arr* x); C8Arr* cpyC8Arr (B x); // consumes C16Arr* cpyC16Arr(B x); // consumes diff --git a/src/core/stuff.h b/src/core/stuff.h index 334fdfcd..5effb432 100644 --- a/src/core/stuff.h +++ b/src/core/stuff.h @@ -118,8 +118,6 @@ static bool elNum(u8 x) { // string stuff -B m_str8l(char* s); -B fromUTF8l(char* x); i32 num_fmt(char buf[30], f64 x); #define NUM_FMT_BUF(N,X) char N[30]; num_fmt(N, X); B append_fmt(B s, char* p, ...); diff --git a/src/main.c b/src/main.c index 0856717b..cc83bf13 100644 --- a/src/main.c +++ b/src/main.c @@ -53,11 +53,13 @@ int main(int argc, char* argv[]) { #endif bool startREPL = argc==1; bool silentREPL = false; + bool execStdin = false; if (!startREPL) { i32 i = 1; while (i!=argc) { char* carg = argv[i]; if (carg[0]!='-') break; + if (carg[1]==0) { execStdin=true; i++; break; } i++; if (carg[1]=='-') { if (!strcmp(carg, "--help")) { @@ -124,16 +126,17 @@ int main(int argc, char* argv[]) { break; } #endif - case 'r': { startREPL = true; break; } - case 's': { startREPL = true; silentREPL = true; break; } + case 'r': { startREPL=true; break; } + case 's': { startREPL=true; silentREPL=true; break; } } } } } execFile: - if (i!=argc) { + if (i!=argc || execStdin) { repl_init(); - B src = fromUTF8l(argv[i++]); + B src; + if (!execStdin) src = fromUTF8l(argv[i++]); B args; if (i==argc) { args = emptySVec(); @@ -144,7 +147,14 @@ int main(int argc, char* argv[]) { } args = ap.b; } - dec(bqn_execFile(src, args)); + + B execRes; + if (execStdin) { + execRes = gsc_exec_inline(fromUTF8a(stdin_allBytes()), m_str8l("(-)"), args); + } else { + execRes = bqn_execFile(src, args); + } + dec(execRes); #ifdef HEAP_VERIFY heapVerify(); #endif diff --git a/src/utils/file.c b/src/utils/file.c index 70397faf..88e101fb 100644 --- a/src/utils/file.c +++ b/src/utils/file.c @@ -37,10 +37,7 @@ I8Arr* file_bytes(B path) { // consumes return src; } B file_chars(B path) { // consumes - I8Arr* c = file_bytes(path); - B r = fromUTF8((char*)c->a, c->ia); - ptr_dec(c); - return r; + return fromUTF8a(file_bytes(path)); } B file_lines(B path) { // consumes I8Arr* tf = file_bytes(path); @@ -68,6 +65,21 @@ B file_lines(B path) { // consumes return harr_fv(r); } +I8Arr* stdin_allBytes() { + B r = emptyIVec(); + u64 SZ = 8192; + TALLOC(i8, t, SZ); + while(true) { + u64 read = fread(t, 1, SZ, stdin); + if (read==0) break; + i8* ap; B a = m_i8arrv(&ap, read); + memcpy(ap, t, read); + r = vec_join(r, a); + } + TFREE(t); + return toI8Arr(r); +} + B path_resolve(B base, B rel) { // consumes rel; assumes base is a char vector or bi_N diff --git a/src/utils/file.h b/src/utils/file.h index e1c8e39f..7f857938 100644 --- a/src/utils/file.h +++ b/src/utils/file.h @@ -10,6 +10,8 @@ I8Arr* file_bytes(B path); // consumes B file_chars(B path); // consumes B file_lines(B path); // consumes +I8Arr* stdin_allBytes(); + void file_wChars(B path, B x); // consumes path void file_wBytes(B path, B x); // consumes path diff --git a/src/utils/utf.c b/src/utils/utf.c index 5cf8aaa9..0ebda2c1 100644 --- a/src/utils/utf.c +++ b/src/utils/utf.c @@ -49,6 +49,12 @@ B fromUTF8l(char* s) { return fromUTF8(s, strlen(s)); } +B fromUTF8a(I8Arr* a) { // consumes a + B r = fromUTF8((char*)a->a, a->ia); + ptr_dec(a); + return r; +} + void printUTF8(u32 c) { if (c<128) printf("%c", c); else if (c<=0x07FF) printf("%c%c" , 0xC0| c>>6 , 0x80|(c &0x3F) );