diff --git a/include/picrin.h b/include/picrin.h index c576b0e3..a1c32c1f 100644 --- a/include/picrin.h +++ b/include/picrin.h @@ -94,6 +94,7 @@ typedef struct { xhash macros; pic_value libs; + bool rfcase; xhash rlabels; jmp_buf *jmp; diff --git a/src/read.c b/src/read.c index 0d5f85e6..8c9621ee 100644 --- a/src/read.c +++ b/src/read.c @@ -134,13 +134,13 @@ read_directive(pic_state *pic, struct pic_port *port, int c) switch ((char)peek(port)) { case 'n': if (expect(port, "no-fold-case")) { - /* :FIXME: set no-fold-case flag */ + pic->rfcase = false; return pic_undef_value(); } break; case 'f': if (expect(port, "fold-case")) { - /* :FIXME: set fold-case flag */ + pic->rfcase = true; return pic_undef_value(); } break; @@ -191,13 +191,15 @@ read_symbol(pic_state *pic, struct pic_port *port, int c) if (len != 0) { c = next(port); } + if (pic->rfcase) { + c = tolower(c); + } len += 1; buf = pic_realloc(pic, buf, len + 1); buf[len - 1] = (char)c; } while (! isdelim(peek(port))); - buf[len] = '\0'; - sym = pic_intern_cstr(pic, buf); + sym = pic_intern(pic, buf, len); pic_free(pic, buf); return pic_sym_value(sym); diff --git a/src/state.c b/src/state.c index 4a6ad837..6cd6c139 100644 --- a/src/state.c +++ b/src/state.c @@ -59,6 +59,7 @@ pic_open(int argc, char *argv[], char **envp) pic->lib = NULL; /* reader */ + pic->rfcase = false; xh_init_int(&pic->rlabels, sizeof(pic_value)); /* error handling */