Skip to content

hsc2hs: quoting of macro arguments containing commas

I came across the following issue in hsc2hs:

when requesting a size of a C structure with #size (or similarly this
may apply to #peek, #poke, #offset macros), and the structure is
declared "anonymously", and contains multiple field declaration of the
same type such as:

struct {int ab,cd;}

then #size(struct {int ab,cd;}) will result in

hsc_size(struct {int ab,cd;})

which will fail because of the comma inside the structure makes the
macro recognize 2 arguments instead of 1.

GCC's preprocessor allows variadic macros defined like

#define __quote__(x...) x

If hsc_size is called:

hsc_size(__quote__(struct {int ab,cd;}))

then error does not occur.

Similarly:

hsc_peek(__quote__(struct {int ab,cd;}),cd)

because __quote__ is scanned first, and its result is treated as a
single argument.

I looked through cpp.info, but could not find any other way to quote
macro arguments.

Is it possible to update hsc2hs (Main.hs I believe) to emit macro
calls involving C types in the way described above?

i. e. #size(t) becomes hsc_size(__quote__(t)),
#peek(t,f) becomes hsc_peek(__quote__(t),f) etc.

when hsc2hs generates the C file from a hsc source.

PS I am working with hsc2hs from the GHC 6.2.2 distribution. I
couldn't find such fixes in the changelog since then.

I believe, the person maintaining hsc2hs might be able to implement
these fixes faster than if I tried.

PPS This will work with GCC, but I am not sure abouth other compilers
(like Microsoft C)

-- 
Dimitry Golubovsky

Anywhere on the Web
Trac metadata
Trac field Value
Version 6.4.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component None
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information