[Spice-devel] [PATCH spice-common] codegen: Define identity macros for enum types
Frediano Ziglio
fziglio at redhat.com
Thu Nov 16 12:12:17 UTC 2017
>
> Hey,
>
> Some concrete examples of what you are going to do with it would be
> useful ;)
>
> Christophe
>
> On Mon, Nov 13, 2017 at 01:16:32PM +0000, Frediano Ziglio wrote:
> > An identity macro in C is a macro defined as
> >
> > #define SOME_NAME SOME_NAME
> >
> > They are often used to make possible to use preprocessor to check
> > for values existence like
> >
> > #ifdef SOME_NAME
> > ... use SOME_NAME ...
> > #endif
This IMO is a concrete example. A more concrete would be another
commit but looks weird putting a hash to a not merged commit.
Or should I inline the commit here?
> >
> > Defining these macro for each enumeration value allows to do finer
> > check in the code that uses spice-protocol.
> >
> > Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> > ---
> > python_modules/codegen.py | 10 ++++++++++
> > python_modules/ptypes.py | 2 ++
> > spice_codegen.py | 2 ++
> > 3 files changed, 14 insertions(+)
> >
> > diff --git a/python_modules/codegen.py b/python_modules/codegen.py
> > index f7a2048..6143905 100644
> > --- a/python_modules/codegen.py
> > +++ b/python_modules/codegen.py
> > @@ -327,6 +327,16 @@ class CodeWriter:
> > def macro(self, name, args, define):
> > self.write("#define %s(%s) %s" % (name, args, define)).newline()
> >
> > + def identity_macro(self, name):
> > + """Define a preprocessor macro with same name as value.
> > + This helps writing conditional code using preprocessor defines.
> > + """
> > + assert(self.at_line_start)
> > + indentation = self.indentation
> > + self.indentation = 0
> > + self.writeln("#define %s %s" % (name, name))
> > + self.indentation = indentation
> > +
> > def ifdef(self, name):
> > indentation = self.indentation
> > self.indentation = 0;
> > diff --git a/python_modules/ptypes.py b/python_modules/ptypes.py
> > index 63a7a2f..47b32b5 100644
> > --- a/python_modules/ptypes.py
> > +++ b/python_modules/ptypes.py
> > @@ -381,6 +381,7 @@ class EnumType(EnumBaseType):
> > writer.write(" = %d" % (i))
> > writer.write(",")
> > writer.newline()
> > + writer.identity_macro(self.c_enumname(i))
> > current_default = i + 1
> > writer.newline()
> > writer.write(codegen.prefix_underscore_upper(self.name.upper(),
> > "ENUM_END"))
> > @@ -434,6 +435,7 @@ class FlagsType(EnumBaseType):
> > writer.write(" = (1 << %d)" % (i))
> > writer.write(",")
> > writer.newline()
> > + writer.identity_macro(self.c_enumname(i))
> > current_default = i + 1
> > writer.newline()
> > writer.write(codegen.prefix_underscore_upper(self.name.upper(),
> > "MASK"))
> > diff --git a/spice_codegen.py b/spice_codegen.py
> > index 76d7c5e..bb50f31 100755
> > --- a/spice_codegen.py
> > +++ b/spice_codegen.py
> > @@ -40,6 +40,7 @@ def write_channel_enums(writer, channel, client,
> > describe):
> > else:
> > writer.writeln("%s = %s," % (enum, m.value))
> > i = m.value + 1
> > + writer.identity_macro(enum)
> > if describe:
> > writer.writeln("{ 0, NULL }");
> > else:
> > @@ -68,6 +69,7 @@ def write_channel_type_enum(writer, describe=False):
> > else:
> > writer.writeln("%s = %s," % (enum, c.value))
> > i = c.value + 1
> > + writer.identity_macro(enum)
> > writer.newline()
> > if describe:
> > writer.writeln("{ 0, NULL }")
Frediano
More information about the Spice-devel
mailing list