commit b58257e18417fa83974990f87692891aea156ed9
parent 63f272a4a675c8bd492036498e892f0a792f23d9
Author: Ed van Bruggen <edvb@uw.edu>
Date:   Sat, 29 Dec 2018 21:15:12 -0800
Move warning macros to header, use in math tib
Diffstat:
| tib/math.c |  |  | 52 | +++++++++++++--------------------------------------- | 
| tisp.c |  |  | 64 | ++++++++++++++++++++++------------------------------------------ | 
| tisp.h |  |  | 20 | ++++++++++++++++++++ | 
3 files changed, 55 insertions(+), 81 deletions(-)
diff --git a/tib/math.c b/tib/math.c
@@ -3,32 +3,17 @@
 
 #include "../tisp.h"
 
-#define warnf(M, ...) do {                          \
-	fprintf(stderr, "tisp:%d: error: " M "\n",  \
-	                  __LINE__, ##__VA_ARGS__); \
-	return NULL;                                \
-} while(0)
-#define warn(M) do {                                \
-	fprintf(stderr, "tisp:%d: error: " M "\n",  \
-	                 __LINE__);                 \
-	return NULL;                                \
-} while(0)
-
-
 #define PRIM_OP(NAME, OP, FUNC)                                                        \
 static Val                                                                             \
 prim_##NAME(Env env, Val args)                                                         \
 {                                                                                      \
 	Val a, b;                                                                      \
-	int len = list_len(args);                                                      \
-	if (len != 2)                                                                  \
-		warnf(FUNC ": expected 2 arguments, recieved %d", len);                \
-	if (!(a = tisp_eval(env, car(args))) || !(b = tisp_eval(env, car(cdr(args))))) \
+	tsp_arg_num(args, FUNC, 2);                                                    \
+	if (!(a = tisp_eval(env, car(args))) ||                                        \
+	    !(b = tisp_eval(env, car(cdr(args)))))                                     \
 		return NULL;                                                           \
-	if (a->t != INTEGER)                                                           \
-		warnf(FUNC ": expected integer, recieved type [%s]", type_str(a->t));  \
-	if (b->t != INTEGER)                                                           \
-		warnf(FUNC ": expected integer, recieved type [%s]", type_str(b->t));  \
+	tsp_arg_type(a, FUNC, INTEGER);                                                \
+	tsp_arg_type(b, FUNC, INTEGER);                                                \
 	return mk_int(a->v.i OP b->v.i);                                               \
 }
 
@@ -42,17 +27,15 @@ prim_sub(Env env, Val args)
 	Val a, b;
 	int len = list_len(args);
 	if (len != 2 && len != 1)
-		warnf("-: expected 1 or 2 arguments, recieved %d", len);
+		tsp_warnf("-: expected 1 or 2 arguments, recieved %d", len);
 	if (!(a = tisp_eval(env, car(args))))
 		return NULL;
-	if (a->t != INTEGER)
-		warnf("-: expected integer, recieved type [%s]", type_str(a->t));
+	tsp_arg_type(a, "-", INTEGER);
 	if (len == 1)
 		return mk_int(-a->v.i);
 	if (!(b = tisp_eval(env, car(cdr(args)))))
 		return NULL;
-	if (b->t != INTEGER)
-		warnf("-: expected integer, recieved type [%s]", type_str(b->t));
+	tsp_arg_type(b, "-", INTEGER);
 	return mk_int(a->v.i - b->v.i);
 }
 
@@ -60,23 +43,14 @@ static Val
 prim_div(Env env, Val args)
 {
 	Val a, b;
-	int len = list_len(args);
-	if (len != 2)
-		warnf("/: expected 2 arguments, recieved %d", len);
+	tsp_arg_num(args, "/", 2);
 	if (!(a = tisp_eval(env, car(args))) || !(b = tisp_eval(env, car(cdr(args)))))
 		return NULL;
-	if (a->t != INTEGER)
-		warnf("/: expected integer, recieved type [%s]", type_str(a->t));
-	if (b->t != INTEGER)
-		warnf("/: expected integer, recieved type [%s]", type_str(b->t));
+	tsp_arg_type(a, "/", INTEGER);
+	tsp_arg_type(b, "/", INTEGER);
 	return mk_rat(a->v.i, b->v.i);
 }
 
-#define INT_TEST(V, FUNC) do {                                                        \
-	if (V->t != INTEGER)                                                          \
-		warnf(FUNC ": expected integer, recieved type [%s]", type_str(V->t)); \
-} while (0)
-
 #define PRIM_COMPARE(NAME, OP, FUNC)                                  \
 static Val                                                            \
 prim_##NAME(Env env, Val args)                                        \
@@ -86,8 +60,8 @@ prim_##NAME(Env env, Val args)                                        \
 		return NULL;                                          \
 	if (list_len(v) != 2)                                         \
 		return env->t;                                        \
