# ifndef _MACROS_H_ # define _MACROS_H_ # include "config.h" # include <status.h> /* Special chars. */ # define CONV_CHAR ([ '%' : 1, '@' : 1 ]) # define DIGIT ([ '0' : 1, '1' : 1, '2' : 1, '3' : 1, '4' : 1, \ '5' : 1, '6' : 1, '7' : 1, '8' : 1, '9' : 1 ]) # define FLAGS ([ '-' : 1, '_' : 1, '|' : 1, '+' : 1, ' ' : 1, '#' : 1, \ '0' : 1, '<' : 1, '=' : 1, '>' : 1, '`' : 1, '~' : 1, \ '&' : 1]) /* Error checks. */ # ifdef __CLOSE_TO_C__ # define TYPECHECK(type, arg, n) \ if (!(type##p (arg))) {error ("Sprintf: bad argument " + (n + 1));} # else # define TYPECHECK(type, arg, n) \ if (!(type##p (arg))) {error ("Sprintf: bad argument " + n);} # endif # define ARGCOUNTCHECK(n, m) \ if ((n) == (m)) {error ("Sprintf: too few arguments");} # define ENDCHECK(c, e) \ if ((c) == (e)) {error ("Sprintf: missing format conversion character");} /* My favourites. */ # define Case break; case # define Default break; default # define MIN(x, y) ((x) < (y) ? (x) : (y)) # define intp(arg) (typeof (arg) == T_INT) # define floatp(arg) (typeof (arg) == T_FLOAT) # define stringp(arg) (typeof (arg) == T_STRING) # define objectp(arg) (typeof (arg) == T_OBJECT) # define arrayp(arg) (typeof (arg) == T_ARRAY) # define mappingp(arg) (typeof (arg) == T_MAPPING) # ifdef __FLOATS__ # define nump(arg) (intp (arg) || floatp (arg)) # else # define nump(arg) (intp (arg)) # endif # define NOTE # endif