Fix error & poperror macros, update set_errstr.
authorGodfrey van der Linden <gvdl@google.com>
Sun, 15 Feb 2015 03:28:06 +0000 (19:28 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 16 Feb 2015 15:24:37 +0000 (10:24 -0500)
Canonicalise the two brace bracketed error handling macros. All sorts of
odd things can happen when a macro has just bare braces. The do {}
while(false) idiom makes them into canonical C statements.

Add const to set_errstr fmt argument. Then we can used const char* error
strings, and compile without error.

kern/include/err.h
kern/include/syscall.h
kern/src/syscall.c

index e42ec69..09bbcc7 100644 (file)
@@ -15,13 +15,13 @@ struct errbuf {
 #define waserror() (errpush(errstack, ARRAY_SIZE(errstack), &curindex,         \
                             &prev_errbuf) ||                                   \
                     setjmp(&(get_cur_errbuf()->jmpbuf)))
-#define error(x,...) {set_errstr(x, ##__VA_ARGS__);                            \
-                      longjmp(&get_cur_errbuf()->jmpbuf, 1);}
-#define nexterror() {errpop(errstack, ARRAY_SIZE(errstack), &curindex,         \
+#define error(x,...) do {set_errstr(x, ##__VA_ARGS__);                         \
+                            longjmp(&get_cur_errbuf()->jmpbuf, 1);} while(0)
+#define nexterror() do {errpop(errstack, ARRAY_SIZE(errstack), &curindex,      \
                             prev_errbuf);                                      \
-                     longjmp(&(get_cur_errbuf())->jmpbuf, 1);}
-#define poperror() {errpop(errstack, ARRAY_SIZE(errstack), &curindex,          \
-                           prev_errbuf);}
+                     longjmp(&(get_cur_errbuf())->jmpbuf, 1);} while (0)
+#define poperror() do {errpop(errstack, ARRAY_SIZE(errstack), &curindex,       \
+                       prev_errbuf);} while (0)
 
 int errpush(struct errbuf *errstack, int stacksize, int *curindex,
             struct errbuf **prev_errbuf);
index 223133f..6589a36 100644 (file)
@@ -59,7 +59,7 @@ intreg_t syscall(struct proc *p, uintreg_t sc_num, uintreg_t a0, uintreg_t a1,
 void set_errno(int errno);
 int get_errno(void);
 void unset_errno(void);
-void set_errstr(char *errstr, ...);
+void set_errstr(const char *errstr, ...);
 char *current_errstr(void);
 struct errbuf *get_cur_errbuf(void);
 void set_cur_errbuf(struct errbuf *ebuf);
index 2be0963..b67c2ec 100644 (file)
@@ -257,7 +257,7 @@ void unset_errno(void)
        pcpui->cur_kthread->sysc->errstr[0] = '\0';
 }
 
-void set_errstr(char *fmt, ...)
+void set_errstr(const char *fmt, ...)
 {
        va_list ap;
        int rc;