2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
29 /* OSUnserialize.y created by rsulack on Nov 21 1998 */
31 // "classic" parser for unserializing OSContainer objects
33 // XXX - this code should really be removed!
34 // - the XML format is now prefered
35 // - this code leaks on syntax errors, the XML doesn't
36 // - "classic" looks, reads, ... much better than XML :-(
37 // - well except the XML is more efficent on OSData
41 // bison -p OSUnserialize OSUnserialize.y
42 // head -50 OSUnserialize.y > OSUnserialize.cpp
43 // sed -e "s/stdio.h/stddef.h/" < OSUnserialize.tab.c >> OSUnserialize.cpp
45 // when changing code check in both OSUnserialize.y and OSUnserialize.cpp
50 // DO NOT EDIT OSUnserialize.tab.cpp!
51 /* A Bison parser, made by GNU Bison 2.3. */
53 /* Skeleton implementation for Bison's Yacc-like parsers in C
55 Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
56 Free Software Foundation, Inc.
58 This program is free software; you can redistribute it and/or modify
59 it under the terms of the GNU General Public License as published by
60 the Free Software Foundation; either version 2, or (at your option)
63 This program is distributed in the hope that it will be useful,
64 but WITHOUT ANY WARRANTY; without even the implied warranty of
65 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
66 GNU General Public License for more details.
68 You should have received a copy of the GNU General Public License
69 along with this program; if not, write to the Free Software
70 Foundation, Inc., 51 Franklin Street, Fifth Floor,
71 Boston, MA 02110-1301, USA. */
73 /* As a special exception, you may create a larger work that contains
74 part or all of the Bison parser skeleton and distribute that work
75 under terms of your choice, so long as that work isn't itself a
76 parser generator using the skeleton or a modified version thereof
77 as a parser skeleton. Alternatively, if you modify or redistribute
78 the parser skeleton itself, you may (at your option) remove this
79 special exception, which will cause the skeleton and the resulting
80 Bison output files to be licensed under the GNU General Public
81 License without this special exception.
83 This special exception was added by the Free Software Foundation in
84 version 2.2 of Bison. */
86 /* C LALR(1) parser skeleton written by Richard Stallman, by
87 simplifying the original so-called "semantic" parser. */
89 /* All symbols defined below should begin with yy or YY, to avoid
90 infringing on user name space. This should be done even for local
91 variables, as they might otherwise be expanded by user macros.
92 There are some unavoidable exceptions within include files to
93 define necessary library symbols; they are noted "INFRINGES ON
94 USER NAME SPACE" below. */
96 /* Identify Bison output. */
100 #define YYBISON_VERSION "2.3"
103 #define YYSKELETON_NAME "yacc.c"
108 /* Using locations. */
109 #define YYLSP_NEEDED 0
111 /* Substitute the variable and function names. */
112 #define yyparse OSUnserializeparse
113 #define yylex OSUnserializelex
114 #define yyerror OSUnserializeerror
115 #define yylval OSUnserializelval
116 #define yychar OSUnserializechar
117 #define yydebug OSUnserializedebug
118 #define yynerrs OSUnserializenerrs
124 /* Put the tokens into the symbol table, so that GDB and other debuggers
139 #define SYNTAX_ERROR 262
144 /* Copy the first part of user declarations. */
145 #line 60 "OSUnserialize.y"
147 #include <libkern/c++/OSMetaClass.h>
148 #include <libkern/c++/OSContainers.h>
149 #include <libkern/c++/OSLib.h>
151 typedef struct object
{
155 int size
; // for data
157 void *key
; // for dictionary
158 long long offset
; // for offset
163 static int yyerror(const char *s
);
166 static object_t
* newObject();
167 static void freeObject(object_t
*o
);
169 static OSObject
*buildOSDictionary(object_t
*);
170 static OSObject
*buildOSArray(object_t
*);
171 static OSObject
*buildOSSet(object_t
*);
172 static OSObject
*buildOSString(object_t
*);
173 static OSObject
*buildOSData(object_t
*);
174 static OSObject
*buildOSOffset(object_t
*);
175 static OSObject
*buildOSBoolean(object_t
*o
);
177 static void rememberObject(int, object_t
*);
178 static OSObject
*retrieveObject(int);
180 // temp variable to use during parsing
183 // resultant object of parsed text
184 static OSObject
*parsedObject
;
186 #define YYSTYPE object_t *
189 extern void *kern_os_malloc(size_t size
);
190 extern void *kern_os_realloc(void * addr
, size_t size
);
191 extern void kern_os_free(void * addr
);
194 #define malloc(s) kern_os_malloc(s)
195 #define realloc(a, s) kern_os_realloc(a, s)
196 #define free(a) kern_os_free(a)
200 /* Enabling traces. */
205 /* Enabling verbose error messages. */
206 #ifdef YYERROR_VERBOSE
207 # undef YYERROR_VERBOSE
208 # define YYERROR_VERBOSE 1
210 # define YYERROR_VERBOSE 0
213 /* Enabling the token table. */
214 #ifndef YYTOKEN_TABLE
215 # define YYTOKEN_TABLE 0
218 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
220 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
221 # define YYSTYPE_IS_DECLARED 1
222 # define YYSTYPE_IS_TRIVIAL 1
227 /* Copy the second part of user declarations. */
230 /* Line 216 of yacc.c. */
231 #line 182 "OSUnserialize.tab.c"
238 typedef YYTYPE_UINT8 yytype_uint8
;
240 typedef unsigned char yytype_uint8
;
244 typedef YYTYPE_INT8 yytype_int8
;
245 #elif (defined __STDC__ || defined __C99__FUNC__ \
246 || defined __cplusplus || defined _MSC_VER)
247 typedef signed char yytype_int8
;
249 typedef short int yytype_int8
;
253 typedef YYTYPE_UINT16 yytype_uint16
;
255 typedef unsigned short int yytype_uint16
;
259 typedef YYTYPE_INT16 yytype_int16
;
261 typedef short int yytype_int16
;
265 # ifdef __SIZE_TYPE__
266 # define YYSIZE_T __SIZE_TYPE__
267 # elif defined size_t
268 # define YYSIZE_T size_t
269 # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
270 || defined __cplusplus || defined _MSC_VER)
271 # include <stddef.h> /* INFRINGES ON USER NAME SPACE */
272 # define YYSIZE_T size_t
274 # define YYSIZE_T unsigned int
278 #define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
281 # if defined YYENABLE_NLS && YYENABLE_NLS
283 # include <libintl.h> /* INFRINGES ON USER NAME SPACE */
284 # define YY_(msgid) dgettext ("bison-runtime", msgid)
288 # define YY_(msgid) msgid
292 /* Suppress unused-variable warnings by "using" E. */
293 #if ! defined lint || defined __GNUC__
294 # define YYUSE(e) ((void) (e))
296 # define YYUSE(e) /* empty */
299 /* Identity function, used to suppress warnings about constant conditions. */
303 #if (defined __STDC__ || defined __C99__FUNC__ \
304 || defined __cplusplus || defined _MSC_VER)
317 #if ! defined yyoverflow || YYERROR_VERBOSE
319 /* The parser invokes alloca or malloc; define the necessary symbols. */
321 # ifdef YYSTACK_USE_ALLOCA
322 # if YYSTACK_USE_ALLOCA
324 # define YYSTACK_ALLOC __builtin_alloca
325 # elif defined __BUILTIN_VA_ARG_INCR
326 # include <alloca.h> /* INFRINGES ON USER NAME SPACE */
328 # define YYSTACK_ALLOC __alloca
329 # elif defined _MSC_VER
330 # include <malloc.h> /* INFRINGES ON USER NAME SPACE */
331 # define alloca _alloca
333 # define YYSTACK_ALLOC alloca
334 # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
335 || defined __cplusplus || defined _MSC_VER)
336 # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
345 # ifdef YYSTACK_ALLOC
346 /* Pacify GCC's `empty if-body' warning. */
347 # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
348 # ifndef YYSTACK_ALLOC_MAXIMUM
349 /* The OS might guarantee only one guard page at the bottom of the stack,
350 and a page size can be as small as 4096 bytes. So we cannot safely
351 invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
352 to allow for a few compiler-allocated temporary stack slots. */
353 # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
356 # define YYSTACK_ALLOC YYMALLOC
357 # define YYSTACK_FREE YYFREE
358 # ifndef YYSTACK_ALLOC_MAXIMUM
359 # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
361 # if (defined __cplusplus && ! defined _STDLIB_H \
362 && ! ((defined YYMALLOC || defined malloc) \
363 && (defined YYFREE || defined free)))
364 # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
370 # define YYMALLOC malloc
371 # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
372 || defined __cplusplus || defined _MSC_VER)
373 void *malloc (YYSIZE_T
); /* INFRINGES ON USER NAME SPACE */
378 # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
379 || defined __cplusplus || defined _MSC_VER)
380 void free (void *); /* INFRINGES ON USER NAME SPACE */
384 #endif /* ! defined yyoverflow || YYERROR_VERBOSE */
387 #if (! defined yyoverflow \
388 && (! defined __cplusplus \
389 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
391 /* A type that is properly aligned for any stack member. */
398 /* The size of the maximum gap between one aligned stack and the next. */
399 # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
401 /* The size of an array large to enough to hold all stacks, each with
403 # define YYSTACK_BYTES(N) \
404 ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
405 + YYSTACK_GAP_MAXIMUM)
407 /* Copy COUNT objects from FROM to TO. The source and destination do
410 # if defined __GNUC__ && 1 < __GNUC__
411 # define YYCOPY(To, From, Count) \
412 __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
414 # define YYCOPY(To, From, Count) \
418 for (yyi = 0; yyi < (Count); yyi++) \
419 (To)[yyi] = (From)[yyi]; \
425 /* Relocate STACK from its old location to the new one. The
426 local variables YYSIZE and YYSTACKSIZE give the old and new number of
427 elements in the stack, and YYPTR gives the new location of the
428 stack. Advance YYPTR to a properly aligned location for the next
430 # define YYSTACK_RELOCATE(Stack) \
433 YYSIZE_T yynewbytes; \
434 YYCOPY (&yyptr->Stack, Stack, yysize); \
435 Stack = &yyptr->Stack; \
436 yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
437 yyptr += yynewbytes / sizeof (*yyptr); \
443 /* YYFINAL -- State number of the termination state. */
445 /* YYLAST -- Last index in YYTABLE. */
448 /* YYNTOKENS -- Number of terminals. */
450 /* YYNNTS -- Number of nonterminals. */
452 /* YYNRULES -- Number of rules. */
454 /* YYNRULES -- Number of states. */
457 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
459 #define YYMAXUTOK 262
461 #define YYTRANSLATE(YYX) \
462 ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
464 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
465 static const yytype_uint8 yytranslate
[] =
467 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
468 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
469 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
470 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
471 13, 14, 2, 2, 17, 2, 2, 2, 2, 2,
472 2, 2, 2, 2, 2, 2, 2, 2, 18, 12,
473 2, 11, 2, 2, 8, 2, 2, 2, 2, 2,
474 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
475 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
476 2, 15, 2, 16, 2, 2, 2, 2, 2, 2,
477 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
478 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
479 2, 2, 2, 9, 2, 10, 2, 2, 2, 2,
480 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
481 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
482 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
483 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
484 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
485 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
486 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
487 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
488 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
489 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
490 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
491 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
492 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
497 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
499 static const yytype_uint8 yyprhs
[] =
501 0, 0, 3, 4, 6, 8, 10, 12, 14, 16,
502 18, 20, 22, 25, 29, 32, 36, 38, 41, 46,
503 49, 53, 56, 60, 62, 66, 70, 72, 74
506 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
507 static const yytype_int8 yyrhs
[] =
509 20, 0, -1, -1, 21, -1, 7, -1, 22, -1,
510 25, -1, 26, -1, 30, -1, 29, -1, 28, -1,
511 31, -1, 8, 3, -1, 21, 8, 3, -1, 9,
512 10, -1, 9, 23, 10, -1, 24, -1, 23, 24,
513 -1, 21, 11, 21, 12, -1, 13, 14, -1, 13,
514 27, 14, -1, 15, 16, -1, 15, 27, 16, -1,
515 21, -1, 27, 17, 21, -1, 3, 18, 3, -1,
519 /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
520 static const yytype_uint8 yyrline
[] =
522 0, 121, 121, 122, 123, 126, 127, 128, 129, 130,
523 131, 132, 133, 142, 150, 151, 154, 155, 158, 168,
524 169, 172, 173, 176, 181, 192, 200, 205, 210
528 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
529 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
530 First, the terminals, then, starting at YYNTOKENS, nonterminals. */
531 static const char *const yytname
[] =
533 "$end", "error", "$undefined", "NUMBER", "STRING", "DATA", "BOOLEAN",
534 "SYNTAX_ERROR", "'@'", "'{'", "'}'", "'='", "';'", "'('", "')'", "'['",
535 "']'", "','", "':'", "$accept", "input", "object", "dict", "pairs",
536 "pair", "array", "set", "elements", "offset", "data", "string",
542 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
544 static const yytype_uint16 yytoknum
[] =
546 0, 256, 257, 258, 259, 260, 261, 262, 64, 123,
547 125, 61, 59, 40, 41, 91, 93, 44, 58
551 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
552 static const yytype_uint8 yyr1
[] =
554 0, 19, 20, 20, 20, 21, 21, 21, 21, 21,
555 21, 21, 21, 21, 22, 22, 23, 23, 24, 25,
556 25, 26, 26, 27, 27, 28, 29, 30, 31
559 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
560 static const yytype_uint8 yyr2
[] =
562 0, 2, 0, 1, 1, 1, 1, 1, 1, 1,
563 1, 1, 2, 3, 2, 3, 1, 2, 4, 2,
564 3, 2, 3, 1, 3, 3, 1, 1, 1
567 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
568 STATE-NUM when YYTABLE doesn't specify something else to do. Zero
569 means the default is an error. */
570 static const yytype_uint8 yydefact
[] =
572 2, 0, 27, 26, 28, 4, 0, 0, 0, 0,
573 0, 3, 5, 6, 7, 10, 9, 8, 11, 0,
574 12, 14, 0, 0, 16, 19, 23, 0, 21, 0,
575 1, 0, 25, 0, 15, 17, 20, 0, 22, 13,
579 /* YYDEFGOTO[NTERM-NUM]. */
580 static const yytype_int8 yydefgoto
[] =
582 -1, 10, 22, 12, 23, 24, 13, 14, 27, 15,
586 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
588 #define YYPACT_NINF -14
589 static const yytype_int8 yypact
[] =
591 12, -13, -14, -14, -14, -14, 9, 26, 39, -2,
592 10, 20, -14, -14, -14, -14, -14, -14, -14, 35,
593 -14, -14, 38, 52, -14, -14, 20, 49, -14, 7,
594 -14, 37, -14, 65, -14, -14, -14, 65, -14, -14,
598 /* YYPGOTO[NTERM-NUM]. */
599 static const yytype_int8 yypgoto
[] =
601 -14, -14, 0, -14, -14, 27, -14, -14, 42, -14,
605 /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
606 positive, shift that token. If negative, reduce the rule which
607 number is the opposite. If zero, do what YYDEFACT says.
608 If YYTABLE_NINF, syntax error. */
609 #define YYTABLE_NINF -1
610 static const yytype_uint8 yytable
[] =
612 11, 1, 2, 3, 4, 19, 6, 7, 26, 26,
613 30, 8, 20, 9, 28, 1, 2, 3, 4, 5,
614 6, 7, 31, 38, 37, 8, 42, 9, 31, 1,
615 2, 3, 4, 40, 6, 7, 21, 41, 32, 8,
616 39, 9, 1, 2, 3, 4, 31, 6, 7, 33,
617 35, 29, 8, 25, 9, 1, 2, 3, 4, 0,
618 6, 7, 34, 36, 0, 8, 37, 9, 1, 2,
619 3, 4, 0, 6, 7, 0, 0, 0, 8, 0,
623 static const yytype_int8 yycheck
[] =
625 0, 3, 4, 5, 6, 18, 8, 9, 8, 9,
626 0, 13, 3, 15, 16, 3, 4, 5, 6, 7,
627 8, 9, 8, 16, 17, 13, 12, 15, 8, 3,
628 4, 5, 6, 33, 8, 9, 10, 37, 3, 13,
629 3, 15, 3, 4, 5, 6, 8, 8, 9, 11,
630 23, 9, 13, 14, 15, 3, 4, 5, 6, -1,
631 8, 9, 10, 14, -1, 13, 17, 15, 3, 4,
632 5, 6, -1, 8, 9, -1, -1, -1, 13, -1,
636 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
637 symbol of state STATE-NUM. */
638 static const yytype_uint8 yystos
[] =
640 0, 3, 4, 5, 6, 7, 8, 9, 13, 15,
641 20, 21, 22, 25, 26, 28, 29, 30, 31, 18,
642 3, 10, 21, 23, 24, 14, 21, 27, 16, 27,
643 0, 8, 3, 11, 10, 24, 14, 17, 16, 3,
647 #define yyerrok (yyerrstatus = 0)
648 #define yyclearin (yychar = YYEMPTY)
652 #define YYACCEPT goto yyacceptlab
653 #define YYABORT goto yyabortlab
654 #define YYERROR goto yyerrorlab
657 /* Like YYERROR except do call yyerror. This remains here temporarily
658 to ease the transition to the new meaning of YYERROR, for GCC.
659 Once GCC version 2 has supplanted version 1, this can go. */
661 #define YYFAIL goto yyerrlab
663 #define YYRECOVERING() (!!yyerrstatus)
665 #define YYBACKUP(Token, Value) \
667 if (yychar == YYEMPTY && yylen == 1) \
671 yytoken = YYTRANSLATE (yychar); \
677 yyerror (YY_("syntax error: cannot back up")); \
684 #define YYERRCODE 256
687 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
688 If N is 0, then set CURRENT to the empty location which ends
689 the previous symbol: RHS[0] (always defined). */
691 #define YYRHSLOC(Rhs, K) ((Rhs)[K])
692 #ifndef YYLLOC_DEFAULT
693 # define YYLLOC_DEFAULT(Current, Rhs, N) \
697 (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
698 (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
699 (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
700 (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
704 (Current).first_line = (Current).last_line = \
705 YYRHSLOC (Rhs, 0).last_line; \
706 (Current).first_column = (Current).last_column = \
707 YYRHSLOC (Rhs, 0).last_column; \
713 /* YY_LOCATION_PRINT -- Print the location on the stream.
714 This macro was not mandated originally: define only if we know
715 we won't break user code: when these are the locations we know. */
717 #ifndef YY_LOCATION_PRINT
718 # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
719 # define YY_LOCATION_PRINT(File, Loc) \
720 fprintf (File, "%d.%d-%d.%d", \
721 (Loc).first_line, (Loc).first_column, \
722 (Loc).last_line, (Loc).last_column)
724 # define YY_LOCATION_PRINT(File, Loc) ((void) 0)
729 /* YYLEX -- calling `yylex' with the right arguments. */
732 # define YYLEX yylex (YYLEX_PARAM)
734 # define YYLEX yylex ()
737 /* Enable debugging if requested. */
741 # include <stddef.h> /* INFRINGES ON USER NAME SPACE */
742 # define YYFPRINTF fprintf
745 # define YYDPRINTF(Args) \
751 # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
755 YYFPRINTF (stderr, "%s ", Title); \
756 yy_symbol_print (stderr, \
758 YYFPRINTF (stderr, "\n"); \
763 /*--------------------------------.
764 | Print this symbol on YYOUTPUT. |
765 `--------------------------------*/
768 #if (defined __STDC__ || defined __C99__FUNC__ \
769 || defined __cplusplus || defined _MSC_VER)
771 yy_symbol_value_print (FILE *yyoutput
, int yytype
, YYSTYPE
const * const yyvaluep
)
774 yy_symbol_value_print (yyoutput
, yytype
, yyvaluep
)
777 YYSTYPE
const * const yyvaluep
;
783 if (yytype
< YYNTOKENS
)
784 YYPRINT (yyoutput
, yytoknum
[yytype
], *yyvaluep
);
796 /*--------------------------------.
797 | Print this symbol on YYOUTPUT. |
798 `--------------------------------*/
800 #if (defined __STDC__ || defined __C99__FUNC__ \
801 || defined __cplusplus || defined _MSC_VER)
803 yy_symbol_print (FILE *yyoutput
, int yytype
, YYSTYPE
const * const yyvaluep
)
806 yy_symbol_print (yyoutput
, yytype
, yyvaluep
)
809 YYSTYPE
const * const yyvaluep
;
812 if (yytype
< YYNTOKENS
)
813 YYFPRINTF (yyoutput
, "token %s (", yytname
[yytype
]);
815 YYFPRINTF (yyoutput
, "nterm %s (", yytname
[yytype
]);
817 yy_symbol_value_print (yyoutput
, yytype
, yyvaluep
);
818 YYFPRINTF (yyoutput
, ")");
821 /*------------------------------------------------------------------.
822 | yy_stack_print -- Print the state stack from its BOTTOM up to its |
824 `------------------------------------------------------------------*/
826 #if (defined __STDC__ || defined __C99__FUNC__ \
827 || defined __cplusplus || defined _MSC_VER)
829 yy_stack_print (yytype_int16
*bottom
, yytype_int16
*top
)
832 yy_stack_print (bottom
, top
)
833 yytype_int16
*bottom
;
837 YYFPRINTF (stderr
, "Stack now");
838 for (; bottom
<= top
; ++bottom
)
839 YYFPRINTF (stderr
, " %d", *bottom
);
840 YYFPRINTF (stderr
, "\n");
843 # define YY_STACK_PRINT(Bottom, Top) \
846 yy_stack_print ((Bottom), (Top)); \
850 /*------------------------------------------------.
851 | Report that the YYRULE is going to be reduced. |
852 `------------------------------------------------*/
854 #if (defined __STDC__ || defined __C99__FUNC__ \
855 || defined __cplusplus || defined _MSC_VER)
857 yy_reduce_print (YYSTYPE
*yyvsp
, int yyrule
)
860 yy_reduce_print (yyvsp
, yyrule
)
865 int yynrhs
= yyr2
[yyrule
];
867 unsigned long int yylno
= yyrline
[yyrule
];
868 YYFPRINTF (stderr
, "Reducing stack by rule %d (line %lu):\n",
870 /* The symbols being reduced. */
871 for (yyi
= 0; yyi
< yynrhs
; yyi
++)
873 fprintf (stderr
, " $%d = ", yyi
+ 1);
874 yy_symbol_print (stderr
, yyrhs
[yyprhs
[yyrule
] + yyi
],
875 &(yyvsp
[(yyi
+ 1) - (yynrhs
)])
877 fprintf (stderr
, "\n");
881 # define YY_REDUCE_PRINT(Rule) \
884 yy_reduce_print (yyvsp, Rule); \
887 /* Nonzero means print parse trace. It is left uninitialized so that
888 multiple parsers can coexist. */
891 # define YYDPRINTF(Args)
892 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
893 # define YY_STACK_PRINT(Bottom, Top)
894 # define YY_REDUCE_PRINT(Rule)
895 #endif /* !YYDEBUG */
898 /* YYINITDEPTH -- initial size of the parser's stacks. */
900 # define YYINITDEPTH 200
903 /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
904 if the built-in stack extension method is used).
906 Do not make this value too large; the results are undefined if
907 YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
908 evaluated with infinite-precision integer arithmetic. */
911 # define YYMAXDEPTH 10000
919 # if defined __GLIBC__ && defined _STRING_H
920 # define yystrlen strlen
922 /* Return the length of YYSTR. */
923 #if (defined __STDC__ || defined __C99__FUNC__ \
924 || defined __cplusplus || defined _MSC_VER)
926 yystrlen (const char *yystr
)
934 for (yylen
= 0; yystr
[yylen
]; yylen
++)
942 # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
943 # define yystpcpy stpcpy
945 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
947 #if (defined __STDC__ || defined __C99__FUNC__ \
948 || defined __cplusplus || defined _MSC_VER)
950 yystpcpy (char *yydest
, const char *yysrc
)
953 yystpcpy (yydest
, yysrc
)
959 const char *yys
= yysrc
;
961 while ((*yyd
++ = *yys
++) != '\0')
970 /* Copy to YYRES the contents of YYSTR after stripping away unnecessary
971 quotes and backslashes, so that it's suitable for yyerror. The
972 heuristic is that double-quoting is unnecessary unless the string
973 contains an apostrophe, a comma, or backslash (other than
974 backslash-backslash). YYSTR is taken from yytname. If YYRES is
975 null, do not copy; instead, return the length of what the result
978 yytnamerr (char *yyres
, const char *yystr
)
983 char const *yyp
= yystr
;
990 goto do_not_strip_quotes
;
994 goto do_not_strip_quotes
;
1007 do_not_strip_quotes
: ;
1011 return yystrlen (yystr
);
1013 return yystpcpy (yyres
, yystr
) - yyres
;
1017 /* Copy into YYRESULT an error message about the unexpected token
1018 YYCHAR while in state YYSTATE. Return the number of bytes copied,
1019 including the terminating null byte. If YYRESULT is null, do not
1020 copy anything; just return the number of bytes that would be
1021 copied. As a special case, return 0 if an ordinary "syntax error"
1022 message will do. Return YYSIZE_MAXIMUM if overflow occurs during
1023 size calculation. */
1025 yysyntax_error (char *yyresult
, int yystate
, int yychar
)
1027 int yyn
= yypact
[yystate
];
1029 if (! (YYPACT_NINF
< yyn
&& yyn
<= YYLAST
))
1033 int yytype
= YYTRANSLATE (yychar
);
1034 YYSIZE_T yysize0
= yytnamerr (0, yytname
[yytype
]);
1035 YYSIZE_T yysize
= yysize0
;
1037 int yysize_overflow
= 0;
1038 enum { YYERROR_VERBOSE_ARGS_MAXIMUM
= 5 };
1039 char const *yyarg
[YYERROR_VERBOSE_ARGS_MAXIMUM
];
1043 /* This is so xgettext sees the translatable formats that are
1044 constructed on the fly. */
1045 YY_("syntax error, unexpected %s");
1046 YY_("syntax error, unexpected %s, expecting %s");
1047 YY_("syntax error, unexpected %s, expecting %s or %s");
1048 YY_("syntax error, unexpected %s, expecting %s or %s or %s");
1049 YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
1053 static char const yyunexpected
[] = "syntax error, unexpected %s";
1054 static char const yyexpecting
[] = ", expecting %s";
1055 static char const yyor
[] = " or %s";
1056 char yyformat
[sizeof yyunexpected
1057 + sizeof yyexpecting
- 1
1058 + ((YYERROR_VERBOSE_ARGS_MAXIMUM
- 2)
1059 * (sizeof yyor
- 1))];
1060 char const *yyprefix
= yyexpecting
;
1062 /* Start YYX at -YYN if negative to avoid negative indexes in
1064 int yyxbegin
= yyn
< 0 ? -yyn
: 0;
1066 /* Stay within bounds of both yycheck and yytname. */
1067 int yychecklim
= YYLAST
- yyn
+ 1;
1068 int yyxend
= yychecklim
< YYNTOKENS
? yychecklim
: YYNTOKENS
;
1071 yyarg
[0] = yytname
[yytype
];
1072 yyfmt
= yystpcpy (yyformat
, yyunexpected
);
1074 for (yyx
= yyxbegin
; yyx
< yyxend
; ++yyx
)
1075 if (yycheck
[yyx
+ yyn
] == yyx
&& yyx
!= YYTERROR
)
1077 if (yycount
== YYERROR_VERBOSE_ARGS_MAXIMUM
)
1081 yyformat
[sizeof yyunexpected
- 1] = '\0';
1084 yyarg
[yycount
++] = yytname
[yyx
];
1085 yysize1
= yysize
+ yytnamerr (0, yytname
[yyx
]);
1086 yysize_overflow
|= (yysize1
< yysize
);
1088 yyfmt
= yystpcpy (yyfmt
, yyprefix
);
1092 yyf
= YY_(yyformat
);
1093 yysize1
= yysize
+ yystrlen (yyf
);
1094 yysize_overflow
|= (yysize1
< yysize
);
1097 if (yysize_overflow
)
1098 return YYSIZE_MAXIMUM
;
1102 /* Avoid sprintf, as that infringes on the user's name space.
1103 Don't have undefined behavior even if the translation
1104 produced a string with the wrong number of "%s"s. */
1105 char *yyp
= yyresult
;
1107 while ((*yyp
= *yyf
) != '\0')
1109 if (*yyp
== '%' && yyf
[1] == 's' && yyi
< yycount
)
1111 yyp
+= yytnamerr (yyp
, yyarg
[yyi
++]);
1124 #endif /* YYERROR_VERBOSE */
1127 /*-----------------------------------------------.
1128 | Release the memory associated to this symbol. |
1129 `-----------------------------------------------*/
1132 #if (defined __STDC__ || defined __C99__FUNC__ \
1133 || defined __cplusplus || defined _MSC_VER)
1135 yydestruct (const char *yymsg
, int yytype
, YYSTYPE
*yyvaluep
)
1138 yydestruct (yymsg
, yytype
, yyvaluep
)
1148 YY_SYMBOL_PRINT (yymsg
, yytype
, yyvaluep
, yylocationp
);
1159 /* Prevent warnings from -Wmissing-prototypes. */
1161 #ifdef YYPARSE_PARAM
1162 #if defined __STDC__ || defined __cplusplus
1163 int yyparse (void *YYPARSE_PARAM
);
1167 #else /* ! YYPARSE_PARAM */
1168 #if defined __STDC__ || defined __cplusplus
1173 #endif /* ! YYPARSE_PARAM */
1177 /* The look-ahead symbol. */
1180 /* The semantic value of the look-ahead symbol. */
1183 /* Number of syntax errors so far. */
1192 #ifdef YYPARSE_PARAM
1193 #if (defined __STDC__ || defined __C99__FUNC__ \
1194 || defined __cplusplus || defined _MSC_VER)
1196 yyparse (void *YYPARSE_PARAM
)
1199 yyparse (YYPARSE_PARAM
)
1200 void *YYPARSE_PARAM
;
1202 #else /* ! YYPARSE_PARAM */
1203 #if (defined __STDC__ || defined __C99__FUNC__ \
1204 || defined __cplusplus || defined _MSC_VER)
1218 /* Number of tokens to shift before error messages enabled. */
1220 /* Look-ahead token as an internal (translated) token number. */
1223 /* Buffer for error messages, and its allocated size. */
1225 char *yymsg
= yymsgbuf
;
1226 YYSIZE_T yymsg_alloc
= sizeof yymsgbuf
;
1229 /* Three stacks and their tools:
1230 `yyss': related to states,
1231 `yyvs': related to semantic values,
1232 `yyls': related to locations.
1234 Refer to the stacks thru separate pointers, to allow yyoverflow
1235 to reallocate them elsewhere. */
1237 /* The state stack. */
1238 yytype_int16 yyssa
[YYINITDEPTH
];
1239 yytype_int16
*yyss
= yyssa
;
1240 yytype_int16
*yyssp
;
1242 /* The semantic value stack. */
1243 YYSTYPE yyvsa
[YYINITDEPTH
];
1244 YYSTYPE
*yyvs
= yyvsa
;
1249 #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
1251 YYSIZE_T yystacksize
= YYINITDEPTH
;
1253 /* The variables used to return semantic value and location from the
1258 /* The number of symbols on the RHS of the reduced rule.
1259 Keep to zero when no symbol should be popped. */
1262 YYDPRINTF ((stderr
, "Starting parse\n"));
1267 yychar
= YYEMPTY
; /* Cause a token to be read. */
1269 /* Initialize stack pointers.
1270 Waste one element of value and location stack
1271 so that they stay on the same level as the state stack.
1272 The wasted elements are never initialized. */
1279 /*------------------------------------------------------------.
1280 | yynewstate -- Push a new state, which is found in yystate. |
1281 `------------------------------------------------------------*/
1283 /* In all cases, when you get here, the value and location stacks
1284 have just been pushed. So pushing a state here evens the stacks. */
1290 if (yyss
+ yystacksize
- 1 <= yyssp
)
1292 /* Get the current used size of the three stacks, in elements. */
1293 YYSIZE_T yysize
= yyssp
- yyss
+ 1;
1297 /* Give user a chance to reallocate the stack. Use copies of
1298 these so that the &'s don't force the real ones into
1300 YYSTYPE
*yyvs1
= yyvs
;
1301 yytype_int16
*yyss1
= yyss
;
1304 /* Each stack pointer address is followed by the size of the
1305 data in use in that stack, in bytes. This used to be a
1306 conditional around just the two extra args, but that might
1307 be undefined if yyoverflow is a macro. */
1308 yyoverflow (YY_("memory exhausted"),
1309 &yyss1
, yysize
* sizeof (*yyssp
),
1310 &yyvs1
, yysize
* sizeof (*yyvsp
),
1317 #else /* no yyoverflow */
1318 # ifndef YYSTACK_RELOCATE
1319 goto yyexhaustedlab
;
1321 /* Extend the stack our own way. */
1322 if (YYMAXDEPTH
<= yystacksize
)
1323 goto yyexhaustedlab
;
1325 if (YYMAXDEPTH
< yystacksize
)
1326 yystacksize
= YYMAXDEPTH
;
1329 yytype_int16
*yyss1
= yyss
;
1330 union yyalloc
*yyptr
=
1331 (union yyalloc
*) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize
));
1333 goto yyexhaustedlab
;
1334 YYSTACK_RELOCATE (yyss
);
1335 YYSTACK_RELOCATE (yyvs
);
1337 # undef YYSTACK_RELOCATE
1339 YYSTACK_FREE (yyss1
);
1342 #endif /* no yyoverflow */
1344 yyssp
= yyss
+ yysize
- 1;
1345 yyvsp
= yyvs
+ yysize
- 1;
1348 YYDPRINTF ((stderr
, "Stack size increased to %lu\n",
1349 (unsigned long int) yystacksize
));
1351 if (yyss
+ yystacksize
- 1 <= yyssp
)
1355 YYDPRINTF ((stderr
, "Entering state %d\n", yystate
));
1364 /* Do appropriate processing given the current state. Read a
1365 look-ahead token if we need one and don't already have one. */
1367 /* First try to decide what to do without reference to look-ahead token. */
1368 yyn
= yypact
[yystate
];
1369 if (yyn
== YYPACT_NINF
)
1372 /* Not known => get a look-ahead token if don't already have one. */
1374 /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
1375 if (yychar
== YYEMPTY
)
1377 YYDPRINTF ((stderr
, "Reading a token: "));
1381 if (yychar
<= YYEOF
)
1383 yychar
= yytoken
= YYEOF
;
1384 YYDPRINTF ((stderr
, "Now at end of input.\n"));
1388 yytoken
= YYTRANSLATE (yychar
);
1389 YY_SYMBOL_PRINT ("Next token is", yytoken
, &yylval
, &yylloc
);
1392 /* If the proper action on seeing token YYTOKEN is to reduce or to
1393 detect an error, take that action. */
1395 if (yyn
< 0 || YYLAST
< yyn
|| yycheck
[yyn
] != yytoken
)
1400 if (yyn
== 0 || yyn
== YYTABLE_NINF
)
1409 /* Count tokens shifted since error; after three, turn off error
1414 /* Shift the look-ahead token. */
1415 YY_SYMBOL_PRINT ("Shifting", yytoken
, &yylval
, &yylloc
);
1417 /* Discard the shifted token unless it is eof. */
1418 if (yychar
!= YYEOF
)
1427 /*-----------------------------------------------------------.
1428 | yydefault -- do the default action for the current state. |
1429 `-----------------------------------------------------------*/
1431 yyn
= yydefact
[yystate
];
1437 /*-----------------------------.
1438 | yyreduce -- Do a reduction. |
1439 `-----------------------------*/
1441 /* yyn is the number of a rule to reduce with. */
1444 /* If YYLEN is nonzero, implement the default value of the action:
1447 Otherwise, the following line sets YYVAL to garbage.
1448 This behavior is undocumented and Bison
1449 users should not rely upon it. Assigning to YYVAL
1450 unconditionally makes the parser a bit smaller, and it avoids a
1451 GCC warning that YYVAL may be used uninitialized. */
1452 yyval
= yyvsp
[1-yylen
];
1455 YY_REDUCE_PRINT (yyn
);
1459 #line 121 "OSUnserialize.y"
1460 { parsedObject
= (OSObject
*)NULL
; YYACCEPT
; ;}
1464 #line 122 "OSUnserialize.y"
1465 { parsedObject
= (OSObject
*)(yyvsp
[(1) - (1)]); YYACCEPT
; ;}
1469 #line 123 "OSUnserialize.y"
1470 { yyerror("syntax error"); YYERROR
; ;}
1474 #line 126 "OSUnserialize.y"
1475 { (yyval
) = (object_t
*)buildOSDictionary((yyvsp
[(1) - (1)])); ;}
1479 #line 127 "OSUnserialize.y"
1480 { (yyval
) = (object_t
*)buildOSArray((yyvsp
[(1) - (1)])); ;}
1484 #line 128 "OSUnserialize.y"
1485 { (yyval
) = (object_t
*)buildOSSet((yyvsp
[(1) - (1)])); ;}
1489 #line 129 "OSUnserialize.y"
1490 { (yyval
) = (object_t
*)buildOSString((yyvsp
[(1) - (1)])); ;}
1494 #line 130 "OSUnserialize.y"
1495 { (yyval
) = (object_t
*)buildOSData((yyvsp
[(1) - (1)])); ;}
1499 #line 131 "OSUnserialize.y"
1500 { (yyval
) = (object_t
*)buildOSOffset((yyvsp
[(1) - (1)])); ;}
1504 #line 132 "OSUnserialize.y"
1505 { (yyval
) = (object_t
*)buildOSBoolean((yyvsp
[(1) - (1)])); ;}
1509 #line 133 "OSUnserialize.y"
1510 { (yyval
) = (object_t
*)retrieveObject((yyvsp
[(2) - (2)])->u
.offset
);
1512 ((OSObject
*)(yyval
))->retain();
1514 yyerror("forward reference detected");
1517 freeObject((yyvsp
[(2) - (2)]));
1522 #line 142 "OSUnserialize.y"
1523 { (yyval
) = (yyvsp
[(1) - (3)]);
1524 rememberObject((yyvsp
[(3) - (3)])->u
.offset
, (yyvsp
[(1) - (3)]));
1525 freeObject((yyvsp
[(3) - (3)]));
1530 #line 150 "OSUnserialize.y"
1531 { (yyval
) = NULL
; ;}
1535 #line 151 "OSUnserialize.y"
1536 { (yyval
) = (yyvsp
[(2) - (3)]); ;}
1540 #line 155 "OSUnserialize.y"
1541 { (yyvsp
[(2) - (2)])->next
= (yyvsp
[(1) - (2)]); (yyvsp
[(1) - (2)])->prev
= (yyvsp
[(2) - (2)]); (yyval
) = (yyvsp
[(2) - (2)]); ;}
1545 #line 158 "OSUnserialize.y"
1546 { (yyval
) = newObject();
1547 (yyval
)->next
= NULL
;
1548 (yyval
)->prev
= NULL
;
1549 (yyval
)->u
.key
= (yyvsp
[(1) - (4)]);
1550 (yyval
)->object
= (yyvsp
[(3) - (4)]);
1555 #line 168 "OSUnserialize.y"
1556 { (yyval
) = NULL
; ;}
1560 #line 169 "OSUnserialize.y"
1561 { (yyval
) = (yyvsp
[(2) - (3)]); ;}
1565 #line 172 "OSUnserialize.y"
1566 { (yyval
) = NULL
; ;}
1570 #line 173 "OSUnserialize.y"
1571 { (yyval
) = (yyvsp
[(2) - (3)]); ;}
1575 #line 176 "OSUnserialize.y"
1576 { (yyval
) = newObject();
1577 (yyval
)->object
= (yyvsp
[(1) - (1)]);
1578 (yyval
)->next
= NULL
;
1579 (yyval
)->prev
= NULL
;
1584 #line 181 "OSUnserialize.y"
1586 oo
->object
= (yyvsp
[(3) - (3)]);
1587 oo
->next
= (yyvsp
[(1) - (3)]);
1589 (yyvsp
[(1) - (3)])->prev
= oo
;
1595 #line 192 "OSUnserialize.y"
1596 { (yyval
) = (yyvsp
[(1) - (3)]);
1597 (yyval
)->size
= (yyvsp
[(3) - (3)])->u
.offset
;
1598 freeObject((yyvsp
[(3) - (3)]));
1603 /* Line 1267 of yacc.c. */
1604 #line 1555 "OSUnserialize.tab.c"
1607 YY_SYMBOL_PRINT ("-> $$ =", yyr1
[yyn
], &yyval
, &yyloc
);
1611 YY_STACK_PRINT (yyss
, yyssp
);
1616 /* Now `shift' the result of the reduction. Determine what state
1617 that goes to, based on the state we popped back to and the rule
1618 number reduced by. */
1622 yystate
= yypgoto
[yyn
- YYNTOKENS
] + *yyssp
;
1623 if (0 <= yystate
&& yystate
<= YYLAST
&& yycheck
[yystate
] == *yyssp
)
1624 yystate
= yytable
[yystate
];
1626 yystate
= yydefgoto
[yyn
- YYNTOKENS
];
1631 /*------------------------------------.
1632 | yyerrlab -- here on detecting error |
1633 `------------------------------------*/
1635 /* If not already recovering from an error, report this error. */
1639 #if ! YYERROR_VERBOSE
1640 yyerror (YY_("syntax error"));
1643 YYSIZE_T yysize
= yysyntax_error (0, yystate
, yychar
);
1644 if (yymsg_alloc
< yysize
&& yymsg_alloc
< YYSTACK_ALLOC_MAXIMUM
)
1646 YYSIZE_T yyalloc
= 2 * yysize
;
1647 if (! (yysize
<= yyalloc
&& yyalloc
<= YYSTACK_ALLOC_MAXIMUM
))
1648 yyalloc
= YYSTACK_ALLOC_MAXIMUM
;
1649 if (yymsg
!= yymsgbuf
)
1650 YYSTACK_FREE (yymsg
);
1651 yymsg
= (char *) YYSTACK_ALLOC (yyalloc
);
1653 yymsg_alloc
= yyalloc
;
1657 yymsg_alloc
= sizeof yymsgbuf
;
1661 if (0 < yysize
&& yysize
<= yymsg_alloc
)
1663 (void) yysyntax_error (yymsg
, yystate
, yychar
);
1668 yyerror (YY_("syntax error"));
1670 goto yyexhaustedlab
;
1678 if (yyerrstatus
== 3)
1680 /* If just tried and failed to reuse look-ahead token after an
1681 error, discard it. */
1683 if (yychar
<= YYEOF
)
1685 /* Return failure if at end of input. */
1686 if (yychar
== YYEOF
)
1691 yydestruct ("Error: discarding",
1697 /* Else will try to reuse look-ahead token after shifting the error
1702 /*---------------------------------------------------.
1703 | yyerrorlab -- error raised explicitly by YYERROR. |
1704 `---------------------------------------------------*/
1707 /* Pacify compilers like GCC when the user code never invokes
1708 YYERROR and the label yyerrorlab therefore never appears in user
1710 if (/*CONSTCOND*/ 0)
1713 /* Do not reclaim the symbols of the rule which action triggered
1717 YY_STACK_PRINT (yyss
, yyssp
);
1722 /*-------------------------------------------------------------.
1723 | yyerrlab1 -- common code for both syntax error and YYERROR. |
1724 `-------------------------------------------------------------*/
1726 yyerrstatus
= 3; /* Each real token shifted decrements this. */
1730 yyn
= yypact
[yystate
];
1731 if (yyn
!= YYPACT_NINF
)
1734 if (0 <= yyn
&& yyn
<= YYLAST
&& yycheck
[yyn
] == YYTERROR
)
1742 /* Pop the current state because it cannot handle the error token. */
1747 yydestruct ("Error: popping",
1748 yystos
[yystate
], yyvsp
);
1751 YY_STACK_PRINT (yyss
, yyssp
);
1760 /* Shift the error token. */
1761 YY_SYMBOL_PRINT ("Shifting", yystos
[yyn
], yyvsp
, yylsp
);
1767 /*-------------------------------------.
1768 | yyacceptlab -- YYACCEPT comes here. |
1769 `-------------------------------------*/
1774 /*-----------------------------------.
1775 | yyabortlab -- YYABORT comes here. |
1776 `-----------------------------------*/
1782 /*-------------------------------------------------.
1783 | yyexhaustedlab -- memory exhaustion comes here. |
1784 `-------------------------------------------------*/
1786 yyerror (YY_("memory exhausted"));
1792 if (yychar
!= YYEOF
&& yychar
!= YYEMPTY
)
1793 yydestruct ("Cleanup: discarding lookahead",
1795 /* Do not reclaim the symbols of the rule which action triggered
1796 this YYABORT or YYACCEPT. */
1798 YY_STACK_PRINT (yyss
, yyssp
);
1799 while (yyssp
!= yyss
)
1801 yydestruct ("Cleanup: popping",
1802 yystos
[*yyssp
], yyvsp
);
1807 YYSTACK_FREE (yyss
);
1810 if (yymsg
!= yymsgbuf
)
1811 YYSTACK_FREE (yymsg
);
1813 /* Make sure YYID is used. */
1814 return YYID (yyresult
);
1818 #line 213 "OSUnserialize.y"
1821 static int lineNumber
= 0;
1822 static const char *parseBuffer
;
1823 static int parseBufferIndex
;
1825 #define currentChar() (parseBuffer[parseBufferIndex])
1826 #define nextChar() (parseBuffer[++parseBufferIndex])
1827 #define prevChar() (parseBuffer[parseBufferIndex - 1])
1829 #define isSpace(c) ((c) == ' ' || (c) == '\t')
1830 #define isAlpha(c) (((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z'))
1831 #define isDigit(c) ((c) >= '0' && (c) <= '9')
1832 #define isAlphaDigit(c) ((c) >= 'a' && (c) <= 'f')
1833 #define isHexDigit(c) (isDigit(c) || isAlphaDigit(c))
1834 #define isAlphaNumeric(c) (isAlpha(c) || isDigit(c) || ((c) == '-'))
1836 static char yyerror_message
[128];
1839 yyerror(const char *s
) /* Called by yyparse on error */
1841 snprintf(yyerror_message
, sizeof(yyerror_message
), "OSUnserialize: %s near line %d\n", s
, lineNumber
);
1850 if (parseBufferIndex
== 0) lineNumber
= 1;
1855 /* skip white space */
1856 if (isSpace(c
)) while ((c
= nextChar()) != 0 && isSpace(c
)) {};
1858 /* skip over comments */
1859 if (c
== '#') while ((c
= nextChar()) != 0 && c
!= '\n') {};
1861 /* keep track of line number, don't return \n's */
1870 bool boolean
= false;
1871 if (nextChar() == 't') {
1872 if (nextChar() != 'r') return SYNTAX_ERROR
;
1873 if (nextChar() != 'u') return SYNTAX_ERROR
;
1874 if (nextChar() != 'e') return SYNTAX_ERROR
;
1877 if (currentChar() != 'f') return SYNTAX_ERROR
;
1878 if (nextChar() != 'a') return SYNTAX_ERROR
;
1879 if (nextChar() != 'l') return SYNTAX_ERROR
;
1880 if (nextChar() != 's') return SYNTAX_ERROR
;
1881 if (nextChar() != 'e') return SYNTAX_ERROR
;
1883 if (nextChar() != '.') return SYNTAX_ERROR
;
1887 yylval
= (object_t
*)boolean
;
1891 /* parse unquoted string */
1896 start
= parseBufferIndex
;
1897 /* find end of string */
1898 while (isAlphaNumeric(c
)) {
1901 length
= parseBufferIndex
- start
;
1903 /* copy to null terminated buffer */
1904 tempString
= (char *)malloc(length
+ 1);
1905 if (tempString
== 0) {
1906 printf("OSUnserialize: can't alloc temp memory\n");
1909 bcopy(&parseBuffer
[start
], tempString
, length
);
1910 tempString
[length
] = 0;
1911 yylval
= (object_t
*)tempString
;
1915 /* parse quoted string */
1916 if (c
== '"' || c
== '\'') {
1921 start
= parseBufferIndex
+ 1; // skip quote
1922 /* find end of string, line, buffer */
1923 while ((c
= nextChar()) != quoteChar
) {
1924 if (c
== '\\') c
= nextChar();
1925 if (c
== '\n') lineNumber
++;
1926 if (c
== 0) return SYNTAX_ERROR
;
1928 length
= parseBufferIndex
- start
;
1929 /* skip over trailing quote */
1931 /* copy to null terminated buffer */
1932 tempString
= (char *)malloc(length
+ 1);
1933 if (tempString
== 0) {
1934 printf("OSUnserialize: can't alloc temp memory\n");
1939 for (int from
=start
; from
< parseBufferIndex
; from
++) {
1940 // hack - skip over backslashes
1941 if (parseBuffer
[from
] == '\\') {
1945 tempString
[to
] = parseBuffer
[from
];
1948 tempString
[length
] = 0;
1949 yylval
= (object_t
*)tempString
;
1953 /* process numbers */
1956 unsigned long long n
= 0;
1968 n
= (n
* base
+ c
- '0');
1972 while(isHexDigit(c
)) {
1974 n
= (n
* base
+ c
- '0');
1976 n
= (n
* base
+ 0xa + c
- 'a');
1982 yylval
= newObject();
1983 yylval
->u
.offset
= n
;
1988 #define OSDATA_ALLOC_SIZE 4096
1992 unsigned char *d
, *start
, *lastStart
;
1994 start
= lastStart
= d
= (unsigned char *)malloc(OSDATA_ALLOC_SIZE
);
1995 c
= nextChar(); // skip over '<'
1996 while (c
!= 0 && c
!= '>') {
1998 if (isSpace(c
)) while ((c
= nextChar()) != 0 && isSpace(c
)) {};
1999 if (c
== '#') while ((c
= nextChar()) != 0 && c
!= '\n') {};
2007 if (!isHexDigit(c
)) break;
2009 *d
= (c
- '0') << 4;
2011 *d
= (0xa + (c
- 'a')) << 4;
2016 if (!isHexDigit(c
)) break;
2020 *d
|= 0xa + (c
- 'a');
2024 if ((d
- lastStart
) >= OSDATA_ALLOC_SIZE
) {
2025 int oldsize
= d
- start
;
2026 start
= (unsigned char *)realloc(start
, oldsize
+ OSDATA_ALLOC_SIZE
);
2027 d
= lastStart
= start
+ oldsize
;
2033 return SYNTAX_ERROR
;
2037 yylval
= newObject();
2038 yylval
->object
= start
;
2039 yylval
->size
= d
- start
;
2041 (void)nextChar(); // skip over '>'
2046 /* return single chars, move pointer to next char */
2051 // !@$&)(^Q$&*^!$(*!@$_(^%_(*Q#$(_*&!$_(*&!$_(*&!#$(*!@&^!@#%!_!#
2052 // !@$&)(^Q$&*^!$(*!@$_(^%_(*Q#$(_*&!$_(*&!$_(*&!#$(*!@&^!@#%!_!#
2053 // !@$&)(^Q$&*^!$(*!@$_(^%_(*Q#$(_*&!$_(*&!$_(*&!#$(*!@&^!@#%!_!#
2056 int debugUnserializeAllocCount
= 0;
2063 debugUnserializeAllocCount
++;
2065 return (object_t
*)malloc(sizeof(object_t
));
2069 freeObject(object_t
*o
)
2072 debugUnserializeAllocCount
--;
2077 static OSDictionary
*tags
;
2080 rememberObject(int tag
, object_t
*o
)
2083 snprintf(key
, sizeof(key
), "%u", tag
);
2085 tags
->setObject(key
, (OSObject
*)o
);
2089 retrieveObject(int tag
)
2092 snprintf(key
, sizeof(key
), "%u", tag
);
2094 return tags
->getObject(key
);
2098 buildOSDictionary(object_t
*o
)
2100 object_t
*temp
, *last
= o
;
2103 // get count and last object
2111 OSDictionary
*d
= OSDictionary::withCapacity(count
);
2114 #ifdef metaclass_stuff_worksXXX
2115 if (((OSObject
*)o
->u
.key
)->metaCast("OSSymbol")) {
2116 // XXX the evil frontdoor
2117 d
->setObject((OSSymbol
*)o
->u
.key
, (OSObject
*)o
->object
);
2119 // If it isn't a symbol, I hope it's a string!
2120 d
->setObject((OSString
*)o
->u
.key
, (OSObject
*)o
->object
);
2123 d
->setObject((OSString
*)o
->u
.key
, (OSObject
*)o
->object
);
2125 ((OSObject
*)o
->object
)->release();
2126 ((OSObject
*)o
->u
.key
)->release();
2135 buildOSArray(object_t
*o
)
2137 object_t
*temp
, *last
= o
;
2140 // get count and last object
2148 OSArray
*a
= OSArray::withCapacity(count
);
2151 a
->setObject((OSObject
*)o
->object
);
2152 ((OSObject
*)o
->object
)->release();
2161 buildOSSet(object_t
*o
)
2163 OSArray
*a
= (OSArray
*)buildOSArray(o
);
2164 OSSet
*s
= OSSet::withArray(a
, a
->getCapacity());
2171 buildOSString(object_t
*o
)
2173 OSString
*s
= OSString::withCString((char *)o
);
2181 buildOSData(object_t
*o
)
2186 d
= OSData::withBytes(o
->object
, o
->size
);
2188 d
= OSData::withCapacity(0);
2196 buildOSOffset(object_t
*o
)
2198 OSNumber
*off
= OSNumber::withNumber(o
->u
.offset
, o
->size
);
2204 buildOSBoolean(object_t
*o
)
2206 OSBoolean
*b
= OSBoolean::withBoolean((bool)o
);
2211 #include <kern/locks.h>
2214 static lck_mtx_t
*lock
= 0;
2215 extern lck_grp_t
*IOLockGroup
;
2218 OSUnserialize(const char *buffer
, OSString
**errorString
)
2223 lock
= lck_mtx_alloc_init(IOLockGroup
, LCK_ATTR_NULL
);
2231 debugUnserializeAllocCount
= 0;
2233 yyerror_message
[0] = 0; //just in case
2234 parseBuffer
= buffer
;
2235 parseBufferIndex
= 0;
2236 tags
= OSDictionary::withCapacity(128);
2237 if (yyparse() == 0) {
2238 object
= parsedObject
;
2239 if (errorString
) *errorString
= 0;
2243 *errorString
= OSString::withCString(yyerror_message
);
2248 if (debugUnserializeAllocCount
) {
2249 printf("OSUnserialize: allocation check failed, count = %d.\n",
2250 debugUnserializeAllocCount
);
2253 lck_mtx_unlock(lock
);
2264 // DO NOT EDIT OSUnserialize.cpp!