Skip to content

Commit 8090c0e

Browse files
gh-95: Add type BOOL.
1 parent 3c46516 commit 8090c0e

File tree

16 files changed

+404
-219
lines changed

16 files changed

+404
-219
lines changed

docs/SPECIFICATION.html

Lines changed: 70 additions & 49 deletions
Large diffs are not rendered by default.

ext/std/networking.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,7 @@ static Value op_tcp_close(Interpreter* interp, Value* args, int argc, Expr** arg
792792
RUNTIME_ERROR(interp, "TCP_CLOSE: invalid handle", line, col);
793793
}
794794
closesocket(s);
795-
return value_int(0);
795+
return value_bool(false);
796796
}
797797

798798
static Value op_udp_bind(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) {
@@ -951,7 +951,7 @@ static Value op_udp_close(Interpreter* interp, Value* args, int argc, Expr** arg
951951
RUNTIME_ERROR(interp, "UDP_CLOSE: invalid handle", line, col);
952952
}
953953
closesocket(s);
954-
return value_int(0);
954+
return value_bool(false);
955955
}
956956

957957
static Value op_http_get_text(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) {
@@ -1203,7 +1203,7 @@ static Value op_ftp_put_bytes(Interpreter* interp, Value* args, int argc, Expr**
12031203
RUNTIME_ERROR(interp, msg, line, col);
12041204
}
12051205
free(out);
1206-
return value_int(1);
1206+
return value_bool(true);
12071207
}
12081208

12091209
static Value op_smtp_send(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) {
@@ -1244,7 +1244,7 @@ static Value op_smtp_send(Interpreter* interp, Value* args, int argc, Expr** arg
12441244
RUNTIME_ERROR(interp, msg, line, col);
12451245
}
12461246
free(out);
1247-
return value_int(1);
1247+
return value_bool(true);
12481248
}
12491249

12501250
#ifdef _WIN32

ext/std/win32.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ static Value op_win_sleep(Interpreter* interp, Value* args, int argc, Expr** arg
9292
long long ms = value_as_int(interp, args[0], "ms", line, col);
9393
if (interp->error) return value_null();
9494
Sleep((DWORD)ms);
95-
return value_int(0);
95+
return value_bool(false);
9696
}
9797

9898
static Value op_win_last_error(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) {
@@ -147,7 +147,7 @@ static Value op_win_free_library(Interpreter* interp, Value* args, int argc, Exp
147147
set_runtime_error(interp, em, line, col);
148148
return value_null();
149149
}
150-
return value_int((int64_t)ok);
150+
return value_bool(ok != 0);
151151
}
152152

