extern int MAIN_assert_line;
extern char MAIN_assert_file[128];
extern void MAIN_assert (int x, char* txt, ...);
#define ASSERT (MAIN_assert_line = __LINE__,
strcpy (MAIN_assert_file, __FILE__)), MAIN_assert
.......
int MAIN_assert_line = 0;
char MAIN_assert_file[128] = "";
void MAIN_assert (int x, char* txt, ...)
{
char buf[256];
va_list va;
if (0 == x)
{
sprintf (buf, "file %s line %d \"",
MAIN_assert_file, MAIN_assert_line);
va_start(va, txt);
vsprintf (buf + strlen (buf), txt, va);
strcat (buf, "\"\n");
fprintf (stderr, buf);
MAIN_kill (); // frees everything
exit (1);
}
}
........
ASSERT (n < 5, "buffer overflow %d", n);
#define B0(u) ((1 - (u)) * (1 - (u)) * (1 - (u)))
#define B1(u) (3 * (u) * (1 - (u)) * (1 - (u)))
#define B2(u) (3 * (u) * (u) * (1 - (u)))
#define B3(u) ((u) * (u) * (u))
#define ADD(i, j) (rez += ctrl[i][j] * B##i (u) * B##j (v))
float h (float u, float v)
{
float rez = 0.0f;
ADD(0, 0);
ADD(0, 1);
ADD(0, 2);
ADD(0, 3);
ADD(1, 0);
ADD(1, 1);
ADD(1, 2);
ADD(1, 3);
ADD(2, 0);
ADD(2, 1);
ADD(2, 2);
ADD(2, 3);
ADD(3, 0);
ADD(3, 1);
ADD(3, 2);
ADD(3, 3);
return rez;
}
#include <stdio.h>
#define WRITE_OP(operator, a, b) printf ("%d "#operator" %d = %d\n",
((int)(a)), ((int)(b)), ((int)(a)) operator ((int)(b)))
void main (void)
{
WRITE_OP (+, 5, 3);
WRITE_OP (*, 7, -5);
}
//result:
//5 + 3 = 8
//7 * -5 = -35
