]> git.draconx.ca Git - gob-dx.git/commitdiff
Release 0.91.1 v0.91.1
authorGeorge Lebl <jirka@5z.com>
Tue, 14 Dec 1999 17:38:00 +0000 (09:38 -0800)
committerNick Bowler <nbowler@draconx.ca>
Tue, 19 Feb 2019 17:18:44 +0000 (12:18 -0500)
21 files changed:
ChangeLog
Makefile.in
NEWS
TODO [new file with mode: 0644]
configure
configure.in
doc/gob.1.in
examples/my-person.gob
gob.spec
gob.spec.in
src/Makefile.am
src/Makefile.in
src/lexer.c
src/lexer.l
src/main.c
src/out.c
src/parse.c
src/parse.y
src/test.gob
src/tree.c
src/tree.h

index 8fcd24a19ce856d738bd38f15f4b7675fd733324..03252a33846600a9a6b603399d498b433f0b3bae 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,32 @@
+Tue Dec 14 00:06:00 1999  George Lebl <jirka@5z.com>
+
+       * Release 0.91.1
+
+Mon Dec 13 23:25:06 1999  George Lebl <jirka@5z.com>
+
+       * src/{main.c,out.c}: create a private header file and stick
+         the private structure definition inside it.  Add option
+         --no-private-header for 0.91.0 behaviour and
+         --always-private-header to force private header creation
+
+       * doc/gob.1.in: update WRT above changes
+
+       * examples/my-person.gob: include the private header
+
+       * NEWS: update
+
+Mon Dec 13 18:30:09 1999  George Lebl <jirka@5z.com>
+
+       * src/main.c: don't print spurious #line's into the private
+         structure
+
+       * src/{main.c,tree.[ch],lexer.l,parse.y}: implement support for 
+         array types for data members and function arguments
+
+Mon Dec 13 00:48:47 1999  George Lebl <jirka@5z.com>
+
+       * Release 0.91.0
+
 Sun Dec 12 22:55:12 1999  George Lebl <jirka@5z.com>
 
        * doc/gob.1.in: added paragraph noting that private data members
index 3ae3ca788b58c68de994f072b89d88a7010163ca..5b29e9af5057eb28dc0aa4d8c99afd17f9e98703 100644 (file)
@@ -86,7 +86,7 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = config.h
 CONFIG_CLEAN_FILES =  gob.spec
 DIST_COMMON =  README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \
-Makefile.am Makefile.in NEWS aclocal.m4 config.h.in configure \
+Makefile.am Makefile.in NEWS TODO aclocal.m4 config.h.in configure \
 configure.in gob.spec.in install-sh missing mkinstalldirs
 
 
diff --git a/NEWS b/NEWS
index 7b870b1e8deab59120b9b43e4348ae67e65e24b0..20357b1d918e2e5e2d787d3ff3bb1f23148c000f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,11 @@
+0.91.1
+       * WARNING! slight change in the private stuff again, private
+         structure definition (_priv) is now in a private header file,
+         which you must include explicitly if you include the public
+         header file explicitly in your .gob file.  0.91.0 behaviour
+         is obtainable with the --no-private-header option
+       * added support for array data members and function arguments
+
 0.91.0
        * WARNING! change the way private data members are done, now you need
          to access them through a private structure only available in the
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..e69de29
index 8d5f67b545e95e18ec571cf7f70ce4300284b6a1..825330355d7a429380b5fe1587ca2f02b2f7072a 100755 (executable)
--- a/configure
+++ b/configure
@@ -703,7 +703,7 @@ fi
 
 PACKAGE=gob
 
