#include <stdlib.h>
#include <string.h>
+#include "config.h"
+
/*
* Define a keyword for use while defining small and fast functions.
#define scal_ceil ceil
#define scal_min fmin
#define scal_max fmax
+#define scal_abs fabs
#define scal_pow pow
#define scal_sqrt sqrt
#define scal_sin sin
#define scal_ceil ceilf
#define scal_min fminf
#define scal_max fmaxf
+#define scal_abs fabsf
#define scal_pow powf
#define scal_sqrt sqrtf
#define scal_sin sinf
#define scal_min2(A,B,C) scal_min(scal_min(A,B),C)
#define scal_max2(A,B,C) scal_max(scal_max(A,B),C)
+#define SCAL_EPSILON (S(0.000001))
+
+/*
+ * Check if two scalars are mostly equal, given a margin of error.
+ */
+INLINE_MAYBE
+bool scal_isequal2(scal_t a, scal_t b, scal_t e)
+{
+ return scal_abs(a -b) < e;
+}
+
+/*
+ * Check if two scalars are mostly equal.
+ */
+INLINE_MAYBE
+bool scal_isequal(scal_t a, scal_t b)
+{
+ return scal_isequal2(a, b, SCAL_EPSILON);
+}
+
/*
* Clamp a scalar between two values.
*/
return a < b ? b : a;
}
+/*
+ * Define generic MIN and MAX macros.
+ */
+#ifndef MIN
+#define MIN(A,B) (((A) < (B)) ? (A) : (B))
+#endif
+#ifndef MAX
+#define MAX(A,B) (((A) > (B)) ? (A) : (B))
+#endif
+
/*
* Define some macros for packing and unpacking bytes to and from larger ints.
* an error condition and an abort(3) occurs.
* return.
*/
+#if VERBOSITY >= 1
#define TRY_DO(L, K, ARGS...) \
printf("* " L "... ", ##ARGS); \
fflush(stdout); \
if ((K) == 0) printf("done!\n"); \
else abort()
+#else
+#define TRY_DO(L, K, ARGS...) \
+if ((K) != 0) abort()
+#endif
/*
* Trim white space off of both sides of a string.
*/
INLINE_MAYBE
-void trim(char *str)
+char* trim(char *str)
{
rtrim(str);
ltrim(str);
+ return str;
}