Good stuff!  However, regarding the function pointer thing, i've got compilers
(tcc and lcc) which disagree with you.

Using NULL where a function pointer is expected is considered an error by 
tcc, and a mandatory warning by lcc.  It is my understanding that conversion
between data pointers and function pointers is forbidden under ANSI C89.  I've
sent in several patches which jump through some fairly painful hoops because of
this.  It seems rather necessary though, as we are committed to building 
as ANSIly as possible.

Here are a page on the matter i found on google.  I know i had some 
others, but I can't find them at the moment.

   http://www.devx.com/free/tips/tipview.asp?content_id=114
   
Tis a bummer, but it seems necessary.

--Josh

At 18:32 on 02/22/2002 CST, Brian Lee Ray <[EMAIL PROTECTED]> wrote:

> Fixes various warts in header files, such as:
> * macros
>   -added parens to prevent problems with operator precedence
>   -removed ; at end
> * removed SSIZE_MAX, since ssize_t is no longer used
> * removed some misinformation about NULL and function pointers
>   from a comment.
> * added some more INLINE definitions for MSVC and C99 compilers
> * fixed occurences of 2<<n where 1<<n is obviously is what was
>   meant (esp. clear upon reading the comments).
> 
> ##################################
> diff -ur include/parrot/interp_guts.h include/myparrot/interp_guts.h
> --- include/parrot/interp_guts.h Thu Dec 27 11:08:48 2001
> +++ include/myparrot/interp_guts.h Fri Feb 22 17:38:04 2002
> @@ -5,7 +5,7 @@
>  #ifndef INTERP_GUTS_H
>  #define INTERP_GUTS_H
> 
> -#define DO_OP(PC,INTERP) PC = ((INTERP->op_func_table)[*PC])(PC,INTERP);
> +#define DO_OP(PC,INTERP) (PC = ((INTERP->op_func_table)[*PC])(PC,INTERP))
> 
>  #endif /* INTERP_GUTS_H */
> 
> diff -ur include/parrot/io.h include/myparrot/io.h
> --- include/parrot/io.h Thu Feb 21 18:53:34 2002
> +++ include/myparrot/io.h Fri Feb 22 17:43:14 2002
> @@ -17,9 +17,6 @@
>  #if !defined(PARROT_IO_H_GUARD)
>  #define PARROT_IO_H_GUARD
> 
> -#ifndef SSIZE_MAX
> -#define SSIZE_MAX 8192
> -#endif
> 
>  #ifndef STDIN_FILENO
>  # define STDIN_FILENO 0
> diff -ur include/parrot/packfile.h include/myparrot/packfile.h
> --- include/parrot/packfile.h Mon Feb 11 11:57:12 2002
> +++ include/myparrot/packfile.h Fri Feb 22 17:46:58 2002
> @@ -8,8 +8,8 @@
> 
>  #include <parrot/parrot.h>
> 
> -#define PF_NCONST(pf)  (pf)->const_table->const_count
> -#define PF_CONST(pf,i) (pf)->const_table->constants[i]
> +#define PF_NCONST(pf)  ((pf)->const_table->const_count)
> +#define PF_CONST(pf,i) ((pf)->const_table->constants[(i)])
> 
> 
>  /*
> diff -ur include/parrot/parrot.h include/myparrot/parrot.h
> --- include/parrot/parrot.h Thu Feb 21 18:53:34 2002
> +++ include/myparrot/parrot.h Fri Feb 22 17:52:28 2002
> @@ -75,21 +75,21 @@
> 
>  /* define some shortcuts for dealing with function pointers */
>  /* according to ANSI C, casting between function and non-function pointers
> is
> - * no good.  So we should use "funcptr_t" in place of void* when dealing
> with
> - * function pointers and NULLfunc in place of NULL */
> + * no good, except in the special case of NULL.  So we should use
> "funcptr_t"
> + * in place of void* when dealing with function pointers*/
>  typedef void (*funcptr_t)(void);
> -#define NULLfunc (funcptr_t)0
> +#define NULLfunc NULL
> 
>  /* Provide support for inline keyword where available.  Just make sure to
> use
>   * "INLINE" instead and it will DTRT. */
> -#ifdef __cplusplus
> +#if  defined(__cplusplus) || (defined(__STDC__)&&__STDC_VERSION__>199901L)
>      #define INLINE inline
> +#elif defined(__GNUC__)
> +    #define INLINE __inline__
> +#elif definded(_MSC_VER)
> +    #define INLINE __inline
>  #else
> -    #ifdef __GNUC__
> -        #define INLINE __inline__
> -    #else
> -        #define INLINE
> -    #endif
> +    #define INLINE
>  #endif
> 
>  /* On Win32 we need the constant O_BINARY for open() (at least for Borland
> C),
> diff -ur include/parrot/pmc.h include/myparrot/pmc.h
> --- include/parrot/pmc.h Thu Feb 21 18:53:34 2002
> +++ include/myparrot/pmc.h Fri Feb 22 17:53:10 2002
> @@ -47,30 +47,30 @@
>       * classes. It is suggested that you alias these within an individual
>       * class's header file
>       */
> -    PMC_private0_FLAG   = 2 << 0,
> -    PMC_private1_FLAG   = 2 << 1,
> -    PMC_private2_FLAG   = 2 << 2,
> -    PMC_private3_FLAG   = 2 << 3,
> -    PMC_private4_FLAG   = 2 << 4,
> -    PMC_private5_FLAG   = 2 << 5,
> -    PMC_private6_FLAG   = 2 << 6,
> -    PMC_private7_FLAG   = 2 << 7,
> +    PMC_private0_FLAG   = 1 << 0,
> +    PMC_private1_FLAG   = 1 << 1,
> +    PMC_private2_FLAG   = 1 << 2,
> +    PMC_private3_FLAG   = 1 << 3,
> +    PMC_private4_FLAG   = 1 << 4,
> +    PMC_private5_FLAG   = 1 << 5,
> +    PMC_private6_FLAG   = 1 << 6,
> +    PMC_private7_FLAG   = 1 << 7,
> 
>      /* The rest of the flags are for use by Parrot */
> 
>      /* Set if the PMC has a destroy method that must be called */
> -    PMC_active_destroy_FLAG = 2 << 8,
> +    PMC_active_destroy_FLAG = 1 << 8,
>      /* Set if the PMC can hold multiple PMCs. (Hash, array, list,
>         whatever) */
> -    PMC_is_container_FLAG   = 2 << 9,
> +    PMC_is_container_FLAG   = 1 << 9,
>      /* Set to true if the PMC data pointer points to something that
>         looks like a string or buffer pointer */
> -    PMC_is_buffer_ptr_FLAG  = 2 << 10,
> +    PMC_is_buffer_ptr_FLAG  = 1 << 10,
>      /* Set to true if the data pointer points to a PMC */
> -    PMC_is_PMC_ptr_FLAG     = 2 << 11,
> +    PMC_is_PMC_ptr_FLAG     = 1 << 11,
>      /* Set to true if the PMC has a private GC function. For PMCs the
>         GC system can't snoop into */
> -    PMC_private_GC_FLAG     = 2 << 12
> +    PMC_private_GC_FLAG     = 1 << 12
>  } PMC_flags;
> 
>  /* XXX add various bit test macros once we have need of them */
> diff -ur include/parrot/rx.h include/myparrot/rx.h
> --- include/parrot/rx.h Thu Feb 21 18:53:34 2002
> +++ include/myparrot/rx.h Fri Feb 22 17:56:22 2002
> @@ -79,11 +79,11 @@
>  BOOLVAL bitmap_match(Bitmap, INTVAL);
>  void bitmap_destroy(Bitmap);
> 
> -#define RX_dUNPACK(pmc)            rxinfo *rx=(rxinfo *)pmc->data
> -#define RxCurChar(rx)              (char)string_ord(rx->string, rx->index)
> +#define RX_dUNPACK(pmc)            rxinfo *rx=(rxinfo *)(pmc)->data
> +#define RxCurChar(rx)              ((char)string_ord((rx)->string,
> (rx)->index))
> 
> -#define RxAdvance(rx)              RxAdvanceX(rx, 1)
> -#define RxAdvanceX(rx, x)          rx->index += x * rx->whichway
> +#define RxAdvance(rx)              RxAdvanceX((rx), 1)
> +#define RxAdvanceX(rx, x)          ((rx)->index += (x) * (rx)->whichway)
> 
>  #define RxCaseInsensitive_on(rx)   RxFlagOn(rx,
> enum_rxflags_case_insensitive)
>  #define RxCaseInsensitive_off(rx)  RxFlagOff(rx,
> enum_rxflags_case_insensitive)
> @@ -101,10 +101,10 @@
>  #define RxReverse_off(rx)          RxFlagOff(rx, enum_rxflags_reverse)
>  #define RxReverse_test(rx)         RxFlagTest(rx, enum_rxflags_reverse)
> 
> -#define RxFlagOn(rx, flag)         (rx->flags |=  flag)
> -#define RxFlagOff(rx, flag)        (rx->flags &= ~flag)
> -#define RxFlagTest(rx, flag)       (rx->flags  &  flag)
> +#define RxFlagOn(rx, flag)         ((rx)->flags |=  (flag))
> +#define RxFlagOff(rx, flag)        ((rx)->flags &= ~(flag))
> +#define RxFlagTest(rx, flag)       ((rx)->flags  &  (flag))
> 
> -#define RxFlagsOff(rx)             rx->flags = enum_rxflags_none
> +#define RxFlagsOff(rx)             ((rx)->flags = enum_rxflags_none)
> 
>  #endif /* PARROT_RX_H_GUARD */
> diff -ur include/parrot/unicode.h include/myparrot/unicode.h
> --- include/parrot/unicode.h Thu Feb 21 18:53:34 2002
> +++ include/myparrot/unicode.h Fri Feb 22 17:59:44 2002
> @@ -46,7 +46,7 @@
>                        (uv) < 0x800   ? 2 : \
>                        (uv) < 0x10000 ? 3 : 4 )
> 
> -#define UTF16SKIP(s) ( UNICODE_IS_HIGH_SURROGATE(*s) ? 2 : 1 )
> +#define UTF16SKIP(s) ( UNICODE_IS_HIGH_SURROGATE(*(s)) ? 2 : 1 )
> 
>  /*
> 
> diff -ur include/parrot/warnings.h include/myparrot/warnings.h
> --- include/parrot/warnings.h Thu Feb 21 18:53:34 2002
> +++ include/myparrot/warnings.h Fri Feb 22 18:00:38 2002
> @@ -10,9 +10,9 @@
> 
>  #include "parrot/parrot.h"
> 
> -#define PARROT_WARNINGS_on(interp, flag)   interp->warns->classes |=  flag
> -#define PARROT_WARNINGS_off(interp, flag)  interp->warns->classes &= ~flag
> -#define PARROT_WARNINGS_test(interp, flag) interp->warns->classes &   flag
> +#define PARROT_WARNINGS_on(interp, flag)   ((interp)->warns->classes |=
> (flag))
> +#define PARROT_WARNINGS_off(interp, flag)  ((interp)->warns->classes &=
> ~(flag))
> +#define PARROT_WARNINGS_test(interp, flag) ((interp)->warns->classes &
> (flag))
> 
>  INTVAL
>  Parrot_warn(struct Parrot_Interp *, INTVAL warnclass, const char* message,
> ....);
> 
> 


Reply via email to