-VERSION=0.91.0
+VERSION=0.91.1
 
 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
   { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
index 96bfb36cbd3bdf4aa7cc5e420a110f7e4ae268db..f2ad73d2f0475ec231d2d488c746890d1c5d67c3 100644 (file)
@@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script.
 AC_PREREQ(2.2)
 AC_INIT(src/tree.h)
 AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(gob,0.91.0)
+AM_INIT_AUTOMAKE(gob,0.91.1)
 
 if test -f ../NOINST_GOB ; then
   DOINSTGOB=
index f18490dd83ef30a14c821685804719784ee8275e..9cada9a7ecafcee4cc130cf7afda4e12839c766a 100644 (file)
@@ -41,7 +41,17 @@ Generate C++ code.
 Don't touch the generated header file unless it really changed, this avoids
 spurious rebuilds, but can confuse some make systems (automake in particular),
 so it is not enabled by default.
-
+.TP
+.B --always-private-header
+Always create a \fB<basename>-private.h\fR file, even if it would be empty.
+Otherwise, it is only created when there are private data members in the class.
+This option implicitly negates --no-private-header
+.TP
+.B --no-private-header
+Never create a private header file.  If we use any private datamembers,
+define the private data structure at the point in the .c source where
+the class definition begins.  This option implicitly negates
+--always-private-header
 
 .SH TYPENAMES
 .PP
@@ -58,8 +68,13 @@ types.
 .PP
 The filenames are created from the typename.  The words are
 separated by '-' and all in lower case.  For example for an object named
-"Gtk:New:Button", the files are gtk-new-button.c and gtk-new-button.h.
-The header file is created to be human readable and to be used as a
+"Gtk:New:Button", the files are \fBgtk-new-button.c\fR and
+\fBgtk-new-button.h\fR.
+If you are using C++ mode, the output .c file will in fact be a .cc file.
+If you have any private data members, a private header file will also
+be created, called \fB<basename>-private.h\fR (for the example above it
+would be gtk-new-button-private.h).
+The public header file is created to be human readable and to be used as a
 reference to the object.  The .c source file is not created as a human
 readable source and is littered with #line statements, which make the
 compiler attempt to point you to the right line in your .gob file in
@@ -96,6 +111,15 @@ source file.  If you wish to include it somewhere else, put the include
 into some %{ %} section above the class definition, and gob will not include
 it automatically.  This way you can avoid circular includes and control
 where in the file do you want to include the header.
+.PP
+If you made any data members private, gob will also create a source file
+that will be called \fB<basename>-private.h\fR.  Same rule as above applies
+for this just as it does for the regular header file.  If you do explicitly
+include the regular header file, you should always include this private
+header file below it.  That is, if you use any private data members.  If you
+don't, the private header file automatically includes the public header file,
+and thus the public header file will be indirectly included at the very top
+of the file.
 
 .SH MAKING A NEW CLASS
 .PP
@@ -145,9 +169,12 @@ where 'h' is the private data member (as in the above example):
   object->_priv->h = NULL;
 
 .fi
-Note that the _priv structure is only accessible to C code blocks below or
-inside the class definition in the .gob file.  If you use it above, you will
-get a 'dereferencing incomplete pointer type' error from the C compiler.
+Note that the _priv structure is defined in the \fB<basename>-private.h\fR.
+This file is automatically included if you don't include it yourself.  You
+should always explicitly include it if you explicitly also include the main
+header file.  In case you use the \fB--no-private-header\fR option, no
+private header file is created and you can only access the _priv pointer
+below the class definition in the .gob file.
 .PP
 The third type is an argument type.  It is a named datamember which
 is one of the features of the GTK+ object system.  You need to define a get
index 516ee3eac149c4ef97391eedca3b6878f178539b..abf1d0146b727b97e187c897ba0702ec520f8857 100644 (file)
@@ -1,6 +1,7 @@
 %{
 #include <time.h>
 #include "my-person.h"
+#include "my-person-private.h"
 %}
 
 class My:Person from Gtk:Object {
index ad65ed9316ded0ffd8dbfa3da39d15728c37d521..764f38acfd7d3a8f14463b791300b83050ed353e 100644 (file)
--- a/gob.spec
+++ b/gob.spec
@@ -1,4 +1,4 @@
-%define  ver     0.91.0
+%define  ver     0.91.1
 %define  rel     1
 %define  prefix  /usr
 
@@ -19,6 +19,8 @@ from a single file which has inline C code so that you don't have to edit
 the generated files.  Syntax is somewhat inspired by java and yacc.
 
 %changelog
+* Tue Dec 14 1999  George Lebl <jirka@5z.com>
+- added the examples dir to the %doc
 * Mon Aug 16 1999  George Lebl <jirka@5z.com>
 - added gob.spec.in file
 
@@ -47,6 +49,7 @@ rm -rf $RPM_BUILD_ROOT
 %defattr(-, root, root)
 
 %doc README AUTHORS COPYING NEWS TODO ChangeLog
+%doc examples
 
 %{prefix}/bin/*
 %{prefix}/man/man1/*
index 3719afc72148c5a3e33005d1b6f4635f6fc19e9b..9f93d21202300a64f0b8822e6798203a83d272e8 100644 (file)
@@ -19,6 +19,8 @@ from a single file which has inline C code so that you don't have to edit
 the generated files.  Syntax is somewhat inspired by java and yacc.
 
 %changelog
+* Tue Dec 14 1999  George Lebl <jirka@5z.com>
+- added the examples dir to the %doc
 * Mon Aug 16 1999  George Lebl <jirka@5z.com>
 - added gob.spec.in file
 
@@ -47,6 +49,7 @@ rm -rf $RPM_BUILD_ROOT
 %defattr(-, root, root)
 
 %doc README AUTHORS COPYING NEWS TODO ChangeLog
+%doc examples
 
 %{prefix}/bin/*
 %{prefix}/man/man1/*
index 58a615727585c6a80ebc5613a5b6c015a4459562..fdd0dcd44f527b6817ea6bcac138492fa0b6de2f 100644 (file)
@@ -28,7 +28,7 @@ gob_LDADD = \
 
 BUILT_SOURCES = parse.h parse.c lexer.c
 
-CLEANFILES += $(BUILT_SOURCES) gtk-weird-button.*
+CLEANFILES += $(BUILT_SOURCES) gtk-weird-button.* gtk-weird-button-private.h
 
 EXTRA_DIST = test.gob
 
index 00aff175cc9b3745969b86e6a7057190a69310b3..1b189c6e369cb607996318c4c97593b6354ed1ef 100644 (file)
@@ -99,7 +99,7 @@ gob_LDADD =   -lm     $(GLIB_LIBS)    @LEXLIB@
 
 BUILT_SOURCES = parse.h parse.c lexer.c
 
-CLEANFILES =  $(BUILT_SOURCES) gtk-weird-button.*
+CLEANFILES =  $(BUILT_SOURCES) gtk-weird-button.* gtk-weird-button-private.h
 
 EXTRA_DIST = test.gob
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
index 5dadf6f8aa26f49bb28860927664dd17602466da..e500aae1257e35ddcc66099bf2d60356399a42c7 100644 (file)
@@ -284,80 +284,81 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
        *yy_cp = '\0'; \
        yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 67
-#define YY_END_OF_BUFFER 68
-static yyconst short int yy_acclist[340] =
+#define YY_NUM_RULES 68
+#define YY_END_OF_BUFFER 69
+static yyconst short int yy_acclist[343] =
     {   0,
-       68,   65,   67,   64,   65,   67,    1,   66,   67,   65,
-       66,   67,   65,   67,   65,   67,   65,   67,   65,   67,
-       13,   65,   67,    1,   14,   66,   67,   13,   65,   66,
-       67,   13,   65,   67,   13,   65,   67,   32,   65,   67,
-        1,   33,   66,   67,   32,   65,   66,   67,   25,   32,
-       65,   67,   32,   65,   67,   32,   65,   67,   32,   65,
-       67,   32,   65,   67,   30,   32,   65,   67,   31,   32,
-       65,   67,   32,   65,   67,   32,   65,   67,   28,   65,
-       67,    1,   29,   66,   67,   28,   65,   66,   67,   27,
-       28,   65,   67,   28,   65,   67,   28,   65,   67,   65,
-
-       67,   65,   67,   60,   65,   67,   60,   65,   67,   60,
-       65,   67,   60,   65,   67,   60,   65,   67,   61,   65,
-       67,   65,   67,   65,   67,   58,   65,   67,   58,   65,
-       67,   60,   65,   67,   60,   65,   67,   60,   65,   67,
-       60,   65,   67,   60,   65,   67,   60,   65,   67,   60,
-       65,   67,   60,   65,   67,   60,   65,   67,   60,   65,
-       67,   60,   65,   67,   60,   65,   67,   62,   65,   67,
-       63,   65,   67,    8,   16,   12,    9,   24,   17,   26,
-       10,   60,   59,   60,   60,   60,   60,   58,   11,   58,
-       58,   60,   60,   60,   60,   60,   60,   60,   60,   60,
-
-       60,   60,   60,   60,   60,   60,   60,   60,   60,    3,
-       15,   22,   18,   20,    5,    6,   59,   60,   60,   60,
-       60,   50,   58,    7,   58,   58,   60,   60,   60,   60,
-       60,   60,   45,   60,   60,   60,   60,   60,   60,   60,
-       60,   60,   60,   60,   60,   60,   23,   19,   21,   60,
-       60,   36,   60,   35,   60,   60,   48,   60,   60,   60,
-       40,   60,   60,   43,   60,   60,   60,   60,   60,   60,
-       60,   60,   60,   60,   60,   37,   60,   34,   60,   60,
-       49,   60,   60,   46,   60,   60,   60,   60,   60,   44,
-       60,   60,   60,   60,   39,   60,   60,   60,   60,   60,
-
-       47,   60,   60,   60,   60,   51,   60,   55,   60,   41,
-       60,   38,   60,   60,   60,   60,   60,   57,   60,   60,
-       52,   60,   60,   54,   60,   60,   53,   60,   56,   60,
-       42,   60,   60,   60,    4,   60,    2,    2,   60
+       69,   66,   68,   65,   66,   68,    1,   67,   68,   66,
+       67,   68,   66,   68,   66,   68,   66,   68,   66,   68,
+       13,   66,   68,    1,   14,   67,   68,   13,   66,   67,
+       68,   13,   66,   68,   13,   66,   68,   32,   66,   68,
+        1,   33,   67,   68,   32,   66,   67,   68,   25,   32,
+       66,   68,   32,   66,   68,   32,   66,   68,   32,   66,
+       68,   32,   66,   68,   30,   32,   66,   68,   31,   32,
+       66,   68,   32,   66,   68,   32,   66,   68,   28,   66,
+       68,    1,   29,   67,   68,   28,   66,   67,   68,   27,
+       28,   66,   68,   28,   66,   68,   28,   66,   68,   66,
+
+       68,   66,   68,   60,   66,   68,   60,   66,   68,   60,
+       66,   68,   60,   66,   68,   60,   66,   68,   62,   66,
+       68,   66,   68,   66,   68,   58,   66,   68,   58,   66,
+       68,   66,   68,   60,   66,   68,   60,   66,   68,   60,
+       66,   68,   60,   66,   68,   60,   66,   68,   60,   66,
+       68,   60,   66,   68,   60,   66,   68,   60,   66,   68,
+       60,   66,   68,   60,   66,   68,   60,   66,   68,   63,
+       66,   68,   64,   66,   68,    8,   16,   12,    9,   24,
+       17,   26,   10,   60,   59,   60,   60,   60,   60,   58,
+       11,   58,   58,   61,   60,   60,   60,   60,   60,   60,
+
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,    3,   15,   22,   18,   20,    5,    6,   59,
+       60,   60,   60,   60,   50,   58,    7,   58,   58,   60,
+       60,   60,   60,   60,   60,   45,   60,   60,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   23,
+       19,   21,   60,   60,   36,   60,   35,   60,   60,   48,
+       60,   60,   60,   40,   60,   60,   43,   60,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   37,   60,
+       34,   60,   60,   49,   60,   60,   46,   60,   60,   60,
+       60,   60,   44,   60,   60,   60,   60,   39,   60,   60,
+
+       60,   60,   60,   47,   60,   60,   60,   60,   51,   60,
+       55,   60,   41,   60,   38,   60,   60,   60,   60,   60,
+       57,   60,   60,   52,   60,   60,   54,   60,   60,   53,
+       60,   56,   60,   42,   60,   60,   60,    4,   60,    2,
+        2,   60
     } ;
 
-static yyconst short int yy_accept[262] =
+static yyconst short int yy_accept[266] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    2,    4,    7,   10,   13,   15,   17,
        19,   21,   24,   28,   32,   35,   38,   41,   45,   49,
        53,   56,   59,   62,   65,   69,   73,   76,   79,   82,
        86,   90,   94,   97,  100,  102,  104,  107,  110,  113,
-      116,  119,  122,  124,  126,  129,  132,  135,  138,  141,
-      144,  147,  150,  153,  156,  159,  162,  165,  168,  171,
-      174,  175,  175,  175,  175,  175,  176,  177,  177,  177,
-      177,  177,  178,  178,  179,  179,  179,  180,  181,  182,
-      182,  182,  183,  184,  185,  186,  187,  188,  188,  189,
+      116,  119,  122,  124,  126,  129,  132,  134,  137,  140,
+      143,  146,  149,  152,  155,  158,  161,  164,  167,  170,
+      173,  176,  177,  177,  177,  177,  177,  178,  179,  179,
+      179,  179,  179,  180,  180,  181,  181,  181,  182,  183,
+      184,  184,  184,  185,  186,  187,  188,  189,  190,  190,
 
-      190,  190,  190,  191,  191,  191,  192,  193,  194,  195,
+      191,  192,  192,  192,  193,  193,  193,  194,  194,  195,
       196,  197,  198,  199,  200,  201,  202,  203,  204,  205,
-      206,  207,  208,  209,  210,  210,  211,  211,  211,  212,
-      213,  213,  213,  213,  214,  215,  215,  216,  216,  216,
-      217,  217,  218,  219,  220,  221,  222,  223,  224,  224,
-      225,  226,  227,  228,  229,  230,  231,  232,  233,  235,
-      236,  237,  238,  239,  240,  241,  242,  243,  244,  245,
-      246,  247,  247,  247,  248,  249,  250,  250,  251,  252,
-      254,  256,  257,  259,  260,  261,  263,  264,  266,  267,
-      268,  269,  270,  271,  272,  273,  274,  275,  276,  278,
-
-      278,  279,  279,  280,  281,  283,  284,  286,  287,  288,
-      289,  290,  292,  293,  294,  295,  297,  298,  299,  299,
-      299,  300,  301,  303,  304,  305,  306,  308,  310,  312,
-      314,  315,  316,  316,  316,  317,  318,  320,  321,  323,
-      324,  326,  326,  326,  327,  329,  331,  333,  333,  333,
-      334,  334,  334,  335,  335,  335,  336,  337,  338,  340,
-      340
+      206,  207,  208,  209,  210,  211,  212,  213,  213,  214,
+      214,  214,  215,  216,  216,  216,  216,  217,  218,  218,
+      219,  219,  219,  220,  220,  221,  222,  223,  224,  225,
+      226,  227,  227,  228,  229,  230,  230,  231,  232,  233,
+      234,  235,  236,  238,  239,  240,  241,  242,  243,  244,
+      245,  246,  247,  248,  249,  250,  250,  250,  251,  252,
+      253,  253,  254,  255,  257,  259,  260,  262,  263,  264,
+      266,  267,  269,  270,  271,  272,  273,  274,  275,  276,
+
+      277,  278,  279,  281,  281,  282,  282,  283,  284,  286,
+      287,  289,  290,  291,  292,  293,  295,  296,  297,  298,
+      300,  301,  302,  302,  302,  303,  304,  306,  307,  308,
+      309,  311,  313,  315,  317,  318,  319,  319,  319,  320,
+      321,  323,  324,  326,  327,  329,  329,  329,  330,  332,
+      334,  336,  336,  336,  337,  337,  337,  338,  338,  338,
+      339,  340,  341,  343,  343
     } ;
 
 static yyconst int yy_ec[256] =
@@ -371,11 +372,11 @@ static yyconst int yy_ec[256] =
         1,   17,    1,    1,   18,   18,   19,   18,   20,   21,
        22,   23,   22,   22,   24,   22,   25,   22,   26,   22,
        22,   27,   22,   28,   29,   22,   22,   22,   22,   22,
-        1,   30,    1,    1,   22,    1,   31,   32,   33,   34,
+       30,   31,   32,    1,   22,    1,   33,   34,   35,   36,
 
-       35,   36,   37,   38,   39,   22,   22,   40,   41,   42,
-       43,   44,   22,   45,   46,   47,   48,   49,   22,   50,
-       22,   22,   51,    1,   52,    1,    1,    1,    1,    1,
+       37,   38,   39,   40,   41,   22,   22,   42,   43,   44,
+       45,   46,   22,   47,   48,   49,   50,   51,   22,   52,
+       22,   22,   53,    1,   54,    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,
@@ -392,224 +393,228 @@ static yyconst int yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
-static yyconst int yy_meta[53] =
+static yyconst int yy_meta[55] =
     {   0,
         1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
         1,    3,    3,    3,    4,    1,    1,    5,    5,    5,
         5,    6,    6,    6,    6,    6,    6,    6,    6,    1,
-        5,    5,    5,    5,    5,    5,    6,    6,    6,    6,
+        1,    1,    5,    5,    5,    5,    5,    5,    6,    6,
         6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
-        1,    1
+        6,    6,    1,    1
     } ;
 
-static yyconst short int yy_base[277] =
+static yyconst short int yy_base[281] =
     {   0,
-        0,    3,    9,   12,   35,   85,   19,   26,  137,    0,
-      180,    0,  556,  557,  557,  557,  557,    8,  529,  514,
-        3,  557,  557,  557,  542,  526,  557,  557,  557,  557,
-       15,   39,  525,    0,  557,  557,   24,  498,  557,  557,
-      557,  557,  523,    0,   44,    0,  533,   32,   12,   17,
-       42,  557,   58,   50,   63,   69,   49,   59,   63,   27,
-       69,   70,   80,   83,   85,   88,   86,  182,  557,  557,
-      557,  544,  518,  514,  493,  557,  557,  535,  190,  534,
-      533,  557,  537,  557,  194,  497,  557,  557,  557,  535,
-      522,  521,  520,   89,   90,  184,   92,  524,  106,  557,
-
-      530,  188,  193,  224,    0,  233,  193,   93,  197,  202,
-      203,  220,  207,  225,   99,  229,  233,  234,  237,  238,
-      240,  242,  241,  243,  529,  557,  508,  484,  557,  557,
-      521,  520,  519,  557,  557,  523,  557,  492,  521,  557,
-      508,  507,  245,  244,  246,  247,  557,  257,  518,  557,
-      264,    0,  250,  258,  259,  264,  268,  269,  505,  274,
-      276,  277,  279,  280,  282,  284,  286,  287,  292,  289,
-      291,  499,  472,  557,  557,  557,  477,   96,  293,  501,
-      500,  297,  499,  295,  300,  498,  298,  497,  299,  301,
-      302,  304,  303,  317,  308,  309,  320,  314,  496,  483,
-
-      557,  461,  183,  332,  493,  334,  492,  322,  338,  339,
-      340,  491,  341,  344,  343,  490,  345,  348,  483,  469,
-      349,  346,  487,  351,  357,  359,  486,  481,  478,  434,
-      360,  353,  414,  380,  356,  361,  399,  365,  398,  367,
-      397,  391,  407,  383,  392,  374,  369,  359,  387,  382,
-      109,  394,  189,   95,  399,  557,  390,  557,   20,  557,
-      417,  423,  429,  435,  441,  447,  449,  453,  459,  465,
-      471,  475,  479,  485,  489,  494
+        0,    3,    9,   12,   36,   88,   26,   45,  142,    0,
+      187,    0,  572,  573,  573,  573,  573,    8,  545,  528,
+        2,  573,  573,  573,  558,  542,  573,  573,  573,  573,
+       15,   13,  541,    0,  573,  573,   21,  512,  573,  573,
+      573,  573,  539,    0,   34,    0,  549,   37,   11,   12,
+       18,  573,   61,   45,   68,   73,   52,   57,   82,   62,
+       64,   73,   85,   83,   86,   88,   91,   90,  189,  573,
+      573,  573,  560,  534,  528,  507,  573,  573,  551,  197,
+      550,  549,  573,  553,  573,  201,  511,  573,  573,  573,
+      551,  538,  537,  536,   95,  103,   94,  190,  540,  194,
+
+      573,  546,  197,  202,  233,    0,  242,  245,  518,   21,
+      203,  204,  211,  212,  224,  229,  238,   96,  234,  245,
+       87,  248,  249,  250,  251,  253,  255,  544,  573,  523,
+      497,  573,  573,  536,  535,  534,  573,  573,  538,  573,
+      505,  536,  573,  523,  522,  102,  257,  252,  258,  573,
+      262,  533,  573,  267,    0,  271,  272,  274,  275,  276,
+      283,  279,  520,  286,  287,  289,  292,  293,  294,  296,
+      298,  299,  301,  300,  302,  514,  485,  573,  573,  573,
+      490,  304,  303,  516,  515,  312,  514,  305,  314,  513,
+      313,  512,  316,  317,  324,  318,  322,  332,  315,  330,
+
+      331,  337,  511,  498,  573,  474,   99,  338,  508,  343,
+      507,  345,  351,  346,  353,  506,  352,  357,  358,  505,
+      361,  363,  498,  482,  362,  364,  502,  366,  367,  369,
+      501,  500,  499,  498,  374,  370,  479,  468,  371,  376,
+      446,  382,  440,  384,  413,  407,  422,   97,  408,  407,
+      403,  380,  393,  386,  201,  397,  401,  186,  410,  573,
+      402,  573,   17,  573,  429,  435,  441,  447,  453,  459,
+      461,  465,  471,  477,  483,  487,  491,  497,  501,  506
     } ;
 
-static yyconst short int yy_def[277] =
+static yyconst short int yy_def[281] =
     {   0,
-      261,  261,  262,  262,  263,  263,  264,  264,  260,    9,
-        9,   11,  260,  260,  260,  260,  260,  260,  260,  260,
-      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,
-      260,  260,  260,  265,  260,  260,  260,  260,  260,  260,
-      260,  260,  260,  266,  260,  267,  268,  268,  268,  268,
-      268,  260,  260,  260,  260,  260,  268,  268,  268,  268,
-      268,  268,  268,  268,  268,  268,  268,  268,  260,  260,
-      260,  269,  260,  260,  260,  260,  260,  260,  260,  260,
-      260,  260,  270,  260,  260,  260,  260,  260,  260,  271,
-      272,  268,  273,  268,  268,  268,  268,  260,  260,  260,
-
-      274,  260,  260,  260,  275,  260,  268,  268,  268,  268,
-      268,  268,  268,  268,  268,  268,  268,  268,  268,  268,
-      268,  268,  268,  268,  269,  260,  260,  260,  260,  260,
-      260,  260,  260,  260,  260,  270,  260,  260,  271,  260,
-      272,  273,  268,  268,  268,  268,  260,  260,  274,  260,
-      260,  275,  268,  268,  268,  268,  268,  268,  268,  268,
-      268,  268,  268,  268,  268,  268,  268,  268,  268,  268,
-      268,  260,  260,  260,  260,  260,  260,  268,  268,  268,
-      268,  268,  268,  268,  268,  268,  268,  268,  268,  268,
-      268,  268,  268,  268,  268,  268,  268,  268,  268,  260,
-
-      260,  260,  268,  268,  268,  268,  268,  268,  268,  268,
-      268,  268,  268,  268,  268,  268,  268,  268,  260,  260,
-      268,  268,  268,  268,  268,  268,  268,  268,  268,  268,
-      268,  268,  260,  260,  268,  268,  268,  268,  268,  268,
-      268,  260,  260,  268,  268,  268,  268,  260,  260,  268,
-      260,  276,  268,  260,  276,  260,  268,  260,  268,    0,
-      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,
-      260,  260,  260,  260,  260,  260
+      265,  265,  266,  266,  267,  267,  268,  268,  264,    9,
+        9,   11,  264,  264,  264,  264,  264,  264,  264,  264,
+      264,  264,  264,  264,  264,  264,  264,  264,  264,  264,
+      264,  264,  264,  269,  264,  264,  264,  264,  264,  264,
+      264,  264,  264,  270,  264,  271,  272,  272,  272,  272,
+      272,  264,  264,  264,  264,  264,  264,  272,  272,  272,
+      272,  272,  272,  272,  272,  272,  272,  272,  272,  264,
+      264,  264,  273,  264,  264,  264,  264,  264,  264,  264,
+      264,  264,  264,  274,  264,  264,  264,  264,  264,  264,
+      275,  276,  272,  277,  272,  272,  272,  272,  264,  264,
+
+      264,  278,  264,  264,  264,  279,  264,  264,  264,  272,
+      272,  272,  272,  272,  272,  272,  272,  272,  272,  272,
+      272,  272,  272,  272,  272,  272,  272,  273,  264,  264,
+      264,  264,  264,  264,  264,  264,  264,  264,  274,  264,
+      264,  275,  264,  276,  277,  272,  272,  272,  272,  264,
+      264,  278,  264,  264,  279,  264,  272,  272,  272,  272,
+      272,  272,  272,  272,  272,  272,  272,  272,  272,  272,
+      272,  272,  272,  272,  272,  264,  264,  264,  264,  264,
+      264,  272,  272,  272,  272,  272,  272,  272,  272,  272,
+      272,  272,  272,  272,  272,  272,  272,  272,  272,  272,
+
+      272,  272,  272,  264,  264,  264,  272,  272,  272,  272,
+      272,  272,  272,  272,  272,  272,  272,  272,  272,  272,
+      272,  272,  264,  264,  272,  272,  272,  272,  272,  272,
+      272,  272,  272,  272,  272,  272,  264,  264,  272,  272,
+      272,  272,  272,  272,  272,  264,  264,  272,  272,  272,
+      272,  264,  264,  272,  264,  280,  272,  264,  280,  264,
+      272,  264,  272,    0,  264,  264,  264,  264,  264,  264,
+      264,  264,  264,  264,  264,  264,  264,  264,  264,  264
     } ;
 
-static yyconst short int yy_nxt[610] =
+static yyconst short int yy_nxt[628] =
     {   0,
-      260,   15,   16,   17,   15,   16,   17,  260,  260,   21,
-       18,   23,   24,   18,   23,   24,   71,   25,   72,   78,
-       25,   40,   41,   42,   19,   85,   93,   19,   40,   41,
-       42,   93,   20,   26,   93,   20,   26,   28,   29,   30,
-       75,   93,   31,   43,   79,   32,   93,   82,   44,   83,
-       43,   95,   89,   76,   90,   44,   93,   94,  100,   33,
-      101,   96,   86,   93,   34,   80,   81,   98,  111,   99,
-       99,   99,  102,   93,  103,  103,  104,   93,  102,   97,
-      106,  106,  106,   93,   93,   35,   36,   28,   29,   30,
-       37,   38,   31,  107,   93,   32,  108,   93,   95,   93,
-
-       93,  109,   93,   93,   93,  110,   93,   93,  112,   33,
-       93,  113,  105,   93,   34,  203,  143,  148,  148,  148,
-      144,  258,  114,  154,  115,  119,  120,  122,  254,  117,
-      146,  116,  118,  161,  121,   35,   36,   14,   15,   16,
-       17,   14,   14,   14,   14,   14,   14,   45,   14,   14,
-       14,   46,   14,   14,   47,   47,   47,   47,   47,   47,
-       47,   48,   47,   47,   47,   47,   14,   47,   47,   49,
-       47,   47,   50,   47,   47,   47,   47,   47,   47,   47,
-       47,   47,   47,   51,   47,   47,   47,   52,   14,   53,
-       54,   55,   56,   56,  131,   85,   93,   93,   93,  151,
-
-      151,  151,  102,   93,  103,  103,  104,   93,  257,  221,
-       57,   93,   58,   59,   60,   61,   93,   93,   62,   63,
-      123,   93,   64,   65,  124,   66,  145,   67,   68,  153,
-       69,   70,   86,  102,   93,  104,  104,  104,  155,   93,
-      132,  133,  102,   93,  106,  106,  106,   93,   93,  156,
-      157,   93,   93,  159,   93,   93,   93,   93,   93,   93,
-       93,   93,  158,  162,   93,  164,  160,  178,  148,  148,
-      148,  163,   93,   93,  166,  151,  151,  151,   93,  165,
-      168,  171,   93,   93,  167,  170,  180,  169,   93,  179,
-       93,   93,  181,   93,   93,  185,   93,  182,   93,  187,
-
-       93,   93,  183,   93,  184,   93,   93,   93,  186,   93,
-      188,   93,   93,   93,   93,   93,   93,   93,   93,  192,
-      189,  190,   93,   93,  199,  194,  193,  191,   93,  196,
-      197,   93,  210,  195,   93,  198,   93,  204,  181,  206,
-      215,  205,  211,  208,  207,  209,   93,  213,   93,  212,
-      216,  214,   93,   93,   93,   93,  217,   93,   93,   93,
-       93,  218,   93,   93,  224,   93,  222,   93,  223,  235,
-       93,   93,  227,   93,   93,   93,  225,  229,  232,   93,
-      228,   93,  251,   93,  244,  226,  231,  236,   93,  230,
-      238,  252,  241,  239,  240,  237,   93,   93,  256,  246,
-
-      247,  250,  252,  256,   93,  253,   93,  245,  249,  248,
-      256,   93,   93,   93,  243,  256,  259,   14,   14,   14,
-       14,   14,   14,   22,   22,   22,   22,   22,   22,   27,
-       27,   27,   27,   27,   27,   39,   39,   39,   39,   39,
-       39,   84,  242,   84,   84,   84,   84,   88,   93,   88,
-       88,   88,   88,   91,   91,   92,   92,   92,   92,  125,
-      125,  125,  125,  125,  125,  136,  136,  136,  136,  136,
-      136,  139,  139,  139,  139,  139,  139,  141,  141,  141,
-      141,  142,  142,  142,  142,  149,  149,  149,  149,  149,
-      149,  152,   93,  152,  255,   93,  255,  255,  255,  255,
-
-       93,   93,  234,  233,   93,   93,   93,   93,  220,  219,
-       93,   93,   93,   93,   93,   93,  202,  201,  200,   93,
-      150,   93,   93,  140,  177,  137,  176,  175,  174,  173,
-      172,  126,  150,  147,   93,   93,   93,  140,  138,  137,
-      135,  134,  130,  129,  128,  127,  126,   93,   73,   87,
-       73,   73,   77,   74,   73,  260,   13,  260,  260,  260,
-      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,
-      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,
-      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,
-      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,
-
-      260,  260,  260,  260,  260,  260,  260,  260,  260
+      264,   15,   16,   17,   15,   16,   17,  264,  264,   21,
+       18,   23,   24,   18,   23,   24,   72,   25,   73,   79,
+       25,   83,   86,   84,   19,   94,   94,   19,   40,   41,
+       42,   94,   94,   26,   20,   94,   26,   20,   28,   29,
+       30,   76,   90,   31,   91,   80,   32,   40,   41,   42,
+       43,   94,   96,  101,   77,  102,   44,   98,   97,  157,
+       33,   87,   95,  108,  108,  108,   34,   81,   82,   43,
+       99,   94,  100,  100,  100,   44,   94,  103,   94,  104,
+      104,  105,  103,  109,  107,  107,  107,   94,   35,   36,
+       28,   29,   30,   37,   38,   31,   94,   94,   32,   94,
+
+       94,   94,   94,  110,   94,   94,  113,  114,   94,   94,
+       94,   94,   33,   94,  115,  254,   94,   94,   34,  106,
+      168,  111,  146,   96,  182,  225,  112,  117,  116,  118,
+      122,  123,  165,  125,  120,  147,  119,  121,  148,  124,
+       35,   36,   14,   15,   16,   17,   14,   14,   14,   14,
+       14,   14,   45,   14,   14,   14,   46,   14,   14,   47,
+       47,   47,   47,   47,   47,   47,   48,   47,   47,   47,
+       47,   14,   14,   14,   47,   47,   49,   47,   47,   50,
+       47,   47,   47,   47,   47,   47,   47,   47,   47,   47,
+       51,   47,   47,   47,   52,   14,   53,   54,   55,   56,
+
+       56,  134,   86,   94,   94,  151,  151,  151,  154,  154,
+      154,  103,  262,  104,  104,  105,   57,   94,   94,   58,
+      258,   59,   60,   61,   62,   94,   94,   63,   64,  126,
+      149,   65,   66,  127,   67,  158,   68,   69,   94,   70,
+       71,   87,  103,   94,  105,  105,  105,  159,   94,  135,
+      136,  103,   94,  107,  107,  107,  108,  108,  108,   94,
+      160,  161,   94,   94,   94,   94,   94,   94,  162,   94,
+      166,   94,   94,  151,  151,  151,  109,  163,  154,  154,
+      154,  164,  108,  108,  108,  167,   94,  170,   94,   94,
+       94,  172,  169,   94,  184,  175,  171,   94,  173,  174,
+
+       94,   94,  109,   94,  183,  185,   94,   94,   94,  189,
+       94,  191,   94,   94,   94,   94,   94,   94,   94,   94,
+      187,  186,  188,  207,  192,  190,   94,   94,   94,   94,
+       94,   94,   94,  193,  196,  194,   94,  203,   94,  198,
+      197,  201,  195,  200,   94,   94,   94,  199,  202,  219,
+      185,   94,   94,  209,  208,  210,  214,   94,  215,   94,
+       94,  211,  212,  213,  217,   94,   94,   94,  218,  221,
+      216,   94,   94,  220,  226,   94,   94,   94,   94,  227,
+       94,   94,  239,   94,   94,   94,  222,  231,   94,  228,
+       94,  229,  233,  232,  230,  236,   94,  256,   94,  248,
+
+       94,  260,  242,  255,  235,  243,  234,  240,  256,  257,
+      244,  245,  241,  260,  260,   94,   94,   94,  250,  251,
+      261,   94,   94,  253,  249,  252,  260,   94,  263,   14,
+       14,   14,   14,   14,   14,   22,   22,   22,   22,   22,
+       22,   27,   27,   27,   27,   27,   27,   39,   39,   39,
+       39,   39,   39,   85,   94,   85,   85,   85,   85,   89,
+       94,   89,   89,   89,   89,   92,   92,   93,   93,   93,
+       93,  128,  128,  128,  128,  128,  128,  139,  139,  139,
+      139,  139,  139,  142,  142,  142,  142,  142,  142,  144,
+      144,  144,  144,  145,  145,  145,  145,  152,  152,  152,
+
+      152,  152,  152,  155,  247,  155,  259,  246,  259,  259,
+      259,  259,   94,   94,   94,   94,   94,  238,  237,   94,
+       94,   94,   94,  224,  223,   94,   94,   94,   94,   94,
+       94,  206,  205,  204,   94,  153,   94,   94,  143,  181,
+      140,  180,  179,  178,  177,  176,  129,  156,  153,  150,
+       94,   94,   94,  143,  141,  140,  138,  137,  133,  132,
+      131,  130,  129,   94,   74,   88,   74,   74,   78,   75,
+       74,  264,   13,  264,  264,  264,  264,  264,  264,  264,
+      264,  264,  264,  264,  264,  264,  264,  264,  264,  264,
+      264,  264,  264,  264,  264,  264,  264,  264,  264,  264,
+
+      264,  264,  264,  264,  264,  264,  264,  264,  264,  264,
+      264,  264,  264,  264,  264,  264,  264,  264,  264,  264,
+      264,  264,  264,  264,  264,  264,  264
     } ;
 
-static yyconst short int yy_chk[610] =
+static yyconst short int yy_chk[628] =
     {   0,
         0,    1,    1,    1,    2,    2,    2,    0,    0,    2,
         1,    3,    3,    2,    4,    4,   18,    3,   18,   31,
-        4,    7,    7,    7,    1,   37,   49,    2,    8,    8,
-        8,   50,    1,    3,  259,    2,    4,    5,    5,    5,
-       21,   60,    5,    7,   31,    5,   48,   32,    7,   32,
-        8,   49,   45,   21,   45,    8,   51,   48,   54,    5,
-       54,   50,   37,   57,    5,   31,   31,   53,   60,   53,
-       53,   53,   55,   58,   55,   55,   55,   59,   56,   51,
-       56,   56,   56,   61,   62,    5,    5,    6,    6,    6,
-        6,    6,    6,   57,   63,    6,   58,   64,   58,   65,
-
-       67,   58,   66,   94,   95,   59,   97,  108,   61,    6,
-      178,   62,   55,  115,    6,  178,   94,   99,   99,   99,
-       95,  254,   63,  108,   64,   66,   66,   67,  251,   65,
-       97,   64,   65,  115,   66,    6,    6,    9,    9,    9,
+        4,   32,   37,   32,    1,   49,   50,    2,    7,    7,
+        7,  263,   51,    3,    1,  110,    4,    2,    5,    5,
+        5,   21,   45,    5,   45,   31,    5,    8,    8,    8,
+        7,   48,   49,   54,   21,   54,    7,   51,   50,  110,
+        5,   37,   48,   57,   57,   57,    5,   31,   31,    8,
+       53,   58,   53,   53,   53,    8,   60,   55,   61,   55,
+       55,   55,   56,   57,   56,   56,   56,   62,    5,    5,
+        6,    6,    6,    6,    6,    6,   59,   64,    6,   63,
+
+       65,  121,   66,   58,   68,   67,   60,   61,   97,   95,
+      118,  248,    6,  207,   62,  248,  146,   96,    6,   55,
+      121,   59,   95,   59,  146,  207,   59,   64,   63,   65,
+       67,   67,  118,   68,   66,   96,   65,   66,   97,   67,
+        6,    6,    9,    9,    9,    9,    9,    9,    9,    9,
         9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
         9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
         9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
         9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
-        9,    9,    9,    9,    9,    9,    9,    9,    9,   11,
-       11,   11,   11,   11,   79,   85,   68,  203,   96,  102,
-
-      102,  102,  103,  253,  103,  103,  103,  107,  253,  203,
-       11,  109,   11,   11,   11,   11,  110,  111,   11,   11,
-       68,  113,   11,   11,   68,   11,   96,   11,   11,  107,
-       11,   11,   85,  104,  112,  104,  104,  104,  109,  114,
-       79,   79,  106,  116,  106,  106,  106,  117,  118,  110,
-      111,  119,  120,  113,  121,  123,  122,  124,  144,  143,
-      145,  146,  112,  116,  153,  118,  114,  143,  148,  148,
-      148,  117,  154,  155,  120,  151,  151,  151,  156,  119,
-      122,  124,  157,  158,  121,  123,  145,  122,  160,  144,
-      161,  162,  146,  163,  164,  156,  165,  153,  166,  158,
-
-      167,  168,  154,  170,  155,  171,  169,  179,  157,  184,
-      160,  182,  187,  189,  185,  190,  191,  193,  192,  164,
-      161,  162,  195,  196,  171,  166,  165,  163,  198,  168,
-      169,  194,  191,  167,  197,  170,  208,  182,  179,  185,
-      195,  184,  192,  189,  187,  190,  204,  194,  206,  193,
-      196,  194,  209,  210,  211,  213,  197,  215,  214,  217,
-      222,  198,  218,  221,  208,  224,  204,  232,  206,  221,
-      235,  225,  211,  226,  231,  236,  209,  214,  218,  238,
-      213,  240,  248,  247,  235,  210,  217,  222,  246,  215,
-      225,  249,  232,  226,  231,  224,  250,  244,  252,  238,
-
-      240,  244,  249,  255,  257,  250,  245,  236,  243,  242,
-      252,  241,  239,  237,  234,  255,  257,  261,  261,  261,
-      261,  261,  261,  262,  262,  262,  262,  262,  262,  263,
-      263,  263,  263,  263,  263,  264,  264,  264,  264,  264,
-      264,  265,  233,  265,  265,  265,  265,  266,  230,  266,
-      266,  266,  266,  267,  267,  268,  268,  268,  268,  269,
-      269,  269,  269,  269,  269,  270,  270,  270,  270,  270,
-      270,  271,  271,  271,  271,  271,  271,  272,  272,  272,
-      272,  273,  273,  273,  273,  274,  274,  274,  274,  274,
-      274,  275,  229,  275,  276,  228,  276,  276,  276,  276,
-
-      227,  223,  220,  219,  216,  212,  207,  205,  202,  200,
-      199,  188,  186,  183,  181,  180,  177,  173,  172,  159,
-      149,  142,  141,  139,  138,  136,  133,  132,  131,  128,
-      127,  125,  101,   98,   93,   92,   91,   90,   86,   83,
-       81,   80,   78,   75,   74,   73,   72,   47,   43,   38,
-       33,   26,   25,   20,   19,   13,  260,  260,  260,  260,
-      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,
-      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,
-      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,
-      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,
-
-      260,  260,  260,  260,  260,  260,  260,  260,  260
+        9,    9,    9,    9,    9,    9,   11,   11,   11,   11,
+
+       11,   80,   86,   69,   98,  100,  100,  100,  103,  103,
+      103,  104,  258,  104,  104,  104,   11,  111,  112,   11,
+      255,   11,   11,   11,   11,  113,  114,   11,   11,   69,
+       98,   11,   11,   69,   11,  111,   11,   11,  115,   11,
+       11,   86,  105,  116,  105,  105,  105,  112,  119,   80,
+       80,  107,  117,  107,  107,  107,  108,  108,  108,  120,
+      113,  114,  122,  123,  124,  125,  148,  126,  115,  127,
+      119,  147,  149,  151,  151,  151,  108,  116,  154,  154,
+      154,  117,  156,  156,  156,  120,  157,  123,  158,  159,
+      160,  125,  122,  162,  148,  127,  124,  161,  125,  126,
+
+      164,  165,  156,  166,  147,  149,  167,  168,  169,  160,
+      170,  162,  171,  172,  174,  173,  175,  183,  182,  188,
+      158,  157,  159,  182,  164,  161,  186,  191,  189,  199,
+      193,  194,  196,  165,  168,  166,  197,  175,  195,  170,
+      169,  173,  167,  172,  200,  201,  198,  171,  174,  199,
+      183,  202,  208,  188,  186,  189,  195,  210,  196,  212,
+      214,  191,  193,  194,  198,  213,  217,  215,  198,  201,
+      197,  218,  219,  200,  208,  221,  225,  222,  226,  210,
+      228,  229,  225,  230,  236,  239,  202,  215,  235,  212,
+      240,  213,  218,  217,  214,  222,  242,  253,  244,  239,
+
+      254,  256,  229,  252,  221,  230,  219,  226,  253,  254,
+      235,  236,  228,  256,  259,  257,  261,  251,  242,  244,
+      257,  250,  249,  247,  240,  246,  259,  245,  261,  265,
+      265,  265,  265,  265,  265,  266,  266,  266,  266,  266,
+      266,  267,  267,  267,  267,  267,  267,  268,  268,  268,
+      268,  268,  268,  269,  243,  269,  269,  269,  269,  270,
+      241,  270,  270,  270,  270,  271,  271,  272,  272,  272,
+      272,  273,  273,  273,  273,  273,  273,  274,  274,  274,
+      274,  274,  274,  275,  275,  275,  275,  275,  275,  276,
+      276,  276,  276,  277,  277,  277,  277,  278,  278,  278,
+
+      278,  278,  278,  279,  238,  279,  280,  237,  280,  280,
+      280,  280,  234,  233,  232,  231,  227,  224,  223,  220,
+      216,  211,  209,  206,  204,  203,  192,  190,  187,  185,
+      184,  181,  177,  176,  163,  152,  145,  144,  142,  141,
+      139,  136,  135,  134,  131,  130,  128,  109,  102,   99,
+       94,   93,   92,   91,   87,   84,   82,   81,   79,   76,
+       75,   74,   73,   47,   43,   38,   33,   26,   25,   20,
+       19,   13,  264,  264,  264,  264,  264,  264,  264,  264,
+      264,  264,  264,  264,  264,  264,  264,  264,  264,  264,
+      264,  264,  264,  264,  264,  264,  264,  264,  264,  264,
+
+      264,  264,  264,  264,  264,  264,  264,  264,  264,  264,
+      264,  264,  264,  264,  264,  264,  264,  264,  264,  264,
+      264,  264,  264,  264,  264,  264,  264
     } ;
 
 static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;
@@ -703,7 +708,7 @@ add_to_cbuf(char *s)
 
 #define CLASS_CODE_I 5
 
-#line 707 "lex.yy.c"
+#line 712 "lex.yy.c"
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -860,7 +865,7 @@ YY_DECL
 #line 74 "lexer.l"
 
 
-#line 864 "lex.yy.c"
+#line 869 "lex.yy.c"
 
        if ( yy_init )
                {
@@ -909,14 +914,14 @@ yy_match:
                        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 >= 261 )
+                               if ( yy_current_state >= 265 )
                                        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] != 557 );
+               while ( yy_base[yy_current_state] != 573 );
 
 yy_find_action:
                yy_current_state = *--yy_state_ptr;
@@ -1357,14 +1362,22 @@ YY_RULE_SETUP
 case 61:
 YY_RULE_SETUP
 #line 248 "lexer.l"
+{
+                       yylval.id = g_strdup(yytext);
+                       return ARRAY_DIM;
+               }
+       YY_BREAK
+case 62:
+YY_RULE_SETUP
+#line 253 "lexer.l"
 {
                        BEGIN(CLASS_CODE_I);
                        return '{';
                }
        YY_BREAK
-case 62:
+case 63:
 YY_RULE_SETUP
-#line 252 "lexer.l"
+#line 257 "lexer.l"
 {
                        BEGIN(C_CODE);
                        parenth_depth=1;
@@ -1374,38 +1387,38 @@ YY_RULE_SETUP
                        return '{';
                }
        YY_BREAK
-case 63:
+case 64:
 YY_RULE_SETUP
-#line 260 "lexer.l"
+#line 265 "lexer.l"
 {
                                BEGIN(INITIAL);
                                return '}';
                        }
        YY_BREAK
-case 64:
+case 65:
 YY_RULE_SETUP
-#line 265 "lexer.l"
+#line 270 "lexer.l"
 ;  /*ignore*/
        YY_BREAK
-case 65:
+case 66:
 YY_RULE_SETUP
-#line 267 "lexer.l"
+#line 272 "lexer.l"
 {
                        yylval.line = line_no;
                        return yytext[0];
                }
        YY_BREAK
-case 66:
+case 67:
 YY_RULE_SETUP
-#line 272 "lexer.l"
+#line 277 "lexer.l"
 ;  /*ignore*/
        YY_BREAK
-case 67:
+case 68:
 YY_RULE_SETUP
-#line 273 "lexer.l"
+#line 278 "lexer.l"
 ECHO;
        YY_BREAK
-#line 1409 "lex.yy.c"
+#line 1422 "lex.yy.c"
                        case YY_STATE_EOF(INITIAL):
                        case YY_STATE_EOF(COMMENT):
                        case YY_STATE_EOF(C_CODE):
@@ -1700,7 +1713,7 @@ static yy_state_type yy_get_previous_state()
                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 >= 261 )
+                       if ( yy_current_state >= 265 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -1730,11 +1743,11 @@ yy_state_type yy_current_state;
        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 >= 261 )
+               if ( yy_current_state >= 265 )
                        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 == 260);
