Re: patch to allow function attriute macros in .gob files

View: New views
1 Messages — Rating Filter:   Alert me  

Parent Message unknown Re: patch to allow function attriute macros in .gob files

by Jiri Lebl :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message



Sorry about not getting back to you right away, things are a little bit
hectic for me at the moment.  Anyway, I'm ccing the gob-list mailing list.  I
definitely thing this is a good modification.  If you can clean it up as you
say and test it well, then I'll put it into svn and at some point make a new
release.  It would also be good to clean up your notes and test programs in
such a way that would be usable for a release.

Thanks!

George

On Wed, Feb 28, 2007 at 07:42:20AM -0900, Britton Kerin wrote:

>
> Actually it just allows G_GNUC_PRINTF, _SCANF and _FORMAT.  Some other
> attributes might be useful but not enough to justify the code generation
> changes that look necessary to make them work.
>
> There are some more things that could be done (better diagnostics rather
> than parse rejects) if you think the patch worth including at all I can
> work on them.
>
> The patch is against the pristine gob-2.0.14 sources most of it is crud
> from my different version of flex in the generated lexer.c.
>
>

> diff -u -Naur pristine/gob2-2.0.14/doc/gob2.1.in modified/gob2-2.0.14/doc/gob2.1.in
> --- pristine/gob2-2.0.14/doc/gob2.1.in 2005-12-16 14:59:36.000000000 -0500
> +++ modified/gob2-2.0.14/doc/gob2.1.in 2007-02-28 06:31:17.000000000 -0500
> @@ -604,15 +604,33 @@
>  instance and it is checked for being null and the type will also be
>  checked.
>  .PP
> +.B "Function attributes:
> +.PP
> +The GLib function attribute macros G_GNUC_PRINTF, G_GNUC_SCANF, and
> +G_GNUC_FORMAT can optionally be included after the argument list, for
> +example:
> +.nf
> +
> +  public void
> +  print (self, const char *format (check null), ...) G_GNUC_PRINTF(2, 3)
> +
> +.fi
> +.PP
> +This will produce a prototype which will generate a warning at compile
> +time if the contents of the format argument (argument number 2) aren't
> +consistent with the types and number of the subsequent variadic
> +arguments (the first of which is argument number 3).
> +.PP
>  .B "Error return:"
>  .PP
>  Methods which have a return value, there also has to be something
> -returned if there is an error, such as if a precondition is not met.  The
> -default is 0, casted to the type of the method.  If you need to return
> -something else then you can specify an "onerror" keyword after the
> -prototype and after that a number, a token (an identifier) or a bit of C
> -code enclosed in braces {}.  The braces will not be printed into the
> -output, they just delimit the string.  For example:
> +returned if there is an error, such as if a precondition is not met.
> +The default is 0, casted to the type of the method.  If you need to
> +return something else then you can specify an "onerror" keyword after
> +the prototype and any optional function attribute macros, and after
> +that a number, a token (an identifier) or a bit of C code enclosed in
> +braces {}.  The braces will not be printed into the output, they just
> +delimit the string.  For example:
>  .nf
>  
>    public void * get_something (self, int i (check >= 0)) onerror NULL {
> diff -u -Naur pristine/gob2-2.0.14/src/checks.c modified/gob2-2.0.14/src/checks.c
> --- pristine/gob2-2.0.14/src/checks.c 2005-12-16 14:03:28.000000000 -0500
> +++ modified/gob2-2.0.14/src/checks.c 2007-02-26 15:00:44.000000000 -0500
> @@ -479,6 +479,30 @@
>  }
>  
>  void
> +check_func_attrs(Class *c)
> +{
> +  GList *li;
> +  for (li = c->nodes; li != NULL; li = li->next) {
> +    Node *n = li->data;
> +    if (n->type == METHOD_NODE) {
> +      Method *m = (Method *)n;
> +      if ((m->method == INIT_METHOD ||
> +   m->method == CLASS_INIT_METHOD)
> +  && (m->funcattrs != NULL && strlen(m->funcattrs) != 0)) {
> + /* This is actually dead code at the moment, since the parser
> +   doesn't accept attributes to the init or class_init
> +   syntactic forms anyway.  But it could easily be made to do
> +   so, and also for virtual override and signal methods, and
> +   then we could give kinder error messages here.  */
> + error_print (GOB_ERROR, m->line_no,
> +     "function attributes (G_GNUC_PRINTF, etc.) aren't "
> +                     "supported for the init or class_init methods");
> +      }
> +    }
> +  }
> +}
> +
> +void
>  check_for_class_destructors (Class *c)
>  {
>   GList *li;
> diff -u -Naur pristine/gob2-2.0.14/src/checks.h modified/gob2-2.0.14/src/checks.h
> --- pristine/gob2-2.0.14/src/checks.h 2005-07-22 14:48:06.000000000 -0400
> +++ modified/gob2-2.0.14/src/checks.h 2007-02-26 14:50:46.000000000 -0500
> @@ -36,6 +36,7 @@
>  void check_argument_types (Class *c);
>  void check_property_types (Class *c);
>  void check_func_arg_checks (Class *c);
> +void            check_func_attrs                (Class *c);
>  void check_for_class_destructors (Class *c);
>  
>  int count_signals (Class *c);
> diff -u -Naur pristine/gob2-2.0.14/src/lexer.c modified/gob2-2.0.14/src/lexer.c
> --- pristine/gob2-2.0.14/src/lexer.c 2005-12-16 15:23:04.000000000 -0500
> +++ modified/gob2-2.0.14/src/lexer.c 1969-12-31 19:00:00.000000000 -0500
> @@ -1,3342 +0,0 @@
> -
> -#line 3 "lex.yy.c"
> -
> -#define  YY_INT_ALIGNED short int
> -
> -/* A lexical scanner generated by flex */
> -
> -#define FLEX_SCANNER
> -#define YY_FLEX_MAJOR_VERSION 2
> -#define YY_FLEX_MINOR_VERSION 5
> -#define YY_FLEX_SUBMINOR_VERSION 31
> -#if YY_FLEX_SUBMINOR_VERSION > 0
> -#define FLEX_BETA
> -#endif
> -
> -/* First, we deal with  platform-specific or compiler-specific issues. */
> -
> -/* begin standard C headers. */
> -#include <stdio.h>
> -#include <string.h>
> -#include <errno.h>
> -#include <stdlib.h>
> -
> -/* end standard C headers. */
> -
> -/* flex integer type definitions */
> -
> -#ifndef FLEXINT_H
> -#define FLEXINT_H
> -
> -/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
> -
> -#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
> -#include <inttypes.h>
> -typedef int8_t flex_int8_t;
> -typedef uint8_t flex_uint8_t;
> -typedef int16_t flex_int16_t;
> -typedef uint16_t flex_uint16_t;
> -typedef int32_t flex_int32_t;
> -typedef uint32_t flex_uint32_t;
> -#else
> -typedef signed char flex_int8_t;
> -typedef short int flex_int16_t;
> -typedef int flex_int32_t;
> -typedef unsigned char flex_uint8_t;
> -typedef unsigned short int flex_uint16_t;
> -typedef unsigned int flex_uint32_t;
> -#endif /* ! C99 */
> -
> -/* Limits of integral types. */
> -#ifndef INT8_MIN
> -#define INT8_MIN               (-128)
> -#endif
> -#ifndef INT16_MIN
> -#define INT16_MIN              (-32767-1)
> -#endif
> -#ifndef INT32_MIN
> -#define INT32_MIN              (-2147483647-1)
> -#endif
> -#ifndef INT8_MAX
> -#define INT8_MAX               (127)
> -#endif
> -#ifndef INT16_MAX
> -#define INT16_MAX              (32767)
> -#endif
> -#ifndef INT32_MAX
> -#define INT32_MAX              (2147483647)
> -#endif
> -#ifndef UINT8_MAX
> -#define UINT8_MAX              (255U)
> -#endif
> -#ifndef UINT16_MAX
> -#define UINT16_MAX             (65535U)
> -#endif
> -#ifndef UINT32_MAX
> -#define UINT32_MAX             (4294967295U)
> -#endif
> -
> -#endif /* ! FLEXINT_H */
> -
> -#ifdef __cplusplus
> -
> -/* The "const" storage-class-modifier is valid. */
> -#define YY_USE_CONST
> -
> -#else /* ! __cplusplus */
> -
> -#if __STDC__
> -
> -#define YY_USE_CONST
> -
> -#endif /* __STDC__ */
> -#endif /* ! __cplusplus */
> -
> -#ifdef YY_USE_CONST
> -#define yyconst const
> -#else
> -#define yyconst
> -#endif
> -
> -/* Returned upon end-of-file. */
> -#define YY_NULL 0
> -
> -/* Promotes a possibly negative, possibly signed char to an unsigned
> - * integer for use as an array index.  If the signed char is negative,
> - * we want to instead treat it as an 8-bit unsigned char, hence the
> - * double cast.
> - */
> -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
> -
> -/* Enter a start condition.  This macro really ought to take a parameter,
> - * but we do it the disgusting crufty way forced on us by the ()-less
> - * definition of BEGIN.
> - */
> -#define BEGIN (yy_start) = 1 + 2 *
> -
> -/* Translate the current start state into a value that can be later handed
> - * to BEGIN to return to the state.  The YYSTATE alias is for lex
> - * compatibility.
> - */
> -#define YY_START (((yy_start) - 1) / 2)
> -#define YYSTATE YY_START
> -
> -/* Action number for EOF rule of a given start state. */
> -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
> -
> -/* Special action meaning "start processing a new file". */
> -#define YY_NEW_FILE yyrestart(yyin  )
> -
> -#define YY_END_OF_BUFFER_CHAR 0
> -
> -/* Size of default input buffer. */
> -#ifndef YY_BUF_SIZE
> -#define YY_BUF_SIZE 16384
> -#endif
> -
> -#ifndef YY_TYPEDEF_YY_BUFFER_STATE
> -#define YY_TYPEDEF_YY_BUFFER_STATE
> -typedef struct yy_buffer_state *YY_BUFFER_STATE;
> -#endif
> -
> -extern int yyleng;
> -
> -extern FILE *yyin, *yyout;
> -
> -#define EOB_ACT_CONTINUE_SCAN 0
> -#define EOB_ACT_END_OF_FILE 1
> -#define EOB_ACT_LAST_MATCH 2
> -
> -    #define YY_LESS_LINENO(n)
> -    
> -/* Return all but the first "n" matched characters back to the input stream. */
> -#define yyless(n) \
> - do \
> - { \
> - /* Undo effects of setting up yytext. */ \
> -        int yyless_macro_arg = (n); \
> -        YY_LESS_LINENO(yyless_macro_arg);\
> - *yy_cp = (yy_hold_char); \
> - YY_RESTORE_YY_MORE_OFFSET \
> - (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
> - YY_DO_BEFORE_ACTION; /* set up yytext again */ \
> - } \
> - while ( 0 )
> -
> -#define unput(c) yyunput( c, (yytext_ptr)  )
> -
> -/* The following is because we cannot portably get our hands on size_t
> - * (without autoconf's help, which isn't available because we want
> - * flex-generated scanners to compile on their own).
> - */
> -
> -#ifndef YY_TYPEDEF_YY_SIZE_T
> -#define YY_TYPEDEF_YY_SIZE_T
> -typedef unsigned int yy_size_t;
> -#endif
> -
> -#ifndef YY_STRUCT_YY_BUFFER_STATE
> -#define YY_STRUCT_YY_BUFFER_STATE
> -struct yy_buffer_state
> - {
> - FILE *yy_input_file;
> -
> - char *yy_ch_buf; /* input buffer */
> - char *yy_buf_pos; /* current position in input buffer */
> -
> - /* Size of input buffer in bytes, not including room for EOB
> - * characters.
> - */
> - yy_size_t yy_buf_size;
> -
> - /* Number of characters read into yy_ch_buf, not including EOB
> - * characters.
> - */
> - int yy_n_chars;
> -
> - /* Whether we "own" the buffer - i.e., we know we created it,
> - * and can realloc() it to grow it, and should free() it to
> - * delete it.
> - */
> - int yy_is_our_buffer;
> -
> - /* Whether this is an "interactive" input source; if so, and
> - * if we're using stdio for input, then we want to use getc()
> - * instead of fread(), to make sure we stop fetching input after
> - * each newline.
> - */
> - int yy_is_interactive;
> -
> - /* Whether we're considered to be at the beginning of a line.
> - * If so, '^' rules will be active on the next match, otherwise
> - * not.
> - */
> - int yy_at_bol;
> -
> -    int yy_bs_lineno; /**< The line count. */
> -    int yy_bs_column; /**< The column count. */
> -    
> - /* Whether to try to fill the input buffer when we reach the
> - * end of it.
> - */
> - int yy_fill_buffer;
> -
> - int yy_buffer_status;
> -
> -#define YY_BUFFER_NEW 0
> -#define YY_BUFFER_NORMAL 1
> - /* When an EOF's been seen but there's still some text to process
> - * then we mark the buffer as YY_EOF_PENDING, to indicate that we
> - * shouldn't try reading from the input source any more.  We might
> - * still have a bunch of tokens to match, though, because of
> - * possible backing-up.
> - *
> - * When we actually see the EOF, we change the status to "new"
> - * (via yyrestart()), so that the user can continue scanning by
> - * just pointing yyin at a new input file.
> - */
> -#define YY_BUFFER_EOF_PENDING 2
> -
> - };
> -#endif /* !YY_STRUCT_YY_BUFFER_STATE */
> -
> -/* Stack of input buffers. */
> -static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
> -static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
> -static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
> -
> -/* We provide macros for accessing buffer states in case in the
> - * future we want to put the buffer states in a more general
> - * "scanner state".
> - *
> - * Returns the top of the stack, or NULL.
> - */
> -#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
> -                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
> -                          : NULL)
> -
> -/* Same as previous macro, but useful when we know that the buffer stack is not
> - * NULL or when we need an lvalue. For internal use only.
> - */
> -#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
> -
> -/* yy_hold_char holds the character lost when yytext is formed. */
> -static char yy_hold_char;
> -static int yy_n_chars; /* number of characters read into yy_ch_buf */
> -int yyleng;
> -
> -/* Points to current character in buffer. */
> -static char *yy_c_buf_p = (char *) 0;
> -static int yy_init = 1; /* whether we need to initialize */
> -static int yy_start = 0; /* start state number */
> -
> -/* Flag which is used to allow yywrap()'s to do buffer switches
> - * instead of setting up a fresh yyin.  A bit of a hack ...
> - */
> -static int yy_did_buffer_switch_on_eof;
> -
> -void yyrestart (FILE *input_file  );
> -void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer  );
> -YY_BUFFER_STATE yy_create_buffer (FILE *file,int size  );
> -void yy_delete_buffer (YY_BUFFER_STATE b  );
> -void yy_flush_buffer (YY_BUFFER_STATE b  );
> -void yypush_buffer_state (YY_BUFFER_STATE new_buffer  );
> -void yypop_buffer_state (void );
> -
> -static void yyensure_buffer_stack (void );
> -static void yy_load_buffer_state (void );
> -static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file  );
> -
> -#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
> -
> -YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size  );
> -YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str  );
> -YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len  );
> -
> -void *yyalloc (yy_size_t  );
> -void *yyrealloc (void *,yy_size_t  );
> -void yyfree (void *  );
> -
> -#define yy_new_buffer yy_create_buffer
> -
> -#define yy_set_interactive(is_interactive) \
> - { \
> - if ( ! YY_CURRENT_BUFFER ){ \
> -        yyensure_buffer_stack (); \
> - YY_CURRENT_BUFFER_LVALUE =    \
> -            yy_create_buffer(yyin,YY_BUF_SIZE ); \
> - } \
> - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
> - }
> -
> -#define yy_set_bol(at_bol) \
> - { \
> - if ( ! YY_CURRENT_BUFFER ){\
> -        yyensure_buffer_stack (); \
> - YY_CURRENT_BUFFER_LVALUE =    \
> -            yy_create_buffer(yyin,YY_BUF_SIZE ); \
> - } \
> - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
> - }
> -
> -#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
> -
> -/* Begin user sect3 */
> -
> -typedef unsigned char YY_CHAR;
> -
> -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
> -
> -typedef int yy_state_type;
> -
> -extern int yylineno;
> -
> -int yylineno = 1;
> -
> -extern char *yytext;
> -#define yytext_ptr yytext
> -
> -static yy_state_type yy_get_previous_state (void );
> -static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
> -static int yy_get_next_buffer (void );
> -static void yy_fatal_error (yyconst char msg[]  );
> -
> -/* Done after the current pattern has been matched and before the
> - * corresponding action - sets up yytext.
> - */
> -#define YY_DO_BEFORE_ACTION \
> - (yytext_ptr) = yy_bp; \
> - yyleng = (size_t) (yy_cp - yy_bp); \
> - (yy_hold_char) = *yy_cp; \
> - *yy_cp = '\0'; \
> - (yy_c_buf_p) = yy_cp;
> -
> -#define YY_NUM_RULES 120
> -#define YY_END_OF_BUFFER 121
> -/* This struct is not used in this scanner,
> -   but its presence is necessary. */
> -struct yy_trans_info
> - {
> - flex_int32_t yy_verify;
> - flex_int32_t yy_nxt;
> - };
> -static yyconst flex_int16_t yy_acclist[651] =
> -    {   0,
> -      121,  117,  120,  116,  117,  120,    1,  118,  120,  117,
> -      118,  120,  117,  120,  117,  120,  117,  120,  105,  117,
> -      120,  105,  117,  120,  117,  120,  109,  117,  120,  109,
> -      117,  120,  109,  117,  120,  109,  117,  120,  116,  117,
> -      120,  117,  120,  117,  120,  109,  117,  120,  109,  117,
> -      120,   29,  117,  120,    1,   30,  118,  120,   29,  117,
> -      118,  120,   29,  117,  120,   29,  117,  120,   29,  117,
> -      120,   53,  117,  120,    1,   54,  118,  120,   53,  117,
> -      118,  120,   45,   53,  117,  120,   53,  117,  120,   53,
> -      117,  120,   53,  117,  120,   51,   53,  117,  120,   52,
> -
> -       53,  117,  120,   53,  117,  120,   53,  117,  120,   49,
> -      117,  120,    1,   50,  118,  120,   49,  117,  118,  120,
> -       48,   49,  117,  120,   49,  117,  120,   49,  117,  120,
> -       62,  117,  120,  117,  120,  109,  117,  120,  109,  117,
> -      120,  109,  117,  120,  113,  117,  120,   65,  117,  120,
> -        1,   66,  118,  120,   65,  117,  118,  120,   64,   65,
> -      117,  120,   65,  117,  120,   65,  117,  120,  117,  120,
> -      117,  120,  117,  120,  117,  120,  109,  117,  120,  109,
> -      117,  120,  109,  117,  120,  109,  117,  120,  109,  117,
> -      120,  109,  117,  120,  109,  117,  120,  109,  117,  120,
> -
> -      109,  117,  120,  109,  117,  120,  109,  117,  120,  109,
> -      117,  120,  114,  117,  120,  115,  117,  120,  102,  117,
> -      120,   46,  117,  120,  103,  117,  120,  104,  117,  120,
> -      117,  120,  109,  117,  120,  109,  117,  120,  109,  117,
> -      120,  109,  117,  120,  109,  117,  120,  109,  117,  120,
> -      109,  117,  120,  109,  117,  120,  109,  117,  120,  109,
> -      117,  120,  109,  117,  120,  109,  117,  120,   10,  117,
> -      120,   10,  117,  118,  120,   10,  117,  120,   10,  117,
> -      120,   10,  117,  120,   10,  117,  120,   15,  117,  120,
> -       15,  117,  118,  120,   15,  117,  120,   15,  117,  120,
> -
> -       15,  117,  120,   15,  117,  120,   18,  117,  120,   18,
> -      117,  118,  120,   18,  117,  120,   18,  117,  120,  105,
> -       23,  105,  105,  108,  109,  109,  109,  109,  109,   36,
> -      109,  109,   28,   24,   44,   37,   47,   25,  109,  109,
> -      109,   63,   26,  112,  111,  109,  109,  109,  109,  109,
> -      109,  109,  109,  109,  109,  109,  109,  109,  109,  109,
> -      109,  109,  109,   27,  109,  109,  109,  109,  109,  109,
> -      109,  109,  109,  109,  109,  109,    9,    7,   14,   13,
> -       11,   12,   14,   17,   16,  110,  110,  105,    3,  105,
> -      105,  108,  106,  107,  109,  109,  109,  109,   31,   35,
> -
> -      109,  109,   42,   38,   40,   19,   20,  109,  109,  109,
> -       80,   21,  109,  109,  109,  109,  109,  109,  109,   75,
> -      109,  109,  109,  109,  109,  109,  109,  109,  109,  109,
> -      109,  109,  109,   22,  109,  109,  109,  109,  109,  109,
> -      109,  109,  109,  109,  109,  109,   12,  108,  106,  107,
> -      109,   57,  109,  109,  109,   32,   33,   34,  109,  109,
> -       43,   39,   41,  109,   61,  109,   60,  109,    6,  109,
> -       78,  109,  109,  109,  109,   70,  109,  109,   73,  109,
> -      109,  109,  109,  109,  109,  109,  109,  109,  109,  109,
> -      109,   67,  109,  109,  109,  109,   70,  109,  109,  109,
> -
> -      109,   90,  109,  109,  109,  109,   96,  109,    8,  108,
> -       55,  109,   56,  109,   58,  109,  109,  109,  109,   60,
> -      109,   79,  109,  109,   76,  109,  109,  109,  109,  109,
> -      109,   74,  109,  109,  109,  109,   69,  109,  109,  109,
> -       91,  109,  109,  109,  109,   95,  109,  109,  109,  109,
> -      109,  109,  109,  109,  109,   77,  109,  109,  109,  109,
> -      109,   81,  109,   87,  109,   71,  109,   68,  109,  109,
> -      109,  109,  109,  109,  109,  109,  109,  109,  109,    4,
> -      109,  109,  109,  109,  109,   82,  109,  109,  109,  109,
> -       86,  109,  109,  109,  109,  109,   92,  109,   93,  109,
> -
> -      109,  109,  109,  109,   85,  109,  109,   88,  109,   89,
> -      109,  109,   72,  109,  109,  109,  109,  109,  109,  109,
> -       84,  109,   83,  109,  109,  109,   98,  109,  109,  109,
> -      109,    4,    2,  100,  109,  109,   97,  109,  109,   99,
> -      109,  119,    5,  109,  101,  109,  109,   94,  109,   59
> -    } ;
> -
> -static yyconst flex_int16_t yy_accept[552] =
> -    {   0,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    2,    4,    7,   10,   13,
> -       15,   17,   19,   22,   25,   27,   30,   33,   36,   39,
> -       42,   44,   46,   49,   52,   55,   59,   63,   66,   69,
> -       72,   75,   79,   83,   87,   90,   93,   96,  100,  104,
> -      107,  110,  113,  117,  121,  125,  128,  131,  134,  136,
> -      139,  142,  145,  148,  151,  155,  159,  163,  166,  169,
> -      171,  173,  175,  177,  180,  183,  186,  189,  192,  195,
> -      198,  201,  204,  207,  210,  213,  216,  219,  222,  225,
> -
> -      228,  231,  233,  236,  239,  242,  245,  248,  251,  254,
> -      257,  260,  263,  266,  269,  272,  276,  279,  282,  285,
> -      288,  291,  295,  298,  301,  304,  307,  310,  314,  317,
> -      320,  320,  320,  321,  322,  322,  322,  323,  323,  323,
> -      324,  325,  326,  326,  327,  328,  329,  330,  330,  330,
> -      330,  330,  330,  330,  330,  330,  331,  332,  333,  334,
> -      334,  334,  334,  334,  334,  335,  335,  336,  336,  336,
> -      337,  338,  339,  339,  340,  341,  342,  343,  343,  344,
> -      344,  345,  345,  345,  346,  347,  348,  349,  350,  351,
> -      352,  353,  354,  355,  356,  357,  358,  359,  360,  361,
> -
> -      362,  363,  364,  365,  365,  366,  367,  368,  369,  370,
> -      371,  372,  373,  374,  375,  376,  377,  378,  378,  378,
> -      378,  379,  379,  380,  380,  380,  381,  382,  382,  384,
> -      385,  386,  387,  387,  388,  389,  389,  390,  391,  392,
> -      393,  393,  394,  395,  396,  397,  398,  399,  399,  399,
> -      399,  399,  399,  400,  400,  400,  401,  401,  401,  402,
> -      403,  403,  404,  404,  404,  404,  405,  406,  406,  407,
> -      407,  407,  408,  409,  410,  411,  412,  412,  412,  413,
> -      413,  413,  414,  415,  416,  417,  418,  419,  420,  422,
> -      423,  424,  425,  426,  427,  428,  429,  430,  431,  432,
> -
> -      433,  434,  434,  435,  436,  437,  438,  439,  440,  441,
> -      442,  443,  444,  445,  446,  447,  447,  448,  448,  449,
> -      450,  450,  451,  451,  452,  454,  455,  456,  456,  456,
> -      456,  456,  457,  457,  458,  459,  459,  460,  461,  461,
> -      462,  463,  464,  464,  465,  467,  469,  469,  470,  471,
> -      473,  474,  475,  476,  478,  479,  481,  482,  483,  484,
> -      485,  486,  487,  488,  489,  490,  491,  492,  494,  495,
> -      496,  497,  499,  500,  501,  502,  504,  505,  506,  507,
> -      509,  509,  510,  510,  510,  511,  513,  515,  517,  517,
> -      517,  517,  517,  517,  517,  518,  519,  519,  519,  520,
> -
> -      522,  524,  525,  527,  528,  529,  530,  531,  532,  534,
> -      535,  536,  537,  539,  540,  541,  543,  544,  545,  546,
> -      548,  549,  550,  551,  552,  552,  552,  552,  552,  552,
> -      552,  553,  554,  554,  554,  555,  556,  558,  559,  560,
> -      561,  562,  564,  566,  568,  570,  571,  572,  573,  574,
> -      575,  576,  577,  578,  579,  580,  580,  580,  581,  581,
> -      581,  582,  583,  583,  583,  584,  585,  586,  588,  589,
> -      590,  591,  593,  594,  595,  596,  597,  599,  601,  602,
> -      603,  603,  603,  603,  603,  603,  604,  605,  605,  605,
> -      607,  608,  610,  612,  613,  615,  616,  617,  618,  619,
> -
> -      620,  621,  621,  621,  621,  621,  621,  621,  621,  621,
> -      621,  621,  623,  625,  626,  627,  629,  630,  631,  632,
> -      632,  633,  633,  633,  633,  633,  634,  634,  636,  637,
> -      639,  640,  642,  642,  642,  643,  643,  643,  644,  645,
> -      647,  647,  647,  648,  648,  648,  650,  650,  650,  651,
> -      651
> -    } ;
> -
> -static yyconst flex_int32_t yy_ec[256] =
> -    {   0,
> -        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
> -        1,    4,    5,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    6,    1,    7,    8,    1,    9,    1,   10,   11,
> -       12,   13,    1,    1,    1,   14,   15,   16,   17,   18,
> -       18,   18,   18,   18,   18,   19,   19,   20,    1,   21,
> -        1,   22,    1,    1,   23,   23,   23,   23,   24,   23,
> -       25,   25,   26,   25,   25,   25,   25,   25,   25,   25,
> -       25,   27,   28,   25,   25,   25,   25,   25,   25,   25,
> -       29,   30,   31,    1,   32,    1,   33,   34,   35,   36,
> -
> -       37,   38,   39,   40,   41,   42,   43,   44,   45,   46,
> -       47,   48,   49,   50,   51,   52,   53,   54,   55,   56,
> -       57,   25,   58,    1,   59,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1
> -    } ;
> -
> -static yyconst flex_int32_t yy_meta[60] =
> -    {   0,
> -        1,    2,    3,    4,    4,    2,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    5,    5,    5,    5,    6,
> -        1,    1,    7,    7,    8,    8,    8,    8,    1,    1,
> -        9,    8,    7,    7,    7,    7,    7,    7,    8,    8,
> -        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
> -        8,    8,    8,    8,    8,    8,    8,    1,    1
> -    } ;
> -
> -static yyconst flex_int16_t yy_base[585] =
> -    {   0,
> -        0,   58,   58,   65,   69,  126,   80,   85,   74,   87,
> -       93,  113,  172, 1318,  131,  136,  225, 1317,  100,  147,
> -      135,  159,  175,  190, 1324, 1327, 1327, 1327, 1327, 1293,
> -      225,   62,  231,  237,    0, 1302,   42,  150,   60,  232,
> -       63,  164,  156,   77, 1327, 1327, 1327, 1306,  173, 1292,
> -     1327, 1327, 1327, 1327,  245,  104,    0, 1327, 1327,  279,
> -     1260, 1327, 1327, 1327, 1327,    0,  262, 1327,  144,  110,
> -      161,  143, 1327, 1327, 1327, 1327, 1327,    0,  282,  275,
> -      214,  279,  283,  171,  285,  263,  182,  138,  219,  266,
> -      179,  287,  295,  270,  292, 1327, 1327, 1327, 1327, 1327,
> -
> -     1327,  296,  297,  298,  311,  288,  170,  310,  226,  308,
> -      326,  329,  299,  307, 1327, 1327, 1303,  351,  359,  360,
> -     1327, 1327, 1302,  365,  366,  371, 1313, 1312,  373,  377,
> -     1304, 1303,  373, 1327, 1309,  377,  383,  390,    0,  397,
> -     1291, 1290, 1289,  365,  302,  332,  385,  417, 1258, 1270,
> -      418, 1265,  373,  375,  310, 1327,  198,  402, 1327,    0,
> -     1295,  380, 1294, 1293, 1327, 1299, 1327,  428, 1255, 1327,
> -     1327, 1327, 1297,  408,  406,  409, 1327, 1285, 1285, 1294,
> -      426,  430, 1265, 1266,   62,  435,  437,  412,  420,  432,
> -      416,  434,  436,  237,  440,  444,  446,  451,  439,  454,
> -
> -      456,  455, 1327, 1291,  457,  459,  460,  463,  464,  468,
> -      471,  472,  479,  480,  474,  481, 1327,  506,  520,  525,
> -     1327,  530, 1327,  512,  532,  537, 1327, 1278, 1327, 1327,
> -     1327, 1327, 1282, 1281,  532, 1287, 1327,  536,    0, 1269,
> -        0, 1268, 1267,  517,  521,  522,  524, 1249, 1236, 1238,
> -     1239, 1224, 1327, 1248, 1222, 1327, 1221, 1237,  526,  536,
> -     1250, 1327, 1266, 1265, 1264, 1327, 1327, 1270, 1327, 1237,
> -     1268, 1327,  537,  538,  540, 1327,  559, 1267, 1327, 1238,
> -      554,  544,  554,  547,  555,  556,  557,  559, 1248,  560,
> -      558,  561,  562,  567,  566,  573,  564,  574,  581,  575,
> -
> -      484, 1264, 1327,  576,  583,  580,  585,  589,  592,  598,
> -      603,  587,  605,  609,  611,  634, 1327,  639, 1246, 1245,
> -     1244, 1243, 1242,  612, 1241,  614,  615, 1227, 1206, 1221,
> -      451, 1327, 1221, 1327, 1327, 1202,  623,  624, 1229, 1327,
> -     1327, 1327, 1210,  627, 1233, 1232,  647, 1327,  631, 1231,
> -      632,  636,  637, 1230,  638, 1229,  639,  640,  642,  648,
> -      641,  649,  654,  651,  650,  655,  652, 1228,  664,  657,
> -      660,  672,  675,  677,  679, 1227,  680,  682,  683, 1226,
> -      704, 1327,  715,  706, 1225, 1224, 1223, 1222, 1197, 1199,
> -      717, 1192, 1201, 1204,  694,  691,    0, 1183,  696,  705,
> -
> -     1215,  708, 1214,  709,  710,  711,  712,  714, 1213,  719,
> -      716,  717, 1212,  720,  722, 1211,  724,  723,  726,  733,
> -      728,  731,  734,  738, 1186, 1179,  771, 1180, 1177, 1168,
> -      744,  737, 1188, 1175,  739,  751, 1182,  759,  756,  748,
> -      752, 1171, 1156, 1155, 1154,  760,  755,  762,  763,  774,
> -      776,  778,  781,  785,  782, 1112, 1087,  819,  751, 1076,
> -      787,  788, 1085, 1053,  790,  791,  792, 1062,  786,  793,
> -      796, 1053,  798,  813,  799,  800, 1044, 1029,  804,  820,
> -      944,  927,  970,  929,  935,  842,  844,  834,  852,  954,
> -      829,  953,  951,  839,  919,  821,  840,  841,  843,  845,
> -
> -      847,  866,  868,  931,  853,  851,  880,  887,  891,  899,
> -      864,  867,  861,  853,  859,  860,  863,  864,  893,  869,
> -     1327,  469,  917,  908,  925, 1327,  907,  417,  901,  415,
> -      911,  304,  285,  944, 1327,  935,  933, 1327,  908,  238,
> -      178,  946,  912,  127,  940,  117,  964,  966, 1327, 1327,
> -      983,  992, 1001, 1010, 1019, 1028, 1037, 1046, 1049, 1053,
> -     1061, 1070, 1079, 1084, 1093, 1102, 1107, 1110, 1113, 1121,
> -     1130, 1139, 1148, 1153, 1162, 1170, 1172, 1176, 1180, 1187,
> -     1191, 1199, 1208, 1217
> -    } ;
> -
> -static yyconst flex_int16_t yy_def[585] =
> -    {   0,
> -      550,    1,  551,  551,  552,  552,  553,  553,    1,    1,
> -      554,  554,    1,   13,    1,    1,    1,   17,  555,  555,
> -      556,  556,  557,  557,  550,  550,  550,  550,  550,  558,
> -      550,  550,  550,  550,  559,  560,  560,  560,  560,  550,
> -      550,  550,  560,  560,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  561,  550,  550,  550,
> -      550,  550,  550,  550,  550,  562,  550,  550,  550,  560,
> -      560,  560,  550,  550,  550,  550,  550,  563,  550,  550,
> -      550,  559,  564,  560,  560,  560,  560,  560,  560,  560,
> -      560,  560,  560,  560,  560,  550,  550,  550,  550,  550,
> -
> -      550,  550,  560,  560,  560,  560,  560,  560,  560,  560,
> -      560,  560,  560,  560,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  550,  550,  550,  550,
> -      550,  565,  550,  550,  566,  550,  550,  550,  567,  550,
> -      568,  560,  569,  560,  560,  560,  560,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  560,  560,  550,  570,
> -      550,  550,  550,  550,  550,  571,  550,  550,  550,  550,
> -      550,  550,  572,  560,  560,  560,  550,  550,  550,  573,
> -      550,  550,  574,  550,  560,  560,  560,  560,  560,  560,
> -      560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
> -
> -      560,  560,  550,  575,  560,  560,  560,  560,  560,  560,
> -      560,  560,  560,  560,  560,  560,  550,  550,  550,  550,
> -      550,  576,  550,  550,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  566,  550,  550,  567,  568,
> -      577,  578,  579,  560,  560,  560,  560,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  550,  550,  560,  560,
> -      550,  550,  550,  550,  550,  550,  550,  571,  550,  550,
> -      572,  550,  560,  560,  560,  550,  550,  573,  550,  574,
> -      564,  560,  560,  560,  560,  560,  560,  560,  560,  560,
> -      560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
> -
> -      560,  575,  550,  560,  560,  560,  560,  560,  560,  560,
> -      560,  560,  560,  560,  560,  580,  550,  550,  581,  578,
> -      550,  579,  569,  560,  560,  560,  560,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  560,  560,  550,  550,
> -      550,  550,  550,  560,  560,  560,  550,  550,  560,  560,
> -      560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
> -      560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
> -      560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
> -      550,  550,  580,  550,  581,  560,  560,  560,  550,  550,
> -      550,  550,  550,  550,  560,  560,  582,  550,  560,  560,
> -
> -      560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
> -      560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
> -      560,  560,  560,  560,  550,  550,  550,  550,  550,  550,
> -      560,  560,  550,  550,  560,  560,  560,  560,  560,  560,
> -      560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
> -      560,  560,  560,  560,  560,  550,  550,  550,  550,  550,
> -      560,  560,  550,  550,  560,  560,  560,  560,  560,  560,
> -      560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
> -      550,  550,  550,  550,  550,  560,  560,  550,  550,  560,
> -      560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
> -
> -      560,  550,  550,  583,  550,  550,  550,  550,  550,  550,
> -      550,  560,  560,  560,  560,  560,  560,  560,  560,  583,
> -      550,  550,  550,  550,  550,  550,  584,  560,  560,  560,
> -      560,  560,  550,  550,  550,  550,  584,  550,  560,  560,
> -      550,  550,  560,  550,  550,  560,  550,  550,  550,    0,
> -      550,  550,  550,  550,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550
> -    } ;
> -
> -static yyconst flex_int16_t yy_nxt[1387] =
> -    {   0,
> -       26,   27,   28,   27,   29,   27,   26,   26,   26,   30,
> -       26,   26,   26,   31,   32,   33,   34,   34,   34,   35,
> -       26,   26,   36,   36,   36,   36,   36,   36,   26,   26,
> -       26,   36,   36,   36,   37,   36,   38,   39,   36,   36,
> -       36,   36,   36,   36,   36,   36,   36,   36,   36,   36,
> -       36,   36,   36,   36,   36,   36,   36,   26,   26,   40,
> -       46,  143,   47,   40,  151,   41,   42,   46,  151,   47,
> -       48,   52,   49,   53,  134,   54,  135,   48,   55,  143,
> -       68,  143,   63,   56,   64,  144,   65,   63,   69,   64,
> -       50,   65,   67,   68,   41,   75,  143,   76,   57,   77,
> -
> -      282,   69,   28,  147,  116,   43,  152,   44,   70,   66,
> -       36,   71,  117,  158,   66,   75,  165,   76,  166,   77,
> -       79,   70,   78,   36,   71,   72,   58,   59,   52,  143,
> -       53,   73,   54,   60,   61,   55,  143,   28,   72,  122,
> -       56,   98,   78,   41,   73,   26,   98,  123,  118,   28,
> -       26,  116,  118,  174,  119,   57,  172,  143,  173,  120,
> -      124,   28,  143,  122,  124,   36,  125,   36,   36,  143,
> -       36,  126,   36,   36,  151,  143,  257,   28,  151,  128,
> -      143,  191,  176,   58,   59,   80,   81,  129,   96,  143,
> -      143,   82,   28,   96,  128,  145,  153,  130,  143,  146,
> -
> -       83,  143,  129,  154,   84,  157,   85,   86,   87,   88,
> -      175,  155,   89,  209,  544,   90,  152,  143,   91,   92,
> -      185,  156,   93,   72,   94,   95,  179,  190,  180,   96,
> -       97,   99,  194,  148,  259,  100,  101,  148,  143,  102,
> -      133,  133,  133,  133,  136,  143,  137,  137,  137,  138,
> -      136,  161,  140,  140,  140,  140,  143,  143,  103,  104,
> -      105,  106,  107,  151,  192,   89,  212,  151,   90,  108,
> -      109,  110,  111,  291,  162,  112,  113,   94,  114,  149,
> -      168,  150,  143,  151,  168,  143,  139,  151,  178,  143,
> -      133,  133,  133,  133,  181,  181,  181,  181,  182,  182,
> -
> -      182,  182,  163,  164,  143,  152,  143,  143,  203,  189,
> -      204,  143,  193,  184,  143,  200,  143,  143,  143,  169,
> -      541,  143,  152,  143,  186,  152,  143,  143,  187,  143,
> -      143,  188,  201,  208,  197,  198,  195,  186,  202,  196,
> -      205,  213,  210,  206,  188,  143,  199,  207,  143,  257,
> -      211,  143,  218,  202,  245,  216,  218,  189,  214,  258,
> -      151,  220,  221,  219,  151,  222,  224,  151,  197,  215,
> -      224,  151,  226,  227,  217,  230,  226,  225,  151,  230,
> -      199,  246,  151,  228,  143,  229,  263,  231,  235,  235,
> -      235,  235,  238,  238,  238,  238,  136,  244,  137,  137,
> -
> -      137,  138,  152,  136,  143,  138,  138,  138,  138,  152,
> -      136,  254,  140,  140,  140,  140,  251,  247,  148,  151,
> -      152,  143,  148,  151,  252,  143,  255,  143,  143,  168,
> -      253,  143,  256,  168,  143,  143,  143,  264,  265,  143,
> -      273,  181,  181,  181,  181,  182,  182,  182,  182,  275,
> -      260,  143,  274,  143,  143,  143,  143,  285,  143,  143,
> -      184,  152,  288,  143,  149,  143,  150,  283,  169,  284,
> -      143,  152,  286,  143,  143,  143,  143,  294,  143,  143,
> -      292,  290,  143,  143,  287,  289,  293,  143,  297,  296,
> -      143,  143,  295,  143,  298,  301,  308,  306,  143,  143,
> -
> -      143,  533,  392,  143,  299,  300,  311,  218,  253,  304,
> -      288,  218,  314,  224,  305,  307,  310,  224,  219,  368,
> -      312,  220,  221,  309,  225,  222,  220,  221,  315,  313,
> -      220,  220,  221,  226,  227,  220,  143,  226,  318,  227,
> -      143,  143,  318,  143,  228,  143,  317,  235,  235,  235,
> -      235,  238,  238,  238,  238,  143,  143,  143,  337,  143,
> -      347,  348,  327,  143,  347,  325,  143,  324,  326,  182,
> -      182,  182,  182,  143,  143,  143,  143,  143,  143,  143,
> -      143,  143,  345,  143,  184,  143,  143,  344,  338,  353,
> -      346,  355,  143,  143,  143,  143,  349,  351,  356,  143,
> -
> -      143,  354,  143,  350,  143,  352,  143,  357,  143,  359,
> -      361,  143,  371,  360,  358,  362,  364,  143,  363,  370,
> -      365,  366,  143,  377,  143,  369,  367,  373,  143,  372,
> -      143,  143,  374,  143,  143,  381,  382,  378,  375,  381,
> -      318,  227,  143,  143,  318,  376,  143,  380,  347,  348,
> -      143,  143,  347,  384,  379,  143,  143,  143,  143,  143,
> -      143,  143,  386,  387,  396,  388,  395,  143,  143,  143,
> -      143,  143,  405,  143,  143,  399,  143,  346,  406,  143,
> -      402,  408,  400,  143,  407,  412,  410,  401,  404,  403,
> -      411,  143,  417,  414,  143,  413,  143,  416,  143,  143,
> -
> -      409,  143,  143,  419,  415,  381,  382,  381,  382,  381,
> -      143,  381,  418,  143,  423,  143,  381,  382,  427,  411,
> -      381,  421,  427,  422,  143,  420,  424,  143,  143,  143,
> -      143,  143,  435,  143,  384,  143,  143,  431,  143,  143,
> -      432,  143,  143,  143,  437,  143,  441,  143,  442,  438,
> -      143,  444,  143,  143,  447,  448,  143,  143,  143,  436,
> -      440,  439,  443,  143,  451,  446,  449,  143,  445,  455,
> -      143,  143,  427,  462,  143,  143,  427,  450,  143,  143,
> -      452,  143,  143,  453,  465,  454,  458,  458,  458,  458,
> -      461,  466,  468,  143,  467,  143,  471,  143,  472,  469,
> -
> -      143,  143,  484,  470,  143,  143,  143,  143,  256,  143,
> -      143,  143,  143,  473,  474,  143,  479,  143,  143,  143,
> -      483,  486,  477,  143,  483,  478,  491,  476,  492,  494,
> -      475,  495,  143,  480,  458,  458,  458,  458,  487,  143,
> -      143,  490,  493,  507,  497,  508,  498,  507,  143,  508,
> -      509,  510,  510,  511,  496,  500,  499,  511,  143,  143,
> -      143,  143,  143,  143,  143,  512,  143,  507,  514,  508,
> -      527,  507,  143,  508,  513,  521,  501,  516,  143,  143,
> -      143,  507,  143,  143,  527,  507,  143,  522,  508,  528,
> -      517,  529,  508,  515,  519,  523,  523,  523,  523,  530,
> -
> -      255,  518,  524,  524,  524,  524,  525,  525,  525,  525,
> -      526,  531,  143,  538,  525,  525,  525,  525,  534,  535,
> -      143,  536,  534,  524,  524,  524,  524,  143,  538,  532,
> -      143,  143,  523,  523,  523,  523,  526,  521,  143,  538,
> -      525,  525,  525,  525,  539,  534,  535,  540,  546,  534,
> -      542,  542,  542,  542,  538,  547,  547,  547,  547,  545,
> -      543,  542,  542,  542,  542,  548,  549,  548,  549,  548,
> -      143,  548,  143,  143,  506,  505,  504,  503,  502,  547,
> -      547,  547,  547,   45,   45,   45,   45,   45,   45,   45,
> -       45,   45,   51,   51,   51,   51,   51,   51,   51,   51,
> -
> -       51,   62,   62,   62,   62,   62,   62,   62,   62,   62,
> -       74,   74,   74,   74,   74,   74,   74,   74,   74,  115,
> -      115,  115,  115,  115,  115,  115,  115,  115,  121,  121,
> -      121,  121,  121,  121,  121,  121,  121,  127,  127,  127,
> -      127,  127,  127,  127,  127,  127,  131,  131,  143,  131,
> -      131,  131,  131,  131,  131,  141,  141,  142,  142,  142,
> -      142,  167,  167,  143,  167,  167,  167,  167,  167,  167,
> -      171,  171,  143,  171,  171,  171,  171,  171,  171,  177,
> -      177,  143,  177,  177,  177,  177,  177,  177,  183,  489,
> -      183,  183,  183,  233,  233,  488,  233,  233,  233,  233,
> -
> -      233,  233,  236,  236,  236,  236,  236,  236,  236,  236,
> -      236,  239,  485,  239,  240,  240,  240,  240,  243,  243,
> -      243,  261,  261,  482,  261,  261,  261,  261,  261,  261,
> -      268,  268,  268,  268,  268,  268,  268,  268,  268,  271,
> -      271,  271,  271,  271,  271,  271,  271,  271,  278,  278,
> -      278,  278,  278,  278,  278,  278,  278,  280,  481,  280,
> -      280,  280,  302,  302,  302,  302,  302,  302,  302,  302,
> -      302,  316,  316,  143,  143,  143,  316,  316,  319,  319,
> -      320,  320,  320,  320,  322,  322,  322,  322,  383,  383,
> -      143,  383,  383,  383,  383,  385,  385,  385,  385,  433,
> -
> -      433,  143,  433,  433,  433,  433,  433,  433,  520,  520,
> -      464,  463,  520,  520,  520,  520,  520,  537,  537,  460,
> -      537,  537,  537,  537,  537,  537,  459,  252,  457,  456,
> -      143,  143,  143,  143,  143,  434,  430,  429,  428,  426,
> -      425,  143,  143,  143,  241,  143,  143,  143,  143,  143,
> -      143,  143,  143,  398,  397,  394,  393,  391,  390,  389,
> -      143,  550,  323,  242,  321,  241,  303,  143,  184,  279,
> -      272,  343,  269,  342,  341,  340,  339,  336,  335,  334,
> -      333,  332,  331,  330,  329,  328,  323,  321,  241,  237,
> -      232,  232,  317,  303,  281,  184,  279,  277,  276,  272,
> -
> -      270,  269,  267,  266,  262,  250,  249,  248,  242,  143,
> -      241,  237,  234,  232,  230,  230,  223,  217,  170,  160,
> -      159,  143,  132,  550,   41,   41,   25,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550
> -    } ;
> -
> -static yyconst flex_int16_t yy_chk[1387] =
> -    {   0,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
> -        1,    1,    1,    1,    1,    1,    1,    1,    1,    2,
> -        3,   37,    3,    2,   41,    2,    2,    4,   41,    4,
> -        3,    5,    4,    5,   32,    5,   32,    4,    5,   39,
> -        9,  185,    7,    5,    7,   37,    7,    8,    9,    8,
> -        4,    8,    8,   10,   10,   11,   44,   11,    5,   11,
> -
> -      185,   10,   19,   39,   19,    2,   41,    2,    9,    7,
> -        9,    9,   19,   44,    8,   12,   56,   12,   56,   12,
> -       12,   10,   11,   10,   10,    9,    5,    5,    6,   70,
> -        6,    9,    6,    6,    6,    6,  546,   21,   10,   21,
> -        6,   15,   12,   16,   10,   15,   16,   21,   20,   20,
> -       16,   20,   20,   70,   20,    6,   69,   88,   69,   20,
> -       22,   22,   72,   22,   22,   15,   22,   15,   15,   38,
> -       16,   22,   16,   16,   49,   43,  544,   23,   49,   23,
> -       71,   88,   72,    6,    6,   13,   13,   23,   15,  107,
> -       84,   13,   24,   16,   24,   38,   42,   24,   91,   38,
> -
> -       13,   87,   24,   42,   13,   43,   13,   13,   13,   13,
> -       71,   42,   13,  107,  541,   13,   49,  157,   13,   13,
> -       84,   42,   13,   13,   13,   13,   81,   87,   81,   13,
> -       13,   17,   91,   40,  157,   17,   17,   40,   89,   17,
> -       31,   31,   31,   31,   33,  109,   33,   33,   33,   33,
> -       34,   55,   34,   34,   34,   34,  194,  540,   17,   17,
> -       17,   17,   17,   67,   89,   17,  109,   67,   17,   17,
> -       17,   17,   17,  194,   55,   17,   17,   17,   17,   40,
> -       60,   40,   86,   79,   60,   90,   33,   79,   80,   94,
> -       80,   80,   80,   80,   82,   82,   82,   82,   83,   83,
> -
> -       83,   83,   55,   55,   85,   67,   92,  106,  102,   86,
> -      102,   95,   90,   83,   93,   94,  103,  104,  113,   60,
> -      533,  145,   60,  532,   85,   79,  114,  110,   85,  108,
> -      105,   85,   95,  106,   93,   93,   92,  104,   95,   92,
> -      103,  110,  108,  103,  104,  111,   93,  105,  112,  155,
> -      108,  146,  118,  114,  145,  113,  118,  105,  111,  155,
> -      119,  120,  120,  118,  119,  120,  124,  125,  112,  112,
> -      124,  125,  126,  126,  120,  129,  126,  124,  130,  130,
> -      112,  146,  130,  126,  144,  126,  162,  129,  133,  133,
> -      133,  133,  136,  136,  136,  136,  137,  144,  137,  137,
> -
> -      137,  137,  119,  138,  147,  138,  138,  138,  138,  125,
> -      140,  154,  140,  140,  140,  140,  153,  147,  148,  151,
> -      130,  158,  148,  151,  153,  175,  154,  174,  176,  168,
> -      153,  188,  154,  168,  530,  191,  528,  162,  162,  189,
> -      174,  181,  181,  181,  181,  182,  182,  182,  182,  176,
> -      158,  190,  175,  192,  186,  193,  187,  188,  199,  195,
> -      182,  151,  191,  196,  148,  197,  148,  186,  168,  187,
> -      198,  168,  189,  200,  202,  201,  205,  196,  206,  207,
> -      195,  193,  208,  209,  190,  192,  195,  210,  199,  198,
> -      211,  212,  197,  215,  200,  202,  209,  207,  213,  214,
> -
> -      216,  522,  331,  301,  200,  201,  212,  218,  331,  205,
> -      209,  218,  215,  224,  206,  208,  211,  224,  218,  301,
> -      213,  219,  219,  210,  224,  219,  220,  220,  216,  214,
> -      220,  222,  222,  225,  225,  222,  244,  225,  226,  226,
> -      245,  246,  226,  247,  225,  259,  225,  235,  235,  235,
> -      235,  238,  238,  238,  238,  260,  273,  274,  259,  275,
> -      277,  277,  247,  282,  277,  245,  284,  244,  246,  281,
> -      281,  281,  281,  283,  285,  286,  287,  291,  288,  290,
> -      292,  293,  274,  297,  281,  295,  294,  273,  260,  286,
> -      275,  288,  296,  298,  300,  304,  282,  284,  290,  306,
> -
> -      299,  287,  305,  283,  307,  285,  312,  291,  308,  293,
> -      294,  309,  306,  293,  292,  295,  297,  310,  296,  305,
> -      298,  299,  311,  312,  313,  304,  300,  308,  314,  307,
> -      315,  324,  309,  326,  327,  316,  316,  313,  310,  316,
> -      318,  318,  337,  338,  318,  311,  344,  315,  347,  347,
> -      349,  351,  347,  316,  314,  352,  353,  355,  357,  358,
> -      361,  359,  324,  326,  338,  327,  337,  360,  362,  365,
> -      364,  367,  358,  363,  366,  349,  370,  344,  359,  371,
> -      353,  361,  351,  369,  360,  364,  363,  352,  357,  355,
> -      363,  372,  370,  366,  373,  365,  374,  369,  375,  377,
> -
> -      362,  378,  379,  372,  367,  381,  381,  384,  384,  381,
> -      396,  384,  371,  395,  377,  399,  383,  383,  391,  379,
> -      383,  374,  391,  375,  400,  373,  378,  402,  404,  405,
> -      406,  407,  399,  408,  383,  411,  412,  395,  410,  414,
> -      396,  415,  418,  417,  402,  419,  407,  421,  408,  404,
> -      422,  411,  420,  423,  415,  417,  432,  424,  435,  400,
> -      406,  405,  410,  431,  420,  414,  418,  440,  412,  424,
> -      436,  441,  427,  432,  447,  439,  427,  419,  438,  446,
> -      421,  448,  449,  422,  435,  423,  427,  427,  427,  427,
> -      431,  436,  439,  450,  438,  451,  446,  452,  447,  440,
> -
> -      453,  455,  459,  441,  454,  469,  461,  462,  459,  465,
> -      466,  467,  470,  448,  449,  471,  454,  473,  475,  476,
> -      458,  461,  452,  479,  458,  453,  466,  451,  467,  470,
> -      450,  471,  474,  455,  458,  458,  458,  458,  462,  480,
> -      496,  465,  469,  486,  474,  487,  475,  486,  491,  487,
> -      488,  488,  488,  489,  473,  479,  476,  489,  494,  497,
> -      498,  486,  499,  487,  500,  491,  501,  502,  496,  503,
> -      511,  502,  514,  503,  494,  520,  480,  498,  515,  516,
> -      513,  507,  517,  518,  511,  507,  512,  506,  508,  514,
> -      499,  515,  508,  497,  501,  507,  507,  507,  507,  517,
> -
> -      505,  500,  508,  508,  508,  508,  509,  509,  509,  509,
> -      510,  518,  519,  527,  510,  510,  510,  510,  523,  523,
> -      529,  524,  523,  524,  524,  524,  524,  539,  527,  519,
> -      531,  543,  523,  523,  523,  523,  525,  504,  495,  537,
> -      525,  525,  525,  525,  529,  534,  534,  531,  543,  534,
> -      536,  536,  536,  536,  537,  545,  545,  545,  545,  542,
> -      539,  542,  542,  542,  542,  547,  547,  548,  548,  547,
> -      493,  548,  492,  490,  485,  484,  483,  482,  481,  547,
> -      547,  547,  547,  551,  551,  551,  551,  551,  551,  551,
> -      551,  551,  552,  552,  552,  552,  552,  552,  552,  552,
> -
> -      552,  553,  553,  553,  553,  553,  553,  553,  553,  553,
> -      554,  554,  554,  554,  554,  554,  554,  554,  554,  555,
> -      555,  555,  555,  555,  555,  555,  555,  555,  556,  556,
> -      556,  556,  556,  556,  556,  556,  556,  557,  557,  557,
> -      557,  557,  557,  557,  557,  557,  558,  558,  478,  558,
> -      558,  558,  558,  558,  558,  559,  559,  560,  560,  560,
> -      560,  561,  561,  477,  561,  561,  561,  561,  561,  561,
> -      562,  562,  472,  562,  562,  562,  562,  562,  562,  563,
> -      563,  468,  563,  563,  563,  563,  563,  563,  564,  464,
> -      564,  564,  564,  565,  565,  463,  565,  565,  565,  565,
> -
> -      565,  565,  566,  566,  566,  566,  566,  566,  566,  566,
> -      566,  567,  460,  567,  568,  568,  568,  568,  569,  569,
> -      569,  570,  570,  457,  570,  570,  570,  570,  570,  570,
> -      571,  571,  571,  571,  571,  571,  571,  571,  571,  572,
> -      572,  572,  572,  572,  572,  572,  572,  572,  573,  573,
> -      573,  573,  573,  573,  573,  573,  573,  574,  456,  574,
> -      574,  574,  575,  575,  575,  575,  575,  575,  575,  575,
> -      575,  576,  576,  445,  444,  443,  576,  576,  577,  577,
> -      578,  578,  578,  578,  579,  579,  579,  579,  580,  580,
> -      442,  580,  580,  580,  580,  581,  581,  581,  581,  582,
> -
> -      582,  437,  582,  582,  582,  582,  582,  582,  583,  583,
> -      434,  433,  583,  583,  583,  583,  583,  584,  584,  430,
> -      584,  584,  584,  584,  584,  584,  429,  428,  426,  425,
> -      416,  413,  409,  403,  401,  398,  394,  393,  392,  390,
> -      389,  388,  387,  386,  385,  380,  376,  368,  356,  354,
> -      350,  346,  345,  343,  339,  336,  333,  330,  329,  328,
> -      325,  323,  322,  321,  320,  319,  302,  289,  280,  278,
> -      271,  270,  268,  265,  264,  263,  261,  258,  257,  255,
> -      254,  252,  251,  250,  249,  248,  243,  242,  240,  236,
> -      234,  233,  228,  204,  184,  183,  180,  179,  178,  173,
> -
> -      169,  166,  164,  163,  161,  152,  150,  149,  143,  142,
> -      141,  135,  132,  131,  128,  127,  123,  117,   61,   50,
> -       48,   36,   30,   25,   18,   14,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550,  550,  550,  550,  550,
> -      550,  550,  550,  550,  550,  550
> -    } ;
> -
> -extern int yy_flex_debug;
> -int yy_flex_debug = 0;
> -
> -static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
> -static char *yy_full_match;
> -static int yy_lp;
> -#define REJECT \
> -{ \
> -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \
> -yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
> -++(yy_lp); \
> -goto find_rule; \
> -}
> -
> -#define yymore() yymore_used_but_not_detected
> -#define YY_MORE_ADJ 0
> -#define YY_RESTORE_YY_MORE_OFFSET
> -char *yytext;
> -#line 1 "lexer.l"
> -/* GOB C Preprocessor
> - * Copyright (C) 1999 the Free Software Foundation.
> - *
> - * Author: George Lebl
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License as published by
> - * the Free Software Foundation; either version 2 of the License, or
> - * (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * 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.
> - */
> -#line 22 "lexer.l"
> -
> -#include "config.h"
> -#include <stdlib.h>
> -#include <string.h>
> -#include <ctype.h>
> -#include <glib.h>
> -
> -#include "treefuncs.h"
> -#include "parse.h"
> -#include "main.h"
> -#include "util.h"
> -
> -static int parenth_depth = 0;
> -static int before_comment
> -/* New flex is on drugs */
> -#if defined(FLEX_SCANNER) && ! defined(INITIAL)
> - = 0;
> -#else
> - = INITIAL;
> -#endif
> -static gboolean class_after_c = FALSE;
> -static int code_type = CCODE;
> -static int before_string;
> -static int property_paren_depth = 0;
> -
> -/* GTK+ doc stuff */
> -static char *gtk_doc_func = NULL; /* current gtk-doc func */
> -GHashTable *gtk_doc_hash = NULL;
> -
> -static GString *cbuf = NULL;
> -int ccode_line = 1;
> -
> -GList *include_files = NULL;
> -/* 0 no, 1 means yes, 2+ means don't even start looking anymore */
> -static int look_for_includes = 0;
> -
> -int line_no = 1;
> -/* last filename parsed from a #line directive */
> -char *hline_filename = NULL;
> -
> -static void
> -clear_cbuf(void)
> -{
> - if(!cbuf) {
> - cbuf = g_string_new(NULL);
> - } else {
> - cbuf = g_string_assign(cbuf, "");
> - }
> -}
> -
> -static void
> -add_to_cbuf(char *s)
> -{
> - if(!cbuf) {
> - cbuf = g_string_new(s);
> - } else {
> - cbuf = g_string_append(cbuf,s);
> - }
> -}
> -
> -static void
> -add_gtk_doc_func(void)
> -{
> - if(!gtk_doc_func)
> - return;
> -
> - if(!gtk_doc_hash)
> - gtk_doc_hash = g_hash_table_new(g_str_hash, g_str_equal);
> - g_hash_table_insert(gtk_doc_hash, gtk_doc_func, g_strdup(cbuf->str));
> - clear_cbuf();
> -
> - gtk_doc_func = NULL;
> -}
> -
> -/* Ugly warning avoiding */
> -#ifdef FLEX_SCANNER
> -int yylex(void);
> -#endif
> -
> -
> -
> -
> -
> -
> -
> -
> -
> -
> -
> -
> -#line 1124 "lex.yy.c"
> -
> -#define INITIAL 0
> -#define COMMENT 1
> -#define C_CODE 2
> -#define CODE_STRING 3
> -#define CLASS_CODE 4
> -#define CLASS_STRING 5
> -#define CLASS_CODE_I 6
> -#define PROPERTY_CODE 7
> -#define PROPERTY_CODE_I 8
> -#define GTK_DOC_BEFORE_NAME 9
> -#define GTK_DOC 10
> -#define GTK_DOC_LINE 11
> -
> -#ifndef YY_NO_UNISTD_H
> -/* Special case for "unistd.h", since it is non-ANSI. We include it way
> - * down here because we want the user's section 1 to have been scanned first.
> - * The user has a chance to override it with an option.
> - */
> -#include <unistd.h>
> -#endif
> -
> -#ifndef YY_EXTRA_TYPE
> -#define YY_EXTRA_TYPE void *
> -#endif
> -
> -/* Macros after this point can all be overridden by user definitions in
> - * section 1.
> - */
> -
> -#ifndef YY_SKIP_YYWRAP
> -#ifdef __cplusplus
> -extern "C" int yywrap (void );
> -#else
> -extern int yywrap (void );
> -#endif
> -#endif
> -
> -    static void yyunput (int c,char *buf_ptr  );
> -    
> -#ifndef yytext_ptr
> -static void yy_flex_strncpy (char *,yyconst char *,int );
> -#endif
> -
> -#ifdef YY_NEED_STRLEN
> -static int yy_flex_strlen (yyconst char * );
> -#endif
> -
> -#ifndef YY_NO_INPUT
> -
> -#ifdef __cplusplus
> -static int yyinput (void );
> -#else
> -static int input (void );
> -#endif
> -
> -#endif
> -
> -/* Amount of stuff to slurp up with each read. */
> -#ifndef YY_READ_BUF_SIZE
> -#define YY_READ_BUF_SIZE 8192
> -#endif
> -
> -/* Copy whatever the last rule matched to the standard output. */
> -#ifndef ECHO
> -/* This used to be an fputs(), but since the string might contain NUL's,
> - * we now use fwrite().
> - */
> -#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
> -#endif
> -
> -/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
> - * is returned in "result".
> - */
> -#ifndef YY_INPUT
> -#define YY_INPUT(buf,result,max_size) \
> - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
> - { \
> - int c = '*'; \
> - size_t n; \
> - for ( n = 0; n < max_size && \
> -     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
> - buf[n] = (char) c; \
> - if ( c == '\n' ) \
> - buf[n++] = (char) c; \
> - if ( c == EOF && ferror( yyin ) ) \
> - YY_FATAL_ERROR( "input in flex scanner failed" ); \
> - result = n; \
> - } \
> - else \
> - { \
> - errno=0; \
> - while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
> - { \
> - if( errno != EINTR) \
> - { \
> - YY_FATAL_ERROR( "input in flex scanner failed" ); \
> - break; \
> - } \
> - errno=0; \
> - clearerr(yyin); \
> - } \
> - }\
> -\
> -
> -#endif
> -
> -/* No semi-colon after return; correct usage is to write "yyterminate();" -
> - * we don't want an extra ';' after the "return" because that will cause
> - * some compilers to complain about unreachable statements.
> - */
> -#ifndef yyterminate
> -#define yyterminate() return YY_NULL
> -#endif
> -
> -/* Number of entries by which start-condition stack grows. */
> -#ifndef YY_START_STACK_INCR
> -#define YY_START_STACK_INCR 25
> -#endif
> -
> -/* Report a fatal error. */
> -#ifndef YY_FATAL_ERROR
> -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
> -#endif
> -
> -/* end tables serialization structures and prototypes */
> -
> -/* Default declaration of generated scanner - a define so the user can
> - * easily add parameters.
> - */
> -#ifndef YY_DECL
> -#define YY_DECL_IS_OURS 1
> -
> -extern int yylex (void);
> -
> -#define YY_DECL int yylex (void)
> -#endif /* !YY_DECL */
> -
> -/* Code executed at the beginning of each rule, after yytext and yyleng
> - * have been set up.
> - */
> -#ifndef YY_USER_ACTION
> -#define YY_USER_ACTION
> -#endif
> -
> -/* Code executed at the end of each rule. */
> -#ifndef YY_BREAK
> -#define YY_BREAK break;
> -#endif
> -
> -#define YY_RULE_SETUP \
> - if ( yyleng > 0 ) \
> - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
> - (yytext[yyleng - 1] == '\n'); \
> - YY_USER_ACTION
> -
> -/** The main scanner function which does all the work.
> - */
> -YY_DECL
> -{
> - register yy_state_type yy_current_state;
> - register char *yy_cp, *yy_bp;
> - register int yy_act;
> -    
> -#line 117 "lexer.l"
> -
> -
> -
> -/* Avoid warning from flex, cuz flex sucks */
> -#ifdef FLEX_SCANNER
> -yy_current_state = 0;
> -#endif
> -
> -
> -
> -#line 1300 "lex.yy.c"
> -
> - if ( (yy_init) )
> - {
> - (yy_init) = 0;
> -
> -#ifdef YY_USER_INIT
> - YY_USER_INIT;
> -#endif
> -
> -        if ( ! (yy_state_buf) )
> -            (yy_state_buf) = (yy_state_type *)yyalloc(YY_BUF_SIZE + 2  );
> -
> - if ( ! (yy_start) )
> - (yy_start) = 1; /* first start state */
> -
> - if ( ! yyin )
> - yyin = stdin;
> -
> - if ( ! yyout )
> - yyout = stdout;
> -
> - if ( ! YY_CURRENT_BUFFER ) {
> - yyensure_buffer_stack ();
> - YY_CURRENT_BUFFER_LVALUE =
> - yy_create_buffer(yyin,YY_BUF_SIZE );
> - }
> -
> - yy_load_buffer_state( );
> - }
> -
> - while ( 1 ) /* loops until end-of-file is reached */
> - {
> - yy_cp = (yy_c_buf_p);
> -
> - /* Support of yytext. */
> - *yy_cp = (yy_hold_char);
> -
> - /* yy_bp points to the position in yy_ch_buf of the start of
> - * the current run.
> - */
> - yy_bp = yy_cp;
> -
> - yy_current_state = (yy_start);
> - yy_current_state += YY_AT_BOL();
> -
> - (yy_state_ptr) = (yy_state_buf);
> - *(yy_state_ptr)++ = yy_current_state;
> -
> -yy_match:
> - do
> - {
> - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
> - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
> - {
> - yy_current_state = (int) yy_def[yy_current_state];
> - if ( yy_current_state >= 551 )
> - yy_c = yy_meta[(unsigned int) yy_c];
> - }
> - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
> - *(yy_state_ptr)++ = yy_current_state;
> - ++yy_cp;
> - }
> - while ( yy_base[yy_current_state] != 1327 );
> -
> -yy_find_action:
> - yy_current_state = *--(yy_state_ptr);
> - (yy_lp) = yy_accept[yy_current_state];
> -find_rule: /* we branch to this label when backing up */
> - for ( ; ; ) /* until we find what rule we matched */
> - {
> - if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
> - {
> - yy_act = yy_acclist[(yy_lp)];
> - {
> - (yy_full_match) = yy_cp;
> - break;
> - }
> - }
> - --yy_cp;
> - yy_current_state = *--(yy_state_ptr);
> - (yy_lp) = yy_accept[yy_current_state];
> - }
> -
> - YY_DO_BEFORE_ACTION;
> -
> -do_action: /* This label is used only to access EOF actions. */
> -
> - switch ( yy_act )
> - { /* beginning of action switch */
> -case 1:
> -/* rule 1 can match eol */
> -YY_RULE_SETUP
> -#line 127 "lexer.l"
> -{ line_no++; REJECT; }
> - YY_BREAK
> -case 2:
> -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
> -(yy_c_buf_p) = yy_cp -= 1;
> -YY_DO_BEFORE_ACTION; /* set up yytext again */
> -YY_RULE_SETUP
> -#line 129 "lexer.l"
> -{
> -/* Thy evil easter egg */
> -#define QQ(x) long x
> -#define KK(x) =atoi(__(&,,x,))
> -#define MM(x,a) {QQ(i);for(i=2;i<x;i++){a}}
> -#define PP(Q) (P%Q)==0
> -#define ___(x,y,z) if(x z y)
> -#define __(a,x,y,z) a(yytext[y] x z)
> -#define O__O(a,b) fprintf(stderr,"%s is %s!\n",a,b)
> -QQ(m)=1;___(__(,==,2,'P'),__(,==,5,'M'),&&
> -){QQ(P)KK(8);MM(P,___(PP(i),,)m=0;)}__(,=,
> -7,0);___(,,m){O__O(__( &,,8,),__(&,,2,));}
> -#undef QQ
> -#undef KK
> -#undef MM
> -#undef PP
> -#undef ___
> -#undef __
> -#undef O__O
> -REJECT;
> -}
> - YY_BREAK
> -case 3:
> -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
> -(yy_c_buf_p) = yy_cp -= 1;
> -YY_DO_BEFORE_ACTION; /* set up yytext again */
> -YY_RULE_SETUP
> -#line 151 "lexer.l"
> -{ ; /*comment, ignore*/ }
> - YY_BREAK
> -case 4:
> -YY_RULE_SETUP
> -#line 153 "lexer.l"
> -{
> - char *p;
> - char *number;
> - char *filename;
> - char *str=g_strdup(yytext);
> -
> - /* find first digit of line number */
> - p=str;
> - while(*p&&!isdigit(*p)) p++;
> - number=p;
> -  
> - /* find end of line number */
> - while(*p&&isdigit(*p)) p++;
> - if(*p) *p++=0;
> -
> - /* find beginning of filename */
> - p=strchr(p,'"');
> - if(p) p++;
> - filename=p;
> -
> - /* find end of filename */
> - if(p) p=strchr(p,'"');
> - if(p) *p=0;
> -
> - /* stash number (minus one because we don't count this line) */  
> - if(number) line_no=atoi(number)-1;
> -
> - /* stash filename */
> - if(filename) {
> - if(hline_filename) g_free(hline_filename);
> - hline_filename=g_strdup(filename);
> - }
> -  
> - /* clean up */
> - g_free(str);
> -}
> - YY_BREAK
> -case 5:
> -YY_RULE_SETUP
> -#line 190 "lexer.l"
> -{
> - if(look_for_includes==1) {
> - char *p;
> - char *file;
> - char *str = g_strdup(yytext);
> - file = strchr(str,'"');
> - if(!file) file = strchr(str,'<');
> - file++;
> - p = strchr(file,'"');
> - if(!p) p = strchr(file,'>');
> - *p = '\0';
> - include_files = g_list_prepend(include_files,g_strdup(file));
> - g_free(str);
> - }
> - REJECT;
> -}
> - YY_BREAK
> -case 6:
> -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
> -(yy_c_buf_p) = yy_cp -= 1;
> -YY_DO_BEFORE_ACTION; /* set up yytext again */
> -YY_RULE_SETUP
> -#line 207 "lexer.l"
> -{
> - /* eat out gtk doc stuff */
> - BEGIN(GTK_DOC_BEFORE_NAME);
> - clear_cbuf();
> - }
> - YY_BREAK
> -case 7:
> -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
> -(yy_c_buf_p) = yy_cp -= 1;
> -YY_DO_BEFORE_ACTION; /* set up yytext again */
> -YY_RULE_SETUP
> -#line 212 "lexer.l"
> -{
> - /* empty doc lines */
> - ;
> - }
> - YY_BREAK
> -case 8:
> -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
> -(yy_c_buf_p) = yy_cp -= 1;
> -YY_DO_BEFORE_ACTION; /* set up yytext again */
> -YY_RULE_SETUP
> -#line 216 "lexer.l"
> -{
> - char *p;
> - BEGIN(GTK_DOC);
> - p = strchr(yytext, '*');
> - g_free(gtk_doc_func);
> - gtk_doc_func = g_strdup(p+2);
> - p = strchr(gtk_doc_func, ':');
> - if(p) *p='\0';
> - g_strstrip(gtk_doc_func);
> - }
> - YY_BREAK
> -case 9:
> -YY_RULE_SETUP
> -#line 226 "lexer.l"
> -{
> - BEGIN(CLASS_CODE_I);
> - }
> - YY_BREAK
> -case 10:
> -YY_RULE_SETUP
> -#line 229 "lexer.l"
> -{
> - BEGIN(COMMENT);
> - before_comment = CLASS_CODE_I;
> - }
> - YY_BREAK
> -case 11:
> -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
> -(yy_c_buf_p) = yy_cp -= 1;
> -YY_DO_BEFORE_ACTION; /* set up yytext again */
> -YY_RULE_SETUP
> -#line 233 "lexer.l"
> -{
> - /* empty doc lines */
> - add_to_cbuf(" *\n");
> - }
> - YY_BREAK
> -case 12:
> -YY_RULE_SETUP
> -#line 237 "lexer.l"
> -{
> - BEGIN(CLASS_CODE_I);
> - add_gtk_doc_func();
> - }
> - YY_BREAK
> -case 13:
> -YY_RULE_SETUP
> -#line 241 "lexer.l"
> -{
> - fflush(stdout);
> - add_to_cbuf(" * ");
> - BEGIN(GTK_DOC_LINE);
> - }
> - YY_BREAK
> -case 14:
> -YY_RULE_SETUP
> -#line 246 "lexer.l"
> -{
> - BEGIN(CLASS_CODE_I);
> - }
> - YY_BREAK
> -case 15:
> -YY_RULE_SETUP
> -#line 249 "lexer.l"
> -{
> - BEGIN(COMMENT);
> - before_comment = CLASS_CODE_I;
> - }
> - YY_BREAK
> -case 16:
> -YY_RULE_SETUP
> -#line 253 "lexer.l"
> -{
> - BEGIN(CLASS_CODE_I);
> - add_to_cbuf("\n");
> - add_gtk_doc_func();
> - }
> - YY_BREAK
> -case 17:
> -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
> -(yy_c_buf_p) = yy_cp -= 1;
> -YY_DO_BEFORE_ACTION; /* set up yytext again */
> -YY_RULE_SETUP
> -#line 258 "lexer.l"
> -{
> - BEGIN(GTK_DOC);
> - add_to_cbuf(yytext);
> - add_to_cbuf("\n");
> - }
> - YY_BREAK
> -case 18:
> -YY_RULE_SETUP
> -#line 263 "lexer.l"
> -{
> - fflush(stdout);
> - add_to_cbuf(yytext);
> - }
> - YY_BREAK
> -case 19:
> -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
> -(yy_c_buf_p) = yy_cp -= 1;
> -YY_DO_BEFORE_ACTION; /* set up yytext again */
> -YY_RULE_SETUP
> -#line 268 "lexer.l"
> -{ add_to_cbuf(yytext); /*comment, ignore*/ }
> - YY_BREAK
> -case 20:
> -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
> -(yy_c_buf_p) = yy_cp -= 1;
> -YY_DO_BEFORE_ACTION; /* set up yytext again */
> -YY_RULE_SETUP
> -#line 269 "lexer.l"
> -{ ; /*comment, ignore*/ }
> - YY_BREAK
> -case 21:
> -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
> -(yy_c_buf_p) = yy_cp -= 1;
> -YY_DO_BEFORE_ACTION; /* set up yytext again */
> -YY_RULE_SETUP
> -#line 270 "lexer.l"
> -{ ; /*comment, ignore*/ }
> - YY_BREAK
> -case 22:
> -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
> -(yy_c_buf_p) = yy_cp -= 1;
> -YY_DO_BEFORE_ACTION; /* set up yytext again */
> -YY_RULE_SETUP
> -#line 271 "lexer.l"
> -{ ; /*comment, ignore*/ }
> - YY_BREAK
> -case 23:
> -YY_RULE_SETUP
> -#line 272 "lexer.l"
> -{BEGIN(COMMENT); before_comment = INITIAL; }
> - YY_BREAK
> -case 24:
> -YY_RULE_SETUP
> -#line 273 "lexer.l"
> -{
> - add_to_cbuf(yytext);
> - BEGIN(COMMENT);
> - before_comment = C_CODE;
> -}
> - YY_BREAK
> -case 25:
> -YY_RULE_SETUP
> -#line 278 "lexer.l"
> -{BEGIN(COMMENT); before_comment = CLASS_CODE; }
> - YY_BREAK
> -case 26:
> -YY_RULE_SETUP
> -#line 279 "lexer.l"
> -{BEGIN(COMMENT); before_comment = CLASS_CODE_I; }
> - YY_BREAK
> -case 27:
> -YY_RULE_SETUP
> -#line 280 "lexer.l"
> -{BEGIN(COMMENT); before_comment = PROPERTY_CODE_I; }
> - YY_BREAK
> -case 28:
> -YY_RULE_SETUP
> -#line 281 "lexer.l"
> -{
> - if(before_comment == C_CODE) add_to_cbuf(yytext);
> - BEGIN(before_comment);
> - }
> - YY_BREAK
> -case 29:
> -YY_RULE_SETUP
> -#line 285 "lexer.l"
> -{
> - /* comment, ignore */
> - if(before_comment == C_CODE) add_to_cbuf(yytext);
> - }
> - YY_BREAK
> -case 30:
> -/* rule 30 can match eol */
> -YY_RULE_SETUP
> -#line 289 "lexer.l"
> -{
> - /* comment, ignore */
> - if(before_comment == C_CODE) add_to_cbuf(yytext);
> - }
> - YY_BREAK
> -case 31:
> -YY_RULE_SETUP
> -#line 294 "lexer.l"
> -{
> - BEGIN(C_CODE);
> - parenth_depth = 1;
> - class_after_c = FALSE;
> - code_type = ACODE;
> - clear_cbuf();
> - ccode_line = line_no;
> - }
> - YY_BREAK
> -case 32:
> -YY_RULE_SETUP
> -#line 302 "lexer.l"
> -{
> - BEGIN(C_CODE);
> - parenth_depth = 1;
> - class_after_c = FALSE;
> - code_type = ATCODE;
> - clear_cbuf();
> - ccode_line = line_no;
> - }
> - YY_BREAK
> -case 33:
> -YY_RULE_SETUP
> -#line 311 "lexer.l"
> -{
> - BEGIN(C_CODE);
> - parenth_depth = 1;
> - class_after_c = FALSE;
> - code_type = HTCODE;
> - clear_cbuf();
> - ccode_line = line_no;
> - }
> - YY_BREAK
> -case 34:
> -YY_RULE_SETUP
> -#line 319 "lexer.l"
> -{
> - BEGIN(C_CODE);
> - parenth_depth = 1;
> - class_after_c = FALSE;
> - code_type = PHCODE;
> - clear_cbuf();
> - ccode_line = line_no;
> - }
> - YY_BREAK
> -case 35:
> -YY_RULE_SETUP
> -#line 327 "lexer.l"
> -{
> - BEGIN(C_CODE);
> - parenth_depth = 1;
> - class_after_c = FALSE;
> - code_type = HCODE;
> - clear_cbuf();
> - ccode_line = line_no;
> - }
> - YY_BREAK
> -case 36:
> -YY_RULE_SETUP
> -#line 335 "lexer.l"
> -{
> - BEGIN(C_CODE);
> - parenth_depth = 1;
> - class_after_c = FALSE;
> - code_type = CCODE;
> - clear_cbuf();
> - ccode_line = line_no;
> - if(look_for_includes==0)
> - look_for_includes=1;
> - }
> - YY_BREAK
> -case 37:
> -YY_RULE_SETUP
> -#line 345 "lexer.l"
> -{
> - BEGIN(INITIAL);
> - yylval.cbuf = cbuf;
> - cbuf = NULL;
> - if(look_for_includes==1)
> - look_for_includes=0;
> - return code_type;
> - }
> - YY_BREAK
> -case 38:
> -YY_RULE_SETUP
> -#line 354 "lexer.l"
> -{ add_to_cbuf(yytext); }
> - YY_BREAK
> -case 39:
> -YY_RULE_SETUP
> -#line 355 "lexer.l"
> -{ add_to_cbuf(yytext); }
> - YY_BREAK
> -case 40:
> -YY_RULE_SETUP
> -#line 356 "lexer.l"
> -{ add_to_cbuf(yytext); }
> - YY_BREAK
> -case 41:
> -YY_RULE_SETUP
> -#line 357 "lexer.l"
> -{ add_to_cbuf(yytext); }
> - YY_BREAK
> -case 42:
> -YY_RULE_SETUP
> -#line 358 "lexer.l"
> -{ add_to_cbuf(yytext); }
> - YY_BREAK
> -case 43:
> -YY_RULE_SETUP
> -#line 359 "lexer.l"
> -{ add_to_cbuf(yytext); }
> - YY_BREAK
> -case 44:
> -YY_RULE_SETUP
> -#line 361 "lexer.l"
> -{ add_to_cbuf(yytext); }
> - YY_BREAK
> -case 45:
> -YY_RULE_SETUP
> -#line 364 "lexer.l"
> -{
> - BEGIN(CODE_STRING);
> - before_string = C_CODE;
> - add_to_cbuf(yytext);
> - }
> - YY_BREAK
> -case 46:
> -YY_RULE_SETUP
> -#line 369 "lexer.l"
> -{
> - BEGIN(CODE_STRING);
> - before_string = PROPERTY_CODE_I;
> - add_to_cbuf(yytext);
> - }
> - YY_BREAK
> -case 47:
> -YY_RULE_SETUP
> -#line 374 "lexer.l"
> -{ add_to_cbuf(yytext); }
> - YY_BREAK
> -case 48:
> -YY_RULE_SETUP
> -#line 375 "lexer.l"
> -{
> - BEGIN(before_string);
> - add_to_cbuf(yytext);
> - if (before_string == PROPERTY_CODE_I) {
> - yylval.id = cbuf->str;
> - g_string_free (cbuf, FALSE);
> - cbuf = NULL;
> - return STRING;
> - }
> - }
> - YY_BREAK
> -case 49:
> -YY_RULE_SETUP
> -#line 385 "lexer.l"
> -{ add_to_cbuf(yytext); }
> - YY_BREAK
> -case 50:
> -/* rule 50 can match eol */
> -YY_RULE_SETUP
> -#line 386 "lexer.l"
> -{ add_to_cbuf(yytext); }
> - YY_BREAK
> -case 51:
> -YY_RULE_SETUP
> -#line 388 "lexer.l"
> -{
> - parenth_depth++;
> - add_to_cbuf(yytext);
> - }
> - YY_BREAK
> -case 52:
> -YY_RULE_SETUP
> -#line 392 "lexer.l"
> -{
> - parenth_depth--;
> - if(parenth_depth<0) {
> - REJECT;
> - } else if(parenth_depth==0 && class_after_c) {
> - BEGIN(CLASS_CODE_I);
> - yylval.cbuf = cbuf;
> - cbuf = NULL;
> - return CCODE;
> - }
> - add_to_cbuf(yytext);
> - }
> - YY_BREAK
> -case 53:
> -YY_RULE_SETUP
> -#line 405 "lexer.l"
> -{ add_to_cbuf(yytext); }
> - YY_BREAK
> -case 54:
> -/* rule 54 can match eol */
> -YY_RULE_SETUP
> -#line 406 "lexer.l"
> -{ add_to_cbuf(yytext); }
> - YY_BREAK
> -case 55:
> -YY_RULE_SETUP
> -#line 408 "lexer.l"
> -{
> - static int found_classes = 0;
> - look_for_includes = 2;
> - BEGIN(CLASS_CODE);
> -
> - if(++found_classes > 1) {
> - error_print(GOB_ERROR, line_no,
> -    "Only one class per file allowed");
> - }
> -
> - return CLASS;
> - }
> - YY_BREAK
> -case 56:
> -YY_RULE_SETUP
> -#line 421 "lexer.l"
> -{ return ERROR; }
> - YY_BREAK
> -case 57:
> -YY_RULE_SETUP
> -#line 422 "lexer.l"
> -{ return ENUM; }
> - YY_BREAK
> -case 58:
> -YY_RULE_SETUP
> -#line 423 "lexer.l"
> -{ return FLAGS; }
> - YY_BREAK
> -case 59:
> -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
> -(yy_c_buf_p) = yy_cp -= 1;
> -YY_DO_BEFORE_ACTION; /* set up yytext again */
> -YY_RULE_SETUP
> -#line 425 "lexer.l"
> -{
> - int maj = 0, min = 0, pl = 0;
> - int rmaj = 0, rmin = 0, rpl = 0;
> - int effective_maj = 0;
> - int effective_rmaj = 0;
> - char *p;
> -
> - sscanf (VERSION, "%d.%d.%d", &rmaj, &rmin, &rpl);
> - effective_rmaj = rmaj;
> - if (rmin >= 90)
> - effective_rmaj = rmaj + 1;
> -
> - p = strchr (yytext,'r');
> - g_assert (p); /* we MUST have found it */
> - sscanf (p, "requires %d.%d.%d", &maj, &min, &pl);
> - effective_maj = maj;
> - if (min >= 90)
> - effective_maj = maj + 1;
> -
> - if(rmaj < maj ||
> -   (rmaj == maj && rmin < min) ||
> -   (rmaj == maj && rmin == min && rpl < pl)) {
> - error_printf (GOB_ERROR, line_no,
> -      "GOB version at least %d.%d.%d required "
> -      "(this is %s)\n"
> -      "To upgrade your gob, see: "
> -      "http://www.5z.com/jirka/gob.html",
> -      maj, min, pl, VERSION);
> - }
> -
> - if(effective_rmaj != effective_maj) {
> - error_printf(GOB_ERROR, line_no,
> -     "GOB major version %d required "
> -     "(this is %s)\n"
> -     "To upgrade your gob, see: "
> -     "http://www.5z.com/jirka/gob.html",
> -     effective_maj, VERSION);
> - }
> -
> - }
> - YY_BREAK
> -case 60:
> -YY_RULE_SETUP
> -#line 466 "lexer.l"
> -{
> - if(for_cpp) {
> - error_printf(GOB_WARN, line_no,
> -     "'%s' keyword should not "
> -     "be used when generating "
> -     "C++ code", yytext);
> - }
> - REJECT;
> - }
> - YY_BREAK
> -case 61:
> -YY_RULE_SETUP
> -#line 476 "lexer.l"
> -{return FROM;}
> - YY_BREAK
> -case 62:
> -YY_RULE_SETUP
> -#line 477 "lexer.l"
> -{
> - BEGIN(CLASS_STRING);
> - before_string = CLASS_CODE;
> - add_to_cbuf(yytext);
> - }
> - YY_BREAK
> -case 63:
> -YY_RULE_SETUP
> -#line 482 "lexer.l"
> -{ add_to_cbuf(yytext); }
> - YY_BREAK
> -case 64:
> -YY_RULE_SETUP
> -#line 483 "lexer.l"
> -{
> - BEGIN(before_string);
> - add_to_cbuf(yytext);
> - yylval.id = cbuf->str;
> - g_string_free (cbuf, FALSE);
> - cbuf = NULL;
> - return STRING;
> - }
> - YY_BREAK
> -case 65:
> -YY_RULE_SETUP
> -#line 491 "lexer.l"
> -{ add_to_cbuf(yytext); }
> - YY_BREAK
> -case 66:
> -/* rule 66 can match eol */
> -YY_RULE_SETUP
> -#line 492 "lexer.l"
> -{ add_to_cbuf(yytext); }
> - YY_BREAK
> -case 67:
> -YY_RULE_SETUP
> -#line 494 "lexer.l"
> -{return VOID;}
> - YY_BREAK
> -case 68:
> -YY_RULE_SETUP
> -#line 495 "lexer.l"
> -{return STRUCT;}
> - YY_BREAK
> -case 69:
> -YY_RULE_SETUP
> -#line 496 "lexer.l"
> -{return UNION;}
> - YY_BREAK
> -case 70:
> -YY_RULE_SETUP
> -#line 497 "lexer.l"
> -{return ENUM;}
> - YY_BREAK
> -case 71:
> -YY_RULE_SETUP
> -#line 498 "lexer.l"
> -{return SIGNED;}
> - YY_BREAK
> -case 72:
> -YY_RULE_SETUP
> -#line 499 "lexer.l"
> -{return UNSIGNED;}
> - YY_BREAK
> -case 73:
> -YY_RULE_SETUP
> -#line 500 "lexer.l"
> -{return LONG;}
> - YY_BREAK
> -case 74:
> -YY_RULE_SETUP
> -#line 501 "lexer.l"
> -{return SHORT;}
> - YY_BREAK
> -case 75:
> -YY_RULE_SETUP
> -#line 502 "lexer.l"
> -{return INT;}
> - YY_BREAK
> -case 76:
> -YY_RULE_SETUP
> -#line 503 "lexer.l"
> -{return FLOAT;}
> - YY_BREAK
> -case 77:
> -YY_RULE_SETUP
> -#line 504 "lexer.l"
> -{return DOUBLE;}
> - YY_BREAK
> -case 78:
> -YY_RULE_SETUP
> -#line 505 "lexer.l"
> -{return CHAR;}
> - YY_BREAK
> -case 79:
> -YY_RULE_SETUP
> -#line 506 "lexer.l"
> -{return CONST;}
> - YY_BREAK
> -case 80:
> -YY_RULE_SETUP
> -#line 508 "lexer.l"
> -{return THREEDOTS;}
> - YY_BREAK
> -case 81:
> -YY_RULE_SETUP
> -#line 510 "lexer.l"
> -{yylval.line = line_no; return PUBLIC;}
> - YY_BREAK
> -case 82:
> -YY_RULE_SETUP
> -#line 511 "lexer.l"
> -{yylval.line = line_no; return PRIVATE;}
> - YY_BREAK
> -case 83:
> -YY_RULE_SETUP
> -#line 512 "lexer.l"
> -{yylval.line = line_no; return PROTECTED;}
> - YY_BREAK
> -case 84:
> -YY_RULE_SETUP
> -#line 513 "lexer.l"
> -{yylval.line = line_no; return CLASSWIDE;}
> - YY_BREAK
> -case 85:
> -YY_RULE_SETUP
> -#line 514 "lexer.l"
> -{yylval.line = line_no; return ARGUMENT;}
> - YY_BREAK
> -case 86:
> -YY_RULE_SETUP
> -#line 515 "lexer.l"
> -{yylval.line = line_no; return VIRTUAL;}
> - YY_BREAK
> -case 87:
> -YY_RULE_SETUP
> -#line 516 "lexer.l"
> -{yylval.line = line_no; return SIGNAL;}
> - YY_BREAK
> -case 88:
> -YY_RULE_SETUP
> -#line 517 "lexer.l"
> -{yylval.line = line_no; return OVERRIDE;}
> - YY_BREAK
> -case 89:
> -YY_RULE_SETUP
> -#line 518 "lexer.l"
> -{
> - yylval.line = line_no;
> - BEGIN(PROPERTY_CODE);
> - return PROPERTY;
> - }
> - YY_BREAK
> -case 90:
> -YY_RULE_SETUP
> -#line 523 "lexer.l"
> -{ yylval.line = line_no; return NICK; }
> - YY_BREAK
> -case 91:
> -YY_RULE_SETUP
> -#line 524 "lexer.l"
> -{ yylval.line = line_no; return BLURB; }
> - YY_BREAK
> -case 92:
> -YY_RULE_SETUP
> -#line 525 "lexer.l"
> -{ yylval.line = line_no; return MAXIMUM; }
> - YY_BREAK
> -case 93:
> -YY_RULE_SETUP
> -#line 526 "lexer.l"
> -{ yylval.line = line_no; return MINIMUM; }
> - YY_BREAK
> -case 94:
> -YY_RULE_SETUP
> -#line 527 "lexer.l"
> -{ yylval.line = line_no; return DEFAULT_VALUE; }
> - YY_BREAK
> -case 95:
> -YY_RULE_SETUP
> -#line 528 "lexer.l"
> -{ yylval.line = line_no; return FLAGS; }
> - YY_BREAK
> -case 96:
> -YY_RULE_SETUP
> -#line 529 "lexer.l"
> -{ yylval.line = line_no; return TYPE; }
> - YY_BREAK
> -case 97:
> -YY_RULE_SETUP
> -#line 530 "lexer.l"
> -{ yylval.line = line_no; return FLAGS_TYPE; }
> - YY_BREAK
> -case 98:
> -YY_RULE_SETUP
> -#line 531 "lexer.l"
> -{ yylval.line = line_no; return ENUM_TYPE; }
> - YY_BREAK
> -case 99:
> -YY_RULE_SETUP
> -#line 532 "lexer.l"
> -{ yylval.line = line_no; return PARAM_TYPE; }
> - YY_BREAK
> -case 100:
> -YY_RULE_SETUP
> -#line 533 "lexer.l"
> -{ yylval.line = line_no; return BOXED_TYPE; }
> - YY_BREAK
> -case 101:
> -YY_RULE_SETUP
> -#line 534 "lexer.l"
> -{ yylval.line = line_no; return OBJECT_TYPE; }
> - YY_BREAK
> -case 102:
> -YY_RULE_SETUP
> -#line 535 "lexer.l"
> -{
> - yylval.line = line_no;
> - property_paren_depth = 1;
> - BEGIN(PROPERTY_CODE_I);
> - return '(';
> - }
> - YY_BREAK
> -case 103:
> -YY_RULE_SETUP
> -#line 541 "lexer.l"
> -{
> - yylval.line = line_no;
> - property_paren_depth++;
> - return '(';
> - }
> - YY_BREAK
> -case 104:
> -YY_RULE_SETUP
> -#line 546 "lexer.l"
> -{
> - yylval.line = line_no;
> - property_paren_depth--;
> - if (property_paren_depth == 0) {
> - BEGIN(CLASS_CODE_I);
> - }
> - return ')';
> - }
> - YY_BREAK
> -case 105:
> -YY_RULE_SETUP
> -#line 555 "lexer.l"
> -{
> - yylval.id = g_strdup(yytext);
> - return NUMBER;
> - }
> - YY_BREAK
> -case 106:
> -YY_RULE_SETUP
> -#line 559 "lexer.l"
> -{
> - /* This is cpp kind of token thingie */
> - if (for_cpp) {
> - yylval.id = g_strdup(yytext);
> - return TOKEN;
> - } else {
> - REJECT;
> - }
> - }
> - YY_BREAK
> -case 107:
> -YY_RULE_SETUP
> -#line 568 "lexer.l"
> -{
> - /* this one is for a classname with a namespace */
> - yylval.id = g_strdup(yytext);
> - return TYPETOKEN;
> - }
> - YY_BREAK
> -case 108:
> -YY_RULE_SETUP
> -#line 573 "lexer.l"
> -{
> - /* this is for a classname with an empty namespace */
> - yylval.id = g_strdup(yytext);
> - return TYPETOKEN;
> - }
> - YY_BREAK
> -case 109:
> -YY_RULE_SETUP
> -#line 578 "lexer.l"
> -{
> - yylval.id = g_strdup(yytext);
> - return TOKEN;
> - }
> - YY_BREAK
> -case 110:
> -YY_RULE_SETUP
> -#line 582 "lexer.l"
> -{
> - yylval.id = g_strdup(yytext);
> - return SINGLE_CHAR;
> - }
> - YY_BREAK
> -case 111:
> -YY_RULE_SETUP
> -#line 587 "lexer.l"
> -{
> - yylval.id = g_strdup(yytext);
> - return ARRAY_DIM;
> - }
> - YY_BREAK
> -case 112:
> -YY_RULE_SETUP
> -#line 591 "lexer.l"
> -{
> - /* cheat for bitfield */
> - yylval.id = g_strdup(yytext);
> - return ARRAY_DIM;
> - }
> - YY_BREAK
> -case 113:
> -YY_RULE_SETUP
> -#line 596 "lexer.l"
> -{
> - BEGIN(CLASS_CODE_I);
> - return '{';
> - }
> - YY_BREAK
> -case 114:
> -YY_RULE_SETUP
> -#line 600 "lexer.l"
> -{
> - BEGIN(C_CODE);
> - parenth_depth=1;
> - class_after_c = TRUE;
> - yylval.line = line_no;
> - clear_cbuf();
> - ccode_line = line_no;
> - return '{';
> - }
> - YY_BREAK
> -case 115:
> -YY_RULE_SETUP
> -#line 609 "lexer.l"
> -{
> - BEGIN(INITIAL);
> - return '}';
> - }
> - YY_BREAK
> -case 116:
> -YY_RULE_SETUP
> -#line 614 "lexer.l"
> -;  /*ignore*/
> - YY_BREAK
> -case 117:
> -YY_RULE_SETUP
> -#line 616 "lexer.l"
> -{
> - yylval.line = line_no;
> - return yytext[0];
> - }
> - YY_BREAK
> -case 118:
> -/* rule 118 can match eol */
> -YY_RULE_SETUP
> -#line 621 "lexer.l"
> -;  /*ignore*/
> - YY_BREAK
> -case 119:
> -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
> -(yy_c_buf_p) = yy_cp -= 1;
> -YY_DO_BEFORE_ACTION; /* set up yytext again */
> -YY_RULE_SETUP
> -#line 623 "lexer.l"
> -{
> - char *p;
> - int t;
> - p = strchr (yytext,'p');
> - g_assert (p); /* we MUST have found it */
> - sscanf (p, "prealloc %d", &t);
> - prealloc=t;
> - }
> - YY_BREAK
> -case 120:
> -YY_RULE_SETUP
> -#line 632 "lexer.l"
> -ECHO;
> - YY_BREAK
> -#line 2392 "lex.yy.c"
> - case YY_STATE_EOF(INITIAL):
> - case YY_STATE_EOF(COMMENT):
> - case YY_STATE_EOF(C_CODE):
> - case YY_STATE_EOF(CODE_STRING):
> - case YY_STATE_EOF(CLASS_CODE):
> - case YY_STATE_EOF(CLASS_STRING):
> - case YY_STATE_EOF(CLASS_CODE_I):
> - case YY_STATE_EOF(PROPERTY_CODE):
> - case YY_STATE_EOF(PROPERTY_CODE_I):
> - case YY_STATE_EOF(GTK_DOC_BEFORE_NAME):
> - case YY_STATE_EOF(GTK_DOC):
> - case YY_STATE_EOF(GTK_DOC_LINE):
> - yyterminate();
> -
> - case YY_END_OF_BUFFER:
> - {
> - /* Amount of text matched not including the EOB char. */
> - int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
> -
> - /* Undo the effects of YY_DO_BEFORE_ACTION. */
> - *yy_cp = (yy_hold_char);
> - YY_RESTORE_YY_MORE_OFFSET
> -
> - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
> - {
> - /* We're scanning a new file or input source.  It's
> - * possible that this happened because the user
> - * just pointed yyin at a new source and called
> - * yylex().  If so, then we have to assure
> - * consistency between YY_CURRENT_BUFFER and our
> - * globals.  Here is the right place to do so, because
> - * this is the first action (other than possibly a
> - * back-up) that will match for the new input source.
> - */
> - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
> - YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
> - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
> - }
> -
> - /* Note that here we test for yy_c_buf_p "<=" to the position
> - * of the first EOB in the buffer, since yy_c_buf_p will
> - * already have been incremented past the NUL character
> - * (since all states make transitions on EOB to the
> - * end-of-buffer state).  Contrast this with the test
> - * in input().
> - */
> - if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
> - { /* This was really a NUL. */
> - yy_state_type yy_next_state;
> -
> - (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
> -
> - yy_current_state = yy_get_previous_state(  );
> -
> - /* Okay, we're now positioned to make the NUL
> - * transition.  We couldn't have
> - * yy_get_previous_state() go ahead and do it
> - * for us because it doesn't know how to deal
> - * with the possibility of jamming (and we don't
> - * want to build jamming into it because then it
> - * will run more slowly).
> - */
> -
> - yy_next_state = yy_try_NUL_trans( yy_current_state );
> -
> - yy_bp = (yytext_ptr) + YY_MORE_ADJ;
> -
> - if ( yy_next_state )
> - {
> - /* Consume the NUL. */
> - yy_cp = ++(yy_c_buf_p);
> - yy_current_state = yy_next_state;
> - goto yy_match;
> - }
> -
> - else
> - {
> - yy_cp = (yy_c_buf_p);
> - goto yy_find_action;
> - }
> - }
> -
> - else switch ( yy_get_next_buffer(  ) )
> - {
> - case EOB_ACT_END_OF_FILE:
> - {
> - (yy_did_buffer_switch_on_eof) = 0;
> -
> - if ( yywrap( ) )
> - {
> - /* Note: because we've taken care in
> - * yy_get_next_buffer() to have set up
> - * yytext, we can now set up
> - * yy_c_buf_p so that if some total
> - * hoser (like flex itself) wants to
> - * call the scanner after we return the
> - * YY_NULL, it'll still work - another
> - * YY_NULL will get returned.
> - */
> - (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
> -
> - yy_act = YY_STATE_EOF(YY_START);
> - goto do_action;
> - }
> -
> - else
> - {
> - if ( ! (yy_did_buffer_switch_on_eof) )
> - YY_NEW_FILE;
> - }
> - break;
> - }
> -
> - case EOB_ACT_CONTINUE_SCAN:
> - (yy_c_buf_p) =
> - (yytext_ptr) + yy_amount_of_matched_text;
> -
> - yy_current_state = yy_get_previous_state(  );
> -
> - yy_cp = (yy_c_buf_p);
> - yy_bp = (yytext_ptr) + YY_MORE_ADJ;
> - goto yy_match;
> -
> - case EOB_ACT_LAST_MATCH:
> - (yy_c_buf_p) =
> - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
> -
> - yy_current_state = yy_get_previous_state(  );
> -
> - yy_cp = (yy_c_buf_p);
> - yy_bp = (yytext_ptr) + YY_MORE_ADJ;
> - goto yy_find_action;
> - }
> - break;
> - }
> -
> - default:
> - YY_FATAL_ERROR(
> - "fatal flex scanner internal error--no action found" );
> - } /* end of action switch */
> - } /* end of scanning one token */
> -} /* end of yylex */
> -
> -/* yy_get_next_buffer - try to read in a new buffer
> - *
> - * Returns a code representing an action:
> - * EOB_ACT_LAST_MATCH -
> - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
> - * EOB_ACT_END_OF_FILE - end of file
> - */
> -static int yy_get_next_buffer (void)
> -{
> -     register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
> - register char *source = (yytext_ptr);
> - register int number_to_move, i;
> - int ret_val;
> -
> - if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
> - YY_FATAL_ERROR(
> - "fatal flex scanner internal error--end of buffer missed" );
> -
> - if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
> - { /* Don't try to fill the buffer, so this is an EOF. */
> - if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
> - {
> - /* We matched a single character, the EOB, so
> - * treat this as a final EOF.
> - */
> - return EOB_ACT_END_OF_FILE;
> - }
> -
> - else
> - {
> - /* We matched some text prior to the EOB, first
> - * process it.
> - */
> - return EOB_ACT_LAST_MATCH;
> - }
> - }
> -
> - /* Try to read more data. */
> -
> - /* First move last chars to start of buffer. */
> - number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
> -
> - for ( i = 0; i < number_to_move; ++i )
> - *(dest++) = *(source++);
> -
> - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
> - /* don't do the read, it's not guaranteed to return an EOF,
> - * just force an EOF
> - */
> - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
> -
> - else
> - {
> - size_t num_to_read =
> - YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
> -
> - while ( num_to_read <= 0 )
> - { /* Not enough room in the buffer - grow it. */
> -
> - YY_FATAL_ERROR(
> -"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
> -
> - }
> -
> - if ( num_to_read > YY_READ_BUF_SIZE )
> - num_to_read = YY_READ_BUF_SIZE;
> -
> - /* Read in more data. */
> - YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
> - (yy_n_chars), num_to_read );
> -
> - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
> - }
> -
> - if ( (yy_n_chars) == 0 )
> - {
> - if ( number_to_move == YY_MORE_ADJ )
> - {
> - ret_val = EOB_ACT_END_OF_FILE;
> - yyrestart(yyin  );
> - }
> -
> - else
> - {
> - ret_val = EOB_ACT_LAST_MATCH;
> - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
> - YY_BUFFER_EOF_PENDING;
> - }
> - }
> -
> - else
> - ret_val = EOB_ACT_CONTINUE_SCAN;
> -
> - (yy_n_chars) += number_to_move;
> - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
> - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
> -
> - (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
> -
> - return ret_val;
> -}
> -
> -/* yy_get_previous_state - get the state just before the EOB char was reached */
> -
> -    static yy_state_type yy_get_previous_state (void)
> -{
> - register yy_state_type yy_current_state;
> - register char *yy_cp;
> -    
> - yy_current_state = (yy_start);
> - yy_current_state += YY_AT_BOL();
> -
> - (yy_state_ptr) = (yy_state_buf);
> - *(yy_state_ptr)++ = yy_current_state;
> -
> - for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
> - {
> - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
> - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
> - {
> - yy_current_state = (int) yy_def[yy_current_state];
> - if ( yy_current_state >= 551 )
> - yy_c = yy_meta[(unsigned int) yy_c];
> - }
> - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
> - *(yy_state_ptr)++ = yy_current_state;
> - }
> -
> - return yy_current_state;
> -}
> -
> -/* yy_try_NUL_trans - try to make a transition on the NUL character
> - *
> - * synopsis
> - * next_state = yy_try_NUL_trans( current_state );
> - */
> -    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
> -{
> - register int yy_is_jam;
> -    
> - register YY_CHAR yy_c = 1;
> - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
> - {
> - yy_current_state = (int) yy_def[yy_current_state];
> - if ( yy_current_state >= 551 )
> - yy_c = yy_meta[(unsigned int) yy_c];
> - }
> - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
> - yy_is_jam = (yy_current_state == 550);
> - if ( ! yy_is_jam )
> - *(yy_state_ptr)++ = yy_current_state;
> -
> - return yy_is_jam ? 0 : yy_current_state;
> -}
> -
> -    static void yyunput (int c, register char * yy_bp )
> -{
> - register char *yy_cp;
> -    
> -    yy_cp = (yy_c_buf_p);
> -
> - /* undo effects of setting up yytext */
> - *yy_cp = (yy_hold_char);
> -
> - if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
> - { /* need to shift things up to make room */
> - /* +2 for EOB chars. */
> - register int number_to_move = (yy_n_chars) + 2;
> - register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
> - YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
> - register char *source =
> - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
> -
> - while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
> - *--dest = *--source;
> -
> - yy_cp += (int) (dest - source);
> - yy_bp += (int) (dest - source);
> - YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
> - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
> -
> - if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
> - YY_FATAL_ERROR( "flex scanner push-back overflow" );
> - }
> -
> - *--yy_cp = (char) c;
> -
> - (yytext_ptr) = yy_bp;
> - (yy_hold_char) = *yy_cp;
> - (yy_c_buf_p) = yy_cp;
> -}
> -
> -#ifndef YY_NO_INPUT
> -#ifdef __cplusplus
> -    static int yyinput (void)
> -#else
> -    static int input  (void)
> -#endif
> -
> -{
> - int c;
> -    
> - *(yy_c_buf_p) = (yy_hold_char);
> -
> - if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
> - {
> - /* yy_c_buf_p now points to the character we want to return.
> - * If this occurs *before* the EOB characters, then it's a
> - * valid NUL; if not, then we've hit the end of the buffer.
> - */
> - if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
> - /* This was really a NUL. */
> - *(yy_c_buf_p) = '\0';
> -
> - else
> - { /* need more input */
> - int offset = (yy_c_buf_p) - (yytext_ptr);
> - ++(yy_c_buf_p);
> -
> - switch ( yy_get_next_buffer(  ) )
> - {
> - case EOB_ACT_LAST_MATCH:
> - /* This happens because yy_g_n_b()
> - * sees that we've accumulated a
> - * token and flags that we need to
> - * try matching the token before
> - * proceeding.  But for input(),
> - * there's no matching to consider.
> - * So convert the EOB_ACT_LAST_MATCH
> - * to EOB_ACT_END_OF_FILE.
> - */
> -
> - /* Reset buffer status. */
> - yyrestart(yyin );
> -
> - /*FALLTHROUGH*/
> -
> - case EOB_ACT_END_OF_FILE:
> - {
> - if ( yywrap( ) )
> - return EOF;
> -
> - if ( ! (yy_did_buffer_switch_on_eof) )
> - YY_NEW_FILE;
> -#ifdef __cplusplus
> - return yyinput();
> -#else
> - return input();
> -#endif
> - }
> -
> - case EOB_ACT_CONTINUE_SCAN:
> - (yy_c_buf_p) = (yytext_ptr) + offset;
> - break;
> - }
> - }
> - }
> -
> - c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
> - *(yy_c_buf_p) = '\0'; /* preserve yytext */
> - (yy_hold_char) = *++(yy_c_buf_p);
> -
> - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
> -
> - return c;
> -}
> -#endif /* ifndef YY_NO_INPUT */
> -
> -/** Immediately switch to a different input stream.
> - * @param input_file A readable stream.
> - *
> - * @note This function does not reset the start condition to @c INITIAL .
> - */
> -    void yyrestart  (FILE * input_file )
> -{
> -    
> - if ( ! YY_CURRENT_BUFFER ){
> -        yyensure_buffer_stack ();
> - YY_CURRENT_BUFFER_LVALUE =
> -            yy_create_buffer(yyin,YY_BUF_SIZE );
> - }
> -
> - yy_init_buffer(YY_CURRENT_BUFFER,input_file );
> - yy_load_buffer_state( );
> -}
> -
> -/** Switch to a different input buffer.
> - * @param new_buffer The new input buffer.
> - *
> - */
> -    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
> -{
> -    
> - /* TODO. We should be able to replace this entire function body
> - * with
> - * yypop_buffer_state();
> - * yypush_buffer_state(new_buffer);
> -     */
> - yyensure_buffer_stack ();
> - if ( YY_CURRENT_BUFFER == new_buffer )
> - return;
> -
> - if ( YY_CURRENT_BUFFER )
> - {
> - /* Flush out information for old buffer. */
> - *(yy_c_buf_p) = (yy_hold_char);
> - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
> - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
> - }
> -
> - YY_CURRENT_BUFFER_LVALUE = new_buffer;
> - yy_load_buffer_state( );
> -
> - /* We don't actually know whether we did this switch during
> - * EOF (yywrap()) processing, but the only time this flag
> - * is looked at is after yywrap() is called, so it's safe
> - * to go ahead and always set it.
> - */
> - (yy_did_buffer_switch_on_eof) = 1;
> -}
> -
> -static void yy_load_buffer_state  (void)
> -{
> -     (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
> - (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
> - yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
> - (yy_hold_char) = *(yy_c_buf_p);
> -}
> -
> -/** Allocate and initialize an input buffer state.
> - * @param file A readable stream.
> - * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
> - *
> - * @return the allocated buffer state.
> - */
> -    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size )
> -{
> - YY_BUFFER_STATE b;
> -    
> - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );
> - if ( ! b )
> - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
> -
> - b->yy_buf_size = size;
> -
> - /* yy_ch_buf has to be 2 characters longer than the size given because
> - * we need to put in 2 end-of-buffer characters.
> - */
> - b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2  );
> - if ( ! b->yy_ch_buf )
> - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
> -
> - b->yy_is_our_buffer = 1;
> -
> - yy_init_buffer(b,file );
> -
> - return b;
> -}
> -
> -/** Destroy the buffer.
> - * @param b a buffer created with yy_create_buffer()
> - *
> - */
> -    void yy_delete_buffer (YY_BUFFER_STATE  b )
> -{
> -    
> - if ( ! b )
> - return;
> -
> - if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
> - YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
> -
> - if ( b->yy_is_our_buffer )
> - yyfree((void *) b->yy_ch_buf  );
> -
> - yyfree((void *) b  );
> -}
> -
> -#ifndef __cplusplus
> -extern int isatty (int );
> -#endif /* __cplusplus */
> -    
> -/* Initializes or reinitializes a buffer.
> - * This function is sometimes called more than once on the same buffer,
> - * such as during a yyrestart() or at EOF.
> - */
> -    static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file )
> -
> -{
> - int oerrno = errno;
> -    
> - yy_flush_buffer(b );
> -
> - b->yy_input_file = file;
> - b->yy_fill_buffer = 1;
> -
> -    /* If b is the current buffer, then yy_init_buffer was _probably_
> -     * called from yyrestart() or through yy_get_next_buffer.
> -     * In that case, we don't want to reset the lineno or column.
> -     */
> -    if (b != YY_CURRENT_BUFFER){
> -        b->yy_bs_lineno = 1;
> -        b->yy_bs_column = 0;
> -    }
> -
> -        b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
> -    
> - errno = oerrno;
> -}
> -
> -/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
> - * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
> - *
> - */
> -    void yy_flush_buffer (YY_BUFFER_STATE  b )
> -{
> -     if ( ! b )
> - return;
> -
> - b->yy_n_chars = 0;
> -
> - /* We always need two end-of-buffer characters.  The first causes
> - * a transition to the end-of-buffer state.  The second causes
> - * a jam in that state.
> - */
> - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
> - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
> -
> - b->yy_buf_pos = &b->yy_ch_buf[0];
> -
> - b->yy_at_bol = 1;
> - b->yy_buffer_status = YY_BUFFER_NEW;
> -
> - if ( b == YY_CURRENT_BUFFER )
> - yy_load_buffer_state( );
> -}
> -
> -/** Pushes the new state onto the stack. The new state becomes
> - *  the current state. This function will allocate the stack
> - *  if necessary.
> - *  @param new_buffer The new state.
> - *  
> - */
> -void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
> -{
> -     if (new_buffer == NULL)
> - return;
> -
> - yyensure_buffer_stack();
> -
> - /* This block is copied from yy_switch_to_buffer. */
> - if ( YY_CURRENT_BUFFER )
> - {
> - /* Flush out information for old buffer. */
> - *(yy_c_buf_p) = (yy_hold_char);
> - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
> - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
> - }
> -
> - /* Only push if top exists. Otherwise, replace top. */
> - if (YY_CURRENT_BUFFER)
> - (yy_buffer_stack_top)++;
> - YY_CURRENT_BUFFER_LVALUE = new_buffer;
> -
> - /* copied from yy_switch_to_buffer. */
> - yy_load_buffer_state( );
> - (yy_did_buffer_switch_on_eof) = 1;
> -}
> -
> -/** Removes and deletes the top of the stack, if present.
> - *  The next element becomes the new top.
> - *  
> - */
> -void yypop_buffer_state (void)
> -{
> -     if (!YY_CURRENT_BUFFER)
> - return;
> -
> - yy_delete_buffer(YY_CURRENT_BUFFER );
> - YY_CURRENT_BUFFER_LVALUE = NULL;
> - if ((yy_buffer_stack_top) > 0)
> - --(yy_buffer_stack_top);
> -
> - if (YY_CURRENT_BUFFER) {
> - yy_load_buffer_state( );
> - (yy_did_buffer_switch_on_eof) = 1;
> - }
> -}
> -
> -/* Allocates the stack if it does not exist.
> - *  Guarantees space for at least one push.
> - */
> -static void yyensure_buffer_stack (void)
> -{
> - int num_to_alloc;
> -    
> - if (!(yy_buffer_stack)) {
> -
> - /* First allocation is just for 2 elements, since we don't know if this
> - * scanner will even need a stack. We use 2 instead of 1 to avoid an
> - * immediate realloc on the next call.
> -         */
> - num_to_alloc = 1;
> - (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
> - (num_to_alloc * sizeof(struct yy_buffer_state*)
> - );
> -
> - memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
> -
> - (yy_buffer_stack_max) = num_to_alloc;
> - (yy_buffer_stack_top) = 0;
> - return;
> - }
> -
> - if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
> -
> - /* Increase the buffer to prepare for a possible push. */
> - int grow_size = 8 /* arbitrary grow size */;
> -
> - num_to_alloc = (yy_buffer_stack_max) + grow_size;
> - (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
> - ((yy_buffer_stack),
> - num_to_alloc * sizeof(struct yy_buffer_state*)
> - );
> -
> - /* zero only the new slots.*/
> - memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
> - (yy_buffer_stack_max) = num_to_alloc;
> - }
> -}
> -
> -/** Setup the input buffer state to scan directly from a user-specified character buffer.
> - * @param base the character buffer
> - * @param size the size in bytes of the character buffer
> - *
> - * @return the newly allocated buffer state object.
> - */
> -YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
> -{
> - YY_BUFFER_STATE b;
> -    
> - if ( size < 2 ||
> -     base[size-2] != YY_END_OF_BUFFER_CHAR ||
> -     base[size-1] != YY_END_OF_BUFFER_CHAR )
> - /* They forgot to leave room for the EOB's. */
> - return 0;
> -
> - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );
> - if ( ! b )
> - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
> -
> - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
> - b->yy_buf_pos = b->yy_ch_buf = base;
> - b->yy_is_our_buffer = 0;
> - b->yy_input_file = 0;
> - b->yy_n_chars = b->yy_buf_size;
> - b->yy_is_interactive = 0;
> - b->yy_at_bol = 1;
> - b->yy_fill_buffer = 0;
> - b->yy_buffer_status = YY_BUFFER_NEW;
> -
> - yy_switch_to_buffer(b  );
> -
> - return b;
> -}
> -
> -/** Setup the input buffer state to scan a string. The next call to yylex() will
> - * scan from a @e copy of @a str.
> - * @param str a NUL-terminated string to scan
> - *
> - * @return the newly allocated buffer state object.
> - * @note If you want to scan bytes that may contain NUL values, then use
> - *       yy_scan_bytes() instead.
> - */
> -YY_BUFFER_STATE yy_scan_string (yyconst char * yy_str )
> -{
> -    
> - return yy_scan_bytes(yy_str,strlen(yy_str) );
> -}
> -
> -/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
> - * scan from a @e copy of @a bytes.
> - * @param bytes the byte buffer to scan
> - * @param len the number of bytes in the buffer pointed to by @a bytes.
> - *
> - * @return the newly allocated buffer state object.
> - */
> -YY_BUFFER_STATE yy_scan_bytes  (yyconst char * bytes, int  len )
> -{
> - YY_BUFFER_STATE b;
> - char *buf;
> - yy_size_t n;
> - int i;
> -    
> - /* Get memory for full buffer, including space for trailing EOB's. */
> - n = len + 2;
> - buf = (char *) yyalloc(n  );
> - if ( ! buf )
> - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
> -
> - for ( i = 0; i < len; ++i )
> - buf[i] = bytes[i];
> -
> - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
> -
> - b = yy_scan_buffer(buf,n );
> - if ( ! b )
> - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
> -
> - /* It's okay to grow etc. this buffer, and we should throw it
> - * away when we're done.
> - */
> - b->yy_is_our_buffer = 1;
> -
> - return b;
> -}
> -
> -#ifndef YY_EXIT_FAILURE
> -#define YY_EXIT_FAILURE 2
> -#endif
> -
> -static void yy_fatal_error (yyconst char* msg )
> -{
> -     (void) fprintf( stderr, "%s\n", msg );
> - exit( YY_EXIT_FAILURE );
> -}
> -
> -/* Redefine yyless() so it works in section 3 code. */
> -
> -#undef yyless
> -#define yyless(n) \
> - do \
> - { \
> - /* Undo effects of setting up yytext. */ \
> -        int yyless_macro_arg = (n); \
> -        YY_LESS_LINENO(yyless_macro_arg);\
> - yytext[yyleng] = (yy_hold_char); \
> - (yy_c_buf_p) = yytext + yyless_macro_arg; \
> - (yy_hold_char) = *(yy_c_buf_p); \
> - *(yy_c_buf_p) = '\0'; \
> - yyleng = yyless_macro_arg; \
> - } \
> - while ( 0 )
> -
> -/* Accessor  methods (get/set functions) to struct members. */
> -
> -/** Get the current line number.
> - *
> - */
> -int yyget_lineno  (void)
> -{
> -        
> -    return yylineno;
> -}
> -
> -/** Get the input stream.
> - *
> - */
> -FILE *yyget_in  (void)
> -{
> -        return yyin;
> -}
> -
> -/** Get the output stream.
> - *
> - */
> -FILE *yyget_out  (void)
> -{
> -        return yyout;
> -}
> -
> -/** Get the length of the current token.
> - *
> - */
> -int yyget_leng  (void)
> -{
> -        return yyleng;
> -}
> -
> -/** Get the current token.
> - *
> - */
> -
> -char *yyget_text  (void)
> -{
> -        return yytext;
> -}
> -
> -/** Set the current line number.
> - * @param line_number
> - *
> - */
> -void yyset_lineno (int  line_number )
> -{
> -    
> -    yylineno = line_number;
> -}
> -
> -/** Set the input stream. This does not discard the current
> - * input buffer.
> - * @param in_str A readable stream.
> - *
> - * @see yy_switch_to_buffer
> - */
> -void yyset_in (FILE *  in_str )
> -{
> -        yyin = in_str ;
> -}
> -
> -void yyset_out (FILE *  out_str )
> -{
> -        yyout = out_str ;
> -}
> -
> -int yyget_debug  (void)
> -{
> -        return yy_flex_debug;
> -}
> -
> -void yyset_debug (int  bdebug )
> -{
> -        yy_flex_debug = bdebug ;
> -}
> -
> -/* yylex_destroy is for both reentrant and non-reentrant scanners. */
> -int yylex_destroy  (void)
> -{
> -    
> -    /* Pop the buffer stack, destroying each element. */
> - while(YY_CURRENT_BUFFER){
> - yy_delete_buffer(YY_CURRENT_BUFFER  );
> - YY_CURRENT_BUFFER_LVALUE = NULL;
> - yypop_buffer_state();
> - }
> -
> - /* Destroy the stack itself. */
> - yyfree((yy_buffer_stack) );
> - (yy_buffer_stack) = NULL;
> -
> -    yyfree ( (yy_state_buf) );
> -
> -    return 0;
> -}
> -
> -/*
> - * Internal utility routines.
> - */
> -
> -#ifndef yytext_ptr
> -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
> -{
> - register int i;
> -     for ( i = 0; i < n; ++i )
> - s1[i] = s2[i];
> -}
> -#endif
> -
> -#ifdef YY_NEED_STRLEN
> -static int yy_flex_strlen (yyconst char * s )
> -{
> - register int n;
> -     for ( n = 0; s[n]; ++n )
> - ;
> -
> - return n;
> -}
> -#endif
> -
> -void *yyalloc (yy_size_t  size )
> -{
> - return (void *) malloc( size );
> -}
> -
> -void *yyrealloc  (void * ptr, yy_size_t  size )
> -{
> - /* The cast to (char *) in the following accommodates both
> - * implementations that use char* generic pointers, and those
> - * that use void* generic pointers.  It works with the latter
> - * because both ANSI C and C++ allow castless assignment from
> - * any pointer type to void*, and deal with argument conversions
> - * as though doing an assignment.
> - */
> - return (void *) realloc( (char *) ptr, size );
> -}
> -
> -void yyfree (void * ptr )
> -{
> - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
> -}
> -
> -#define YYTABLES_NAME "yytables"
> -
> -#undef YY_NEW_FILE
> -#undef YY_FLUSH_BUFFER
> -#undef yy_set_bol
> -#undef yy_new_buffer
> -#undef yy_set_interactive
> -#undef yytext_ptr
> -#undef YY_DO_BEFORE_ACTION
> -
> -#ifdef YY_DECL_IS_OURS
> -#undef YY_DECL_IS_OURS
> -#undef YY_DECL
> -#endif
> -#line 632 "lexer.l"
> -
> -
> -
> diff -u -Naur pristine/gob2-2.0.14/src/lexer.l modified/gob2-2.0.14/src/lexer.l
> --- pristine/gob2-2.0.14/src/lexer.l 2005-07-22 14:50:37.000000000 -0400
> +++ modified/gob2-2.0.14/src/lexer.l 2007-02-25 18:08:26.000000000 -0500
> @@ -48,6 +48,8 @@
>  static char *gtk_doc_func = NULL; /* current gtk-doc func */
>  GHashTable *gtk_doc_hash = NULL;
>  
> +static GString *funcattrs = NULL;
> +
>  static GString *cbuf = NULL;
>  int ccode_line = 1;
>  
> @@ -565,6 +567,12 @@
>   REJECT;
>   }
>   }
> +
> +<CLASS_CODE_I>G_GNUC_PRINTF|G_GNUC_SCANF|G_GNUC_FORMAT {
> +                        yylval.id = g_strdup(yytext);
> +                        return FUNCATTR;
> +}
> +
>  <CLASS_CODE,CLASS_CODE_I,PROPERTY_CODE,PROPERTY_CODE_I,INITIAL>[A-Za-z_][A-Za-z0-9_]*(:[A-Za-z_][A-Za-z0-9_]*)+ {
>   /* this one is for a classname with a namespace */
>   yylval.id = g_strdup(yytext);
> diff -u -Naur pristine/gob2-2.0.14/src/main.c modified/gob2-2.0.14/src/main.c
> --- pristine/gob2-2.0.14/src/main.c 2006-01-05 13:05:45.000000000 -0500
> +++ modified/gob2-2.0.14/src/main.c 2007-02-26 14:54:24.000000000 -0500
> @@ -200,6 +200,7 @@
>        const char *afterargs,
>        const char *postfix,
>        const Method *m,
> +      gboolean print_funcattrs,
>        gboolean one_arg_per_line,
>        gboolean no_funcbase,
>        gboolean kill_underscore,
> @@ -255,7 +256,28 @@
>   } else {
>   out_printf(fp, "void");
>   }
> - out_printf(fp, "%s)%s", afterargs, postfix);
> + /* Slightly icky: sometimes we are called st m->funcattrs
> +   hasn't been set, but if so it should be NULL since its been
> +   zero-initialized.  */
> + if(print_funcattrs && m->funcattrs != NULL
> +   && strlen(m->funcattrs) > 0) {
> +        /* To keep the output neat, we trim off the trailing '\n'
> +           from the end of funcattrs for a moment.  */
> +        size_t funcattrs_len = strlen(m->funcattrs);
> +                gboolean funcattrs_chomped = FALSE;
> +        if((m->funcattrs)[funcattrs_len - 1] == '\n') {
> +                m->funcattrs[funcattrs_len - 1] = '\0';
> +                        funcattrs_chomped = TRUE;
> + }
> +        out_printf(fp, "%s)\n%s%s", afterargs, m->funcattrs, postfix);
> +                /* Put it back like it was (though it shouldn't matter).  */
> + if (funcattrs_chomped) {
> +        (m->funcattrs)[funcattrs_len - 1] = '\n';
> + }
> + }
> + else {
> +        out_printf(fp, "%s)%s", afterargs, postfix);
> + }
>  }
>  
>  static gboolean
> @@ -372,11 +394,12 @@
>  
>   /* if a signal mark it as such */
>   if(m->method != VIRTUAL_METHOD)
> - print_method(outh, "\t/*signal*/", "(* ", "", ") ", "", ";\n",
> -     m, FALSE, TRUE, TRUE, FALSE, FALSE);
> +        print_method(outh, "\t/*signal*/", "(* ", "", ") ", "", ";\n",
> +     m, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE);
>   else
> - print_method(outh, "\t", "(* ", "", ") ", "", ";\n",
> -     m, FALSE, TRUE, TRUE, FALSE, FALSE);
> +        print_method(outh, "\t", "(* ", "", ") ", "", ";\n",
> +     m, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE);
> +
>  }
>  
>  static void
> @@ -386,7 +409,7 @@
>   return;
>  
>   print_method(outh, "", "\t", "", "\t", "", ";\n", m,
> -     TRUE, FALSE, TRUE, FALSE, FALSE);
> +     TRUE, TRUE, FALSE, TRUE, FALSE, FALSE);
>  }
>  
>  static void
> @@ -424,7 +447,7 @@
>      "(GCallback) __extension__ ({",
>      funcbase, m->id, macrobase, typebase, m->id);
>   print_method (outh, "", "(* ___", "", ") ", ", gpointer ___data ",
> -      " = (func); ", m, FALSE, TRUE, TRUE, FALSE, TRUE);
> +      " = (func); ", m, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE);
>   out_printf (outh, "___%s; }), (data))\n", m->id);
>  
>   /* connect_after */
> @@ -435,7 +458,7 @@
>      "(GCallback) __extension__ ({",
>      funcbase, m->id, macrobase, typebase, m->id);
>   print_method (outh, "", "(* ___", "", ") ", ", gpointer ___data ",
> -      " = (func); ", m, FALSE, TRUE, TRUE, FALSE, TRUE);
> +      " = (func); ", m, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE);
>   out_printf (outh, "___%s; }), (data))\n", m->id);
>  
>   /* connect_data */
> @@ -447,7 +470,7 @@
>      "(GCallback) __extension__ ({",
>      funcbase, m->id, macrobase, typebase, m->id);
>   print_method (outh, "", "(* ___", "", ") ", ", gpointer ___data ",
> -      " = (func); ", m, FALSE, TRUE, TRUE, FALSE, TRUE);
> +      " = (func); ", m, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE);
>   out_printf (outh, "___%s; }), (data), (destroy_data), (GConnectFlags)(flags))\n", m->id);
>   }
>  }
> @@ -514,10 +537,10 @@
>  
>   if(outph)
>   print_method(outph, "", "\t", "", "\t", "", ";\n",
> -     m, FALSE, FALSE, TRUE, FALSE, FALSE);
> +     m, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE);
>   else
>   print_method(out, "", "\t", "", "\t", "", ";\n",
> -     m, FALSE, FALSE, TRUE, FALSE, FALSE);
> +     m, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE);
>  }
>  
>  static void
> @@ -529,7 +552,7 @@
>   if(m->cbuf)
>   print_method(out,
>       "static ", "___real_", "", " ", "", ";\n",
> -     m, FALSE, FALSE, TRUE, FALSE, FALSE);
> +     m, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE);
>   }
>   /* no else, here, it might still have a private prototype, it's not
>   * exclusive */
> @@ -540,14 +563,24 @@
>   char *s = g_strdup_printf("___%x_", (guint)m->unique_id);
>   print_method(out, "static ", s, "", " ", "",
>       no_gnu?";\n":" G_GNUC_UNUSED;\n",
> -     m, FALSE, FALSE, FALSE, FALSE, FALSE);
> +     m, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE);
>   g_free(s);
>   } else if(m->scope == PRIVATE_SCOPE ||
>    m->method == INIT_METHOD ||
>    m->method == CLASS_INIT_METHOD) {
> +        /* It might concievably be useful to allow attributes
> +           to be applied to init or class_init, but the
> +           attributes currently supported aren't useful and
> +           the parser and check_* code is currently set up to
> +           reject attributes to these functions.  So we
> +           shouldn't see any.  */
> +        if(m->method == INIT_METHOD ||
> +                   m->method == CLASS_INIT_METHOD) {
> +  g_assert (m->funcattrs == NULL || strlen(m->funcattrs) == 0);
> +        }
>   print_method(out, "static ", "", "", " ", "",
>       no_gnu?";\n":" G_GNUC_UNUSED;\n",
> -     m, FALSE, FALSE, TRUE, FALSE, FALSE);
> +     m, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE);
>   }
>  }
>  
> @@ -2276,7 +2309,8 @@
>   if(m->line_no > 0)
>   out_addline_infile(out, m->line_no);
>   print_method(out, "static ", "\n", "", " ", "", "\n",
> -     m, FALSE, FALSE, TRUE, TRUE, FALSE);
> +     m, FALSE, FALSE, FALSE, TRUE, TRUE,
> +     FALSE);
>   if(m->line_no > 0)
>   out_addline_outfile(out);
>   out_printf(out, "{\n"
> @@ -2325,7 +2359,8 @@
>   if(m->line_no > 0)
>   out_addline_infile(out, m->line_no);
>   print_method(out, "static ", "\n", "", " ", "", "\n",
> -     m, FALSE, FALSE, TRUE, TRUE, FALSE);
> +     m, FALSE, FALSE, FALSE, TRUE, TRUE,
> +     FALSE);
>   if(m->line_no > 0)
>   out_addline_outfile(out);
>   out_printf(out, "{\n"
> @@ -2833,10 +2868,10 @@
>   out_addline_infile(out, m->line_no);
>   if(m->scope == PRIVATE_SCOPE)
>   print_method(out, "static ", "\n", "", " ", "", "\n",
> -     m, FALSE, FALSE, TRUE, FALSE, FALSE);
> +     m, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE);
>   else /* PUBLIC, PROTECTED */
>   print_method(out, "", "\n", "", " ", "", "\n",
> -     m, FALSE, FALSE, TRUE, FALSE, FALSE);
> +     m, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE);
>   print_method_body(m, TRUE, TRUE);
>   /* the outfile line was added above */
>   break;
> @@ -2846,10 +2881,10 @@
>   out_addline_infile(out, m->line_no);
>   if(m->scope == PRIVATE_SCOPE)
>   print_method(out, "static ", "\n", "", " ", "", "\n",
> -     m, FALSE, FALSE, TRUE, FALSE, FALSE);
> +     m, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE);
>   else /* PUBLIC, PROTECTED */
>   print_method(out, "", "\n", "", " ", "", "\n",
> -     m, FALSE, FALSE, TRUE, FALSE, FALSE);
> +     m, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE);
>   out_addline_outfile (out);
>  
>   out_printf (out, "{\n");
> @@ -2968,7 +3003,7 @@
>   if(m->line_no > 0)
>   out_addline_infile(out, m->line_no);
>   print_method(out, "static ", "\n___real_", "", " ", "", "\n",
> -     m, FALSE, FALSE, TRUE, TRUE, FALSE);
> +     m, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE);
>   print_method_body(m, FALSE, TRUE);
>   /* the outfile line was added above */
>   break;
> @@ -2977,10 +3012,10 @@
>   out_addline_infile(out, m->line_no);
>   if(m->scope==PRIVATE_SCOPE)
>   print_method(out, "static ", "\n", "", " ", "", "\n",
> -     m, FALSE, FALSE, TRUE, FALSE, FALSE);
> +     m, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE);
>   else /* PUBLIC, PROTECTED */
>   print_method(out, "", "\n", "", " ", "", "\n",
> -     m, FALSE, FALSE, TRUE, FALSE, FALSE);
> +     m, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE);
>   out_addline_outfile(out);
>   out_printf(out, "{\n"
>   "\t%sClass *klass;\n", typebase);
> @@ -3026,7 +3061,7 @@
>   if(m->line_no > 0)
>   out_addline_infile(out, m->line_no);
>   print_method(out, "static ", "\n___real_", "", " ", "", "\n",
> -     m, FALSE, FALSE, TRUE, TRUE, FALSE);
> +     m, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE);
>   print_method_body(m, FALSE, TRUE);
>   /* the outfile line was added above */
>   break;
> @@ -3037,7 +3072,7 @@
>   out_addline_infile(out, m->line_no);
>   s = g_strdup_printf("\n___%x_", (guint)m->unique_id);
>   print_method(out, "static ", s, "", " ", "", "\n",
> -     m, FALSE, FALSE, FALSE, TRUE, FALSE);
> +     m, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
>   g_free(s);
>   out_addline_outfile(out);
>   s = replace_sep(m->otype, '_');
> @@ -4467,6 +4502,7 @@
>   check_property_types ((Class *)class);
>   check_argument_types ((Class *)class);
>   check_func_arg_checks ((Class *)class);
> + check_func_attrs ((Class *)class);
>   check_for_class_destructors ((Class *)class);
>  
>   exit_on_error = TRUE;
> diff -u -Naur pristine/gob2-2.0.14/src/Makefile.str modified/gob2-2.0.14/src/Makefile.str
> --- pristine/gob2-2.0.14/src/Makefile.str 1969-12-31 19:00:00.000000000 -0500
> +++ modified/gob2-2.0.14/src/Makefile.str 2007-02-25 18:17:38.000000000 -0500
> @@ -0,0 +1,15 @@
> +CFLAGS := -Wall $(shell pkg-config --cflags gobject-2.0 glib-2.0)
> +LDFLAGS := $(shell pkg-config --libs-only-other --libs-only-L \
> +                              gobject-2.0 glib-2.0)
> +LDLIBS := $(shell pkg-config --libs-only-l gobject-2.0 glib-2.0)
> +
> +default: str.o str_test.o Makefile.str
> + gcc $(LDFLAGS) str.o str_test.o $(LDLIBS) -o str_test
> +
> +%.c %.h: %.gob
> + ./gob2 $<
> +
> +str.o str_test.o: Makefile.str
> +
> +clean:
> + rm -rf str.o str_test.o str.c str.h str-private.h str_test
> diff -u -Naur pristine/gob2-2.0.14/src/MODIFATION_NOTES.txt modified/gob2-2.0.14/src/MODIFATION_NOTES.txt
> --- pristine/gob2-2.0.14/src/MODIFATION_NOTES.txt 1969-12-31 19:00:00.000000000 -0500
> +++ modified/gob2-2.0.14/src/MODIFATION_NOTES.txt 2007-02-25 18:09:00.000000000 -0500
> @@ -0,0 +1,33 @@
> +The attributes are perhaps applied overzealously to all the wrapper
> +functions and such that get generated.  For example, for a single call
> +to a single G_GNU_DEPRECATED public virtual method we get this:
> +
> +cc -Wall -I/home/bkerin/local/include/glib-2.0 -I/home/bkerin/local/lib/glib-2.0/include     -c -o str.o str.c
> +str.gob: In function ??????str_class_init??????:
> +str.gob:45: warning: ??????frobnicate?????? is deprecated (declared at str.h:48)
> +str.gob:45: warning: ??????___real_str_frobnicate?????? is deprecated (declared at str.c:50)
> +str.c: In function ??????str_frobnicate??????:
> +str.c:205: warning: ??????frobnicate?????? is deprecated (declared at str.h:48)
> +str.c:206: warning: ??????frobnicate?????? is deprecated (declared at str.h:48)
> +gcc -L/home/bkerin/local/lib   str.o str_test.o -lgobject-2.0 -lglib-2.0   -o str_test
> +
> +But I'm not sure which methods never get called directly or by macros
> +so I left the attributes on all of them.
> +
> +For that matter, are we sure it can make sense ever to try to use
> +something like G_GNUC_MALLOC or G_GNUC_NORETURN in the face of all the
> +wrappers?  Maybe these should just not be supported, like G_GNUC_CONST
> +and G_GNUC_PURE which really don't make sense for object methods.
> +
> +Ok G_GNUC_DEPRECATED is also not a good idea since the .c file calls
> +the function itself in various places, rather than the ___real
> +version.  It seems like calling ___real variants everywhere might work
> +for this case but not emitting attributes for these variants might not
> +work for other function attributes, and the emission order in the .c
> +files would have to change.  Actually it looks best to just not
> +support anything but the printf style attributes (those are what we
> +really want anyway).
> +
> +Annnd... this probably means we could have gotten by without stuffing
> +more state into the lexer, since all the remaining attribute take
> +paren-enclosed arguments lists.  Oh well.
> diff -u -Naur pristine/gob2-2.0.14/src/parse.c modified/gob2-2.0.14/src/parse.c
> --- pristine/gob2-2.0.14/src/parse.c 2005-12-16 15:23:03.000000000 -0500
> +++ modified/gob2-2.0.14/src/parse.c 1969-12-31 19:00:00.000000000 -0500
> @@ -1,4481 +0,0 @@
> -/* A Bison parser, made by GNU Bison 2.0.  */
> -
> -/* Skeleton parser for Yacc-like parsing with Bison,
> -   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
> -
> -   This program is free software; you can redistribute it and/or modify
> -   it under the terms of the GNU General Public License as published by
> -   the Free Software Foundation; either version 2, or (at your option)
> -   any later version.
> -
> -   This program is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> -   GNU General Public License for more details.
> -
> -   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.  */
> -
> -/* Written by Richard Stallman by simplifying the original so called
> -   ``semantic'' parser.  */
> -
> -/* All symbols defined below should begin with yy or YY, to avoid
> -   infringing on user name space.  This should be done even for local
> -   variables, as they might otherwise be expanded by user macros.
> -   There are some unavoidable exceptions within include files to
> -   define necessary library symbols; they are noted "INFRINGES ON
> -   USER NAME SPACE" below.  */
> -
> -/* Identify Bison output.  */
> -#define YYBISON 1
> -
> -/* Skeleton name.  */
> -#define YYSKELETON_NAME "yacc.c"
> -
> -/* Pure parsers.  */
> -#define YYPURE 0
> -
> -/* Using locations.  */
> -#define YYLSP_NEEDED 0
> -
> -
> -
> -/* Tokens.  */
> -#ifndef YYTOKENTYPE
> -# define YYTOKENTYPE
> -   /* Put the tokens into the symbol table, so that GDB and other debuggers
> -      know about them.  */
> -   enum yytokentype {
> -     CLASS = 258,
> -     FROM = 259,
> -     CONST = 260,
> -     VOID = 261,
> -     STRUCT = 262,
> -     UNION = 263,
> -     ENUM = 264,
> -     THREEDOTS = 265,
> -     SIGNED = 266,
> -     UNSIGNED = 267,
> -     LONG = 268,
> -     SHORT = 269,
> -     INT = 270,
> -     FLOAT = 271,
> -     DOUBLE = 272,
> -     CHAR = 273,
> -     TOKEN = 274,
> -     NUMBER = 275,
> -     TYPETOKEN = 276,
> -     ARRAY_DIM = 277,
> -     SINGLE_CHAR = 278,
> -     CCODE = 279,
> -     HTCODE = 280,
> -     PHCODE = 281,
> -     HCODE = 282,
> -     ACODE = 283,
> -     ATCODE = 284,
> -     STRING = 285,
> -     PUBLIC = 286,
> -     PRIVATE = 287,
> -     PROTECTED = 288,
> -     CLASSWIDE = 289,
> -     PROPERTY = 290,
> -     ARGUMENT = 291,
> -     VIRTUAL = 292,
> -     SIGNAL = 293,
> -     OVERRIDE = 294,
> -     NICK = 295,
> -     BLURB = 296,
> -     MAXIMUM = 297,
> -     MINIMUM = 298,
> -     DEFAULT_VALUE = 299,
> -     ERROR = 300,
> -     FLAGS = 301,
> -     TYPE = 302,
> -     FLAGS_TYPE = 303,
> -     ENUM_TYPE = 304,
> -     PARAM_TYPE = 305,
> -     BOXED_TYPE = 306,
> -     OBJECT_TYPE = 307
> -   };
> -#endif
> -#define CLASS 258
> -#define FROM 259
> -#define CONST 260
> -#define VOID 261
> -#define STRUCT 262
> -#define UNION 263
> -#define ENUM 264
> -#define THREEDOTS 265
> -#define SIGNED 266
> -#define UNSIGNED 267
> -#define LONG 268
> -#define SHORT 269
> -#define INT 270
> -#define FLOAT 271
> -#define DOUBLE 272
> -#define CHAR 273
> -#define TOKEN 274
> -#define NUMBER 275
> -#define TYPETOKEN 276
> -#define ARRAY_DIM 277
> -#define SINGLE_CHAR 278
> -#define CCODE 279
> -#define HTCODE 280
> -#define PHCODE 281
> -#define HCODE 282
> -#define ACODE 283
> -#define ATCODE 284
> -#define STRING 285
> -#define PUBLIC 286
> -#define PRIVATE 287
> -#define PROTECTED 288
> -#define CLASSWIDE 289
> -#define PROPERTY 290
> -#define ARGUMENT 291
> -#define VIRTUAL 292
> -#define SIGNAL 293
> -#define OVERRIDE 294
> -#define NICK 295
> -#define BLURB 296
> -#define MAXIMUM 297
> -#define MINIMUM 298
> -#define DEFAULT_VALUE 299
> -#define ERROR 300
> -#define FLAGS 301
> -#define TYPE 302
> -#define FLAGS_TYPE 303
> -#define ENUM_TYPE 304
> -#define PARAM_TYPE 305
> -#define BOXED_TYPE 306
> -#define OBJECT_TYPE 307
> -
> -
> -
> -
> -/* Copy the first part of user declarations.  */
> -#line 23 "parse.y"
> -
> -
> -#include "config.h"
> -#include <glib.h>
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -
> -#include "treefuncs.h"
> -#include "main.h"
> -#include "util.h"
> -
> -/* FIXME: add gettext support */
> -#define _(x) (x)
> -
> -GList *nodes = NULL;
> -
> -static GList *class_nodes = NULL;
> -Node *class = NULL;
> -GList *enums = NULL;
> -static GList *enum_vals = NULL;
> -static GList *flag_vals = NULL;
> -static GList *error_vals = NULL;
> -
> -static gboolean abstract = FALSE;
> -static char *chunk_size = NULL;
> -static char *bonobo_object_class = NULL;
> -static int glade_xml = FALSE;
> -static GList *interfaces = NULL;
> -static GList *typestack = NULL;
> -static GList *funcargs = NULL;
> -static GList *checks = NULL;
> -static int has_self = FALSE;
> -static int vararg = FALSE;
> -static Method *last_added_method = NULL;
> -
> -/* destructor and initializer for variables */
> -static gboolean destructor_unref = FALSE;
> -static char *destructor = NULL;
> -static int destructor_line = 0;
> -static gboolean destructor_simple = TRUE;
> -static char *initializer = NULL;
> -static int initializer_line = 0;
> -static int glade_widget = FALSE;
> -
> -static char *onerror = NULL;
> -static char *defreturn = NULL;
> -
> -static GList *gtktypes = NULL;
> -
> -static Property *property = NULL;
> -
> -/* this can be a global as we will only do one function at a time
> -   anyway */
> -static int the_scope = NO_SCOPE;
> -
> -void free(void *ptr);
> -int yylex(void);
> -
> -extern int ccode_line;
> -extern int line_no;
> -extern gboolean for_cpp;
> -
> -extern char *yytext;
> -
> -static void
> -yyerror(char *str)
> -{
> - char *out=NULL;
> - char *p;
> -
> - if(strcmp(yytext,"\n")==0) {
> - out=g_strconcat("Error: ",str," before newline",NULL);
> - } else if(yytext[0]=='\0') {
> - out=g_strconcat("Error: ", str, " at end of input", NULL);
> - } else {
> - char *tmp = g_strdup(yytext);
> - while((p=strchr(tmp, '\n')))
> - *p='.';
> -
> - out=g_strconcat("Error: ", str, " before '", tmp, "'", NULL);
> - g_free(tmp);
> - }
> -
> - fprintf(stderr, "%s:%d: %s\n", filename, line_no, out);
> - g_free(out);
> -
> - exit(1);
> -}
> -
> -static Type *
> -pop_type(void)
> -{
> - Type *type = typestack->data;
> - typestack = g_list_remove(typestack,typestack->data);
> - return type;
> -}
> -
> -static void
> -push_variable (char *name, int scope, int line_no, char *postfix)
> -{
> - Node *var;
> - Type *type = pop_type ();
> -
> - type->postfix = postfix;
> -
> - var = node_new (VARIABLE_NODE,
> - "scope", scope,
> - "vtype:steal", type,
> - "glade_widget", glade_widget,
> - "id:steal", name,
> - "line_no", line_no,
> - "destructor_unref", destructor_unref,
> - "destructor:steal", destructor,
> - "destructor_line", destructor_line,
> - "destructor_simple", destructor_simple,
> - "initializer:steal", initializer,
> - "initializer_line", initializer_line,
> - "initializer_simple", TRUE,
> - NULL);
> - class_nodes = g_list_append(class_nodes, var);
> - glade_widget = FALSE;
> -}
> -
> -static void
> -push_function (int scope, int method, char *oid, char *id,
> -       GString *cbuf, int line_no, int ccode_line,
> -       gboolean vararg, GList *flags)
> -{
> - Node *node;
> - Type *type;
> - char *c_cbuf;
> -
> - g_assert(scope != CLASS_SCOPE);
> -      
> - if(method == INIT_METHOD || method == CLASS_INIT_METHOD) {
> - type = (Type *)node_new (TYPE_NODE,
> - "name", "void",
> - NULL);
> - } else {
> - type = pop_type();
> - }
> -
> - /* a complicated and ugly test to figure out if we have
> -   the wrong number of types for a signal */
> - if((method == SIGNAL_FIRST_METHOD ||
> -    method == SIGNAL_LAST_METHOD) &&
> -   g_list_length(gtktypes) != g_list_length(funcargs) &&
> -   !(g_list_length(funcargs) == 1 &&
> -     g_list_length(gtktypes) == 2 &&
> -     strcmp(gtktypes->next->data, "NONE")==0)) {
> - error_print(GOB_WARN, line_no,
> -    _("The number of GTK arguments and "
> -      "function arguments for a signal "
> -      "don't seem to match"));
> - }
> - if(g_list_length(gtktypes) > 2) {
> - GList *li;
> - for(li = gtktypes->next; li; li = li->next) {
> - if(strcmp(li->data, "NONE")==0) {
> - error_print(GOB_ERROR, line_no,
> -    _("NONE can only appear in an "
> -      "argument list by itself"));
> - }
> - }
> - }
> - if(cbuf) {
> - char *p;
> - c_cbuf = p = cbuf->str;
> - while(p && *p && (*p==' ' || *p=='\t' || *p=='\n' || *p=='\r'))
> - p++;
> - if(!p || !*p)
> - c_cbuf = NULL;
> - } else
> - c_cbuf = NULL;
> -
> - node = node_new (METHOD_NODE,
> - "scope", scope,
> - "method", method,
> - "mtype:steal", type,
> - "otype:steal", oid,
> - "gtktypes:steal", gtktypes,
> - "flags:steal", flags,
> - "id:steal", id,
> - "args:steal", funcargs,
> - "onerror:steal", onerror,
> - "defreturn:steal", defreturn,
> - "cbuf:steal", c_cbuf,
> - "line_no", line_no,
> - "ccode_line", ccode_line,
> - "vararg", vararg,
> - "unique_id", method_unique_id++,
> - NULL);
> -
> - last_added_method = (Method *)node;
> -
> - if(cbuf)
> - g_string_free(cbuf,
> -      /*only free segment if we haven't passed it
> - above */
> -      c_cbuf?FALSE:TRUE);
> - gtktypes = NULL;
> - funcargs = NULL;
> -
> - onerror = NULL;
> - defreturn = NULL;
> -
> - class_nodes = g_list_append(class_nodes, node);
> -}
> -
> -static void
> -free_all_global_state(void)
> -{
> - g_free(onerror);
> - onerror = NULL;
> - g_free(defreturn);
> - defreturn = NULL;
> -
> - g_free(chunk_size);
> - chunk_size = NULL;
> -
> - g_list_foreach(gtktypes, (GFunc)g_free, NULL);
> - g_list_free(gtktypes);
> - gtktypes = NULL;
> -
> - node_list_free (funcargs);
> - funcargs = NULL;
> -}
> -
> -static void
> -push_funcarg(char *name, char *postfix)
> -{
> - Node *node;
> - Type *type = pop_type();
> -
> - type->postfix = postfix;
> -
> - node = node_new (FUNCARG_NODE,
> - "atype:steal", type,
> - "name:steal", name,
> - "checks:steal", checks,
> - NULL);
> - checks = NULL;
> -
> - funcargs = g_list_append(funcargs, node);
> -}
> -
> -static void
> -push_init_arg(char *name, int is_class)
> -{
> - Node *node;
> - Node *type;
> - char *tn;
> -
> - if(is_class)
> - tn = g_strconcat(((Class *)class)->otype,":Class",NULL);
> - else
> - tn = g_strdup(((Class *)class)->otype);
> -
> - type = node_new (TYPE_NODE,
> - "name:steal", tn,
> - "pointer", "*",
> - NULL);
> - node = node_new (FUNCARG_NODE,
> - "atype:steal", (Type *)type,
> - "name:steal", name,
> - NULL);
> - funcargs = g_list_prepend(funcargs, node);
> -}
> -
> -static void
> -push_self(char *id, gboolean constant)
> -{
> - Node *node;
> - Node *type;
> - GList *ch = NULL;
> - type = node_new (TYPE_NODE,
> - "name", ((Class *)class)->otype,
> - "pointer", constant ? "const *" : "*",
> - NULL);
> - ch = g_list_append (ch, node_new (CHECK_NODE,
> -  "chtype", NULL_CHECK,
> -  NULL));
> - ch = g_list_append (ch, node_new (CHECK_NODE,
> -  "chtype", TYPE_CHECK,
> -  NULL));
> - node = node_new (FUNCARG_NODE,
> - "atype:steal", (Type *)type,
> - "name:steal", id,
> - "checks:steal", ch,
> - NULL);
> - funcargs = g_list_prepend(funcargs, node);
> -}
> -
> -static Variable *
> -find_var_or_die(const char *id, int line)
> -{
> - GList *li;
> -
> - for(li = class_nodes; li != NULL; li = li->next) {
> - Variable *var;
> - Node *node = li->data;
> - if(node->type != VARIABLE_NODE)
> - continue;
> - var = li->data;
> - if(strcmp(var->id, id)==0)
> - return var;
> - }
> -
> - error_printf(GOB_ERROR, line, _("Variable %s not defined here"), id);
> -
> - g_assert_not_reached();
> - return NULL;
> -}
> -
> -static gboolean
> -set_return_value(char *type, char *val)
> -{
> - if(strcmp(type, "onerror")==0) {
> - if(!onerror) {
> - onerror = val;
> - return TRUE;
> - } else
> - return FALSE;
> - } else if(strcmp(type, "defreturn")==0) {
> - if(!defreturn) {
> - defreturn = val;
> - return TRUE;
> - } else
> - return FALSE;
> - }
> - return FALSE;
> -}
> -
> -static void
> -export_accessors (const char *var_name,
> -  gboolean do_get,
> -  int get_lineno,
> -  gboolean do_set,
> -  int set_lineno,
> -  Type *type,
> -  const char *gtktype,
> -  int lineno)
> -{
> - Type *the_type;
> -
> - if (type != NULL)
> - the_type = (Type *)node_copy ((Node *)type);
> - else
> - the_type = get_tree_type (gtktype, TRUE);
> -
> - if (the_type == NULL) {
> - error_print (GOB_ERROR, line_no,
> -     _("Cannot determine type of property or argument"));
> - return;
> - }
> -
> - if (do_get) {
> - char *get_id = g_strdup_printf ("get_%s", var_name);
> - GString *get_cbuf = g_string_new (NULL);
> - Node *node1 = node_new (TYPE_NODE,
> - "name", the_type->name,
> - "pointer", the_type->pointer,
> - "postfix", the_type->postfix,
> - NULL);
> - Node *node3 = node_new (TYPE_NODE,
> - "name", class->class.otype,
> - "pointer", "*",
> - NULL);
> -
> - g_string_sprintf (get_cbuf,
> -  "\t%s%s val; "
> -  "g_object_get (G_OBJECT (self), \"%s\", "
> -  "&val, NULL); "
> -  "return val;\n",
> -  the_type->name,
> -  the_type->pointer ? the_type->pointer : "",
> -  var_name);
> -
> - typestack = g_list_prepend (typestack, node1);
> - typestack = g_list_prepend (typestack, node3);
> -
> - push_funcarg ("self", FALSE);
> -
> - push_function (PUBLIC_SCOPE, REGULAR_METHOD, NULL,
> -       get_id, get_cbuf, get_lineno,
> -       lineno, FALSE, NULL);
> - }
> -
> - if (do_set) {
> - char *set_id = g_strdup_printf ("set_%s", var_name);
> - GString *set_cbuf = g_string_new (NULL);
> - Node *node1 = node_new (TYPE_NODE,
> - "name", the_type->name,
> - "pointer", the_type->pointer,
> - "postfix", the_type->postfix,
> - NULL);
> - Node *node2 = node_new (TYPE_NODE,
> - "name", "void",
> - NULL);
> - Node *node3 = node_new (TYPE_NODE,
> - "name", class->class.otype,
> - "pointer", "*",
> - NULL);
> -
> - g_string_sprintf (set_cbuf,
> -  "\tg_object_set (G_OBJECT (self), "
> -  "\"%s\", val, NULL);\n",
> -  var_name);
> -
> - typestack = g_list_prepend (typestack, node2);
> - typestack = g_list_prepend (typestack, node1);
> - typestack = g_list_prepend (typestack, node3);
> -
> - push_funcarg ("self", FALSE);
> - push_funcarg ("val", FALSE);
> -
> - typestack = g_list_prepend (typestack, node2);
> - push_function (PUBLIC_SCOPE, REGULAR_METHOD, NULL,
> -       set_id, set_cbuf, set_lineno,
> -       lineno, FALSE, NULL);
> - }
> -
> - node_free ((Node *)the_type);
> -}
> -
> -static char *
> -get_prop_enum_flag_cast (Property *prop)
> -{
> - char *tmp, *ret;
> - if (prop->extra_gtktype == NULL ||
> - /* HACK!  just in case someone made this
> - * work with 2.0.0 by using the TYPE
> - * macro directly */
> -    ((strstr (prop->extra_gtktype, "_TYPE_") != NULL ||
> -      strstr (prop->extra_gtktype, "TYPE_") == prop->extra_gtktype) &&
> -     strchr (prop->extra_gtktype, ':') == NULL)) {
> - if (prop->ptype != NULL)
> - return get_type (prop->ptype, TRUE);
> - else
> - return g_strdup ("");
> - }
> - tmp = remove_sep (prop->extra_gtktype);
> - ret = g_strdup_printf ("(%s) ", tmp);
> - g_free (tmp);
> - return ret;
> -}
> -
> -static void
> -add_construct_glade (char * file, char * root, char * domain)
> -{
> - Node *var;
> - Type * type;
> - GList * flags = NULL;
> -
> - type = (Type *)node_new (TYPE_NODE,
> - "name", "GladeXML",
> - "pointer", "*",
> - NULL);
> - initializer = g_strdup_printf("\t{\n"
> -      "\tGtkWidget * root;\n"
> -      "\t%%1$s->_priv->_glade_xml = glade_xml_new(%s, %s, %s);\n"
> -      "\troot = glade_xml_get_widget(%%1$s->_priv->_glade_xml, %s);\n"
> -      "\tgtk_widget_show(root);\n"
> -      "\tgtk_container_add(GTK_CONTAINER(%%1$s), root);\n"
> -      "\tglade_xml_signal_autoconnect_full(%%1$s->_priv->_glade_xml, (GladeXMLConnectFunc)___glade_xml_connect_foreach, (gpointer)%%1$s);\n"
> -      "}\n", file, root, domain ? domain : "NULL", root);
> -
> - var = node_new (VARIABLE_NODE,
> - "scope", PRIVATE_SCOPE,
> - "vtype:steal", type,
> - "glade_widget", FALSE,
> - "id:steal", "_glade_xml",
> - "destructor_unref", FALSE,
> - "destructor", "g_object_unref",
> - "destructor_simple", TRUE,
> - "initializer", initializer,
> - "initializer_simple", FALSE,
> - NULL);
> - class_nodes = g_list_prepend(class_nodes, var);
> -}
> -
> -static void
> -property_link_and_export (Node *node)
> -{
> - Property *prop = (Property *)node;
> -
> - if (prop->link) {
> - const char *root;
> - char *get = NULL, *set = NULL;
> - Variable *var;
> -
> - if (prop->set != NULL ||
> -    prop->get != NULL) {
> - error_print (GOB_ERROR, prop->line_no,
> -     _("Property linking requested, but "
> -       "getters and setters exist"));
> - }
> -
> - var = find_var_or_die (prop->name, prop->line_no);
> - if(var->scope == PRIVATE_SCOPE) {
> - root = "self->_priv";
> - } else if (var->scope == CLASS_SCOPE) {
> - root = "SELF_GET_CLASS(self)";
> - if (no_self_alias)
> - error_print (GOB_ERROR, prop->line_no,
> -     _("Self aliases needed when autolinking to a classwide member"));
> - } else {
> - root = "self";
> - }
> -
> - if (strcmp (prop->gtktype, "STRING") == 0) {
> - set = g_strdup_printf("{ char *old = %s->%s; "
> -      "%s->%s = g_value_dup_string (VAL); g_free (old); }",
> -      root, prop->name,
> -      root, prop->name);
> - get = g_strdup_printf("g_value_set_string (VAL, %s->%s);",
> -      root, prop->name);
> - } else if (strcmp (prop->gtktype, "OBJECT") == 0) {
> - char *cast;
> - if (prop->extra_gtktype != NULL) {
> - cast = remove_sep (prop->extra_gtktype);
> - } else {
> - cast = g_strdup ("void");
> - }
> - set = g_strdup_printf("{ GObject *___old = (GObject *)%s->%s; "
> -      "%s->%s = (%s *)g_value_dup_object (VAL); "
> -      "if (___old != NULL) { "
> -        "g_object_unref (G_OBJECT (___old)); "
> -      "} "
> -      "}",
> -      root, prop->name,
> -      root, prop->name,
> -      cast);
> - get = g_strdup_printf ("g_value_set_object (VAL, "
> -       "(gpointer)%s->%s);",
> -       root, prop->name);
> - g_free (cast);
> - } else if (strcmp (prop->gtktype, "BOXED") == 0) {
> - char *type = make_me_type (prop->extra_gtktype,
> -   "G_TYPE_BOXED");
> - if (prop->extra_gtktype == NULL) {
> - error_print (GOB_ERROR, prop->line_no,
> -     _("Property linking requested for BOXED, but "
> -       "boxed_type not set"));
> - }
> - set = g_strdup_printf("{ gpointer ___old = (gpointer)%s->%s; "
> -      "gpointer ___new = (gpointer)g_value_get_boxed (VAL); "
> -      "if (___new != ___old) { "
> -        "if (___old != NULL) g_boxed_free (%s, ___old); "
> -        "if (___new != NULL) %s->%s = g_boxed_copy (%s, ___new); "
> -        "else %s->%s = NULL;"
> -      "} "
> -      "}",
> -      root, prop->name,
> -      type,
> -      root, prop->name,
> -      type,
> -      root, prop->name);
> - get = g_strdup_printf("g_value_set_boxed (VAL, %s->%s);",
> -      root, prop->name);
> - g_free (type);
> - } else {
> - char *set_func;
> - char *get_func;
> - const char *getcast = "";
> - const char *setcast = "";
> - char *to_free = NULL;
> - set_func = g_strdup_printf ("g_value_set_%s", prop->gtktype);
> - g_strdown (set_func);
> - get_func = g_strdup_printf ("g_value_get_%s", prop->gtktype);
> - g_strdown (get_func);
> -
> - if (for_cpp) {
> - if (strcmp (prop->gtktype, "FLAGS") == 0) {
> - setcast = "(guint) ";
> - getcast = to_free =
> - get_prop_enum_flag_cast (prop);
> - } else if (strcmp (prop->gtktype, "ENUM") == 0) {
> - setcast = "(gint) ";
> - getcast = to_free =
> - get_prop_enum_flag_cast (prop);
> -                               }  else if (strcmp (prop->gtktype, "POINTER") == 0) {
> -                                       setcast = "(gpointer) ";
> -                                       getcast = g_strdup_printf ("(%s%s) ",
> -  prop->ptype->name,
> -  prop->ptype->pointer ? prop->ptype->pointer : "");
> - }
> - }
> -
> - set = g_strdup_printf("%s->%s = %s%s (VAL);",
> -      root, prop->name,
> -      getcast,
> -      get_func);
> - get = g_strdup_printf("%s (VAL, %s%s->%s);",
> -      set_func,
> -      setcast,
> -      root, prop->name);
> -
> - g_free (get_func);
> - g_free (set_func);
> - g_free (to_free);
> - }
> -
> - node_set (node,
> -  "get:steal", get,
> -  "get_line", prop->line_no,
> -  "set:steal", set,
> -  "set_line", prop->line_no,
> -  NULL);
> - }
> -
> - if (prop->export) {
> - export_accessors (prop->name,
> -  prop->get != NULL, prop->get_line,
> -  prop->set != NULL,  prop->set_line,
> -  prop->ptype,
> -  prop->gtktype,
> -  prop->line_no);
> - }
> -}
> -
> -
> -static char *
> -debool (char *s)
> -{
> - if (strcmp (s, "BOOL") == 0) {
> - error_print (GOB_WARN, line_no,
> -    _("BOOL type is deprecated, please use BOOLEAN"));
> - g_free (s);
> - return g_strdup ("BOOLEAN");
> - } else {
> - return s;
> - }
> -}
> -
> -static void
> -ensure_property (void)
> -{
> - if (property == NULL)
> - property = (Property *)node_new (PROPERTY_NODE, NULL);
> -}
> -
> -
> -
> -/* Enabling traces.  */
> -#ifndef YYDEBUG
> -# define YYDEBUG 1
> -#endif
> -
> -/* Enabling verbose error messages.  */
> -#ifdef YYERROR_VERBOSE
> -# undef YYERROR_VERBOSE
> -# define YYERROR_VERBOSE 1
> -#else
> -# define YYERROR_VERBOSE 0
> -#endif
> -
> -#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
> -#line 668 "parse.y"
> -typedef union YYSTYPE {
> - char *id;
> - GString *cbuf;
> - GList *list;
> - int line;
> - int sigtype;
> -} YYSTYPE;
> -/* Line 190 of yacc.c.  */
> -#line 833 "y.tab.c"
> -# define yystype YYSTYPE /* obsolescent; will be withdrawn */
> -# define YYSTYPE_IS_DECLARED 1
> -# define YYSTYPE_IS_TRIVIAL 1
> -#endif
> -
> -
> -
> -/* Copy the second part of user declarations.  */
> -
> -
> -/* Line 213 of yacc.c.  */
> -#line 845 "y.tab.c"
> -
> -#if ! defined (yyoverflow) || YYERROR_VERBOSE
> -
> -# ifndef YYFREE
> -#  define YYFREE free
> -# endif
> -# ifndef YYMALLOC
> -#  define YYMALLOC malloc
> -# endif
> -
> -/* The parser invokes alloca or malloc; define the necessary symbols.  */
> -
> -# ifdef YYSTACK_USE_ALLOCA
> -#  if YYSTACK_USE_ALLOCA
> -#   ifdef __GNUC__
> -#    define YYSTACK_ALLOC __builtin_alloca
> -#   else
> -#    define YYSTACK_ALLOC alloca
> -#   endif
> -#  endif
> -# endif
> -
> -# ifdef YYSTACK_ALLOC
> -   /* Pacify GCC's `empty if-body' warning. */
> -#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
> -# else
> -#  if defined (__STDC__) || defined (__cplusplus)
> -#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
> -#   define YYSIZE_T size_t
> -#  endif
> -#  define YYSTACK_ALLOC YYMALLOC
> -#  define YYSTACK_FREE YYFREE
> -# endif
> -#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
> -
> -
> -#if (! defined (yyoverflow) \
> -     && (! defined (__cplusplus) \
> - || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
> -
> -/* A type that is properly aligned for any stack member.  */
> -union yyalloc
> -{
> -  short int yyss;
> -  YYSTYPE yyvs;
> -  };
> -
> -/* The size of the maximum gap between one aligned stack and the next.  */
> -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
> -
> -/* The size of an array large to enough to hold all stacks, each with
> -   N elements.  */
> -# define YYSTACK_BYTES(N) \
> -     ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \
> -      + YYSTACK_GAP_MAXIMUM)
> -
> -/* Copy COUNT objects from FROM to TO.  The source and destination do
> -   not overlap.  */
> -# ifndef YYCOPY
> -#  if defined (__GNUC__) && 1 < __GNUC__
> -#   define YYCOPY(To, From, Count) \
> -      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
> -#  else
> -#   define YYCOPY(To, From, Count) \
> -      do \
> - { \
> -  register YYSIZE_T yyi; \
> -  for (yyi = 0; yyi < (Count); yyi++) \
> -    (To)[yyi] = (From)[yyi]; \
> - } \
> -      while (0)
> -#  endif
> -# endif
> -
> -/* Relocate STACK from its old location to the new one.  The
> -   local variables YYSIZE and YYSTACKSIZE give the old and new number of
> -   elements in the stack, and YYPTR gives the new location of the
> -   stack.  Advance YYPTR to a properly aligned location for the next
> -   stack.  */
> -# define YYSTACK_RELOCATE(Stack) \
> -    do \
> -      { \
> - YYSIZE_T yynewbytes; \
> - YYCOPY (&yyptr->Stack, Stack, yysize); \
> - Stack = &yyptr->Stack; \
> - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
> - yyptr += yynewbytes / sizeof (*yyptr); \
> -      } \
> -    while (0)
> -
> -#endif
> -
> -#if defined (__STDC__) || defined (__cplusplus)
> -   typedef signed char yysigned_char;
> -#else
> -   typedef short int yysigned_char;
> -#endif
> -
> -/* YYFINAL -- State number of the termination state. */
> -#define YYFINAL  23
> -/* YYLAST -- Last index in YYTABLE.  */
> -#define YYLAST   629
> -
> -/* YYNTOKENS -- Number of terminals. */
> -#define YYNTOKENS  66
> -/* YYNNTS -- Number of nonterminals. */
> -#define YYNNTS  53
> -/* YYNRULES -- Number of rules. */
> -#define YYNRULES  195
> -/* YYNRULES -- Number of states. */
> -#define YYNSTATES  414
> -
> -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
> -#define YYUNDEFTOK  2
> -#define YYMAXUTOK   307
> -
> -#define YYTRANSLATE(YYX) \
> -  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
> -
> -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
> -static const unsigned char yytranslate[] =
> -{
> -       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,    64,     2,     2,     2,     2,     2,     2,
> -      55,    56,    61,     2,    59,    65,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,    57,
> -      63,    58,    62,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,    53,    60,    54,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
> -       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
> -       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
> -      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
> -      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
> -      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
> -      45,    46,    47,    48,    49,    50,    51,    52
> -};
> -
> -#if YYDEBUG
> -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
> -   YYRHS.  */
> -static const unsigned short int yyprhs[] =
> -{
> -       0,     0,     3,     7,    10,    13,    15,    17,    19,    21,
> -      23,    25,    27,    30,    33,    36,    39,    41,    43,    45,
> -      47,    52,    56,    62,    63,    68,    74,    80,    86,    93,
> -     101,   108,   116,   119,   121,   123,   126,   130,   132,   134,
> -     136,   138,   140,   142,   144,   146,   149,   153,   156,   160,
> -     163,   166,   168,   170,   172,   173,   179,   186,   199,   209,
> -     216,   220,   221,   233,   242,   248,   252,   253,   257,   259,
> -     261,   266,   268,   270,   274,   278,   282,   286,   290,   294,
> -     298,   302,   306,   310,   314,   318,   322,   326,   330,   334,
> -     338,   340,   346,   348,   352,   353,   357,   359,   362,   364,
> -     366,   368,   371,   374,   377,   381,   385,   388,   391,   394,
> -     396,   399,   401,   404,   406,   408,   410,   412,   414,   416,
> -     418,   420,   422,   424,   426,   428,   430,   433,   436,   440,
> -     443,   445,   449,   453,   456,   458,   463,   467,   469,   472,
> -     474,   485,   497,   507,   517,   526,   538,   547,   553,   556,
> -     561,   562,   564,   567,   569,   571,   574,   577,   581,   586,
> -     591,   593,   597,   599,   603,   605,   608,   612,   619,   627,
> -     630,   632,   634,   637,   640,   644,   648,   652,   656,   664,
> -     673,   677,   679,   683,   685,   693,   702,   706,   708,   716,
> -     725,   729,   731,   733,   736,   738
> -};
> -
> -/* YYRHS -- A `-1'-separated list of the rules' RHS. */
> -static const yysigned_char yyrhs[] =
> -{
> -      67,     0,    -1,    69,    70,    69,    -1,    70,    69,    -1,
> -      69,    70,    -1,    70,    -1,    24,    -1,    27,    -1,    25,
> -      -1,    26,    -1,    28,    -1,    29,    -1,    69,    68,    -1,
> -      69,   111,    -1,    69,   114,    -1,    69,   116,    -1,    68,
> -      -1,   111,    -1,   114,    -1,   116,    -1,    71,    53,    73,
> -      54,    -1,    71,    53,    54,    -1,     3,    21,     4,    21,
> -      72,    -1,    -1,    55,    19,    56,    72,    -1,    55,    19,
> -      19,    56,    72,    -1,    55,    19,    21,    56,    72,    -1,
> -      55,    19,    20,    56,    72,    -1,    55,    19,    30,    30,
> -      56,    72,    -1,    55,    19,    30,    30,    30,    56,    72,
> -      -1,    55,    19,    19,    30,    56,    72,    -1,    55,    19,
> -      19,    30,    30,    56,    72,    -1,    73,    74,    -1,    74,
> -      -1,   102,    -1,    19,   102,    -1,    19,    21,   102,    -1,
> -      79,    -1,    80,    -1,    82,    -1,    57,    -1,    31,    -1,
> -      32,    -1,    33,    -1,    34,    -1,    19,    19,    -1,    19,
> -      53,    24,    -1,    58,   118,    -1,    58,    53,    24,    -1,
> -      76,    77,    -1,    77,    76,    -1,    77,    -1,    76,    -1,
> -      19,    -1,    -1,    75,    91,    19,    78,    57,    -1,    75,
> -      91,    19,    22,    78,    57,    -1,    36,    89,    88,    19,
> -      81,    19,    53,    24,    19,    53,    24,    57,    -1,    36,
> -      89,    88,    19,    81,    19,    53,    24,    57,    -1,    36,
> -      89,    88,    19,    81,    19,    -1,    55,    19,    56,    -1,
> -      -1,    35,    19,    19,    83,    19,    53,    24,    19,    53,
> -      24,    57,    -1,    35,    19,    19,    83,    19,    53,    24,
> -      57,    -1,    35,    19,    19,    83,    57,    -1,    55,    84,
> -      56,    -1,    -1,    84,    59,    87,    -1,    87,    -1,    30,
> -      -1,    19,    55,    30,    56,    -1,   118,    -1,    85,    -1,
> -      40,    58,    85,    -1,    41,    58,    85,    -1,    42,    58,
> -     118,    -1,    43,    58,   118,    -1,    44,    58,    86,    -1,
> -      46,    58,    90,    -1,    47,    58,    91,    -1,    48,    58,
> -      21,    -1,    48,    58,    19,    -1,    49,    58,    21,    -1,
> -      49,    58,    19,    -1,    50,    58,    21,    -1,    50,    58,
> -      19,    -1,    51,    58,    21,    -1,    51,    58,    19,    -1,
> -      52,    58,    21,    -1,    52,    58,    19,    -1,    19,    -1,
> -      19,    55,    19,    91,    56,    -1,    19,    -1,    55,    90,
> -      56,    -1,    -1,    19,    60,    90,    -1,    19,    -1,    92,
> -      96,    -1,    92,    -1,    93,    -1,    19,    -1,     5,    19,
> -      -1,    19,     5,    -1,    95,    19,    -1,     5,    95,    19,
> -      -1,    95,    19,     5,    -1,    94,    93,    -1,    21,    93,
> -      -1,     5,    93,    -1,    21,    -1,    21,     5,    -1,    94,
> -      -1,    94,     5,    -1,     6,    -1,    18,    -1,    14,    -1,
> -      15,    -1,    13,    -1,    16,    -1,    17,    -1,    11,    -1,
> -      12,    -1,     7,    -1,     8,    -1,     9,    -1,    61,    -1,
> -      61,     5,    -1,    61,    96,    -1,    61,     5,    96,    -1,
> -      19,    99,    -1,    99,    -1,    75,    19,    99,    -1,    19,
> -      75,    99,    -1,    75,    99,    -1,    97,    -1,    19,    55,
> -     100,    56,    -1,   100,    59,    19,    -1,    19,    -1,    53,
> -      24,    -1,    57,    -1,    38,    89,    98,    91,    19,    55,
> -     105,    56,   103,   101,    -1,    75,    38,    89,    97,    91,
> -      19,    55,   105,    56,   103,   101,    -1,    37,    75,    91,
> -      19,    55,   105,    56,   103,   101,    -1,    75,    37,    91,
> -      19,    55,   105,    56,   103,   101,    -1,    37,    91,    19,
> -      55,   105,    56,   103,   101,    -1,    39,    55,    21,    56,
> -      91,    19,    55,   105,    56,   103,   101,    -1,    75,    91,
> -      19,    55,   105,    56,   103,   101,    -1,    19,    55,    19,
> -      56,   101,    -1,    19,   104,    -1,    19,   104,    19,   104,
> -      -1,    -1,   118,    -1,    53,    24,    -1,     6,    -1,    19,
> -      -1,    19,     5,    -1,     5,    19,    -1,    19,    59,   106,
> -      -1,    19,     5,    59,   106,    -1,     5,    19,    59,   106,
> -      -1,   106,    -1,   107,    59,    10,    -1,   107,    -1,   107,
> -      59,   108,    -1,   108,    -1,    91,    19,    -1,    91,    19,
> -      22,    -1,    91,    19,    55,    19,   109,    56,    -1,    91,
> -      19,    22,    55,    19,   109,    56,    -1,   109,   110,    -1,
> -     110,    -1,    19,    -1,    62,   118,    -1,    63,   118,    -1,
> -      62,    58,   118,    -1,    63,    58,   118,    -1,    58,    58,
> -     118,    -1,    64,    58,   118,    -1,     9,    19,    53,   112,
> -      54,    21,    57,    -1,     9,    19,    53,   112,    59,    54,
> -      21,    57,    -1,   112,    59,   113,    -1,   113,    -1,    19,
> -      58,   118,    -1,    19,    -1,    46,    19,    53,   115,    54,
> -      21,    57,    -1,    46,    19,    53,   115,    59,    54,    21,
> -      57,    -1,   115,    59,    19,    -1,    19,    -1,    45,    19,
> -      53,   117,    54,    21,    57,    -1,    45,    19,    53,   117,
> -      59,    54,    21,    57,    -1,   117,    59,    19,    -1,    19,
> -      -1,    20,    -1,    65,    20,    -1,    23,    -1,    19,    -1
> -};
> -
> -/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
> -static const unsigned short int yyrline[] =
> -{
> -       0,   689,   689,   690,   691,   692,   695,   704,   713,   722,
> -     731,   740,   751,   752,   753,   754,   755,   756,   757,   758,
> -     761,   766,   773,   790,   791,   799,   811,   820,   832,   841,
> -     850,   859,   870,   871,   874,   875,   884,   896,   897,   898,
> -     899,   902,   903,   904,   905,   908,   928,   952,   956,   964,
> -     965,   966,   967,   968,   976,   982,   985,   990,  1058,  1112,
> -    1201,  1209,  1214,  1262,  1298,  1314,  1315,  1318,  1319,  1322,
> -    1323,  1335,  1336,  1339,  1345,  1351,  1357,  1363,  1369,  1375,
> -    1382,  1388,  1394,  1400,  1406,  1412,  1418,  1424,  1430,  1436,
> -    1442,  1467,  1476,  1482,  1483,  1486,  1489,  1495,  1502,  1511,
> -    1514,  1517,  1521,  1525,  1529,  1534,  1542,  1546,  1551,  1555,
> -    1558,  1562,  1565,  1570,  1571,  1572,  1573,  1574,  1575,  1576,
> -    1577,  1578,  1581,  1582,  1583,  1586,  1587,  1588,  1592,  1599,
> -    1611,  1617,  1629,  1641,  1644,  1650,  1655,  1658,  1663,  1664,
> -    1668,  1684,  1700,  1716,  1732,  1743,  1749,  1759,  1782,  1793,
> -    1812,  1818,  1819,  1825,  1826,  1837,  1848,  1859,  1869,  1879,
> -    1889,  1892,  1893,  1896,  1897,  1900,  1903,  1906,  1914,  1924,
> -    1925,  1928,  1945,  1952,  1959,  1966,  1973,  1980,  1989,  1998,
> -    2009,  2010,  2013,  2033,  2043,  2052,  2063,  2066,  2071,  2080,
> -    2091,  2094,  2100,  2101,  2105,  2106
> -};
> -#endif
> -
> -#if YYDEBUG || YYERROR_VERBOSE
> -/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
> -   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
> -static const char *const yytname[] =
> -{
> -  "$end", "error", "$undefined", "CLASS", "FROM", "CONST", "VOID",
> -  "STRUCT", "UNION", "ENUM", "THREEDOTS", "SIGNED", "UNSIGNED", "LONG",
> -  "SHORT", "INT", "FLOAT", "DOUBLE", "CHAR", "TOKEN", "NUMBER",
> -  "TYPETOKEN", "ARRAY_DIM", "SINGLE_CHAR", "CCODE", "HTCODE", "PHCODE",
> -  "HCODE", "ACODE", "ATCODE", "STRING", "PUBLIC", "PRIVATE", "PROTECTED",
> -  "CLASSWIDE", "PROPERTY", "ARGUMENT", "VIRTUAL", "SIGNAL", "OVERRIDE",
> -  "NICK", "BLURB", "MAXIMUM", "MINIMUM", "DEFAULT_VALUE", "ERROR", "FLAGS",
> -  "TYPE", "FLAGS_TYPE", "ENUM_TYPE", "PARAM_TYPE", "BOXED_TYPE",
> -  "OBJECT_TYPE", "'{'", "'}'", "'('", "')'", "';'", "'='", "','", "'|'",
> -  "'*'", "'>'", "'<'", "'!'", "'-'", "$accept", "prog", "ccode", "ccodes",
> -  "class", "classdec", "classflags", "classcode", "thing", "scope",
> -  "destructor", "initializer", "varoptions", "variable", "argument",
> -  "export", "property", "param_spec", "param_spec_list", "string",
> -  "anyval", "param_spec_value", "argtype", "flags", "flaglist", "type",
> -  "specifier_list", "spec_list", "specifier", "strunionenum", "pointer",
> -  "simplesigtype", "fullsigtype", "sigtype", "tokenlist", "codenocode",
> -  "method", "returnvals", "retcode", "funcargs", "arglist", "arglist1",
> -  "arg", "checklist", "check", "enumcode", "enumvals", "enumval",
> -  "flagcode", "flagvals", "errorcode", "errorvals", "numtok", 0
> -};
> -#endif
> -
> -# ifdef YYPRINT
> -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
> -   token YYLEX-NUM.  */
> -static const unsigned short int yytoknum[] =
> -{
> -       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
> -     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
> -     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
> -     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
> -     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
> -     305,   306,   307,   123,   125,    40,    41,    59,    61,    44,
> -     124,    42,    62,    60,    33,    45
> -};
> -# endif
> -
> -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
> -static const unsigned char yyr1[] =
> -{
> -       0,    66,    67,    67,    67,    67,    68,    68,    68,    68,
> -      68,    68,    69,    69,    69,    69,    69,    69,    69,    69,
> -      70,    70,    71,    72,    72,    72,    72,    72,    72,    72,
> -      72,    72,    73,    73,    74,    74,    74,    74,    74,    74,
> -      74,    75,    75,    75,    75,    76,    76,    77,    77,    78,
> -      78,    78,    78,    78,    78,    79,    79,    80,    80,    80,
> -      81,    81,    82,    82,    82,    83,    83,    84,    84,    85,
> -      85,    86,    86,    87,    87,    87,    87,    87,    87,    87,
> -      87,    87,    87,    87,    87,    87,    87,    87,    87,    87,
> -      87,    88,    88,    89,    89,    90,    90,    91,    91,    92,
> -      92,    92,    92,    92,    92,    92,    93,    93,    93,    93,
> -      93,    93,    93,    94,    94,    94,    94,    94,    94,    94,
> -      94,    94,    95,    95,    95,    96,    96,    96,    96,    97,
> -      97,    98,    98,    98,    98,    99,   100,   100,   101,   101,
> -     102,   102,   102,   102,   102,   102,   102,   102,   103,   103,
> -     103,   104,   104,   105,   105,   105,   105,   105,   105,   105,
> -     105,   106,   106,   107,   107,   108,   108,   108,   108,   109,
> -     109,   110,   110,   110,   110,   110,   110,   110,   111,   111,
> -     112,   112,   113,   113,   114,   114,   115,   115,   116,   116,
> -     117,   117,   118,   118,   118,   118
> -};
> -
> -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
> -static const unsigned char yyr2[] =
> -{
> -       0,     2,     3,     2,     2,     1,     1,     1,     1,     1,
> -       1,     1,     2,     2,     2,     2,     1,     1,     1,     1,
> -       4,     3,     5,     0,     4,     5,     5,     5,     6,     7,
> -       6,     7,     2,     1,     1,     2,     3,     1,     1,     1,
> -       1,     1,     1,     1,     1,     2,     3,     2,     3,     2,
> -       2,     1,     1,     1,     0,     5,     6,    12,     9,     6,
> -       3,     0,    11,     8,     5,     3,     0,     3,     1,     1,
> -       4,     1,     1,     3,     3,     3,     3,     3,     3,     3,
> -       3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
> -       1,     5,     1,     3,     0,     3,     1,     2,     1,     1,
> -       1,     2,     2,     2,     3,     3,     2,     2,     2,     1,
> -       2,     1,     2,     1,     1,     1,     1,     1,     1,     1,
> -       1,     1,     1,     1,     1,     1,     2,     2,     3,     2,
> -       1,     3,     3,     2,     1,     4,     3,     1,     2,     1,
> -      10,    11,     9,     9,     8,    11,     8,     5,     2,     4,
> -       0,     1,     2,     1,     1,     2,     2,     3,     4,     4,
> -       1,     3,     1,     3,     1,     2,     3,     6,     7,     2,
> -       1,     1,     2,     2,     3,     3,     3,     3,     7,     8,
> -       3,     1,     3,     1,     7,     8,     3,     1,     7,     8,
> -       3,     1,     1,     2,     1,     1
> -};
> -
> -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
> -   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
> -   means the default is an error.  */
> -static const unsigned char yydefact[] =
> -{
> -       0,     0,     0,     6,     8,     9,     7,    10,    11,     0,
> -       0,     0,    16,     0,     5,     0,    17,    18,    19,     0,
> -       0,     0,     0,     1,    12,     4,    13,    14,    15,     3,
> -       0,     0,     0,     0,     0,     2,     0,    41,    42,    43,
> -      44,     0,    94,     0,    94,     0,    21,    40,     0,    33,
> -       0,    37,    38,    39,    34,    23,   183,     0,   181,   191,
> -       0,   187,     0,     0,     0,     0,     0,    35,     0,     0,
> -       0,     0,   113,   122,   123,   124,   120,   121,   117,   115,
> -     116,   118,   119,   114,   100,   109,     0,     0,    98,    99,
> -     111,     0,     0,     0,    20,    32,     0,    94,     0,     0,
> -      22,     0,     0,     0,     0,     0,     0,     0,    36,     0,
> -       0,    66,    96,     0,    92,     0,     0,   101,   108,     0,
> -     102,   110,   107,     0,     0,   125,    97,   112,   106,   103,
> -       0,     0,   134,     0,   130,     0,     0,     0,    54,     0,
> -     195,   192,   194,     0,   182,     0,     0,   180,     0,   190,
> -       0,     0,   186,     0,     0,     0,     0,     0,     0,    93,
> -       0,    61,   104,     0,     0,   126,   127,   105,     0,     0,
> -       0,   129,     0,   133,     0,     0,     0,     0,     0,    53,
> -      54,     0,     0,    52,    51,     0,     0,     0,     0,     0,
> -      23,   193,   178,     0,   188,     0,   184,     0,     0,   139,
> -     147,    90,     0,     0,     0,     0,     0,     0,     0,     0,
> -       0,     0,     0,     0,     0,    68,     0,    64,    95,     0,
> -       0,     0,     0,     0,   113,   100,     0,     0,   160,   162,
> -     164,   128,   137,     0,   132,   131,     0,     0,     0,     0,
> -      45,     0,     0,     0,     0,    47,    49,     0,    50,    55,
> -       0,    23,    23,    23,     0,    24,   179,   189,   185,   138,
> -       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
> -       0,     0,    65,     0,     0,     0,     0,    59,     0,   101,
> -     102,     0,   165,   150,     0,   135,     0,     0,     0,     0,
> -       0,    46,    56,   150,    48,     0,    23,    25,    27,    26,
> -       0,    23,     0,    69,    73,    74,    75,    76,   195,    72,
> -      77,    71,    78,    79,    81,    80,    83,    82,    85,    84,
> -      87,    86,    89,    88,    67,     0,    91,    60,     0,   150,
> -       0,     0,   157,   166,     0,     0,     0,   161,   163,   136,
> -       0,     0,   150,     0,     0,    23,    30,    23,    28,     0,
> -       0,    63,     0,     0,   159,   158,     0,     0,     0,   148,
> -     151,   144,   150,     0,     0,     0,   146,    31,    29,     0,
> -       0,     0,    58,   142,     0,   171,     0,     0,     0,     0,
> -       0,   170,   152,     0,     0,   150,   143,   150,    70,     0,
> -       0,     0,     0,     0,   172,     0,   173,     0,   167,   169,
> -     149,   140,     0,     0,    62,     0,   168,   176,   174,   175,
> -     177,   145,   141,    57
> -};
> -
> -/* YYDEFGOTO[NTERM-NUM]. */
> -static const short int yydefgoto[] =
> -{
> -      -1,    11,    12,    13,    14,    15,   100,    48,    49,    50,
> -     183,   184,   185,    51,    52,   221,    53,   157,   214,   304,
> -     310,   215,   115,    70,   113,   226,    88,    89,    90,    91,
> -     126,   132,   133,   134,   233,   200,    54,   336,   359,   227,
> -     228,   229,   230,   380,   381,    16,    57,    58,    17,    62,
> -      18,    60,   360
> -};
> -
> -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
> -   STATE-NUM.  */
> -#define YYPACT_NINF -325
> -static const short int yypact[] =
> -{
> -     144,    -5,    92,  -325,  -325,  -325,  -325,  -325,  -325,    98,
> -      99,   123,  -325,   144,   167,    78,  -325,  -325,  -325,   161,
> -     121,   154,   182,  -325,  -325,   167,  -325,  -325,  -325,   167,
> -     148,   179,   217,   227,   228,   167,   211,  -325,  -325,  -325,
> -    -325,   237,   229,   326,   229,   234,  -325,  -325,   184,  -325,
> -     292,  -325,  -325,  -325,  -325,   263,   261,   -31,  -325,  -325,
> -     147,  -325,   174,   268,   283,   309,   292,  -325,   317,   330,
> -     331,   373,  -325,  -325,  -325,  -325,  -325,  -325,  -325,  -325,
> -    -325,  -325,  -325,  -325,   346,   441,   390,   333,   294,  -325,
> -     455,   334,   293,   335,  -325,  -325,   390,   229,   357,   364,
> -    -325,    75,   372,    38,   379,    50,   389,    95,  -325,   298,
> -     398,   393,   367,   378,   394,   425,   469,  -325,  -325,   431,
> -    -325,   469,  -325,   432,   408,     5,  -325,   469,  -325,   459,
> -     220,   446,  -325,   390,  -325,   421,   460,   470,   156,   178,
> -    -325,  -325,  -325,   458,  -325,   434,   467,  -325,   435,  -325,
> -     472,   437,  -325,   474,   202,   442,   221,    39,   330,  -325,
> -     477,   443,  -325,   444,   407,   294,  -325,  -325,   445,   482,
> -     483,  -325,    -6,  -325,   484,   390,   449,    -6,   390,   101,
> -      31,   407,    15,   447,   487,   450,   -15,   452,   453,   480,
> -     263,  -325,  -325,   454,  -325,   456,  -325,   457,   488,  -325,
> -    -325,  -325,   461,   462,   463,   464,   465,   466,   468,   471,
> -     473,   475,   476,   478,   -23,  -325,   479,  -325,  -325,   390,
> -     496,   497,   407,   424,   481,    14,   498,   485,  -325,   486,
> -    -325,  -325,  -325,   201,  -325,  -325,   489,   499,   407,   506,
> -    -325,   503,   490,   492,   504,  -325,  -325,   101,  -325,  -325,
> -     100,   263,   263,   263,   104,  -325,  -325,  -325,  -325,  -325,
> -       2,     2,    75,    75,     7,   330,   390,   208,   266,   269,
> -     274,   327,  -325,   221,   511,   493,   494,   500,   495,   222,
> -     223,   390,    87,   519,   356,  -325,   520,   407,   491,   501,
> -     505,  -325,  -325,   519,  -325,   502,   263,  -325,  -325,  -325,
> -     507,   263,   509,  -325,  -325,  -325,  -325,  -325,   509,  -325,
> -    -325,  -325,  -325,  -325,  -325,  -325,  -325,  -325,  -325,  -325,
> -    -325,  -325,  -325,  -325,  -325,    58,  -325,  -325,   516,   519,
> -     390,   390,  -325,   510,   523,    32,   202,  -325,  -325,  -325,
> -     512,   407,   519,   407,   202,   263,  -325,   263,  -325,   513,
> -     508,  -325,    71,   202,  -325,  -325,   533,    88,   530,   536,
> -    -325,  -325,   519,   514,   202,   515,  -325,  -325,  -325,   517,
> -     532,   521,  -325,  -325,    88,  -325,   518,    64,    83,   522,
> -      63,  -325,  -325,    32,   202,   519,  -325,   519,  -325,   524,
> -     535,    81,    75,    75,  -325,    75,  -325,    75,  -325,  -325,
> -    -325,  -325,   202,   202,  -325,   525,  -325,  -325,  -325,  -325,
> -    -325,  -325,  -325,  -325
> -};
> -
> -/* YYPGOTO[NTERM-NUM].  */
> -static const short int yypgoto[] =
> -{
> -    -325,  -325,   103,   110,   549,  -325,  -188,  -325,   527,   -25,
> -     382,   347,   387,  -325,  -325,  -325,  -325,  -325,  -325,    22,
> -    -325,   296,  -325,   -35,  -153,   -42,  -325,   -68,  -325,   -65,
> -     -94,   440,  -325,   -84,  -325,  -324,   -22,  -286,   189,  -177,
> -    -256,  -325,   295,   204,  -154,   175,  -325,   526,   196,  -325,
> -     245,  -325,  -101
> -};
> -
> -/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
> -   positive, shift that token.  If negative, reduce the rule which
> -   number is the opposite.  If zero, do what YYDEFACT says.
> -   If YYTABLE_NINF, syntax error.  */
> -#define YYTABLE_NINF -157
> -static const short int yytable[] =
> -{
> -     144,    87,   255,   118,   243,   218,   119,   344,    98,    92,
> -     165,    66,   361,   168,    67,   250,    19,   122,    86,   280,
> -     366,   302,   128,   102,   110,   332,   308,   141,   103,   373,
> -     142,   166,   303,   272,   140,   141,   273,   303,   142,    66,
> -     386,   251,   108,   353,   123,   278,   171,   173,   118,   169,
> -     179,   140,   141,   118,   136,   142,   364,    56,   216,   118,
> -     401,   289,   137,   297,   298,   299,   125,   131,   244,   149,
> -    -154,   231,   143,   281,   354,   355,   384,   350,   411,   412,
> -     143,   245,   375,   140,   141,   358,   234,   142,   235,   182,
> -     371,   174,   146,   171,   140,   141,   217,   143,   142,   402,
> -     375,   403,   140,   141,   150,   170,   142,   375,   346,   333,
> -     340,    20,   312,   348,   152,   351,    24,    21,    22,   398,
> -     240,   376,   393,    23,    29,   377,   378,   379,   372,   143,
> -     295,    30,    24,   237,   300,    35,   239,   406,    24,   376,
> -     143,   395,   334,   377,   378,   379,   376,     1,   143,   153,
> -     377,   378,   379,     2,   241,   118,   296,   367,   119,   368,
> -     301,   306,   307,   311,   363,    31,   365,    36,     3,     4,
> -       5,     6,     7,     8,    32,   179,     2,   275,   180,    37,
> -      38,    39,    40,    41,    42,    43,    44,    45,    26,     9,
> -      10,     3,     4,     5,     6,     7,     8,   186,   187,   188,
> -      55,   104,    46,    36,    26,    47,   105,    33,   189,    27,
> -      26,   181,     9,    10,   182,    37,    38,    39,    40,    41,
> -      42,    43,    44,    45,   313,    27,   399,   314,   106,   315,
> -      63,    27,    64,   107,   190,    34,    56,   399,    94,   168,
> -     201,    47,    37,    38,    39,    40,    59,    61,    43,    44,
> -      45,    37,    38,    39,    40,   198,    68,   285,    28,   199,
> -     286,   202,   203,   204,   205,   206,    65,   207,   208,   209,
> -     210,   211,   212,   213,    28,   169,   394,   396,  -156,  -155,
> -      28,   330,   331,   305,    69,   316,   309,   317,   318,    93,
> -     319,   407,   408,   320,   409,   321,   410,    71,    72,    73,
> -      74,    75,    63,    76,    77,    78,    79,    80,    81,    82,
> -      83,    84,   130,    85,    37,    38,    39,    40,    99,   101,
> -      43,    44,    45,    65,    37,    38,    39,    40,   109,    96,
> -      97,    71,    72,    73,    74,    75,   111,    76,    77,    78,
> -      79,    80,    81,    82,    83,    84,   322,    85,   323,   112,
> -     114,   120,   124,   129,   154,   125,   135,    37,    38,    39,
> -      40,    71,    72,    73,    74,    75,   337,    76,    77,    78,
> -      79,    80,    81,    82,    83,    84,   138,    85,   116,    72,
> -      73,    74,    75,   139,    76,    77,    78,    79,    80,    81,
> -      82,    83,   117,   145,    85,    71,    72,    73,    74,    75,
> -     148,    76,    77,    78,    79,    80,    81,    82,    83,    84,
> -     151,    85,   223,   224,    73,    74,    75,   155,    76,    77,
> -      78,    79,    80,    81,    82,    83,   225,   158,    85,   116,
> -      72,    73,    74,    75,   159,    76,    77,    78,    79,    80,
> -      81,    82,    83,   279,   161,    85,   121,    72,   156,   160,
> -     162,   163,    76,    77,    78,    79,    80,    81,    82,    83,
> -     127,    72,    85,   164,   167,   172,    76,    77,    78,    79,
> -      80,    81,    82,    83,   116,    72,    85,   175,   191,   176,
> -      76,    77,    78,    79,    80,    81,    82,    83,   193,   177,
> -      85,   192,   194,   195,   196,   197,   219,   181,   220,   222,
> -     169,   232,   168,   236,   238,   182,   247,   249,   252,   253,
> -     254,   256,   259,   257,   258,   276,   277,   282,   288,   260,
> -     261,   262,   263,   264,   265,   290,   266,   291,   294,   267,
> -     246,   268,   274,   269,   270,   325,   271,  -153,   335,   339,
> -     352,   283,   357,   369,   287,   284,   341,   292,   293,   326,
> -     327,   329,   374,   328,   382,   383,   389,   342,   345,   405,
> -     343,   370,    25,   347,   349,   356,   248,   242,   362,   324,
> -     385,   387,   400,   388,   390,    95,   392,   178,   391,   338,
> -     397,   404,   413,     0,     0,     0,     0,     0,     0,     0,
> -       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
> -       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
> -       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
> -       0,     0,     0,     0,     0,     0,     0,     0,     0,   147
> -};
> -
> -static const short int yycheck[] =
> -{
> -     101,    43,   190,    71,   181,   158,    71,   293,    50,    44,
> -       5,    36,   336,    19,    36,    30,    21,    85,    43,     5,
> -     344,    19,    90,    54,    66,   281,    19,    20,    59,   353,
> -      23,   125,    30,    56,    19,    20,    59,    30,    23,    64,
> -     364,    56,    64,   329,    86,   222,   130,   131,   116,    55,
> -      19,    19,    20,   121,    96,    23,   342,    19,    19,   127,
> -     384,   238,    97,   251,   252,   253,    61,    92,    53,    19,
> -      56,   165,    65,    59,   330,   331,   362,    19,   402,   403,
> -      65,   182,    19,    19,    20,    53,   170,    23,   172,    58,
> -      19,   133,    54,   177,    19,    20,    57,    65,    23,   385,
> -      19,   387,    19,    20,    54,   130,    23,    19,   296,    22,
> -     287,    19,   265,   301,    19,    57,    13,    19,    19,    56,
> -      19,    58,    58,     0,    14,    62,    63,    64,    57,    65,
> -      30,    53,    29,   175,    30,    25,   178,    56,    35,    58,
> -      65,    58,    55,    62,    63,    64,    58,     3,    65,    54,
> -      62,    63,    64,     9,    53,   223,    56,   345,   223,   347,
> -      56,   262,   263,   264,   341,     4,   343,    19,    24,    25,
> -      26,    27,    28,    29,    53,    19,     9,   219,    22,    31,
> -      32,    33,    34,    35,    36,    37,    38,    39,    13,    45,
> -      46,    24,    25,    26,    27,    28,    29,    19,    20,    21,
> -      21,    54,    54,    19,    29,    57,    59,    53,    30,    13,
> -      35,    55,    45,    46,    58,    31,    32,    33,    34,    35,
> -      36,    37,    38,    39,   266,    29,   380,    19,    54,    21,
> -      19,    35,    21,    59,    56,    53,    19,   391,    54,    19,
> -      19,    57,    31,    32,    33,    34,    19,    19,    37,    38,
> -      39,    31,    32,    33,    34,    53,    19,    56,    13,    57,
> -      59,    40,    41,    42,    43,    44,    55,    46,    47,    48,
> -      49,    50,    51,    52,    29,    55,   377,   378,    56,    56,
> -      35,    59,    59,   261,    55,    19,   264,    21,    19,    55,
> -      21,   392,   393,    19,   395,    21,   397,     5,     6,     7,
> -       8,     9,    19,    11,    12,    13,    14,    15,    16,    17,
> -      18,    19,    19,    21,    31,    32,    33,    34,    55,    58,
> -      37,    38,    39,    55,    31,    32,    33,    34,    19,    37,
> -      38,     5,     6,     7,     8,     9,    19,    11,    12,    13,
> -      14,    15,    16,    17,    18,    19,    19,    21,    21,    19,
> -      19,     5,    19,    19,    56,    61,    21,    31,    32,    33,
> -      34,     5,     6,     7,     8,     9,    10,    11,    12,    13,
> -      14,    15,    16,    17,    18,    19,    19,    21,     5,     6,
> -       7,     8,     9,    19,    11,    12,    13,    14,    15,    16,
> -      17,    18,    19,    21,    21,     5,     6,     7,     8,     9,
> -      21,    11,    12,    13,    14,    15,    16,    17,    18,    19,
> -      21,    21,     5,     6,     7,     8,     9,    19,    11,    12,
> -      13,    14,    15,    16,    17,    18,    19,    60,    21,     5,
> -       6,     7,     8,     9,    56,    11,    12,    13,    14,    15,
> -      16,    17,    18,    19,    19,    21,     5,     6,    55,    55,
> -      19,    19,    11,    12,    13,    14,    15,    16,    17,    18,
> -       5,     6,    21,    55,     5,    19,    11,    12,    13,    14,
> -      15,    16,    17,    18,     5,     6,    21,    56,    20,    19,
> -      11,    12,    13,    14,    15,    16,    17,    18,    21,    19,
> -      21,    57,    57,    21,    57,    21,    19,    55,    55,    55,
> -      55,    19,    19,    19,    55,    58,    19,    57,    56,    56,
> -      30,    57,    24,    57,    57,    19,    19,    19,    19,    58,
> -      58,    58,    58,    58,    58,    19,    58,    24,    24,    58,
> -     183,    58,    53,    58,    58,    24,    58,    56,    19,    19,
> -      24,    56,    19,    30,    55,    59,    55,    57,    56,    56,
> -      56,    56,    19,    53,    24,    19,    24,    56,    56,    24,
> -      55,    53,    13,    56,    55,    55,   184,   180,    56,   273,
> -      56,    56,   383,    56,    53,    48,    58,   137,   374,   284,
> -      58,    57,    57,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
> -      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
> -      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
> -      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
> -      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   103
> -};
> -
> -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
> -   symbol of state STATE-NUM.  */
> -static const unsigned char yystos[] =
> -{
> -       0,     3,     9,    24,    25,    26,    27,    28,    29,    45,
> -      46,    67,    68,    69,    70,    71,   111,   114,   116,    21,
> -      19,    19,    19,     0,    68,    70,   111,   114,   116,    69,
> -      53,     4,    53,    53,    53,    69,    19,    31,    32,    33,
> -      34,    35,    36,    37,    38,    39,    54,    57,    73,    74,
> -      75,    79,    80,    82,   102,    21,    19,   112,   113,    19,
> -     117,    19,   115,    19,    21,    55,    75,   102,    19,    55,
> -      89,     5,     6,     7,     8,     9,    11,    12,    13,    14,
> -      15,    16,    17,    18,    19,    21,    75,    91,    92,    93,
> -      94,    95,    89,    55,    54,    74,    37,    38,    91,    55,
> -      72,    58,    54,    59,    54,    59,    54,    59,   102,    19,
> -      91,    19,    19,    90,    19,    88,     5,    19,    93,    95,
> -       5,     5,    93,    91,    19,    61,    96,     5,    93,    19,
> -      19,    75,    97,    98,    99,    21,    91,    89,    19,    19,
> -      19,    20,    23,    65,   118,    21,    54,   113,    21,    19,
> -      54,    21,    19,    54,    56,    19,    55,    83,    60,    56,
> -      55,    19,    19,    19,    55,     5,    96,     5,    19,    55,
> -      75,    99,    19,    99,    91,    56,    19,    19,    97,    19,
> -      22,    55,    58,    76,    77,    78,    19,    20,    21,    30,
> -      56,    20,    57,    21,    57,    21,    57,    21,    53,    57,
> -     101,    19,    40,    41,    42,    43,    44,    46,    47,    48,
> -      49,    50,    51,    52,    84,    87,    19,    57,    90,    19,
> -      55,    81,    55,     5,     6,    19,    91,   105,   106,   107,
> -     108,    96,    19,   100,    99,    99,    19,    91,    55,    91,
> -      19,    53,    78,   105,    53,   118,    77,    19,    76,    57,
> -      30,    56,    56,    56,    30,    72,    57,    57,    57,    24,
> -      58,    58,    58,    58,    58,    58,    58,    58,    58,    58,
> -      58,    58,    56,    59,    53,    91,    19,    19,   105,    19,
> -       5,    59,    19,    56,    59,    56,    59,    55,    19,   105,
> -      19,    24,    57,    56,    24,    30,    56,    72,    72,    72,
> -      30,    56,    19,    30,    85,    85,   118,   118,    19,    85,
> -      86,   118,    90,    91,    19,    21,    19,    21,    19,    21,
> -      19,    21,    19,    21,    87,    24,    56,    56,    53,    56,
> -      59,    59,   106,    22,    55,    19,   103,    10,   108,    19,
> -     105,    55,    56,    55,   103,    56,    72,    56,    72,    55,
> -      19,    57,    24,   103,   106,   106,    55,    19,    53,   104,
> -     118,   101,    56,   105,   103,   105,   101,    72,    72,    30,
> -      53,    19,    57,   101,    19,    19,    58,    62,    63,    64,
> -     109,   110,    24,    19,   103,    56,   101,    56,    56,    24,
> -      53,   109,    58,    58,   118,    58,   118,    58,    56,   110,
> -     104,   101,   103,   103,    57,    24,    56,   118,   118,   118,
> -     118,   101,   101,    57
> -};
> -
> -#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
> -# define YYSIZE_T __SIZE_TYPE__
> -#endif
> -#if ! defined (YYSIZE_T) && defined (size_t)
> -# define YYSIZE_T size_t
> -#endif
> -#if ! defined (YYSIZE_T)
> -# if defined (__STDC__) || defined (__cplusplus)
> -#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
> -#  define YYSIZE_T size_t
> -# endif
> -#endif
> -#if ! defined (YYSIZE_T)
> -# define YYSIZE_T unsigned int
> -#endif
> -
> -#define yyerrok (yyerrstatus = 0)
> -#define yyclearin (yychar = YYEMPTY)
> -#define YYEMPTY (-2)
> -#define YYEOF 0
> -
> -#define YYACCEPT goto yyacceptlab
> -#define YYABORT goto yyabortlab
> -#define YYERROR goto yyerrorlab
> -
> -
> -/* Like YYERROR except do call yyerror.  This remains here temporarily
> -   to ease the transition to the new meaning of YYERROR, for GCC.
> -   Once GCC version 2 has supplanted version 1, this can go.  */
> -
> -#define YYFAIL goto yyerrlab
> -
> -#define YYRECOVERING()  (!!yyerrstatus)
> -
> -#define YYBACKUP(Token, Value) \
> -do \
> -  if (yychar == YYEMPTY && yylen == 1) \
> -    { \
> -      yychar = (Token); \
> -      yylval = (Value); \
> -      yytoken = YYTRANSLATE (yychar); \
> -      YYPOPSTACK; \
> -      goto yybackup; \
> -    } \
> -  else \
> -    { \
> -      yyerror ("syntax error: cannot back up");\
> -      YYERROR; \
> -    } \
> -while (0)
> -
> -
> -#define YYTERROR 1
> -#define YYERRCODE 256
> -
> -
> -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
> -   If N is 0, then set CURRENT to the empty location which ends
> -   the previous symbol: RHS[0] (always defined).  */
> -
> -#define YYRHSLOC(Rhs, K) ((Rhs)[K])
> -#ifndef YYLLOC_DEFAULT
> -# define YYLLOC_DEFAULT(Current, Rhs, N) \
> -    do \
> -      if (N) \
> - { \
> -  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line; \
> -  (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
> -  (Current).last_line    = YYRHSLOC (Rhs, N).last_line; \
> -  (Current).last_column  = YYRHSLOC (Rhs, N).last_column; \
> - } \
> -      else \
> - { \
> -  (Current).first_line   = (Current).last_line   = \
> -    YYRHSLOC (Rhs, 0).last_line; \
> -  (Current).first_column = (Current).last_column = \
> -    YYRHSLOC (Rhs, 0).last_column; \
> - } \
> -    while (0)
> -#endif
> -
> -
> -/* YY_LOCATION_PRINT -- Print the location on the stream.
> -   This macro was not mandated originally: define only if we know
> -   we won't break user code: when these are the locations we know.  */
> -
> -#ifndef YY_LOCATION_PRINT
> -# if YYLTYPE_IS_TRIVIAL
> -#  define YY_LOCATION_PRINT(File, Loc) \
> -     fprintf (File, "%d.%d-%d.%d", \
> -              (Loc).first_line, (Loc).first_column, \
> -              (Loc).last_line,  (Loc).last_column)
> -# else
> -#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
> -# endif
> -#endif
> -
> -
> -/* YYLEX -- calling `yylex' with the right arguments.  */
> -
> -#ifdef YYLEX_PARAM
> -# define YYLEX yylex (YYLEX_PARAM)
> -#else
> -# define YYLEX yylex ()
> -#endif
> -
> -/* Enable debugging if requested.  */
> -#if YYDEBUG
> -
> -# ifndef YYFPRINTF
> -#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
> -#  define YYFPRINTF fprintf
> -# endif
> -
> -# define YYDPRINTF(Args) \
> -do { \
> -  if (yydebug) \
> -    YYFPRINTF Args; \
> -} while (0)
> -
> -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
> -do { \
> -  if (yydebug) \
> -    { \
> -      YYFPRINTF (stderr, "%s ", Title); \
> -      yysymprint (stderr, \
> -                  Type, Value); \
> -      YYFPRINTF (stderr, "\n"); \
> -    } \
> -} while (0)
> -
> -/*------------------------------------------------------------------.
> -| yy_stack_print -- Print the state stack from its BOTTOM up to its |
> -| TOP (included).                                                   |
> -`------------------------------------------------------------------*/
> -
> -#if defined (__STDC__) || defined (__cplusplus)
> -static void
> -yy_stack_print (short int *bottom, short int *top)
> -#else
> -static void
> -yy_stack_print (bottom, top)
> -    short int *bottom;
> -    short int *top;
> -#endif
> -{
> -  YYFPRINTF (stderr, "Stack now");
> -  for (/* Nothing. */; bottom <= top; ++bottom)
> -    YYFPRINTF (stderr, " %d", *bottom);
> -  YYFPRINTF (stderr, "\n");
> -}
> -
> -# define YY_STACK_PRINT(Bottom, Top) \
> -do { \
> -  if (yydebug) \
> -    yy_stack_print ((Bottom), (Top)); \
> -} while (0)
> -
> -
> -/*------------------------------------------------.
> -| Report that the YYRULE is going to be reduced.  |
> -`------------------------------------------------*/
> -
> -#if defined (__STDC__) || defined (__cplusplus)
> -static void
> -yy_reduce_print (int yyrule)
> -#else
> -static void
> -yy_reduce_print (yyrule)
> -    int yyrule;
> -#endif
> -{
> -  int yyi;
> -  unsigned int yylno = yyrline[yyrule];
> -  YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
> -             yyrule - 1, yylno);
> -  /* Print the symbols being reduced, and their result.  */
> -  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
> -    YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
> -  YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
> -}
> -
> -# define YY_REDUCE_PRINT(Rule) \
> -do { \
> -  if (yydebug) \
> -    yy_reduce_print (Rule); \
> -} while (0)
> -
> -/* Nonzero means print parse trace.  It is left uninitialized so that
> -   multiple parsers can coexist.  */
> -int yydebug;
> -#else /* !YYDEBUG */
> -# define YYDPRINTF(Args)
> -# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
> -# define YY_STACK_PRINT(Bottom, Top)
> -# define YY_REDUCE_PRINT(Rule)
> -#endif /* !YYDEBUG */
> -
> -
> -/* YYINITDEPTH -- initial size of the parser's stacks.  */
> -#ifndef YYINITDEPTH
> -# define YYINITDEPTH 200
> -#endif
> -
> -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
> -   if the built-in stack extension method is used).
> -
> -   Do not make this value too large; the results are undefined if
> -   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
> -   evaluated with infinite-precision integer arithmetic.  */
> -
> -#ifndef YYMAXDEPTH
> -# define YYMAXDEPTH 10000
> -#endif
> -
> -
> -
> -#if YYERROR_VERBOSE
> -
> -# ifndef yystrlen
> -#  if defined (__GLIBC__) && defined (_STRING_H)
> -#   define yystrlen strlen
> -#  else
> -/* Return the length of YYSTR.  */
> -static YYSIZE_T
> -#   if defined (__STDC__) || defined (__cplusplus)
> -yystrlen (const char *yystr)
> -#   else
> -yystrlen (yystr)
> -     const char *yystr;
> -#   endif
> -{
> -  register const char *yys = yystr;
> -
> -  while (*yys++ != '\0')
> -    continue;
> -
> -  return yys - yystr - 1;
> -}
> -#  endif
> -# endif
> -
> -# ifndef yystpcpy
> -#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
> -#   define yystpcpy stpcpy
> -#  else
> -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
> -   YYDEST.  */
> -static char *
> -#   if defined (__STDC__) || defined (__cplusplus)
> -yystpcpy (char *yydest, const char *yysrc)
> -#   else
> -yystpcpy (yydest, yysrc)
> -     char *yydest;
> -     const char *yysrc;
> -#   endif
> -{
> -  register char *yyd = yydest;
> -  register const char *yys = yysrc;
> -
> -  while ((*yyd++ = *yys++) != '\0')
> -    continue;
> -
> -  return yyd - 1;
> -}
> -#  endif
> -# endif
> -
> -#endif /* !YYERROR_VERBOSE */
> -
> -
> -
> -#if YYDEBUG
> -/*--------------------------------.
> -| Print this symbol on YYOUTPUT.  |
> -`--------------------------------*/
> -
> -#if defined (__STDC__) || defined (__cplusplus)
> -static void
> -yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
> -#else
> -static void
> -yysymprint (yyoutput, yytype, yyvaluep)
> -    FILE *yyoutput;
> -    int yytype;
> -    YYSTYPE *yyvaluep;
> -#endif
> -{
> -  /* Pacify ``unused variable'' warnings.  */
> -  (void) yyvaluep;
> -
> -  if (yytype < YYNTOKENS)
> -    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
> -  else
> -    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
> -
> -
> -# ifdef YYPRINT
> -  if (yytype < YYNTOKENS)
> -    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
> -# endif
> -  switch (yytype)
> -    {
> -      default:
> -        break;
> -    }
> -  YYFPRINTF (yyoutput, ")");
> -}
> -
> -#endif /* ! YYDEBUG */
> -/*-----------------------------------------------.
> -| Release the memory associated to this symbol.  |
> -`-----------------------------------------------*/
> -
> -#if defined (__STDC__) || defined (__cplusplus)
> -static void
> -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
> -#else
> -static void
> -yydestruct (yymsg, yytype, yyvaluep)
> -    const char *yymsg;
> -    int yytype;
> -    YYSTYPE *yyvaluep;
> -#endif
> -{
> -  /* Pacify ``unused variable'' warnings.  */
> -  (void) yyvaluep;
> -
> -  if (!yymsg)
> -    yymsg = "Deleting";
> -  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
> -
> -  switch (yytype)
> -    {
> -
> -      default:
> -        break;
> -    }
> -}
> -
> -
> -/* Prevent warnings from -Wmissing-prototypes.  */
> -
> -#ifdef YYPARSE_PARAM
> -# if defined (__STDC__) || defined (__cplusplus)
> -int yyparse (void *YYPARSE_PARAM);
> -# else
> -int yyparse ();
> -# endif
> -#else /* ! YYPARSE_PARAM */
> -#if defined (__STDC__) || defined (__cplusplus)
> -int yyparse (void);
> -#else
> -int yyparse ();
> -#endif
> -#endif /* ! YYPARSE_PARAM */
> -
> -
> -
> -/* The look-ahead symbol.  */
> -int yychar;
> -
> -/* The semantic value of the look-ahead symbol.  */
> -YYSTYPE yylval;
> -
> -/* Number of syntax errors so far.  */
> -int yynerrs;
> -
> -
> -
> -/*----------.
> -| yyparse.  |
> -`----------*/
> -
> -#ifdef YYPARSE_PARAM
> -# if defined (__STDC__) || defined (__cplusplus)
> -int yyparse (void *YYPARSE_PARAM)
> -# else
> -int yyparse (YYPARSE_PARAM)
> -  void *YYPARSE_PARAM;
> -# endif
> -#else /* ! YYPARSE_PARAM */
> -#if defined (__STDC__) || defined (__cplusplus)
> -int
> -yyparse (void)
> -#else
> -int
> -yyparse ()
> -
> -#endif
> -#endif
> -{
> -  
> -  register int yystate;
> -  register int yyn;
> -  int yyresult;
> -  /* Number of tokens to shift before error messages enabled.  */
> -  int yyerrstatus;
> -  /* Look-ahead token as an internal (translated) token number.  */
> -  int yytoken = 0;
> -
> -  /* Three stacks and their tools:
> -     `yyss': related to states,
> -     `yyvs': related to semantic values,
> -     `yyls': related to locations.
> -
> -     Refer to the stacks thru separate pointers, to allow yyoverflow
> -     to reallocate them elsewhere.  */
> -
> -  /* The state stack.  */
> -  short int yyssa[YYINITDEPTH];
> -  short int *yyss = yyssa;
> -  register short int *yyssp;
> -
> -  /* The semantic value stack.  */
> -  YYSTYPE yyvsa[YYINITDEPTH];
> -  YYSTYPE *yyvs = yyvsa;
> -  register YYSTYPE *yyvsp;
> -
> -
> -
> -#define YYPOPSTACK   (yyvsp--, yyssp--)
> -
> -  YYSIZE_T yystacksize = YYINITDEPTH;
> -
> -  /* The variables used to return semantic value and location from the
> -     action routines.  */
> -  YYSTYPE yyval;
> -
> -
> -  /* When reducing, the number of symbols on the RHS of the reduced
> -     rule.  */
> -  int yylen;
> -
> -  YYDPRINTF ((stderr, "Starting parse\n"));
> -
> -  yystate = 0;
> -  yyerrstatus = 0;
> -  yynerrs = 0;
> -  yychar = YYEMPTY; /* Cause a token to be read.  */
> -
> -  /* Initialize stack pointers.
> -     Waste one element of value and location stack
> -     so that they stay on the same level as the state stack.
> -     The wasted elements are never initialized.  */
> -
> -  yyssp = yyss;
> -  yyvsp = yyvs;
> -
> -
> -  yyvsp[0] = yylval;
> -
> -  goto yysetstate;
> -
> -/*------------------------------------------------------------.
> -| yynewstate -- Push a new state, which is found in yystate.  |
> -`------------------------------------------------------------*/
> - yynewstate:
> -  /* In all cases, when you get here, the value and location stacks
> -     have just been pushed. so pushing a state here evens the stacks.
> -     */
> -  yyssp++;
> -
> - yysetstate:
> -  *yyssp = yystate;
> -
> -  if (yyss + yystacksize - 1 <= yyssp)
> -    {
> -      /* Get the current used size of the three stacks, in elements.  */
> -      YYSIZE_T yysize = yyssp - yyss + 1;
> -
> -#ifdef yyoverflow
> -      {
> - /* Give user a chance to reallocate the stack. Use copies of
> -   these so that the &'s don't force the real ones into
> -   memory.  */
> - YYSTYPE *yyvs1 = yyvs;
> - short int *yyss1 = yyss;
> -
> -
> - /* Each stack pointer address is followed by the size of the
> -   data in use in that stack, in bytes.  This used to be a
> -   conditional around just the two extra args, but that might
> -   be undefined if yyoverflow is a macro.  */
> - yyoverflow ("parser stack overflow",
> -    &yyss1, yysize * sizeof (*yyssp),
> -    &yyvs1, yysize * sizeof (*yyvsp),
> -
> -    &yystacksize);
> -
> - yyss = yyss1;
> - yyvs = yyvs1;
> -      }
> -#else /* no yyoverflow */
> -# ifndef YYSTACK_RELOCATE
> -      goto yyoverflowlab;
> -# else
> -      /* Extend the stack our own way.  */
> -      if (YYMAXDEPTH <= yystacksize)
> - goto yyoverflowlab;
> -      yystacksize *= 2;
> -      if (YYMAXDEPTH < yystacksize)
> - yystacksize = YYMAXDEPTH;
> -
> -      {
> - short int *yyss1 = yyss;
> - union yyalloc *yyptr =
> -  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
> - if (! yyptr)
> -  goto yyoverflowlab;
> - YYSTACK_RELOCATE (yyss);
> - YYSTACK_RELOCATE (yyvs);
> -
> -#  undef YYSTACK_RELOCATE
> - if (yyss1 != yyssa)
> -  YYSTACK_FREE (yyss1);
> -      }
> -# endif
> -#endif /* no yyoverflow */
> -
> -      yyssp = yyss + yysize - 1;
> -      yyvsp = yyvs + yysize - 1;
> -
> -
> -      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
> -  (unsigned long int) yystacksize));
> -
> -      if (yyss + yystacksize - 1 <= yyssp)
> - YYABORT;
> -    }
> -
> -  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
> -
> -  goto yybackup;
> -
> -/*-----------.
> -| yybackup.  |
> -`-----------*/
> -yybackup:
> -
> -/* Do appropriate processing given the current state.  */
> -/* Read a look-ahead token if we need one and don't already have one.  */
> -/* yyresume: */
> -
> -  /* First try to decide what to do without reference to look-ahead token.  */
> -
> -  yyn = yypact[yystate];
> -  if (yyn == YYPACT_NINF)
> -    goto yydefault;
> -
> -  /* Not known => get a look-ahead token if don't already have one.  */
> -
> -  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
> -  if (yychar == YYEMPTY)
> -    {
> -      YYDPRINTF ((stderr, "Reading a token: "));
> -      yychar = YYLEX;
> -    }
> -
> -  if (yychar <= YYEOF)
> -    {
> -      yychar = yytoken = YYEOF;
> -      YYDPRINTF ((stderr, "Now at end of input.\n"));
> -    }
> -  else
> -    {
> -      yytoken = YYTRANSLATE (yychar);
> -      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
> -    }
> -
> -  /* If the proper action on seeing token YYTOKEN is to reduce or to
> -     detect an error, take that action.  */
> -  yyn += yytoken;
> -  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
> -    goto yydefault;
> -  yyn = yytable[yyn];
> -  if (yyn <= 0)
> -    {
> -      if (yyn == 0 || yyn == YYTABLE_NINF)
> - goto yyerrlab;
> -      yyn = -yyn;
> -      goto yyreduce;
> -    }
> -
> -  if (yyn == YYFINAL)
> -    YYACCEPT;
> -
> -  /* Shift the look-ahead token.  */
> -  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
> -
> -  /* Discard the token being shifted unless it is eof.  */
> -  if (yychar != YYEOF)
> -    yychar = YYEMPTY;
> -
> -  *++yyvsp = yylval;
> -
> -
> -  /* Count tokens shifted since error; after three, turn off error
> -     status.  */
> -  if (yyerrstatus)
> -    yyerrstatus--;
> -
> -  yystate = yyn;
> -  goto yynewstate;
> -
> -
> -/*-----------------------------------------------------------.
> -| yydefault -- do the default action for the current state.  |
> -`-----------------------------------------------------------*/
> -yydefault:
> -  yyn = yydefact[yystate];
> -  if (yyn == 0)
> -    goto yyerrlab;
> -  goto yyreduce;
> -
> -
> -/*-----------------------------.
> -| yyreduce -- Do a reduction.  |
> -`-----------------------------*/
> -yyreduce:
> -  /* yyn is the number of a rule to reduce with.  */
> -  yylen = yyr2[yyn];
> -
> -  /* If YYLEN is nonzero, implement the default value of the action:
> -     `$$ = $1'.
> -
> -     Otherwise, the following line sets YYVAL to garbage.
> -     This behavior is undocumented and Bison
> -     users should not rely upon it.  Assigning to YYVAL
> -     unconditionally makes the parser a bit smaller, and it avoids a
> -     GCC warning that YYVAL may be used uninitialized.  */
> -  yyval = yyvsp[1-yylen];
> -
> -
> -  YY_REDUCE_PRINT (yyn);
> -  switch (yyn)
> -    {
> -        case 2:
> -#line 689 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 3:
> -#line 690 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 4:
> -#line 691 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 5:
> -#line 692 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 6:
> -#line 695 "parse.y"
> -    {
> - Node *node = node_new (CCODE_NODE,
> -       "cctype", C_CCODE,
> -       "cbuf:steal", ((yyvsp[0].cbuf))->str,
> -       "line_no", ccode_line,
> -       NULL);
> - nodes = g_list_append(nodes,node);
> - g_string_free((yyvsp[0].cbuf),FALSE);
> - }
> -    break;
> -
> -  case 7:
> -#line 704 "parse.y"
> -    {
> - Node *node = node_new (CCODE_NODE,
> -       "cctype", H_CCODE,
> -       "cbuf:steal", ((yyvsp[0].cbuf))->str,
> -       "line_no", ccode_line,
> -       NULL);
> - nodes = g_list_append(nodes,node);
> - g_string_free((yyvsp[0].cbuf),FALSE);
> - }
> -    break;
> -
> -  case 8:
> -#line 713 "parse.y"
> -    {
> - Node *node = node_new (CCODE_NODE,
> -       "cctype", HT_CCODE,
> -       "cbuf:steal", ((yyvsp[0].cbuf))->str,
> -       "line_no", ccode_line,
> -       NULL);
> - nodes = g_list_append(nodes,node);
> - g_string_free((yyvsp[0].cbuf),FALSE);
> - }
> -    break;
> -
> -  case 9:
> -#line 722 "parse.y"
> -    {
> - Node *node = node_new (CCODE_NODE,
> -       "cctype", PH_CCODE,
> -       "cbuf:steal", ((yyvsp[0].cbuf))->str,
> -       "line_no", ccode_line,
> -       NULL);
> - nodes = g_list_append(nodes,node);
> - g_string_free((yyvsp[0].cbuf),FALSE);
> - }
> -    break;
> -
> -  case 10:
> -#line 731 "parse.y"
> -    {
> - Node *node = node_new (CCODE_NODE,
> -       "cctype", A_CCODE,
> -       "cbuf:steal", ((yyvsp[0].cbuf))->str,
> -       "line_no", ccode_line,
> -       NULL);
> - nodes = g_list_append(nodes,node);
> - g_string_free((yyvsp[0].cbuf),FALSE);
> - }
> -    break;
> -
> -  case 11:
> -#line 740 "parse.y"
> -    {
> - Node *node = node_new (CCODE_NODE,
> -       "cctype", AT_CCODE,
> -       "cbuf:steal", ((yyvsp[0].cbuf))->str,
> -       "line_no", ccode_line,
> -       NULL);
> - nodes = g_list_append(nodes,node);
> - g_string_free((yyvsp[0].cbuf),FALSE);
> - }
> -    break;
> -
> -  case 12:
> -#line 751 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 13:
> -#line 752 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 14:
> -#line 753 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 15:
> -#line 754 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 16:
> -#line 755 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 17:
> -#line 756 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 18:
> -#line 757 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 19:
> -#line 758 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 20:
> -#line 761 "parse.y"
> -    {
> - ((Class *)class)->nodes = class_nodes;
> - class_nodes = NULL;
> - nodes = g_list_append(nodes,class);
> - }
> -    break;
> -
> -  case 21:
> -#line 766 "parse.y"
> -    {
> - ((Class *)class)->nodes = NULL;
> - class_nodes = NULL;
> - nodes = g_list_append(nodes,class);
> - }
> -    break;
> -
> -  case 22:
> -#line 773 "parse.y"
> -    {
> - class = node_new (CLASS_NODE,
> -  "otype:steal", (yyvsp[-3].id),
> -  "ptype:steal", (yyvsp[-1].id),
> -  "bonobo_object_class:steal", bonobo_object_class,
> -  "glade_xml", glade_xml,
> -  "interfaces:steal", interfaces,
> -  "chunk_size:steal", chunk_size,
> -  "abstract", abstract,
> -  NULL);
> - bonobo_object_class = NULL;
> - glade_xml = FALSE;
> - chunk_size = NULL;
> - interfaces = NULL;
> - }
> -    break;
> -
> -  case 24:
> -#line 791 "parse.y"
> -    {
> - if(strcmp((yyvsp[-2].id),"abstract") == 0) {
> - abstract = TRUE;
> - } else {
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - }
> -    break;
> -
> -  case 25:
> -#line 799 "parse.y"
> -    {
> - if(strcmp((yyvsp[-3].id),"chunks") == 0) {
> - g_free (chunk_size);
> - chunk_size = g_strdup((yyvsp[-2].id));
> - } else if(strcmp((yyvsp[-3].id),"BonoboObject") == 0) {
> - g_free (bonobo_object_class);
> - bonobo_object_class = g_strdup((yyvsp[-2].id));
> - } else {
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - }
> -    break;
> -
> -  case 26:
> -#line 811 "parse.y"
> -    {
> - if (strcmp ((yyvsp[-3].id), "interface") == 0) {
> - interfaces = g_list_append (interfaces,
> -    g_strdup ((yyvsp[-2].id)));
> - } else {
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - }
> -    break;
> -
> -  case 27:
> -#line 820 "parse.y"
> -    {
> - if(strcmp((yyvsp[-3].id),"chunks") == 0) {
> - g_free (chunk_size);
> - if(atoi((yyvsp[-2].id)) != 0)
> - chunk_size = g_strdup((yyvsp[-2].id));
> - else
> - chunk_size = NULL;
> - } else {
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - }
> -    break;
> -
> -  case 28:
> -#line 832 "parse.y"
> -    {
> - if (strcmp ((yyvsp[-4].id), "GladeXML") == 0) {
> - glade_xml = TRUE;
> - add_construct_glade((yyvsp[-3].id), (yyvsp[-2].id), NULL);
> - } else {
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - }
> -    break;
> -
> -  case 29:
> -#line 841 "parse.y"
> -    {
> - if (strcmp ((yyvsp[-5].id), "GladeXML") == 0) {
> - glade_xml = TRUE;
> - add_construct_glade((yyvsp[-4].id), (yyvsp[-3].id), (yyvsp[-2].id));
> - } else {
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - }
> -    break;
> -
> -  case 30:
> -#line 850 "parse.y"
> -    {
> - if (strcmp ((yyvsp[-4].id), "GladeXML") == 0) {
> - glade_xml = TRUE;
> - add_construct_glade((yyvsp[-3].id), (yyvsp[-2].id), NULL);
> - } else {
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - }
> -    break;
> -
> -  case 31:
> -#line 859 "parse.y"
> -    {
> - if (strcmp ((yyvsp[-5].id), "GladeXML") == 0) {
> - glade_xml = TRUE;
> - add_construct_glade((yyvsp[-4].id), (yyvsp[-3].id), (yyvsp[-2].id));
> - } else {
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - }
> -    break;
> -
> -  case 32:
> -#line 870 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 33:
> -#line 871 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 34:
> -#line 874 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 35:
> -#line 875 "parse.y"
> -    {
> - if (strcmp ((yyvsp[-1].id), "BonoboObject") != 0) {
> - g_free ((yyvsp[-1].id));
> - yyerror (_("parse error"));
> - YYERROR;
> - }
> - g_free ((yyvsp[-1].id));
> - last_added_method->bonobo_object_func = TRUE;
> - }
> -    break;
> -
> -  case 36:
> -#line 884 "parse.y"
> -    {
> - if (strcmp ((yyvsp[-2].id), "interface") != 0) {
> - g_free ((yyvsp[-2].id));
> - g_free ((yyvsp[-1].id));
> - yyerror (_("parse error"));
> - YYERROR;
> - }
> - g_free ((yyvsp[-2].id));
> - node_set ((Node *)last_added_method,
> -  "interface:steal", (yyvsp[-1].id),
> -  NULL);
> - }
> -    break;
> -
> -  case 37:
> -#line 896 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 38:
> -#line 897 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 39:
> -#line 898 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 40:
> -#line 899 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 41:
> -#line 902 "parse.y"
> -    { the_scope = PUBLIC_SCOPE; }
> -    break;
> -
> -  case 42:
> -#line 903 "parse.y"
> -    { the_scope = PRIVATE_SCOPE; }
> -    break;
> -
> -  case 43:
> -#line 904 "parse.y"
> -    { the_scope = PROTECTED_SCOPE; }
> -    break;
> -
> -  case 44:
> -#line 905 "parse.y"
> -    { the_scope = CLASS_SCOPE; }
> -    break;
> -
> -  case 45:
> -#line 908 "parse.y"
> -    {
> - if (strcmp ((yyvsp[-1].id), "destroywith") == 0) {
> - g_free ((yyvsp[-1].id));
> - destructor_unref = FALSE;
> - destructor = (yyvsp[0].id);
> - destructor_line = line_no;
> - destructor_simple = TRUE;
> - } else if (strcmp ((yyvsp[-1].id), "unrefwith") == 0) {
> - g_free ((yyvsp[-1].id));
> - destructor_unref = TRUE;
> - destructor = (yyvsp[0].id);
> - destructor_line = line_no;
> - destructor_simple = TRUE;
> - } else {
> - g_free ((yyvsp[-1].id));
> - g_free ((yyvsp[0].id));
> - yyerror (_("parse error"));
> - YYERROR;
> - }
> - }
> -    break;
> -
> -  case 46:
> -#line 928 "parse.y"
> -    {
> - if (strcmp ((yyvsp[-2].id), "destroy") == 0) {
> - g_free((yyvsp[-2].id));
> - destructor_unref = FALSE;
> - destructor = ((yyvsp[0].cbuf))->str;
> - g_string_free((yyvsp[0].cbuf), FALSE);
> - destructor_line = ccode_line;
> - destructor_simple = FALSE;
> - } else if (strcmp ((yyvsp[-2].id), "unref") == 0) {
> - g_free ((yyvsp[-2].id));
> - destructor_unref = TRUE;
> - destructor = ((yyvsp[0].cbuf))->str;
> - g_string_free ((yyvsp[0].cbuf), FALSE);
> - destructor_line = ccode_line;
> - destructor_simple = FALSE;
> - } else {
> - g_free ((yyvsp[-2].id));
> - g_string_free ((yyvsp[0].cbuf), TRUE);
> - yyerror (_("parse error"));
> - YYERROR;
> - }
> - }
> -    break;
> -
> -  case 47:
> -#line 952 "parse.y"
> -    {
> - initializer = (yyvsp[0].id);
> - initializer_line = ccode_line;
> - }
> -    break;
> -
> -  case 48:
> -#line 956 "parse.y"
> -    {
> - initializer = ((yyvsp[0].cbuf))->str;
> - initializer_line = ccode_line;
> - g_string_free((yyvsp[0].cbuf), FALSE);
> - }
> -    break;
> -
> -  case 49:
> -#line 964 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 50:
> -#line 965 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 51:
> -#line 966 "parse.y"
> -    { destructor = NULL; }
> -    break;
> -
> -  case 52:
> -#line 967 "parse.y"
> -    { initializer = NULL; }
> -    break;
> -
> -  case 53:
> -#line 968 "parse.y"
> -    {
> - if (strcmp ((yyvsp[0].id), "GladeXML") == 0) {
> - glade_widget = TRUE;
> - } else {
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - }
> -    break;
> -
> -  case 54:
> -#line 976 "parse.y"
> -    {
> - destructor = NULL;
> - initializer = NULL;
> - }
> -    break;
> -
> -  case 55:
> -#line 982 "parse.y"
> -    {
> - push_variable((yyvsp[-2].id), the_scope,(yyvsp[-4].line), NULL);
> - }
> -    break;
> -
> -  case 56:
> -#line 985 "parse.y"
> -    {
> - push_variable((yyvsp[-3].id), the_scope, (yyvsp[-5].line), (yyvsp[-2].id));
> - }
> -    break;
> -
> -  case 57:
> -#line 990 "parse.y"
> -    {
> - Node *node = NULL;
> - if(strcmp((yyvsp[-6].id),"get")==0 &&
> -   strcmp((yyvsp[-3].id),"set")==0) {
> - Type *type = pop_type();
> - g_free ((yyvsp[-6].id));
> - g_free ((yyvsp[-3].id));
> - node = node_new (ARGUMENT_NODE,
> - "gtktype:steal", (yyvsp[-9].id),
> - "atype:steal", type,
> - "flags:steal", (yyvsp[-10].list),
> - "name:steal", (yyvsp[-8].id),
> - "get:steal", ((yyvsp[-4].cbuf))->str,
> - "get_line", (yyvsp[-5].line),
> - "set:steal", ((yyvsp[-1].cbuf))->str,
> - "set_line", (yyvsp[-2].line),
> - "line_no", (yyvsp[-11].line),
> - NULL);
> -
> - class_nodes = g_list_append(class_nodes,node);
> -
> - g_string_free ((yyvsp[-4].cbuf), FALSE);
> - g_string_free ((yyvsp[-1].cbuf), FALSE);
> -
> - } else if(strcmp((yyvsp[-6].id),"set")==0 &&
> - strcmp((yyvsp[-3].id),"get")==0) {
> - Type *type = pop_type();
> - g_free ((yyvsp[-6].id));
> - g_free ((yyvsp[-3].id));
> - node = node_new (ARGUMENT_NODE,
> - "gtktype:steal", (yyvsp[-9].id),
> - "atype:steal", type,
> - "flags:steal", (yyvsp[-10].list),
> - "name:steal", (yyvsp[-8].id),
> - "get:steal", ((yyvsp[-1].cbuf))->str,
> - "get_line", (yyvsp[-2].line),
> - "set:steal", ((yyvsp[-4].cbuf))->str,
> - "set_line", (yyvsp[-5].line),
> - "line_no", (yyvsp[-11].line),
> - NULL);
> - g_string_free ((yyvsp[-1].cbuf), FALSE);
> - g_string_free ((yyvsp[-4].cbuf), FALSE);
> - class_nodes = g_list_append(class_nodes,node);
> - } else {
> - g_free ((yyvsp[-9].id));
> - g_free ((yyvsp[-8].id));
> - g_free ((yyvsp[-6].id));
> - g_free ((yyvsp[-3].id));
> - g_list_foreach ((yyvsp[-10].list), (GFunc)g_free, NULL);
> - g_list_free ((yyvsp[-10].list));
> - g_string_free ((yyvsp[-1].cbuf), TRUE);
> - g_string_free ((yyvsp[-4].cbuf), TRUE);
> - yyerror (_("parse error"));
> - YYERROR;
> - }
> -
> - if ((yyvsp[-7].id) != NULL) {
> - Argument *arg = (Argument *)node;
> - export_accessors (arg->name,
> -  arg->get != NULL, arg->get_line,
> -  arg->set != NULL, arg->set_line,
> -  arg->atype,
> -  arg->gtktype,
> -  arg->line_no);
> - g_free ((yyvsp[-7].id));
> - }
> -
> - }
> -    break;
> -
> -  case 58:
> -#line 1058 "parse.y"
> -    {
> - Node *node = NULL;
> - if(strcmp((yyvsp[-3].id), "get") == 0) {
> - Type *type = pop_type();
> - g_free ((yyvsp[-3].id));
> - node = node_new (ARGUMENT_NODE,
> - "gtktype:steal", (yyvsp[-6].id),
> - "atype:steal", type,
> - "flags:steal", (yyvsp[-7].list),
> - "name:steal", (yyvsp[-5].id),
> - "get:steal", ((yyvsp[-1].cbuf))->str,
> - "get_line", (yyvsp[-2].line),
> - "line_no", (yyvsp[-8].line),
> - NULL);
> -
> - g_string_free ((yyvsp[-1].cbuf), FALSE);
> - class_nodes = g_list_append(class_nodes, node);
> - } else if(strcmp((yyvsp[-3].id), "set") == 0) {
> - Type *type = pop_type();
> - g_free ((yyvsp[-3].id));
> - node = node_new (ARGUMENT_NODE,
> - "gtktype:steal", (yyvsp[-6].id),
> - "atype:steal", type,
> - "flags:steal", (yyvsp[-7].list),
> - "name:steal", (yyvsp[-5].id),
> - "set:steal", ((yyvsp[-1].cbuf))->str,
> - "set_line", (yyvsp[-2].line),
> - "line_no", (yyvsp[-8].line),
> - NULL);
> -
> - g_string_free ((yyvsp[-1].cbuf), FALSE);
> - class_nodes = g_list_append (class_nodes, node);
> - } else {
> - g_free ((yyvsp[-3].id));
> - g_free ((yyvsp[-6].id));
> - g_free ((yyvsp[-5].id));
> - g_list_foreach ((yyvsp[-7].list), (GFunc)g_free, NULL);
> - g_list_free ((yyvsp[-7].list));
> - g_string_free ((yyvsp[-1].cbuf), TRUE);
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> -
> - if ((yyvsp[-4].id) != NULL) {
> - Argument *arg = (Argument *)node;
> - export_accessors (arg->name,
> -  arg->get != NULL, arg->get_line,
> -  arg->set != NULL, arg->set_line,
> -  arg->atype,
> -  arg->gtktype,
> -  arg->line_no);
> - g_free ((yyvsp[-4].id));
> - }
> - }
> -    break;
> -
> -  case 59:
> -#line 1112 "parse.y"
> -    {
> - Node *node;
> - char *get, *set = NULL;
> - Variable *var;
> - Type *type;
> - const char *root;
> -
> - if(strcmp((yyvsp[0].id), "link")!=0 &&
> -   strcmp((yyvsp[0].id), "stringlink")!=0 &&
> -   strcmp((yyvsp[0].id), "objectlink")!=0) {
> - g_free((yyvsp[0].id));
> - g_free((yyvsp[-3].id));
> - g_free((yyvsp[-2].id));
> - g_list_foreach((yyvsp[-4].list),(GFunc)g_free,NULL);
> - g_list_free((yyvsp[-4].list));
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> -
> - type = pop_type();
> -
> - var = find_var_or_die((yyvsp[-2].id), (yyvsp[-5].line));
> - if(var->scope == PRIVATE_SCOPE) {
> - root = "self->_priv";
> - } else if(var->scope == CLASS_SCOPE) {
> - root = "SELF_GET_CLASS(self)";
> - if(no_self_alias)
> - error_print(GOB_ERROR, (yyvsp[-5].line),
> -    _("Self aliases needed when autolinking to a classwide member"));
> - } else {
> - root = "self";
> - }
> -
> - if(strcmp((yyvsp[0].id), "link")==0) {
> - set = g_strdup_printf("%s->%s = ARG;",
> -      root, (yyvsp[-2].id));
> - } else if(strcmp((yyvsp[0].id), "stringlink")==0) {
> - set = g_strdup_printf("g_free (%s->%s); "
> -      "%s->%s = g_strdup (ARG);",
> -      root, (yyvsp[-2].id),
> -      root, (yyvsp[-2].id));
> - } else if(strcmp((yyvsp[0].id), "objectlink")==0) {
> - set = g_strdup_printf(
> -  "if (ARG != NULL) "
> -   "g_object_ref (G_OBJECT (ARG)); "
> -  "if (%s->%s != NULL) "
> -   "g_object_unref (G_OBJECT (%s->%s)); "
> -  "%s->%s = ARG;",
> -  root, (yyvsp[-2].id),
> -  root, (yyvsp[-2].id),
> -  root, (yyvsp[-2].id));
> - } else {
> - g_assert_not_reached();
> - }
> -
> - get = g_strdup_printf("ARG = %s->%s;", root, (yyvsp[-2].id));
> -  
> - g_free ((yyvsp[0].id));
> -
> - if (type == NULL)
> - type = (Type *)node_copy ((Node *)var->vtype);
> -
> - node = node_new (ARGUMENT_NODE,
> - "gtktype:steal", (yyvsp[-3].id),
> - "atype:steal", type,
> - "flags:steal", (yyvsp[-4].list),
> - "name:steal", (yyvsp[-2].id),
> - "get:steal", get,
> - "get_line", (yyvsp[-5].line),
> - "set:steal", set,
> - "set_line", (yyvsp[-5].line),
> - "line_no", (yyvsp[-5].line),
> - NULL);
> -
> - if ((yyvsp[-1].id) != NULL) {
> - Argument *arg = (Argument *)node;
> - export_accessors (arg->name,
> -  arg->get != NULL, arg->get_line,
> -  arg->set != NULL, arg->set_line,
> -  arg->atype,
> -  arg->gtktype,
> -  arg->line_no);
> - g_free ((yyvsp[-1].id));
> - }
> -
> - class_nodes = g_list_append (class_nodes, node);
> - }
> -    break;
> -
> -  case 60:
> -#line 1201 "parse.y"
> -    {
> - if (strcmp ((yyvsp[-1].id), "export")!=0) {
> - g_free ((yyvsp[-1].id));
> - yyerror (_("parse error"));
> - YYERROR;
> - }
> - (yyval.id) = (yyvsp[-1].id);
> - }
> -    break;
> -
> -  case 61:
> -#line 1209 "parse.y"
> -    {
> - (yyval.id) = NULL;
> - }
> -    break;
> -
> -  case 62:
> -#line 1214 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "line_no", (yyvsp[-10].line),
> -  "gtktype:steal", debool ((yyvsp[-9].id)),
> -  "name:steal", (yyvsp[-8].id),
> -  NULL);
> - if (strcmp ((yyvsp[-6].id), "get") == 0 &&
> -    strcmp ((yyvsp[-3].id), "set") == 0) {
> - node_set ((Node *)property,
> -  "get:steal", ((yyvsp[-4].cbuf))->str,
> -  "get_line", (yyvsp[-5].line),
> -  "set:steal", ((yyvsp[-1].cbuf))->str,
> -  "set_line", (yyvsp[-2].line),
> -  NULL);
> - g_string_free ((yyvsp[-4].cbuf), FALSE);
> - g_string_free ((yyvsp[-1].cbuf), FALSE);
> - g_free ((yyvsp[-6].id));
> - g_free ((yyvsp[-3].id));
> - } else if (strcmp ((yyvsp[-6].id), "set") == 0 &&
> -   strcmp ((yyvsp[-3].id), "get") == 0) {
> - node_set ((Node *)property,
> -  "get:steal", ((yyvsp[-1].cbuf))->str,
> -  "get_line", (yyvsp[-2].line),
> -  "set:steal", ((yyvsp[-4].cbuf))->str,
> -  "set_line", (yyvsp[-5].line),
> -  NULL);
> - g_string_free ((yyvsp[-4].cbuf), FALSE);
> - g_string_free ((yyvsp[-1].cbuf), FALSE);
> - g_free ((yyvsp[-6].id));
> - g_free ((yyvsp[-3].id));
> - } else {
> - g_string_free ((yyvsp[-4].cbuf), TRUE);
> - g_string_free ((yyvsp[-1].cbuf), TRUE);
> - g_free ((yyvsp[-6].id));
> - g_free ((yyvsp[-3].id));
> - node_free ((Node *)property);
> - property = NULL;
> - yyerror (_("parse error"));
> - YYERROR;
> - }
> - property_link_and_export ((Node *)property);
> - if (property != NULL) {
> - class_nodes = g_list_append (class_nodes,
> -     property);
> - property = NULL;
> - }
> - }
> -    break;
> -
> -  case 63:
> -#line 1262 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "line_no", (yyvsp[-7].line),
> -  "gtktype:steal", debool ((yyvsp[-6].id)),
> -  "name:steal", (yyvsp[-5].id),
> -  NULL);
> - if (strcmp ((yyvsp[-3].id), "get") == 0) {
> - node_set ((Node *)property,
> -  "get:steal", ((yyvsp[-1].cbuf))->str,
> -  "get_line", (yyvsp[-2].line),
> -  NULL);
> - g_string_free ((yyvsp[-1].cbuf), FALSE);
> - g_free ((yyvsp[-3].id));
> - } else if (strcmp ((yyvsp[-3].id), "set") == 0) {
> - node_set ((Node *)property,
> -  "set:steal", ((yyvsp[-1].cbuf))->str,
> -  "set_line", (yyvsp[-2].line),
> -  NULL);
> - g_string_free ((yyvsp[-1].cbuf), FALSE);
> - g_free ((yyvsp[-3].id));
> - } else {
> - g_string_free ((yyvsp[-1].cbuf), TRUE);
> - g_free ((yyvsp[-3].id));
> - node_free ((Node *)property);
> - property = NULL;
> - yyerror (_("parse error"));
> - YYERROR;
> - }
> - property_link_and_export ((Node *)property);
> - if (property != NULL) {
> - class_nodes = g_list_append (class_nodes,
> -     property);
> - property = NULL;
> - }
> - }
> -    break;
> -
> -  case 64:
> -#line 1298 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "line_no", (yyvsp[-4].line),
> -  "gtktype:steal", debool ((yyvsp[-3].id)),
> -  "name:steal", (yyvsp[-2].id),
> -  NULL);
> - property_link_and_export ((Node *)property);
> - if (property != NULL) {
> - class_nodes = g_list_append (class_nodes,
> -     property);
> - property = NULL;
> - }
> - }
> -    break;
> -
> -  case 65:
> -#line 1314 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 66:
> -#line 1315 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 67:
> -#line 1318 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 68:
> -#line 1319 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 69:
> -#line 1322 "parse.y"
> -    { (yyval.id) = (yyvsp[0].id); }
> -    break;
> -
> -  case 70:
> -#line 1323 "parse.y"
> -    {
> - if (strcmp ((yyvsp[-3].id), "_") != 0) {
> - g_free ((yyvsp[-3].id));
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - g_free ((yyvsp[-3].id));
> - (yyval.id) = g_strconcat ("_(", (yyvsp[-1].id), ")", NULL);
> - g_free ((yyvsp[-1].id));
> - }
> -    break;
> -
> -  case 71:
> -#line 1335 "parse.y"
> -    { (yyval.id) = (yyvsp[0].id); }
> -    break;
> -
> -  case 72:
> -#line 1336 "parse.y"
> -    { (yyval.id) = (yyvsp[0].id); }
> -    break;
> -
> -  case 73:
> -#line 1339 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "nick:steal", (yyvsp[0].id),
> -  NULL);
> -  }
> -    break;
> -
> -  case 74:
> -#line 1345 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "blurb:steal", (yyvsp[0].id),
> -  NULL);
> -  }
> -    break;
> -
> -  case 75:
> -#line 1351 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "maximum:steal", (yyvsp[0].id),
> -  NULL);
> -  }
> -    break;
> -
> -  case 76:
> -#line 1357 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "minimum:steal", (yyvsp[0].id),
> -  NULL);
> -  }
> -    break;
> -
> -  case 77:
> -#line 1363 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "default_value:steal", (yyvsp[0].id),
> -  NULL);
> -  }
> -    break;
> -
> -  case 78:
> -#line 1369 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "flags:steal", (yyvsp[0].list),
> -  NULL);
> -  }
> -    break;
> -
> -  case 79:
> -#line 1375 "parse.y"
> -    {
> - Type *type = pop_type ();
> - ensure_property ();
> - node_set ((Node *)property,
> -  "ptype:steal", type,
> -  NULL);
> -  }
> -    break;
> -
> -  case 80:
> -#line 1382 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "extra_gtktype:steal", (yyvsp[0].id),
> -  NULL);
> -  }
> -    break;
> -
> -  case 81:
> -#line 1388 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "extra_gtktype:steal", (yyvsp[0].id),
> -  NULL);
> -  }
> -    break;
> -
> -  case 82:
> -#line 1394 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "extra_gtktype:steal", (yyvsp[0].id),
> -  NULL);
> -  }
> -    break;
> -
> -  case 83:
> -#line 1400 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "extra_gtktype:steal", (yyvsp[0].id),
> -  NULL);
> -  }
> -    break;
> -
> -  case 84:
> -#line 1406 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "extra_gtktype:steal", (yyvsp[0].id),
> -  NULL);
> -  }
> -    break;
> -
> -  case 85:
> -#line 1412 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "extra_gtktype:steal", (yyvsp[0].id),
> -  NULL);
> -  }
> -    break;
> -
> -  case 86:
> -#line 1418 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "extra_gtktype:steal", (yyvsp[0].id),
> -  NULL);
> -  }
> -    break;
> -
> -  case 87:
> -#line 1424 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "extra_gtktype:steal", (yyvsp[0].id),
> -  NULL);
> -  }
> -    break;
> -
> -  case 88:
> -#line 1430 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "extra_gtktype:steal", (yyvsp[0].id),
> -  NULL);
> -  }
> -    break;
> -
> -  case 89:
> -#line 1436 "parse.y"
> -    {
> - ensure_property ();
> - node_set ((Node *)property,
> -  "extra_gtktype:steal", (yyvsp[0].id),
> -  NULL);
> -  }
> -    break;
> -
> -  case 90:
> -#line 1442 "parse.y"
> -    {
> - ensure_property ();
> - if (strcmp ((yyvsp[0].id), "override") == 0) {
> - g_free((yyvsp[0].id));
> - node_set ((Node *)property,
> -  "override", TRUE,
> -  NULL);
> - } else if (strcmp ((yyvsp[0].id), "link") == 0) {
> - g_free((yyvsp[0].id));
> - node_set ((Node *)property,
> -  "link", TRUE,
> -  NULL);
> - } else if (strcmp ((yyvsp[0].id), "export") == 0) {
> - g_free((yyvsp[0].id));
> - node_set ((Node *)property,
> -  "export", TRUE,
> -  NULL);
> - } else {
> - g_free((yyvsp[0].id));
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> -  }
> -    break;
> -
> -  case 91:
> -#line 1467 "parse.y"
> -    {
> - if(strcmp((yyvsp[-2].id),"type")!=0) {
> - g_free((yyvsp[-4].id));
> - g_free((yyvsp[-2].id));
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - (yyval.id) = debool ((yyvsp[-4].id));
> - }
> -    break;
> -
> -  case 92:
> -#line 1476 "parse.y"
> -    {
> - (yyval.id) = debool ((yyvsp[0].id));
> - typestack = g_list_prepend(typestack,NULL);
> - }
> -    break;
> -
> -  case 93:
> -#line 1482 "parse.y"
> -    { (yyval.list) = (yyvsp[-1].list); }
> -    break;
> -
> -  case 94:
> -#line 1483 "parse.y"
> -    { (yyval.list) = NULL; }
> -    break;
> -
> -  case 95:
> -#line 1486 "parse.y"
> -    {
> - (yyval.list) = g_list_append((yyvsp[0].list),(yyvsp[-2].id));
> - }
> -    break;
> -
> -  case 96:
> -#line 1489 "parse.y"
> -    {
> - (yyval.list) = g_list_append(NULL,(yyvsp[0].id));
> - }
> -    break;
> -
> -  case 97:
> -#line 1495 "parse.y"
> -    {
> - Node *node = node_new (TYPE_NODE,
> -       "name:steal", (yyvsp[-1].id),
> -       "pointer:steal", (yyvsp[0].id),
> -       NULL);
> - typestack = g_list_prepend(typestack,node);
> - }
> -    break;
> -
> -  case 98:
> -#line 1502 "parse.y"
> -    {
> - Node *node = node_new (TYPE_NODE,
> -       "name:steal", (yyvsp[0].id),
> -       NULL);
> - typestack = g_list_prepend(typestack,node);
> - }
> -    break;
> -
> -  case 99:
> -#line 1511 "parse.y"
> -    {
> - (yyval.id) = (yyvsp[0].id);
> - }
> -    break;
> -
> -  case 100:
> -#line 1514 "parse.y"
> -    {
> - (yyval.id) = (yyvsp[0].id);
> - }
> -    break;
> -
> -  case 101:
> -#line 1517 "parse.y"
> -    {
> - (yyval.id) = g_strconcat("const ", (yyvsp[0].id), NULL);
> - g_free((yyvsp[0].id));
> - }
> -    break;
> -
> -  case 102:
> -#line 1521 "parse.y"
> -    {
> - (yyval.id) = g_strconcat((yyvsp[-1].id), " const", NULL);
> - g_free((yyvsp[-1].id));
> - }
> -    break;
> -
> -  case 103:
> -#line 1525 "parse.y"
> -    {
> - (yyval.id) = g_strconcat((yyvsp[-1].id), " ", (yyvsp[0].id), NULL);
> - g_free((yyvsp[0].id));
> - }
> -    break;
> -
> -  case 104:
> -#line 1529 "parse.y"
> -    {
> - (yyval.id) = g_strconcat("const ", (yyvsp[-1].id), " ",
> -     (yyvsp[0].id), NULL);
> - g_free((yyvsp[0].id));
> - }
> -    break;
> -
> -  case 105:
> -#line 1534 "parse.y"
> -    {
> - (yyval.id) = g_strconcat((yyvsp[-2].id), " ",
> -     (yyvsp[-1].id), " const", NULL);
> - g_free((yyvsp[-1].id));
> - }
> -    break;
> -
> -  case 106:
> -#line 1542 "parse.y"
> -    {
> - (yyval.id) = g_strconcat((yyvsp[-1].id), " ", (yyvsp[0].id), NULL);
> - g_free((yyvsp[0].id));
> - }
> -    break;
> -
> -  case 107:
> -#line 1546 "parse.y"
> -    {
> - (yyval.id) = g_strconcat((yyvsp[-1].id), " ", (yyvsp[0].id), NULL);
> - g_free((yyvsp[-1].id));
> - g_free((yyvsp[0].id));
> - }
> -    break;
> -
> -  case 108:
> -#line 1551 "parse.y"
> -    {
> - (yyval.id) = g_strconcat("const ", (yyvsp[0].id), NULL);
> - g_free((yyvsp[0].id));
> - }
> -    break;
> -
> -  case 109:
> -#line 1555 "parse.y"
> -    {
> - (yyval.id) = (yyvsp[0].id);
> - }
> -    break;
> -
> -  case 110:
> -#line 1558 "parse.y"
> -    {
> - (yyval.id) = g_strconcat((yyvsp[-1].id), " const", NULL);
> - g_free((yyvsp[-1].id));
> - }
> -    break;
> -
> -  case 111:
> -#line 1562 "parse.y"
> -    {
> - (yyval.id) = g_strdup((yyvsp[0].id));
> - }
> -    break;
> -
> -  case 112:
> -#line 1565 "parse.y"
> -    {
> - (yyval.id) = g_strconcat((yyvsp[-1].id), " const", NULL);
> - }
> -    break;
> -
> -  case 113:
> -#line 1570 "parse.y"
> -    { (yyval.id) = "void"; }
> -    break;
> -
> -  case 114:
> -#line 1571 "parse.y"
> -    { (yyval.id) = "char"; }
> -    break;
> -
> -  case 115:
> -#line 1572 "parse.y"
> -    { (yyval.id) = "short"; }
> -    break;
> -
> -  case 116:
> -#line 1573 "parse.y"
> -    { (yyval.id) = "int"; }
> -    break;
> -
> -  case 117:
> -#line 1574 "parse.y"
> -    { (yyval.id) = "long"; }
> -    break;
> -
> -  case 118:
> -#line 1575 "parse.y"
> -    { (yyval.id) = "float"; }
> -    break;
> -
> -  case 119:
> -#line 1576 "parse.y"
> -    { (yyval.id) = "double"; }
> -    break;
> -
> -  case 120:
> -#line 1577 "parse.y"
> -    { (yyval.id) = "signed"; }
> -    break;
> -
> -  case 121:
> -#line 1578 "parse.y"
> -    { (yyval.id) = "unsigned"; }
> -    break;
> -
> -  case 122:
> -#line 1581 "parse.y"
> -    { (yyval.id) = "struct"; }
> -    break;
> -
> -  case 123:
> -#line 1582 "parse.y"
> -    { (yyval.id) = "union"; }
> -    break;
> -
> -  case 124:
> -#line 1583 "parse.y"
> -    { (yyval.id) = "enum"; }
> -    break;
> -
> -  case 125:
> -#line 1586 "parse.y"
> -    { (yyval.id) = g_strdup("*"); }
> -    break;
> -
> -  case 126:
> -#line 1587 "parse.y"
> -    { (yyval.id) = g_strdup("* const"); }
> -    break;
> -
> -  case 127:
> -#line 1588 "parse.y"
> -    {
> - (yyval.id) = g_strconcat("*", (yyvsp[0].id), NULL);
> - g_free((yyvsp[0].id));
> - }
> -    break;
> -
> -  case 128:
> -#line 1592 "parse.y"
> -    {
> - (yyval.id) = g_strconcat("* const", (yyvsp[0].id), NULL);
> - g_free((yyvsp[0].id));
> - }
> -    break;
> -
> -  case 129:
> -#line 1599 "parse.y"
> -    {
> - if(strcmp((yyvsp[-1].id), "first")==0)
> - (yyval.sigtype) = SIGNAL_FIRST_METHOD;
> - else if(strcmp((yyvsp[-1].id), "last")==0)
> - (yyval.sigtype) = SIGNAL_LAST_METHOD;
> - else {
> - yyerror(_("signal must be 'first' or 'last'"));
> - g_free((yyvsp[-1].id));
> - YYERROR;
> - }
> - g_free((yyvsp[-1].id));
> - }
> -    break;
> -
> -  case 130:
> -#line 1611 "parse.y"
> -    {
> - (yyval.sigtype) = SIGNAL_LAST_METHOD;
> - }
> -    break;
> -
> -  case 131:
> -#line 1617 "parse.y"
> -    {
> - if(strcmp((yyvsp[-1].id),"first")==0)
> - (yyval.sigtype) = SIGNAL_FIRST_METHOD;
> - else if(strcmp((yyvsp[-1].id),"last")==0)
> - (yyval.sigtype) = SIGNAL_LAST_METHOD;
> - else {
> - yyerror(_("signal must be 'first' or 'last'"));
> - g_free((yyvsp[-1].id));
> - YYERROR;
> - }
> - g_free((yyvsp[-1].id));
> - }
> -    break;
> -
> -  case 132:
> -#line 1629 "parse.y"
> -    {
> - if(strcmp((yyvsp[-2].id),"first")==0)
> - (yyval.sigtype) = SIGNAL_FIRST_METHOD;
> - else if(strcmp((yyvsp[-2].id),"last")==0)
> - (yyval.sigtype) = SIGNAL_LAST_METHOD;
> - else {
> - yyerror(_("signal must be 'first' or 'last'"));
> - g_free((yyvsp[-2].id));
> - YYERROR;
> - }
> - g_free((yyvsp[-2].id));
> - }
> -    break;
> -
> -  case 133:
> -#line 1641 "parse.y"
> -    {
> - (yyval.sigtype) = SIGNAL_LAST_METHOD;
> - }
> -    break;
> -
> -  case 134:
> -#line 1644 "parse.y"
> -    {
> - /* the_scope was default thus public */
> - the_scope = PUBLIC_SCOPE;
> - }
> -    break;
> -
> -  case 135:
> -#line 1650 "parse.y"
> -    {
> - gtktypes = g_list_prepend(gtktypes, debool ((yyvsp[-3].id)));
> - }
> -    break;
> -
> -  case 136:
> -#line 1655 "parse.y"
> -    {
> - gtktypes = g_list_append(gtktypes, debool ((yyvsp[0].id)));
> - }
> -    break;
> -
> -  case 137:
> -#line 1658 "parse.y"
> -    {
> - gtktypes = g_list_append(gtktypes, debool ((yyvsp[0].id)));
> -       }
> -    break;
> -
> -  case 138:
> -#line 1663 "parse.y"
> -    { (yyval.cbuf) = (yyvsp[0].cbuf); }
> -    break;
> -
> -  case 139:
> -#line 1664 "parse.y"
> -    { (yyval.cbuf) = NULL; }
> -    break;
> -
> -  case 140:
> -#line 1668 "parse.y"
> -    {
> - if(!has_self) {
> - yyerror(_("signal without 'self' as "
> -  "first parameter"));
> - free_all_global_state();
> - YYERROR;
> - }
> - if(the_scope == CLASS_SCOPE) {
> - yyerror(_("a method cannot be of class scope"));
> - free_all_global_state();
> - YYERROR;
> - }
> - push_function(the_scope, (yyvsp[-7].sigtype),NULL,
> -      (yyvsp[-5].id), (yyvsp[0].cbuf),(yyvsp[-9].line),
> -      ccode_line, vararg, (yyvsp[-8].list));
> - }
> -    break;
> -
> -  case 141:
> -#line 1684 "parse.y"
> -    {
> - if(!has_self) {
> - yyerror(_("signal without 'self' as "
> -  "first parameter"));
> - free_all_global_state();
> - YYERROR;
> - }
> - if(the_scope == CLASS_SCOPE) {
> - yyerror(_("a method cannot be of class scope"));
> - free_all_global_state();
> - YYERROR;
> - }
> - push_function(the_scope, (yyvsp[-7].sigtype), NULL,
> -      (yyvsp[-5].id), (yyvsp[0].cbuf), (yyvsp[-9].line),
> -      ccode_line, vararg, (yyvsp[-8].list));
> - }
> -    break;
> -
> -  case 142:
> -#line 1700 "parse.y"
> -    {
> - if(!has_self) {
> - yyerror(_("virtual method without 'self' as "
> -  "first parameter"));
> - free_all_global_state();
> - YYERROR;
> - }
> - if(the_scope == CLASS_SCOPE) {
> - yyerror(_("a method cannot be of class scope"));
> - free_all_global_state();
> - YYERROR;
> - }
> - push_function(the_scope, VIRTUAL_METHOD, NULL, (yyvsp[-5].id),
> -      (yyvsp[0].cbuf), (yyvsp[-8].line),
> -      ccode_line, vararg, NULL);
> - }
> -    break;
> -
> -  case 143:
> -#line 1716 "parse.y"
> -    {
> - if(!has_self) {
> - yyerror(_("virtual method without 'self' as "
> -  "first parameter"));
> - free_all_global_state();
> - YYERROR;
> - }
> - if(the_scope == CLASS_SCOPE) {
> - yyerror(_("a method cannot be of class scope"));
> - free_all_global_state();
> - YYERROR;
> - }
> - push_function(the_scope, VIRTUAL_METHOD, NULL, (yyvsp[-5].id),
> -      (yyvsp[0].cbuf), (yyvsp[-7].line),
> -      ccode_line, vararg, NULL);
> - }
> -    break;
> -
> -  case 144:
> -#line 1732 "parse.y"
> -    {
> - if(!has_self) {
> - yyerror(_("virtual method without 'self' as "
> -  "first parameter"));
> - free_all_global_state();
> - YYERROR;
> - }
> - push_function(PUBLIC_SCOPE, VIRTUAL_METHOD, NULL,
> -      (yyvsp[-5].id), (yyvsp[0].cbuf), (yyvsp[-7].line),
> -      ccode_line, vararg, NULL);
> - }
> -    break;
> -
> -  case 145:
> -#line 1743 "parse.y"
> -    {
> - push_function(NO_SCOPE, OVERRIDE_METHOD, (yyvsp[-8].id),
> -      (yyvsp[-5].id), (yyvsp[0].cbuf),
> -      (yyvsp[-10].line), ccode_line,
> -      vararg, NULL);
> - }
> -    break;
> -
> -  case 146:
> -#line 1749 "parse.y"
> -    {
> - if(the_scope == CLASS_SCOPE) {
> - yyerror(_("a method cannot be of class scope"));
> - free_all_global_state();
> - YYERROR;
> - }
> - push_function(the_scope, REGULAR_METHOD, NULL, (yyvsp[-5].id),
> -      (yyvsp[0].cbuf), (yyvsp[-7].line), ccode_line,
> -      vararg, NULL);
> - }
> -    break;
> -
> -  case 147:
> -#line 1759 "parse.y"
> -    {
> - if(strcmp((yyvsp[-4].id), "init")==0) {
> - push_init_arg((yyvsp[-2].id),FALSE);
> - push_function(NO_SCOPE, INIT_METHOD, NULL,
> -      (yyvsp[-4].id), (yyvsp[0].cbuf), (yyvsp[-3].line),
> -      ccode_line, FALSE, NULL);
> - } else if(strcmp((yyvsp[-4].id), "class_init")==0) {
> - push_init_arg((yyvsp[-2].id),TRUE);
> - push_function(NO_SCOPE, CLASS_INIT_METHOD, NULL,
> -      (yyvsp[-4].id), (yyvsp[0].cbuf), (yyvsp[-3].line),
> -      ccode_line, FALSE, NULL);
> - } else {
> - g_free((yyvsp[-4].id));
> - g_free((yyvsp[-2].id));
> - g_string_free((yyvsp[0].cbuf),TRUE);
> - yyerror(_("parse error "
> -  "(untyped blocks must be init or "
> -  "class_init)"));
> - YYERROR;
> - }
> - }
> -    break;
> -
> -  case 148:
> -#line 1782 "parse.y"
> -    {
> - g_free(onerror); onerror = NULL;
> - g_free(defreturn); defreturn = NULL;
> - if(!set_return_value((yyvsp[-1].id), (yyvsp[0].id))) {
> - g_free((yyvsp[-1].id));
> - g_free((yyvsp[0].id));
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - g_free((yyvsp[-1].id));
> - }
> -    break;
> -
> -  case 149:
> -#line 1793 "parse.y"
> -    {
> - g_free(onerror); onerror = NULL;
> - g_free(defreturn); defreturn = NULL;
> - if(!set_return_value((yyvsp[-3].id), (yyvsp[-2].id))) {
> - g_free((yyvsp[-3].id)); g_free((yyvsp[-2].id));
> - g_free((yyvsp[-1].id)); g_free((yyvsp[0].id));
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - if(!set_return_value((yyvsp[-1].id), (yyvsp[0].id))) {
> - onerror = defreturn = NULL;
> - g_free((yyvsp[-3].id)); g_free((yyvsp[-2].id));
> - g_free((yyvsp[-1].id)); g_free((yyvsp[0].id));
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - g_free((yyvsp[-3].id));
> - g_free((yyvsp[-1].id));
> - }
> -    break;
> -
> -  case 150:
> -#line 1812 "parse.y"
> -    {
> - g_free(onerror); onerror = NULL;
> - g_free(defreturn); defreturn = NULL;
> - }
> -    break;
> -
> -  case 151:
> -#line 1818 "parse.y"
> -    { (yyval.id) = (yyvsp[0].id); }
> -    break;
> -
> -  case 152:
> -#line 1819 "parse.y"
> -    {
> - (yyval.id) = ((yyvsp[0].cbuf))->str;
> - g_string_free((yyvsp[0].cbuf), FALSE);
> - }
> -    break;
> -
> -  case 153:
> -#line 1825 "parse.y"
> -    { vararg = FALSE; has_self = FALSE; }
> -    break;
> -
> -  case 154:
> -#line 1826 "parse.y"
> -    {
> - vararg = FALSE;
> - has_self = TRUE;
> - if(strcmp((yyvsp[0].id),"self")==0)
> - push_self((yyvsp[0].id), FALSE);
> - else {
> - g_free((yyvsp[0].id));
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> -       }
> -    break;
> -
> -  case 155:
> -#line 1837 "parse.y"
> -    {
> - vararg = FALSE;
> - has_self = TRUE;
> - if(strcmp((yyvsp[-1].id),"self")==0)
> - push_self((yyvsp[-1].id), TRUE);
> - else {
> - g_free((yyvsp[-1].id));
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> -       }
> -    break;
> -
> -  case 156:
> -#line 1848 "parse.y"
> -    {
> - vararg = FALSE;
> - has_self = TRUE;
> - if(strcmp((yyvsp[0].id),"self")==0)
> - push_self((yyvsp[0].id), TRUE);
> - else {
> - g_free((yyvsp[0].id));
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> -       }
> -    break;
> -
> -  case 157:
> -#line 1859 "parse.y"
> -    {
> - has_self = TRUE;
> - if(strcmp((yyvsp[-2].id),"self")==0)
> - push_self((yyvsp[-2].id), FALSE);
> - else {
> - g_free((yyvsp[-2].id));
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - }
> -    break;
> -
> -  case 158:
> -#line 1869 "parse.y"
> -    {
> - has_self = TRUE;
> - if(strcmp((yyvsp[-3].id),"self")==0)
> - push_self((yyvsp[-3].id), TRUE);
> - else {
> - g_free((yyvsp[-3].id));
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - }
> -    break;
> -
> -  case 159:
> -#line 1879 "parse.y"
> -    {
> - has_self = TRUE;
> - if(strcmp((yyvsp[-2].id),"self")==0)
> - push_self((yyvsp[-2].id), TRUE);
> - else {
> - g_free((yyvsp[-2].id));
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - }
> -    break;
> -
> -  case 160:
> -#line 1889 "parse.y"
> -    { has_self = FALSE; }
> -    break;
> -
> -  case 161:
> -#line 1892 "parse.y"
> -    { vararg = TRUE; }
> -    break;
> -
> -  case 162:
> -#line 1893 "parse.y"
> -    { vararg = FALSE; }
> -    break;
> -
> -  case 163:
> -#line 1896 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 164:
> -#line 1897 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 165:
> -#line 1900 "parse.y"
> -    {
> - push_funcarg((yyvsp[0].id),NULL);
> - }
> -    break;
> -
> -  case 166:
> -#line 1903 "parse.y"
> -    {
> - push_funcarg((yyvsp[-1].id),(yyvsp[0].id));
> - }
> -    break;
> -
> -  case 167:
> -#line 1906 "parse.y"
> -    {
> - if(strcmp((yyvsp[-2].id),"check")!=0) {
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - g_free((yyvsp[-2].id));
> - push_funcarg((yyvsp[-4].id),NULL);
> - }
> -    break;
> -
> -  case 168:
> -#line 1914 "parse.y"
> -    {
> - if(strcmp((yyvsp[-2].id),"check")!=0) {
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - g_free((yyvsp[-2].id));
> - push_funcarg((yyvsp[-5].id),(yyvsp[-4].id));
> - }
> -    break;
> -
> -  case 169:
> -#line 1924 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 170:
> -#line 1925 "parse.y"
> -    { ; }
> -    break;
> -
> -  case 171:
> -#line 1928 "parse.y"
> -    {
> - if(strcmp((yyvsp[0].id),"type")==0) {
> - Node *node = node_new (CHECK_NODE,
> -       "chtype", TYPE_CHECK,
> -       NULL);
> - checks = g_list_append(checks,node);
> - } else if(strcmp((yyvsp[0].id),"null")==0) {
> - Node *node = node_new (CHECK_NODE,
> -       "chtype", NULL_CHECK,
> -       NULL);
> - checks = g_list_append(checks,node);
> - } else {
> - yyerror(_("parse error"));
> - YYERROR;
> - }
> - g_free((yyvsp[0].id));
> - }
> -    break;
> -
> -  case 172:
> -#line 1945 "parse.y"
> -    {
> - Node *node = node_new (CHECK_NODE,
> -       "chtype", GT_CHECK,
> -       "number:steal", (yyvsp[0].id),
> -       NULL);
> - checks = g_list_append(checks,node);
> - }
> -    break;
> -
> -  case 173:
> -#line 1952 "parse.y"
> -    {
> - Node *node = node_new (CHECK_NODE,
> -       "chtype", LT_CHECK,
> -       "number:steal", (yyvsp[0].id),
> -       NULL);
> - checks = g_list_append(checks,node);
> - }
> -    break;
> -
> -  case 174:
> -#line 1959 "parse.y"
> -    {
> - Node *node = node_new (CHECK_NODE,
> -       "chtype", GE_CHECK,
> -       "number:steal", (yyvsp[0].id),
> -       NULL);
> - checks = g_list_append(checks,node);
> - }
> -    break;
> -
> -  case 175:
> -#line 1966 "parse.y"
> -    {
> - Node *node = node_new (CHECK_NODE,
> -       "chtype", LE_CHECK,
> -       "number:steal", (yyvsp[0].id),
> -       NULL);
> - checks = g_list_append(checks,node);
> - }
> -    break;
> -
> -  case 176:
> -#line 1973 "parse.y"
> -    {
> - Node *node = node_new (CHECK_NODE,
> -       "chtype", EQ_CHECK,
> -       "number:steal", (yyvsp[0].id),
> -       NULL);
> - checks = g_list_append(checks,node);
> - }
> -    break;
> -
> -  case 177:
> -#line 1980 "parse.y"
> -    {
> - Node *node = node_new (CHECK_NODE,
> -       "chtype", NE_CHECK,
> -       "number:steal", (yyvsp[0].id),
> -       NULL);
> - checks = g_list_append(checks,node);
> - }
> -    break;
> -
> -  case 178:
> -#line 1989 "parse.y"
> -    {
> - Node *node = node_new (ENUMDEF_NODE,
> -       "etype:steal", (yyvsp[-1].id),
> -       "prefix:steal", (yyvsp[-5].id),
> -       "values:steal", enum_vals,
> -       NULL);
> - enum_vals = NULL;
> - nodes = g_list_append (nodes, node);
> - }
> -    break;
> -
> -  case 179:
> -#line 1998 "parse.y"
> -    {
> - Node *node = node_new (ENUMDEF_NODE,
> -       "etype:steal", (yyvsp[-1].id),
> -       "prefix:steal", (yyvsp[-6].id),
> -       "values:steal", enum_vals,
> -       NULL);
> - enum_vals = NULL;
> - nodes = g_list_append (nodes, node);
> - }
> -    break;
> -
> -  case 180:
> -#line 2009 "parse.y"
> -    {;}
> -    break;
> -
> -  case 181:
> -#line 2010 "parse.y"
> -    {;}
> -    break;
> -
> -  case 182:
> -#line 2013 "parse.y"
> -    {
> - Node *node;
> - char *num = (yyvsp[0].id);
> -
> - /* A float value, that's a bad enum */
> - if (num[0] >= '0' &&
> -    num[0] <= '9' &&
> -    strchr (num, '.') != NULL) {
> - g_free ((yyvsp[-2].id));
> - g_free (num);
> - yyerror(_("parse error (enumerator value not integer constant)"));
> - YYERROR;
> - }
> -      
> - node = node_new (ENUMVALUE_NODE,
> - "name:steal", (yyvsp[-2].id),
> - "value:steal", num,
> - NULL);
> - enum_vals = g_list_append (enum_vals, node);
> - }
> -    break;
> -
> -  case 183:
> -#line 2033 "parse.y"
> -    {
> - Node *node;
> -
> - node = node_new (ENUMVALUE_NODE,
> - "name:steal", (yyvsp[0].id),
> - NULL);
> - enum_vals = g_list_append (enum_vals, node);
> - }
> -    break;
> -
> -  case 184:
> -#line 2043 "parse.y"
> -    {
> - Node *node = node_new (FLAGS_NODE,
> -       "ftype:steal", (yyvsp[-1].id),
> -       "prefix:steal", (yyvsp[-5].id),
> -       "values:steal", flag_vals,
> -       NULL);
> - flag_vals = NULL;
> - nodes = g_list_append (nodes, node);
> - }
> -    break;
> -
> -  case 185:
> -#line 2052 "parse.y"
> -    {
> - Node *node = node_new (FLAGS_NODE,
> -       "ftype:steal", (yyvsp[-1].id),
> -       "prefix:steal", (yyvsp[-6].id),
> -       "values:steal", flag_vals,
> -       NULL);
> - flag_vals = NULL;
> - nodes = g_list_append (nodes, node);
> - }
> -    break;
> -
> -  case 186:
> -#line 2063 "parse.y"
> -    {
> - flag_vals = g_list_append (flag_vals, (yyvsp[0].id));
> - }
> -    break;
> -
> -  case 187:
> -#line 2066 "parse.y"
> -    {
> - flag_vals = g_list_append (flag_vals, (yyvsp[0].id));
> - }
> -    break;
> -
> -  case 188:
> -#line 2071 "parse.y"
> -    {
> - Node *node = node_new (ERROR_NODE,
> -       "etype:steal", (yyvsp[-1].id),
> -       "prefix:steal", (yyvsp[-5].id),
> -       "values:steal", error_vals,
> -       NULL);
> - error_vals = NULL;
> - nodes = g_list_append (nodes, node);
> - }
> -    break;
> -
> -  case 189:
> -#line 2080 "parse.y"
> -    {
> - Node *node = node_new (ERROR_NODE,
> -       "etype:steal", (yyvsp[-1].id),
> -       "prefix:steal", (yyvsp[-6].id),
> -       "values:steal", error_vals,
> -       NULL);
> - error_vals = NULL;
> - nodes = g_list_append (nodes, node);
> - }
> -    break;
> -
> -  case 190:
> -#line 2091 "parse.y"
> -    {
> - error_vals = g_list_append (error_vals, (yyvsp[0].id));
> - }
> -    break;
> -
> -  case 191:
> -#line 2094 "parse.y"
> -    {
> - error_vals = g_list_append (error_vals, (yyvsp[0].id));
> - }
> -    break;
> -
> -  case 192:
> -#line 2100 "parse.y"
> -    { (yyval.id) = (yyvsp[0].id); }
> -    break;
> -
> -  case 193:
> -#line 2101 "parse.y"
> -    {
> - (yyval.id) = g_strconcat("-",(yyvsp[0].id),NULL);
> - g_free((yyvsp[0].id));
> - }
> -    break;
> -
> -  case 194:
> -#line 2105 "parse.y"
> -    { (yyval.id) = (yyvsp[0].id); }
> -    break;
> -
> -  case 195:
> -#line 2106 "parse.y"
> -    { (yyval.id) = (yyvsp[0].id); }
> -    break;
> -
> -
> -    }
> -
> -/* Line 1037 of yacc.c.  */
> -#line 4252 "y.tab.c"
> -
> -  yyvsp -= yylen;
> -  yyssp -= yylen;
> -
> -
> -  YY_STACK_PRINT (yyss, yyssp);
> -
> -  *++yyvsp = yyval;
> -
> -
> -  /* Now `shift' the result of the reduction.  Determine what state
> -     that goes to, based on the state we popped back to and the rule
> -     number reduced by.  */
> -
> -  yyn = yyr1[yyn];
> -
> -  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
> -  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
> -    yystate = yytable[yystate];
> -  else
> -    yystate = yydefgoto[yyn - YYNTOKENS];
> -
> -  goto yynewstate;
> -
> -
> -/*------------------------------------.
> -| yyerrlab -- here on detecting error |
> -`------------------------------------*/
> -yyerrlab:
> -  /* If not already recovering from an error, report this error.  */
> -  if (!yyerrstatus)
> -    {
> -      ++yynerrs;
> -#if YYERROR_VERBOSE
> -      yyn = yypact[yystate];
> -
> -      if (YYPACT_NINF < yyn && yyn < YYLAST)
> - {
> -  YYSIZE_T yysize = 0;
> -  int yytype = YYTRANSLATE (yychar);
> -  const char* yyprefix;
> -  char *yymsg;
> -  int yyx;
> -
> -  /* Start YYX at -YYN if negative to avoid negative indexes in
> -     YYCHECK.  */
> -  int yyxbegin = yyn < 0 ? -yyn : 0;
> -
> -  /* Stay within bounds of both yycheck and yytname.  */
> -  int yychecklim = YYLAST - yyn;
> -  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
> -  int yycount = 0;
> -
> -  yyprefix = ", expecting ";
> -  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
> -    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
> -      {
> - yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]);
> - yycount += 1;
> - if (yycount == 5)
> -  {
> -    yysize = 0;
> -    break;
> -  }
> -      }
> -  yysize += (sizeof ("syntax error, unexpected ")
> -     + yystrlen (yytname[yytype]));
> -  yymsg = (char *) YYSTACK_ALLOC (yysize);
> -  if (yymsg != 0)
> -    {
> -      char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
> -      yyp = yystpcpy (yyp, yytname[yytype]);
> -
> -      if (yycount < 5)
> - {
> -  yyprefix = ", expecting ";
> -  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
> -    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
> -      {
> - yyp = yystpcpy (yyp, yyprefix);
> - yyp = yystpcpy (yyp, yytname[yyx]);
> - yyprefix = " or ";
> -      }
> - }
> -      yyerror (yymsg);
> -      YYSTACK_FREE (yymsg);
> -    }
> -  else
> -    yyerror ("syntax error; also virtual memory exhausted");
> - }
> -      else
> -#endif /* YYERROR_VERBOSE */
> - yyerror ("syntax error");
> -    }
> -
> -
> -
> -  if (yyerrstatus == 3)
> -    {
> -      /* If just tried and failed to reuse look-ahead token after an
> - error, discard it.  */
> -
> -      if (yychar <= YYEOF)
> -        {
> -          /* If at end of input, pop the error token,
> -     then the rest of the stack, then return failure.  */
> -  if (yychar == YYEOF)
> -     for (;;)
> -       {
> -
> - YYPOPSTACK;
> - if (yyssp == yyss)
> -   YYABORT;
> - yydestruct ("Error: popping",
> -                             yystos[*yyssp], yyvsp);
> -       }
> -        }
> -      else
> - {
> -  yydestruct ("Error: discarding", yytoken, &yylval);
> -  yychar = YYEMPTY;
> - }
> -    }
> -
> -  /* Else will try to reuse look-ahead token after shifting the error
> -     token.  */
> -  goto yyerrlab1;
> -
> -
> -/*---------------------------------------------------.
> -| yyerrorlab -- error raised explicitly by YYERROR.  |
> -`---------------------------------------------------*/
> -yyerrorlab:
> -
> -#ifdef __GNUC__
> -  /* Pacify GCC when the user code never invokes YYERROR and the label
> -     yyerrorlab therefore never appears in user code.  */
> -  if (0)
> -     goto yyerrorlab;
> -#endif
> -
> -yyvsp -= yylen;
> -  yyssp -= yylen;
> -  yystate = *yyssp;
> -  goto yyerrlab1;
> -
> -
> -/*-------------------------------------------------------------.
> -| yyerrlab1 -- common code for both syntax error and YYERROR.  |
> -`-------------------------------------------------------------*/
> -yyerrlab1:
> -  yyerrstatus = 3; /* Each real token shifted decrements this.  */
> -
> -  for (;;)
> -    {
> -      yyn = yypact[yystate];
> -      if (yyn != YYPACT_NINF)
> - {
> -  yyn += YYTERROR;
> -  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
> -    {
> -      yyn = yytable[yyn];
> -      if (0 < yyn)
> - break;
> -    }
> - }
> -
> -      /* Pop the current state because it cannot handle the error token.  */
> -      if (yyssp == yyss)
> - YYABORT;
> -
> -
> -      yydestruct ("Error: popping", yystos[yystate], yyvsp);
> -      YYPOPSTACK;
> -      yystate = *yyssp;
> -      YY_STACK_PRINT (yyss, yyssp);
> -    }
> -
> -  if (yyn == YYFINAL)
> -    YYACCEPT;
> -
> -  *++yyvsp = yylval;
> -
> -
> -  /* Shift the error token. */
> -  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
> -
> -  yystate = yyn;
> -  goto yynewstate;
> -
> -
> -/*-------------------------------------.
> -| yyacceptlab -- YYACCEPT comes here.  |
> -`-------------------------------------*/
> -yyacceptlab:
> -  yyresult = 0;
> -  goto yyreturn;
> -
> -/*-----------------------------------.
> -| yyabortlab -- YYABORT comes here.  |
> -`-----------------------------------*/
> -yyabortlab:
> -  yydestruct ("Error: discarding lookahead",
> -              yytoken, &yylval);
> -  yychar = YYEMPTY;
> -  yyresult = 1;
> -  goto yyreturn;
> -
> -#ifndef yyoverflow
> -/*----------------------------------------------.
> -| yyoverflowlab -- parser overflow comes here.  |
> -`----------------------------------------------*/
> -yyoverflowlab:
> -  yyerror ("parser stack overflow");
> -  yyresult = 2;
> -  /* Fall through.  */
> -#endif
> -
> -yyreturn:
> -#ifndef yyoverflow
> -  if (yyss != yyssa)
> -    YYSTACK_FREE (yyss);
> -#endif
> -  return yyresult;
> -}
> -
> -
> -#line 2109 "parse.y"
> -
> -
> diff -u -Naur pristine/gob2-2.0.14/src/parse.h modified/gob2-2.0.14/src/parse.h
> --- pristine/gob2-2.0.14/src/parse.h 2005-12-16 15:23:03.000000000 -0500
> +++ modified/gob2-2.0.14/src/parse.h 1969-12-31 19:00:00.000000000 -0500
> @@ -1,157 +0,0 @@
> -/* A Bison parser, made by GNU Bison 2.0.  */
> -
> -/* Skeleton parser for Yacc-like parsing with Bison,
> -   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
> -
> -   This program is free software; you can redistribute it and/or modify
> -   it under the terms of the GNU General Public License as published by
> -   the Free Software Foundation; either version 2, or (at your option)
> -   any later version.
> -
> -   This program is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> -   GNU General Public License for more details.
> -
> -   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.  */
> -
> -/* Tokens.  */
> -#ifndef YYTOKENTYPE
> -# define YYTOKENTYPE
> -   /* Put the tokens into the symbol table, so that GDB and other debuggers
> -      know about them.  */
> -   enum yytokentype {
> -     CLASS = 258,
> -     FROM = 259,
> -     CONST = 260,
> -     VOID = 261,
> -     STRUCT = 262,
> -     UNION = 263,
> -     ENUM = 264,
> -     THREEDOTS = 265,
> -     SIGNED = 266,
> -     UNSIGNED = 267,
> -     LONG = 268,
> -     SHORT = 269,
> -     INT = 270,
> -     FLOAT = 271,
> -     DOUBLE = 272,
> -     CHAR = 273,
> -     TOKEN = 274,
> -     NUMBER = 275,
> -     TYPETOKEN = 276,
> -     ARRAY_DIM = 277,
> -     SINGLE_CHAR = 278,
> -     CCODE = 279,
> -     HTCODE = 280,
> -     PHCODE = 281,
> -     HCODE = 282,
> -     ACODE = 283,
> -     ATCODE = 284,
> -     STRING = 285,
> -     PUBLIC = 286,
> -     PRIVATE = 287,
> -     PROTECTED = 288,
> -     CLASSWIDE = 289,
> -     PROPERTY = 290,
> -     ARGUMENT = 291,
> -     VIRTUAL = 292,
> -     SIGNAL = 293,
> -     OVERRIDE = 294,
> -     NICK = 295,
> -     BLURB = 296,
> -     MAXIMUM = 297,
> -     MINIMUM = 298,
> -     DEFAULT_VALUE = 299,
> -     ERROR = 300,
> -     FLAGS = 301,
> -     TYPE = 302,
> -     FLAGS_TYPE = 303,
> -     ENUM_TYPE = 304,
> -     PARAM_TYPE = 305,
> -     BOXED_TYPE = 306,
> -     OBJECT_TYPE = 307
> -   };
> -#endif
> -#define CLASS 258
> -#define FROM 259
> -#define CONST 260
> -#define VOID 261
> -#define STRUCT 262
> -#define UNION 263
> -#define ENUM 264
> -#define THREEDOTS 265
> -#define SIGNED 266
> -#define UNSIGNED 267
> -#define LONG 268
> -#define SHORT 269
> -#define INT 270
> -#define FLOAT 271
> -#define DOUBLE 272
> -#define CHAR 273
> -#define TOKEN 274
> -#define NUMBER 275
> -#define TYPETOKEN 276
> -#define ARRAY_DIM 277
> -#define SINGLE_CHAR 278
> -#define CCODE 279
> -#define HTCODE 280
> -#define PHCODE 281
> -#define HCODE 282
> -#define ACODE 283
> -#define ATCODE 284
> -#define STRING 285
> -#define PUBLIC 286
> -#define PRIVATE 287
> -#define PROTECTED 288
> -#define CLASSWIDE 289
> -#define PROPERTY 290
> -#define ARGUMENT 291
> -#define VIRTUAL 292
> -#define SIGNAL 293
> -#define OVERRIDE 294
> -#define NICK 295
> -#define BLURB 296
> -#define MAXIMUM 297
> -#define MINIMUM 298
> -#define DEFAULT_VALUE 299
> -#define ERROR 300
> -#define FLAGS 301
> -#define TYPE 302
> -#define FLAGS_TYPE 303
> -#define ENUM_TYPE 304
> -#define PARAM_TYPE 305
> -#define BOXED_TYPE 306
> -#define OBJECT_TYPE 307
> -
> -
> -
> -
> -#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
> -#line 668 "parse.y"
> -typedef union YYSTYPE {
> - char *id;
> - GString *cbuf;
> - GList *list;
> - int line;
> - int sigtype;
> -} YYSTYPE;
> -/* Line 1318 of yacc.c.  */
> -#line 149 "y.tab.h"
> -# define yystype YYSTYPE /* obsolescent; will be withdrawn */
> -# define YYSTYPE_IS_DECLARED 1
> -# define YYSTYPE_IS_TRIVIAL 1
> -#endif
> -
> -extern YYSTYPE yylval;
> -
> -
> -
> diff -u -Naur pristine/gob2-2.0.14/src/parse.y modified/gob2-2.0.14/src/parse.y
> --- pristine/gob2-2.0.14/src/parse.y 2005-12-16 14:11:20.000000000 -0500
> +++ modified/gob2-2.0.14/src/parse.y 2007-02-26 14:58:30.000000000 -0500
> @@ -65,6 +65,38 @@
>  static int initializer_line = 0;
>  static int glade_widget = FALSE;
>  
> +static GString *funcattrs = NULL;
> +static GString *attrargs = NULL;
> +
> +static void
> +clear_funcattrs(void)
> +{
> + if(!funcattrs) {
> + funcattrs = g_string_new("");
> + } else {
> + funcattrs = g_string_assign(funcattrs, "");
> + }
> +}
> +
> +static void
> +add_to_funcattrs(char *s, ...) G_GNUC_PRINTF (1, 2);
> +
> +static void
> +add_to_funcattrs(char *s, ...)
> +{
> +  va_list ap;
> +  va_start(ap, s);
> +  gchar *tmp = g_strdup_vprintf (s, ap);
> +  va_end(ap);
> +
> +  if(!funcattrs)
> +    funcattrs = g_string_new("");
> +
> +  funcattrs = g_string_append (funcattrs,tmp);
> +
> +  g_free(tmp);
> +}
> +
>  static char *onerror = NULL;
>  static char *defreturn = NULL;
>  
> @@ -196,6 +228,9 @@
>   } else
>   c_cbuf = NULL;
>  
> + if(funcattrs == NULL)
> +        funcattrs = g_string_new("");
> +
>   node = node_new (METHOD_NODE,
>   "scope", scope,
>   "method", method,
> @@ -205,6 +240,7 @@
>   "flags:steal", flags,
>   "id:steal", id,
>   "args:steal", funcargs,
> + "funcattrs", funcattrs->str,
>   "onerror:steal", onerror,
>   "defreturn:steal", defreturn,
>   "cbuf:steal", c_cbuf,
> @@ -216,6 +252,8 @@
>  
>   last_added_method = (Method *)node;
>  
> + clear_funcattrs ();
> +
>   if(cbuf)
>   g_string_free(cbuf,
>        /*only free segment if we haven't passed it
> @@ -233,6 +271,9 @@
>  static void
>  free_all_global_state(void)
>  {
> +        if(funcattrs != NULL)
> +                g_string_free(funcattrs, TRUE);
> +
>   g_free(onerror);
>   onerror = NULL;
>   g_free(defreturn);
> @@ -678,7 +719,7 @@
>  %token SIGNED UNSIGNED LONG SHORT INT FLOAT DOUBLE CHAR
>  
>  %token <id> TOKEN NUMBER TYPETOKEN ARRAY_DIM SINGLE_CHAR
> -%token <cbuf> CCODE HTCODE PHCODE HCODE ACODE ATCODE STRING
> +%token <cbuf> CCODE HTCODE PHCODE HCODE ACODE ATCODE STRING FUNCATTR
>  %token <line> PUBLIC PRIVATE PROTECTED CLASSWIDE PROPERTY ARGUMENT
>  %token <line> VIRTUAL SIGNAL OVERRIDE
>  %token <line> NICK BLURB MAXIMUM MINIMUM DEFAULT_VALUE ERROR FLAGS TYPE
> @@ -1746,7 +1787,7 @@
>        $<line>1, ccode_line,
>        vararg, NULL);
>   }
> - | scope type TOKEN '(' funcargs ')' returnvals codenocode {
> + | scope type TOKEN '(' funcargs ')' methodmods codenocode {
>   if(the_scope == CLASS_SCOPE) {
>   yyerror(_("a method cannot be of class scope"));
>   free_all_global_state();
> @@ -1779,7 +1820,50 @@
>   }
>   ;
>  
> -returnvals: TOKEN retcode {
> +methodmods:     funcattrlist { ; }
> +              | returnvals_spec  { ; }
> +              | funcattrlist returnvals_spec  { ; }
> +              | {
> +         g_free(onerror); onerror = NULL;
> +         g_free(defreturn); defreturn = NULL;
> +        }
> +        ;
> +funcattrlist:   funcattrlist funcattr  { ; }
> +             |  funcattr             { ; }
> +        ;
> +
> +funcattr:       FUNCATTR '(' attrarglist ')' {
> +                         g_assert(attrargs != NULL);
> +                         add_to_funcattrs("\t%s (%s)\n", $<id>1,
> +                                          attrargs->str);
> +                         g_string_free(attrargs, TRUE);
> + attrargs = NULL;
> +                }
> +              | FUNCATTR {
> +                 add_to_funcattrs("\t%s\n", $<id>1);
> +                }
> + ;
> +
> +attrarglist:    attrarglist  ',' NUMBER  {
> +                         g_assert(attrargs != NULL);
> +                         g_string_append_printf(attrargs, ", %s", $<id>3);
> +                }
> +              | NUMBER {
> +                         if(attrargs == NULL)
> +                                 attrargs = g_string_new($<id>1);
> +                         else
> +                                 attrargs = g_string_append(attrargs, $<id>1);
> +                }
> +        ;
> +
> +returnvals:      returnvals_spec
> +               | {
> +         g_free(onerror); onerror = NULL;
> +         g_free(defreturn); defreturn = NULL;
> +                 }
> +        ;
> +
> +returnvals_spec: TOKEN retcode {
>   g_free(onerror); onerror = NULL;
>   g_free(defreturn); defreturn = NULL;
>   if(!set_return_value($<id>1, $<id>2)) {
> @@ -1809,10 +1893,6 @@
>   g_free($<id>1);
>   g_free($<id>3);
>   }
> - | {
> - g_free(onerror); onerror = NULL;
> - g_free(defreturn); defreturn = NULL;
> - }
>   ;
>  
>  retcode: numtok { $<id>$ = $<id>1; }
> diff -u -Naur pristine/gob2-2.0.14/src/str.gob modified/gob2-2.0.14/src/str.gob
> --- pristine/gob2-2.0.14/src/str.gob 1969-12-31 19:00:00.000000000 -0500
> +++ modified/gob2-2.0.14/src/str.gob 2007-02-26 14:13:32.000000000 -0500
> @@ -0,0 +1,73 @@
> +// A simple string class, a lot like GString but with full GObject
> +// machinery and really short method names for the lazy :)
> +
> +%{
> +#include <stdio.h>
> +%}
> +
> +class :Str from G:Object {
> +
> +  private GString *contents;
> +
> +  public
> +  void
> +  print (self)
> +  {
> +    g_print (self->_priv->contents->str);
> +  }
> +
> +   public
> +   GObject *
> +   new (const char *format (check null), ...) G_GNUC_PRINTF (1, 2)
> +     onerror NULL defreturn NULL
> +   {
> +     va_list ap;
> +     va_start (ap, format);
> +     gchar *tmp = g_strdup_vprintf (format, ap);
> +     va_end (ap);
> +    
> +     Self *self = (Self *) GET_NEW;
> +    
> +     self->_priv->contents = g_string_new (tmp);
> +    
> +     g_free (tmp);
> +    
> +     return G_OBJECT (self);
> +   }
> +
> +   // It seems gob accepts defreturn on non-virtual non-signal types
> +   // without complaint, though from the man page I'm not sure the
> +   // resulting behavior is well defined.
> +   public
> +   char *
> +   nonvirt_test (self, const char *format (check null), ...)
> +     G_GNUC_PRINTF (2,3)
> +     defreturn NULL
> +   {
> +     return NULL;
> +   }
> +
> +   private
> +   char *
> +   private_test_method (self, const char *format (check null), ...)  
> +     G_GNUC_PRINTF (2, 3)
> +     defreturn NULL
> +   {
> +     return NULL;
> +   }
> +
> +   public
> +   char *
> +   private_method_caller (self)
> +   {
> +     int much_too_general = 42;
> +
> +     // This should trigger a warning.
> +     self_private_test_method (self, "want a string: %s", much_too_general);
> +
> +     // So should this.
> +     str_private_test_method (self, "want a string: %s", much_too_general);
> +
> +     return NULL;
> +   }
> +}
> diff -u -Naur pristine/gob2-2.0.14/src/str_test.c modified/gob2-2.0.14/src/str_test.c
> --- pristine/gob2-2.0.14/src/str_test.c 1969-12-31 19:00:00.000000000 -0500
> +++ modified/gob2-2.0.14/src/str_test.c 2007-02-25 18:23:43.000000000 -0500
> @@ -0,0 +1,20 @@
> +#include "str.h"
> +
> +int
> +main (void)
> +{
> +  g_type_init ();
> +
> +  int the_answer = 42;
> +  char *stupid_pointer = "ug";
> +
> +  // This works fine.
> +  Str *test_good = (Str *) (str_new ("%d", the_answer));
> +  test_good = test_good;
> +
> +  // This gets a warning thanks to our function attribute.
> +  Str *test_bad = (Str *) (str_new ("%d", stupid_pointer));
> +  test_bad = test_bad;
> +
> +  return 0;
> +}
> diff -u -Naur pristine/gob2-2.0.14/src/test.gob modified/gob2-2.0.14/src/test.gob
> --- pristine/gob2-2.0.14/src/test.gob 2004-10-26 19:24:57.000000000 -0400
> +++ modified/gob2-2.0.14/src/test.gob 2007-02-25 18:13:32.000000000 -0500
> @@ -418,6 +418,58 @@
>   i = 0;
>   return 25;
>   }
> + public gchar *funcattrtest(self, const char *format (check null), ...)
> +        G_GNUC_PRINTF (2, 3)
> + {
> +        gchar *result;
> +
> +        va_list ap;
> +        va_start(ap, format);
> +        result = g_strdup_vprintf (format, ap);
> +        va_end(ap);
> +        return result;
> + }
> + private gchar *funcattrtest2(self, const char *format, ...)
> +        G_GNUC_SCANF(2,3)
> + {
> +        gchar *nonsense = NULL;
> +        format = format;
> +                return nonsense;
> + }
> +        protected gchar *funcattrtest3(self, const char *format)
> +        G_GNUC_FORMAT (2)
> +        {
> +        gchar *nonsense = NULL;
> +        format = format;
> +                return nonsense;        
> + }
> + private char *funcattrtest4(self, const char *format, ...)
> +        G_GNUC_PRINTF(2,3)
> +                onerror NULL
> + {
> +        gchar *nonsense = NULL;
> +        format = format;
> +                return nonsense;        
> + }
> + protected char * funcattrtest5(self, const char *format, ...)
> +        G_GNUC_PRINTF(2,3)        
> +        onerror NULL
> + {
> +        gchar *nonsense = NULL;
> +        format = format;
> +                return nonsense;        
> + }
> + public char * funcattrtest6(self, const char *format, ...)
> +        G_GNUC_PRINTF(2,3)
> +                onerror NULL
> +        {
> +        gchar *nonsense = NULL;
> +        format = format;
> +                return nonsense;        
> + }
> + // Note that the parser should accept defreturn with function
> + // attributes as well, but this may not be a good thing since
> + // it probably doesn't make sense, so we don't test it.
>   signal private first NONE (NONE)
>   void googlegoogle(self)
>   {
> diff -u -Naur pristine/gob2-2.0.14/src/treefuncs.c modified/gob2-2.0.14/src/treefuncs.c
> --- pristine/gob2-2.0.14/src/treefuncs.c 2005-12-16 14:11:38.000000000 -0500
> +++ modified/gob2-2.0.14/src/treefuncs.c 2007-02-20 07:30:51.000000000 -0500
> @@ -158,6 +158,8 @@
>   QUARK_id_STEAL,
>   QUARK_args,
>   QUARK_args_STEAL,
> + QUARK_funcattrs,
> + QUARK_funcattrs_STEAL,
>   QUARK_onerror,
>   QUARK_onerror_STEAL,
>   QUARK_defreturn,
> @@ -266,6 +268,8 @@
>   g_hash_table_insert (quark_ht, "id:steal", GINT_TO_POINTER (QUARK_id_STEAL));
>   g_hash_table_insert (quark_ht, "args", GINT_TO_POINTER (QUARK_args));
>   g_hash_table_insert (quark_ht, "args:steal", GINT_TO_POINTER (QUARK_args_STEAL));
> + g_hash_table_insert (quark_ht, "funcattrs", GINT_TO_POINTER (QUARK_funcattrs));
> + g_hash_table_insert (quark_ht, "funcattrs:steal", GINT_TO_POINTER (QUARK_funcattrs_STEAL));
>   g_hash_table_insert (quark_ht, "onerror", GINT_TO_POINTER (QUARK_onerror));
>   g_hash_table_insert (quark_ht, "onerror:steal", GINT_TO_POINTER (QUARK_onerror_STEAL));
>   g_hash_table_insert (quark_ht, "defreturn", GINT_TO_POINTER (QUARK_defreturn));
> @@ -451,6 +455,7 @@
>   new->flags = g_list_copy (self->flags); COPY_LIST_VALS(new->flags, g_strdup);
>   new->id = g_strdup (self->id);
>   new->args = node_list_copy (self->args);
> + new->funcattrs = g_strdup (self->funcattrs);
>   new->onerror = g_strdup (self->onerror);
>   new->defreturn = g_strdup (self->defreturn);
>   new->cbuf = g_strdup (self->cbuf);
> @@ -640,6 +645,7 @@
>   g_list_foreach (self->flags, (GFunc)g_free, NULL); g_list_free (self->flags);
>   g_free (self->id);
>   node_list_free (self->args);
> + g_free (self->funcattrs);
>   g_free (self->onerror);
>   g_free (self->defreturn);
>   g_free (self->cbuf);
> @@ -1301,6 +1307,18 @@
>   self->args = args;
>   break;
>   }
> + case QUARK_funcattrs: {
> + char * funcattrs = va_arg (__ap, char *);
> + char * __old_value = self->funcattrs;
> + self->funcattrs = g_strdup (funcattrs);
> + g_free (__old_value);
> + break;
> + }
> + case QUARK_funcattrs_STEAL: {
> + char * funcattrs = va_arg (__ap, char *);
> + self->funcattrs = funcattrs;
> + break;
> + }
>   case QUARK_onerror: {
>   char * onerror = va_arg (__ap, char *);
>   char * __old_value = self->onerror;
> diff -u -Naur pristine/gob2-2.0.14/src/treefuncs.def modified/gob2-2.0.14/src/treefuncs.def
> --- pristine/gob2-2.0.14/src/treefuncs.def 2005-12-16 14:11:20.000000000 -0500
> +++ modified/gob2-2.0.14/src/treefuncs.def 2007-02-20 07:29:16.000000000 -0500
> @@ -124,6 +124,7 @@
>    STRINGLIST flags # G_SIGNAL_* flags for a signal
>    STRING id
>    NODELIST args
> +  STRING        funcattrs       # GLib function attribute macros
>    STRING onerror
>    STRING defreturn
>    STRING cbuf
> diff -u -Naur pristine/gob2-2.0.14/src/treefuncs.h modified/gob2-2.0.14/src/treefuncs.h
> --- pristine/gob2-2.0.14/src/treefuncs.h 2005-12-16 14:11:38.000000000 -0500
> +++ modified/gob2-2.0.14/src/treefuncs.h 2007-02-20 07:30:51.000000000 -0500
> @@ -165,6 +165,7 @@
>   GList * flags;
>   char * id;
>   GList * args;
> + char * funcattrs;
>   char * onerror;
>   char * defreturn;
>   char * cbuf;


--
George <jirka@...>
   Glory is fleeting, but obscurity is forever.
                       -- Napoleon Bonaparte



--
to unsubscribe:
send mail to minimalist@... with "unsubscribe gob-list" in the subject