Annotation of XNU/libkern/c++/OSUnserialize.cpp, revision 1.1.1.1

1.1       root        1: 
                      2: /*  A Bison parser, made from OSUnserialize.y
                      3:     by GNU Bison version 1.28  */
                      4: 
                      5: #define YYBISON 1  /* Identify Bison output.  */
                      6: 
                      7: #define yyparse OSUnserializeparse
                      8: #define yylex OSUnserializelex
                      9: #define yyerror OSUnserializeerror
                     10: #define yylval OSUnserializelval
                     11: #define yychar OSUnserializechar
                     12: #define yydebug OSUnserializedebug
                     13: #define yynerrs OSUnserializenerrs
                     14: #define        NUMBER  257
                     15: #define        STRING  258
                     16: #define        DATA    259
                     17: #define        BOOLEAN 260
                     18: #define        SYNTAX_ERROR    261
                     19: 
                     20: #line 53 "OSUnserialize.y"
                     21: 
                     22: #include <libkern/c++/OSMetaClass.h>
                     23: #include <libkern/c++/OSContainers.h>
                     24: #include <libkern/c++/OSLib.h>
                     25: 
                     26: typedef        struct object {
                     27:        struct object   *next;
                     28:        struct object   *prev;
                     29:        void            *object;
                     30:        int             size;           // for data
                     31:        union {
                     32:                void    *key;           // for dictionary
                     33:                long long offset;       // for offset
                     34:        } u;
                     35: 
                     36: } object_t;
                     37: 
                     38: static int yyparse();
                     39: static int yyerror(char *s);
                     40: static int yylex();
                     41: 
                     42: static object_t * newObject();
                     43: static void freeObject(object_t *o);
                     44: 
                     45: static OSObject *buildOSDictionary(object_t *);
                     46: static OSObject *buildOSArray(object_t *);
                     47: static OSObject *buildOSSet(object_t *);
                     48: static OSObject *buildOSString(object_t *);
                     49: static OSObject *buildOSData(object_t *);
                     50: static OSObject *buildOSOffset(object_t *);
                     51: static OSObject *buildOSBoolean(object_t *o);
                     52: 
                     53: static void rememberObject(int, object_t *);
                     54: static OSObject *retrieveObject(int);
                     55: 
                     56: // temp variable to use during parsing
                     57: static object_t *o;
                     58: 
                     59: // resultant object of parsed text
                     60: static OSObject        *parsedObject;
                     61: 
                     62: #define YYSTYPE object_t *
                     63: 
                     64: extern "C" {
                     65: extern void *kern_os_malloc(size_t size);
                     66: extern void *kern_os_realloc(void * addr, size_t size);
                     67: extern void kern_os_free(void * addr);
                     68: } /* extern "C" */
                     69: 
                     70: #define malloc(s) kern_os_malloc(s)
                     71: #define realloc(a, s) kern_os_realloc(a, s)
                     72: #define free(a) kern_os_free(a)
                     73: 
                     74: #ifndef YYSTYPE
                     75: #define YYSTYPE int
                     76: #endif
                     77: #include <stddef.h>
                     78: 
                     79: #ifndef __cplusplus
                     80: #ifndef __STDC__
                     81: #define const
                     82: #endif
                     83: #endif
                     84: 
                     85: 
                     86: 
                     87: #define        YYFINAL         43
                     88: #define        YYFLAG          -32768
                     89: #define        YYNTBASE        19
                     90: 
                     91: #define YYTRANSLATE(x) ((unsigned)(x) <= 261 ? yytranslate[x] : 31)
                     92: 
                     93: static const char yytranslate[] = {     0,
                     94:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                     95:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                     96:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                     97:      2,     2,     2,     2,     2,     2,     2,     2,     2,    13,
                     98:     14,     2,     2,    17,     2,     2,     2,     2,     2,     2,
                     99:      2,     2,     2,     2,     2,     2,     2,    18,    12,     2,
                    100:     11,     2,     2,     8,     2,     2,     2,     2,     2,     2,
                    101:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    102:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    103:     15,     2,    16,     2,     2,     2,     2,     2,     2,     2,
                    104:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    105:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    106:      2,     2,     9,     2,    10,     2,     2,     2,     2,     2,
                    107:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    108:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    109:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    110:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    111:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    112:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    113:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    114:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    115:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    116:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    117:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    118:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    119:      2,     2,     2,     2,     2,     1,     3,     4,     5,     6,
                    120:      7
                    121: };
                    122: 
                    123: #if YYDEBUG != 0
                    124: static const short yyprhs[] = {     0,
                    125:      0,     1,     3,     5,     7,     9,    11,    13,    15,    17,
                    126:     19,    22,    26,    29,    33,    35,    38,    43,    46,    50,
                    127:     53,    57,    59,    63,    67,    69,    71
                    128: };
                    129: 
                    130: static const short yyrhs[] = {    -1,
                    131:     20,     0,     7,     0,    21,     0,    24,     0,    25,     0,
                    132:     29,     0,    28,     0,    27,     0,    30,     0,     8,     3,
                    133:      0,    20,     8,     3,     0,     9,    10,     0,     9,    22,
                    134:     10,     0,    23,     0,    22,    23,     0,    20,    11,    20,
                    135:     12,     0,    13,    14,     0,    13,    26,    14,     0,    15,
                    136:     16,     0,    15,    26,    16,     0,    20,     0,    26,    17,
                    137:     20,     0,     3,    18,     3,     0,     5,     0,     4,     0,
                    138:      6,     0
                    139: };
                    140: 
                    141: #endif
                    142: 
                    143: #if YYDEBUG != 0
                    144: static const short yyrline[] = { 0,
                    145:    115,   116,   117,   120,   121,   122,   123,   124,   125,   126,
                    146:    127,   136,   144,   145,   148,   149,   152,   162,   163,   166,
                    147:    167,   170,   175,   186,   194,   199,   204
                    148: };
                    149: #endif
                    150: 
                    151: 
                    152: #if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
                    153: 
                    154: static const char * const yytname[] = {   "$","error","$undefined.","NUMBER",
                    155: "STRING","DATA","BOOLEAN","SYNTAX_ERROR","'@'","'{'","'}'","'='","';'","'('",
                    156: "')'","'['","']'","','","':'","input","object","dict","pairs","pair","array",
                    157: "set","elements","offset","data","string","boolean", NULL
                    158: };
                    159: #endif
                    160: 
                    161: static const short yyr1[] = {     0,
                    162:     19,    19,    19,    20,    20,    20,    20,    20,    20,    20,
                    163:     20,    20,    21,    21,    22,    22,    23,    24,    24,    25,
                    164:     25,    26,    26,    27,    28,    29,    30
                    165: };
                    166: 
                    167: static const short yyr2[] = {     0,
                    168:      0,     1,     1,     1,     1,     1,     1,     1,     1,     1,
                    169:      2,     3,     2,     3,     1,     2,     4,     2,     3,     2,
                    170:      3,     1,     3,     3,     1,     1,     1
                    171: };
                    172: 
                    173: static const short yydefact[] = {     1,
                    174:      0,    26,    25,    27,     3,     0,     0,     0,     0,     2,
                    175:      4,     5,     6,     9,     8,     7,    10,     0,    11,    13,
                    176:      0,     0,    15,    18,    22,     0,    20,     0,     0,    24,
                    177:      0,    14,    16,    19,     0,    21,    12,     0,    23,    17,
                    178:      0,     0,     0
                    179: };
                    180: 
                    181: static const short yydefgoto[] = {    41,
                    182:     21,    11,    22,    23,    12,    13,    26,    14,    15,    16,
                    183:     17
                    184: };
                    185: 
                    186: static const short yypact[] = {    12,
                    187:    -13,-32768,-32768,-32768,-32768,     9,    33,    46,    -2,     2,
                    188: -32768,-32768,-32768,-32768,-32768,-32768,-32768,    25,-32768,-32768,
                    189:     21,    59,-32768,-32768,     2,    16,-32768,     7,    31,-32768,
                    190:     72,-32768,-32768,-32768,    72,-32768,-32768,    14,     2,-32768,
                    191:     40,    44,-32768
                    192: };
                    193: 
                    194: static const short yypgoto[] = {-32768,
                    195:      0,-32768,-32768,    23,-32768,-32768,    38,-32768,-32768,-32768,
                    196: -32768
                    197: };
                    198: 
                    199: 
                    200: #define        YYLAST          87
                    201: 
                    202: 
                    203: static const short yytable[] = {    10,
                    204:      1,     2,     3,     4,    18,     6,     7,    25,    25,    29,
                    205:      8,    19,     9,    27,     1,     2,     3,     4,     5,     6,
                    206:      7,    29,    36,    35,     8,    40,     9,    30,    29,    34,
                    207:     38,    31,    35,    37,    39,     1,     2,     3,     4,    42,
                    208:      6,     7,    20,    43,    33,     8,    28,     9,     1,     2,
                    209:      3,     4,     0,     6,     7,     0,     0,     0,     8,    24,
                    210:      9,     1,     2,     3,     4,     0,     6,     7,    32,     0,
                    211:      0,     8,     0,     9,     1,     2,     3,     4,     0,     6,
                    212:      7,     0,     0,     0,     8,     0,     9
                    213: };
                    214: 
                    215: static const short yycheck[] = {     0,
                    216:      3,     4,     5,     6,    18,     8,     9,     8,     9,     8,
                    217:     13,     3,    15,    16,     3,     4,     5,     6,     7,     8,
                    218:      9,     8,    16,    17,    13,    12,    15,     3,     8,    14,
                    219:     31,    11,    17,     3,    35,     3,     4,     5,     6,     0,
                    220:      8,     9,    10,     0,    22,    13,     9,    15,     3,     4,
                    221:      5,     6,    -1,     8,     9,    -1,    -1,    -1,    13,    14,
                    222:     15,     3,     4,     5,     6,    -1,     8,     9,    10,    -1,
                    223:     -1,    13,    -1,    15,     3,     4,     5,     6,    -1,     8,
                    224:      9,    -1,    -1,    -1,    13,    -1,    15
                    225: };
                    226: /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
                    227: #line 3 "/usr/share/bison.simple"
                    228: /* This file comes from bison-1.28.  */
                    229: 
                    230: /* Skeleton output parser for bison,
                    231:    Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
                    232: 
                    233:    This program is free software; you can redistribute it and/or modify
                    234:    it under the terms of the GNU General Public License as published by
                    235:    the Free Software Foundation; either version 2, or (at your option)
                    236:    any later version.
                    237: 
                    238:    This program is distributed in the hope that it will be useful,
                    239:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                    240:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                    241:    GNU General Public License for more details.
                    242: 
                    243:    You should have received a copy of the GNU General Public License
                    244:    along with this program; if not, write to the Free Software
                    245:    Foundation, Inc., 59 Temple Place - Suite 330,
                    246:    Boston, MA 02111-1307, USA.  */
                    247: 
                    248: /* As a special exception, when this file is copied by Bison into a
                    249:    Bison output file, you may use that output file without restriction.
                    250:    This special exception was added by the Free Software Foundation
                    251:    in version 1.24 of Bison.  */
                    252: 
                    253: /* This is the parser code that is written into each bison parser
                    254:   when the %semantic_parser declaration is not specified in the grammar.
                    255:   It was written by Richard Stallman by simplifying the hairy parser
                    256:   used when %semantic_parser is specified.  */
                    257: 
                    258: #ifndef YYSTACK_USE_ALLOCA
                    259: #ifdef alloca
                    260: #define YYSTACK_USE_ALLOCA
                    261: #else /* alloca not defined */
                    262: #ifdef __GNUC__
                    263: #define YYSTACK_USE_ALLOCA
                    264: #define alloca __builtin_alloca
                    265: #else /* not GNU C.  */
                    266: #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
                    267: #define YYSTACK_USE_ALLOCA
                    268: #include <alloca.h>
                    269: #else /* not sparc */
                    270: /* We think this test detects Watcom and Microsoft C.  */
                    271: /* This used to test MSDOS, but that is a bad idea
                    272:    since that symbol is in the user namespace.  */
                    273: #if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
                    274: #if 0 /* No need for malloc.h, which pollutes the namespace;
                    275:         instead, just don't use alloca.  */
                    276: #include <malloc.h>
                    277: #endif
                    278: #else /* not MSDOS, or __TURBOC__ */
                    279: #if defined(_AIX)
                    280: /* I don't know what this was needed for, but it pollutes the namespace.
                    281:    So I turned it off.   rms, 2 May 1997.  */
                    282: /* #include <malloc.h>  */
                    283:  #pragma alloca
                    284: #define YYSTACK_USE_ALLOCA
                    285: #else /* not MSDOS, or __TURBOC__, or _AIX */
                    286: #if 0
                    287: #ifdef __hpux /* [email protected] says this works for HPUX 9.05 and up,
                    288:                 and on HPUX 10.  Eventually we can turn this on.  */
                    289: #define YYSTACK_USE_ALLOCA
                    290: #define alloca __builtin_alloca
                    291: #endif /* __hpux */
                    292: #endif
                    293: #endif /* not _AIX */
                    294: #endif /* not MSDOS, or __TURBOC__ */
                    295: #endif /* not sparc */
                    296: #endif /* not GNU C */
                    297: #endif /* alloca not defined */
                    298: #endif /* YYSTACK_USE_ALLOCA not defined */
                    299: 
                    300: #ifdef YYSTACK_USE_ALLOCA
                    301: #define YYSTACK_ALLOC alloca
                    302: #else
                    303: #define YYSTACK_ALLOC malloc
                    304: #endif
                    305: 
                    306: /* Note: there must be only one dollar sign in this file.
                    307:    It is replaced by the list of actions, each action
                    308:    as one case of the switch.  */
                    309: 
                    310: #define yyerrok                (yyerrstatus = 0)
                    311: #define yyclearin      (yychar = YYEMPTY)
                    312: #define YYEMPTY                -2
                    313: #define YYEOF          0
                    314: #define YYACCEPT       goto yyacceptlab
                    315: #define YYABORT        goto yyabortlab
                    316: #define YYERROR                goto yyerrlab1
                    317: /* Like YYERROR except do call yyerror.
                    318:    This remains here temporarily to ease the
                    319:    transition to the new meaning of YYERROR, for GCC.
                    320:    Once GCC version 2 has supplanted version 1, this can go.  */
                    321: #define YYFAIL         goto yyerrlab
                    322: #define YYRECOVERING()  (!!yyerrstatus)
                    323: #define YYBACKUP(token, value) \
                    324: do                                                             \
                    325:   if (yychar == YYEMPTY && yylen == 1)                         \
                    326:     { yychar = (token), yylval = (value);                      \
                    327:       yychar1 = YYTRANSLATE (yychar);                          \
                    328:       YYPOPSTACK;                                              \
                    329:       goto yybackup;                                           \
                    330:     }                                                          \
                    331:   else                                                         \
                    332:     { yyerror ("syntax error: cannot back up"); YYERROR; }     \
                    333: while (0)
                    334: 
                    335: #define YYTERROR       1
                    336: #define YYERRCODE      256
                    337: 
                    338: #ifndef YYPURE
                    339: #define YYLEX          yylex()
                    340: #endif
                    341: 
                    342: #ifdef YYPURE
                    343: #ifdef YYLSP_NEEDED
                    344: #ifdef YYLEX_PARAM
                    345: #define YYLEX          yylex(&yylval, &yylloc, YYLEX_PARAM)
                    346: #else
                    347: #define YYLEX          yylex(&yylval, &yylloc)
                    348: #endif
                    349: #else /* not YYLSP_NEEDED */
                    350: #ifdef YYLEX_PARAM
                    351: #define YYLEX          yylex(&yylval, YYLEX_PARAM)
                    352: #else
                    353: #define YYLEX          yylex(&yylval)
                    354: #endif
                    355: #endif /* not YYLSP_NEEDED */
                    356: #endif
                    357: 
                    358: /* If nonreentrant, generate the variables here */
                    359: 
                    360: #ifndef YYPURE
                    361: 
                    362: int    yychar;                 /*  the lookahead symbol                */
                    363: YYSTYPE        yylval;                 /*  the semantic value of the           */
                    364:                                /*  lookahead symbol                    */
                    365: 
                    366: #ifdef YYLSP_NEEDED
                    367: YYLTYPE yylloc;                        /*  location data for the lookahead     */
                    368:                                /*  symbol                              */
                    369: #endif
                    370: 
                    371: int yynerrs;                   /*  number of parse errors so far       */
                    372: #endif  /* not YYPURE */
                    373: 
                    374: #if YYDEBUG != 0
                    375: int yydebug;                   /*  nonzero means print parse trace     */
                    376: /* Since this is uninitialized, it does not stop multiple parsers
                    377:    from coexisting.  */
                    378: #endif
                    379: 
                    380: /*  YYINITDEPTH indicates the initial size of the parser's stacks      */
                    381: 
                    382: #ifndef        YYINITDEPTH
                    383: #define YYINITDEPTH 200
                    384: #endif
                    385: 
                    386: /*  YYMAXDEPTH is the maximum size the stacks can grow to
                    387:     (effective only if the built-in stack extension method is used).  */
                    388: 
                    389: #if YYMAXDEPTH == 0
                    390: #undef YYMAXDEPTH
                    391: #endif
                    392: 
                    393: #ifndef YYMAXDEPTH
                    394: #define YYMAXDEPTH 10000
                    395: #endif
                    396: 
                    397: /* Define __yy_memcpy.  Note that the size argument
                    398:    should be passed with type unsigned int, because that is what the non-GCC
                    399:    definitions require.  With GCC, __builtin_memcpy takes an arg
                    400:    of type size_t, but it can handle unsigned int.  */
                    401: 
                    402: #if __GNUC__ > 1               /* GNU C and GNU C++ define this.  */
                    403: #define __yy_memcpy(TO,FROM,COUNT)     __builtin_memcpy(TO,FROM,COUNT)
                    404: #else                          /* not GNU C or C++ */
                    405: #ifndef __cplusplus
                    406: 
                    407: /* This is the most reliable way to avoid incompatibilities
                    408:    in available built-in functions on various systems.  */
                    409: static void
                    410: __yy_memcpy (to, from, count)
                    411:      char *to;
                    412:      char *from;
                    413:      unsigned int count;
                    414: {
                    415:   register char *f = from;
                    416:   register char *t = to;
                    417:   register int i = count;
                    418: 
                    419:   while (i-- > 0)
                    420:     *t++ = *f++;
                    421: }
                    422: 
                    423: #else /* __cplusplus */
                    424: 
                    425: /* This is the most reliable way to avoid incompatibilities
                    426:    in available built-in functions on various systems.  */
                    427: static void
                    428: __yy_memcpy (char *to, char *from, unsigned int count)
                    429: {
                    430:   register char *t = to;
                    431:   register char *f = from;
                    432:   register int i = count;
                    433: 
                    434:   while (i-- > 0)
                    435:     *t++ = *f++;
                    436: }
                    437: 
                    438: #endif
                    439: #endif
                    440: 
                    441: #line 217 "/usr/share/bison.simple"
                    442: 
                    443: /* The user can define YYPARSE_PARAM as the name of an argument to be passed
                    444:    into yyparse.  The argument should have type void *.
                    445:    It should actually point to an object.
                    446:    Grammar actions can access the variable by casting it
                    447:    to the proper pointer type.  */
                    448: 
                    449: #ifdef YYPARSE_PARAM
                    450: #ifdef __cplusplus
                    451: #define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
                    452: #define YYPARSE_PARAM_DECL
                    453: #else /* not __cplusplus */
                    454: #define YYPARSE_PARAM_ARG YYPARSE_PARAM
                    455: #define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
                    456: #endif /* not __cplusplus */
                    457: #else /* not YYPARSE_PARAM */
                    458: #define YYPARSE_PARAM_ARG
                    459: #define YYPARSE_PARAM_DECL
                    460: #endif /* not YYPARSE_PARAM */
                    461: 
                    462: /* Prevent warning if -Wstrict-prototypes.  */
                    463: #ifdef __GNUC__
                    464: #ifdef YYPARSE_PARAM
                    465: int yyparse (void *);
                    466: #else
                    467: int yyparse (void);
                    468: #endif
                    469: #endif
                    470: 
                    471: int
                    472: yyparse(YYPARSE_PARAM_ARG)
                    473:      YYPARSE_PARAM_DECL
                    474: {
                    475:   register int yystate;
                    476:   register int yyn;
                    477:   register short *yyssp;
                    478:   register YYSTYPE *yyvsp;
                    479:   int yyerrstatus;     /*  number of tokens to shift before error messages enabled */
                    480:   int yychar1 = 0;             /*  lookahead token as an internal (translated) token number */
                    481: 
                    482:   short        yyssa[YYINITDEPTH];     /*  the state stack                     */
                    483:   YYSTYPE yyvsa[YYINITDEPTH];  /*  the semantic value stack            */
                    484: 
                    485:   short *yyss = yyssa;         /*  refer to the stacks thru separate pointers */
                    486:   YYSTYPE *yyvs = yyvsa;       /*  to allow yyoverflow to reallocate them elsewhere */
                    487: 
                    488: #ifdef YYLSP_NEEDED
                    489:   YYLTYPE yylsa[YYINITDEPTH];  /*  the location stack                  */
                    490:   YYLTYPE *yyls = yylsa;
                    491:   YYLTYPE *yylsp;
                    492: 
                    493: #define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
                    494: #else
                    495: #define YYPOPSTACK   (yyvsp--, yyssp--)
                    496: #endif
                    497: 
                    498:   int yystacksize = YYINITDEPTH;
                    499:   int yyfree_stacks = 0;
                    500: 
                    501: #ifdef YYPURE
                    502:   int yychar;
                    503:   YYSTYPE yylval;
                    504:   int yynerrs;
                    505: #ifdef YYLSP_NEEDED
                    506:   YYLTYPE yylloc;
                    507: #endif
                    508: #endif
                    509: 
                    510:   YYSTYPE yyval;               /*  the variable used to return         */
                    511:                                /*  semantic values from the action     */
                    512:                                /*  routines                            */
                    513: 
                    514:   int yylen;
                    515: 
                    516: #if YYDEBUG != 0
                    517:   if (yydebug)
                    518:     fprintf(stderr, "Starting parse\n");
                    519: #endif
                    520: 
                    521:   yystate = 0;
                    522:   yyerrstatus = 0;
                    523:   yynerrs = 0;
                    524:   yychar = YYEMPTY;            /* Cause a token to be read.  */
                    525: 
                    526:   /* Initialize stack pointers.
                    527:      Waste one element of value and location stack
                    528:      so that they stay on the same level as the state stack.
                    529:      The wasted elements are never initialized.  */
                    530: 
                    531:   yyssp = yyss - 1;
                    532:   yyvsp = yyvs;
                    533: #ifdef YYLSP_NEEDED
                    534:   yylsp = yyls;
                    535: #endif
                    536: 
                    537: /* Push a new state, which is found in  yystate  .  */
                    538: /* In all cases, when you get here, the value and location stacks
                    539:    have just been pushed. so pushing a state here evens the stacks.  */
                    540: yynewstate:
                    541: 
                    542:   *++yyssp = yystate;
                    543: 
                    544:   if (yyssp >= yyss + yystacksize - 1)
                    545:     {
                    546:       /* Give user a chance to reallocate the stack */
                    547:       /* Use copies of these so that the &'s don't force the real ones into memory. */
                    548:       YYSTYPE *yyvs1 = yyvs;
                    549:       short *yyss1 = yyss;
                    550: #ifdef YYLSP_NEEDED
                    551:       YYLTYPE *yyls1 = yyls;
                    552: #endif
                    553: 
                    554:       /* Get the current used size of the three stacks, in elements.  */
                    555:       int size = yyssp - yyss + 1;
                    556: 
                    557: #ifdef yyoverflow
                    558:       /* Each stack pointer address is followed by the size of
                    559:         the data in use in that stack, in bytes.  */
                    560: #ifdef YYLSP_NEEDED
                    561:       /* This used to be a conditional around just the two extra args,
                    562:         but that might be undefined if yyoverflow is a macro.  */
                    563:       yyoverflow("parser stack overflow",
                    564:                 &yyss1, size * sizeof (*yyssp),
                    565:                 &yyvs1, size * sizeof (*yyvsp),
                    566:                 &yyls1, size * sizeof (*yylsp),
                    567:                 &yystacksize);
                    568: #else
                    569:       yyoverflow("parser stack overflow",
                    570:                 &yyss1, size * sizeof (*yyssp),
                    571:                 &yyvs1, size * sizeof (*yyvsp),
                    572:                 &yystacksize);
                    573: #endif
                    574: 
                    575:       yyss = yyss1; yyvs = yyvs1;
                    576: #ifdef YYLSP_NEEDED
                    577:       yyls = yyls1;
                    578: #endif
                    579: #else /* no yyoverflow */
                    580:       /* Extend the stack our own way.  */
                    581:       if (yystacksize >= YYMAXDEPTH)
                    582:        {
                    583:          yyerror("parser stack overflow");
                    584:          if (yyfree_stacks)
                    585:            {
                    586:              free (yyss);
                    587:              free (yyvs);
                    588: #ifdef YYLSP_NEEDED
                    589:              free (yyls);
                    590: #endif
                    591:            }
                    592:          return 2;
                    593:        }
                    594:       yystacksize *= 2;
                    595:       if (yystacksize > YYMAXDEPTH)
                    596:        yystacksize = YYMAXDEPTH;
                    597: #ifndef YYSTACK_USE_ALLOCA
                    598:       yyfree_stacks = 1;
                    599: #endif
                    600:       yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
                    601:       __yy_memcpy ((char *)yyss, (char *)yyss1,
                    602:                   size * (unsigned int) sizeof (*yyssp));
                    603:       yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
                    604:       __yy_memcpy ((char *)yyvs, (char *)yyvs1,
                    605:                   size * (unsigned int) sizeof (*yyvsp));
                    606: #ifdef YYLSP_NEEDED
                    607:       yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
                    608:       __yy_memcpy ((char *)yyls, (char *)yyls1,
                    609:                   size * (unsigned int) sizeof (*yylsp));
                    610: #endif
                    611: #endif /* no yyoverflow */
                    612: 
                    613:       yyssp = yyss + size - 1;
                    614:       yyvsp = yyvs + size - 1;
                    615: #ifdef YYLSP_NEEDED
                    616:       yylsp = yyls + size - 1;
                    617: #endif
                    618: 
                    619: #if YYDEBUG != 0
                    620:       if (yydebug)
                    621:        fprintf(stderr, "Stack size increased to %d\n", yystacksize);
                    622: #endif
                    623: 
                    624:       if (yyssp >= yyss + yystacksize - 1)
                    625:        YYABORT;
                    626:     }
                    627: 
                    628: #if YYDEBUG != 0
                    629:   if (yydebug)
                    630:     fprintf(stderr, "Entering state %d\n", yystate);
                    631: #endif
                    632: 
                    633:   goto yybackup;
                    634:  yybackup:
                    635: 
                    636: /* Do appropriate processing given the current state.  */
                    637: /* Read a lookahead token if we need one and don't already have one.  */
                    638: /* yyresume: */
                    639: 
                    640:   /* First try to decide what to do without reference to lookahead token.  */
                    641: 
                    642:   yyn = yypact[yystate];
                    643:   if (yyn == YYFLAG)
                    644:     goto yydefault;
                    645: 
                    646:   /* Not known => get a lookahead token if don't already have one.  */
                    647: 
                    648:   /* yychar is either YYEMPTY or YYEOF
                    649:      or a valid token in external form.  */
                    650: 
                    651:   if (yychar == YYEMPTY)
                    652:     {
                    653: #if YYDEBUG != 0
                    654:       if (yydebug)
                    655:        fprintf(stderr, "Reading a token: ");
                    656: #endif
                    657:       yychar = YYLEX;
                    658:     }
                    659: 
                    660:   /* Convert token to internal form (in yychar1) for indexing tables with */
                    661: 
                    662:   if (yychar <= 0)             /* This means end of input. */
                    663:     {
                    664:       yychar1 = 0;
                    665:       yychar = YYEOF;          /* Don't call YYLEX any more */
                    666: 
                    667: #if YYDEBUG != 0
                    668:       if (yydebug)
                    669:        fprintf(stderr, "Now at end of input.\n");
                    670: #endif
                    671:     }
                    672:   else
                    673:     {
                    674:       yychar1 = YYTRANSLATE(yychar);
                    675: 
                    676: #if YYDEBUG != 0
                    677:       if (yydebug)
                    678:        {
                    679:          fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
                    680:          /* Give the individual parser a way to print the precise meaning
                    681:             of a token, for further debugging info.  */
                    682: #ifdef YYPRINT
                    683:          YYPRINT (stderr, yychar, yylval);
                    684: #endif
                    685:          fprintf (stderr, ")\n");
                    686:        }
                    687: #endif
                    688:     }
                    689: 
                    690:   yyn += yychar1;
                    691:   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
                    692:     goto yydefault;
                    693: 
                    694:   yyn = yytable[yyn];
                    695: 
                    696:   /* yyn is what to do for this token type in this state.
                    697:      Negative => reduce, -yyn is rule number.
                    698:      Positive => shift, yyn is new state.
                    699:        New state is final state => don't bother to shift,
                    700:        just return success.
                    701:      0, or most negative number => error.  */
                    702: 
                    703:   if (yyn < 0)
                    704:     {
                    705:       if (yyn == YYFLAG)
                    706:        goto yyerrlab;
                    707:       yyn = -yyn;
                    708:       goto yyreduce;
                    709:     }
                    710:   else if (yyn == 0)
                    711:     goto yyerrlab;
                    712: 
                    713:   if (yyn == YYFINAL)
                    714:     YYACCEPT;
                    715: 
                    716:   /* Shift the lookahead token.  */
                    717: 
                    718: #if YYDEBUG != 0
                    719:   if (yydebug)
                    720:     fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
                    721: #endif
                    722: 
                    723:   /* Discard the token being shifted unless it is eof.  */
                    724:   if (yychar != YYEOF)
                    725:     yychar = YYEMPTY;
                    726: 
                    727:   *++yyvsp = yylval;
                    728: #ifdef YYLSP_NEEDED
                    729:   *++yylsp = yylloc;
                    730: #endif
                    731: 
                    732:   /* count tokens shifted since error; after three, turn off error status.  */
                    733:   if (yyerrstatus) yyerrstatus--;
                    734: 
                    735:   yystate = yyn;
                    736:   goto yynewstate;
                    737: 
                    738: /* Do the default action for the current state.  */
                    739: yydefault:
                    740: 
                    741:   yyn = yydefact[yystate];
                    742:   if (yyn == 0)
                    743:     goto yyerrlab;
                    744: 
                    745: /* Do a reduction.  yyn is the number of a rule to reduce with.  */
                    746: yyreduce:
                    747:   yylen = yyr2[yyn];
                    748:   if (yylen > 0)
                    749:     yyval = yyvsp[1-yylen]; /* implement default value of the action */
                    750: 
                    751: #if YYDEBUG != 0
                    752:   if (yydebug)
                    753:     {
                    754:       int i;
                    755: 
                    756:       fprintf (stderr, "Reducing via rule %d (line %d), ",
                    757:               yyn, yyrline[yyn]);
                    758: 
                    759:       /* Print the symbols being reduced, and their result.  */
                    760:       for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
                    761:        fprintf (stderr, "%s ", yytname[yyrhs[i]]);
                    762:       fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
                    763:     }
                    764: #endif
                    765: 
                    766: 
                    767:   switch (yyn) {
                    768: 
                    769: case 1:
                    770: #line 115 "OSUnserialize.y"
                    771: { parsedObject = (OSObject *)NULL; YYACCEPT; ;
                    772:     break;}
                    773: case 2:
                    774: #line 116 "OSUnserialize.y"
                    775: { parsedObject = (OSObject *)yyvsp[0];   YYACCEPT; ;
                    776:     break;}
                    777: case 3:
                    778: #line 117 "OSUnserialize.y"
                    779: { yyerror("syntax error");        YYERROR; ;
                    780:     break;}
                    781: case 4:
                    782: #line 120 "OSUnserialize.y"
                    783: { yyval = (object_t *)buildOSDictionary(yyvsp[0]); ;
                    784:     break;}
                    785: case 5:
                    786: #line 121 "OSUnserialize.y"
                    787: { yyval = (object_t *)buildOSArray(yyvsp[0]); ;
                    788:     break;}
                    789: case 6:
                    790: #line 122 "OSUnserialize.y"
                    791: { yyval = (object_t *)buildOSSet(yyvsp[0]); ;
                    792:     break;}
                    793: case 7:
                    794: #line 123 "OSUnserialize.y"
                    795: { yyval = (object_t *)buildOSString(yyvsp[0]); ;
                    796:     break;}
                    797: case 8:
                    798: #line 124 "OSUnserialize.y"
                    799: { yyval = (object_t *)buildOSData(yyvsp[0]); ;
                    800:     break;}
                    801: case 9:
                    802: #line 125 "OSUnserialize.y"
                    803: { yyval = (object_t *)buildOSOffset(yyvsp[0]); ;
                    804:     break;}
                    805: case 10:
                    806: #line 126 "OSUnserialize.y"
                    807: { yyval = (object_t *)buildOSBoolean(yyvsp[0]); ;
                    808:     break;}
                    809: case 11:
                    810: #line 127 "OSUnserialize.y"
                    811: { yyval = (object_t *)retrieveObject(yyvsp[0]->u.offset);
                    812:                                  if (yyval) {
                    813:                                    ((OSObject *)yyval)->retain();
                    814:                                  } else { 
                    815:                                    yyerror("forward reference detected");
                    816:                                    YYERROR;
                    817:                                  }
                    818:                                  freeObject(yyvsp[0]); 
                    819:                                ;
                    820:     break;}
                    821: case 12:
                    822: #line 136 "OSUnserialize.y"
                    823: { yyval = yyvsp[-2]; 
                    824:                                  rememberObject(yyvsp[0]->u.offset, yyvsp[-2]);
                    825:                                  freeObject(yyvsp[0]); 
                    826:                                ;
                    827:     break;}
                    828: case 13:
                    829: #line 144 "OSUnserialize.y"
                    830: { yyval = NULL; ;
                    831:     break;}
                    832: case 14:
                    833: #line 145 "OSUnserialize.y"
                    834: { yyval = yyvsp[-1]; ;
                    835:     break;}
                    836: case 16:
                    837: #line 149 "OSUnserialize.y"
                    838: { yyvsp[0]->next = yyvsp[-1]; yyvsp[-1]->prev = yyvsp[0]; yyval = yyvsp[0]; ;
                    839:     break;}
                    840: case 17:
                    841: #line 152 "OSUnserialize.y"
                    842: { yyval = newObject();
                    843:                                  yyval->next = NULL; 
                    844:                                  yyval->prev = NULL;
                    845:                                  yyval->u.key = yyvsp[-3];
                    846:                                  yyval->object = yyvsp[-1]; 
                    847:                                ;
                    848:     break;}
                    849: case 18:
                    850: #line 162 "OSUnserialize.y"
                    851: { yyval = NULL; ;
                    852:     break;}
                    853: case 19:
                    854: #line 163 "OSUnserialize.y"
                    855: { yyval = yyvsp[-1]; ;
                    856:     break;}
                    857: case 20:
                    858: #line 166 "OSUnserialize.y"
                    859: { yyval = NULL; ;
                    860:     break;}
                    861: case 21:
                    862: #line 167 "OSUnserialize.y"
                    863: { yyval = yyvsp[-1]; ;
                    864:     break;}
                    865: case 22:
                    866: #line 170 "OSUnserialize.y"
                    867: { yyval = newObject(); 
                    868:                                  yyval->object = yyvsp[0]; 
                    869:                                  yyval->next = NULL; 
                    870:                                  yyval->prev = NULL; 
                    871:                                ;
                    872:     break;}
                    873: case 23:
                    874: #line 175 "OSUnserialize.y"
                    875: { o = newObject();
                    876:                                  o->object = yyvsp[0];
                    877:                                  o->next = yyvsp[-2];
                    878:                                  o->prev = NULL; 
                    879:                                  yyvsp[-2]->prev = o;
                    880:                                  yyval = o; 
                    881:                                ;
                    882:     break;}
                    883: case 24:
                    884: #line 186 "OSUnserialize.y"
                    885: { yyval = yyvsp[-2];
                    886:                                  yyval->size = yyvsp[0]->u.offset;
                    887:                                  freeObject(yyvsp[0]); 
                    888:                                ;
                    889:     break;}
                    890: }
                    891:    /* the action file gets copied in in place of this dollarsign */
                    892: #line 543 "/usr/share/bison.simple"
                    893: 
                    894:   yyvsp -= yylen;
                    895:   yyssp -= yylen;
                    896: #ifdef YYLSP_NEEDED
                    897:   yylsp -= yylen;
                    898: #endif
                    899: 
                    900: #if YYDEBUG != 0
                    901:   if (yydebug)
                    902:     {
                    903:       short *ssp1 = yyss - 1;
                    904:       fprintf (stderr, "state stack now");
                    905:       while (ssp1 != yyssp)
                    906:        fprintf (stderr, " %d", *++ssp1);
                    907:       fprintf (stderr, "\n");
                    908:     }
                    909: #endif
                    910: 
                    911:   *++yyvsp = yyval;
                    912: 
                    913: #ifdef YYLSP_NEEDED
                    914:   yylsp++;
                    915:   if (yylen == 0)
                    916:     {
                    917:       yylsp->first_line = yylloc.first_line;
                    918:       yylsp->first_column = yylloc.first_column;
                    919:       yylsp->last_line = (yylsp-1)->last_line;
                    920:       yylsp->last_column = (yylsp-1)->last_column;
                    921:       yylsp->text = 0;
                    922:     }
                    923:   else
                    924:     {
                    925:       yylsp->last_line = (yylsp+yylen-1)->last_line;
                    926:       yylsp->last_column = (yylsp+yylen-1)->last_column;
                    927:     }
                    928: #endif
                    929: 
                    930:   /* Now "shift" the result of the reduction.
                    931:      Determine what state that goes to,
                    932:      based on the state we popped back to
                    933:      and the rule number reduced by.  */
                    934: 
                    935:   yyn = yyr1[yyn];
                    936: 
                    937:   yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
                    938:   if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
                    939:     yystate = yytable[yystate];
                    940:   else
                    941:     yystate = yydefgoto[yyn - YYNTBASE];
                    942: 
                    943:   goto yynewstate;
                    944: 
                    945: yyerrlab:   /* here on detecting error */
                    946: 
                    947:   if (! yyerrstatus)
                    948:     /* If not already recovering from an error, report this error.  */
                    949:     {
                    950:       ++yynerrs;
                    951: 
                    952: #ifdef YYERROR_VERBOSE
                    953:       yyn = yypact[yystate];
                    954: 
                    955:       if (yyn > YYFLAG && yyn < YYLAST)
                    956:        {
                    957:          int size = 0;
                    958:          char *msg;
                    959:          int x, count;
                    960: 
                    961:          count = 0;
                    962:          /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
                    963:          for (x = (yyn < 0 ? -yyn : 0);
                    964:               x < (sizeof(yytname) / sizeof(char *)); x++)
                    965:            if (yycheck[x + yyn] == x)
                    966:              size += strlen(yytname[x]) + 15, count++;
                    967:          msg = (char *) malloc(size + 15);
                    968:          if (msg != 0)
                    969:            {
                    970:              strcpy(msg, "parse error");
                    971: 
                    972:              if (count < 5)
                    973:                {
                    974:                  count = 0;
                    975:                  for (x = (yyn < 0 ? -yyn : 0);
                    976:                       x < (sizeof(yytname) / sizeof(char *)); x++)
                    977:                    if (yycheck[x + yyn] == x)
                    978:                      {
                    979:                        strcat(msg, count == 0 ? ", expecting `" : " or `");
                    980:                        strcat(msg, yytname[x]);
                    981:                        strcat(msg, "'");
                    982:                        count++;
                    983:                      }
                    984:                }
                    985:              yyerror(msg);
                    986:              free(msg);
                    987:            }
                    988:          else
                    989:            yyerror ("parse error; also virtual memory exceeded");
                    990:        }
                    991:       else
                    992: #endif /* YYERROR_VERBOSE */
                    993:        yyerror("parse error");
                    994:     }
                    995: 
                    996:   goto yyerrlab1;
                    997: yyerrlab1:   /* here on error raised explicitly by an action */
                    998: 
                    999:   if (yyerrstatus == 3)
                   1000:     {
                   1001:       /* if just tried and failed to reuse lookahead token after an error, discard it.  */
                   1002: 
                   1003:       /* return failure if at end of input */
                   1004:       if (yychar == YYEOF)
                   1005:        YYABORT;
                   1006: 
                   1007: #if YYDEBUG != 0
                   1008:       if (yydebug)
                   1009:        fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
                   1010: #endif
                   1011: 
                   1012:       yychar = YYEMPTY;
                   1013:     }
                   1014: 
                   1015:   /* Else will try to reuse lookahead token
                   1016:      after shifting the error token.  */
                   1017: 
                   1018:   yyerrstatus = 3;             /* Each real token shifted decrements this */
                   1019: 
                   1020:   goto yyerrhandle;
                   1021: 
                   1022: yyerrdefault:  /* current state does not do anything special for the error token. */
                   1023: 
                   1024: #if 0
                   1025:   /* This is wrong; only states that explicitly want error tokens
                   1026:      should shift them.  */
                   1027:   yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
                   1028:   if (yyn) goto yydefault;
                   1029: #endif
                   1030: 
                   1031: yyerrpop:   /* pop the current state because it cannot handle the error token */
                   1032: 
                   1033:   if (yyssp == yyss) YYABORT;
                   1034:   yyvsp--;
                   1035:   yystate = *--yyssp;
                   1036: #ifdef YYLSP_NEEDED
                   1037:   yylsp--;
                   1038: #endif
                   1039: 
                   1040: #if YYDEBUG != 0
                   1041:   if (yydebug)
                   1042:     {
                   1043:       short *ssp1 = yyss - 1;
                   1044:       fprintf (stderr, "Error: state stack now");
                   1045:       while (ssp1 != yyssp)
                   1046:        fprintf (stderr, " %d", *++ssp1);
                   1047:       fprintf (stderr, "\n");
                   1048:     }
                   1049: #endif
                   1050: 
                   1051: yyerrhandle:
                   1052: 
                   1053:   yyn = yypact[yystate];
                   1054:   if (yyn == YYFLAG)
                   1055:     goto yyerrdefault;
                   1056: 
                   1057:   yyn += YYTERROR;
                   1058:   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
                   1059:     goto yyerrdefault;
                   1060: 
                   1061:   yyn = yytable[yyn];
                   1062:   if (yyn < 0)
                   1063:     {
                   1064:       if (yyn == YYFLAG)
                   1065:        goto yyerrpop;
                   1066:       yyn = -yyn;
                   1067:       goto yyreduce;
                   1068:     }
                   1069:   else if (yyn == 0)
                   1070:     goto yyerrpop;
                   1071: 
                   1072:   if (yyn == YYFINAL)
                   1073:     YYACCEPT;
                   1074: 
                   1075: #if YYDEBUG != 0
                   1076:   if (yydebug)
                   1077:     fprintf(stderr, "Shifting error token, ");
                   1078: #endif
                   1079: 
                   1080:   *++yyvsp = yylval;
                   1081: #ifdef YYLSP_NEEDED
                   1082:   *++yylsp = yylloc;
                   1083: #endif
                   1084: 
                   1085:   yystate = yyn;
                   1086:   goto yynewstate;
                   1087: 
                   1088:  yyacceptlab:
                   1089:   /* YYACCEPT comes here.  */
                   1090:   if (yyfree_stacks)
                   1091:     {
                   1092:       free (yyss);
                   1093:       free (yyvs);
                   1094: #ifdef YYLSP_NEEDED
                   1095:       free (yyls);
                   1096: #endif
                   1097:     }
                   1098:   return 0;
                   1099: 
                   1100:  yyabortlab:
                   1101:   /* YYABORT comes here.  */
                   1102:   if (yyfree_stacks)
                   1103:     {
                   1104:       free (yyss);
                   1105:       free (yyvs);
                   1106: #ifdef YYLSP_NEEDED
                   1107:       free (yyls);
                   1108: #endif
                   1109:     }
                   1110:   return 1;
                   1111: }
                   1112: #line 207 "OSUnserialize.y"
                   1113: 
                   1114:      
                   1115: static int             lineNumber = 0;
                   1116: static const char      *parseBuffer;
                   1117: static int             parseBufferIndex;
                   1118: 
                   1119: #define currentChar()  (parseBuffer[parseBufferIndex])
                   1120: #define nextChar()     (parseBuffer[++parseBufferIndex])
                   1121: #define prevChar()     (parseBuffer[parseBufferIndex - 1])
                   1122: 
                   1123: #define isSpace(c)     ((c) == ' ' || (c) == '\t')
                   1124: #define isAlpha(c)     (((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z'))
                   1125: #define isDigit(c)     ((c) >= '0' && (c) <= '9')
                   1126: #define isAlphaDigit(c)        ((c) >= 'a' && (c) <= 'f')
                   1127: #define isHexDigit(c)  (isDigit(c) || isAlphaDigit(c))
                   1128: #define isAlphaNumeric(c) (isAlpha(c) || isDigit(c) || ((c) == '-')) 
                   1129: 
                   1130: static char yyerror_message[128];
                   1131: 
                   1132: int
                   1133: yyerror(char *s)  /* Called by yyparse on error */
                   1134: {
                   1135:        sprintf(yyerror_message, "OSUnserialize: %s near line %d\n", s, lineNumber);
                   1136:        return 0;
                   1137: }
                   1138: 
                   1139: int
                   1140: yylex()
                   1141: {
                   1142:        int c;
                   1143: 
                   1144:        if (parseBufferIndex == 0) lineNumber = 1;
                   1145: 
                   1146:  top:
                   1147:        c = currentChar();
                   1148: 
                   1149:        /* skip white space  */
                   1150:        if (isSpace(c)) while ((c = nextChar()) != 0 && isSpace(c)) {};
                   1151: 
                   1152:        /* skip over comments */
                   1153:        if (c == '#') while ((c = nextChar()) != 0 && c != '\n') {};
                   1154: 
                   1155:        /* keep track of line number, don't return \n's */
                   1156:        if (c == '\n') {
                   1157:                lineNumber++;
                   1158:                (void)nextChar();
                   1159:                goto top;
                   1160:        }
                   1161: 
                   1162:        /* parse boolean */
                   1163:        if (c == '.') {
                   1164:                bool boolean = false;
                   1165:                if (nextChar() == 't') {
                   1166:                        if (nextChar() != 'r') return SYNTAX_ERROR;
                   1167:                        if (nextChar() != 'u') return SYNTAX_ERROR;
                   1168:                        if (nextChar() != 'e') return SYNTAX_ERROR;
                   1169:                        boolean = true;
                   1170:                } else {
                   1171:                        if (currentChar() != 'f') return SYNTAX_ERROR;
                   1172:                        if (nextChar() != 'a') return SYNTAX_ERROR;
                   1173:                        if (nextChar() != 'l') return SYNTAX_ERROR;
                   1174:                        if (nextChar() != 's') return SYNTAX_ERROR;
                   1175:                        if (nextChar() != 'e') return SYNTAX_ERROR;
                   1176:                }
                   1177:                if (nextChar() != '.') return SYNTAX_ERROR;
                   1178:                /* skip over dot */
                   1179:                (void)nextChar();
                   1180: 
                   1181:                yylval = (object_t *)boolean;
                   1182:                return BOOLEAN;
                   1183:        }
                   1184: 
                   1185:        /* parse unquoted string */
                   1186:        if (isAlpha(c)) {
                   1187:                int start, length;
                   1188:                char * tempString;
                   1189: 
                   1190:                start = parseBufferIndex;
                   1191:                /* find end of string */
                   1192:                while (isAlphaNumeric(c)) { 
                   1193:                        c = nextChar();
                   1194:                }
                   1195:                length = parseBufferIndex - start;
                   1196: 
                   1197:                /* copy to null terminated buffer */
                   1198:                tempString = (char *)malloc(length + 1);
                   1199:                if (tempString == 0) {
                   1200:                        printf("OSUnserialize: can't alloc temp memory\n");
                   1201:                        return 0;
                   1202:                }
                   1203:                bcopy(&parseBuffer[start], tempString, length);
                   1204:                tempString[length] = 0;
                   1205:                yylval = (object_t *)tempString;
                   1206:                return STRING;
                   1207:        }
                   1208: 
                   1209:        /* parse quoted string */
                   1210:        if (c == '"' || c == '\'') {
                   1211:                int start, length;
                   1212:                char * tempString;
                   1213:                char quoteChar = c;
                   1214: 
                   1215:                start = parseBufferIndex + 1;           // skip quote
                   1216:                /* find end of string, line, buffer */
                   1217:                while ((c = nextChar()) != quoteChar) {
                   1218:                        if (c == '\\') c = nextChar();
                   1219:                        if (c == '\n') lineNumber++;
                   1220:                        if (c == 0) return SYNTAX_ERROR;
                   1221:                }
                   1222:                length = parseBufferIndex - start;
                   1223:                /* skip over trailing quote */
                   1224:                (void)nextChar();
                   1225:                /* copy to null terminated buffer */
                   1226:                tempString = (char *)malloc(length + 1);
                   1227:                if (tempString == 0) {
                   1228:                        printf("OSUnserialize: can't alloc temp memory\n");
                   1229:                        return 0;
                   1230:                }
                   1231: 
                   1232:                int to = 0;
                   1233:                for (int from=start; from < parseBufferIndex; from++) {
                   1234:                        // hack - skip over backslashes
                   1235:                        if (parseBuffer[from] == '\\') {
                   1236:                                length--;
                   1237:                                continue;
                   1238:                        }
                   1239:                        tempString[to] = parseBuffer[from]; 
                   1240:                        to++;
                   1241:                }
                   1242:                tempString[length] = 0;
                   1243:                yylval = (object_t *)tempString;
                   1244:                return STRING;
                   1245:        }
                   1246: 
                   1247:        /* process numbers */
                   1248:        if (isDigit (c))
                   1249:        {
                   1250:                unsigned long long n = 0;
                   1251:                int base = 10;
                   1252: 
                   1253:                if (c == '0') {
                   1254:                        c = nextChar();
                   1255:                        if (c == 'x') {
                   1256:                                base = 16;
                   1257:                                c = nextChar();
                   1258:                        }
                   1259:                }
                   1260:                if (base == 10) {
                   1261:                        while(isDigit(c)) {
                   1262:                                n = (n * base + c - '0');
                   1263:                                c = nextChar();
                   1264:                        }
                   1265:                } else {
                   1266:                        while(isHexDigit(c)) {
                   1267:                                if (isDigit(c)) {
                   1268:                                        n = (n * base + c - '0');
                   1269:                                } else {
                   1270:                                        n = (n * base + 0xa + c - 'a');
                   1271:                                }
                   1272:                                c = nextChar();
                   1273:                        }
                   1274:                }
                   1275: 
                   1276:                yylval = newObject();
                   1277:                yylval->u.offset = n;
                   1278:                        
                   1279:                return NUMBER;
                   1280:        }
                   1281: 
                   1282: #define OSDATA_ALLOC_SIZE 4096
                   1283:        
                   1284:        /* process data */
                   1285:        if (c == '<') {
                   1286:                unsigned char *d, *start, *lastStart;
                   1287: 
                   1288:                start = lastStart = d = (unsigned char *)malloc(OSDATA_ALLOC_SIZE);
                   1289:                c = nextChar(); // skip over '<'
                   1290:                while (c != 0 && c != '>') {
                   1291: 
                   1292:                        if (isSpace(c)) while ((c = nextChar()) != 0 && isSpace(c)) {};
                   1293:                        if (c == '#') while ((c = nextChar()) != 0 && c != '\n') {};
                   1294:                        if (c == '\n') {
                   1295:                                lineNumber++;
                   1296:                                c = nextChar();
                   1297:                                continue;
                   1298:                        }
                   1299: 
                   1300:                        // get high nibble
                   1301:                        if (!isHexDigit(c)) break;
                   1302:                        if (isDigit(c)) {
                   1303:                                *d = (c - '0') << 4;
                   1304:                        } else {
                   1305:                                *d =  (0xa + (c - 'a')) << 4;
                   1306:                        }
                   1307: 
                   1308:                        // get low nibble
                   1309:                        c = nextChar();
                   1310:                        if (!isHexDigit(c)) break;
                   1311:                        if (isDigit(c)) {
                   1312:                                *d |= c - '0';
                   1313:                        } else {
                   1314:                                *d |= 0xa + (c - 'a');
                   1315:                        }
                   1316:        
                   1317:                        d++;
                   1318:                        if ((d - lastStart) >= OSDATA_ALLOC_SIZE) {
                   1319:                                int oldsize = d - start;
                   1320:                                start = (unsigned char *)realloc(start, oldsize + OSDATA_ALLOC_SIZE);
                   1321:                                d = lastStart = start + oldsize;
                   1322:                        }
                   1323:                        c = nextChar();
                   1324:                }
                   1325:                if (c != '>' ) {
                   1326:                        free(start);
                   1327:                        return SYNTAX_ERROR;
                   1328:                }
                   1329: 
                   1330:                // got it!
                   1331:                yylval = newObject();
                   1332:                yylval->object = start;
                   1333:                yylval->size = d - start;
                   1334: 
                   1335:                (void)nextChar();       // skip over '>'
                   1336:                return DATA;
                   1337:        }
                   1338: 
                   1339: 
                   1340:        /* return single chars, move pointer to next char */
                   1341:        (void)nextChar();
                   1342:        return c;
                   1343: }
                   1344: 
                   1345: // !@$&)(^Q$&*^!$(*!@$_(^%_(*Q#$(_*&!$_(*&!$_(*&!#$(*!@&^!@#%!_!#
                   1346: // !@$&)(^Q$&*^!$(*!@$_(^%_(*Q#$(_*&!$_(*&!$_(*&!#$(*!@&^!@#%!_!#
                   1347: // !@$&)(^Q$&*^!$(*!@$_(^%_(*Q#$(_*&!$_(*&!$_(*&!#$(*!@&^!@#%!_!#
                   1348: 
                   1349: #ifdef DEBUG
                   1350: int debugUnserializeAllocCount = 0;
                   1351: #endif
                   1352: 
                   1353: object_t *
                   1354: newObject()
                   1355: {
                   1356: #ifdef DEBUG
                   1357:        debugUnserializeAllocCount++;
                   1358: #endif
                   1359:        return (object_t *)malloc(sizeof(object_t));
                   1360: }
                   1361: 
                   1362: void
                   1363: freeObject(object_t *o)
                   1364: {
                   1365: #ifdef DEBUG
                   1366:        debugUnserializeAllocCount--;
                   1367: #endif
                   1368:        free(o);
                   1369: }
                   1370: 
                   1371: static OSDictionary *tags;
                   1372: 
                   1373: static void 
                   1374: rememberObject(int tag, object_t *o)
                   1375: {
                   1376:        char key[16];
                   1377:        sprintf(key, "%u", tag);
                   1378: 
                   1379:        tags->setObject(key, (OSObject *)o);
                   1380: }
                   1381: 
                   1382: static OSObject *
                   1383: retrieveObject(int tag)
                   1384: {
                   1385:        char key[16];
                   1386:        sprintf(key, "%u", tag);
                   1387: 
                   1388:        return tags->getObject(key);
                   1389: }
                   1390: 
                   1391: OSObject *
                   1392: buildOSDictionary(object_t *o)
                   1393: {
                   1394:        object_t *temp, *last = o;
                   1395:        int count = 0;
                   1396: 
                   1397:        // get count and last object
                   1398:        while (o) {
                   1399:                count++;
                   1400:                last = o;
                   1401:                o = o->next;
                   1402:        }
                   1403:        o = last;
                   1404: 
                   1405:        OSDictionary *d = OSDictionary::withCapacity(count);
                   1406: 
                   1407:        while (o) {
                   1408: #ifdef metaclass_stuff_worksXXX
                   1409:                if (((OSObject *)o->u.key)->metaCast("OSSymbol")) {
                   1410:                        // XXX the evil frontdoor
                   1411:                        d->setObject((OSSymbol *)o->u.key, (OSObject *)o->object);
                   1412:                } else {
                   1413:                         // If it isn't a symbol, I hope it's a string!
                   1414:                        d->setObject((OSString *)o->u.key, (OSObject *)o->object);
                   1415:                }
                   1416: #else
                   1417:                d->setObject((OSString *)o->u.key, (OSObject *)o->object);
                   1418: #endif
                   1419:                ((OSObject *)o->object)->release();
                   1420:                ((OSObject *)o->u.key)->release();
                   1421:                temp = o;
                   1422:                o = o->prev;
                   1423:                freeObject(temp);
                   1424:        }
                   1425:        return d;
                   1426: };
                   1427: 
                   1428: OSObject *
                   1429: buildOSArray(object_t *o)
                   1430: {
                   1431:        object_t *temp, *last = o;
                   1432:        int count = 0;
                   1433: 
                   1434:        // get count and last object
                   1435:        while (o) {
                   1436:                count++;
                   1437:                last = o;
                   1438:                o = o->next;
                   1439:        }
                   1440:        o = last;
                   1441: 
                   1442:        OSArray *a = OSArray::withCapacity(count);
                   1443: 
                   1444:        while (o) {
                   1445:                a->setObject((OSObject *)o->object);
                   1446:                ((OSObject *)o->object)->release();
                   1447:                temp = o;
                   1448:                o = o->prev;
                   1449:                freeObject(temp);
                   1450:        }
                   1451:        return a;
                   1452: };
                   1453: 
                   1454: OSObject *
                   1455: buildOSSet(object_t *o)
                   1456: {
                   1457:        OSArray *a = (OSArray *)buildOSArray(o);
                   1458:        OSSet *s = OSSet::withArray(a, a->getCapacity());
                   1459: 
                   1460:        a->release();
                   1461:        return s;
                   1462: };
                   1463: 
                   1464: OSObject *
                   1465: buildOSString(object_t *o)
                   1466: {
                   1467:        OSString *s = OSString::withCString((char *)o);
                   1468: 
                   1469:        free(o);
                   1470: 
                   1471:        return s;
                   1472: };
                   1473: 
                   1474: OSObject *
                   1475: buildOSData(object_t *o)
                   1476: {
                   1477:        OSData *d;
                   1478: 
                   1479:        if (o->size) {
                   1480:                d = OSData::withBytes(o->object, o->size);
                   1481:        } else {
                   1482:                d = OSData::withCapacity(0);
                   1483:        }
                   1484:        free(o->object);
                   1485:        freeObject(o);
                   1486:        return d;
                   1487: };
                   1488: 
                   1489: OSObject *
                   1490: buildOSOffset(object_t *o)
                   1491: {
                   1492:        OSNumber *off = OSNumber::withNumber(o->u.offset, o->size);
                   1493:        freeObject(o);
                   1494:        return off;
                   1495: };
                   1496: 
                   1497: OSObject *
                   1498: buildOSBoolean(object_t *o)
                   1499: {
                   1500:        OSBoolean *b = OSBoolean::withBoolean((bool)o);
                   1501:        return b;
                   1502: };
                   1503: 
                   1504: __BEGIN_DECLS
                   1505: #include <kern/lock.h>
                   1506: __END_DECLS
                   1507: 
                   1508: static mutex_t *lock = 0;
                   1509: 
                   1510: OSObject*
                   1511: OSUnserialize(const char *buffer, OSString **errorString)
                   1512: {
                   1513:        OSObject *object;
                   1514: 
                   1515:        if (!lock) {
                   1516:                lock = mutex_alloc(ETAP_IO_AHA);
                   1517:                _mutex_lock(lock);
                   1518:        } else {
                   1519:                _mutex_lock(lock);
                   1520: 
                   1521:        }
                   1522: 
                   1523: #ifdef DEBUG
                   1524:        debugUnserializeAllocCount = 0;
                   1525: #endif
                   1526:        yyerror_message[0] = 0; //just in case
                   1527:        parseBuffer = buffer;
                   1528:        parseBufferIndex = 0;
                   1529:        tags = OSDictionary::withCapacity(128);
                   1530:        if (yyparse() == 0) {
                   1531:                object = parsedObject;
                   1532:                if (errorString) *errorString = 0;
                   1533:        } else {
                   1534:                object = 0;
                   1535:                if (errorString)
                   1536:                        *errorString = OSString::withCString(yyerror_message);
                   1537:        }
                   1538: 
                   1539:        tags->release();
                   1540: #ifdef DEBUG
                   1541:        if (debugUnserializeAllocCount) {
                   1542:                printf("OSUnserialize: allocation check failed, count = %d.\n", 
                   1543:                       debugUnserializeAllocCount);
                   1544:        }
                   1545: #endif
                   1546:        mutex_unlock(lock);
                   1547: 
                   1548:        return object;
                   1549: }
                   1550: 
                   1551: 
                   1552: //
                   1553: //
                   1554: //
                   1555: //
                   1556: //
                   1557: //              DO NOT EDIT OSUnserialize.cpp!
                   1558: //
                   1559: //                     this means you!
                   1560: //
                   1561: //
                   1562: //
                   1563: //
                   1564: //

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.