gthumb r2366 - in trunk: . src



Author: mjc
Date: Thu Jul 31 17:01:31 2008
New Revision: 2366
URL: http://svn.gnome.org/viewvc/gthumb?rev=2366&view=rev

Log:
2008-07-31  Michael J. Chudobiak  <mjc svn gnome org>

        * NEWS:
        * src/albumtheme-private.h:
        * src/albumtheme.c: (yyparse):
        * src/albumtheme.l:
        * src/albumtheme.y:
        * src/catalog-web-exporter.c: (get_var_value),
        (gth_parsed_doc_print):
        * src/lex.albumtheme.c:
        Added page_rows and page_cols web album tags. Bug #543966.
        Patch by Christophe Bisiere.



Modified:
   trunk/ChangeLog
   trunk/NEWS
   trunk/src/albumtheme-private.h
   trunk/src/albumtheme.c
   trunk/src/albumtheme.l
   trunk/src/albumtheme.y
   trunk/src/catalog-web-exporter.c
   trunk/src/lex.albumtheme.c

Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS	(original)
+++ trunk/NEWS	Thu Jul 31 17:01:31 2008
@@ -56,6 +56,7 @@
 	* Added a Flickr uploader (by launching Postr). Bug #489403.
 	* Added user prompts to the scripting feature.
 	* Added strftime format codes to the scripting feature.
+	* Added page_rows and page_cols web album tags. Bug #543966.
 
 	Library changes:
 	* exiv2 0.15 or higher is now required.

Modified: trunk/src/albumtheme-private.h
==============================================================================
--- trunk/src/albumtheme-private.h	(original)
+++ trunk/src/albumtheme-private.h	Thu Jul 31 17:01:31 2008
@@ -197,6 +197,8 @@
 	GTH_TAG_DATE_TIME,
 	GTH_TAG_PAGE_LINK,
 	GTH_TAG_PAGE_IDX,
+	GTH_TAG_PAGE_ROWS,
+	GTH_TAG_PAGE_COLS,
 	GTH_TAG_PAGES,
 	GTH_TAG_TABLE,
 	GTH_TAG_THUMBS,

Modified: trunk/src/albumtheme.c
==============================================================================
--- trunk/src/albumtheme.c	(original)
+++ trunk/src/albumtheme.c	Thu Jul 31 17:01:31 2008
@@ -92,26 +92,28 @@
   DATE_TIME = 280,
   PAGE_LINK = 281,
   PAGE_IDX = 282,
-  PAGES = 283,
-  TABLE = 284,
-  THUMBS = 285,
-  DATE = 286,
-  TEXT = 287,
-  TEXT_END = 288,
-  EXIF_EXPOSURE_TIME = 289,
-  EXIF_EXPOSURE_MODE = 290,
-  EXIF_FLASH = 291,
-  EXIF_SHUTTER_SPEED = 292,
-  EXIF_APERTURE_VALUE = 293,
-  EXIF_FOCAL_LENGTH = 294,
-  EXIF_DATE_TIME = 295,
-  EXIF_CAMERA_MODEL = 296,
-  SET_VAR = 297,
-  EVAL = 298,
-  HTML = 299,
-  BOOL_OP = 300,
-  COMPARE = 301,
-  UNARY_OP = 302
+  PAGE_ROWS = 283,
+  PAGE_COLS = 284,
+  PAGES = 285,
+  TABLE = 286,
+  THUMBS = 287,
+  DATE = 288,
+  TEXT = 289,
+  TEXT_END = 290,
+  EXIF_EXPOSURE_TIME = 291,
+  EXIF_EXPOSURE_MODE = 292,
+  EXIF_FLASH = 293,
+  EXIF_SHUTTER_SPEED = 294,
+  EXIF_APERTURE_VALUE = 295,
+  EXIF_FOCAL_LENGTH = 296,
+  EXIF_DATE_TIME = 297,
+  EXIF_CAMERA_MODEL = 298,
+  SET_VAR = 299,
+  EVAL = 300,
+  HTML = 301,
+  BOOL_OP = 302,
+  COMPARE = 303,
+  UNARY_OP = 304
 };
 #endif
 /* Tokens.  */
@@ -140,26 +142,28 @@
 #define DATE_TIME 280
 #define PAGE_LINK 281
 #define PAGE_IDX 282
-#define PAGES 283
-#define TABLE 284
-#define THUMBS 285
-#define DATE 286
-#define TEXT 287
-#define TEXT_END 288
-#define EXIF_EXPOSURE_TIME 289
-#define EXIF_EXPOSURE_MODE 290
-#define EXIF_FLASH 291
-#define EXIF_SHUTTER_SPEED 292
-#define EXIF_APERTURE_VALUE 293
-#define EXIF_FOCAL_LENGTH 294
-#define EXIF_DATE_TIME 295
-#define EXIF_CAMERA_MODEL 296
-#define SET_VAR 297
-#define EVAL 298
-#define HTML 299
-#define BOOL_OP 300
-#define COMPARE 301
-#define UNARY_OP 302
+#define PAGE_ROWS 283
+#define PAGE_COLS 284
+#define PAGES 285
+#define TABLE 286
+#define THUMBS 287
+#define DATE 288
+#define TEXT 289
+#define TEXT_END 290
+#define EXIF_EXPOSURE_TIME 291
+#define EXIF_EXPOSURE_MODE 292
+#define EXIF_FLASH 293
+#define EXIF_SHUTTER_SPEED 294
+#define EXIF_APERTURE_VALUE 295
+#define EXIF_FOCAL_LENGTH 296
+#define EXIF_DATE_TIME 297
+#define EXIF_CAMERA_MODEL 298
+#define SET_VAR 299
+#define EVAL 300
+#define HTML 301
+#define BOOL_OP 302
+#define COMPARE 303
+#define UNARY_OP 304
 
 
 
@@ -232,7 +236,7 @@
   GthCondition *cond;
 }
 /* Line 187 of yacc.c.  */
-#line 235 "albumtheme.c"
+#line 239 "albumtheme.c"
 YYSTYPE;
 # define yystype YYSTYPE	/* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
@@ -245,7 +249,7 @@
 
 
 /* Line 216 of yacc.c.  */
-#line 248 "albumtheme.c"
+#line 252 "albumtheme.c"
 
 #ifdef short
 # undef short
@@ -458,22 +462,22 @@
 #endif
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  55
+#define YYFINAL  57
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   303
+#define YYLAST   318
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  58
+#define YYNTOKENS  60
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  19
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  77
+#define YYNRULES  79
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  124
+#define YYNSTATES  126
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   302
+#define YYMAXUTOK   304
 
 #define YYTRANSLATE(YYX)						\
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -483,10 +487,10 @@
   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, 51, 53, 2, 2, 2, 2, 57,
-  54, 55, 49, 47, 2, 48, 2, 50, 2, 2,
+  2, 2, 2, 53, 55, 2, 2, 2, 2, 59,
+  56, 57, 51, 49, 2, 50, 2, 52, 2, 2,
   2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-  2, 56, 2, 2, 2, 2, 2, 2, 2, 2,
+  2, 58, 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,
@@ -510,7 +514,7 @@
   15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
   25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
   35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
-  45, 46, 52
+  45, 46, 47, 48, 54
 };
 
 #if YYDEBUG
@@ -524,45 +528,45 @@
   125, 129, 131, 133, 135, 137, 139, 141, 143, 145,
   147, 149, 151, 153, 155, 157, 159, 161, 163, 165,
   167, 169, 171, 173, 175, 177, 179, 181, 183, 185,
-  187, 189, 191, 194, 195, 199, 205, 211
+  187, 189, 191, 193, 195, 198, 199, 203, 209, 215
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yytype_int8 yyrhs[] = {
-  59, 0, -1, 60, -1, 44, 60, -1, 73, 60,
-  -1, 61, 60, 62, 64, 66, 60, -1, 72, 44,
-  33, 60, -1, -1, 1, 60, -1, 6, 67, 7,
-  -1, 6, 53, 68, 53, 7, -1, 63, 60, 62,
-  -1, -1, 4, 67, 7, -1, 4, 53, 68, 53,
-  7, -1, 65, 60, -1, -1, 5, 7, -1, 3,
-  7, -1, 54, 67, 55, -1, 67, 46, 67, -1,
-  67, 47, 67, -1, 67, 48, 67, -1, 67, 49,
-  67, -1, 67, 50, 67, -1, 67, 45, 67, -1,
-  47, 67, -1, 48, 67, -1, 51, 67, -1, 8,
-  -1, 10, -1, 67, -1, 9, -1, 69, 70, 71,
-  -1, 8, -1, 8, -1, 10, -1, 70, 71, -1,
-  -1, 32, 75, 7, -1, 74, 75, 7, -1, 11,
+  61, 0, -1, 62, -1, 46, 62, -1, 75, 62,
+  -1, 63, 62, 64, 66, 68, 62, -1, 74, 46,
+  35, 62, -1, -1, 1, 62, -1, 6, 69, 7,
+  -1, 6, 55, 70, 55, 7, -1, 65, 62, 64,
+  -1, -1, 4, 69, 7, -1, 4, 55, 70, 55,
+  7, -1, 67, 62, -1, -1, 5, 7, -1, 3,
+  7, -1, 56, 69, 57, -1, 69, 48, 69, -1,
+  69, 49, 69, -1, 69, 50, 69, -1, 69, 51,
+  69, -1, 69, 52, 69, -1, 69, 47, 69, -1,
+  49, 69, -1, 50, 69, -1, 53, 69, -1, 8,
+  -1, 10, -1, 69, -1, 9, -1, 71, 72, 73,
+  -1, 8, -1, 8, -1, 10, -1, 72, 73, -1,
+  -1, 34, 77, 7, -1, 76, 77, 7, -1, 11,
   -1, 12, -1, 13, -1, 14, -1, 15, -1, 16,
   -1, 17, -1, 18, -1, 19, -1, 20, -1, 21,
   -1, 22, -1, 23, -1, 24, -1, 25, -1, 26,
   -1, 27, -1, 28, -1, 29, -1, 30, -1, 31,
-  -1, 34, -1, 35, -1, 36, -1, 37, -1, 38,
+  -1, 32, -1, 33, -1, 36, -1, 37, -1, 38,
   -1, 39, -1, 40, -1, 41, -1, 42, -1, 43,
-  -1, 76, 75, -1, -1, 8, 56, 67, -1, 8,
-  56, 57, 68, 57, -1, 8, 56, 53, 68, 53,
-  -1, 8, -1
+  -1, 44, -1, 45, -1, 78, 77, -1, -1, 8,
+  58, 69, -1, 8, 58, 59, 70, 59, -1, 8,
+  58, 55, 70, 55, -1, 8, -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] = {
-  0, 108, 108, 118, 123, 127, 140, 148, 152, 159,
-  162, 167, 172, 177, 180, 185, 197, 202, 205, 208,
-  212, 225, 238, 251, 264, 277, 290, 294, 299, 304,
-  311, 317, 320, 326, 340, 346, 352, 358, 366, 370,
-  375, 380, 381, 382, 383, 384, 385, 386, 387, 388,
-  389, 390, 391, 392, 393, 394, 395, 396, 397, 398,
-  399, 400, 401, 402, 403, 404, 405, 406, 407, 408,
-  409, 410, 413, 417, 422, 427, 432, 437
+  0, 110, 110, 120, 125, 129, 142, 150, 154, 161,
+  164, 169, 174, 179, 182, 187, 199, 204, 207, 210,
+  214, 227, 240, 253, 266, 279, 292, 296, 301, 306,
+  313, 319, 322, 328, 342, 348, 354, 360, 368, 372,
+  377, 382, 383, 384, 385, 386, 387, 388, 389, 390,
+  391, 392, 393, 394, 395, 396, 397, 398, 399, 400,
+  401, 402, 403, 404, 405, 406, 407, 408, 409, 410,
+  411, 412, 413, 414, 417, 421, 426, 431, 436, 441
 };
 #endif
 
@@ -574,16 +578,16 @@
   "END_TAG", "NAME", "STRING", "NUMBER", "HEADER", "FOOTER", "LANGUAGE",
   "THEME_LINK", "IMAGE", "IMAGE_LINK", "IMAGE_IDX", "IMAGE_DIM", "IMAGES",
   "FILENAME", "FILEPATH", "FILESIZE", "COMMENT", "PLACE", "DATE_TIME",
-  "PAGE_LINK", "PAGE_IDX", "PAGES", "TABLE", "THUMBS", "DATE", "TEXT",
-  "TEXT_END", "EXIF_EXPOSURE_TIME", "EXIF_EXPOSURE_MODE", "EXIF_FLASH",
-  "EXIF_SHUTTER_SPEED", "EXIF_APERTURE_VALUE", "EXIF_FOCAL_LENGTH",
-  "EXIF_DATE_TIME", "EXIF_CAMERA_MODEL", "SET_VAR", "EVAL", "HTML",
-  "BOOL_OP", "COMPARE", "'+'", "'-'", "'*'", "'/'", "'!'", "UNARY_OP",
-  "'\"'", "'('", "')'", "'='", "'''", "$accept", "all", "document",
-  "gthumb_if", "opt_if_list", "gthumb_else_if", "opt_else", "gthumb_else",
-  "gthumb_end", "expr", "quoted_expr", "constant1", "constant",
-  "constant_list", "gthumb_text_tag", "gthumb_tag", "tag_name", "arg_list",
-  "arg", 0
+  "PAGE_LINK", "PAGE_IDX", "PAGE_ROWS", "PAGE_COLS", "PAGES", "TABLE",
+  "THUMBS", "DATE", "TEXT", "TEXT_END", "EXIF_EXPOSURE_TIME",
+  "EXIF_EXPOSURE_MODE", "EXIF_FLASH", "EXIF_SHUTTER_SPEED",
+  "EXIF_APERTURE_VALUE", "EXIF_FOCAL_LENGTH", "EXIF_DATE_TIME",
+  "EXIF_CAMERA_MODEL", "SET_VAR", "EVAL", "HTML", "BOOL_OP", "COMPARE",
+  "'+'", "'-'", "'*'", "'/'", "'!'", "UNARY_OP", "'\"'", "'('", "')'",
+  "'='", "'''", "$accept", "all", "document", "gthumb_if", "opt_if_list",
+  "gthumb_else_if", "opt_else", "gthumb_else", "gthumb_end", "expr",
+  "quoted_expr", "constant1", "constant", "constant_list",
+  "gthumb_text_tag", "gthumb_tag", "tag_name", "arg_list", "arg", 0
 };
 #endif
 
@@ -595,21 +599,21 @@
   265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
   275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
   285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
-  295, 296, 297, 298, 299, 300, 301, 43, 45, 42,
-  47, 33, 302, 34, 40, 41, 61, 39
+  295, 296, 297, 298, 299, 300, 301, 302, 303, 43,
+  45, 42, 47, 33, 304, 34, 40, 41, 61, 39
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] = {
-  0, 58, 59, 60, 60, 60, 60, 60, 60, 61,
-  61, 62, 62, 63, 63, 64, 64, 65, 66, 67,
-  67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
-  67, 68, 68, 68, 69, 70, 70, 71, 71, 72,
-  73, 74, 74, 74, 74, 74, 74, 74, 74, 74,
-  74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
-  74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
-  74, 74, 75, 75, 76, 76, 76, 76
+  0, 60, 61, 62, 62, 62, 62, 62, 62, 63,
+  63, 64, 64, 65, 65, 66, 66, 67, 68, 69,
+  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+  69, 70, 70, 70, 71, 72, 72, 73, 73, 74,
+  75, 76, 76, 76, 76, 76, 76, 76, 76, 76,
+  76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
+  76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
+  76, 76, 76, 76, 77, 77, 78, 78, 78, 78
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -621,7 +625,7 @@
   3, 1, 1, 1, 1, 1, 1, 1, 1, 1,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-  1, 1, 2, 0, 3, 5, 5, 1
+  1, 1, 1, 1, 2, 0, 3, 5, 5, 1
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -630,48 +634,48 @@
 static const yytype_uint8 yydefact[] = {
   0, 0, 0, 41, 42, 43, 44, 45, 46, 47,
   48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
-  58, 59, 60, 61, 73, 62, 63, 64, 65, 66,
-  67, 68, 69, 70, 71, 0, 0, 2, 0, 0,
-  0, 73, 8, 29, 30, 0, 0, 0, 0, 0,
-  0, 77, 0, 73, 3, 1, 12, 0, 4, 0,
-  26, 27, 28, 29, 32, 31, 0, 0, 0, 9,
-  0, 0, 0, 0, 0, 0, 0, 39, 72, 0,
-  16, 0, 0, 40, 0, 35, 36, 38, 19, 25,
-  20, 21, 22, 23, 24, 0, 0, 74, 0, 0,
-  0, 0, 0, 12, 6, 10, 38, 33, 0, 0,
-  0, 13, 17, 0, 0, 15, 11, 37, 76, 75,
-  0, 18, 5, 14
+  58, 59, 60, 61, 62, 63, 75, 64, 65, 66,
+  67, 68, 69, 70, 71, 72, 73, 0, 0, 2,
+  0, 0, 0, 75, 8, 29, 30, 0, 0, 0,
+  0, 0, 0, 79, 0, 75, 3, 1, 12, 0,
+  4, 0, 26, 27, 28, 29, 32, 31, 0, 0,
+  0, 9, 0, 0, 0, 0, 0, 0, 0, 39,
+  74, 0, 16, 0, 0, 40, 0, 35, 36, 38,
+  19, 25, 20, 21, 22, 23, 24, 0, 0, 76,
+  0, 0, 0, 0, 0, 12, 6, 10, 38, 33,
+  0, 0, 0, 13, 17, 0, 0, 15, 11, 37,
+  78, 77, 0, 18, 5, 14
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int8 yydefgoto[] = {
-  -1, 36, 37, 38, 80, 81, 101, 102, 114, 65,
-  66, 67, 106, 107, 39, 40, 41, 52, 53
+  -1, 38, 39, 40, 82, 83, 103, 104, 116, 67,
+  68, 69, 108, 109, 41, 42, 43, 54, 55
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -79
+#define YYPACT_NINF -81
 static const yytype_int16 yypact[] = {
-  171, 126, 11, -79, -79, -79, -79, -79, -79, -79,
-  -79, -79, -79, -79, -79, -79, -79, -79, -79, -79,
-  -79, -79, -79, -79, 8, -79, -79, -79, -79, -79,
-  -79, -79, -79, -79, -79, 126, 1, -79, 215, -8,
-  126, 8, -79, -79, -79, 74, 74, 74, 58, 74,
-  41, -12, 31, 8, -79, -79, 48, 28, -79, 56,
-  -79, -79, -79, 2, -79, -23, 16, 25, -41, -79,
-  74, 74, 74, 74, 74, 74, 3, -79, -79, 45,
-  73, 215, 126, -79, 76, -79, -79, 25, -79, -18,
-  -7, -79, -79, -79, -79, 58, 58, -23, 58, 70,
-  78, 91, 259, 48, -79, -79, 25, -79, 42, 40,
-  47, -79, -79, 95, 126, -79, -79, -79, -79, -79,
-  96, -79, -79, -79
+  180, 133, 11, -81, -81, -81, -81, -81, -81, -81,
+  -81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
+  -81, -81, -81, -81, -81, -81, -7, -81, -81, -81,
+  -81, -81, -81, -81, -81, -81, -81, 133, 16, -81,
+  226, -12, 133, -7, -81, -81, -81, 79, 79, 79,
+  35, 79, 47, -21, 31, -7, -81, -81, 36, 7,
+  -81, 39, -81, -81, -81, 2, -81, -25, -5, 25,
+  -43, -81, 79, 79, 79, 79, 79, 79, 3, -81,
+  -81, 55, 50, 226, 133, -81, 73, -81, -81, 25,
+  -81, -20, 19, -81, -81, -81, -81, 35, 35, -25,
+  35, 72, 83, 54, 272, 36, -81, -81, 25, -81,
+  37, 27, 38, -81, -81, 93, 133, -81, -81, -81,
+  -81, -81, 94, -81, -81, -81
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int8 yypgoto[] = {
-  -79, -79, -1, -79, 4, -79, -79, -79, -79, 0,
-  -78, -79, 37, 5, -79, -79, -79, -38, -79
+  -81, -81, -1, -81, -3, -81, -81, -81, -81, 0,
+  -80, -81, 40, -2, -81, -81, -81, -40, -81
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -680,71 +684,73 @@
    If YYTABLE_NINF, syntax error.  */
 #define YYTABLE_NINF -35
 static const yytype_int8 yytable[] = {
-  42, 55, 50, 59, 70, 71, 72, 73, 74, 75,
-  -34, 43, -34, 44, 88, 78, 51, 108, 109, 43,
-  110, 44, 70, 71, 72, 73, 74, 75, 71, 72,
-  73, 74, 75, 85, 54, 86, 57, 56, 77, 58,
-  72, 73, 74, 75, 76, 60, 61, 62, 69, 68,
-  45, 46, 79, 43, 47, 44, 95, 49, 45, 46,
-  96, 82, 47, 83, 48, 49, 63, 64, 44, 84,
-  89, 90, 91, 92, 93, 94, 97, 111, 100, 99,
-  103, 104, 43, 105, 44, 112, 70, 71, 72, 73,
-  74, 75, 45, 46, 113, 118, 47, 119, 98, 49,
-  120, 115, 121, 123, 87, 45, 46, 116, 0, 47,
-  0, 117, 49, 122, 0, 70, 71, 72, 73, 74,
-  75, 45, 46, 0, 0, 47, -7, 1, 49, -7,
+  44, 53, 52, 61, 72, 73, 74, 75, 76, 77,
+  -34, 45, -34, 46, 90, 80, 57, 110, 111, 45,
+  112, 46, 72, 73, 74, 75, 76, 77, 73, 74,
+  75, 76, 77, 87, 59, 88, 56, 78, 79, 58,
+  81, 60, 84, 65, 66, 46, 85, 62, 63, 64,
+  86, 70, 47, 48, 71, 102, 49, 115, 97, 51,
+  47, 48, 98, 45, 49, 46, 50, 51, 74, 75,
+  76, 77, 91, 92, 93, 94, 95, 96, 99, 113,
+  107, 101, 105, 106, 47, 48, 121, 45, 49, 46,
+  114, 51, 120, 122, 72, 73, 74, 75, 76, 77,
+  123, 125, 118, 117, 47, 48, 119, 0, 49, 89,
+  100, 51, 0, 0, 0, 124, 0, 0, 0, 72,
+  73, 74, 75, 76, 77, 0, 0, 0, 47, 48,
+  0, 0, 49, -7, 1, 51, -7, -7, -7, 2,
+  0, 0, 0, 0, 3, 4, 5, 6, 7, 8,
+  9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+  19, 20, 21, 22, 23, 24, 25, 26, 0, 27,
+  28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
+  -7, 1, 0, 0, 0, 0, 2, 0, 0, 0,
+  0, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+  12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+  22, 23, 24, 25, 26, 0, 27, 28, 29, 30,
+  31, 32, 33, 34, 35, 36, 37, 1, 0, -7,
   -7, -7, 2, 0, 0, 0, 0, 3, 4, 5,
   6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
-  16, 17, 18, 19, 20, 21, 22, 23, 24, 0,
-  25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
-  35, -7, 1, 0, 0, 0, 0, 2, 0, 0,
-  0, 0, 3, 4, 5, 6, 7, 8, 9, 10,
-  11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
-  21, 22, 23, 24, 0, 25, 26, 27, 28, 29,
-  30, 31, 32, 33, 34, 35, 1, 0, -7, -7,
-  -7, 2, 0, 0, 0, 0, 3, 4, 5, 6,
-  7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
-  17, 18, 19, 20, 21, 22, 23, 24, 0, 25,
-  26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
-  1, 0, -7, 0, 0, 2, 0, 0, 0, 0,
-  3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
-  13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
-  23, 24, 0, 25, 26, 27, 28, 29, 30, 31,
-  32, 33, 34, 35
+  16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+  26, 0, 27, 28, 29, 30, 31, 32, 33, 34,
+  35, 36, 37, 1, 0, -7, 0, 0, 2, 0,
+  0, 0, 0, 3, 4, 5, 6, 7, 8, 9,
+  10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+  20, 21, 22, 23, 24, 25, 26, 0, 27, 28,
+  29, 30, 31, 32, 33, 34, 35, 36, 37
 };
 
 static const yytype_int8 yycheck[] = {
-  1, 0, 2, 41, 45, 46, 47, 48, 49, 50,
-  8, 8, 10, 10, 55, 53, 8, 95, 96, 8,
-  98, 10, 45, 46, 47, 48, 49, 50, 46, 47,
-  48, 49, 50, 8, 35, 10, 44, 38, 7, 40,
-  47, 48, 49, 50, 56, 45, 46, 47, 7, 49,
-  47, 48, 4, 8, 51, 10, 53, 54, 47, 48,
-  57, 33, 51, 7, 53, 54, 8, 9, 10, 53,
-  70, 71, 72, 73, 74, 75, 76, 7, 5, 79,
-  81, 82, 8, 7, 10, 7, 45, 46, 47, 48,
-  49, 50, 47, 48, 3, 53, 51, 57, 53, 54,
-  53, 102, 7, 7, 67, 47, 48, 103, -1, 51,
-  -1, 106, 54, 114, -1, 45, 46, 47, 48, 49,
-  50, 47, 48, -1, -1, 51, 0, 1, 54, 3,
+  1, 8, 2, 43, 47, 48, 49, 50, 51, 52,
+  8, 8, 10, 10, 57, 55, 0, 97, 98, 8,
+  100, 10, 47, 48, 49, 50, 51, 52, 48, 49,
+  50, 51, 52, 8, 46, 10, 37, 58, 7, 40,
+  4, 42, 35, 8, 9, 10, 7, 47, 48, 49,
+  55, 51, 49, 50, 7, 5, 53, 3, 55, 56,
+  49, 50, 59, 8, 53, 10, 55, 56, 49, 50,
+  51, 52, 72, 73, 74, 75, 76, 77, 78, 7,
+  7, 81, 83, 84, 49, 50, 59, 8, 53, 10,
+  7, 56, 55, 55, 47, 48, 49, 50, 51, 52,
+  7, 7, 105, 104, 49, 50, 108, -1, 53, 69,
+  55, 56, -1, -1, -1, 116, -1, -1, -1, 47,
+  48, 49, 50, 51, 52, -1, -1, -1, 49, 50,
+  -1, -1, 53, 0, 1, 56, 3, 4, 5, 6,
+  -1, -1, -1, -1, 11, 12, 13, 14, 15, 16,
+  17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+  27, 28, 29, 30, 31, 32, 33, 34, -1, 36,
+  37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+  0, 1, -1, -1, -1, -1, 6, -1, -1, -1,
+  -1, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+  20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+  30, 31, 32, 33, 34, -1, 36, 37, 38, 39,
+  40, 41, 42, 43, 44, 45, 46, 1, -1, 3,
   4, 5, 6, -1, -1, -1, -1, 11, 12, 13,
   14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
-  24, 25, 26, 27, 28, 29, 30, 31, 32, -1,
-  34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
-  44, 0, 1, -1, -1, -1, -1, 6, -1, -1,
-  -1, -1, 11, 12, 13, 14, 15, 16, 17, 18,
-  19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
-  29, 30, 31, 32, -1, 34, 35, 36, 37, 38,
-  39, 40, 41, 42, 43, 44, 1, -1, 3, 4,
-  5, 6, -1, -1, -1, -1, 11, 12, 13, 14,
-  15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
-  25, 26, 27, 28, 29, 30, 31, 32, -1, 34,
-  35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
-  1, -1, 3, -1, -1, 6, -1, -1, -1, -1,
-  11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
-  21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
-  31, 32, -1, 34, 35, 36, 37, 38, 39, 40,
-  41, 42, 43, 44
+  24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
+  34, -1, 36, 37, 38, 39, 40, 41, 42, 43,
+  44, 45, 46, 1, -1, 3, -1, -1, 6, -1,
+  -1, -1, -1, 11, 12, 13, 14, 15, 16, 17,
+  18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
+  28, 29, 30, 31, 32, 33, 34, -1, 36, 37,
+  38, 39, 40, 41, 42, 43, 44, 45, 46
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -752,17 +758,17 @@
 static const yytype_uint8 yystos[] = {
   0, 1, 6, 11, 12, 13, 14, 15, 16, 17,
   18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
-  28, 29, 30, 31, 32, 34, 35, 36, 37, 38,
-  39, 40, 41, 42, 43, 44, 59, 60, 61, 72,
-  73, 74, 60, 8, 10, 47, 48, 51, 53, 54,
-  67, 8, 75, 76, 60, 0, 60, 44, 60, 75,
-  67, 67, 67, 8, 9, 67, 68, 69, 67, 7,
-  45, 46, 47, 48, 49, 50, 56, 7, 75, 4,
-  62, 63, 33, 7, 53, 8, 10, 70, 55, 67,
-  67, 67, 67, 67, 67, 53, 57, 67, 53, 67,
-  5, 64, 65, 60, 60, 7, 70, 71, 68, 68,
-  68, 7, 7, 3, 66, 60, 62, 71, 53, 57,
-  53, 7, 60, 7
+  28, 29, 30, 31, 32, 33, 34, 36, 37, 38,
+  39, 40, 41, 42, 43, 44, 45, 46, 61, 62,
+  63, 74, 75, 76, 62, 8, 10, 49, 50, 53,
+  55, 56, 69, 8, 77, 78, 62, 0, 62, 46,
+  62, 77, 69, 69, 69, 8, 9, 69, 70, 71,
+  69, 7, 47, 48, 49, 50, 51, 52, 58, 7,
+  77, 4, 64, 65, 35, 7, 55, 8, 10, 72,
+  57, 69, 69, 69, 69, 69, 69, 55, 59, 69,
+  55, 69, 5, 66, 67, 62, 62, 7, 72, 73,
+  70, 70, 70, 7, 7, 3, 68, 62, 64, 73,
+  55, 59, 55, 7, 62, 7
 };
 
 #define yyerrok		(yyerrstatus = 0)
@@ -1031,6 +1037,7 @@
 #ifndef YYMAXDEPTH
 # define YYMAXDEPTH 10000
 #endif
+
 
 
 #if YYERROR_VERBOSE
@@ -1243,7 +1250,7 @@
     }
 }
 #endif /* YYERROR_VERBOSE */
-
+
 
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
@@ -1275,7 +1282,7 @@
       break;
     }
 }
-
+
 
 /* Prevent warnings from -Wmissing-prototypes.  */
 
@@ -1574,7 +1581,7 @@
   switch (yyn)
     {
     case 2:
-#line 108 "albumtheme.y"
+#line 110 "albumtheme.y"
       {
 	yy_parsed_doc = (yyvsp[(1) - (1)].list);
 
@@ -1587,7 +1594,7 @@
       break;
 
     case 3:
-#line 118 "albumtheme.y"
+#line 120 "albumtheme.y"
       {
 	(yyval.list) =
 	  g_list_prepend ((yyvsp[(2) - (2)].list),
@@ -1598,7 +1605,7 @@
       break;
 
     case 4:
-#line 123 "albumtheme.y"
+#line 125 "albumtheme.y"
       {
 	(yyval.list) =
 	  g_list_prepend ((yyvsp[(2) - (2)].list), (yyvsp[(1) - (2)].tag));
@@ -1607,7 +1614,7 @@
       break;
 
     case 5:
-#line 127 "albumtheme.y"
+#line 129 "albumtheme.y"
       {
 	GList *cond_list;
 	GthTag *tag;
@@ -1626,7 +1633,7 @@
       break;
 
     case 6:
-#line 140 "albumtheme.y"
+#line 142 "albumtheme.y"
       {
 	GthTag *tag = gth_tag_new_html ((yyvsp[(2) - (4)].text));
 	GList *child_doc = g_list_append (NULL, tag);
@@ -1639,7 +1646,7 @@
       break;
 
     case 7:
-#line 148 "albumtheme.y"
+#line 150 "albumtheme.y"
       {
 	(yyval.list) = NULL;
 	;
@@ -1647,7 +1654,7 @@
       break;
 
     case 8:
-#line 152 "albumtheme.y"
+#line 154 "albumtheme.y"
       {
 	if ((yyvsp[(2) - (2)].list) != NULL)
 	  gth_parsed_doc_free ((yyvsp[(2) - (2)].list));
@@ -1657,7 +1664,7 @@
       break;
 
     case 9:
-#line 159 "albumtheme.y"
+#line 161 "albumtheme.y"
       {
 	(yyval.cond) = gth_condition_new ((yyvsp[(2) - (3)].expr));
 	;
@@ -1665,7 +1672,7 @@
       break;
 
     case 10:
-#line 162 "albumtheme.y"
+#line 164 "albumtheme.y"
       {
 	(yyval.cond) = gth_condition_new ((yyvsp[(3) - (5)].expr));
 	;
@@ -1673,7 +1680,7 @@
       break;
 
     case 11:
-#line 167 "albumtheme.y"
+#line 169 "albumtheme.y"
       {
 	gth_condition_add_document ((yyvsp[(1) - (3)].cond),
 				    (yyvsp[(2) - (3)].list));
@@ -1684,7 +1691,7 @@
       break;
 
     case 12:
-#line 172 "albumtheme.y"
+#line 174 "albumtheme.y"
       {
 	(yyval.list) = NULL;
 	;
@@ -1692,7 +1699,7 @@
       break;
 
     case 13:
-#line 177 "albumtheme.y"
+#line 179 "albumtheme.y"
       {
 	(yyval.cond) = gth_condition_new ((yyvsp[(2) - (3)].expr));
 	;
@@ -1700,7 +1707,7 @@
       break;
 
     case 14:
-#line 180 "albumtheme.y"
+#line 182 "albumtheme.y"
       {
 	(yyval.cond) = gth_condition_new ((yyvsp[(3) - (5)].expr));
 	;
@@ -1708,7 +1715,7 @@
       break;
 
     case 15:
-#line 185 "albumtheme.y"
+#line 187 "albumtheme.y"
       {
 	GthExpr *else_expr;
 	GthCondition *cond;
@@ -1724,7 +1731,7 @@
       break;
 
     case 16:
-#line 197 "albumtheme.y"
+#line 199 "albumtheme.y"
       {
 	(yyval.cond) = NULL;
 	;
@@ -1732,7 +1739,7 @@
       break;
 
     case 19:
-#line 208 "albumtheme.y"
+#line 210 "albumtheme.y"
       {
 	(yyval.expr) = (yyvsp[(2) - (3)].expr);
 	;
@@ -1740,7 +1747,7 @@
       break;
 
     case 20:
-#line 212 "albumtheme.y"
+#line 214 "albumtheme.y"
       {
 	GthExpr *e = gth_expr_new ();
 
@@ -1757,7 +1764,7 @@
       break;
 
     case 21:
-#line 225 "albumtheme.y"
+#line 227 "albumtheme.y"
       {
 	GthExpr *e = gth_expr_new ();
 
@@ -1774,7 +1781,7 @@
       break;
 
     case 22:
-#line 238 "albumtheme.y"
+#line 240 "albumtheme.y"
       {
 	GthExpr *e = gth_expr_new ();
 
@@ -1791,7 +1798,7 @@
       break;
 
     case 23:
-#line 251 "albumtheme.y"
+#line 253 "albumtheme.y"
       {
 	GthExpr *e = gth_expr_new ();
 
@@ -1808,7 +1815,7 @@
       break;
 
     case 24:
-#line 264 "albumtheme.y"
+#line 266 "albumtheme.y"
       {
 	GthExpr *e = gth_expr_new ();
 
@@ -1825,7 +1832,7 @@
       break;
 
     case 25:
-#line 277 "albumtheme.y"
+#line 279 "albumtheme.y"
       {
 	GthExpr *e = gth_expr_new ();
 
@@ -1842,7 +1849,7 @@
       break;
 
     case 26:
-#line 290 "albumtheme.y"
+#line 292 "albumtheme.y"
       {
 	(yyval.expr) = (yyvsp[(2) - (2)].expr);
 	;
@@ -1850,7 +1857,7 @@
       break;
 
     case 27:
-#line 294 "albumtheme.y"
+#line 296 "albumtheme.y"
       {
 	gth_expr_push_op ((yyvsp[(2) - (2)].expr), GTH_OP_NEG);
 	(yyval.expr) = (yyvsp[(2) - (2)].expr);
@@ -1859,7 +1866,7 @@
       break;
 
     case 28:
-#line 299 "albumtheme.y"
+#line 301 "albumtheme.y"
       {
 	gth_expr_push_op ((yyvsp[(2) - (2)].expr), GTH_OP_NOT);
 	(yyval.expr) = (yyvsp[(2) - (2)].expr);
@@ -1868,7 +1875,7 @@
       break;
 
     case 29:
-#line 304 "albumtheme.y"
+#line 306 "albumtheme.y"
       {
 	GthExpr *e = gth_expr_new ();
 	gth_expr_push_var (e, (yyvsp[(1) - (1)].text));
@@ -1879,7 +1886,7 @@
       break;
 
     case 30:
-#line 311 "albumtheme.y"
+#line 313 "albumtheme.y"
       {
 	GthExpr *e = gth_expr_new ();
 	gth_expr_push_constant (e, (yyvsp[(1) - (1)].ivalue));
@@ -1889,7 +1896,7 @@
       break;
 
     case 31:
-#line 317 "albumtheme.y"
+#line 319 "albumtheme.y"
       {
 	(yyval.expr) = (yyvsp[(1) - (1)].expr);
 	;
@@ -1897,7 +1904,7 @@
       break;
 
     case 32:
-#line 320 "albumtheme.y"
+#line 322 "albumtheme.y"
       {
 	GthExpr *e = gth_expr_new ();
 	gth_expr_push_var (e, (yyvsp[(1) - (1)].text));
@@ -1908,7 +1915,7 @@
       break;
 
     case 33:
-#line 326 "albumtheme.y"
+#line 328 "albumtheme.y"
       {
 	GthExpr *e = gth_expr_new ();
 	g_string_append ((yyvsp[(1) - (3)].string),
@@ -1928,7 +1935,7 @@
       break;
 
     case 34:
-#line 340 "albumtheme.y"
+#line 342 "albumtheme.y"
       {
 	GString *s = g_string_new ((yyvsp[(1) - (1)].text));
 	g_free ((yyvsp[(1) - (1)].text));
@@ -1938,7 +1945,7 @@
       break;
 
     case 35:
-#line 346 "albumtheme.y"
+#line 348 "albumtheme.y"
       {
 	GString *s = g_string_new ((yyvsp[(1) - (1)].text));
 	g_string_prepend_c (s, ' ');
@@ -1949,7 +1956,7 @@
       break;
 
     case 36:
-#line 352 "albumtheme.y"
+#line 354 "albumtheme.y"
       {
 	GString *s = g_string_new ("");
 	g_string_sprintf (s, " %i", (yyvsp[(1) - (1)].ivalue));
@@ -1959,7 +1966,7 @@
       break;
 
     case 37:
-#line 358 "albumtheme.y"
+#line 360 "albumtheme.y"
       {
 	if ((yyvsp[(2) - (2)].string) != NULL)
 	  {
@@ -1973,7 +1980,7 @@
       break;
 
     case 38:
-#line 366 "albumtheme.y"
+#line 368 "albumtheme.y"
       {
 	(yyval.string) = NULL;
 	;
@@ -1981,7 +1988,7 @@
       break;
 
     case 39:
-#line 370 "albumtheme.y"
+#line 372 "albumtheme.y"
       {
 	(yyval.tag) =
 	  gth_tag_new ((yyvsp[(1) - (3)].ivalue), (yyvsp[(2) - (3)].list));
@@ -1990,7 +1997,7 @@
       break;
 
     case 40:
-#line 375 "albumtheme.y"
+#line 377 "albumtheme.y"
       {
 	(yyval.tag) =
 	  gth_tag_new ((yyvsp[(1) - (3)].ivalue), (yyvsp[(2) - (3)].list));
@@ -1999,217 +2006,217 @@
       break;
 
     case 41:
-#line 380 "albumtheme.y"
+#line 382 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 42:
-#line 381 "albumtheme.y"
+#line 383 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 43:
-#line 382 "albumtheme.y"
+#line 384 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 44:
-#line 383 "albumtheme.y"
+#line 385 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 45:
-#line 384 "albumtheme.y"
+#line 386 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 46:
-#line 385 "albumtheme.y"
+#line 387 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 47:
-#line 386 "albumtheme.y"
+#line 388 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 48:
-#line 387 "albumtheme.y"
+#line 389 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 49:
-#line 388 "albumtheme.y"
+#line 390 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 50:
-#line 389 "albumtheme.y"
+#line 391 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 51:
-#line 390 "albumtheme.y"
+#line 392 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 52:
-#line 391 "albumtheme.y"
+#line 393 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 53:
-#line 392 "albumtheme.y"
+#line 394 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 54:
-#line 393 "albumtheme.y"
+#line 395 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 55:
-#line 394 "albumtheme.y"
+#line 396 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 56:
-#line 395 "albumtheme.y"
+#line 397 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 57:
-#line 396 "albumtheme.y"
+#line 398 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 58:
-#line 397 "albumtheme.y"
+#line 399 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 59:
-#line 398 "albumtheme.y"
+#line 400 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 60:
-#line 399 "albumtheme.y"
+#line 401 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 61:
-#line 400 "albumtheme.y"
+#line 402 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 62:
-#line 401 "albumtheme.y"
+#line 403 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 63:
-#line 402 "albumtheme.y"
+#line 404 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 64:
-#line 403 "albumtheme.y"
+#line 405 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 65:
-#line 404 "albumtheme.y"
+#line 406 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 66:
-#line 405 "albumtheme.y"
+#line 407 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 67:
-#line 406 "albumtheme.y"
+#line 408 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 68:
-#line 407 "albumtheme.y"
+#line 409 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 69:
-#line 408 "albumtheme.y"
+#line 410 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 70:
-#line 409 "albumtheme.y"
+#line 411 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
       break;
 
     case 71:
-#line 410 "albumtheme.y"
+#line 412 "albumtheme.y"
       {
 	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
       }
@@ -2218,22 +2225,36 @@
     case 72:
 #line 413 "albumtheme.y"
       {
+	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
+      }
+      break;
+
+    case 73:
+#line 414 "albumtheme.y"
+      {
+	(yyval.ivalue) = (yyvsp[(1) - (1)].ivalue);;
+      }
+      break;
+
+    case 74:
+#line 417 "albumtheme.y"
+      {
 	(yyval.list) =
 	  g_list_prepend ((yyvsp[(2) - (2)].list), (yyvsp[(1) - (2)].var));
 	;
       }
       break;
 
-    case 73:
-#line 417 "albumtheme.y"
+    case 75:
+#line 421 "albumtheme.y"
       {
 	(yyval.list) = NULL;
 	;
       }
       break;
 
-    case 74:
-#line 422 "albumtheme.y"
+    case 76:
+#line 426 "albumtheme.y"
       {
 	(yyval.var) =
 	  gth_var_new_expression ((yyvsp[(1) - (3)].text),
@@ -2243,8 +2264,8 @@
       }
       break;
 
-    case 75:
-#line 427 "albumtheme.y"
+    case 77:
+#line 431 "albumtheme.y"
       {
 	(yyval.var) =
 	  gth_var_new_expression ((yyvsp[(1) - (5)].text),
@@ -2254,8 +2275,8 @@
       }
       break;
 
-    case 76:
-#line 432 "albumtheme.y"
+    case 78:
+#line 436 "albumtheme.y"
       {
 	(yyval.var) =
 	  gth_var_new_expression ((yyvsp[(1) - (5)].text),
@@ -2265,8 +2286,8 @@
       }
       break;
 
-    case 77:
-#line 437 "albumtheme.y"
+    case 79:
+#line 441 "albumtheme.y"
       {
 	GthExpr *e = gth_expr_new ();
 	gth_expr_push_constant (e, 1);
@@ -2278,7 +2299,7 @@
 
 
 /* Line 1267 of yacc.c.  */
-#line 2174 "albumtheme.c"
+#line 2190 "albumtheme.c"
     default:
       break;
     }
@@ -2489,7 +2510,7 @@
 }
 
 
-#line 447 "albumtheme.y"
+#line 451 "albumtheme.y"
 
 
 int

Modified: trunk/src/albumtheme.l
==============================================================================
--- trunk/src/albumtheme.l	(original)
+++ trunk/src/albumtheme.l	Thu Jul 31 17:01:31 2008
@@ -116,6 +116,16 @@
 					yylval.ivalue = GTH_TAG_PAGE_IDX;
 					return PAGE_IDX;
 				}
+"<gthumb:page_rows"		{ 
+					BEGIN (TAG);
+					yylval.ivalue = GTH_TAG_PAGE_ROWS;
+					return PAGE_ROWS;
+				}
+"<gthumb:page_cols"		{ 
+					BEGIN (TAG);
+					yylval.ivalue = GTH_TAG_PAGE_COLS;
+					return PAGE_COLS;
+				}
 "<gthumb:pages"			{ 
 					BEGIN (TAG);
 					yylval.ivalue = GTH_TAG_PAGES;

Modified: trunk/src/albumtheme.y
==============================================================================
--- trunk/src/albumtheme.y	(original)
+++ trunk/src/albumtheme.y	Thu Jul 31 17:01:31 2008
@@ -63,6 +63,8 @@
 %token <ivalue> DATE_TIME 
 %token <ivalue> PAGE_LINK 
 %token <ivalue> PAGE_IDX 
+%token <ivalue> PAGE_ROWS 
+%token <ivalue> PAGE_COLS 
 %token <ivalue> PAGES 
 %token <ivalue> TABLE 
 %token <ivalue> THUMBS
@@ -394,6 +396,8 @@
 		| DATE_TIME           { $$ = $1; }
 		| PAGE_LINK           { $$ = $1; }
 		| PAGE_IDX            { $$ = $1; }
+		| PAGE_ROWS           { $$ = $1; }
+		| PAGE_COLS           { $$ = $1; }
 		| PAGES               { $$ = $1; }
 		| TABLE               { $$ = $1; }
 		| THUMBS              { $$ = $1; }

Modified: trunk/src/catalog-web-exporter.c
==============================================================================
--- trunk/src/catalog-web-exporter.c	(original)
+++ trunk/src/catalog-web-exporter.c	Thu Jul 31 17:01:31 2008
@@ -792,6 +792,10 @@
 		return ce->n_images;
 	else if (strcmp (var_name, "page_idx") == 0)
 		return ce->page + 1;
+	else if (strcmp (var_name, "page_rows") == 0)
+		return ce->page_rows;
+	else if (strcmp (var_name, "page_cols") == 0)
+		return ce->page_cols;
 	else if (strcmp (var_name, "pages") == 0)
 		return ce->n_pages;
 	else if (strcmp (var_name, "index") == 0)
@@ -1691,6 +1695,16 @@
 			write_line (line, fout);
 			break;
 
+		case GTH_TAG_PAGE_ROWS:
+			line = g_strdup_printf ("%d", ce->page_rows);
+			write_line (line, fout);
+			break;
+			
+		case GTH_TAG_PAGE_COLS:
+			line = g_strdup_printf ("%d", ce->page_cols);
+			write_line (line, fout);
+			break;
+			
 		case GTH_TAG_PAGES:
 			line = g_strdup_printf ("%d", ce->n_pages);
 			write_line (line, fout);

Modified: trunk/src/lex.albumtheme.c
==============================================================================
--- trunk/src/lex.albumtheme.c	(original)
+++ trunk/src/lex.albumtheme.c	Thu Jul 31 17:01:31 2008
@@ -1,67 +1,112 @@
-/* A lexical scanner generated by flex*/
 
-/* Scanner skeleton version:
- * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $
- */
+#line 3 "lex.yy.c"
+
+#define  YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
 
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
 
+/* First, we deal with  platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
 #include <stdio.h>
-#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
 
+/* end standard C headers. */
 
-/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
-#ifdef c_plusplus
-#ifndef __cplusplus
-#define __cplusplus
-#endif
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types. 
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
 #endif
 
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
 
-#ifdef __cplusplus
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN               (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN              (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN              (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX               (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX              (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX              (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX              (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX             (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX             (4294967295U)
+#endif
 
-#include <stdlib.h>
+#endif /* ! FLEXINT_H */
 
-/* Use prototypes in function declarations. */
-#define YY_USE_PROTOS
+#ifdef __cplusplus
 
 /* The "const" storage-class-modifier is valid. */
 #define YY_USE_CONST
 
 #else /* ! __cplusplus */
 
-#if __STDC__
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
 
-#define YY_USE_PROTOS
 #define YY_USE_CONST
 
-#endif /* __STDC__ */
+#endif /* defined (__STDC__) */
 #endif /* ! __cplusplus */
 
-#ifdef __TURBOC__
-#pragma warn -rch
-#pragma warn -use
-#include <io.h>
-#include <stdlib.h>
-#define YY_USE_CONST
-#define YY_USE_PROTOS
-#endif
-
 #ifdef YY_USE_CONST
 #define yyconst const
 #else
 #define yyconst
 #endif
 
-
-#ifdef YY_USE_PROTOS
-#define YY_PROTO(proto) proto
-#else
-#define YY_PROTO(proto) ()
-#endif
-
 /* Returned upon end-of-file. */
 #define YY_NULL 0
 
@@ -76,80 +121,70 @@
  * but we do it the disgusting crufty way forced on us by the ()-less
  * definition of BEGIN.
  */
-#define BEGIN yy_start = 1 + 2 *
+#define BEGIN (yy_start) = 1 + 2 *
 
 /* Translate the current start state into a value that can be later handed
  * to BEGIN to return to the state.  The YYSTATE alias is for lex
  * compatibility.
  */
-#define YY_START ((yy_start - 1) / 2)
+#define YY_START (((yy_start) - 1) / 2)
 #define YYSTATE YY_START
 
 /* Action number for EOF rule of a given start state. */
 #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
 
 /* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE yyrestart( yyin )
+#define YY_NEW_FILE yyrestart(yyin  )
 
 #define YY_END_OF_BUFFER_CHAR 0
 
 /* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
 #define YY_BUF_SIZE 16384
+#endif
 
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
 typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
 
 extern int yyleng;
+
 extern FILE *yyin, *yyout;
 
 #define EOB_ACT_CONTINUE_SCAN 0
 #define EOB_ACT_END_OF_FILE 1
 #define EOB_ACT_LAST_MATCH 2
 
-/* The funky do-while in the following #define is used to turn the definition
- * int a single C statement (which needs a semi-colon terminator).  This
- * avoids problems with code like:
- *
- * 	if ( condition_holds )
- *		yyless( 5 );
- *	else
- *		do_something_else();
- *
- * Prior to using the do-while the compiler would get upset at the
- * "else" because it interpreted the "if" statement as being all
- * done when it reached the ';' after the yyless() call.
- */
-
-/* Return all but the first 'n' matched characters back to the input stream. */
+#define YY_LESS_LINENO(n)
 
+/* Return all but the first "n" matched characters back to the input stream. */
 #define yyless(n) \
 	do \
 		{ \
 		/* Undo effects of setting up yytext. */ \
-		*yy_cp = yy_hold_char; \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		*yy_cp = (yy_hold_char); \
 		YY_RESTORE_YY_MORE_OFFSET \
-		yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
 		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
 		} \
 	while ( 0 )
 
-#define unput(c) yyunput( c, yytext_ptr )
+#define unput(c) yyunput( c, (yytext_ptr)  )
 
-/* Some routines like yy_flex_realloc() are emitted as static but are
-   not called by all lexers. This generates warnings in some compilers,
-   notably GCC. Arrange to suppress these. */
-#ifdef __GNUC__
-#define YY_MAY_BE_UNUSED __attribute__((unused))
-#else
-#define YY_MAY_BE_UNUSED
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
 #endif
 
-/* The following is because we cannot portably get our hands on size_t
- * (without autoconf's help, which isn't available because we want
- * flex-generated scanners to compile on their own).
- */
-typedef unsigned int yy_size_t;
-
-
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
 struct yy_buffer_state
 {
   FILE *yy_input_file;
@@ -186,12 +221,16 @@
    */
   int yy_at_bol;
 
+  int yy_bs_lineno;   /**< The line count. */
+  int yy_bs_column;   /**< The column count. */
+
   /* Whether to try to fill the input buffer when we reach the
    * end of it.
    */
   int yy_fill_buffer;
 
   int yy_buffer_status;
+
 #define YY_BUFFER_NEW 0
 #define YY_BUFFER_NORMAL 1
   /* When an EOF's been seen but there's still some text to process
@@ -205,28 +244,38 @@
    * just pointing yyin at a new input file.
    */
 #define YY_BUFFER_EOF_PENDING 2
+
 };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
 
-static YY_BUFFER_STATE yy_current_buffer = 0;
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE *yy_buffer_stack = 0;  /**< Stack as an array. */
 
 /* We provide macros for accessing buffer states in case in the
  * future we want to put the buffer states in a more general
  * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
  */
-#define YY_CURRENT_BUFFER yy_current_buffer
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+                          : NULL)
 
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
 
 /* yy_hold_char holds the character lost when yytext is formed. */
 static char yy_hold_char;
-
 static int yy_n_chars;		/* number of characters read into yy_ch_buf */
-
-
 int yyleng;
 
 /* Points to current character in buffer. */
 static char *yy_c_buf_p = (char *) 0;
-static int yy_init = 1;		/* whether we need to initialize */
+static int yy_init = 0;		/* whether we need to initialize */
 static int yy_start = 0;	/* start state number */
 
 /* Flag which is used to allow yywrap()'s to do buffer switches
@@ -234,114 +283,137 @@
  */
 static int yy_did_buffer_switch_on_eof;
 
-void yyrestart YY_PROTO ((FILE * input_file));
-
-void yy_switch_to_buffer YY_PROTO ((YY_BUFFER_STATE new_buffer));
-void yy_load_buffer_state YY_PROTO ((void));
-YY_BUFFER_STATE yy_create_buffer YY_PROTO ((FILE * file, int size));
-void yy_delete_buffer YY_PROTO ((YY_BUFFER_STATE b));
-void yy_init_buffer YY_PROTO ((YY_BUFFER_STATE b, FILE * file));
-void yy_flush_buffer YY_PROTO ((YY_BUFFER_STATE b));
-#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
-
-YY_BUFFER_STATE yy_scan_buffer YY_PROTO ((char *base, yy_size_t size));
-YY_BUFFER_STATE yy_scan_string YY_PROTO ((yyconst char *yy_str));
-YY_BUFFER_STATE yy_scan_bytes YY_PROTO ((yyconst char *bytes, int len));
-
-static void *yy_flex_alloc YY_PROTO ((yy_size_t));
-static void *yy_flex_realloc
-YY_PROTO ((void *, yy_size_t))
-  YY_MAY_BE_UNUSED;
-     static void yy_flex_free YY_PROTO ((void *));
+void yyrestart (FILE * input_file);
+void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer);
+YY_BUFFER_STATE yy_create_buffer (FILE * file, int size);
+void yy_delete_buffer (YY_BUFFER_STATE b);
+void yy_flush_buffer (YY_BUFFER_STATE b);
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer);
+void yypop_buffer_state (void);
+
+static void yyensure_buffer_stack (void);
+static void yy_load_buffer_state (void);
+static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file);
+
+#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE yy_scan_buffer (char *base, yy_size_t size);
+YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str);
+YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes, int len);
+
+void *yyalloc (yy_size_t);
+void *yyrealloc (void *, yy_size_t);
+void yyfree (void *);
 
 #define yy_new_buffer yy_create_buffer
 
 #define yy_set_interactive(is_interactive) \
 	{ \
-	if ( ! yy_current_buffer ) \
-		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
-	yy_current_buffer->yy_is_interactive = is_interactive; \
+	if ( ! YY_CURRENT_BUFFER ){ \
+        yyensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            yy_create_buffer(yyin,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
 	}
 
 #define yy_set_bol(at_bol) \
 	{ \
-	if ( ! yy_current_buffer ) \
-		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
-	yy_current_buffer->yy_at_bol = at_bol; \
+	if ( ! YY_CURRENT_BUFFER ){\
+        yyensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            yy_create_buffer(yyin,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
 	}
 
-#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+typedef unsigned char YY_CHAR;
+
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
 
-     typedef unsigned char YY_CHAR;
-     FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
-     typedef int yy_state_type;
-     extern char *yytext;
+typedef int yy_state_type;
+
+extern int yylineno;
+
+int yylineno = 1;
+
+extern char *yytext;
 #define yytext_ptr yytext
 
-     static yy_state_type yy_get_previous_state YY_PROTO ((void));
-     static yy_state_type yy_try_NUL_trans
-       YY_PROTO ((yy_state_type current_state));
-     static int yy_get_next_buffer YY_PROTO ((void));
-     static void yy_fatal_error YY_PROTO ((yyconst char msg[]));
+static yy_state_type yy_get_previous_state (void);
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state);
+static int yy_get_next_buffer (void);
+static void yy_fatal_error (yyconst char msg[]);
 
 /* Done after the current pattern has been matched and before the
  * corresponding action - sets up yytext.
  */
 #define YY_DO_BEFORE_ACTION \
-	yytext_ptr = yy_bp; \
-	yyleng = (int) (yy_cp - yy_bp); \
-	yy_hold_char = *yy_cp; \
+	(yytext_ptr) = yy_bp; \
+	yyleng = (size_t) (yy_cp - yy_bp); \
+	(yy_hold_char) = *yy_cp; \
 	*yy_cp = '\0'; \
-	yy_c_buf_p = yy_cp;
+	(yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 69
+#define YY_END_OF_BUFFER 70
+/* This struct is not used in this scanner,
+   but its presence is necessary. */
+struct yy_trans_info
+{
+  flex_int32_t yy_verify;
+  flex_int32_t yy_nxt;
+};
+static yyconst flex_int16_t yy_accept[390] = { 0,
+  0, 0, 0, 0, 0, 0, 42, 42, 42, 42,
+  70, 68, 67, 69, 65, 55, 58, 69, 40, 56,
+  57, 53, 51, 52, 54, 45, 48, 47, 49, 46,
+  69, 41, 54, 50, 42, 43, 42, 44, 68, 0,
+  0, 62, 59, 66, 45, 63, 61, 64, 46, 60,
+  42, 42, 68, 0, 0, 68, 0, 0, 68, 0,
+  0, 68, 0, 0, 68, 0, 0, 68, 0, 0,
+  68, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 68, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 36, 0, 0, 0, 0, 0, 0,
+
+  0, 0, 68, 0, 0, 0, 0, 39, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 68, 0, 0, 23, 37, 35, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 24, 0,
+  0, 68, 0, 0, 0, 0, 0, 0, 0, 0,
+  5, 0, 0, 20, 14, 0, 21, 0, 0, 68,
+  25, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 2, 1, 0, 9, 0, 0, 0,
+  0, 0, 0, 0, 22, 68, 13, 0, 38, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 
-#define YY_NUM_RULES 67
-#define YY_END_OF_BUFFER 68
-     static yyconst short int yy_accept[382] = { 0,
-       0, 0, 0, 0, 0, 0, 40, 40, 40, 40,
-       68, 66, 65, 67, 63, 53, 56, 67, 38, 54,
-       55, 51, 49, 50, 52, 43, 46, 45, 47, 44,
-       67, 39, 52, 48, 40, 41, 40, 42, 66, 0,
-       0, 60, 57, 64, 43, 61, 59, 62, 44, 58,
-       40, 40, 66, 0, 0, 66, 0, 0, 66, 0,
-       0, 66, 0, 0, 66, 0, 0, 66, 0, 0,
-       66, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 66, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 34, 0, 0, 0, 0, 0, 0,
-
-       0, 0, 66, 0, 0, 0, 0, 37, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 66, 0, 0, 21, 35, 33, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 22, 0,
-       0, 66, 0, 0, 0, 0, 0, 0, 0, 0,
-       5, 0, 0, 18, 14, 0, 19, 0, 0, 66,
-       23, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 2, 1, 0, 9, 0, 0, 0,
-       0, 0, 20, 66, 13, 0, 36, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
-       0, 0, 0, 32, 0, 66, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       3, 17, 0, 0, 66, 15, 0, 0, 0, 0,
-       0, 0, 0, 10, 11, 12, 8, 7, 0, 16,
-       0, 66, 0, 0, 0, 0, 26, 0, 0, 6,
-       4, 66, 0, 0, 0, 0, 0, 0, 66, 0,
-       0, 0, 0, 0, 0, 66, 0, 0, 0, 0,
-       0, 0, 66, 0, 0, 30, 0, 0, 0, 66,
-       0, 0, 0, 0, 0, 0, 66, 0, 0, 0,
-       0, 0, 0, 66, 0, 31, 0, 0, 29, 0,
-
-       66, 0, 25, 24, 27, 66, 28, 66, 66, 66,
-       66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-       66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-       66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-       66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-       66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-       66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-       66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-       0
-     };
+  0, 0, 0, 0, 0, 0, 0, 34, 0, 68,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 3, 0, 17, 0, 0, 0,
+  68, 15, 0, 0, 0, 0, 0, 0, 0, 10,
+  11, 12, 8, 7, 0, 19, 16, 18, 0, 68,
+  0, 0, 0, 0, 28, 0, 0, 6, 4, 68,
+  0, 0, 0, 0, 0, 0, 68, 0, 0, 0,
+  0, 0, 0, 68, 0, 0, 0, 0, 0, 0,
+  68, 0, 0, 32, 0, 0, 0, 68, 0, 0,
+  0, 0, 0, 0, 68, 0, 0, 0, 0, 0,
+
+  0, 68, 0, 33, 0, 0, 31, 0, 68, 0,
+  27, 26, 29, 68, 30, 68, 68, 68, 68, 68,
+  68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+  68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+  68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+  68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+  68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+  68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+  68, 68, 68, 68, 68, 68, 68, 68, 0
+};
 
-static yyconst int yy_ec[256] = { 0,
+static yyconst flex_int32_t yy_ec[256] = { 0,
   1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -354,8 +426,8 @@
   1, 21, 1, 1, 22, 1, 23, 24, 25, 26,
 
   27, 28, 29, 30, 31, 20, 32, 33, 34, 35,
-  36, 37, 20, 38, 39, 40, 41, 42, 20, 43,
-  20, 44, 1, 45, 1, 1, 1, 1, 1, 1,
+  36, 37, 20, 38, 39, 40, 41, 42, 43, 44,
+  20, 45, 1, 46, 1, 1, 1, 1, 1, 1,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -372,281 +444,288 @@
   1, 1, 1, 1, 1
 };
 
-static yyconst int yy_meta[46] = { 0,
+static yyconst flex_int32_t yy_meta[47] = { 0,
   1, 1, 2, 1, 1, 1, 2, 1, 1, 1,
   1, 1, 1, 3, 3, 4, 1, 1, 3, 3,
   1, 3, 3, 3, 3, 3, 3, 3, 3, 3,
   3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-  3, 3, 3, 3, 1
+  3, 3, 3, 3, 3, 1
 };
 
-static yyconst short int yy_base[485] = { 0,
-  607, 606, 0, 0, 39, 40, 47, 48, 53, 56,
-  621, 0, 35, 624, 624, 603, 624, 613, 624, 624,
-  624, 624, 624, 624, 600, 603, 599, 598, 597, 0,
-  568, 624, 624, 595, 590, 624, 54, 624, 0, 581,
-  569, 624, 624, 624, 594, 624, 624, 624, 0, 624,
-  586, 55, 0, 566, 575, 0, 574, 562, 0, 561,
-  567, 0, 566, 575, 0, 574, 582, 0, 581, 53,
-  0, 555, 558, 570, 52, 34, 565, 38, 568, 65,
-  563, 73, 0, 562, 554, 547, 547, 559, 561, 552,
-  549, 545, 557, 624, 556, 543, 548, 553, 535, 550,
-
-  530, 64, 0, 529, 537, 543, 542, 624, 535, 539,
-  539, 525, 538, 534, 533, 534, 535, 537, 525, 517,
-  522, 521, 0, 514, 526, 530, 529, 624, 535, 527,
-  521, 520, 519, 504, 60, 517, 501, 515, 624, 514,
-  516, 0, 521, 503, 497, 505, 81, 75, 497, 496,
-  79, 510, 40, 624, 624, 509, 624, 509, 491, 0,
-  624, 489, 497, 499, 489, 502, 501, 480, 80, 492,
-  498, 497, 488, 624, 624, 91, 624, 489, 491, 485,
-  477, 481, 624, 0, 624, 479, 624, 485, 477, 470,
-  472, 485, 482, 465, 471, 464, 459, 471, 475, 469,
-
-  472, 455, 462, 624, 465, 0, 468, 456, 466, 465,
-  455, 451, 466, 448, 460, 456, 458, 450, 440, 447,
-  624, 624, 449, 445, 0, 624, 439, 440, 455, 437,
-  445, 441, 433, 624, 624, 624, 624, 624, 440, 624,
-  439, 0, 429, 446, 428, 426, 624, 444, 438, 624,
-  624, 0, 426, 441, 431, 423, 427, 421, 0, 431,
-  423, 422, 428, 427, 431, 0, 430, 415, 423, 427,
-  413, 408, 0, 404, 419, 624, 81, 415, 406, 0,
-  419, 414, 404, 408, 398, 410, 0, 403, 402, 408,
-  103, 93, 92, 0, 70, 624, 75, 70, 624, 63,
+static yyconst flex_int16_t yy_base[493] = { 0,
+  616, 615, 0, 0, 40, 41, 48, 49, 54, 57,
+  630, 0, 36, 633, 633, 612, 633, 622, 633, 633,
+  633, 633, 633, 633, 609, 612, 608, 607, 606, 0,
+  576, 633, 633, 604, 599, 633, 55, 633, 0, 590,
+  578, 633, 633, 633, 603, 633, 633, 633, 0, 633,
+  595, 56, 0, 575, 584, 0, 583, 571, 0, 570,
+  576, 0, 575, 584, 0, 583, 591, 0, 590, 54,
+  0, 564, 567, 579, 53, 35, 574, 39, 577, 66,
+  572, 73, 0, 571, 563, 556, 556, 568, 570, 561,
+  558, 554, 566, 633, 565, 552, 557, 562, 544, 559,
+
+  538, 63, 0, 537, 546, 552, 551, 633, 544, 548,
+  548, 534, 547, 543, 542, 543, 544, 546, 534, 526,
+  531, 530, 0, 523, 535, 539, 538, 633, 544, 536,
+  530, 529, 528, 513, 70, 526, 510, 524, 633, 523,
+  525, 0, 530, 512, 506, 514, 85, 79, 506, 505,
+  76, 519, 92, 633, 633, 518, 633, 518, 500, 0,
+  633, 498, 506, 508, 498, 511, 510, 488, 69, 501,
+  507, 506, 497, 633, 633, 95, 633, 498, 490, 499,
+  493, 487, 484, 488, 633, 0, 633, 486, 633, 492,
+  484, 477, 479, 492, 489, 472, 478, 471, 465, 478,
+
+  482, 476, 479, 472, 460, 468, 459, 633, 470, 0,
+  473, 461, 471, 470, 460, 456, 471, 453, 465, 461,
+  463, 455, 444, 452, 633, 447, 633, 453, 445, 448,
+  0, 633, 442, 443, 458, 440, 448, 444, 436, 633,
+  633, 633, 633, 633, 443, 633, 633, 633, 442, 0,
+  432, 449, 431, 429, 633, 447, 441, 633, 633, 0,
+  429, 444, 434, 426, 430, 424, 0, 434, 426, 425,
+  431, 430, 434, 0, 433, 418, 426, 430, 416, 411,
+  0, 407, 422, 633, 34, 418, 409, 0, 422, 417,
+  407, 411, 401, 413, 0, 110, 96, 101, 88, 90,
 
-  0, 40, 624, 624, 624, 0, 624, 0, 0, 0,
+  92, 0, 66, 633, 79, 74, 633, 57, 0, 45,
+  633, 633, 633, 0, 633, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 624,
-  624, 124, 128, 132, 46, 135, 139, 142, 145, 148,
-  151, 154, 157, 160, 163, 166, 169, 172, 175, 178,
-
-  181, 184, 187, 190, 193, 196, 199, 202, 205, 208,
-  211, 214, 217, 220, 223, 226, 229, 232, 235, 238,
-  241, 244, 247, 250, 253, 256, 259, 262, 265, 268,
-  271, 274, 277, 280, 283, 286, 289, 292, 295, 298,
-  301, 304, 307, 310, 313, 316, 319, 322, 325, 328,
-  331, 334, 337, 340, 343, 346, 349, 352, 355, 358,
-  361, 364, 367, 370, 373, 376, 379, 382, 385, 388,
-  391, 394, 397, 400, 403, 406, 409, 412, 415, 418,
-  421, 424, 427, 430
+  0, 0, 0, 0, 0, 0, 0, 633, 633, 130,
+  134, 138, 47, 141, 145, 148, 151, 154, 157, 160,
+
+  163, 166, 169, 172, 175, 178, 181, 184, 187, 190,
+  193, 196, 199, 202, 205, 208, 211, 214, 217, 220,
+  223, 226, 229, 232, 235, 238, 241, 244, 247, 250,
+  253, 256, 259, 262, 265, 268, 271, 274, 277, 280,
+  283, 286, 289, 292, 295, 298, 301, 304, 307, 310,
+  313, 316, 319, 322, 325, 328, 331, 334, 337, 340,
+  343, 346, 349, 352, 355, 358, 361, 364, 367, 370,
+  373, 376, 379, 382, 385, 388, 391, 394, 397, 400,
+  403, 406, 409, 412, 415, 418, 421, 424, 427, 430,
+  433, 436
 };
 
-static yyconst short int yy_def[485] = { 0,
-  382, 382, 381, 3, 3, 3, 383, 383, 383, 383,
-  381, 384, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 385,
-  381, 381, 381, 381, 386, 381, 386, 381, 387, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 385, 381,
-  386, 386, 388, 381, 381, 389, 381, 381, 390, 381,
-  381, 391, 381, 381, 392, 381, 381, 393, 381, 381,
-  394, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 395, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-
-  381, 381, 396, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 397, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 398, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 399,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 400, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-
-  381, 381, 381, 381, 381, 401, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 402, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 403, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 404, 381, 381, 381, 381, 381, 381, 405, 381,
-  381, 381, 381, 381, 381, 406, 381, 381, 381, 381,
-  381, 381, 407, 381, 381, 381, 381, 381, 381, 408,
-  381, 381, 381, 381, 381, 381, 409, 381, 381, 381,
-  381, 381, 381, 410, 381, 381, 381, 381, 381, 381,
+static yyconst flex_int16_t yy_def[493] = { 0,
+  390, 390, 389, 3, 3, 3, 391, 391, 391, 391,
+  389, 392, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 393,
+  389, 389, 389, 389, 394, 389, 394, 389, 395, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 393, 389,
+  394, 394, 396, 389, 389, 397, 389, 389, 398, 389,
+  389, 399, 389, 389, 400, 389, 389, 401, 389, 389,
+  402, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 403, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+
+  389, 389, 404, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 405, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 406, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 407,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 408, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 409,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  410, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 411,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 412,
+  389, 389, 389, 389, 389, 389, 413, 389, 389, 389,
+  389, 389, 389, 414, 389, 389, 389, 389, 389, 389,
+  415, 389, 389, 389, 389, 389, 389, 416, 389, 389,
+  389, 389, 389, 389, 417, 389, 389, 389, 389, 389,
 
-  411, 381, 381, 381, 381, 412, 381, 413, 414, 415,
-  416, 417, 418, 419, 420, 421, 422, 423, 424, 425,
+  389, 418, 389, 389, 389, 389, 389, 389, 419, 389,
+  389, 389, 389, 420, 389, 421, 422, 423, 424, 425,
   426, 427, 428, 429, 430, 431, 432, 433, 434, 435,
   436, 437, 438, 439, 440, 441, 442, 443, 444, 445,
   446, 447, 448, 449, 450, 451, 452, 453, 454, 455,
   456, 457, 458, 459, 460, 461, 462, 463, 464, 465,
   466, 467, 468, 469, 470, 471, 472, 473, 474, 475,
-  476, 477, 478, 479, 480, 481, 482, 483, 484, 381,
-  0, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381
+  476, 477, 478, 479, 480, 481, 482, 483, 484, 485,
+  486, 487, 488, 489, 490, 491, 492, 389, 0, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389
 };
 
-static yyconst short int yy_nxt[670] = { 0,
+static yyconst flex_int16_t yy_nxt[680] = { 0,
   14, 15, 15, 16, 17, 18, 19, 20, 21, 22,
   23, 24, 25, 26, 14, 27, 28, 29, 14, 30,
   14, 30, 30, 30, 30, 30, 30, 30, 30, 30,
   30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-  30, 30, 30, 30, 31, 32, 32, 40, 49, 14,
-  14, 33, 33, 36, 36, 14, 34, 34, 14, 38,
-  51, 51, 38, 41, 91, 94, 307, 37, 37, 92,
-  179, 95, 180, 37, 52, 52, 37, 73, 74, 75,
-  76, 153, 77, 78, 87, 79, 88, 97, 305, 80,
-  121, 81, 82, 89, 90, 100, 304, 98, 154, 101,
-
-  176, 303, 102, 165, 122, 166, 167, 168, 169, 171,
-  302, 172, 192, 173, 283, 193, 198, 177, 300, 170,
-  284, 199, 299, 200, 12, 12, 12, 12, 35, 35,
-  35, 35, 39, 39, 39, 51, 298, 51, 51, 53,
-  53, 53, 56, 56, 56, 59, 59, 59, 62, 62,
-  62, 65, 65, 65, 68, 68, 68, 71, 71, 71,
-  83, 83, 83, 103, 103, 103, 123, 123, 123, 142,
-  142, 142, 160, 160, 160, 184, 184, 184, 206, 206,
-  206, 225, 225, 225, 242, 242, 242, 252, 252, 252,
-  259, 259, 259, 266, 266, 266, 273, 273, 273, 280,
-
-  280, 280, 287, 287, 287, 294, 294, 294, 301, 301,
-  301, 306, 306, 306, 308, 308, 308, 309, 309, 309,
-  310, 310, 310, 311, 311, 311, 312, 312, 312, 313,
-  313, 313, 314, 314, 314, 315, 315, 315, 316, 316,
-  316, 317, 317, 317, 318, 318, 318, 319, 319, 319,
-  320, 320, 320, 321, 321, 321, 322, 322, 322, 323,
-  323, 323, 324, 324, 324, 325, 325, 325, 326, 326,
-  326, 327, 327, 327, 328, 328, 328, 329, 329, 329,
-  330, 330, 330, 331, 331, 331, 332, 332, 332, 333,
-  333, 333, 334, 334, 334, 335, 335, 335, 336, 336,
-
-  336, 337, 337, 337, 338, 338, 338, 339, 339, 339,
-  340, 340, 340, 341, 341, 341, 342, 342, 342, 343,
-  343, 343, 344, 344, 344, 345, 345, 345, 346, 346,
-  346, 347, 347, 347, 348, 348, 348, 349, 349, 349,
-  350, 350, 350, 351, 351, 351, 352, 352, 352, 353,
-  353, 353, 354, 354, 354, 355, 355, 355, 356, 356,
-  356, 357, 357, 357, 358, 358, 358, 359, 359, 359,
-  360, 360, 360, 361, 361, 361, 362, 362, 362, 363,
-  363, 363, 364, 364, 364, 365, 365, 365, 366, 366,
-  366, 367, 367, 367, 368, 368, 368, 369, 369, 369,
-
-  370, 370, 370, 371, 371, 371, 372, 372, 372, 373,
-  373, 373, 374, 374, 374, 375, 375, 375, 376, 376,
-  376, 377, 377, 377, 378, 378, 378, 379, 379, 379,
-  380, 380, 380, 297, 296, 295, 293, 292, 291, 290,
-  289, 288, 286, 285, 282, 281, 279, 278, 277, 276,
-  275, 274, 272, 271, 270, 269, 268, 267, 265, 264,
-  263, 262, 261, 260, 258, 257, 256, 255, 254, 253,
-  251, 250, 249, 248, 247, 246, 245, 244, 243, 241,
-  240, 239, 238, 237, 236, 235, 234, 233, 232, 231,
-  230, 229, 228, 227, 226, 224, 223, 222, 221, 220,
-
-  219, 218, 217, 216, 215, 214, 213, 212, 211, 210,
-  209, 208, 207, 205, 204, 203, 202, 201, 197, 196,
-  195, 194, 191, 190, 189, 188, 187, 186, 185, 183,
-  182, 181, 178, 175, 174, 164, 163, 162, 161, 159,
-  158, 157, 156, 155, 152, 151, 150, 149, 148, 147,
-  146, 145, 144, 143, 141, 140, 139, 138, 137, 136,
-  135, 134, 133, 132, 131, 130, 129, 128, 127, 126,
-  125, 124, 120, 119, 118, 117, 116, 115, 114, 113,
-  112, 111, 110, 109, 108, 107, 106, 105, 104, 99,
-  96, 93, 86, 85, 84, 72, 70, 69, 67, 66,
-
-  64, 63, 61, 60, 58, 57, 52, 45, 55, 54,
-  52, 48, 50, 48, 47, 46, 45, 44, 43, 42,
-  381, 13, 13, 11, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381
+  30, 30, 30, 30, 30, 31, 32, 32, 40, 49,
+  14, 14, 33, 33, 36, 36, 14, 34, 34, 14,
+  38, 51, 51, 38, 41, 91, 94, 291, 37, 37,
+  92, 315, 95, 292, 37, 52, 52, 37, 73, 74,
+  75, 76, 313, 77, 78, 87, 79, 88, 97, 121,
+  80, 153, 81, 82, 89, 100, 90, 176, 98, 101,
+
+  312, 194, 102, 122, 195, 311, 310, 165, 154, 166,
+  167, 168, 169, 171, 177, 172, 179, 173, 308, 307,
+  200, 306, 180, 170, 181, 201, 305, 202, 304, 182,
+  12, 12, 12, 12, 35, 35, 35, 35, 39, 39,
+  39, 51, 303, 51, 51, 53, 53, 53, 56, 56,
+  56, 59, 59, 59, 62, 62, 62, 65, 65, 65,
+  68, 68, 68, 71, 71, 71, 83, 83, 83, 103,
+  103, 103, 123, 123, 123, 142, 142, 142, 160, 160,
+  160, 186, 186, 186, 210, 210, 210, 231, 231, 231,
+  250, 250, 250, 260, 260, 260, 267, 267, 267, 274,
+
+  274, 274, 281, 281, 281, 288, 288, 288, 295, 295,
+  295, 302, 302, 302, 309, 309, 309, 314, 314, 314,
+  316, 316, 316, 317, 317, 317, 318, 318, 318, 319,
+  319, 319, 320, 320, 320, 321, 321, 321, 322, 322,
+  322, 323, 323, 323, 324, 324, 324, 325, 325, 325,
+  326, 326, 326, 327, 327, 327, 328, 328, 328, 329,
+  329, 329, 330, 330, 330, 331, 331, 331, 332, 332,
+  332, 333, 333, 333, 334, 334, 334, 335, 335, 335,
+  336, 336, 336, 337, 337, 337, 338, 338, 338, 339,
+  339, 339, 340, 340, 340, 341, 341, 341, 342, 342,
+
+  342, 343, 343, 343, 344, 344, 344, 345, 345, 345,
+  346, 346, 346, 347, 347, 347, 348, 348, 348, 349,
+  349, 349, 350, 350, 350, 351, 351, 351, 352, 352,
+  352, 353, 353, 353, 354, 354, 354, 355, 355, 355,
+  356, 356, 356, 357, 357, 357, 358, 358, 358, 359,
+  359, 359, 360, 360, 360, 361, 361, 361, 362, 362,
+  362, 363, 363, 363, 364, 364, 364, 365, 365, 365,
+  366, 366, 366, 367, 367, 367, 368, 368, 368, 369,
+  369, 369, 370, 370, 370, 371, 371, 371, 372, 372,
+  372, 373, 373, 373, 374, 374, 374, 375, 375, 375,
+
+  376, 376, 376, 377, 377, 377, 378, 378, 378, 379,
+  379, 379, 380, 380, 380, 381, 381, 381, 382, 382,
+  382, 383, 383, 383, 384, 384, 384, 385, 385, 385,
+  386, 386, 386, 387, 387, 387, 388, 388, 388, 301,
+  300, 299, 298, 297, 296, 294, 293, 290, 289, 287,
+  286, 285, 284, 283, 282, 280, 279, 278, 277, 276,
+  275, 273, 272, 271, 270, 269, 268, 266, 265, 264,
+  263, 262, 261, 259, 258, 257, 256, 255, 254, 253,
+  252, 251, 249, 248, 247, 246, 245, 244, 243, 242,
+  241, 240, 239, 238, 237, 236, 235, 234, 233, 232,
+
+  230, 229, 228, 227, 226, 225, 224, 223, 222, 221,
+  220, 219, 218, 217, 216, 215, 214, 213, 212, 211,
+  209, 208, 207, 206, 205, 204, 203, 199, 198, 197,
+  196, 193, 192, 191, 190, 189, 188, 187, 185, 184,
+  183, 178, 175, 174, 164, 163, 162, 161, 159, 158,
+  157, 156, 155, 152, 151, 150, 149, 148, 147, 146,
+  145, 144, 143, 141, 140, 139, 138, 137, 136, 135,
+  134, 133, 132, 131, 130, 129, 128, 127, 126, 125,
+  124, 120, 119, 118, 117, 116, 115, 114, 113, 112,
+  111, 110, 109, 108, 107, 106, 105, 104, 99, 96,
+
+  93, 86, 85, 84, 72, 70, 69, 67, 66, 64,
+  63, 61, 60, 58, 57, 52, 45, 55, 54, 52,
+  48, 50, 48, 47, 46, 45, 44, 43, 42, 389,
+  13, 13, 11, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389
 };
 
-static yyconst short int yy_chk[670] = { 0,
+static yyconst flex_int16_t yy_chk[680] = { 0,
   3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
   3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
   3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
   3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-  3, 3, 3, 3, 3, 5, 6, 13, 385, 7,
-  8, 5, 6, 7, 8, 9, 5, 6, 10, 9,
-  37, 52, 10, 13, 76, 78, 302, 7, 8, 76,
-  153, 78, 153, 9, 37, 52, 10, 70, 70, 70,
-  70, 135, 70, 70, 75, 70, 75, 80, 300, 70,
-  102, 70, 70, 75, 75, 82, 298, 80, 135, 82,
-
-  151, 297, 82, 147, 102, 147, 147, 147, 147, 148,
-  295, 148, 169, 148, 277, 169, 176, 151, 293, 147,
-  277, 176, 292, 176, 382, 382, 382, 382, 383, 383,
-  383, 383, 384, 384, 384, 386, 291, 386, 386, 387,
-  387, 387, 388, 388, 388, 389, 389, 389, 390, 390,
-  390, 391, 391, 391, 392, 392, 392, 393, 393, 393,
-  394, 394, 394, 395, 395, 395, 396, 396, 396, 397,
-  397, 397, 398, 398, 398, 399, 399, 399, 400, 400,
-  400, 401, 401, 401, 402, 402, 402, 403, 403, 403,
-  404, 404, 404, 405, 405, 405, 406, 406, 406, 407,
-
-  407, 407, 408, 408, 408, 409, 409, 409, 410, 410,
-  410, 411, 411, 411, 412, 412, 412, 413, 413, 413,
-  414, 414, 414, 415, 415, 415, 416, 416, 416, 417,
-  417, 417, 418, 418, 418, 419, 419, 419, 420, 420,
-  420, 421, 421, 421, 422, 422, 422, 423, 423, 423,
-  424, 424, 424, 425, 425, 425, 426, 426, 426, 427,
-  427, 427, 428, 428, 428, 429, 429, 429, 430, 430,
-  430, 431, 431, 431, 432, 432, 432, 433, 433, 433,
-  434, 434, 434, 435, 435, 435, 436, 436, 436, 437,
-  437, 437, 438, 438, 438, 439, 439, 439, 440, 440,
-
-  440, 441, 441, 441, 442, 442, 442, 443, 443, 443,
-  444, 444, 444, 445, 445, 445, 446, 446, 446, 447,
-  447, 447, 448, 448, 448, 449, 449, 449, 450, 450,
-  450, 451, 451, 451, 452, 452, 452, 453, 453, 453,
-  454, 454, 454, 455, 455, 455, 456, 456, 456, 457,
-  457, 457, 458, 458, 458, 459, 459, 459, 460, 460,
-  460, 461, 461, 461, 462, 462, 462, 463, 463, 463,
-  464, 464, 464, 465, 465, 465, 466, 466, 466, 467,
-  467, 467, 468, 468, 468, 469, 469, 469, 470, 470,
-  470, 471, 471, 471, 472, 472, 472, 473, 473, 473,
-
-  474, 474, 474, 475, 475, 475, 476, 476, 476, 477,
-  477, 477, 478, 478, 478, 479, 479, 479, 480, 480,
-  480, 481, 481, 481, 482, 482, 482, 483, 483, 483,
-  484, 484, 484, 290, 289, 288, 286, 285, 284, 283,
-  282, 281, 279, 278, 275, 274, 272, 271, 270, 269,
-  268, 267, 265, 264, 263, 262, 261, 260, 258, 257,
-  256, 255, 254, 253, 249, 248, 246, 245, 244, 243,
-  241, 239, 233, 232, 231, 230, 229, 228, 227, 224,
-  223, 220, 219, 218, 217, 216, 215, 214, 213, 212,
-  211, 210, 209, 208, 207, 205, 203, 202, 201, 200,
-
-  199, 198, 197, 196, 195, 194, 193, 192, 191, 190,
-  189, 188, 186, 182, 181, 180, 179, 178, 173, 172,
-  171, 170, 168, 167, 166, 165, 164, 163, 162, 159,
-  158, 156, 152, 150, 149, 146, 145, 144, 143, 141,
-  140, 138, 137, 136, 134, 133, 132, 131, 130, 129,
-  127, 126, 125, 124, 122, 121, 120, 119, 118, 117,
-  116, 115, 114, 113, 112, 111, 110, 109, 107, 106,
-  105, 104, 101, 100, 99, 98, 97, 96, 95, 93,
-  92, 91, 90, 89, 88, 87, 86, 85, 84, 81,
-  79, 77, 74, 73, 72, 69, 67, 66, 64, 63,
-
-  61, 60, 58, 57, 55, 54, 51, 45, 41, 40,
-  35, 34, 31, 29, 28, 27, 26, 25, 18, 16,
-  11, 2, 1, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-  381, 381, 381, 381, 381, 381, 381, 381, 381
+  3, 3, 3, 3, 3, 3, 5, 6, 13, 393,
+  7, 8, 5, 6, 7, 8, 9, 5, 6, 10,
+  9, 37, 52, 10, 13, 76, 78, 285, 7, 8,
+  76, 310, 78, 285, 9, 37, 52, 10, 70, 70,
+  70, 70, 308, 70, 70, 75, 70, 75, 80, 102,
+  70, 135, 70, 70, 75, 82, 75, 151, 80, 82,
+
+  306, 169, 82, 102, 169, 305, 303, 147, 135, 147,
+  147, 147, 147, 148, 151, 148, 153, 148, 301, 300,
+  176, 299, 153, 147, 153, 176, 298, 176, 297, 153,
+  390, 390, 390, 390, 391, 391, 391, 391, 392, 392,
+  392, 394, 296, 394, 394, 395, 395, 395, 396, 396,
+  396, 397, 397, 397, 398, 398, 398, 399, 399, 399,
+  400, 400, 400, 401, 401, 401, 402, 402, 402, 403,
+  403, 403, 404, 404, 404, 405, 405, 405, 406, 406,
+  406, 407, 407, 407, 408, 408, 408, 409, 409, 409,
+  410, 410, 410, 411, 411, 411, 412, 412, 412, 413,
+
+  413, 413, 414, 414, 414, 415, 415, 415, 416, 416,
+  416, 417, 417, 417, 418, 418, 418, 419, 419, 419,
+  420, 420, 420, 421, 421, 421, 422, 422, 422, 423,
+  423, 423, 424, 424, 424, 425, 425, 425, 426, 426,
+  426, 427, 427, 427, 428, 428, 428, 429, 429, 429,
+  430, 430, 430, 431, 431, 431, 432, 432, 432, 433,
+  433, 433, 434, 434, 434, 435, 435, 435, 436, 436,
+  436, 437, 437, 437, 438, 438, 438, 439, 439, 439,
+  440, 440, 440, 441, 441, 441, 442, 442, 442, 443,
+  443, 443, 444, 444, 444, 445, 445, 445, 446, 446,
+
+  446, 447, 447, 447, 448, 448, 448, 449, 449, 449,
+  450, 450, 450, 451, 451, 451, 452, 452, 452, 453,
+  453, 453, 454, 454, 454, 455, 455, 455, 456, 456,
+  456, 457, 457, 457, 458, 458, 458, 459, 459, 459,
+  460, 460, 460, 461, 461, 461, 462, 462, 462, 463,
+  463, 463, 464, 464, 464, 465, 465, 465, 466, 466,
+  466, 467, 467, 467, 468, 468, 468, 469, 469, 469,
+  470, 470, 470, 471, 471, 471, 472, 472, 472, 473,
+  473, 473, 474, 474, 474, 475, 475, 475, 476, 476,
+  476, 477, 477, 477, 478, 478, 478, 479, 479, 479,
+
+  480, 480, 480, 481, 481, 481, 482, 482, 482, 483,
+  483, 483, 484, 484, 484, 485, 485, 485, 486, 486,
+  486, 487, 487, 487, 488, 488, 488, 489, 489, 489,
+  490, 490, 490, 491, 491, 491, 492, 492, 492, 294,
+  293, 292, 291, 290, 289, 287, 286, 283, 282, 280,
+  279, 278, 277, 276, 275, 273, 272, 271, 270, 269,
+  268, 266, 265, 264, 263, 262, 261, 257, 256, 254,
+  253, 252, 251, 249, 245, 239, 238, 237, 236, 235,
+  234, 233, 230, 229, 228, 226, 224, 223, 222, 221,
+  220, 219, 218, 217, 216, 215, 214, 213, 212, 211,
+
+  209, 207, 206, 205, 204, 203, 202, 201, 200, 199,
+  198, 197, 196, 195, 194, 193, 192, 191, 190, 188,
+  184, 183, 182, 181, 180, 179, 178, 173, 172, 171,
+  170, 168, 167, 166, 165, 164, 163, 162, 159, 158,
+  156, 152, 150, 149, 146, 145, 144, 143, 141, 140,
+  138, 137, 136, 134, 133, 132, 131, 130, 129, 127,
+  126, 125, 124, 122, 121, 120, 119, 118, 117, 116,
+  115, 114, 113, 112, 111, 110, 109, 107, 106, 105,
+  104, 101, 100, 99, 98, 97, 96, 95, 93, 92,
+  91, 90, 89, 88, 87, 86, 85, 84, 81, 79,
+
+  77, 74, 73, 72, 69, 67, 66, 64, 63, 61,
+  60, 58, 57, 55, 54, 51, 45, 41, 40, 35,
+  34, 31, 29, 28, 27, 26, 25, 18, 16, 11,
+  2, 1, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+  389, 389, 389, 389, 389, 389, 389, 389, 389
 };
 
 static yy_state_type yy_last_accepting_state;
 static char *yy_last_accepting_cpos;
 
+extern int yy_flex_debug;
+int yy_flex_debug = 0;
+
 /* The intent behind this definition is that it'll catch
  * any uses of REJECT which flex missed.
  */
@@ -656,7 +735,6 @@
 #define YY_RESTORE_YY_MORE_OFFSET
 char *yytext;
 #line 1 "albumtheme.l"
-#define INITIAL 0
 #line 2 "albumtheme.l"
 /*
  *  GThumb
@@ -680,12 +758,57 @@
 
 #include <glib.h>
 
+
+#line 772 "lex.yy.c"
+
+#define INITIAL 0
 #define TAG 1
 #define STAG 2
 #define STR 3
 #define SSTR 4
 
-#line 693 "lex.yy.c"
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void);
+
+/* Accessor methods to globals.
+   These are made visible to non-reentrant scanners for convenience. */
+
+int yylex_destroy (void);
+
+int yyget_debug (void);
+
+void yyset_debug (int debug_flag);
+
+YY_EXTRA_TYPE yyget_extra (void);
+
+void yyset_extra (YY_EXTRA_TYPE user_defined);
+
+FILE *yyget_in (void);
+
+void yyset_in (FILE * in_str);
+
+FILE *yyget_out (void);
+
+void yyset_out (FILE * out_str);
+
+int yyget_leng (void);
+
+char *yyget_text (void);
+
+int yyget_lineno (void);
+
+void yyset_lineno (int line_number);
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -693,65 +816,30 @@
 
 #ifndef YY_SKIP_YYWRAP
 #ifdef __cplusplus
-extern "C" int yywrap YY_PROTO ((void));
+extern "C" int yywrap (void);
 #else
-extern int yywrap YY_PROTO ((void));
+extern int yywrap (void);
 #endif
 #endif
 
-#ifndef YY_NO_UNPUT
-static void yyunput YY_PROTO ((int c, char *buf_ptr));
-#endif
+static void yyunput (int c, char *buf_ptr);
 
 #ifndef yytext_ptr
-static void yy_flex_strncpy YY_PROTO ((char *, yyconst char *, int));
+static void yy_flex_strncpy (char *, yyconst char *, int);
 #endif
 
 #ifdef YY_NEED_STRLEN
-static int yy_flex_strlen YY_PROTO ((yyconst char *));
+static int yy_flex_strlen (yyconst char *);
 #endif
 
 #ifndef YY_NO_INPUT
-#ifdef __cplusplus
-static int yyinput YY_PROTO ((void));
-#else
-static int input YY_PROTO ((void));
-#endif
-#endif
-
-#if YY_STACK_USED
-static int yy_start_stack_ptr = 0;
-static int yy_start_stack_depth = 0;
-static int *yy_start_stack = 0;
-#ifndef YY_NO_PUSH_STATE
-static void yy_push_state YY_PROTO ((int new_state));
-#endif
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state YY_PROTO ((void));
-#endif
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state YY_PROTO ((void));
-#endif
 
+#ifdef __cplusplus
+static int yyinput (void);
 #else
-#define YY_NO_PUSH_STATE 1
-#define YY_NO_POP_STATE 1
-#define YY_NO_TOP_STATE 1
+static int input (void);
 #endif
 
-#ifdef YY_MALLOC_DECL
-YY_MALLOC_DECL
-#else
-#if __STDC__
-#ifndef __cplusplus
-#include <stdlib.h>
-#endif
-#else
-/* Just try to get by without declaring the routines.  This will fail
- * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
- * or sizeof(void*) != sizeof(int).
- */
-#endif
 #endif
 
 /* Amount of stuff to slurp up with each read. */
@@ -760,12 +848,11 @@
 #endif
 
 /* Copy whatever the last rule matched to the standard output. */
-
 #ifndef ECHO
 /* This used to be an fputs(), but since the string might contain NUL's,
  * we now use fwrite().
  */
-#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#define ECHO fwrite( yytext, yyleng, 1, yyout )
 #endif
 
 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
@@ -773,9 +860,10 @@
  */
 #ifndef YY_INPUT
 #define YY_INPUT(buf,result,max_size) \
-	if ( yy_current_buffer->yy_is_interactive ) \
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
 		{ \
-		int c = '*', n; \
+		int c = '*'; \
+		unsigned n; \
 		for ( n = 0; n < max_size && \
 			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
 			buf[n] = (char) c; \
@@ -785,9 +873,22 @@
 			YY_FATAL_ERROR( "input in flex scanner failed" ); \
 		result = n; \
 		} \
-	else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
-		  && ferror( yyin ) ) \
-		YY_FATAL_ERROR( "input in flex scanner failed" );
+	else \
+		{ \
+		errno=0; \
+		while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+			{ \
+			if( errno != EINTR) \
+				{ \
+				YY_FATAL_ERROR( "input in flex scanner failed" ); \
+				break; \
+				} \
+			errno=0; \
+			clearerr(yyin); \
+			} \
+		}\
+\
+
 #endif
 
 /* No semi-colon after return; correct usage is to write "yyterminate();" -
@@ -808,12 +909,18 @@
 #define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
 #endif
 
+/* end tables serialization structures and prototypes */
+
 /* Default declaration of generated scanner - a define so the user can
  * easily add parameters.
  */
 #ifndef YY_DECL
-#define YY_DECL int yylex YY_PROTO(( void ))
-#endif
+#define YY_DECL_IS_OURS 1
+
+extern int yylex (void);
+
+#define YY_DECL int yylex (void)
+#endif /* !YY_DECL */
 
 /* Code executed at the beginning of each rule, after yytext and yyleng
  * have been set up.
@@ -830,27 +937,29 @@
 #define YY_RULE_SETUP \
 	YY_USER_ACTION
 
+/** The main scanner function which does all the work.
+ */
 YY_DECL
 {
   register yy_state_type yy_current_state;
-  register char *yy_cp = NULL, *yy_bp = NULL;
+  register char *yy_cp, *yy_bp;
   register int yy_act;
 
 #line 32 "albumtheme.l"
 
 
-#line 847 "lex.yy.c"
+#line 961 "lex.yy.c"
 
-  if (yy_init)
+  if (!(yy_init))
     {
-      yy_init = 0;
+      (yy_init) = 1;
 
 #ifdef YY_USER_INIT
       YY_USER_INIT;
 #endif
 
-      if (!yy_start)
-	yy_start = 1;		/* first start state */
+      if (!(yy_start))
+	(yy_start) = 1;		/* first start state */
 
       if (!yyin)
 	yyin = stdin;
@@ -858,68 +967,69 @@
       if (!yyout)
 	yyout = stdout;
 
-      if (!yy_current_buffer)
-	yy_current_buffer = yy_create_buffer (yyin, YY_BUF_SIZE);
+      if (!YY_CURRENT_BUFFER)
+	{
+	  yyensure_buffer_stack ();
+	  YY_CURRENT_BUFFER_LVALUE = yy_create_buffer (yyin, YY_BUF_SIZE);
+	}
 
       yy_load_buffer_state ();
     }
 
   while (1)			/* loops until end-of-file is reached */
     {
-      yy_cp = yy_c_buf_p;
+      yy_cp = (yy_c_buf_p);
 
       /* Support of yytext. */
-      *yy_cp = yy_hold_char;
+      *yy_cp = (yy_hold_char);
 
       /* yy_bp points to the position in yy_ch_buf of the start of
        * the current run.
        */
       yy_bp = yy_cp;
 
-      yy_current_state = yy_start;
+      yy_current_state = (yy_start);
     yy_match:
       do
 	{
 	  register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI (*yy_cp)];
 	  if (yy_accept[yy_current_state])
 	    {
-	      yy_last_accepting_state = yy_current_state;
-	      yy_last_accepting_cpos = yy_cp;
+	      (yy_last_accepting_state) = yy_current_state;
+	      (yy_last_accepting_cpos) = yy_cp;
 	    }
 	  while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state)
 	    {
 	      yy_current_state = (int) yy_def[yy_current_state];
-	      if (yy_current_state >= 382)
+	      if (yy_current_state >= 390)
 		yy_c = yy_meta[(unsigned int) yy_c];
 	    }
 	  yy_current_state =
 	    yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
 	  ++yy_cp;
 	}
-      while (yy_base[yy_current_state] != 624);
+      while (yy_base[yy_current_state] != 633);
 
     yy_find_action:
       yy_act = yy_accept[yy_current_state];
       if (yy_act == 0)
 	{			/* have to back up */
-	  yy_cp = yy_last_accepting_cpos;
-	  yy_current_state = yy_last_accepting_state;
+	  yy_cp = (yy_last_accepting_cpos);
+	  yy_current_state = (yy_last_accepting_state);
 	  yy_act = yy_accept[yy_current_state];
 	}
 
       YY_DO_BEFORE_ACTION;
 
-
     do_action:			/* This label is used only to access EOF actions. */
 
-
       switch (yy_act)
 	{			/* beginning of action switch */
 	case 0:		/* must back up */
 	  /* undo the effects of YY_DO_BEFORE_ACTION */
-	  *yy_cp = yy_hold_char;
-	  yy_cp = yy_last_accepting_cpos;
-	  yy_current_state = yy_last_accepting_state;
+	  *yy_cp = (yy_hold_char);
+	  yy_cp = (yy_last_accepting_cpos);
+	  yy_current_state = (yy_last_accepting_state);
 	  goto yy_find_action;
 
 	case 1:
@@ -1063,345 +1173,363 @@
 #line 119 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
-	    yylval.ivalue = GTH_TAG_PAGES;
-	    return PAGES;
+	    yylval.ivalue = GTH_TAG_PAGE_ROWS;
+	    return PAGE_ROWS;
 	  }
 	YY_BREAK case 19:
 	  YY_RULE_SETUP
 #line 124 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
-	    yylval.ivalue = GTH_TAG_TABLE;
-	    return TABLE;
+	    yylval.ivalue = GTH_TAG_PAGE_COLS;
+	    return PAGE_COLS;
 	  }
 	YY_BREAK case 20:
 	  YY_RULE_SETUP
 #line 129 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
-	    yylval.ivalue = GTH_TAG_THUMBS;
-	    return THUMBS;
+	    yylval.ivalue = GTH_TAG_PAGES;
+	    return PAGES;
 	  }
 	YY_BREAK case 21:
 	  YY_RULE_SETUP
 #line 134 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
-	    yylval.ivalue = GTH_TAG_DATE;
-	    return DATE;
+	    yylval.ivalue = GTH_TAG_TABLE;
+	    return TABLE;
 	  }
 	YY_BREAK case 22:
 	  YY_RULE_SETUP
 #line 139 "albumtheme.l"
 	  {
+	    BEGIN (TAG);
+	    yylval.ivalue = GTH_TAG_THUMBS;
+	    return THUMBS;
+	  }
+	YY_BREAK case 23:
+	  YY_RULE_SETUP
+#line 144 "albumtheme.l"
+	  {
+	    BEGIN (TAG);
+	    yylval.ivalue = GTH_TAG_DATE;
+	    return DATE;
+	  }
+	YY_BREAK case 24:
+	  YY_RULE_SETUP
+#line 149 "albumtheme.l"
+	  {
 	    BEGIN (STAG);
 	    yylval.ivalue = GTH_TAG_TEXT;
 	    return TEXT;
 	  }
-	YY_BREAK case 23:
+	YY_BREAK case 25:
 	  YY_RULE_SETUP
-#line 144 "albumtheme.l"
+#line 154 "albumtheme.l"
 	  {
 	    BEGIN (INITIAL);
 	    return TEXT_END;
 	  }
-	YY_BREAK case 24:
+	YY_BREAK case 26:
 	  YY_RULE_SETUP
-#line 148 "albumtheme.l"
+#line 158 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
 	    yylval.ivalue = GTH_TAG_EXIF_EXPOSURE_TIME;
 	    return EXIF_EXPOSURE_TIME;
 	  }
-	YY_BREAK case 25:
+	YY_BREAK case 27:
 	  YY_RULE_SETUP
-#line 153 "albumtheme.l"
+#line 163 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
 	    yylval.ivalue = GTH_TAG_EXIF_EXPOSURE_MODE;
 	    return EXIF_EXPOSURE_MODE;
 	  }
-	YY_BREAK case 26:
+	YY_BREAK case 28:
 	  YY_RULE_SETUP
-#line 158 "albumtheme.l"
+#line 168 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
 	    yylval.ivalue = GTH_TAG_EXIF_FLASH;
 	    return EXIF_FLASH;
 	  }
-	YY_BREAK case 27:
+	YY_BREAK case 29:
 	  YY_RULE_SETUP
-#line 163 "albumtheme.l"
+#line 173 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
 	    yylval.ivalue = GTH_TAG_EXIF_SHUTTER_SPEED;
 	    return EXIF_SHUTTER_SPEED;
 	  }
-	YY_BREAK case 28:
+	YY_BREAK case 30:
 	  YY_RULE_SETUP
-#line 168 "albumtheme.l"
+#line 178 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
 	    yylval.ivalue = GTH_TAG_EXIF_APERTURE_VALUE;
 	    return EXIF_APERTURE_VALUE;
 	  }
-	YY_BREAK case 29:
+	YY_BREAK case 31:
 	  YY_RULE_SETUP
-#line 173 "albumtheme.l"
+#line 183 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
 	    yylval.ivalue = GTH_TAG_EXIF_FOCAL_LENGTH;
 	    return EXIF_FOCAL_LENGTH;
 	  }
-	YY_BREAK case 30:
+	YY_BREAK case 32:
 	  YY_RULE_SETUP
-#line 178 "albumtheme.l"
+#line 188 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
 	    yylval.ivalue = GTH_TAG_EXIF_DATE_TIME;
 	    return EXIF_DATE_TIME;
 	  }
-	YY_BREAK case 31:
+	YY_BREAK case 33:
 	  YY_RULE_SETUP
-#line 183 "albumtheme.l"
+#line 193 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
 	    yylval.ivalue = GTH_TAG_EXIF_CAMERA_MODEL;
 	    return EXIF_CAMERA_MODEL;
 	  }
-	YY_BREAK case 32:
+	YY_BREAK case 34:
 	  YY_RULE_SETUP
-#line 188 "albumtheme.l"
+#line 198 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
 	    yylval.ivalue = GTH_TAG_SET_VAR;
 	    return SET_VAR;
 	  }
-	YY_BREAK case 33:
+	YY_BREAK case 35:
 	  YY_RULE_SETUP
-#line 193 "albumtheme.l"
+#line 203 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
 	    yylval.ivalue = GTH_TAG_EVAL;
 	    return EVAL;
 	  }
-	YY_BREAK case 34:
+	YY_BREAK case 36:
 	  YY_RULE_SETUP
-#line 198 "albumtheme.l"
+#line 208 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
 	    return IF;
 	  }
-	YY_BREAK case 35:
+	YY_BREAK case 37:
 	  YY_RULE_SETUP
-#line 202 "albumtheme.l"
+#line 212 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
 	    return ELSE;
 	  }
-	YY_BREAK case 36:
+	YY_BREAK case 38:
 	  YY_RULE_SETUP
-#line 206 "albumtheme.l"
+#line 216 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
 	    return ELSE_IF;
 	  }
-	YY_BREAK case 37:
+	YY_BREAK case 39:
 	  YY_RULE_SETUP
-#line 210 "albumtheme.l"
+#line 220 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
 	    return END;
 	  }
-	YY_BREAK case 38:
+	YY_BREAK case 40:
 	  YY_RULE_SETUP
-#line 214 "albumtheme.l"
+#line 224 "albumtheme.l"
 	  {
 	    BEGIN (STR);
 	    return '\'';
 	  }
-	YY_BREAK case 39:
+	YY_BREAK case 41:
 	  YY_RULE_SETUP
-#line 218 "albumtheme.l"
+#line 228 "albumtheme.l"
 	  {
 	    BEGIN (SSTR);
 	    return '\'';
 	  }
-	YY_BREAK case 40:
+	YY_BREAK case 42:
 	  YY_RULE_SETUP
-#line 222 "albumtheme.l"
+#line 232 "albumtheme.l"
 	  {
 	    yylval.text = g_strdup (yytext);
 	    return STRING;
 	  }
-	YY_BREAK case 41:
+	YY_BREAK case 43:
 	  YY_RULE_SETUP
-#line 226 "albumtheme.l"
+#line 236 "albumtheme.l"
 	  {
 	    BEGIN (TAG);
 	    return '\'';
 	  }
-	YY_BREAK case 42:
+	YY_BREAK case 44:
 	  YY_RULE_SETUP
-#line 230 "albumtheme.l"
+#line 240 "albumtheme.l"
 	  {
 	    BEGIN (STAG);
 	    return '\'';
 	  }
-	YY_BREAK case 43:
+	YY_BREAK case 45:
 	  YY_RULE_SETUP
-#line 234 "albumtheme.l"
+#line 244 "albumtheme.l"
 	  {
 	    yylval.ivalue = atoi (yytext);
 	    return NUMBER;
 	  }
-	YY_BREAK case 44:
+	YY_BREAK case 46:
 	  YY_RULE_SETUP
-#line 238 "albumtheme.l"
+#line 248 "albumtheme.l"
 	  {
 	    yylval.text = g_strdup (yytext);
 	    return NAME;
 	  }
-	YY_BREAK case 45:
+	YY_BREAK case 47:
 	  YY_RULE_SETUP
-#line 242 "albumtheme.l"
+#line 252 "albumtheme.l"
 	  {
 	    return '=';
 	  }
-	YY_BREAK case 46:
+	YY_BREAK case 48:
 	  YY_RULE_SETUP
-#line 245 "albumtheme.l"
+#line 255 "albumtheme.l"
 	  {
 	    yylval.ivalue = GTH_OP_CMP_LT;
 	    return COMPARE;
 	  }
-	YY_BREAK case 47:
+	YY_BREAK case 49:
 	  YY_RULE_SETUP
-#line 249 "albumtheme.l"
+#line 259 "albumtheme.l"
 	  {
 	    yylval.ivalue = GTH_OP_CMP_GT;
 	    return COMPARE;
 	  }
-	YY_BREAK case 48:
+	YY_BREAK case 50:
 	  YY_RULE_SETUP
-#line 253 "albumtheme.l"
+#line 263 "albumtheme.l"
 	  {
 	    BEGIN (INITIAL);
 	    return END_TAG;
 	  }
-	YY_BREAK case 49:
+	YY_BREAK case 51:
 	  YY_RULE_SETUP
-#line 257 "albumtheme.l"
+#line 267 "albumtheme.l"
 	  {
 	    return '+';
 	  }
-	YY_BREAK case 50:
+	YY_BREAK case 52:
 	  YY_RULE_SETUP
-#line 260 "albumtheme.l"
+#line 270 "albumtheme.l"
 	  {
 	    return '-';
 	  }
-	YY_BREAK case 51:
+	YY_BREAK case 53:
 	  YY_RULE_SETUP
-#line 263 "albumtheme.l"
+#line 273 "albumtheme.l"
 	  {
 	    return '*';
 	  }
-	YY_BREAK case 52:
+	YY_BREAK case 54:
 	  YY_RULE_SETUP
-#line 266 "albumtheme.l"
+#line 276 "albumtheme.l"
 	  {
 	    return '/';
 	  }
-	YY_BREAK case 53:
+	YY_BREAK case 55:
 	  YY_RULE_SETUP
-#line 269 "albumtheme.l"
+#line 279 "albumtheme.l"
 	  {
 	    return '!';
 	  }
-	YY_BREAK case 54:
+	YY_BREAK case 56:
 	  YY_RULE_SETUP
-#line 272 "albumtheme.l"
+#line 282 "albumtheme.l"
 	  {
 	    return '(';
 	  }
-	YY_BREAK case 55:
+	YY_BREAK case 57:
 	  YY_RULE_SETUP
-#line 275 "albumtheme.l"
+#line 285 "albumtheme.l"
 	  {
 	    return ')';
 	  }
-	YY_BREAK case 56:
+	YY_BREAK case 58:
 	  YY_RULE_SETUP
-#line 278 "albumtheme.l"
+#line 288 "albumtheme.l"
 	  {
 	    return '"';
 	  }
-	YY_BREAK case 57:
+	YY_BREAK case 59:
 	  YY_RULE_SETUP
-#line 281 "albumtheme.l"
+#line 291 "albumtheme.l"
 	  {
 	    yylval.ivalue = GTH_OP_AND;
 	    return BOOL_OP;
 	  }
-	YY_BREAK case 58:
+	YY_BREAK case 60:
 	  YY_RULE_SETUP
-#line 285 "albumtheme.l"
+#line 295 "albumtheme.l"
 	  {
 	    yylval.ivalue = GTH_OP_OR;
 	    return BOOL_OP;
 	  }
-	YY_BREAK case 59:
+	YY_BREAK case 61:
 	  YY_RULE_SETUP
-#line 289 "albumtheme.l"
+#line 299 "albumtheme.l"
 	  {
 	    yylval.ivalue = GTH_OP_CMP_EQ;
 	    return COMPARE;
 	  }
-	YY_BREAK case 60:
+	YY_BREAK case 62:
 	  YY_RULE_SETUP
-#line 293 "albumtheme.l"
+#line 303 "albumtheme.l"
 	  {
 	    yylval.ivalue = GTH_OP_CMP_NE;
 	    return COMPARE;
 	  }
-	YY_BREAK case 61:
+	YY_BREAK case 63:
 	  YY_RULE_SETUP
-#line 297 "albumtheme.l"
+#line 307 "albumtheme.l"
 	  {
 	    yylval.ivalue = GTH_OP_CMP_LE;
 	    return COMPARE;
 	  }
-	YY_BREAK case 62:
+	YY_BREAK case 64:
 	  YY_RULE_SETUP
-#line 301 "albumtheme.l"
+#line 311 "albumtheme.l"
 	  {
 	    yylval.ivalue = GTH_OP_CMP_GE;
 	    return COMPARE;
 	  }
-	YY_BREAK case 63:
+	YY_BREAK case 65:
+/* rule 65 can match eol */
 	  YY_RULE_SETUP
-#line 305 "albumtheme.l"
+#line 315 "albumtheme.l"
 	  {
 	    /* Eat spaces inside tag. */
 	  }
-	YY_BREAK case 64:
+	YY_BREAK case 66:
 	  YY_RULE_SETUP
-#line 308 "albumtheme.l"
+#line 318 "albumtheme.l"
 	  {
 	    BEGIN (INITIAL);
 	    return END_TAG;
 	  }
-	YY_BREAK case 65:
+	YY_BREAK case 67:
 	  YY_RULE_SETUP
-#line 312 "albumtheme.l"
+#line 322 "albumtheme.l"
 	  {
 	    yylval.text = g_strdup (yytext);
 	    return HTML;
 	  }
-	YY_BREAK case 66:
+	YY_BREAK case 68:
+/* rule 68 can match eol */
 	  YY_RULE_SETUP
-#line 316 "albumtheme.l"
+#line 326 "albumtheme.l"
 	  {
 	    yylval.text = g_strdup (yytext);
 	    return HTML;
@@ -1411,38 +1539,38 @@
 	case YY_STATE_EOF (STAG):
 	case YY_STATE_EOF (STR):
 	case YY_STATE_EOF (SSTR):
-#line 320 "albumtheme.l"
+#line 330 "albumtheme.l"
 	  {
 	    return 0;
 	  }
-	YY_BREAK case 67:
+	YY_BREAK case 69:
 	  YY_RULE_SETUP
-#line 324 "albumtheme.l"
+#line 334 "albumtheme.l"
 	    ECHO;
 	  YY_BREAK
-#line 1495 "lex.yy.c"
+#line 1629 "lex.yy.c"
 	case YY_END_OF_BUFFER:
 	  {
 	    /* Amount of text matched not including the EOB char. */
-	    int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+	    int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
 
 	    /* Undo the effects of YY_DO_BEFORE_ACTION. */
-	    *yy_cp = yy_hold_char;
+	    *yy_cp = (yy_hold_char);
 	    YY_RESTORE_YY_MORE_OFFSET
-	      if (yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW)
+	      if (YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW)
 	      {
 		/* We're scanning a new file or input source.  It's
 		 * possible that this happened because the user
 		 * just pointed yyin at a new source and called
 		 * yylex().  If so, then we have to assure
-		 * consistency between yy_current_buffer and our
+		 * consistency between YY_CURRENT_BUFFER and our
 		 * globals.  Here is the right place to do so, because
 		 * this is the first action (other than possibly a
 		 * back-up) that will match for the new input source.
 		 */
-		yy_n_chars = yy_current_buffer->yy_n_chars;
-		yy_current_buffer->yy_input_file = yyin;
-		yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+		(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+		YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+		YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
 	      }
 
 	    /* Note that here we test for yy_c_buf_p "<=" to the position
@@ -1452,11 +1580,12 @@
 	     * end-of-buffer state).  Contrast this with the test
 	     * in input().
 	     */
-	    if (yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars])
+	    if ((yy_c_buf_p) <=
+		&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)])
 	      {			/* This was really a NUL. */
 		yy_state_type yy_next_state;
 
-		yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+		(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
 
 		yy_current_state = yy_get_previous_state ();
 
@@ -1471,19 +1600,19 @@
 
 		yy_next_state = yy_try_NUL_trans (yy_current_state);
 
-		yy_bp = yytext_ptr + YY_MORE_ADJ;
+		yy_bp = (yytext_ptr) + YY_MORE_ADJ;
 
 		if (yy_next_state)
 		  {
 		    /* Consume the NUL. */
-		    yy_cp = ++yy_c_buf_p;
+		    yy_cp = ++(yy_c_buf_p);
 		    yy_current_state = yy_next_state;
 		    goto yy_match;
 		  }
 
 		else
 		  {
-		    yy_cp = yy_c_buf_p;
+		    yy_cp = (yy_c_buf_p);
 		    goto yy_find_action;
 		  }
 	      }
@@ -1493,7 +1622,7 @@
 		{
 		case EOB_ACT_END_OF_FILE:
 		  {
-		    yy_did_buffer_switch_on_eof = 0;
+		    (yy_did_buffer_switch_on_eof) = 0;
 
 		    if (yywrap ())
 		      {
@@ -1506,7 +1635,7 @@
 			 * YY_NULL, it'll still work - another
 			 * YY_NULL will get returned.
 			 */
-			yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+			(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
 
 			yy_act = YY_STATE_EOF (YY_START);
 			goto do_action;
@@ -1514,28 +1643,29 @@
 
 		    else
 		      {
-			if (!yy_did_buffer_switch_on_eof)
+			if (!(yy_did_buffer_switch_on_eof))
 			  YY_NEW_FILE;
 		      }
 		    break;
 		  }
 
 		case EOB_ACT_CONTINUE_SCAN:
-		  yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+		  (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
 
 		  yy_current_state = yy_get_previous_state ();
 
-		  yy_cp = yy_c_buf_p;
-		  yy_bp = yytext_ptr + YY_MORE_ADJ;
+		  yy_cp = (yy_c_buf_p);
+		  yy_bp = (yytext_ptr) + YY_MORE_ADJ;
 		  goto yy_match;
 
 		case EOB_ACT_LAST_MATCH:
-		  yy_c_buf_p = &yy_current_buffer->yy_ch_buf[yy_n_chars];
+		  (yy_c_buf_p) =
+		    &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
 
 		  yy_current_state = yy_get_previous_state ();
 
-		  yy_cp = yy_c_buf_p;
-		  yy_bp = yytext_ptr + YY_MORE_ADJ;
+		  yy_cp = (yy_c_buf_p);
+		  yy_bp = (yytext_ptr) + YY_MORE_ADJ;
 		  goto yy_find_action;
 		}
 	    break;
@@ -1548,7 +1678,6 @@
     }				/* end of scanning one token */
 }				/* end of yylex */
 
-
 /* yy_get_next_buffer - try to read in a new buffer
  *
  * Returns a code representing an action:
@@ -1556,22 +1685,21 @@
  *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
  *	EOB_ACT_END_OF_FILE - end of file
  */
-
 static int
-yy_get_next_buffer ()
+yy_get_next_buffer (void)
 {
-  register char *dest = yy_current_buffer->yy_ch_buf;
-  register char *source = yytext_ptr;
+  register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+  register char *source = (yytext_ptr);
   register int number_to_move, i;
   int ret_val;
 
-  if (yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1])
+  if ((yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1])
     YY_FATAL_ERROR
       ("fatal flex scanner internal error--end of buffer missed");
 
-  if (yy_current_buffer->yy_fill_buffer == 0)
+  if (YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0)
     {				/* Don't try to fill the buffer, so this is an EOF. */
-      if (yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1)
+      if ((yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1)
 	{
 	  /* We matched a single character, the EOB, so
 	   * treat this as a final EOF.
@@ -1591,32 +1719,29 @@
   /* Try to read more data. */
 
   /* First move last chars to start of buffer. */
-  number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+  number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
 
   for (i = 0; i < number_to_move; ++i)
     *(dest++) = *(source++);
 
-  if (yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING)
+  if (YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING)
     /* don't do the read, it's not guaranteed to return an EOF,
      * just force an EOF
      */
-    yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+    YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
 
   else
     {
-      int num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1;
+      int num_to_read =
+	YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
 
       while (num_to_read <= 0)
 	{			/* Not enough room in the buffer - grow it. */
-#ifdef YY_USES_REJECT
-	  YY_FATAL_ERROR
-	    ("input buffer overflow, can't enlarge buffer because scanner uses REJECT");
-#else
 
 	  /* just a shorter name for the current buffer */
-	  YY_BUFFER_STATE b = yy_current_buffer;
+	  YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
 
-	  int yy_c_buf_p_offset = (int) (yy_c_buf_p - b->yy_ch_buf);
+	  int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf);
 
 	  if (b->yy_is_our_buffer)
 	    {
@@ -1629,7 +1754,7 @@
 
 	      b->yy_ch_buf = (char *)
 		/* Include room in for 2 EOB chars. */
-		yy_flex_realloc ((void *) b->yy_ch_buf, b->yy_buf_size + 2);
+		yyrealloc ((void *) b->yy_ch_buf, b->yy_buf_size + 2);
 	    }
 	  else
 	    /* Can't grow it, we don't own it. */
@@ -1638,23 +1763,24 @@
 	  if (!b->yy_ch_buf)
 	    YY_FATAL_ERROR ("fatal error - scanner input buffer overflow");
 
-	  yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+	  (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+	  num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+	    number_to_move - 1;
 
-	  num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1;
-#endif
 	}
 
       if (num_to_read > YY_READ_BUF_SIZE)
 	num_to_read = YY_READ_BUF_SIZE;
 
       /* Read in more data. */
-      YY_INPUT ((&yy_current_buffer->yy_ch_buf[number_to_move]),
-		yy_n_chars, num_to_read);
+      YY_INPUT ((&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+		(yy_n_chars), (size_t) num_to_read);
 
-      yy_current_buffer->yy_n_chars = yy_n_chars;
+      YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
     }
 
-  if (yy_n_chars == 0)
+  if ((yy_n_chars) == 0)
     {
       if (number_to_move == YY_MORE_ADJ)
 	{
@@ -1665,45 +1791,58 @@
       else
 	{
 	  ret_val = EOB_ACT_LAST_MATCH;
-	  yy_current_buffer->yy_buffer_status = YY_BUFFER_EOF_PENDING;
+	  YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING;
 	}
     }
 
   else
     ret_val = EOB_ACT_CONTINUE_SCAN;
 
-  yy_n_chars += number_to_move;
-  yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
-  yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+  if ((yy_size_t) ((yy_n_chars) + number_to_move) >
+      YY_CURRENT_BUFFER_LVALUE->yy_buf_size)
+    {
+      /* Extend the array by 50%, plus the number we really need. */
+      yy_size_t new_size =
+	(yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+      YY_CURRENT_BUFFER_LVALUE->yy_ch_buf =
+	(char *) yyrealloc ((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,
+			    new_size);
+      if (!YY_CURRENT_BUFFER_LVALUE->yy_ch_buf)
+	YY_FATAL_ERROR ("out of dynamic memory in yy_get_next_buffer()");
+    }
+
+  (yy_n_chars) += number_to_move;
+  YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+  YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] =
+    YY_END_OF_BUFFER_CHAR;
 
-  yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+  (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
 
   return ret_val;
 }
 
-
 /* yy_get_previous_state - get the state just before the EOB char was reached */
 
 static yy_state_type
-yy_get_previous_state ()
+yy_get_previous_state (void)
 {
   register yy_state_type yy_current_state;
   register char *yy_cp;
 
-  yy_current_state = yy_start;
+  yy_current_state = (yy_start);
 
-  for (yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp)
+  for (yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp)
     {
       register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI (*yy_cp)] : 1);
       if (yy_accept[yy_current_state])
 	{
-	  yy_last_accepting_state = yy_current_state;
-	  yy_last_accepting_cpos = yy_cp;
+	  (yy_last_accepting_state) = yy_current_state;
+	  (yy_last_accepting_cpos) = yy_cp;
 	}
       while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state)
 	{
 	  yy_current_state = (int) yy_def[yy_current_state];
-	  if (yy_current_state >= 382)
+	  if (yy_current_state >= 390)
 	    yy_c = yy_meta[(unsigned int) yy_c];
 	}
       yy_current_state =
@@ -1713,117 +1852,101 @@
   return yy_current_state;
 }
 
-
 /* yy_try_NUL_trans - try to make a transition on the NUL character
  *
  * synopsis
  *	next_state = yy_try_NUL_trans( current_state );
  */
-
-#ifdef YY_USE_PROTOS
 static yy_state_type
 yy_try_NUL_trans (yy_state_type yy_current_state)
-#else
-static yy_state_type
-yy_try_NUL_trans (yy_current_state)
-     yy_state_type yy_current_state;
-#endif
 {
   register int yy_is_jam;
-  register char *yy_cp = yy_c_buf_p;
+  register char *yy_cp = (yy_c_buf_p);
 
   register YY_CHAR yy_c = 1;
   if (yy_accept[yy_current_state])
     {
-      yy_last_accepting_state = yy_current_state;
-      yy_last_accepting_cpos = yy_cp;
+      (yy_last_accepting_state) = yy_current_state;
+      (yy_last_accepting_cpos) = yy_cp;
     }
   while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state)
     {
       yy_current_state = (int) yy_def[yy_current_state];
-      if (yy_current_state >= 382)
+      if (yy_current_state >= 390)
 	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 == 381);
+  yy_is_jam = (yy_current_state == 389);
 
   return yy_is_jam ? 0 : yy_current_state;
 }
 
-
-#ifndef YY_NO_UNPUT
-#ifdef YY_USE_PROTOS
 static void
 yyunput (int c, register char *yy_bp)
-#else
-static void
-yyunput (c, yy_bp)
-     int c;
-     register char *yy_bp;
-#endif
 {
-  register char *yy_cp = yy_c_buf_p;
+  register char *yy_cp;
+
+  yy_cp = (yy_c_buf_p);
 
   /* undo effects of setting up yytext */
-  *yy_cp = yy_hold_char;
+  *yy_cp = (yy_hold_char);
 
-  if (yy_cp < yy_current_buffer->yy_ch_buf + 2)
+  if (yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2)
     {				/* need to shift things up to make room */
       /* +2 for EOB chars. */
-      register int number_to_move = yy_n_chars + 2;
+      register int number_to_move = (yy_n_chars) + 2;
       register char *dest =
-	&yy_current_buffer->yy_ch_buf[yy_current_buffer->yy_buf_size + 2];
-      register char *source = &yy_current_buffer->yy_ch_buf[number_to_move];
+	&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_CURRENT_BUFFER_LVALUE->
+					     yy_buf_size + 2];
+      register char *source =
+	&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
 
-      while (source > yy_current_buffer->yy_ch_buf)
+      while (source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf)
 	*--dest = *--source;
 
       yy_cp += (int) (dest - source);
       yy_bp += (int) (dest - source);
-      yy_current_buffer->yy_n_chars =
-	yy_n_chars = yy_current_buffer->yy_buf_size;
+      YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
 
-      if (yy_cp < yy_current_buffer->yy_ch_buf + 2)
+      if (yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2)
 	YY_FATAL_ERROR ("flex scanner push-back overflow");
     }
 
   *--yy_cp = (char) c;
 
-
-  yytext_ptr = yy_bp;
-  yy_hold_char = *yy_cp;
-  yy_c_buf_p = yy_cp;
+  (yytext_ptr) = yy_bp;
+  (yy_hold_char) = *yy_cp;
+  (yy_c_buf_p) = yy_cp;
 }
-#endif /* ifndef YY_NO_UNPUT */
-
 
 #ifndef YY_NO_INPUT
 #ifdef __cplusplus
 static int
-yyinput ()
+yyinput (void)
 #else
 static int
-input ()
+input (void)
 #endif
 {
   int c;
 
-  *yy_c_buf_p = yy_hold_char;
+  *(yy_c_buf_p) = (yy_hold_char);
 
-  if (*yy_c_buf_p == YY_END_OF_BUFFER_CHAR)
+  if (*(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR)
     {
       /* yy_c_buf_p now points to the character we want to return.
        * If this occurs *before* the EOB characters, then it's a
        * valid NUL; if not, then we've hit the end of the buffer.
        */
-      if (yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars])
+      if ((yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)])
 	/* This was really a NUL. */
-	*yy_c_buf_p = '\0';
+	*(yy_c_buf_p) = '\0';
 
       else
 	{			/* need more input */
-	  int offset = yy_c_buf_p - yytext_ptr;
-	  ++yy_c_buf_p;
+	  int offset = (yy_c_buf_p) - (yytext_ptr);
+	  ++(yy_c_buf_p);
 
 	  switch (yy_get_next_buffer ())
 	    {
@@ -1841,14 +1964,12 @@
 	      /* Reset buffer status. */
 	      yyrestart (yyin);
 
-	      /* fall through */
-
-	    case EOB_ACT_END_OF_FILE:
+	     /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE:
 	      {
 		if (yywrap ())
 		  return EOF;
 
-		if (!yy_did_buffer_switch_on_eof)
+		if (!(yy_did_buffer_switch_on_eof))
 		  YY_NEW_FILE;
 #ifdef __cplusplus
 		return yyinput ();
@@ -1858,59 +1979,65 @@
 	      }
 
 	    case EOB_ACT_CONTINUE_SCAN:
-	      yy_c_buf_p = yytext_ptr + offset;
+	      (yy_c_buf_p) = (yytext_ptr) + offset;
 	      break;
 	    }
 	}
     }
 
-  c = *(unsigned char *) yy_c_buf_p;	/* cast for 8-bit char's */
-  *yy_c_buf_p = '\0';		/* preserve yytext */
-  yy_hold_char = *++yy_c_buf_p;
-
+  c = *(unsigned char *) (yy_c_buf_p);	/* cast for 8-bit char's */
+  *(yy_c_buf_p) = '\0';		/* preserve yytext */
+  (yy_hold_char) = *++(yy_c_buf_p);
 
   return c;
 }
-#endif /* YY_NO_INPUT */
+#endif /* ifndef YY_NO_INPUT */
 
-#ifdef YY_USE_PROTOS
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * 
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
 void
 yyrestart (FILE * input_file)
-#else
-void
-yyrestart (input_file)
-     FILE *input_file;
-#endif
 {
-  if (!yy_current_buffer)
-    yy_current_buffer = yy_create_buffer (yyin, YY_BUF_SIZE);
 
-  yy_init_buffer (yy_current_buffer, input_file);
+  if (!YY_CURRENT_BUFFER)
+    {
+      yyensure_buffer_stack ();
+      YY_CURRENT_BUFFER_LVALUE = yy_create_buffer (yyin, YY_BUF_SIZE);
+    }
+
+  yy_init_buffer (YY_CURRENT_BUFFER, input_file);
   yy_load_buffer_state ();
 }
 
-
-#ifdef YY_USE_PROTOS
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * 
+ */
 void
 yy_switch_to_buffer (YY_BUFFER_STATE new_buffer)
-#else
-void
-yy_switch_to_buffer (new_buffer)
-     YY_BUFFER_STATE new_buffer;
-#endif
 {
-  if (yy_current_buffer == new_buffer)
+
+  /* TODO. We should be able to replace this entire function body
+   * with
+   *              yypop_buffer_state();
+   *              yypush_buffer_state(new_buffer);
+   */
+  yyensure_buffer_stack ();
+  if (YY_CURRENT_BUFFER == new_buffer)
     return;
 
-  if (yy_current_buffer)
+  if (YY_CURRENT_BUFFER)
     {
       /* Flush out information for old buffer. */
-      *yy_c_buf_p = yy_hold_char;
-      yy_current_buffer->yy_buf_pos = yy_c_buf_p;
-      yy_current_buffer->yy_n_chars = yy_n_chars;
+      *(yy_c_buf_p) = (yy_hold_char);
+      YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+      YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
     }
 
-  yy_current_buffer = new_buffer;
+  YY_CURRENT_BUFFER_LVALUE = new_buffer;
   yy_load_buffer_state ();
 
   /* We don't actually know whether we did this switch during
@@ -1918,38 +2045,30 @@
    * is looked at is after yywrap() is called, so it's safe
    * to go ahead and always set it.
    */
-  yy_did_buffer_switch_on_eof = 1;
+  (yy_did_buffer_switch_on_eof) = 1;
 }
 
-
-#ifdef YY_USE_PROTOS
-void
+static void
 yy_load_buffer_state (void)
-#else
-void
-yy_load_buffer_state ()
-#endif
 {
-  yy_n_chars = yy_current_buffer->yy_n_chars;
-  yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
-  yyin = yy_current_buffer->yy_input_file;
-  yy_hold_char = *yy_c_buf_p;
+  (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+  (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+  yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+  (yy_hold_char) = *(yy_c_buf_p);
 }
 
-
-#ifdef YY_USE_PROTOS
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * 
+ * @return the allocated buffer state.
+ */
 YY_BUFFER_STATE
 yy_create_buffer (FILE * file, int size)
-#else
-YY_BUFFER_STATE
-yy_create_buffer (file, size)
-     FILE *file;
-     int size;
-#endif
 {
   YY_BUFFER_STATE b;
 
-  b = (YY_BUFFER_STATE) yy_flex_alloc (sizeof (struct yy_buffer_state));
+  b = (YY_BUFFER_STATE) yyalloc (sizeof (struct yy_buffer_state));
   if (!b)
     YY_FATAL_ERROR ("out of dynamic memory in yy_create_buffer()");
 
@@ -1958,7 +2077,7 @@
   /* yy_ch_buf has to be 2 characters longer than the size given because
    * we need to put in 2 end-of-buffer characters.
    */
-  b->yy_ch_buf = (char *) yy_flex_alloc (b->yy_buf_size + 2);
+  b->yy_ch_buf = (char *) yyalloc (b->yy_buf_size + 2);
   if (!b->yy_ch_buf)
     YY_FATAL_ERROR ("out of dynamic memory in yy_create_buffer()");
 
@@ -1969,68 +2088,65 @@
   return b;
 }
 
-
-#ifdef YY_USE_PROTOS
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ * 
+ */
 void
 yy_delete_buffer (YY_BUFFER_STATE b)
-#else
-void
-yy_delete_buffer (b)
-     YY_BUFFER_STATE b;
-#endif
 {
+
   if (!b)
     return;
 
-  if (b == yy_current_buffer)
-    yy_current_buffer = (YY_BUFFER_STATE) 0;
+  if (b == YY_CURRENT_BUFFER)	/* Not sure if we should pop here. */
+    YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
 
   if (b->yy_is_our_buffer)
-    yy_flex_free ((void *) b->yy_ch_buf);
+    yyfree ((void *) b->yy_ch_buf);
 
-  yy_flex_free ((void *) b);
+  yyfree ((void *) b);
 }
 
+#ifndef __cplusplus
+extern int isatty (int);
+#endif /* __cplusplus */
 
-
-#ifdef YY_USE_PROTOS
-void
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+static void
 yy_init_buffer (YY_BUFFER_STATE b, FILE * file)
-#else
-void
-yy_init_buffer (b, file)
-     YY_BUFFER_STATE b;
-     FILE *file;
-#endif
-
-
 {
+  int oerrno = errno;
+
   yy_flush_buffer (b);
 
   b->yy_input_file = file;
   b->yy_fill_buffer = 1;
 
-#if YY_ALWAYS_INTERACTIVE
-  b->yy_is_interactive = 1;
-#else
-#if YY_NEVER_INTERACTIVE
-  b->yy_is_interactive = 0;
-#else
+  /* If b is the current buffer, then yy_init_buffer was _probably_
+   * called from yyrestart() or through yy_get_next_buffer.
+   * In that case, we don't want to reset the lineno or column.
+   */
+  if (b != YY_CURRENT_BUFFER)
+    {
+      b->yy_bs_lineno = 1;
+      b->yy_bs_column = 0;
+    }
+
   b->yy_is_interactive = file ? (isatty (fileno (file)) > 0) : 0;
-#endif
-#endif
-}
 
+  errno = oerrno;
+}
 
-#ifdef YY_USE_PROTOS
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * 
+ */
 void
 yy_flush_buffer (YY_BUFFER_STATE b)
-#else
-void
-yy_flush_buffer (b)
-     YY_BUFFER_STATE b;
-#endif
-
 {
   if (!b)
     return;
@@ -2049,21 +2165,121 @@
   b->yy_at_bol = 1;
   b->yy_buffer_status = YY_BUFFER_NEW;
 
-  if (b == yy_current_buffer)
+  if (b == YY_CURRENT_BUFFER)
     yy_load_buffer_state ();
 }
 
+/** Pushes the new state onto the stack. The new state becomes
+ *  the current state. This function will allocate the stack
+ *  if necessary.
+ *  @param new_buffer The new state.
+ *  
+ */
+void
+yypush_buffer_state (YY_BUFFER_STATE new_buffer)
+{
+  if (new_buffer == NULL)
+    return;
+
+  yyensure_buffer_stack ();
+
+  /* This block is copied from yy_switch_to_buffer. */
+  if (YY_CURRENT_BUFFER)
+    {
+      /* Flush out information for old buffer. */
+      *(yy_c_buf_p) = (yy_hold_char);
+      YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+      YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+    }
+
+  /* Only push if top exists. Otherwise, replace top. */
+  if (YY_CURRENT_BUFFER)
+    (yy_buffer_stack_top)++;
+  YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+  /* copied from yy_switch_to_buffer. */
+  yy_load_buffer_state ();
+  (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ *  The next element becomes the new top.
+ *  
+ */
+void
+yypop_buffer_state (void)
+{
+  if (!YY_CURRENT_BUFFER)
+    return;
+
+  yy_delete_buffer (YY_CURRENT_BUFFER);
+  YY_CURRENT_BUFFER_LVALUE = NULL;
+  if ((yy_buffer_stack_top) > 0)
+    --(yy_buffer_stack_top);
+
+  if (YY_CURRENT_BUFFER)
+    {
+      yy_load_buffer_state ();
+      (yy_did_buffer_switch_on_eof) = 1;
+    }
+}
+
+/* Allocates the stack if it does not exist.
+ *  Guarantees space for at least one push.
+ */
+static void
+yyensure_buffer_stack (void)
+{
+  int num_to_alloc;
+
+  if (!(yy_buffer_stack))
+    {
+
+      /* First allocation is just for 2 elements, since we don't know if this
+       * scanner will even need a stack. We use 2 instead of 1 to avoid an
+       * immediate realloc on the next call.
+       */
+      num_to_alloc = 1;
+      (yy_buffer_stack) = (struct yy_buffer_state **) yyalloc
+	(num_to_alloc * sizeof (struct yy_buffer_state *));
+      if (!(yy_buffer_stack))
+	YY_FATAL_ERROR ("out of dynamic memory in yyensure_buffer_stack()");
+
+      memset ((yy_buffer_stack), 0,
+	      num_to_alloc * sizeof (struct yy_buffer_state *));
+
+      (yy_buffer_stack_max) = num_to_alloc;
+      (yy_buffer_stack_top) = 0;
+      return;
+    }
+
+  if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1)
+    {
+
+      /* Increase the buffer to prepare for a possible push. */
+      int grow_size = 8 /* arbitrary grow size */ ;
+
+      num_to_alloc = (yy_buffer_stack_max) + grow_size;
+      (yy_buffer_stack) = (struct yy_buffer_state **) yyrealloc
+	((yy_buffer_stack), num_to_alloc * sizeof (struct yy_buffer_state *));
+      if (!(yy_buffer_stack))
+	YY_FATAL_ERROR ("out of dynamic memory in yyensure_buffer_stack()");
+
+      /* zero only the new slots. */
+      memset ((yy_buffer_stack) + (yy_buffer_stack_max), 0,
+	      grow_size * sizeof (struct yy_buffer_state *));
+      (yy_buffer_stack_max) = num_to_alloc;
+    }
+}
 
-#ifndef YY_NO_SCAN_BUFFER
-#ifdef YY_USE_PROTOS
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * 
+ * @return the newly allocated buffer state object. 
+ */
 YY_BUFFER_STATE
 yy_scan_buffer (char *base, yy_size_t size)
-#else
-YY_BUFFER_STATE
-yy_scan_buffer (base, size)
-     char *base;
-     yy_size_t size;
-#endif
 {
   YY_BUFFER_STATE b;
 
@@ -2073,7 +2289,7 @@
     /* They forgot to leave room for the EOB's. */
     return 0;
 
-  b = (YY_BUFFER_STATE) yy_flex_alloc (sizeof (struct yy_buffer_state));
+  b = (YY_BUFFER_STATE) yyalloc (sizeof (struct yy_buffer_state));
   if (!b)
     YY_FATAL_ERROR ("out of dynamic memory in yy_scan_buffer()");
 
@@ -2091,38 +2307,31 @@
 
   return b;
 }
-#endif
 
-
-#ifndef YY_NO_SCAN_STRING
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE
-yy_scan_string (yyconst char *yy_str)
-#else
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ * 
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ *       yy_scan_bytes() instead.
+ */
 YY_BUFFER_STATE
-yy_scan_string (yy_str)
-     yyconst char *yy_str;
-#endif
+yy_scan_string (yyconst char *yystr)
 {
-  int len;
-  for (len = 0; yy_str[len]; ++len)
-    ;
 
-  return yy_scan_bytes (yy_str, len);
+  return yy_scan_bytes (yystr, strlen (yystr));
 }
-#endif
-
 
-#ifndef YY_NO_SCAN_BYTES
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE
-yy_scan_bytes (yyconst char *bytes, int len)
-#else
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * 
+ * @return the newly allocated buffer state object.
+ */
 YY_BUFFER_STATE
-yy_scan_bytes (bytes, len)
-     yyconst char *bytes;
-     int len;
-#endif
+yy_scan_bytes (yyconst char *yybytes, int _yybytes_len)
 {
   YY_BUFFER_STATE b;
   char *buf;
@@ -2130,15 +2339,15 @@
   int i;
 
   /* Get memory for full buffer, including space for trailing EOB's. */
-  n = len + 2;
-  buf = (char *) yy_flex_alloc (n);
+  n = _yybytes_len + 2;
+  buf = (char *) yyalloc (n);
   if (!buf)
     YY_FATAL_ERROR ("out of dynamic memory in yy_scan_bytes()");
 
-  for (i = 0; i < len; ++i)
-    buf[i] = bytes[i];
+  for (i = 0; i < _yybytes_len; ++i)
+    buf[i] = yybytes[i];
 
-  buf[len] = buf[len + 1] = YY_END_OF_BUFFER_CHAR;
+  buf[_yybytes_len] = buf[_yybytes_len + 1] = YY_END_OF_BUFFER_CHAR;
 
   b = yy_scan_buffer (buf, n);
   if (!b)
@@ -2151,112 +2360,185 @@
 
   return b;
 }
-#endif
 
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
 
-#ifndef YY_NO_PUSH_STATE
-#ifdef YY_USE_PROTOS
 static void
-yy_push_state (int new_state)
-#else
-static void
-yy_push_state (new_state)
-     int new_state;
-#endif
+yy_fatal_error (yyconst char *msg)
 {
-  if (yy_start_stack_ptr >= yy_start_stack_depth)
-    {
-      yy_size_t new_size;
+  (void) fprintf (stderr, "%s\n", msg);
+  exit (YY_EXIT_FAILURE);
+}
 
-      yy_start_stack_depth += YY_START_STACK_INCR;
-      new_size = yy_start_stack_depth * sizeof (int);
+/* Redefine yyless() so it works in section 3 code. */
 
-      if (!yy_start_stack)
-	yy_start_stack = (int *) yy_flex_alloc (new_size);
+#undef yyless
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		yytext[yyleng] = (yy_hold_char); \
+		(yy_c_buf_p) = yytext + yyless_macro_arg; \
+		(yy_hold_char) = *(yy_c_buf_p); \
+		*(yy_c_buf_p) = '\0'; \
+		yyleng = yyless_macro_arg; \
+		} \
+	while ( 0 )
 
-      else
-	yy_start_stack = (int *) yy_flex_realloc ((void *) yy_start_stack,
-						  new_size);
+/* Accessor  methods (get/set functions) to struct members. */
 
-      if (!yy_start_stack)
-	YY_FATAL_ERROR ("out of memory expanding start-condition stack");
-    }
+/** Get the current line number.
+ * 
+ */
+int
+yyget_lineno (void)
+{
 
-  yy_start_stack[yy_start_stack_ptr++] = YY_START;
+  return yylineno;
+}
 
-  BEGIN (new_state);
+/** Get the input stream.
+ * 
+ */
+FILE *
+yyget_in (void)
+{
+  return yyin;
 }
-#endif
 
+/** Get the output stream.
+ * 
+ */
+FILE *
+yyget_out (void)
+{
+  return yyout;
+}
 
-#ifndef YY_NO_POP_STATE
-static void
-yy_pop_state ()
+/** Get the length of the current token.
+ * 
+ */
+int
+yyget_leng (void)
 {
-  if (--yy_start_stack_ptr < 0)
-    YY_FATAL_ERROR ("start-condition stack underflow");
+  return yyleng;
+}
+
+/** Get the current token.
+ * 
+ */
 
-  BEGIN (yy_start_stack[yy_start_stack_ptr]);
+char *
+yyget_text (void)
+{
+  return yytext;
 }
-#endif
 
+/** Set the current line number.
+ * @param line_number
+ * 
+ */
+void
+yyset_lineno (int line_number)
+{
+
+  yylineno = line_number;
+}
 
-#ifndef YY_NO_TOP_STATE
-static int
-yy_top_state ()
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ * 
+ * @see yy_switch_to_buffer
+ */
+void
+yyset_in (FILE * in_str)
 {
-  return yy_start_stack[yy_start_stack_ptr - 1];
+  yyin = in_str;
 }
-#endif
 
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
+void
+yyset_out (FILE * out_str)
+{
+  yyout = out_str;
+}
 
-#ifdef YY_USE_PROTOS
-static void
-yy_fatal_error (yyconst char msg[])
-#else
-static void
-yy_fatal_error (msg)
-     char msg[];
-#endif
+int
+yyget_debug (void)
 {
-  (void) fprintf (stderr, "%s\n", msg);
-  exit (YY_EXIT_FAILURE);
+  return yy_flex_debug;
 }
 
+void
+yyset_debug (int bdebug)
+{
+  yy_flex_debug = bdebug;
+}
 
+static int
+yy_init_globals (void)
+{
+  /* Initialization is the same as for the non-reentrant scanner.
+   * This function is called from yylex_destroy(), so don't allocate here.
+   */
 
-/* Redefine yyless() so it works in section 3 code. */
+  (yy_buffer_stack) = 0;
+  (yy_buffer_stack_top) = 0;
+  (yy_buffer_stack_max) = 0;
+  (yy_c_buf_p) = (char *) 0;
+  (yy_init) = 0;
+  (yy_start) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+  yyin = stdin;
+  yyout = stdout;
+#else
+  yyin = (FILE *) 0;
+  yyout = (FILE *) 0;
+#endif
 
-#undef yyless
-#define yyless(n) \
-	do \
-		{ \
-		/* Undo effects of setting up yytext. */ \
-		yytext[yyleng] = yy_hold_char; \
-		yy_c_buf_p = yytext + n; \
-		yy_hold_char = *yy_c_buf_p; \
-		*yy_c_buf_p = '\0'; \
-		yyleng = n; \
-		} \
-	while ( 0 )
+  /* For future reference: Set errno on error, since we are called by
+   * yylex_init()
+   */
+  return 0;
+}
 
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int
+yylex_destroy (void)
+{
+
+  /* Pop the buffer stack, destroying each element. */
+  while (YY_CURRENT_BUFFER)
+    {
+      yy_delete_buffer (YY_CURRENT_BUFFER);
+      YY_CURRENT_BUFFER_LVALUE = NULL;
+      yypop_buffer_state ();
+    }
+
+  /* Destroy the stack itself. */
+  yyfree ((yy_buffer_stack));
+  (yy_buffer_stack) = NULL;
+
+  /* Reset the globals. This is important in a non-reentrant scanner so the next time
+   * yylex() is called, initialization will occur. */
+  yy_init_globals ();
+
+  return 0;
+}
 
-/* Internal utility routines. */
+/*
+ * Internal utility routines.
+ */
 
 #ifndef yytext_ptr
-#ifdef YY_USE_PROTOS
 static void
 yy_flex_strncpy (char *s1, yyconst char *s2, int n)
-#else
-static void
-yy_flex_strncpy (s1, s2, n)
-     char *s1;
-     yyconst char *s2;
-     int n;
-#endif
 {
   register int i;
   for (i = 0; i < n; ++i)
@@ -2265,14 +2547,8 @@
 #endif
 
 #ifdef YY_NEED_STRLEN
-#ifdef YY_USE_PROTOS
 static int
 yy_flex_strlen (yyconst char *s)
-#else
-static int
-yy_flex_strlen (s)
-     yyconst char *s;
-#endif
 {
   register int n;
   for (n = 0; s[n]; ++n)
@@ -2282,28 +2558,14 @@
 }
 #endif
 
-
-#ifdef YY_USE_PROTOS
-static void *
-yy_flex_alloc (yy_size_t size)
-#else
-static void *
-yy_flex_alloc (size)
-     yy_size_t size;
-#endif
+void *
+yyalloc (yy_size_t size)
 {
   return (void *) malloc (size);
 }
 
-#ifdef YY_USE_PROTOS
-static void *
-yy_flex_realloc (void *ptr, yy_size_t size)
-#else
-static void *
-yy_flex_realloc (ptr, size)
-     void *ptr;
-     yy_size_t size;
-#endif
+void *
+yyrealloc (void *ptr, yy_size_t size)
 {
   /* The cast to (char *) in the following accommodates both
    * implementations that use char* generic pointers, and those
@@ -2315,24 +2577,12 @@
   return (void *) realloc ((char *) ptr, size);
 }
 
-#ifdef YY_USE_PROTOS
-static void
-yy_flex_free (void *ptr)
-#else
-static void
-yy_flex_free (ptr)
-     void *ptr;
-#endif
+void
+yyfree (void *ptr)
 {
-  free (ptr);
+  free ((char *) ptr);		/* see yyrealloc() for (char *) cast */
 }
 
-#if YY_MAIN
-int
-main ()
-{
-  yylex ();
-  return 0;
-}
-#endif
-#line 324 "albumtheme.l"
+#define YYTABLES_NAME "yytables"
+
+#line 334 "albumtheme.l"



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]