-	INT_TEST(car(v), FUNC);                                       \
-	INT_TEST(car(cdr(v)), FUNC);                                  \
+	tsp_arg_type(car(v), FUNC, INTEGER);                          \
+	tsp_arg_type(car(cdr(v)), FUNC, INTEGER);                     \
 	return (car(v)->v.i OP car(cdr(v))->v.i) ? env->t : env->nil; \
 }
 
diff --git a/tisp.c b/tisp.c
@@ -31,26 +31,6 @@
 
 #define BETWEEN(X, A, B)  ((A) <= (X) && (X) <= (B))
 
-#define warnf(M, ...) do {                          \
-	fprintf(stderr, "tisp:%d: error: " M "\n",  \
-	                  __LINE__, ##__VA_ARGS__); \
-	return NULL;                                \
-} while(0)
-#define warn(M) do {                                \
-	fprintf(stderr, "tisp:%d: error: " M "\n",  \
-	                 __LINE__);                 \
-	return NULL;                                \
-} while(0)
-#define arg_num(ARGS, NAME, NARGS) do {                                   \
-	if (list_len(ARGS) != NARGS)                                      \
-		warnf(NAME ": expected %d argument%s, received %d",       \
-		            NARGS, NARGS > 1 ? "s" : "", list_len(ARGS)); \
-} while(0)
-#define arg_type(ARG, NAME, TYPE) do {                                                     \
-	if (ARG->t != TYPE)                                                                 \
-		warnf(NAME ": expected %s, received %s", type_str(TYPE), type_str(ARG->t)); \
-} while(0)
-
 /* functions */
 static void hash_add(Hash ht, char *key, Val val);
 static Hash hash_extend(Hash ht, Val args, Val vals);
@@ -282,7 +262,7 @@ hash_extend(Hash ht, Val args, Val vals)
 		arg = car(args);
 		val = car(vals);
 		if (arg->t != SYMBOL)
-			warn("hash_extend: argument not a symbol");
+			tsp_warn("hash_extend: argument not a symbol");
 		hash_add(ht, arg->v.s, val);
 	}
 	return ht;
@@ -334,7 +314,7 @@ Val
 mk_rat(int num, int den)
 {
 	if (den == 0)
-		warn("division by zero");
+		tsp_warn("division by zero");
 	frac_reduce(&num, &den);
 	if (den < 0) { /* simplify so only numerator is negative */
 		den = abs(den);
@@ -463,7 +443,7 @@ read_num(Str str)
 	case '/':
 		str->d++;
 		if (!isnum(str->d))
-			warn("incorrect ratio format, no denominator found");
+			tsp_warn("incorrect ratio format, no denominator found");
 		return mk_rat(sign * num, read_sign(str) * read_int(str));
 	case '.':
 		s = emalloc(sizeof(str));
@@ -487,7 +467,7 @@ read_str(Env env, Str str)
 	char *s = ++str->d;
 	for (; *str->d++ != '"'; len++)
 		if (!*str->d)
-			warn("reached end before closing double quote");
+			tsp_warn("reached end before closing double quote");
 	s[len] = '\0';
 	return mk_str(env, s);
 }
@@ -518,7 +498,7 @@ read_list(Env env, Str str)
 	skip_ws(str);
 	while (*str->d != ')') {
 		if (!str->d[1])
-			warn("reached end before closing ')'");
+			tsp_warn("reached end before closing ')'");
 		a = erealloc(a, (n+1) * sizeof(Val)); /* TODO realloc less */
 		if (!(a[n++] = tisp_read(env, str)))
 			return NULL;
@@ -549,7 +529,7 @@ tisp_read(Env env, Str str)
 		return read_sym(env, str);
 	if (*str->d == '(')
 		return read_list(env, str);
-	warn("could not read given input");
+	tsp_warn("could not read given input");
 }
 
 Val
@@ -584,7 +564,7 @@ tisp_eval(Env env, Val v)
 		return v;
 	case SYMBOL:
 		if (!(f = hash_get(env->h, v->v.s)))
-			warnf("could not find symbol %s", v->v.s);
+			tsp_warnf("could not find symbol %s", v->v.s);
 		return f;
 	case PAIR:
 		if (!(f = tisp_eval(env, car(v))))
@@ -602,7 +582,7 @@ tisp_eval(Env env, Val v)
 			hash_merge(env->h, f->v.f.env->h);
 			return tisp_eval(env, f->v.f.body);
 		default:
-			warnf("attempt to evaluate non procedural type %s", type_str(f->t));
+			tsp_warnf("attempt to evaluate non procedural type %s", type_str(f->t));
 		}
 	default: break;
 	}
@@ -666,10 +646,10 @@ static Val
 prim_car(Env env, Val args)
 {
 	Val v;
-	arg_num(args, "car", 1);
+	tsp_arg_num(args, "car", 1);
 	if (!(v = tisp_eval_list(env, args)))
 		return NULL;
-	arg_type(car(v), "car", PAIR);
+	tsp_arg_type(car(v), "car", PAIR);
 	return car(car(v));
 }
 
