From 4e1aaf8b897c514951e93251224eab6b701c0ec9 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 23 Feb 2016 04:24:42 +0900 Subject: [PATCH] pic_strf_value does not interpret '~s' format specifier --- contrib/60.repl/repl.scm | 6 +- extlib/benz/debug.c | 13 ++--- extlib/benz/include/picrin/extra.h | 12 ++-- extlib/benz/string.c | 68 +--------------------- extlib/benz/write.c | 92 +++++++++++++++++++----------- src/main.c | 2 +- 6 files changed, 77 insertions(+), 116 deletions(-) diff --git a/contrib/60.repl/repl.scm b/contrib/60.repl/repl.scm index f358daa5..b2b9323f 100644 --- a/contrib/60.repl/repl.scm +++ b/contrib/60.repl/repl.scm @@ -54,6 +54,10 @@ (get-output-string port)))) (define (print-error-object e) + (define type (error-object-type e)) + (unless (eq? type '||) + (display type) + (display "-")) (display "error: ") (display (error-object-message e)) (display ".") @@ -81,7 +85,7 @@ (print-error-object condition) (set! str "")) (begin - (display "raised: ") + (display "raise: ") (write condition) (newline) (set! str ""))) diff --git a/extlib/benz/debug.c b/extlib/benz/debug.c index ae3ca9b3..043571b9 100644 --- a/extlib/benz/debug.c +++ b/extlib/benz/debug.c @@ -36,30 +36,29 @@ pic_get_backtrace(pic_state *pic) } void -pic_print_backtrace(pic_state *pic, xFILE *file) +pic_print_error(pic_state *pic, xFILE *file) { - pic_value err = pic_err(pic); + pic_value err = pic_err(pic), port = pic_open_port(pic, file); assert(! pic_invalid_p(pic, err)); if (! pic_error_p(pic, err)) { xfprintf(pic, file, "raise: "); - pic_fwrite(pic, err, file); + pic_fprintf(pic, port, "~s", err); } else { struct error *e; pic_value elem, it; e = pic_error_ptr(pic, err); if (! pic_eq_p(pic, pic_obj_value(e->type), pic_intern_lit(pic, ""))) { - pic_fwrite(pic, pic_obj_value(e->type), file); + pic_fprintf(pic, port, "~s", pic_obj_value(e->type)); xfprintf(pic, file, " "); } xfprintf(pic, file, "error: "); - pic_fwrite(pic, pic_obj_value(e->msg), file); + pic_fprintf(pic, port, "~s", pic_obj_value(e->msg)); pic_for_each (elem, e->irrs, it) { /* print error irritants */ - xfprintf(pic, file, " "); - pic_fwrite(pic, elem, file); + pic_fprintf(pic, port, " ~s", elem); } xfprintf(pic, file, "\n"); diff --git a/extlib/benz/include/picrin/extra.h b/extlib/benz/include/picrin/extra.h index a7cd6f88..955be4b1 100644 --- a/extlib/benz/include/picrin/extra.h +++ b/extlib/benz/include/picrin/extra.h @@ -23,6 +23,10 @@ pic_value pic_eval(pic_state *, pic_value program, const char *lib); void pic_load(pic_state *, pic_value port); void pic_load_cstr(pic_state *, const char *); +void pic_printf(pic_state *, const char *fmt, ...); +void pic_fprintf(pic_state *, pic_value port, const char *fmt, ...); +void pic_vfprintf(pic_state *, pic_value port, const char *fmt, va_list ap); + /* extra xfile methods */ xFILE *xfile_xstdin(pic_state *); @@ -43,12 +47,6 @@ xFILE *xfopen_null(pic_state *, const char *mode); #define pic_stdin(pic) pic_funcall(pic, "picrin.base", "current-input-port", 0) #define pic_stdout(pic) pic_funcall(pic, "picrin.base", "current-output-port", 0) #define pic_stderr(pic) pic_funcall(pic, "picrin.base", "current-error-port", 0) -pic_value pic_write(pic_state *, pic_value); /* returns given obj */ -pic_value pic_fwrite(pic_state *, pic_value, xFILE *); -void pic_printf(pic_state *, const char *, ...); -void pic_fprintf(pic_state *, pic_value port, const char *, ...); -pic_value pic_display(pic_state *, pic_value); -pic_value pic_fdisplay(pic_state *, pic_value, xFILE *); /* utility macros */ @@ -111,7 +109,7 @@ pic_value pic_err(pic_state *); void pic_warnf(pic_state *, const char *, ...); pic_value pic_get_backtrace(pic_state *); -void pic_print_backtrace(pic_state *, xFILE *); +void pic_print_error(pic_state *, xFILE *); pic_value pic_library_environment(pic_state *, const char *); diff --git a/extlib/benz/string.c b/extlib/benz/string.c index d08f6178..eff041ed 100644 --- a/extlib/benz/string.c +++ b/extlib/benz/string.c @@ -318,72 +318,6 @@ pic_str(pic_state *pic, pic_value str) return rope_cstr(pic, pic_str_ptr(pic, str)->rope); } -static void -vfstrf(pic_state *pic, xFILE *file, const char *fmt, va_list ap) -{ - char c; - - while ((c = *fmt++) != '\0') { - switch (c) { - default: - xfputc(pic, c, file); - break; - case '%': - c = *fmt++; - if (! c) - goto exit; - switch (c) { - default: - xfputc(pic, c, file); - break; - case '%': - xfputc(pic, '%', file); - break; - case 'c': - xfprintf(pic, file, "%c", va_arg(ap, int)); - break; - case 's': - xfprintf(pic, file, "%s", va_arg(ap, const char *)); - break; - case 'd': - xfprintf(pic, file, "%d", va_arg(ap, int)); - break; - case 'p': - xfprintf(pic, file, "%p", va_arg(ap, void *)); - break; - case 'f': - xfprintf(pic, file, "%f", va_arg(ap, double)); - break; - } - break; - case '~': - c = *fmt++; - if (! c) - goto exit; - switch (c) { - default: - xfputc(pic, c, file); - break; - case '~': - xfputc(pic, '~', file); - break; - case '%': - xfputc(pic, '\n', file); - break; - case 'a': - pic_fdisplay(pic, va_arg(ap, pic_value), file); - break; - case 's': - pic_fwrite(pic, va_arg(ap, pic_value), file); - break; - } - break; - } - } - exit: - return; -} - pic_value pic_vstrf_value(pic_state *pic, const char *fmt, va_list ap) { @@ -394,7 +328,7 @@ pic_vstrf_value(pic_state *pic, const char *fmt, va_list ap) file = xfopen_buf(pic, NULL, 0, "w"); - vfstrf(pic, file, fmt, ap); + xvfprintf(pic, file, fmt, ap); xfget_buf(pic, file, &buf, &len); str = pic_str_value(pic, buf, len); xfclose(pic, file); diff --git a/extlib/benz/write.c b/extlib/benz/write.c index bb993503..78cccb02 100644 --- a/extlib/benz/write.c +++ b/extlib/benz/write.c @@ -366,44 +366,70 @@ write(pic_state *pic, pic_value obj, xFILE *file, int mode, int op) write_core(pic, obj, file, &p); } - -pic_value -pic_write(pic_state *pic, pic_value obj) -{ - return pic_fwrite(pic, obj, pic_fileno(pic, pic_stdout(pic))); -} - -pic_value -pic_fwrite(pic_state *pic, pic_value obj, xFILE *file) -{ - write(pic, obj, file, WRITE_MODE, OP_WRITE); - xfflush(pic, file); - return obj; -} - -pic_value -pic_display(pic_state *pic, pic_value obj) -{ - return pic_fdisplay(pic, obj, pic_fileno(pic, pic_stdout(pic))); -} - -pic_value -pic_fdisplay(pic_state *pic, pic_value obj, xFILE *file) -{ - write(pic, obj, file, DISPLAY_MODE, OP_WRITE); - xfflush(pic, file); - return obj; -} - void pic_vfprintf(pic_state *pic, pic_value port, const char *fmt, va_list ap) { xFILE *file = pic_fileno(pic, port); - pic_value str; + char c; - str = pic_vstrf_value(pic, fmt, ap); - - xfprintf(pic, file, "%s", pic_str(pic, str)); + while ((c = *fmt++) != '\0') { + switch (c) { + default: + xfputc(pic, c, file); + break; + case '%': + c = *fmt++; + if (! c) + goto exit; + switch (c) { + default: + xfputc(pic, c, file); + break; + case '%': + xfputc(pic, '%', file); + break; + case 'c': + xfprintf(pic, file, "%c", va_arg(ap, int)); + break; + case 's': + xfprintf(pic, file, "%s", va_arg(ap, const char *)); + break; + case 'd': + xfprintf(pic, file, "%d", va_arg(ap, int)); + break; + case 'p': + xfprintf(pic, file, "%p", va_arg(ap, void *)); + break; + case 'f': + xfprintf(pic, file, "%f", va_arg(ap, double)); + break; + } + break; + case '~': + c = *fmt++; + if (! c) + goto exit; + switch (c) { + default: + xfputc(pic, c, file); + break; + case '~': + xfputc(pic, '~', file); + break; + case '%': + xfputc(pic, '\n', file); + break; + case 'a': + write(pic, va_arg(ap, pic_value), file, DISPLAY_MODE, OP_WRITE); + break; + case 's': + write(pic, va_arg(ap, pic_value), file, WRITE_MODE, OP_WRITE); + break; + } + break; + } + } + exit: xfflush(pic, file); } diff --git a/src/main.c b/src/main.c index 4878812f..9b45df9a 100644 --- a/src/main.c +++ b/src/main.c @@ -39,7 +39,7 @@ main(int argc, char *argv[], char **envp) status = 0; } pic_catch { - pic_print_backtrace(pic, xstderr); + pic_print_error(pic, xstderr); status = 1; }