+       yy_is_jam = (yy_current_state == 264);
        if ( ! yy_is_jam )
                *yy_state_ptr++ = yy_current_state;
 
@@ -2292,4 +2305,4 @@ int main()
        return 0;
        }
 #endif
-#line 273 "lexer.l"
+#line 278 "lexer.l"
index 320e25b51f4cae6273d4b294affb7367ed170d18..35e42ccb89cca3935f9206dc2112967fe6ccb3dd 100644 (file)
@@ -245,6 +245,11 @@ class              {
                        return TOKEN;
                }
 
+<CLASS_CODE_I>(\[[0-9]*\])+    {
+                       yylval.id = g_strdup(yytext);
+                       return ARRAY_DIM;
+               }
+
 <CLASS_CODE>\{ {
                        BEGIN(CLASS_CODE_I);
                        return '{';
index 07158f5b1c14d58c2a04ffbb5fa60a89a4c30f0c..3a1655470a518212c4e40d5bb7d0c01f7d80809a 100644 (file)
@@ -60,14 +60,17 @@ static int arguments = 0; /* number of named arguments */
 static int overrides = 0; /* number of override functions */
 static int privates = 0; /* number of private data members */
 
-FILE *out;
-FILE *outh;
+FILE *out = NULL;
+FILE *outh = NULL;
+FILE *outph = NULL;
 
 gboolean no_touch_headers = FALSE;
 gboolean for_cpp = FALSE;
 gboolean exit_on_warn = FALSE;
 gboolean exit_on_error = TRUE;
 gboolean got_error = FALSE;
+gboolean always_private_header = FALSE;
+gboolean no_private_header = FALSE;
 
 void
 print_error(int is_warn, char *error,int line)
@@ -182,15 +185,27 @@ make_bases(void)
 }
 
 static void
-print_type(FILE *fp, Type *t)
+print_type(FILE *fp, Type *t, gboolean postfix_to_stars)
 {
        char *s;
        int i;
+       int extra;
+
        s = remove_sep(t->name);
        out_printf(fp,"%s ",s); 
        g_free(s);
+
+       extra = 0;
+       if(postfix_to_stars) {
+               char *p;
+               /*XXX: this is ugly perhaps we can do this whole postfix thing
+                 in a nicer way, we just count the number of '[' s and from that
+                 we deduce the number of dimensions */
+               for(p=t->postfix; p && *p; p++)
+                       if(*p == '[') extra++;
+       }
        
-       for(i=0;i<t->stars;i++)
+       for(i=0;i<(t->stars+extra);i++)
                out_printf(fp,"*"); 
 }
 
@@ -202,7 +217,7 @@ print_method(FILE *fp, char *typeprefix, char *nameprefix,
        GList *li;
 
        out_printf(fp,"%s",typeprefix); 
-       print_type(fp,m->mtype);
+       print_type(fp,m->mtype,TRUE);
        if(no_funcbase)
                out_printf(fp,"%s%s%s(",
                           nameprefix,m->id,namepostfix); 
@@ -213,12 +228,15 @@ print_method(FILE *fp, char *typeprefix, char *nameprefix,
        if(m->args) {
                for(li=m->args;li;li=g_list_next(li)) {
                        FuncArg *arg = li->data;
-                       print_type(fp,arg->atype);
+                       print_type(fp,arg->atype,FALSE);
                        if(li->next)
-                               out_printf(fp,"%s, ",arg->name); 
+                               out_printf(fp,"%s%s, ",arg->name,
+                                          arg->atype->postfix?
+                                          arg->atype->postfix:""); 
                        else
-                               out_printf(fp,"%s",arg->name); 
-
+                               out_printf(fp,"%s%s",arg->name,
+                                          arg->atype->postfix?
+                                          arg->atype->postfix:""); 
                }
                if(m->vararg)
                        out_printf(fp,", ..."); 
@@ -291,17 +309,13 @@ add_bad_hack_to_avoid_unused_warnings(Class *c)
 }
 
 static void
-put_variable(Variable *v, FILE *fp, int priv)
+put_variable(Variable *v, FILE *fp)
 {
-       if(v->scope == PRIVATE_SCOPE) {
-               if(!priv) return;
-       } else {
-               if(priv) return;
-       }
-
        out_printf(fp,"\t");
-       print_type(fp,v->vtype);
-       out_printf(fp,"%s;\n",v->id); 
+       print_type(fp,v->vtype,FALSE);
+       out_printf(fp,"%s%s;\n",v->id,
+                  v->vtype->postfix?
+                  v->vtype->postfix:""); 
 }
 
 static void
@@ -368,7 +382,7 @@ make_func_arg(char *typename, int is_class, char *name)
        else
                tn = g_strdup(typename);
 
-       type = new_type(1,tn);
+       type = new_type(1,tn,NULL);
        node = new_funcarg((Type *)type,name,NULL);
        return g_list_prepend(NULL, node);
 }
@@ -397,7 +411,7 @@ make_inits(Class *cl)
        }
        if(!got_class_init) {
                node = new_method(CLASS_INIT_METHOD,
-                                 (Type *)new_type(0,g_strdup("void")),
+                                 (Type *)new_type(0,g_strdup("void"),NULL),
                                  NULL,NULL,g_strdup("class_init"),
                                  make_func_arg(cl->otype,TRUE,g_strdup("c")),
                                  NULL, NULL,0,0,FALSE);
@@ -405,7 +419,7 @@ make_inits(Class *cl)
        }
        if(!got_init) {
                node = new_method(INIT_METHOD,
-                                 (Type *)new_type(0,g_strdup("void")),
+                                 (Type *)new_type(0,g_strdup("void"),NULL),
                                  NULL,NULL,g_strdup("init"),
                                  make_func_arg(cl->otype,FALSE,g_strdup("o")),
                                  NULL, NULL,0,0,FALSE);
@@ -439,7 +453,7 @@ make_destroy(Class *cl)
        }
        if(!got_destroy) {
                node = new_method(OVERRIDE_METHOD,
-                                 (Type *)new_type(0,g_strdup("void")),
+                                 (Type *)new_type(0,g_strdup("void"),NULL),
                                  g_strdup("Gtk:Object"),
                                  NULL,g_strdup("destroy"),
                                  make_func_arg("Gtk:Object",FALSE,g_strdup("o")),
@@ -478,14 +492,14 @@ add_signal_prots(Method *m)
        g_hash_table_insert(marsh,m,s);
        
        out_printf(out,"\ntypedef ");
-       print_type(out,m->mtype);
+       print_type(out,m->mtype,TRUE);
        
        out_printf(out,"(*%s) (",s);
        
        for(li=m->args;li;li=g_list_next(li)) {
                FuncArg *arg = li->data;
-               print_type(out,arg->atype);
-               out_printf(out,", "); 
+               print_type(out,arg->atype,TRUE);
+               out_printf(out,", ");
        }
        out_printf(out,"gpointer);\n"); 
        
@@ -511,7 +525,7 @@ add_signal_prots(Method *m)
                                else {
                                        FuncArg *fa = ali->data;
                                        out_printf(out, ",\n\t\t(");
-                                       print_type(out,fa->atype);
+                                       print_type(out,fa->atype,TRUE);
                                        out_printf(out, ")GTK_VALUE_%s(args[%d])",
                                                   (char *)li->data,i);
                                }
@@ -523,7 +537,7 @@ add_signal_prots(Method *m)
        } else {
                int i;
                out_printf(out, "\t%s rfunc;\n\t",s);
-               print_type(out,m->mtype);
+               print_type(out,m->mtype,TRUE);
                out_printf(out, " *retval;\n\n"
                        "\trfunc = (%s)func;\n\n"
                        "\tretval = GTK_RETLOC_%s(args[%d]);\n\n"
@@ -540,7 +554,7 @@ add_signal_prots(Method *m)
                                else {
                                        FuncArg *fa = ali->data;
                                        out_printf(out, ",\n\t\t(");
-                                       print_type(out,fa->atype);
+                                       print_type(out,fa->atype,TRUE);
                                        out_printf(out, ")GTK_VALUE_%s(args[%d])",
                                                   (char *)li->data,i);
                                }
@@ -981,7 +995,7 @@ print_checks(Method *m, FuncArg *fa)
                        out_printf(out,");\n");
                else {
                        out_printf(out,", (");
-                       print_type(out,m->mtype);
+                       print_type(out,m->mtype,TRUE);
                        out_printf(out,")%s);\n",
                                m->onerror?m->onerror:"0");
                }
@@ -1080,7 +1094,7 @@ put_method(Method *m)
                } else {
                        GList *li;
                        out_printf(out,"\t");
-                       print_type(out,m->mtype);
+                       print_type(out,m->mtype,TRUE);
                        out_printf(out,"return_val;\n");
                        print_preconditions(m);
                        out_printf(out,"\tgtk_signal_emit (GTK_OBJECT (%s),\n"
@@ -1133,7 +1147,7 @@ put_method(Method *m)
                        out_printf(out,");\n"
                                "\telse\n"
                                "\t\treturn (");
-                       print_type(out,m->mtype);
+                       print_type(out,m->mtype,TRUE);
                        out_printf(out,")(%s);\n}\n",
                                m->onerror?m->onerror:"0");
                }
@@ -1442,7 +1456,7 @@ count_privates(Class *c)
 static void
 open_files(void)
 {
-       char *outfile,*outfileh;
+       char *outfile,*outfileh,*outfileph;
 
        if(!for_cpp)
                outfile = g_strconcat(filebase,".c",NULL);
@@ -1452,6 +1466,13 @@ open_files(void)
                outfileh = g_strconcat("#gob#",filebase,".h#gob#",NULL);
        else
                outfileh = g_strconcat(filebase,".h",NULL);
+
+       if((privates>0 || always_private_header) &&
+          !no_private_header)
+               outfileph = g_strconcat(filebase,"-private.h",NULL);
+       else
+               outfileph = NULL;
+
        
        out = fopen(outfile,"w");
        if(!out) {
@@ -1461,6 +1482,12 @@ open_files(void)
        if(!outh) {
                g_error("Cannot open outfile: %s",outfileh);
        }
+       if(outfileph) {
+               outph = fopen(outfileph,"w");
+               if(!outph) {
+                       g_error("Cannot open outfile: %s",outfileh);
+               }
+       }
 }
 
 static void
@@ -1469,10 +1496,14 @@ generate_outfiles(void)
        char *p;
        GList *li;
        time_t curtime;
+       gboolean found_header;
 
        time(&curtime);
        out_printf(outh,"/* Generated by GOB (v%s)"
               "   (do not edit directly) */\n\n",VERSION);
+       if(outph)
+               out_printf(outph,"/* Generated by GOB (v%s)"
+                          "   (do not edit directly) */\n\n",VERSION);
        out_printf(out,"/* Generated by GOB (v%s) on %s"
               "   (do not edit directly) */\n\n",VERSION,ctime(&curtime));
        
@@ -1480,18 +1511,50 @@ generate_outfiles(void)
        g_strup(p);
        out_printf(outh,"#ifndef __%s_H__\n#define __%s_H__\n\n"
                "#include <gtk/gtk.h>\n\n",p,p);
+       if(outph)
+               out_printf(outph,"#ifndef __%s_PRIVATE_H__\n"
+                          "#define __%s_PRIVATE_H__\n\n"
+                          "#include \"%s.h\"\n\n",p,p,filebase);
        g_free(p);
 
-       if(!for_cpp)
+       if(!for_cpp) {
                out_printf(outh,"#ifdef __cplusplus\n"
                           "extern \"C\" {\n"
                           "#endif /* __cplusplus */\n\n");
+               if(outph)
+                       out_printf(outph,"#ifdef __cplusplus\n"
+                                  "extern \"C\" {\n"
+                                  "#endif /* __cplusplus */\n\n");
+       }
        
        p = g_strconcat(filebase,".h",NULL);
-       if(!g_list_find_custom(include_files,p,(GCompareFunc)strcmp))
+       found_header = TRUE;
+       if(!g_list_find_custom(include_files,p,(GCompareFunc)strcmp)) {
                out_printf(out,"#include \"%s.h\"\n\n",filebase);
+               found_header = FALSE;
+       }
        g_free(p);
 
+       /* if we are creating a private header see if it was included */
+       if(outph) {
+               p = g_strconcat(filebase,"-private.h",NULL);
+               if(!g_list_find_custom(include_files,p,(GCompareFunc)strcmp)) {
+                       out_printf(out,"#include \"%s-private.h\"\n\n",
+                                  filebase);
+                       if(found_header)
+                               print_error(TRUE,
+                                           "Implicit private header include "
+                                           "added to top of\n"
+                                           "\tsource file, while public "
+                                           "header is at a custom location, "
+                                           "you should\n"
+                                           "\texplicitly include "
+                                           "the private header below the "
+                                           "public one.", 0);
+               }
+               g_free(p);
+       }
+
        for(li=nodes;li;li=g_list_next(li)) {
                Node *node = li->data;
                if(node->type == CCODE_NODE) {
@@ -1533,26 +1596,39 @@ generate_outfiles(void)
                                   typebase,ptypebase);
                        for(l=c->nodes;l;l=g_list_next(l)) {
                                Node *n = l->data;
-                               if(n->type == VARIABLE_NODE)
-                                       put_variable((Variable *)n,outh,FALSE);
+                               Variable *v = (Variable *)n;
+                               if(n->type == VARIABLE_NODE &&
+                                  v->scope == PUBLIC_SCOPE)
+                                       put_variable((Variable *)n,outh);
                        }
                        if(privates>0)
                                out_printf(outh,"\t%sPrivate *_priv;\n",typebase);
                        out_printf(outh,"};\n");
 
                        if(privates>0) {
-                               out_printf(out,"struct _%sPrivate {\n",
+                               FILE *outfp;
+
+                               /* if we are to stick this into the private
+                                  header, otherwise stick it directly into the
+                                  C file */
+                               if(outph) 
+                                       outfp = outph;
+                               else
+                                       outfp = out;
+
+                               out_printf(outfp,"struct _%sPrivate {\n",
                                           typebase);
                                for(l=c->nodes;l;l=l->next) {
                                        Node *n = l->data;
-                                       if(n->type == VARIABLE_NODE) {
-                                               Variable *v = (Variable *)n;
-                                               out_addline_infile(out,v->line_no);
-                                               put_variable(v,out,TRUE);
+                                       Variable *v = (Variable *)n;
+                                       if(n->type == VARIABLE_NODE &&
+                                          v->scope == PRIVATE_SCOPE) {
+                                               out_addline_infile(outfp,v->line_no);
+                                               put_variable(v,outfp);
                                        }
                                }
-                               out_addline_outfile(out);
-                               out_printf(out,"};\n");
+                               out_addline_outfile(outfp);
+                               out_printf(outfp,"};\n");
                        }
 
                        out_printf(outh,"\ntypedef struct _%sClass %sClass;\n",
@@ -1630,6 +1706,13 @@ generate_outfiles(void)
                           "}\n"
                           "#endif /* __cplusplus */\n");
        out_printf(outh,"\n#endif");
+       if(outph) {
+               if(!for_cpp)
+                       out_printf(outph,"\n#ifdef __cplusplus\n"
+                                  "}\n"
+                                  "#endif /* __cplusplus */\n");
+               out_printf(outph,"\n#endif");
+       }
 }
 
 #if 0
@@ -1647,12 +1730,17 @@ print_help(void)
 {
        fprintf(stderr,"Gob version %s\n\n",VERSION);
        fprintf(stderr,"Options:\n"
-               "\t--help,-h,-?         Display this help\n"
-               "\t--exit-on-warn,-w    Exit with an error on warnings\n"
-               "\t--no-exit-on-warn    Don't exit on warnings [default]\n"
-               "\t--for-cpp            Create C++ files\n"
-               "\t--no-touch-headers   Don't touch headers unless they "
-                                      "really changed\n");
+               "\t--help,-h,-?            Display this help\n"
+               "\t--exit-on-warn,-w       Exit with an error on warnings\n"
+               "\t--no-exit-on-warn       Don't exit on warnings [default]\n"
+               "\t--for-cpp               Create C++ files\n"
+               "\t--no-touch-headers      Don't touch headers unless they "
+                                         "really changed\n"
+               "\t--always-private-header Always create a private header "
+                                         "file, even if it would be empty\n"
+               "\t--no-private-header     Don't create a private header, "
+                                         "put private structure inside c "
+                                         "file\n");
 }
 
 static void
@@ -1685,6 +1773,12 @@ parse_options(int argc, char *argv[])
                        for_cpp = TRUE;
                } else if(strcmp(argv[i],"--no-touch-headers")==0) {
                        no_touch_headers = TRUE;
+               } else if(strcmp(argv[i],"--always-private-header")==0) {
+                       no_private_header = FALSE;
+                       always_private_header = TRUE;
+               } else if(strcmp(argv[i],"--no-private-header")==0) {
+                       always_private_header = FALSE;
+                       no_private_header = TRUE;
                } else if(strcmp(argv[i],"--")==0) {
                        /*further arguments are files*/
                        no_opts = TRUE;
index 6b3f48fdbfaf45665021e8a3945cda2c8968b6c8..ee1d3289d3853cda215208b390f3900e0d6acd9b 100644 (file)
--- a/src/out.c
+++ b/src/out.c
@@ -6,6 +6,7 @@
 
 extern FILE *out;
 extern FILE *outh;
+extern FILE *outph;
 
 extern gboolean for_cpp;
 
@@ -14,6 +15,7 @@ extern char *filebase;
 
 int outline = 1;
 int outhline = 1;
+int outphline = 1;
 
 static int
 strchrcnt(char *s, char c)
@@ -39,6 +41,8 @@ out_printf(FILE *fp,char *format,...)
                outline += strchrcnt(s,'\n');
        else if(fp == outh)
                outhline += strchrcnt(s,'\n');
+       else if(fp == outph)
+               outphline += strchrcnt(s,'\n');
        else
                g_assert_not_reached();
 
@@ -53,6 +57,8 @@ out_addline_infile(FILE *fp, int line)
                outline++;
        else if(fp == outh)
                outhline++;
+       else if(fp == outph)
+               outphline++;
        else
                g_assert_not_reached();
 
@@ -71,6 +77,9 @@ out_addline_outfile(FILE *fp)
        } else if(fp == outh) {
                outhline++;
                fprintf(fp,"#line %d \"%s.h\"\n",outhline,filebase);
+       } else if(fp == outph) {
+               outphline++;
+               fprintf(fp,"#line %d \"%s-private.h\"\n",outphline,filebase);
        } else
                g_assert_not_reached();
 
index 231684732d9c361d8efe8ffff2312033636ce2a7..f8593b9ab3265044cd82ac76ef58babefa5b758e 100644 (file)
 #define        TOKEN   274
 #define        NUMBER  275
 #define        TYPETOKEN       276
-#define        CCODE   277
-#define        HCODE   278
-#define        PUBLIC  279
-#define        PRIVATE 280
-#define        ARGUMENT        281
-#define        VIRTUAL 282
-#define        SIGNAL  283
-#define        OVERRIDE        284
+#define        ARRAY_DIM       277
+#define        CCODE   278
+#define        HCODE   279
+#define        PUBLIC  280
+#define        PRIVATE 281
+#define        ARGUMENT        282
+#define        VIRTUAL 283
+#define        SIGNAL  284
+#define        OVERRIDE        285
 
 #line 21 "parse.y"
 
@@ -96,11 +97,13 @@ yyerror(char *str)
 }
 
 static void
-push_variable(char *name, int scope, int line_no)
+push_variable(char *name, int scope, int line_no, char *postfix)
 {
        Node *var;
        Type *type = typestack->data;
        typestack = g_list_remove(typestack,typestack->data);
+
+       type->postfix = postfix;
        
        var = new_variable(scope,type,name,line_no);
        class_nodes = g_list_append(class_nodes, var);
@@ -117,7 +120,7 @@ push_function(int scope, char *oid, char *id, char *onerror,
                type = typestack->data;
                typestack = g_list_remove(typestack,typestack->data);
        } else {
-               type = (Type *)new_type(0,g_strdup("void"));
+               type = (Type *)new_type(0,g_strdup("void"),NULL);
        }
        
        /* a complicated and ugly test to figure out if we have
@@ -143,11 +146,13 @@ push_function(int scope, char *oid, char *id, char *onerror,
 }
 
 static void
-push_funcarg(char *name)
+push_funcarg(char *name, char *postfix)
 {
        Node *node;
        Type *type = typestack->data;
        typestack = g_list_remove(typestack,typestack->data);
+
+       type->postfix = postfix;
        
        node = new_funcarg(type,name,checks);
        checks = NULL;
@@ -167,7 +172,7 @@ push_init_arg(char *name, int is_class)
        else
                tn = g_strdup(((Class *)class)->otype);
 
-       type = new_type(1,tn);
+       type = new_type(1,tn,NULL);
        node = new_funcarg((Type *)type,name,NULL);
        funcargs = g_list_prepend(funcargs, node);
 }
@@ -178,7 +183,7 @@ push_self(char *id)
        Node *node;
        Node *type;
        GList *ch = NULL;
-       type = new_type(1,g_strdup(((Class *)class)->otype));
+       type = new_type(1,g_strdup(((Class *)class)->otype),NULL);
        ch = g_list_append(ch,new_check(NULL_CHECK,NULL));
        ch = g_list_append(ch,new_check(TYPE_CHECK,NULL));
        node = new_funcarg((Type *)type,id,ch);
@@ -186,7 +191,7 @@ push_self(char *id)
 }
 
 
-#line 174 "parse.y"
+#line 178 "parse.y"
 typedef union {
        char *id;
        GString *cbuf;
@@ -208,26 +213,26 @@ typedef union {
 
 
 
-#define        YYFINAL         198
+#define        YYFINAL         207
 #define        YYFLAG          -32768
-#define        YYNTBASE        45
+#define        YYNTBASE        46
 
-#define YYTRANSLATE(x) ((unsigned)(x) <= 284 ? yytranslate[x] : 73)
+#define YYTRANSLATE(x) ((unsigned)(x) <= 285 ? yytranslate[x] : 74)
 
 static const 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,    43,     2,     2,     2,     2,     2,     2,    34,
-    35,    37,     2,    38,    44,     2,     2,     2,    40,     2,
-     2,     2,     2,     2,     2,     2,     2,     2,    33,    42,
-    39,    41,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,    44,     2,     2,     2,     2,     2,     2,    35,
+    36,    38,     2,    39,    45,     2,     2,     2,    41,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,    34,    43,
+    40,    42,     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,    31,    36,    32,     2,     2,     2,     2,     2,
+     2,     2,    32,    37,    33,     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,
@@ -243,73 +248,76 @@ static const char yytranslate[] = {     0,
      2,     2,     2,     2,     2,     1,     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
+    27,    28,    29,    30,    31
 };
 
 #if YYDEBUG != 0
 static const short yyprhs[] = {     0,
      0,     4,     7,    10,    12,    15,    18,    20,    22,    27,
-    32,    35,    38,    41,    43,    45,    47,    52,    57,    69,
-    78,    82,    83,    87,    89,    91,    94,    96,    99,   102,
-   105,   107,   110,   113,   115,   117,   119,   121,   124,   126,
-   128,   131,   133,   136,   138,   140,   142,   144,   146,   149,
-   151,   155,   159,   162,   165,   167,   172,   176,   178,   181,
-   183,   193,   203,   212,   225,   235,   245,   251,   254,   258,
-   261,   262,   264,   266,   270,   272,   276,   278,   282,   284,
-   287,   294,   297,   299,   301,   304,   307,   311,   315,   319,
-   323,   325,   328
+    32,    35,    38,    41,    43,    45,    47,    52,    58,    63,
+    69,    81,    90,    94,    95,    99,   101,   103,   106,   108,
+   111,   114,   117,   119,   122,   125,   127,   129,   131,   133,
+   136,   138,   140,   143,   145,   148,   150,   152,   154,   156,
+   158,   161,   163,   167,   171,   174,   177,   179,   184,   188,
+   190,   193,   195,   205,   215,   224,   237,   247,   257,   263,
+   266,   270,   273,   274,   276,   278,   282,   284,   288,   290,
+   294,   296,   299,   303,   310,   318,   321,   323,   325,   328,
+   331,   335,   339,   343,   347,   349,   352
 };
 
-static const short yyrhs[] = {    46,
-    47,    46,     0,    47,    46,     0,    46,    47,     0,    47,
-     0,    46,    23,     0,    46,    24,     0,    23,     0,    24,
-     0,    48,    31,    49,    32,     0,     3,    22,     4,    22,
-     0,    49,    64,     0,    49,    50,     0,    49,    51,     0,
-    64,     0,    50,     0,    51,     0,    25,    54,    20,    33,
-     0,    26,    54,    20,    33,     0,    27,    52,    20,    20,
-    20,    31,    23,    20,    31,    23,    33,     0,    27,    52,
-    20,    20,    20,    31,    23,    33,     0,    34,    53,    35,
-     0,     0,    20,    36,    53,     0,    20,     0,    55,     0,
-     5,    55,     0,    56,     0,    56,    59,     0,    12,    57,
-     0,    11,    57,     0,    57,     0,    12,    18,     0,    11,
-    18,     0,    18,     0,    17,     0,    16,     0,    20,     0,
-    58,    20,     0,    22,     0,     6,     0,    13,    15,     0,
-    13,     0,    14,    15,     0,    14,     0,    15,     0,     9,
-     0,     8,     0,     7,     0,    37,    59,     0,    37,     0,
-    26,    20,    61,     0,    20,    26,    61,     0,    26,    61,
-     0,    20,    61,     0,    61,     0,    20,    34,    62,    35,
-     0,    62,    38,    20,     0,    20,     0,    31,    23,     0,
-    33,     0,    29,    60,    54,    20,    34,    66,    35,    65,
-    63,     0,    28,    26,    54,    20,    34,    66,    35,    65,
-    63,     0,    28,    54,    20,    34,    66,    35,    65,    63,
-     0,    30,    34,    22,    35,    54,    20,    34,    66,    35,
-    65,    31,    23,     0,    25,    54,    20,    34,    66,    35,
-    65,    31,    23,     0,    26,    54,    20,    34,    66,    35,
-    65,    31,    23,     0,    20,    34,    20,    35,    63,     0,
-    19,    72,     0,    19,    31,    23,     0,    39,    40,     0,
-     0,     6,     0,    20,     0,    20,    38,    67,     0,    67,
-     0,    68,    38,    10,     0,    68,     0,    68,    38,    69,
-     0,    69,     0,    54,    20,     0,    54,    20,    34,    20,
-    70,    35,     0,    70,    71,     0,    71,     0,    20,     0,
-    41,    72,     0,    42,    72,     0,    41,    39,    72,     0,
-    42,    39,    72,     0,    39,    39,    72,     0,    43,    39,
-    72,     0,    21,     0,    44,    21,     0,    20,     0
+static const short yyrhs[] = {    47,
+    48,    47,     0,    48,    47,     0,    47,    48,     0,    48,
+     0,    47,    24,     0,    47,    25,     0,    24,     0,    25,
+     0,    49,    32,    50,    33,     0,     3,    22,     4,    22,
+     0,    50,    65,     0,    50,    51,     0,    50,    52,     0,
+    65,     0,    51,     0,    52,     0,    26,    55,    20,    34,
+     0,    26,    55,    20,    23,    34,     0,    27,    55,    20,
+    34,     0,    27,    55,    20,    23,    34,     0,    28,    53,
+    20,    20,    20,    32,    24,    20,    32,    24,    34,     0,
+    28,    53,    20,    20,    20,    32,    24,    34,     0,    35,
+    54,    36,     0,     0,    20,    37,    54,     0,    20,     0,
+    56,     0,     5,    56,     0,    57,     0,    57,    60,     0,
+    12,    58,     0,    11,    58,     0,    58,     0,    12,    18,
+     0,    11,    18,     0,    18,     0,    17,     0,    16,     0,
+    20,     0,    59,    20,     0,    22,     0,     6,     0,    13,
+    15,     0,    13,     0,    14,    15,     0,    14,     0,    15,
+     0,     9,     0,     8,     0,     7,     0,    38,    60,     0,
+    38,     0,    27,    20,    62,     0,    20,    27,    62,     0,
+    27,    62,     0,    20,    62,     0,    62,     0,    20,    35,
+    63,    36,     0,    63,    39,    20,     0,    20,     0,    32,
+    24,     0,    34,     0,    30,    61,    55,    20,    35,    67,
+    36,    66,    64,     0,    29,    27,    55,    20,    35,    67,
+    36,    66,    64,     0,    29,    55,    20,    35,    67,    36,
+    66,    64,     0,    31,    35,    22,    36,    55,    20,    35,
+    67,    36,    66,    32,    24,     0,    26,    55,    20,    35,
+    67,    36,    66,    32,    24,     0,    27,    55,    20,    35,
+    67,    36,    66,    32,    24,     0,    20,    35,    20,    36,
+    64,     0,    19,    73,     0,    19,    32,    24,     0,    40,
+    41,     0,     0,     6,     0,    20,     0,    20,    39,    68,
+     0,    68,     0,    69,    39,    10,     0,    69,     0,    69,
+    39,    70,     0,    70,     0,    55,    20,     0,    55,    20,
+    23,     0,    55,    20,    35,    20,    71,    36,     0,    55,
+    20,    23,    35,    20,    71,    36,     0,    71,    72,     0,
+    72,     0,    20,     0,    42,    73,     0,    43,    73,     0,
+    42,    40,    73,     0,    43,    40,    73,     0,    40,    40,
+    73,     0,    44,    40,    73,     0,    21,     0,    45,    21,
+     0,    20,     0
 };
 
 #endif
 
 #if YYDEBUG != 0
 static const short yyrline[] = { 0,
-   193,   194,   195,   196,   199,   203,   207,   211,   217,   224,
-   229,   230,   231,   232,   233,   234,   237,   240,   244,   273,
-   299,   300,   303,   306,   312,   313,   321,   325,   332,   335,
-   338,   341,   344,   347,   350,   353,   356,   359,   363,   366,
-   371,   374,   377,   380,   383,   388,   391,   394,   399,   400,
-   403,   415,   427,   430,   442,   447,   452,   455,   460,   461,
-   465,   475,   485,   495,   501,   506,   511,   532,   533,   537,
-   538,   541,   542,   553,   563,   566,   567,   570,   571,   574,
-   577,   587,   588,   591,   604,   608,   612,   616,   620,   624,
-   630,   631,   635
+   197,   198,   199,   200,   203,   207,   211,   215,   221,   228,
+   233,   234,   235,   236,   237,   238,   241,   244,   247,   250,
+   254,   283,   309,   310,   313,   316,   322,   323,   331,   335,
+   342,   345,   348,   351,   354,   357,   360,   363,   366,   369,
+   373,   376,   381,   384,   387,   390,   393,   398,   401,   404,
+   409,   410,   413,   425,   437,   440,   452,   457,   462,   465,
+   470,   471,   475,   485,   495,   505,   511,   516,   521,   542,
+   543,   547,   548,   551,   552,   563,   573,   576,   577,   580,
+   581,   584,   587,   590,   598,   608,   609,   612,   625,   629,
+   633,   637,   641,   645,   651,   652,   656
 };
 #endif
 
@@ -319,161 +327,165 @@ static const short yyrline[] = { 0,
 static const char * const yytname[] = {   "$","error","$undefined.","CLASS",
 "FROM","CONST","VOID","STRUCT","UNION","ENUM","THREEDOTS","SIGNED","UNSIGNED",
 "LONG","SHORT","INT","FLOAT","DOUBLE","CHAR","ONERROR","TOKEN","NUMBER","TYPETOKEN",
-"CCODE","HCODE","PUBLIC","PRIVATE","ARGUMENT","VIRTUAL","SIGNAL","OVERRIDE",
-"'{'","'}'","';'","'('","')'","'|'","'*'","','","'='","'1'","'>'","'<'","'!'",
-"'-'","prog","ccodes","class","classdec","classcode","variable","argument","argflags",
-"flaglist","type","type1","type2","integer","tspecifier","stars","fullsigtype",
-"sigtype","tokenlist","codenocode","method","onerror","funcargs","arglist","arglist1",
-"arg","checklist","check","numtok", NULL
+"ARRAY_DIM","CCODE","HCODE","PUBLIC","PRIVATE","ARGUMENT","VIRTUAL","SIGNAL",
+"OVERRIDE","'{'","'}'","';'","'('","')'","'|'","'*'","','","'='","'1'","'>'",
+"'<'","'!'","'-'","prog","ccodes","class","classdec","classcode","variable",
+"argument","argflags","flaglist","type","type1","type2","integer","tspecifier",
+"stars","fullsigtype","sigtype","tokenlist","codenocode","method","onerror",
+"funcargs","arglist","arglist1","arg","checklist","check","numtok", NULL
 };
 #endif
 
 static const short yyr1[] = {     0,
-    45,    45,    45,    45,    46,    46,    46,    46,    47,    48,
-    49,    49,    49,    49,    49,    49,    50,    50,    51,    51,
+    46,    46,    46,    46,    47,    47,    47,    47,    48,    49,
+    50,    50,    50,    50,    50,    50,    51,    51,    51,    51,
     52,    52,    53,    53,    54,    54,    55,    55,    56,    56,
-    56,    56,    56,    56,    56,    56,    56,    56,    56,    56,
-    57,    57,    57,    57,    57,    58,    58,    58,    59,    59,
-    60,    60,    60,    60,    60,    61,    62,    62,    63,    63,
-    64,    64,    64,    64,    64,    64,    64,    65,    65,    65,
-    65,    66,    66,    66,    66,    67,    67,    68,    68,    69,
-    69,    70,    70,    71,    71,    71,    71,    71,    71,    71,
-    72,    72,    72
+    57,    57,    57,    57,    57,    57,    57,    57,    57,    57,
+    57,    57,    58,    58,    58,    58,    58,    59,    59,    59,
+    60,    60,    61,    61,    61,    61,    61,    62,    63,    63,
+    64,    64,    65,    65,    65,    65,    65,    65,    65,    66,
+    66,    66,    66,    67,    67,    67,    67,    68,    68,    69,
+    69,    70,    70,    70,    70,    71,    71,    72,    72,    72,
+    72,    72,    72,    72,    73,    73,    73
 };
 
 static const short yyr2[] = {     0,
      3,     2,     2,     1,     2,     2,     1,     1,     4,     4,
-     2,     2,     2,     1,     1,     1,     4,     4,    11,     8,
-     3,     0,     3,     1,     1,     2,     1,     2,     2,     2,
-     1,     2,     2,     1,     1,     1,     1,     2,     1,     1,
-     2,     1,     2,     1,     1,     1,     1,     1,     2,     1,
-     3,     3,     2,     2,     1,     4,     3,     1,     2,     1,
-     9,     9,     8,    12,     9,     9,     5,     2,     3,     2,
-     0,     1,     1,     3,     1,     3,     1,     3,     1,     2,
-     6,     2,     1,     1,     2,     2,     3,     3,     3,     3,
-     1,     2,     1
+     2,     2,     2,     1,     1,     1,     4,     5,     4,     5,
+    11,     8,     3,     0,     3,     1,     1,     2,     1,     2,
+     2,     2,     1,     2,     2,     1,     1,     1,     1,     2,
+     1,     1,     2,     1,     2,     1,     1,     1,     1,     1,
+     2,     1,     3,     3,     2,     2,     1,     4,     3,     1,
+     2,     1,     9,     9,     8,    12,     9,     9,     5,     2,
+     3,     2,     0,     1,     1,     3,     1,     3,     1,     3,
+     1,     2,     3,     6,     7,     2,     1,     1,     2,     2,
+     3,     3,     3,     3,     1,     2,     1
 };
 
 static const short yydefact[] = {     0,
      0,     7,     8,     0,     4,     0,     0,     5,     6,     3,
-     2,     0,     0,     1,     0,     0,     0,    22,     0,     0,
-     0,     0,    15,    16,    14,    10,     0,     0,    40,    48,
-    47,    46,     0,     0,    42,    44,    45,    36,    35,    34,
-    37,    39,     0,    25,    27,    31,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,    55,     0,     9,    12,    13,
-    11,     0,    26,    33,    30,    32,    29,    41,    43,     0,
-    50,    28,    38,     0,    24,     0,     0,     0,     0,     0,
-     0,     0,    54,     0,    53,     0,     0,     0,    17,     0,
-    49,    18,     0,     0,    21,     0,     0,     0,    52,    58,
-     0,    51,     0,     0,     0,    60,    67,    40,    37,     0,
-     0,    75,    77,    79,     0,    23,     0,     0,     0,    56,
-     0,     0,     0,    59,     0,    80,    71,     0,    71,     0,
-     0,    71,    57,     0,     0,    74,     0,     0,     0,     0,
-    76,    78,     0,     0,    71,     0,    71,     0,     0,    93,
-    91,     0,     0,    68,    70,     0,     0,     0,    20,     0,
-    63,     0,     0,    84,     0,     0,     0,     0,     0,    83,
-    69,    92,    65,    66,     0,    62,    61,    71,     0,     0,
-    85,     0,    86,     0,    81,    82,     0,     0,    89,    87,
-    88,    90,    19,     0,    64,     0,     0,     0
+     2,     0,     0,     1,     0,     0,     0,    24,     0,     0,
+     0,     0,    15,    16,    14,    10,     0,     0,    42,    50,
+    49,    48,     0,     0,    44,    46,    47,    38,    37,    36,
+    39,    41,     0,    27,    29,    33,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,    57,     0,     9,    12,    13,
+    11,     0,    28,    35,    32,    34,    31,    43,    45,     0,
+    52,    30,    40,     0,    26,     0,     0,     0,     0,     0,
+     0,     0,    56,     0,    55,     0,     0,     0,     0,    17,
+     0,    51,     0,    19,     0,     0,    23,     0,     0,     0,
+    54,    60,     0,    53,     0,     0,     0,    62,    69,    18,
+    42,    39,     0,     0,    77,    79,    81,    20,     0,    25,
+     0,     0,     0,    58,     0,     0,     0,    61,     0,    82,
+    73,     0,    73,     0,     0,    73,    59,     0,     0,    76,
+    83,     0,     0,     0,     0,    78,    80,     0,     0,    73,
+     0,    73,     0,     0,     0,    97,    95,     0,     0,    70,
+    72,     0,     0,     0,    22,     0,    65,     0,     0,     0,
+    88,     0,     0,     0,     0,     0,    87,    71,    96,    67,
+    68,     0,    64,    63,    73,     0,     0,     0,    89,     0,
+    90,     0,    84,    86,     0,     0,    85,    93,    91,    92,
+    94,    21,     0,    66,     0,     0,     0
 };
 
-static const short yydefgoto[] = {   196,
-     4,     5,     6,    22,    23,    24,    50,    76,   110,    44,
-    45,    46,    47,    72,    55,    56,   101,   107,    25,   140,
-   111,   112,   113,   114,   169,   170,   154
+static const short yydefgoto[] = {   205,
+     4,     5,     6,    22,    23,    24,    50,    76,   113,    44,
+    45,    46,    47,    72,    55,    56,   103,   109,    25,   145,
+   114,   115,   116,   117,   176,   177,   160
 };
 
-static const short yypact[] = {    21,
-   -18,-32768,-32768,    68,    66,    20,    54,-32768,-32768,    66,
-   155,   171,     0,   155,    48,   116,   116,    52,    61,   -14,
-    59,   160,-32768,-32768,-32768,-32768,    29,   151,-32768,-32768,
--32768,-32768,    81,   189,   111,   120,-32768,-32768,-32768,-32768,
--32768,-32768,   117,-32768,    64,-32768,   124,   133,   135,   152,
-   116,   154,   150,   163,   116,-32768,   186,-32768,-32768,-32768,
--32768,   158,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   148,
-    64,-32768,-32768,   161,   173,   175,   191,   192,   179,   180,
-   195,   196,-32768,    28,-32768,   197,   183,    86,-32768,   134,
--32768,-32768,   134,   135,-32768,   199,   187,   134,-32768,-32768,
-   -22,-32768,   188,   116,   200,-32768,-32768,   185,    18,   204,
-   190,-32768,   193,-32768,   194,-32768,   201,   134,   198,-32768,
-   206,   134,   207,-32768,   116,   202,    41,    98,    41,   205,
-   203,    41,-32768,   208,   210,-32768,   214,    -6,   209,   211,
--32768,-32768,   215,    26,    41,    86,    41,   134,    22,-32768,
--32768,   212,   216,-32768,-32768,   217,   218,   219,-32768,    86,
--32768,    86,   213,-32768,   220,    -3,     8,   221,    -9,-32768,
--32768,-32768,-32768,-32768,   222,-32768,-32768,    41,    -1,    -1,
--32768,    -1,-32768,    -1,-32768,-32768,   223,   224,-32768,-32768,
--32768,-32768,-32768,   228,-32768,   230,   239,-32768
+static const short yypact[] = {     3,
+    47,-32768,-32768,    70,   169,    94,    75,-32768,-32768,   169,
+   182,   171,    79,   182,   100,   125,   125,   109,    69,    77,
+   111,   159,-32768,-32768,-32768,-32768,   108,   160,-32768,-32768,
+-32768,-32768,   190,   196,   138,   147,-32768,-32768,-32768,-32768,
+-32768,-32768,   144,-32768,   132,-32768,   163,   193,   197,   198,
+   125,   199,    32,   200,   125,-32768,   194,-32768,-32768,-32768,
+-32768,   145,-32768,-32768,-32768,-32768,-32768,-32768,-32768,    65,
+   132,-32768,-32768,   161,   184,   186,   203,   204,   191,   192,
+   205,   208,-32768,    26,-32768,   209,   195,    76,   201,-32768,
+   143,-32768,   202,-32768,   143,   197,-32768,   210,   206,   143,
+-32768,-32768,    66,-32768,   207,   125,   213,-32768,-32768,-32768,
+   211,   176,   212,   214,-32768,   215,-32768,-32768,   216,-32768,
+   217,   143,   219,-32768,   218,   143,   220,-32768,   125,    21,
+    -6,   107,    -6,   221,   222,    -6,-32768,   223,   225,-32768,
+   226,   224,    -9,   227,   230,-32768,-32768,   231,    29,    -6,
+    76,    -6,   143,   228,    28,-32768,-32768,   229,   235,-32768,
+-32768,   233,   240,   234,-32768,    76,-32768,    76,   236,    28,
+-32768,   237,    -2,     5,   238,    11,-32768,-32768,-32768,-32768,
+-32768,   241,-32768,-32768,    -6,    22,    -4,    -4,-32768,    -4,
+-32768,    -4,-32768,-32768,   239,   242,-32768,-32768,-32768,-32768,
+-32768,-32768,   243,-32768,   246,   251,-32768
 };
 
 static const short yypgoto[] = {-32768,
-    45,   243,-32768,-32768,   231,   232,-32768,   164,   -16,   229,
--32768,   172,-32768,   181,-32768,   -44,-32768,    15,   240,  -124,
-   -91,   136,-32768,   137,-32768,    94,   -82
+    93,   265,-32768,-32768,   248,   249,-32768,   137,   -16,   247,
+-32768,   -13,-32768,   168,-32768,   -44,-32768,  -136,   254,  -128,
+   -93,   105,-32768,   148,    73,  -172,   -81
 };
 
 
-#define        YYLAST          265
+#define        YYLAST          280
 
 
 static const short yytable[] = {    43,
-    48,   115,    52,     7,   143,    53,   119,   146,    83,    85,
-   164,    54,   120,   150,   151,   121,   150,   151,   150,   151,
-   160,    26,   162,     1,   152,   185,   131,   150,   151,   165,
-   134,   166,   167,   168,    78,   180,    99,   153,    86,   102,
-   153,   164,   153,     2,     3,   158,   182,    80,    62,    11,
-    12,   153,   -73,   188,    14,   125,   163,    13,   159,   138,
-   165,    82,   166,   167,   168,    28,    29,    30,    31,    32,
-     1,    33,    34,    35,    36,    37,    38,    39,    40,   139,
-    41,    27,    42,   181,   183,    49,    51,   123,     2,     3,
-     8,     9,    57,    35,    36,    37,   189,   190,    64,   191,
-    71,   192,    28,    29,    30,    31,    32,   141,    33,    34,
-    35,    36,    37,    38,    39,    40,   105,    41,   106,    42,
-    28,    29,    30,    31,    32,    68,    33,    34,    35,    36,
-    37,    38,    39,    40,    69,    41,    70,    42,    28,   108,
-    30,    31,    32,    73,    33,    34,    35,    36,    37,    38,
-    39,    40,    74,   109,    75,    42,    29,    30,    31,    32,
-   161,    33,    34,    35,    36,    37,    38,    39,    40,    80,
-    41,    77,    42,    79,   176,    81,   177,     8,     9,    15,
-    89,    90,    84,    82,    16,    17,    18,    19,    20,    21,
-    15,    58,    88,    92,    93,    16,    17,    18,    19,    20,
-    21,    35,    36,    37,    65,    67,    66,    87,    94,    95,
-    96,    97,    98,    82,    80,   100,   103,   104,   117,   -72,
-   118,   122,   124,   126,   127,   133,   135,   144,   129,   197,
-   128,   130,   132,   149,   171,   137,   172,   145,   198,   173,
-   174,   156,   147,   148,   187,   157,    10,   178,   155,   175,
-   195,    91,    59,    60,   194,   193,    63,   116,   179,   184,
-   136,    61,   186,     0,   142
+    48,   119,    52,   194,   148,     1,   123,   151,    83,    85,
+   156,   157,   143,   194,   167,   156,   157,   156,   157,    65,
+    67,   166,   158,   168,   156,   157,     2,     3,   135,   183,
+   171,   184,   138,   144,    78,   159,   101,   188,    86,   104,
+   159,   171,   159,   141,   190,    80,   193,   171,   164,   159,
+   172,    80,   173,   174,   175,   142,   196,   197,    81,   169,
+    82,   172,   165,   173,   174,   175,    82,   172,     7,   173,
+   174,   175,     1,    28,    29,    30,    31,    32,    13,    33,
+    34,    35,    36,    37,    38,    39,    40,    89,    41,   127,
+    42,   189,   191,     8,     9,    51,    53,    11,    90,    91,
+    26,   124,    14,    54,   125,   198,   199,   107,   200,   108,
+   201,    28,    29,    30,    31,    32,   146,    33,    34,    35,
+    36,    37,    38,    39,    40,    12,    41,    62,    42,    28,
+    29,    30,    31,    32,    27,    33,    34,    35,    36,    37,
+    38,    39,    40,    49,    41,    57,    42,    28,   111,    30,
+    31,    32,    68,    33,    34,    35,    36,    37,    38,    39,
+    40,    69,   112,    70,    42,    29,    30,    31,    32,    71,
+    33,    34,    35,    36,    37,    38,    39,    40,    15,    41,
+    88,    42,    73,    93,    16,    17,    18,    19,    20,    21,
+    15,    58,     2,     3,    94,    95,    16,    17,    18,    19,
+    20,    21,    35,    36,    37,     8,     9,    64,    35,    36,
+    37,   -75,    74,    66,   129,    87,    75,    77,    79,    84,
+    96,    97,    98,    99,    80,   100,    82,   102,   105,   121,
+   106,   130,   120,   140,   110,   118,   128,   137,    92,   139,
+   122,   126,   186,   155,   149,   206,   -74,   170,   134,   131,
+   207,   133,   178,   132,   136,   179,   180,   150,   152,   153,
+   154,   162,   163,   181,   195,   182,   204,   161,    10,    59,
+    60,   185,   202,   203,    63,    61,   187,   192,     0,   147
 };
 
 static const short yycheck[] = {    16,
-    17,    93,    19,    22,   129,    20,    98,   132,    53,    54,
-    20,    26,    35,    20,    21,    38,    20,    21,    20,    21,
-   145,    22,   147,     3,    31,    35,   118,    20,    21,    39,
-   122,    41,    42,    43,    51,    39,    81,    44,    55,    84,
-    44,    20,    44,    23,    24,    20,    39,    20,    20,     5,
-    31,    44,    35,   178,    10,    38,   148,     4,    33,    19,
-    39,    34,    41,    42,    43,     5,     6,     7,     8,     9,
-     3,    11,    12,    13,    14,    15,    16,    17,    18,    39,
-    20,    34,    22,   166,   167,    34,    26,   104,    23,    24,
-    23,    24,    34,    13,    14,    15,   179,   180,    18,   182,
-    37,   184,     5,     6,     7,     8,     9,    10,    11,    12,
-    13,    14,    15,    16,    17,    18,    31,    20,    33,    22,
-     5,     6,     7,     8,     9,    15,    11,    12,    13,    14,
-    15,    16,    17,    18,    15,    20,    20,    22,     5,     6,
-     7,     8,     9,    20,    11,    12,    13,    14,    15,    16,
-    17,    18,    20,    20,    20,    22,     6,     7,     8,     9,
-   146,    11,    12,    13,    14,    15,    16,    17,    18,    20,
-    20,    20,    22,    20,   160,    26,   162,    23,    24,    20,
-    33,    34,    20,    34,    25,    26,    27,    28,    29,    30,
-    20,    32,    35,    33,    34,    25,    26,    27,    28,    29,
-    30,    13,    14,    15,    33,    34,    18,    22,    36,    35,
-    20,    20,    34,    34,    20,    20,    20,    35,    20,    35,
-    34,    34,    23,    20,    35,    20,    20,    23,    35,     0,
-    38,    31,    35,    20,    23,    34,    21,    35,     0,    23,
-    23,    31,    35,    34,    23,    31,     4,    35,    40,    31,
-    23,    71,    22,    22,    31,    33,    28,    94,    39,    39,
-   125,    22,   169,    -1,   128
+    17,    95,    19,   176,   133,     3,   100,   136,    53,    54,
+    20,    21,    19,   186,   151,    20,    21,    20,    21,    33,
+    34,   150,    32,   152,    20,    21,    24,    25,   122,   166,
+    20,   168,   126,    40,    51,    45,    81,    40,    55,    84,
+    45,    20,    45,    23,    40,    20,    36,    20,    20,    45,
+    40,    20,    42,    43,    44,    35,   185,    36,    27,   153,
+    35,    40,    34,    42,    43,    44,    35,    40,    22,    42,
+    43,    44,     3,     5,     6,     7,     8,     9,     4,    11,
+    12,    13,    14,    15,    16,    17,    18,    23,    20,   106,
+    22,   173,   174,    24,    25,    27,    20,     5,    34,    35,
+    22,    36,    10,    27,    39,   187,   188,    32,   190,    34,
+   192,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+    14,    15,    16,    17,    18,    32,    20,    20,    22,     5,
+     6,     7,     8,     9,    35,    11,    12,    13,    14,    15,
+    16,    17,    18,    35,    20,    35,    22,     5,     6,     7,
+     8,     9,    15,    11,    12,    13,    14,    15,    16,    17,
+    18,    15,    20,    20,    22,     6,     7,     8,     9,    38,
+    11,    12,    13,    14,    15,    16,    17,    18,    20,    20,
+    36,    22,    20,    23,    26,    27,    28,    29,    30,    31,
+    20,    33,    24,    25,    34,    35,    26,    27,    28,    29,
+    30,    31,    13,    14,    15,    24,    25,    18,    13,    14,
+    15,    36,    20,    18,    39,    22,    20,    20,    20,    20,
+    37,    36,    20,    20,    20,    35,    35,    20,    20,    20,
+    36,    20,    96,   129,    34,    34,    24,    20,    71,    20,
+    35,    35,   170,    20,    24,     0,    36,    20,    32,    36,
+     0,    36,    24,    39,    36,    21,    24,    36,    36,    35,
+    35,    32,    32,    24,    24,    32,    24,    41,     4,    22,
+    22,    36,    34,    32,    28,    22,    40,    40,    -1,   132
 };
 /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
 #line 3 "/usr/lib/bison.simple"
@@ -1019,51 +1031,51 @@ yyreduce:
   switch (yyn) {
 
 case 1:
-#line 193 "parse.y"
+#line 197 "parse.y"
 { ; ;
     break;}
 case 2:
-#line 194 "parse.y"
+#line 198 "parse.y"
 { ; ;
     break;}
 case 3:
-#line 195 "parse.y"
+#line 199 "parse.y"
 { ; ;
     break;}
 case 4:
-#line 196 "parse.y"
+#line 200 "parse.y"
 { ; ;
     break;}
 case 5:
-#line 199 "parse.y"
+#line 203 "parse.y"
 {
                        Node *node = new_ccode(FALSE,yyvsp[0].cbuf,ccode_line);
                        nodes = g_list_append(nodes,node);
                                        ;
     break;}
 case 6:
-#line 203 "parse.y"
+#line 207 "parse.y"
 {
                        Node *node = new_ccode(TRUE,yyvsp[0].cbuf,ccode_line);
                        nodes = g_list_append(nodes,node);
                                        ;
     break;}
 case 7:
-#line 207 "parse.y"
+#line 211 "parse.y"
 {
                        Node *node = new_ccode(FALSE,yyvsp[0].cbuf,ccode_line);
                        nodes = g_list_append(nodes,node);
                                        ;
     break;}
 case 8:
-#line 211 "parse.y"
+#line 215 "parse.y"
 {
                        Node *node = new_ccode(TRUE,yyvsp[0].cbuf,ccode_line);
                        nodes = g_list_append(nodes,node);
                                        ;
     break;}
 case 9:
-#line 217 "parse.y"
+#line 221 "parse.y"
 {
                        ((Class *)class)->nodes = class_nodes;
                        class_nodes = NULL;
@@ -1071,49 +1083,61 @@ case 9:
                                                ;
     break;}
 case 10:
-#line 224 "parse.y"
+#line 228 "parse.y"
 {
                        class = new_class(yyvsp[-2].id,yyvsp[0].id,NULL);
                                                ;
     break;}
 case 11:
-#line 229 "parse.y"
+#line 233 "parse.y"
 { ; ;
     break;}
 case 12:
-#line 230 "parse.y"
+#line 234 "parse.y"
 { ; ;
     break;}
 case 13:
-#line 231 "parse.y"
+#line 235 "parse.y"
 { ; ;
     break;}
 case 14:
-#line 232 "parse.y"
+#line 236 "parse.y"
 { ; ;
     break;}
 case 15:
-#line 233 "parse.y"
+#line 237 "parse.y"
 { ; ;
     break;}
 case 16:
-#line 234 "parse.y"
+#line 238 "parse.y"
 { ; ;
     break;}
 case 17:
-#line 237 "parse.y"
+#line 241 "parse.y"
 {
-                       push_variable(yyvsp[-1].id,PUBLIC_SCOPE,yyvsp[-3].line);
+                       push_variable(yyvsp[-1].id,PUBLIC_SCOPE,yyvsp[-3].line,NULL);
                                                ;
     break;}
 case 18:
-#line 240 "parse.y"
+#line 244 "parse.y"
 {
-                       push_variable(yyvsp[-1].id,PRIVATE_SCOPE,yyvsp[-3].line);
+                       push_variable(yyvsp[-2].id,PUBLIC_SCOPE,yyvsp[-4].line,yyvsp[-1].id);
                                                ;
     break;}
 case 19:
-#line 244 "parse.y"
+#line 247 "parse.y"
+{
+                       push_variable(yyvsp[-1].id,PRIVATE_SCOPE,yyvsp[-3].line,NULL);
+                                               ;
+    break;}
+case 20:
+#line 250 "parse.y"
+{
+                       push_variable(yyvsp[-2].id,PRIVATE_SCOPE,yyvsp[-4].line,yyvsp[-1].id);
+                                                ;
+    break;}
+case 21:
+#line 254 "parse.y"
 {
                        if(strcmp(yyvsp[-6].id,"get")==0 &&
                           strcmp(yyvsp[-3].id,"set")==0) {
@@ -1144,8 +1168,8 @@ case 19:
                        }
                                                ;
     break;}
-case 20:
-#line 273 "parse.y"
+case 22:
+#line 283 "parse.y"
 {
                        if(strcmp(yyvsp[-3].id,"get")==0) {
                                Node *node;
@@ -1171,32 +1195,32 @@ case 20:
                        }
                                                ;
     break;}
-case 21:
-#line 299 "parse.y"
+case 23:
+#line 309 "parse.y"
 { yyval.list = yyvsp[-1].list; ;
     break;}
-case 22:
-#line 300 "parse.y"
+case 24:
+#line 310 "parse.y"
 { yyval.list = NULL; ;
     break;}
-case 23:
-#line 303 "parse.y"
+case 25:
+#line 313 "parse.y"
 {
                        yyval.list = g_list_append(yyvsp[0].list,yyvsp[-2].id);
                                                ;
     break;}
-case 24:
-#line 306 "parse.y"
+case 26:
+#line 316 "parse.y"
 {
                        yyval.list = g_list_append(NULL,yyvsp[0].id);
                                                ;
     break;}
-case 25:
-#line 312 "parse.y"
+case 27:
+#line 322 "parse.y"
 { ; ;
     break;}
-case 26:
-#line 313 "parse.y"
+case 28:
+#line 323 "parse.y"
 {
                        Type *type = typestack->data;
                        char *oldname = type->name;
@@ -1204,152 +1228,152 @@ case 26:
                        g_free(oldname);
                                                ;
     break;}
-case 27:
-#line 321 "parse.y"
+case 29:
+#line 331 "parse.y"
 {
-                       Node *node = new_type(0,yyvsp[0].id);
+                       Node *node = new_type(0,yyvsp[0].id,NULL);
                        typestack = g_list_prepend(typestack,node);
                                                ;
     break;}
-case 28:
-#line 325 "parse.y"
+case 30:
+#line 335 "parse.y"
 {
-                       Node *node = new_type(stars,yyvsp[-1].id);
+                       Node *node = new_type(stars,yyvsp[-1].id,NULL);
                        stars = 0;
                        typestack = g_list_prepend(typestack,node);
                                                ;
     break;}
-case 29:
-#line 332 "parse.y"
+case 31:
+#line 342 "parse.y"
 {
                        yyval.id = g_strconcat("unsigned ",yyvsp[0].id,NULL);
                                                ;
     break;}
-case 30:
-#line 335 "parse.y"
+case 32:
+#line 345 "parse.y"
 {
                        yyval.id = g_strconcat("signed ",yyvsp[0].id,NULL);
                                                ;
     break;}
-case 31:
-#line 338 "parse.y"
+case 33:
+#line 348 "parse.y"
 {
                        yyval.id = g_strdup(yyvsp[0].id);
                                                ;
     break;}
-case 32:
-#line 341 "parse.y"
+case 34:
+#line 351 "parse.y"
 {
                        yyval.id = g_strdup("unsigned char");
                                                ;
     break;}
-case 33:
-#line 344 "parse.y"
+case 35:
+#line 354 "parse.y"
 {
                        yyval.id = g_strdup("signed char");
                                                ;
     break;}
-case 34:
-#line 347 "parse.y"
+case 36:
+#line 357 "parse.y"
 {
                        yyval.id = g_strdup("char");
                                                ;
     break;}
-case 35:
-#line 350 "parse.y"
+case 37:
+#line 360 "parse.y"
 {
                        yyval.id = g_strdup("double");
                                                ;
     break;}
-case 36:
-#line 353 "parse.y"
+case 38:
+#line 363 "parse.y"
 {
                        yyval.id = g_strdup("float");
                                                ;
     break;}
-case 37:
-#line 356 "parse.y"
+case 39:
+#line 366 "parse.y"
 {
                        yyval.id = yyvsp[0].id;
                                                ;
     break;}
-case 38:
-#line 359 "parse.y"
+case 40:
+#line 369 "parse.y"
 {
                        yyval.id = g_strconcat(yyvsp[-1].id,yyvsp[0].id,NULL);
                        g_free(yyvsp[0].id);
                                                ;
     break;}
-case 39:
-#line 363 "parse.y"
+case 41:
+#line 373 "parse.y"
 {
                        yyval.id = yyvsp[0].id;
                                                ;
     break;}
-case 40:
-#line 366 "parse.y"
+case 42:
+#line 376 "parse.y"
 {
                        yyval.id = g_strdup("void");
                                                ;
     break;}
-case 41:
-#line 371 "parse.y"
+case 43:
+#line 381 "parse.y"
 {
                        yyval.id = "long int";
                                                ;
     break;}
-case 42:
-#line 374 "parse.y"
+case 44:
+#line 384 "parse.y"
 {
                        yyval.id = "long";
                                                ;
     break;}
-case 43:
-#line 377 "parse.y"
+case 45:
+#line 387 "parse.y"
 {
                        yyval.id = "short int";
                                                ;
     break;}
-case 44:
-#line 380 "parse.y"
+case 46:
+#line 390 "parse.y"
 {
                        yyval.id = "short";
                                                ;
     break;}
-case 45:
-#line 383 "parse.y"
+case 47:
+#line 393 "parse.y"
 {
                        yyval.id = "int";
                                                ;
     break;}
-case 46:
-#line 388 "parse.y"
+case 48:
+#line 398 "parse.y"
 {
                        yyval.id = "enum ";
                                                ;
     break;}
-case 47:
-#line 391 "parse.y"
+case 49:
+#line 401 "parse.y"
 {
                        yyval.id = "union ";
                                                ;
     break;}
-case 48:
-#line 394 "parse.y"
+case 50:
+#line 404 "parse.y"
 {
                        yyval.id = "struct ";
                                                ;
     break;}
-case 49:
-#line 399 "parse.y"
+case 51:
+#line 409 "parse.y"
 { stars++; ;
     break;}
-case 50:
-#line 400 "parse.y"
+case 52:
+#line 410 "parse.y"
 { stars++; ;
     break;}
-case 51:
-#line 403 "parse.y"
+case 53:
+#line 413 "parse.y"
 {
                        if(strcmp(yyvsp[-1].id,"first")==0)
                                yyval.sigtype = PRIVATE_SIGNAL_FIRST_METHOD;
@@ -1363,8 +1387,8 @@ case 51:
                        g_free(yyvsp[-1].id);
                                        ;
     break;}
-case 52:
-#line 415 "parse.y"
+case 54:
+#line 425 "parse.y"
 {
                        if(strcmp(yyvsp[-2].id,"first")==0)
                                yyval.sigtype = PRIVATE_SIGNAL_FIRST_METHOD;
@@ -1378,14 +1402,14 @@ case 52:
                        g_free(yyvsp[-2].id);
                                        ;
     break;}
-case 53:
-#line 427 "parse.y"
+case 55:
+#line 437 "parse.y"
 {
                        yyval.sigtype = PRIVATE_SIGNAL_LAST_METHOD;
                                        ;
     break;}
-case 54:
-#line 430 "parse.y"
+case 56:
+#line 440 "parse.y"
 {
                        if(strcmp(yyvsp[-1].id,"first")==0)
                                yyval.sigtype = SIGNAL_FIRST_METHOD;
@@ -1399,40 +1423,40 @@ case 54:
                        g_free(yyvsp[-1].id);
                                        ;
     break;}
-case 55:
-#line 442 "parse.y"
+case 57:
+#line 452 "parse.y"
 {
                        yyval.sigtype = SIGNAL_LAST_METHOD;
                                        ;
     break;}
-case 56:
-#line 447 "parse.y"
+case 58:
+#line 457 "parse.y"
 {
                        gtktypes = g_list_prepend(gtktypes,yyvsp[-3].id);
                                                ;
     break;}
-case 57:
-#line 452 "parse.y"
+case 59:
+#line 462 "parse.y"
 {
                        gtktypes = g_list_append(gtktypes,yyvsp[0].id);
                                                ;
     break;}
-case 58:
-#line 455 "parse.y"
+case 60:
+#line 465 "parse.y"
 { 
                        gtktypes = g_list_append(gtktypes,yyvsp[0].id);
                                                        ;
     break;}
-case 59:
-#line 460 "parse.y"
+case 61:
+#line 470 "parse.y"
 { yyval.cbuf=yyvsp[0].cbuf; ;
     break;}
-case 60:
-#line 461 "parse.y"
+case 62:
+#line 471 "parse.y"
 { yyval.cbuf = NULL; ;
     break;}
-case 61:
-#line 465 "parse.y"
+case 63:
+#line 475 "parse.y"
 {
                        if(!has_self) {
                                yyerror(_("signal without 'self' as "
@@ -1444,8 +1468,8 @@ case 61:
                                      ccode_line,vararg);
                                                                        ;
     break;}
-case 62:
-#line 475 "parse.y"
+case 64:
+#line 485 "parse.y"
 {
                        if(!has_self) {
                                yyerror(_("virtual method without 'self' as "
@@ -1457,8 +1481,8 @@ case 62:
                                      ccode_line,vararg);
                                                                        ;
     break;}
-case 63:
-#line 485 "parse.y"
+case 65:
+#line 495 "parse.y"
 {
                        if(!has_self) {
                                yyerror(_("virtual method without 'self' as "
@@ -1470,8 +1494,8 @@ case 63:
                                      ccode_line,vararg);
                                                                        ;
     break;}
-case 64:
-#line 495 "parse.y"
+case 66:
+#line 505 "parse.y"
 {
                        push_function(OVERRIDE_METHOD, yyvsp[-9].id,
                                      yyvsp[-6].id, yyvsp[-2].id, yyvsp[0].cbuf,
@@ -1479,24 +1503,24 @@ case 64:
                                      vararg);
                                                                        ;
     break;}
-case 65:
-#line 501 "parse.y"
+case 67:
+#line 511 "parse.y"
 {
                        push_function(PUBLIC_SCOPE, NULL, yyvsp[-6].id,
                                      yyvsp[-2].id, yyvsp[0].cbuf,yyvsp[-8].line,yyvsp[-1].line,
                                      vararg);
                                                                ;
     break;}
-case 66:
-#line 506 "parse.y"
+case 68:
+#line 516 "parse.y"
 {
                        push_function(PRIVATE_SCOPE, NULL, yyvsp[-6].id,
                                      yyvsp[-2].id, yyvsp[0].cbuf,yyvsp[-8].line,yyvsp[-1].line,
                                      vararg);
                                                                ;
     break;}
-case 67:
-#line 511 "parse.y"
+case 69:
+#line 521 "parse.y"
 {
                        if(strcmp(yyvsp[-4].id,"init")==0) {
                                push_init_arg(yyvsp[-2].id,FALSE);
@@ -1517,31 +1541,31 @@ case 67:
                        }
                                                ;
     break;}
-case 68:
-#line 532 "parse.y"
+case 70:
+#line 542 "parse.y"
 { yyval.id = yyvsp[0].id; ;
     break;}
-case 69:
-#line 533 "parse.y"
+case 71:
+#line 543 "parse.y"
 {
                        yyval.id = (yyvsp[0].cbuf)->str;
                        g_string_free(yyvsp[0].cbuf,FALSE);
                                        ;
     break;}
-case 70:
-#line 537 "parse.y"
+case 72:
+#line 547 "parse.y"
 { ; ;
     break;}
-case 71:
-#line 538 "parse.y"
+case 73:
+#line 548 "parse.y"
 { yyval.id = NULL; ;
     break;}
-case 72:
-#line 541 "parse.y"
+case 74:
+#line 551 "parse.y"
 { vararg = FALSE; has_self = FALSE; ;
     break;}
-case 73:
-#line 542 "parse.y"
+case 75:
+#line 552 "parse.y"
 {
                        vararg = FALSE;
                        has_self = TRUE;
@@ -1554,8 +1578,8 @@ case 73:
                        }
                                                ;
     break;}
-case 74:
-#line 553 "parse.y"
+case 76:
+#line 563 "parse.y"
 {
                        has_self = TRUE;
                        if(strcmp(yyvsp[-2].id,"self")==0)
@@ -1567,53 +1591,70 @@ case 74:
                        }
                                        ;
     break;}
-case 75:
-#line 563 "parse.y"
+case 77:
+#line 573 "parse.y"
 { has_self = FALSE; ;
     break;}
-case 76:
-#line 566 "parse.y"
+case 78:
+#line 576 "parse.y"
 { vararg = TRUE; ;
     break;}
-case 77:
-#line 567 "parse.y"
+case 79:
+#line 577 "parse.y"
 { vararg = FALSE; ;
     break;}
-case 78:
-#line 570 "parse.y"
+case 80:
+#line 580 "parse.y"
 { ; ;
     break;}
-case 79:
-#line 571 "parse.y"
+case 81:
+#line 581 "parse.y"
 { ; ;
     break;}
-case 80:
-#line 574 "parse.y"
+case 82:
+#line 584 "parse.y"
 {
-                       push_funcarg(yyvsp[0].id);
+                       push_funcarg(yyvsp[0].id,NULL);
                                                                ;
     break;}
-case 81:
-#line 577 "parse.y"
+case 83:
+#line 587 "parse.y"
+{
+                       push_funcarg(yyvsp[-1].id,yyvsp[0].id);
+                                                               ;
+    break;}
+case 84:
+#line 590 "parse.y"
 {
                        if(strcmp(yyvsp[-2].id,"check")!=0) {
                                yyerror(_("parse error"));
                                YYERROR;
                        }
                        g_free(yyvsp[-2].id);
-                       push_funcarg(yyvsp[-4].id);
+                       push_funcarg(yyvsp[-4].id,NULL);
                                                                ;
     break;}
-case 82:
-#line 587 "parse.y"
+case 85:
+#line 598 "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 86:
+#line 608 "parse.y"
 { ; ;
     break;}
-case 83:
-#line 588 "parse.y"
+case 87:
+#line 609 "parse.y"
 { ; ;
     break;}
-case 84:
-#line 591 "parse.y"
+case 88:
+#line 612 "parse.y"
 {
                        if(strcmp(yyvsp[0].id,"type")==0) {
                                Node *node = new_check(TYPE_CHECK,NULL);
@@ -1628,61 +1669,61 @@ case 84:
                        g_free(yyvsp[0].id);
                                        ;
     break;}
-case 85:
-#line 604 "parse.y"
+case 89:
+#line 625 "parse.y"
 {
                        Node *node = new_check(GT_CHECK,yyvsp[0].id);
                        checks = g_list_append(checks,node);
                                        ;
     break;}
-case 86:
-#line 608 "parse.y"
+case 90:
+#line 629 "parse.y"
 {
                        Node *node = new_check(LT_CHECK,yyvsp[0].id);
                        checks = g_list_append(checks,node);
                                        ;
     break;}
-case 87:
-#line 612 "parse.y"
+case 91:
+#line 633 "parse.y"
 {
                        Node *node = new_check(GE_CHECK,yyvsp[0].id);
                        checks = g_list_append(checks,node);
                                        ;
     break;}
-case 88:
-#line 616 "parse.y"
+case 92:
+#line 637 "parse.y"
 {
                        Node *node = new_check(LE_CHECK,yyvsp[0].id);
                        checks = g_list_append(checks,node);
                                        ;
     break;}
-case 89:
-#line 620 "parse.y"
+case 93:
+#line 641 "parse.y"
 {
                        Node *node = new_check(EQ_CHECK,yyvsp[0].id);
                        checks = g_list_append(checks,node);
                                        ;
     break;}
-case 90:
-#line 624 "parse.y"
+case 94:
+#line 645 "parse.y"
 {
                        Node *node = new_check(NE_CHECK,yyvsp[0].id);
                        checks = g_list_append(checks,node);
                                        ;
     break;}
-case 91:
-#line 630 "parse.y"
+case 95:
+#line 651 "parse.y"
 { yyval.id = yyvsp[0].id; ;
     break;}
-case 92:
-#line 631 "parse.y"
+case 96:
+#line 652 "parse.y"
 {
                        yyval.id = g_strconcat("-",yyvsp[0].id,NULL);
                        g_free(yyvsp[0].id);
                                        ;
     break;}
-case 93:
-#line 635 "parse.y"
+case 97:
+#line 656 "parse.y"
 { yyval.id = yyvsp[0].id; ;
     break;}
 }
@@ -1907,5 +1948,5 @@ yyerrhandle:
     }
   return 1;
 }
-#line 638 "parse.y"
+#line 659 "parse.y"
 
index 7d01a5df5b0bd07ed5c1089f30086dab4c45aa7c..b5d9f104f3018ced3241b370caff9817b87f74b4 100644 (file)
@@ -80,11 +80,13 @@ yyerror(char *str)
 }
 
 static void
-push_variable(char *name, int scope, int line_no)
+push_variable(char *name, int scope, int line_no, char *postfix)
 {
        Node *var;
        Type *type = typestack->data;
        typestack = g_list_remove(typestack,typestack->data);
+
+       type->postfix = postfix;
        
        var = new_variable(scope,type,name,line_no);
        class_nodes = g_list_append(class_nodes, var);
@@ -101,7 +103,7 @@ push_function(int scope, char *oid, char *id, char *onerror,
                type = typestack->data;
                typestack = g_list_remove(typestack,typestack->data);
        } else {
-               type = (Type *)new_type(0,g_strdup("void"));
+               type = (Type *)new_type(0,g_strdup("void"),NULL);
        }
        
        /* a complicated and ugly test to figure out if we have
@@ -127,11 +129,13 @@ push_function(int scope, char *oid, char *id, char *onerror,
 }
 
 static void
-push_funcarg(char *name)
+push_funcarg(char *name, char *postfix)
 {
        Node *node;
        Type *type = typestack->data;
        typestack = g_list_remove(typestack,typestack->data);
+
+       type->postfix = postfix;
        
        node = new_funcarg(type,name,checks);
        checks = NULL;
@@ -151,7 +155,7 @@ push_init_arg(char *name, int is_class)
        else
                tn = g_strdup(((Class *)class)->otype);
 
-       type = new_type(1,tn);
+       type = new_type(1,tn,NULL);
        node = new_funcarg((Type *)type,name,NULL);
        funcargs = g_list_prepend(funcargs, node);
 }
@@ -162,7 +166,7 @@ push_self(char *id)
        Node *node;
        Node *type;
        GList *ch = NULL;
-       type = new_type(1,g_strdup(((Class *)class)->otype));
+       type = new_type(1,g_strdup(((Class *)class)->otype),NULL);
        ch = g_list_append(ch,new_check(NULL_CHECK,NULL));
        ch = g_list_append(ch,new_check(TYPE_CHECK,NULL));
        node = new_funcarg((Type *)type,id,ch);
@@ -184,7 +188,7 @@ push_self(char *id)
 %token SIGNED UNSIGNED LONG SHORT INT FLOAT DOUBLE CHAR
 %token ONERROR
 
-%token <id> TOKEN NUMBER TYPETOKEN
+%token <id> TOKEN NUMBER TYPETOKEN ARRAY_DIM
 %token <cbuf> CCODE HCODE
 %token <line> PUBLIC PRIVATE ARGUMENT VIRTUAL SIGNAL OVERRIDE
 
@@ -235,11 +239,17 @@ classcode:        classcode method                { ; }
        ;
 
 variable:      PUBLIC type TOKEN ';'           {
-                       push_variable($<id>3,PUBLIC_SCOPE,$<line>1);
+                       push_variable($<id>3,PUBLIC_SCOPE,$<line>1,NULL);
                                                }
-       |       PRIVATE type TOKEN ';'  {
-                       push_variable($<id>3,PRIVATE_SCOPE,$<line>1);
+       |       PUBLIC type TOKEN ARRAY_DIM ';' {
+                       push_variable($<id>3,PUBLIC_SCOPE,$<line>1,$<id>4);
                                                }
+       |       PRIVATE type TOKEN ';'          {
+                       push_variable($<id>3,PRIVATE_SCOPE,$<line>1,NULL);
+                                               }
+       |       PRIVATE type TOKEN ARRAY_DIM ';' {
+                       push_variable($<id>3,PRIVATE_SCOPE,$<line>1,$<id>4);
+                                                }
        ;
 argument:      ARGUMENT argflags TOKEN TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' {
                        if(strcmp($<id>5,"get")==0 &&
@@ -319,11 +329,11 @@ type:             type1                           { ; }
        ;
 
 type1:         type2                           {
-                       Node *node = new_type(0,$<id>1);
+                       Node *node = new_type(0,$<id>1,NULL);
                        typestack = g_list_prepend(typestack,node);
                                                }
        |       type2 stars                     {
-                       Node *node = new_type(stars,$<id>1);
+                       Node *node = new_type(stars,$<id>1,NULL);
                        stars = 0;
                        typestack = g_list_prepend(typestack,node);
                                                }
@@ -572,7 +582,10 @@ arglist1:  arglist1 ',' arg        { ; }
        ;
 
 arg:           type TOKEN                                      {
-                       push_funcarg($<id>2);
+                       push_funcarg($<id>2,NULL);
+                                                               }
+       |       type TOKEN ARRAY_DIM                            {
+                       push_funcarg($<id>2,$<id>3);
                                                                }
        |       type TOKEN '(' TOKEN checklist ')'              {
                        if(strcmp($<id>4,"check")!=0) {
@@ -580,7 +593,15 @@ arg:               type TOKEN                                      {
                                YYERROR;
                        }
                        g_free($<id>4);
-                       push_funcarg($<id>2);
+                       push_funcarg($<id>2,NULL);
+                                                               }
+       |       type TOKEN ARRAY_DIM '(' TOKEN checklist ')'    {
+                       if(strcmp($<id>5,"check")!=0) {
+                               yyerror(_("parse error"));
+                               YYERROR;
+                       }
+                       g_free($<id>5);
+                       push_funcarg($<id>2,$<id>3);
                                                                }
        ;
        
index b5b180e68e13f49f3c5386b32af5a0fb700c48f6..0152a00bd28c966d5a508d1812e9a41a2763dd1e 100644 (file)
@@ -5,6 +5,7 @@
    the file itself.  So you can this way select where the include file is
    at */
 #include "gtk-weird-button.h"
+#include "gtk-weird-button-private.h"
 
 static void jjjj(void);
 %}
@@ -19,6 +20,7 @@ class Gtk:Weird:Button from Gtk:Button {
        private int j;
        public GtkWidget * h;
        public char *bleh;
+       public double array[23][18];
 
        init(object) {
                GtkWeirdButton *but = GTK_WEIRD_BUTTON(object);
@@ -67,15 +69,21 @@ class Gtk:Weird:Button from Gtk:Button {
        signal first private NONE (NONE)
        void googlegoogle2(self)
        {
+               int array[5][8][9]={{{0}}};
                puts("TEST2");
-               testprivvirtual(self);
+               testprivvirtual(self,array);
        }
        virtual private
-       void testprivvirtual(self)
+       void testprivvirtual(self, int some_array[5][8][9])
        {
                puts("TEST3");
                googlegoogle(self);
        }
+       signal first NONE (POINTER)
+       void testarrsignal(self, long arr[8])
+       {
+               puts("TEST2");
+       }
 }
 
 %{
index ab06d4f8fde793dc46b06ecd1950c7d951af8521..c226273b053f49c4588806b6ed99c4e21b7b938d 100644 (file)
@@ -46,12 +46,13 @@ new_class(char *otype, char *ptype, GList *nodes)
 }
 
 Node *
-new_type(int stars, char *name)
+new_type(int stars, char *name, char *postfix)
 {
        Type *node = (Type *)g_new(Node,1);
        node->type = TYPE_NODE;
        node->stars = stars;
        node->name = name;
+       node->postfix = postfix;
        return (Node *)node;
 }
 
index f6b8cafa193b69982bb585f2c9cbb25a233285f8..c47156f5580cd53bfc1f63cb9789d88932570ce1 100644 (file)
@@ -58,6 +58,7 @@ struct _Type {
        int type;
        int stars;
        char *name;
+       char *postfix;
 };
 
 enum {
@@ -152,7 +153,7 @@ union _Node {
 
 Node *new_ccode(int header, GString *cbuf, int line_no);
 Node *new_class(char *otype, char *ptype, GList *nodes);
-Node *new_type(int stars, char *name);
+Node *new_type(int stars, char *name, char *postfix);
 Node *new_check(int chtype, char *number);
 Node *new_funcarg(Type *atype, char *name, GList *checks);
 Node *new_method(int scope, Type *mtype, char *otype, GList *gtktypes, char *id, GList *args, char *onerror, GString *cbuf,int line_no,int ccode_line, int vararg);