X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/c76e14da4bf475d4f85090d5fdde85d8dddb5833..c0cac722f7e5d7498528a67a37477cdf9ed1745c:/data/c.m4 diff --git a/data/c.m4 b/data/c.m4 index 0405d979..1eca2e92 100644 --- a/data/c.m4 +++ b/data/c.m4 @@ -44,35 +44,42 @@ m4_define([b4_copyright], You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */]) + Boston, MA 02111-1307, USA. */]) ## ------------ ## ## Data Types. ## ## ------------ ## -# b4_sint_type(MAX) -# ----------------- -# Return the smallest signed int type able to handle the number MAX. -m4_define([b4_sint_type], -[m4_if(m4_eval([$1 <= 127]), [1], [signed char], - m4_eval([$1 <= 32767]), [1], [signed short], - [signed int])]) +# b4_ints_in(INT1, INT2, LOW, HIGH) +# --------------------------------- +# Return 1 iff both INT1 and INT2 are in [LOW, HIGH], 0 otherwise. +m4_define([b4_ints_in], +[m4_eval([$3 <= $1 && $1 <= $4 && $3 <= $2 && $2 <= $4])]) + + +# b4_int_type(MIN, MAX) +# --------------------- +# Return the smallest int type able to handle numbers ranging from +# MIN to MAX (included). +m4_define([b4_int_type], +[m4_if(b4_ints_in($@, [0], [255]), [1], [unsigned char], + b4_ints_in($@, [-128], [128]), [1], [signed char], + + b4_ints_in($@, [0], [65535]), [1], [unsigned short], + b4_ints_in($@, [-32768], [32767]), [1], [short], + + m4_eval([0 <= $1]), [1], [unsigned int], -# b4_uint_type(MAX) -# ----------------- -# Return the smallest unsigned int type able to handle the number MAX. -m4_define([b4_uint_type], -[m4_if(m4_eval([$1 <= 255]), [1], [unsigned char], - m4_eval([$1 <= 65535]), [1], [unsigned short], - [unsigned int])]) + [int])]) +# b4_int_type_for(NAME) +# --------------------- +# Return the smallest int type able to handle numbers ranging from +# `NAME_min' to `NAME_max' (included). +m4_define([b4_int_type_for], +[b4_int_type($1_min, $1_max)]) ## ------------------------- ## @@ -116,3 +123,55 @@ m4_map_sep([ b4_token_enum], [, m4_map([b4_token_define], [$@]) ]) ]) + + +## ---------------------------------------------- ## +## Declaring C functions in both K&R and ANSI-C. ## +## ---------------------------------------------- ## + + +# b4_c_function(NAME, RETURN-VALUE, [TYPE1, NAME1], ...) +# ------------------------------------------------ +# Declare the function NAME. +m4_define([b4_c_function], +[$2 +#if defined (__STDC__) || defined (__cplusplus) +$1 (b4_c_ansi_args(m4_shiftn(2, $@))) +#else +$1 (b4_c_knr_arg_names(m4_shiftn(2, $@))) +b4_c_knr_arg_decls(m4_shiftn(2, $@)) +#endif[]dnl +]) + + +# b4_c_ansi_args([TYPE1, NAME1], ...) +# ----------------------------------- +# Output the arguments ANSI-C definition. +m4_define([b4_c_ansi_args], +[m4_map_sep([b4_c_ansi_arg], [, ], [$@])]) + +m4_define([b4_c_ansi_arg], +[$1 $2]) + + +# b4_c_knr_args([TYPE1, NAME1], ...) +# ---------------------------------- +# Output the argument names. +m4_define([b4_c_knr_arg_names], +[m4_map_sep([b4_c_knr_arg_name], [, ], [$@])]) + +m4_define([b4_c_knr_arg_name], +[$2]) + + +# b4_c_knr_args([TYPE1, NAME1], ...) +# ---------------------------------- +# Output the K&R argument declarations. +m4_define([b4_c_knr_arg_decls], +[m4_map_sep([b4_c_knr_arg_decl], + [ +], + [$@])]) + +m4_define([b4_c_knr_arg_decl], +[ $1 $2;])