xref: /xnu-10063.121.3/libkern/c++/OSUnserialize.y (revision 2c2f96dc2b9a4408a43d3150ae9c105355ca3daa)
1*2c2f96dcSApple OSS Distributions /*
2*2c2f96dcSApple OSS Distributions  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3*2c2f96dcSApple OSS Distributions  *
4*2c2f96dcSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*2c2f96dcSApple OSS Distributions  *
6*2c2f96dcSApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*2c2f96dcSApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*2c2f96dcSApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*2c2f96dcSApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*2c2f96dcSApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*2c2f96dcSApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*2c2f96dcSApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*2c2f96dcSApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*2c2f96dcSApple OSS Distributions  *
15*2c2f96dcSApple OSS Distributions  * Please obtain a copy of the License at
16*2c2f96dcSApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*2c2f96dcSApple OSS Distributions  *
18*2c2f96dcSApple OSS Distributions  * The Original Code and all software distributed under the License are
19*2c2f96dcSApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*2c2f96dcSApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*2c2f96dcSApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*2c2f96dcSApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*2c2f96dcSApple OSS Distributions  * Please see the License for the specific language governing rights and
24*2c2f96dcSApple OSS Distributions  * limitations under the License.
25*2c2f96dcSApple OSS Distributions  *
26*2c2f96dcSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*2c2f96dcSApple OSS Distributions  */
28*2c2f96dcSApple OSS Distributions 
29*2c2f96dcSApple OSS Distributions /*  OSUnserialize.y created by rsulack on Nov 21 1998 */
30*2c2f96dcSApple OSS Distributions 
31*2c2f96dcSApple OSS Distributions // 		"classic" parser for unserializing OSContainer objects
32*2c2f96dcSApple OSS Distributions //
33*2c2f96dcSApple OSS Distributions //  XXX - this code should really be removed!
34*2c2f96dcSApple OSS Distributions //	- the XML format is now prefered
35*2c2f96dcSApple OSS Distributions //	- this code leaks on syntax errors, the XML doesn't
36*2c2f96dcSApple OSS Distributions //	- "classic" looks, reads, ... much better than XML :-(
37*2c2f96dcSApple OSS Distributions //	- well except the XML is more efficent on OSData
38*2c2f96dcSApple OSS Distributions //
39*2c2f96dcSApple OSS Distributions //
40*2c2f96dcSApple OSS Distributions // to build :
41*2c2f96dcSApple OSS Distributions //	bison -p OSUnserialize OSUnserialize.y
42*2c2f96dcSApple OSS Distributions //	head -50 OSUnserialize.y > OSUnserialize.cpp
43*2c2f96dcSApple OSS Distributions //	sed -e "s/stdio.h/stddef.h/" < OSUnserialize.tab.c >> OSUnserialize.cpp
44*2c2f96dcSApple OSS Distributions //
45*2c2f96dcSApple OSS Distributions //	when changing code check in both OSUnserialize.y and OSUnserialize.cpp
46*2c2f96dcSApple OSS Distributions //
47*2c2f96dcSApple OSS Distributions //
48*2c2f96dcSApple OSS Distributions //
49*2c2f96dcSApple OSS Distributions //
50*2c2f96dcSApple OSS Distributions //		 DO NOT EDIT OSUnserialize.tab.cpp!
51*2c2f96dcSApple OSS Distributions //
52*2c2f96dcSApple OSS Distributions //			this means you!
53*2c2f96dcSApple OSS Distributions //
54*2c2f96dcSApple OSS Distributions //
55*2c2f96dcSApple OSS Distributions //
56*2c2f96dcSApple OSS Distributions //
57*2c2f96dcSApple OSS Distributions //
58*2c2f96dcSApple OSS Distributions 
59*2c2f96dcSApple OSS Distributions 
60*2c2f96dcSApple OSS Distributions %{
61*2c2f96dcSApple OSS Distributions #include <libkern/c++/OSMetaClass.h>
62*2c2f96dcSApple OSS Distributions #include <libkern/c++/OSContainers.h>
63*2c2f96dcSApple OSS Distributions #include <libkern/c++/OSLib.h>
64*2c2f96dcSApple OSS Distributions 
65*2c2f96dcSApple OSS Distributions typedef	struct object {
66*2c2f96dcSApple OSS Distributions 	struct object	*next;
67*2c2f96dcSApple OSS Distributions 	struct object	*prev;
68*2c2f96dcSApple OSS Distributions 	void		*object;
69*2c2f96dcSApple OSS Distributions 	int		size;		// for data
70*2c2f96dcSApple OSS Distributions 	union {
71*2c2f96dcSApple OSS Distributions 		void	*key;		// for dictionary
72*2c2f96dcSApple OSS Distributions 		long long offset;	// for offset
73*2c2f96dcSApple OSS Distributions 	} u;
74*2c2f96dcSApple OSS Distributions 
75*2c2f96dcSApple OSS Distributions } object_t;
76*2c2f96dcSApple OSS Distributions 
77*2c2f96dcSApple OSS Distributions static int yyerror(const char *s);
78*2c2f96dcSApple OSS Distributions static int yylex();
79*2c2f96dcSApple OSS Distributions 
80*2c2f96dcSApple OSS Distributions static object_t * newObject();
81*2c2f96dcSApple OSS Distributions static void freeObject(object_t *o);
82*2c2f96dcSApple OSS Distributions 
83*2c2f96dcSApple OSS Distributions static OSObject *buildOSDictionary(object_t *);
84*2c2f96dcSApple OSS Distributions static OSObject *buildOSArray(object_t *);
85*2c2f96dcSApple OSS Distributions static OSObject *buildOSSet(object_t *);
86*2c2f96dcSApple OSS Distributions static OSObject *buildOSString(object_t *);
87*2c2f96dcSApple OSS Distributions static OSObject *buildOSData(object_t *);
88*2c2f96dcSApple OSS Distributions static OSObject *buildOSOffset(object_t *);
89*2c2f96dcSApple OSS Distributions static OSObject *buildOSBoolean(object_t *o);
90*2c2f96dcSApple OSS Distributions 
91*2c2f96dcSApple OSS Distributions static void rememberObject(int, object_t *);
92*2c2f96dcSApple OSS Distributions static OSObject *retrieveObject(int);
93*2c2f96dcSApple OSS Distributions 
94*2c2f96dcSApple OSS Distributions // temp variable to use during parsing
95*2c2f96dcSApple OSS Distributions static object_t *oo;
96*2c2f96dcSApple OSS Distributions 
97*2c2f96dcSApple OSS Distributions // resultant object of parsed text
98*2c2f96dcSApple OSS Distributions static OSObject	*parsedObject;
99*2c2f96dcSApple OSS Distributions 
100*2c2f96dcSApple OSS Distributions #define YYSTYPE object_t *
101*2c2f96dcSApple OSS Distributions 
102*2c2f96dcSApple OSS Distributions __BEGIN_DECLS
103*2c2f96dcSApple OSS Distributions #include <kern/kalloc.h>
104*2c2f96dcSApple OSS Distributions __END_DECLS
105*2c2f96dcSApple OSS Distributions 
106*2c2f96dcSApple OSS Distributions // Omit from static analysis.
107*2c2f96dcSApple OSS Distributions #ifndef __clang_analyzer__
108*2c2f96dcSApple OSS Distributions 
109*2c2f96dcSApple OSS Distributions #define malloc(size)         malloc_impl(size)
110*2c2f96dcSApple OSS Distributions #define malloc_type(type)    kalloc_type(type, Z_SET_NOTSHARED)
111*2c2f96dcSApple OSS Distributions static inline void *
malloc_impl(size_t size)112*2c2f96dcSApple OSS Distributions malloc_impl(size_t size)
113*2c2f96dcSApple OSS Distributions {
114*2c2f96dcSApple OSS Distributions 	if (size == 0) {
115*2c2f96dcSApple OSS Distributions 		return NULL;
116*2c2f96dcSApple OSS Distributions 	}
117*2c2f96dcSApple OSS Distributions 	return kalloc_data(size,
118*2c2f96dcSApple OSS Distributions 		Z_VM_TAG_BT(Z_WAITOK_ZERO, VM_KERN_MEMORY_LIBKERN));
119*2c2f96dcSApple OSS Distributions }
120*2c2f96dcSApple OSS Distributions 
121*2c2f96dcSApple OSS Distributions #define free(addr)             free_impl(addr)
122*2c2f96dcSApple OSS Distributions #define free_type(type, addr)  kfree_type(type, addr)
123*2c2f96dcSApple OSS Distributions static inline void
free_impl(void * addr)124*2c2f96dcSApple OSS Distributions free_impl(void *addr)
125*2c2f96dcSApple OSS Distributions {
126*2c2f96dcSApple OSS Distributions 	kfree_data_addr(addr);
127*2c2f96dcSApple OSS Distributions }
128*2c2f96dcSApple OSS Distributions static inline void
safe_free(void * addr,size_t size)129*2c2f96dcSApple OSS Distributions safe_free(void *addr, size_t size)
130*2c2f96dcSApple OSS Distributions {
131*2c2f96dcSApple OSS Distributions 	kfree_data(addr, size);
132*2c2f96dcSApple OSS Distributions }
133*2c2f96dcSApple OSS Distributions 
134*2c2f96dcSApple OSS Distributions #define realloc(addr, osize, nsize) realloc_impl(addr, osize, nsize)
135*2c2f96dcSApple OSS Distributions static inline void *
realloc_impl(void * addr,size_t osize,size_t nsize)136*2c2f96dcSApple OSS Distributions realloc_impl(void *addr, size_t osize, size_t nsize)
137*2c2f96dcSApple OSS Distributions {
138*2c2f96dcSApple OSS Distributions 	return krealloc_data(addr, osize, nsize,
139*2c2f96dcSApple OSS Distributions 		Z_VM_TAG_BT(Z_WAITOK_ZERO, VM_KERN_MEMORY_LIBKERN));
140*2c2f96dcSApple OSS Distributions }
141*2c2f96dcSApple OSS Distributions 
142*2c2f96dcSApple OSS Distributions %}
143*2c2f96dcSApple OSS Distributions %token NUMBER
144*2c2f96dcSApple OSS Distributions %token STRING
145*2c2f96dcSApple OSS Distributions %token DATA
146*2c2f96dcSApple OSS Distributions %token BOOLEAN
147*2c2f96dcSApple OSS Distributions %token SYNTAX_ERROR
148*2c2f96dcSApple OSS Distributions 
149*2c2f96dcSApple OSS Distributions %% /* Grammar rules and actions follow */
150*2c2f96dcSApple OSS Distributions 
151*2c2f96dcSApple OSS Distributions input:	  /* empty */		{ parsedObject = (OSObject *)NULL; YYACCEPT; }
152*2c2f96dcSApple OSS Distributions 	| object		{ parsedObject = (OSObject *)$1;   YYACCEPT; }
153*2c2f96dcSApple OSS Distributions 	| SYNTAX_ERROR		{ yyerror("syntax error");	   YYERROR; }
154*2c2f96dcSApple OSS Distributions 	;
155*2c2f96dcSApple OSS Distributions 
156*2c2f96dcSApple OSS Distributions object:	  dict			{ $$ = (object_t *)buildOSDictionary($1); }
157*2c2f96dcSApple OSS Distributions 	| array			{ $$ = (object_t *)buildOSArray($1); }
158*2c2f96dcSApple OSS Distributions 	| set			{ $$ = (object_t *)buildOSSet($1); }
159*2c2f96dcSApple OSS Distributions 	| string		{ $$ = (object_t *)buildOSString($1); }
160*2c2f96dcSApple OSS Distributions 	| data			{ $$ = (object_t *)buildOSData($1); }
161*2c2f96dcSApple OSS Distributions 	| offset		{ $$ = (object_t *)buildOSOffset($1); }
162*2c2f96dcSApple OSS Distributions 	| boolean		{ $$ = (object_t *)buildOSBoolean($1); }
163*2c2f96dcSApple OSS Distributions 	| '@' NUMBER		{ $$ = (object_t *)retrieveObject($2->u.offset);
164*2c2f96dcSApple OSS Distributions 				  if ($$) {
165*2c2f96dcSApple OSS Distributions 				    ((OSObject *)$$)->retain();
166*2c2f96dcSApple OSS Distributions 				  } else {
167*2c2f96dcSApple OSS Distributions 				    yyerror("forward reference detected");
168*2c2f96dcSApple OSS Distributions 				    YYERROR;
169*2c2f96dcSApple OSS Distributions 				  }
170*2c2f96dcSApple OSS Distributions 				  freeObject($2);
171*2c2f96dcSApple OSS Distributions 				}
172*2c2f96dcSApple OSS Distributions 	| object '@' NUMBER	{ $$ = $1;
173*2c2f96dcSApple OSS Distributions 				  rememberObject($3->u.offset, $1);
174*2c2f96dcSApple OSS Distributions 				  freeObject($3);
175*2c2f96dcSApple OSS Distributions 				}
176*2c2f96dcSApple OSS Distributions 	;
177*2c2f96dcSApple OSS Distributions 
178*2c2f96dcSApple OSS Distributions //------------------------------------------------------------------------------
179*2c2f96dcSApple OSS Distributions 
180*2c2f96dcSApple OSS Distributions dict:	  '{' '}'		{ $$ = NULL; }
181*2c2f96dcSApple OSS Distributions 	| '{' pairs '}'		{ $$ = $2; }
182*2c2f96dcSApple OSS Distributions 	;
183*2c2f96dcSApple OSS Distributions 
184*2c2f96dcSApple OSS Distributions pairs:	  pair
185*2c2f96dcSApple OSS Distributions 	| pairs pair		{ $2->next = $1; $1->prev = $2; $$ = $2; }
186*2c2f96dcSApple OSS Distributions 	;
187*2c2f96dcSApple OSS Distributions 
188*2c2f96dcSApple OSS Distributions pair:	  object '=' object ';'	{ $$ = newObject();
189*2c2f96dcSApple OSS Distributions 				  $$->next = NULL;
190*2c2f96dcSApple OSS Distributions 				  $$->prev = NULL;
191*2c2f96dcSApple OSS Distributions 				  $$->u.key = $1;
192*2c2f96dcSApple OSS Distributions 				  $$->object = $3;
193*2c2f96dcSApple OSS Distributions 				}
194*2c2f96dcSApple OSS Distributions 	;
195*2c2f96dcSApple OSS Distributions 
196*2c2f96dcSApple OSS Distributions //------------------------------------------------------------------------------
197*2c2f96dcSApple OSS Distributions 
198*2c2f96dcSApple OSS Distributions array:	  '(' ')'		{ $$ = NULL; }
199*2c2f96dcSApple OSS Distributions 	| '(' elements ')'	{ $$ = $2; }
200*2c2f96dcSApple OSS Distributions 	;
201*2c2f96dcSApple OSS Distributions 
202*2c2f96dcSApple OSS Distributions set:	  '[' ']'		{ $$ = NULL; }
203*2c2f96dcSApple OSS Distributions 	| '[' elements ']'	{ $$ = $2; }
204*2c2f96dcSApple OSS Distributions 	;
205*2c2f96dcSApple OSS Distributions 
206*2c2f96dcSApple OSS Distributions elements: object		{ $$ = newObject();
207*2c2f96dcSApple OSS Distributions 				  $$->object = $1;
208*2c2f96dcSApple OSS Distributions 				  $$->next = NULL;
209*2c2f96dcSApple OSS Distributions 				  $$->prev = NULL;
210*2c2f96dcSApple OSS Distributions 				}
211*2c2f96dcSApple OSS Distributions 	| elements ',' object	{ oo = newObject();
212*2c2f96dcSApple OSS Distributions 				  oo->object = $3;
213*2c2f96dcSApple OSS Distributions 				  oo->next = $1;
214*2c2f96dcSApple OSS Distributions 				  oo->prev = NULL;
215*2c2f96dcSApple OSS Distributions 				  $1->prev = oo;
216*2c2f96dcSApple OSS Distributions 				  $$ = oo;
217*2c2f96dcSApple OSS Distributions 				}
218*2c2f96dcSApple OSS Distributions 	;
219*2c2f96dcSApple OSS Distributions 
220*2c2f96dcSApple OSS Distributions //------------------------------------------------------------------------------
221*2c2f96dcSApple OSS Distributions 
222*2c2f96dcSApple OSS Distributions offset:	  NUMBER ':' NUMBER	{ $$ = $1;
223*2c2f96dcSApple OSS Distributions 				  $$->size = $3->u.offset;
224*2c2f96dcSApple OSS Distributions 				  freeObject($3);
225*2c2f96dcSApple OSS Distributions 				}
226*2c2f96dcSApple OSS Distributions 	;
227*2c2f96dcSApple OSS Distributions 
228*2c2f96dcSApple OSS Distributions //------------------------------------------------------------------------------
229*2c2f96dcSApple OSS Distributions 
230*2c2f96dcSApple OSS Distributions data:	  DATA
231*2c2f96dcSApple OSS Distributions 	;
232*2c2f96dcSApple OSS Distributions 
233*2c2f96dcSApple OSS Distributions //------------------------------------------------------------------------------
234*2c2f96dcSApple OSS Distributions 
235*2c2f96dcSApple OSS Distributions string:	  STRING
236*2c2f96dcSApple OSS Distributions 	;
237*2c2f96dcSApple OSS Distributions 
238*2c2f96dcSApple OSS Distributions //------------------------------------------------------------------------------
239*2c2f96dcSApple OSS Distributions 
240*2c2f96dcSApple OSS Distributions boolean:  BOOLEAN
241*2c2f96dcSApple OSS Distributions 	;
242*2c2f96dcSApple OSS Distributions 
243*2c2f96dcSApple OSS Distributions %%
244*2c2f96dcSApple OSS Distributions 
245*2c2f96dcSApple OSS Distributions static int		lineNumber = 0;
246*2c2f96dcSApple OSS Distributions static const char	*parseBuffer;
247*2c2f96dcSApple OSS Distributions static int		parseBufferIndex;
248*2c2f96dcSApple OSS Distributions 
249*2c2f96dcSApple OSS Distributions #define currentChar()	(parseBuffer[parseBufferIndex])
250*2c2f96dcSApple OSS Distributions #define nextChar()	(parseBuffer[++parseBufferIndex])
251*2c2f96dcSApple OSS Distributions #define prevChar()	(parseBuffer[parseBufferIndex - 1])
252*2c2f96dcSApple OSS Distributions 
253*2c2f96dcSApple OSS Distributions #define isSpace(c)	((c) == ' ' || (c) == '\t')
254*2c2f96dcSApple OSS Distributions #define isAlpha(c)	(((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z'))
255*2c2f96dcSApple OSS Distributions #define isDigit(c)	((c) >= '0' && (c) <= '9')
256*2c2f96dcSApple OSS Distributions #define isAlphaDigit(c)	((c) >= 'a' && (c) <= 'f')
257*2c2f96dcSApple OSS Distributions #define isHexDigit(c)	(isDigit(c) || isAlphaDigit(c))
258*2c2f96dcSApple OSS Distributions #define isAlphaNumeric(c) (isAlpha(c) || isDigit(c) || ((c) == '-'))
259*2c2f96dcSApple OSS Distributions 
260*2c2f96dcSApple OSS Distributions static char yyerror_message[128];
261*2c2f96dcSApple OSS Distributions 
262*2c2f96dcSApple OSS Distributions int
yyerror(const char * s)263*2c2f96dcSApple OSS Distributions yyerror(const char *s)  /* Called by yyparse on error */
264*2c2f96dcSApple OSS Distributions {
265*2c2f96dcSApple OSS Distributions 	snprintf(yyerror_message, sizeof(yyerror_message), "OSUnserialize: %s near line %d\n", s, lineNumber);
266*2c2f96dcSApple OSS Distributions 	return 0;
267*2c2f96dcSApple OSS Distributions }
268*2c2f96dcSApple OSS Distributions 
269*2c2f96dcSApple OSS Distributions int
yylex()270*2c2f96dcSApple OSS Distributions yylex()
271*2c2f96dcSApple OSS Distributions {
272*2c2f96dcSApple OSS Distributions 	int c;
273*2c2f96dcSApple OSS Distributions 
274*2c2f96dcSApple OSS Distributions 	if (parseBufferIndex == 0) lineNumber = 1;
275*2c2f96dcSApple OSS Distributions 
276*2c2f96dcSApple OSS Distributions  top:
277*2c2f96dcSApple OSS Distributions 	c = currentChar();
278*2c2f96dcSApple OSS Distributions 
279*2c2f96dcSApple OSS Distributions 	/* skip white space  */
280*2c2f96dcSApple OSS Distributions 	if (isSpace(c)) while ((c = nextChar()) != 0 && isSpace(c)) {};
281*2c2f96dcSApple OSS Distributions 
282*2c2f96dcSApple OSS Distributions 	/* skip over comments */
283*2c2f96dcSApple OSS Distributions 	if (c == '#') while ((c = nextChar()) != 0 && c != '\n') {};
284*2c2f96dcSApple OSS Distributions 
285*2c2f96dcSApple OSS Distributions 	/* keep track of line number, don't return \n's */
286*2c2f96dcSApple OSS Distributions 	if (c == '\n') {
287*2c2f96dcSApple OSS Distributions 		lineNumber++;
288*2c2f96dcSApple OSS Distributions 		(void)nextChar();
289*2c2f96dcSApple OSS Distributions 		goto top;
290*2c2f96dcSApple OSS Distributions 	}
291*2c2f96dcSApple OSS Distributions 
292*2c2f96dcSApple OSS Distributions 	/* parse boolean */
293*2c2f96dcSApple OSS Distributions 	if (c == '.') {
294*2c2f96dcSApple OSS Distributions 		bool boolean = false;
295*2c2f96dcSApple OSS Distributions 		if (nextChar() == 't') {
296*2c2f96dcSApple OSS Distributions 			if (nextChar() != 'r') return SYNTAX_ERROR;
297*2c2f96dcSApple OSS Distributions 			if (nextChar() != 'u') return SYNTAX_ERROR;
298*2c2f96dcSApple OSS Distributions 			if (nextChar() != 'e') return SYNTAX_ERROR;
299*2c2f96dcSApple OSS Distributions 			boolean = true;
300*2c2f96dcSApple OSS Distributions 		} else {
301*2c2f96dcSApple OSS Distributions 			if (currentChar() != 'f') return SYNTAX_ERROR;
302*2c2f96dcSApple OSS Distributions 			if (nextChar() != 'a') return SYNTAX_ERROR;
303*2c2f96dcSApple OSS Distributions 			if (nextChar() != 'l') return SYNTAX_ERROR;
304*2c2f96dcSApple OSS Distributions 			if (nextChar() != 's') return SYNTAX_ERROR;
305*2c2f96dcSApple OSS Distributions 			if (nextChar() != 'e') return SYNTAX_ERROR;
306*2c2f96dcSApple OSS Distributions 		}
307*2c2f96dcSApple OSS Distributions 		if (nextChar() != '.') return SYNTAX_ERROR;
308*2c2f96dcSApple OSS Distributions 		/* skip over dot */
309*2c2f96dcSApple OSS Distributions 		(void)nextChar();
310*2c2f96dcSApple OSS Distributions 
311*2c2f96dcSApple OSS Distributions 		yylval = (object_t *)boolean;
312*2c2f96dcSApple OSS Distributions 		return BOOLEAN;
313*2c2f96dcSApple OSS Distributions 	}
314*2c2f96dcSApple OSS Distributions 
315*2c2f96dcSApple OSS Distributions 	/* parse unquoted string */
316*2c2f96dcSApple OSS Distributions 	if (isAlpha(c)) {
317*2c2f96dcSApple OSS Distributions 		int start, length;
318*2c2f96dcSApple OSS Distributions 		char * tempString;
319*2c2f96dcSApple OSS Distributions 
320*2c2f96dcSApple OSS Distributions 		start = parseBufferIndex;
321*2c2f96dcSApple OSS Distributions 		/* find end of string */
322*2c2f96dcSApple OSS Distributions 		while (isAlphaNumeric(c)) {
323*2c2f96dcSApple OSS Distributions 			c = nextChar();
324*2c2f96dcSApple OSS Distributions 		}
325*2c2f96dcSApple OSS Distributions 		length = parseBufferIndex - start;
326*2c2f96dcSApple OSS Distributions 
327*2c2f96dcSApple OSS Distributions 		/* copy to null terminated buffer */
328*2c2f96dcSApple OSS Distributions 		tempString = (char *)malloc(length + 1);
329*2c2f96dcSApple OSS Distributions 		if (tempString == NULL) {
330*2c2f96dcSApple OSS Distributions 			printf("OSUnserialize: can't alloc temp memory\n");
331*2c2f96dcSApple OSS Distributions 			return 0;
332*2c2f96dcSApple OSS Distributions 		}
333*2c2f96dcSApple OSS Distributions 		bcopy(&parseBuffer[start], tempString, length);
334*2c2f96dcSApple OSS Distributions 		tempString[length] = 0;
335*2c2f96dcSApple OSS Distributions 		yylval = (object_t *)tempString;
336*2c2f96dcSApple OSS Distributions 		return STRING;
337*2c2f96dcSApple OSS Distributions 	}
338*2c2f96dcSApple OSS Distributions 
339*2c2f96dcSApple OSS Distributions 	/* parse quoted string */
340*2c2f96dcSApple OSS Distributions 	if (c == '"' || c == '\'') {
341*2c2f96dcSApple OSS Distributions 		int start, length;
342*2c2f96dcSApple OSS Distributions 		char * tempString;
343*2c2f96dcSApple OSS Distributions 		char quoteChar = c;
344*2c2f96dcSApple OSS Distributions 
345*2c2f96dcSApple OSS Distributions 		start = parseBufferIndex + 1;		// skip quote
346*2c2f96dcSApple OSS Distributions 		/* find end of string, line, buffer */
347*2c2f96dcSApple OSS Distributions 		while ((c = nextChar()) != quoteChar) {
348*2c2f96dcSApple OSS Distributions 			if (c == '\\') c = nextChar();
349*2c2f96dcSApple OSS Distributions 			if (c == '\n') lineNumber++;
350*2c2f96dcSApple OSS Distributions 			if (c == 0) return SYNTAX_ERROR;
351*2c2f96dcSApple OSS Distributions 		}
352*2c2f96dcSApple OSS Distributions 		length = parseBufferIndex - start;
353*2c2f96dcSApple OSS Distributions 		/* skip over trailing quote */
354*2c2f96dcSApple OSS Distributions 		(void)nextChar();
355*2c2f96dcSApple OSS Distributions 		/* copy to null terminated buffer */
356*2c2f96dcSApple OSS Distributions 		tempString = (char *)malloc(length + 1);
357*2c2f96dcSApple OSS Distributions 		if (tempString == NULL) {
358*2c2f96dcSApple OSS Distributions 			printf("OSUnserialize: can't alloc temp memory\n");
359*2c2f96dcSApple OSS Distributions 			return 0;
360*2c2f96dcSApple OSS Distributions 		}
361*2c2f96dcSApple OSS Distributions 
362*2c2f96dcSApple OSS Distributions 		int to = 0;
363*2c2f96dcSApple OSS Distributions 		for (int from=start; from < parseBufferIndex; from++) {
364*2c2f96dcSApple OSS Distributions 			// hack - skip over backslashes
365*2c2f96dcSApple OSS Distributions 			if (parseBuffer[from] == '\\') {
366*2c2f96dcSApple OSS Distributions 				length--;
367*2c2f96dcSApple OSS Distributions 				continue;
368*2c2f96dcSApple OSS Distributions 			}
369*2c2f96dcSApple OSS Distributions 			tempString[to] = parseBuffer[from];
370*2c2f96dcSApple OSS Distributions 			to++;
371*2c2f96dcSApple OSS Distributions 		}
372*2c2f96dcSApple OSS Distributions 		tempString[length] = 0;
373*2c2f96dcSApple OSS Distributions 		yylval = (object_t *)tempString;
374*2c2f96dcSApple OSS Distributions 		return STRING;
375*2c2f96dcSApple OSS Distributions 	}
376*2c2f96dcSApple OSS Distributions 
377*2c2f96dcSApple OSS Distributions 	/* process numbers */
378*2c2f96dcSApple OSS Distributions 	if (isDigit (c))
379*2c2f96dcSApple OSS Distributions 	{
380*2c2f96dcSApple OSS Distributions 		unsigned long long n = 0;
381*2c2f96dcSApple OSS Distributions 		int base = 10;
382*2c2f96dcSApple OSS Distributions 
383*2c2f96dcSApple OSS Distributions 		if (c == '0') {
384*2c2f96dcSApple OSS Distributions 			c = nextChar();
385*2c2f96dcSApple OSS Distributions 			if (c == 'x') {
386*2c2f96dcSApple OSS Distributions 				base = 16;
387*2c2f96dcSApple OSS Distributions 				c = nextChar();
388*2c2f96dcSApple OSS Distributions 			}
389*2c2f96dcSApple OSS Distributions 		}
390*2c2f96dcSApple OSS Distributions 		if (base == 10) {
391*2c2f96dcSApple OSS Distributions 			while(isDigit(c)) {
392*2c2f96dcSApple OSS Distributions 				n = (n * base + c - '0');
393*2c2f96dcSApple OSS Distributions 				c = nextChar();
394*2c2f96dcSApple OSS Distributions 			}
395*2c2f96dcSApple OSS Distributions 		} else {
396*2c2f96dcSApple OSS Distributions 			while(isHexDigit(c)) {
397*2c2f96dcSApple OSS Distributions 				if (isDigit(c)) {
398*2c2f96dcSApple OSS Distributions 					n = (n * base + c - '0');
399*2c2f96dcSApple OSS Distributions 				} else {
400*2c2f96dcSApple OSS Distributions 					n = (n * base + 0xa + c - 'a');
401*2c2f96dcSApple OSS Distributions 				}
402*2c2f96dcSApple OSS Distributions 				c = nextChar();
403*2c2f96dcSApple OSS Distributions 			}
404*2c2f96dcSApple OSS Distributions 		}
405*2c2f96dcSApple OSS Distributions 
406*2c2f96dcSApple OSS Distributions 		yylval = newObject();
407*2c2f96dcSApple OSS Distributions 		yylval->u.offset = n;
408*2c2f96dcSApple OSS Distributions 
409*2c2f96dcSApple OSS Distributions 		return NUMBER;
410*2c2f96dcSApple OSS Distributions 	}
411*2c2f96dcSApple OSS Distributions 
412*2c2f96dcSApple OSS Distributions #define OSDATA_ALLOC_SIZE 4096
413*2c2f96dcSApple OSS Distributions 
414*2c2f96dcSApple OSS Distributions 	/* process data */
415*2c2f96dcSApple OSS Distributions 	if (c == '<') {
416*2c2f96dcSApple OSS Distributions 		unsigned char *d, *start, *lastStart;
417*2c2f96dcSApple OSS Distributions 
418*2c2f96dcSApple OSS Distributions 		size_t buflen = OSDATA_ALLOC_SIZE;
419*2c2f96dcSApple OSS Distributions 		start = lastStart = d = (unsigned char *)malloc(buflen);
420*2c2f96dcSApple OSS Distributions 		c = nextChar();	// skip over '<'
421*2c2f96dcSApple OSS Distributions 		while (c != 0 && c != '>') {
422*2c2f96dcSApple OSS Distributions 
423*2c2f96dcSApple OSS Distributions 			if (isSpace(c)) while ((c = nextChar()) != 0 && isSpace(c)) {};
424*2c2f96dcSApple OSS Distributions 			if (c == '#') while ((c = nextChar()) != 0 && c != '\n') {};
425*2c2f96dcSApple OSS Distributions 			if (c == '\n') {
426*2c2f96dcSApple OSS Distributions 				lineNumber++;
427*2c2f96dcSApple OSS Distributions 				c = nextChar();
428*2c2f96dcSApple OSS Distributions 				continue;
429*2c2f96dcSApple OSS Distributions 			}
430*2c2f96dcSApple OSS Distributions 
431*2c2f96dcSApple OSS Distributions 			// get high nibble
432*2c2f96dcSApple OSS Distributions 			if (!isHexDigit(c)) break;
433*2c2f96dcSApple OSS Distributions 			if (isDigit(c)) {
434*2c2f96dcSApple OSS Distributions 				*d = (c - '0') << 4;
435*2c2f96dcSApple OSS Distributions 			} else {
436*2c2f96dcSApple OSS Distributions 				*d =  (0xa + (c - 'a')) << 4;
437*2c2f96dcSApple OSS Distributions 			}
438*2c2f96dcSApple OSS Distributions 
439*2c2f96dcSApple OSS Distributions 			// get low nibble
440*2c2f96dcSApple OSS Distributions 			c = nextChar();
441*2c2f96dcSApple OSS Distributions 			if (!isHexDigit(c)) break;
442*2c2f96dcSApple OSS Distributions 			if (isDigit(c)) {
443*2c2f96dcSApple OSS Distributions 				*d |= c - '0';
444*2c2f96dcSApple OSS Distributions 			} else {
445*2c2f96dcSApple OSS Distributions 				*d |= 0xa + (c - 'a');
446*2c2f96dcSApple OSS Distributions 			}
447*2c2f96dcSApple OSS Distributions 
448*2c2f96dcSApple OSS Distributions 			d++;
449*2c2f96dcSApple OSS Distributions 			if ((d - lastStart) >= OSDATA_ALLOC_SIZE) {
450*2c2f96dcSApple OSS Distributions 				int oldsize = d - start;
451*2c2f96dcSApple OSS Distributions 				assert(buflen == oldsize);
452*2c2f96dcSApple OSS Distributions 				start = (unsigned char *)realloc(start, oldsize, buflen);
453*2c2f96dcSApple OSS Distributions 				d = lastStart = start + oldsize;
454*2c2f96dcSApple OSS Distributions 			}
455*2c2f96dcSApple OSS Distributions 			c = nextChar();
456*2c2f96dcSApple OSS Distributions 		}
457*2c2f96dcSApple OSS Distributions 		if (c != '>' ) {
458*2c2f96dcSApple OSS Distributions 			safe_free(start, buflen);
459*2c2f96dcSApple OSS Distributions 			return SYNTAX_ERROR;
460*2c2f96dcSApple OSS Distributions 		}
461*2c2f96dcSApple OSS Distributions 
462*2c2f96dcSApple OSS Distributions 		// got it!
463*2c2f96dcSApple OSS Distributions 		yylval = newObject();
464*2c2f96dcSApple OSS Distributions 		yylval->object = start;
465*2c2f96dcSApple OSS Distributions 		yylval->size = d - start;
466*2c2f96dcSApple OSS Distributions 
467*2c2f96dcSApple OSS Distributions 		(void)nextChar();	// skip over '>'
468*2c2f96dcSApple OSS Distributions 		return DATA;
469*2c2f96dcSApple OSS Distributions 	}
470*2c2f96dcSApple OSS Distributions 
471*2c2f96dcSApple OSS Distributions 
472*2c2f96dcSApple OSS Distributions 	/* return single chars, move pointer to next char */
473*2c2f96dcSApple OSS Distributions 	(void)nextChar();
474*2c2f96dcSApple OSS Distributions 	return c;
475*2c2f96dcSApple OSS Distributions }
476*2c2f96dcSApple OSS Distributions 
477*2c2f96dcSApple OSS Distributions // !@$&)(^Q$&*^!$(*!@$_(^%_(*Q#$(_*&!$_(*&!$_(*&!#$(*!@&^!@#%!_!#
478*2c2f96dcSApple OSS Distributions // !@$&)(^Q$&*^!$(*!@$_(^%_(*Q#$(_*&!$_(*&!$_(*&!#$(*!@&^!@#%!_!#
479*2c2f96dcSApple OSS Distributions // !@$&)(^Q$&*^!$(*!@$_(^%_(*Q#$(_*&!$_(*&!$_(*&!#$(*!@&^!@#%!_!#
480*2c2f96dcSApple OSS Distributions 
481*2c2f96dcSApple OSS Distributions #if DEBUG
482*2c2f96dcSApple OSS Distributions int debugUnserializeAllocCount = 0;
483*2c2f96dcSApple OSS Distributions #endif
484*2c2f96dcSApple OSS Distributions 
485*2c2f96dcSApple OSS Distributions object_t *
newObject()486*2c2f96dcSApple OSS Distributions newObject()
487*2c2f96dcSApple OSS Distributions {
488*2c2f96dcSApple OSS Distributions #if DEBUG
489*2c2f96dcSApple OSS Distributions 	debugUnserializeAllocCount++;
490*2c2f96dcSApple OSS Distributions #endif
491*2c2f96dcSApple OSS Distributions 	return malloc_type(object_t);
492*2c2f96dcSApple OSS Distributions }
493*2c2f96dcSApple OSS Distributions 
494*2c2f96dcSApple OSS Distributions void
freeObject(object_t * o)495*2c2f96dcSApple OSS Distributions freeObject(object_t *o)
496*2c2f96dcSApple OSS Distributions {
497*2c2f96dcSApple OSS Distributions #if DEBUG
498*2c2f96dcSApple OSS Distributions 	debugUnserializeAllocCount--;
499*2c2f96dcSApple OSS Distributions #endif
500*2c2f96dcSApple OSS Distributions 	free_type(object_t, o);
501*2c2f96dcSApple OSS Distributions }
502*2c2f96dcSApple OSS Distributions 
503*2c2f96dcSApple OSS Distributions static OSDictionary *tags;
504*2c2f96dcSApple OSS Distributions 
505*2c2f96dcSApple OSS Distributions static void
rememberObject(int tag,object_t * o)506*2c2f96dcSApple OSS Distributions rememberObject(int tag, object_t *o)
507*2c2f96dcSApple OSS Distributions {
508*2c2f96dcSApple OSS Distributions 	char key[16];
509*2c2f96dcSApple OSS Distributions 	snprintf(key, sizeof(key), "%u", tag);
510*2c2f96dcSApple OSS Distributions 
511*2c2f96dcSApple OSS Distributions 	tags->setObject(key, (OSObject *)o);
512*2c2f96dcSApple OSS Distributions }
513*2c2f96dcSApple OSS Distributions 
514*2c2f96dcSApple OSS Distributions static OSObject *
retrieveObject(int tag)515*2c2f96dcSApple OSS Distributions retrieveObject(int tag)
516*2c2f96dcSApple OSS Distributions {
517*2c2f96dcSApple OSS Distributions 	char key[16];
518*2c2f96dcSApple OSS Distributions 	snprintf(key, sizeof(key), "%u", tag);
519*2c2f96dcSApple OSS Distributions 
520*2c2f96dcSApple OSS Distributions 	return tags->getObject(key);
521*2c2f96dcSApple OSS Distributions }
522*2c2f96dcSApple OSS Distributions 
523*2c2f96dcSApple OSS Distributions OSObject *
buildOSDictionary(object_t * o)524*2c2f96dcSApple OSS Distributions buildOSDictionary(object_t *o)
525*2c2f96dcSApple OSS Distributions {
526*2c2f96dcSApple OSS Distributions 	object_t *temp, *last = o;
527*2c2f96dcSApple OSS Distributions 	int count = 0;
528*2c2f96dcSApple OSS Distributions 
529*2c2f96dcSApple OSS Distributions 	// get count and last object
530*2c2f96dcSApple OSS Distributions 	while (o) {
531*2c2f96dcSApple OSS Distributions 		count++;
532*2c2f96dcSApple OSS Distributions 		last = o;
533*2c2f96dcSApple OSS Distributions 		o = o->next;
534*2c2f96dcSApple OSS Distributions 	}
535*2c2f96dcSApple OSS Distributions 	o = last;
536*2c2f96dcSApple OSS Distributions 
537*2c2f96dcSApple OSS Distributions 	OSDictionary *d = OSDictionary::withCapacity(count);
538*2c2f96dcSApple OSS Distributions 
539*2c2f96dcSApple OSS Distributions 	while (o) {
540*2c2f96dcSApple OSS Distributions #ifdef metaclass_stuff_worksXXX
541*2c2f96dcSApple OSS Distributions 		if (((OSObject *)o->u.key)->metaCast("OSSymbol")) {
542*2c2f96dcSApple OSS Distributions 			// XXX the evil frontdoor
543*2c2f96dcSApple OSS Distributions 			d->setObject((OSSymbol *)o->u.key, (OSObject *)o->object);
544*2c2f96dcSApple OSS Distributions 		} else {
545*2c2f96dcSApple OSS Distributions                         // If it isn't a symbol, I hope it's a string!
546*2c2f96dcSApple OSS Distributions 			d->setObject((OSString *)o->u.key, (OSObject *)o->object);
547*2c2f96dcSApple OSS Distributions 		}
548*2c2f96dcSApple OSS Distributions #else
549*2c2f96dcSApple OSS Distributions 		d->setObject((OSString *)o->u.key, (OSObject *)o->object);
550*2c2f96dcSApple OSS Distributions #endif
551*2c2f96dcSApple OSS Distributions 		((OSObject *)o->object)->release();
552*2c2f96dcSApple OSS Distributions 		((OSObject *)o->u.key)->release();
553*2c2f96dcSApple OSS Distributions 		temp = o;
554*2c2f96dcSApple OSS Distributions 		o = o->prev;
555*2c2f96dcSApple OSS Distributions 		freeObject(temp);
556*2c2f96dcSApple OSS Distributions 	}
557*2c2f96dcSApple OSS Distributions 	return d;
558*2c2f96dcSApple OSS Distributions };
559*2c2f96dcSApple OSS Distributions 
560*2c2f96dcSApple OSS Distributions OSObject *
buildOSArray(object_t * o)561*2c2f96dcSApple OSS Distributions buildOSArray(object_t *o)
562*2c2f96dcSApple OSS Distributions {
563*2c2f96dcSApple OSS Distributions 	object_t *temp, *last = o;
564*2c2f96dcSApple OSS Distributions 	int count = 0;
565*2c2f96dcSApple OSS Distributions 
566*2c2f96dcSApple OSS Distributions 	// get count and last object
567*2c2f96dcSApple OSS Distributions 	while (o) {
568*2c2f96dcSApple OSS Distributions 		count++;
569*2c2f96dcSApple OSS Distributions 		last = o;
570*2c2f96dcSApple OSS Distributions 		o = o->next;
571*2c2f96dcSApple OSS Distributions 	}
572*2c2f96dcSApple OSS Distributions 	o = last;
573*2c2f96dcSApple OSS Distributions 
574*2c2f96dcSApple OSS Distributions 	OSArray *a = OSArray::withCapacity(count);
575*2c2f96dcSApple OSS Distributions 
576*2c2f96dcSApple OSS Distributions 	while (o) {
577*2c2f96dcSApple OSS Distributions 		a->setObject((OSObject *)o->object);
578*2c2f96dcSApple OSS Distributions 		((OSObject *)o->object)->release();
579*2c2f96dcSApple OSS Distributions 		temp = o;
580*2c2f96dcSApple OSS Distributions 		o = o->prev;
581*2c2f96dcSApple OSS Distributions 		freeObject(temp);
582*2c2f96dcSApple OSS Distributions 	}
583*2c2f96dcSApple OSS Distributions 	return a;
584*2c2f96dcSApple OSS Distributions };
585*2c2f96dcSApple OSS Distributions 
586*2c2f96dcSApple OSS Distributions OSObject *
buildOSSet(object_t * o)587*2c2f96dcSApple OSS Distributions buildOSSet(object_t *o)
588*2c2f96dcSApple OSS Distributions {
589*2c2f96dcSApple OSS Distributions 	OSArray *a = (OSArray *)buildOSArray(o);
590*2c2f96dcSApple OSS Distributions 	OSSet *s = OSSet::withArray(a, a->getCapacity());
591*2c2f96dcSApple OSS Distributions 
592*2c2f96dcSApple OSS Distributions 	a->release();
593*2c2f96dcSApple OSS Distributions 	return s;
594*2c2f96dcSApple OSS Distributions };
595*2c2f96dcSApple OSS Distributions 
596*2c2f96dcSApple OSS Distributions OSObject *
buildOSString(object_t * o)597*2c2f96dcSApple OSS Distributions buildOSString(object_t *o)
598*2c2f96dcSApple OSS Distributions {
599*2c2f96dcSApple OSS Distributions 	OSString *s = OSString::withCString((char *)o);
600*2c2f96dcSApple OSS Distributions 
601*2c2f96dcSApple OSS Distributions 	safe_free(o, strlen((char *)o) + 1);
602*2c2f96dcSApple OSS Distributions 
603*2c2f96dcSApple OSS Distributions 	return s;
604*2c2f96dcSApple OSS Distributions };
605*2c2f96dcSApple OSS Distributions 
606*2c2f96dcSApple OSS Distributions OSObject *
buildOSData(object_t * o)607*2c2f96dcSApple OSS Distributions buildOSData(object_t *o)
608*2c2f96dcSApple OSS Distributions {
609*2c2f96dcSApple OSS Distributions 	OSData *d;
610*2c2f96dcSApple OSS Distributions 
611*2c2f96dcSApple OSS Distributions 	if (o->size) {
612*2c2f96dcSApple OSS Distributions 		d = OSData::withBytes(o->object, o->size);
613*2c2f96dcSApple OSS Distributions 	} else {
614*2c2f96dcSApple OSS Distributions 		d = OSData::withCapacity(0);
615*2c2f96dcSApple OSS Distributions 	}
616*2c2f96dcSApple OSS Distributions 	safe_free(o->object, o->size);
617*2c2f96dcSApple OSS Distributions 	freeObject(o);
618*2c2f96dcSApple OSS Distributions 	return d;
619*2c2f96dcSApple OSS Distributions };
620*2c2f96dcSApple OSS Distributions 
621*2c2f96dcSApple OSS Distributions OSObject *
buildOSOffset(object_t * o)622*2c2f96dcSApple OSS Distributions buildOSOffset(object_t *o)
623*2c2f96dcSApple OSS Distributions {
624*2c2f96dcSApple OSS Distributions 	OSNumber *off = OSNumber::withNumber(o->u.offset, o->size);
625*2c2f96dcSApple OSS Distributions 	freeObject(o);
626*2c2f96dcSApple OSS Distributions 	return off;
627*2c2f96dcSApple OSS Distributions };
628*2c2f96dcSApple OSS Distributions 
629*2c2f96dcSApple OSS Distributions OSObject *
buildOSBoolean(object_t * o)630*2c2f96dcSApple OSS Distributions buildOSBoolean(object_t *o)
631*2c2f96dcSApple OSS Distributions {
632*2c2f96dcSApple OSS Distributions 	OSBoolean *b = OSBoolean::withBoolean((bool)o);
633*2c2f96dcSApple OSS Distributions 	return b;
634*2c2f96dcSApple OSS Distributions };
635*2c2f96dcSApple OSS Distributions 
636*2c2f96dcSApple OSS Distributions __BEGIN_DECLS
637*2c2f96dcSApple OSS Distributions #include <kern/locks.h>
638*2c2f96dcSApple OSS Distributions __END_DECLS
639*2c2f96dcSApple OSS Distributions 
640*2c2f96dcSApple OSS Distributions static lck_mtx_t *lock = 0;
641*2c2f96dcSApple OSS Distributions extern lck_grp_t *IOLockGroup;
642*2c2f96dcSApple OSS Distributions 
643*2c2f96dcSApple OSS Distributions OSObject*
OSUnserialize(const char * buffer,OSString ** errorString)644*2c2f96dcSApple OSS Distributions OSUnserialize(const char *buffer, OSString **errorString)
645*2c2f96dcSApple OSS Distributions {
646*2c2f96dcSApple OSS Distributions 	OSObject *object;
647*2c2f96dcSApple OSS Distributions 
648*2c2f96dcSApple OSS Distributions 	if (!lock) {
649*2c2f96dcSApple OSS Distributions 		lock = lck_mtx_alloc_init(IOLockGroup, LCK_ATTR_NULL);
650*2c2f96dcSApple OSS Distributions 		lck_mtx_lock(lock);
651*2c2f96dcSApple OSS Distributions 	} else {
652*2c2f96dcSApple OSS Distributions 		lck_mtx_lock(lock);
653*2c2f96dcSApple OSS Distributions 
654*2c2f96dcSApple OSS Distributions 	}
655*2c2f96dcSApple OSS Distributions 
656*2c2f96dcSApple OSS Distributions #if DEBUG
657*2c2f96dcSApple OSS Distributions 	debugUnserializeAllocCount = 0;
658*2c2f96dcSApple OSS Distributions #endif
659*2c2f96dcSApple OSS Distributions 	yyerror_message[0] = 0;	//just in case
660*2c2f96dcSApple OSS Distributions 	parseBuffer = buffer;
661*2c2f96dcSApple OSS Distributions 	parseBufferIndex = 0;
662*2c2f96dcSApple OSS Distributions 	tags = OSDictionary::withCapacity(128);
663*2c2f96dcSApple OSS Distributions 	if (yyparse() == 0) {
664*2c2f96dcSApple OSS Distributions 		object = parsedObject;
665*2c2f96dcSApple OSS Distributions 		if (errorString) *errorString = NULL;
666*2c2f96dcSApple OSS Distributions 	} else {
667*2c2f96dcSApple OSS Distributions 		object = NULL;
668*2c2f96dcSApple OSS Distributions 		if (errorString)
669*2c2f96dcSApple OSS Distributions 			*errorString = OSString::withCString(yyerror_message);
670*2c2f96dcSApple OSS Distributions 	}
671*2c2f96dcSApple OSS Distributions 
672*2c2f96dcSApple OSS Distributions 	tags->release();
673*2c2f96dcSApple OSS Distributions #if DEBUG
674*2c2f96dcSApple OSS Distributions 	if (debugUnserializeAllocCount) {
675*2c2f96dcSApple OSS Distributions 		printf("OSUnserialize: allocation check failed, count = %d.\n",
676*2c2f96dcSApple OSS Distributions 		       debugUnserializeAllocCount);
677*2c2f96dcSApple OSS Distributions 	}
678*2c2f96dcSApple OSS Distributions #endif
679*2c2f96dcSApple OSS Distributions 	lck_mtx_unlock(lock);
680*2c2f96dcSApple OSS Distributions 
681*2c2f96dcSApple OSS Distributions 	return object;
682*2c2f96dcSApple OSS Distributions }
683*2c2f96dcSApple OSS Distributions 
684*2c2f96dcSApple OSS Distributions #endif // not __clang_analyzer__
685*2c2f96dcSApple OSS Distributions 
686*2c2f96dcSApple OSS Distributions 
687*2c2f96dcSApple OSS Distributions //
688*2c2f96dcSApple OSS Distributions //
689*2c2f96dcSApple OSS Distributions //
690*2c2f96dcSApple OSS Distributions //
691*2c2f96dcSApple OSS Distributions //
692*2c2f96dcSApple OSS Distributions //		 DO NOT EDIT OSUnserialize.cpp!
693*2c2f96dcSApple OSS Distributions //
694*2c2f96dcSApple OSS Distributions //			this means you!
695*2c2f96dcSApple OSS Distributions //
696*2c2f96dcSApple OSS Distributions //
697*2c2f96dcSApple OSS Distributions //
698*2c2f96dcSApple OSS Distributions //
699*2c2f96dcSApple OSS Distributions //
700