Ahoy,
I am writing bindings for a library which includes regex.h from libc6
(version 2.6.3-3 in Debian). c2hs 0.14.5 refuses to parse regex.h as
follows:
% c2hs Regex.chs
c2hs: Error in C header file.
/usr/include/regex.h:570: (column 125) [FATAL]
>>> Syntax error!
The symbol `restrict' does not fit here.
where Regex.chs contains:
module Regex
where
#include
The offending section of regex.h is:
/* GCC 2.95 and later have "__restrict"; C99 compilers have
"restrict", and "configure" may have defined "restrict". */
#ifndef __restrict
# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__))
# if defined restrict || 199901L <= __STDC_VERSION__
# define __restrict restrict
# else
# define __restrict
# endif
# endif
#endif
/* gcc 3.1 and up support the [restrict] syntax. */
#ifndef __restrict_arr
# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
# define __restrict_arr __restrict
# else
# define __restrict_arr
# endif
#endif
/* POSIX compatibility. */
extern int regcomp _RE_ARGS ((regex_t *__restrict __preg,
const char *__restrict __pattern,
int __cflags));
extern int regexec _RE_ARGS ((const regex_t *__restrict __preg,
const char *__restrict __string, size_t __nmatch,
regmatch_t __pmatch[__restrict_arr],
int __eflags));
which, according to c2hs -k, is transformed by cpp on my system to:
# 566 "/usr/include/regex.h" 3 4
extern int regcomp (regex_t *__restrict __preg, const char *__restrict __pattern, int __cflags);
extern int regexec (const regex_t *__restrict __preg, const char *__restrict __string, size_t __nmatch, regmatch_t __pmatch[__restrict], int __eflags);
`c2hs --cppopts="-D__restrict=" ...` works around the problem, so this
is irritating rather than a showstopper. I spoke to Duncan about this on
IRC yesterday: this is still present with 0.14.5:
% c2hs --version
C->Haskell Compiler, version 0.14.5 Travelling Lightly, 12 Dec 2005
build platform is "i686-pc-linux-gnu" <1, True, True, 1>
If I can provide any more information, let me know.
Will