Browse Source

make X file reader more forgiving

David Rose 20 years ago
parent
commit
3dd4264c8c

+ 4 - 3
pandatool/src/xfile/xFileNode.cxx

@@ -24,6 +24,7 @@
 #include "xFile.h"
 #include "xFile.h"
 #include "xFileDataNodeTemplate.h"
 #include "xFileDataNodeTemplate.h"
 #include "filename.h"
 #include "filename.h"
+#include "string_utils.h"
 
 
 TypeHandle XFileNode::_type_handle;
 TypeHandle XFileNode::_type_handle;
 
 
@@ -58,7 +59,7 @@ XFileNode::
 XFileNode *XFileNode::
 XFileNode *XFileNode::
 find_child(const string &name) const {
 find_child(const string &name) const {
   ChildrenByName::const_iterator ni;
   ChildrenByName::const_iterator ni;
-  ni = _children_by_name.find(name);
+  ni = _children_by_name.find(downcase(name));
   if (ni != _children_by_name.end()) {
   if (ni != _children_by_name.end()) {
     return get_child((*ni).second);
     return get_child((*ni).second);
   }
   }
@@ -75,7 +76,7 @@ find_child(const string &name) const {
 int XFileNode::
 int XFileNode::
 find_child_index(const string &name) const {
 find_child_index(const string &name) const {
   ChildrenByName::const_iterator ni;
   ChildrenByName::const_iterator ni;
-  ni = _children_by_name.find(name);
+  ni = _children_by_name.find(downcase(name));
   if (ni != _children_by_name.end()) {
   if (ni != _children_by_name.end()) {
     return (*ni).second;
     return (*ni).second;
   }
   }
@@ -227,7 +228,7 @@ is_standard_object(const string &template_name) const {
 void XFileNode::
 void XFileNode::
 add_child(XFileNode *node) {
 add_child(XFileNode *node) {
   if (node->has_name()) {
   if (node->has_name()) {
-    _children_by_name[node->get_name()] = (int)_children.size();
+    _children_by_name[downcase(node->get_name())] = (int)_children.size();
   }
   }
   if (node->has_guid()) {
   if (node->has_guid()) {
     _x_file->_nodes_by_guid[node->get_guid()] = node;
     _x_file->_nodes_by_guid[node->get_guid()] = node;

+ 172 - 173
pandatool/src/xfile/xParser.cxx.prebuilt

@@ -90,7 +90,7 @@ x_cleanup_parser() {
 
 
 
 
 
 
-#define	YYFINAL		96
+#define	YYFINAL		97
 #define	YYFLAG		-32768
 #define	YYFLAG		-32768
 #define	YYNTBASE	34
 #define	YYNTBASE	34
 
 
@@ -131,33 +131,34 @@ static const char yytranslate[] =
 #if YYDEBUG
 #if YYDEBUG
 static const short yyprhs[] =
 static const short yyprhs[] =
 {
 {
-       0,     0,     2,     5,     8,     9,    17,    22,    24,    26,
-      28,    30,    32,    34,    37,    39,    41,    43,    47,    52,
-      56,    58,    60,    62,    64,    66,    68,    70,    72,    74,
-      76,    78,    81,    84,    86,    89,    93,    95,    97,    99,
-     102,   104,   107,   109,   111,   113,   115,   117,   119,   123,
-     124,   132,   134,   137,   141,   143,   145,   147,   150,   152,
-     154,   156,   158,   160,   162,   164,   167
+       0,     0,     2,     5,     8,    11,    12,    20,    25,    27,
+      29,    31,    33,    35,    37,    40,    42,    44,    46,    50,
+      55,    59,    61,    63,    65,    67,    69,    71,    73,    75,
+      77,    79,    81,    84,    87,    89,    92,    96,    98,   100,
+     102,   105,   107,   110,   112,   114,   116,   118,   120,   122,
+     126,   127,   135,   137,   140,   144,   146,   148,   150,   153,
+     155,   157,   159,   161,   163,   165,   167,   170
 };
 };
 static const short yyrhs[] =
 static const short yyrhs[] =
 {
 {
-      66,     0,    34,    35,     0,    34,    57,     0,     0,    20,
-      52,     9,    54,    36,    37,    10,     0,    38,    13,    39,
-      14,     0,    40,     0,    66,     0,    40,     0,    56,     0,
-      50,     0,    41,     0,    40,    41,     0,    42,     0,    43,
-       0,    44,     0,    45,    53,    19,     0,    33,    46,    47,
-      19,     0,    52,    53,    19,     0,    21,     0,    22,     0,
-      23,     0,    24,     0,    25,     0,    26,     0,    27,     0,
-      28,     0,    30,     0,    31,     0,    32,     0,    45,    52,
-       0,    52,    52,     0,    48,     0,    47,    48,     0,    13,
-      49,    14,     0,     5,     0,    52,     0,    51,     0,    50,
-      51,     0,    52,     0,    52,    54,     0,     3,     0,    66,
-       0,    52,     0,     6,     0,    66,     0,    54,     0,    17,
-      17,    17,     0,     0,    52,    53,     9,    58,    55,    59,
-      10,     0,    66,     0,    59,    60,     0,     9,    65,    10,
-       0,    57,     0,    61,     0,    62,     0,    63,    64,     0,
-      64,     0,     7,     0,     8,     0,     4,     0,    19,     0,
-      18,     0,    52,     0,    52,    54,     0,     0
+      66,     0,    34,    35,     0,    34,    57,     0,    34,    10,
+       0,     0,    20,    52,     9,    54,    36,    37,    10,     0,
+      38,    13,    39,    14,     0,    40,     0,    66,     0,    40,
+       0,    56,     0,    50,     0,    41,     0,    40,    41,     0,
+      42,     0,    43,     0,    44,     0,    45,    53,    19,     0,
+      33,    46,    47,    19,     0,    52,    53,    19,     0,    21,
+       0,    22,     0,    23,     0,    24,     0,    25,     0,    26,
+       0,    27,     0,    28,     0,    30,     0,    31,     0,    32,
+       0,    45,    52,     0,    52,    52,     0,    48,     0,    47,
+      48,     0,    13,    49,    14,     0,     5,     0,    52,     0,
+      51,     0,    50,    51,     0,    52,     0,    52,    54,     0,
+       3,     0,    66,     0,    52,     0,     6,     0,    66,     0,
+      54,     0,    17,    17,    17,     0,     0,    52,    53,     9,
+      58,    55,    59,    10,     0,    66,     0,    59,    60,     0,
+       9,    65,    10,     0,    57,     0,    61,     0,    62,     0,
+      63,    64,     0,    64,     0,     7,     0,     8,     0,     4,
+       0,    19,     0,    18,     0,    52,     0,    52,    54,     0,
+       0
 };
 };
 
 
 #endif
 #endif
@@ -166,13 +167,13 @@ static const short yyrhs[] =
 /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
 /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
 static const short yyrline[] =
 static const short yyrline[] =
 {
 {
-       0,   106,   108,   109,   112,   112,   127,   129,   132,   134,
-     137,   142,   145,   147,   150,   152,   153,   156,   164,   168,
-     181,   186,   190,   194,   198,   202,   206,   210,   214,   218,
-     222,   228,   234,   246,   248,   251,   255,   260,   271,   275,
-     280,   290,   305,   309,   314,   317,   321,   326,   329,   333,
-     333,   359,   361,   364,   370,   374,   380,   386,   392,   397,
-     401,   405,   409,   411,   414,   424,   440
+       0,   106,   108,   109,   110,   113,   113,   128,   130,   133,
+     135,   138,   143,   146,   148,   151,   153,   154,   157,   165,
+     169,   182,   187,   191,   195,   199,   203,   207,   211,   215,
+     219,   223,   229,   235,   247,   249,   252,   256,   261,   272,
+     276,   281,   291,   306,   310,   315,   318,   322,   327,   330,
+     334,   334,   360,   362,   365,   371,   375,   381,   387,   393,
+     398,   402,   406,   410,   412,   415,   425,   441
 };
 };
 #endif
 #endif
 
 
@@ -205,25 +206,25 @@ static const char *const yytname[] =
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
 static const short yyr1[] =
 static const short yyr1[] =
 {
 {
-       0,    34,    34,    34,    36,    35,    37,    37,    38,    38,
-      39,    39,    40,    40,    41,    41,    41,    42,    43,    44,
-      45,    45,    45,    45,    45,    45,    45,    45,    45,    45,
-      45,    46,    46,    47,    47,    48,    49,    49,    50,    50,
-      51,    51,    52,    53,    53,    54,    55,    55,    56,    58,
-      57,    59,    59,    60,    60,    60,    60,    60,    60,    61,
-      62,    63,    64,    64,    65,    65,    66
+       0,    34,    34,    34,    34,    36,    35,    37,    37,    38,
+      38,    39,    39,    40,    40,    41,    41,    41,    42,    43,
+      44,    45,    45,    45,    45,    45,    45,    45,    45,    45,
+      45,    45,    46,    46,    47,    47,    48,    49,    49,    50,
+      50,    51,    51,    52,    53,    53,    54,    55,    55,    56,
+      58,    57,    59,    59,    60,    60,    60,    60,    60,    60,
+      61,    62,    63,    64,    64,    65,    65,    66
 };
 };
 
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
 static const short yyr2[] =
 static const short yyr2[] =
 {
 {
-       0,     1,     2,     2,     0,     7,     4,     1,     1,     1,
-       1,     1,     1,     2,     1,     1,     1,     3,     4,     3,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     2,     2,     1,     2,     3,     1,     1,     1,     2,
-       1,     2,     1,     1,     1,     1,     1,     1,     3,     0,
-       7,     1,     2,     3,     1,     1,     1,     2,     1,     1,
-       1,     1,     1,     1,     1,     2,     0
+       0,     1,     2,     2,     2,     0,     7,     4,     1,     1,
+       1,     1,     1,     1,     2,     1,     1,     1,     3,     4,
+       3,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     2,     2,     1,     2,     3,     1,     1,     1,
+       2,     1,     2,     1,     1,     1,     1,     1,     1,     3,
+       0,     7,     1,     2,     3,     1,     1,     1,     2,     1,
+       1,     1,     1,     1,     1,     1,     2,     0
 };
 };
 
 
 /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
 /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
@@ -231,84 +232,82 @@ static const short yyr2[] =
    error. */
    error. */
 static const short yydefact[] =
 static const short yydefact[] =
 {
 {
-      66,     0,     1,    42,     0,     2,    66,     3,     0,    44,
-       0,    43,     0,    49,    45,     4,    66,    66,    47,    66,
-      46,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,     0,     0,     0,     7,    12,    14,    15,    16,
-      66,    66,     8,     0,    51,     0,     0,     0,     5,     0,
-      13,     0,     0,    61,    59,    60,     0,    50,    63,    62,
-      54,    52,    55,    56,     0,    58,    31,     0,     0,    33,
-      32,     0,     0,    11,    38,    40,    10,    17,    19,    64,
-       0,    57,    36,     0,    37,    18,    34,     0,     6,    39,
-      41,    65,    53,    35,    48,     0,     0
+      67,     0,     1,    43,     4,     0,     2,    67,     3,     0,
+      45,     0,    44,     0,    50,    46,     5,    67,    67,    48,
+      67,    47,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,     0,     0,     0,     8,    13,    15,    16,
+      17,    67,    67,     9,     0,    52,     0,     0,     0,     6,
+       0,    14,     0,     0,    62,    60,    61,     0,    51,    64,
+      63,    55,    53,    56,    57,     0,    59,    32,     0,     0,
+      34,    33,     0,     0,    12,    39,    41,    11,    18,    20,
+      65,     0,    58,    37,     0,    38,    19,    35,     0,     7,
+      40,    42,    66,    54,    36,    49,     0,     0
 };
 };
 
 
 static const short yydefgoto[] =
 static const short yydefgoto[] =
 {
 {
-       1,     5,    17,    33,    34,    72,    35,    36,    37,    38,
-      39,    40,    46,    68,    69,    83,    73,    74,     9,    10,
-      15,    19,    76,     7,    16,    43,    61,    62,    63,    64,
-      65,    80,    11
+       1,     6,    18,    34,    35,    73,    36,    37,    38,    39,
+      40,    41,    47,    69,    70,    84,    74,    75,    10,    11,
+      16,    20,    77,     8,    17,    44,    62,    63,    64,    65,
+      66,    81,    12
 };
 };
 
 
 static const short yypact[] =
 static const short yypact[] =
 {
 {
-  -32768,     2,-32768,-32768,    12,-32768,    12,-32768,     8,-32768,
-       9,-32768,    13,-32768,-32768,-32768,    13,    67,-32768,-32768,
+  -32768,     2,-32768,-32768,-32768,     5,-32768,     5,-32768,     9,
+  -32768,    17,-32768,    30,-32768,-32768,-32768,    30,    68,-32768,
   -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
   -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
-  -32768,-32768,    80,    15,    14,    54,-32768,-32768,-32768,-32768,
-      12,    12,-32768,   110,-32768,    12,    16,    12,-32768,     7,
-  -32768,    11,    17,-32768,-32768,-32768,    12,-32768,-32768,-32768,
-  -32768,-32768,-32768,-32768,   -11,-32768,-32768,     6,    -7,-32768,
-  -32768,    18,    19,    12,-32768,    13,-32768,-32768,-32768,    13,
-      22,-32768,-32768,    23,-32768,-32768,-32768,    21,-32768,-32768,
-  -32768,-32768,-32768,-32768,-32768,    26,-32768
+  -32768,-32768,-32768,    81,     1,    25,    55,-32768,-32768,-32768,
+  -32768,     5,     5,-32768,     6,-32768,     5,    26,     5,-32768,
+      16,-32768,    18,    21,-32768,-32768,-32768,     5,-32768,-32768,
+  -32768,-32768,-32768,-32768,-32768,   -12,-32768,-32768,    24,    15,
+  -32768,-32768,    27,    28,     5,-32768,    30,-32768,-32768,-32768,
+      30,    31,-32768,-32768,    32,-32768,-32768,-32768,    33,-32768,
+  -32768,-32768,-32768,-32768,-32768,-32768,    48,-32768
 };
 };
 
 
 static const short yypgoto[] =
 static const short yypgoto[] =
 {
 {
-  -32768,-32768,-32768,-32768,-32768,-32768,-32768,     5,-32768,-32768,
-  -32768,    -4,-32768,-32768,   -29,-32768,-32768,   -32,    -1,   -27,
-     -15,-32768,-32768,     0,-32768,-32768,-32768,-32768,-32768,-32768,
-     -19,-32768,     4
+  -32768,-32768,-32768,-32768,-32768,-32768,-32768,    19,-32768,-32768,
+  -32768,    20,-32768,-32768,   -18,-32768,-32768,   -22,    -1,   -11,
+     -16,-32768,-32768,    10,-32768,-32768,-32768,-32768,-32768,-32768,
+      -8,-32768,     3
 };
 };
 
 
 
 
-#define	YYLAST		129
+#define	YYLAST		113
 
 
 
 
 static const short yytable[] =
 static const short yytable[] =
 {
 {
-       6,    18,    95,     8,     2,     3,    67,    58,    59,     3,
-       3,    82,    85,    51,    52,     3,    41,    12,    13,    14,
-      20,    42,     4,    44,    71,    48,    96,    49,    45,    67,
-      77,    47,    92,    88,    41,    87,    78,    93,    94,    86,
-      50,    89,     6,    60,    66,    81,    70,     0,    75,     0,
-       0,     0,     0,     0,     0,    79,     0,     3,     0,     0,
-      90,     0,     0,     0,    91,     0,    84,    -9,     0,     0,
-       3,     0,    75,     0,     0,    21,    22,    23,    24,    25,
-      26,    27,    28,     3,    29,    30,    31,    32,    21,    22,
-      23,    24,    25,    26,    27,    28,     0,    29,    30,    31,
-      32,    21,    22,    23,    24,    25,    26,    27,    28,     0,
-      29,    30,    31,     3,    53,     0,     0,    54,    55,    56,
-      57,     0,     0,     0,     0,     0,     0,     0,    58,    59
+       7,    19,    96,     2,     9,     3,    59,    60,     3,     3,
+      54,    49,     4,    55,    56,    57,    58,    42,    13,     3,
+      21,    43,     5,    45,    59,    60,    14,     3,    68,    83,
+      52,    53,    48,    72,    86,    42,    15,    78,    50,    68,
+      79,    93,    89,     7,    88,    67,    94,    71,    97,    76,
+      95,    87,    90,    46,    61,    51,    80,    82,     3,     0,
+      91,     0,     0,     0,    92,     0,     0,    85,   -10,     0,
+       0,     3,     0,    76,     0,     0,    22,    23,    24,    25,
+      26,    27,    28,    29,     3,    30,    31,    32,    33,    22,
+      23,    24,    25,    26,    27,    28,    29,     0,    30,    31,
+      32,    33,    22,    23,    24,    25,    26,    27,    28,    29,
+       0,    30,    31,    32
 };
 };
 
 
 static const short yycheck[] =
 static const short yycheck[] =
 {
 {
-       1,    16,     0,     4,     0,     3,    13,    18,    19,     3,
-       3,     5,    19,    40,    41,     3,    17,     9,     9,     6,
-      16,    17,    20,    19,    17,    10,     0,    13,    32,    13,
-      19,    32,    10,    14,    35,    17,    19,    14,    17,    68,
-      35,    73,    43,    43,    45,    64,    47,    -1,    49,    -1,
-      -1,    -1,    -1,    -1,    -1,    56,    -1,     3,    -1,    -1,
-      75,    -1,    -1,    -1,    79,    -1,    67,    13,    -1,    -1,
-       3,    -1,    73,    -1,    -1,    21,    22,    23,    24,    25,
-      26,    27,    28,     3,    30,    31,    32,    33,    21,    22,
-      23,    24,    25,    26,    27,    28,    -1,    30,    31,    32,
-      33,    21,    22,    23,    24,    25,    26,    27,    28,    -1,
-      30,    31,    32,     3,     4,    -1,    -1,     7,     8,     9,
-      10,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    18,    19
+       1,    17,     0,     0,     5,     3,    18,    19,     3,     3,
+       4,    10,    10,     7,     8,     9,    10,    18,     9,     3,
+      17,    18,    20,    20,    18,    19,     9,     3,    13,     5,
+      41,    42,    33,    17,    19,    36,     6,    19,    13,    13,
+      19,    10,    14,    44,    17,    46,    14,    48,     0,    50,
+      17,    69,    74,    33,    44,    36,    57,    65,     3,    -1,
+      76,    -1,    -1,    -1,    80,    -1,    -1,    68,    13,    -1,
+      -1,     3,    -1,    74,    -1,    -1,    21,    22,    23,    24,
+      25,    26,    27,    28,     3,    30,    31,    32,    33,    21,
+      22,    23,    24,    25,    26,    27,    28,    -1,    30,    31,
+      32,    33,    21,    22,    23,    24,    25,    26,    27,    28,
+      -1,    30,    31,    32
 };
 };
 /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
 /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
 #line 3 "/usr/share/bison/bison.simple"
 #line 3 "/usr/share/bison/bison.simple"
@@ -1017,8 +1016,8 @@ yyreduce:
 
 
   switch (yyn) {
   switch (yyn) {
 
 
-case 4:
-#line 114 "xParser.yxx"
+case 5:
+#line 115 "xParser.yxx"
 {
 {
   yyval.u.node = current_node;
   yyval.u.node = current_node;
   XFileTemplate *templ = new XFileTemplate(x_file, yyvsp[-2].str, yyvsp[0].guid);
   XFileTemplate *templ = new XFileTemplate(x_file, yyvsp[-2].str, yyvsp[0].guid);
@@ -1026,28 +1025,28 @@ case 4:
   current_node = templ;
   current_node = templ;
 }
 }
     break;
     break;
-case 5:
-#line 121 "xParser.yxx"
+case 6:
+#line 122 "xParser.yxx"
 {
 {
   yyval.u.node = current_node;
   yyval.u.node = current_node;
   current_node = yyvsp[-2].u.node;
   current_node = yyvsp[-2].u.node;
 }
 }
     break;
     break;
-case 10:
-#line 139 "xParser.yxx"
+case 11:
+#line 140 "xParser.yxx"
 {
 {
   DCAST(XFileTemplate, current_node)->set_open(true);
   DCAST(XFileTemplate, current_node)->set_open(true);
 }
 }
     break;
     break;
-case 17:
-#line 158 "xParser.yxx"
+case 18:
+#line 159 "xParser.yxx"
 {
 {
   current_data_def = new XFileDataDef(x_file, yyvsp[-1].str, yyvsp[-2].u.primitive_type);
   current_data_def = new XFileDataDef(x_file, yyvsp[-1].str, yyvsp[-2].u.primitive_type);
   current_node->add_child(current_data_def);
   current_node->add_child(current_data_def);
 }
 }
     break;
     break;
-case 19:
-#line 170 "xParser.yxx"
+case 20:
+#line 171 "xParser.yxx"
 {
 {
   XFileTemplate *xtemplate = x_file->find_template(yyvsp[-2].str);
   XFileTemplate *xtemplate = x_file->find_template(yyvsp[-2].str);
   if (xtemplate == (XFileTemplate *)NULL) {
   if (xtemplate == (XFileTemplate *)NULL) {
@@ -1058,81 +1057,81 @@ case 19:
   }
   }
 }
 }
     break;
     break;
-case 20:
-#line 183 "xParser.yxx"
+case 21:
+#line 184 "xParser.yxx"
 {
 {
   yyval.u.primitive_type = XFileDataDef::T_word;
   yyval.u.primitive_type = XFileDataDef::T_word;
 }
 }
     break;
     break;
-case 21:
-#line 187 "xParser.yxx"
+case 22:
+#line 188 "xParser.yxx"
 {
 {
   yyval.u.primitive_type = XFileDataDef::T_dword;
   yyval.u.primitive_type = XFileDataDef::T_dword;
 }
 }
     break;
     break;
-case 22:
-#line 191 "xParser.yxx"
+case 23:
+#line 192 "xParser.yxx"
 {
 {
   yyval.u.primitive_type = XFileDataDef::T_float;
   yyval.u.primitive_type = XFileDataDef::T_float;
 }
 }
     break;
     break;
-case 23:
-#line 195 "xParser.yxx"
+case 24:
+#line 196 "xParser.yxx"
 {
 {
   yyval.u.primitive_type = XFileDataDef::T_double;
   yyval.u.primitive_type = XFileDataDef::T_double;
 }
 }
     break;
     break;
-case 24:
-#line 199 "xParser.yxx"
+case 25:
+#line 200 "xParser.yxx"
 {
 {
   yyval.u.primitive_type = XFileDataDef::T_char;
   yyval.u.primitive_type = XFileDataDef::T_char;
 }
 }
     break;
     break;
-case 25:
-#line 203 "xParser.yxx"
+case 26:
+#line 204 "xParser.yxx"
 {
 {
   yyval.u.primitive_type = XFileDataDef::T_uchar;
   yyval.u.primitive_type = XFileDataDef::T_uchar;
 }
 }
     break;
     break;
-case 26:
-#line 207 "xParser.yxx"
+case 27:
+#line 208 "xParser.yxx"
 {
 {
   yyval.u.primitive_type = XFileDataDef::T_sword;
   yyval.u.primitive_type = XFileDataDef::T_sword;
 }
 }
     break;
     break;
-case 27:
-#line 211 "xParser.yxx"
+case 28:
+#line 212 "xParser.yxx"
 {
 {
   yyval.u.primitive_type = XFileDataDef::T_sdword;
   yyval.u.primitive_type = XFileDataDef::T_sdword;
 }
 }
     break;
     break;
-case 28:
-#line 215 "xParser.yxx"
+case 29:
+#line 216 "xParser.yxx"
 {
 {
   yyval.u.primitive_type = XFileDataDef::T_string;
   yyval.u.primitive_type = XFileDataDef::T_string;
 }
 }
     break;
     break;
-case 29:
-#line 219 "xParser.yxx"
+case 30:
+#line 220 "xParser.yxx"
 {
 {
   yyval.u.primitive_type = XFileDataDef::T_unicode;
   yyval.u.primitive_type = XFileDataDef::T_unicode;
 }
 }
     break;
     break;
-case 30:
-#line 223 "xParser.yxx"
+case 31:
+#line 224 "xParser.yxx"
 {
 {
   yyval.u.primitive_type = XFileDataDef::T_cstring;
   yyval.u.primitive_type = XFileDataDef::T_cstring;
 }
 }
     break;
     break;
-case 31:
-#line 230 "xParser.yxx"
+case 32:
+#line 231 "xParser.yxx"
 {
 {
   current_data_def = new XFileDataDef(x_file, yyvsp[0].str, yyvsp[-1].u.primitive_type);
   current_data_def = new XFileDataDef(x_file, yyvsp[0].str, yyvsp[-1].u.primitive_type);
   current_node->add_child(current_data_def);
   current_node->add_child(current_data_def);
 }
 }
     break;
     break;
-case 32:
-#line 235 "xParser.yxx"
+case 33:
+#line 236 "xParser.yxx"
 {
 {
   XFileTemplate *xtemplate = x_file->find_template(yyvsp[-1].str);
   XFileTemplate *xtemplate = x_file->find_template(yyvsp[-1].str);
   if (xtemplate == (XFileTemplate *)NULL) {
   if (xtemplate == (XFileTemplate *)NULL) {
@@ -1143,14 +1142,14 @@ case 32:
   }
   }
 }
 }
     break;
     break;
-case 36:
-#line 257 "xParser.yxx"
+case 37:
+#line 258 "xParser.yxx"
 {
 {
   current_data_def->add_array_def(XFileArrayDef(yyvsp[0].u.number));
   current_data_def->add_array_def(XFileArrayDef(yyvsp[0].u.number));
 }
 }
     break;
     break;
-case 37:
-#line 261 "xParser.yxx"
+case 38:
+#line 262 "xParser.yxx"
 {
 {
   XFileNode *data_def = current_node->find_child(yyvsp[0].str);
   XFileNode *data_def = current_node->find_child(yyvsp[0].str);
   if (data_def == (XFileNode *)NULL) {
   if (data_def == (XFileNode *)NULL) {
@@ -1160,18 +1159,18 @@ case 37:
   }
   }
 }
 }
     break;
     break;
-case 38:
-#line 273 "xParser.yxx"
+case 39:
+#line 274 "xParser.yxx"
 {
 {
 }
 }
     break;
     break;
-case 39:
-#line 276 "xParser.yxx"
+case 40:
+#line 277 "xParser.yxx"
 {
 {
 }
 }
     break;
     break;
-case 40:
-#line 282 "xParser.yxx"
+case 41:
+#line 283 "xParser.yxx"
 {
 {
   XFileTemplate *xtemplate = x_file->find_template(yyvsp[0].str);
   XFileTemplate *xtemplate = x_file->find_template(yyvsp[0].str);
   if (xtemplate == (XFileTemplate *)NULL) {
   if (xtemplate == (XFileTemplate *)NULL) {
@@ -1181,8 +1180,8 @@ case 40:
   }
   }
 }
 }
     break;
     break;
-case 41:
-#line 291 "xParser.yxx"
+case 42:
+#line 292 "xParser.yxx"
 {
 {
   XFileTemplate *xtemplate = x_file->find_template(yyvsp[0].guid);
   XFileTemplate *xtemplate = x_file->find_template(yyvsp[0].guid);
   if (xtemplate == (XFileTemplate *)NULL) {
   if (xtemplate == (XFileTemplate *)NULL) {
@@ -1196,20 +1195,20 @@ case 41:
   }
   }
 }
 }
     break;
     break;
-case 43:
-#line 311 "xParser.yxx"
+case 44:
+#line 312 "xParser.yxx"
 {
 {
   yyval.str = string();
   yyval.str = string();
 }
 }
     break;
     break;
-case 46:
-#line 323 "xParser.yxx"
+case 47:
+#line 324 "xParser.yxx"
 {
 {
   yyval.guid = WindowsGuid();
   yyval.guid = WindowsGuid();
 }
 }
     break;
     break;
-case 49:
-#line 335 "xParser.yxx"
+case 50:
+#line 336 "xParser.yxx"
 {
 {
   XFileTemplate *xtemplate = x_file->find_template(yyvsp[-2].str);
   XFileTemplate *xtemplate = x_file->find_template(yyvsp[-2].str);
   yyval.u.node = current_node;
   yyval.u.node = current_node;
@@ -1224,8 +1223,8 @@ case 49:
   }
   }
 }
 }
     break;
     break;
-case 50:
-#line 349 "xParser.yxx"
+case 51:
+#line 350 "xParser.yxx"
 {
 {
   XFileDataNodeTemplate *current_template = 
   XFileDataNodeTemplate *current_template = 
     DCAST(XFileDataNodeTemplate, current_node);
     DCAST(XFileDataNodeTemplate, current_node);
@@ -1235,50 +1234,50 @@ case 50:
   current_node = yyvsp[-3].u.node;
   current_node = yyvsp[-3].u.node;
 }
 }
     break;
     break;
-case 53:
-#line 366 "xParser.yxx"
+case 54:
+#line 367 "xParser.yxx"
 {
 {
   // nested references should be added as children too.
   // nested references should be added as children too.
   current_node->add_child(yyvsp[-1].u.node);
   current_node->add_child(yyvsp[-1].u.node);
 }
 }
     break;
     break;
-case 54:
-#line 371 "xParser.yxx"
+case 55:
+#line 372 "xParser.yxx"
 {
 {
   // nested objects are just quietly added as children.
   // nested objects are just quietly added as children.
 }
 }
     break;
     break;
-case 55:
-#line 375 "xParser.yxx"
+case 56:
+#line 376 "xParser.yxx"
 {
 {
   XFileDataNodeTemplate *current_template = 
   XFileDataNodeTemplate *current_template = 
     DCAST(XFileDataNodeTemplate, current_node);
     DCAST(XFileDataNodeTemplate, current_node);
   current_template->add_parse_int(yyvsp[0].int_list);
   current_template->add_parse_int(yyvsp[0].int_list);
 }
 }
     break;
     break;
-case 56:
-#line 381 "xParser.yxx"
+case 57:
+#line 382 "xParser.yxx"
 {
 {
   XFileDataNodeTemplate *current_template = 
   XFileDataNodeTemplate *current_template = 
     DCAST(XFileDataNodeTemplate, current_node);
     DCAST(XFileDataNodeTemplate, current_node);
   current_template->add_parse_double(yyvsp[0].double_list);
   current_template->add_parse_double(yyvsp[0].double_list);
 }
 }
     break;
     break;
-case 57:
-#line 387 "xParser.yxx"
+case 58:
+#line 388 "xParser.yxx"
 {
 {
   XFileDataNodeTemplate *current_template = 
   XFileDataNodeTemplate *current_template = 
     DCAST(XFileDataNodeTemplate, current_node);
     DCAST(XFileDataNodeTemplate, current_node);
   current_template->add_parse_string(yyvsp[-1].str);
   current_template->add_parse_string(yyvsp[-1].str);
 }
 }
     break;
     break;
-case 58:
-#line 393 "xParser.yxx"
+case 59:
+#line 394 "xParser.yxx"
 {
 {
 }
 }
     break;
     break;
-case 64:
-#line 416 "xParser.yxx"
+case 65:
+#line 417 "xParser.yxx"
 {
 {
   XFileDataNodeTemplate *data_object = x_file->find_data_object(yyvsp[0].str);
   XFileDataNodeTemplate *data_object = x_file->find_data_object(yyvsp[0].str);
   if (data_object == (XFileDataObject *)NULL) {
   if (data_object == (XFileDataObject *)NULL) {
@@ -1288,8 +1287,8 @@ case 64:
   yyval.u.node = new XFileDataNodeReference(data_object);
   yyval.u.node = new XFileDataNodeReference(data_object);
 }
 }
     break;
     break;
-case 65:
-#line 425 "xParser.yxx"
+case 66:
+#line 426 "xParser.yxx"
 {
 {
   XFileDataNodeTemplate *data_object = x_file->find_data_object(yyvsp[0].guid);
   XFileDataNodeTemplate *data_object = x_file->find_data_object(yyvsp[0].guid);
   if (data_object == (XFileDataObject *)NULL) {
   if (data_object == (XFileDataObject *)NULL) {
@@ -1537,4 +1536,4 @@ yyreturn:
 #endif
 #endif
   return yyresult;
   return yyresult;
 }
 }
-#line 442 "xParser.yxx"
+#line 443 "xParser.yxx"

+ 1 - 0
pandatool/src/xfile/xParser.yxx

@@ -107,6 +107,7 @@ xfile:
         empty
         empty
         | xfile template
         | xfile template
         | xfile object
         | xfile object
+        | xfile TOKEN_CBRACE   /* the 3dsMax converter writes an extra one. */
         ;
         ;
 
 
 template:
 template: