summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-12-06 06:15:49 -0800
committerKaz Kylheku <kaz@kylheku.com>2019-12-06 06:15:49 -0800
commit8360cbb6e1774992a02db63947f036c73dffe48d (patch)
tree8e2ee888a5c370c96a2afe011d74236fb2d57284
parent28ab7ed6c4d4340cc6bc8eba302ab6b603d91f53 (diff)
downloadtxr-8360cbb6e1774992a02db63947f036c73dffe48d.tar.gz
txr-8360cbb6e1774992a02db63947f036c73dffe48d.tar.bz2
txr-8360cbb6e1774992a02db63947f036c73dffe48d.zip
unwind: new function uw_warningf.
Convenience function for throwing warnings. * unwind.c (uw_warningf): New function. * unwind.h (uw_warningf): Declared.
-rw-r--r--unwind.c22
-rw-r--r--unwind.h1
2 files changed, 23 insertions, 0 deletions
diff --git a/unwind.c b/unwind.c
index 3495213d..93b09fe1 100644
--- a/unwind.c
+++ b/unwind.c
@@ -793,6 +793,28 @@ val uw_errorfv(val fmt, struct args *args)
abort();
}
+val uw_warningf(val fmt, ...)
+{
+ va_list vl;
+
+ val stream = make_string_output_stream();
+ va_start (vl, fmt);
+ (void) vformat(stream, fmt, vl);
+ va_end (vl);
+
+ uw_catch_begin (cons(continue_s, nil), exsym, exvals);
+
+ uw_throw(warning_s, get_string_from_stream(stream));
+
+ uw_catch(exsym, exvals) { (void) exsym; (void) exvals; }
+
+ uw_unwind;
+
+ uw_catch_end;
+
+ return nil;
+}
+
val type_mismatch(val fmt, ...)
{
va_list vl;
diff --git a/unwind.h b/unwind.h
index 30ab70c2..64f21a02 100644
--- a/unwind.h
+++ b/unwind.h
@@ -154,6 +154,7 @@ noreturn val uw_throwf(val sym, val fmt, ...);
noreturn val uw_throwfv(val sym, val fmt, struct args *);
noreturn val uw_errorf(val fmt, ...);
noreturn val uw_errorfv(val fmt, struct args *args);
+val uw_warningf(val fmt, ...);
val uw_defer_warning(val args);
val uw_warning_exists(val tag);
val uw_dump_deferred_warnings(val stream);