1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
/*
* functions.h -- header file for functions.c
*
* Copyright 1995, 2002 EPIC Software Labs
* See the COPYRIGHT file for copyright information
*/
#ifndef __functions_h__
#define __functions_h__
/*
* These are defined to make the construction of the built-in functions
* easier and less prone to bugs and unexpected behaviors. As long as
* you consistently use these macros to do the dirty work for you, you
* will never have to do bounds checking as the macros do that for you. >;-)
*
* Yes, i realize it makes the code slightly less efficient, but i feel that
* the cost is minimal compared to how much time i have spent over the last
* year debugging these functions and the fact i wont have to again. ;-)
*/
#define EMPTY empty_string
#define EMPTY_STRING malloc_strdup(EMPTY)
#define RETURN_EMPTY return EMPTY_STRING
#define RETURN_IF_EMPTY(x) if (empty( (x) )) RETURN_EMPTY
#define GET_INT_ARG(x, y) {RETURN_IF_EMPTY((y)); x = my_atol(safe_new_next_arg((y), &(y)));}
#define GET_FLOAT_ARG(x, y) {RETURN_IF_EMPTY((y)); x = atof(safe_new_next_arg((y), &(y)));}
#define GET_STR_ARG(x, y) {RETURN_IF_EMPTY((y)); x = new_next_arg((y), &(y));}
#define GET_A_STR_ARG(x, y) {GET_STR_ARG((x), (y));RETURN_IF_EMPTY((x));}
#define RETURN_MSTR(x) return ((x) ? (x) : EMPTY_STRING)
#define RETURN_STR(x) return malloc_strdup((x) ? (x) : EMPTY)
#define RETURN_INT(x) return malloc_strdup(ltoa((x)))
#define RETURN_FLOAT(x) return malloc_sprintf(NULL, "%.50g", (double) (x))
#define RETURN_FLOAT2(x) return malloc_sprintf(NULL, "%.2f", (double) (x))
/*
* XXXX REALLY REALLY REALLY REALLY REALLY REALLY REALLY IMPORTANT! XXXX
*
* Don't ever Ever EVER pass a function call to the RETURN_* macros.
* They _WILL_ evaluate the term twice, and for some function calls,
* that can result in a memory leak, or worse.
*/
#define BUILT_IN_FUNCTION(x, y) static char * x (char * y)
#endif
|