@@ -677,10 +657,10 @@ static Val
 prim_cdr(Env env, Val args)
 {
 	Val v;
-	arg_num(args, "cdr", 1);
+	tsp_arg_num(args, "cdr", 1);
 	if (!(v = tisp_eval_list(env, args)))
 		return NULL;
-	arg_type(car(v), "cdr", PAIR);
+	tsp_arg_type(car(v), "cdr", PAIR);
 	return cdr(car(v));
 }
 
@@ -688,7 +668,7 @@ static Val
 prim_cons(Env env, Val args)
 {
 	Val v;
-	arg_num(args, "cons", 2);
+	tsp_arg_num(args, "cons", 2);
 	if (!(v = tisp_eval_list(env, args)))
 		return NULL;
 	return mk_pair(car(v), car(cdr(v)));
@@ -711,7 +691,7 @@ prim_eq(Env env, Val args)
 static Val
 prim_quote(Env env, Val args)
 {
-	arg_num(args, "quote", 1);
+	tsp_arg_num(args, "quote", 1);
 	return car(args);
 }
 
@@ -730,9 +710,9 @@ prim_cond(Env env, Val args)
 static Val
 prim_lambda(Env env, Val args)
 {
-	arg_num(args, "lambda", 2);
+	tsp_arg_num(args, "lambda", 2);
 	if (car(args)->t != PAIR && !nilp(car(args)))
-		warn("lambda: incorrect format, no argument list found");
+		tsp_warn("lambda: incorrect format, no argument list found");
 	return mk_func(car(args), car(cdr(args)), env);
 }
 
@@ -740,7 +720,7 @@ static Val
 prim_define(Env env, Val args)
 {
 	Val sym, val;
-	arg_num(args, "define", 2);
+	tsp_arg_num(args, "define", 2);
 	if (car(args)->t == PAIR) {
 		sym = car(car(args));
 		val = mk_func(cdr(car(args)), car(cdr(args)), env);
@@ -748,7 +728,7 @@ prim_define(Env env, Val args)
 		sym = car(args);
 		val = tisp_eval(env, car(cdr(args)));
 	} else
-		warn("define: incorrect format, no variable name found");
+		tsp_warn("define: incorrect format, no variable name found");
 	if (!val)
 		return NULL;
 	hash_add(env->h, sym->v.s, val);
@@ -761,10 +741,10 @@ prim_load(Env env, Val args)
 	Val v;
 	void (*tibenv)(Env);
 	char *lib, *func;
-	arg_num(args, "load", 1);
+	tsp_arg_num(args, "load", 1);
 	if (!(v = tisp_eval(env, car(args))))
 		return NULL;
-	arg_type(v, "load", STRING);
+	tsp_arg_type(v, "load", STRING);
 
 	env->libh = erealloc(env->libh, (env->libhc+1)*sizeof(void*));
 
@@ -773,7 +753,7 @@ prim_load(Env env, Val args)
 	strcat(lib, v->v.s);
 	strcat(lib, ".so");
 	if (!(env->libh[env->libhc] = dlopen(lib, RTLD_LAZY)))
-		warnf("load: could not load '%s':\n%s", v->v.s, dlerror());
+		tsp_warnf("load: could not load '%s':\n%s", v->v.s, dlerror());
 	dlerror();
 	free(lib);
 
@@ -782,7 +762,7 @@ prim_load(Env env, Val args)
 	strcat(func, v->v.s);
 	tibenv = dlsym(env->libh[env->libhc], func);
 	if (dlerror())
-		warnf("load: could not run '%s':\n%s", v->v.s, dlerror());
+		tsp_warnf("load: could not run '%s':\n%s", v->v.s, dlerror());
 	(*tibenv)(env);
 	free(func);
 
diff --git a/tisp.h b/tisp.h
@@ -19,6 +19,26 @@
  * 3. This notice may not be removed or altered from any source distribution.
  */
 
+#define tsp_warnf(M, ...) do {                          \
+	fprintf(stderr, "tisp:%d: error: " M "\n",  \
+	                  __LINE__, ##__VA_ARGS__); \
+	return NULL;                                \
+} while(0)
+#define tsp_warn(M) do {                                \
+	fprintf(stderr, "tisp:%d: error: " M "\n",  \
+	                 __LINE__);                 \
+	return NULL;                                \
+} while(0)
+#define tsp_arg_num(ARGS, NAME, NARGS) do {                                   \
+	if (list_len(ARGS) != NARGS)                                      \
+		tsp_warnf(NAME ": expected %d argument%s, received %d",       \
+		            NARGS, NARGS > 1 ? "s" : "", list_len(ARGS)); \
+} while(0)
+#define tsp_arg_type(ARG, NAME, TYPE) do {                                                     \
+	if (ARG->t != TYPE)                                                                 \
+		tsp_warnf(NAME ": expected %s, received %s", type_str(TYPE), type_str(ARG->t)); \
+} while(0)
+
 #define car(P)  ((P)->v.p.car)
 #define cdr(P)  ((P)->v.p.cdr)
 #define nilp(P) ((P)->t == NIL)