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
125 * know about them. */
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
162 static int yyerror(const char *s
);
165 static object_t
* newObject();
166 static void freeObject(object_t
*o
);
168 static OSObject
*buildOSDictionary(object_t
*);
169 static OSObject
*buildOSArray(object_t
*);
170 static OSObject
*buildOSSet(object_t
*);
171 static OSObject
*buildOSString(object_t
*);
172 static OSObject
*buildOSData(object_t
*);
173 static OSObject
*buildOSOffset(object_t
*);
174 static OSObject
*buildOSBoolean(object_t
*o
);
176 static void rememberObject(int, object_t
*);
177 static OSObject
*retrieveObject(int);
179 // temp variable to use during parsing
182 // resultant object of parsed text
183 static OSObject
*parsedObject
;
185 #define YYSTYPE object_t *
188 #include <kern/kalloc.h>
191 #define malloc(size) malloc_impl(size)
193 malloc_impl(size_t size
)
198 return kheap_alloc_tag_bt(KHEAP_DEFAULT
, size
,
199 (zalloc_flags_t
) (Z_WAITOK
| Z_ZERO
),
200 VM_KERN_MEMORY_LIBKERN
);
203 #define free(addr) free_impl(addr)
205 free_impl(void *addr
)
207 kheap_free_addr(KHEAP_DEFAULT
, addr
);
210 safe_free(void *addr
, size_t size
)
214 kheap_free(KHEAP_DEFAULT
, addr
, size
);
218 #define realloc(addr, osize, nsize) realloc_impl(addr, osize, nsize)
220 realloc_impl(void *addr
, size_t osize
, size_t nsize
)
223 return malloc(nsize
);
225 if (nsize
== osize
) {
228 void *nmem
= malloc(nsize
);
230 safe_free(addr
, osize
);
233 (void)memcpy(nmem
, addr
, (nsize
> osize
) ? osize
: nsize
);
234 safe_free(addr
, osize
);
241 /* Enabling traces. */
246 /* Enabling verbose error messages. */
247 #ifdef YYERROR_VERBOSE
248 # undef YYERROR_VERBOSE
249 # define YYERROR_VERBOSE 1
251 # define YYERROR_VERBOSE 0
254 /* Enabling the token table. */
255 #ifndef YYTOKEN_TABLE
256 # define YYTOKEN_TABLE 0
259 #if !defined YYSTYPE && !defined YYSTYPE_IS_DECLARED
261 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
262 # define YYSTYPE_IS_DECLARED 1
263 # define YYSTYPE_IS_TRIVIAL 1
268 /* Copy the second part of user declarations. */
271 /* Line 216 of yacc.c. */
272 #line 224 "OSUnserialize.tab.c"
279 typedef YYTYPE_UINT8 yytype_uint8
;
281 typedef unsigned char yytype_uint8
;
285 typedef YYTYPE_INT8 yytype_int8
;
286 #elif (defined __STDC__ || defined __C99__FUNC__ \
287 || defined __cplusplus || defined _MSC_VER)
288 typedef signed char yytype_int8
;
290 typedef short int yytype_int8
;
294 typedef YYTYPE_UINT16 yytype_uint16
;
296 typedef unsigned short int yytype_uint16
;
300 typedef YYTYPE_INT16 yytype_int16
;
302 typedef short int yytype_int16
;
306 # ifdef __SIZE_TYPE__
307 # define YYSIZE_T __SIZE_TYPE__
308 # elif defined size_t
309 # define YYSIZE_T size_t
310 # elif !defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
311 || defined __cplusplus || defined _MSC_VER)
312 # include <stddef.h> /* INFRINGES ON USER NAME SPACE */
313 # define YYSIZE_T size_t
315 # define YYSIZE_T unsigned int
319 #define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
322 # if defined YYENABLE_NLS && YYENABLE_NLS
324 # include <libintl.h> /* INFRINGES ON USER NAME SPACE */
325 # define YY_(msgid) dgettext ("bison-runtime", msgid)
329 # define YY_(msgid) msgid
333 /* Suppress unused-variable warnings by "using" E. */
334 #if !defined lint || defined __GNUC__
335 # define YYUSE(e) ((void) (e))
337 # define YYUSE(e) /* empty */
340 /* Identity function, used to suppress warnings about constant conditions. */
344 #if (defined __STDC__ || defined __C99__FUNC__ \
345 || defined __cplusplus || defined _MSC_VER)
358 #if !defined yyoverflow || YYERROR_VERBOSE
360 /* The parser invokes alloca or malloc; define the necessary symbols. */
362 # ifdef YYSTACK_USE_ALLOCA
363 # if YYSTACK_USE_ALLOCA
365 # define YYSTACK_ALLOC __builtin_alloca
366 # elif defined __BUILTIN_VA_ARG_INCR
367 # include <alloca.h> /* INFRINGES ON USER NAME SPACE */
369 # define YYSTACK_ALLOC __alloca
370 # elif defined _MSC_VER
371 # include <malloc.h> /* INFRINGES ON USER NAME SPACE */
372 # define alloca _alloca
374 # define YYSTACK_ALLOC alloca
375 # if !defined _ALLOCA_H && !defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
376 || defined __cplusplus || defined _MSC_VER)
377 # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
386 # ifdef YYSTACK_ALLOC
387 /* Pacify GCC's `empty if-body' warning. */
388 # define YYSTACK_FREE(Ptr) do { /* empty */ ; } while (YYID (0))
389 # ifndef YYSTACK_ALLOC_MAXIMUM
390 /* The OS might guarantee only one guard page at the bottom of the stack,
391 * and a page size can be as small as 4096 bytes. So we cannot safely
392 * invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
393 * to allow for a few compiler-allocated temporary stack slots. */
394 # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
397 # define YYSTACK_ALLOC YYMALLOC
398 # define YYSTACK_FREE YYFREE
399 # ifndef YYSTACK_ALLOC_MAXIMUM
400 # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
402 # if (defined __cplusplus && !defined _STDLIB_H \
403 && !((defined YYMALLOC || defined malloc) \
404 && (defined YYFREE || defined free)))
405 # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
411 # define YYMALLOC malloc
412 # if !defined malloc && !defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
413 || defined __cplusplus || defined _MSC_VER)
414 void *malloc(YYSIZE_T
); /* INFRINGES ON USER NAME SPACE */
419 # if !defined free && !defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
420 || defined __cplusplus || defined _MSC_VER)
421 void free(void *); /* INFRINGES ON USER NAME SPACE */
425 #endif /* ! defined yyoverflow || YYERROR_VERBOSE */
428 #if (!defined yyoverflow \
429 && (!defined __cplusplus \
430 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
432 /* A type that is properly aligned for any stack member. */
438 /* The size of the maximum gap between one aligned stack and the next. */
439 # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
441 /* The size of an array large to enough to hold all stacks, each with
443 # define YYSTACK_BYTES(N) \
444 ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
445 + YYSTACK_GAP_MAXIMUM)
447 /* Copy COUNT objects from FROM to TO. The source and destination do
450 # if defined __GNUC__ && 1 < __GNUC__
451 # define YYCOPY(To, From, Count) \
452 __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
454 # define YYCOPY(To, From, Count) \
458 for (yyi = 0; yyi < (Count); yyi++) \
459 (To)[yyi] = (From)[yyi]; \
465 /* Relocate STACK from its old location to the new one. The
466 * local variables YYSIZE and YYSTACKSIZE give the old and new number of
467 * elements in the stack, and YYPTR gives the new location of the
468 * stack. Advance YYPTR to a properly aligned location for the next
470 # define YYSTACK_RELOCATE(Stack) \
473 YYSIZE_T yynewbytes; \
474 YYCOPY (&yyptr->Stack, Stack, yysize); \
475 Stack = &yyptr->Stack; \
476 yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
477 yyptr += yynewbytes / sizeof (*yyptr); \
483 /* YYFINAL -- State number of the termination state. */
485 /* YYLAST -- Last index in YYTABLE. */
488 /* YYNTOKENS -- Number of terminals. */
490 /* YYNNTS -- Number of nonterminals. */
492 /* YYNRULES -- Number of rules. */
494 /* YYNRULES -- Number of states. */
497 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
499 #define YYMAXUTOK 262
501 #define YYTRANSLATE(YYX) \
502 ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
504 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
505 static const yytype_uint8 yytranslate
[] =
507 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
508 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
509 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
510 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
511 13, 14, 2, 2, 17, 2, 2, 2, 2, 2,
512 2, 2, 2, 2, 2, 2, 2, 2, 18, 12,
513 2, 11, 2, 2, 8, 2, 2, 2, 2, 2,
514 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
515 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
516 2, 15, 2, 16, 2, 2, 2, 2, 2, 2,
517 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
518 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
519 2, 2, 2, 9, 2, 10, 2, 2, 2, 2,
520 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
521 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
522 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
523 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
524 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
525 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
526 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
527 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
528 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
529 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
530 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
531 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
532 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
537 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
539 static const yytype_uint8 yyprhs
[] =
541 0, 0, 3, 4, 6, 8, 10, 12, 14, 16,
542 18, 20, 22, 25, 29, 32, 36, 38, 41, 46,
543 49, 53, 56, 60, 62, 66, 70, 72, 74
546 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
547 static const yytype_int8 yyrhs
[] =
549 20, 0, -1, -1, 21, -1, 7, -1, 22, -1,
550 25, -1, 26, -1, 30, -1, 29, -1, 28, -1,
551 31, -1, 8, 3, -1, 21, 8, 3, -1, 9,
552 10, -1, 9, 23, 10, -1, 24, -1, 23, 24,
553 -1, 21, 11, 21, 12, -1, 13, 14, -1, 13,
554 27, 14, -1, 15, 16, -1, 15, 27, 16, -1,
555 21, -1, 27, 17, 21, -1, 3, 18, 3, -1,
559 /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
560 static const yytype_uint8 yyrline
[] =
562 0, 163, 163, 164, 165, 168, 169, 170, 171, 172,
563 173, 174, 175, 184, 192, 193, 196, 197, 200, 210,
564 211, 214, 215, 218, 223, 234, 242, 247, 252
568 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
569 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
570 * First, the terminals, then, starting at YYNTOKENS, nonterminals. */
571 static const char *const yytname
[] =
573 "$end", "error", "$undefined", "NUMBER", "STRING", "DATA", "BOOLEAN",
574 "SYNTAX_ERROR", "'@'", "'{'", "'}'", "'='", "';'", "'('", "')'", "'['",
575 "']'", "','", "':'", "$accept", "input", "object", "dict", "pairs",
576 "pair", "array", "set", "elements", "offset", "data", "string",
582 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
583 * token YYLEX-NUM. */
584 static const yytype_uint16 yytoknum
[] =
586 0, 256, 257, 258, 259, 260, 261, 262, 64, 123,
587 125, 61, 59, 40, 41, 91, 93, 44, 58
591 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
592 static const yytype_uint8 yyr1
[] =
594 0, 19, 20, 20, 20, 21, 21, 21, 21, 21,
595 21, 21, 21, 21, 22, 22, 23, 23, 24, 25,
596 25, 26, 26, 27, 27, 28, 29, 30, 31
599 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
600 static const yytype_uint8 yyr2
[] =
602 0, 2, 0, 1, 1, 1, 1, 1, 1, 1,
603 1, 1, 2, 3, 2, 3, 1, 2, 4, 2,
604 3, 2, 3, 1, 3, 3, 1, 1, 1
607 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
608 * STATE-NUM when YYTABLE doesn't specify something else to do. Zero
609 * means the default is an error. */
610 static const yytype_uint8 yydefact
[] =
612 2, 0, 27, 26, 28, 4, 0, 0, 0, 0,
613 0, 3, 5, 6, 7, 10, 9, 8, 11, 0,
614 12, 14, 0, 0, 16, 19, 23, 0, 21, 0,
615 1, 0, 25, 0, 15, 17, 20, 0, 22, 13,
619 /* YYDEFGOTO[NTERM-NUM]. */
620 static const yytype_int8 yydefgoto
[] =
622 -1, 10, 22, 12, 23, 24, 13, 14, 27, 15,
626 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
628 #define YYPACT_NINF -14
629 static const yytype_int8 yypact
[] =
631 12, -13, -14, -14, -14, -14, 9, 26, 39, -2,
632 10, 20, -14, -14, -14, -14, -14, -14, -14, 35,
633 -14, -14, 38, 52, -14, -14, 20, 49, -14, 7,
634 -14, 37, -14, 65, -14, -14, -14, 65, -14, -14,
638 /* YYPGOTO[NTERM-NUM]. */
639 static const yytype_int8 yypgoto
[] =
641 -14, -14, 0, -14, -14, 27, -14, -14, 42, -14,
645 /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
646 * positive, shift that token. If negative, reduce the rule which
647 * number is the opposite. If zero, do what YYDEFACT says.
648 * If YYTABLE_NINF, syntax error. */
649 #define YYTABLE_NINF -1
650 static const yytype_uint8 yytable
[] =
652 11, 1, 2, 3, 4, 19, 6, 7, 26, 26,
653 30, 8, 20, 9, 28, 1, 2, 3, 4, 5,
654 6, 7, 31, 38, 37, 8, 42, 9, 31, 1,
655 2, 3, 4, 40, 6, 7, 21, 41, 32, 8,
656 39, 9, 1, 2, 3, 4, 31, 6, 7, 33,
657 35, 29, 8, 25, 9, 1, 2, 3, 4, 0,
658 6, 7, 34, 36, 0, 8, 37, 9, 1, 2,
659 3, 4, 0, 6, 7, 0, 0, 0, 8, 0,
663 static const yytype_int8 yycheck
[] =
665 0, 3, 4, 5, 6, 18, 8, 9, 8, 9,
666 0, 13, 3, 15, 16, 3, 4, 5, 6, 7,
667 8, 9, 8, 16, 17, 13, 12, 15, 8, 3,
668 4, 5, 6, 33, 8, 9, 10, 37, 3, 13,
669 3, 15, 3, 4, 5, 6, 8, 8, 9, 11,
670 23, 9, 13, 14, 15, 3, 4, 5, 6, -1,
671 8, 9, 10, 14, -1, 13, 17, 15, 3, 4,
672 5, 6, -1, 8, 9, -1, -1, -1, 13, -1,
676 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
677 * symbol of state STATE-NUM. */
678 static const yytype_uint8 yystos
[] =
680 0, 3, 4, 5, 6, 7, 8, 9, 13, 15,
681 20, 21, 22, 25, 26, 28, 29, 30, 31, 18,
682 3, 10, 21, 23, 24, 14, 21, 27, 16, 27,
683 0, 8, 3, 11, 10, 24, 14, 17, 16, 3,
687 #define yyerrok (yyerrstatus = 0)
688 #define yyclearin (yychar = YYEMPTY)
692 #define YYACCEPT goto yyacceptlab
693 #define YYABORT goto yyabortlab
694 #define YYERROR goto yyerrorlab
697 /* Like YYERROR except do call yyerror. This remains here temporarily
698 * to ease the transition to the new meaning of YYERROR, for GCC.
699 * Once GCC version 2 has supplanted version 1, this can go. */
701 #define YYFAIL goto yyerrlab
703 #define YYRECOVERING() (!!yyerrstatus)
705 #define YYBACKUP(Token, Value) \
707 if (yychar == YYEMPTY && yylen == 1) \
711 yytoken = YYTRANSLATE (yychar); \
717 yyerror (YY_("syntax error: cannot back up")); \
724 #define YYERRCODE 256
727 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
728 * If N is 0, then set CURRENT to the empty location which ends
729 * the previous symbol: RHS[0] (always defined). */
731 #define YYRHSLOC(Rhs, K) ((Rhs)[K])
732 #ifndef YYLLOC_DEFAULT
733 # define YYLLOC_DEFAULT(Current, Rhs, N) \
737 (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
738 (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
739 (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
740 (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
744 (Current).first_line = (Current).last_line = \
745 YYRHSLOC (Rhs, 0).last_line; \
746 (Current).first_column = (Current).last_column = \
747 YYRHSLOC (Rhs, 0).last_column; \
753 /* YY_LOCATION_PRINT -- Print the location on the stream.
754 * This macro was not mandated originally: define only if we know
755 * we won't break user code: when these are the locations we know. */
757 #ifndef YY_LOCATION_PRINT
758 # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
759 # define YY_LOCATION_PRINT(File, Loc) \
760 fprintf (File, "%d.%d-%d.%d", \
761 (Loc).first_line, (Loc).first_column, \
762 (Loc).last_line, (Loc).last_column)
764 # define YY_LOCATION_PRINT(File, Loc) ((void) 0)
769 /* YYLEX -- calling `yylex' with the right arguments. */
772 # define YYLEX yylex (YYLEX_PARAM)
774 # define YYLEX yylex ()
777 /* Enable debugging if requested. */
781 # include <stdio.h> /* INFRINGES ON USER NAME SPACE */
782 # define YYFPRINTF fprintf
785 # define YYDPRINTF(Args) \
791 # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
795 YYFPRINTF (stderr, "%s ", Title); \
796 yy_symbol_print (stderr, \
798 YYFPRINTF (stderr, "\n"); \
803 /*--------------------------------.
804 | Print this symbol on YYOUTPUT. |
805 | `--------------------------------*/
808 #if (defined __STDC__ || defined __C99__FUNC__ \
809 || defined __cplusplus || defined _MSC_VER)
811 yy_symbol_value_print(FILE *yyoutput
, int yytype
, YYSTYPE
const * const yyvaluep
)
814 yy_symbol_value_print(yyoutput
, yytype
, yyvaluep
)
817 YYSTYPE
const * const yyvaluep
;
824 if (yytype
< YYNTOKENS
) {
825 YYPRINT(yyoutput
, yytoknum
[yytype
], *yyvaluep
);
837 /*--------------------------------.
838 | Print this symbol on YYOUTPUT. |
839 | `--------------------------------*/
841 #if (defined __STDC__ || defined __C99__FUNC__ \
842 || defined __cplusplus || defined _MSC_VER)
844 yy_symbol_print(FILE *yyoutput
, int yytype
, YYSTYPE
const * const yyvaluep
)
847 yy_symbol_print(yyoutput
, yytype
, yyvaluep
)
850 YYSTYPE
const * const yyvaluep
;
853 if (yytype
< YYNTOKENS
) {
854 YYFPRINTF(yyoutput
, "token %s (", yytname
[yytype
]);
856 YYFPRINTF(yyoutput
, "nterm %s (", yytname
[yytype
]);
859 yy_symbol_value_print(yyoutput
, yytype
, yyvaluep
);
860 YYFPRINTF(yyoutput
, ")");
863 /*------------------------------------------------------------------.
864 | yy_stack_print -- Print the state stack from its BOTTOM up to its |
866 | `------------------------------------------------------------------*/
868 #if (defined __STDC__ || defined __C99__FUNC__ \
869 || defined __cplusplus || defined _MSC_VER)
871 yy_stack_print(yytype_int16
*bottom
, yytype_int16
*top
)
874 yy_stack_print(bottom
, top
)
875 yytype_int16
*bottom
;
879 YYFPRINTF(stderr
, "Stack now");
880 for (; bottom
<= top
; ++bottom
) {
881 YYFPRINTF(stderr
, " %d", *bottom
);
883 YYFPRINTF(stderr
, "\n");
886 # define YY_STACK_PRINT(Bottom, Top) \
889 yy_stack_print ((Bottom), (Top)); \
893 /*------------------------------------------------.
894 | Report that the YYRULE is going to be reduced. |
895 | `------------------------------------------------*/
897 #if (defined __STDC__ || defined __C99__FUNC__ \
898 || defined __cplusplus || defined _MSC_VER)
900 yy_reduce_print(YYSTYPE
*yyvsp
, int yyrule
)
903 yy_reduce_print(yyvsp
, yyrule
)
908 int yynrhs
= yyr2
[yyrule
];
910 unsigned long int yylno
= yyrline
[yyrule
];
911 YYFPRINTF(stderr
, "Reducing stack by rule %d (line %lu):\n",
913 /* The symbols being reduced. */
914 for (yyi
= 0; yyi
< yynrhs
; yyi
++) {
915 fprintf(stderr
, " $%d = ", yyi
+ 1);
916 yy_symbol_print(stderr
, yyrhs
[yyprhs
[yyrule
] + yyi
],
917 &(yyvsp
[(yyi
+ 1) - (yynrhs
)])
919 fprintf(stderr
, "\n");
923 # define YY_REDUCE_PRINT(Rule) \
926 yy_reduce_print (yyvsp, Rule); \
929 /* Nonzero means print parse trace. It is left uninitialized so that
930 * multiple parsers can coexist. */
933 # define YYDPRINTF(Args)
934 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
935 # define YY_STACK_PRINT(Bottom, Top)
936 # define YY_REDUCE_PRINT(Rule)
937 #endif /* !YYDEBUG */
940 /* YYINITDEPTH -- initial size of the parser's stacks. */
942 # define YYINITDEPTH 200
945 /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
946 * if the built-in stack extension method is used).
948 * Do not make this value too large; the results are undefined if
949 * YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
950 * evaluated with infinite-precision integer arithmetic. */
953 # define YYMAXDEPTH 10000
961 # if defined __GLIBC__ && defined _STRING_H
962 # define yystrlen strlen
964 /* Return the length of YYSTR. */
965 #if (defined __STDC__ || defined __C99__FUNC__ \
966 || defined __cplusplus || defined _MSC_VER)
968 yystrlen(const char *yystr
)
976 for (yylen
= 0; yystr
[yylen
]; yylen
++) {
985 # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
986 # define yystpcpy stpcpy
988 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
990 #if (defined __STDC__ || defined __C99__FUNC__ \
991 || defined __cplusplus || defined _MSC_VER)
993 yystpcpy(char *yydest
, const char *yysrc
)
996 yystpcpy(yydest
, yysrc
)
1002 const char *yys
= yysrc
;
1004 while ((*yyd
++ = *yys
++) != '\0') {
1014 /* Copy to YYRES the contents of YYSTR after stripping away unnecessary
1015 * quotes and backslashes, so that it's suitable for yyerror. The
1016 * heuristic is that double-quoting is unnecessary unless the string
1017 * contains an apostrophe, a comma, or backslash (other than
1018 * backslash-backslash). YYSTR is taken from yytname. If YYRES is
1019 * null, do not copy; instead, return the length of what the result
1020 * would have been. */
1022 yytnamerr(char *yyres
, const char *yystr
)
1024 if (*yystr
== '"') {
1026 char const *yyp
= yystr
;
1032 goto do_not_strip_quotes
;
1035 if (*++yyp
!= '\\') {
1036 goto do_not_strip_quotes
;
1053 do_not_strip_quotes
:;
1057 return yystrlen(yystr
);
1060 return yystpcpy(yyres
, yystr
) - yyres
;
1064 /* Copy into YYRESULT an error message about the unexpected token
1065 * YYCHAR while in state YYSTATE. Return the number of bytes copied,
1066 * including the terminating null byte. If YYRESULT is null, do not
1067 * copy anything; just return the number of bytes that would be
1068 * copied. As a special case, return 0 if an ordinary "syntax error"
1069 * message will do. Return YYSIZE_MAXIMUM if overflow occurs during
1070 * size calculation. */
1072 yysyntax_error(char *yyresult
, int yystate
, int yychar
)
1074 int yyn
= yypact
[yystate
];
1076 if (!(YYPACT_NINF
< yyn
&& yyn
<= YYLAST
)) {
1079 int yytype
= YYTRANSLATE(yychar
);
1080 YYSIZE_T yysize0
= yytnamerr(0, yytname
[yytype
]);
1081 YYSIZE_T yysize
= yysize0
;
1083 int yysize_overflow
= 0;
1084 enum { YYERROR_VERBOSE_ARGS_MAXIMUM
= 5 };
1085 char const *yyarg
[YYERROR_VERBOSE_ARGS_MAXIMUM
];
1089 /* This is so xgettext sees the translatable formats that are
1090 * constructed on the fly. */
1091 YY_("syntax error, unexpected %s");
1092 YY_("syntax error, unexpected %s, expecting %s");
1093 YY_("syntax error, unexpected %s, expecting %s or %s");
1094 YY_("syntax error, unexpected %s, expecting %s or %s or %s");
1095 YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
1099 static char const yyunexpected
[] = "syntax error, unexpected %s";
1100 static char const yyexpecting
[] = ", expecting %s";
1101 static char const yyor
[] = " or %s";
1102 char yyformat
[sizeof yyunexpected
1103 + sizeof yyexpecting
- 1
1104 + ((YYERROR_VERBOSE_ARGS_MAXIMUM
- 2)
1105 * (sizeof yyor
- 1))];
1106 char const *yyprefix
= yyexpecting
;
1108 /* Start YYX at -YYN if negative to avoid negative indexes in
1110 int yyxbegin
= yyn
< 0 ? -yyn
: 0;
1112 /* Stay within bounds of both yycheck and yytname. */
1113 int yychecklim
= YYLAST
- yyn
+ 1;
1114 int yyxend
= yychecklim
< YYNTOKENS
? yychecklim
: YYNTOKENS
;
1117 yyarg
[0] = yytname
[yytype
];
1118 yyfmt
= yystpcpy(yyformat
, yyunexpected
);
1120 for (yyx
= yyxbegin
; yyx
< yyxend
; ++yyx
) {
1121 if (yycheck
[yyx
+ yyn
] == yyx
&& yyx
!= YYTERROR
) {
1122 if (yycount
== YYERROR_VERBOSE_ARGS_MAXIMUM
) {
1125 yyformat
[sizeof yyunexpected
- 1] = '\0';
1128 yyarg
[yycount
++] = yytname
[yyx
];
1129 yysize1
= yysize
+ yytnamerr(0, yytname
[yyx
]);
1130 yysize_overflow
|= (yysize1
< yysize
);
1132 yyfmt
= yystpcpy(yyfmt
, yyprefix
);
1137 yyf
= YY_(yyformat
);
1138 yysize1
= yysize
+ yystrlen(yyf
);
1139 yysize_overflow
|= (yysize1
< yysize
);
1142 if (yysize_overflow
) {
1143 return YYSIZE_MAXIMUM
;
1147 /* Avoid sprintf, as that infringes on the user's name space.
1148 * Don't have undefined behavior even if the translation
1149 * produced a string with the wrong number of "%s"s. */
1150 char *yyp
= yyresult
;
1152 while ((*yyp
= *yyf
) != '\0') {
1153 if (*yyp
== '%' && yyf
[1] == 's' && yyi
< yycount
) {
1154 yyp
+= yytnamerr(yyp
, yyarg
[yyi
++]);
1165 #endif /* YYERROR_VERBOSE */
1168 /*-----------------------------------------------.
1169 | Release the memory associated to this symbol. |
1170 | `-----------------------------------------------*/
1173 #if (defined __STDC__ || defined __C99__FUNC__ \
1174 || defined __cplusplus || defined _MSC_VER)
1176 yydestruct(const char *yymsg
, int yytype
, YYSTYPE
*yyvaluep
)
1179 yydestruct(yymsg
, yytype
, yyvaluep
)
1190 YY_SYMBOL_PRINT(yymsg
, yytype
, yyvaluep
, yylocationp
);
1199 /* Prevent warnings from -Wmissing-prototypes. */
1201 #ifdef YYPARSE_PARAM
1202 #if defined __STDC__ || defined __cplusplus
1203 int yyparse(void *YYPARSE_PARAM
);
1207 #else /* ! YYPARSE_PARAM */
1208 #if defined __STDC__ || defined __cplusplus
1213 #endif /* ! YYPARSE_PARAM */
1217 /* The look-ahead symbol. */
1220 /* The semantic value of the look-ahead symbol. */
1223 /* Number of syntax errors so far. */
1232 #ifdef YYPARSE_PARAM
1233 #if (defined __STDC__ || defined __C99__FUNC__ \
1234 || defined __cplusplus || defined _MSC_VER)
1236 yyparse(void *YYPARSE_PARAM
)
1239 yyparse(YYPARSE_PARAM
)
1240 void *YYPARSE_PARAM
;
1242 #else /* ! YYPARSE_PARAM */
1243 #if (defined __STDC__ || defined __C99__FUNC__ \
1244 || defined __cplusplus || defined _MSC_VER)
1257 /* Number of tokens to shift before error messages enabled. */
1259 /* Look-ahead token as an internal (translated) token number. */
1262 /* Buffer for error messages, and its allocated size. */
1264 char *yymsg
= yymsgbuf
;
1265 YYSIZE_T yymsg_alloc
= sizeof yymsgbuf
;
1268 /* Three stacks and their tools:
1269 * `yyss': related to states,
1270 * `yyvs': related to semantic values,
1271 * `yyls': related to locations.
1273 * Refer to the stacks thru separate pointers, to allow yyoverflow
1274 * to reallocate them elsewhere. */
1276 /* The state stack. */
1277 yytype_int16 yyssa
[YYINITDEPTH
];
1278 yytype_int16
*yyss
= yyssa
;
1279 yytype_int16
*yyssp
;
1281 /* The semantic value stack. */
1282 YYSTYPE yyvsa
[YYINITDEPTH
];
1283 YYSTYPE
*yyvs
= yyvsa
;
1288 #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
1290 YYSIZE_T yystacksize
= YYINITDEPTH
;
1292 /* The variables used to return semantic value and location from the
1293 * action routines. */
1297 /* The number of symbols on the RHS of the reduced rule.
1298 * Keep to zero when no symbol should be popped. */
1301 YYDPRINTF((stderr
, "Starting parse\n"));
1306 yychar
= YYEMPTY
; /* Cause a token to be read. */
1308 /* Initialize stack pointers.
1309 * Waste one element of value and location stack
1310 * so that they stay on the same level as the state stack.
1311 * The wasted elements are never initialized. */
1318 /*------------------------------------------------------------.
1319 | yynewstate -- Push a new state, which is found in yystate. |
1320 | `------------------------------------------------------------*/
1322 /* In all cases, when you get here, the value and location stacks
1323 * have just been pushed. So pushing a state here evens the stacks. */
1329 if (yyss
+ yystacksize
- 1 <= yyssp
) {
1330 /* Get the current used size of the three stacks, in elements. */
1331 YYSIZE_T yysize
= yyssp
- yyss
+ 1;
1335 /* Give user a chance to reallocate the stack. Use copies of
1336 * these so that the &'s don't force the real ones into
1338 YYSTYPE
*yyvs1
= yyvs
;
1339 yytype_int16
*yyss1
= yyss
;
1342 /* Each stack pointer address is followed by the size of the
1343 * data in use in that stack, in bytes. This used to be a
1344 * conditional around just the two extra args, but that might
1345 * be undefined if yyoverflow is a macro. */
1346 yyoverflow(YY_("memory exhausted"),
1347 &yyss1
, yysize
* sizeof(*yyssp
),
1348 &yyvs1
, yysize
* sizeof(*yyvsp
),
1355 #else /* no yyoverflow */
1356 # ifndef YYSTACK_RELOCATE
1357 goto yyexhaustedlab
;
1359 /* Extend the stack our own way. */
1360 if (YYMAXDEPTH
<= yystacksize
) {
1361 goto yyexhaustedlab
;
1364 if (YYMAXDEPTH
< yystacksize
) {
1365 yystacksize
= YYMAXDEPTH
;
1369 yytype_int16
*yyss1
= yyss
;
1370 union yyalloc
*yyptr
=
1371 (union yyalloc
*) YYSTACK_ALLOC(YYSTACK_BYTES(yystacksize
));
1373 goto yyexhaustedlab
;
1375 YYSTACK_RELOCATE(yyss
);
1376 YYSTACK_RELOCATE(yyvs
);
1378 # undef YYSTACK_RELOCATE
1379 if (yyss1
!= yyssa
) {
1380 YYSTACK_FREE(yyss1
);
1384 #endif /* no yyoverflow */
1386 yyssp
= yyss
+ yysize
- 1;
1387 yyvsp
= yyvs
+ yysize
- 1;
1390 YYDPRINTF((stderr
, "Stack size increased to %lu\n",
1391 (unsigned long int) yystacksize
));
1393 if (yyss
+ yystacksize
- 1 <= yyssp
) {
1398 YYDPRINTF((stderr
, "Entering state %d\n", yystate
));
1407 /* Do appropriate processing given the current state. Read a
1408 * look-ahead token if we need one and don't already have one. */
1410 /* First try to decide what to do without reference to look-ahead token. */
1411 yyn
= yypact
[yystate
];
1412 if (yyn
== YYPACT_NINF
) {
1416 /* Not known => get a look-ahead token if don't already have one. */
1418 /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
1419 if (yychar
== YYEMPTY
) {
1420 YYDPRINTF((stderr
, "Reading a token: "));
1424 if (yychar
<= YYEOF
) {
1425 yychar
= yytoken
= YYEOF
;
1426 YYDPRINTF((stderr
, "Now at end of input.\n"));
1428 yytoken
= YYTRANSLATE(yychar
);
1429 YY_SYMBOL_PRINT("Next token is", yytoken
, &yylval
, &yylloc
);
1432 /* If the proper action on seeing token YYTOKEN is to reduce or to
1433 * detect an error, take that action. */
1435 if (yyn
< 0 || YYLAST
< yyn
|| yycheck
[yyn
] != yytoken
) {
1440 if (yyn
== 0 || yyn
== YYTABLE_NINF
) {
1447 if (yyn
== YYFINAL
) {
1451 /* Count tokens shifted since error; after three, turn off error
1457 /* Shift the look-ahead token. */
1458 YY_SYMBOL_PRINT("Shifting", yytoken
, &yylval
, &yylloc
);
1460 /* Discard the shifted token unless it is eof. */
1461 if (yychar
!= YYEOF
) {
1471 /*-----------------------------------------------------------.
1472 | yydefault -- do the default action for the current state. |
1473 | `-----------------------------------------------------------*/
1475 yyn
= yydefact
[yystate
];
1482 /*-----------------------------.
1483 | yyreduce -- Do a reduction. |
1484 | `-----------------------------*/
1486 /* yyn is the number of a rule to reduce with. */
1489 /* If YYLEN is nonzero, implement the default value of the action:
1492 * Otherwise, the following line sets YYVAL to garbage.
1493 * This behavior is undocumented and Bison
1494 * users should not rely upon it. Assigning to YYVAL
1495 * unconditionally makes the parser a bit smaller, and it avoids a
1496 * GCC warning that YYVAL may be used uninitialized. */
1497 yyval
= yyvsp
[1 - yylen
];
1500 YY_REDUCE_PRINT(yyn
);
1503 #line 163 "OSUnserialize.y"
1504 { parsedObject
= (OSObject
*)NULL
; YYACCEPT
;;}
1508 #line 164 "OSUnserialize.y"
1509 { parsedObject
= (OSObject
*)(yyvsp
[(1) - (1)]); YYACCEPT
;;}
1513 #line 165 "OSUnserialize.y"
1514 { yyerror("syntax error"); YYERROR
;;}
1518 #line 168 "OSUnserialize.y"
1519 { (yyval
) = (object_t
*)buildOSDictionary((yyvsp
[(1) - (1)]));;}
1523 #line 169 "OSUnserialize.y"
1524 { (yyval
) = (object_t
*)buildOSArray((yyvsp
[(1) - (1)]));;}
1528 #line 170 "OSUnserialize.y"
1529 { (yyval
) = (object_t
*)buildOSSet((yyvsp
[(1) - (1)]));;}
1533 #line 171 "OSUnserialize.y"
1534 { (yyval
) = (object_t
*)buildOSString((yyvsp
[(1) - (1)]));;}
1538 #line 172 "OSUnserialize.y"
1539 { (yyval
) = (object_t
*)buildOSData((yyvsp
[(1) - (1)]));;}
1543 #line 173 "OSUnserialize.y"
1544 { (yyval
) = (object_t
*)buildOSOffset((yyvsp
[(1) - (1)]));;}
1548 #line 174 "OSUnserialize.y"
1549 { (yyval
) = (object_t
*)buildOSBoolean((yyvsp
[(1) - (1)]));;}
1553 #line 175 "OSUnserialize.y"
1554 { (yyval
) = (object_t
*)retrieveObject((yyvsp
[(2) - (2)])->u
.offset
);
1556 ((OSObject
*)(yyval
))->retain();
1558 yyerror("forward reference detected");
1561 freeObject((yyvsp
[(2) - (2)]));
1566 #line 184 "OSUnserialize.y"
1567 { (yyval
) = (yyvsp
[(1) - (3)]);
1568 rememberObject((yyvsp
[(3) - (3)])->u
.offset
, (yyvsp
[(1) - (3)]));
1569 freeObject((yyvsp
[(3) - (3)]));
1574 #line 192 "OSUnserialize.y"
1579 #line 193 "OSUnserialize.y"
1580 { (yyval
) = (yyvsp
[(2) - (3)]);;}
1584 #line 197 "OSUnserialize.y"
1585 { (yyvsp
[(2) - (2)])->next
= (yyvsp
[(1) - (2)]); (yyvsp
[(1) - (2)])->prev
= (yyvsp
[(2) - (2)]); (yyval
) = (yyvsp
[(2) - (2)]);;}
1589 #line 200 "OSUnserialize.y"
1590 { (yyval
) = newObject();
1591 (yyval
)->next
= NULL
;
1592 (yyval
)->prev
= NULL
;
1593 (yyval
)->u
.key
= (yyvsp
[(1) - (4)]);
1594 (yyval
)->object
= (yyvsp
[(3) - (4)]);
1599 #line 210 "OSUnserialize.y"
1604 #line 211 "OSUnserialize.y"
1605 { (yyval
) = (yyvsp
[(2) - (3)]);;}
1609 #line 214 "OSUnserialize.y"
1614 #line 215 "OSUnserialize.y"
1615 { (yyval
) = (yyvsp
[(2) - (3)]);;}
1619 #line 218 "OSUnserialize.y"
1620 { (yyval
) = newObject();
1621 (yyval
)->object
= (yyvsp
[(1) - (1)]);
1622 (yyval
)->next
= NULL
;
1623 (yyval
)->prev
= NULL
;
1628 #line 223 "OSUnserialize.y"
1630 oo
->object
= (yyvsp
[(3) - (3)]);
1631 oo
->next
= (yyvsp
[(1) - (3)]);
1633 (yyvsp
[(1) - (3)])->prev
= oo
;
1639 #line 234 "OSUnserialize.y"
1640 { (yyval
) = (yyvsp
[(1) - (3)]);
1641 (yyval
)->size
= (yyvsp
[(3) - (3)])->u
.offset
;
1642 freeObject((yyvsp
[(3) - (3)]));
1647 /* Line 1267 of yacc.c. */
1648 #line 1597 "OSUnserialize.tab.c"
1651 YY_SYMBOL_PRINT("-> $$ =", yyr1
[yyn
], &yyval
, &yyloc
);
1655 YY_STACK_PRINT(yyss
, yyssp
);
1660 /* Now `shift' the result of the reduction. Determine what state
1661 * that goes to, based on the state we popped back to and the rule
1662 * number reduced by. */
1666 yystate
= yypgoto
[yyn
- YYNTOKENS
] + *yyssp
;
1667 if (0 <= yystate
&& yystate
<= YYLAST
&& yycheck
[yystate
] == *yyssp
) {
1668 yystate
= yytable
[yystate
];
1670 yystate
= yydefgoto
[yyn
- YYNTOKENS
];
1676 /*------------------------------------.
1677 | yyerrlab -- here on detecting error |
1678 | `------------------------------------*/
1680 /* If not already recovering from an error, report this error. */
1683 #if !YYERROR_VERBOSE
1684 yyerror(YY_("syntax error"));
1687 YYSIZE_T yysize
= yysyntax_error(0, yystate
, yychar
);
1688 if (yymsg_alloc
< yysize
&& yymsg_alloc
< YYSTACK_ALLOC_MAXIMUM
) {
1689 YYSIZE_T yyalloc
= 2 * yysize
;
1690 if (!(yysize
<= yyalloc
&& yyalloc
<= YYSTACK_ALLOC_MAXIMUM
)) {
1691 yyalloc
= YYSTACK_ALLOC_MAXIMUM
;
1693 if (yymsg
!= yymsgbuf
) {
1694 YYSTACK_FREE(yymsg
);
1696 yymsg
= (char *) YYSTACK_ALLOC(yyalloc
);
1698 yymsg_alloc
= yyalloc
;
1701 yymsg_alloc
= sizeof yymsgbuf
;
1705 if (0 < yysize
&& yysize
<= yymsg_alloc
) {
1706 (void) yysyntax_error(yymsg
, yystate
, yychar
);
1709 yyerror(YY_("syntax error"));
1711 goto yyexhaustedlab
;
1720 if (yyerrstatus
== 3) {
1721 /* If just tried and failed to reuse look-ahead token after an
1722 * error, discard it. */
1724 if (yychar
<= YYEOF
) {
1725 /* Return failure if at end of input. */
1726 if (yychar
== YYEOF
) {
1730 yydestruct("Error: discarding",
1736 /* Else will try to reuse look-ahead token after shifting the error
1741 /*---------------------------------------------------.
1742 | yyerrorlab -- error raised explicitly by YYERROR. |
1743 | `---------------------------------------------------*/
1746 /* Pacify compilers like GCC when the user code never invokes
1747 * YYERROR and the label yyerrorlab therefore never appears in user
1749 if (/*CONSTCOND*/ 0) {
1753 /* Do not reclaim the symbols of the rule which action triggered
1757 YY_STACK_PRINT(yyss
, yyssp
);
1762 /*-------------------------------------------------------------.
1763 | yyerrlab1 -- common code for both syntax error and YYERROR. |
1764 | `-------------------------------------------------------------*/
1766 yyerrstatus
= 3; /* Each real token shifted decrements this. */
1769 yyn
= yypact
[yystate
];
1770 if (yyn
!= YYPACT_NINF
) {
1772 if (0 <= yyn
&& yyn
<= YYLAST
&& yycheck
[yyn
] == YYTERROR
) {
1780 /* Pop the current state because it cannot handle the error token. */
1781 if (yyssp
== yyss
) {
1786 yydestruct("Error: popping",
1787 yystos
[yystate
], yyvsp
);
1790 YY_STACK_PRINT(yyss
, yyssp
);
1793 if (yyn
== YYFINAL
) {
1800 /* Shift the error token. */
1801 YY_SYMBOL_PRINT("Shifting", yystos
[yyn
], yyvsp
, yylsp
);
1807 /*-------------------------------------.
1808 | yyacceptlab -- YYACCEPT comes here. |
1809 | `-------------------------------------*/
1814 /*-----------------------------------.
1815 | yyabortlab -- YYABORT comes here. |
1816 | `-----------------------------------*/
1822 /*-------------------------------------------------.
1823 | yyexhaustedlab -- memory exhaustion comes here. |
1824 | `-------------------------------------------------*/
1826 yyerror(YY_("memory exhausted"));
1832 if (yychar
!= YYEOF
&& yychar
!= YYEMPTY
) {
1833 yydestruct("Cleanup: discarding lookahead",
1836 /* Do not reclaim the symbols of the rule which action triggered
1837 * this YYABORT or YYACCEPT. */
1839 YY_STACK_PRINT(yyss
, yyssp
);
1840 while (yyssp
!= yyss
) {
1841 yydestruct("Cleanup: popping",
1842 yystos
[*yyssp
], yyvsp
);
1846 if (yyss
!= yyssa
) {
1851 if (yymsg
!= yymsgbuf
) {
1852 YYSTACK_FREE(yymsg
);
1855 /* Make sure YYID is used. */
1856 return YYID(yyresult
);
1860 #line 255 "OSUnserialize.y"
1863 static int lineNumber
= 0;
1864 static const char *parseBuffer
;
1865 static int parseBufferIndex
;
1867 #define currentChar() (parseBuffer[parseBufferIndex])
1868 #define nextChar() (parseBuffer[++parseBufferIndex])
1869 #define prevChar() (parseBuffer[parseBufferIndex - 1])
1871 #define isSpace(c) ((c) == ' ' || (c) == '\t')
1872 #define isAlpha(c) (((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z'))
1873 #define isDigit(c) ((c) >= '0' && (c) <= '9')
1874 #define isAlphaDigit(c) ((c) >= 'a' && (c) <= 'f')
1875 #define isHexDigit(c) (isDigit(c) || isAlphaDigit(c))
1876 #define isAlphaNumeric(c) (isAlpha(c) || isDigit(c) || ((c) == '-'))
1878 static char yyerror_message
[128];
1881 yyerror(const char *s
) /* Called by yyparse on error */
1883 snprintf(yyerror_message
, sizeof(yyerror_message
), "OSUnserialize: %s near line %d\n", s
, lineNumber
);
1892 if (parseBufferIndex
== 0) {
1899 /* skip white space */
1901 while ((c
= nextChar()) != 0 && isSpace(c
)) {
1906 /* skip over comments */
1908 while ((c
= nextChar()) != 0 && c
!= '\n') {
1913 /* keep track of line number, don't return \n's */
1922 bool boolean
= false;
1923 if (nextChar() == 't') {
1924 if (nextChar() != 'r') {
1925 return SYNTAX_ERROR
;
1927 if (nextChar() != 'u') {
1928 return SYNTAX_ERROR
;
1930 if (nextChar() != 'e') {
1931 return SYNTAX_ERROR
;
1935 if (currentChar() != 'f') {
1936 return SYNTAX_ERROR
;
1938 if (nextChar() != 'a') {
1939 return SYNTAX_ERROR
;
1941 if (nextChar() != 'l') {
1942 return SYNTAX_ERROR
;
1944 if (nextChar() != 's') {
1945 return SYNTAX_ERROR
;
1947 if (nextChar() != 'e') {
1948 return SYNTAX_ERROR
;
1951 if (nextChar() != '.') {
1952 return SYNTAX_ERROR
;
1957 yylval
= (object_t
*)boolean
;
1961 /* parse unquoted string */
1966 start
= parseBufferIndex
;
1967 /* find end of string */
1968 while (isAlphaNumeric(c
)) {
1971 length
= parseBufferIndex
- start
;
1973 /* copy to null terminated buffer */
1974 tempString
= (char *)malloc(length
+ 1);
1975 if (tempString
== NULL
) {
1976 printf("OSUnserialize: can't alloc temp memory\n");
1979 bcopy(&parseBuffer
[start
], tempString
, length
);
1980 tempString
[length
] = 0;
1981 yylval
= (object_t
*)tempString
;
1985 /* parse quoted string */
1986 if (c
== '"' || c
== '\'') {
1991 start
= parseBufferIndex
+ 1; // skip quote
1992 /* find end of string, line, buffer */
1993 while ((c
= nextChar()) != quoteChar
) {
2001 return SYNTAX_ERROR
;
2004 length
= parseBufferIndex
- start
;
2005 /* skip over trailing quote */
2007 /* copy to null terminated buffer */
2008 tempString
= (char *)malloc(length
+ 1);
2009 if (tempString
== NULL
) {
2010 printf("OSUnserialize: can't alloc temp memory\n");
2015 for (int from
= start
; from
< parseBufferIndex
; from
++) {
2016 // hack - skip over backslashes
2017 if (parseBuffer
[from
] == '\\') {
2021 tempString
[to
] = parseBuffer
[from
];
2024 tempString
[length
] = 0;
2025 yylval
= (object_t
*)tempString
;
2029 /* process numbers */
2031 unsigned long long n
= 0;
2042 while (isDigit(c
)) {
2043 n
= (n
* base
+ c
- '0');
2047 while (isHexDigit(c
)) {
2049 n
= (n
* base
+ c
- '0');
2051 n
= (n
* base
+ 0xa + c
- 'a');
2057 yylval
= newObject();
2058 yylval
->u
.offset
= n
;
2063 #define OSDATA_ALLOC_SIZE 4096
2067 unsigned char *d
, *start
, *lastStart
;
2069 size_t buflen
= OSDATA_ALLOC_SIZE
;
2070 start
= lastStart
= d
= (unsigned char *)malloc(buflen
);
2071 c
= nextChar(); // skip over '<'
2072 while (c
!= 0 && c
!= '>') {
2074 while ((c
= nextChar()) != 0 && isSpace(c
)) {
2079 while ((c
= nextChar()) != 0 && c
!= '\n') {
2090 if (!isHexDigit(c
)) {
2094 *d
= (c
- '0') << 4;
2096 *d
= (0xa + (c
- 'a')) << 4;
2101 if (!isHexDigit(c
)) {
2107 *d
|= 0xa + (c
- 'a');
2111 if ((d
- lastStart
) >= OSDATA_ALLOC_SIZE
) {
2112 int oldsize
= d
- start
;
2113 assert(buflen
== oldsize
);
2114 start
= (unsigned char *)realloc(start
, oldsize
, buflen
);
2115 d
= lastStart
= start
+ oldsize
;
2120 safe_free(start
, buflen
);
2121 return SYNTAX_ERROR
;
2125 yylval
= newObject();
2126 yylval
->object
= start
;
2127 yylval
->size
= d
- start
;
2129 (void)nextChar(); // skip over '>'
2134 /* return single chars, move pointer to next char */
2139 // !@$&)(^Q$&*^!$(*!@$_(^%_(*Q#$(_*&!$_(*&!$_(*&!#$(*!@&^!@#%!_!#
2140 // !@$&)(^Q$&*^!$(*!@$_(^%_(*Q#$(_*&!$_(*&!$_(*&!#$(*!@&^!@#%!_!#
2141 // !@$&)(^Q$&*^!$(*!@$_(^%_(*Q#$(_*&!$_(*&!$_(*&!#$(*!@&^!@#%!_!#
2144 int debugUnserializeAllocCount
= 0;
2151 debugUnserializeAllocCount
++;
2153 return (object_t
*)malloc(sizeof(object_t
));
2157 freeObject(object_t
*o
)
2160 debugUnserializeAllocCount
--;
2162 safe_free(o
, sizeof(object_t
));
2165 static OSDictionary
*tags
;
2168 rememberObject(int tag
, object_t
*o
)
2171 snprintf(key
, sizeof(key
), "%u", tag
);
2173 tags
->setObject(key
, (OSObject
*)o
);
2177 retrieveObject(int tag
)
2180 snprintf(key
, sizeof(key
), "%u", tag
);
2182 return tags
->getObject(key
);
2186 buildOSDictionary(object_t
*o
)
2188 object_t
*temp
, *last
= o
;
2191 // get count and last object
2199 OSDictionary
*d
= OSDictionary::withCapacity(count
);
2202 #ifdef metaclass_stuff_worksXXX
2203 if (((OSObject
*)o
->u
.key
)->metaCast("OSSymbol")) {
2204 // XXX the evil frontdoor
2205 d
->setObject((OSSymbol
*)o
->u
.key
, (OSObject
*)o
->object
);
2207 // If it isn't a symbol, I hope it's a string!
2208 d
->setObject((OSString
*)o
->u
.key
, (OSObject
*)o
->object
);
2211 d
->setObject((OSString
*)o
->u
.key
, (OSObject
*)o
->object
);
2213 ((OSObject
*)o
->object
)->release();
2214 ((OSObject
*)o
->u
.key
)->release();
2223 buildOSArray(object_t
*o
)
2225 object_t
*temp
, *last
= o
;
2228 // get count and last object
2236 OSArray
*a
= OSArray::withCapacity(count
);
2239 a
->setObject((OSObject
*)o
->object
);
2240 ((OSObject
*)o
->object
)->release();
2249 buildOSSet(object_t
*o
)
2251 OSArray
*a
= (OSArray
*)buildOSArray(o
);
2252 OSSet
*s
= OSSet::withArray(a
, a
->getCapacity());
2259 buildOSString(object_t
*o
)
2261 OSString
*s
= OSString::withCString((char *)o
);
2263 safe_free(o
, strlen((char *)o
) + 1);
2269 buildOSData(object_t
*o
)
2274 d
= OSData::withBytes(o
->object
, o
->size
);
2276 d
= OSData::withCapacity(0);
2278 safe_free(o
->object
, o
->size
);
2284 buildOSOffset(object_t
*o
)
2286 OSNumber
*off
= OSNumber::withNumber(o
->u
.offset
, o
->size
);
2292 buildOSBoolean(object_t
*o
)
2294 OSBoolean
*b
= OSBoolean::withBoolean((bool)o
);
2299 #include <kern/locks.h>
2302 static lck_mtx_t
* lock
= 0;
2303 extern lck_grp_t
*IOLockGroup
;
2306 OSUnserialize(const char *buffer
, OSString
**errorString
)
2311 lock
= lck_mtx_alloc_init(IOLockGroup
, LCK_ATTR_NULL
);
2318 debugUnserializeAllocCount
= 0;
2320 yyerror_message
[0] = 0; //just in case
2321 parseBuffer
= buffer
;
2322 parseBufferIndex
= 0;
2323 tags
= OSDictionary::withCapacity(128);
2324 if (yyparse() == 0) {
2325 object
= parsedObject
;
2327 *errorString
= NULL
;
2332 *errorString
= OSString::withCString(yyerror_message
);
2338 if (debugUnserializeAllocCount
) {
2339 printf("OSUnserialize: allocation check failed, count = %d.\n",
2340 debugUnserializeAllocCount
);
2343 lck_mtx_unlock(lock
);
2354 // DO NOT EDIT OSUnserialize.cpp!