153153
static Value op_win_get_proc_address(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) {
@@ -255,7 +255,7 @@ static Value op_win_close_handle(Interpreter* interp, Value* args, int argc, Exp
255255
long long handle = value_as_int(interp, args[0], "handle", line, col); if (interp->error) return value_null();
256256
BOOL ok = CloseHandle((HANDLE)(intptr_t)handle);
257257
if (!ok) { DWORD err = GetLastError(); char em[128]; snprintf(em, sizeof(em), "CloseHandle failed: %lu", (unsigned long)err); set_runtime_error(interp, em, line, col); return value_null(); }
258-
return value_int((int64_t)ok);
258+
return value_bool(ok != 0);
259259
}
260260

261261
static Value op_win_virtual_alloc(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) {
@@ -279,7 +279,7 @@ static Value op_win_virtual_free(Interpreter* interp, Value* args, int argc, Exp
279279
DWORD free_type = (DWORD)value_as_int(interp, args[2], "free_type", line, col); if (interp->error) return value_null();
280280
BOOL ok = VirtualFree(addr, size, free_type);
281281
if (!ok) { DWORD err = GetLastError(); char em[128]; snprintf(em, sizeof(em), "VirtualFree failed: %lu", (unsigned long)err); set_runtime_error(interp, em, line, col); return value_null(); }
282-
return value_int((int64_t)ok);
282+
return value_bool(ok != 0);
283283
}
284284

285285
static Value op_win_format_message(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) {

lib/std/gui/gui.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ static Value op_show_image(Interpreter* interp, Value* args, int argc, Expr** ar
531531
InvalidateRect(win->hwnd, NULL, TRUE);
532532
UpdateWindow(win->hwnd);
533533
gui_pump_messages();
534-
return value_int(1);
534+
return value_bool(true);
535535
}
536536

537537
static Value op_close_window(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) {
@@ -550,7 +550,7 @@ static Value op_close_window(Interpreter* interp, Value* args, int argc, Expr**
550550
}
551551
DestroyWindow(win->hwnd);
552552
gui_pump_messages();
553-
return value_int(1);
553+
return value_bool(true);
554554
}
555555

556556
static Value op_minimize(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) {
@@ -565,7 +565,7 @@ static Value op_minimize(Interpreter* interp, Value* args, int argc, Expr** arg_
565565
if (!win || !IsWindow(win->hwnd)) return fail(interp, "GUI_MINIMIZE: invalid window handle", line, col);
566566
ShowWindow(win->hwnd, SW_MINIMIZE);
567567
gui_pump_messages();
568-
return value_int(1);
568+
return value_bool(true);
569569
}
570570

571571
static Value op_maximize(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) {
@@ -580,7 +580,7 @@ static Value op_maximize(Interpreter* interp, Value* args, int argc, Expr** arg_
580580
if (!win || !IsWindow(win->hwnd)) return fail(interp, "GUI_MAXIMIZE: invalid window handle", line, col);
581581
ShowWindow(win->hwnd, SW_MAXIMIZE);
582582
gui_pump_messages();
583-
return value_int(1);
583+
return value_bool(true);
584584
}
585585

586586
static Value op_to_front(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) {
@@ -596,7 +596,7 @@ static Value op_to_front(Interpreter* interp, Value* args, int argc, Expr** arg_
596596
SetWindowPos(win->hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
597597
SetForegroundWindow(win->hwnd);
598598
gui_pump_messages();
599-
return value_int(1);
599+
return value_bool(true);
600600
}
601601

602602
static Value op_to_back(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) {
@@ -611,7 +611,7 @@ static Value op_to_back(Interpreter* interp, Value* args, int argc, Expr** arg_n
611611
if (!win || !IsWindow(win->hwnd)) return fail(interp, "GUI_TO_BACK: invalid window handle", line, col);
612612
SetWindowPos(win->hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
613613
gui_pump_messages();
614-
return value_int(1);
614+
return value_bool(true);
615615
}
616616

617617
static Value op_screen(Interpreter* interp, Value* args, int argc, Expr** arg_nodes, Env* env, int line, int col) {

lib/std/image/image.c

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -597,14 +597,14 @@ static Value load_with_gdiplus(Interpreter* interp, const char* path, int line,
597597

598598
static Value save_with_gdiplus(Interpreter* interp, Value imgv, const char* path, const WCHAR* mime, int quality, int line, int col) {
599599
ImageView iv;
600-
if (!image_from_value(interp, imgv, "SAVE_*", line, col, &iv)) return value_int(0);
601-
if (!ensure_gdiplus(interp, line, col)) return value_int(0);
600+
if (!image_from_value(interp, imgv, "SAVE_*", line, col, &iv)) return value_null();
601+
if (!ensure_gdiplus(interp, line, col)) return value_null();
602602

603603
int w = (int)iv.w;
604604
int h = (int)iv.h;
605605
int stride = w * 4;
606606
uint8_t* bgra = (uint8_t*)malloc((size_t)stride * (size_t)h);
607-
if (!bgra) { set_runtime_error(interp, "image: out of memory", line, col); return value_int(0); }
607+
if (!bgra) { set_runtime_error(interp, "image: out of memory", line, col); return value_null(); }
608608

609609
for (int y = 0; y < h; y++) {
610610
uint8_t* row = bgra + (size_t)y * (size_t)stride;
@@ -625,15 +625,15 @@ static Value save_with_gdiplus(Interpreter* interp, Value imgv, const char* path
625625
if (pGdipCreateBitmapFromScan0(w, h, stride, PixelFormat32bppARGB_C, bgra, &bmp) != 0 || !bmp) {
626626
free(bgra);
627627
set_runtime_error(interp, "image: failed to create bitmap", line, col);
628-
return value_int(0);
628+
return value_null();
629629
}
630630

631631
CLSID clsid;
632632
if (!encoder_clsid_for_mime(mime, &clsid)) {
633633
pGdipDisposeImage((GpImage_C*)bmp);
634634
free(bgra);
635635
set_runtime_error(interp, "image: encoder unavailable", line, col);
636-
return value_int(0);
636+
return value_null();
637637
}
638638

639639
WCHAR* wpath = NULL;
@@ -642,7 +642,7 @@ static Value save_with_gdiplus(Interpreter* interp, Value imgv, const char* path
642642
free(bgra);
643643
free(wpath);
644644
set_runtime_error(interp, "image: invalid UTF-8 path", line, col);
645-
return value_int(0);
645+
return value_null();
646646
}
647647

648648
static const GUID EncoderQuality = {0x1d5be4b5, 0xfa4a, 0x452d, {0x9c, 0xdd, 0x5d, 0xb3, 0x51, 0x05, 0xe7, 0xeb}};
@@ -659,8 +659,8 @@ static Value save_with_gdiplus(Interpreter* interp, Value imgv, const char* path
659659
pGdipDisposeImage((GpImage_C*)bmp);
660660
free(bgra);
661661

662-
if (st != 0) { set_runtime_error(interp, "image: failed to save image", line, col); return value_int(0); }
663-
return value_int(1);
662+
if (st != 0) { set_runtime_error(interp, "image: failed to save image", line, col); return value_null(); }
663+
return value_bool(true);
664664
}
665665
#endif
666666

@@ -711,16 +711,15 @@ static Value op_save_png(Interpreter* interp, Value* args, int argc, Expr** arg_
711711
(void)env;
712712
if (!expect_argc_range(interp, argc, 2, 3, "SAVE_PNG", line, col)) return value_null();
713713
const char* path = expect_str(interp, args[1], "SAVE_PNG", line, col);
714-
if (interp->error) return value_int(0);
714+
if (interp->error) return value_null();
715715
int quality = 100;
716716
if (argc >= 3) quality = (int)expect_int(interp, args[2], "SAVE_PNG", line, col);
717717
if (interp->error) return value_null();
718718
#ifdef _WIN32
719719
return save_with_gdiplus(interp, args[0], path, L"image/png", quality, line, col);
720720
#else
721721
(void)quality;
722-
set_runtime_error(interp, "SAVE_PNG not supported on this platform", line, col);
723-
return value_int(0);
722+
return fail(interp, "SAVE_PNG not supported on this platform", line, col);
724723
#endif
725724
}
726725

@@ -729,16 +728,15 @@ static Value op_save_jpeg(Interpreter* interp, Value* args, int argc, Expr** arg
729728
(void)env;
730729
if (!expect_argc_range(interp, argc, 2, 3, "SAVE_JPEG", line, col)) return value_null();
731730
const char* path = expect_str(interp, args[1], "SAVE_JPEG", line, col);
732-
if (interp->error) return value_int(0);
731+
if (interp->error) return value_null();
733732
int quality = 85;
734733
if (argc >= 3) quality = (int)expect_int(interp, args[2], "SAVE_JPEG", line, col);
735734
if (interp->error) return value_null();
736735
#ifdef _WIN32
737736
return save_with_gdiplus(interp, args[0], path, L"image/jpeg", quality, line, col);
738737
#else
739738
(void)quality;
740-
set_runtime_error(interp, "SAVE_JPEG not supported on this platform", line, col);
741-
return value_int(0);
739+
return fail(interp, "SAVE_JPEG not supported on this platform", line, col);
742740
#endif
743741
}
744742

@@ -747,12 +745,11 @@ static Value op_save_bmp(Interpreter* interp, Value* args, int argc, Expr** arg_
747745
(void)env;
748746
if (!expect_argc_range(interp, argc, 2, 2, "SAVE_BMP", line, col)) return value_null();
749747
const char* path = expect_str(interp, args[1], "SAVE_BMP", line, col);
750-
if (interp->error) return value_int(0);
748+
if (interp->error) return value_null();
751749
#ifdef _WIN32
752750
return save_with_gdiplus(interp, args[0], path, L"image/bmp", 100, line, col);
753751
#else
754-
set_runtime_error(interp, "SAVE_BMP not supported on this platform", line, col);
755-
return value_int(0);
752+
return fail(interp, "SAVE_BMP not supported on this platform", line, col);
756753
#endif
757754
}
758755

lib/std/image/init.pre

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ FUNC TNS: CROP(TNS: img, TNS: corners){
119119
RETURN(img[MIN(corners[*, 0d1])-MAX(corners[*, 0d1]), MIN(corners[*, 0d2])-MAX(corners[*, 0d2]), *])
120120
}
121121

122-
FUNC INT: SHOW(TNS: img){
122+
FUNC BOOL: SHOW(TNS: img){
123123
! Save the image to the provided path and open it with the system default
124124
! viewer on Windows. `img_path` is treated as the target file path.
125125
STR: img_path = "C:/Windows/Temp/tmp_img.png"
@@ -128,5 +128,5 @@ FUNC INT: SHOW(TNS: img){
128128
! Use NULL hwnd (0), operation "open", empty params and dir, showcmd=1
129129
win32.WIN_CALL("shell32", "ShellExecuteW", "PSSSSI", "P", 0d0, "open", img_path, "", "", 0d1)
130130
DEL(img_path)
131-
RETURN(0d0)
131+
RETURN(FALSE)
132132
}

lib/std/prime.pre

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
! Primality and factorization functions
22

3-
FUNC INT: IS_PRIME(INT: n){
3+
FUNC BOOL: IS_PRIME(INT: n){
44
IF(LTE(n, 0d1)){
5-
RETURN(0d0)
5+
RETURN(FALSE)
66
}
77
IF(EQ(n, 0d2)){
8-
RETURN(0d1)
8+
RETURN(TRUE)
99
}
1010
! reject even numbers greater than 2
1111
IF(EQ(MOD(n, 0d2), 0d0)){
12-
RETURN(0d0)
12+
RETURN(FALSE)
1313
}
1414
INT: i = 0d3
1515
WHILE(LTE(MUL(i, i), n)){
1616
IF(EQ(MOD(n, i), 0d0)){
17-
RETURN(0d0)
17+
RETURN(FALSE)
1818
}
1919
ADD(@i, 0d2)
2020
}
21-
RETURN(0d1)
21+
RETURN(TRUE)
2222
}
2323

2424
FUNC INT: NEXT_PRIME(INT: start){
@@ -42,16 +42,16 @@ FUNC INT: PREV_PRIME(INT: start){
4242
RETURN(0d0)
4343
}
4444

45-
FUNC INT: IS_MERSENNE_PRIME(INT: p){
45+
FUNC BOOL: IS_MERSENNE_PRIME(INT: p){
4646
IF(IS_PRIME(p)){
4747
INT: exp = POW(0d2, p)
4848
INT: mersenne = SUB(exp, 0d1)
4949
IF(IS_PRIME(mersenne)){
50-
RETURN(0d1)
50+
RETURN(TRUE)
5151
}
52-
RETURN(0d0)
52+
RETURN(FALSE)
5353
}ELSE{
54-
RETURN(0d0)
54+
RETURN(FALSE)
5555
}
5656
}
5757

src/ast.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ static void* ast_alloc(size_t size) {
1717
return ptr;
1818
}
1919

20+
Expr* expr_bool(bool value, int line, int column) {
21+
Expr* expr = ast_alloc(sizeof(Expr));
22+
expr->type = EXPR_BOOL;
23+
expr->line = line;
24+
expr->column = column;
25+
expr->as.bool_value = value;
26+
return expr;
27+
}
28+
2029
Expr* expr_int(int64_t value, int base, int line, int column) {
2130
Expr* expr = ast_alloc(sizeof(Expr));
2231
expr->type = EXPR_INT;
@@ -404,6 +413,8 @@ static void free_stmt_list(StmtList* list) {
404413
void free_expr(Expr* expr) {
405414
if (!expr) return;
406415
switch (expr->type) {
416+
case EXPR_BOOL:
417+
break;
407418
case EXPR_ASYNC:
408419
free_stmt(expr->as.async.block);
409420
break;

src/ast.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "common.h"
55

66
typedef enum {
7+
TYPE_BOOL,
78
TYPE_INT,
89
TYPE_FLT,
910
TYPE_STR,
@@ -31,6 +32,7 @@ typedef struct ParamList {
3132
} ParamList;
3233

3334
typedef enum {
35+
EXPR_BOOL,
3436
EXPR_INT,
3537
EXPR_FLT,
3638
EXPR_STR,
@@ -58,6 +60,7 @@ struct Expr {
5860
int line;
5961
int column;
6062
union {
63+
bool bool_value;
6164
struct { int64_t value; int base; } int_value;
6265
struct { double value; int base; int base_is_nan; } flt_value;
6366
char* str_value;
@@ -154,6 +157,7 @@ struct Stmt {
154157
} as;
155158
};
156159

160+
Expr* expr_bool(bool value, int line, int column);
157161
Expr* expr_int(int64_t value, int base, int line, int column);
158162
Expr* expr_flt(double value, int base, int base_is_nan, int line, int column);
159163
Expr* expr_str(char* value, int line, int column);

0 commit comments

Comments
 (0)