Fossil

Hex Artifact Content
Login

Artifact 49c76a6973d579ff0b346e5f73182fa72dd797cbb07e8b20612849dc2adef85d:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72  /*.** This progr
0010: 61 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77  am is free softw
0020: 61 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64  are; you can red
0030: 69 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64  istribute it and
0040: 2f 6f 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74  /or.** modify it
0050: 20 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73   under the terms
0060: 20 6f 66 20 74 68 65 20 53 69 6d 70 6c 69 66 69   of the Simplifi
0070: 65 64 20 42 53 44 20 4c 69 63 65 6e 73 65 20 28  ed BSD License (
0080: 61 6c 73 6f 0a 2a 2a 20 6b 6e 6f 77 6e 20 61 73  also.** known as
0090: 20 74 68 65 20 22 32 2d 43 6c 61 75 73 65 20 4c   the "2-Clause L
00a0: 69 63 65 6e 73 65 22 20 6f 72 20 22 46 72 65 65  icense" or "Free
00b0: 42 53 44 20 4c 69 63 65 6e 73 65 22 2e 29 0a 2a  BSD License".).*
00c0: 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20 31  *.** Copyright 1
00d0: 39 39 33 20 44 2e 20 52 69 63 68 61 72 64 20 48  993 D. Richard H
00e0: 69 70 70 2e 20 41 6c 6c 20 72 69 67 68 74 73 20  ipp. All rights 
00f0: 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
0100: 52 65 64 69 73 74 72 69 62 75 74 69 6f 6e 20 61  Redistribution a
0110: 6e 64 20 75 73 65 20 69 6e 20 73 6f 75 72 63 65  nd use in source
0120: 20 61 6e 64 20 62 69 6e 61 72 79 20 66 6f 72 6d   and binary form
0130: 73 2c 20 77 69 74 68 20 6f 72 0a 2a 2a 20 77 69  s, with or.** wi
0140: 74 68 6f 75 74 20 6d 6f 64 69 66 69 63 61 74 69  thout modificati
0150: 6f 6e 2c 20 61 72 65 20 70 65 72 6d 69 74 74 65  on, are permitte
0160: 64 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20  d provided that 
0170: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
0180: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20   conditions are 
0190: 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  met:.**.**   1. 
01a0: 52 65 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20  Redistributions 
01b0: 6f 66 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6d  of source code m
01c0: 75 73 74 20 72 65 74 61 69 6e 20 74 68 65 20 61  ust retain the a
01d0: 62 6f 76 65 20 63 6f 70 79 72 69 67 68 74 0a 2a  bove copyright.*
01e0: 2a 20 20 20 20 20 20 6e 6f 74 69 63 65 2c 20 74  *      notice, t
01f0: 68 69 73 20 6c 69 73 74 20 6f 66 20 63 6f 6e 64  his list of cond
0200: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 66  itions and the f
0210: 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63 6c 61 69  ollowing disclai
0220: 6d 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20  mer..**.**   2. 
0230: 52 65 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20  Redistributions 
0240: 69 6e 20 62 69 6e 61 72 79 20 66 6f 72 6d 20 6d  in binary form m
0250: 75 73 74 20 72 65 70 72 6f 64 75 63 65 20 74 68  ust reproduce th
0260: 65 20 61 62 6f 76 65 20 63 6f 70 79 72 69 67 68  e above copyrigh
0270: 74 0a 2a 2a 20 20 20 20 20 20 6e 6f 74 69 63 65  t.**      notice
0280: 2c 20 74 68 69 73 20 6c 69 73 74 20 6f 66 20 63  , this list of c
0290: 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  onditions and th
02a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63  e following disc
02b0: 6c 61 69 6d 65 72 20 69 6e 0a 2a 2a 20 20 20 20  laimer in.**    
02c0: 20 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74    the documentat
02d0: 69 6f 6e 20 61 6e 64 2f 6f 72 20 6f 74 68 65 72  ion and/or other
02e0: 20 6d 61 74 65 72 69 61 6c 73 20 70 72 6f 76 69   materials provi
02f0: 64 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ded with the.** 
0300: 20 20 20 20 20 64 69 73 74 72 69 62 75 74 69 6f       distributio
0310: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 6f  n..**.** This so
0320: 66 74 77 61 72 65 20 69 73 20 70 72 6f 76 69 64  ftware is provid
0330: 65 64 20 22 61 73 20 69 73 22 20 61 6e 64 20 61  ed "as is" and a
0340: 6e 79 20 65 78 70 72 65 73 73 20 6f 72 20 69 6d  ny express or im
0350: 70 6c 69 65 64 20 77 61 72 72 61 6e 74 69 65 73  plied warranties
0360: 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 2c 20  ,.** including, 
0370: 62 75 74 20 6e 6f 74 20 6c 69 6d 69 74 65 64 20  but not limited 
0380: 74 6f 2c 20 74 68 65 20 69 6d 70 6c 69 65 64 20  to, the implied 
0390: 77 61 72 72 61 6e 74 69 65 73 20 6f 66 20 6d 65  warranties of me
03a0: 72 63 68 61 6e 74 61 62 69 6c 69 74 79 0a 2a 2a  rchantability.**
03b0: 20 61 6e 64 20 66 69 74 6e 65 73 73 20 66 6f 72   and fitness for
03c0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75   a particular pu
03d0: 72 70 6f 73 65 20 61 72 65 20 64 69 73 63 6c 61  rpose are discla
03e0: 69 6d 65 64 2e 20 20 49 6e 20 6e 6f 20 65 76 65  imed.  In no eve
03f0: 6e 74 20 73 68 61 6c 6c 0a 2a 2a 20 74 68 65 20  nt shall.** the 
0400: 61 75 74 68 6f 72 20 6f 72 20 63 6f 6e 74 72 69  author or contri
0410: 62 75 74 6f 72 73 20 62 65 20 6c 69 61 62 6c 65  butors be liable
0420: 20 66 6f 72 20 61 6e 79 20 64 69 72 65 63 74 2c   for any direct,
0430: 20 69 6e 64 69 72 65 63 74 2c 20 69 6e 63 69 64   indirect, incid
0440: 65 6e 74 61 6c 2c 0a 2a 2a 20 73 70 65 63 69 61  ental,.** specia
0450: 6c 2c 20 65 78 65 6d 70 6c 61 72 79 2c 20 6f 72  l, exemplary, or
0460: 20 63 6f 6e 73 65 71 75 65 6e 74 69 61 6c 20 64   consequential d
0470: 61 6d 61 67 65 73 20 28 69 6e 63 6c 75 64 69 6e  amages (includin
0480: 67 2c 20 62 75 74 20 6e 6f 74 20 6c 69 6d 69 74  g, but not limit
0490: 65 64 0a 2a 2a 20 74 6f 2c 20 70 72 6f 63 75 72  ed.** to, procur
04a0: 65 6d 65 6e 74 20 6f 66 20 73 75 62 73 74 69 74  ement of substit
04b0: 75 74 65 20 67 6f 6f 64 73 20 6f 72 20 73 65 72  ute goods or ser
04c0: 76 69 63 65 73 3b 20 6c 6f 73 73 20 6f 66 20 75  vices; loss of u
04d0: 73 65 2c 20 64 61 74 61 20 6f 72 0a 2a 2a 20 70  se, data or.** p
04e0: 72 6f 66 69 74 73 3b 20 6f 72 20 62 75 73 69 6e  rofits; or busin
04f0: 65 73 73 20 69 6e 74 65 72 72 75 70 74 69 6f 6e  ess interruption
0500: 29 20 68 6f 77 65 76 65 72 20 63 61 75 73 65 64  ) however caused
0510: 20 61 6e 64 20 6f 6e 20 61 6e 79 20 74 68 65 6f   and on any theo
0520: 72 79 20 6f 66 0a 2a 2a 20 6c 69 61 62 69 6c 69  ry of.** liabili
0530: 74 79 2c 20 77 68 65 74 68 65 72 20 69 6e 20 63  ty, whether in c
0540: 6f 6e 74 72 61 63 74 2c 20 73 74 72 69 63 74 20  ontract, strict 
0550: 6c 69 61 62 69 6c 69 74 79 2c 20 6f 72 20 74 6f  liability, or to
0560: 72 74 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  rt (including.**
0570: 20 6e 65 67 6c 69 67 65 6e 63 65 20 6f 72 20 6f   negligence or o
0580: 74 68 65 72 77 69 73 65 29 20 61 72 69 73 69 6e  therwise) arisin
0590: 67 20 69 6e 20 61 6e 79 20 77 61 79 20 6f 75 74  g in any way out
05a0: 20 6f 66 20 74 68 65 20 75 73 65 20 6f 66 20 74   of the use of t
05b0: 68 69 73 0a 2a 2a 20 73 6f 66 74 77 61 72 65 2c  his.** software,
05c0: 20 65 76 65 6e 20 69 66 20 61 64 76 69 73 65 64   even if advised
05d0: 20 6f 66 20 74 68 65 20 70 6f 73 73 69 62 69 6c   of the possibil
05e0: 69 74 79 20 6f 66 20 73 75 63 68 20 64 61 6d 61  ity of such dama
05f0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ge..**.** This p
0600: 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74 72 69  rogram is distri
0610: 62 75 74 65 64 20 69 6e 20 74 68 65 20 68 6f 70  buted in the hop
0620: 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  e that it will b
0630: 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62 75 74  e useful,.** but
0640: 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77 61 72   without any war
0650: 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74 20 65  ranty; without e
0660: 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65 64 20  ven the implied 
0670: 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a 20 6d  warranty of.** m
0680: 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79 20 6f  erchantability o
0690: 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20 61 20  r fitness for a 
06a0: 70 61 72 74 69 63 75 6c 61 72 20 70 75 72 70 6f  particular purpo
06b0: 73 65 2e 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61  se..** appropria
06c0: 74 65 20 68 65 61 64 65 72 20 66 69 6c 65 73 2e  te header files.
06d0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .*/.#include <st
06e0: 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  dio.h>.#include 
06f0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
0700: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0710: 6e 63 6c 75 64 65 20 3c 6d 65 6d 6f 72 79 2e 68  nclude <memory.h
0720: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0730: 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  stat.h>.#include
0740: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
0750: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0760: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 20 5f 5f  .#if defined( __
0770: 4d 49 4e 47 57 33 32 5f 5f 29 20 7c 7c 20 20 64  MINGW32__) ||  d
0780: 65 66 69 6e 65 64 28 5f 5f 44 4d 43 5f 5f 29 20  efined(__DMC__) 
0790: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f  || defined(_MSC_
07a0: 56 45 52 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  VER) || defined(
07b0: 5f 5f 50 4f 43 43 5f 5f 29 0a 23 20 20 69 66 6e  __POCC__).#  ifn
07c0: 64 65 66 20 57 49 4e 33 32 0a 23 20 20 20 20 64  def WIN32.#    d
07d0: 65 66 69 6e 65 20 57 49 4e 33 32 0a 23 20 20 65  efine WIN32.#  e
07e0: 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 69 6e 63  ndif.#else.# inc
07f0: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
0800: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0810: 63 72 6f 73 20 66 6f 72 20 64 65 62 75 67 67 69  cros for debuggi
0820: 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 44 45  ng..*/.#ifdef DE
0830: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 64  BUG.static int d
0840: 65 62 75 67 4d 61 73 6b 20 3d 20 30 3b 0a 23 20  ebugMask = 0;.# 
0850: 64 65 66 69 6e 65 20 64 65 62 75 67 30 28 46 2c  define debug0(F,
0860: 4d 29 20 20 20 20 20 20 20 69 66 28 20 28 46 29  M)       if( (F)
0870: 26 64 65 62 75 67 4d 61 73 6b 20 29 7b 20 66 70  &debugMask ){ fp
0880: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 4d 29 3b  rintf(stderr,M);
0890: 20 7d 0a 23 20 64 65 66 69 6e 65 20 64 65 62 75   }.# define debu
08a0: 67 31 28 46 2c 4d 2c 41 29 20 20 20 20 20 69 66  g1(F,M,A)     if
08b0: 28 20 28 46 29 26 64 65 62 75 67 4d 61 73 6b 20  ( (F)&debugMask 
08c0: 29 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  ){ fprintf(stder
08d0: 72 2c 4d 2c 41 29 3b 20 7d 0a 23 20 64 65 66 69  r,M,A); }.# defi
08e0: 6e 65 20 64 65 62 75 67 32 28 46 2c 4d 2c 41 2c  ne debug2(F,M,A,
08f0: 42 29 20 20 20 69 66 28 20 28 46 29 26 64 65 62  B)   if( (F)&deb
0900: 75 67 4d 61 73 6b 20 29 7b 20 66 70 72 69 6e 74  ugMask ){ fprint
0910: 66 28 73 74 64 65 72 72 2c 4d 2c 41 2c 42 29 3b  f(stderr,M,A,B);
0920: 20 7d 0a 23 20 64 65 66 69 6e 65 20 64 65 62 75   }.# define debu
0930: 67 33 28 46 2c 4d 2c 41 2c 42 2c 43 29 20 69 66  g3(F,M,A,B,C) if
0940: 28 20 28 46 29 26 64 65 62 75 67 4d 61 73 6b 20  ( (F)&debugMask 
0950: 29 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  ){ fprintf(stder
0960: 72 2c 4d 2c 41 2c 42 2c 43 29 3b 20 7d 0a 23 20  r,M,A,B,C); }.# 
0970: 64 65 66 69 6e 65 20 50 41 52 53 45 52 20 20 20  define PARSER   
0980: 20 20 20 30 78 30 30 30 30 30 30 30 31 0a 23 20     0x00000001.# 
0990: 64 65 66 69 6e 65 20 44 45 43 4c 5f 44 55 4d 50  define DECL_DUMP
09a0: 20 20 20 30 78 30 30 30 30 30 30 30 32 0a 23 20     0x00000002.# 
09b0: 64 65 66 69 6e 65 20 54 4f 4b 45 4e 49 5a 45 52  define TOKENIZER
09c0: 20 20 20 30 78 30 30 30 30 30 30 30 34 0a 23 65     0x00000004.#e
09d0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 65 62  lse.# define deb
09e0: 75 67 30 28 46 6c 61 67 73 2c 20 46 6f 72 6d 61  ug0(Flags, Forma
09f0: 74 29 0a 23 20 64 65 66 69 6e 65 20 64 65 62 75  t).# define debu
0a00: 67 31 28 46 6c 61 67 73 2c 20 46 6f 72 6d 61 74  g1(Flags, Format
0a10: 2c 20 41 29 0a 23 20 64 65 66 69 6e 65 20 64 65  , A).# define de
0a20: 62 75 67 32 28 46 6c 61 67 73 2c 20 46 6f 72 6d  bug2(Flags, Form
0a30: 61 74 2c 20 41 2c 20 42 29 0a 23 20 64 65 66 69  at, A, B).# defi
0a40: 6e 65 20 64 65 62 75 67 33 28 46 6c 61 67 73 2c  ne debug3(Flags,
0a50: 20 46 6f 72 6d 61 74 2c 20 41 2c 20 42 2c 20 43   Format, A, B, C
0a60: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
0a70: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  The following ma
0a80: 63 72 6f 73 20 61 72 65 20 70 75 72 65 6c 79 20  cros are purely 
0a90: 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20  for the purpose 
0aa0: 6f 66 20 74 65 73 74 69 6e 67 20 74 68 69 73 0a  of testing this.
0ab0: 2a 2a 20 70 72 6f 67 72 61 6d 20 6f 6e 20 69 74  ** program on it
0ac0: 73 65 6c 66 2e 20 20 54 68 65 79 20 64 6f 6e 27  self.  They don'
0ad0: 74 20 72 65 61 6c 6c 79 20 63 6f 6e 74 72 69 62  t really contrib
0ae0: 75 74 65 20 74 6f 20 74 68 65 20 63 6f 64 65 2e  ute to the code.
0af0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4e 54 45  .*/.#define INTE
0b00: 52 46 41 43 45 20 31 0a 23 64 65 66 69 6e 65 20  RFACE 1.#define 
0b10: 45 58 50 4f 52 54 5f 49 4e 54 45 52 46 41 43 45  EXPORT_INTERFACE
0b20: 20 31 0a 23 64 65 66 69 6e 65 20 45 58 50 4f 52   1.#define EXPOR
0b30: 54 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 74 6f  T../*.** Each to
0b40: 6b 65 6e 20 69 6e 20 61 20 73 6f 75 72 63 65 20  ken in a source 
0b50: 66 69 6c 65 20 69 73 20 72 65 70 72 65 73 65 6e  file is represen
0b60: 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  ted by an instan
0b70: 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c  ce of.** the fol
0b80: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
0b90: 2e 20 20 54 6f 6b 65 6e 73 20 61 72 65 20 63 6f  .  Tokens are co
0ba0: 6c 6c 65 63 74 65 64 20 6f 6e 74 6f 20 61 20 6c  llected onto a l
0bb0: 69 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ist..*/.typedef 
0bc0: 73 74 72 75 63 74 20 54 6f 6b 65 6e 20 54 6f 6b  struct Token Tok
0bd0: 65 6e 3b 0a 73 74 72 75 63 74 20 54 6f 6b 65 6e  en;.struct Token
0be0: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
0bf0: 2a 7a 54 65 78 74 3b 20 20 20 20 20 20 2f 2a 20  *zText;      /* 
0c00: 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  The text of the 
0c10: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  token */.  int n
0c20: 54 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Text;           
0c30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0c40: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
0c50: 65 20 74 6f 6b 65 6e 27 73 20 74 65 78 74 20 2a  e token's text *
0c60: 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  /.  int eType;  
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0c80: 68 65 20 74 79 70 65 20 6f 66 20 74 68 69 73 20  he type of this 
0c90: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  token */.  int n
0ca0: 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20  Line;           
0cb0: 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e     /* The line n
0cc0: 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20 74  umber on which t
0cd0: 68 65 20 74 6f 6b 65 6e 20 73 74 61 72 74 73 20  he token starts 
0ce0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6d  */.  Token *pCom
0cf0: 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  ment;        /* 
0d00: 4d 6f 73 74 20 72 65 63 65 6e 74 20 62 6c 6f 63  Most recent bloc
0d10: 6b 20 63 6f 6d 6d 65 6e 74 20 62 65 66 6f 72 65  k comment before
0d20: 20 74 68 69 73 20 74 6f 6b 65 6e 20 2a 2f 0a 20   this token */. 
0d30: 20 54 6f 6b 65 6e 20 2a 70 4e 65 78 74 3b 20 20   Token *pNext;  
0d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
0d50: 20 74 6f 6b 65 6e 20 6f 6e 20 74 68 65 20 6c 69   token on the li
0d60: 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  st */.  Token *p
0d70: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
0d80: 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 6f 6b 65  /* Previous toke
0d90: 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  n on the list */
0da0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  .};../*.** Durin
0db0: 67 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 2c 20  g tokenization, 
0dc0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
0dd0: 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  t the state of t
0de0: 68 65 20 69 6e 70 75 74 0a 2a 2a 20 73 74 72 65  he input.** stre
0df0: 61 6d 20 69 73 20 68 65 6c 64 20 69 6e 20 61 6e  am is held in an
0e00: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0e10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
0e20: 74 75 72 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ture.*/.typedef 
0e30: 73 74 72 75 63 74 20 49 6e 53 74 72 65 61 6d 20  struct InStream 
0e40: 49 6e 53 74 72 65 61 6d 3b 0a 73 74 72 75 63 74  InStream;.struct
0e50: 20 49 6e 53 74 72 65 61 6d 20 7b 0a 20 20 63 6f   InStream {.  co
0e60: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  nst char *z;    
0e70: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
0e80: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 69 6e  e text of the in
0e90: 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  put */.  int i; 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0eb0: 20 2f 2a 20 4e 65 78 74 20 63 68 61 72 61 63 74   /* Next charact
0ec0: 65 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  er to read from 
0ed0: 74 68 65 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69  the input */.  i
0ee0: 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20  nt nLine;       
0ef0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
0f00: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 68  ne number for ch
0f10: 61 72 61 63 74 65 72 20 7a 5b 69 5d 20 2a 2f 0a  aracter z[i] */.
0f20: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 64  };../*.** Each d
0f30: 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 20 74 68  eclaration in th
0f40: 65 20 43 20 6f 72 20 43 2b 2b 20 73 6f 75 72 63  e C or C++ sourc
0f50: 65 20 66 69 6c 65 73 20 69 73 20 70 61 72 73 65  e files is parse
0f60: 64 20 6f 75 74 20 61 6e 64 20 73 74 6f 72 65 64  d out and stored
0f70: 20 61 73 0a 2a 2a 20 61 6e 20 69 6e 73 74 61 6e   as.** an instan
0f80: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0f90: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0fa0: 2a 0a 2a 2a 20 41 20 22 66 6f 72 77 61 72 64 20  *.** A "forward 
0fb0: 64 65 63 6c 61 72 61 74 69 6f 6e 22 20 69 73 20  declaration" is 
0fc0: 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 68  a declaration th
0fd0: 61 74 20 61 6e 20 6f 62 6a 65 63 74 20 65 78 69  at an object exi
0fe0: 73 74 73 20 74 68 61 74 0a 2a 2a 20 64 6f 65 73  sts that.** does
0ff0: 6e 27 74 20 74 65 6c 6c 20 61 62 6f 75 74 20 74  n't tell about t
1000: 68 65 20 6f 62 6a 65 63 74 73 20 73 74 72 75 63  he objects struc
1010: 74 75 72 65 2e 20 20 41 20 74 79 70 69 63 61 6c  ture.  A typical
1020: 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   forward declara
1030: 74 69 6f 6e 0a 2a 2a 20 69 73 3a 0a 2a 2a 0a 2a  tion.** is:.**.*
1040: 2a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  *          struc
1050: 74 20 58 79 7a 7a 79 3b 0a 2a 2a 0a 2a 2a 20 4e  t Xyzzy;.**.** N
1060: 6f 74 20 65 76 65 72 79 20 6f 62 6a 65 63 74 20  ot every object 
1070: 68 61 73 20 61 20 66 6f 72 77 61 72 64 20 64 65  has a forward de
1080: 63 6c 61 72 61 74 69 6f 6e 2e 20 20 49 66 20 69  claration.  If i
1090: 74 20 64 6f 65 73 2c 20 74 68 6f 75 67 68 74 2c  t does, thought,
10a0: 20 74 68 65 0a 2a 2a 20 66 6f 72 77 61 72 64 20   the.** forward 
10b0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 77 69 6c 6c  declaration will
10c0: 20 62 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   be contained in
10d0: 20 74 68 65 20 7a 46 77 64 20 66 69 65 6c 64 20   the zFwd field 
10e0: 66 6f 72 20 43 20 61 6e 64 0a 2a 2a 20 74 68 65  for C and.** the
10f0: 20 7a 46 77 64 43 70 70 20 66 6f 72 20 43 2b 2b   zFwdCpp for C++
1100: 2e 20 20 54 68 65 20 7a 44 65 63 6c 20 66 69 65  .  The zDecl fie
1110: 6c 64 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ld contains the 
1120: 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20 64 65 63 6c  complete.** decl
1130: 61 72 61 74 69 6f 6e 20 74 65 78 74 2e 0a 2a 2f  aration text..*/
1140: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1150: 44 65 63 6c 20 44 65 63 6c 3b 0a 73 74 72 75 63  Decl Decl;.struc
1160: 74 20 44 65 63 6c 20 7b 0a 20 20 63 68 61 72 20  t Decl {.  char 
1170: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a  *zName;       /*
1180: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a   Name of the obj
1190: 65 63 74 20 62 65 69 6e 67 20 64 65 63 6c 61 72  ect being declar
11a0: 65 64 2e 20 20 54 68 65 20 61 70 70 65 61 72 61  ed.  The appeara
11b0: 6e 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  nce.            
11c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74           ** of t
11d0: 68 69 73 20 6e 61 6d 65 20 69 73 20 61 20 73 6f  his name is a so
11e0: 75 72 63 65 20 66 69 6c 65 20 74 72 69 67 67 65  urce file trigge
11f0: 72 73 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rs the declarati
1200: 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  on.             
1210: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
1220: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 68 65   added to the he
1230: 61 64 65 72 20 66 6f 72 20 74 68 61 74 20 66 69  ader for that fi
1240: 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  le. */.  const c
1250: 68 61 72 20 2a 7a 46 69 6c 65 3b 20 2f 2a 20 46  har *zFile; /* F
1260: 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 65  ile from which e
1270: 78 74 72 61 63 74 65 64 2e 20 20 2a 2f 0a 20 20  xtracted.  */.  
1280: 63 68 61 72 20 2a 7a 49 66 3b 20 20 20 20 20 20  char *zIf;      
1290: 20 20 20 2f 2a 20 53 75 72 72 6f 75 6e 64 20 74     /* Surround t
12a0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 77  he declaration w
12b0: 69 74 68 20 74 68 69 73 20 23 69 66 20 2a 2f 0a  ith this #if */.
12c0: 20 20 63 68 61 72 20 2a 7a 46 77 64 3b 20 20 20    char *zFwd;   
12d0: 20 20 20 20 20 2f 2a 20 41 20 66 6f 72 77 61 72       /* A forwar
12e0: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 20  d declaration.  
12f0: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
1300: 20 6e 6f 6e 65 2e 20 2a 2f 0a 20 20 63 68 61 72   none. */.  char
1310: 20 2a 7a 46 77 64 43 70 70 3b 20 20 20 20 20 2f   *zFwdCpp;     /
1320: 2a 20 55 73 65 20 74 68 69 73 20 66 6f 72 77 61  * Use this forwa
1330: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 66  rd declaration f
1340: 6f 72 20 43 2b 2b 2e 20 2a 2f 0a 20 20 63 68 61  or C++. */.  cha
1350: 72 20 2a 7a 44 65 63 6c 3b 20 20 20 20 20 20 20  r *zDecl;       
1360: 2f 2a 20 41 20 66 75 6c 6c 20 64 65 63 6c 61 72  /* A full declar
1370: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 6f 62  ation of this ob
1380: 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
1390: 7a 45 78 74 72 61 3b 20 20 20 20 20 20 2f 2a 20  zExtra;      /* 
13a0: 45 78 74 72 61 20 64 65 63 6c 61 72 61 74 69 6f  Extra declaratio
13b0: 6e 20 74 65 78 74 20 69 6e 73 65 72 74 65 64 20  n text inserted 
13c0: 69 6e 74 6f 20 63 6c 61 73 73 20 6f 62 6a 65 63  into class objec
13d0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 78 74 72  ts */.  int extr
13e0: 61 54 79 70 65 3b 20 20 20 20 20 2f 2a 20 4c 61  aType;     /* La
13f0: 73 74 20 70 75 62 6c 69 63 3a 2c 20 70 72 6f 74  st public:, prot
1400: 65 63 74 65 64 3a 20 6f 72 20 70 72 69 76 61 74  ected: or privat
1410: 65 3a 20 69 6e 20 7a 45 78 74 72 61 44 65 63 6c  e: in zExtraDecl
1420: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 49 6e 63   */.  struct Inc
1430: 6c 75 64 65 20 2a 70 49 6e 63 6c 75 64 65 3b 20  lude *pInclude; 
1440: 20 20 2f 2a 20 23 69 6e 63 6c 75 64 65 73 20 74    /* #includes t
1450: 68 61 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20  hat come before 
1460: 74 68 69 73 20 64 65 63 6c 61 72 61 74 69 6f 6e  this declaration
1470: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   */.  int flags;
1480: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20           /* See 
1490: 74 68 65 20 22 50 72 6f 70 65 72 74 69 65 73 22  the "Properties"
14a0: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 54 6f 6b 65   below */.  Toke
14b0: 6e 20 2a 70 43 6f 6d 6d 65 6e 74 3b 20 20 20 2f  n *pComment;   /
14c0: 2a 20 41 20 62 6c 6f 63 6b 20 63 6f 6d 6d 65 6e  * A block commen
14d0: 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
14e0: 68 20 74 68 69 73 20 64 65 63 6c 61 72 61 74 69  h this declarati
14f0: 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 74 6f  on */.  Token to
1500: 6b 65 6e 43 6f 64 65 3b 20 20 20 2f 2a 20 49 6d  kenCode;   /* Im
1510: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1520: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 70 72  functions and pr
1530: 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 44 65  ocedures */.  De
1540: 63 6c 20 2a 70 53 61 6d 65 4e 61 6d 65 3b 20 20  cl *pSameName;  
1550: 20 2f 2a 20 4e 65 78 74 20 64 65 63 6c 61 72 61   /* Next declara
1560: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73 61  tion with the sa
1570: 6d 65 20 22 7a 4e 61 6d 65 22 20 2a 2f 0a 20 20  me "zName" */.  
1580: 44 65 63 6c 20 2a 70 53 61 6d 65 48 61 73 68 3b  Decl *pSameHash;
1590: 20 20 20 2f 2a 20 4e 65 78 74 20 64 65 63 6c 61     /* Next decla
15a0: 72 61 74 69 6f 6e 20 77 69 74 68 20 73 61 6d 65  ration with same
15b0: 20 68 61 73 68 20 62 75 74 20 64 69 66 66 65 72   hash but differ
15c0: 65 6e 74 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 44  ent zName */.  D
15d0: 65 63 6c 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ecl *pNext;     
15e0: 20 20 2f 2a 20 4e 65 78 74 20 64 65 63 6c 61 72    /* Next declar
15f0: 61 74 69 6f 6e 20 77 69 74 68 20 61 20 64 69 66  ation with a dif
1600: 66 65 72 65 6e 74 20 6e 61 6d 65 20 2a 2f 0a 7d  ferent name */.}
1610: 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 65 72 74  ;../*.** Propert
1620: 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
1630: 69 74 68 20 64 65 63 6c 61 72 61 74 69 6f 6e 73  ith declarations
1640: 2e 0a 2a 2a 0a 2a 2a 20 44 50 5f 46 6f 72 77 61  ..**.** DP_Forwa
1650: 72 64 20 61 6e 64 20 44 50 5f 44 65 63 6c 61 72  rd and DP_Declar
1660: 65 64 20 61 72 65 20 75 73 65 64 20 64 75 72 69  ed are used duri
1670: 6e 67 20 74 68 65 20 67 65 6e 65 72 61 74 69 6f  ng the generatio
1680: 6e 20 6f 66 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  n of a single.**
1690: 20 68 65 61 64 65 72 20 66 69 6c 65 20 69 6e 20   header file in 
16a0: 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e 74  order to prevent
16b0: 20 64 75 70 6c 69 63 61 74 65 20 64 65 63 6c 61   duplicate decla
16c0: 72 61 74 69 6f 6e 73 20 61 6e 64 20 64 65 66 69  rations and defi
16d0: 6e 69 74 69 6f 6e 73 2e 0a 2a 2a 20 44 50 5f 46  nitions..** DP_F
16e0: 6f 72 77 61 72 64 20 69 73 20 73 65 74 20 61 66  orward is set af
16f0: 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 68  ter the object h
1700: 61 73 20 62 65 65 6e 20 67 69 76 65 6e 20 61 20  as been given a 
1710: 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  forward declarat
1720: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 44 50 5f 44 65  ion.** and DP_De
1730: 63 6c 61 72 65 64 20 69 73 20 73 65 74 20 61 66  clared is set af
1740: 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 67  ter the object g
1750: 65 74 73 20 61 20 66 75 6c 6c 20 64 65 63 6c 61  ets a full decla
1760: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 20 28 45 78 61  rations..** (Exa
1770: 6d 70 6c 65 3a 20 20 41 20 66 6f 72 77 61 72 64  mple:  A forward
1780: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 73 20   declaration is 
1790: 22 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  "typedef struct 
17a0: 41 62 63 20 41 62 63 3b 22 20 61 6e 64 20 74 68  Abc Abc;" and th
17b0: 65 0a 2a 2a 20 66 75 6c 6c 20 64 65 63 6c 61 72  e.** full declar
17c0: 61 74 69 6f 6e 20 69 73 20 22 73 74 72 75 63 74  ation is "struct
17d0: 20 41 62 63 20 7b 20 69 6e 74 20 61 3b 20 66 6c   Abc { int a; fl
17e0: 6f 61 74 20 62 3b 20 7d 3b 22 2e 29 0a 2a 2a 0a  oat b; };".).**.
17f0: 2a 2a 20 54 68 65 20 44 50 5f 45 78 70 6f 72 74  ** The DP_Export
1800: 20 61 6e 64 20 44 50 5f 4c 6f 63 61 6c 20 66 6c   and DP_Local fl
1810: 61 67 73 20 61 72 65 20 6d 6f 72 65 20 70 65 72  ags are more per
1820: 6d 61 6e 65 6e 74 2e 20 20 54 68 65 79 20 6d 61  manent.  They ma
1830: 72 6b 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 74 68  rk objects.** th
1840: 61 74 20 68 61 76 65 20 45 58 50 4f 52 54 20 73  at have EXPORT s
1850: 63 6f 70 65 20 61 6e 64 20 4c 4f 43 41 4c 20 73  cope and LOCAL s
1860: 63 6f 70 65 20 72 65 73 70 65 63 74 69 76 65 6c  cope respectivel
1870: 79 2e 20 20 49 66 20 62 6f 74 68 20 6f 66 20 74  y.  If both of t
1880: 68 65 73 65 0a 2a 2a 20 6d 61 72 6b 73 20 61 72  hese.** marks ar
1890: 65 20 6d 69 73 73 69 6e 67 2c 20 74 68 65 6e 20  e missing, then 
18a0: 74 68 65 20 6f 62 6a 65 63 74 20 68 61 73 20 6c  the object has l
18b0: 69 62 72 61 72 79 20 73 63 6f 70 65 2e 20 20 54  ibrary scope.  T
18c0: 68 65 20 6d 65 61 6e 69 6e 67 73 20 6f 66 0a 2a  he meanings of.*
18d0: 2a 20 74 68 65 20 73 63 6f 70 65 73 20 61 72 65  * the scopes are
18e0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
18f0: 2a 2a 20 20 20 20 4c 4f 43 41 4c 20 73 63 6f 70  **    LOCAL scop
1900: 65 20 20 20 20 20 20 20 20 20 54 68 65 20 6f 62  e         The ob
1910: 6a 65 63 74 20 69 73 20 6f 6e 6c 79 20 75 73 61  ject is only usa
1920: 62 6c 65 20 77 69 74 68 69 6e 20 74 68 65 20 66  ble within the f
1930: 69 6c 65 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ile in.**       
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 77 68 69 63 68 20 69 74 20 69 73 20 64 65 63   which it is dec
1960: 6c 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lared..**.**    
1970: 6c 69 62 72 61 72 79 20 73 63 6f 70 65 20 20 20  library scope   
1980: 20 20 20 20 54 68 65 20 6f 62 6a 65 63 74 20 69      The object i
1990: 73 20 76 69 73 69 62 6c 65 20 61 6e 64 20 75 73  s visible and us
19a0: 61 62 6c 65 20 77 69 74 68 69 6e 20 6f 74 68 65  able within othe
19b0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
19d0: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  s in the same pr
19e0: 6f 6a 65 63 74 2e 20 20 42 79 20 69 66 20 74 68  oject.  By if th
19f0: 65 20 70 72 6f 6a 65 63 74 20 69 73 0a 2a 2a 20  e project is.** 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 20 20 20 61 20 6c 69 62 72 61 72 79         a library
1a20: 2c 20 74 68 65 6e 20 74 68 65 20 6f 62 6a 65 63  , then the objec
1a30: 74 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65  t is not visible
1a40: 20 74 6f 20 75 73 65 72 73 0a 2a 2a 20 20 20 20   to users.**    
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 6f 66 20 74 68 65 20 6c 69 62 72 61      of the libra
1a70: 72 79 2e 20 20 28 69 2e 65 2e 20 74 68 65 20 6f  ry.  (i.e. the o
1a80: 62 6a 65 63 74 20 64 6f 65 73 20 6e 6f 74 20 61  bject does not a
1a90: 70 70 65 61 72 0a 2a 2a 20 20 20 20 20 20 20 20  ppear.**        
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 77 68  in the output wh
1ac0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 2d 48 20  en using the -H 
1ad0: 6f 70 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 20  option.).**.**  
1ae0: 20 20 45 58 50 4f 52 54 20 73 63 6f 70 65 20 20    EXPORT scope  
1af0: 20 20 20 20 20 20 54 68 65 20 6f 62 6a 65 63 74        The object
1b00: 20 69 73 20 76 69 73 69 62 6c 65 20 61 6e 64 20   is visible and 
1b10: 75 73 61 62 6c 65 20 65 76 65 72 79 77 68 65 72  usable everywher
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 44 50 5f  e..**.** The DP_
1b30: 46 6c 61 67 20 69 73 20 61 20 74 65 6d 70 6f 72  Flag is a tempor
1b40: 61 72 79 20 75 73 65 20 66 6c 61 67 20 74 68 61  ary use flag tha
1b50: 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  t is used during
1b60: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 6f 0a 2a   processing to.*
1b70: 2a 20 70 72 65 76 65 6e 74 20 61 6e 20 69 6e 66  * prevent an inf
1b80: 69 6e 69 74 65 20 6c 6f 6f 70 2e 20 20 49 74 27  inite loop.  It'
1b90: 73 20 75 73 65 20 69 73 20 6c 6f 63 61 6c 69 7a  s use is localiz
1ba0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 44 50  ed..**.** The DP
1bb0: 5f 43 70 6c 75 73 70 6c 75 73 2c 20 44 50 5f 45  _Cplusplus, DP_E
1bc0: 78 74 65 72 6e 43 52 65 71 64 20 61 6e 64 20 44  xternCReqd and D
1bd0: 50 5f 45 78 74 65 72 6e 52 65 71 64 20 66 6c 61  P_ExternReqd fla
1be0: 67 73 20 61 72 65 20 70 65 72 6d 61 6e 65 6e 74  gs are permanent
1bf0: 0a 2a 2a 20 61 6e 64 20 61 72 65 20 75 73 65 64  .** and are used
1c00: 20 74 6f 20 73 70 65 63 69 66 79 20 77 68 61 74   to specify what
1c10: 20 74 79 70 65 20 6f 66 20 64 65 63 6c 61 72 61   type of declara
1c20: 74 69 6f 6e 20 74 68 65 20 6f 62 6a 65 63 74 20  tion the object 
1c30: 72 65 71 75 69 72 65 73 2e 0a 2a 2f 0a 23 64 65  requires..*/.#de
1c40: 66 69 6e 65 20 44 50 5f 46 6f 72 77 61 72 64 20  fine DP_Forward 
1c50: 20 20 20 20 20 30 78 30 30 31 20 20 20 2f 2a 20       0x001   /* 
1c60: 48 61 73 20 61 20 66 6f 72 77 61 72 64 20 64 65  Has a forward de
1c70: 63 6c 61 72 61 74 69 6f 6e 20 69 6e 20 74 68 69  claration in thi
1c80: 73 20 66 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e  s file */.#defin
1c90: 65 20 44 50 5f 44 65 63 6c 61 72 65 64 20 20 20  e DP_Declared   
1ca0: 20 20 30 78 30 30 32 20 20 20 2f 2a 20 48 61 73    0x002   /* Has
1cb0: 20 61 20 66 75 6c 6c 20 64 65 63 6c 61 72 61 74   a full declarat
1cc0: 69 6f 6e 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ion in this file
1cd0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 50 5f 45   */.#define DP_E
1ce0: 78 70 6f 72 74 20 20 20 20 20 20 20 30 78 30 30  xport       0x00
1cf0: 34 20 20 20 2f 2a 20 45 78 70 6f 72 74 20 74 68  4   /* Export th
1d00: 69 73 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  is declaration *
1d10: 2f 0a 23 64 65 66 69 6e 65 20 44 50 5f 4c 6f 63  /.#define DP_Loc
1d20: 61 6c 20 20 20 20 20 20 20 20 30 78 30 30 38 20  al        0x008 
1d30: 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 69 6e 20    /* Declare in 
1d40: 69 74 73 20 68 6f 6d 65 20 66 69 6c 65 20 6f 6e  its home file on
1d50: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 50  ly */.#define DP
1d60: 5f 46 6c 61 67 20 20 20 20 20 20 20 20 20 30 78  _Flag         0x
1d70: 30 31 30 20 20 20 2f 2a 20 55 73 65 20 74 6f 20  010   /* Use to 
1d80: 6d 61 72 6b 20 61 20 73 75 62 73 65 74 20 6f 66  mark a subset of
1d90: 20 61 20 44 65 63 6c 20 6c 69 73 74 0a 20 20 20   a Decl list.   
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1dc0: 66 6f 72 20 73 70 65 63 69 61 6c 20 70 72 6f 63  for special proc
1dd0: 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e  essing */.#defin
1de0: 65 20 44 50 5f 43 70 6c 75 73 70 6c 75 73 20 20  e DP_Cplusplus  
1df0: 20 20 30 78 30 32 30 20 20 20 2f 2a 20 48 61 73    0x020   /* Has
1e00: 20 43 2b 2b 20 6c 69 6e 6b 61 67 65 20 61 6e 64   C++ linkage and
1e10: 20 63 61 6e 6e 6f 74 20 61 70 70 65 61 72 20 69   cannot appear i
1e20: 6e 20 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  n a.            
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 2a 2a 20 43 20 68 65 61 64 65 72 20      ** C header 
1e50: 66 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  file */.#define 
1e60: 44 50 5f 45 78 74 65 72 6e 43 52 65 71 64 20 20  DP_ExternCReqd  
1e70: 30 78 30 34 30 20 20 20 2f 2a 20 50 72 65 70 65  0x040   /* Prepe
1e80: 6e 64 20 27 65 78 74 65 72 6e 20 22 43 22 27 20  nd 'extern "C"' 
1e90: 69 6e 20 61 20 43 2b 2b 20 68 65 61 64 65 72 2e  in a C++ header.
1ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 2a 2a 20 50 72 65 70 65 6e 64 20 6e 6f 74 68   ** Prepend noth
1ed0: 69 6e 67 20 69 6e 20 61 20 43 20 68 65 61 64 65  ing in a C heade
1ee0: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 50 5f  r */.#define DP_
1ef0: 45 78 74 65 72 6e 52 65 71 64 20 20 20 30 78 30  ExternReqd   0x0
1f00: 38 30 20 20 20 2f 2a 20 50 72 65 70 65 6e 64 20  80   /* Prepend 
1f10: 27 65 78 74 65 72 6e 20 22 43 22 27 20 69 6e 20  'extern "C"' in 
1f20: 61 20 43 2b 2b 20 68 65 61 64 65 72 20 69 66 0a  a C++ header if.
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 2a 2a 20 44 50 5f 43 70 6c 75 73 70 6c 75 73 20  ** DP_Cplusplus 
1f60: 69 73 20 6e 6f 74 20 61 6c 73 6f 20 73 65 74 2e  is not also set.
1f70: 20 49 66 20 44 50 5f 43 70 6c 75 73 70 6c 75 73   If DP_Cplusplus
1f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa0: 20 2a 2a 20 69 73 20 73 65 74 20 6f 72 20 74 68   ** is set or th
1fb0: 69 73 20 69 73 20 61 20 43 20 68 65 61 64 65 72  is is a C header
1fc0: 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20   then.          
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 2a 2a 20 70 72 65 70 65 6e 64        ** prepend
1ff0: 20 27 65 78 74 65 72 6e 27 20 2a 2f 0a 0a 2f 2a   'extern' */../*
2000: 0a 2a 2a 20 43 6f 6e 76 65 6e 69 65 6e 63 65 20  .** Convenience 
2010: 6d 61 63 72 6f 73 20 66 6f 72 20 64 65 61 6c 69  macros for deali
2020: 6e 67 20 77 69 74 68 20 64 65 63 6c 61 72 61 74  ng with declarat
2030: 69 6f 6e 20 70 72 6f 70 65 72 74 69 65 73 0a 2a  ion properties.*
2040: 2f 0a 23 64 65 66 69 6e 65 20 44 65 63 6c 48 61  /.#define DeclHa
2050: 73 50 72 6f 70 65 72 74 79 28 44 2c 50 29 20 20  sProperty(D,P)  
2060: 20 20 28 28 28 44 29 2d 3e 66 6c 61 67 73 26 28    (((D)->flags&(
2070: 50 29 29 3d 3d 28 50 29 29 0a 23 64 65 66 69 6e  P))==(P)).#defin
2080: 65 20 44 65 63 6c 48 61 73 41 6e 79 50 72 6f 70  e DeclHasAnyProp
2090: 65 72 74 79 28 44 2c 50 29 20 28 28 28 44 29 2d  erty(D,P) (((D)-
20a0: 3e 66 6c 61 67 73 26 28 50 29 29 21 3d 30 29 0a  >flags&(P))!=0).
20b0: 23 64 65 66 69 6e 65 20 44 65 63 6c 53 65 74 50  #define DeclSetP
20c0: 72 6f 70 65 72 74 79 28 44 2c 50 29 20 20 20 20  roperty(D,P)    
20d0: 28 44 29 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 50  (D)->flags |= (P
20e0: 29 0a 23 64 65 66 69 6e 65 20 44 65 63 6c 43 6c  ).#define DeclCl
20f0: 65 61 72 50 72 6f 70 65 72 74 79 28 44 2c 50 29  earProperty(D,P)
2100: 20 20 28 44 29 2d 3e 66 6c 61 67 73 20 26 3d 20    (D)->flags &= 
2110: 7e 28 50 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  ~(P)../*.** Thes
2120: 65 20 61 72 65 20 73 74 61 74 65 20 70 72 6f 70  e are state prop
2130: 65 72 74 69 65 73 20 6f 66 20 74 68 65 20 70 61  erties of the pa
2140: 72 73 65 72 2e 20 20 45 61 63 68 20 6f 66 20 74  rser.  Each of t
2150: 68 65 20 76 61 6c 75 65 73 20 69 73 0a 2a 2a 20  he values is.** 
2160: 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20 74 68  distinct from th
2170: 65 20 44 50 5f 20 76 61 6c 75 65 73 20 61 62 6f  e DP_ values abo
2180: 76 65 20 73 6f 20 74 68 61 74 20 62 6f 74 68 20  ve so that both 
2190: 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 0a 2a  can be used in.*
21a0: 2a 20 74 68 65 20 73 61 6d 65 20 22 66 6c 61 67  * the same "flag
21b0: 73 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  s" field..**.** 
21c0: 42 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  Be careful not t
21d0: 6f 20 63 6f 6e 66 75 73 65 20 50 53 5f 45 78 70  o confuse PS_Exp
21e0: 6f 72 74 20 77 69 74 68 20 44 50 5f 45 78 70 6f  ort with DP_Expo
21f0: 72 74 20 6f 72 0a 2a 2a 20 50 53 5f 4c 6f 63 61  rt or.** PS_Loca
2200: 6c 20 77 69 74 68 20 44 50 5f 4c 6f 63 61 6c 2e  l with DP_Local.
2210: 20 20 54 68 65 69 72 20 6e 61 6d 65 73 20 61 72    Their names ar
2220: 65 20 73 69 6d 69 6c 61 72 2c 20 62 75 74 20 74  e similar, but t
2230: 68 65 20 6d 65 61 6e 69 6e 67 73 0a 2a 2a 20 6f  he meanings.** o
2240: 66 20 74 68 65 73 65 20 66 6c 61 67 73 20 61 72  f these flags ar
2250: 65 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  e very different
2260: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f  ..*/.#define PS_
2270: 45 78 74 65 72 6e 20 20 20 20 20 20 20 20 30 78  Extern        0x
2280: 30 30 30 38 30 30 20 20 20 20 2f 2a 20 22 65 78  000800    /* "ex
2290: 74 65 72 6e 22 20 68 61 73 20 62 65 65 6e 20 73  tern" has been s
22a0: 65 65 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  een */.#define P
22b0: 53 5f 45 78 70 6f 72 74 20 20 20 20 20 20 20 20  S_Export        
22c0: 30 78 30 30 31 30 30 30 20 20 20 20 2f 2a 20 49  0x001000    /* I
22d0: 66 20 62 65 74 77 65 65 6e 20 22 23 69 66 20 45  f between "#if E
22e0: 58 50 4f 52 54 5f 49 4e 54 45 52 46 41 43 45 22  XPORT_INTERFACE"
22f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 22 23 65        ** and "#e
2320: 6e 64 69 66 22 20 2a 2f 0a 23 64 65 66 69 6e 65  ndif" */.#define
2330: 20 50 53 5f 45 78 70 6f 72 74 32 20 20 20 20 20   PS_Export2     
2340: 20 20 30 78 30 30 32 30 30 30 20 20 20 20 2f 2a    0x002000    /*
2350: 20 49 66 20 22 45 58 50 4f 52 54 22 20 73 65 65   If "EXPORT" see
2360: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f  n */.#define PS_
2370: 54 79 70 65 64 65 66 20 20 20 20 20 20 20 30 78  Typedef       0x
2380: 30 30 34 30 30 30 20 20 20 20 2f 2a 20 49 66 20  004000    /* If 
2390: 22 74 79 70 65 64 65 66 22 20 68 61 73 20 62 65  "typedef" has be
23a0: 65 6e 20 73 65 65 6e 20 2a 2f 0a 23 64 65 66 69  en seen */.#defi
23b0: 6e 65 20 50 53 5f 53 74 61 74 69 63 20 20 20 20  ne PS_Static    
23c0: 20 20 20 20 30 78 30 30 38 30 30 30 20 20 20 20      0x008000    
23d0: 2f 2a 20 49 66 20 22 73 74 61 74 69 63 22 20 68  /* If "static" h
23e0: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 2a 2f 0a  as been seen */.
23f0: 23 64 65 66 69 6e 65 20 50 53 5f 49 6e 74 65 72  #define PS_Inter
2400: 66 61 63 65 20 20 20 20 20 30 78 30 31 30 30 30  face     0x01000
2410: 30 20 20 20 20 2f 2a 20 49 66 20 77 69 74 68 69  0    /* If withi
2420: 6e 20 23 69 66 20 49 4e 54 45 52 46 41 43 45 2e  n #if INTERFACE.
2430: 2e 23 65 6e 64 69 66 20 2a 2f 0a 23 64 65 66 69  .#endif */.#defi
2440: 6e 65 20 50 53 5f 4d 65 74 68 6f 64 20 20 20 20  ne PS_Method    
2450: 20 20 20 20 30 78 30 32 30 30 30 30 20 20 20 20      0x020000    
2460: 2f 2a 20 49 66 20 22 3a 3a 22 20 74 6f 6b 65 6e  /* If "::" token
2470: 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 2a   has been seen *
2480: 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 4c 6f 63  /.#define PS_Loc
2490: 61 6c 20 20 20 20 20 20 20 20 20 30 78 30 34 30  al         0x040
24a0: 30 30 30 20 20 20 20 2f 2a 20 49 66 20 77 69 74  000    /* If wit
24b0: 68 69 6e 20 23 69 66 20 4c 4f 43 41 4c 5f 49 4e  hin #if LOCAL_IN
24c0: 54 45 52 46 41 43 45 2e 2e 23 65 6e 64 69 66 20  TERFACE..#endif 
24d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 4c 6f  */.#define PS_Lo
24e0: 63 61 6c 32 20 20 20 20 20 20 20 20 30 78 30 38  cal2        0x08
24f0: 30 30 30 30 20 20 20 20 2f 2a 20 49 66 20 22 4c  0000    /* If "L
2500: 4f 43 41 4c 22 20 73 65 65 6e 2e 20 2a 2f 0a 23  OCAL" seen. */.#
2510: 64 65 66 69 6e 65 20 50 53 5f 50 75 62 6c 69 63  define PS_Public
2520: 20 20 20 20 20 20 20 20 30 78 31 30 30 30 30 30          0x100000
2530: 20 20 20 20 2f 2a 20 49 66 20 22 50 55 42 4c 49      /* If "PUBLI
2540: 43 22 20 73 65 65 6e 2e 20 2a 2f 0a 23 64 65 66  C" seen. */.#def
2550: 69 6e 65 20 50 53 5f 50 72 6f 74 65 63 74 65 64  ine PS_Protected
2560: 20 20 20 20 20 30 78 32 30 30 30 30 30 20 20 20       0x200000   
2570: 20 2f 2a 20 49 66 20 22 50 52 4f 54 45 43 54 45   /* If "PROTECTE
2580: 44 22 20 73 65 65 6e 2e 20 2a 2f 0a 23 64 65 66  D" seen. */.#def
2590: 69 6e 65 20 50 53 5f 50 72 69 76 61 74 65 20 20  ine PS_Private  
25a0: 20 20 20 20 20 30 78 34 30 30 30 30 30 20 20 20       0x400000   
25b0: 20 2f 2a 20 49 66 20 22 50 52 49 56 41 54 45 22   /* If "PRIVATE"
25c0: 20 73 65 65 6e 2e 20 2a 2f 0a 23 64 65 66 69 6e   seen. */.#defin
25d0: 65 20 50 53 5f 50 50 50 20 20 20 20 20 20 20 20  e PS_PPP        
25e0: 20 20 20 30 78 37 30 30 30 30 30 20 20 20 20 2f     0x700000    /
25f0: 2a 20 49 66 20 61 6e 79 20 6f 66 20 50 55 42 4c  * If any of PUBL
2600: 49 43 2c 20 50 52 49 56 41 54 45 2c 20 50 52 4f  IC, PRIVATE, PRO
2610: 54 45 43 54 45 44 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  TECTED */../*.**
2620: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
2630: 65 74 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20  et of flags are 
2640: 4f 52 65 64 20 69 6e 74 6f 20 74 68 65 20 22 66  ORed into the "f
2650: 6c 61 67 73 22 20 66 69 65 6c 64 20 6f 66 0a 2a  lags" field of.*
2660: 2a 20 61 20 44 65 63 6c 20 69 6e 20 6f 72 64 65  * a Decl in orde
2670: 72 20 74 6f 20 69 64 65 6e 74 69 66 79 20 77 68  r to identify wh
2680: 61 74 20 74 79 70 65 20 6f 66 20 6f 62 6a 65 63  at type of objec
2690: 74 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 64 65  t is being.** de
26a0: 63 6c 61 72 65 64 2e 0a 2a 2f 0a 23 64 65 66 69  clared..*/.#defi
26b0: 6e 65 20 54 59 5f 43 6c 61 73 73 20 20 20 20 20  ne TY_Class     
26c0: 20 20 20 20 30 78 30 30 31 30 30 30 30 30 0a 23      0x00100000.#
26d0: 64 65 66 69 6e 65 20 54 59 5f 53 75 62 72 6f 75  define TY_Subrou
26e0: 74 69 6e 65 20 20 20 20 30 78 30 30 32 30 30 30  tine    0x002000
26f0: 30 30 0a 23 64 65 66 69 6e 65 20 54 59 5f 4d 61  00.#define TY_Ma
2700: 63 72 6f 20 20 20 20 20 20 20 20 20 30 78 30 30  cro         0x00
2710: 34 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 54  400000.#define T
2720: 59 5f 54 79 70 65 64 65 66 20 20 20 20 20 20 20  Y_Typedef       
2730: 30 78 30 30 38 30 30 30 30 30 0a 23 64 65 66 69  0x00800000.#defi
2740: 6e 65 20 54 59 5f 56 61 72 69 61 62 6c 65 20 20  ne TY_Variable  
2750: 20 20 20 20 30 78 30 31 30 30 30 30 30 30 0a 23      0x01000000.#
2760: 64 65 66 69 6e 65 20 54 59 5f 53 74 72 75 63 74  define TY_Struct
2770: 75 72 65 20 20 20 20 20 30 78 30 32 30 30 30 30  ure     0x020000
2780: 30 30 0a 23 64 65 66 69 6e 65 20 54 59 5f 55 6e  00.#define TY_Un
2790: 69 6f 6e 20 20 20 20 20 20 20 20 20 30 78 30 34  ion         0x04
27a0: 30 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 54  000000.#define T
27b0: 59 5f 45 6e 75 6d 65 72 61 74 69 6f 6e 20 20 20  Y_Enumeration   
27c0: 30 78 30 38 30 30 30 30 30 30 0a 23 64 65 66 69  0x08000000.#defi
27d0: 6e 65 20 54 59 5f 44 65 66 75 6e 63 74 20 20 20  ne TY_Defunct   
27e0: 20 20 20 20 30 78 31 30 30 30 30 30 30 30 20 20      0x10000000  
27f0: 2f 2a 20 55 73 65 64 20 74 6f 20 65 72 61 73 65  /* Used to erase
2800: 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a   a declaration *
2810: 2f 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 6e 65  /../*.** Each ne
2820: 73 74 65 64 20 23 69 66 20 28 6f 72 20 23 69 66  sted #if (or #if
2830: 64 65 66 20 6f 72 20 23 69 66 6e 64 65 66 29 20  def or #ifndef) 
2840: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  is stored in a s
2850: 74 61 63 6b 20 6f 66 0a 2a 2a 20 69 6e 73 74 61  tack of.** insta
2860: 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  nces of the foll
2870: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
2880: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2890: 63 74 20 49 66 6d 61 63 72 6f 20 49 66 6d 61 63  ct Ifmacro Ifmac
28a0: 72 6f 3b 0a 73 74 72 75 63 74 20 49 66 6d 61 63  ro;.struct Ifmac
28b0: 72 6f 20 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  ro {.  int nLine
28c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e  ;         /* Lin
28d0: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  e number where t
28e0: 68 69 73 20 6d 61 63 72 6f 20 6f 63 63 75 72 73  his macro occurs
28f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
2900: 64 69 74 69 6f 6e 3b 20 20 2f 2a 20 54 65 78 74  dition;  /* Text
2910: 20 6f 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   of the conditio
2920: 6e 20 66 6f 72 20 74 68 69 73 20 6d 61 63 72 6f  n for this macro
2930: 20 2a 2f 0a 20 20 49 66 6d 61 63 72 6f 20 2a 70   */.  Ifmacro *p
2940: 4e 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74  Next;    /* Next
2950: 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 73 74 61   down in the sta
2960: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ck */.  int flag
2970: 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  s;         /* Ca
2980: 6e 20 68 6f 6c 64 20 50 53 5f 45 78 70 6f 72 74  n hold PS_Export
2990: 2c 20 50 53 5f 49 6e 74 65 72 66 61 63 65 20 6f  , PS_Interface o
29a0: 72 20 50 53 5f 4c 6f 63 61 6c 20 66 6c 61 67 73  r PS_Local flags
29b0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 57 68   */.};../*.** Wh
29c0: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 66 69 6c  en parsing a fil
29d0: 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 65  e, we need to ke
29e0: 65 70 20 74 72 61 63 6b 20 6f 66 20 77 68 61 74  ep track of what
29f0: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 68 61 76   other files hav
2a00: 65 0a 2a 2a 20 62 65 20 23 69 6e 63 6c 75 64 65  e.** be #include
2a10: 2d 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 23  -ed.  For each #
2a20: 69 6e 63 6c 75 64 65 20 66 6f 75 6e 64 2c 20 77  include found, w
2a30: 65 20 63 72 65 61 74 65 20 61 6e 20 69 6e 73 74  e create an inst
2a40: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ance of.** the f
2a50: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2a60: 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  re..*/.typedef s
2a70: 74 72 75 63 74 20 49 6e 63 6c 75 64 65 20 49 6e  truct Include In
2a80: 63 6c 75 64 65 3b 0a 73 74 72 75 63 74 20 49 6e  clude;.struct In
2a90: 63 6c 75 64 65 20 7b 0a 20 20 63 68 61 72 20 2a  clude {.  char *
2aa0: 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  zFile;       /* 
2ab0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 66 69 6c 65  The name of file
2ac0: 20 69 6e 63 6c 75 64 65 2e 20 20 49 6e 63 6c 75   include.  Inclu
2ad0: 64 65 73 20 22 22 20 6f 72 20 3c 3e 20 2a 2f 0a  des "" or <> */.
2ae0: 20 20 63 68 61 72 20 2a 7a 49 66 3b 20 20 20 20    char *zIf;    
2af0: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2b00: 55 4c 4c 2c 20 23 69 6e 63 6c 75 64 65 20 73 68  ULL, #include sh
2b10: 6f 75 6c 64 20 62 65 20 65 6e 63 6c 6f 73 65 64  ould be enclosed
2b20: 20 69 6e 20 23 69 66 20 2a 2f 0a 20 20 63 68 61   in #if */.  cha
2b30: 72 20 2a 7a 4c 61 62 65 6c 3b 20 20 20 20 20 20  r *zLabel;      
2b40: 2f 2a 20 41 20 75 6e 69 71 75 65 20 6c 61 62 65  /* A unique labe
2b50: 6c 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 69  l used to test i
2b60: 66 20 74 68 69 73 20 23 69 6e 63 6c 75 64 65 20  f this #include 
2b70: 68 61 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  has.            
2b80: 20 20 20 20 20 20 20 20 20 20 2a 20 61 70 70 65            * appe
2b90: 61 72 65 64 20 61 6c 72 65 61 64 79 20 69 6e 20  ared already in 
2ba0: 61 20 66 69 6c 65 20 6f 72 20 6e 6f 74 20 2a 2f  a file or not */
2bb0: 0a 20 20 49 6e 63 6c 75 64 65 20 2a 70 4e 65 78  .  Include *pNex
2bc0: 74 3b 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  t;    /* Previou
2bd0: 73 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 2c 20  s include file, 
2be0: 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 20  or NULL if this 
2bf0: 69 73 20 74 68 65 20 66 69 72 73 74 20 2a 2f 0a  is the first */.
2c00: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 64 65 6e 74 69  };../*.** Identi
2c10: 66 69 65 72 73 20 66 6f 75 6e 64 20 69 6e 20 61  fiers found in a
2c20: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 74 68 61   source file tha
2c30: 74 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  t might be used 
2c40: 6c 61 74 65 72 20 74 6f 20 70 72 6f 76 6f 6b 65  later to provoke
2c50: 0a 2a 2a 20 74 68 65 20 63 6f 70 79 69 6e 67 20  .** the copying 
2c60: 6f 66 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e  of a declaration
2c70: 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 73   into the corres
2c80: 70 6f 6e 64 69 6e 67 20 68 65 61 64 65 72 20 66  ponding header f
2c90: 69 6c 65 20 61 72 65 0a 2a 2a 20 73 74 6f 72 65  ile are.** store
2ca0: 64 20 69 6e 20 61 20 68 61 73 68 20 74 61 62 6c  d in a hash tabl
2cb0: 65 20 61 73 20 69 6e 73 74 61 6e 63 65 73 20 6f  e as instances o
2cc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2cd0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
2ce0: 70 65 64 65 66 20 73 74 72 75 63 74 20 49 64 65  pedef struct Ide
2cf0: 6e 74 20 49 64 65 6e 74 3b 0a 73 74 72 75 63 74  nt Ident;.struct
2d00: 20 49 64 65 6e 74 20 7b 0a 20 20 63 68 61 72 20   Ident {.  char 
2d10: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 2f  *zName;        /
2d20: 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68  * The text of th
2d30: 69 73 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f  is identifier */
2d40: 0a 20 20 49 64 65 6e 74 20 2a 70 43 6f 6c 6c 69  .  Ident *pColli
2d50: 64 65 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20 69  de;    /* Next i
2d60: 64 65 6e 74 69 66 69 65 72 20 77 69 74 68 20 74  dentifier with t
2d70: 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a  he same hash */.
2d80: 20 20 49 64 65 6e 74 20 2a 70 4e 65 78 74 3b 20    Ident *pNext; 
2d90: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 64        /* Next id
2da0: 65 6e 74 69 66 69 65 72 20 69 6e 20 61 20 6c 69  entifier in a li
2db0: 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a  st of them all *
2dc0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 6f  /.};../*.** A co
2dd0: 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 6f 66 20  mplete table of 
2de0: 69 64 65 6e 74 69 66 69 65 72 73 20 69 73 20 73  identifiers is s
2df0: 74 6f 72 65 64 20 69 6e 20 61 6e 20 69 6e 73 74  tored in an inst
2e00: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ance of.** the n
2e10: 65 78 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ext structure..*
2e20: 2f 0a 23 64 65 66 69 6e 65 20 49 44 45 4e 54 5f  /.#define IDENT_
2e30: 48 41 53 48 5f 53 49 5a 45 20 32 32 33 37 0a 74  HASH_SIZE 2237.t
2e40: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49 64  ypedef struct Id
2e50: 65 6e 74 54 61 62 6c 65 20 49 64 65 6e 74 54 61  entTable IdentTa
2e60: 62 6c 65 3b 0a 73 74 72 75 63 74 20 49 64 65 6e  ble;.struct Iden
2e70: 74 54 61 62 6c 65 20 7b 0a 20 20 49 64 65 6e 74  tTable {.  Ident
2e80: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ea0: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 69 64 65 6e  List of all iden
2eb0: 74 69 66 69 65 72 73 20 69 6e 20 74 68 69 73 20  tifiers in this 
2ec0: 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64 65 6e 74  table */.  Ident
2ed0: 20 2a 61 70 54 61 62 6c 65 5b 49 44 45 4e 54 5f   *apTable[IDENT_
2ee0: 48 41 53 48 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20  HASH_SIZE];  /* 
2ef0: 54 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a  The hash table *
2f00: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
2f10: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2f20: 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e  ure holds all in
2f30: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
2f40: 73 69 6e 67 6c 65 0a 2a 2a 20 73 6f 75 72 63 65  single.** source
2f50: 20 66 69 6c 65 20 6e 61 6d 65 64 20 6f 6e 20 74   file named on t
2f60: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
2f70: 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 2e  of this program.
2f80: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2f90: 63 74 20 49 6e 46 69 6c 65 20 49 6e 46 69 6c 65  ct InFile InFile
2fa0: 3b 0a 73 74 72 75 63 74 20 49 6e 46 69 6c 65 20  ;.struct InFile 
2fb0: 7b 0a 20 20 63 68 61 72 20 2a 7a 53 72 63 3b 20  {.  char *zSrc; 
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fd0: 4e 61 6d 65 20 6f 66 20 69 6e 70 75 74 20 66 69  Name of input fi
2fe0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48  le */.  char *zH
2ff0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
3000: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3010: 67 65 6e 65 72 61 74 65 64 20 2e 68 20 66 69 6c  generated .h fil
3020: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 70 75 74  e for this input
3030: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
3050: 57 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  Will be NULL if 
3060: 69 6e 70 75 74 20 69 73 20 74 6f 20 62 65 20 73  input is to be s
3070: 63 61 6e 6e 65 64 20 6f 6e 6c 79 20 2a 2f 0a 20  canned only */. 
3080: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
3090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
30a0: 20 6f 72 20 6d 6f 72 65 20 44 50 5f 2c 20 50 53   or more DP_, PS
30b0: 5f 20 61 6e 64 2f 6f 72 20 54 59 5f 20 66 6c 61  _ and/or TY_ fla
30c0: 67 73 20 2a 2f 0a 20 20 49 6e 46 69 6c 65 20 2a  gs */.  InFile *
30d0: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
30e0: 20 2f 2a 20 4e 65 78 74 20 69 6e 70 75 74 20 66   /* Next input f
30f0: 69 6c 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ile in the list 
3100: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20  of them all */. 
3110: 20 49 64 65 6e 74 54 61 62 6c 65 20 69 64 54 61   IdentTable idTa
3120: 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ble;      /* All
3130: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
3140: 74 68 69 73 20 69 6e 70 75 74 20 66 69 6c 65 20  this input file 
3150: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
3160: 75 6e 62 6f 75 6e 64 65 64 20 73 74 72 69 6e 67  unbounded string
3170: 20 69 73 20 61 62 6c 65 20 74 6f 20 67 72 6f 77   is able to grow
3180: 20 77 69 74 68 6f 75 74 20 6c 69 6d 69 74 2e 20   without limit. 
3190: 20 57 65 20 75 73 65 20 74 68 65 73 65 0a 2a 2a   We use these.**
31a0: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 6c 61   to construct la
31b0: 72 67 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  rge in-memory st
31c0: 72 69 6e 67 73 20 66 72 6f 6d 20 6c 6f 74 73 20  rings from lots 
31d0: 6f 66 20 73 6d 61 6c 6c 65 72 20 63 6f 6d 70 6f  of smaller compo
31e0: 6e 65 6e 74 73 2e 0a 2a 2f 0a 74 79 70 65 64 65  nents..*/.typede
31f0: 66 20 73 74 72 75 63 74 20 53 74 72 69 6e 67 20  f struct String 
3200: 53 74 72 69 6e 67 3b 0a 73 74 72 75 63 74 20 53  String;.struct S
3210: 74 72 69 6e 67 20 7b 0a 20 20 69 6e 74 20 6e 41  tring {.  int nA
3220: 6c 6c 6f 63 3b 20 20 20 20 20 20 2f 2a 20 4e 75  lloc;      /* Nu
3230: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
3240: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  located */.  int
3250: 20 6e 55 73 65 64 3b 20 20 20 20 20 20 20 2f 2a   nUsed;       /*
3260: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
3270: 20 75 73 65 64 20 28 6e 6f 74 20 63 6f 75 6e 74   used (not count
3280: 69 6e 67 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61  ing null termina
3290: 74 6f 72 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tor) */.  char *
32a0: 7a 54 65 78 74 3b 20 20 20 20 20 2f 2a 20 54 65  zText;     /* Te
32b0: 78 74 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  xt of the string
32c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
32d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
32e0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
32f0: 20 6c 6f 74 20 6f 66 20 73 74 61 74 65 20 69 6e   lot of state in
3300: 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 0a 2a  formation used.*
3310: 2a 20 77 68 69 6c 65 20 67 65 6e 65 72 61 74 69  * while generati
3320: 6e 67 20 61 20 2e 68 20 66 69 6c 65 2e 20 20 57  ng a .h file.  W
3330: 65 20 70 75 74 20 74 68 65 20 69 6e 66 6f 72 6d  e put the inform
3340: 61 74 69 6f 6e 20 69 6e 20 74 68 69 73 20 73 74  ation in this st
3350: 72 75 63 74 75 72 65 0a 2a 2a 20 61 6e 64 20 70  ructure.** and p
3360: 61 73 73 20 61 72 6f 75 6e 64 20 61 20 70 6f 69  ass around a poi
3370: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73 74 72  nter to this str
3380: 75 63 74 75 72 65 2c 20 72 61 74 68 65 72 20 74  ucture, rather t
3390: 68 61 6e 20 70 61 73 73 20 61 72 6f 75 6e 64 0a  han pass around.
33a0: 2a 2a 20 61 6c 6c 20 6f 66 20 74 68 65 20 69 6e  ** all of the in
33b0: 66 6f 72 6d 61 74 69 6f 6e 20 73 65 70 61 72 61  formation separa
33c0: 74 65 6c 79 2e 20 20 54 68 69 73 20 68 65 6c 70  tely.  This help
33d0: 73 20 72 65 64 75 63 65 20 74 68 65 20 6e 75 6d  s reduce the num
33e0: 62 65 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65  ber of.** argume
33f0: 6e 74 73 20 74 6f 20 67 65 6e 65 72 61 74 6f 72  nts to generator
3400: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 74   functions..*/.t
3410: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 47 65  ypedef struct Ge
3420: 6e 53 74 61 74 65 20 47 65 6e 53 74 61 74 65 3b  nState GenState;
3430: 0a 73 74 72 75 63 74 20 47 65 6e 53 74 61 74 65  .struct GenState
3440: 20 7b 0a 20 20 53 74 72 69 6e 67 20 2a 70 53 74   {.  String *pSt
3450: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  r;          /* W
3460: 72 69 74 65 20 6f 75 74 70 75 74 20 74 6f 20 74  rite output to t
3470: 68 69 73 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  his string */.  
3480: 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 54 61 62  IdentTable *pTab
3490: 6c 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c  le;    /* A tabl
34a0: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 7a 4c  e holding the zL
34b0: 61 62 65 6c 20 6f 66 20 65 76 65 72 79 20 23 69  abel of every #i
34c0: 6e 63 6c 75 64 65 20 74 68 61 74 0a 20 20 20 20  nclude that.    
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e0: 20 20 20 20 20 20 2a 20 68 61 73 20 61 6c 72 65        * has alre
34f0: 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74  ady been generat
3500: 65 64 2e 20 20 55 73 65 64 20 74 6f 20 61 76 6f  ed.  Used to avo
3510: 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  id.             
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 67               * g
3530: 65 6e 65 72 61 74 69 6e 67 20 64 75 70 6c 69 63  enerating duplic
3540: 61 74 65 20 23 69 6e 63 6c 75 64 65 73 2e 20 2a  ate #includes. *
3550: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3560: 7a 49 66 3b 20 20 20 20 20 20 20 2f 2a 20 49 66  zIf;       /* If
3570: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
3580: 77 65 20 61 72 65 20 77 69 74 68 69 6e 20 61 20  we are within a 
3590: 23 69 66 20 77 69 74 68 0a 20 20 20 20 20 20 20  #if with.       
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 20 20 20 2a 20 74 68 69 73 20 61 72 67 75 6d 65     * this argume
35c0: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  nt. */.  int nEr
35d0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
35e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
35f0: 6f 72 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ors */.  const c
3600: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
3610: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
3620: 6f 75 72 63 65 20 66 69 6c 65 20 62 65 69 6e 67  ource file being
3630: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
3640: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
3650: 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
3660: 66 6c 61 67 73 20 28 44 50 5f 20 61 6e 64 20 50  flags (DP_ and P
3670: 53 5f 20 66 6c 61 67 73 20 61 62 6f 76 65 29 20  S_ flags above) 
3680: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
3690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 20   following text 
36a0: 6c 69 6e 65 20 61 70 70 65 61 72 73 20 61 74 20  line appears at 
36b0: 74 68 65 20 74 6f 70 20 6f 66 20 65 76 65 72 79  the top of every
36c0: 20 66 69 6c 65 20 67 65 6e 65 72 61 74 65 64 0a   file generated.
36d0: 2a 2a 20 62 79 20 74 68 69 73 20 70 72 6f 67 72  ** by this progr
36e0: 61 6d 2e 20 20 42 79 20 72 65 63 6f 67 6e 69 7a  am.  By recogniz
36f0: 69 6e 67 20 74 68 69 73 20 6c 69 6e 65 2c 20 74  ing this line, t
3700: 68 65 20 70 72 6f 67 72 61 6d 20 63 61 6e 20 62  he program can b
3710: 65 20 73 75 72 65 0a 2a 2a 20 6e 65 76 65 72 20  e sure.** never 
3720: 74 6f 20 72 65 61 64 20 61 20 66 69 6c 65 20 74  to read a file t
3730: 68 61 74 20 69 74 20 67 65 6e 65 72 61 74 65 64  hat it generated
3740: 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 54   itself..**.** T
3750: 68 65 20 22 23 75 6e 64 65 66 20 49 4e 54 45 52  he "#undef INTER
3760: 46 41 43 45 22 20 70 61 72 74 20 69 73 20 61 20  FACE" part is a 
3770: 68 61 63 6b 20 74 6f 20 77 6f 72 6b 20 61 72 6f  hack to work aro
3780: 75 6e 64 20 61 20 6e 61 6d 65 20 63 6f 6c 6c 69  und a name colli
3790: 73 69 6f 6e 0a 2a 2a 20 69 6e 20 4d 53 56 43 20  sion.** in MSVC 
37a0: 32 30 30 38 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  2008..*/.const c
37b0: 68 61 72 20 7a 54 6f 70 4c 69 6e 65 5b 5d 20 3d  har zTopLine[] =
37c0: 0a 20 20 22 2f 2a 20 5c 61 54 68 69 73 20 66 69  .  "/* \aThis fi
37d0: 6c 65 20 77 61 73 20 61 75 74 6f 6d 61 74 69 63  le was automatic
37e0: 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 2e 20  ally generated. 
37f0: 20 44 6f 20 6e 6f 74 20 65 64 69 74 21 20 2a 2f   Do not edit! */
3800: 5c 6e 22 0a 20 20 22 23 75 6e 64 65 66 20 49 4e  \n".  "#undef IN
3810: 54 45 52 46 41 43 45 5c 6e 22 3b 0a 23 64 65 66  TERFACE\n";.#def
3820: 69 6e 65 20 6e 54 6f 70 4c 69 6e 65 20 28 73 69  ine nTopLine (si
3830: 7a 65 6f 66 28 7a 54 6f 70 4c 69 6e 65 29 2d 31  zeof(zTopLine)-1
3840: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d  )../*.** The nam
3850: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
3860: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61  rrently being pa
3870: 72 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsed..*/.static 
3880: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
3890: 65 6e 61 6d 65 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ename;../*.** Th
38a0: 65 20 73 74 61 63 6b 20 6f 66 20 23 69 66 20 6d  e stack of #if m
38b0: 61 63 72 6f 73 20 66 6f 72 20 74 68 65 20 66 69  acros for the fi
38c0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
38d0: 6e 67 20 70 61 72 73 65 64 2e 0a 2a 2f 0a 73 74  ng parsed..*/.st
38e0: 61 74 69 63 20 49 66 6d 61 63 72 6f 20 2a 69 66  atic Ifmacro *if
38f0: 53 74 61 63 6b 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  Stack = 0;../*.*
3900: 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
3910: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
3920: 62 65 65 6e 20 23 69 6e 63 6c 75 64 65 64 20 73  been #included s
3930: 6f 20 66 61 72 20 69 6e 20 61 20 66 69 6c 65 20  o far in a file 
3940: 62 65 69 6e 67 0a 2a 2a 20 70 61 72 73 65 64 2e  being.** parsed.
3950: 0a 2a 2f 0a 73 74 61 74 69 63 20 49 6e 63 6c 75  .*/.static Inclu
3960: 64 65 20 2a 69 6e 63 6c 75 64 65 4c 69 73 74 20  de *includeList 
3970: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  = 0;../*.** The 
3980: 6c 61 73 74 20 62 6c 6f 63 6b 20 63 6f 6d 6d 65  last block comme
3990: 6e 74 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74  nt seen..*/.stat
39a0: 69 63 20 54 6f 6b 65 6e 20 2a 62 6c 6f 63 6b 43  ic Token *blockC
39b0: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  omment = 0;../*.
39c0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
39d0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 66 20   flag is set if 
39e0: 74 68 65 20 2d 64 6f 63 20 66 6c 61 67 20 61 70  the -doc flag ap
39f0: 70 65 61 72 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  pears on the.** 
3a00: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 0a 2a 2f  command line..*/
3a10: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 63 5f  .static int doc_
3a20: 66 6c 61 67 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  flag = 0;../*.**
3a30: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
3a40: 67 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  g flag is set, t
3a50: 68 65 6e 20 6d 61 6b 65 68 65 61 64 65 72 73 20  hen makeheaders 
3a60: 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a  will attempt to.
3a70: 2a 2a 20 67 65 6e 65 72 61 74 65 20 70 72 6f 74  ** generate prot
3a80: 6f 74 79 70 65 73 20 66 6f 72 20 73 74 61 74 69  otypes for stati
3a90: 63 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  c functions and 
3aa0: 70 72 6f 63 65 64 75 72 65 73 2e 0a 2a 2f 0a 73  procedures..*/.s
3ab0: 74 61 74 69 63 20 69 6e 74 20 70 72 6f 74 6f 5f  tatic int proto_
3ac0: 73 74 61 74 69 63 20 3d 20 30 3b 0a 0a 2f 2a 0a  static = 0;../*.
3ad0: 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  ** A list of all
3ae0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 20 20   declarations.  
3af0: 54 68 65 20 6c 69 73 74 20 69 73 20 68 65 6c 64  The list is held
3b00: 20 74 6f 67 65 74 68 65 72 20 75 73 69 6e 67 20   together using 
3b10: 74 68 65 0a 2a 2a 20 70 4e 65 78 74 20 66 69 65  the.** pNext fie
3b20: 6c 64 20 6f 66 20 74 68 65 20 44 65 63 6c 20 73  ld of the Decl s
3b30: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
3b40: 74 69 63 20 44 65 63 6c 20 2a 70 44 65 63 6c 46  tic Decl *pDeclF
3b50: 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73  irst;    /* Firs
3b60: 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  t on the list */
3b70: 0a 73 74 61 74 69 63 20 44 65 63 6c 20 2a 70 44  .static Decl *pD
3b80: 65 63 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  eclLast;     /* 
3b90: 4c 61 73 74 20 6f 6e 20 74 68 65 20 6c 69 73 74  Last on the list
3ba0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 68 61 73   */../*.** A has
3bb0: 68 20 74 61 62 6c 65 20 6f 66 20 61 6c 6c 20 64  h table of all d
3bc0: 65 63 6c 61 72 61 74 69 6f 6e 73 0a 2a 2f 0a 23  eclarations.*/.#
3bd0: 64 65 66 69 6e 65 20 44 45 43 4c 5f 48 41 53 48  define DECL_HASH
3be0: 5f 53 49 5a 45 20 33 33 37 31 0a 73 74 61 74 69  _SIZE 3371.stati
3bf0: 63 20 44 65 63 6c 20 2a 61 70 54 61 62 6c 65 5b  c Decl *apTable[
3c00: 44 45 43 4c 5f 48 41 53 48 5f 53 49 5a 45 5d 3b  DECL_HASH_SIZE];
3c10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 45 53 54  ../*.** The TEST
3c20: 20 6d 61 63 72 6f 20 6d 75 73 74 20 62 65 20 64   macro must be d
3c30: 65 66 69 6e 65 64 20 74 6f 20 73 6f 6d 65 74 68  efined to someth
3c40: 69 6e 67 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ing.  Make sure 
3c50: 74 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 63  this is the.** c
3c60: 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ase..*/.#ifndef 
3c70: 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54 45  TEST.# define TE
3c80: 53 54 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ST 0.#endif..#if
3c90: 64 65 66 20 4e 4f 54 5f 55 53 45 44 0a 2f 2a 0a  def NOT_USED./*.
3ca0: 2a 2a 20 57 65 20 64 6f 20 6f 75 72 20 6f 77 6e  ** We do our own
3cb0: 20 61 73 73 65 72 74 69 6f 6e 20 6d 61 63 72 6f   assertion macro
3cc0: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
3cd0: 68 61 76 65 20 6d 6f 72 65 20 63 6f 6e 74 72 6f  have more contro
3ce0: 6c 0a 2a 2a 20 6f 76 65 72 20 64 65 62 75 67 67  l.** over debugg
3cf0: 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ing..*/.#define 
3d00: 41 73 73 65 72 74 28 58 29 20 20 20 20 69 66 28  Assert(X)    if(
3d10: 21 28 58 29 29 7b 20 43 61 6e 74 48 61 70 70 65  !(X)){ CantHappe
3d20: 6e 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 7d 0a 23  n(__LINE__); }.#
3d30: 64 65 66 69 6e 65 20 43 41 4e 54 5f 48 41 50 50  define CANT_HAPP
3d40: 45 4e 20 20 43 61 6e 74 48 61 70 70 65 6e 28 5f  EN  CantHappen(_
3d50: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
3d60: 76 6f 69 64 20 43 61 6e 74 48 61 70 70 65 6e 28  void CantHappen(
3d70: 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 66 70  int iLine){.  fp
3d80: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 41 73  rintf(stderr,"As
3d90: 73 65 72 74 69 6f 6e 20 66 61 69 6c 65 64 20 6f  sertion failed o
3da0: 6e 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 69 4c 69  n line %d\n",iLi
3db0: 6e 65 29 3b 0a 20 20 2a 28 63 68 61 72 2a 29 31  ne);.  *(char*)1
3dc0: 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 63 65 20   = 0;  /* Force 
3dd0: 61 20 63 6f 72 65 2d 64 75 6d 70 20 2a 2f 0a 7d  a core-dump */.}
3de0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
3df0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3e00: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
3e10: 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 6e  are guaranteed n
3e20: 65 76 65 72 20 74 6f 20 72 65 74 75 72 6e 20 4e  ever to return N
3e30: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ULL..*/.static v
3e40: 6f 69 64 20 2a 53 61 66 65 4d 61 6c 6c 6f 63 28  oid *SafeMalloc(
3e50: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f  int nByte){.  vo
3e60: 69 64 20 2a 70 20 3d 20 6d 61 6c 6c 6f 63 28 20  id *p = malloc( 
3e70: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
3e80: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
3e90: 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f  tf(stderr,"Out o
3ea0: 66 20 6d 65 6d 6f 72 79 2e 20 20 43 61 6e 27 74  f memory.  Can't
3eb0: 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 62 79 74   allocate %d byt
3ec0: 65 73 2e 5c 6e 22 2c 6e 42 79 74 65 29 3b 0a 20  es.\n",nByte);. 
3ed0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
3ee0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 73 74    return p;.}.st
3ef0: 61 74 69 63 20 76 6f 69 64 20 53 61 66 65 46 72  atic void SafeFr
3f00: 65 65 28 76 6f 69 64 20 2a 70 4f 6c 64 29 7b 0a  ee(void *pOld){.
3f10: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
3f20: 20 20 66 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20    free(pOld);.  
3f30: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
3f40: 2a 53 61 66 65 52 65 61 6c 6c 6f 63 28 76 6f 69  *SafeRealloc(voi
3f50: 64 20 2a 70 4f 6c 64 2c 20 69 6e 74 20 6e 42 79  d *pOld, int nBy
3f60: 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a  te){.  void *p;.
3f70: 20 20 69 66 28 20 70 4f 6c 64 3d 3d 30 20 29 7b    if( pOld==0 ){
3f80: 0a 20 20 20 20 70 20 3d 20 53 61 66 65 4d 61 6c  .    p = SafeMal
3f90: 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 7d 65  loc(nByte);.  }e
3fa0: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 72 65 61  lse{.    p = rea
3fb0: 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 42 79 74 65  lloc(pOld, nByte
3fc0: 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
3fd0: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
3fe0: 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20  (stderr,.       
3ff0: 20 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e   "Out of memory.
4000: 20 20 43 61 6e 27 74 20 65 6e 6c 61 72 67 65 20    Can't enlarge 
4010: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 74 6f  an allocation to
4020: 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 6e 42 79   %d bytes\n",nBy
4030: 74 65 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  te);.      exit(
4040: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
4050: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 73 74 61 74  return p;.}.stat
4060: 69 63 20 63 68 61 72 20 2a 53 74 72 44 75 70 28  ic char *StrDup(
4070: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
4080: 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  , int nByte){.  
4090: 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20 69  char *zDest;.  i
40a0: 66 28 20 6e 42 79 74 65 3c 3d 30 20 29 7b 0a 20  f( nByte<=0 ){. 
40b0: 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65     nByte = strle
40c0: 6e 28 7a 53 72 63 29 3b 0a 20 20 7d 0a 20 20 7a  n(zSrc);.  }.  z
40d0: 44 65 73 74 20 3d 20 53 61 66 65 4d 61 6c 6c 6f  Dest = SafeMallo
40e0: 63 28 20 6e 42 79 74 65 20 2b 20 31 20 29 3b 0a  c( nByte + 1 );.
40f0: 20 20 73 74 72 6e 63 70 79 28 7a 44 65 73 74 2c    strncpy(zDest,
4100: 7a 53 72 63 2c 6e 42 79 74 65 29 3b 0a 20 20 7a  zSrc,nByte);.  z
4110: 44 65 73 74 5b 6e 42 79 74 65 5d 20 3d 20 30 3b  Dest[nByte] = 0;
4120: 0a 20 20 72 65 74 75 72 6e 20 7a 44 65 73 74 3b  .  return zDest;
4130: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4140: 20 54 52 55 45 20 69 66 20 74 68 65 20 63 68 61   TRUE if the cha
4150: 72 61 63 74 65 72 20 58 20 63 61 6e 20 62 65 20  racter X can be 
4160: 70 61 72 74 20 6f 66 20 61 6e 20 69 64 65 6e 74  part of an ident
4170: 69 66 69 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  ifier.*/.#define
4180: 20 49 53 41 4c 4e 55 4d 28 58 29 20 20 28 28 58   ISALNUM(X)  ((X
4190: 29 3d 3d 27 5f 27 20 7c 7c 20 69 73 61 6c 6e 75  )=='_' || isalnu
41a0: 6d 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75  m(X))../*.** Rou
41b0: 74 69 6e 65 73 20 66 6f 72 20 64 65 61 6c 69 6e  tines for dealin
41c0: 67 20 77 69 74 68 20 75 6e 62 6f 75 6e 64 65 64  g with unbounded
41d0: 20 73 74 72 69 6e 67 73 2e 0a 2a 2f 0a 73 74 61   strings..*/.sta
41e0: 74 69 63 20 76 6f 69 64 20 53 74 72 69 6e 67 49  tic void StringI
41f0: 6e 69 74 28 53 74 72 69 6e 67 20 2a 70 53 74 72  nit(String *pStr
4200: 29 7b 0a 20 20 70 53 74 72 2d 3e 6e 41 6c 6c 6f  ){.  pStr->nAllo
4210: 63 20 3d 20 30 3b 0a 20 20 70 53 74 72 2d 3e 6e  c = 0;.  pStr->n
4220: 55 73 65 64 20 3d 20 30 3b 0a 20 20 70 53 74 72  Used = 0;.  pStr
4230: 2d 3e 7a 54 65 78 74 20 3d 20 30 3b 0a 7d 0a 73  ->zText = 0;.}.s
4240: 74 61 74 69 63 20 76 6f 69 64 20 53 74 72 69 6e  tatic void Strin
4250: 67 52 65 73 65 74 28 53 74 72 69 6e 67 20 2a 70  gReset(String *p
4260: 53 74 72 29 7b 0a 20 20 53 61 66 65 46 72 65 65  Str){.  SafeFree
4270: 28 70 53 74 72 2d 3e 7a 54 65 78 74 29 3b 0a 20  (pStr->zText);. 
4280: 20 53 74 72 69 6e 67 49 6e 69 74 28 70 53 74 72   StringInit(pStr
4290: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
42a0: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 53 74   StringAppend(St
42b0: 72 69 6e 67 20 2a 70 53 74 72 2c 20 63 6f 6e 73  ring *pStr, cons
42c0: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69  t char *zText, i
42d0: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28  nt nByte){.  if(
42e0: 20 6e 42 79 74 65 3c 3d 30 20 29 7b 0a 20 20 20   nByte<=0 ){.   
42f0: 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 28   nByte = strlen(
4300: 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69 66  zText);.  }.  if
4310: 28 20 70 53 74 72 2d 3e 6e 55 73 65 64 20 2b 20  ( pStr->nUsed + 
4320: 6e 42 79 74 65 20 3e 3d 20 70 53 74 72 2d 3e 6e  nByte >= pStr->n
4330: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 66 28  Alloc ){.    if(
4340: 20 70 53 74 72 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30   pStr->nAlloc==0
4350: 20 29 7b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e   ){.      pStr->
4360: 6e 41 6c 6c 6f 63 20 3d 20 6e 42 79 74 65 20 2b  nAlloc = nByte +
4370: 20 31 30 30 3b 0a 20 20 20 20 20 20 70 53 74 72   100;.      pStr
4380: 2d 3e 7a 54 65 78 74 20 3d 20 53 61 66 65 4d 61  ->zText = SafeMa
4390: 6c 6c 6f 63 28 20 70 53 74 72 2d 3e 6e 41 6c 6c  lloc( pStr->nAll
43a0: 6f 63 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oc );.    }else{
43b0: 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 6e 41 6c  .      pStr->nAl
43c0: 6c 6f 63 20 3d 20 70 53 74 72 2d 3e 6e 41 6c 6c  loc = pStr->nAll
43d0: 6f 63 2a 32 20 2b 20 6e 42 79 74 65 3b 0a 20 20  oc*2 + nByte;.  
43e0: 20 20 20 20 70 53 74 72 2d 3e 7a 54 65 78 74 20      pStr->zText 
43f0: 3d 20 53 61 66 65 52 65 61 6c 6c 6f 63 28 70 53  = SafeRealloc(pS
4400: 74 72 2d 3e 7a 54 65 78 74 2c 20 70 53 74 72 2d  tr->zText, pStr-
4410: 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 0a  >nAlloc);.    }.
4420: 20 20 7d 0a 20 20 73 74 72 6e 63 70 79 28 26 70    }.  strncpy(&p
4430: 53 74 72 2d 3e 7a 54 65 78 74 5b 70 53 74 72 2d  Str->zText[pStr-
4440: 3e 6e 55 73 65 64 5d 2c 7a 54 65 78 74 2c 6e 42  >nUsed],zText,nB
4450: 79 74 65 29 3b 0a 20 20 70 53 74 72 2d 3e 6e 55  yte);.  pStr->nU
4460: 73 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  sed += nByte;.  
4470: 70 53 74 72 2d 3e 7a 54 65 78 74 5b 70 53 74 72  pStr->zText[pStr
4480: 2d 3e 6e 55 73 65 64 5d 20 3d 20 30 3b 0a 7d 0a  ->nUsed] = 0;.}.
4490: 23 64 65 66 69 6e 65 20 53 74 72 69 6e 67 47 65  #define StringGe
44a0: 74 28 53 29 20 28 28 53 29 2d 3e 7a 54 65 78 74  t(S) ((S)->zText
44b0: 3f 28 53 29 2d 3e 7a 54 65 78 74 3a 22 22 29 0a  ?(S)->zText:"").
44c0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
44d0: 20 68 61 73 68 20 6f 6e 20 61 20 73 74 72 69 6e   hash on a strin
44e0: 67 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72  g.  The number r
44f0: 65 74 75 72 6e 65 64 20 69 73 20 61 20 6e 6f 6e  eturned is a non
4500: 2d 6e 65 67 61 74 69 76 65 0a 2a 2a 20 76 61 6c  -negative.** val
4510: 75 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  ue between 0 and
4520: 20 32 2a 2a 33 31 20 2d 20 31 0a 2a 2f 0a 73 74   2**31 - 1.*/.st
4530: 61 74 69 63 20 69 6e 74 20 48 61 73 68 28 63 6f  atic int Hash(co
4540: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
4550: 20 6e 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30   n){.  int h = 0
4560: 3b 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b 0a  ;.  if( n<=0 ){.
4570: 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a      n = strlen(z
4580: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
4590: 6e 2d 2d 20 29 7b 0a 20 20 20 20 68 20 3d 20 68  n-- ){.    h = h
45a0: 20 5e 20 28 68 3c 3c 35 29 20 5e 20 2a 7a 2b 2b   ^ (h<<5) ^ *z++
45b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
45c0: 20 26 20 30 78 37 66 66 66 66 66 66 66 3b 0a 7d   & 0x7fffffff;.}
45d0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
45e0: 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
45f0: 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 20  , try to find a 
4600: 64 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20  declaration for 
4610: 74 68 61 74 0a 2a 2a 20 69 64 65 6e 74 69 66 69  that.** identifi
4620: 65 72 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  er in the hash t
4630: 61 62 6c 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c  able.  If found,
4640: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
4650: 72 20 74 6f 0a 2a 2a 20 74 68 65 20 44 65 63 6c  r to.** the Decl
4660: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20   structure.  If 
4670: 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  not found, retur
4680: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 44  n 0..*/.static D
4690: 65 63 6c 20 2a 46 69 6e 64 44 65 63 6c 28 63 6f  ecl *FindDecl(co
46a0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
46b0: 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 69 6e 74   int len){.  int
46c0: 20 68 3b 0a 20 20 44 65 63 6c 20 2a 70 3b 0a 0a   h;.  Decl *p;..
46d0: 20 20 69 66 28 20 6c 65 6e 3c 3d 30 20 29 7b 0a    if( len<=0 ){.
46e0: 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e      len = strlen
46f0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 68  (zName);.  }.  h
4700: 20 3d 20 48 61 73 68 28 7a 4e 61 6d 65 2c 6c 65   = Hash(zName,le
4710: 6e 29 20 25 20 44 45 43 4c 5f 48 41 53 48 5f 53  n) % DECL_HASH_S
4720: 49 5a 45 3b 0a 20 20 70 20 3d 20 61 70 54 61 62  IZE;.  p = apTab
4730: 6c 65 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  le[h];.  while( 
4740: 70 20 26 26 20 28 73 74 72 6e 63 6d 70 28 70 2d  p && (strncmp(p-
4750: 3e 7a 4e 61 6d 65 2c 7a 4e 61 6d 65 2c 6c 65 6e  >zName,zName,len
4760: 29 21 3d 30 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65  )!=0 || p->zName
4770: 5b 6c 65 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20  [len]!=0) ){.   
4780: 20 70 20 3d 20 70 2d 3e 70 53 61 6d 65 48 61 73   p = p->pSameHas
4790: 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  h;.  }.  return 
47a0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 74  p;.}../*.** Inst
47b0: 61 6c 6c 20 74 68 65 20 67 69 76 65 6e 20 64 65  all the given de
47c0: 63 6c 61 72 61 74 69 6f 6e 20 62 6f 74 68 20 69  claration both i
47d0: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
47e0: 20 61 6e 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c   and on.** the l
47f0: 69 73 74 20 6f 66 20 61 6c 6c 20 64 65 63 6c 61  ist of all decla
4800: 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  rations..*/.stat
4810: 69 63 20 76 6f 69 64 20 49 6e 73 74 61 6c 6c 44  ic void InstallD
4820: 65 63 6c 28 44 65 63 6c 20 2a 70 44 65 63 6c 29  ecl(Decl *pDecl)
4830: 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 44 65 63  {.  int h;.  Dec
4840: 6c 20 2a 70 4f 74 68 65 72 3b 0a 0a 20 20 68 20  l *pOther;..  h 
4850: 3d 20 48 61 73 68 28 70 44 65 63 6c 2d 3e 7a 4e  = Hash(pDecl->zN
4860: 61 6d 65 2c 30 29 20 25 20 44 45 43 4c 5f 48 41  ame,0) % DECL_HA
4870: 53 48 5f 53 49 5a 45 3b 0a 20 20 70 4f 74 68 65  SH_SIZE;.  pOthe
4880: 72 20 3d 20 61 70 54 61 62 6c 65 5b 68 5d 3b 0a  r = apTable[h];.
4890: 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 20    while( pOther 
48a0: 26 26 20 73 74 72 63 6d 70 28 70 44 65 63 6c 2d  && strcmp(pDecl-
48b0: 3e 7a 4e 61 6d 65 2c 70 4f 74 68 65 72 2d 3e 7a  >zName,pOther->z
48c0: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
48d0: 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
48e0: 3e 70 53 61 6d 65 48 61 73 68 3b 0a 20 20 7d 0a  >pSameHash;.  }.
48f0: 20 20 69 66 28 20 70 4f 74 68 65 72 20 29 7b 0a    if( pOther ){.
4900: 20 20 20 20 70 44 65 63 6c 2d 3e 70 53 61 6d 65      pDecl->pSame
4910: 4e 61 6d 65 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Name = pOther->p
4920: 53 61 6d 65 4e 61 6d 65 3b 0a 20 20 20 20 70 4f  SameName;.    pO
4930: 74 68 65 72 2d 3e 70 53 61 6d 65 4e 61 6d 65 20  ther->pSameName 
4940: 3d 20 70 44 65 63 6c 3b 0a 20 20 7d 65 6c 73 65  = pDecl;.  }else
4950: 7b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 70 53 61  {.    pDecl->pSa
4960: 6d 65 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  meName = 0;.    
4970: 70 44 65 63 6c 2d 3e 70 53 61 6d 65 48 61 73 68  pDecl->pSameHash
4980: 20 3d 20 61 70 54 61 62 6c 65 5b 68 5d 3b 0a 20   = apTable[h];. 
4990: 20 20 20 61 70 54 61 62 6c 65 5b 68 5d 20 3d 20     apTable[h] = 
49a0: 70 44 65 63 6c 3b 0a 20 20 7d 0a 20 20 70 44 65  pDecl;.  }.  pDe
49b0: 63 6c 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  cl->pNext = 0;. 
49c0: 20 69 66 28 20 70 44 65 63 6c 46 69 72 73 74 3d   if( pDeclFirst=
49d0: 3d 30 20 29 7b 0a 20 20 20 20 70 44 65 63 6c 46  =0 ){.    pDeclF
49e0: 69 72 73 74 20 3d 20 70 44 65 63 6c 4c 61 73 74  irst = pDeclLast
49f0: 20 3d 20 70 44 65 63 6c 3b 0a 20 20 7d 65 6c 73   = pDecl;.  }els
4a00: 65 7b 0a 20 20 20 20 70 44 65 63 6c 4c 61 73 74  e{.    pDeclLast
4a10: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 65 63 6c 3b  ->pNext = pDecl;
4a20: 0a 20 20 20 20 70 44 65 63 6c 4c 61 73 74 20 3d  .    pDeclLast =
4a30: 20 70 44 65 63 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pDecl;.  }.}../
4a40: 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65  *.** Look at the
4a50: 20 63 75 72 72 65 6e 74 20 69 66 53 74 61 63 6b   current ifStack
4a60: 2e 20 20 49 66 20 61 6e 79 74 68 69 6e 67 20 64  .  If anything d
4a70: 65 63 6c 61 72 65 64 20 61 74 20 74 68 65 20 63  eclared at the c
4a80: 75 72 72 65 6e 74 0a 2a 2a 20 70 6f 73 69 74 69  urrent.** positi
4a90: 6f 6e 20 6d 75 73 74 20 62 65 20 73 75 72 72 6f  on must be surro
4aa0: 75 6e 64 65 64 20 77 69 74 68 0a 2a 2a 0a 2a 2a  unded with.**.**
4ab0: 20 20 20 20 20 20 23 69 66 20 20 20 53 54 55 46        #if   STUF
4ac0: 46 0a 2a 2a 20 20 20 20 20 20 23 65 6e 64 69 66  F.**      #endif
4ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 69 73  .**.** Then this
4ae0: 20 72 6f 75 74 69 6e 65 20 63 6f 6d 70 75 74 65   routine compute
4af0: 73 20 53 54 55 46 46 20 61 6e 64 20 72 65 74 75  s STUFF and retu
4b00: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
4b10: 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20   it.  Memory.** 
4b20: 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75  to hold the valu
4b30: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 6f 62  e returned is ob
4b40: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
4b50: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
4b60: 63 68 61 72 20 2a 47 65 74 49 66 53 74 72 69 6e  char *GetIfStrin
4b70: 67 28 76 6f 69 64 29 7b 0a 20 20 49 66 6d 61 63  g(void){.  Ifmac
4b80: 72 6f 20 2a 70 49 66 3b 0a 20 20 63 68 61 72 20  ro *pIf;.  char 
4b90: 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  *zResult = 0;.  
4ba0: 69 6e 74 20 68 61 73 49 66 20 3d 20 30 3b 0a 20  int hasIf = 0;. 
4bb0: 20 53 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20   String str;..  
4bc0: 66 6f 72 28 70 49 66 20 3d 20 69 66 53 74 61 63  for(pIf = ifStac
4bd0: 6b 3b 20 70 49 66 3b 20 70 49 66 3d 70 49 66 2d  k; pIf; pIf=pIf-
4be0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4bf0: 20 70 49 66 2d 3e 7a 43 6f 6e 64 69 74 69 6f 6e   pIf->zCondition
4c00: 3d 3d 30 20 7c 7c 20 2a 70 49 66 2d 3e 7a 43 6f  ==0 || *pIf->zCo
4c10: 6e 64 69 74 69 6f 6e 3d 3d 30 20 29 20 63 6f 6e  ndition==0 ) con
4c20: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21  tinue;.    if( !
4c30: 68 61 73 49 66 20 29 7b 0a 20 20 20 20 20 20 68  hasIf ){.      h
4c40: 61 73 49 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  asIf = 1;.      
4c50: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
4c60: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4c70: 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28     StringAppend(
4c80: 26 73 74 72 2c 22 20 26 26 20 22 2c 34 29 3b 0a  &str," && ",4);.
4c90: 20 20 20 20 7d 0a 20 20 20 20 53 74 72 69 6e 67      }.    String
4ca0: 41 70 70 65 6e 64 28 26 73 74 72 2c 70 49 66 2d  Append(&str,pIf-
4cb0: 3e 7a 43 6f 6e 64 69 74 69 6f 6e 2c 30 29 3b 0a  >zCondition,0);.
4cc0: 20 20 7d 0a 20 20 69 66 28 20 68 61 73 49 66 20    }.  if( hasIf 
4cd0: 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d  ){.    zResult =
4ce0: 20 53 74 72 44 75 70 28 53 74 72 69 6e 67 47 65   StrDup(StringGe
4cf0: 74 28 26 73 74 72 29 2c 30 29 3b 0a 20 20 20 20  t(&str),0);.    
4d00: 53 74 72 69 6e 67 52 65 73 65 74 28 26 73 74 72  StringReset(&str
4d10: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4d20: 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 7d  zResult = 0;.  }
4d30: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73 75 6c  .  return zResul
4d40: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t;.}../*.** Crea
4d50: 74 65 20 61 20 6e 65 77 20 64 65 63 6c 61 72 61  te a new declara
4d60: 74 69 6f 6e 20 61 6e 64 20 70 75 74 20 69 74 20  tion and put it 
4d70: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
4d80: 65 2e 20 20 41 6c 73 6f 0a 2a 2a 20 72 65 74 75  e.  Also.** retu
4d90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
4da0: 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  it so that we ca
4db0: 6e 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 7a 46  n fill in the zF
4dc0: 77 64 20 61 6e 64 20 7a 44 65 63 6c 0a 2a 2a 20  wd and zDecl.** 
4dd0: 66 69 65 6c 64 73 2c 20 61 6e 64 20 73 6f 20 66  fields, and so f
4de0: 6f 72 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  orth..*/.static 
4df0: 44 65 63 6c 20 2a 43 72 65 61 74 65 44 65 63 6c  Decl *CreateDecl
4e00: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
4e10: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20  zName,       /* 
4e20: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a 65  Name of the obje
4e30: 63 74 20 62 65 69 6e 67 20 64 65 63 6c 61 72 65  ct being declare
4e40: 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  d. */.  int nNam
4e50: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
4e60: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
4e70: 65 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 44  e name */.){.  D
4e80: 65 63 6c 20 2a 70 44 65 63 6c 3b 0a 0a 20 20 70  ecl *pDecl;..  p
4e90: 44 65 63 6c 20 3d 20 53 61 66 65 4d 61 6c 6c 6f  Decl = SafeMallo
4ea0: 63 28 20 73 69 7a 65 6f 66 28 44 65 63 6c 29 20  c( sizeof(Decl) 
4eb0: 2b 20 6e 4e 61 6d 65 20 2b 20 31 29 3b 0a 20 20  + nName + 1);.  
4ec0: 6d 65 6d 73 65 74 28 70 44 65 63 6c 2c 30 2c 73  memset(pDecl,0,s
4ed0: 69 7a 65 6f 66 28 44 65 63 6c 29 29 3b 0a 20 20  izeof(Decl));.  
4ee0: 70 44 65 63 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 28  pDecl->zName = (
4ef0: 63 68 61 72 2a 29 26 70 44 65 63 6c 5b 31 5d 3b  char*)&pDecl[1];
4f00: 0a 20 20 73 70 72 69 6e 74 66 28 70 44 65 63 6c  .  sprintf(pDecl
4f10: 2d 3e 7a 4e 61 6d 65 2c 22 25 2e 2a 73 22 2c 6e  ->zName,"%.*s",n
4f20: 4e 61 6d 65 2c 7a 4e 61 6d 65 29 3b 0a 20 20 70  Name,zName);.  p
4f30: 44 65 63 6c 2d 3e 7a 46 69 6c 65 20 3d 20 7a 46  Decl->zFile = zF
4f40: 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 44 65 63 6c  ilename;.  pDecl
4f50: 2d 3e 70 49 6e 63 6c 75 64 65 20 3d 20 69 6e 63  ->pInclude = inc
4f60: 6c 75 64 65 4c 69 73 74 3b 0a 20 20 70 44 65 63  ludeList;.  pDec
4f70: 6c 2d 3e 7a 49 66 20 3d 20 47 65 74 49 66 53 74  l->zIf = GetIfSt
4f80: 72 69 6e 67 28 29 3b 0a 20 20 49 6e 73 74 61 6c  ring();.  Instal
4f90: 6c 44 65 63 6c 28 70 44 65 63 6c 29 3b 0a 20 20  lDecl(pDecl);.  
4fa0: 72 65 74 75 72 6e 20 70 44 65 63 6c 3b 0a 7d 0a  return pDecl;.}.
4fb0: 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
4fc0: 6e 65 77 20 69 64 65 6e 74 69 66 69 65 72 20 69  new identifier i
4fd0: 6e 74 6f 20 61 6e 20 74 61 62 6c 65 20 6f 66 20  nto an table of 
4fe0: 69 64 65 6e 74 69 66 69 65 72 73 2e 20 20 52 65  identifiers.  Re
4ff0: 74 75 72 6e 20 54 52 55 45 20 69 66 0a 2a 2a 20  turn TRUE if.** 
5000: 61 20 6e 65 77 20 69 64 65 6e 74 69 66 69 65 72  a new identifier
5010: 20 77 61 73 20 69 6e 73 65 72 74 65 64 20 61 6e   was inserted an
5020: 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69  d return FALSE i
5030: 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
5040: 20 77 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   was.** already 
5050: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
5060: 0a 73 74 61 74 69 63 20 69 6e 74 20 49 64 65 6e  .static int Iden
5070: 74 54 61 62 6c 65 49 6e 73 65 72 74 28 0a 20 20  tTableInsert(.  
5080: 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 54 61 62  IdentTable *pTab
5090: 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  le,       /* The
50a0: 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63   table into whic
50b0: 68 20 77 65 20 77 69 6c 6c 20 69 6e 73 65 72 74  h we will insert
50c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
50d0: 20 2a 7a 49 64 2c 20 20 20 20 20 20 20 20 20 20   *zId,          
50e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
50f0: 64 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a 20 20  dentifiers */.  
5100: 69 6e 74 20 6e 49 64 20 20 20 20 20 20 20 20 20  int nId         
5110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
5120: 67 74 68 20 6f 66 20 74 68 65 20 69 64 65 6e 74  gth of the ident
5130: 69 66 69 65 72 20 6e 61 6d 65 20 2a 2f 0a 29 7b  ifier name */.){
5140: 0a 20 20 69 6e 74 20 68 3b 0a 20 20 49 64 65 6e  .  int h;.  Iden
5150: 74 20 2a 70 49 64 3b 0a 0a 20 20 69 66 28 20 6e  t *pId;..  if( n
5160: 49 64 3c 3d 30 20 29 7b 0a 20 20 20 20 6e 49 64  Id<=0 ){.    nId
5170: 20 3d 20 73 74 72 6c 65 6e 28 7a 49 64 29 3b 0a   = strlen(zId);.
5180: 20 20 7d 0a 20 20 68 20 3d 20 48 61 73 68 28 7a    }.  h = Hash(z
5190: 49 64 2c 6e 49 64 29 20 25 20 49 44 45 4e 54 5f  Id,nId) % IDENT_
51a0: 48 41 53 48 5f 53 49 5a 45 3b 0a 20 20 66 6f 72  HASH_SIZE;.  for
51b0: 28 70 49 64 20 3d 20 70 54 61 62 6c 65 2d 3e 61  (pId = pTable->a
51c0: 70 54 61 62 6c 65 5b 68 5d 3b 20 70 49 64 3b 20  pTable[h]; pId; 
51d0: 70 49 64 3d 70 49 64 2d 3e 70 43 6f 6c 6c 69 64  pId=pId->pCollid
51e0: 65 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e  e){.    if( strn
51f0: 63 6d 70 28 7a 49 64 2c 70 49 64 2d 3e 7a 4e 61  cmp(zId,pId->zNa
5200: 6d 65 2c 6e 49 64 29 3d 3d 30 20 26 26 20 70 49  me,nId)==0 && pI
5210: 64 2d 3e 7a 4e 61 6d 65 5b 6e 49 64 5d 3d 3d 30  d->zName[nId]==0
5220: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 72 69   ){.      /* pri
5230: 6e 74 66 28 22 41 6c 72 65 61 64 79 20 69 6e 20  ntf("Already in 
5240: 74 61 62 6c 65 3a 20 25 2e 2a 73 5c 6e 22 2c 6e  table: %.*s\n",n
5250: 49 64 2c 7a 49 64 29 3b 20 2a 2f 0a 20 20 20 20  Id,zId); */.    
5260: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
5270: 7d 0a 20 20 7d 0a 20 20 70 49 64 20 3d 20 53 61  }.  }.  pId = Sa
5280: 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  feMalloc( sizeof
5290: 28 49 64 65 6e 74 29 20 2b 20 6e 49 64 20 2b 20  (Ident) + nId + 
52a0: 31 20 29 3b 0a 20 20 70 49 64 2d 3e 7a 4e 61 6d  1 );.  pId->zNam
52b0: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 64 5b  e = (char*)&pId[
52c0: 31 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 70 49  1];.  sprintf(pI
52d0: 64 2d 3e 7a 4e 61 6d 65 2c 22 25 2e 2a 73 22 2c  d->zName,"%.*s",
52e0: 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 70 49 64 2d  nId,zId);.  pId-
52f0: 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 6c 65 2d  >pNext = pTable-
5300: 3e 70 4c 69 73 74 3b 0a 20 20 70 54 61 62 6c 65  >pList;.  pTable
5310: 2d 3e 70 4c 69 73 74 20 3d 20 70 49 64 3b 0a 20  ->pList = pId;. 
5320: 20 70 49 64 2d 3e 70 43 6f 6c 6c 69 64 65 20 3d   pId->pCollide =
5330: 20 70 54 61 62 6c 65 2d 3e 61 70 54 61 62 6c 65   pTable->apTable
5340: 5b 68 5d 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  [h];.  pTable->a
5350: 70 54 61 62 6c 65 5b 68 5d 20 3d 20 70 49 64 3b  pTable[h] = pId;
5360: 0a 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 41 64  .  /* printf("Ad
5370: 64 20 74 6f 20 74 61 62 6c 65 3a 20 25 2e 2a 73  d to table: %.*s
5380: 5c 6e 22 2c 6e 49 64 2c 7a 49 64 29 3b 20 2a 2f  \n",nId,zId); */
5390: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
53a0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
53b0: 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ee if the given 
53c0: 76 61 6c 75 65 20 69 73 20 69 6e 20 74 68 65 20  value is in the 
53d0: 67 69 76 65 6e 20 49 64 65 6e 74 54 61 62 6c 65  given IdentTable
53e0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
53f0: 65 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 66  e if it is and f
5400: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 6e 6f  alse if it is no
5410: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5420: 20 49 64 65 6e 74 54 61 62 6c 65 54 65 73 74 28   IdentTableTest(
5430: 0a 20 20 49 64 65 6e 74 54 61 62 6c 65 20 2a 70  .  IdentTable *p
5440: 54 61 62 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20  Table,       /* 
5450: 54 68 65 20 74 61 62 6c 65 20 69 6e 20 77 68 69  The table in whi
5460: 63 68 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  ch to search */.
5470: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
5480: 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  d,          /* N
5490: 61 6d 65 20 6f 66 20 74 68 65 20 69 64 65 6e 74  ame of the ident
54a0: 69 66 69 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  ifiers */.  int 
54b0: 6e 49 64 20 20 20 20 20 20 20 20 20 20 20 20 20  nId             
54c0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
54d0: 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
54e0: 72 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69  r name */.){.  i
54f0: 6e 74 20 68 3b 0a 20 20 49 64 65 6e 74 20 2a 70  nt h;.  Ident *p
5500: 49 64 3b 0a 0a 20 20 69 66 28 20 6e 49 64 3c 3d  Id;..  if( nId<=
5510: 30 20 29 7b 0a 20 20 20 20 6e 49 64 20 3d 20 73  0 ){.    nId = s
5520: 74 72 6c 65 6e 28 7a 49 64 29 3b 0a 20 20 7d 0a  trlen(zId);.  }.
5530: 20 20 68 20 3d 20 48 61 73 68 28 7a 49 64 2c 6e    h = Hash(zId,n
5540: 49 64 29 20 25 20 49 44 45 4e 54 5f 48 41 53 48  Id) % IDENT_HASH
5550: 5f 53 49 5a 45 3b 0a 20 20 66 6f 72 28 70 49 64  _SIZE;.  for(pId
5560: 20 3d 20 70 54 61 62 6c 65 2d 3e 61 70 54 61 62   = pTable->apTab
5570: 6c 65 5b 68 5d 3b 20 70 49 64 3b 20 70 49 64 3d  le[h]; pId; pId=
5580: 70 49 64 2d 3e 70 43 6f 6c 6c 69 64 65 29 7b 0a  pId->pCollide){.
5590: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
55a0: 7a 49 64 2c 70 49 64 2d 3e 7a 4e 61 6d 65 2c 6e  zId,pId->zName,n
55b0: 49 64 29 3d 3d 30 20 26 26 20 70 49 64 2d 3e 7a  Id)==0 && pId->z
55c0: 4e 61 6d 65 5b 6e 49 64 5d 3d 3d 30 20 29 7b 0a  Name[nId]==0 ){.
55d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
55e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
55f0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
5600: 65 6d 6f 76 65 20 65 76 65 72 79 20 69 64 65 6e  emove every iden
5610: 74 69 66 69 65 72 20 66 72 6f 6d 20 74 68 65 20  tifier from the 
5620: 67 69 76 65 6e 20 74 61 62 6c 65 2e 20 20 20 52  given table.   R
5630: 65 73 65 74 20 74 68 65 20 74 61 62 6c 65 20 74  eset the table t
5640: 6f 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69 61 6c  o.** its initial
5650: 20 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69   state..*/.stati
5660: 63 20 76 6f 69 64 20 49 64 65 6e 74 54 61 62 6c  c void IdentTabl
5670: 65 52 65 73 65 74 28 49 64 65 6e 74 54 61 62 6c  eReset(IdentTabl
5680: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 64  e *pTable){.  Id
5690: 65 6e 74 20 2a 70 49 64 2c 20 2a 70 4e 65 78 74  ent *pId, *pNext
56a0: 3b 0a 0a 20 20 66 6f 72 28 70 49 64 20 3d 20 70  ;..  for(pId = p
56b0: 54 61 62 6c 65 2d 3e 70 4c 69 73 74 3b 20 70 49  Table->pList; pI
56c0: 64 3b 20 70 49 64 20 3d 20 70 4e 65 78 74 29 7b  d; pId = pNext){
56d0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 64  .    pNext = pId
56e0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 53 61 66  ->pNext;.    Saf
56f0: 65 46 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a  eFree(pId);.  }.
5700: 20 20 6d 65 6d 73 65 74 28 70 54 61 62 6c 65 2c    memset(pTable,
5710: 30 2c 73 69 7a 65 6f 66 28 49 64 65 6e 74 54 61  0,sizeof(IdentTa
5720: 62 6c 65 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  ble));.}..#ifdef
5730: 20 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69   DEBUG./*.** Pri
5740: 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  nt the name of e
5750: 76 65 72 79 20 69 64 65 6e 74 69 66 69 65 72 20  very identifier 
5760: 69 6e 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  in the given tab
5770: 6c 65 2c 20 6f 6e 65 20 70 65 72 20 6c 69 6e 65  le, one per line
5780: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5790: 49 64 65 6e 74 54 61 62 6c 65 50 72 69 6e 74 28  IdentTablePrint(
57a0: 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 54 61 62  IdentTable *pTab
57b0: 6c 65 2c 20 46 49 4c 45 20 2a 70 4f 75 74 29 7b  le, FILE *pOut){
57c0: 0a 20 20 49 64 65 6e 74 20 2a 70 49 64 3b 0a 0a  .  Ident *pId;..
57d0: 20 20 66 6f 72 28 70 49 64 20 3d 20 70 54 61 62    for(pId = pTab
57e0: 6c 65 2d 3e 70 4c 69 73 74 3b 20 70 49 64 3b 20  le->pList; pId; 
57f0: 70 49 64 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74  pId = pId->pNext
5800: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  ){.    fprintf(p
5810: 4f 75 74 2c 22 25 73 5c 6e 22 2c 70 49 64 2d 3e  Out,"%s\n",pId->
5820: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  zName);.  }.}.#e
5830: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
5840: 20 61 6e 20 65 6e 74 69 72 65 20 66 69 6c 65 20   an entire file 
5850: 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 20 52 65  into memory.  Re
5860: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
5870: 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  o the memory..**
5880: 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 69  .** The memory i
5890: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
58a0: 53 61 66 65 4d 61 6c 6c 6f 63 20 61 6e 64 20 6d  SafeMalloc and m
58b0: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
58c0: 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  the.** calling f
58d0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
58e0: 66 20 74 68 65 20 72 65 61 64 20 66 61 69 6c 73  f the read fails
58f0: 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
5900: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a   0 is returned..
5910: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
5920: 52 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20 63  ReadFile(const c
5930: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
5940: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
5950: 53 74 61 74 3b 0a 20 20 46 49 4c 45 20 2a 70 49  Stat;.  FILE *pI
5960: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b  n;.  char *zBuf;
5970: 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28  .  int n;..  if(
5980: 20 73 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65 2c   stat(zFilename,
5990: 26 73 53 74 61 74 29 21 3d 30 0a 23 69 66 6e 64  &sStat)!=0.#ifnd
59a0: 65 66 20 57 49 4e 33 32 0a 20 20 20 20 7c 7c 20  ef WIN32.    || 
59b0: 21 53 5f 49 53 52 45 47 28 73 53 74 61 74 2e 73  !S_ISREG(sStat.s
59c0: 74 5f 6d 6f 64 65 29 0a 23 65 6e 64 69 66 0a 20  t_mode).#endif. 
59d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
59e0: 3b 0a 20 20 7d 0a 20 20 70 49 6e 20 3d 20 66 6f  ;.  }.  pIn = fo
59f0: 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 72  pen(zFilename,"r
5a00: 22 29 3b 0a 20 20 69 66 28 20 70 49 6e 3d 3d 30  ");.  if( pIn==0
5a10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
5a20: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 20 3d 20 53  ;.  }.  zBuf = S
5a30: 61 66 65 4d 61 6c 6c 6f 63 28 20 73 53 74 61 74  afeMalloc( sStat
5a40: 2e 73 74 5f 73 69 7a 65 20 2b 20 31 20 29 3b 0a  .st_size + 1 );.
5a50: 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66    n = fread(zBuf
5a60: 2c 31 2c 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  ,1,sStat.st_size
5a70: 2c 70 49 6e 29 3b 0a 20 20 7a 42 75 66 5b 6e 5d  ,pIn);.  zBuf[n]
5a80: 20 3d 20 30 3b 0a 20 20 66 63 6c 6f 73 65 28 70   = 0;.  fclose(p
5a90: 49 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42  In);.  return zB
5aa0: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  uf;.}../*.** Wri
5ab0: 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
5ac0: 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e 74 6f  of a string into
5ad0: 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
5ae0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
5af0: 2a 20 65 72 72 6f 72 73 0a 2a 2f 0a 73 74 61 74  * errors.*/.stat
5b00: 69 63 20 69 6e 74 20 57 72 69 74 65 46 69 6c 65  ic int WriteFile
5b10: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
5b20: 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
5b30: 61 72 20 2a 7a 4f 75 74 70 75 74 29 7b 0a 20 20  ar *zOutput){.  
5b40: 46 49 4c 45 20 2a 70 4f 75 74 3b 0a 20 20 70 4f  FILE *pOut;.  pO
5b50: 75 74 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65  ut = fopen(zFile
5b60: 6e 61 6d 65 2c 22 77 22 29 3b 0a 20 20 69 66 28  name,"w");.  if(
5b70: 20 70 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pOut==0 ){.    
5b80: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
5b90: 66 77 72 69 74 65 28 7a 4f 75 74 70 75 74 2c 31  fwrite(zOutput,1
5ba0: 2c 73 74 72 6c 65 6e 28 7a 4f 75 74 70 75 74 29  ,strlen(zOutput)
5bb0: 2c 70 4f 75 74 29 3b 0a 20 20 66 63 6c 6f 73 65  ,pOut);.  fclose
5bc0: 28 70 4f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e  (pOut);.  return
5bd0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6a   0;.}../*.** Maj
5be0: 6f 72 20 74 6f 6b 65 6e 20 74 79 70 65 73 0a 2a  or token types.*
5bf0: 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 53 70 61  /.#define TT_Spa
5c00: 63 65 20 20 20 20 20 20 20 20 20 20 20 31 20 20  ce           1  
5c10: 20 2f 2a 20 43 6f 6e 74 69 67 75 6f 75 73 20 77   /* Contiguous w
5c20: 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 23 64  hite space */.#d
5c30: 65 66 69 6e 65 20 54 54 5f 49 64 20 20 20 20 20  efine TT_Id     
5c40: 20 20 20 20 20 20 20 20 20 32 20 20 20 2f 2a 20           2   /* 
5c50: 41 6e 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f  An identifier */
5c60: 0a 23 64 65 66 69 6e 65 20 54 54 5f 50 72 65 70  .#define TT_Prep
5c70: 72 6f 63 65 73 73 6f 72 20 20 20 20 33 20 20 20  rocessor    3   
5c80: 2f 2a 20 41 6e 79 20 43 20 70 72 65 70 72 6f 63  /* Any C preproc
5c90: 65 73 73 6f 72 20 64 69 72 65 63 74 69 76 65 20  essor directive 
5ca0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 43 6f  */.#define TT_Co
5cb0: 6d 6d 65 6e 74 20 20 20 20 20 20 20 20 20 34 20  mment         4 
5cc0: 20 20 2f 2a 20 45 69 74 68 65 72 20 43 20 6f 72    /* Either C or
5cd0: 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65   C++ style comme
5ce0: 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 54  nt */.#define TT
5cf0: 5f 4e 75 6d 62 65 72 20 20 20 20 20 20 20 20 20  _Number         
5d00: 20 35 20 20 20 2f 2a 20 41 6e 79 20 6e 75 6d 65   5   /* Any nume
5d10: 72 69 63 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a  ric constant */.
5d20: 23 64 65 66 69 6e 65 20 54 54 5f 53 74 72 69 6e  #define TT_Strin
5d30: 67 20 20 20 20 20 20 20 20 20 20 36 20 20 20 2f  g          6   /
5d40: 2a 20 53 74 72 69 6e 67 20 6f 72 20 63 68 61 72  * String or char
5d50: 61 63 74 65 72 20 63 6f 6e 73 74 61 6e 74 73 2e  acter constants.
5d60: 20 22 2e 2e 22 20 6f 72 20 27 2e 27 20 2a 2f 0a   ".." or '.' */.
5d70: 23 64 65 66 69 6e 65 20 54 54 5f 42 72 61 63 65  #define TT_Brace
5d80: 73 20 20 20 20 20 20 20 20 20 20 37 20 20 20 2f  s          7   /
5d90: 2a 20 41 6c 6c 20 74 65 78 74 20 62 65 74 77 65  * All text betwe
5da0: 65 6e 20 7b 20 61 6e 64 20 61 20 6d 61 74 63 68  en { and a match
5db0: 69 6e 67 20 7d 20 2a 2f 0a 23 64 65 66 69 6e 65  ing } */.#define
5dc0: 20 54 54 5f 45 4f 46 20 20 20 20 20 20 20 20 20   TT_EOF         
5dd0: 20 20 20 20 38 20 20 20 2f 2a 20 45 6e 64 20 6f      8   /* End o
5de0: 66 20 66 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e  f file */.#defin
5df0: 65 20 54 54 5f 45 72 72 6f 72 20 20 20 20 20 20  e TT_Error      
5e00: 20 20 20 20 20 39 20 20 20 2f 2a 20 41 6e 20 65       9   /* An e
5e10: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a  rror condition *
5e20: 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 42 6c 6f  /.#define TT_Blo
5e30: 63 6b 43 6f 6d 6d 65 6e 74 20 20 20 20 31 30 20  ckComment    10 
5e40: 20 2f 2a 20 41 20 43 2d 53 74 79 6c 65 20 63 6f   /* A C-Style co
5e50: 6d 6d 65 6e 74 20 61 74 20 74 68 65 20 6c 65 66  mment at the lef
5e60: 74 20 6d 61 72 67 69 6e 20 74 68 61 74 0a 20 20  t margin that.  
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20                * 
5e90: 73 70 61 6e 73 20 6d 75 6c 74 69 70 6c 65 20 6c  spans multiple l
5ea0: 69 6e 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ines */.#define 
5eb0: 54 54 5f 4f 74 68 65 72 20 20 20 20 20 20 20 20  TT_Other        
5ec0: 20 20 20 30 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f     0   /* None o
5ed0: 66 20 74 68 65 20 61 62 6f 76 65 20 2a 2f 0a 0a  f the above */..
5ee0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 73 69 6e 67  /*.** Get a sing
5ef0: 6c 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 74 6f 6b  le low-level tok
5f00: 65 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  en from the inpu
5f10: 74 20 66 69 6c 65 2e 20 20 55 70 64 61 74 65 20  t file.  Update 
5f20: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 70 6f 69 6e  the.** file poin
5f30: 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
5f40: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
5f50: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 79  st character bey
5f60: 6f 6e 64 20 74 68 65 0a 2a 2a 20 74 6f 6b 65 6e  ond the.** token
5f70: 2e 0a 2a 2a 0a 2a 2a 20 41 20 22 6c 6f 77 2d 6c  ..**.** A "low-l
5f80: 65 76 65 6c 20 74 6f 6b 65 6e 22 20 69 73 20 61  evel token" is a
5f90: 6e 79 20 74 6f 6b 65 6e 20 65 78 63 65 70 74 20  ny token except 
5fa0: 54 54 5f 42 72 61 63 65 73 2e 20 20 41 20 54 54  TT_Braces.  A TT
5fb0: 5f 42 72 61 63 65 73 20 74 6f 6b 65 6e 0a 2a 2a  _Braces token.**
5fc0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 6d 61 6e   consists of man
5fd0: 79 20 73 6d 61 6c 6c 65 72 20 74 6f 6b 65 6e 73  y smaller tokens
5fe0: 20 61 6e 64 20 69 73 20 61 73 73 65 6d 62 6c 65   and is assemble
5ff0: 64 20 62 79 20 61 20 72 6f 75 74 69 6e 65 20 74  d by a routine t
6000: 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69  hat.** calls thi
6010: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  s one..**.** The
6020: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
6030: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
6040: 65 72 72 6f 72 73 2e 20 20 41 6e 20 65 72 72 6f  errors.  An erro
6050: 72 20 69 73 20 61 6e 0a 2a 2a 20 75 6e 74 65 72  r is an.** unter
6060: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 6f  minated string o
6070: 72 20 63 68 61 72 61 63 74 65 72 20 6c 69 74 65  r character lite
6080: 72 61 6c 20 6f 72 20 61 6e 20 75 6e 74 65 72 6d  ral or an unterm
6090: 69 6e 61 74 65 64 0a 2a 2a 20 63 6f 6d 6d 65 6e  inated.** commen
60a0: 74 2e 0a 2a 2a 0a 2a 2a 20 50 72 6f 66 69 6c 69  t..**.** Profili
60b0: 6e 67 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ng shows that th
60c0: 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 73 75  is routine consu
60d0: 6d 65 73 20 61 62 6f 75 74 20 68 61 6c 66 20 74  mes about half t
60e0: 68 65 0a 2a 2a 20 43 50 55 20 74 69 6d 65 20 6f  he.** CPU time o
60f0: 6e 20 61 20 74 79 70 69 63 61 6c 20 72 75 6e 20  n a typical run 
6100: 6f 66 20 6d 61 6b 65 68 65 61 64 65 72 73 2e 0a  of makeheaders..
6110: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 47 65  */.static int Ge
6120: 74 54 6f 6b 65 6e 28 49 6e 53 74 72 65 61 6d 20  tToken(InStream 
6130: 2a 70 49 6e 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  *pIn, Token *pTo
6140: 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ken){.  int i;. 
6150: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
6160: 20 20 69 6e 74 20 63 53 74 61 72 74 3b 0a 20 20    int cStart;.  
6170: 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 73 74 61  int c;.  int sta
6180: 72 74 4c 69 6e 65 3b 20 20 20 2f 2a 20 4c 69 6e  rtLine;   /* Lin
6190: 65 20 6f 6e 20 77 68 69 63 68 20 61 20 73 74 72  e on which a str
61a0: 75 63 74 75 72 65 20 62 65 67 69 6e 73 20 2a 2f  ucture begins */
61b0: 0a 20 20 69 6e 74 20 6e 6c 69 73 63 20 3d 20 30  .  int nlisc = 0
61c0: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ;   /* True if t
61d0: 68 65 72 65 20 69 73 20 61 20 6e 65 77 2d 6c 69  here is a new-li
61e0: 6e 65 20 69 6e 20 61 20 22 2e 2e 22 20 6f 72 20  ne in a ".." or 
61f0: 27 2e 2e 27 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  '..' */.  int nE
6200: 72 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  rr = 0;    /* Nu
6210: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
6220: 65 65 6e 20 2a 2f 0a 0a 20 20 7a 20 3d 20 70 49  een */..  z = pI
6230: 6e 2d 3e 7a 3b 0a 20 20 69 20 3d 20 70 49 6e 2d  n->z;.  i = pIn-
6240: 3e 69 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 6e 4c  >i;.  pToken->nL
6250: 69 6e 65 20 3d 20 70 49 6e 2d 3e 6e 4c 69 6e 65  ine = pIn->nLine
6260: 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78  ;.  pToken->zTex
6270: 74 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20 73 77 69  t = &z[i];.  swi
6280: 74 63 68 28 20 7a 5b 69 5d 20 29 7b 0a 20 20 20  tch( z[i] ){.   
6290: 20 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20 70   case 0:.      p
62a0: 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54  Token->eType = T
62b0: 54 5f 45 4f 46 3b 0a 20 20 20 20 20 20 70 54 6f  T_EOF;.      pTo
62c0: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 30 3b 0a  ken->nText = 0;.
62d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
62e0: 20 20 63 61 73 65 20 27 23 27 3a 0a 20 20 20 20    case '#':.    
62f0: 20 20 69 66 28 20 69 3d 3d 30 20 7c 7c 20 7a 5b    if( i==0 || z[
6300: 69 2d 31 5d 3d 3d 27 5c 6e 27 20 7c 7c 20 28 69  i-1]=='\n' || (i
6310: 3e 31 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27 5c  >1 && z[i-1]=='\
6320: 72 27 20 26 26 20 7a 5b 69 2d 32 5d 3d 3d 27 5c  r' && z[i-2]=='\
6330: 6e 27 29 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  n')){.        /*
6340: 20 57 65 20 66 6f 75 6e 64 20 61 20 70 72 65 70   We found a prep
6350: 72 6f 63 65 73 73 6f 72 20 73 74 61 74 65 6d 65  rocessor stateme
6360: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  nt */.        pT
6370: 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54  oken->eType = TT
6380: 5f 50 72 65 70 72 6f 63 65 73 73 6f 72 3b 0a 20  _Preprocessor;. 
6390: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
63a0: 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 21      while( z[i]!
63b0: 3d 30 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 6e 27  =0 && z[i]!='\n'
63c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
63d0: 28 20 7a 5b 69 5d 3d 3d 27 5c 5c 27 20 29 7b 0a  ( z[i]=='\\' ){.
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b              i++;
63f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6400: 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 70 49   z[i]=='\n' ) pI
6410: 6e 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20  n->nLine++;.    
6420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6430: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    i++;.        }
6440: 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d  .        pToken-
6450: 3e 6e 54 65 78 74 20 3d 20 69 20 2d 20 70 49 6e  >nText = i - pIn
6460: 2d 3e 69 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ->i;.      }else
6470: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 73  {.        /* Jus
6480: 74 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  t an operator */
6490: 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d  .        pToken-
64a0: 3e 65 54 79 70 65 20 3d 20 54 54 5f 4f 74 68 65  >eType = TT_Othe
64b0: 72 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65  r;.        pToke
64c0: 6e 2d 3e 6e 54 65 78 74 20 3d 20 31 3b 0a 20 20  n->nText = 1;.  
64d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
64e0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 27 20 27  k;..    case ' '
64f0: 3a 0a 20 20 20 20 63 61 73 65 20 27 5c 74 27 3a  :.    case '\t':
6500: 0a 20 20 20 20 63 61 73 65 20 27 5c 72 27 3a 0a  .    case '\r':.
6510: 20 20 20 20 63 61 73 65 20 27 5c 66 27 3a 0a 20      case '\f':. 
6520: 20 20 20 63 61 73 65 20 27 5c 6e 27 3a 0a 20 20     case '\n':.  
6530: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
6540: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
6550: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c      if( z[i]=='\
6560: 6e 27 20 29 20 70 49 6e 2d 3e 6e 4c 69 6e 65 2b  n' ) pIn->nLine+
6570: 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  +;.        i++;.
6580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
6590: 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54  oken->eType = TT
65a0: 5f 53 70 61 63 65 3b 0a 20 20 20 20 20 20 70 54  _Space;.      pT
65b0: 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 69 20  oken->nText = i 
65c0: 2d 20 70 49 6e 2d 3e 69 3b 0a 20 20 20 20 20 20  - pIn->i;.      
65d0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
65e0: 20 27 5c 5c 27 3a 0a 20 20 20 20 20 20 70 54 6f   '\\':.      pTo
65f0: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 32 3b 0a  ken->nText = 2;.
6600: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54        pToken->eT
6610: 79 70 65 20 3d 20 54 54 5f 4f 74 68 65 72 3b 0a  ype = TT_Other;.
6620: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
6630: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
6640: 20 20 70 49 6e 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a    pIn->nLine++;.
6650: 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e          pToken->
6660: 65 54 79 70 65 20 3d 20 54 54 5f 53 70 61 63 65  eType = TT_Space
6670: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6680: 28 20 7a 5b 69 2b 31 5d 3d 3d 30 20 29 7b 0a 20  ( z[i+1]==0 ){. 
6690: 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e         pToken->n
66a0: 54 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Text = 1;.      
66b0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  }.      break;..
66c0: 20 20 20 20 63 61 73 65 20 27 5c 27 27 3a 0a 20      case '\'':. 
66d0: 20 20 20 63 61 73 65 20 27 5c 22 27 3a 0a 20 20     case '\"':.  
66e0: 20 20 20 20 63 53 74 61 72 74 20 3d 20 7a 5b 69      cStart = z[i
66f0: 5d 3b 0a 20 20 20 20 20 20 73 74 61 72 74 4c 69  ];.      startLi
6700: 6e 65 20 3d 20 70 49 6e 2d 3e 6e 4c 69 6e 65 3b  ne = pIn->nLine;
6710: 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
6720: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
6730: 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  c = z[i];.      
6740: 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b    if( c=='\n' ){
6750: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
6760: 6e 6c 69 73 63 20 29 7b 0a 20 20 20 20 20 20 20  nlisc ){.       
6770: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
6780: 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  err,.           
6790: 20 20 20 22 25 73 3a 25 64 3a 20 28 77 61 72 6e     "%s:%d: (warn
67a0: 69 6e 67 29 20 4e 65 77 6c 69 6e 65 20 69 6e 20  ing) Newline in 
67b0: 73 74 72 69 6e 67 20 6f 72 20 63 68 61 72 61 63  string or charac
67c0: 74 65 72 20 6c 69 74 65 72 61 6c 2e 5c 6e 22 2c  ter literal.\n",
67d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
67e0: 46 69 6c 65 6e 61 6d 65 2c 20 70 49 6e 2d 3e 6e  Filename, pIn->n
67f0: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Line);.         
6800: 20 20 20 6e 6c 69 73 63 20 3d 20 31 3b 0a 20 20     nlisc = 1;.  
6810: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6820: 20 20 20 20 70 49 6e 2d 3e 6e 4c 69 6e 65 2b 2b      pIn->nLine++
6830: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6840: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20      if( c=='\\' 
6850: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b  ){.          i++
6860: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
6870: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  z[i];.          
6880: 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20  if( c=='\n' ){. 
6890: 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e             pIn->
68a0: 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20  nLine++;.       
68b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
68c0: 73 65 20 69 66 28 20 63 3d 3d 63 53 74 61 72 74  se if( c==cStart
68d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b   ){.          i+
68e0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  +;.          c =
68f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
6900: 65 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20  e if( c==0 ){.  
6910: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
6920: 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
6930: 55 6e 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  Unterminated str
6940: 69 6e 67 20 6f 72 20 63 68 61 72 61 63 74 65 72  ing or character
6950: 20 6c 69 74 65 72 61 6c 2e 5c 6e 22 2c 0a 20 20   literal.\n",.  
6960: 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
6970: 6e 61 6d 65 2c 20 73 74 61 72 74 4c 69 6e 65 29  name, startLine)
6980: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72 72  ;.          nErr
6990: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
69a0: 20 20 20 20 7d 77 68 69 6c 65 28 20 63 20 29 3b      }while( c );
69b0: 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65  .      pToken->e
69c0: 54 79 70 65 20 3d 20 54 54 5f 53 74 72 69 6e 67  Type = TT_String
69d0: 3b 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e  ;.      pToken->
69e0: 6e 54 65 78 74 20 3d 20 69 20 2d 20 70 49 6e 2d  nText = i - pIn-
69f0: 3e 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  >i;.      break;
6a00: 0a 0a 20 20 20 20 63 61 73 65 20 27 2f 27 3a 0a  ..    case '/':.
6a10: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
6a20: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
6a30: 20 2f 2a 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f   /* C++ style co
6a40: 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  mment */.       
6a50: 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20 26 26 20   while( z[i] && 
6a60: 7a 5b 69 5d 21 3d 27 5c 6e 27 20 29 7b 20 69 2b  z[i]!='\n' ){ i+
6a70: 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 70 54 6f  +; }.        pTo
6a80: 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f  ken->eType = TT_
6a90: 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20  Comment;.       
6aa0: 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d   pToken->nText =
6ab0: 20 69 20 2d 20 70 49 6e 2d 3e 69 3b 0a 20 20 20   i - pIn->i;.   
6ac0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69     }else if( z[i
6ad0: 2b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20  +1]=='*' ){.    
6ae0: 20 20 20 20 2f 2a 20 43 20 73 74 79 6c 65 20 63      /* C style c
6af0: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  omment */.      
6b00: 20 20 69 6e 74 20 69 73 42 6c 6f 63 6b 43 6f 6d    int isBlockCom
6b10: 6d 65 6e 74 20 3d 20 69 3d 3d 30 20 7c 7c 20 7a  ment = i==0 || z
6b20: 5b 69 2d 31 5d 3d 3d 27 5c 6e 27 3b 0a 20 20 20  [i-1]=='\n';.   
6b30: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
6b40: 20 20 20 20 20 73 74 61 72 74 4c 69 6e 65 20 3d       startLine =
6b50: 20 70 49 6e 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20   pIn->nLine;.   
6b60: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d       while( z[i]
6b70: 20 26 26 20 28 7a 5b 69 5d 21 3d 27 2a 27 20 7c   && (z[i]!='*' |
6b80: 7c 20 7a 5b 69 2b 31 5d 21 3d 27 2f 27 29 20 29  | z[i+1]!='/') )
6b90: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
6ba0: 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  z[i]=='\n' ){.  
6bb0: 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 6e            pIn->n
6bc0: 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Line++;.        
6bd0: 20 20 20 20 69 66 28 20 69 73 42 6c 6f 63 6b 43      if( isBlockC
6be0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
6bf0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b          if( z[i+
6c00: 31 5d 3d 3d 27 2a 27 20 7c 7c 20 7a 5b 69 2b 32  1]=='*' || z[i+2
6c10: 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20  ]=='*' ){.      
6c20: 20 20 20 20 20 20 20 20 20 20 20 69 73 42 6c 6f             isBlo
6c30: 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20 32 3b 0a 20  ckComment = 2;. 
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
6c50: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
6c60: 20 20 20 20 20 69 73 42 6c 6f 63 6b 43 6f 6d 6d       isBlockComm
6c70: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ent = 0;.       
6c80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6c90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6ca0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b   }.          i++
6cb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6cc0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 7b 0a      if( z[i] ){.
6cd0: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32            i += 2
6ce0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
6cf0: 0a 20 20 20 20 20 20 20 20 20 20 69 73 42 6c 6f  .          isBlo
6d00: 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20  ckComment = 0;. 
6d10: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
6d20: 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20  (stderr,"%s:%d: 
6d30: 55 6e 74 65 72 6d 69 6e 61 74 65 64 20 63 6f 6d  Unterminated com
6d40: 6d 65 6e 74 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ment\n",.       
6d50: 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20       zFilename, 
6d60: 73 74 61 72 74 4c 69 6e 65 29 3b 0a 20 20 20 20  startLine);.    
6d70: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
6d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6d90: 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20  pToken->eType = 
6da0: 69 73 42 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 3d 3d  isBlockComment==
6db0: 32 20 3f 20 54 54 5f 42 6c 6f 63 6b 43 6f 6d 6d  2 ? TT_BlockComm
6dc0: 65 6e 74 20 3a 20 54 54 5f 43 6f 6d 6d 65 6e 74  ent : TT_Comment
6dd0: 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e  ;.        pToken
6de0: 2d 3e 6e 54 65 78 74 20 3d 20 69 20 2d 20 70 49  ->nText = i - pI
6df0: 6e 2d 3e 69 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n->i;.      }els
6e00: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  e{.        /* A 
6e10: 64 69 76 69 64 65 20 6f 70 65 72 61 74 6f 72 20  divide operator 
6e20: 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65  */.        pToke
6e30: 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f 4f 74  n->eType = TT_Ot
6e40: 68 65 72 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  her;.        pTo
6e50: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 31 20 2b  ken->nText = 1 +
6e60: 20 28 7a 5b 69 2b 31 5d 3d 3d 27 2b 27 29 3b 0a   (z[i+1]=='+');.
6e70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
6e80: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 27  eak;..    case '
6e90: 30 27 3a 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  0':.      if( z[
6ea0: 69 2b 31 5d 3d 3d 27 78 27 20 7c 7c 20 7a 5b 69  i+1]=='x' || z[i
6eb0: 2b 31 5d 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20  +1]=='X' ){.    
6ec0: 20 20 20 20 2f 2a 20 41 20 68 65 78 20 63 6f 6e      /* A hex con
6ed0: 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  stant */.       
6ee0: 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20   i += 2;.       
6ef0: 20 77 68 69 6c 65 28 20 69 73 78 64 69 67 69 74   while( isxdigit
6f00: 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d  (z[i]) ){ i++; }
6f10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6f20: 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 63 74 61        /* An octa
6f30: 6c 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20  l constant */.  
6f40: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64        while( isd
6f50: 69 67 69 74 28 7a 5b 69 5d 29 20 29 7b 20 69 2b  igit(z[i]) ){ i+
6f60: 2b 3b 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20  +; }.      }.   
6f70: 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65     pToken->eType
6f80: 20 3d 20 54 54 5f 4e 75 6d 62 65 72 3b 0a 20 20   = TT_Number;.  
6f90: 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78      pToken->nTex
6fa0: 74 20 3d 20 69 20 2d 20 70 49 6e 2d 3e 69 3b 0a  t = i - pIn->i;.
6fb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
6fc0: 20 20 63 61 73 65 20 27 31 27 3a 20 63 61 73 65    case '1': case
6fd0: 20 27 32 27 3a 20 63 61 73 65 20 27 33 27 3a 20   '2': case '3': 
6fe0: 63 61 73 65 20 27 34 27 3a 0a 20 20 20 20 63 61  case '4':.    ca
6ff0: 73 65 20 27 35 27 3a 20 63 61 73 65 20 27 36 27  se '5': case '6'
7000: 3a 20 63 61 73 65 20 27 37 27 3a 20 63 61 73 65  : case '7': case
7010: 20 27 38 27 3a 20 63 61 73 65 20 27 39 27 3a 0a   '8': case '9':.
7020: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64        while( isd
7030: 69 67 69 74 28 7a 5b 69 5d 29 20 29 7b 20 69 2b  igit(z[i]) ){ i+
7040: 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28  +; }.      if( (
7050: 63 3d 7a 5b 69 5d 29 3d 3d 27 2e 27 20 29 7b 0a  c=z[i])=='.' ){.
7060: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
7070: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73         while( is
7080: 64 69 67 69 74 28 7a 5b 69 5d 29 20 29 7b 20 69  digit(z[i]) ){ i
7090: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 63  ++; }.         c
70a0: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20   = z[i];.       
70b0: 20 20 69 66 28 20 63 3d 3d 27 65 27 20 7c 7c 20    if( c=='e' || 
70c0: 63 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 20 20  c=='E' ){.      
70d0: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
70e0: 20 20 20 20 20 69 66 28 20 28 28 63 3d 7a 5b 69       if( ((c=z[i
70f0: 5d 29 3d 3d 27 2b 27 20 7c 7c 20 63 3d 3d 27 2d  ])=='+' || c=='-
7100: 27 29 20 26 26 20 69 73 64 69 67 69 74 28 7a 5b  ') && isdigit(z[
7110: 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a  i+1]) ){ i++; }.
7120: 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
7130: 28 20 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 20  ( isdigit(z[i]) 
7140: 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ i++; }.      
7150: 20 20 20 20 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20       c = z[i];. 
7160: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7170: 20 20 20 69 66 28 20 63 3d 3d 27 66 27 20 7c 7c     if( c=='f' ||
7180: 20 63 3d 3d 27 46 27 20 7c 7c 20 63 3d 3d 27 6c   c=='F' || c=='l
7190: 27 20 7c 7c 20 63 3d 3d 27 4c 27 20 29 7b 20 69  ' || c=='L' ){ i
71a0: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73  ++; }.      }els
71b0: 65 20 69 66 28 20 63 3d 3d 27 65 27 20 7c 7c 20  e if( c=='e' || 
71c0: 63 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 20 20  c=='E' ){.      
71d0: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
71e0: 20 69 66 28 20 28 28 63 3d 7a 5b 69 5d 29 3d 3d   if( ((c=z[i])==
71f0: 27 2b 27 20 7c 7c 20 63 3d 3d 27 2d 27 29 20 26  '+' || c=='-') &
7200: 26 20 69 73 64 69 67 69 74 28 7a 5b 69 2b 31 5d  & isdigit(z[i+1]
7210: 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ i++; }.    
7220: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69       while( isdi
7230: 67 69 74 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b  git(z[i]) ){ i++
7240: 3b 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ; }.      }else 
7250: 69 66 28 20 63 3d 3d 27 4c 27 20 7c 7c 20 63 3d  if( c=='L' || c=
7260: 3d 27 6c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='l' ){.        
7270: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 63   i++;.         c
7280: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20   = z[i];.       
7290: 20 20 69 66 28 20 63 3d 3d 27 75 27 20 7c 7c 20    if( c=='u' || 
72a0: 63 3d 3d 27 55 27 20 29 7b 20 69 2b 2b 3b 20 7d  c=='U' ){ i++; }
72b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
72c0: 20 63 3d 3d 27 75 27 20 7c 7c 20 63 3d 3d 27 55   c=='u' || c=='U
72d0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 69 2b  ' ){.         i+
72e0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 63 20 3d 20  +;.         c = 
72f0: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 69  z[i];.         i
7300: 66 28 20 63 3d 3d 27 6c 27 20 7c 7c 20 63 3d 3d  f( c=='l' || c==
7310: 27 4c 27 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20  'L' ){ i++; }.  
7320: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 6f 6b      }.      pTok
7330: 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f 4e  en->eType = TT_N
7340: 75 6d 62 65 72 3b 0a 20 20 20 20 20 20 70 54 6f  umber;.      pTo
7350: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 69 20 2d  ken->nText = i -
7360: 20 70 49 6e 2d 3e 69 3b 0a 20 20 20 20 20 20 62   pIn->i;.      b
7370: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
7380: 27 61 27 3a 20 63 61 73 65 20 27 62 27 3a 20 63  'a': case 'b': c
7390: 61 73 65 20 27 63 27 3a 20 63 61 73 65 20 27 64  ase 'c': case 'd
73a0: 27 3a 20 63 61 73 65 20 27 65 27 3a 20 63 61 73  ': case 'e': cas
73b0: 65 20 27 66 27 3a 20 63 61 73 65 20 27 67 27 3a  e 'f': case 'g':
73c0: 0a 20 20 20 20 63 61 73 65 20 27 68 27 3a 20 63  .    case 'h': c
73d0: 61 73 65 20 27 69 27 3a 20 63 61 73 65 20 27 6a  ase 'i': case 'j
73e0: 27 3a 20 63 61 73 65 20 27 6b 27 3a 20 63 61 73  ': case 'k': cas
73f0: 65 20 27 6c 27 3a 20 63 61 73 65 20 27 6d 27 3a  e 'l': case 'm':
7400: 20 63 61 73 65 20 27 6e 27 3a 0a 20 20 20 20 63   case 'n':.    c
7410: 61 73 65 20 27 6f 27 3a 20 63 61 73 65 20 27 70  ase 'o': case 'p
7420: 27 3a 20 63 61 73 65 20 27 71 27 3a 20 63 61 73  ': case 'q': cas
7430: 65 20 27 72 27 3a 20 63 61 73 65 20 27 73 27 3a  e 'r': case 's':
7440: 20 63 61 73 65 20 27 74 27 3a 20 63 61 73 65 20   case 't': case 
7450: 27 75 27 3a 0a 20 20 20 20 63 61 73 65 20 27 76  'u':.    case 'v
7460: 27 3a 20 63 61 73 65 20 27 77 27 3a 20 63 61 73  ': case 'w': cas
7470: 65 20 27 78 27 3a 20 63 61 73 65 20 27 79 27 3a  e 'x': case 'y':
7480: 20 63 61 73 65 20 27 7a 27 3a 20 63 61 73 65 20   case 'z': case 
7490: 27 41 27 3a 20 63 61 73 65 20 27 42 27 3a 0a 20  'A': case 'B':. 
74a0: 20 20 20 63 61 73 65 20 27 43 27 3a 20 63 61 73     case 'C': cas
74b0: 65 20 27 44 27 3a 20 63 61 73 65 20 27 45 27 3a  e 'D': case 'E':
74c0: 20 63 61 73 65 20 27 46 27 3a 20 63 61 73 65 20   case 'F': case 
74d0: 27 47 27 3a 20 63 61 73 65 20 27 48 27 3a 20 63  'G': case 'H': c
74e0: 61 73 65 20 27 49 27 3a 0a 20 20 20 20 63 61 73  ase 'I':.    cas
74f0: 65 20 27 4a 27 3a 20 63 61 73 65 20 27 4b 27 3a  e 'J': case 'K':
7500: 20 63 61 73 65 20 27 4c 27 3a 20 63 61 73 65 20   case 'L': case 
7510: 27 4d 27 3a 20 63 61 73 65 20 27 4e 27 3a 20 63  'M': case 'N': c
7520: 61 73 65 20 27 4f 27 3a 20 63 61 73 65 20 27 50  ase 'O': case 'P
7530: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 51 27 3a  ':.    case 'Q':
7540: 20 63 61 73 65 20 27 52 27 3a 20 63 61 73 65 20   case 'R': case 
7550: 27 53 27 3a 20 63 61 73 65 20 27 54 27 3a 20 63  'S': case 'T': c
7560: 61 73 65 20 27 55 27 3a 20 63 61 73 65 20 27 56  ase 'U': case 'V
7570: 27 3a 20 63 61 73 65 20 27 57 27 3a 0a 20 20 20  ': case 'W':.   
7580: 20 63 61 73 65 20 27 58 27 3a 20 63 61 73 65 20   case 'X': case 
7590: 27 59 27 3a 20 63 61 73 65 20 27 5a 27 3a 20 63  'Y': case 'Z': c
75a0: 61 73 65 20 27 5f 27 3a 0a 20 20 20 20 20 20 77  ase '_':.      w
75b0: 68 69 6c 65 28 20 69 73 61 6c 6e 75 6d 28 7a 5b  hile( isalnum(z[
75c0: 69 5d 29 20 7c 7c 20 7a 5b 69 5d 3d 3d 27 5f 27  i]) || z[i]=='_'
75d0: 20 29 7b 20 69 2b 2b 3b 20 7d 3b 0a 20 20 20 20   ){ i++; };.    
75e0: 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20    pToken->eType 
75f0: 3d 20 54 54 5f 49 64 3b 0a 20 20 20 20 20 20 70  = TT_Id;.      p
7600: 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 69  Token->nText = i
7610: 20 2d 20 70 49 6e 2d 3e 69 3b 0a 20 20 20 20 20   - pIn->i;.     
7620: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
7630: 65 20 27 3a 27 3a 0a 20 20 20 20 20 20 70 54 6f  e ':':.      pTo
7640: 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f  ken->eType = TT_
7650: 4f 74 68 65 72 3b 0a 20 20 20 20 20 20 70 54 6f  Other;.      pTo
7660: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 31 20 2b  ken->nText = 1 +
7670: 20 28 7a 5b 69 2b 31 5d 3d 3d 27 3a 27 29 3b 0a   (z[i+1]==':');.
7680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
7690: 20 20 63 61 73 65 20 27 3d 27 3a 0a 20 20 20 20    case '=':.    
76a0: 63 61 73 65 20 27 3c 27 3a 0a 20 20 20 20 63 61  case '<':.    ca
76b0: 73 65 20 27 3e 27 3a 0a 20 20 20 20 63 61 73 65  se '>':.    case
76c0: 20 27 2b 27 3a 0a 20 20 20 20 63 61 73 65 20 27   '+':.    case '
76d0: 2d 27 3a 0a 20 20 20 20 63 61 73 65 20 27 2a 27  -':.    case '*'
76e0: 3a 0a 20 20 20 20 63 61 73 65 20 27 25 27 3a 0a  :.    case '%':.
76f0: 20 20 20 20 63 61 73 65 20 27 5e 27 3a 0a 20 20      case '^':.  
7700: 20 20 63 61 73 65 20 27 26 27 3a 0a 20 20 20 20    case '&':.    
7710: 63 61 73 65 20 27 7c 27 3a 0a 20 20 20 20 20 20  case '|':.      
7720: 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20  pToken->eType = 
7730: 54 54 5f 4f 74 68 65 72 3b 0a 20 20 20 20 20 20  TT_Other;.      
7740: 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20  pToken->nText = 
7750: 31 20 2b 20 28 7a 5b 69 2b 31 5d 3d 3d 27 3d 27  1 + (z[i+1]=='='
7760: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7770: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
7780: 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70      pToken->eTyp
7790: 65 20 3d 20 54 54 5f 4f 74 68 65 72 3b 0a 20 20  e = TT_Other;.  
77a0: 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78      pToken->nTex
77b0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  t = 1;.      bre
77c0: 61 6b 3b 0a 20 20 7d 0a 20 20 70 49 6e 2d 3e 69  ak;.  }.  pIn->i
77d0: 20 2b 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78   += pToken->nTex
77e0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72  t;.  return nErr
77f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
7800: 72 6f 75 74 69 6e 65 20 72 65 63 6f 76 65 72 73  routine recovers
7810: 20 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 20   the next token 
7820: 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 66  from the input f
7830: 69 6c 65 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ile which is.** 
7840: 6e 6f 74 20 61 20 73 70 61 63 65 20 6f 72 20 61  not a space or a
7850: 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 61 6e 79 20   comment or any 
7860: 74 65 78 74 20 62 65 74 77 65 65 6e 20 61 6e 20  text between an 
7870: 22 23 69 66 20 30 22 20 61 6e 64 20 22 23 65 6e  "#if 0" and "#en
7880: 64 69 66 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dif"..**.** This
7890: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
78a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
78b0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
78c0: 64 2e 20 20 41 6e 20 65 72 72 6f 72 0a 2a 2a 20  d.  An error.** 
78d0: 69 73 20 61 6e 20 75 6e 74 65 72 6d 69 6e 61 74  is an unterminat
78e0: 65 64 20 74 6f 6b 65 6e 20 6f 72 20 75 6e 6d 61  ed token or unma
78f0: 74 63 68 65 64 20 22 23 69 66 20 30 22 2e 0a 2a  tched "#if 0"..*
7900: 2a 0a 2a 2a 20 50 72 6f 66 69 6c 69 6e 67 20 73  *.** Profiling s
7910: 68 6f 77 73 20 74 68 61 74 20 74 68 69 73 20 72  hows that this r
7920: 6f 75 74 69 6e 65 20 75 73 65 73 20 61 62 6f 75  outine uses abou
7930: 74 20 61 20 71 75 61 72 74 65 72 20 6f 66 20 74  t a quarter of t
7940: 68 65 0a 2a 2a 20 43 50 55 20 74 69 6d 65 20 69  he.** CPU time i
7950: 6e 20 61 20 74 79 70 69 63 61 6c 20 72 75 6e 2e  n a typical run.
7960: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 47  .*/.static int G
7970: 65 74 4e 6f 6e 73 70 61 63 65 54 6f 6b 65 6e 28  etNonspaceToken(
7980: 49 6e 53 74 72 65 61 6d 20 2a 70 49 6e 2c 20 54  InStream *pIn, T
7990: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
79a0: 20 69 6e 74 20 6e 49 66 20 3d 20 30 3b 0a 20 20   int nIf = 0;.  
79b0: 69 6e 74 20 69 6e 5a 65 72 6f 20 3d 20 30 3b 0a  int inZero = 0;.
79c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
79d0: 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20  .  int value;.  
79e0: 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 3b 0a 20  int startLine;. 
79f0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a   int nErr = 0;..
7a00: 20 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 49    startLine = pI
7a10: 6e 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 77 68 69 6c  n->nLine;.  whil
7a20: 65 28 20 31 20 29 7b 0a 20 20 20 20 6e 45 72 72  e( 1 ){.    nErr
7a30: 20 2b 3d 20 47 65 74 54 6f 6b 65 6e 28 70 49 6e   += GetToken(pIn
7a40: 2c 70 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 2f 2a  ,pToken);.    /*
7a50: 20 70 72 69 6e 74 66 28 22 25 30 34 64 3a 20 54   printf("%04d: T
7a60: 79 70 65 3d 25 64 20 6e 49 66 3d 25 64 20 5b 25  ype=%d nIf=%d [%
7a70: 2e 2a 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  .*s]\n",.       
7a80: 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 70 54  pToken->nLine,pT
7a90: 6f 6b 65 6e 2d 3e 65 54 79 70 65 2c 6e 49 66 2c  oken->eType,nIf,
7aa0: 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 2c 0a 20  pToken->nText,. 
7ab0: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54        pToken->eT
7ac0: 79 70 65 21 3d 54 54 5f 53 70 61 63 65 20 3f 20  ype!=TT_Space ? 
7ad0: 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 20 3a 20  pToken->zText : 
7ae0: 22 3c 73 70 61 63 65 3e 22 29 3b 20 2a 2f 0a 20  "<space>"); */. 
7af0: 20 20 20 70 54 6f 6b 65 6e 2d 3e 70 43 6f 6d 6d     pToken->pComm
7b00: 65 6e 74 20 3d 20 62 6c 6f 63 6b 43 6f 6d 6d 65  ent = blockComme
7b10: 6e 74 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  nt;.    switch( 
7b20: 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 29 7b  pToken->eType ){
7b30: 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 43  .      case TT_C
7b40: 6f 6d 6d 65 6e 74 3a 20 20 20 20 20 20 20 20 20  omment:         
7b50: 20 2f 2a 30 31 32 33 34 35 36 37 38 39 20 31 32   /*0123456789 12
7b60: 33 34 35 36 37 38 20 2a 2f 0a 20 20 20 20 20 20  345678 */.      
7b70: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 70 54 6f   if( strncmp(pTo
7b80: 6b 65 6e 2d 3e 7a 54 65 78 74 2c 20 22 2f 2a 4d  ken->zText, "/*M
7b90: 41 4b 45 48 45 41 44 45 52 53 2d 53 54 4f 50 22  AKEHEADERS-STOP"
7ba0: 2c 20 31 38 29 3d 3d 30 20 29 20 72 65 74 75 72  , 18)==0 ) retur
7bb0: 6e 20 6e 45 72 72 3b 0a 20 20 20 20 20 20 20 62  n nErr;.       b
7bc0: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
7bd0: 65 20 54 54 5f 53 70 61 63 65 3a 0a 20 20 20 20  e TT_Space:.    
7be0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
7bf0: 20 20 63 61 73 65 20 54 54 5f 42 6c 6f 63 6b 43    case TT_BlockC
7c00: 6f 6d 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20  omment:.        
7c10: 69 66 28 20 64 6f 63 5f 66 6c 61 67 20 29 7b 0a  if( doc_flag ){.
7c20: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 63 6b 43            blockC
7c30: 6f 6d 6d 65 6e 74 20 3d 20 53 61 66 65 4d 61 6c  omment = SafeMal
7c40: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 6f 6b 65  loc( sizeof(Toke
7c50: 6e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n) );.          
7c60: 2a 62 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20  *blockComment = 
7c70: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  *pToken;.       
7c80: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
7c90: 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 54 54  ;..      case TT
7ca0: 5f 45 4f 46 3a 0a 20 20 20 20 20 20 20 20 69 66  _EOF:.        if
7cb0: 28 20 6e 49 66 20 29 7b 0a 20 20 20 20 20 20 20  ( nIf ){.       
7cc0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
7cd0: 72 2c 22 25 73 3a 25 64 3a 20 55 6e 74 65 72 6d  r,"%s:%d: Unterm
7ce0: 69 6e 61 74 65 64 20 5c 22 23 69 66 5c 22 5c 6e  inated \"#if\"\n
7cf0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
7d00: 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 74 61 72 74  zFilename, start
7d10: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Line);.         
7d20: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
7d30: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
7d40: 6e 20 6e 45 72 72 3b 0a 0a 20 20 20 20 20 20 63  n nErr;..      c
7d50: 61 73 65 20 54 54 5f 50 72 65 70 72 6f 63 65 73  ase TT_Preproces
7d60: 73 6f 72 3a 0a 20 20 20 20 20 20 20 20 7a 20 3d  sor:.        z =
7d70: 20 26 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 5b   &pToken->zText[
7d80: 31 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  1];.        whil
7d90: 65 28 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a  e( *z==' ' || *z
7da0: 3d 3d 27 5c 74 27 20 29 20 7a 2b 2b 3b 0a 20 20  =='\t' ) z++;.  
7db0: 20 20 20 20 20 20 69 66 28 20 73 73 63 61 6e 66        if( sscanf
7dc0: 28 7a 2c 22 69 66 20 25 64 22 2c 26 76 61 6c 75  (z,"if %d",&valu
7dd0: 65 29 3d 3d 31 20 26 26 20 76 61 6c 75 65 3d 3d  e)==1 && value==
7de0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  0 ){.          n
7df0: 49 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  If++;.          
7e00: 69 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20  inZero = 1;.    
7e10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 6e      }else if( in
7e20: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Zero ){.        
7e30: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c    if( strncmp(z,
7e40: 22 69 66 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "if",2)==0 ){.  
7e50: 20 20 20 20 20 20 20 20 20 20 6e 49 66 2b 2b 3b            nIf++;
7e60: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
7e70: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c 22   if( strncmp(z,"
7e80: 65 6e 64 69 66 22 2c 35 29 3d 3d 30 20 29 7b 0a  endif",5)==0 ){.
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 6e 49 66 2d              nIf-
7ea0: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  -;.            i
7eb0: 66 28 20 6e 49 66 3d 3d 30 20 29 20 69 6e 5a 65  f( nIf==0 ) inZe
7ec0: 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
7ed0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
7ee0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  e{.          ret
7ef0: 75 72 6e 20 6e 45 72 72 3b 0a 20 20 20 20 20 20  urn nErr;.      
7f00: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
7f10: 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c  k;..      defaul
7f20: 74 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  t:.        if( !
7f30: 69 6e 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  inZero ){.      
7f40: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b      return nErr;
7f50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7f60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7f70: 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41    }.  /* NOT REA
7f80: 43 48 45 44 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  CHED */.}../*.**
7f90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   This routine lo
7fa0: 6f 6b 73 20 66 6f 72 20 69 64 65 6e 74 69 66 69  oks for identifi
7fb0: 65 72 73 20 28 73 74 72 69 6e 67 73 20 6f 66 20  ers (strings of 
7fc0: 63 6f 6e 74 69 67 75 6f 75 73 20 61 6c 70 68 61  contiguous alpha
7fd0: 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61  numeric.** chara
7fe0: 63 74 65 72 73 29 20 77 69 74 68 69 6e 20 61 20  cters) within a 
7ff0: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 64 69 72  preprocessor dir
8000: 65 63 74 69 76 65 20 61 6e 64 20 61 64 64 73 20  ective and adds 
8010: 65 76 65 72 79 20 73 75 63 68 20 73 74 72 69 6e  every such strin
8020: 67 0a 2a 2a 20 66 6f 75 6e 64 20 74 6f 20 74 68  g.** found to th
8030: 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69  e given identifi
8040: 65 72 20 74 61 62 6c 65 0a 2a 2f 0a 73 74 61 74  er table.*/.stat
8050: 69 63 20 76 6f 69 64 20 46 69 6e 64 49 64 65 6e  ic void FindIden
8060: 74 69 66 69 65 72 73 49 6e 4d 61 63 72 6f 28 54  tifiersInMacro(T
8070: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 49 64  oken *pToken, Id
8080: 65 6e 74 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  entTable *pTable
8090: 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 54 6f 6b 65  ){.  Token sToke
80a0: 6e 3b 0a 20 20 49 6e 53 74 72 65 61 6d 20 73 49  n;.  InStream sI
80b0: 6e 3b 0a 20 20 69 6e 74 20 67 6f 20 3d 20 31 3b  n;.  int go = 1;
80c0: 0a 0a 20 20 73 49 6e 2e 7a 20 3d 20 70 54 6f 6b  ..  sIn.z = pTok
80d0: 65 6e 2d 3e 7a 54 65 78 74 3b 0a 20 20 73 49 6e  en->zText;.  sIn
80e0: 2e 69 20 3d 20 31 3b 0a 20 20 73 49 6e 2e 6e 4c  .i = 1;.  sIn.nL
80f0: 69 6e 65 20 3d 20 31 3b 0a 20 20 77 68 69 6c 65  ine = 1;.  while
8100: 28 20 67 6f 20 26 26 20 73 49 6e 2e 69 20 3c 20  ( go && sIn.i < 
8110: 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 29 7b  pToken->nText ){
8120: 0a 20 20 20 20 47 65 74 54 6f 6b 65 6e 28 26 73  .    GetToken(&s
8130: 49 6e 2c 26 73 54 6f 6b 65 6e 29 3b 0a 20 20 20  In,&sToken);.   
8140: 20 73 77 69 74 63 68 28 20 73 54 6f 6b 65 6e 2e   switch( sToken.
8150: 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  eType ){.      c
8160: 61 73 65 20 54 54 5f 49 64 3a 0a 20 20 20 20 20  ase TT_Id:.     
8170: 20 20 20 49 64 65 6e 74 54 61 62 6c 65 49 6e 73     IdentTableIns
8180: 65 72 74 28 70 54 61 62 6c 65 2c 73 54 6f 6b 65  ert(pTable,sToke
8190: 6e 2e 7a 54 65 78 74 2c 73 54 6f 6b 65 6e 2e 6e  n.zText,sToken.n
81a0: 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Text);.        b
81b0: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
81c0: 65 20 54 54 5f 45 4f 46 3a 0a 20 20 20 20 20 20  e TT_EOF:.      
81d0: 20 20 67 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20    go = 0;.      
81e0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
81f0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
8200: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8210: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
8220: 72 6f 75 74 69 6e 65 20 67 65 74 73 20 74 68 65  routine gets the
8230: 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 20 20 45 76   next token.  Ev
8240: 65 72 79 74 68 69 6e 67 20 63 6f 6e 74 61 69 6e  erything contain
8250: 65 64 20 77 69 74 68 69 6e 0a 2a 2a 20 7b 2e 2e  ed within.** {..
8260: 2e 7d 20 69 73 20 63 6f 6c 6c 61 70 73 65 64 20  .} is collapsed 
8270: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 54 54  into a single TT
8280: 5f 42 72 61 63 65 73 20 74 6f 6b 65 6e 2e 20 20  _Braces token.  
8290: 57 68 69 74 65 73 70 61 63 65 20 69 73 0a 2a 2a  Whitespace is.**
82a0: 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   omitted..**.** 
82b0: 49 66 20 70 54 61 62 6c 65 20 69 73 20 6e 6f 74  If pTable is not
82c0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e 73 65   NULL, then inse
82d0: 72 74 20 65 76 65 72 79 20 69 64 65 6e 74 69 66  rt every identif
82e0: 69 65 72 20 73 65 65 6e 20 69 6e 74 6f 20 74 68  ier seen into th
82f0: 65 0a 2a 2a 20 49 64 65 6e 74 54 61 62 6c 65 2e  e.** IdentTable.
8300: 20 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20    This includes 
8310: 61 6e 79 20 69 64 65 6e 74 69 66 69 65 72 73 20  any identifiers 
8320: 73 65 65 6e 20 69 6e 73 69 64 65 20 6f 66 20 7b  seen inside of {
8330: 2e 2e 2e 7d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ...}..**.** The 
8340: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
8350: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 73 20   encountered is 
8360: 72 65 74 75 72 6e 65 64 2e 20 20 41 6e 20 65 72  returned.  An er
8370: 72 6f 72 20 69 73 20 61 6e 0a 2a 2a 20 75 6e 74  ror is an.** unt
8380: 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 2e  erminated token.
8390: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 47  .*/.static int G
83a0: 65 74 42 69 67 54 6f 6b 65 6e 28 49 6e 53 74 72  etBigToken(InStr
83b0: 65 61 6d 20 2a 70 49 6e 2c 20 54 6f 6b 65 6e 20  eam *pIn, Token 
83c0: 2a 70 54 6f 6b 65 6e 2c 20 49 64 65 6e 74 54 61  *pToken, IdentTa
83d0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
83e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
83f0: 72 74 3b 0a 20 20 69 6e 74 20 69 53 74 61 72 74  rt;.  int iStart
8400: 3b 0a 20 20 69 6e 74 20 6e 42 72 61 63 65 3b 0a  ;.  int nBrace;.
8410: 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e    int c;.  int n
8420: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 45 72 72  Line;.  int nErr
8430: 3b 0a 0a 20 20 6e 45 72 72 20 3d 20 47 65 74 4e  ;..  nErr = GetN
8440: 6f 6e 73 70 61 63 65 54 6f 6b 65 6e 28 70 49 6e  onspaceToken(pIn
8450: 2c 70 54 6f 6b 65 6e 29 3b 0a 20 20 73 77 69 74  ,pToken);.  swit
8460: 63 68 28 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70  ch( pToken->eTyp
8470: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 54  e ){.    case TT
8480: 5f 49 64 3a 0a 20 20 20 20 20 20 69 66 28 20 70  _Id:.      if( p
8490: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
84a0: 20 20 20 20 49 64 65 6e 74 54 61 62 6c 65 49 6e      IdentTableIn
84b0: 73 65 72 74 28 70 54 61 62 6c 65 2c 70 54 6f 6b  sert(pTable,pTok
84c0: 65 6e 2d 3e 7a 54 65 78 74 2c 70 54 6f 6b 65 6e  en->zText,pToken
84d0: 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20  ->nText);.      
84e0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  }.      return n
84f0: 45 72 72 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  Err;..    case T
8500: 54 5f 50 72 65 70 72 6f 63 65 73 73 6f 72 3a 0a  T_Preprocessor:.
8510: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 6c 65        if( pTable
8520: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 46  !=0 ){.        F
8530: 69 6e 64 49 64 65 6e 74 69 66 69 65 72 73 49 6e  indIdentifiersIn
8540: 4d 61 63 72 6f 28 70 54 6f 6b 65 6e 2c 70 54 61  Macro(pToken,pTa
8550: 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ble);.      }.  
8560: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b      return nErr;
8570: 0a 0a 20 20 20 20 63 61 73 65 20 54 54 5f 4f 74  ..    case TT_Ot
8580: 68 65 72 3a 0a 20 20 20 20 20 20 69 66 28 20 70  her:.      if( p
8590: 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 5b 30 5d 3d  Token->zText[0]=
85a0: 3d 27 7b 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='{' ) break;.  
85b0: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b      return nErr;
85c0: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
85d0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72       return nErr
85e0: 3b 0a 20 20 7d 0a 0a 20 20 69 53 74 61 72 74 20  ;.  }..  iStart 
85f0: 3d 20 70 49 6e 2d 3e 69 3b 0a 20 20 7a 53 74 61  = pIn->i;.  zSta
8600: 72 74 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 54 65  rt = pToken->zTe
8610: 78 74 3b 0a 20 20 6e 4c 69 6e 65 20 3d 20 70 54  xt;.  nLine = pT
8620: 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 6e  oken->nLine;.  n
8630: 42 72 61 63 65 20 3d 20 31 3b 0a 20 20 77 68 69  Brace = 1;.  whi
8640: 6c 65 28 20 6e 42 72 61 63 65 20 29 7b 0a 20 20  le( nBrace ){.  
8650: 20 20 6e 45 72 72 20 2b 3d 20 47 65 74 4e 6f 6e    nErr += GetNon
8660: 73 70 61 63 65 54 6f 6b 65 6e 28 70 49 6e 2c 70  spaceToken(pIn,p
8670: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 2f 2a 20 70  Token);.    /* p
8680: 72 69 6e 74 66 28 22 25 30 34 64 3a 20 6e 42 72  rintf("%04d: nBr
8690: 61 63 65 3d 25 64 20 5b 25 2e 2a 73 5d 5c 6e 22  ace=%d [%.*s]\n"
86a0: 2c 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 6e  ,pToken->nLine,n
86b0: 42 72 61 63 65 2c 0a 20 20 20 20 20 20 20 70 54  Brace,.       pT
86c0: 6f 6b 65 6e 2d 3e 6e 54 65 78 74 2c 70 54 6f 6b  oken->nText,pTok
86d0: 65 6e 2d 3e 7a 54 65 78 74 29 3b 20 2a 2f 0a 20  en->zText); */. 
86e0: 20 20 20 73 77 69 74 63 68 28 20 70 54 6f 6b 65     switch( pToke
86f0: 6e 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20  n->eType ){.    
8700: 20 20 63 61 73 65 20 54 54 5f 45 4f 46 3a 0a 20    case TT_EOF:. 
8710: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
8720: 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 55 6e  tderr,"%s:%d: Un
8730: 74 65 72 6d 69 6e 61 74 65 64 20 5c 22 7b 5c 22  terminated \"{\"
8740: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
8750: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 4c 69 6e 65  zFilename, nLine
8760: 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  );.        nErr+
8770: 2b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65  +;.        pToke
8780: 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f 45 72  n->eType = TT_Er
8790: 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ror;.        ret
87a0: 75 72 6e 20 6e 45 72 72 3b 0a 0a 20 20 20 20 20  urn nErr;..     
87b0: 20 63 61 73 65 20 54 54 5f 49 64 3a 0a 20 20 20   case TT_Id:.   
87c0: 20 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20       if( pTable 
87d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 64 65  ){.          Ide
87e0: 6e 74 54 61 62 6c 65 49 6e 73 65 72 74 28 70 54  ntTableInsert(pT
87f0: 61 62 6c 65 2c 70 54 6f 6b 65 6e 2d 3e 7a 54 65  able,pToken->zTe
8800: 78 74 2c 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74  xt,pToken->nText
8810: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
8820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
8830: 20 20 20 63 61 73 65 20 54 54 5f 50 72 65 70 72     case TT_Prepr
8840: 6f 63 65 73 73 6f 72 3a 0a 20 20 20 20 20 20 20  ocessor:.       
8850: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29   if( pTable!=0 )
8860: 7b 0a 20 20 20 20 20 20 20 20 20 20 46 69 6e 64  {.          Find
8870: 49 64 65 6e 74 69 66 69 65 72 73 49 6e 4d 61 63  IdentifiersInMac
8880: 72 6f 28 70 54 6f 6b 65 6e 2c 70 54 61 62 6c 65  ro(pToken,pTable
8890: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
88a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
88b0: 20 20 20 63 61 73 65 20 54 54 5f 4f 74 68 65 72     case TT_Other
88c0: 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63  :.        if( (c
88d0: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74   = pToken->zText
88e0: 5b 30 5d 29 3d 3d 27 7b 27 20 29 7b 0a 20 20 20  [0])=='{' ){.   
88f0: 20 20 20 20 20 20 20 6e 42 72 61 63 65 2b 2b 3b         nBrace++;
8900: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
8910: 66 28 20 63 3d 3d 27 7d 27 20 29 7b 0a 20 20 20  f( c=='}' ){.   
8920: 20 20 20 20 20 20 20 6e 42 72 61 63 65 2d 2d 3b         nBrace--;
8930: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8940: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
8950: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
8960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8970: 20 7d 0a 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79   }.  pToken->eTy
8980: 70 65 20 3d 20 54 54 5f 42 72 61 63 65 73 3b 0a  pe = TT_Braces;.
8990: 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20    pToken->nText 
89a0: 3d 20 31 20 2b 20 70 49 6e 2d 3e 69 20 2d 20 69  = 1 + pIn->i - i
89b0: 53 74 61 72 74 3b 0a 20 20 70 54 6f 6b 65 6e 2d  Start;.  pToken-
89c0: 3e 7a 54 65 78 74 20 3d 20 7a 53 74 61 72 74 3b  >zText = zStart;
89d0: 0a 20 20 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65  .  pToken->nLine
89e0: 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 72 65 74 75   = nLine;.  retu
89f0: 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nErr;.}../*.*
8a00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66  * This routine f
8a10: 72 65 65 73 20 75 70 20 61 20 6c 69 73 74 20 6f  rees up a list o
8a20: 66 20 54 6f 6b 65 6e 73 2e 20 20 54 68 65 20 70  f Tokens.  The p
8a30: 43 6f 6d 6d 65 6e 74 20 74 6f 6b 65 6e 73 20 61  Comment tokens a
8a40: 72 65 0a 2a 2a 20 6e 6f 74 20 63 6c 65 61 72 65  re.** not cleare
8a50: 64 20 62 79 20 74 68 69 73 2e 20 20 53 6f 20 77  d by this.  So w
8a60: 65 20 6c 65 61 6b 20 61 20 6c 69 74 74 6c 65 20  e leak a little 
8a70: 6d 65 6d 6f 72 79 20 77 68 65 6e 20 75 73 69 6e  memory when usin
8a80: 67 20 74 68 65 20 2d 64 6f 63 0a 2a 2a 20 6f 70  g the -doc.** op
8a90: 74 69 6f 6e 2e 20 20 53 6f 20 77 68 61 74 2e 0a  tion.  So what..
8aa0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 46  */.static void F
8ab0: 72 65 65 54 6f 6b 65 6e 4c 69 73 74 28 54 6f 6b  reeTokenList(Tok
8ac0: 65 6e 20 2a 70 4c 69 73 74 29 7b 0a 20 20 54 6f  en *pList){.  To
8ad0: 6b 65 6e 20 2a 70 4e 65 78 74 3b 0a 20 20 77 68  ken *pNext;.  wh
8ae0: 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20  ile( pList ){.  
8af0: 20 20 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d    pNext = pList-
8b00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 53 61 66 65  >pNext;.    Safe
8b10: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  Free(pList);.   
8b20: 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a   pList = pNext;.
8b30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b    }.}../*.** Tok
8b40: 65 6e 69 7a 65 20 61 6e 20 65 6e 74 69 72 65 20  enize an entire 
8b50: 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 61 20  file.  Return a 
8b60: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  pointer to the l
8b70: 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73 2e 0a 2a  ist of tokens..*
8b80: 2a 0a 2a 2a 20 53 70 61 63 65 20 66 6f 72 20 65  *.** Space for e
8b90: 61 63 68 20 74 6f 6b 65 6e 20 69 73 20 6f 62 74  ach token is obt
8ba0: 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 73 65 70  ained from a sep
8bb0: 61 72 61 74 65 20 6d 61 6c 6c 6f 63 28 29 20 63  arate malloc() c
8bc0: 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c  all.  The.** cal
8bd0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ling function is
8be0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
8bf0: 20 66 72 65 65 69 6e 67 20 74 68 69 73 20 73 70   freeing this sp
8c00: 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54  ace..**.** If pT
8c10: 61 62 6c 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  able is not NULL
8c20: 2c 20 74 68 65 6e 20 66 69 6c 6c 20 74 68 65 20  , then fill the 
8c30: 74 61 62 6c 65 20 77 69 74 68 20 61 6c 6c 20 69  table with all i
8c40: 64 65 6e 74 69 66 69 65 72 73 20 73 65 65 6e 20  dentifiers seen 
8c50: 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 70 75 74 20  in.** the input 
8c60: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
8c70: 54 6f 6b 65 6e 20 2a 54 6f 6b 65 6e 69 7a 65 46  Token *TokenizeF
8c80: 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ile(const char *
8c90: 7a 46 69 6c 65 2c 20 49 64 65 6e 74 54 61 62 6c  zFile, IdentTabl
8ca0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
8cb0: 53 74 72 65 61 6d 20 73 49 6e 3b 0a 20 20 54 6f  Stream sIn;.  To
8cc0: 6b 65 6e 20 2a 70 46 69 72 73 74 20 3d 20 30 2c  ken *pFirst = 0,
8cd0: 20 2a 70 4c 61 73 74 20 3d 20 30 2c 20 2a 70 4e   *pLast = 0, *pN
8ce0: 65 77 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  ew;.  int nErr =
8cf0: 20 30 3b 0a 0a 20 20 73 49 6e 2e 7a 20 3d 20 7a   0;..  sIn.z = z
8d00: 46 69 6c 65 3b 0a 20 20 73 49 6e 2e 69 20 3d 20  File;.  sIn.i = 
8d10: 30 3b 0a 20 20 73 49 6e 2e 6e 4c 69 6e 65 20 3d  0;.  sIn.nLine =
8d20: 20 31 3b 0a 20 20 62 6c 6f 63 6b 43 6f 6d 6d 65   1;.  blockComme
8d30: 6e 74 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  nt = 0;..  while
8d40: 28 20 73 49 6e 2e 7a 5b 73 49 6e 2e 69 5d 21 3d  ( sIn.z[sIn.i]!=
8d50: 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 ){.    pNew = 
8d60: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  SafeMalloc( size
8d70: 6f 66 28 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20  of(Token) );.   
8d80: 20 6e 45 72 72 20 2b 3d 20 47 65 74 42 69 67 54   nErr += GetBigT
8d90: 6f 6b 65 6e 28 26 73 49 6e 2c 70 4e 65 77 2c 70  oken(&sIn,pNew,p
8da0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 64 65 62 75  Table);.    debu
8db0: 67 33 28 54 4f 4b 45 4e 49 5a 45 52 2c 20 22 54  g3(TOKENIZER, "T
8dc0: 6f 6b 65 6e 20 6f 6e 20 6c 69 6e 65 20 25 64 3a  oken on line %d:
8dd0: 20 5b 25 2e 2a 73 5d 5c 6e 22 2c 0a 20 20 20 20   [%.*s]\n",.    
8de0: 20 20 20 70 4e 65 77 2d 3e 6e 4c 69 6e 65 2c 20     pNew->nLine, 
8df0: 70 4e 65 77 2d 3e 6e 54 65 78 74 3c 35 30 20 3f  pNew->nText<50 ?
8e00: 20 70 4e 65 77 2d 3e 6e 54 65 78 74 20 3a 20 35   pNew->nText : 5
8e10: 30 2c 20 70 4e 65 77 2d 3e 7a 54 65 78 74 29 3b  0, pNew->zText);
8e20: 0a 20 20 20 20 69 66 28 20 70 46 69 72 73 74 3d  .    if( pFirst=
8e30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 72  =0 ){.      pFir
8e40: 73 74 20 3d 20 70 4c 61 73 74 20 3d 20 70 4e 65  st = pLast = pNe
8e50: 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  w;.      pNew->p
8e60: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Prev = 0;.    }e
8e70: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 61 73 74  lse{.      pLast
8e80: 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
8e90: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 65        pNew->pPre
8ea0: 76 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 20  v = pLast;.     
8eb0: 20 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pLast = pNew;. 
8ec0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4e 65     }.    if( pNe
8ed0: 77 2d 3e 65 54 79 70 65 3d 3d 54 54 5f 45 4f 46  w->eType==TT_EOF
8ee0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
8ef0: 69 66 28 20 70 4c 61 73 74 20 29 20 70 4c 61 73  if( pLast ) pLas
8f00: 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  t->pNext = 0;.  
8f10: 62 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20 30  blockComment = 0
8f20: 3b 0a 20 20 69 66 28 20 6e 45 72 72 20 29 7b 0a  ;.  if( nErr ){.
8f30: 20 20 20 20 46 72 65 65 54 6f 6b 65 6e 4c 69 73      FreeTokenLis
8f40: 74 28 70 46 69 72 73 74 29 3b 0a 20 20 20 20 70  t(pFirst);.    p
8f50: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  First = 0;.  }..
8f60: 20 20 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b    return pFirst;
8f70: 0a 7d 0a 0a 23 69 66 20 54 45 53 54 3d 3d 31 0a  .}..#if TEST==1.
8f80: 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6f  /*.** Use the fo
8f90: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
8fa0: 74 6f 20 74 65 73 74 20 6f 72 20 64 65 62 75 67  to test or debug
8fb0: 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a   the tokenizer..
8fc0: 2a 2f 0a 76 6f 69 64 20 6d 61 69 6e 28 69 6e 74  */.void main(int
8fd0: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
8fe0: 67 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  gv){.  char *zFi
8ff0: 6c 65 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4c 69  le;.  Token *pLi
9000: 73 74 2c 20 2a 70 3b 0a 20 20 49 64 65 6e 74 54  st, *p;.  IdentT
9010: 61 62 6c 65 20 73 54 61 62 6c 65 3b 0a 0a 20 20  able sTable;..  
9020: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
9030: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
9040: 72 2c 22 55 73 61 67 65 3a 20 25 73 20 66 69 6c  r,"Usage: %s fil
9050: 65 6e 61 6d 65 5c 6e 22 2c 2a 61 72 67 76 29 3b  ename\n",*argv);
9060: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
9070: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 73 54 61 62  }.  memset(&sTab
9080: 6c 65 2c 30 2c 73 69 7a 65 6f 66 28 73 54 61 62  le,0,sizeof(sTab
9090: 6c 65 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20  le));.  zFile = 
90a0: 52 65 61 64 46 69 6c 65 28 61 72 67 76 5b 31 5d  ReadFile(argv[1]
90b0: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d  );.  if( zFile==
90c0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
90d0: 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 72  (stderr,"Can't r
90e0: 65 61 64 20 66 69 6c 65 20 5c 22 25 73 5c 22 5c  ead file \"%s\"\
90f0: 6e 22 2c 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  n",argv[1]);.   
9100: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
9110: 70 4c 69 73 74 20 3d 20 54 6f 6b 65 6e 69 7a 65  pList = Tokenize
9120: 46 69 6c 65 28 7a 46 69 6c 65 2c 26 73 54 61 62  File(zFile,&sTab
9130: 6c 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69  le);.  for(p=pLi
9140: 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  st; p; p=p->pNex
9150: 74 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20  t){.    int j;. 
9160: 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 54     switch( p->eT
9170: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
9180: 65 20 54 54 5f 53 70 61 63 65 3a 0a 20 20 20 20  e TT_Space:.    
9190: 20 20 20 20 70 72 69 6e 74 66 28 22 25 34 64 3a      printf("%4d:
91a0: 20 53 70 61 63 65 5c 6e 22 2c 70 2d 3e 6e 4c 69   Space\n",p->nLi
91b0: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ne);.        bre
91c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 54  ak;.      case T
91d0: 54 5f 49 64 3a 0a 20 20 20 20 20 20 20 20 70 72  T_Id:.        pr
91e0: 69 6e 74 66 28 22 25 34 64 3a 20 49 64 20 20 20  intf("%4d: Id   
91f0: 20 20 20 20 20 20 20 20 25 2e 2a 73 5c 6e 22 2c          %.*s\n",
9200: 70 2d 3e 6e 4c 69 6e 65 2c 70 2d 3e 6e 54 65 78  p->nLine,p->nTex
9210: 74 2c 70 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20  t,p->zText);.   
9220: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9230: 20 20 63 61 73 65 20 54 54 5f 50 72 65 70 72 6f    case TT_Prepro
9240: 63 65 73 73 6f 72 3a 0a 20 20 20 20 20 20 20 20  cessor:.        
9250: 70 72 69 6e 74 66 28 22 25 34 64 3a 20 50 72 65  printf("%4d: Pre
9260: 70 72 6f 63 65 73 73 6f 72 20 25 2e 2a 73 5c 6e  processor %.*s\n
9270: 22 2c 70 2d 3e 6e 4c 69 6e 65 2c 70 2d 3e 6e 54  ",p->nLine,p->nT
9280: 65 78 74 2c 70 2d 3e 7a 54 65 78 74 29 3b 0a 20  ext,p->zText);. 
9290: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
92a0: 20 20 20 20 63 61 73 65 20 54 54 5f 43 6f 6d 6d      case TT_Comm
92b0: 65 6e 74 3a 0a 20 20 20 20 20 20 20 20 70 72 69  ent:.        pri
92c0: 6e 74 66 28 22 25 34 64 3a 20 43 6f 6d 6d 65 6e  ntf("%4d: Commen
92d0: 74 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 29 3b 0a  t\n",p->nLine);.
92e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
92f0: 20 20 20 20 20 63 61 73 65 20 54 54 5f 42 6c 6f       case TT_Blo
9300: 63 6b 43 6f 6d 6d 65 6e 74 3a 0a 20 20 20 20 20  ckComment:.     
9310: 20 20 20 70 72 69 6e 74 66 28 22 25 34 64 3a 20     printf("%4d: 
9320: 42 6c 6f 63 6b 20 43 6f 6d 6d 65 6e 74 5c 6e 22  Block Comment\n"
9330: 2c 70 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  ,p->nLine);.    
9340: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9350: 20 63 61 73 65 20 54 54 5f 4e 75 6d 62 65 72 3a   case TT_Number:
9360: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
9370: 22 25 34 64 3a 20 4e 75 6d 62 65 72 20 20 20 20  "%4d: Number    
9380: 20 20 20 25 2e 2a 73 5c 6e 22 2c 70 2d 3e 6e 4c     %.*s\n",p->nL
9390: 69 6e 65 2c 70 2d 3e 6e 54 65 78 74 2c 70 2d 3e  ine,p->nText,p->
93a0: 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  zText);.        
93b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
93c0: 65 20 54 54 5f 53 74 72 69 6e 67 3a 0a 20 20 20  e TT_String:.   
93d0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 34 64       printf("%4d
93e0: 3a 20 53 74 72 69 6e 67 20 20 20 20 20 20 20 25  : String       %
93f0: 2e 2a 73 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 2c  .*s\n",p->nLine,
9400: 70 2d 3e 6e 54 65 78 74 2c 70 2d 3e 7a 54 65 78  p->nText,p->zTex
9410: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
9420: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 54 54  k;.      case TT
9430: 5f 4f 74 68 65 72 3a 0a 20 20 20 20 20 20 20 20  _Other:.        
9440: 70 72 69 6e 74 66 28 22 25 34 64 3a 20 4f 74 68  printf("%4d: Oth
9450: 65 72 20 20 20 20 20 20 20 20 25 2e 2a 73 5c 6e  er        %.*s\n
9460: 22 2c 70 2d 3e 6e 4c 69 6e 65 2c 70 2d 3e 6e 54  ",p->nLine,p->nT
9470: 65 78 74 2c 70 2d 3e 7a 54 65 78 74 29 3b 0a 20  ext,p->zText);. 
9480: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9490: 20 20 20 20 63 61 73 65 20 54 54 5f 42 72 61 63      case TT_Brac
94a0: 65 73 3a 0a 20 20 20 20 20 20 20 20 66 6f 72 28  es:.        for(
94b0: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 54 65 78 74 20  j=0; j<p->nText 
94c0: 26 26 20 6a 3c 33 30 20 26 26 20 70 2d 3e 7a 54  && j<30 && p->zT
94d0: 65 78 74 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b  ext[j]!='\n'; j+
94e0: 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 70 72 69  +){}.        pri
94f0: 6e 74 66 28 22 25 34 64 3a 20 42 72 61 63 65 73  ntf("%4d: Braces
9500: 20 20 20 20 20 20 20 25 2e 2a 73 2e 2e 2e 7d 5c         %.*s...}\
9510: 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 2c 6a 2c 70 2d  n",p->nLine,j,p-
9520: 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20  >zText);.       
9530: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9540: 73 65 20 54 54 5f 45 4f 46 3a 0a 20 20 20 20 20  se TT_EOF:.     
9550: 20 20 20 70 72 69 6e 74 66 28 22 25 34 64 3a 20     printf("%4d: 
9560: 45 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 70  End of file\n",p
9570: 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  ->nLine);.      
9580: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64    break;.      d
9590: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
95a0: 70 72 69 6e 74 66 28 22 25 34 64 3a 20 74 79 70  printf("%4d: typ
95b0: 65 20 25 64 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65  e %d\n",p->nLine
95c0: 2c 70 2d 3e 65 54 79 70 65 29 3b 0a 20 20 20 20  ,p->eType);.    
95d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
95e0: 0a 20 20 7d 0a 20 20 46 72 65 65 54 6f 6b 65 6e  .  }.  FreeToken
95f0: 4c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 53  List(pList);.  S
9600: 61 66 65 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a  afeFree(zFile);.
9610: 20 20 49 64 65 6e 74 54 61 62 6c 65 50 72 69 6e    IdentTablePrin
9620: 74 28 26 73 54 61 62 6c 65 2c 73 74 64 6f 75 74  t(&sTable,stdout
9630: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
9640: 64 65 66 20 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  def DEBUG./*.** 
9650: 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75  For debugging pu
9660: 72 70 6f 73 65 73 2c 20 77 72 69 74 65 20 6f 75  rposes, write ou
9670: 74 20 61 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65  t a list of toke
9680: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
9690: 69 64 20 50 72 69 6e 74 54 6f 6b 65 6e 73 28 54  id PrintTokens(T
96a0: 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f  oken *pFirst, To
96b0: 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 69  ken *pLast){.  i
96c0: 6e 74 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30  nt needSpace = 0
96d0: 3b 0a 20 20 69 6e 74 20 63 3b 0a 0a 20 20 70 4c  ;.  int c;..  pL
96e0: 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70 4e 65  ast = pLast->pNe
96f0: 78 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 46 69  xt;.  while( pFi
9700: 72 73 74 21 3d 70 4c 61 73 74 20 29 7b 0a 20 20  rst!=pLast ){.  
9710: 20 20 73 77 69 74 63 68 28 20 70 46 69 72 73 74    switch( pFirst
9720: 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20  ->eType ){.     
9730: 20 63 61 73 65 20 54 54 5f 50 72 65 70 72 6f 63   case TT_Preproc
9740: 65 73 73 6f 72 3a 0a 20 20 20 20 20 20 20 20 70  essor:.        p
9750: 72 69 6e 74 66 28 22 5c 6e 25 2e 2a 73 5c 6e 22  rintf("\n%.*s\n"
9760: 2c 70 46 69 72 73 74 2d 3e 6e 54 65 78 74 2c 70  ,pFirst->nText,p
9770: 46 69 72 73 74 2d 3e 7a 54 65 78 74 29 3b 0a 20  First->zText);. 
9780: 20 20 20 20 20 20 20 6e 65 65 64 53 70 61 63 65         needSpace
9790: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
97a0: 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
97b0: 20 54 54 5f 49 64 3a 0a 20 20 20 20 20 20 63 61   TT_Id:.      ca
97c0: 73 65 20 54 54 5f 4e 75 6d 62 65 72 3a 0a 20 20  se TT_Number:.  
97d0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73        printf("%s
97e0: 25 2e 2a 73 22 2c 20 6e 65 65 64 53 70 61 63 65  %.*s", needSpace
97f0: 20 3f 20 22 20 22 20 3a 20 22 22 2c 20 70 46 69   ? " " : "", pFi
9800: 72 73 74 2d 3e 6e 54 65 78 74 2c 20 70 46 69 72  rst->nText, pFir
9810: 73 74 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20  st->zText);.    
9820: 20 20 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20      needSpace = 
9830: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
9840: 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  ;..      default
9850: 3a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 70 46  :.        c = pF
9860: 69 72 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 3b 0a  irst->zText[0];.
9870: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
9880: 25 73 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  %s%.*s",.       
9890: 20 20 20 28 6e 65 65 64 53 70 61 63 65 20 26 26     (needSpace &&
98a0: 20 28 63 3d 3d 27 2a 27 20 7c 7c 20 63 3d 3d 27   (c=='*' || c=='
98b0: 7b 27 29 29 20 3f 20 22 20 22 20 3a 20 22 22 2c  {')) ? " " : "",
98c0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 72 73  .          pFirs
98d0: 74 2d 3e 6e 54 65 78 74 2c 20 70 46 69 72 73 74  t->nText, pFirst
98e0: 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20  ->zText);.      
98f0: 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20 70 46    needSpace = pF
9900: 69 72 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d  irst->zText[0]==
9910: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ',';.        bre
9920: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  ak;.    }.    pF
9930: 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
9940: 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Next;.  }.}.#end
9950: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
9960: 74 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  t a sequence of 
9970: 74 6f 6b 65 6e 73 20 69 6e 74 6f 20 61 20 73 74  tokens into a st
9980: 72 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  ring and return 
9990: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
99a0: 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20 53 70  that string.  Sp
99b0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
99c0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
99d0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
99e0: 0a 2a 2a 20 61 6e 64 20 6d 75 73 74 20 62 65 20  .** and must be 
99f0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
9a00: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
9a10: 2a 0a 2a 2a 20 43 65 72 74 61 69 6e 20 6b 65 79  *.** Certain key
9a20: 77 6f 72 64 73 20 28 45 58 50 4f 52 54 2c 20 50  words (EXPORT, P
9a30: 52 49 56 41 54 45 2c 20 50 55 42 4c 49 43 2c 20  RIVATE, PUBLIC, 
9a40: 50 52 4f 54 45 43 54 45 44 29 20 61 72 65 20 61  PROTECTED) are a
9a50: 6c 77 61 79 73 0a 2a 2a 20 73 6b 69 70 70 65 64  lways.** skipped
9a60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 6b 69 70  ..**.** If pSkip
9a70: 21 3d 30 20 74 68 65 6e 20 73 6b 69 70 20 6f 76  !=0 then skip ov
9a80: 65 72 20 6e 53 6b 69 70 20 74 6f 6b 65 6e 73 20  er nSkip tokens 
9a90: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 70  beginning with p
9aa0: 53 6b 69 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  Skip..**.** If z
9ab0: 54 65 72 6d 21 3d 30 20 74 68 65 6e 20 61 70 70  Term!=0 then app
9ac0: 65 6e 64 20 74 68 65 20 74 65 78 74 20 74 6f 20  end the text to 
9ad0: 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74  the end..*/.stat
9ae0: 69 63 20 63 68 61 72 20 2a 54 6f 6b 65 6e 73 54  ic char *TokensT
9af0: 6f 53 74 72 69 6e 67 28 0a 20 20 54 6f 6b 65 6e  oString(.  Token
9b00: 20 2a 70 46 69 72 73 74 2c 20 20 20 20 2f 2a 20   *pFirst,    /* 
9b10: 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 6e 20 74  First token in t
9b20: 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 54  he string */.  T
9b30: 6f 6b 65 6e 20 2a 70 4c 61 73 74 2c 20 20 20 20  oken *pLast,    
9b40: 20 2f 2a 20 4c 61 73 74 20 74 6f 6b 65 6e 20 69   /* Last token i
9b50: 6e 20 74 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a  n the string */.
9b60: 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20    char *zTerm,  
9b70: 20 20 20 20 2f 2a 20 54 65 72 6d 69 6e 61 74 65      /* Terminate
9b80: 20 74 68 65 20 73 74 72 69 6e 67 20 77 69 74 68   the string with
9b90: 20 74 68 69 73 20 74 65 78 74 20 69 66 20 6e 6f   this text if no
9ba0: 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  t NULL */.  Toke
9bb0: 6e 20 2a 70 53 6b 69 70 2c 20 20 20 20 20 2f 2a  n *pSkip,     /*
9bc0: 20 53 6b 69 70 20 74 68 69 73 20 74 6f 6b 65 6e   Skip this token
9bd0: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
9be0: 20 20 69 6e 74 20 6e 53 6b 69 70 20 20 20 20 20    int nSkip     
9bf0: 20 20 20 20 2f 2a 20 53 6b 69 70 20 61 20 74 6f      /* Skip a to
9c00: 74 61 6c 20 6f 66 20 74 68 69 73 20 6d 61 6e 79  tal of this many
9c10: 20 74 6f 6b 65 6e 73 20 2a 2f 0a 29 7b 0a 20 20   tokens */.){.  
9c20: 63 68 61 72 20 2a 7a 52 65 74 75 72 6e 3b 0a 20  char *zReturn;. 
9c30: 20 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69   String str;.  i
9c40: 6e 74 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30  nt needSpace = 0
9c50: 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74  ;.  int c;.  int
9c60: 20 69 53 6b 69 70 20 3d 20 30 3b 0a 20 20 69 6e   iSkip = 0;.  in
9c70: 74 20 73 6b 69 70 4f 6e 65 20 3d 20 30 3b 0a 0a  t skipOne = 0;..
9c80: 20 20 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74    StringInit(&st
9c90: 72 29 3b 0a 20 20 70 4c 61 73 74 20 3d 20 70 4c  r);.  pLast = pL
9ca0: 61 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 77 68  ast->pNext;.  wh
9cb0: 69 6c 65 28 20 70 46 69 72 73 74 21 3d 70 4c 61  ile( pFirst!=pLa
9cc0: 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  st ){.    if( pF
9cd0: 69 72 73 74 3d 3d 70 53 6b 69 70 20 29 7b 20 69  irst==pSkip ){ i
9ce0: 53 6b 69 70 20 3d 20 6e 53 6b 69 70 3b 20 7d 0a  Skip = nSkip; }.
9cf0: 20 20 20 20 69 66 28 20 69 53 6b 69 70 3e 30 20      if( iSkip>0 
9d00: 29 7b 0a 20 20 20 20 20 20 69 53 6b 69 70 2d 2d  ){.      iSkip--
9d10: 3b 0a 20 20 20 20 20 20 70 46 69 72 73 74 3d 70  ;.      pFirst=p
9d20: 46 69 72 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  First->pNext;.  
9d30: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
9d40: 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20    }.    switch( 
9d50: 70 46 69 72 73 74 2d 3e 65 54 79 70 65 20 29 7b  pFirst->eType ){
9d60: 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 50  .      case TT_P
9d70: 72 65 70 72 6f 63 65 73 73 6f 72 3a 0a 20 20 20  reprocessor:.   
9d80: 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e       StringAppen
9d90: 64 28 26 73 74 72 2c 22 5c 6e 22 2c 31 29 3b 0a  d(&str,"\n",1);.
9da0: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 41 70          StringAp
9db0: 70 65 6e 64 28 26 73 74 72 2c 70 46 69 72 73 74  pend(&str,pFirst
9dc0: 2d 3e 7a 54 65 78 74 2c 70 46 69 72 73 74 2d 3e  ->zText,pFirst->
9dd0: 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  nText);.        
9de0: 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74  StringAppend(&st
9df0: 72 2c 22 5c 6e 22 2c 31 29 3b 0a 20 20 20 20 20  r,"\n",1);.     
9e00: 20 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30     needSpace = 0
9e10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9e20: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f  ..      case TT_
9e30: 49 64 3a 0a 20 20 20 20 20 20 20 20 73 77 69 74  Id:.        swit
9e40: 63 68 28 20 70 46 69 72 73 74 2d 3e 7a 54 65 78  ch( pFirst->zTex
9e50: 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  t[0] ){.        
9e60: 20 20 63 61 73 65 20 27 45 27 3a 0a 20 20 20 20    case 'E':.    
9e70: 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 72          if( pFir
9e80: 73 74 2d 3e 6e 54 65 78 74 3d 3d 36 20 26 26 20  st->nText==6 && 
9e90: 73 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e  strncmp(pFirst->
9ea0: 7a 54 65 78 74 2c 22 45 58 50 4f 52 54 22 2c 36  zText,"EXPORT",6
9eb0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9ec0: 20 20 20 20 20 20 73 6b 69 70 4f 6e 65 20 3d 20        skipOne = 
9ed0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
9ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
9ef0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61  ak;.          ca
9f00: 73 65 20 27 50 27 3a 0a 20 20 20 20 20 20 20 20  se 'P':.        
9f10: 20 20 20 20 73 77 69 74 63 68 28 20 70 46 69 72      switch( pFir
9f20: 73 74 2d 3e 6e 54 65 78 74 20 29 7b 0a 20 20 20  st->nText ){.   
9f30: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
9f40: 36 3a 20 20 73 6b 69 70 4f 6e 65 20 3d 20 21 73  6:  skipOne = !s
9f50: 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e 7a  trncmp(pFirst->z
9f60: 54 65 78 74 2c 22 50 55 42 4c 49 43 22 2c 20 36  Text,"PUBLIC", 6
9f70: 29 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  );    break;.   
9f80: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
9f90: 37 3a 20 20 73 6b 69 70 4f 6e 65 20 3d 20 21 73  7:  skipOne = !s
9fa0: 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e 7a  trncmp(pFirst->z
9fb0: 54 65 78 74 2c 22 50 52 49 56 41 54 45 22 2c 37  Text,"PRIVATE",7
9fc0: 29 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  );    break;.   
9fd0: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
9fe0: 39 3a 20 20 73 6b 69 70 4f 6e 65 20 3d 20 21 73  9:  skipOne = !s
9ff0: 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e 7a  trncmp(pFirst->z
a000: 54 65 78 74 2c 22 50 52 4f 54 45 43 54 45 44 22  Text,"PROTECTED"
a010: 2c 39 29 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ,9);  break;.   
a020: 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75             defau
a030: 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  lt: break;.     
a040: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a050: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a060: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
a070: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a080: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a090: 20 20 20 20 69 66 28 20 73 6b 69 70 4f 6e 65 20      if( skipOne 
a0a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
a0b0: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 4e  rst = pFirst->pN
a0c0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ext;.          c
a0d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
a0e0: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61   }.        /* Fa
a0f0: 6c 6c 20 74 68 72 75 20 74 6f 20 74 68 65 20 6e  ll thru to the n
a100: 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ext case */.    
a110: 20 20 63 61 73 65 20 54 54 5f 4e 75 6d 62 65 72    case TT_Number
a120: 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  :.        if( ne
a130: 65 64 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  edSpace ){.     
a140: 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e       StringAppen
a150: 64 28 26 73 74 72 2c 22 20 22 2c 31 29 3b 0a 20  d(&str," ",1);. 
a160: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a170: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73   StringAppend(&s
a180: 74 72 2c 70 46 69 72 73 74 2d 3e 7a 54 65 78 74  tr,pFirst->zText
a190: 2c 70 46 69 72 73 74 2d 3e 6e 54 65 78 74 29 3b  ,pFirst->nText);
a1a0: 0a 20 20 20 20 20 20 20 20 6e 65 65 64 53 70 61  .        needSpa
a1b0: 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ce = 1;.        
a1c0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65  break;..      de
a1d0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 63  fault:.        c
a1e0: 20 3d 20 70 46 69 72 73 74 2d 3e 7a 54 65 78 74   = pFirst->zText
a1f0: 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
a200: 20 6e 65 65 64 53 70 61 63 65 20 26 26 20 28 63   needSpace && (c
a210: 3d 3d 27 2a 27 20 7c 7c 20 63 3d 3d 27 7b 27 29  =='*' || c=='{')
a220: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 74   ){.          St
a230: 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c  ringAppend(&str,
a240: 22 20 22 2c 31 29 3b 0a 20 20 20 20 20 20 20 20  " ",1);.        
a250: 7d 0a 20 20 20 20 20 20 20 20 53 74 72 69 6e 67  }.        String
a260: 41 70 70 65 6e 64 28 26 73 74 72 2c 70 46 69 72  Append(&str,pFir
a270: 73 74 2d 3e 7a 54 65 78 74 2c 70 46 69 72 73 74  st->zText,pFirst
a280: 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20  ->nText);.      
a290: 20 20 2f 2a 20 6e 65 65 64 53 70 61 63 65 20 3d    /* needSpace =
a2a0: 20 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 5b 30   pFirst->zText[0
a2b0: 5d 3d 3d 27 2c 27 3b 20 2a 2f 0a 20 20 20 20 20  ]==','; */.     
a2c0: 20 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30     needSpace = 0
a2d0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
a2e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 72 73  .    }.    pFirs
a2f0: 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 4e 65 78  t = pFirst->pNex
a300: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 65  t;.  }.  if( zTe
a310: 72 6d 20 26 26 20 2a 7a 54 65 72 6d 20 29 7b 0a  rm && *zTerm ){.
a320: 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64      StringAppend
a330: 28 26 73 74 72 2c 7a 54 65 72 6d 2c 73 74 72 6c  (&str,zTerm,strl
a340: 65 6e 28 7a 54 65 72 6d 29 29 3b 0a 20 20 7d 0a  en(zTerm));.  }.
a350: 20 20 7a 52 65 74 75 72 6e 20 3d 20 53 74 72 44    zReturn = StrD
a360: 75 70 28 53 74 72 69 6e 67 47 65 74 28 26 73 74  up(StringGet(&st
a370: 72 29 2c 30 29 3b 0a 20 20 53 74 72 69 6e 67 52  r),0);.  StringR
a380: 65 73 65 74 28 26 73 74 72 29 3b 0a 20 20 72 65  eset(&str);.  re
a390: 74 75 72 6e 20 7a 52 65 74 75 72 6e 3b 0a 7d 0a  turn zReturn;.}.
a3a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
a3b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
a3c0: 65 6e 20 77 65 20 73 65 65 20 6f 6e 65 20 6f 66  en we see one of
a3d0: 20 74 68 65 20 6b 65 79 77 6f 72 64 73 20 22 73   the keywords "s
a3e0: 74 72 75 63 74 22 2c 0a 2a 2a 20 22 65 6e 75 6d  truct",.** "enum
a3f0: 22 2c 20 22 75 6e 69 6f 6e 22 20 6f 72 20 22 63  ", "union" or "c
a400: 6c 61 73 73 22 2e 20 20 54 68 69 73 20 6d 69 67  lass".  This mig
a410: 68 74 20 62 65 20 74 68 65 20 62 65 67 69 6e 6e  ht be the beginn
a420: 69 6e 67 20 6f 66 20 61 0a 2a 2a 20 74 79 70 65  ing of a.** type
a430: 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 20 54   declaration.  T
a440: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
a450: 20 70 72 6f 63 65 73 73 20 74 68 65 20 64 65 63   process the dec
a460: 6c 61 72 61 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  laration and.** 
a470: 72 65 6d 6f 76 65 20 74 68 65 20 64 65 63 6c 61  remove the decla
a480: 72 61 74 69 6f 6e 20 74 6f 6b 65 6e 73 20 66 72  ration tokens fr
a490: 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  om the input str
a4a0: 65 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eam..**.** If th
a4b0: 69 73 20 69 73 20 61 20 74 79 70 65 20 64 65 63  is is a type dec
a4c0: 6c 61 72 61 74 69 6f 6e 20 74 68 61 74 20 69 73  laration that is
a4d0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
a4e0: 6c 6f 77 65 64 20 62 79 20 61 0a 2a 2a 20 73 65  lowed by a.** se
a4f0: 6d 69 63 6f 6c 6f 6e 20 28 69 6e 20 6f 74 68 65  micolon (in othe
a500: 72 20 77 6f 72 64 73 20 69 74 20 69 73 6e 27 74  r words it isn't
a510: 20 61 6c 73 6f 20 61 20 76 61 72 69 61 62 6c 65   also a variable
a520: 20 64 65 66 69 6e 69 74 69 6f 6e 29 0a 2a 2a 20   definition).** 
a530: 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 65 74  then set *pReset
a540: 20 74 6f 20 27 3b 27 2e 20 20 4f 74 68 65 72 77   to ';'.  Otherw
a550: 69 73 65 20 6c 65 61 76 65 20 2a 70 52 65 73 65  ise leave *pRese
a560: 74 20 61 74 20 30 2e 20 20 54 68 65 0a 2a 2a 20  t at 0.  The.** 
a570: 2a 70 52 65 73 65 74 20 66 6c 61 67 20 63 61 75  *pReset flag cau
a580: 73 65 73 20 74 68 65 20 70 61 72 73 65 72 20 74  ses the parser t
a590: 6f 20 73 6b 69 70 20 61 68 65 61 64 20 74 6f 20  o skip ahead to 
a5a0: 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 0a 2a  the next token.*
a5b0: 2a 20 74 68 61 74 20 62 65 67 69 6e 73 20 77 69  * that begins wi
a5c0: 74 68 20 74 68 65 20 76 61 6c 75 65 20 70 6c 61  th the value pla
a5d0: 63 65 64 20 69 6e 20 74 68 65 20 2a 70 52 65 73  ced in the *pRes
a5e0: 65 74 20 66 6c 61 67 2c 20 69 66 20 74 68 61 74  et flag, if that
a5f0: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 64 69 66  .** value is dif
a600: 66 65 72 65 6e 74 20 66 72 6f 6d 20 30 2e 0a 2a  ferent from 0..*
a610: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 50 72 6f  /.static int Pro
a620: 63 65 73 73 54 79 70 65 44 65 63 6c 28 54 6f 6b  cessTypeDecl(Tok
a630: 65 6e 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 66  en *pList, int f
a640: 6c 61 67 73 2c 20 69 6e 74 20 2a 70 52 65 73 65  lags, int *pRese
a650: 74 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61  t){.  Token *pNa
a660: 6d 65 2c 20 2a 70 45 6e 64 3b 0a 20 20 44 65 63  me, *pEnd;.  Dec
a670: 6c 20 2a 70 44 65 63 6c 3b 0a 20 20 53 74 72 69  l *pDecl;.  Stri
a680: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 6e 65  ng str;.  int ne
a690: 65 64 5f 74 6f 5f 63 6f 6c 6c 61 70 73 65 20 3d  ed_to_collapse =
a6a0: 20 31 3b 0a 20 20 69 6e 74 20 74 79 70 65 20 3d   1;.  int type =
a6b0: 20 30 3b 0a 0a 20 20 2a 70 52 65 73 65 74 20 3d   0;..  *pReset =
a6c0: 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   0;.  if( pList=
a6d0: 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 4e 65  =0 || pList->pNe
a6e0: 78 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  xt==0 || pList->
a6f0: 70 4e 65 78 74 2d 3e 65 54 79 70 65 21 3d 54 54  pNext->eType!=TT
a700: 5f 49 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _Id ){.    retur
a710: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 61 6d 65  n 0;.  }.  pName
a720: 20 3d 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b   = pList->pNext;
a730: 0a 0a 20 20 2f 2a 20 43 61 74 63 68 20 74 68 65  ..  /* Catch the
a740: 20 63 61 73 65 20 6f 66 20 22 73 74 72 75 63 74   case of "struct
a750: 20 46 6f 6f 3b 22 20 61 6e 64 20 73 6b 69 70 20   Foo;" and skip 
a760: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  it. */.  if( pNa
a770: 6d 65 2d 3e 70 4e 65 78 74 20 26 26 20 70 4e 61  me->pNext && pNa
a780: 6d 65 2d 3e 70 4e 65 78 74 2d 3e 7a 54 65 78 74  me->pNext->zText
a790: 5b 30 5d 3d 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]==';' ){.    
a7a0: 2a 70 52 65 73 65 74 20 3d 20 27 3b 27 3b 0a 20  *pReset = ';';. 
a7b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a7c0: 0a 0a 20 20 66 6f 72 28 70 45 6e 64 3d 70 4e 61  ..  for(pEnd=pNa
a7d0: 6d 65 2d 3e 70 4e 65 78 74 3b 20 70 45 6e 64 20  me->pNext; pEnd 
a7e0: 26 26 20 70 45 6e 64 2d 3e 65 54 79 70 65 21 3d  && pEnd->eType!=
a7f0: 54 54 5f 42 72 61 63 65 73 3b 20 70 45 6e 64 3d  TT_Braces; pEnd=
a800: 70 45 6e 64 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pEnd->pNext){.  
a810: 20 20 73 77 69 74 63 68 28 20 70 45 6e 64 2d 3e    switch( pEnd->
a820: 7a 54 65 78 74 5b 30 5d 20 29 7b 0a 20 20 20 20  zText[0] ){.    
a830: 20 20 63 61 73 65 20 27 28 27 3a 0a 20 20 20 20    case '(':.    
a840: 20 20 63 61 73 65 20 27 29 27 3a 0a 20 20 20 20    case ')':.    
a850: 20 20 63 61 73 65 20 27 2a 27 3a 0a 20 20 20 20    case '*':.    
a860: 20 20 63 61 73 65 20 27 5b 27 3a 0a 20 20 20 20    case '[':.    
a870: 20 20 63 61 73 65 20 27 3d 27 3a 0a 20 20 20 20    case '=':.    
a880: 20 20 63 61 73 65 20 27 3b 27 3a 0a 20 20 20 20    case ';':.    
a890: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a8a0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 45    }.  }.  if( pE
a8b0: 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  nd==0 ){.    ret
a8c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
a8d0: 0a 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f  .  ** At this po
a8e0: 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 77 65 20  int, we know we 
a8f0: 68 61 76 65 20 61 20 74 79 70 65 20 64 65 63 6c  have a type decl
a900: 61 72 61 74 69 6f 6e 20 74 68 61 74 20 69 73 20  aration that is 
a910: 62 6f 75 6e 64 65 64 0a 20 20 2a 2a 20 62 79 20  bounded.  ** by 
a920: 70 4c 69 73 74 20 61 6e 64 20 70 45 6e 64 20 61  pList and pEnd a
a930: 6e 64 20 68 61 73 20 74 68 65 20 6e 61 6d 65 20  nd has the name 
a940: 70 4e 61 6d 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  pName..  */..  /
a950: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 62 72  *.  ** If the br
a960: 61 63 65 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65  aces are followe
a970: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 79  d immediately by
a980: 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 2c 20 74 68   a semicolon, th
a990: 65 6e 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  en we are.  ** d
a9a0: 65 61 6c 69 6e 67 20 61 20 74 79 70 65 20 64 65  ealing a type de
a9b0: 63 6c 61 72 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20  claration only. 
a9c0: 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20 76 61   There is not va
a9d0: 72 69 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f  riable definitio
a9e0: 6e 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  n.  ** following
a9f0: 20 74 68 65 20 74 79 70 65 20 64 65 63 6c 61 72   the type declar
aa00: 61 74 69 6f 6e 2e 20 20 53 6f 20 72 65 73 65 74  ation.  So reset
aa10: 2e 2e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ....  */.  if( p
aa20: 45 6e 64 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c  End->pNext==0 ||
aa30: 20 70 45 6e 64 2d 3e 70 4e 65 78 74 2d 3e 7a 54   pEnd->pNext->zT
aa40: 65 78 74 5b 30 5d 3d 3d 27 3b 27 20 29 7b 0a 20  ext[0]==';' ){. 
aa50: 20 20 20 2a 70 52 65 73 65 74 20 3d 20 27 3b 27     *pReset = ';'
aa60: 3b 0a 20 20 20 20 6e 65 65 64 5f 74 6f 5f 63 6f  ;.    need_to_co
aa70: 6c 6c 61 70 73 65 20 3d 20 30 3b 0a 20 20 7d 65  llapse = 0;.  }e
aa80: 6c 73 65 7b 0a 20 20 20 20 6e 65 65 64 5f 74 6f  lse{.    need_to
aa90: 5f 63 6f 6c 6c 61 70 73 65 20 3d 20 31 3b 0a 20  _collapse = 1;. 
aaa0: 20 7d 0a 0a 20 20 69 66 28 20 70 72 6f 74 6f 5f   }..  if( proto_
aab0: 73 74 61 74 69 63 3d 3d 30 20 26 26 20 28 66 6c  static==0 && (fl
aac0: 61 67 73 20 26 20 28 50 53 5f 4c 6f 63 61 6c 7c  ags & (PS_Local|
aad0: 50 53 5f 45 78 70 6f 72 74 7c 50 53 5f 49 6e 74  PS_Export|PS_Int
aae0: 65 72 66 61 63 65 29 29 3d 3d 30 20 29 7b 0a 20  erface))==0 ){. 
aaf0: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65     /* Ignore the
ab00: 73 65 20 6f 62 6a 65 63 74 73 20 75 6e 6c 65 73  se objects unles
ab10: 73 20 74 68 65 79 20 61 72 65 20 65 78 70 6c 69  s they are expli
ab20: 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 61  citly declared a
ab30: 73 20 69 6e 74 65 72 66 61 63 65 2c 0a 20 20 20  s interface,.   
ab40: 20 2a 2a 20 6f 72 20 75 6e 6c 65 73 73 20 74 68   ** or unless th
ab50: 65 20 22 2d 6c 6f 63 61 6c 22 20 63 6f 6d 6d 61  e "-local" comma
ab60: 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 77  nd line option w
ab70: 61 73 20 73 70 65 63 69 66 69 65 64 2e 20 2a 2f  as specified. */
ab80: 0a 20 20 20 20 2a 70 52 65 73 65 74 20 3d 20 27  .    *pReset = '
ab90: 3b 27 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ;';.    return 0
aba0: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 44 45  ;.  }..#ifdef DE
abb0: 42 55 47 0a 20 20 69 66 28 20 64 65 62 75 67 4d  BUG.  if( debugM
abc0: 61 73 6b 20 26 20 50 41 52 53 45 52 20 29 7b 0a  ask & PARSER ){.
abd0: 20 20 20 20 70 72 69 6e 74 66 28 22 2a 2a 2a 2a      printf("****
abe0: 20 46 6f 75 6e 64 20 74 79 70 65 3a 20 25 2e 2a   Found type: %.*
abf0: 73 20 25 2e 2a 73 2e 2e 2e 5c 6e 22 2c 0a 20 20  s %.*s...\n",.  
ac00: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74      pList->nText
ac10: 2c 20 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 20  , pList->zText, 
ac20: 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 2c 20 70 4e  pName->nText, pN
ac30: 61 6d 65 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20  ame->zText);.   
ac40: 20 50 72 69 6e 74 54 6f 6b 65 6e 73 28 70 4c 69   PrintTokens(pLi
ac50: 73 74 2c 70 45 6e 64 29 3b 0a 20 20 20 20 70 72  st,pEnd);.    pr
ac60: 69 6e 74 66 28 22 3b 5c 6e 22 29 3b 0a 20 20 7d  intf(";\n");.  }
ac70: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
ac80: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
ac90: 44 65 63 6c 20 6f 62 6a 65 63 74 20 66 6f 72 20  Decl object for 
aca0: 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e  this definition.
acb0: 20 20 41 63 74 75 61 6c 6c 79 2c 20 69 66 20 74    Actually, if t
acc0: 68 69 73 0a 20 20 2a 2a 20 69 73 20 61 20 43 2b  his.  ** is a C+
acd0: 2b 20 63 6c 61 73 73 20 64 65 66 69 6e 69 74 69  + class definiti
ace0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 44 65 63  on, then the Dec
acf0: 6c 20 6f 62 6a 65 63 74 20 6d 69 67 68 74 20 61  l object might a
ad00: 6c 72 65 61 64 79 20 65 78 69 73 74 2c 0a 20 20  lready exist,.  
ad10: 2a 2a 20 73 6f 20 63 68 65 63 6b 20 66 69 72 73  ** so check firs
ad20: 74 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20  t for that case 
ad30: 62 65 66 6f 72 65 20 63 72 65 61 74 69 6e 67 20  before creating 
ad40: 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
ad50: 20 20 73 77 69 74 63 68 28 20 2a 70 4c 69 73 74    switch( *pList
ad60: 2d 3e 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 63  ->zText ){.    c
ad70: 61 73 65 20 27 63 27 3a 20 20 74 79 70 65 20 3d  ase 'c':  type =
ad80: 20 54 59 5f 43 6c 61 73 73 3b 20 20 20 20 20 20   TY_Class;      
ad90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
ada0: 65 20 27 73 27 3a 20 20 74 79 70 65 20 3d 20 54  e 's':  type = T
adb0: 59 5f 53 74 72 75 63 74 75 72 65 3b 20 20 20 20  Y_Structure;    
adc0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
add0: 27 65 27 3a 20 20 74 79 70 65 20 3d 20 54 59 5f  'e':  type = TY_
ade0: 45 6e 75 6d 65 72 61 74 69 6f 6e 3b 20 20 62 72  Enumeration;  br
adf0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 75  eak;.    case 'u
ae00: 27 3a 20 20 74 79 70 65 20 3d 20 54 59 5f 55 6e  ':  type = TY_Un
ae10: 69 6f 6e 3b 20 20 20 20 20 20 20 20 62 72 65 61  ion;        brea
ae20: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
ae30: 20 20 2f 2a 20 43 61 6e 27 74 20 48 61 70 70 65    /* Can't Happe
ae40: 6e 20 2a 2f 20 20 20 20 20 20 62 72 65 61 6b 3b  n */      break;
ae50: 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 21  .  }.  if( type!
ae60: 3d 54 59 5f 43 6c 61 73 73 20 29 7b 0a 20 20 20  =TY_Class ){.   
ae70: 20 70 44 65 63 6c 20 3d 20 30 3b 0a 20 20 7d 65   pDecl = 0;.  }e
ae80: 6c 73 65 7b 0a 20 20 20 20 70 44 65 63 6c 20 3d  lse{.    pDecl =
ae90: 20 46 69 6e 64 44 65 63 6c 28 70 4e 61 6d 65 2d   FindDecl(pName-
aea0: 3e 7a 54 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 6e  >zText, pName->n
aeb0: 54 65 78 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Text);.    if( p
aec0: 44 65 63 6c 20 26 26 20 28 70 44 65 63 6c 2d 3e  Decl && (pDecl->
aed0: 66 6c 61 67 73 20 26 20 74 79 70 65 29 21 3d 74  flags & type)!=t
aee0: 79 70 65 20 29 20 70 44 65 63 6c 20 3d 20 30 3b  ype ) pDecl = 0;
aef0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 63 6c  .  }.  if( pDecl
af00: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 65 63 6c  ==0 ){.    pDecl
af10: 20 3d 20 43 72 65 61 74 65 44 65 63 6c 28 70 4e   = CreateDecl(pN
af20: 61 6d 65 2d 3e 7a 54 65 78 74 2c 70 4e 61 6d 65  ame->zText,pName
af30: 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20  ->nText);.  }.  
af40: 69 66 28 20 28 66 6c 61 67 73 20 26 20 50 53 5f  if( (flags & PS_
af50: 53 74 61 74 69 63 29 20 7c 7c 20 21 28 66 6c 61  Static) || !(fla
af60: 67 73 20 26 20 28 50 53 5f 49 6e 74 65 72 66 61  gs & (PS_Interfa
af70: 63 65 7c 50 53 5f 45 78 70 6f 72 74 29 29 20 29  ce|PS_Export)) )
af80: 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f  {.    DeclSetPro
af90: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 4c  perty(pDecl,DP_L
afa0: 6f 63 61 6c 29 3b 0a 20 20 7d 0a 20 20 44 65 63  ocal);.  }.  Dec
afb0: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65  lSetProperty(pDe
afc0: 63 6c 2c 74 79 70 65 29 3b 0a 0a 20 20 2f 2a 20  cl,type);..  /* 
afd0: 54 68 65 20 6f 62 6a 65 63 74 20 68 61 73 20 61  The object has a
afe0: 20 66 75 6c 6c 20 64 65 63 6c 61 72 61 74 69 6f   full declaratio
aff0: 6e 20 6f 6e 6c 79 20 69 66 20 69 74 20 69 73 20  n only if it is 
b000: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
b010: 0a 20 20 2a 2a 20 22 23 69 66 20 49 4e 54 45 52  .  ** "#if INTER
b020: 46 41 43 45 2e 2e 2e 23 65 6e 64 69 66 22 20 6f  FACE...#endif" o
b030: 72 20 22 23 69 66 20 45 58 50 4f 52 54 5f 49 4e  r "#if EXPORT_IN
b040: 54 45 52 46 41 43 45 2e 2e 2e 23 65 6e 64 69 66  TERFACE...#endif
b050: 22 20 6f 72 0a 20 20 2a 2a 20 22 23 69 66 20 4c  " or.  ** "#if L
b060: 4f 43 41 4c 5f 49 4e 54 45 52 46 41 43 45 2e 2e  OCAL_INTERFACE..
b070: 2e 23 65 6e 64 69 66 22 2e 20 20 4f 74 68 65 72  .#endif".  Other
b080: 77 69 73 65 2c 20 77 65 20 6f 6e 6c 79 20 67 69  wise, we only gi
b090: 76 65 20 69 74 20 61 0a 20 20 2a 2a 20 66 6f 72  ve it a.  ** for
b0a0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
b0b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 6c 61  ..  */.  if( fla
b0c0: 67 73 20 26 20 28 50 53 5f 4c 6f 63 61 6c 20 7c  gs & (PS_Local |
b0d0: 20 50 53 5f 45 78 70 6f 72 74 20 7c 20 50 53 5f   PS_Export | PS_
b0e0: 49 6e 74 65 72 66 61 63 65 29 20 20 29 7b 0a 20  Interface)  ){. 
b0f0: 20 20 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 20     pDecl->zDecl 
b100: 3d 20 54 6f 6b 65 6e 73 54 6f 53 74 72 69 6e 67  = TokensToString
b110: 28 70 4c 69 73 74 2c 70 45 6e 64 2c 22 3b 5c 6e  (pList,pEnd,";\n
b120: 22 2c 30 2c 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  ",0,0);.  }else{
b130: 0a 20 20 20 20 70 44 65 63 6c 2d 3e 7a 44 65 63  .    pDecl->zDec
b140: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 44 65  l = 0;.  }.  pDe
b150: 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20 3d 20 70  cl->pComment = p
b160: 4c 69 73 74 2d 3e 70 43 6f 6d 6d 65 6e 74 3b 0a  List->pComment;.
b170: 20 20 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74    StringInit(&st
b180: 72 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70 65  r);.  StringAppe
b190: 6e 64 28 26 73 74 72 2c 22 74 79 70 65 64 65 66  nd(&str,"typedef
b1a0: 20 22 2c 30 29 3b 0a 20 20 53 74 72 69 6e 67 41   ",0);.  StringA
b1b0: 70 70 65 6e 64 28 26 73 74 72 2c 70 4c 69 73 74  ppend(&str,pList
b1c0: 2d 3e 7a 54 65 78 74 2c 70 4c 69 73 74 2d 3e 6e  ->zText,pList->n
b1d0: 54 65 78 74 29 3b 0a 20 20 53 74 72 69 6e 67 41  Text);.  StringA
b1e0: 70 70 65 6e 64 28 26 73 74 72 2c 22 20 22 2c 30  ppend(&str," ",0
b1f0: 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70 65 6e  );.  StringAppen
b200: 64 28 26 73 74 72 2c 70 4e 61 6d 65 2d 3e 7a 54  d(&str,pName->zT
b210: 65 78 74 2c 70 4e 61 6d 65 2d 3e 6e 54 65 78 74  ext,pName->nText
b220: 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70 65 6e  );.  StringAppen
b230: 64 28 26 73 74 72 2c 22 20 22 2c 30 29 3b 0a 20  d(&str," ",0);. 
b240: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73   StringAppend(&s
b250: 74 72 2c 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c  tr,pName->zText,
b260: 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 29 3b 0a 20  pName->nText);. 
b270: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73   StringAppend(&s
b280: 74 72 2c 22 3b 5c 6e 22 2c 32 29 3b 0a 20 20 70  tr,";\n",2);.  p
b290: 44 65 63 6c 2d 3e 7a 46 77 64 20 3d 20 53 74 72  Decl->zFwd = Str
b2a0: 44 75 70 28 53 74 72 69 6e 67 47 65 74 28 26 73  Dup(StringGet(&s
b2b0: 74 72 29 2c 30 29 3b 0a 20 20 53 74 72 69 6e 67  tr),0);.  String
b2c0: 52 65 73 65 74 28 26 73 74 72 29 3b 0a 20 20 53  Reset(&str);.  S
b2d0: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
b2e0: 0a 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28  .  StringAppend(
b2f0: 26 73 74 72 2c 70 4c 69 73 74 2d 3e 7a 54 65 78  &str,pList->zTex
b300: 74 2c 70 4c 69 73 74 2d 3e 6e 54 65 78 74 29 3b  t,pList->nText);
b310: 0a 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28  .  StringAppend(
b320: 26 73 74 72 2c 22 20 22 2c 30 29 3b 0a 20 20 53  &str," ",0);.  S
b330: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72  tringAppend(&str
b340: 2c 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 70 4e  ,pName->zText,pN
b350: 61 6d 65 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 53  ame->nText);.  S
b360: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72  tringAppend(&str
b370: 2c 22 3b 5c 6e 22 2c 32 29 3b 0a 20 20 70 44 65  ,";\n",2);.  pDe
b380: 63 6c 2d 3e 7a 46 77 64 43 70 70 20 3d 20 53 74  cl->zFwdCpp = St
b390: 72 44 75 70 28 53 74 72 69 6e 67 47 65 74 28 26  rDup(StringGet(&
b3a0: 73 74 72 29 2c 30 29 3b 0a 20 20 53 74 72 69 6e  str),0);.  Strin
b3b0: 67 52 65 73 65 74 28 26 73 74 72 29 3b 0a 20 20  gReset(&str);.  
b3c0: 69 66 28 20 66 6c 61 67 73 20 26 20 50 53 5f 45  if( flags & PS_E
b3d0: 78 70 6f 72 74 20 29 7b 0a 20 20 20 20 44 65 63  xport ){.    Dec
b3e0: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65  lSetProperty(pDe
b3f0: 63 6c 2c 44 50 5f 45 78 70 6f 72 74 29 3b 0a 20  cl,DP_Export);. 
b400: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
b410: 20 26 20 50 53 5f 4c 6f 63 61 6c 20 29 7b 0a 20   & PS_Local ){. 
b420: 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72     DeclSetProper
b430: 74 79 28 70 44 65 63 6c 2c 44 50 5f 4c 6f 63 61  ty(pDecl,DP_Loca
b440: 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 48 65  l);.  }..  /* He
b450: 72 65 27 73 20 73 6f 6d 65 74 68 69 6e 67 20 77  re's something w
b460: 65 69 72 64 2e 20 20 41 4e 53 49 2d 43 20 64 6f  eird.  ANSI-C do
b470: 65 73 6e 27 74 20 61 6c 6c 6f 77 20 61 20 66 6f  esn't allow a fo
b480: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
b490: 6e 0a 20 20 2a 2a 20 6f 66 20 61 6e 20 65 6e 75  n.  ** of an enu
b4a0: 6d 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 77 65  meration.  So we
b4b0: 20 68 61 76 65 20 74 6f 20 62 75 69 6c 64 20 74   have to build t
b4c0: 68 65 20 74 79 70 65 64 65 66 20 69 6e 74 6f 20  he typedef into 
b4d0: 74 68 65 0a 20 20 2a 2a 20 64 65 66 69 6e 69 74  the.  ** definit
b4e0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
b4f0: 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 20 26 26 20  pDecl->zDecl && 
b500: 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28  DeclHasProperty(
b510: 70 44 65 63 6c 2c 20 54 59 5f 45 6e 75 6d 65 72  pDecl, TY_Enumer
b520: 61 74 69 6f 6e 29 20 29 7b 0a 20 20 20 20 53 74  ation) ){.    St
b530: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
b540: 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64      StringAppend
b550: 28 26 73 74 72 2c 70 44 65 63 6c 2d 3e 7a 44 65  (&str,pDecl->zDe
b560: 63 6c 2c 30 29 3b 0a 20 20 20 20 53 74 72 69 6e  cl,0);.    Strin
b570: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 70 44 65  gAppend(&str,pDe
b580: 63 6c 2d 3e 7a 46 77 64 2c 30 29 3b 0a 20 20 20  cl->zFwd,0);.   
b590: 20 53 61 66 65 46 72 65 65 28 70 44 65 63 6c 2d   SafeFree(pDecl-
b5a0: 3e 7a 44 65 63 6c 29 3b 0a 20 20 20 20 53 61 66  >zDecl);.    Saf
b5b0: 65 46 72 65 65 28 70 44 65 63 6c 2d 3e 7a 46 77  eFree(pDecl->zFw
b5c0: 64 29 3b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 7a  d);.    pDecl->z
b5d0: 46 77 64 20 3d 20 30 3b 0a 20 20 20 20 70 44 65  Fwd = 0;.    pDe
b5e0: 63 6c 2d 3e 7a 44 65 63 6c 20 3d 20 53 74 72 44  cl->zDecl = StrD
b5f0: 75 70 28 53 74 72 69 6e 67 47 65 74 28 26 73 74  up(StringGet(&st
b600: 72 29 2c 30 29 3b 0a 20 20 20 20 53 74 72 69 6e  r),0);.    Strin
b610: 67 52 65 73 65 74 28 26 73 74 72 29 3b 0a 20 20  gReset(&str);.  
b620: 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e  }..  if( pName->
b630: 70 4e 65 78 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d  pNext->zText[0]=
b640: 3d 27 3a 27 20 29 7b 0a 20 20 20 20 44 65 63 6c  =':' ){.    Decl
b650: 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63  SetProperty(pDec
b660: 6c 2c 44 50 5f 43 70 6c 75 73 70 6c 75 73 29 3b  l,DP_Cplusplus);
b670: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 61 6d 65  .  }.  if( pName
b680: 2d 3e 6e 54 65 78 74 3d 3d 35 20 26 26 20 73 74  ->nText==5 && st
b690: 72 6e 63 6d 70 28 70 4e 61 6d 65 2d 3e 7a 54 65  rncmp(pName->zTe
b6a0: 78 74 2c 22 63 6c 61 73 73 22 2c 35 29 3d 3d 30  xt,"class",5)==0
b6b0: 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50   ){.    DeclSetP
b6c0: 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50  roperty(pDecl,DP
b6d0: 5f 43 70 6c 75 73 70 6c 75 73 29 3b 0a 20 20 7d  _Cplusplus);.  }
b6e0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 6d 6f  ..  /*.  ** Remo
b6f0: 76 65 20 61 6c 6c 20 62 75 74 20 70 4c 69 73 74  ve all but pList
b700: 20 61 6e 64 20 70 4e 61 6d 65 20 66 72 6f 6d 20   and pName from 
b710: 74 68 65 20 69 6e 70 75 74 20 73 74 72 65 61 6d  the input stream
b720: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65  ..  */.  if( nee
b730: 64 5f 74 6f 5f 63 6f 6c 6c 61 70 73 65 20 29 7b  d_to_collapse ){
b740: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 45 6e 64  .    while( pEnd
b750: 21 3d 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  !=pName ){.     
b760: 20 54 6f 6b 65 6e 20 2a 70 50 72 65 76 20 3d 20   Token *pPrev = 
b770: 70 45 6e 64 2d 3e 70 50 72 65 76 3b 0a 20 20 20  pEnd->pPrev;.   
b780: 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20     pPrev->pNext 
b790: 3d 20 70 45 6e 64 2d 3e 70 4e 65 78 74 3b 0a 20  = pEnd->pNext;. 
b7a0: 20 20 20 20 20 70 45 6e 64 2d 3e 70 4e 65 78 74       pEnd->pNext
b7b0: 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 76 3b  ->pPrev = pPrev;
b7c0: 0a 20 20 20 20 20 20 53 61 66 65 46 72 65 65 28  .      SafeFree(
b7d0: 70 45 6e 64 29 3b 0a 20 20 20 20 20 20 70 45 6e  pEnd);.      pEn
b7e0: 64 20 3d 20 70 50 72 65 76 3b 0a 20 20 20 20 7d  d = pPrev;.    }
b7f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
b800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
b810: 61 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73  a list of tokens
b820: 20 74 68 61 74 20 64 65 63 6c 61 72 65 20 73 6f   that declare so
b830: 6d 65 74 68 69 6e 67 20 28 61 20 66 75 6e 63 74  mething (a funct
b840: 69 6f 6e 2c 20 70 72 6f 63 65 64 75 72 65 2c 0a  ion, procedure,.
b850: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6f 72 20 74  ** variable or t
b860: 79 70 65 64 65 66 29 20 66 69 6e 64 20 74 68 65  ypedef) find the
b870: 20 74 6f 6b 65 6e 20 77 68 69 63 68 20 63 6f 6e   token which con
b880: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
b890: 66 20 74 68 65 0a 2a 2a 20 74 68 69 6e 67 20 62  f the.** thing b
b8a0: 65 69 6e 67 20 64 65 63 6c 61 72 65 64 2e 0a 2a  eing declared..*
b8b0: 2a 0a 2a 2a 20 41 6c 67 6f 72 69 74 68 6d 3a 0a  *.** Algorithm:.
b8c0: 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 6e 61 6d 65  **.**   The name
b8d0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 31   is:.**.**     1
b8e0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 64 65  .  The first ide
b8f0: 6e 74 69 66 69 65 72 20 74 68 61 74 20 69 73 20  ntifier that is 
b900: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 22 5b  followed by a "[
b910: 22 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ", or.**.**     
b920: 32 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 64  2.  The first id
b930: 65 6e 74 69 66 69 65 72 20 74 68 61 74 20 69 73  entifier that is
b940: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 22   followed by a "
b950: 28 22 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  (" where the.** 
b960: 20 20 20 20 20 20 20 20 22 28 22 20 69 73 20 66          "(" is f
b970: 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 6f 74 68  ollowed by anoth
b980: 65 72 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f  er identifier, o
b990: 72 0a 2a 2a 0a 2a 2a 20 20 20 20 20 33 2e 20 20  r.**.**     3.  
b9a0: 54 68 65 20 66 69 72 73 74 20 69 64 65 6e 74 69  The first identi
b9b0: 66 69 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  fier followed by
b9c0: 20 22 3a 3a 22 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20   "::", or.**.** 
b9d0: 20 20 20 20 34 2e 20 20 49 66 20 6e 6f 6e 65 20      4.  If none 
b9e0: 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68  of the above, th
b9f0: 65 6e 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e  en the last iden
ba00: 74 69 66 69 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  tifier..**.**   
ba10: 49 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  In all of the ab
ba20: 6f 76 65 2c 20 63 65 72 74 61 69 6e 20 72 65 73  ove, certain res
ba30: 65 72 76 65 64 20 77 6f 72 64 73 20 28 6c 69 6b  erved words (lik
ba40: 65 20 22 63 68 61 72 22 29 20 61 72 65 0a 2a 2a  e "char") are.**
ba50: 20 20 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65     not considere
ba60: 64 20 69 64 65 6e 74 69 66 69 65 72 73 2e 0a 2a  d identifiers..*
ba70: 2f 0a 73 74 61 74 69 63 20 54 6f 6b 65 6e 20 2a  /.static Token *
ba80: 46 69 6e 64 44 65 63 6c 4e 61 6d 65 28 54 6f 6b  FindDeclName(Tok
ba90: 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65  en *pFirst, Toke
baa0: 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 6f 6b  n *pLast){.  Tok
bab0: 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20  en *pName = 0;. 
bac0: 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 69 6e 74   Token *p;.  int
bad0: 20 63 3b 0a 0a 20 20 69 66 28 20 70 46 69 72 73   c;..  if( pFirs
bae0: 74 3d 3d 30 20 7c 7c 20 70 4c 61 73 74 3d 3d 30  t==0 || pLast==0
baf0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
bb00: 3b 0a 20 20 7d 0a 20 20 70 4c 61 73 74 20 3d 20  ;.  }.  pLast = 
bb10: 70 4c 61 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLast->pNext;.  
bb20: 66 6f 72 28 70 3d 70 46 69 72 73 74 3b 20 70 20  for(p=pFirst; p 
bb30: 26 26 20 70 21 3d 70 4c 61 73 74 3b 20 70 3d 70  && p!=pLast; p=p
bb40: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
bb50: 28 20 70 2d 3e 65 54 79 70 65 3d 3d 54 54 5f 49  ( p->eType==TT_I
bb60: 64 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69  d ){.      stati
bb70: 63 20 49 64 65 6e 74 54 61 62 6c 65 20 73 52 65  c IdentTable sRe
bb80: 73 65 72 76 65 64 3b 0a 20 20 20 20 20 20 73 74  served;.      st
bb90: 61 74 69 63 20 69 6e 74 20 69 73 49 6e 69 74 20  atic int isInit 
bba0: 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 74 69  = 0;.      stati
bbb0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 57  c const char *aW
bbc0: 6f 72 64 73 5b 5d 20 3d 20 7b 20 22 63 68 61 72  ords[] = { "char
bbd0: 22 2c 20 22 63 6c 61 73 73 22 2c 0a 20 20 20 20  ", "class",.    
bbe0: 20 20 20 22 63 6f 6e 73 74 22 2c 20 22 64 6f 75     "const", "dou
bbf0: 62 6c 65 22 2c 20 22 65 6e 75 6d 22 2c 20 22 65  ble", "enum", "e
bc00: 78 74 65 72 6e 22 2c 20 22 45 58 50 4f 52 54 22  xtern", "EXPORT"
bc10: 2c 20 22 45 54 5f 50 52 4f 43 22 2c 0a 20 20 20  , "ET_PROC",.   
bc20: 20 20 20 20 22 66 6c 6f 61 74 22 2c 20 22 69 6e      "float", "in
bc30: 74 22 2c 20 22 6c 6f 6e 67 22 2c 0a 20 20 20 20  t", "long",.    
bc40: 20 20 20 22 50 52 49 56 41 54 45 22 2c 20 22 50     "PRIVATE", "P
bc50: 52 4f 54 45 43 54 45 44 22 2c 20 22 50 55 42 4c  ROTECTED", "PUBL
bc60: 49 43 22 2c 0a 20 20 20 20 20 20 20 22 72 65 67  IC",.       "reg
bc70: 69 73 74 65 72 22 2c 20 22 73 74 61 74 69 63 22  ister", "static"
bc80: 2c 20 22 73 74 72 75 63 74 22 2c 20 22 73 69 7a  , "struct", "siz
bc90: 65 6f 66 22 2c 20 22 73 69 67 6e 65 64 22 2c 20  eof", "signed", 
bca0: 22 74 79 70 65 64 65 66 22 2c 0a 20 20 20 20 20  "typedef",.     
bcb0: 20 20 22 75 6e 69 6f 6e 22 2c 20 22 76 6f 6c 61    "union", "vola
bcc0: 74 69 6c 65 22 2c 20 22 76 69 72 74 75 61 6c 22  tile", "virtual"
bcd0: 2c 20 22 76 6f 69 64 22 2c 20 7d 3b 0a 0a 20 20  , "void", };..  
bce0: 20 20 20 20 69 66 28 20 21 69 73 49 6e 69 74 20      if( !isInit 
bcf0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
bd00: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
bd10: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 57 6f 72  0; i<sizeof(aWor
bd20: 64 73 29 2f 73 69 7a 65 6f 66 28 61 57 6f 72 64  ds)/sizeof(aWord
bd30: 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  s[0]); i++){.   
bd40: 20 20 20 20 20 20 20 49 64 65 6e 74 54 61 62 6c         IdentTabl
bd50: 65 49 6e 73 65 72 74 28 26 73 52 65 73 65 72 76  eInsert(&sReserv
bd60: 65 64 2c 61 57 6f 72 64 73 5b 69 5d 2c 30 29 3b  ed,aWords[i],0);
bd70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bd80: 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20     isInit = 1;. 
bd90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
bda0: 20 21 49 64 65 6e 74 54 61 62 6c 65 54 65 73 74   !IdentTableTest
bdb0: 28 26 73 52 65 73 65 72 76 65 64 2c 70 2d 3e 7a  (&sReserved,p->z
bdc0: 54 65 78 74 2c 70 2d 3e 6e 54 65 78 74 29 20 29  Text,p->nText) )
bdd0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20  {.        pName 
bde0: 3d 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = p;.      }.   
bdf0: 20 7d 65 6c 73 65 20 69 66 28 20 70 3d 3d 70 46   }else if( p==pF
be00: 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 63 6f  irst ){.      co
be10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73  ntinue;.    }els
be20: 65 20 69 66 28 20 28 63 3d 70 2d 3e 7a 54 65 78  e if( (c=p->zTex
be30: 74 5b 30 5d 29 3d 3d 27 5b 27 20 26 26 20 70 4e  t[0])=='[' && pN
be40: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 62 72 65  ame ){.      bre
be50: 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ak;.    }else if
be60: 28 20 63 3d 3d 27 28 27 20 26 26 20 70 2d 3e 70  ( c=='(' && p->p
be70: 4e 65 78 74 20 26 26 20 70 2d 3e 70 4e 65 78 74  Next && p->pNext
be80: 2d 3e 65 54 79 70 65 3d 3d 54 54 5f 49 64 20 26  ->eType==TT_Id &
be90: 26 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  & pName ){.     
bea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
beb0: 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20  e if( c==':' && 
bec0: 70 2d 3e 7a 54 65 78 74 5b 31 5d 3d 3d 27 3a 27  p->zText[1]==':'
bed0: 20 26 26 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20   && pName ){.   
bee0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bef0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 61    }.  return pNa
bf00: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  me;.}../*.** Thi
bf10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
bf20: 6c 65 64 20 77 68 65 6e 20 77 65 20 73 65 65 20  led when we see 
bf30: 61 20 6d 65 74 68 6f 64 20 66 6f 72 20 61 20 63  a method for a c
bf40: 6c 61 73 73 20 74 68 61 74 20 62 65 67 69 6e 73  lass that begins
bf50: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 50 55 42  .** with the PUB
bf60: 4c 49 43 2c 20 50 52 49 56 41 54 45 2c 20 6f 72  LIC, PRIVATE, or
bf70: 20 50 52 4f 54 45 43 54 45 44 20 6b 65 79 77 6f   PROTECTED keywo
bf80: 72 64 73 2e 20 20 53 75 63 68 20 6d 65 74 68 6f  rds.  Such metho
bf90: 64 73 20 61 72 65 0a 2a 2a 20 61 64 64 65 64 20  ds are.** added 
bfa0: 74 6f 20 74 68 65 69 72 20 63 6c 61 73 73 20 64  to their class d
bfb0: 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 73  efinitions..*/.s
bfc0: 74 61 74 69 63 20 69 6e 74 20 50 72 6f 63 65 73  tatic int Proces
bfd0: 73 4d 65 74 68 6f 64 44 65 66 28 54 6f 6b 65 6e  sMethodDef(Token
bfe0: 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20   *pFirst, Token 
bff0: 2a 70 4c 61 73 74 2c 20 69 6e 74 20 66 6c 61 67  *pLast, int flag
c000: 73 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6c  s){.  Token *pCl
c010: 61 73 73 3b 0a 20 20 63 68 61 72 20 2a 7a 44 65  ass;.  char *zDe
c020: 63 6c 3b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63  cl;.  Decl *pDec
c030: 6c 3b 0a 20 20 53 74 72 69 6e 67 20 73 74 72 3b  l;.  String str;
c040: 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 0a 20 20  .  int type;..  
c050: 70 4c 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70  pLast = pLast->p
c060: 50 72 65 76 3b 0a 20 20 77 68 69 6c 65 28 20 70  Prev;.  while( p
c070: 46 69 72 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d  First->zText[0]=
c080: 3d 27 50 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='P' ){.    int 
c090: 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 77 69 74  rc = 1;.    swit
c0a0: 63 68 28 20 70 46 69 72 73 74 2d 3e 6e 54 65 78  ch( pFirst->nTex
c0b0: 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  t ){.      case 
c0c0: 36 3a 20 20 72 63 20 3d 20 73 74 72 6e 63 6d 70  6:  rc = strncmp
c0d0: 28 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22  (pFirst->zText,"
c0e0: 50 55 42 4c 49 43 22 2c 36 29 3b 20 62 72 65 61  PUBLIC",6); brea
c0f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 37 3a  k;.      case 7:
c100: 20 20 72 63 20 3d 20 73 74 72 6e 63 6d 70 28 70    rc = strncmp(p
c110: 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 50 52  First->zText,"PR
c120: 49 56 41 54 45 22 2c 37 29 3b 20 62 72 65 61 6b  IVATE",7); break
c130: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 39 3a 20  ;.      case 9: 
c140: 20 72 63 20 3d 20 73 74 72 6e 63 6d 70 28 70 46   rc = strncmp(pF
c150: 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 50 52 4f  irst->zText,"PRO
c160: 54 45 43 54 45 44 22 2c 39 29 3b 20 62 72 65 61  TECTED",9); brea
c170: 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  k;.      default
c180: 3a 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  :  break;.    }.
c190: 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
c1a0: 61 6b 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d  ak;.    pFirst =
c1b0: 20 70 46 69 72 73 74 2d 3e 70 4e 65 78 74 3b 0a   pFirst->pNext;.
c1c0: 20 20 7d 0a 20 20 70 43 6c 61 73 73 20 3d 20 46    }.  pClass = F
c1d0: 69 6e 64 44 65 63 6c 4e 61 6d 65 28 70 46 69 72  indDeclName(pFir
c1e0: 73 74 2c 70 4c 61 73 74 29 3b 0a 20 20 69 66 28  st,pLast);.  if(
c1f0: 20 70 43 6c 61 73 73 3d 3d 30 20 29 7b 0a 20 20   pClass==0 ){.  
c200: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
c210: 2c 22 25 73 3a 25 64 3a 20 55 6e 61 62 6c 65 20  ,"%s:%d: Unable 
c220: 74 6f 20 66 69 6e 64 20 74 68 65 20 63 6c 61 73  to find the clas
c230: 73 20 6e 61 6d 65 20 66 6f 72 20 74 68 69 73 20  s name for this 
c240: 6d 65 74 68 6f 64 5c 6e 22 2c 0a 20 20 20 20 20  method\n",.     
c250: 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69    zFilename, pFi
c260: 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20  rst->nLine);.   
c270: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
c280: 20 70 44 65 63 6c 20 3d 20 46 69 6e 64 44 65 63   pDecl = FindDec
c290: 6c 28 70 43 6c 61 73 73 2d 3e 7a 54 65 78 74 2c  l(pClass->zText,
c2a0: 20 70 43 6c 61 73 73 2d 3e 6e 54 65 78 74 29 3b   pClass->nText);
c2b0: 0a 20 20 69 66 28 20 70 44 65 63 6c 3d 3d 30 20  .  if( pDecl==0 
c2c0: 7c 7c 20 28 70 44 65 63 6c 2d 3e 66 6c 61 67 73  || (pDecl->flags
c2d0: 20 26 20 54 59 5f 43 6c 61 73 73 29 21 3d 54 59   & TY_Class)!=TY
c2e0: 5f 43 6c 61 73 73 20 29 7b 0a 20 20 20 20 70 44  _Class ){.    pD
c2f0: 65 63 6c 20 3d 20 43 72 65 61 74 65 44 65 63 6c  ecl = CreateDecl
c300: 28 70 43 6c 61 73 73 2d 3e 7a 54 65 78 74 2c 20  (pClass->zText, 
c310: 70 43 6c 61 73 73 2d 3e 6e 54 65 78 74 29 3b 0a  pClass->nText);.
c320: 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65      DeclSetPrope
c330: 72 74 79 28 70 44 65 63 6c 2c 20 54 59 5f 43 6c  rty(pDecl, TY_Cl
c340: 61 73 73 29 3b 0a 20 20 7d 0a 20 20 53 74 72 69  ass);.  }.  Stri
c350: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
c360: 69 66 28 20 70 44 65 63 6c 2d 3e 7a 45 78 74 72  if( pDecl->zExtr
c370: 61 20 29 7b 0a 20 20 20 20 53 74 72 69 6e 67 41  a ){.    StringA
c380: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 65 63  ppend(&str, pDec
c390: 6c 2d 3e 7a 45 78 74 72 61 2c 20 30 29 3b 0a 20  l->zExtra, 0);. 
c3a0: 20 20 20 53 61 66 65 46 72 65 65 28 70 44 65 63     SafeFree(pDec
c3b0: 6c 2d 3e 7a 45 78 74 72 61 29 3b 0a 20 20 20 20  l->zExtra);.    
c3c0: 70 44 65 63 6c 2d 3e 7a 45 78 74 72 61 20 3d 20  pDecl->zExtra = 
c3d0: 30 3b 0a 20 20 7d 0a 20 20 74 79 70 65 20 3d 20  0;.  }.  type = 
c3e0: 66 6c 61 67 73 20 26 20 50 53 5f 50 50 50 3b 0a  flags & PS_PPP;.
c3f0: 20 20 69 66 28 20 70 44 65 63 6c 2d 3e 65 78 74    if( pDecl->ext
c400: 72 61 54 79 70 65 21 3d 74 79 70 65 20 29 7b 0a  raType!=type ){.
c410: 20 20 20 20 69 66 28 20 74 79 70 65 20 26 20 50      if( type & P
c420: 53 5f 50 75 62 6c 69 63 20 29 7b 0a 20 20 20 20  S_Public ){.    
c430: 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26    StringAppend(&
c440: 73 74 72 2c 20 22 70 75 62 6c 69 63 3a 5c 6e 22  str, "public:\n"
c450: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 44 65 63  , 0);.      pDec
c460: 6c 2d 3e 65 78 74 72 61 54 79 70 65 20 3d 20 50  l->extraType = P
c470: 53 5f 50 75 62 6c 69 63 3b 0a 20 20 20 20 7d 65  S_Public;.    }e
c480: 6c 73 65 20 69 66 28 20 74 79 70 65 20 26 20 50  lse if( type & P
c490: 53 5f 50 72 6f 74 65 63 74 65 64 20 29 7b 0a 20  S_Protected ){. 
c4a0: 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e       StringAppen
c4b0: 64 28 26 73 74 72 2c 20 22 70 72 6f 74 65 63 74  d(&str, "protect
c4c0: 65 64 3a 5c 6e 22 2c 20 30 29 3b 0a 20 20 20 20  ed:\n", 0);.    
c4d0: 20 20 70 44 65 63 6c 2d 3e 65 78 74 72 61 54 79    pDecl->extraTy
c4e0: 70 65 20 3d 20 50 53 5f 50 72 6f 74 65 63 74 65  pe = PS_Protecte
c4f0: 64 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  d;.    }else if(
c500: 20 74 79 70 65 20 26 20 50 53 5f 50 72 69 76 61   type & PS_Priva
c510: 74 65 20 29 7b 0a 20 20 20 20 20 20 53 74 72 69  te ){.      Stri
c520: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22  ngAppend(&str, "
c530: 70 72 69 76 61 74 65 3a 5c 6e 22 2c 20 30 29 3b  private:\n", 0);
c540: 0a 20 20 20 20 20 20 70 44 65 63 6c 2d 3e 65 78  .      pDecl->ex
c550: 74 72 61 54 79 70 65 20 3d 20 50 53 5f 50 72 69  traType = PS_Pri
c560: 76 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  vate;.    }.  }.
c570: 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26    StringAppend(&
c580: 73 74 72 2c 20 22 20 20 22 2c 20 30 29 3b 0a 20  str, "  ", 0);. 
c590: 20 7a 44 65 63 6c 20 3d 20 54 6f 6b 65 6e 73 54   zDecl = TokensT
c5a0: 6f 53 74 72 69 6e 67 28 70 46 69 72 73 74 2c 20  oString(pFirst, 
c5b0: 70 4c 61 73 74 2c 20 22 3b 5c 6e 22 2c 20 70 43  pLast, ";\n", pC
c5c0: 6c 61 73 73 2c 20 32 29 3b 0a 20 20 53 74 72 69  lass, 2);.  Stri
c5d0: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 7a  ngAppend(&str, z
c5e0: 44 65 63 6c 2c 20 30 29 3b 0a 20 20 53 61 66 65  Decl, 0);.  Safe
c5f0: 46 72 65 65 28 7a 44 65 63 6c 29 3b 0a 20 20 70  Free(zDecl);.  p
c600: 44 65 63 6c 2d 3e 7a 45 78 74 72 61 20 3d 20 53  Decl->zExtra = S
c610: 74 72 44 75 70 28 53 74 72 69 6e 67 47 65 74 28  trDup(StringGet(
c620: 26 73 74 72 29 2c 20 30 29 3b 0a 20 20 53 74 72  &str), 0);.  Str
c630: 69 6e 67 52 65 73 65 74 28 26 73 74 72 29 3b 0a  ingReset(&str);.
c640: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c650: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c660: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
c670: 20 77 65 20 73 65 65 20 61 20 66 75 6e 63 74 69   we see a functi
c680: 6f 6e 20 6f 72 20 70 72 6f 63 65 64 75 72 65 20  on or procedure 
c690: 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2a 20 57  definition..** W
c6a0: 65 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  e make an entry 
c6b0: 69 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  in the declarati
c6c0: 6f 6e 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  on table that is
c6d0: 20 61 20 70 72 6f 74 6f 74 79 70 65 20 66 6f 72   a prototype for
c6e0: 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
c6f0: 6e 20 6f 72 20 70 72 6f 63 65 64 75 72 65 2e 0a  n or procedure..
c700: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 50 72  */.static int Pr
c710: 6f 63 65 73 73 50 72 6f 63 65 64 75 72 65 44 65  ocessProcedureDe
c720: 66 28 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c  f(Token *pFirst,
c730: 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 2c 20 69   Token *pLast, i
c740: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 54 6f 6b  nt flags){.  Tok
c750: 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 44 65 63  en *pName;.  Dec
c760: 6c 20 2a 70 44 65 63 6c 3b 0a 20 20 54 6f 6b 65  l *pDecl;.  Toke
c770: 6e 20 2a 70 43 6f 64 65 3b 0a 0a 20 20 69 66 28  n *pCode;..  if(
c780: 20 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 70 4c   pFirst==0 || pL
c790: 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ast==0 ){.    re
c7a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
c7b0: 28 20 66 6c 61 67 73 20 26 20 50 53 5f 4d 65 74  ( flags & PS_Met
c7c0: 68 6f 64 20 29 7b 0a 20 20 20 20 69 66 28 20 66  hod ){.    if( f
c7d0: 6c 61 67 73 20 26 20 50 53 5f 50 50 50 20 29 7b  lags & PS_PPP ){
c7e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 50 72  .      return Pr
c7f0: 6f 63 65 73 73 4d 65 74 68 6f 64 44 65 66 28 70  ocessMethodDef(p
c800: 46 69 72 73 74 2c 20 70 4c 61 73 74 2c 20 66 6c  First, pLast, fl
c810: 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ags);.    }else{
c820: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
c830: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c840: 20 28 66 6c 61 67 73 20 26 20 50 53 5f 53 74 61   (flags & PS_Sta
c850: 74 69 63 29 21 3d 30 20 26 26 20 21 70 72 6f 74  tic)!=0 && !prot
c860: 6f 5f 73 74 61 74 69 63 20 29 7b 0a 20 20 20 20  o_static ){.    
c870: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c880: 70 43 6f 64 65 20 3d 20 70 4c 61 73 74 3b 0a 20  pCode = pLast;. 
c890: 20 77 68 69 6c 65 28 20 70 4c 61 73 74 20 26 26   while( pLast &&
c8a0: 20 70 4c 61 73 74 21 3d 70 46 69 72 73 74 20 26   pLast!=pFirst &
c8b0: 26 20 70 4c 61 73 74 2d 3e 7a 54 65 78 74 5b 30  & pLast->zText[0
c8c0: 5d 21 3d 27 29 27 20 29 7b 0a 20 20 20 20 70 4c  ]!=')' ){.    pL
c8d0: 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70 50 72  ast = pLast->pPr
c8e0: 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ev;.  }.  if( pL
c8f0: 61 73 74 3d 3d 30 20 7c 7c 20 70 4c 61 73 74 3d  ast==0 || pLast=
c900: 3d 70 46 69 72 73 74 20 7c 7c 20 70 46 69 72 73  =pFirst || pFirs
c910: 74 2d 3e 70 4e 65 78 74 3d 3d 70 4c 61 73 74 20  t->pNext==pLast 
c920: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
c930: 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 55 6e  tderr,"%s:%d: Un
c940: 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 6e 74 61  recognized synta
c950: 78 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 46 69  x.\n",.      zFi
c960: 6c 65 6e 61 6d 65 2c 20 70 46 69 72 73 74 2d 3e  lename, pFirst->
c970: 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 72 65 74 75  nLine);.    retu
c980: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
c990: 66 6c 61 67 73 20 26 20 28 50 53 5f 49 6e 74 65  flags & (PS_Inte
c9a0: 72 66 61 63 65 7c 50 53 5f 45 78 70 6f 72 74 7c  rface|PS_Export|
c9b0: 50 53 5f 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20  PS_Local) ){.   
c9c0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
c9d0: 22 25 73 3a 25 64 3a 20 4d 69 73 73 69 6e 67 20  "%s:%d: Missing 
c9e0: 5c 22 69 6e 6c 69 6e 65 5c 22 20 6f 6e 20 66 75  \"inline\" on fu
c9f0: 6e 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 64  nction or proced
ca00: 75 72 65 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a  ure.\n",.      z
ca10: 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 72 73 74  Filename, pFirst
ca20: 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 72 65  ->nLine);.    re
ca30: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 4e  turn 1;.  }.  pN
ca40: 61 6d 65 20 3d 20 46 69 6e 64 44 65 63 6c 4e 61  ame = FindDeclNa
ca50: 6d 65 28 70 46 69 72 73 74 2c 70 4c 61 73 74 29  me(pFirst,pLast)
ca60: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30  ;.  if( pName==0
ca70: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
ca80: 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 4d  stderr,"%s:%d: M
ca90: 61 6c 66 6f 72 6d 65 64 20 66 75 6e 63 74 69 6f  alformed functio
caa0: 6e 20 6f 72 20 70 72 6f 63 65 64 75 72 65 20 64  n or procedure d
cab0: 65 66 69 6e 69 74 69 6f 6e 2e 5c 6e 22 2c 0a 20  efinition.\n",. 
cac0: 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20       zFilename, 
cad0: 70 46 69 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a  pFirst->nLine);.
cae0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
caf0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 74 20  }..  /*.  ** At 
cb00: 74 68 69 73 20 70 6f 69 6e 74 20 77 65 27 76 65  this point we've
cb10: 20 69 73 6f 6c 61 74 65 64 20 61 20 70 72 6f 63   isolated a proc
cb20: 65 64 75 72 65 20 64 65 63 6c 61 72 61 74 69 6f  edure declaratio
cb30: 6e 20 62 65 74 77 65 65 6e 20 70 46 69 72 73 74  n between pFirst
cb40: 0a 20 20 2a 2a 20 61 6e 64 20 70 4c 61 73 74 20  .  ** and pLast 
cb50: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 70 4e  with the name pN
cb60: 61 6d 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ame..  */.#ifdef
cb70: 20 44 45 42 55 47 0a 20 20 69 66 28 20 64 65 62   DEBUG.  if( deb
cb80: 75 67 4d 61 73 6b 20 26 20 50 41 52 53 45 52 20  ugMask & PARSER 
cb90: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2a  ){.    printf("*
cba0: 2a 2a 2a 20 46 6f 75 6e 64 20 72 6f 75 74 69 6e  *** Found routin
cbb0: 65 3a 20 25 2e 2a 73 20 6f 6e 20 6c 69 6e 65 20  e: %.*s on line 
cbc0: 25 64 2e 2e 2e 5c 6e 22 2c 20 70 4e 61 6d 65 2d  %d...\n", pName-
cbd0: 3e 6e 54 65 78 74 2c 0a 20 20 20 20 20 20 20 70  >nText,.       p
cbe0: 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 20 70 46 69  Name->zText, pFi
cbf0: 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20  rst->nLine);.   
cc00: 20 50 72 69 6e 74 54 6f 6b 65 6e 73 28 70 46 69   PrintTokens(pFi
cc10: 72 73 74 2c 70 4c 61 73 74 29 3b 0a 20 20 20 20  rst,pLast);.    
cc20: 70 72 69 6e 74 66 28 22 3b 5c 6e 22 29 3b 0a 20  printf(";\n");. 
cc30: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 44 65 63   }.#endif.  pDec
cc40: 6c 20 3d 20 43 72 65 61 74 65 44 65 63 6c 28 70  l = CreateDecl(p
cc50: 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 70 4e 61 6d  Name->zText,pNam
cc60: 65 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 70 44 65  e->nText);.  pDe
cc70: 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20 3d 20 70  cl->pComment = p
cc80: 46 69 72 73 74 2d 3e 70 43 6f 6d 6d 65 6e 74 3b  First->pComment;
cc90: 0a 20 20 69 66 28 20 70 43 6f 64 65 20 26 26 20  .  if( pCode && 
cca0: 70 43 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 54 54  pCode->eType==TT
ccb0: 5f 42 72 61 63 65 73 20 29 7b 0a 20 20 20 20 70  _Braces ){.    p
ccc0: 44 65 63 6c 2d 3e 74 6f 6b 65 6e 43 6f 64 65 20  Decl->tokenCode 
ccd0: 3d 20 2a 70 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  = *pCode;.  }.  
cce0: 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28  DeclSetProperty(
ccf0: 70 44 65 63 6c 2c 54 59 5f 53 75 62 72 6f 75 74  pDecl,TY_Subrout
cd00: 69 6e 65 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a  ine);.  pDecl->z
cd10: 44 65 63 6c 20 3d 20 54 6f 6b 65 6e 73 54 6f 53  Decl = TokensToS
cd20: 74 72 69 6e 67 28 70 46 69 72 73 74 2c 70 4c 61  tring(pFirst,pLa
cd30: 73 74 2c 22 3b 5c 6e 22 2c 30 2c 30 29 3b 0a 20  st,";\n",0,0);. 
cd40: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 50   if( (flags & (P
cd50: 53 5f 53 74 61 74 69 63 7c 50 53 5f 4c 6f 63 61  S_Static|PS_Loca
cd60: 6c 32 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 44  l2))!=0 ){.    D
cd70: 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70  eclSetProperty(p
cd80: 44 65 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29 3b 0a  Decl,DP_Local);.
cd90: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
cda0: 67 73 20 26 20 28 50 53 5f 45 78 70 6f 72 74 32  gs & (PS_Export2
cdb0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 44 65 63  ))!=0 ){.    Dec
cdc0: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65  lSetProperty(pDe
cdd0: 63 6c 2c 44 50 5f 45 78 70 6f 72 74 29 3b 0a 20  cl,DP_Export);. 
cde0: 20 7d 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20   }..  if( flags 
cdf0: 26 20 44 50 5f 43 70 6c 75 73 70 6c 75 73 20 29  & DP_Cplusplus )
ce00: 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f  {.    DeclSetPro
ce10: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 43  perty(pDecl,DP_C
ce20: 70 6c 75 73 70 6c 75 73 29 3b 0a 20 20 7d 65 6c  plusplus);.  }el
ce30: 73 65 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50  se{.    DeclSetP
ce40: 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50  roperty(pDecl,DP
ce50: 5f 45 78 74 65 72 6e 43 52 65 71 64 29 3b 0a 20  _ExternCReqd);. 
ce60: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
ce70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ce80: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
ce90: 77 68 65 6e 65 76 65 72 20 77 65 20 73 65 65 20  whenever we see 
cea0: 74 68 65 20 22 69 6e 6c 69 6e 65 22 20 6b 65 79  the "inline" key
ceb0: 77 6f 72 64 2e 20 20 57 65 0a 2a 2a 20 6e 65 65  word.  We.** nee
cec0: 64 20 74 6f 20 73 65 65 6b 2d 6f 75 74 20 74 68  d to seek-out th
ced0: 65 20 69 6e 6c 69 6e 65 20 66 75 6e 63 74 69 6f  e inline functio
cee0: 6e 20 6f 72 20 70 72 6f 63 65 64 75 72 65 20 61  n or procedure a
cef0: 6e 64 20 6d 61 6b 65 20 61 0a 2a 2a 20 64 65 63  nd make a.** dec
cf00: 6c 61 72 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20  laration out of 
cf10: 74 68 65 20 65 6e 74 69 72 65 20 64 65 66 69 6e  the entire defin
cf20: 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
cf30: 20 69 6e 74 20 50 72 6f 63 65 73 73 49 6e 6c 69   int ProcessInli
cf40: 6e 65 50 72 6f 63 28 54 6f 6b 65 6e 20 2a 70 46  neProc(Token *pF
cf50: 69 72 73 74 2c 20 69 6e 74 20 66 6c 61 67 73 2c  irst, int flags,
cf60: 20 69 6e 74 20 2a 70 52 65 73 65 74 29 7b 0a 20   int *pReset){. 
cf70: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20   Token *pName;. 
cf80: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 3b 0a 20 20   Token *pEnd;.  
cf90: 44 65 63 6c 20 2a 70 44 65 63 6c 3b 0a 0a 20 20  Decl *pDecl;..  
cfa0: 66 6f 72 28 70 45 6e 64 3d 70 46 69 72 73 74 3b  for(pEnd=pFirst;
cfb0: 20 70 45 6e 64 3b 20 70 45 6e 64 20 3d 20 70 45   pEnd; pEnd = pE
cfc0: 6e 64 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  nd->pNext){.    
cfd0: 69 66 28 20 70 45 6e 64 2d 3e 7a 54 65 78 74 5b  if( pEnd->zText[
cfe0: 30 5d 3d 3d 27 7b 27 20 7c 7c 20 70 45 6e 64 2d  0]=='{' || pEnd-
cff0: 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 3b 27 20 29  >zText[0]==';' )
d000: 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 65 74 20  {.      *pReset 
d010: 3d 20 70 45 6e 64 2d 3e 7a 54 65 78 74 5b 30 5d  = pEnd->zText[0]
d020: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d030: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
d040: 45 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  End==0 ){.    *p
d050: 52 65 73 65 74 20 3d 20 27 3b 27 3b 0a 20 20 20  Reset = ';';.   
d060: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
d070: 22 25 73 3a 25 64 3a 20 69 6e 63 6f 6d 70 6c 65  "%s:%d: incomple
d080: 74 65 20 69 6e 6c 69 6e 65 20 70 72 6f 63 65 64  te inline proced
d090: 75 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 5c 6e  ure definition\n
d0a0: 22 2c 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  ",.      zFilena
d0b0: 6d 65 2c 20 70 46 69 72 73 74 2d 3e 6e 4c 69 6e  me, pFirst->nLin
d0c0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
d0d0: 3b 0a 20 20 7d 0a 20 20 70 4e 61 6d 65 20 3d 20  ;.  }.  pName = 
d0e0: 46 69 6e 64 44 65 63 6c 4e 61 6d 65 28 70 46 69  FindDeclName(pFi
d0f0: 72 73 74 2c 70 45 6e 64 29 3b 0a 20 20 69 66 28  rst,pEnd);.  if(
d100: 20 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   pName==0 ){.   
d110: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
d120: 22 25 73 3a 25 64 3a 20 6d 61 6c 66 6f 72 6d 65  "%s:%d: malforme
d130: 64 20 69 6e 6c 69 6e 65 20 70 72 6f 63 65 64 75  d inline procedu
d140: 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 5c 6e 22  re definition\n"
d150: 2c 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  ,.      zFilenam
d160: 65 2c 20 70 46 69 72 73 74 2d 3e 6e 4c 69 6e 65  e, pFirst->nLine
d170: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
d180: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 44 45 42  .  }..#ifdef DEB
d190: 55 47 0a 20 20 69 66 28 20 64 65 62 75 67 4d 61  UG.  if( debugMa
d1a0: 73 6b 20 26 20 50 41 52 53 45 52 20 29 7b 0a 20  sk & PARSER ){. 
d1b0: 20 20 20 70 72 69 6e 74 66 28 22 2a 2a 2a 2a 20     printf("**** 
d1c0: 46 6f 75 6e 64 20 69 6e 6c 69 6e 65 20 72 6f 75  Found inline rou
d1d0: 74 69 6e 65 3a 20 25 2e 2a 73 20 6f 6e 20 6c 69  tine: %.*s on li
d1e0: 6e 65 20 25 64 2e 2e 2e 5c 6e 22 2c 0a 20 20 20  ne %d...\n",.   
d1f0: 20 20 20 20 70 4e 61 6d 65 2d 3e 6e 54 65 78 74      pName->nText
d200: 2c 20 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 20  , pName->zText, 
d210: 70 46 69 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a  pFirst->nLine);.
d220: 20 20 20 20 50 72 69 6e 74 54 6f 6b 65 6e 73 28      PrintTokens(
d230: 70 46 69 72 73 74 2c 70 45 6e 64 29 3b 0a 20 20  pFirst,pEnd);.  
d240: 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a    printf("\n");.
d250: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 44 65    }.#endif.  pDe
d260: 63 6c 20 3d 20 43 72 65 61 74 65 44 65 63 6c 28  cl = CreateDecl(
d270: 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 70 4e 61  pName->zText,pNa
d280: 6d 65 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 70 44  me->nText);.  pD
d290: 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20 3d 20  ecl->pComment = 
d2a0: 70 46 69 72 73 74 2d 3e 70 43 6f 6d 6d 65 6e 74  pFirst->pComment
d2b0: 3b 0a 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65  ;.  DeclSetPrope
d2c0: 72 74 79 28 70 44 65 63 6c 2c 54 59 5f 53 75 62  rty(pDecl,TY_Sub
d2d0: 72 6f 75 74 69 6e 65 29 3b 0a 20 20 70 44 65 63  routine);.  pDec
d2e0: 6c 2d 3e 7a 44 65 63 6c 20 3d 20 54 6f 6b 65 6e  l->zDecl = Token
d2f0: 73 54 6f 53 74 72 69 6e 67 28 70 46 69 72 73 74  sToString(pFirst
d300: 2c 70 45 6e 64 2c 22 3b 5c 6e 22 2c 30 2c 30 29  ,pEnd,";\n",0,0)
d310: 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20 26  ;.  if( (flags &
d320: 20 28 50 53 5f 53 74 61 74 69 63 7c 50 53 5f 4c   (PS_Static|PS_L
d330: 6f 63 61 6c 7c 50 53 5f 4c 6f 63 61 6c 32 29 29  ocal|PS_Local2))
d340: 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50   ){.    DeclSetP
d350: 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50  roperty(pDecl,DP
d360: 5f 4c 6f 63 61 6c 29 3b 0a 20 20 7d 65 6c 73 65  _Local);.  }else
d370: 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 50 53   if( flags & (PS
d380: 5f 45 78 70 6f 72 74 7c 50 53 5f 45 78 70 6f 72  _Export|PS_Expor
d390: 74 32 29 20 29 7b 0a 20 20 20 20 44 65 63 6c 53  t2) ){.    DeclS
d3a0: 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c  etProperty(pDecl
d3b0: 2c 44 50 5f 45 78 70 6f 72 74 29 3b 0a 20 20 7d  ,DP_Export);.  }
d3c0: 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ..  if( flags & 
d3d0: 44 50 5f 43 70 6c 75 73 70 6c 75 73 20 29 7b 0a  DP_Cplusplus ){.
d3e0: 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65      DeclSetPrope
d3f0: 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 43 70 6c  rty(pDecl,DP_Cpl
d400: 75 73 70 6c 75 73 29 3b 0a 20 20 7d 65 6c 73 65  usplus);.  }else
d410: 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f  {.    DeclSetPro
d420: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45  perty(pDecl,DP_E
d430: 78 74 65 72 6e 43 52 65 71 64 29 3b 0a 20 20 7d  xternCReqd);.  }
d440: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
d450: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
d460: 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 73 20 62   if the tokens b
d470: 65 74 77 65 65 6e 20 70 46 69 72 73 74 20 61 6e  etween pFirst an
d480: 64 20 70 45 6e 64 20 66 6f 72 6d 20 61 20 76 61  d pEnd form a va
d490: 72 69 61 62 6c 65 0a 2a 2a 20 64 65 66 69 6e 69  riable.** defini
d4a0: 74 69 6f 6e 20 6f 72 20 61 20 66 75 6e 63 74 69  tion or a functi
d4b0: 6f 6e 20 70 72 6f 74 6f 74 79 70 65 2e 20 20 52  on prototype.  R
d4c0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 77 65  eturn TRUE if we
d4d0: 20 61 72 65 20 64 65 61 6c 69 6e 67 0a 2a 2a 20   are dealing.** 
d4e0: 77 69 74 68 20 61 20 76 61 72 69 61 62 6c 65 20  with a variable 
d4f0: 64 65 66 69 6e 74 69 6f 6e 20 61 6e 64 20 46 41  defintion and FA
d500: 4c 53 45 20 66 6f 72 20 61 20 70 72 6f 74 6f 74  LSE for a protot
d510: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 70 45 6e 64 20  ype..**.** pEnd 
d520: 69 73 20 74 68 65 20 74 6f 6b 65 6e 20 74 68 61  is the token tha
d530: 74 20 65 6e 64 73 20 74 68 65 20 6f 62 6a 65 63  t ends the objec
d540: 74 2e 20 20 49 74 20 63 61 6e 20 62 65 20 65 69  t.  It can be ei
d550: 74 68 65 72 20 61 20 27 3b 27 20 6f 72 0a 2a 2a  ther a ';' or.**
d560: 20 61 20 27 3d 27 2e 20 20 49 66 20 69 74 20 69   a '='.  If it i
d570: 73 20 27 3d 27 2c 20 74 68 65 6e 20 61 73 73 75  s '=', then assu
d580: 6d 65 20 77 65 20 68 61 76 65 20 61 20 76 61 72  me we have a var
d590: 69 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  iable definition
d5a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 6e 64 20  ..**.** If pEnd 
d5b0: 69 73 20 27 3b 27 2c 20 74 68 65 6e 20 74 68 65  is ';', then the
d5c0: 20 64 65 74 65 72 6d 69 6e 61 74 69 6f 6e 20 69   determination i
d5d0: 73 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74  s more difficult
d5e0: 2e 20 20 57 65 20 68 61 76 65 0a 2a 2a 20 74 6f  .  We have.** to
d5f0: 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 6f   search for an o
d600: 63 63 75 72 72 65 6e 63 65 20 6f 66 20 61 6e 20  ccurrence of an 
d610: 49 44 20 66 6f 6c 6c 6f 77 65 64 20 69 6d 6d 65  ID followed imme
d620: 64 69 61 74 65 6c 79 20 62 79 20 27 28 27 2e 0a  diately by '('..
d630: 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 77 65 20  ** If found, we 
d640: 68 61 76 65 20 61 20 70 72 6f 74 6f 74 79 70 65  have a prototype
d650: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 77 65 20  .  Otherwise we 
d660: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
d670: 20 61 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 64   a.** variable d
d680: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  efinition..*/.st
d690: 61 74 69 63 20 69 6e 74 20 69 73 56 61 72 69 61  atic int isVaria
d6a0: 62 6c 65 44 65 66 28 54 6f 6b 65 6e 20 2a 70 46  bleDef(Token *pF
d6b0: 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e  irst, Token *pEn
d6c0: 64 29 7b 0a 20 20 69 66 28 20 70 45 6e 64 20 26  d){.  if( pEnd &
d6d0: 26 20 70 45 6e 64 2d 3e 7a 54 65 78 74 5b 30 5d  & pEnd->zText[0]
d6e0: 3d 3d 27 3d 27 20 26 26 0a 20 20 20 20 28 70 45  =='=' &&.    (pE
d6f0: 6e 64 2d 3e 70 50 72 65 76 2d 3e 6e 54 65 78 74  nd->pPrev->nText
d700: 21 3d 38 20 7c 7c 20 73 74 72 6e 63 6d 70 28 70  !=8 || strncmp(p
d710: 45 6e 64 2d 3e 70 50 72 65 76 2d 3e 7a 54 65 78  End->pPrev->zTex
d720: 74 2c 22 6f 70 65 72 61 74 6f 72 22 2c 38 29 21  t,"operator",8)!
d730: 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  =0).  ){.    ret
d740: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 77 68 69  urn 1;.  }.  whi
d750: 6c 65 28 20 70 46 69 72 73 74 20 26 26 20 70 46  le( pFirst && pF
d760: 69 72 73 74 21 3d 70 45 6e 64 20 26 26 20 70 46  irst!=pEnd && pF
d770: 69 72 73 74 2d 3e 70 4e 65 78 74 20 26 26 20 70  irst->pNext && p
d780: 46 69 72 73 74 2d 3e 70 4e 65 78 74 21 3d 70 45  First->pNext!=pE
d790: 6e 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  nd ){.    if( pF
d7a0: 69 72 73 74 2d 3e 65 54 79 70 65 3d 3d 54 54 5f  irst->eType==TT_
d7b0: 49 64 20 26 26 20 70 46 69 72 73 74 2d 3e 70 4e  Id && pFirst->pN
d7c0: 65 78 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27  ext->zText[0]=='
d7d0: 28 27 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  (' ){.      retu
d7e0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
d7f0: 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
d800: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  >pNext;.  }.  re
d810: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
d820: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
d830: 70 46 69 72 73 74 20 69 73 20 74 68 65 20 66 69  pFirst is the fi
d840: 72 73 74 20 74 6f 6b 65 6e 20 6f 66 20 61 20 73  rst token of a s
d850: 74 61 74 69 63 20 61 73 73 65 72 74 2e 0a 2a 2f  tatic assert..*/
d860: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53 74  .static int isSt
d870: 61 74 69 63 41 73 73 65 72 74 28 54 6f 6b 65 6e  aticAssert(Token
d880: 20 2a 70 46 69 72 73 74 29 7b 0a 20 20 69 66 28   *pFirst){.  if(
d890: 20 28 70 46 69 72 73 74 2d 3e 6e 54 65 78 74 3d   (pFirst->nText=
d8a0: 3d 31 33 20 26 26 20 73 74 72 6e 63 6d 70 28 70  =13 && strncmp(p
d8b0: 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 20 22 73  First->zText, "s
d8c0: 74 61 74 69 63 5f 61 73 73 65 72 74 22 2c 20 31  tatic_assert", 1
d8d0: 33 29 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 70 46  3)==0).   || (pF
d8e0: 69 72 73 74 2d 3e 6e 54 65 78 74 3d 3d 31 34 20  irst->nText==14 
d8f0: 26 26 20 73 74 72 6e 63 6d 70 28 70 46 69 72 73  && strncmp(pFirs
d900: 74 2d 3e 7a 54 65 78 74 2c 20 22 5f 53 74 61 74  t->zText, "_Stat
d910: 69 63 5f 61 73 73 65 72 74 22 2c 20 31 34 29 3d  ic_assert", 14)=
d920: 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  =0).  ){.    ret
d930: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
d940: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d950: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
d960: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d970: 64 20 77 68 65 6e 65 76 65 72 20 77 65 20 65 6e  d whenever we en
d980: 63 6f 75 6e 74 65 72 20 61 20 22 3b 22 20 6f 72  counter a ";" or
d990: 20 22 3d 22 2e 20 20 54 68 65 20 73 74 75 66 66   "=".  The stuff
d9a0: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 70 46 69 72  .** between pFir
d9b0: 73 74 20 61 6e 64 20 70 4c 61 73 74 20 63 6f 6e  st and pLast con
d9c0: 73 74 69 74 75 74 65 73 20 65 69 74 68 65 72 20  stitutes either 
d9d0: 61 20 74 79 70 65 64 65 66 20 6f 72 20 61 20 67  a typedef or a g
d9e0: 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
d9f0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 44  e definition.  D
da00: 6f 20 74 68 65 20 72 69 67 68 74 20 74 68 69 6e  o the right thin
da10: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
da20: 20 50 72 6f 63 65 73 73 44 65 63 6c 28 54 6f 6b   ProcessDecl(Tok
da30: 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65  en *pFirst, Toke
da40: 6e 20 2a 70 45 6e 64 2c 20 69 6e 74 20 66 6c 61  n *pEnd, int fla
da50: 67 73 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  gs){.  Token *pN
da60: 61 6d 65 3b 0a 20 20 44 65 63 6c 20 2a 70 44 65  ame;.  Decl *pDe
da70: 63 6c 3b 0a 20 20 69 6e 74 20 69 73 4c 6f 63 61  cl;.  int isLoca
da80: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 56  l = 0;.  int isV
da90: 61 72 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  ar;.  int nErr =
daa0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 46 69 72 73   0;..  if( pFirs
dab0: 74 3d 3d 30 20 7c 7c 20 70 45 6e 64 3d 3d 30 20  t==0 || pEnd==0 
dac0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
dad0: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
dae0: 20 26 20 50 53 5f 54 79 70 65 64 65 66 20 29 7b   & PS_Typedef ){
daf0: 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
db00: 26 20 28 50 53 5f 45 78 70 6f 72 74 32 7c 50 53  & (PS_Export2|PS
db10: 5f 4c 6f 63 61 6c 32 29 29 21 3d 30 20 29 7b 0a  _Local2))!=0 ){.
db20: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
db30: 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 5c 22 45  derr,"%s:%d: \"E
db40: 58 50 4f 52 54 5c 22 20 6f 72 20 5c 22 4c 4f 43  XPORT\" or \"LOC
db50: 41 4c 5c 22 20 69 67 6e 6f 72 65 64 20 62 65 66  AL\" ignored bef
db60: 6f 72 65 20 74 79 70 65 64 65 66 2e 5c 6e 22 2c  ore typedef.\n",
db70: 0a 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  .        zFilena
db80: 6d 65 2c 20 70 46 69 72 73 74 2d 3e 6e 4c 69 6e  me, pFirst->nLin
db90: 65 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b  e);.      nErr++
dba0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
dbb0: 28 66 6c 61 67 73 20 26 20 28 50 53 5f 49 6e 74  (flags & (PS_Int
dbc0: 65 72 66 61 63 65 7c 50 53 5f 45 78 70 6f 72 74  erface|PS_Export
dbd0: 7c 50 53 5f 4c 6f 63 61 6c 7c 44 50 5f 43 70 6c  |PS_Local|DP_Cpl
dbe0: 75 73 70 6c 75 73 29 29 3d 3d 30 20 29 7b 0a 20  usplus))==0 ){. 
dbf0: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 69 6c       /* It is il
dc00: 6c 65 67 61 6c 20 74 6f 20 64 75 70 6c 69 63 61  legal to duplica
dc10: 74 65 20 61 20 74 79 70 65 64 65 66 20 69 6e 20  te a typedef in 
dc20: 43 20 28 62 75 74 20 4f 4b 20 69 6e 20 43 2b 2b  C (but OK in C++
dc30: 29 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 64  )..      ** So d
dc40: 6f 6e 27 74 20 72 65 63 6f 72 64 20 74 79 70 65  on't record type
dc50: 64 65 66 73 20 74 68 61 74 20 61 72 65 6e 27 74  defs that aren't
dc60: 20 77 69 74 68 69 6e 20 61 20 43 2b 2b 20 66 69   within a C++ fi
dc70: 6c 65 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 77  le or.      ** w
dc80: 69 74 68 69 6e 20 23 69 66 20 49 4e 54 45 52 46  ithin #if INTERF
dc90: 41 43 45 2e 2e 23 65 6e 64 69 66 20 2a 2f 0a 20  ACE..#endif */. 
dca0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72       return nErr
dcb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
dcc0: 28 66 6c 61 67 73 20 26 20 28 50 53 5f 49 6e 74  (flags & (PS_Int
dcd0: 65 72 66 61 63 65 7c 50 53 5f 45 78 70 6f 72 74  erface|PS_Export
dce0: 7c 50 53 5f 4c 6f 63 61 6c 29 29 3d 3d 30 20 26  |PS_Local))==0 &
dcf0: 26 20 70 72 6f 74 6f 5f 73 74 61 74 69 63 3d 3d  & proto_static==
dd00: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 67  0 ){.      /* Ig
dd10: 6e 6f 72 65 20 74 79 70 65 64 65 66 73 20 74 68  nore typedefs th
dd20: 61 74 20 61 72 65 20 6e 6f 74 20 77 69 74 68 20  at are not with 
dd30: 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 2e 2e  "#if INTERFACE..
dd40: 23 65 6e 64 69 66 22 20 75 6e 6c 65 73 73 0a 20  #endif" unless. 
dd50: 20 20 20 20 20 2a 2a 20 74 68 65 20 22 2d 6c 6f       ** the "-lo
dd60: 63 61 6c 22 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  cal" command lin
dd70: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
dd80: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
dd90: 6e 20 6e 45 72 72 3b 0a 20 20 20 20 7d 0a 20 20  n nErr;.    }.  
dda0: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
ddb0: 50 53 5f 49 6e 74 65 72 66 61 63 65 7c 50 53 5f  PS_Interface|PS_
ddc0: 45 78 70 6f 72 74 29 29 3d 3d 30 20 29 7b 0a 20  Export))==0 ){. 
ddd0: 20 20 20 20 20 2f 2a 20 74 79 70 65 64 65 66 73       /* typedefs
dde0: 20 61 72 65 20 61 6c 77 61 79 73 20 6c 6f 63 61   are always loca
ddf0: 6c 2c 20 75 6e 6c 65 73 73 20 77 69 74 68 69 6e  l, unless within
de00: 20 23 69 66 20 49 4e 54 45 52 46 41 43 45 2e 2e   #if INTERFACE..
de10: 23 65 6e 64 69 66 20 2a 2f 0a 20 20 20 20 20 20  #endif */.      
de20: 69 73 4c 6f 63 61 6c 20 3d 20 31 3b 0a 20 20 20  isLocal = 1;.   
de30: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66   }.  }else if( f
de40: 6c 61 67 73 20 26 20 28 50 53 5f 53 74 61 74 69  lags & (PS_Stati
de50: 63 7c 50 53 5f 4c 6f 63 61 6c 32 29 20 29 7b 0a  c|PS_Local2) ){.
de60: 20 20 20 20 69 66 28 20 70 72 6f 74 6f 5f 73 74      if( proto_st
de70: 61 74 69 63 3d 3d 30 20 26 26 20 28 66 6c 61 67  atic==0 && (flag
de80: 73 20 26 20 50 53 5f 4c 6f 63 61 6c 32 29 3d 3d  s & PS_Local2)==
de90: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  0 ){.      /* Do
dea0: 6e 27 74 20 72 65 63 6f 72 64 20 73 74 61 74 69  n't record stati
deb0: 63 20 76 61 72 69 61 62 6c 65 73 20 75 6e 6c 65  c variables unle
dec0: 73 73 20 74 68 65 20 22 2d 6c 6f 63 61 6c 22 20  ss the "-local" 
ded0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 20 20 20  command line.   
dee0: 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 77 61 73     ** option was
def0: 20 73 70 65 63 69 66 69 65 64 20 6f 72 20 74 68   specified or th
df00: 65 20 22 4c 4f 43 41 4c 22 20 6b 65 79 77 6f 72  e "LOCAL" keywor
df10: 64 20 69 73 20 75 73 65 64 2e 20 2a 2f 0a 20 20  d is used. */.  
df20: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b      return nErr;
df30: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
df40: 28 20 70 46 69 72 73 74 21 3d 30 20 26 26 20 70  ( pFirst!=0 && p
df50: 46 69 72 73 74 2d 3e 70 4e 65 78 74 21 3d 70 45  First->pNext!=pE
df60: 6e 64 20 26 26 0a 20 20 20 20 20 20 20 28 28 70  nd &&.       ((p
df70: 46 69 72 73 74 2d 3e 6e 54 65 78 74 3d 3d 36 20  First->nText==6 
df80: 26 26 20 73 74 72 6e 63 6d 70 28 70 46 69 72 73  && strncmp(pFirs
df90: 74 2d 3e 7a 54 65 78 74 2c 22 73 74 61 74 69 63  t->zText,"static
dfa0: 22 2c 36 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  ",6)==0).       
dfb0: 20 7c 7c 20 28 70 46 69 72 73 74 2d 3e 6e 54 65   || (pFirst->nTe
dfc0: 78 74 3d 3d 35 20 26 26 20 73 74 72 6e 63 6d 70  xt==5 && strncmp
dfd0: 28 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22  (pFirst->zText,"
dfe0: 4c 4f 43 41 4c 22 2c 36 29 3d 3d 30 29 29 0a 20  LOCAL",6)==0)). 
dff0: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c     ){.      /* L
e000: 6f 73 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ose the initial 
e010: 22 73 74 61 74 69 63 22 20 6f 72 20 6c 6f 63 61  "static" or loca
e020: 6c 20 66 72 6f 6d 20 6c 6f 63 61 6c 20 76 61 72  l from local var
e030: 69 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2a  iables..      **
e040: 20 57 65 27 6c 6c 20 70 72 65 70 65 6e 64 20 22   We'll prepend "
e050: 65 78 74 65 72 6e 22 20 6c 61 74 65 72 2e 20 2a  extern" later. *
e060: 2f 0a 20 20 20 20 20 20 70 46 69 72 73 74 20 3d  /.      pFirst =
e070: 20 70 46 69 72 73 74 2d 3e 70 4e 65 78 74 3b 0a   pFirst->pNext;.
e080: 20 20 20 20 20 20 69 73 4c 6f 63 61 6c 20 3d 20        isLocal = 
e090: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
e0a0: 20 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 21 69   pFirst==0 || !i
e0b0: 73 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  sLocal ){.      
e0c0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20 20  return nErr;.   
e0d0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66   }.  }else if( f
e0e0: 6c 61 67 73 20 26 20 50 53 5f 4d 65 74 68 6f 64  lags & PS_Method
e0f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 65 74 68 6f   ){.    /* Metho
e100: 64 73 20 61 72 65 20 64 65 63 6c 61 72 65 64 20  ds are declared 
e110: 62 79 20 74 68 65 69 72 20 63 6c 61 73 73 2e 20  by their class. 
e120: 20 44 6f 6e 27 74 20 64 65 63 6c 61 72 65 20 73   Don't declare s
e130: 65 70 61 72 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  eparately. */.  
e140: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20    return nErr;. 
e150: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 53 74 61   }else if( isSta
e160: 74 69 63 41 73 73 65 72 74 28 70 46 69 72 73 74  ticAssert(pFirst
e170: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
e180: 30 3b 0a 20 20 7d 0a 20 20 69 73 56 61 72 20 3d  0;.  }.  isVar =
e190: 20 20 28 66 6c 61 67 73 20 26 20 28 50 53 5f 54    (flags & (PS_T
e1a0: 79 70 65 64 65 66 7c 50 53 5f 4d 65 74 68 6f 64  ypedef|PS_Method
e1b0: 29 29 3d 3d 30 20 26 26 20 69 73 56 61 72 69 61  ))==0 && isVaria
e1c0: 62 6c 65 44 65 66 28 70 46 69 72 73 74 2c 70 45  bleDef(pFirst,pE
e1d0: 6e 64 29 3b 0a 20 20 69 66 28 20 69 73 56 61 72  nd);.  if( isVar
e1e0: 20 26 26 20 28 66 6c 61 67 73 20 26 20 28 50 53   && (flags & (PS
e1f0: 5f 49 6e 74 65 72 66 61 63 65 7c 50 53 5f 45 78  _Interface|PS_Ex
e200: 70 6f 72 74 7c 50 53 5f 4c 6f 63 61 6c 29 29 21  port|PS_Local))!
e210: 3d 30 0a 20 20 26 26 20 28 66 6c 61 67 73 20 26  =0.  && (flags &
e220: 20 50 53 5f 45 78 74 65 72 6e 29 3d 3d 30 20 29   PS_Extern)==0 )
e230: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
e240: 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 43 61 6e  derr,"%s:%d: Can
e250: 27 74 20 64 65 66 69 6e 65 20 61 20 76 61 72 69  't define a vari
e260: 61 62 6c 65 20 69 6e 20 74 68 69 73 20 63 6f 6e  able in this con
e270: 74 65 78 74 5c 6e 22 2c 0a 20 20 20 20 20 20 7a  text\n",.      z
e280: 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 72 73 74  Filename, pFirst
e290: 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 6e 45  ->nLine);.    nE
e2a0: 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 4e 61 6d  rr++;.  }.  pNam
e2b0: 65 20 3d 20 46 69 6e 64 44 65 63 6c 4e 61 6d 65  e = FindDeclName
e2c0: 28 70 46 69 72 73 74 2c 70 45 6e 64 2d 3e 70 50  (pFirst,pEnd->pP
e2d0: 72 65 76 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d  rev);.  if( pNam
e2e0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
e2f0: 70 46 69 72 73 74 2d 3e 6e 54 65 78 74 3d 3d 34  pFirst->nText==4
e300: 20 26 26 20 73 74 72 6e 63 6d 70 28 70 46 69 72   && strncmp(pFir
e310: 73 74 2d 3e 7a 54 65 78 74 2c 22 65 6e 75 6d 22  st->zText,"enum"
e320: 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,4)==0 ){.      
e330: 2f 2a 20 49 67 6e 6f 72 65 20 63 6f 6d 70 6c 65  /* Ignore comple
e340: 74 65 6c 79 20 61 6e 6f 6e 79 6d 6f 75 73 20 65  tely anonymous e
e350: 6e 75 6d 73 2e 20 20 53 65 65 20 64 6f 63 75 6d  nums.  See docum
e360: 65 6e 74 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e  entation section
e370: 20 33 2e 38 2e 31 2e 20 2a 2f 0a 20 20 20 20 20   3.8.1. */.     
e380: 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20   return nErr;.  
e390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
e3a0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
e3b0: 73 3a 25 64 3a 20 43 61 6e 27 74 20 66 69 6e 64  s:%d: Can't find
e3c0: 20 61 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20   a name for the 
e3d0: 6f 62 6a 65 63 74 20 64 65 63 6c 61 72 65 64 20  object declared 
e3e0: 68 65 72 65 2e 5c 6e 22 2c 0a 20 20 20 20 20 20  here.\n",.      
e3f0: 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69    zFilename, pFi
e400: 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20  rst->nLine);.   
e410: 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 2b 31     return nErr+1
e420: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
e430: 64 65 66 20 44 45 42 55 47 0a 20 20 69 66 28 20  def DEBUG.  if( 
e440: 64 65 62 75 67 4d 61 73 6b 20 26 20 50 41 52 53  debugMask & PARS
e450: 45 52 20 29 7b 0a 20 20 20 20 69 66 28 20 66 6c  ER ){.    if( fl
e460: 61 67 73 20 26 20 50 53 5f 54 79 70 65 64 65 66  ags & PS_Typedef
e470: 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66   ){.      printf
e480: 28 22 2a 2a 2a 2a 20 46 6f 75 6e 64 20 74 79 70  ("**** Found typ
e490: 65 64 65 66 20 25 2e 2a 73 20 61 74 20 6c 69 6e  edef %.*s at lin
e4a0: 65 20 25 64 2e 2e 2e 5c 6e 22 2c 0a 20 20 20 20  e %d...\n",.    
e4b0: 20 20 20 20 70 4e 61 6d 65 2d 3e 6e 54 65 78 74      pName->nText
e4c0: 2c 20 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 20  , pName->zText, 
e4d0: 70 4e 61 6d 65 2d 3e 6e 4c 69 6e 65 29 3b 0a 20  pName->nLine);. 
e4e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 56     }else if( isV
e4f0: 61 72 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e  ar ){.      prin
e500: 74 66 28 22 2a 2a 2a 2a 20 46 6f 75 6e 64 20 76  tf("**** Found v
e510: 61 72 69 61 62 6c 65 20 25 2e 2a 73 20 61 74 20  ariable %.*s at 
e520: 6c 69 6e 65 20 25 64 2e 2e 2e 5c 6e 22 2c 0a 20  line %d...\n",. 
e530: 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 6e 54         pName->nT
e540: 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 7a 54 65 78  ext, pName->zTex
e550: 74 2c 20 70 4e 61 6d 65 2d 3e 6e 4c 69 6e 65 29  t, pName->nLine)
e560: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e570: 20 20 20 70 72 69 6e 74 66 28 22 2a 2a 2a 2a 20     printf("**** 
e580: 46 6f 75 6e 64 20 70 72 6f 74 6f 74 79 70 65 20  Found prototype 
e590: 25 2e 2a 73 20 61 74 20 6c 69 6e 65 20 25 64 2e  %.*s at line %d.
e5a0: 2e 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 70  ..\n",.        p
e5b0: 4e 61 6d 65 2d 3e 6e 54 65 78 74 2c 20 70 4e 61  Name->nText, pNa
e5c0: 6d 65 2d 3e 7a 54 65 78 74 2c 20 70 4e 61 6d 65  me->zText, pName
e5d0: 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 7d 0a  ->nLine);.    }.
e5e0: 20 20 20 20 50 72 69 6e 74 54 6f 6b 65 6e 73 28      PrintTokens(
e5f0: 70 46 69 72 73 74 2c 70 45 6e 64 2d 3e 70 50 72  pFirst,pEnd->pPr
e600: 65 76 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  ev);.    printf(
e610: 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64  ";\n");.  }.#end
e620: 69 66 0a 0a 20 20 70 44 65 63 6c 20 3d 20 43 72  if..  pDecl = Cr
e630: 65 61 74 65 44 65 63 6c 28 70 4e 61 6d 65 2d 3e  eateDecl(pName->
e640: 7a 54 65 78 74 2c 70 4e 61 6d 65 2d 3e 6e 54 65  zText,pName->nTe
e650: 78 74 29 3b 0a 20 20 69 66 28 20 28 66 6c 61 67  xt);.  if( (flag
e660: 73 20 26 20 50 53 5f 54 79 70 65 64 65 66 29 20  s & PS_Typedef) 
e670: 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72  ){.    DeclSetPr
e680: 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 20 54 59  operty(pDecl, TY
e690: 5f 54 79 70 65 64 65 66 29 3b 0a 20 20 7d 65 6c  _Typedef);.  }el
e6a0: 73 65 20 69 66 28 20 69 73 56 61 72 20 29 7b 0a  se if( isVar ){.
e6b0: 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65      DeclSetPrope
e6c0: 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 78 74  rty(pDecl,DP_Ext
e6d0: 65 72 6e 52 65 71 64 20 7c 20 54 59 5f 56 61 72  ernReqd | TY_Var
e6e0: 69 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  iable);.    if( 
e6f0: 21 28 66 6c 61 67 73 20 26 20 44 50 5f 43 70 6c  !(flags & DP_Cpl
e700: 75 73 70 6c 75 73 29 20 29 7b 0a 20 20 20 20 20  usplus) ){.     
e710: 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79   DeclSetProperty
e720: 28 70 44 65 63 6c 2c 44 50 5f 45 78 74 65 72 6e  (pDecl,DP_Extern
e730: 43 52 65 71 64 29 3b 0a 20 20 20 20 7d 0a 20 20  CReqd);.    }.  
e740: 7d 65 6c 73 65 7b 0a 20 20 20 20 44 65 63 6c 53  }else{.    DeclS
e750: 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c  etProperty(pDecl
e760: 2c 20 54 59 5f 53 75 62 72 6f 75 74 69 6e 65 29  , TY_Subroutine)
e770: 3b 0a 20 20 20 20 69 66 28 20 21 28 66 6c 61 67  ;.    if( !(flag
e780: 73 20 26 20 44 50 5f 43 70 6c 75 73 70 6c 75 73  s & DP_Cplusplus
e790: 29 20 29 7b 0a 20 20 20 20 20 20 44 65 63 6c 53  ) ){.      DeclS
e7a0: 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c  etProperty(pDecl
e7b0: 2c 44 50 5f 45 78 74 65 72 6e 43 52 65 71 64 29  ,DP_ExternCReqd)
e7c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 44  ;.    }.  }.  pD
e7d0: 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20 3d 20  ecl->pComment = 
e7e0: 70 46 69 72 73 74 2d 3e 70 43 6f 6d 6d 65 6e 74  pFirst->pComment
e7f0: 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c  ;.  pDecl->zDecl
e800: 20 3d 20 54 6f 6b 65 6e 73 54 6f 53 74 72 69 6e   = TokensToStrin
e810: 67 28 70 46 69 72 73 74 2c 70 45 6e 64 2d 3e 70  g(pFirst,pEnd->p
e820: 50 72 65 76 2c 22 3b 5c 6e 22 2c 30 2c 30 29 3b  Prev,";\n",0,0);
e830: 0a 20 20 69 66 28 20 69 73 4c 6f 63 61 6c 20 7c  .  if( isLocal |
e840: 7c 20 28 66 6c 61 67 73 20 26 20 28 50 53 5f 4c  | (flags & (PS_L
e850: 6f 63 61 6c 7c 50 53 5f 4c 6f 63 61 6c 32 29 29  ocal|PS_Local2))
e860: 21 3d 30 20 29 7b 0a 20 20 20 20 44 65 63 6c 53  !=0 ){.    DeclS
e870: 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c  etProperty(pDecl
e880: 2c 44 50 5f 4c 6f 63 61 6c 29 3b 0a 20 20 7d 65  ,DP_Local);.  }e
e890: 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
e8a0: 28 50 53 5f 45 78 70 6f 72 74 7c 50 53 5f 45 78  (PS_Export|PS_Ex
e8b0: 70 6f 72 74 32 29 20 29 7b 0a 20 20 20 20 44 65  port2) ){.    De
e8c0: 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44  clSetProperty(pD
e8d0: 65 63 6c 2c 44 50 5f 45 78 70 6f 72 74 29 3b 0a  ecl,DP_Export);.
e8e0: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20    }.  if( flags 
e8f0: 26 20 44 50 5f 43 70 6c 75 73 70 6c 75 73 20 29  & DP_Cplusplus )
e900: 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f  {.    DeclSetPro
e910: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 43  perty(pDecl,DP_C
e920: 70 6c 75 73 70 6c 75 73 29 3b 0a 20 20 7d 0a 20  plusplus);.  }. 
e930: 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a   return nErr;.}.
e940: 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 6e 20 69  ./*.** Push an i
e950: 66 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 6e 74 6f  f condition onto
e960: 20 74 68 65 20 69 66 20 73 74 61 63 6b 0a 2a 2f   the if stack.*/
e970: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 50 75 73  .static void Pus
e980: 68 49 66 4d 61 63 72 6f 28 0a 20 20 63 6f 6e 73  hIfMacro(.  cons
e990: 74 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 2c  t char *zPrefix,
e9a0: 20 20 20 20 20 20 2f 2a 20 41 20 70 72 65 66 69        /* A prefi
e9b0: 78 2c 20 6c 69 6b 65 20 22 64 65 66 69 6e 65 22  x, like "define"
e9c0: 20 6f 72 20 22 21 22 20 2a 2f 0a 20 20 63 6f 6e   or "!" */.  con
e9d0: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20  st char *zText, 
e9e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
e9f0: 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ndition */.  int
ea00: 20 6e 54 65 78 74 2c 20 20 20 20 20 20 20 20 20   nText,         
ea10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ea20: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
ea30: 6e 20 7a 54 65 78 74 20 2a 2f 0a 20 20 69 6e 74  n zText */.  int
ea40: 20 6e 4c 69 6e 65 2c 20 20 20 20 20 20 20 20 20   nLine,         
ea50: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
ea60: 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 69 73  umber where this
ea70: 20 6d 61 63 72 6f 20 6f 63 63 75 72 73 20 2a 2f   macro occurs */
ea80: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eaa0: 45 69 74 68 65 72 20 30 2c 20 50 53 5f 49 6e 74  Either 0, PS_Int
eab0: 65 72 66 61 63 65 2c 20 50 53 5f 45 78 70 6f 72  erface, PS_Expor
eac0: 74 20 6f 72 20 50 53 5f 4c 6f 63 61 6c 20 2a 2f  t or PS_Local */
ead0: 0a 29 7b 0a 20 20 49 66 6d 61 63 72 6f 20 2a 70  .){.  Ifmacro *p
eae0: 49 66 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  If;.  int nByte;
eaf0: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ..  nByte = size
eb00: 6f 66 28 49 66 6d 61 63 72 6f 29 3b 0a 20 20 69  of(Ifmacro);.  i
eb10: 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20 20  f( zText ){.    
eb20: 69 66 28 20 7a 50 72 65 66 69 78 20 29 7b 0a 20  if( zPrefix ){. 
eb30: 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74       nByte += st
eb40: 72 6c 65 6e 28 7a 50 72 65 66 69 78 29 20 2b 20  rlen(zPrefix) + 
eb50: 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  2;.    }.    nBy
eb60: 74 65 20 2b 3d 20 6e 54 65 78 74 20 2b 20 31 3b  te += nText + 1;
eb70: 0a 20 20 7d 0a 20 20 70 49 66 20 3d 20 53 61 66  .  }.  pIf = Saf
eb80: 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  eMalloc( nByte )
eb90: 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b  ;.  if( zText ){
eba0: 0a 20 20 20 20 70 49 66 2d 3e 7a 43 6f 6e 64 69  .    pIf->zCondi
ebb0: 74 69 6f 6e 20 3d 20 28 63 68 61 72 2a 29 26 70  tion = (char*)&p
ebc0: 49 66 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 7a  If[1];.    if( z
ebd0: 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20  Prefix ){.      
ebe0: 73 70 72 69 6e 74 66 28 70 49 66 2d 3e 7a 43 6f  sprintf(pIf->zCo
ebf0: 6e 64 69 74 69 6f 6e 2c 22 25 73 28 25 2e 2a 73  ndition,"%s(%.*s
ec00: 29 22 2c 7a 50 72 65 66 69 78 2c 6e 54 65 78 74  )",zPrefix,nText
ec10: 2c 7a 54 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c  ,zText);.    }el
ec20: 73 65 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  se{.      sprint
ec30: 66 28 70 49 66 2d 3e 7a 43 6f 6e 64 69 74 69 6f  f(pIf->zConditio
ec40: 6e 2c 22 25 2e 2a 73 22 2c 6e 54 65 78 74 2c 7a  n,"%.*s",nText,z
ec50: 54 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Text);.    }.  }
ec60: 65 6c 73 65 7b 0a 20 20 20 20 70 49 66 2d 3e 7a  else{.    pIf->z
ec70: 43 6f 6e 64 69 74 69 6f 6e 20 3d 20 30 3b 0a 20  Condition = 0;. 
ec80: 20 7d 0a 20 20 70 49 66 2d 3e 6e 4c 69 6e 65 20   }.  pIf->nLine 
ec90: 3d 20 6e 4c 69 6e 65 3b 0a 20 20 70 49 66 2d 3e  = nLine;.  pIf->
eca0: 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
ecb0: 20 70 49 66 2d 3e 70 4e 65 78 74 20 3d 20 69 66   pIf->pNext = if
ecc0: 53 74 61 63 6b 3b 0a 20 20 69 66 53 74 61 63 6b  Stack;.  ifStack
ecd0: 20 3d 20 70 49 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   = pIf;.}../*.**
ece0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
ecf0: 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
ed00: 65 20 61 6c 6c 20 70 72 65 70 72 6f 63 65 73 73  e all preprocess
ed10: 6f 72 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a  or directives..*
ed20: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ed30: 65 20 77 69 6c 6c 20 72 65 63 6f 6d 70 75 74 65  e will recompute
ed40: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
ed50: 50 72 65 73 65 74 46 6c 61 67 73 20 74 6f 20 62  PresetFlags to b
ed60: 65 20 74 68 65 0a 2a 2a 20 6c 6f 67 69 63 61 6c  e the.** logical
ed70: 20 6f 72 20 6f 66 20 61 6c 6c 20 66 6c 61 67 73   or of all flags
ed80: 20 6f 6e 20 61 6c 6c 20 6e 65 73 74 65 64 20 23   on all nested #
ed90: 69 66 73 2e 20 20 54 68 65 20 23 69 66 73 20 74  ifs.  The #ifs t
eda0: 68 61 74 20 73 65 74 20 66 6c 61 67 73 0a 2a 2a  hat set flags.**
edb0: 20 61 72 65 20 61 73 20 66 6f 6c 6c 6f 77 73 3a   are as follows:
edc0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  .**.**        co
edd0: 6e 64 69 74 69 6f 6e 61 6c 20 20 20 20 20 20 20  nditional       
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67              flag
edf0: 20 73 65 74 0a 2a 2a 20 20 20 20 20 20 20 20 2d   set.**        -
ee00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee10: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 2d 2d 2d  -------      ---
ee20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee30: 2d 0a 2a 2a 20 20 20 20 20 20 20 20 23 69 66 20  -.**        #if 
ee40: 49 4e 54 45 52 46 41 43 45 20 20 20 20 20 20 20  INTERFACE       
ee50: 20 20 20 20 20 20 20 20 20 20 50 53 5f 49 6e 74            PS_Int
ee60: 65 72 66 61 63 65 0a 2a 2a 20 20 20 20 20 20 20  erface.**       
ee70: 20 23 69 66 20 45 58 50 4f 52 54 5f 49 4e 54 45   #if EXPORT_INTE
ee80: 52 46 41 43 45 20 20 20 20 20 20 20 20 20 20 50  RFACE          P
ee90: 53 5f 45 78 70 6f 72 74 0a 2a 2a 20 20 20 20 20  S_Export.**     
eea0: 20 20 20 23 69 66 20 4c 4f 43 41 4c 5f 49 4e 54     #if LOCAL_INT
eeb0: 45 52 46 41 43 45 20 20 20 20 20 20 20 20 20 20  ERFACE          
eec0: 20 50 53 5f 4c 6f 63 61 6c 0a 2a 2a 0a 2a 2a 20   PS_Local.**.** 
eed0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
eee0: 61 66 74 65 72 20 70 72 6f 63 65 73 73 69 6e 67  after processing
eef0: 20 74 68 65 20 70 72 65 70 72 6f 63 65 73 73 6f   the preprocesso
ef00: 72 20 74 6f 6b 65 6e 20 67 69 76 65 6e 0a 2a 2a  r token given.**
ef10: 20 62 79 20 70 54 6f 6b 65 6e 20 74 68 65 72 65   by pToken there
ef20: 20 69 73 20 61 6e 20 22 23 69 66 20 49 4e 54 45   is an "#if INTE
ef30: 52 46 41 43 45 22 20 6f 6e 20 74 68 65 20 70 72  RFACE" on the pr
ef40: 65 70 72 6f 63 65 73 73 6f 72 0a 2a 2a 20 73 74  eprocessor.** st
ef50: 61 63 6b 2c 20 74 68 65 6e 20 2a 70 50 72 65 73  ack, then *pPres
ef60: 65 74 46 6c 61 67 73 20 77 69 6c 6c 20 62 65 20  etFlags will be 
ef70: 73 65 74 20 74 6f 20 50 53 5f 49 6e 74 65 72 66  set to PS_Interf
ef80: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
ef90: 6e 74 20 50 61 72 73 65 50 72 65 70 72 6f 63 65  nt ParsePreproce
efa0: 73 73 6f 72 28 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ssor(Token *pTok
efb0: 65 6e 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69  en, int flags, i
efc0: 6e 74 20 2a 70 50 72 65 73 65 74 46 6c 61 67 73  nt *pPresetFlags
efd0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
efe0: 2a 7a 43 6d 64 3b 0a 20 20 69 6e 74 20 6e 43 6d  *zCmd;.  int nCm
eff0: 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
f000: 2a 7a 41 72 67 3b 0a 20 20 69 6e 74 20 6e 41 72  *zArg;.  int nAr
f010: 67 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  g;.  int nErr = 
f020: 30 3b 0a 20 20 49 66 6d 61 63 72 6f 20 2a 70 49  0;.  Ifmacro *pI
f030: 66 3b 0a 0a 20 20 7a 43 6d 64 20 3d 20 26 70 54  f;..  zCmd = &pT
f040: 6f 6b 65 6e 2d 3e 7a 54 65 78 74 5b 31 5d 3b 0a  oken->zText[1];.
f050: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
f060: 28 2a 7a 43 6d 64 29 20 26 26 20 2a 7a 43 6d 64  (*zCmd) && *zCmd
f070: 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 7a 43  !='\n' ){.    zC
f080: 6d 64 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  md++;.  }.  if( 
f090: 21 69 73 61 6c 70 68 61 28 2a 7a 43 6d 64 29 20  !isalpha(*zCmd) 
f0a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
f0b0: 0a 20 20 7d 0a 20 20 6e 43 6d 64 20 3d 20 31 3b  .  }.  nCmd = 1;
f0c0: 0a 20 20 77 68 69 6c 65 28 20 69 73 61 6c 70 68  .  while( isalph
f0d0: 61 28 7a 43 6d 64 5b 6e 43 6d 64 5d 29 20 29 7b  a(zCmd[nCmd]) ){
f0e0: 0a 20 20 20 20 6e 43 6d 64 2b 2b 3b 0a 20 20 7d  .    nCmd++;.  }
f0f0: 0a 0a 20 20 69 66 28 20 6e 43 6d 64 3d 3d 35 20  ..  if( nCmd==5 
f100: 26 26 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c  && strncmp(zCmd,
f110: 22 65 6e 64 69 66 22 2c 35 29 3d 3d 30 20 29 7b  "endif",5)==0 ){
f120: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50  .    /*.    ** P
f130: 6f 70 20 74 68 65 20 69 66 20 73 74 61 63 6b 0a  op the if stack.
f140: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 66 20 3d      */.    pIf =
f150: 20 69 66 53 74 61 63 6b 3b 0a 20 20 20 20 69 66   ifStack;.    if
f160: 28 20 70 49 66 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pIf==0 ){.    
f170: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
f180: 2c 22 25 73 3a 25 64 3a 20 65 78 74 72 61 20 27  ,"%s:%d: extra '
f190: 23 65 6e 64 69 66 27 2e 5c 6e 22 2c 7a 46 69 6c  #endif'.\n",zFil
f1a0: 65 6e 61 6d 65 2c 70 54 6f 6b 65 6e 2d 3e 6e 4c  ename,pToken->nL
f1b0: 69 6e 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ine);.      retu
f1c0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
f1d0: 69 66 53 74 61 63 6b 20 3d 20 70 49 66 2d 3e 70  ifStack = pIf->p
f1e0: 4e 65 78 74 3b 0a 20 20 20 20 53 61 66 65 46 72  Next;.    SafeFr
f1f0: 65 65 28 70 49 66 29 3b 0a 20 20 7d 65 6c 73 65  ee(pIf);.  }else
f200: 20 69 66 28 20 6e 43 6d 64 3d 3d 36 20 26 26 20   if( nCmd==6 && 
f210: 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c 22 64 65  strncmp(zCmd,"de
f220: 66 69 6e 65 22 2c 36 29 3d 3d 30 20 29 7b 0a 20  fine",6)==0 ){. 
f230: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 63     /*.    ** Rec
f240: 6f 72 64 20 61 20 23 64 65 66 69 6e 65 20 69 66  ord a #define if
f250: 20 77 65 20 61 72 65 20 69 6e 20 50 53 5f 49 6e   we are in PS_In
f260: 74 65 72 66 61 63 65 20 6f 72 20 50 53 5f 45 78  terface or PS_Ex
f270: 70 6f 72 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20  port.    */.    
f280: 44 65 63 6c 20 2a 70 44 65 63 6c 3b 0a 20 20 20  Decl *pDecl;.   
f290: 20 69 66 28 20 21 28 66 6c 61 67 73 20 26 20 28   if( !(flags & (
f2a0: 50 53 5f 4c 6f 63 61 6c 7c 50 53 5f 49 6e 74 65  PS_Local|PS_Inte
f2b0: 72 66 61 63 65 7c 50 53 5f 45 78 70 6f 72 74 29  rface|PS_Export)
f2c0: 29 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  ) ){ return 0; }
f2d0: 0a 20 20 20 20 7a 41 72 67 20 3d 20 26 7a 43 6d  .    zArg = &zCm
f2e0: 64 5b 36 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  d[6];.    while(
f2f0: 20 2a 7a 41 72 67 20 26 26 20 69 73 73 70 61 63   *zArg && isspac
f300: 65 28 2a 7a 41 72 67 29 20 26 26 20 2a 7a 41 72  e(*zArg) && *zAr
f310: 67 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  g!='\n' ){.     
f320: 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20   zArg++;.    }. 
f330: 20 20 20 69 66 28 20 2a 7a 41 72 67 3d 3d 30 20     if( *zArg==0 
f340: 7c 7c 20 2a 7a 41 72 67 3d 3d 27 5c 6e 27 20 29  || *zArg=='\n' )
f350: 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a 20 20  { return 0; }.  
f360: 20 20 66 6f 72 28 6e 41 72 67 3d 30 3b 20 49 53    for(nArg=0; IS
f370: 41 4c 4e 55 4d 28 7a 41 72 67 5b 6e 41 72 67 5d  ALNUM(zArg[nArg]
f380: 29 3b 20 6e 41 72 67 2b 2b 29 7b 7d 0a 20 20 20  ); nArg++){}.   
f390: 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 20   if( nArg==0 ){ 
f3a0: 72 65 74 75 72 6e 20 30 3b 20 7d 0a 20 20 20 20  return 0; }.    
f3b0: 70 44 65 63 6c 20 3d 20 43 72 65 61 74 65 44 65  pDecl = CreateDe
f3c0: 63 6c 28 7a 41 72 67 2c 6e 41 72 67 29 3b 0a 20  cl(zArg,nArg);. 
f3d0: 20 20 20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65     pDecl->pComme
f3e0: 6e 74 20 3d 20 70 54 6f 6b 65 6e 2d 3e 70 43 6f  nt = pToken->pCo
f3f0: 6d 6d 65 6e 74 3b 0a 20 20 20 20 44 65 63 6c 53  mment;.    DeclS
f400: 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c  etProperty(pDecl
f410: 2c 54 59 5f 4d 61 63 72 6f 29 3b 0a 20 20 20 20  ,TY_Macro);.    
f420: 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 20 3d 20 53  pDecl->zDecl = S
f430: 61 66 65 4d 61 6c 6c 6f 63 28 20 70 54 6f 6b 65  afeMalloc( pToke
f440: 6e 2d 3e 6e 54 65 78 74 20 2b 20 32 20 29 3b 0a  n->nText + 2 );.
f450: 20 20 20 20 73 70 72 69 6e 74 66 28 70 44 65 63      sprintf(pDec
f460: 6c 2d 3e 7a 44 65 63 6c 2c 22 25 2e 2a 73 5c 6e  l->zDecl,"%.*s\n
f470: 22 2c 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 2c  ",pToken->nText,
f480: 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 29 3b 0a  pToken->zText);.
f490: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
f4a0: 50 53 5f 45 78 70 6f 72 74 20 29 7b 0a 20 20 20  PS_Export ){.   
f4b0: 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72     DeclSetProper
f4c0: 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 78 70 6f  ty(pDecl,DP_Expo
f4d0: 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  rt);.    }else i
f4e0: 66 28 20 66 6c 61 67 73 20 26 20 50 53 5f 4c 6f  f( flags & PS_Lo
f4f0: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 44 65 63  cal ){.      Dec
f500: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65  lSetProperty(pDe
f510: 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29 3b 0a 20 20  cl,DP_Local);.  
f520: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
f530: 6e 43 6d 64 3d 3d 37 20 26 26 20 73 74 72 6e 63  nCmd==7 && strnc
f540: 6d 70 28 7a 43 6d 64 2c 22 69 6e 63 6c 75 64 65  mp(zCmd,"include
f550: 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ",7)==0 ){.    /
f560: 2a 0a 20 20 20 20 2a 2a 20 52 65 63 6f 72 64 20  *.    ** Record 
f570: 61 6e 20 23 69 6e 63 6c 75 64 65 20 69 66 20 77  an #include if w
f580: 65 20 61 72 65 20 69 6e 20 50 53 5f 49 6e 74 65  e are in PS_Inte
f590: 72 66 61 63 65 20 6f 72 20 50 53 5f 45 78 70 6f  rface or PS_Expo
f5a0: 72 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e  rt.    */.    In
f5b0: 63 6c 75 64 65 20 2a 70 49 6e 63 6c 75 64 65 3b  clude *pInclude;
f5c0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 66 3b 0a  .    char *zIf;.
f5d0: 0a 20 20 20 20 69 66 28 20 21 28 66 6c 61 67 73  .    if( !(flags
f5e0: 20 26 20 28 50 53 5f 49 6e 74 65 72 66 61 63 65   & (PS_Interface
f5f0: 7c 50 53 5f 45 78 70 6f 72 74 29 29 20 29 7b 20  |PS_Export)) ){ 
f600: 72 65 74 75 72 6e 20 30 3b 20 7d 0a 20 20 20 20  return 0; }.    
f610: 7a 41 72 67 20 3d 20 26 7a 43 6d 64 5b 37 5d 3b  zArg = &zCmd[7];
f620: 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 41 72  .    while( *zAr
f630: 67 20 26 26 20 69 73 73 70 61 63 65 28 2a 7a 41  g && isspace(*zA
f640: 72 67 29 20 29 7b 20 7a 41 72 67 2b 2b 3b 20 7d  rg) ){ zArg++; }
f650: 0a 20 20 20 20 66 6f 72 28 6e 41 72 67 3d 30 3b  .    for(nArg=0;
f660: 20 21 69 73 73 70 61 63 65 28 7a 41 72 67 5b 6e   !isspace(zArg[n
f670: 41 72 67 5d 29 3b 20 6e 41 72 67 2b 2b 29 7b 7d  Arg]); nArg++){}
f680: 0a 20 20 20 20 69 66 28 20 28 7a 41 72 67 5b 30  .    if( (zArg[0
f690: 5d 3d 3d 27 22 27 20 26 26 20 7a 41 72 67 5b 6e  ]=='"' && zArg[n
f6a0: 41 72 67 2d 31 5d 21 3d 27 22 27 29 0a 20 20 20  Arg-1]!='"').   
f6b0: 20 20 20 7c 7c 28 7a 41 72 67 5b 30 5d 3d 3d 27     ||(zArg[0]=='
f6c0: 3c 27 20 26 26 20 7a 41 72 67 5b 6e 41 72 67 2d  <' && zArg[nArg-
f6d0: 31 5d 21 3d 27 3e 27 29 0a 20 20 20 20 29 7b 0a  1]!='>').    ){.
f6e0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
f6f0: 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 6d 61 6c  derr,"%s:%d: mal
f700: 66 6f 72 6d 65 64 20 23 69 6e 63 6c 75 64 65 20  formed #include 
f710: 73 74 61 74 65 6d 65 6e 74 2e 5c 6e 22 2c 0a 20  statement.\n",. 
f720: 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65         zFilename
f730: 2c 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 29 3b  ,pToken->nLine);
f740: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
f750: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 66 20 3d  .    }.    zIf =
f760: 20 47 65 74 49 66 53 74 72 69 6e 67 28 29 3b 0a   GetIfString();.
f770: 20 20 20 20 69 66 28 20 7a 49 66 20 29 7b 0a 20      if( zIf ){. 
f780: 20 20 20 20 20 70 49 6e 63 6c 75 64 65 20 3d 20       pInclude = 
f790: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  SafeMalloc( size
f7a0: 6f 66 28 49 6e 63 6c 75 64 65 29 20 2b 20 6e 41  of(Include) + nA
f7b0: 72 67 2a 32 20 2b 20 73 74 72 6c 65 6e 28 7a 49  rg*2 + strlen(zI
f7c0: 66 29 20 2b 20 31 30 20 29 3b 0a 20 20 20 20 20  f) + 10 );.     
f7d0: 20 70 49 6e 63 6c 75 64 65 2d 3e 7a 46 69 6c 65   pInclude->zFile
f7e0: 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 63 6c   = (char*)&pIncl
f7f0: 75 64 65 5b 31 5d 3b 0a 20 20 20 20 20 20 70 49  ude[1];.      pI
f800: 6e 63 6c 75 64 65 2d 3e 7a 4c 61 62 65 6c 20 3d  nclude->zLabel =
f810: 20 26 70 49 6e 63 6c 75 64 65 2d 3e 7a 46 69 6c   &pInclude->zFil
f820: 65 5b 6e 41 72 67 2b 31 5d 3b 0a 20 20 20 20 20  e[nArg+1];.     
f830: 20 73 70 72 69 6e 74 66 28 70 49 6e 63 6c 75 64   sprintf(pInclud
f840: 65 2d 3e 7a 46 69 6c 65 2c 22 25 2e 2a 73 22 2c  e->zFile,"%.*s",
f850: 6e 41 72 67 2c 7a 41 72 67 29 3b 0a 20 20 20 20  nArg,zArg);.    
f860: 20 20 73 70 72 69 6e 74 66 28 70 49 6e 63 6c 75    sprintf(pInclu
f870: 64 65 2d 3e 7a 4c 61 62 65 6c 2c 22 25 2e 2a 73  de->zLabel,"%.*s
f880: 3a 25 73 22 2c 6e 41 72 67 2c 7a 41 72 67 2c 7a  :%s",nArg,zArg,z
f890: 49 66 29 3b 0a 20 20 20 20 20 20 70 49 6e 63 6c  If);.      pIncl
f8a0: 75 64 65 2d 3e 7a 49 66 20 3d 20 26 70 49 6e 63  ude->zIf = &pInc
f8b0: 6c 75 64 65 2d 3e 7a 4c 61 62 65 6c 5b 6e 41 72  lude->zLabel[nAr
f8c0: 67 2b 31 5d 3b 0a 20 20 20 20 20 20 53 61 66 65  g+1];.      Safe
f8d0: 46 72 65 65 28 7a 49 66 29 3b 0a 20 20 20 20 7d  Free(zIf);.    }
f8e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 63  else{.      pInc
f8f0: 6c 75 64 65 20 3d 20 53 61 66 65 4d 61 6c 6c 6f  lude = SafeMallo
f900: 63 28 20 73 69 7a 65 6f 66 28 49 6e 63 6c 75 64  c( sizeof(Includ
f910: 65 29 20 2b 20 6e 41 72 67 20 2b 20 31 20 29 3b  e) + nArg + 1 );
f920: 0a 20 20 20 20 20 20 70 49 6e 63 6c 75 64 65 2d  .      pInclude-
f930: 3e 7a 46 69 6c 65 20 3d 20 28 63 68 61 72 2a 29  >zFile = (char*)
f940: 26 70 49 6e 63 6c 75 64 65 5b 31 5d 3b 0a 20 20  &pInclude[1];.  
f950: 20 20 20 20 73 70 72 69 6e 74 66 28 70 49 6e 63      sprintf(pInc
f960: 6c 75 64 65 2d 3e 7a 46 69 6c 65 2c 22 25 2e 2a  lude->zFile,"%.*
f970: 73 22 2c 6e 41 72 67 2c 7a 41 72 67 29 3b 0a 20  s",nArg,zArg);. 
f980: 20 20 20 20 20 70 49 6e 63 6c 75 64 65 2d 3e 7a       pInclude->z
f990: 49 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49  If = 0;.      pI
f9a0: 6e 63 6c 75 64 65 2d 3e 7a 4c 61 62 65 6c 20 3d  nclude->zLabel =
f9b0: 20 70 49 6e 63 6c 75 64 65 2d 3e 7a 46 69 6c 65   pInclude->zFile
f9c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 63  ;.    }.    pInc
f9d0: 6c 75 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e  lude->pNext = in
f9e0: 63 6c 75 64 65 4c 69 73 74 3b 0a 20 20 20 20 69  cludeList;.    i
f9f0: 6e 63 6c 75 64 65 4c 69 73 74 20 3d 20 70 49 6e  ncludeList = pIn
fa00: 63 6c 75 64 65 3b 0a 20 20 7d 65 6c 73 65 20 69  clude;.  }else i
fa10: 66 28 20 6e 43 6d 64 3d 3d 32 20 26 26 20 73 74  f( nCmd==2 && st
fa20: 72 6e 63 6d 70 28 7a 43 6d 64 2c 22 69 66 22 2c  rncmp(zCmd,"if",
fa30: 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  2)==0 ){.    /*.
fa40: 20 20 20 20 2a 2a 20 50 75 73 68 20 61 6e 20 23      ** Push an #
fa50: 69 66 2e 20 20 57 61 74 63 68 20 66 6f 72 20 74  if.  Watch for t
fa60: 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 73  he special cases
fa70: 20 6f 66 20 49 4e 54 45 52 46 41 43 45 0a 20 20   of INTERFACE.  
fa80: 20 20 2a 2a 20 61 6e 64 20 45 58 50 4f 52 54 5f    ** and EXPORT_
fa90: 49 4e 54 45 52 46 41 43 45 20 61 6e 64 20 4c 4f  INTERFACE and LO
faa0: 43 41 4c 5f 49 4e 54 45 52 46 41 43 45 0a 20 20  CAL_INTERFACE.  
fab0: 20 20 2a 2f 0a 20 20 20 20 7a 41 72 67 20 3d 20    */.    zArg = 
fac0: 26 7a 43 6d 64 5b 32 5d 3b 0a 20 20 20 20 77 68  &zCmd[2];.    wh
fad0: 69 6c 65 28 20 2a 7a 41 72 67 20 26 26 20 69 73  ile( *zArg && is
fae0: 73 70 61 63 65 28 2a 7a 41 72 67 29 20 26 26 20  space(*zArg) && 
faf0: 2a 7a 41 72 67 21 3d 27 5c 6e 27 20 29 7b 0a 20  *zArg!='\n' ){. 
fb00: 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20       zArg++;.   
fb10: 20 7d 0a 20 20 20 20 69 66 28 20 2a 7a 41 72 67   }.    if( *zArg
fb20: 3d 3d 30 20 7c 7c 20 2a 7a 41 72 67 3d 3d 27 5c  ==0 || *zArg=='\
fb30: 6e 27 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20  n' ){ return 0; 
fb40: 7d 0a 20 20 20 20 6e 41 72 67 20 3d 20 70 54 6f  }.    nArg = pTo
fb50: 6b 65 6e 2d 3e 6e 54 65 78 74 20 2b 20 28 69 6e  ken->nText + (in
fb60: 74 29 28 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74  t)(pToken->zText
fb70: 20 2d 20 7a 41 72 67 29 3b 0a 20 20 20 20 69 66   - zArg);.    if
fb80: 28 20 6e 41 72 67 3d 3d 39 20 26 26 20 73 74 72  ( nArg==9 && str
fb90: 6e 63 6d 70 28 7a 41 72 67 2c 22 49 4e 54 45 52  ncmp(zArg,"INTER
fba0: 46 41 43 45 22 2c 39 29 3d 3d 30 20 29 7b 0a 20  FACE",9)==0 ){. 
fbb0: 20 20 20 20 20 50 75 73 68 49 66 4d 61 63 72 6f       PushIfMacro
fbc0: 28 30 2c 30 2c 30 2c 70 54 6f 6b 65 6e 2d 3e 6e  (0,0,0,pToken->n
fbd0: 4c 69 6e 65 2c 50 53 5f 49 6e 74 65 72 66 61 63  Line,PS_Interfac
fbe0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
fbf0: 28 20 6e 41 72 67 3d 3d 31 36 20 26 26 20 73 74  ( nArg==16 && st
fc00: 72 6e 63 6d 70 28 7a 41 72 67 2c 22 45 58 50 4f  rncmp(zArg,"EXPO
fc10: 52 54 5f 49 4e 54 45 52 46 41 43 45 22 2c 31 36  RT_INTERFACE",16
fc20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 50 75  )==0 ){.      Pu
fc30: 73 68 49 66 4d 61 63 72 6f 28 30 2c 30 2c 30 2c  shIfMacro(0,0,0,
fc40: 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 50 53  pToken->nLine,PS
fc50: 5f 45 78 70 6f 72 74 29 3b 0a 20 20 20 20 7d 65  _Export);.    }e
fc60: 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 31 35  lse if( nArg==15
fc70: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 41 72 67   && strncmp(zArg
fc80: 2c 22 4c 4f 43 41 4c 5f 49 4e 54 45 52 46 41 43  ,"LOCAL_INTERFAC
fc90: 45 22 2c 31 35 29 3d 3d 30 20 29 7b 0a 20 20 20  E",15)==0 ){.   
fca0: 20 20 20 50 75 73 68 49 66 4d 61 63 72 6f 28 30     PushIfMacro(0
fcb0: 2c 30 2c 30 2c 70 54 6f 6b 65 6e 2d 3e 6e 4c 69  ,0,0,pToken->nLi
fcc0: 6e 65 2c 50 53 5f 4c 6f 63 61 6c 29 3b 0a 20 20  ne,PS_Local);.  
fcd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67    }else if( nArg
fce0: 3d 3d 31 35 20 26 26 20 73 74 72 6e 63 6d 70 28  ==15 && strncmp(
fcf0: 7a 41 72 67 2c 22 4d 41 4b 45 48 45 41 44 45 52  zArg,"MAKEHEADER
fd00: 53 5f 53 54 4f 50 4c 4f 43 41 4c 5f 49 4e 54 45  S_STOPLOCAL_INTE
fd10: 52 46 41 43 45 22 2c 31 35 29 3d 3d 30 20 29 7b  RFACE",15)==0 ){
fd20: 0a 20 20 20 20 20 20 50 75 73 68 49 66 4d 61 63  .      PushIfMac
fd30: 72 6f 28 30 2c 30 2c 30 2c 70 54 6f 6b 65 6e 2d  ro(0,0,0,pToken-
fd40: 3e 6e 4c 69 6e 65 2c 50 53 5f 4c 6f 63 61 6c 29  >nLine,PS_Local)
fd50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fd60: 20 20 20 50 75 73 68 49 66 4d 61 63 72 6f 28 30     PushIfMacro(0
fd70: 2c 7a 41 72 67 2c 6e 41 72 67 2c 70 54 6f 6b 65  ,zArg,nArg,pToke
fd80: 6e 2d 3e 6e 4c 69 6e 65 2c 30 29 3b 0a 20 20 20  n->nLine,0);.   
fd90: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e   }.  }else if( n
fda0: 43 6d 64 3d 3d 35 20 26 26 20 73 74 72 6e 63 6d  Cmd==5 && strncm
fdb0: 70 28 7a 43 6d 64 2c 22 69 66 64 65 66 22 2c 35  p(zCmd,"ifdef",5
fdc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  )==0 ){.    /*. 
fdd0: 20 20 20 2a 2a 20 50 75 73 68 20 61 6e 20 23 69     ** Push an #i
fde0: 66 64 65 66 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fdef..    */.   
fdf0: 20 7a 41 72 67 20 3d 20 26 7a 43 6d 64 5b 35 5d   zArg = &zCmd[5]
fe00: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 41  ;.    while( *zA
fe10: 72 67 20 26 26 20 69 73 73 70 61 63 65 28 2a 7a  rg && isspace(*z
fe20: 41 72 67 29 20 26 26 20 2a 7a 41 72 67 21 3d 27  Arg) && *zArg!='
fe30: 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 7a 41 72  \n' ){.      zAr
fe40: 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  g++;.    }.    i
fe50: 66 28 20 2a 7a 41 72 67 3d 3d 30 20 7c 7c 20 2a  f( *zArg==0 || *
fe60: 7a 41 72 67 3d 3d 27 5c 6e 27 20 29 7b 20 72 65  zArg=='\n' ){ re
fe70: 74 75 72 6e 20 30 3b 20 7d 0a 20 20 20 20 6e 41  turn 0; }.    nA
fe80: 72 67 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65  rg = pToken->nTe
fe90: 78 74 20 2b 20 28 69 6e 74 29 28 70 54 6f 6b 65  xt + (int)(pToke
fea0: 6e 2d 3e 7a 54 65 78 74 20 2d 20 7a 41 72 67 29  n->zText - zArg)
feb0: 3b 0a 20 20 20 20 50 75 73 68 49 66 4d 61 63 72  ;.    PushIfMacr
fec0: 6f 28 22 64 65 66 69 6e 65 64 22 2c 7a 41 72 67  o("defined",zArg
fed0: 2c 6e 41 72 67 2c 70 54 6f 6b 65 6e 2d 3e 6e 4c  ,nArg,pToken->nL
fee0: 69 6e 65 2c 30 29 3b 0a 20 20 7d 65 6c 73 65 20  ine,0);.  }else 
fef0: 69 66 28 20 6e 43 6d 64 3d 3d 36 20 26 26 20 73  if( nCmd==6 && s
ff00: 74 72 6e 63 6d 70 28 7a 43 6d 64 2c 22 69 66 6e  trncmp(zCmd,"ifn
ff10: 64 65 66 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20  def",6)==0 ){.  
ff20: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 75 73 68    /*.    ** Push
ff30: 20 61 6e 20 23 69 66 6e 64 65 66 2e 0a 20 20 20   an #ifndef..   
ff40: 20 2a 2f 0a 20 20 20 20 7a 41 72 67 20 3d 20 26   */.    zArg = &
ff50: 7a 43 6d 64 5b 36 5d 3b 0a 20 20 20 20 77 68 69  zCmd[6];.    whi
ff60: 6c 65 28 20 2a 7a 41 72 67 20 26 26 20 69 73 73  le( *zArg && iss
ff70: 70 61 63 65 28 2a 7a 41 72 67 29 20 26 26 20 2a  pace(*zArg) && *
ff80: 7a 41 72 67 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  zArg!='\n' ){.  
ff90: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20      zArg++;.    
ffa0: 7d 0a 20 20 20 20 69 66 28 20 2a 7a 41 72 67 3d  }.    if( *zArg=
ffb0: 3d 30 20 7c 7c 20 2a 7a 41 72 67 3d 3d 27 5c 6e  =0 || *zArg=='\n
ffc0: 27 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  ' ){ return 0; }
ffd0: 0a 20 20 20 20 6e 41 72 67 20 3d 20 70 54 6f 6b  .    nArg = pTok
ffe0: 65 6e 2d 3e 6e 54 65 78 74 20 2b 20 28 69 6e 74  en->nText + (int
fff0: 29 28 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 20  )(pToken->zText 
10000 2d 20 7a 41 72 67 29 3b 0a 20 20 20 20 50 75 73  - zArg);.    Pus
10010 68 49 66 4d 61 63 72 6f 28 22 21 64 65 66 69 6e  hIfMacro("!defin
10020 65 64 22 2c 7a 41 72 67 2c 6e 41 72 67 2c 70 54  ed",zArg,nArg,pT
10030 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 30 29 3b 0a  oken->nLine,0);.
10040 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 6d 64    }else if( nCmd
10050 3d 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28 7a  ==4 && strncmp(z
10060 43 6d 64 2c 22 65 6c 73 65 22 2c 34 29 3d 3d 30  Cmd,"else",4)==0
10070 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
10080 2a 20 49 6e 76 65 72 74 20 74 68 65 20 23 69 66  * Invert the #if
10090 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
100a0 68 65 20 73 74 61 63 6b 0a 20 20 20 20 2a 2f 0a  he stack.    */.
100b0 20 20 20 20 69 66 28 20 69 66 53 74 61 63 6b 3d      if( ifStack=
100c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
100d0 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25  ntf(stderr,"%s:%
100e0 64 3a 20 27 23 65 6c 73 65 27 20 77 69 74 68 6f  d: '#else' witho
100f0 75 74 20 61 6e 20 27 23 69 66 27 5c 6e 22 2c 7a  ut an '#if'\n",z
10100 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
10110 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65     pToken->nLine
10120 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10130 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 66  1;.    }.    pIf
10140 20 3d 20 69 66 53 74 61 63 6b 3b 0a 20 20 20 20   = ifStack;.    
10150 69 66 28 20 70 49 66 2d 3e 7a 43 6f 6e 64 69 74  if( pIf->zCondit
10160 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 53  ion ){.      ifS
10170 74 61 63 6b 20 3d 20 69 66 53 74 61 63 6b 2d 3e  tack = ifStack->
10180 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 50 75 73  pNext;.      Pus
10190 68 49 66 4d 61 63 72 6f 28 22 21 22 2c 70 49 66  hIfMacro("!",pIf
101a0 2d 3e 7a 43 6f 6e 64 69 74 69 6f 6e 2c 73 74 72  ->zCondition,str
101b0 6c 65 6e 28 70 49 66 2d 3e 7a 43 6f 6e 64 69 74  len(pIf->zCondit
101c0 69 6f 6e 29 2c 70 49 66 2d 3e 6e 4c 69 6e 65 2c  ion),pIf->nLine,
101d0 30 29 3b 0a 20 20 20 20 20 20 53 61 66 65 46 72  0);.      SafeFr
101e0 65 65 28 70 49 66 29 3b 0a 20 20 20 20 7d 65 6c  ee(pIf);.    }el
101f0 73 65 7b 0a 20 20 20 20 20 20 70 49 66 2d 3e 66  se{.      pIf->f
10200 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  lags = 0;.    }.
10210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a    }else{.    /*.
10220 20 20 20 20 2a 2a 20 54 68 69 73 20 64 69 72 65      ** This dire
10230 63 74 69 76 65 20 63 61 6e 20 62 65 20 73 61 66  ctive can be saf
10240 65 6c 79 20 69 67 6e 6f 72 65 64 0a 20 20 20 20  ely ignored.    
10250 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
10260 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
10270 52 65 63 6f 6d 70 75 74 65 20 74 68 65 20 70 72  Recompute the pr
10280 65 73 65 74 20 66 6c 61 67 73 0a 20 20 2a 2f 0a  eset flags.  */.
10290 20 20 2a 70 50 72 65 73 65 74 46 6c 61 67 73 20    *pPresetFlags 
102a0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 49 66 20 3d  = 0;.  for(pIf =
102b0 20 69 66 53 74 61 63 6b 3b 20 70 49 66 3b 20 70   ifStack; pIf; p
102c0 49 66 3d 70 49 66 2d 3e 70 4e 65 78 74 29 7b 0a  If=pIf->pNext){.
102d0 20 20 20 20 2a 70 50 72 65 73 65 74 46 6c 61 67      *pPresetFlag
102e0 73 20 7c 3d 20 70 49 66 2d 3e 66 6c 61 67 73 3b  s |= pIf->flags;
102f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
10300 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  Err;.}../*.** Pa
10310 72 73 65 20 61 6e 20 65 6e 74 69 72 65 20 66 69  rse an entire fi
10320 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
10330 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
10340 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
10350 20 61 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65 6e   a list of token
10360 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  s in the file.  
10370 57 68 69 74 65 73 70 61 63 65 20 74 6f 6b 65 6e  Whitespace token
10380 73 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 65  s have been.** e
10390 6c 69 6d 69 6e 61 74 65 64 2c 20 61 6e 64 20 74  liminated, and t
103a0 65 78 74 20 77 69 74 68 20 7b 2e 2e 2e 7d 20 68  ext with {...} h
103b0 61 73 20 62 65 65 6e 20 63 6f 6c 6c 61 70 73 65  as been collapse
103c0 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e 67  d into a.** sing
103d0 6c 65 20 54 54 5f 42 72 61 63 65 20 74 6f 6b 65  le TT_Brace toke
103e0 6e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 69 74 46 6c 61  n..**.** initFla
103f0 67 73 20 61 72 65 20 61 20 73 65 74 20 6f 66 20  gs are a set of 
10400 70 61 72 73 65 20 66 6c 61 67 73 20 74 68 61 74  parse flags that
10410 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
10420 65 20 73 65 74 20 66 6f 72 20 74 68 69 73 0a 2a  e set for this.*
10430 2a 20 66 69 6c 65 2e 20 20 46 6f 72 20 2e 63 20  * file.  For .c 
10440 66 69 6c 65 73 20 74 68 69 73 20 69 73 20 6e 6f  files this is no
10450 72 6d 61 6c 6c 79 20 30 2e 20 20 46 6f 72 20 2e  rmally 0.  For .
10460 68 20 66 69 6c 65 73 20 69 74 20 69 73 20 50 53  h files it is PS
10470 5f 49 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73  _Interface..*/.s
10480 74 61 74 69 63 20 69 6e 74 20 50 61 72 73 65 46  tatic int ParseF
10490 69 6c 65 28 54 6f 6b 65 6e 20 2a 70 4c 69 73 74  ile(Token *pList
104a0 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 73 29  , int initFlags)
104b0 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  {.  int nErr = 0
104c0 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  ;.  Token *pStar
104d0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61  t = 0;.  int fla
104e0 67 73 20 3d 20 69 6e 69 74 46 6c 61 67 73 3b 0a  gs = initFlags;.
104f0 20 20 69 6e 74 20 70 72 65 73 65 74 46 6c 61 67    int presetFlag
10500 73 20 3d 20 69 6e 69 74 46 6c 61 67 73 3b 0a 20  s = initFlags;. 
10510 20 69 6e 74 20 72 65 73 65 74 46 6c 61 67 20 3d   int resetFlag =
10520 20 30 3b 0a 0a 20 20 69 6e 63 6c 75 64 65 4c 69   0;..  includeLi
10530 73 74 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  st = 0;.  while(
10540 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 77   pList ){.    sw
10550 69 74 63 68 28 20 70 4c 69 73 74 2d 3e 65 54 79  itch( pList->eTy
10560 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  pe ){.    case T
10570 54 5f 45 4f 46 3a 0a 20 20 20 20 20 20 67 6f 74  T_EOF:.      got
10580 6f 20 65 6e 64 5f 6f 66 5f 6c 6f 6f 70 3b 0a 0a  o end_of_loop;..
10590 20 20 20 20 63 61 73 65 20 54 54 5f 50 72 65 70      case TT_Prep
105a0 72 6f 63 65 73 73 6f 72 3a 0a 20 20 20 20 20 20  rocessor:.      
105b0 6e 45 72 72 20 2b 3d 20 50 61 72 73 65 50 72 65  nErr += ParsePre
105c0 70 72 6f 63 65 73 73 6f 72 28 70 4c 69 73 74 2c  processor(pList,
105d0 66 6c 61 67 73 2c 26 70 72 65 73 65 74 46 6c 61  flags,&presetFla
105e0 67 73 29 3b 0a 20 20 20 20 20 20 70 53 74 61 72  gs);.      pStar
105f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 72 65  t = 0;.      pre
10600 73 65 74 46 6c 61 67 73 20 7c 3d 20 69 6e 69 74  setFlags |= init
10610 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 66 6c 61  Flags;.      fla
10620 67 73 20 3d 20 70 72 65 73 65 74 46 6c 61 67 73  gs = presetFlags
10630 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
10640 20 20 20 20 63 61 73 65 20 54 54 5f 4f 74 68 65      case TT_Othe
10650 72 3a 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  r:.      switch(
10660 20 70 4c 69 73 74 2d 3e 7a 54 65 78 74 5b 30 5d   pList->zText[0]
10670 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27   ){.      case '
10680 3b 27 3a 0a 20 20 20 20 20 20 20 20 6e 45 72 72  ;':.        nErr
10690 20 2b 3d 20 50 72 6f 63 65 73 73 44 65 63 6c 28   += ProcessDecl(
106a0 70 53 74 61 72 74 2c 70 4c 69 73 74 2c 66 6c 61  pStart,pList,fla
106b0 67 73 29 3b 0a 20 20 20 20 20 20 20 20 70 53 74  gs);.        pSt
106c0 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  art = 0;.       
106d0 20 66 6c 61 67 73 20 3d 20 70 72 65 73 65 74 46   flags = presetF
106e0 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 62 72  lags;.        br
106f0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
10700 20 27 3d 27 3a 0a 20 20 20 20 20 20 20 20 69 66   '=':.        if
10710 28 20 70 4c 69 73 74 2d 3e 70 50 72 65 76 2d 3e  ( pList->pPrev->
10720 6e 54 65 78 74 3d 3d 38 0a 20 20 20 20 20 20 20  nText==8.       
10730 20 20 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28       && strncmp(
10740 70 4c 69 73 74 2d 3e 70 50 72 65 76 2d 3e 7a 54  pList->pPrev->zT
10750 65 78 74 2c 22 6f 70 65 72 61 74 6f 72 22 2c 38  ext,"operator",8
10760 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10770 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10780 20 7d 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20   }.        nErr 
10790 2b 3d 20 50 72 6f 63 65 73 73 44 65 63 6c 28 70  += ProcessDecl(p
107a0 53 74 61 72 74 2c 70 4c 69 73 74 2c 66 6c 61 67  Start,pList,flag
107b0 73 29 3b 0a 20 20 20 20 20 20 20 20 70 53 74 61  s);.        pSta
107c0 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rt = 0;.        
107d0 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20  while( pList && 
107e0 70 4c 69 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 21  pList->zText[0]!
107f0 3d 27 3b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =';' ){.        
10800 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
10810 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
10820 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  }.        if( pL
10830 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e  ist==0 ) goto en
10840 64 5f 6f 66 5f 6c 6f 6f 70 3b 0a 20 20 20 20 20  d_of_loop;.     
10850 20 20 20 66 6c 61 67 73 20 3d 20 70 72 65 73 65     flags = prese
10860 74 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20  tFlags;.        
10870 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61  break;..      ca
10880 73 65 20 27 3a 27 3a 0a 20 20 20 20 20 20 20 20  se ':':.        
10890 69 66 28 20 70 4c 69 73 74 2d 3e 7a 54 65 78 74  if( pList->zText
108a0 5b 31 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20  [1]==':' ){.    
108b0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 50        flags |= P
108c0 53 5f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20  S_Method;.      
108d0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
108e0 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c  k;..      defaul
108f0 74 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  t:.        break
10900 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10910 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
10920 20 54 54 5f 42 72 61 63 65 73 3a 0a 20 20 20 20   TT_Braces:.    
10930 20 20 6e 45 72 72 20 2b 3d 20 50 72 6f 63 65 73    nErr += Proces
10940 73 50 72 6f 63 65 64 75 72 65 44 65 66 28 70 53  sProcedureDef(pS
10950 74 61 72 74 2c 70 4c 69 73 74 2c 66 6c 61 67 73  tart,pList,flags
10960 29 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74 20  );.      pStart 
10970 3d 20 30 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  = 0;.      flags
10980 20 3d 20 70 72 65 73 65 74 46 6c 61 67 73 3b 0a   = presetFlags;.
10990 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
109a0 20 20 63 61 73 65 20 54 54 5f 49 64 3a 0a 20 20    case TT_Id:.  
109b0 20 20 20 20 20 69 66 28 20 70 53 74 61 72 74 3d       if( pStart=
109c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
109d0 70 53 74 61 72 74 20 3d 20 70 4c 69 73 74 3b 0a  pStart = pList;.
109e0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
109f0 3d 20 70 72 65 73 65 74 46 6c 61 67 73 3b 0a 20  = presetFlags;. 
10a00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 72        }.       r
10a10 65 73 65 74 46 6c 61 67 20 3d 20 30 3b 0a 20 20  esetFlag = 0;.  
10a20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 4c 69       switch( pLi
10a30 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 20 29 7b 0a  st->zText[0] ){.
10a40 20 20 20 20 20 20 20 63 61 73 65 20 27 63 27 3a         case 'c':
10a50 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  .         if( pL
10a60 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 35 20 26 26  ist->nText==5 &&
10a70 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d 3e   strncmp(pList->
10a80 7a 54 65 78 74 2c 22 63 6c 61 73 73 22 2c 35 29  zText,"class",5)
10a90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10aa0 20 20 6e 45 72 72 20 2b 3d 20 50 72 6f 63 65 73    nErr += Proces
10ab0 73 54 79 70 65 44 65 63 6c 28 70 4c 69 73 74 2c  sTypeDecl(pList,
10ac0 66 6c 61 67 73 2c 26 72 65 73 65 74 46 6c 61 67  flags,&resetFlag
10ad0 29 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20 20  );.         }.  
10ae0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
10af0 20 20 20 20 20 20 63 61 73 65 20 27 45 27 3a 0a        case 'E':.
10b00 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 69           if( pLi
10b10 73 74 2d 3e 6e 54 65 78 74 3d 3d 36 20 26 26 20  st->nText==6 && 
10b20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 7a  strncmp(pList->z
10b30 54 65 78 74 2c 22 45 58 50 4f 52 54 22 2c 36 29  Text,"EXPORT",6)
10b40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10b50 20 20 66 6c 61 67 73 20 7c 3d 20 50 53 5f 45 78    flags |= PS_Ex
10b60 70 6f 72 74 32 3b 0a 20 20 20 20 20 20 20 20 20  port2;.         
10b70 20 20 2f 2a 20 70 53 74 61 72 74 20 3d 20 30 3b    /* pStart = 0;
10b80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7d 0a 20   */.         }. 
10b90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
10ba0 20 20 20 20 20 20 20 63 61 73 65 20 27 65 27 3a         case 'e':
10bb0 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  .         if( pL
10bc0 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 34 20 26 26  ist->nText==4 &&
10bd0 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d 3e   strncmp(pList->
10be0 7a 54 65 78 74 2c 22 65 6e 75 6d 22 2c 34 29 3d  zText,"enum",4)=
10bf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10c00 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 4e 65 78   if( pList->pNex
10c10 74 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  t && pList->pNex
10c20 74 2d 3e 65 54 79 70 65 3d 3d 54 54 5f 42 72 61  t->eType==TT_Bra
10c30 63 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ces ){.         
10c40 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
10c50 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
10c60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10c70 20 20 20 20 20 20 20 20 20 6e 45 72 72 20 2b 3d           nErr +=
10c80 20 50 72 6f 63 65 73 73 54 79 70 65 44 65 63 6c   ProcessTypeDecl
10c90 28 70 4c 69 73 74 2c 66 6c 61 67 73 2c 26 72 65  (pList,flags,&re
10ca0 73 65 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  setFlag);.      
10cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10cc0 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d  }else if( pList-
10cd0 3e 6e 54 65 78 74 3d 3d 36 20 26 26 20 73 74 72  >nText==6 && str
10ce0 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78  ncmp(pList->zTex
10cf0 74 2c 22 65 78 74 65 72 6e 22 2c 36 29 3d 3d 30  t,"extern",6)==0
10d00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70   ){.           p
10d10 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 4e  List = pList->pN
10d20 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ext;.           
10d30 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
10d40 73 74 2d 3e 6e 54 65 78 74 3d 3d 33 20 26 26 20  st->nText==3 && 
10d50 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 7a  strncmp(pList->z
10d60 54 65 78 74 2c 22 5c 22 43 5c 22 22 2c 33 29 3d  Text,"\"C\"",3)=
10d70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10d80 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
10d90 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
10da0 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
10db0 44 50 5f 43 70 6c 75 73 70 6c 75 73 3b 0a 20 20  DP_Cplusplus;.  
10dc0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 61               fla
10de0 67 73 20 7c 3d 20 50 53 5f 45 78 74 65 72 6e 3b  gs |= PS_Extern;
10df0 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  .           }.  
10e00 20 20 20 20 20 20 20 20 20 70 53 74 61 72 74 20           pStart 
10e10 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = pList;.       
10e20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 62 72 65    }.         bre
10e30 61 6b 3b 0a 0a 20 20 20 20 20 20 20 63 61 73 65  ak;..       case
10e40 20 27 69 27 3a 0a 20 20 20 20 20 20 20 20 20 69   'i':.         i
10e50 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d  f( pList->nText=
10e60 3d 36 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c  =6 && strncmp(pL
10e70 69 73 74 2d 3e 7a 54 65 78 74 2c 22 69 6e 6c 69  ist->zText,"inli
10e80 6e 65 22 2c 36 29 3d 3d 30 0a 20 20 20 20 20 20  ne",6)==0.      
10e90 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
10ea0 50 53 5f 53 74 61 74 69 63 29 3d 3d 30 0a 20 20  PS_Static)==0.  
10eb0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
10ec0 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 50 72 6f       nErr += Pro
10ed0 63 65 73 73 49 6e 6c 69 6e 65 50 72 6f 63 28 70  cessInlineProc(p
10ee0 4c 69 73 74 2c 66 6c 61 67 73 2c 26 72 65 73 65  List,flags,&rese
10ef0 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 20 20  tFlag);.        
10f00 20 7d 0a 20 20 20 20 20 20 20 20 20 62 72 65 61   }.         brea
10f10 6b 3b 0a 0a 20 20 20 20 20 20 20 63 61 73 65 20  k;..       case 
10f20 27 4c 27 3a 0a 20 20 20 20 20 20 20 20 20 69 66  'L':.         if
10f30 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d  ( pList->nText==
10f40 35 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69  5 && strncmp(pLi
10f50 73 74 2d 3e 7a 54 65 78 74 2c 22 4c 4f 43 41 4c  st->zText,"LOCAL
10f60 22 2c 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",5)==0 ){.     
10f70 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 50        flags |= P
10f80 53 5f 4c 6f 63 61 6c 32 3b 0a 20 20 20 20 20 20  S_Local2;.      
10f90 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 4c       pStart = pL
10fa0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a  ist;.         }.
10fb0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
10fc0 0a 20 20 20 20 20 20 20 63 61 73 65 20 27 50 27  .       case 'P'
10fd0 3a 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 70  :.         if( p
10fe0 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 36 20 26  List->nText==6 &
10ff0 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d  & strncmp(pList-
11000 3e 7a 54 65 78 74 2c 20 22 50 55 42 4c 49 43 22  >zText, "PUBLIC"
11010 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,6)==0 ){.      
11020 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 50 53       flags |= PS
11030 5f 50 75 62 6c 69 63 3b 0a 20 20 20 20 20 20 20  _Public;.       
11040 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 4c 69      pStart = pLi
11050 73 74 3b 0a 20 20 20 20 20 20 20 20 20 7d 65 6c  st;.         }el
11060 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 54  se if( pList->nT
11070 65 78 74 3d 3d 37 20 26 26 20 73 74 72 6e 63 6d  ext==7 && strncm
11080 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 20  p(pList->zText, 
11090 22 50 52 49 56 41 54 45 22 2c 37 29 3d 3d 30 20  "PRIVATE",7)==0 
110a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 66 6c  ){.           fl
110b0 61 67 73 20 7c 3d 20 50 53 5f 50 72 69 76 61 74  ags |= PS_Privat
110c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  e;.           pS
110d0 74 61 72 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  tart = pList;.  
110e0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
110f0 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 39   pList->nText==9
11100 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 73   && strncmp(pLis
11110 74 2d 3e 7a 54 65 78 74 2c 22 50 52 4f 54 45 43  t->zText,"PROTEC
11120 54 45 44 22 2c 39 29 3d 3d 30 20 29 7b 0a 20 20  TED",9)==0 ){.  
11130 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
11140 3d 20 50 53 5f 50 72 6f 74 65 63 74 65 64 3b 0a  = PS_Protected;.
11150 20 20 20 20 20 20 20 20 20 20 20 70 53 74 61 72             pStar
11160 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  t = pList;.     
11170 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 62      }.         b
11180 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 63 61  reak;..       ca
11190 73 65 20 27 73 27 3a 0a 20 20 20 20 20 20 20 20  se 's':.        
111a0 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78   if( pList->nTex
111b0 74 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d 70 28  t==6 && strncmp(
111c0 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 22 73 74  pList->zText,"st
111d0 72 75 63 74 22 2c 36 29 3d 3d 30 20 29 7b 0a 20  ruct",6)==0 ){. 
111e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c            if( pL
111f0 69 73 74 2d 3e 70 4e 65 78 74 20 26 26 20 70 4c  ist->pNext && pL
11200 69 73 74 2d 3e 70 4e 65 78 74 2d 3e 65 54 79 70  ist->pNext->eTyp
11210 65 3d 3d 54 54 5f 42 72 61 63 65 73 20 29 7b 0a  e==TT_Braces ){.
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 69               pLi
11230 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 4e 65 78  st = pList->pNex
11240 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 65  t;.           }e
11250 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
11260 20 20 6e 45 72 72 20 2b 3d 20 50 72 6f 63 65 73    nErr += Proces
11270 73 54 79 70 65 44 65 63 6c 28 70 4c 69 73 74 2c  sTypeDecl(pList,
11280 66 6c 61 67 73 2c 26 72 65 73 65 74 46 6c 61 67  flags,&resetFlag
11290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  );.           }.
112a0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
112b0 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d  f( pList->nText=
112c0 3d 36 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c  =6 && strncmp(pL
112d0 69 73 74 2d 3e 7a 54 65 78 74 2c 22 73 74 61 74  ist->zText,"stat
112e0 69 63 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20  ic",6)==0 ){.   
112f0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
11300 20 50 53 5f 53 74 61 74 69 63 3b 0a 20 20 20 20   PS_Static;.    
11310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11320 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 63  break;..       c
11330 61 73 65 20 27 74 27 3a 0a 20 20 20 20 20 20 20  ase 't':.       
11340 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65    if( pList->nTe
11350 78 74 3d 3d 37 20 26 26 20 73 74 72 6e 63 6d 70  xt==7 && strncmp
11360 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 22 74  (pList->zText,"t
11370 79 70 65 64 65 66 22 2c 37 29 3d 3d 30 20 29 7b  ypedef",7)==0 ){
11380 0a 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  .           flag
11390 73 20 7c 3d 20 50 53 5f 54 79 70 65 64 65 66 3b  s |= PS_Typedef;
113a0 0a 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  .         }.    
113b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
113c0 20 20 20 20 63 61 73 65 20 27 75 27 3a 0a 20 20      case 'u':.  
113d0 20 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74         if( pList
113e0 2d 3e 6e 54 65 78 74 3d 3d 35 20 26 26 20 73 74  ->nText==5 && st
113f0 72 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65  rncmp(pList->zTe
11400 78 74 2c 22 75 6e 69 6f 6e 22 2c 35 29 3d 3d 30  xt,"union",5)==0
11410 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 69   ){.           i
11420 66 28 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20  f( pList->pNext 
11430 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 2d  && pList->pNext-
11440 3e 65 54 79 70 65 3d 3d 54 54 5f 42 72 61 63 65  >eType==TT_Brace
11450 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
11460 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
11470 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
11480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11490 20 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 50         nErr += P
114a0 72 6f 63 65 73 73 54 79 70 65 44 65 63 6c 28 70  rocessTypeDecl(p
114b0 4c 69 73 74 2c 66 6c 61 67 73 2c 26 72 65 73 65  List,flags,&rese
114c0 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 20 20  tFlag);.        
114d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 7d 0a     }.         }.
114e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
114f0 0a 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  .       default:
11500 0a 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  .         break;
11510 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
11520 20 69 66 28 20 72 65 73 65 74 46 6c 61 67 21 3d   if( resetFlag!=
11530 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 77 68  0 ){.         wh
11540 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 70 4c  ile( pList && pL
11550 69 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 21 3d 72  ist->zText[0]!=r
11560 65 73 65 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  esetFlag ){.    
11570 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70         pList = p
11580 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
11590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
115a0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
115b0 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 6c 6f 6f 70  goto end_of_loop
115c0 3b 0a 20 20 20 20 20 20 20 20 20 70 53 74 61 72  ;.         pStar
115d0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
115e0 66 6c 61 67 73 20 3d 20 70 72 65 73 65 74 46 6c  flags = presetFl
115f0 61 67 73 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20  ags;.       }.  
11600 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
11610 20 63 61 73 65 20 54 54 5f 53 74 72 69 6e 67 3a   case TT_String:
11620 0a 20 20 20 20 63 61 73 65 20 54 54 5f 4e 75 6d  .    case TT_Num
11630 62 65 72 3a 0a 20 20 20 20 20 20 20 62 72 65 61  ber:.       brea
11640 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
11650 0a 20 20 20 20 20 20 20 70 53 74 61 72 74 20 3d  .       pStart =
11660 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 66   pList;.       f
11670 6c 61 67 73 20 3d 20 70 72 65 73 65 74 46 6c 61  lags = presetFla
11680 67 73 3b 0a 20 20 20 20 20 20 20 62 72 65 61 6b  gs;.       break
11690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
116a0 74 20 3d 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74  t = pList->pNext
116b0 3b 0a 20 20 7d 0a 20 20 65 6e 64 5f 6f 66 5f 6c  ;.  }.  end_of_l
116c0 6f 6f 70 3a 0a 0a 20 20 2f 2a 20 56 65 72 69 66  oop:..  /* Verif
116d0 79 20 74 68 61 74 20 61 6c 6c 20 23 69 66 73 20  y that all #ifs 
116e0 68 61 76 65 20 61 20 6d 61 74 63 68 69 6e 67 20  have a matching 
116f0 22 23 65 6e 64 69 66 22 20 2a 2f 0a 20 20 77 68  "#endif" */.  wh
11700 69 6c 65 28 20 69 66 53 74 61 63 6b 20 29 7b 0a  ile( ifStack ){.
11710 20 20 20 20 49 66 6d 61 63 72 6f 20 2a 70 49 66      Ifmacro *pIf
11720 20 3d 20 69 66 53 74 61 63 6b 3b 0a 20 20 20 20   = ifStack;.    
11730 69 66 53 74 61 63 6b 20 3d 20 70 49 66 2d 3e 70  ifStack = pIf->p
11740 4e 65 78 74 3b 0a 20 20 20 20 66 70 72 69 6e 74  Next;.    fprint
11750 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a  f(stderr,"%s:%d:
11760 20 54 68 69 73 20 27 23 69 66 27 20 68 61 73 20   This '#if' has 
11770 6e 6f 20 27 23 65 6e 64 69 66 27 5c 6e 22 2c 7a  no '#endif'\n",z
11780 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
11790 70 49 66 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20  pIf->nLine);.   
117a0 20 53 61 66 65 46 72 65 65 28 70 49 66 29 3b 0a   SafeFree(pIf);.
117b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 45    }..  return nE
117c0 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rr;.}../*.** If 
117d0 74 68 65 20 67 69 76 65 6e 20 44 65 63 6c 20 6f  the given Decl o
117e0 62 6a 65 63 74 20 68 61 73 20 61 20 6e 6f 6e 2d  bject has a non-
117f0 6e 75 6c 6c 20 7a 45 78 74 72 61 20 66 69 65 6c  null zExtra fiel
11800 64 2c 20 74 68 65 6e 20 74 68 65 20 74 65 78 74  d, then the text
11810 0a 2a 2a 20 6f 66 20 74 68 61 74 20 7a 45 78 74  .** of that zExt
11820 72 61 20 66 69 65 6c 64 20 6e 65 65 64 73 20 74  ra field needs t
11830 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  o be inserted in
11840 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
11850 68 65 0a 2a 2a 20 7a 44 65 63 6c 20 66 69 65 6c  he.** zDecl fiel
11860 64 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73  d before the las
11870 74 20 22 7d 22 20 69 6e 20 74 68 65 20 7a 44 65  t "}" in the zDe
11880 63 6c 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  cl.  This routin
11890 65 20 64 6f 65 73 20 74 68 61 74 2e 0a 2a 2a 20  e does that..** 
118a0 49 66 20 74 68 65 20 7a 45 78 74 72 61 20 69 73  If the zExtra is
118b0 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72 6f 75 74   NULL, this rout
118c0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
118d0 2a 2a 0a 2a 2a 20 7a 45 78 74 72 61 20 68 6f 6c  **.** zExtra hol
118e0 64 73 20 65 78 74 72 61 20 6d 65 74 68 6f 64 20  ds extra method 
118f0 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72  declarations for
11900 20 63 6c 61 73 73 65 73 2e 20 20 54 68 65 20 64   classes.  The d
11910 65 63 6c 61 72 61 74 69 6f 6e 73 0a 2a 2a 20 68  eclarations.** h
11920 61 76 65 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ave to be insert
11930 65 64 20 69 6e 74 6f 20 74 68 65 20 63 6c 61 73  ed into the clas
11940 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  s definition..*/
11950 0a 73 74 61 74 69 63 20 76 6f 69 64 20 49 6e 73  .static void Ins
11960 65 72 74 45 78 74 72 61 44 65 63 6c 28 44 65 63  ertExtraDecl(Dec
11970 6c 20 2a 70 44 65 63 6c 29 7b 0a 20 20 69 6e 74  l *pDecl){.  int
11980 20 69 3b 0a 20 20 53 74 72 69 6e 67 20 73 74 72   i;.  String str
11990 3b 0a 0a 20 20 69 66 28 20 70 44 65 63 6c 3d 3d  ;..  if( pDecl==
119a0 30 20 7c 7c 20 70 44 65 63 6c 2d 3e 7a 45 78 74  0 || pDecl->zExt
119b0 72 61 3d 3d 30 20 7c 7c 20 70 44 65 63 6c 2d 3e  ra==0 || pDecl->
119c0 7a 44 65 63 6c 3d 3d 30 20 29 20 72 65 74 75 72  zDecl==0 ) retur
119d0 6e 3b 0a 20 20 69 20 3d 20 73 74 72 6c 65 6e 28  n;.  i = strlen(
119e0 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 29 20 2d 20  pDecl->zDecl) - 
119f0 31 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  1;.  while( i>0 
11a00 26 26 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 5b  && pDecl->zDecl[
11a10 69 5d 21 3d 27 7d 27 20 29 7b 20 69 2d 2d 3b 20  i]!='}' ){ i--; 
11a20 7d 0a 20 20 53 74 72 69 6e 67 49 6e 69 74 28 26  }.  StringInit(&
11a30 73 74 72 29 3b 0a 20 20 53 74 72 69 6e 67 41 70  str);.  StringAp
11a40 70 65 6e 64 28 26 73 74 72 2c 20 70 44 65 63 6c  pend(&str, pDecl
11a50 2d 3e 7a 44 65 63 6c 2c 20 69 29 3b 0a 20 20 53  ->zDecl, i);.  S
11a60 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72  tringAppend(&str
11a70 2c 20 70 44 65 63 6c 2d 3e 7a 45 78 74 72 61 2c  , pDecl->zExtra,
11a80 20 30 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70   0);.  StringApp
11a90 65 6e 64 28 26 73 74 72 2c 20 26 70 44 65 63 6c  end(&str, &pDecl
11aa0 2d 3e 7a 44 65 63 6c 5b 69 5d 2c 20 30 29 3b 0a  ->zDecl[i], 0);.
11ab0 20 20 53 61 66 65 46 72 65 65 28 70 44 65 63 6c    SafeFree(pDecl
11ac0 2d 3e 7a 44 65 63 6c 29 3b 0a 20 20 53 61 66 65  ->zDecl);.  Safe
11ad0 46 72 65 65 28 70 44 65 63 6c 2d 3e 7a 45 78 74  Free(pDecl->zExt
11ae0 72 61 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a 44  ra);.  pDecl->zD
11af0 65 63 6c 20 3d 20 53 74 72 44 75 70 28 53 74 72  ecl = StrDup(Str
11b00 69 6e 67 47 65 74 28 26 73 74 72 29 2c 20 30 29  ingGet(&str), 0)
11b10 3b 0a 20 20 53 74 72 69 6e 67 52 65 73 65 74 28  ;.  StringReset(
11b20 26 73 74 72 29 3b 0a 20 20 70 44 65 63 6c 2d 3e  &str);.  pDecl->
11b30 7a 45 78 74 72 61 20 3d 20 30 3b 0a 7d 0a 0a 2f  zExtra = 0;.}../
11b40 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 44  *.** Reset the D
11b50 50 5f 46 6f 72 77 61 72 64 20 61 6e 64 20 44 50  P_Forward and DP
11b60 5f 44 65 63 6c 61 72 65 64 20 66 6c 61 67 73 20  _Declared flags 
11b70 6f 6e 20 61 6c 6c 20 44 65 63 6c 20 73 74 72 75  on all Decl stru
11b80 63 74 75 72 65 73 2e 0a 2a 2a 20 53 65 74 20 62  ctures..** Set b
11b90 6f 74 68 20 66 6c 61 67 73 20 66 6f 72 20 61 6e  oth flags for an
11ba0 79 74 68 69 6e 67 20 74 68 61 74 20 69 73 20 74  ything that is t
11bb0 61 67 67 65 64 20 61 73 20 6c 6f 63 61 6c 20 61  agged as local a
11bc0 6e 64 20 69 73 6e 27 74 0a 2a 2a 20 69 6e 20 74  nd isn't.** in t
11bd0 68 65 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d  he file zFilenam
11be0 65 20 73 6f 20 74 68 61 74 20 69 74 20 77 6f 6e  e so that it won
11bf0 27 74 20 62 65 20 70 72 69 6e 74 69 6e 67 20 69  't be printing i
11c00 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 2e 0a 2a  n other files..*
11c10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 52 65  /.static void Re
11c20 73 65 74 44 65 63 6c 46 6c 61 67 73 28 63 68 61  setDeclFlags(cha
11c30 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
11c40 20 44 65 63 6c 20 2a 70 44 65 63 6c 3b 0a 0a 20   Decl *pDecl;.. 
11c50 20 66 6f 72 28 70 44 65 63 6c 20 3d 20 70 44 65   for(pDecl = pDe
11c60 63 6c 46 69 72 73 74 3b 20 70 44 65 63 6c 3b 20  clFirst; pDecl; 
11c70 70 44 65 63 6c 20 3d 20 70 44 65 63 6c 2d 3e 70  pDecl = pDecl->p
11c80 4e 65 78 74 29 7b 0a 20 20 20 20 44 65 63 6c 43  Next){.    DeclC
11c90 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 44 65  learProperty(pDe
11ca0 63 6c 2c 44 50 5f 46 6f 72 77 61 72 64 7c 44 50  cl,DP_Forward|DP
11cb0 5f 44 65 63 6c 61 72 65 64 29 3b 0a 20 20 20 20  _Declared);.    
11cc0 69 66 28 20 44 65 63 6c 48 61 73 50 72 6f 70 65  if( DeclHasPrope
11cd0 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 4c 6f 63  rty(pDecl,DP_Loc
11ce0 61 6c 29 20 26 26 20 70 44 65 63 6c 2d 3e 7a 46  al) && pDecl->zF
11cf0 69 6c 65 21 3d 7a 46 69 6c 65 6e 61 6d 65 20 29  ile!=zFilename )
11d00 7b 0a 20 20 20 20 20 20 44 65 63 6c 53 65 74 50  {.      DeclSetP
11d10 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50  roperty(pDecl,DP
11d20 5f 46 6f 72 77 61 72 64 7c 44 50 5f 44 65 63 6c  _Forward|DP_Decl
11d30 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ared);.    }.  }
11d40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
11d50 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66  d declaration of
11d60 20 74 68 65 20 53 63 61 6e 54 65 78 74 28 29 20   the ScanText() 
11d70 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
11d80 74 69 63 20 76 6f 69 64 20 53 63 61 6e 54 65 78  tic void ScanTex
11d90 74 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 47  t(const char*, G
11da0 65 6e 53 74 61 74 65 20 2a 70 53 74 61 74 65 29  enState *pState)
11db0 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6f 75 74  ;../*.** The out
11dc0 70 75 74 20 69 6e 20 70 53 74 72 20 69 73 20 63  put in pStr is c
11dd0 75 72 72 65 6e 74 6c 79 20 77 69 74 68 69 6e 20  urrently within 
11de0 61 6e 20 23 69 66 20 43 4f 4e 54 45 58 54 20 77  an #if CONTEXT w
11df0 68 65 72 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20  here context.** 
11e00 69 73 20 65 71 75 61 6c 20 74 6f 20 2a 70 7a 49  is equal to *pzI
11e10 66 2e 20 20 28 2a 70 7a 49 66 20 6d 69 67 68 74  f.  (*pzIf might
11e20 20 62 65 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69   be NULL to indi
11e30 63 61 74 65 20 74 68 61 74 20 77 65 20 61 72 65  cate that we are
11e40 0a 2a 2a 20 6e 6f 74 20 77 69 74 68 69 6e 20 61  .** not within a
11e50 6e 79 20 23 69 66 20 61 74 20 74 68 65 20 6d 6f  ny #if at the mo
11e60 6d 65 6e 74 2e 29 20 20 57 65 20 61 72 65 20 67  ment.)  We are g
11e70 65 74 74 69 6e 67 20 72 65 61 64 79 20 74 6f 20  etting ready to 
11e80 6f 75 74 70 75 74 0a 2a 2a 20 73 6f 6d 65 20 74  output.** some t
11e90 65 78 74 20 74 68 61 74 20 6e 65 65 64 73 20 74  ext that needs t
11ea0 6f 20 62 65 20 77 69 74 68 69 6e 20 74 68 65 20  o be within the 
11eb0 63 6f 6e 74 65 78 74 20 6f 66 20 22 23 69 66 20  context of "#if 
11ec0 4e 45 57 22 20 77 68 65 72 65 0a 2a 2a 20 4e 45  NEW" where.** NE
11ed0 57 20 69 73 20 7a 49 66 2e 20 20 4d 61 6b 65 20  W is zIf.  Make 
11ee0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  an appropriate c
11ef0 68 61 6e 67 65 20 74 6f 20 74 68 65 20 63 6f 6e  hange to the con
11f00 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  text..*/.static 
11f10 76 6f 69 64 20 43 68 61 6e 67 65 49 66 43 6f 6e  void ChangeIfCon
11f20 74 65 78 74 28 0a 20 20 63 6f 6e 73 74 20 63 68  text(.  const ch
11f30 61 72 20 2a 7a 49 66 2c 20 20 20 20 20 20 20 2f  ar *zIf,       /
11f40 2a 20 54 68 65 20 64 65 73 69 72 65 64 20 23 69  * The desired #i
11f50 66 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 47  f context */.  G
11f60 65 6e 53 74 61 74 65 20 2a 70 53 74 61 74 65 20  enState *pState 
11f70 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
11f80 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 6f   state of the co
11f90 64 65 20 67 65 6e 65 72 61 74 6f 72 20 2a 2f 0a  de generator */.
11fa0 29 7b 0a 20 20 69 66 28 20 7a 49 66 3d 3d 30 20  ){.  if( zIf==0 
11fb0 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74 61 74  ){.    if( pStat
11fc0 65 2d 3e 7a 49 66 3d 3d 30 20 29 20 72 65 74 75  e->zIf==0 ) retu
11fd0 72 6e 3b 0a 20 20 20 20 53 74 72 69 6e 67 41 70  rn;.    StringAp
11fe0 70 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74  pend(pState->pSt
11ff0 72 2c 22 23 65 6e 64 69 66 5c 6e 22 2c 30 29 3b  r,"#endif\n",0);
12000 0a 20 20 20 20 70 53 74 61 74 65 2d 3e 7a 49 66  .    pState->zIf
12010 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
12020 20 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 7a     if( pState->z
12030 49 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  If ){.      if( 
12040 73 74 72 63 6d 70 28 7a 49 66 2c 70 53 74 61 74  strcmp(zIf,pStat
12050 65 2d 3e 7a 49 66 29 3d 3d 30 20 29 20 72 65 74  e->zIf)==0 ) ret
12060 75 72 6e 3b 0a 20 20 20 20 20 20 53 74 72 69 6e  urn;.      Strin
12070 67 41 70 70 65 6e 64 28 70 53 74 61 74 65 2d 3e  gAppend(pState->
12080 70 53 74 72 2c 22 23 65 6e 64 69 66 5c 6e 22 2c  pStr,"#endif\n",
12090 30 29 3b 0a 20 20 20 20 20 20 70 53 74 61 74 65  0);.      pState
120a0 2d 3e 7a 49 66 20 3d 20 30 3b 0a 20 20 20 20 7d  ->zIf = 0;.    }
120b0 0a 20 20 20 20 53 63 61 6e 54 65 78 74 28 7a 49  .    ScanText(zI
120c0 66 2c 20 70 53 74 61 74 65 29 3b 0a 20 20 20 20  f, pState);.    
120d0 69 66 28 20 70 53 74 61 74 65 2d 3e 7a 49 66 21  if( pState->zIf!
120e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 74 72 69  =0 ){.      Stri
120f0 6e 67 41 70 70 65 6e 64 28 70 53 74 61 74 65 2d  ngAppend(pState-
12100 3e 70 53 74 72 2c 22 23 65 6e 64 69 66 5c 6e 22  >pStr,"#endif\n"
12110 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53  ,0);.    }.    S
12120 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61  tringAppend(pSta
12130 74 65 2d 3e 70 53 74 72 2c 22 23 69 66 20 22 2c  te->pStr,"#if ",
12140 30 29 3b 0a 20 20 20 20 53 74 72 69 6e 67 41 70  0);.    StringAp
12150 70 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74  pend(pState->pSt
12160 72 2c 7a 49 66 2c 30 29 3b 0a 20 20 20 20 53 74  r,zIf,0);.    St
12170 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61 74  ringAppend(pStat
12180 65 2d 3e 70 53 74 72 2c 22 5c 6e 22 2c 30 29 3b  e->pStr,"\n",0);
12190 0a 20 20 20 20 70 53 74 61 74 65 2d 3e 7a 49 66  .    pState->zIf
121a0 20 3d 20 7a 49 66 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = zIf;.  }.}../
121b0 2a 0a 2a 2a 20 41 64 64 20 74 6f 20 74 68 65 20  *.** Add to the 
121c0 73 74 72 69 6e 67 20 70 53 74 72 20 61 20 23 69  string pStr a #i
121d0 6e 63 6c 75 64 65 20 6f 66 20 65 76 65 72 79 20  nclude of every 
121e0 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  file on the list
121f0 20 6f 66 0a 2a 2a 20 69 6e 63 6c 75 64 65 20 66   of.** include f
12200 69 6c 65 73 20 70 49 6e 63 6c 75 64 65 2e 20 20  iles pInclude.  
12210 54 68 65 20 74 61 62 6c 65 20 70 54 61 62 6c 65  The table pTable
12220 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 66 69   contains all fi
12230 6c 65 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65  les that.** have
12240 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 23 69   already been #i
12250 6e 63 6c 75 64 65 64 20 61 74 20 6c 65 61 73 74  ncluded at least
12260 20 6f 6e 63 65 2e 20 20 44 6f 6e 27 74 20 61 64   once.  Don't ad
12270 64 20 61 6e 79 0a 2a 2a 20 64 75 70 6c 69 63 61  d any.** duplica
12280 74 65 73 2e 20 20 55 70 64 61 74 65 20 70 54 61  tes.  Update pTa
12290 62 6c 65 20 77 69 74 68 20 65 76 65 72 79 20 6e  ble with every n
122a0 65 77 20 23 69 6e 63 6c 75 64 65 20 74 68 61 74  ew #include that
122b0 20 69 73 20 61 64 64 65 64 2e 0a 2a 2f 0a 73 74   is added..*/.st
122c0 61 74 69 63 20 76 6f 69 64 20 41 64 64 49 6e 63  atic void AddInc
122d0 6c 75 64 65 73 28 0a 20 20 49 6e 63 6c 75 64 65  ludes(.  Include
122e0 20 2a 70 49 6e 63 6c 75 64 65 2c 20 20 20 20 20   *pInclude,     
122f0 20 20 2f 2a 20 57 72 69 74 65 20 65 76 65 72 79    /* Write every
12300 20 23 69 6e 63 6c 75 64 65 20 6f 6e 20 74 68 69   #include on thi
12310 73 20 6c 69 73 74 20 2a 2f 0a 20 20 47 65 6e 53  s list */.  GenS
12320 74 61 74 65 20 2a 70 53 74 61 74 65 20 20 20 20  tate *pState    
12330 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
12340 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 6f 64  state of the cod
12350 65 20 67 65 6e 65 72 61 74 6f 72 20 2a 2f 0a 29  e generator */.)
12360 7b 0a 20 20 69 66 28 20 70 49 6e 63 6c 75 64 65  {.  if( pInclude
12370 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 63   ){.    if( pInc
12380 6c 75 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  lude->pNext ){. 
12390 20 20 20 20 20 41 64 64 49 6e 63 6c 75 64 65 73       AddIncludes
123a0 28 70 49 6e 63 6c 75 64 65 2d 3e 70 4e 65 78 74  (pInclude->pNext
123b0 2c 70 53 74 61 74 65 29 3b 0a 20 20 20 20 7d 0a  ,pState);.    }.
123c0 20 20 20 20 69 66 28 20 49 64 65 6e 74 54 61 62      if( IdentTab
123d0 6c 65 49 6e 73 65 72 74 28 70 53 74 61 74 65 2d  leInsert(pState-
123e0 3e 70 54 61 62 6c 65 2c 70 49 6e 63 6c 75 64 65  >pTable,pInclude
123f0 2d 3e 7a 4c 61 62 65 6c 2c 30 29 20 29 7b 0a 20  ->zLabel,0) ){. 
12400 20 20 20 20 20 43 68 61 6e 67 65 49 66 43 6f 6e       ChangeIfCon
12410 74 65 78 74 28 70 49 6e 63 6c 75 64 65 2d 3e 7a  text(pInclude->z
12420 49 66 2c 70 53 74 61 74 65 29 3b 0a 20 20 20 20  If,pState);.    
12430 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 70    StringAppend(p
12440 53 74 61 74 65 2d 3e 70 53 74 72 2c 22 23 69 6e  State->pStr,"#in
12450 63 6c 75 64 65 20 22 2c 30 29 3b 0a 20 20 20 20  clude ",0);.    
12460 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 70    StringAppend(p
12470 53 74 61 74 65 2d 3e 70 53 74 72 2c 70 49 6e 63  State->pStr,pInc
12480 6c 75 64 65 2d 3e 7a 46 69 6c 65 2c 30 29 3b 0a  lude->zFile,0);.
12490 20 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65        StringAppe
124a0 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c  nd(pState->pStr,
124b0 22 5c 6e 22 2c 31 29 3b 0a 20 20 20 20 7d 0a 20  "\n",1);.    }. 
124c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
124d0 74 6f 20 74 68 65 20 73 74 72 69 6e 67 20 70 53  to the string pS
124e0 74 72 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e  tr a declaration
124f0 20 66 6f 72 20 74 68 65 20 6f 62 6a 65 63 74 20   for the object 
12500 64 65 73 63 72 69 62 65 64 0a 2a 2a 20 69 6e 20  described.** in 
12510 70 44 65 63 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pDecl..**.** If 
12520 70 44 65 63 6c 20 68 61 73 20 61 6c 72 65 61 64  pDecl has alread
12530 79 20 62 65 65 6e 20 64 65 63 6c 61 72 65 64 20  y been declared 
12540 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 64 65  in this file, de
12550 74 65 63 74 20 74 68 61 74 0a 2a 2a 20 66 61 63  tect that.** fac
12560 74 20 61 6e 64 20 61 62 6f 72 74 20 65 61 72 6c  t and abort earl
12570 79 2e 20 20 44 6f 20 6e 6f 74 20 64 75 70 6c 69  y.  Do not dupli
12580 63 61 74 65 20 61 20 64 65 63 6c 61 72 61 74 69  cate a declarati
12590 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
125a0 20 6e 65 65 64 46 75 6c 6c 44 65 63 6c 20 66 6c   needFullDecl fl
125b0 61 67 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20  ag is false and 
125c0 74 68 69 73 20 6f 62 6a 65 63 74 20 68 61 73 20  this object has 
125d0 61 20 66 6f 72 77 61 72 64 0a 2a 2a 20 64 65 63  a forward.** dec
125e0 6c 61 72 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73  laration, then s
125f0 75 70 70 6c 79 20 74 68 65 20 66 6f 72 77 61 72  upply the forwar
12600 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 6e  d declaration on
12610 6c 79 2e 20 20 41 20 6c 61 74 65 72 0a 2a 2a 20  ly.  A later.** 
12620 63 61 6c 6c 20 74 6f 20 43 6f 6d 70 6c 65 74 65  call to Complete
12630 46 6f 72 77 61 72 64 44 65 63 6c 61 72 61 74 69  ForwardDeclarati
12640 6f 6e 73 28 29 20 77 69 6c 6c 20 66 69 6e 69 73  ons() will finis
12650 68 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  h the declaratio
12660 6e 0a 2a 2a 20 66 6f 72 20 75 73 2e 20 20 42 75  n.** for us.  Bu
12670 74 20 69 66 20 6e 65 65 64 46 75 6c 6c 44 65 63  t if needFullDec
12680 6c 20 69 73 20 74 72 75 65 2c 20 77 65 20 6d 75  l is true, we mu
12690 73 74 20 73 75 70 70 6c 79 20 74 68 65 20 66 75  st supply the fu
126a0 6c 6c 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  ll.** declaratio
126b0 6e 20 6e 6f 77 2e 20 20 53 6f 6d 65 20 6f 62 6a  n now.  Some obj
126c0 65 63 74 73 20 64 6f 20 6e 6f 74 20 68 61 76 65  ects do not have
126d0 20 61 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61   a forward decla
126e0 72 61 74 69 6f 6e 2e 0a 2a 2a 20 46 6f 72 20 74  ration..** For t
126f0 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20 77 65  hose objects, we
12700 20 6d 75 73 74 20 70 72 69 6e 74 20 74 68 65 20   must print the 
12710 66 75 6c 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e  full declaration
12720 20 6e 6f 77 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61   now..**.** Beca
12730 75 73 65 20 69 74 20 69 73 20 69 6c 6c 65 67 61  use it is illega
12740 6c 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61  l to duplicate a
12750 20 74 79 70 65 64 65 66 20 69 6e 20 43 2c 20 63   typedef in C, c
12760 61 72 65 20 69 73 20 74 61 6b 65 6e 0a 2a 2a 20  are is taken.** 
12770 74 6f 20 69 6e 73 75 72 65 20 74 68 61 74 20 74  to insure that t
12780 79 70 65 64 65 66 73 20 66 6f 72 20 74 68 65 20  ypedefs for the 
12790 73 61 6d 65 20 69 64 65 6e 74 69 66 69 65 72 20  same identifier 
127a0 61 72 65 20 6f 6e 6c 79 20 69 73 73 75 65 64 20  are only issued 
127b0 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  once..*/.static 
127c0 76 6f 69 64 20 44 65 63 6c 61 72 65 4f 62 6a 65  void DeclareObje
127d0 63 74 28 0a 20 20 44 65 63 6c 20 2a 70 44 65 63  ct(.  Decl *pDec
127e0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  l,        /* The
127f0 20 74 68 69 6e 67 20 74 6f 20 62 65 20 64 65 63   thing to be dec
12800 6c 61 72 65 64 20 2a 2f 0a 20 20 47 65 6e 53 74  lared */.  GenSt
12810 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 2f  ate *pState,   /
12820 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 20  * Current state 
12830 6f 66 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  of the code gene
12840 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  rator */.  int n
12850 65 65 64 46 75 6c 6c 44 65 63 6c 20 20 20 20 2f  eedFullDecl    /
12860 2a 20 4d 75 73 74 20 68 61 76 65 20 74 68 65 20  * Must have the 
12870 66 75 6c 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e  full declaration
12880 2e 20 20 41 20 66 6f 72 77 61 72 64 0a 20 20 20  .  A forward.   
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 20 20 20 20 2a 20 64 65 63 6c 61 72 61 74 69 6f      * declaratio
128b0 6e 20 69 73 6e 27 74 20 65 6e 6f 75 67 68 20 2a  n isn't enough *
128c0 2f 0a 29 7b 0a 20 20 44 65 63 6c 20 2a 70 3b 20  /.){.  Decl *p; 
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
128e0 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   The object to b
128f0 65 20 64 65 63 6c 61 72 65 64 20 2a 2f 0a 20 20  e declared */.  
12900 69 6e 74 20 66 6c 61 67 3b 0a 20 20 69 6e 74 20  int flag;.  int 
12910 69 73 43 70 70 3b 20 20 20 20 20 20 20 20 20 20  isCpp;          
12920 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 67 65     /* True if ge
12930 6e 65 72 61 74 69 6e 67 20 43 2b 2b 20 2a 2f 0a  nerating C++ */.
12940 20 20 69 6e 74 20 64 6f 6e 65 54 79 70 65 64 65    int doneTypede
12950 66 20 3d 20 30 3b 20 20 20 2f 2a 20 54 72 75 65  f = 0;   /* True
12960 20 69 66 20 61 20 74 79 70 65 64 65 66 20 68 61   if a typedef ha
12970 73 20 62 65 65 6e 20 64 6f 6e 65 20 66 6f 72 20  s been done for 
12980 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  this object */..
12990 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 42 45 47    /* printf("BEG
129a0 49 4e 20 25 73 20 6f 66 20 25 73 5c 6e 22 2c 6e  IN %s of %s\n",n
129b0 65 65 64 46 75 6c 6c 44 65 63 6c 3f 22 46 55 4c  eedFullDecl?"FUL
129c0 4c 22 3a 22 50 52 4f 54 4f 54 59 50 45 22 2c 70  L":"PROTOTYPE",p
129d0 44 65 63 6c 2d 3e 7a 4e 61 6d 65 29 3b 2a 2f 0a  Decl->zName);*/.
129e0 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 6e    /*.  ** For an
129f0 79 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 61  y object that ha
12a00 73 20 61 20 66 6f 72 77 61 72 64 20 64 65 63 6c  s a forward decl
12a10 61 72 61 74 69 6f 6e 2c 20 67 6f 20 61 68 65 61  aration, go ahea
12a20 64 20 61 6e 64 20 64 6f 20 74 68 65 0a 20 20 2a  d and do the.  *
12a30 2a 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * forward declar
12a40 61 74 69 6f 6e 20 66 69 72 73 74 2e 0a 20 20 2a  ation first..  *
12a50 2f 0a 20 20 69 73 43 70 70 20 3d 20 28 70 53 74  /.  isCpp = (pSt
12a60 61 74 65 2d 3e 66 6c 61 67 73 20 26 20 44 50 5f  ate->flags & DP_
12a70 43 70 6c 75 73 70 6c 75 73 29 20 21 3d 20 30 3b  Cplusplus) != 0;
12a80 0a 20 20 66 6f 72 28 70 3d 70 44 65 63 6c 3b 20  .  for(p=pDecl; 
12a90 70 3b 20 70 3d 70 2d 3e 70 53 61 6d 65 4e 61 6d  p; p=p->pSameNam
12aa0 65 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a  e){.    if( p->z
12ab0 46 77 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Fwd ){.      if(
12ac0 20 21 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74   !DeclHasPropert
12ad0 79 28 70 2c 44 50 5f 46 6f 72 77 61 72 64 29 20  y(p,DP_Forward) 
12ae0 29 7b 0a 20 20 20 20 20 20 20 20 44 65 63 6c 53  ){.        DeclS
12af0 65 74 50 72 6f 70 65 72 74 79 28 70 2c 44 50 5f  etProperty(p,DP_
12b00 46 6f 72 77 61 72 64 29 3b 0a 20 20 20 20 20 20  Forward);.      
12b10 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 70 2d    if( strncmp(p-
12b20 3e 7a 46 77 64 2c 22 74 79 70 65 64 65 66 22 2c  >zFwd,"typedef",
12b30 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
12b40 20 20 20 69 66 28 20 64 6f 6e 65 54 79 70 65 64     if( doneTyped
12b50 65 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ef ) continue;. 
12b60 20 20 20 20 20 20 20 20 20 64 6f 6e 65 54 79 70           doneTyp
12b70 65 64 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  edef = 1;.      
12b80 20 20 7d 0a 20 20 20 20 20 20 20 20 43 68 61 6e    }.        Chan
12b90 67 65 49 66 43 6f 6e 74 65 78 74 28 70 2d 3e 7a  geIfContext(p->z
12ba0 49 66 2c 70 53 74 61 74 65 29 3b 0a 20 20 20 20  If,pState);.    
12bb0 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64      StringAppend
12bc0 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c 69 73  (pState->pStr,is
12bd0 43 70 70 20 3f 20 70 2d 3e 7a 46 77 64 43 70 70  Cpp ? p->zFwdCpp
12be0 20 3a 20 70 2d 3e 7a 46 77 64 2c 30 29 3b 0a 20   : p->zFwd,0);. 
12bf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12c00 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 61 72 6c  ..  /*.  ** Earl
12c10 79 20 6f 75 74 20 69 66 20 65 76 65 72 79 74 68  y out if everyth
12c20 69 6e 67 20 69 73 20 61 6c 72 65 61 64 79 20 73  ing is already s
12c30 75 69 74 61 62 6c 79 20 64 65 63 6c 61 72 65 64  uitably declared
12c40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
12c50 20 69 73 20 61 20 76 65 72 79 20 69 6d 70 6f 72   is a very impor
12c60 74 61 6e 74 20 73 74 65 70 20 62 65 63 61 75 73  tant step becaus
12c70 65 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 73  e it prevents us
12c80 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 78 65 63 75   from.  ** execu
12c90 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
12ca0 65 20 66 6f 6c 6c 6f 77 73 20 69 6e 20 61 20 72  e follows in a r
12cb0 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f  ecursive call to
12cc0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
12cd0 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d  ion with the sam
12ce0 65 20 76 61 6c 75 65 20 66 6f 72 20 70 44 65 63  e value for pDec
12cf0 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 20 3d  l..  */.  flag =
12d00 20 6e 65 65 64 46 75 6c 6c 44 65 63 6c 20 3f 20   needFullDecl ? 
12d10 44 50 5f 44 65 63 6c 61 72 65 64 7c 44 50 5f 46  DP_Declared|DP_F
12d20 6f 72 77 61 72 64 20 3a 20 44 50 5f 46 6f 72 77  orward : DP_Forw
12d30 61 72 64 3b 0a 20 20 66 6f 72 28 70 3d 70 44 65  ard;.  for(p=pDe
12d40 63 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 61 6d  cl; p; p=p->pSam
12d50 65 4e 61 6d 65 29 7b 0a 20 20 20 20 69 66 28 20  eName){.    if( 
12d60 21 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79  !DeclHasProperty
12d70 28 70 2c 66 6c 61 67 29 20 29 20 62 72 65 61 6b  (p,flag) ) break
12d80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30  ;.  }.  if( p==0
12d90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
12da0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d    }..  /*.  ** M
12db0 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
12dc0 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 23   all necessary #
12dd0 69 6e 63 6c 75 64 65 73 0a 20 20 2a 2f 0a 20 20  includes.  */.  
12de0 66 6f 72 28 70 3d 70 44 65 63 6c 3b 20 70 3b 20  for(p=pDecl; p; 
12df0 70 3d 70 2d 3e 70 53 61 6d 65 4e 61 6d 65 29 7b  p=p->pSameName){
12e00 0a 20 20 20 20 41 64 64 49 6e 63 6c 75 64 65 73  .    AddIncludes
12e10 28 70 2d 3e 70 49 6e 63 6c 75 64 65 2c 70 53 74  (p->pInclude,pSt
12e20 61 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ate);.  }..  /*.
12e30 20 20 2a 2a 20 47 6f 20 61 68 65 61 64 20 61 6e    ** Go ahead an
12e40 20 6d 61 72 6b 20 65 76 65 72 79 74 68 69 6e 67   mark everything
12e50 20 61 73 20 62 65 69 6e 67 20 64 65 63 6c 61 72   as being declar
12e60 65 64 2c 20 74 6f 20 70 72 65 76 65 6e 74 20 61  ed, to prevent a
12e70 6e 0a 20 20 2a 2a 20 69 6e 66 69 6e 69 74 65 20  n.  ** infinite 
12e80 6c 6f 6f 70 20 74 68 72 75 20 74 68 65 20 53 63  loop thru the Sc
12e90 61 6e 54 65 78 74 28 29 20 66 75 6e 63 74 69 6f  anText() functio
12ea0 6e 2e 20 20 41 74 20 74 68 65 20 73 61 6d 65 20  n.  At the same 
12eb0 74 69 6d 65 2c 0a 20 20 2a 2a 20 77 65 20 64 65  time,.  ** we de
12ec0 63 69 64 65 20 77 68 69 63 68 20 6f 62 6a 65 63  cide which objec
12ed0 74 73 20 6e 65 65 64 20 61 20 66 75 6c 6c 20 64  ts need a full d
12ee0 65 63 6c 61 72 61 74 69 6f 6e 20 61 6e 64 20 6d  eclaration and m
12ef0 61 72 6b 20 74 68 65 6d 0a 20 20 2a 2a 20 77 69  ark them.  ** wi
12f00 74 68 20 74 68 65 20 44 50 5f 46 6c 61 67 20 62  th the DP_Flag b
12f10 69 74 2e 20 20 57 65 20 61 72 65 20 6f 6e 6c 79  it.  We are only
12f20 20 61 62 6c 65 20 74 6f 20 75 73 65 20 44 50 5f   able to use DP_
12f30 46 6c 61 67 20 69 6e 20 74 68 69 73 0a 20 20 2a  Flag in this.  *
12f40 2a 20 77 61 79 20 62 65 63 61 75 73 65 20 77 65  * way because we
12f50 20 6b 6e 6f 77 20 77 65 27 6c 6c 20 6e 65 76 65   know we'll neve
12f60 72 20 65 78 65 63 75 74 65 20 74 68 69 73 20 66  r execute this f
12f70 61 72 20 69 6e 74 6f 20 74 68 69 73 0a 20 20 2a  ar into this.  *
12f80 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 61 20  * function on a 
12f90 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20 77  recursive call w
12fa0 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 44 65  ith the same pDe
12fb0 63 6c 2e 20 20 48 65 6e 63 65 2c 20 72 65 63 75  cl.  Hence, recu
12fc0 72 73 69 76 65 0a 20 20 2a 2a 20 63 61 6c 6c 73  rsive.  ** calls
12fd0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
12fe0 6e 20 28 74 68 72 6f 75 67 68 20 53 63 61 6e 54  n (through ScanT
12ff0 65 78 74 28 29 29 20 63 61 6e 20 6e 65 76 65 72  ext()) can never
13000 20 63 68 61 6e 67 65 20 74 68 65 0a 20 20 2a 2a   change the.  **
13010 20 76 61 6c 75 65 20 6f 66 20 44 50 5f 46 6c 61   value of DP_Fla
13020 67 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  g out from under
13030 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28   us..  */.  for(
13040 70 3d 70 44 65 63 6c 3b 20 70 3b 20 70 3d 70 2d  p=pDecl; p; p=p-
13050 3e 70 53 61 6d 65 4e 61 6d 65 29 7b 0a 20 20 20  >pSameName){.   
13060 20 69 66 28 20 21 44 65 63 6c 48 61 73 50 72 6f   if( !DeclHasPro
13070 70 65 72 74 79 28 70 2c 44 50 5f 44 65 63 6c 61  perty(p,DP_Decla
13080 72 65 64 29 0a 20 20 20 20 20 26 26 20 28 70 2d  red).     && (p-
13090 3e 7a 46 77 64 3d 3d 30 20 7c 7c 20 6e 65 65 64  >zFwd==0 || need
130a0 46 75 6c 6c 44 65 63 6c 29 0a 20 20 20 20 20 26  FullDecl).     &
130b0 26 20 70 2d 3e 7a 44 65 63 6c 21 3d 30 0a 20 20  & p->zDecl!=0.  
130c0 20 20 29 7b 0a 20 20 20 20 20 20 44 65 63 6c 53    ){.      DeclS
130d0 65 74 50 72 6f 70 65 72 74 79 28 70 2c 44 50 5f  etProperty(p,DP_
130e0 46 6f 72 77 61 72 64 7c 44 50 5f 44 65 63 6c 61  Forward|DP_Decla
130f0 72 65 64 7c 44 50 5f 46 6c 61 67 29 3b 0a 20 20  red|DP_Flag);.  
13100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 44    }else{.      D
13110 65 63 6c 43 6c 65 61 72 50 72 6f 70 65 72 74 79  eclClearProperty
13120 28 70 2c 44 50 5f 46 6c 61 67 29 3b 0a 20 20 20  (p,DP_Flag);.   
13130 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
13140 2a 20 43 61 6c 6c 20 53 63 61 6e 54 65 78 74 28  * Call ScanText(
13150 29 20 72 65 63 75 72 73 69 76 65 6c 79 20 28 74  ) recursively (t
13160 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
13170 61 6c 6c 65 64 20 66 72 6f 6d 20 53 63 61 6e 54  alled from ScanT
13180 65 78 74 28 29 29 0a 20 20 2a 2a 20 74 6f 20 69  ext()).  ** to i
13190 6e 63 6c 75 64 65 20 64 65 63 6c 61 72 61 74 69  nclude declarati
131a0 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  ons required to 
131b0 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 73  come before thes
131c0 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 0a  e declarations..
131d0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 44 65    */.  for(p=pDe
131e0 63 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 61 6d  cl; p; p=p->pSam
131f0 65 4e 61 6d 65 29 7b 0a 20 20 20 20 69 66 28 20  eName){.    if( 
13200 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28  DeclHasProperty(
13210 70 2c 44 50 5f 46 6c 61 67 29 20 29 7b 0a 20 20  p,DP_Flag) ){.  
13220 20 20 20 20 69 66 28 20 70 2d 3e 7a 44 65 63 6c      if( p->zDecl
13230 5b 30 5d 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20  [0]=='#' ){.    
13240 20 20 20 20 53 63 61 6e 54 65 78 74 28 26 70 2d      ScanText(&p-
13250 3e 7a 44 65 63 6c 5b 31 5d 2c 70 53 74 61 74 65  >zDecl[1],pState
13260 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
13270 20 20 20 20 20 20 20 20 49 6e 73 65 72 74 45 78          InsertEx
13280 74 72 61 44 65 63 6c 28 70 29 3b 0a 20 20 20 20  traDecl(p);.    
13290 20 20 20 20 53 63 61 6e 54 65 78 74 28 70 2d 3e      ScanText(p->
132a0 7a 44 65 63 6c 2c 70 53 74 61 74 65 29 3b 0a 20  zDecl,pState);. 
132b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
132c0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4f 75 74 70  ..  /*.  ** Outp
132d0 75 74 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  ut the declarati
132e0 6f 6e 73 2e 20 20 44 6f 20 74 68 69 73 20 69 6e  ons.  Do this in
132f0 20 74 77 6f 20 70 61 73 73 65 73 2e 20 20 46 69   two passes.  Fi
13300 72 73 74 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20  rst.  ** output 
13310 65 76 65 72 79 74 68 69 6e 67 20 74 68 61 74 20  everything that 
13320 69 73 6e 27 74 20 61 20 74 79 70 65 64 65 66 2e  isn't a typedef.
13330 20 20 54 68 65 6e 20 67 6f 20 62 61 63 6b 20 61    Then go back a
13340 6e 64 0a 20 20 2a 2a 20 67 65 74 20 74 68 65 20  nd.  ** get the 
13350 74 79 70 65 64 65 66 73 20 62 79 20 74 68 65 20  typedefs by the 
13360 73 61 6d 65 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  same name..  */.
13370 20 20 66 6f 72 28 70 3d 70 44 65 63 6c 3b 20 70    for(p=pDecl; p
13380 3b 20 70 3d 70 2d 3e 70 53 61 6d 65 4e 61 6d 65  ; p=p->pSameName
13390 29 7b 0a 20 20 20 20 69 66 28 20 44 65 63 6c 48  ){.    if( DeclH
133a0 61 73 50 72 6f 70 65 72 74 79 28 70 2c 44 50 5f  asProperty(p,DP_
133b0 46 6c 61 67 29 20 26 26 20 21 44 65 63 6c 48 61  Flag) && !DeclHa
133c0 73 50 72 6f 70 65 72 74 79 28 70 2c 54 59 5f 54  sProperty(p,TY_T
133d0 79 70 65 64 65 66 29 20 29 7b 0a 20 20 20 20 20  ypedef) ){.     
133e0 20 69 66 28 20 44 65 63 6c 48 61 73 41 6e 79 50   if( DeclHasAnyP
133f0 72 6f 70 65 72 74 79 28 70 2c 54 59 5f 45 6e 75  roperty(p,TY_Enu
13400 6d 65 72 61 74 69 6f 6e 29 20 29 7b 0a 20 20 20  meration) ){.   
13410 20 20 20 20 20 69 66 28 20 64 6f 6e 65 54 79 70       if( doneTyp
13420 65 64 65 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  edef ) continue;
13430 0a 20 20 20 20 20 20 20 20 64 6f 6e 65 54 79 70  .        doneTyp
13440 65 64 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  edef = 1;.      
13450 7d 0a 20 20 20 20 20 20 43 68 61 6e 67 65 49 66  }.      ChangeIf
13460 43 6f 6e 74 65 78 74 28 70 2d 3e 7a 49 66 2c 70  Context(p->zIf,p
13470 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66  State);.      if
13480 28 20 21 69 73 43 70 70 20 26 26 20 44 65 63 6c  ( !isCpp && Decl
13490 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
134a0 2c 44 50 5f 45 78 74 65 72 6e 52 65 71 64 29 20  ,DP_ExternReqd) 
134b0 29 7b 0a 20 20 20 20 20 20 20 20 53 74 72 69 6e  ){.        Strin
134c0 67 41 70 70 65 6e 64 28 70 53 74 61 74 65 2d 3e  gAppend(pState->
134d0 70 53 74 72 2c 22 65 78 74 65 72 6e 20 22 2c 30  pStr,"extern ",0
134e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
134f0 66 28 20 69 73 43 70 70 20 26 26 20 44 65 63 6c  f( isCpp && Decl
13500 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 44 50  HasProperty(p,DP
13510 5f 43 70 6c 75 73 70 6c 75 73 7c 44 50 5f 45 78  _Cplusplus|DP_Ex
13520 74 65 72 6e 52 65 71 64 29 20 29 7b 0a 20 20 20  ternReqd) ){.   
13530 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e       StringAppen
13540 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c 22  d(pState->pStr,"
13550 65 78 74 65 72 6e 20 22 2c 30 29 3b 0a 20 20 20  extern ",0);.   
13560 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43     }else if( isC
13570 70 70 20 26 26 20 44 65 63 6c 48 61 73 41 6e 79  pp && DeclHasAny
13580 50 72 6f 70 65 72 74 79 28 70 2c 44 50 5f 45 78  Property(p,DP_Ex
13590 74 65 72 6e 43 52 65 71 64 7c 44 50 5f 45 78 74  ternCReqd|DP_Ext
135a0 65 72 6e 52 65 71 64 29 20 29 7b 0a 20 20 20 20  ernReqd) ){.    
135b0 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64      StringAppend
135c0 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c 22 65  (pState->pStr,"e
135d0 78 74 65 72 6e 20 5c 22 43 5c 22 20 22 2c 30 29  xtern \"C\" ",0)
135e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
135f0 49 6e 73 65 72 74 45 78 74 72 61 44 65 63 6c 28  InsertExtraDecl(
13600 70 29 3b 0a 20 20 20 20 20 20 53 74 72 69 6e 67  p);.      String
13610 41 70 70 65 6e 64 28 70 53 74 61 74 65 2d 3e 70  Append(pState->p
13620 53 74 72 2c 70 2d 3e 7a 44 65 63 6c 2c 30 29 3b  Str,p->zDecl,0);
13630 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 43 70  .      if( !isCp
13640 70 20 26 26 20 44 65 63 6c 48 61 73 50 72 6f 70  p && DeclHasProp
13650 65 72 74 79 28 70 2c 44 50 5f 43 70 6c 75 73 70  erty(p,DP_Cplusp
13660 6c 75 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lus) ){.        
13670 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  fprintf(stderr,.
13680 20 20 20 20 20 20 20 20 20 20 22 25 73 3a 20 43            "%s: C
13690 20 63 6f 64 65 20 6f 75 67 68 74 20 6e 6f 74 20   code ought not 
136a0 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 43 2b  reference the C+
136b0 2b 20 6f 62 6a 65 63 74 20 5c 22 25 73 5c 22 5c  + object \"%s\"\
136c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 53  n",.          pS
136d0 74 61 74 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  tate->zFilename,
136e0 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
136f0 20 20 20 20 70 53 74 61 74 65 2d 3e 6e 45 72 72      pState->nErr
13700 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
13710 20 20 44 65 63 6c 43 6c 65 61 72 50 72 6f 70 65    DeclClearPrope
13720 72 74 79 28 70 2c 44 50 5f 46 6c 61 67 29 3b 0a  rty(p,DP_Flag);.
13730 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
13740 70 3d 70 44 65 63 6c 3b 20 70 20 26 26 20 21 64  p=pDecl; p && !d
13750 6f 6e 65 54 79 70 65 64 65 66 3b 20 70 3d 70 2d  oneTypedef; p=p-
13760 3e 70 53 61 6d 65 4e 61 6d 65 29 7b 0a 20 20 20  >pSameName){.   
13770 20 69 66 28 20 44 65 63 6c 48 61 73 50 72 6f 70   if( DeclHasProp
13780 65 72 74 79 28 70 2c 44 50 5f 46 6c 61 67 29 20  erty(p,DP_Flag) 
13790 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
137a0 20 68 61 73 20 74 6f 20 62 65 20 61 20 74 79 70   has to be a typ
137b0 65 64 65 66 20 2a 2f 0a 20 20 20 20 20 20 64 6f  edef */.      do
137c0 6e 65 54 79 70 65 64 65 66 20 3d 20 31 3b 0a 20  neTypedef = 1;. 
137d0 20 20 20 20 20 43 68 61 6e 67 65 49 66 43 6f 6e       ChangeIfCon
137e0 74 65 78 74 28 70 2d 3e 7a 49 66 2c 70 53 74 61  text(p->zIf,pSta
137f0 74 65 29 3b 0a 20 20 20 20 20 20 49 6e 73 65 72  te);.      Inser
13800 74 45 78 74 72 61 44 65 63 6c 28 70 29 3b 0a 20  tExtraDecl(p);. 
13810 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e       StringAppen
13820 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c 70  d(pState->pStr,p
13830 2d 3e 7a 44 65 63 6c 2c 30 29 3b 0a 20 20 20 20  ->zDecl,0);.    
13840 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
13850 68 69 73 20 72 6f 75 74 69 6e 65 20 73 63 61 6e  his routine scan
13860 73 20 74 68 65 20 69 6e 70 75 74 20 74 65 78 74  s the input text
13870 20 67 69 76 65 6e 2c 20 61 6e 64 20 61 70 70 65   given, and appe
13880 6e 64 73 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74  nds to the.** st
13890 72 69 6e 67 20 69 6e 20 70 53 74 61 74 65 2d 3e  ring in pState->
138a0 70 53 74 72 20 74 68 65 20 74 65 78 74 20 6f 66  pStr the text of
138b0 20 61 6e 79 20 64 65 63 6c 61 72 61 74 69 6f 6e   any declaration
138c0 73 20 74 68 61 74 20 6d 75 73 74 0a 2a 2a 20 6f  s that must.** o
138d0 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20  ccur before the 
138e0 74 65 78 74 20 69 6e 20 7a 54 65 78 74 2e 0a 2a  text in zText..*
138f0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 64 65 6e 74  *.** If an ident
13900 69 66 69 65 72 20 69 6e 20 7a 54 65 78 74 20 69  ifier in zText i
13910 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  s immediately fo
13920 6c 6c 6f 77 65 64 20 62 79 20 27 2a 27 2c 20 74  llowed by '*', t
13930 68 65 6e 0a 2a 2a 20 6f 6e 6c 79 20 66 6f 72 77  hen.** only forw
13940 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73  ard declarations
13950 20 61 72 65 20 6e 65 65 64 65 64 20 66 6f 72 20   are needed for 
13960 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 72 2e  that identifier.
13970 20 20 49 66 20 74 68 65 0a 2a 2a 20 69 64 65 6e    If the.** iden
13980 74 69 66 69 65 72 20 6e 61 6d 65 20 69 73 20 6e  tifier name is n
13990 6f 74 20 66 6f 6c 6c 6f 77 65 64 20 69 6d 6d 65  ot followed imme
139a0 64 69 61 74 65 6c 79 20 62 79 20 27 2a 27 2c 20  diately by '*', 
139b0 77 65 20 6d 75 73 74 20 73 75 70 70 6c 79 0a 2a  we must supply.*
139c0 2a 20 61 20 66 75 6c 6c 20 64 65 63 6c 61 72 61  * a full declara
139d0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
139e0 76 6f 69 64 20 53 63 61 6e 54 65 78 74 28 0a 20  void ScanText(. 
139f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
13a00 78 74 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  xt,    /* The in
13a10 70 75 74 20 74 65 78 74 20 74 6f 20 62 65 20 73  put text to be s
13a20 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 47 65 6e 53  canned */.  GenS
13a30 74 61 74 65 20 2a 70 53 74 61 74 65 20 20 20 20  tate *pState    
13a40 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61    /* Current sta
13a50 74 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20 67  te of the code g
13a60 65 6e 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20  enerator */.){. 
13a70 20 69 6e 74 20 6e 65 78 74 56 61 6c 69 64 20 3d   int nextValid =
13a80 20 30 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69   0;    /* True i
13a90 73 20 73 4e 65 78 74 20 63 6f 6e 74 61 69 6e 73  s sNext contains
13aa0 20 76 61 6c 69 64 20 64 61 74 61 20 2a 2f 0a 20   valid data */. 
13ab0 20 49 6e 53 74 72 65 61 6d 20 73 49 6e 3b 20 20   InStream sIn;  
13ac0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
13ad0 70 75 74 20 74 65 78 74 20 2a 2f 0a 20 20 54 6f  put text */.  To
13ae0 6b 65 6e 20 73 54 6f 6b 65 6e 3b 20 20 20 20 20  ken sToken;     
13af0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
13b00 6e 74 20 74 6f 6b 65 6e 20 62 65 69 6e 67 20 65  nt token being e
13b10 78 61 6d 69 6e 65 64 20 2a 2f 0a 20 20 54 6f 6b  xamined */.  Tok
13b20 65 6e 20 73 4e 65 78 74 3b 20 20 20 20 20 20 20  en sNext;       
13b30 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6e     /* The next n
13b40 6f 6e 2d 73 70 61 63 65 20 74 6f 6b 65 6e 20 2a  on-space token *
13b50 2f 0a 0a 20 20 2f 2a 20 70 72 69 6e 74 66 28 22  /..  /* printf("
13b60 42 45 47 49 4e 20 53 43 41 4e 20 54 45 58 54 20  BEGIN SCAN TEXT 
13b70 6f 6e 20 25 73 5c 6e 22 2c 20 7a 54 65 78 74 29  on %s\n", zText)
13b80 3b 20 2a 2f 0a 0a 20 20 73 49 6e 2e 7a 20 3d 20  ; */..  sIn.z = 
13b90 7a 54 65 78 74 3b 0a 20 20 73 49 6e 2e 69 20 3d  zText;.  sIn.i =
13ba0 20 30 3b 0a 20 20 73 49 6e 2e 6e 4c 69 6e 65 20   0;.  sIn.nLine 
13bb0 3d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 73 49  = 1;.  while( sI
13bc0 6e 2e 7a 5b 73 49 6e 2e 69 5d 21 3d 30 20 29 7b  n.z[sIn.i]!=0 ){
13bd0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 56 61 6c  .    if( nextVal
13be0 69 64 20 29 7b 0a 20 20 20 20 20 20 73 54 6f 6b  id ){.      sTok
13bf0 65 6e 20 3d 20 73 4e 65 78 74 3b 0a 20 20 20 20  en = sNext;.    
13c00 20 20 6e 65 78 74 56 61 6c 69 64 20 3d 20 30 3b    nextValid = 0;
13c10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13c20 20 20 47 65 74 4e 6f 6e 73 70 61 63 65 54 6f 6b    GetNonspaceTok
13c30 65 6e 28 26 73 49 6e 2c 26 73 54 6f 6b 65 6e 29  en(&sIn,&sToken)
13c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13c50 73 54 6f 6b 65 6e 2e 65 54 79 70 65 3d 3d 54 54  sToken.eType==TT
13c60 5f 49 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _Id ){.      int
13c70 20 6e 65 65 64 46 75 6c 6c 44 65 63 6c 3b 20 20   needFullDecl;  
13c80 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e   /* True if we n
13c90 65 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  eed to provide t
13ca0 68 65 20 66 75 6c 6c 20 64 65 63 6c 61 72 61 74  he full declarat
13cb0 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
13cd0 2a 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66  * not just the f
13ce0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
13cf0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 44 65 63 6c  on */.      Decl
13d00 20 2a 70 44 65 63 6c 3b 20 20 20 20 20 20 20 20   *pDecl;        
13d10 2f 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  /* The declarati
13d20 6f 6e 20 68 61 76 69 6e 67 20 74 68 65 20 6e 61  on having the na
13d30 6d 65 20 69 6e 20 73 54 6f 6b 65 6e 20 2a 2f 0a  me in sToken */.
13d40 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20  .      /*.      
13d50 2a 2a 20 53 65 65 20 69 66 20 74 68 65 72 65 20  ** See if there 
13d60 69 73 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e  is a declaration
13d70 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
13d80 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 67   with the name g
13d90 69 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79  iven.      ** by
13da0 20 73 54 6f 6b 65 6e 2e 0a 20 20 20 20 20 20 2a   sToken..      *
13db0 2f 0a 20 20 20 20 20 20 70 44 65 63 6c 20 3d 20  /.      pDecl = 
13dc0 46 69 6e 64 44 65 63 6c 28 73 54 6f 6b 65 6e 2e  FindDecl(sToken.
13dd0 7a 54 65 78 74 2c 73 54 6f 6b 65 6e 2e 6e 54 65  zText,sToken.nTe
13de0 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xt);.      if( p
13df0 44 65 63 6c 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Decl==0 ) contin
13e00 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 0a 20 20  ue;..      /*.  
13e10 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74      ** If we get
13e20 20 74 68 69 73 20 66 61 72 2c 20 77 65 27 76 65   this far, we've
13e30 20 66 6f 75 6e 64 20 61 6e 20 69 64 65 6e 74 69   found an identi
13e40 66 69 65 72 20 74 68 61 74 20 68 61 73 20 61 0a  fier that has a.
13e50 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 61        ** declara
13e60 74 69 6f 6e 20 69 6e 20 74 68 65 20 64 61 74 61  tion in the data
13e70 62 61 73 65 2e 20 20 4e 6f 77 20 73 65 65 20 69  base.  Now see i
13e80 66 20 77 65 20 74 68 65 20 66 75 6c 6c 20 64 65  f we the full de
13e90 63 6c 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  claration.      
13ea0 2a 2a 20 6f 72 20 6a 75 73 74 20 61 20 66 6f 72  ** or just a for
13eb0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
13ec0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
13ed0 20 47 65 74 4e 6f 6e 73 70 61 63 65 54 6f 6b 65   GetNonspaceToke
13ee0 6e 28 26 73 49 6e 2c 26 73 4e 65 78 74 29 3b 0a  n(&sIn,&sNext);.
13ef0 20 20 20 20 20 20 69 66 28 20 73 4e 65 78 74 2e        if( sNext.
13f00 7a 54 65 78 74 5b 30 5d 3d 3d 27 2a 27 20 29 7b  zText[0]=='*' ){
13f10 0a 20 20 20 20 20 20 20 20 6e 65 65 64 46 75 6c  .        needFul
13f20 6c 44 65 63 6c 20 3d 20 30 3b 0a 20 20 20 20 20  lDecl = 0;.     
13f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13f40 6e 65 65 64 46 75 6c 6c 44 65 63 6c 20 3d 20 31  needFullDecl = 1
13f50 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 56 61  ;.        nextVa
13f60 6c 69 64 20 3d 20 73 4e 65 78 74 2e 65 54 79 70  lid = sNext.eTyp
13f70 65 3d 3d 54 54 5f 49 64 3b 0a 20 20 20 20 20 20  e==TT_Id;.      
13f80 7d 0a 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  }..      /*.    
13f90 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68    ** Generate th
13fa0 65 20 6e 65 65 64 65 64 20 64 65 63 6c 61 72 61  e needed declara
13fb0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
13fc0 20 20 20 20 20 44 65 63 6c 61 72 65 4f 62 6a 65       DeclareObje
13fd0 63 74 28 70 44 65 63 6c 2c 70 53 74 61 74 65 2c  ct(pDecl,pState,
13fe0 6e 65 65 64 46 75 6c 6c 44 65 63 6c 29 3b 0a 20  needFullDecl);. 
13ff0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 54 6f     }else if( sTo
14000 6b 65 6e 2e 65 54 79 70 65 3d 3d 54 54 5f 50 72  ken.eType==TT_Pr
14010 65 70 72 6f 63 65 73 73 6f 72 20 29 7b 0a 20 20  eprocessor ){.  
14020 20 20 20 20 73 49 6e 2e 69 20 2d 3d 20 73 54 6f      sIn.i -= sTo
14030 6b 65 6e 2e 6e 54 65 78 74 20 2d 20 31 3b 0a 20  ken.nText - 1;. 
14040 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 70 72     }.  }.  /* pr
14050 69 6e 74 66 28 22 45 4e 44 20 53 43 41 4e 54 45  intf("END SCANTE
14060 58 54 5c 6e 22 29 3b 20 2a 2f 0a 7d 0a 0a 2f 2a  XT\n"); */.}../*
14070 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 66 75  .** Provide a fu
14080 6c 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  ll declaration t
14090 6f 20 61 6e 79 20 6f 62 6a 65 63 74 20 77 68 69  o any object whi
140a0 63 68 20 73 6f 20 66 61 72 20 68 61 73 20 68 61  ch so far has ha
140b0 64 20 6f 6e 6c 79 0a 2a 2a 20 61 20 66 6f 72 77  d only.** a forw
140c0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e  ard declaration.
140d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
140e0 43 6f 6d 70 6c 65 74 65 46 6f 72 77 61 72 64 44  CompleteForwardD
140f0 65 63 6c 61 72 61 74 69 6f 6e 73 28 47 65 6e 53  eclarations(GenS
14100 74 61 74 65 20 2a 70 53 74 61 74 65 29 7b 0a 20  tate *pState){. 
14110 20 44 65 63 6c 20 2a 70 44 65 63 6c 3b 0a 20 20   Decl *pDecl;.  
14120 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20  int progress;.. 
14130 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73   do{.    progres
14140 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  s = 0;.    for(p
14150 44 65 63 6c 3d 70 44 65 63 6c 46 69 72 73 74 3b  Decl=pDeclFirst;
14160 20 70 44 65 63 6c 3b 20 70 44 65 63 6c 3d 70 44   pDecl; pDecl=pD
14170 65 63 6c 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ecl->pNext){.   
14180 20 20 20 69 66 28 20 44 65 63 6c 48 61 73 50 72     if( DeclHasPr
14190 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f  operty(pDecl,DP_
141a0 46 6f 72 77 61 72 64 29 0a 20 20 20 20 20 20 20  Forward).       
141b0 26 26 20 21 44 65 63 6c 48 61 73 50 72 6f 70 65  && !DeclHasPrope
141c0 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 44 65 63  rty(pDecl,DP_Dec
141d0 6c 61 72 65 64 29 0a 20 20 20 20 20 20 29 7b 0a  lared).      ){.
141e0 20 20 20 20 20 20 20 20 44 65 63 6c 61 72 65 4f          DeclareO
141f0 62 6a 65 63 74 28 70 44 65 63 6c 2c 70 53 74 61  bject(pDecl,pSta
14200 74 65 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 70  te,1);.        p
14210 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20  rogress = 1;.   
14220 20 20 20 20 20 61 73 73 65 72 74 28 20 44 65 63       assert( Dec
14230 6c 48 61 73 50 72 6f 70 65 72 74 79 28 70 44 65  lHasProperty(pDe
14240 63 6c 2c 44 50 5f 44 65 63 6c 61 72 65 64 29 20  cl,DP_Declared) 
14250 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14260 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72  .  }while( progr
14270 65 73 73 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ess );.}../*.** 
14280 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 63 6c  Generate an incl
14290 75 64 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ude file for the
142a0 20 67 69 76 65 6e 20 73 6f 75 72 63 65 20 66 69   given source fi
142b0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
142c0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
142d0 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
142e0 0a 2a 2a 0a 2a 2a 20 69 66 20 6e 6f 6c 6f 63 61  .**.** if noloca
142f0 6c 5f 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  l_flag is true, 
14300 74 68 65 6e 20 77 65 20 64 6f 20 6e 6f 74 20 67  then we do not g
14310 65 6e 65 72 61 74 65 20 64 65 63 6c 61 72 61 74  enerate declarat
14320 69 6f 6e 73 20 66 6f 72 0a 2a 2a 20 6f 62 6a 65  ions for.** obje
14330 63 74 65 64 20 6d 61 72 6b 65 64 20 44 50 5f 4c  cted marked DP_L
14340 6f 63 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocal..*/.static 
14350 69 6e 74 20 4d 61 6b 65 48 65 61 64 65 72 28 49  int MakeHeader(I
14360 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 46 49  nFile *pFile, FI
14370 4c 45 20 2a 72 65 70 6f 72 74 2c 20 69 6e 74 20  LE *report, int 
14380 6e 6f 6c 6f 63 61 6c 5f 66 6c 61 67 29 7b 0a 20  nolocal_flag){. 
14390 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
143a0 20 47 65 6e 53 74 61 74 65 20 73 53 74 61 74 65   GenState sState
143b0 3b 0a 20 20 53 74 72 69 6e 67 20 6f 75 74 53 74  ;.  String outSt
143c0 72 3b 0a 20 20 49 64 65 6e 74 54 61 62 6c 65 20  r;.  IdentTable 
143d0 69 6e 63 6c 75 64 65 54 61 62 6c 65 3b 0a 20 20  includeTable;.  
143e0 49 64 65 6e 74 20 2a 70 49 64 3b 0a 20 20 63 68  Ident *pId;.  ch
143f0 61 72 20 2a 7a 4e 65 77 56 65 72 73 69 6f 6e 3b  ar *zNewVersion;
14400 0a 20 20 63 68 61 72 20 2a 7a 4f 6c 64 56 65 72  .  char *zOldVer
14410 73 69 6f 6e 3b 0a 0a 20 20 69 66 28 20 70 46 69  sion;..  if( pFi
14420 6c 65 2d 3e 7a 48 64 72 3d 3d 30 20 7c 7c 20 2a  le->zHdr==0 || *
14430 70 46 69 6c 65 2d 3e 7a 48 64 72 3d 3d 30 20 29  pFile->zHdr==0 )
14440 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 53 74   return 0;.  sSt
14450 61 74 65 2e 70 53 74 72 20 3d 20 26 6f 75 74 53  ate.pStr = &outS
14460 74 72 3b 0a 20 20 53 74 72 69 6e 67 49 6e 69 74  tr;.  StringInit
14470 28 26 6f 75 74 53 74 72 29 3b 0a 20 20 53 74 72  (&outStr);.  Str
14480 69 6e 67 41 70 70 65 6e 64 28 26 6f 75 74 53 74  ingAppend(&outSt
14490 72 2c 7a 54 6f 70 4c 69 6e 65 2c 6e 54 6f 70 4c  r,zTopLine,nTopL
144a0 69 6e 65 29 3b 0a 20 20 73 53 74 61 74 65 2e 70  ine);.  sState.p
144b0 54 61 62 6c 65 20 3d 20 26 69 6e 63 6c 75 64 65  Table = &include
144c0 54 61 62 6c 65 3b 0a 20 20 6d 65 6d 73 65 74 28  Table;.  memset(
144d0 26 69 6e 63 6c 75 64 65 54 61 62 6c 65 2c 30 2c  &includeTable,0,
144e0 73 69 7a 65 6f 66 28 69 6e 63 6c 75 64 65 54 61  sizeof(includeTa
144f0 62 6c 65 29 29 3b 0a 20 20 73 53 74 61 74 65 2e  ble));.  sState.
14500 7a 49 66 20 3d 20 30 3b 0a 20 20 73 53 74 61 74  zIf = 0;.  sStat
14510 65 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73 53  e.nErr = 0;.  sS
14520 74 61 74 65 2e 7a 46 69 6c 65 6e 61 6d 65 20 3d  tate.zFilename =
14530 20 70 46 69 6c 65 2d 3e 7a 53 72 63 3b 0a 20 20   pFile->zSrc;.  
14540 73 53 74 61 74 65 2e 66 6c 61 67 73 20 3d 20 70  sState.flags = p
14550 46 69 6c 65 2d 3e 66 6c 61 67 73 20 26 20 44 50  File->flags & DP
14560 5f 43 70 6c 75 73 70 6c 75 73 3b 0a 20 20 52 65  _Cplusplus;.  Re
14570 73 65 74 44 65 63 6c 46 6c 61 67 73 28 6e 6f 6c  setDeclFlags(nol
14580 6f 63 61 6c 5f 66 6c 61 67 20 3f 20 22 6e 6f 22  ocal_flag ? "no"
14590 20 3a 20 70 46 69 6c 65 2d 3e 7a 53 72 63 29 3b   : pFile->zSrc);
145a0 0a 20 20 66 6f 72 28 70 49 64 20 3d 20 70 46 69  .  for(pId = pFi
145b0 6c 65 2d 3e 69 64 54 61 62 6c 65 2e 70 4c 69 73  le->idTable.pLis
145c0 74 3b 20 70 49 64 3b 20 70 49 64 3d 70 49 64 2d  t; pId; pId=pId-
145d0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 44 65 63  >pNext){.    Dec
145e0 6c 20 2a 70 44 65 63 6c 20 3d 20 46 69 6e 64 44  l *pDecl = FindD
145f0 65 63 6c 28 70 49 64 2d 3e 7a 4e 61 6d 65 2c 30  ecl(pId->zName,0
14600 29 3b 0a 20 20 20 20 69 66 28 20 70 44 65 63 6c  );.    if( pDecl
14610 20 29 7b 0a 20 20 20 20 20 20 44 65 63 6c 61 72   ){.      Declar
14620 65 4f 62 6a 65 63 74 28 70 44 65 63 6c 2c 26 73  eObject(pDecl,&s
14630 53 74 61 74 65 2c 31 29 3b 0a 20 20 20 20 7d 0a  State,1);.    }.
14640 20 20 7d 0a 20 20 43 6f 6d 70 6c 65 74 65 46 6f    }.  CompleteFo
14650 72 77 61 72 64 44 65 63 6c 61 72 61 74 69 6f 6e  rwardDeclaration
14660 73 28 26 73 53 74 61 74 65 29 3b 0a 20 20 43 68  s(&sState);.  Ch
14670 61 6e 67 65 49 66 43 6f 6e 74 65 78 74 28 30 2c  angeIfContext(0,
14680 26 73 53 74 61 74 65 29 3b 0a 20 20 6e 45 72 72  &sState);.  nErr
14690 20 2b 3d 20 73 53 74 61 74 65 2e 6e 45 72 72 3b   += sState.nErr;
146a0 0a 20 20 7a 4f 6c 64 56 65 72 73 69 6f 6e 20 3d  .  zOldVersion =
146b0 20 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d   ReadFile(pFile-
146c0 3e 7a 48 64 72 29 3b 0a 20 20 7a 4e 65 77 56 65  >zHdr);.  zNewVe
146d0 72 73 69 6f 6e 20 3d 20 53 74 72 69 6e 67 47 65  rsion = StringGe
146e0 74 28 26 6f 75 74 53 74 72 29 3b 0a 20 20 69 66  t(&outStr);.  if
146f0 28 20 72 65 70 6f 72 74 20 29 20 66 70 72 69 6e  ( report ) fprin
14700 74 66 28 72 65 70 6f 72 74 2c 22 25 73 3a 20 22  tf(report,"%s: "
14710 2c 70 46 69 6c 65 2d 3e 7a 48 64 72 29 3b 0a 20  ,pFile->zHdr);. 
14720 20 69 66 28 20 7a 4f 6c 64 56 65 72 73 69 6f 6e   if( zOldVersion
14730 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==0 ){.    if( r
14740 65 70 6f 72 74 20 29 20 66 70 72 69 6e 74 66 28  eport ) fprintf(
14750 72 65 70 6f 72 74 2c 22 75 70 64 61 74 65 64 5c  report,"updated\
14760 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 57 72 69  n");.    if( Wri
14770 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 7a 48  teFile(pFile->zH
14780 64 72 2c 7a 4e 65 77 56 65 72 73 69 6f 6e 29 20  dr,zNewVersion) 
14790 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
147a0 28 73 74 64 65 72 72 2c 22 25 73 3a 20 43 61 6e  (stderr,"%s: Can
147b0 27 74 20 77 72 69 74 65 20 74 6f 20 66 69 6c 65  't write to file
147c0 5c 6e 22 2c 70 46 69 6c 65 2d 3e 7a 48 64 72 29  \n",pFile->zHdr)
147d0 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
147e0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
147f0 28 20 73 74 72 6e 63 6d 70 28 7a 4f 6c 64 56 65  ( strncmp(zOldVe
14800 72 73 69 6f 6e 2c 7a 54 6f 70 4c 69 6e 65 2c 6e  rsion,zTopLine,n
14810 54 6f 70 4c 69 6e 65 29 21 3d 30 20 29 7b 0a 20  TopLine)!=0 ){. 
14820 20 20 20 69 66 28 20 72 65 70 6f 72 74 20 29 20     if( report ) 
14830 66 70 72 69 6e 74 66 28 72 65 70 6f 72 74 2c 22  fprintf(report,"
14840 65 72 72 6f 72 21 5c 6e 22 29 3b 0a 20 20 20 20  error!\n");.    
14850 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  fprintf(stderr,.
14860 20 20 20 20 20 20 20 22 25 73 3a 20 43 61 6e 27         "%s: Can'
14870 74 20 6f 76 65 72 77 72 69 74 65 20 74 68 69 73  t overwrite this
14880 20 66 69 6c 65 20 62 65 63 61 75 73 65 20 69 74   file because it
14890 20 77 61 73 6e 27 74 20 70 72 65 76 69 6f 75 73   wasn't previous
148a0 6c 79 5c 6e 22 0a 20 20 20 20 20 20 20 22 25 2a  ly\n".       "%*
148b0 73 20 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  s  generated by 
148c0 27 6d 61 6b 65 68 65 61 64 65 72 73 27 2e 5c 6e  'makeheaders'.\n
148d0 22 2c 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ",.       pFile-
148e0 3e 7a 48 64 72 2c 20 28 69 6e 74 29 73 74 72 6c  >zHdr, (int)strl
148f0 65 6e 28 70 46 69 6c 65 2d 3e 7a 48 64 72 29 2c  en(pFile->zHdr),
14900 20 22 22 29 3b 0a 20 20 20 20 6e 45 72 72 2b 2b   "");.    nErr++
14910 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
14920 72 63 6d 70 28 7a 4f 6c 64 56 65 72 73 69 6f 6e  rcmp(zOldVersion
14930 2c 7a 4e 65 77 56 65 72 73 69 6f 6e 29 21 3d 30  ,zNewVersion)!=0
14940 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 70 6f   ){.    if( repo
14950 72 74 20 29 20 66 70 72 69 6e 74 66 28 72 65 70  rt ) fprintf(rep
14960 6f 72 74 2c 22 75 70 64 61 74 65 64 5c 6e 22 29  ort,"updated\n")
14970 3b 0a 20 20 20 20 69 66 28 20 57 72 69 74 65 46  ;.    if( WriteF
14980 69 6c 65 28 70 46 69 6c 65 2d 3e 7a 48 64 72 2c  ile(pFile->zHdr,
14990 7a 4e 65 77 56 65 72 73 69 6f 6e 29 20 29 7b 0a  zNewVersion) ){.
149a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
149b0 64 65 72 72 2c 22 25 73 3a 20 43 61 6e 27 74 20  derr,"%s: Can't 
149c0 77 72 69 74 65 20 74 6f 20 66 69 6c 65 5c 6e 22  write to file\n"
149d0 2c 70 46 69 6c 65 2d 3e 7a 48 64 72 29 3b 0a 20  ,pFile->zHdr);. 
149e0 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
149f0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72   }.  }else if( r
14a00 65 70 6f 72 74 20 29 7b 0a 20 20 20 20 66 70 72  eport ){.    fpr
14a10 69 6e 74 66 28 72 65 70 6f 72 74 2c 22 75 6e 63  intf(report,"unc
14a20 68 61 6e 67 65 64 5c 6e 22 29 3b 0a 20 20 7d 0a  hanged\n");.  }.
14a30 20 20 53 61 66 65 46 72 65 65 28 7a 4f 6c 64 56    SafeFree(zOldV
14a40 65 72 73 69 6f 6e 29 3b 0a 20 20 49 64 65 6e 74  ersion);.  Ident
14a50 54 61 62 6c 65 52 65 73 65 74 28 26 69 6e 63 6c  TableReset(&incl
14a60 75 64 65 54 61 62 6c 65 29 3b 0a 20 20 53 74 72  udeTable);.  Str
14a70 69 6e 67 52 65 73 65 74 28 26 6f 75 74 53 74 72  ingReset(&outStr
14a80 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72  );.  return nErr
14a90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
14aa0 61 74 65 20 61 20 67 6c 6f 62 61 6c 20 68 65 61  ate a global hea
14ab0 64 65 72 20 66 69 6c 65 20 2d 2d 20 61 20 68 65  der file -- a he
14ac0 61 64 65 72 20 66 69 6c 65 20 74 68 61 74 20 63  ader file that c
14ad0 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 64  ontains all.** d
14ae0 65 63 6c 61 72 61 74 69 6f 6e 73 2e 20 20 49 66  eclarations.  If
14af0 20 74 68 65 20 66 6f 72 45 78 70 6f 72 74 20 66   the forExport f
14b00 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
14b10 6e 20 6f 6e 6c 79 20 74 68 6f 73 65 0a 2a 2a 20  n only those.** 
14b20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 61 72 65  objects that are
14b30 20 65 78 70 6f 72 74 65 64 20 61 72 65 20 69 6e   exported are in
14b40 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 68 65  cluded in the he
14b50 61 64 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ader file..*/.st
14b60 61 74 69 63 20 69 6e 74 20 4d 61 6b 65 47 6c 6f  atic int MakeGlo
14b70 62 61 6c 48 65 61 64 65 72 28 69 6e 74 20 66 6f  balHeader(int fo
14b80 72 45 78 70 6f 72 74 29 7b 0a 20 20 47 65 6e 53  rExport){.  GenS
14b90 74 61 74 65 20 73 53 74 61 74 65 3b 0a 20 20 53  tate sState;.  S
14ba0 74 72 69 6e 67 20 6f 75 74 53 74 72 3b 0a 20 20  tring outStr;.  
14bb0 49 64 65 6e 74 54 61 62 6c 65 20 69 6e 63 6c 75  IdentTable inclu
14bc0 64 65 54 61 62 6c 65 3b 0a 20 20 44 65 63 6c 20  deTable;.  Decl 
14bd0 2a 70 44 65 63 6c 3b 0a 0a 20 20 73 53 74 61 74  *pDecl;..  sStat
14be0 65 2e 70 53 74 72 20 3d 20 26 6f 75 74 53 74 72  e.pStr = &outStr
14bf0 3b 0a 20 20 53 74 72 69 6e 67 49 6e 69 74 28 26  ;.  StringInit(&
14c00 6f 75 74 53 74 72 29 3b 0a 20 20 2f 2a 20 53 74  outStr);.  /* St
14c10 72 69 6e 67 41 70 70 65 6e 64 28 26 6f 75 74 53  ringAppend(&outS
14c20 74 72 2c 7a 54 6f 70 4c 69 6e 65 2c 6e 54 6f 70  tr,zTopLine,nTop
14c30 4c 69 6e 65 29 3b 20 2a 2f 0a 20 20 73 53 74 61  Line); */.  sSta
14c40 74 65 2e 70 54 61 62 6c 65 20 3d 20 26 69 6e 63  te.pTable = &inc
14c50 6c 75 64 65 54 61 62 6c 65 3b 0a 20 20 6d 65 6d  ludeTable;.  mem
14c60 73 65 74 28 26 69 6e 63 6c 75 64 65 54 61 62 6c  set(&includeTabl
14c70 65 2c 30 2c 73 69 7a 65 6f 66 28 69 6e 63 6c 75  e,0,sizeof(inclu
14c80 64 65 54 61 62 6c 65 29 29 3b 0a 20 20 73 53 74  deTable));.  sSt
14c90 61 74 65 2e 7a 49 66 20 3d 20 30 3b 0a 20 20 73  ate.zIf = 0;.  s
14ca0 53 74 61 74 65 2e 6e 45 72 72 20 3d 20 30 3b 0a  State.nErr = 0;.
14cb0 20 20 73 53 74 61 74 65 2e 7a 46 69 6c 65 6e 61    sState.zFilena
14cc0 6d 65 20 3d 20 22 28 61 6c 6c 29 22 3b 0a 20 20  me = "(all)";.  
14cd0 73 53 74 61 74 65 2e 66 6c 61 67 73 20 3d 20 30  sState.flags = 0
14ce0 3b 0a 20 20 52 65 73 65 74 44 65 63 6c 46 6c 61  ;.  ResetDeclFla
14cf0 67 73 28 30 29 3b 0a 20 20 66 6f 72 28 70 44 65  gs(0);.  for(pDe
14d00 63 6c 3d 70 44 65 63 6c 46 69 72 73 74 3b 20 70  cl=pDeclFirst; p
14d10 44 65 63 6c 3b 20 70 44 65 63 6c 3d 70 44 65 63  Decl; pDecl=pDec
14d20 6c 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  l->pNext){.    i
14d30 66 28 20 66 6f 72 45 78 70 6f 72 74 3d 3d 30 20  f( forExport==0 
14d40 7c 7c 20 44 65 63 6c 48 61 73 50 72 6f 70 65 72  || DeclHasProper
14d50 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 78 70 6f  ty(pDecl,DP_Expo
14d60 72 74 29 20 29 7b 0a 20 20 20 20 20 20 44 65 63  rt) ){.      Dec
14d70 6c 61 72 65 4f 62 6a 65 63 74 28 70 44 65 63 6c  lareObject(pDecl
14d80 2c 26 73 53 74 61 74 65 2c 31 29 3b 0a 20 20 20  ,&sState,1);.   
14d90 20 7d 0a 20 20 7d 0a 20 20 43 68 61 6e 67 65 49   }.  }.  ChangeI
14da0 66 43 6f 6e 74 65 78 74 28 30 2c 26 73 53 74 61  fContext(0,&sSta
14db0 74 65 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 25  te);.  printf("%
14dc0 73 22 2c 53 74 72 69 6e 67 47 65 74 28 26 6f 75  s",StringGet(&ou
14dd0 74 53 74 72 29 29 3b 0a 20 20 49 64 65 6e 74 54  tStr));.  IdentT
14de0 61 62 6c 65 52 65 73 65 74 28 26 69 6e 63 6c 75  ableReset(&inclu
14df0 64 65 54 61 62 6c 65 29 3b 0a 20 20 53 74 72 69  deTable);.  Stri
14e00 6e 67 52 65 73 65 74 28 26 6f 75 74 53 74 72 29  ngReset(&outStr)
14e10 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
14e20 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a 2f 2a  .#ifdef DEBUG./*
14e30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
14e40 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
14e50 65 72 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e  ers in the given
14e60 20 73 74 72 69 6e 67 20 70 72 69 6f 72 20 74 6f   string prior to
14e70 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 65   the.** first ne
14e80 77 6c 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  wline..*/.static
14e90 20 69 6e 74 20 43 6c 69 70 54 72 61 69 6c 69 6e   int ClipTrailin
14ea0 67 4e 65 77 6c 69 6e 65 28 63 68 61 72 20 2a 7a  gNewline(char *z
14eb0 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72  ){.  int n = str
14ec0 6c 65 6e 28 7a 29 3b 0a 20 20 77 68 69 6c 65 28  len(z);.  while(
14ed0 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d   n>0 && (z[n-1]=
14ee0 3d 27 5c 6e 27 20 7c 7c 20 7a 5b 6e 2d 31 5d 3d  ='\n' || z[n-1]=
14ef0 3d 27 5c 72 27 29 20 29 7b 20 6e 2d 2d 3b 20 7d  ='\r') ){ n--; }
14f00 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
14f10 2f 2a 0a 2a 2a 20 44 75 6d 70 20 74 68 65 20 65  /*.** Dump the e
14f20 6e 74 69 72 65 20 64 65 63 6c 61 72 61 74 69 6f  ntire declaratio
14f30 6e 20 6c 69 73 74 20 66 6f 72 20 64 65 62 75 67  n list for debug
14f40 67 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f  ging purposes.*/
14f50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 75 6d  .static void Dum
14f60 70 44 65 63 6c 4c 69 73 74 28 76 6f 69 64 29 7b  pDeclList(void){
14f70 0a 20 20 44 65 63 6c 20 2a 70 44 65 63 6c 3b 0a  .  Decl *pDecl;.
14f80 0a 20 20 66 6f 72 28 70 44 65 63 6c 20 3d 20 70  .  for(pDecl = p
14f90 44 65 63 6c 46 69 72 73 74 3b 20 70 44 65 63 6c  DeclFirst; pDecl
14fa0 3b 20 70 44 65 63 6c 3d 70 44 65 63 6c 2d 3e 70  ; pDecl=pDecl->p
14fb0 4e 65 78 74 29 7b 0a 20 20 20 20 70 72 69 6e 74  Next){.    print
14fc0 66 28 22 2a 2a 2a 2a 20 25 73 20 66 72 6f 6d 20  f("**** %s from 
14fd0 66 69 6c 65 20 25 73 20 2a 2a 2a 2a 5c 6e 22 2c  file %s ****\n",
14fe0 70 44 65 63 6c 2d 3e 7a 4e 61 6d 65 2c 70 44 65  pDecl->zName,pDe
14ff0 63 6c 2d 3e 7a 46 69 6c 65 29 3b 0a 20 20 20 20  cl->zFile);.    
15000 69 66 28 20 70 44 65 63 6c 2d 3e 7a 49 66 20 29  if( pDecl->zIf )
15010 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  {.      printf("
15020 49 66 3a 20 5b 25 2e 2a 73 5d 5c 6e 22 2c 43 6c  If: [%.*s]\n",Cl
15030 69 70 54 72 61 69 6c 69 6e 67 4e 65 77 6c 69 6e  ipTrailingNewlin
15040 65 28 70 44 65 63 6c 2d 3e 7a 49 66 29 2c 70 44  e(pDecl->zIf),pD
15050 65 63 6c 2d 3e 7a 49 66 29 3b 0a 20 20 20 20 7d  ecl->zIf);.    }
15060 0a 20 20 20 20 69 66 28 20 70 44 65 63 6c 2d 3e  .    if( pDecl->
15070 7a 46 77 64 20 29 7b 0a 20 20 20 20 20 20 70 72  zFwd ){.      pr
15080 69 6e 74 66 28 22 44 65 63 6c 3a 20 5b 25 2e 2a  intf("Decl: [%.*
15090 73 5d 5c 6e 22 2c 43 6c 69 70 54 72 61 69 6c 69  s]\n",ClipTraili
150a0 6e 67 4e 65 77 6c 69 6e 65 28 70 44 65 63 6c 2d  ngNewline(pDecl-
150b0 3e 7a 46 77 64 29 2c 70 44 65 63 6c 2d 3e 7a 46  >zFwd),pDecl->zF
150c0 77 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  wd);.    }.    i
150d0 66 28 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 20  f( pDecl->zDecl 
150e0 29 7b 0a 20 20 20 20 20 20 49 6e 73 65 72 74 45  ){.      InsertE
150f0 78 74 72 61 44 65 63 6c 28 70 44 65 63 6c 29 3b  xtraDecl(pDecl);
15100 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 44  .      printf("D
15110 65 66 3a 20 5b 25 2e 2a 73 5d 5c 6e 22 2c 43 6c  ef: [%.*s]\n",Cl
15120 69 70 54 72 61 69 6c 69 6e 67 4e 65 77 6c 69 6e  ipTrailingNewlin
15130 65 28 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 29 2c  e(pDecl->zDecl),
15140 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 29 3b 0a 20  pDecl->zDecl);. 
15150 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 65     }.    if( pDe
15160 63 6c 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  cl->flags ){.   
15170 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
15180 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d   {.        int m
15190 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 63 68 61  ask;.        cha
151a0 72 20 2a 64 65 73 63 3b 0a 20 20 20 20 20 20 7d  r *desc;.      }
151b0 20 66 6c 61 67 53 65 74 5b 5d 20 3d 20 7b 0a 20   flagSet[] = {. 
151c0 20 20 20 20 20 20 20 7b 20 54 59 5f 43 6c 61 73         { TY_Clas
151d0 73 2c 20 20 20 20 20 20 20 22 63 6c 61 73 73 22  s,       "class"
151e0 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 54 59   },.        { TY
151f0 5f 45 6e 75 6d 65 72 61 74 69 6f 6e 2c 20 22 65  _Enumeration, "e
15200 6e 75 6d 22 20 7d 2c 0a 20 20 20 20 20 20 20 20  num" },.        
15210 7b 20 54 59 5f 53 74 72 75 63 74 75 72 65 2c 20  { TY_Structure, 
15220 20 20 22 73 74 72 75 63 74 22 20 7d 2c 0a 20 20    "struct" },.  
15230 20 20 20 20 20 20 7b 20 54 59 5f 55 6e 69 6f 6e        { TY_Union
15240 2c 20 20 20 20 20 20 20 22 75 6e 69 6f 6e 22 20  ,       "union" 
15250 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 54 59 5f  },.        { TY_
15260 56 61 72 69 61 62 6c 65 2c 20 20 20 20 22 76 61  Variable,    "va
15270 72 69 61 62 6c 65 22 20 7d 2c 0a 20 20 20 20 20  riable" },.     
15280 20 20 20 7b 20 54 59 5f 53 75 62 72 6f 75 74 69     { TY_Subrouti
15290 6e 65 2c 20 20 22 66 75 6e 63 74 69 6f 6e 22 20  ne,  "function" 
152a0 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 54 59 5f  },.        { TY_
152b0 54 79 70 65 64 65 66 2c 20 20 20 20 20 22 74 79  Typedef,     "ty
152c0 70 65 64 65 66 22 20 7d 2c 0a 20 20 20 20 20 20  pedef" },.      
152d0 20 20 7b 20 54 59 5f 4d 61 63 72 6f 2c 20 20 20    { TY_Macro,   
152e0 20 20 20 20 22 6d 61 63 72 6f 22 20 7d 2c 0a 20      "macro" },. 
152f0 20 20 20 20 20 20 20 7b 20 44 50 5f 45 78 70 6f         { DP_Expo
15300 72 74 2c 20 20 20 20 20 20 22 65 78 70 6f 72 74  rt,      "export
15310 22 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 44  " },.        { D
15320 50 5f 4c 6f 63 61 6c 2c 20 20 20 20 20 20 20 22  P_Local,       "
15330 6c 6f 63 61 6c 22 20 7d 2c 0a 20 20 20 20 20 20  local" },.      
15340 20 20 7b 20 44 50 5f 43 70 6c 75 73 70 6c 75 73    { DP_Cplusplus
15350 2c 20 20 20 22 43 2b 2b 22 20 7d 2c 0a 20 20 20  ,   "C++" },.   
15360 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
15370 69 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  i;.      printf(
15380 22 66 6c 61 67 73 3a 22 29 3b 0a 20 20 20 20 20  "flags:");.     
15390 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
153a0 6f 66 28 66 6c 61 67 53 65 74 29 2f 73 69 7a 65  of(flagSet)/size
153b0 6f 66 28 66 6c 61 67 53 65 74 5b 30 5d 29 3b 20  of(flagSet[0]); 
153c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
153d0 28 20 66 6c 61 67 53 65 74 5b 69 5d 2e 6d 61 73  ( flagSet[i].mas
153e0 6b 20 26 20 70 44 65 63 6c 2d 3e 66 6c 61 67 73  k & pDecl->flags
153f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72   ){.          pr
15400 69 6e 74 66 28 22 20 25 73 22 2c 20 66 6c 61 67  intf(" %s", flag
15410 53 65 74 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  Set[i].desc);.  
15420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15430 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e        printf("\n
15440 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
15450 28 20 70 44 65 63 6c 2d 3e 70 49 6e 63 6c 75 64  ( pDecl->pInclud
15460 65 20 29 7b 0a 20 20 20 20 20 20 49 6e 63 6c 75  e ){.      Inclu
15470 64 65 20 2a 70 3b 0a 20 20 20 20 20 20 70 72 69  de *p;.      pri
15480 6e 74 66 28 22 69 6e 63 6c 75 64 65 73 3a 22 29  ntf("includes:")
15490 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 44  ;.      for(p=pD
154a0 65 63 6c 2d 3e 70 49 6e 63 6c 75 64 65 3b 20 70  ecl->pInclude; p
154b0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
154c0 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20         printf(" 
154d0 25 73 22 2c 70 2d 3e 7a 46 69 6c 65 29 3b 0a 20  %s",p->zFile);. 
154e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69       }.      pri
154f0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d  ntf("\n");.    }
15500 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
15510 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 22 2d  *.** When the "-
15520 64 6f 63 22 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  doc" command-lin
15530 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
15540 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
15550 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20 70  s called.** to p
15560 72 69 6e 74 20 61 6c 6c 20 6f 66 20 74 68 65 20  rint all of the 
15570 64 61 74 61 62 61 73 65 20 69 6e 66 6f 72 6d 61  database informa
15580 74 69 6f 6e 20 74 6f 20 73 74 61 6e 64 61 72 64  tion to standard
15590 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74   output..*/.stat
155a0 69 63 20 76 6f 69 64 20 44 6f 63 75 6d 65 6e 74  ic void Document
155b0 61 74 69 6f 6e 44 75 6d 70 28 76 6f 69 64 29 7b  ationDump(void){
155c0 0a 20 20 44 65 63 6c 20 2a 70 44 65 63 6c 3b 0a  .  Decl *pDecl;.
155d0 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
155e0 7b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b 0a  {.    int mask;.
155f0 20 20 20 20 63 68 61 72 20 66 6c 61 67 3b 0a 20      char flag;. 
15600 20 7d 20 66 6c 61 67 53 65 74 5b 5d 20 3d 20 7b   } flagSet[] = {
15610 0a 20 20 20 20 7b 20 54 59 5f 43 6c 61 73 73 2c  .    { TY_Class,
15620 20 20 20 20 20 20 20 27 63 27 20 7d 2c 0a 20 20         'c' },.  
15630 20 20 7b 20 54 59 5f 45 6e 75 6d 65 72 61 74 69    { TY_Enumerati
15640 6f 6e 2c 20 27 65 27 20 7d 2c 0a 20 20 20 20 7b  on, 'e' },.    {
15650 20 54 59 5f 53 74 72 75 63 74 75 72 65 2c 20 20   TY_Structure,  
15660 20 27 73 27 20 7d 2c 0a 20 20 20 20 7b 20 54 59   's' },.    { TY
15670 5f 55 6e 69 6f 6e 2c 20 20 20 20 20 20 20 27 75  _Union,       'u
15680 27 20 7d 2c 0a 20 20 20 20 7b 20 54 59 5f 56 61  ' },.    { TY_Va
15690 72 69 61 62 6c 65 2c 20 20 20 20 27 76 27 20 7d  riable,    'v' }
156a0 2c 0a 20 20 20 20 7b 20 54 59 5f 53 75 62 72 6f  ,.    { TY_Subro
156b0 75 74 69 6e 65 2c 20 20 27 66 27 20 7d 2c 0a 20  utine,  'f' },. 
156c0 20 20 20 7b 20 54 59 5f 54 79 70 65 64 65 66 2c     { TY_Typedef,
156d0 20 20 20 20 20 27 74 27 20 7d 2c 0a 20 20 20 20       't' },.    
156e0 7b 20 54 59 5f 4d 61 63 72 6f 2c 20 20 20 20 20  { TY_Macro,     
156f0 20 20 27 6d 27 20 7d 2c 0a 20 20 20 20 7b 20 44    'm' },.    { D
15700 50 5f 45 78 70 6f 72 74 2c 20 20 20 20 20 20 27  P_Export,      '
15710 78 27 20 7d 2c 0a 20 20 20 20 7b 20 44 50 5f 4c  x' },.    { DP_L
15720 6f 63 61 6c 2c 20 20 20 20 20 20 20 27 6c 27 20  ocal,       'l' 
15730 7d 2c 0a 20 20 20 20 7b 20 44 50 5f 43 70 6c 75  },.    { DP_Cplu
15740 73 70 6c 75 73 2c 20 20 20 27 2b 27 20 7d 2c 0a  splus,   '+' },.
15750 20 20 7d 3b 0a 0a 20 20 66 6f 72 28 70 44 65 63    };..  for(pDec
15760 6c 20 3d 20 70 44 65 63 6c 46 69 72 73 74 3b 20  l = pDeclFirst; 
15770 70 44 65 63 6c 3b 20 70 44 65 63 6c 3d 70 44 65  pDecl; pDecl=pDe
15780 63 6c 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  cl->pNext){.    
15790 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
157a0 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 20 20 63  Label = 0;.    c
157b0 68 61 72 20 2a 7a 44 65 63 6c 3b 0a 20 20 20 20  har *zDecl;.    
157c0 63 68 61 72 20 7a 4c 61 62 65 6c 5b 35 30 5d 3b  char zLabel[50];
157d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
157e0 73 69 7a 65 6f 66 28 66 6c 61 67 53 65 74 29 2f  sizeof(flagSet)/
157f0 73 69 7a 65 6f 66 28 66 6c 61 67 53 65 74 5b 30  sizeof(flagSet[0
15800 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
15810 69 66 28 20 44 65 63 6c 48 61 73 50 72 6f 70 65  if( DeclHasPrope
15820 72 74 79 28 70 44 65 63 6c 2c 66 6c 61 67 53 65  rty(pDecl,flagSe
15830 74 5b 69 5d 2e 6d 61 73 6b 29 20 29 7b 0a 20 20  t[i].mask) ){.  
15840 20 20 20 20 20 20 7a 4c 61 62 65 6c 5b 6e 4c 61        zLabel[nLa
15850 62 65 6c 2b 2b 5d 20 3d 20 66 6c 61 67 53 65 74  bel++] = flagSet
15860 5b 69 5d 2e 66 6c 61 67 3b 0a 20 20 20 20 20 20  [i].flag;.      
15870 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
15880 6e 4c 61 62 65 6c 3d 3d 30 20 29 20 63 6f 6e 74  nLabel==0 ) cont
15890 69 6e 75 65 3b 0a 20 20 20 20 7a 4c 61 62 65 6c  inue;.    zLabel
158a0 5b 6e 4c 61 62 65 6c 5d 20 3d 20 30 3b 0a 20 20  [nLabel] = 0;.  
158b0 20 20 49 6e 73 65 72 74 45 78 74 72 61 44 65 63    InsertExtraDec
158c0 6c 28 70 44 65 63 6c 29 3b 0a 20 20 20 20 7a 44  l(pDecl);.    zD
158d0 65 63 6c 20 3d 20 70 44 65 63 6c 2d 3e 7a 44 65  ecl = pDecl->zDe
158e0 63 6c 3b 0a 20 20 20 20 69 66 28 20 7a 44 65 63  cl;.    if( zDec
158f0 6c 3d 3d 30 20 29 20 7a 44 65 63 6c 20 3d 20 70  l==0 ) zDecl = p
15900 44 65 63 6c 2d 3e 7a 46 77 64 3b 0a 20 20 20 20  Decl->zFwd;.    
15910 70 72 69 6e 74 66 28 22 25 73 20 25 73 20 25 73  printf("%s %s %s
15920 20 25 70 20 25 64 20 25 64 20 25 64 20 25 64 20   %p %d %d %d %d 
15930 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 44  %d\n",.       pD
15940 65 63 6c 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  ecl->zName,.    
15950 20 20 20 7a 4c 61 62 65 6c 2c 0a 20 20 20 20 20     zLabel,.     
15960 20 20 70 44 65 63 6c 2d 3e 7a 46 69 6c 65 2c 0a    pDecl->zFile,.
15970 20 20 20 20 20 20 20 70 44 65 63 6c 2d 3e 70 43         pDecl->pC
15980 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 70  omment,.       p
15990 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20 3f  Decl->pComment ?
159a0 20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74   pDecl->pComment
159b0 2d 3e 6e 54 65 78 74 2b 31 20 3a 20 30 2c 0a 20  ->nText+1 : 0,. 
159c0 20 20 20 20 20 20 70 44 65 63 6c 2d 3e 7a 49 66        pDecl->zIf
159d0 20 3f 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70   ? (int)strlen(p
159e0 44 65 63 6c 2d 3e 7a 49 66 29 2b 31 20 3a 20 30  Decl->zIf)+1 : 0
159f0 2c 0a 20 20 20 20 20 20 20 7a 44 65 63 6c 20 3f  ,.       zDecl ?
15a00 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 65   (int)strlen(zDe
15a10 63 6c 29 20 3a 20 30 2c 0a 20 20 20 20 20 20 20  cl) : 0,.       
15a20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20  pDecl->pComment 
15a30 3f 20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e  ? pDecl->pCommen
15a40 74 2d 3e 6e 4c 69 6e 65 20 3a 20 30 2c 0a 20 20  t->nLine : 0,.  
15a50 20 20 20 20 20 70 44 65 63 6c 2d 3e 74 6f 6b 65       pDecl->toke
15a60 6e 43 6f 64 65 2e 6e 54 65 78 74 20 3f 20 70 44  nCode.nText ? pD
15a70 65 63 6c 2d 3e 74 6f 6b 65 6e 43 6f 64 65 2e 6e  ecl->tokenCode.n
15a80 54 65 78 74 2b 31 20 3a 20 30 0a 20 20 20 20 29  Text+1 : 0.    )
15a90 3b 0a 20 20 20 20 69 66 28 20 70 44 65 63 6c 2d  ;.    if( pDecl-
15aa0 3e 70 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >pComment ){.   
15ab0 20 20 20 70 72 69 6e 74 66 28 22 25 2e 2a 73 5c     printf("%.*s\
15ac0 6e 22 2c 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65  n",pDecl->pComme
15ad0 6e 74 2d 3e 6e 54 65 78 74 2c 20 70 44 65 63 6c  nt->nText, pDecl
15ae0 2d 3e 70 43 6f 6d 6d 65 6e 74 2d 3e 7a 54 65 78  ->pComment->zTex
15af0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
15b00 28 20 70 44 65 63 6c 2d 3e 7a 49 66 20 29 7b 0a  ( pDecl->zIf ){.
15b10 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73        printf("%s
15b20 5c 6e 22 2c 70 44 65 63 6c 2d 3e 7a 49 66 29 3b  \n",pDecl->zIf);
15b30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
15b40 44 65 63 6c 20 29 7b 0a 20 20 20 20 20 20 70 72  Decl ){.      pr
15b50 69 6e 74 66 28 22 25 73 22 2c 7a 44 65 63 6c 29  intf("%s",zDecl)
15b60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15b70 70 44 65 63 6c 2d 3e 74 6f 6b 65 6e 43 6f 64 65  pDecl->tokenCode
15b80 2e 6e 54 65 78 74 20 29 7b 0a 20 20 20 20 20 20  .nText ){.      
15b90 70 72 69 6e 74 66 28 22 25 2e 2a 73 5c 6e 22 2c  printf("%.*s\n",
15ba0 70 44 65 63 6c 2d 3e 74 6f 6b 65 6e 43 6f 64 65  pDecl->tokenCode
15bb0 2e 6e 54 65 78 74 2c 20 70 44 65 63 6c 2d 3e 74  .nText, pDecl->t
15bc0 6f 6b 65 6e 43 6f 64 65 2e 7a 54 65 78 74 29 3b  okenCode.zText);
15bd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
15be0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 63 6f  .** Given the co
15bf0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 61  mplete text of a
15c00 6e 20 69 6e 70 75 74 20 66 69 6c 65 2c 20 74 68  n input file, th
15c10 69 73 20 72 6f 75 74 69 6e 65 20 70 72 69 6e 74  is routine print
15c20 73 20 61 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61  s a.** documenta
15c30 74 69 6f 6e 20 72 65 63 6f 72 64 20 66 6f 72 20  tion record for 
15c40 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
15c50 6e 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  nt at the beginn
15c60 69 6e 67 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  ing of the.** fi
15c70 6c 65 20 28 69 66 20 74 68 65 20 66 69 6c 65 20  le (if the file 
15c80 68 61 73 20 61 20 68 65 61 64 65 72 20 63 6f 6d  has a header com
15c90 6d 65 6e 74 2e 29 0a 2a 2f 0a 76 6f 69 64 20 50  ment.).*/.void P
15ca0 72 69 6e 74 4d 6f 64 75 6c 65 52 65 63 6f 72 64  rintModuleRecord
15cb0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
15cc0 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
15cd0 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  zFilename){.  in
15ce0 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  t i;.  static in
15cf0 74 20 61 64 64 72 20 3d 20 35 3b 0a 20 20 77 68  t addr = 5;.  wh
15d00 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a 46  ile( isspace(*zF
15d10 69 6c 65 29 20 29 7b 20 7a 46 69 6c 65 2b 2b 3b  ile) ){ zFile++;
15d20 20 7d 0a 20 20 69 66 28 20 2a 7a 46 69 6c 65 21   }.  if( *zFile!
15d30 3d 27 2f 27 20 7c 7c 20 7a 46 69 6c 65 5b 31 5d  ='/' || zFile[1]
15d40 21 3d 27 2a 27 20 29 20 72 65 74 75 72 6e 3b 0a  !='*' ) return;.
15d50 20 20 66 6f 72 28 69 3d 32 3b 20 7a 46 69 6c 65    for(i=2; zFile
15d60 5b 69 5d 20 26 26 20 28 7a 46 69 6c 65 5b 69 2d  [i] && (zFile[i-
15d70 31 5d 21 3d 27 2f 27 20 7c 7c 20 7a 46 69 6c 65  1]!='/' || zFile
15d80 5b 69 2d 32 5d 21 3d 27 2a 27 29 3b 20 69 2b 2b  [i-2]!='*'); i++
15d90 29 7b 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 5b  ){}.  if( zFile[
15da0 69 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  i]==0 ) return;.
15db0 20 20 70 72 69 6e 74 66 28 22 25 73 20 4d 20 25    printf("%s M %
15dc0 73 20 25 64 20 25 64 20 30 20 30 20 30 20 30 5c  s %d %d 0 0 0 0\
15dd0 6e 25 2e 2a 73 5c 6e 22 2c 0a 20 20 20 20 7a 46  n%.*s\n",.    zF
15de0 69 6c 65 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61  ilename, zFilena
15df0 6d 65 2c 20 61 64 64 72 2c 20 69 2b 31 2c 20 69  me, addr, i+1, i
15e00 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 61 64 64 72  , zFile);.  addr
15e10 20 2b 3d 20 34 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   += 4;.}.../*.**
15e20 20 47 69 76 65 6e 20 61 6e 20 69 6e 70 75 74 20   Given an input 
15e30 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
15e40 70 72 6f 67 72 61 6d 2c 20 63 6f 6e 73 74 72 75  program, constru
15e50 63 74 20 61 20 6e 65 77 20 49 6e 46 69 6c 65 0a  ct a new InFile.
15e60 2a 2a 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  ** object..*/.st
15e70 61 74 69 63 20 49 6e 46 69 6c 65 20 2a 43 72 65  atic InFile *Cre
15e80 61 74 65 49 6e 46 69 6c 65 28 63 68 61 72 20 2a  ateInFile(char *
15e90 7a 41 72 67 2c 20 69 6e 74 20 2a 70 6e 45 72 72  zArg, int *pnErr
15ea0 29 7b 0a 20 20 69 6e 74 20 6e 53 72 63 3b 0a 20  ){.  int nSrc;. 
15eb0 20 63 68 61 72 20 2a 7a 53 72 63 3b 0a 20 20 49   char *zSrc;.  I
15ec0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 20 20  nFile *pFile;.  
15ed0 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  int i;..  /*.  *
15ee0 2a 20 47 65 74 20 74 68 65 20 6e 61 6d 65 20 6f  * Get the name o
15ef0 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
15f00 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 2e 20   to be scanned. 
15f10 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   The input file 
15f20 69 73 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69  is.  ** everythi
15f30 6e 67 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ng before the fi
15f40 72 73 74 20 27 3a 27 20 6f 72 20 74 68 65 20 77  rst ':' or the w
15f50 68 6f 6c 65 20 66 69 6c 65 20 69 66 20 6e 6f 20  hole file if no 
15f60 27 3a 27 20 69 73 20 73 65 65 6e 2e 0a 20 20 2a  ':' is seen..  *
15f70 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 6f  *.  ** Except, o
15f80 6e 20 77 69 6e 64 6f 77 73 2c 20 69 67 6e 6f 72  n windows, ignor
15f90 65 20 61 6e 79 20 27 3a 27 20 74 68 61 74 20 6f  e any ':' that o
15fa0 63 63 75 72 73 20 61 73 20 74 68 65 20 73 65 63  ccurs as the sec
15fb0 6f 6e 64 20 63 68 61 72 61 63 74 65 72 0a 20 20  ond character.  
15fc0 2a 2a 20 73 69 6e 63 65 20 69 74 20 6d 69 67 68  ** since it migh
15fd0 74 20 62 65 20 70 61 72 74 20 6f 66 20 74 68 65  t be part of the
15fe0 20 64 72 69 76 65 20 73 70 65 63 69 66 69 65 72   drive specifier
15ff0 2e 20 20 53 6f 20 72 65 61 6c 6c 79 2c 20 74 68  .  So really, th
16000 65 20 22 3a 27 20 68 61 73 0a 20 20 2a 2a 20 74  e ":' has.  ** t
16010 6f 20 62 65 20 74 68 65 20 33 72 64 20 6f 72 20  o be the 3rd or 
16020 6c 61 74 65 72 20 63 68 61 72 61 63 74 65 72 20  later character 
16030 69 6e 20 74 68 65 20 6e 61 6d 65 2e 20 20 54 68  in the name.  Th
16040 69 73 20 70 72 65 63 6c 75 64 65 73 20 31 2d 63  is precludes 1-c
16050 68 61 72 61 63 74 65 72 0a 20 20 2a 2a 20 66 69  haracter.  ** fi
16060 6c 65 20 6e 61 6d 65 73 2c 20 77 68 69 63 68 20  le names, which 
16070 72 65 61 6c 6c 79 20 73 68 6f 75 6c 64 20 6e 6f  really should no
16080 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
16090 20 20 2a 2f 0a 20 20 7a 53 72 63 20 3d 20 7a 41    */.  zSrc = zA
160a0 72 67 3b 0a 20 20 66 6f 72 28 6e 53 72 63 3d 32  rg;.  for(nSrc=2
160b0 3b 20 7a 53 72 63 5b 6e 53 72 63 5d 20 26 26 20  ; zSrc[nSrc] && 
160c0 7a 41 72 67 5b 6e 53 72 63 5d 21 3d 27 3a 27 3b  zArg[nSrc]!=':';
160d0 20 6e 53 72 63 2b 2b 29 7b 7d 0a 20 20 70 46 69   nSrc++){}.  pFi
160e0 6c 65 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28  le = SafeMalloc(
160f0 20 73 69 7a 65 6f 66 28 49 6e 46 69 6c 65 29 20   sizeof(InFile) 
16100 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  );.  memset(pFil
16110 65 2c 30 2c 73 69 7a 65 6f 66 28 49 6e 46 69 6c  e,0,sizeof(InFil
16120 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 53  e));.  pFile->zS
16130 72 63 20 3d 20 53 74 72 44 75 70 28 7a 53 72 63  rc = StrDup(zSrc
16140 2c 6e 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 46 69  ,nSrc);..  /* Fi
16150 67 75 72 65 20 6f 75 74 20 69 66 20 77 65 20 61  gure out if we a
16160 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
16170 43 20 6f 72 20 43 2b 2b 20 63 6f 64 65 2e 20 20  C or C++ code.  
16180 41 73 73 75 6d 65 20 61 6e 79 0a 20 20 2a 2a 20  Assume any.  ** 
16190 66 69 6c 65 20 77 69 74 68 20 22 2e 63 22 20 6f  file with ".c" o
161a0 72 20 22 2e 68 22 20 69 73 20 43 20 63 6f 64 65  r ".h" is C code
161b0 20 61 6e 64 20 61 6c 6c 20 65 6c 73 65 20 69 73   and all else is
161c0 20 43 2b 2b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   C++..  */.  if(
161d0 20 6e 53 72 63 3e 32 20 26 26 20 7a 53 72 63 5b   nSrc>2 && zSrc[
161e0 6e 53 72 63 2d 32 5d 3d 3d 27 2e 27 20 26 26 20  nSrc-2]=='.' && 
161f0 28 7a 53 72 63 5b 6e 53 72 63 2d 31 5d 3d 3d 27  (zSrc[nSrc-1]=='
16200 63 27 20 7c 7c 20 7a 53 72 63 5b 6e 53 72 63 2d  c' || zSrc[nSrc-
16210 31 5d 3d 3d 27 68 27 29 29 7b 0a 20 20 20 20 70  1]=='h')){.    p
16220 46 69 6c 65 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  File->flags &= ~
16230 44 50 5f 43 70 6c 75 73 70 6c 75 73 3b 0a 20 20  DP_Cplusplus;.  
16240 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
16250 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 50 5f 43 70  ->flags |= DP_Cp
16260 6c 75 73 70 6c 75 73 3b 0a 20 20 7d 0a 0a 20 20  lusplus;.  }..  
16270 2f 2a 0a 20 20 2a 2a 20 49 66 20 61 20 73 65 70  /*.  ** If a sep
16280 61 72 61 74 65 20 68 65 61 64 65 72 20 66 69 6c  arate header fil
16290 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
162a0 75 73 65 20 69 74 0a 20 20 2a 2f 0a 20 20 69 66  use it.  */.  if
162b0 28 20 7a 53 72 63 5b 6e 53 72 63 5d 3d 3d 27 3a  ( zSrc[nSrc]==':
162c0 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 48 64  ' ){.    int nHd
162d0 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 48 64  r;.    char *zHd
162e0 72 3b 0a 20 20 20 20 7a 48 64 72 20 3d 20 26 7a  r;.    zHdr = &z
162f0 53 72 63 5b 6e 53 72 63 2b 31 5d 3b 0a 20 20 20  Src[nSrc+1];.   
16300 20 66 6f 72 28 6e 48 64 72 3d 30 3b 20 7a 48 64   for(nHdr=0; zHd
16310 72 5b 6e 48 64 72 5d 3b 20 6e 48 64 72 2b 2b 29  r[nHdr]; nHdr++)
16320 7b 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 48  {}.    pFile->zH
16330 64 72 20 3d 20 53 74 72 44 75 70 28 7a 48 64 72  dr = StrDup(zHdr
16340 2c 6e 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ,nHdr);.  }..  /
16350 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 79 20 27  * Look for any '
16360 63 27 20 6f 72 20 27 43 27 20 69 6e 20 74 68 65  c' or 'C' in the
16370 20 73 75 66 66 69 78 20 6f 66 20 74 68 65 20 66   suffix of the f
16380 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 68 61  ile name and cha
16390 6e 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68  nge.  ** that ch
163a0 61 72 61 63 74 65 72 20 74 6f 20 27 68 27 20 6f  aracter to 'h' o
163b0 72 20 27 48 27 20 72 65 73 70 65 63 74 69 76 65  r 'H' respective
163c0 6c 79 2e 20 20 49 66 20 6e 6f 20 27 63 27 20 6f  ly.  If no 'c' o
163d0 72 20 27 43 27 20 69 73 20 66 6f 75 6e 64 2c 0a  r 'C' is found,.
163e0 20 20 2a 2a 20 74 68 65 6e 20 61 73 73 75 6d 65    ** then assume
163f0 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
16400 77 69 74 68 20 61 20 68 65 61 64 65 72 2e 0a 20  with a header.. 
16410 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20   */.  else{.    
16420 69 6e 74 20 66 6f 75 6e 64 43 20 3d 20 30 3b 0a  int foundC = 0;.
16430 20 20 20 20 70 46 69 6c 65 2d 3e 7a 48 64 72 20      pFile->zHdr 
16440 3d 20 53 74 72 44 75 70 28 7a 53 72 63 2c 6e 53  = StrDup(zSrc,nS
16450 72 63 29 3b 0a 20 20 20 20 66 6f 72 28 69 20 3d  rc);.    for(i =
16460 20 6e 53 72 63 2d 31 3b 20 69 3e 30 20 26 26 20   nSrc-1; i>0 && 
16470 70 46 69 6c 65 2d 3e 7a 48 64 72 5b 69 5d 21 3d  pFile->zHdr[i]!=
16480 27 2e 27 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  '.'; i--){.     
16490 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 48 64 72   if( pFile->zHdr
164a0 5b 69 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20  [i]=='c' ){.    
164b0 20 20 20 20 66 6f 75 6e 64 43 20 3d 20 31 3b 0a      foundC = 1;.
164c0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 7a          pFile->z
164d0 48 64 72 5b 69 5d 20 3d 20 27 68 27 3b 0a 20 20  Hdr[i] = 'h';.  
164e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 46      }else if( pF
164f0 69 6c 65 2d 3e 7a 48 64 72 5b 69 5d 3d 3d 27 43  ile->zHdr[i]=='C
16500 27 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 75  ' ){.        fou
16510 6e 64 43 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ndC = 1;.       
16520 20 70 46 69 6c 65 2d 3e 7a 48 64 72 5b 69 5d 20   pFile->zHdr[i] 
16530 3d 20 27 48 27 3b 0a 20 20 20 20 20 20 7d 0a 20  = 'H';.      }. 
16540 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 66 6f     }.    if( !fo
16550 75 6e 64 43 20 29 7b 0a 20 20 20 20 20 20 53 61  undC ){.      Sa
16560 66 65 46 72 65 65 28 70 46 69 6c 65 2d 3e 7a 48  feFree(pFile->zH
16570 64 72 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  dr);.      pFile
16580 2d 3e 7a 48 64 72 20 3d 20 30 3b 0a 20 20 20 20  ->zHdr = 0;.    
16590 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
165a0 20 49 66 20 70 46 69 6c 65 2d 3e 7a 53 72 63 20   If pFile->zSrc 
165b0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 27 63 27 20  contains no 'c' 
165c0 6f 72 20 27 43 27 20 69 6e 20 69 74 73 20 65 78  or 'C' in its ex
165d0 74 65 6e 73 69 6f 6e 2c 20 69 74 0a 20 20 2a 2a  tension, it.  **
165e0 20 6d 75 73 74 20 62 65 20 61 20 68 65 61 64 65   must be a heade
165f0 72 20 66 69 6c 65 2e 20 20 20 49 6e 20 74 68 61  r file.   In tha
16600 74 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20  t case, we need 
16610 74 6f 20 73 65 74 20 74 68 65 0a 20 20 2a 2a 20  to set the.  ** 
16620 50 53 5f 49 6e 74 65 72 66 61 63 65 20 66 6c 61  PS_Interface fla
16630 67 2e 0a 20 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  g..  */.  pFile-
16640 3e 66 6c 61 67 73 20 7c 3d 20 50 53 5f 49 6e 74  >flags |= PS_Int
16650 65 72 66 61 63 65 3b 0a 20 20 66 6f 72 28 69 3d  erface;.  for(i=
16660 6e 53 72 63 2d 31 3b 20 69 3e 30 20 26 26 20 7a  nSrc-1; i>0 && z
16670 53 72 63 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d  Src[i]!='.'; i--
16680 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 72 63 5b  ){.    if( zSrc[
16690 69 5d 3d 3d 27 63 27 20 7c 7c 20 7a 53 72 63 5b  i]=='c' || zSrc[
166a0 69 5d 3d 3d 27 43 27 20 29 7b 0a 20 20 20 20 20  i]=='C' ){.     
166b0 20 70 46 69 6c 65 2d 3e 66 6c 61 67 73 20 26 3d   pFile->flags &=
166c0 20 7e 50 53 5f 49 6e 74 65 72 66 61 63 65 3b 0a   ~PS_Interface;.
166d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
166e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e   }.  }..  /* Don
166f0 65 21 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e!.  */.  return
16700 20 70 46 69 6c 65 3b 0a 7d 0a 0a 2f 2a 20 4d 53   pFile;.}../* MS
16710 2d 57 69 6e 64 6f 77 73 20 61 6e 64 20 4d 53 2d  -Windows and MS-
16720 44 4f 53 20 62 6f 74 68 20 68 61 76 65 20 74 68  DOS both have th
16730 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 72 69  e following seri
16740 6f 75 73 20 4f 53 20 62 75 67 3a 20 20 74 68 65  ous OS bug:  the
16750 0a 2a 2a 20 6c 65 6e 67 74 68 20 6f 66 20 61 20  .** length of a 
16760 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 69 73 20  command line is 
16770 73 65 76 65 72 65 6c 79 20 72 65 73 74 72 69 63  severely restric
16780 74 65 64 2e 20 20 42 75 74 20 74 68 69 73 20 70  ted.  But this p
16790 72 6f 67 72 61 6d 0a 2a 2a 20 6f 63 63 61 73 69  rogram.** occasi
167a0 6f 6e 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20  onally requires 
167b0 6c 6f 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  long command lin
167c0 65 73 2e 20 20 48 65 6e 63 65 20 74 68 65 20 66  es.  Hence the f
167d0 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 77 6f 72 6b  ollowing.** work
167e0 20 61 72 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49   around..**.** I
167f0 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
16800 20 22 2d 66 20 46 49 4c 45 4e 41 4d 45 22 20 61   "-f FILENAME" a
16810 70 70 65 61 72 20 61 6e 79 77 68 65 72 65 20 6f  ppear anywhere o
16820 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
16830 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ne,.** then the 
16840 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 73 63  named file is sc
16850 61 6e 6e 65 64 20 66 6f 72 20 61 64 64 69 74 69  anned for additi
16860 6f 6e 61 6c 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  onal command lin
16870 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20  e arguments..** 
16880 54 68 65 73 65 20 61 72 67 75 6d 65 6e 74 73 20  These arguments 
16890 61 72 65 20 73 75 62 73 74 69 74 75 74 65 64 20  are substituted 
168a0 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  in place of the 
168b0 22 46 49 4c 45 4e 41 4d 45 22 20 61 72 67 75 6d  "FILENAME" argum
168c0 65 6e 74 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ent.** in the or
168d0 69 67 69 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20  iginal argument 
168e0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  list..**.** This
168f0 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
16900 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
16910 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
16920 20 74 68 65 20 22 2d 66 22 0a 2a 2a 20 70 61 72   the "-f".** par
16930 61 6d 65 74 65 72 20 69 6e 20 74 68 65 20 61 72  ameter in the ar
16940 67 76 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65  gv[] array.  The
16950 20 61 72 67 63 20 61 6e 64 20 61 72 67 76 20 61   argc and argv a
16960 72 65 20 70 61 73 73 65 64 20 62 79 0a 2a 2a 20  re passed by.** 
16970 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20  pointer so that 
16980 74 68 65 79 20 63 61 6e 20 62 65 20 63 68 61 6e  they can be chan
16990 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 69  ged..**.** Parsi
169a0 6e 67 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  ng of the parame
169b0 74 65 72 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ters in the file
169c0 20 69 73 20 76 65 72 79 20 73 69 6d 70 6c 65 2e   is very simple.
169d0 20 20 50 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20    Parameters.** 
169e0 63 61 6e 20 62 65 20 73 65 70 61 72 61 74 65 64  can be separated
169f0 20 62 79 20 61 6e 79 20 61 6d 6f 75 6e 74 20 6f   by any amount o
16a00 66 20 77 68 69 74 65 2d 73 70 61 63 65 20 28 69  f white-space (i
16a10 6e 63 6c 75 64 69 6e 67 20 6e 65 77 6c 69 6e 65  ncluding newline
16a20 73 0a 2a 2a 20 61 6e 64 20 63 61 72 72 69 61 67  s.** and carriag
16a30 65 20 72 65 74 75 72 6e 73 2e 29 20 20 54 68 65  e returns.)  The
16a40 72 65 20 61 72 65 20 6e 6f 77 20 71 75 6f 74 69  re are now quoti
16a50 6e 67 20 63 68 61 72 61 63 74 65 72 73 20 6f 66  ng characters of
16a60 20 61 6e 79 0a 2a 2a 20 6b 69 6e 64 2e 20 20 54   any.** kind.  T
16a70 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 74  he length of a t
16a80 6f 6b 65 6e 20 69 73 20 6c 69 6d 69 74 65 64 20  oken is limited 
16a90 74 6f 20 61 62 6f 75 74 20 31 30 30 30 20 63 68  to about 1000 ch
16aa0 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
16ab0 74 69 63 20 76 6f 69 64 20 41 64 64 50 61 72 61  tic void AddPara
16ac0 6d 65 74 65 72 73 28 69 6e 74 20 69 6e 64 65 78  meters(int index
16ad0 2c 20 69 6e 74 20 2a 70 41 72 67 63 2c 20 63 68  , int *pArgc, ch
16ae0 61 72 20 2a 2a 2a 70 41 72 67 76 29 7b 0a 20 20  ar ***pArgv){.  
16af0 69 6e 74 20 61 72 67 63 20 3d 20 2a 70 41 72 67  int argc = *pArg
16b00 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  c;      /* The o
16b10 72 69 67 69 6e 61 6c 20 61 72 67 63 20 76 61 6c  riginal argc val
16b20 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ue */.  char **a
16b30 72 67 76 20 3d 20 2a 70 41 72 67 76 3b 20 20 20  rgv = *pArgv;   
16b40 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  /* The original 
16b50 61 72 67 76 20 76 61 6c 75 65 20 2a 2f 0a 20 20  argv value */.  
16b60 69 6e 74 20 6e 65 77 41 72 67 63 3b 20 20 20 20  int newArgc;    
16b70 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
16b80 20 66 6f 72 20 61 72 67 63 20 61 66 74 65 72 20   for argc after 
16b90 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 61 72  inserting new ar
16ba0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
16bb0 72 20 2a 2a 7a 4e 65 77 20 3d 20 30 3b 20 20 20  r **zNew = 0;   
16bc0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
16bd0 61 72 67 76 20 61 66 74 65 72 20 74 68 69 73 20  argv after this 
16be0 72 6f 75 74 69 6e 65 20 69 73 20 64 6f 6e 65 20  routine is done 
16bf0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
16c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16c10 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75  Name of the inpu
16c20 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  t file */.  int 
16c30 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  nNew = 0;       
16c40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16c50 20 6e 65 77 20 65 6e 74 72 69 65 73 20 69 6e 20   new entries in 
16c60 74 68 65 20 61 72 67 76 5b 5d 20 66 69 6c 65 20  the argv[] file 
16c70 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  */.  int nAlloc 
16c80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
16c90 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  Space allocated 
16ca0 66 6f 72 20 7a 4e 65 77 5b 5d 20 2a 2f 0a 20 20  for zNew[] */.  
16cb0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
16cc0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
16cd0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
16ce0 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
16cf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16d00 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
16d10 61 20 6e 65 77 20 61 72 67 75 6d 65 6e 74 20 2a  a new argument *
16d20 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20  /.  int c;      
16d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16d40 65 78 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ext character of
16d50 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20   input */.  int 
16d60 73 74 61 72 74 4f 66 4c 69 6e 65 20 3d 20 31 3b  startOfLine = 1;
16d70 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
16d80 65 20 61 72 65 20 77 68 65 72 65 20 27 23 27 20  e are where '#' 
16d90 63 61 6e 20 73 74 61 72 74 20 61 20 63 6f 6d 6d  can start a comm
16da0 65 6e 74 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69  ent */.  FILE *i
16db0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
16dc0 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69   /* The input fi
16dd0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 7a 42 75  le */.  char zBu
16de0 66 5b 31 30 30 30 5d 3b 20 20 20 20 20 20 20 20  f[1000];        
16df0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 61 72 67 75  /* A single argu
16e00 6d 65 6e 74 20 69 73 20 61 63 63 75 6d 75 6c 61  ment is accumula
16e10 74 65 64 20 68 65 72 65 20 2a 2f 0a 0a 20 20 69  ted here */..  i
16e20 66 28 20 69 6e 64 65 78 2b 31 3d 3d 61 72 67 63  f( index+1==argc
16e30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 46 69   ) return;.  zFi
16e40 6c 65 20 3d 20 61 72 67 76 5b 69 6e 64 65 78 2b  le = argv[index+
16e50 31 5d 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e  1];.  in = fopen
16e60 28 7a 46 69 6c 65 2c 22 72 22 29 3b 0a 20 20 69  (zFile,"r");.  i
16e70 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
16e80 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
16e90 43 61 6e 27 74 20 6f 70 65 6e 20 69 6e 70 75 74  Can't open input
16ea0 20 66 69 6c 65 20 5c 22 25 73 5c 22 5c 6e 22 2c   file \"%s\"\n",
16eb0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 65 78 69 74  zFile);.    exit
16ec0 28 31 29 3b 0a 20 20 7d 0a 20 20 63 20 3d 20 27  (1);.  }.  c = '
16ed0 20 27 3b 0a 20 20 77 68 69 6c 65 28 20 63 21 3d   ';.  while( c!=
16ee0 45 4f 46 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  EOF ){.    while
16ef0 28 20 63 21 3d 45 4f 46 20 26 26 20 69 73 73 70  ( c!=EOF && issp
16f00 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20  ace(c) ){.      
16f10 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20  if( c=='\n' ){. 
16f20 20 20 20 20 20 20 20 73 74 61 72 74 4f 66 4c 69         startOfLi
16f30 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ne = 1;.      }.
16f40 20 20 20 20 20 20 63 20 3d 20 67 65 74 63 28 69        c = getc(i
16f50 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  n);.      if( st
16f60 61 72 74 4f 66 4c 69 6e 65 20 26 26 20 63 3d 3d  artOfLine && c==
16f70 27 23 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '#' ){.        w
16f80 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20  hile( c!=EOF && 
16f90 63 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  c!='\n' ){.     
16fa0 20 20 20 20 20 63 20 3d 20 67 65 74 63 28 69 6e       c = getc(in
16fb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16fc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
16fd0 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
16fe0 20 63 21 3d 45 4f 46 20 26 26 20 21 69 73 73 70   c!=EOF && !issp
16ff0 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20  ace(c) ){.      
17000 69 66 28 20 6e 3c 73 69 7a 65 6f 66 28 7a 42 75  if( n<sizeof(zBu
17010 66 29 2d 31 20 29 7b 20 7a 42 75 66 5b 6e 2b 2b  f)-1 ){ zBuf[n++
17020 5d 20 3d 20 63 3b 20 7d 0a 20 20 20 20 20 20 73  ] = c; }.      s
17030 74 61 72 74 4f 66 4c 69 6e 65 20 3d 20 30 3b 0a  tartOfLine = 0;.
17040 20 20 20 20 20 20 63 20 3d 20 67 65 74 63 28 69        c = getc(i
17050 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42  n);.    }.    zB
17060 75 66 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 69  uf[n] = 0;.    i
17070 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( n>0 ){.      
17080 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nNew++;.      if
17090 28 20 6e 4e 65 77 20 2b 20 61 72 67 63 20 3e 20  ( nNew + argc > 
170a0 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  nAlloc ){.      
170b0 20 20 69 66 28 20 6e 41 6c 6c 6f 63 3d 3d 30 20    if( nAlloc==0 
170c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 41 6c  ){.          nAl
170d0 6c 6f 63 20 3d 20 31 30 30 20 2b 20 61 72 67 63  loc = 100 + argc
170e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4e 65 77  ;.          zNew
170f0 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   = malloc( sizeo
17100 66 28 63 68 61 72 2a 29 20 2a 20 6e 41 6c 6c 6f  f(char*) * nAllo
17110 63 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c );.        }el
17120 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 41  se{.          nA
17130 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 20  lloc *= 2;.     
17140 20 20 20 20 20 7a 4e 65 77 20 3d 20 72 65 61 6c       zNew = real
17150 6c 6f 63 28 20 7a 4e 65 77 2c 20 73 69 7a 65 6f  loc( zNew, sizeo
17160 66 28 63 68 61 72 2a 29 20 2a 20 6e 41 6c 6c 6f  f(char*) * nAllo
17170 63 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  c );.        }. 
17180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17190 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   zNew ){.       
171a0 20 69 6e 74 20 6a 20 3d 20 6e 4e 65 77 20 2b 20   int j = nNew + 
171b0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 7a  index;.        z
171c0 4e 65 77 5b 6a 5d 20 3d 20 6d 61 6c 6c 6f 63 28  New[j] = malloc(
171d0 20 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20   n + 1 );.      
171e0 20 20 69 66 28 20 7a 4e 65 77 5b 6a 5d 20 29 7b    if( zNew[j] ){
171f0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 63 70  .          strcp
17200 79 28 20 7a 4e 65 77 5b 6a 5d 2c 20 7a 42 75 66  y( zNew[j], zBuf
17210 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
17220 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17230 20 20 6e 65 77 41 72 67 63 20 3d 20 61 72 67 63    newArgc = argc
17240 20 2b 20 6e 4e 65 77 20 2d 20 31 3b 0a 20 20 66   + nNew - 1;.  f
17250 6f 72 28 69 3d 30 3b 20 69 3c 3d 69 6e 64 65 78  or(i=0; i<=index
17260 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 4e 65 77  ; i++){.    zNew
17270 5b 69 5d 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20  [i] = argv[i];. 
17280 20 7d 0a 20 20 66 6f 72 28 69 3d 6e 4e 65 77 20   }.  for(i=nNew 
17290 2b 20 69 6e 64 65 78 20 2b 20 31 3b 20 69 3c 6e  + index + 1; i<n
172a0 65 77 41 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  ewArgc; i++){.  
172b0 20 20 7a 4e 65 77 5b 69 5d 20 3d 20 61 72 67 76    zNew[i] = argv
172c0 5b 69 20 2b 20 31 20 2d 20 6e 4e 65 77 5d 3b 0a  [i + 1 - nNew];.
172d0 20 20 7d 0a 20 20 7a 4e 65 77 5b 6e 65 77 41 72    }.  zNew[newAr
172e0 67 63 5d 20 3d 20 30 3b 0a 20 20 2a 70 41 72 67  gc] = 0;.  *pArg
172f0 63 20 3d 20 6e 65 77 41 72 67 63 3b 0a 20 20 2a  c = newArgc;.  *
17300 70 41 72 67 76 20 3d 20 7a 4e 65 77 3b 0a 7d 0a  pArgv = zNew;.}.
17310 0a 23 69 66 64 65 66 20 4e 4f 54 5f 55 53 45 44  .#ifdef NOT_USED
17320 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17330 65 20 74 69 6d 65 20 74 68 61 74 20 74 68 65 20  e time that the 
17340 67 69 76 65 6e 20 66 69 6c 65 20 77 61 73 20 6c  given file was l
17350 61 73 74 20 6d 6f 64 69 66 69 65 64 2e 20 20 49  ast modified.  I
17360 66 20 77 65 20 63 61 6e 27 74 0a 2a 2a 20 6c 6f  f we can't.** lo
17370 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 28 62  cate the file (b
17380 65 63 61 75 73 65 2c 20 66 6f 72 20 65 78 61 6d  ecause, for exam
17390 70 6c 65 2c 20 69 74 20 64 6f 65 73 6e 27 74 20  ple, it doesn't 
173a0 65 78 69 73 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  exist), then.** 
173b0 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
173c0 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
173d0 20 4d 6f 64 54 69 6d 65 28 63 6f 6e 73 74 20 63   ModTime(const c
173e0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
173f0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
17400 6d 54 69 6d 65 20 3d 20 30 3b 0a 20 20 73 74 72  mTime = 0;.  str
17410 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 0a  uct stat sStat;.
17420 20 20 69 66 28 20 73 74 61 74 28 7a 46 69 6c 65    if( stat(zFile
17430 6e 61 6d 65 2c 26 73 53 74 61 74 29 3d 3d 30 20  name,&sStat)==0 
17440 29 7b 0a 20 20 20 20 6d 54 69 6d 65 20 3d 20 73  ){.    mTime = s
17450 53 74 61 74 2e 73 74 5f 6d 74 69 6d 65 3b 0a 20  Stat.st_mtime;. 
17460 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 54 69 6d   }.  return mTim
17470 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
17480 2a 2a 20 50 72 69 6e 74 20 61 20 75 73 61 67 65  ** Print a usage
17490 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69   comment for thi
174a0 73 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 73 74  s program..*/.st
174b0 61 74 69 63 20 76 6f 69 64 20 55 73 61 67 65 28  atic void Usage(
174c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 72 67 76  const char *argv
174d0 30 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  0, const char *a
174e0 72 67 76 4e 29 7b 0a 20 20 66 70 72 69 6e 74 66  rgvN){.  fprintf
174f0 28 73 74 64 65 72 72 2c 22 25 73 3a 20 49 6c 6c  (stderr,"%s: Ill
17500 65 67 61 6c 20 61 72 67 75 6d 65 6e 74 20 5c 22  egal argument \"
17510 25 73 5c 22 5c 6e 22 2c 61 72 67 76 30 2c 61 72  %s\"\n",argv0,ar
17520 67 76 4e 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  gvN);.  fprintf(
17530 73 74 64 65 72 72 2c 22 55 73 61 67 65 3a 20 25  stderr,"Usage: %
17540 73 20 5b 6f 70 74 69 6f 6e 73 5d 20 66 69 6c 65  s [options] file
17550 6e 61 6d 65 2e 2e 2e 5c 6e 22 0a 20 20 20 20 22  name...\n".    "
17560 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 20 20 20 20  Options:\n".    
17570 22 20 20 2d 68 20 20 20 20 20 20 20 20 20 20 47  "  -h          G
17580 65 6e 65 72 61 74 65 20 61 20 73 69 6e 67 6c 65  enerate a single
17590 20 2e 68 20 74 6f 20 73 74 61 6e 64 61 72 64 20   .h to standard 
175a0 6f 75 74 70 75 74 2e 5c 6e 22 0a 20 20 20 20 22  output.\n".    "
175b0 20 20 2d 48 20 20 20 20 20 20 20 20 20 20 4c 69    -H          Li
175c0 6b 65 20 2d 68 2c 20 62 75 74 20 6f 6e 6c 79 20  ke -h, but only 
175d0 6f 75 74 70 75 74 20 45 58 50 4f 52 54 20 64 65  output EXPORT de
175e0 63 6c 61 72 61 74 69 6f 6e 73 2e 5c 6e 22 0a 20  clarations.\n". 
175f0 20 20 20 22 20 20 2d 76 20 20 20 20 20 20 20 20     "  -v        
17600 20 20 28 76 65 72 62 6f 73 65 29 20 57 72 69 74    (verbose) Writ
17610 65 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61  e status informa
17620 74 69 6f 6e 20 74 6f 20 74 68 65 20 73 63 72 65  tion to the scre
17630 65 6e 2e 5c 6e 22 0a 20 20 20 20 22 20 20 2d 64  en.\n".    "  -d
17640 6f 63 20 20 20 20 20 20 20 20 47 65 6e 65 72 61  oc        Genera
17650 74 65 20 6e 6f 20 68 65 61 64 65 72 20 66 69 6c  te no header fil
17660 65 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 6f 75  es.  Instead, ou
17670 74 70 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tput information
17680 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
17690 20 20 20 20 20 20 20 74 68 61 74 20 63 61 6e 20         that can 
176a0 62 65 20 75 73 65 64 20 62 79 20 61 6e 20 61 75  be used by an au
176b0 74 6f 6d 61 74 69 63 20 70 72 6f 67 72 61 6d 20  tomatic program 
176c0 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 5c 6e 22  documentation\n"
176d0 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20  .    "          
176e0 20 20 20 20 61 6e 64 20 63 72 6f 73 73 2d 72 65      and cross-re
176f0 66 65 72 65 6e 63 65 20 67 65 6e 65 72 61 74 6f  ference generato
17700 72 2e 5c 6e 22 0a 20 20 20 20 22 20 20 2d 6c 6f  r.\n".    "  -lo
17710 63 61 6c 20 20 20 20 20 20 47 65 6e 65 72 61 74  cal      Generat
17720 65 20 70 72 6f 74 6f 74 79 70 65 73 20 66 6f 72  e prototypes for
17730 20 5c 22 73 74 61 74 69 63 5c 22 20 66 75 6e 63   \"static\" func
17740 74 69 6f 6e 73 20 61 6e 64 5c 6e 22 0a 20 20 20  tions and\n".   
17750 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
17760 70 72 6f 63 65 64 75 72 65 73 2e 5c 6e 22 0a 20  procedures.\n". 
17770 20 20 20 22 20 20 2d 66 20 46 49 4c 45 20 20 20     "  -f FILE   
17780 20 20 52 65 61 64 20 61 64 64 69 74 69 6f 6e 61    Read additiona
17790 6c 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61  l command-line a
177a0 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  rguments from th
177b0 65 20 66 69 6c 65 20 6e 61 6d 65 64 5c 6e 22 0a  e file named\n".
177c0 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20      "           
177d0 20 20 20 5c 22 46 49 4c 45 5c 22 2e 5c 6e 22 0a     \"FILE\".\n".
177e0 23 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 20  #ifdef DEBUG.   
177f0 20 22 20 20 2d 21 20 4d 41 53 4b 20 20 20 20 20   "  -! MASK     
17800 53 65 74 20 74 68 65 20 64 65 62 75 67 67 69 6e  Set the debuggin
17810 67 20 6d 61 73 6b 20 74 6f 20 74 68 65 20 6e 75  g mask to the nu
17820 6d 62 65 72 20 5c 22 4d 41 53 4b 5c 22 2e 5c 6e  mber \"MASK\".\n
17830 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 22 20 20  ".#endif.    "  
17840 2d 2d 20 20 20 20 20 20 20 20 20 20 54 72 65 61  --          Trea
17850 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  t all subsequent
17860 20 63 6f 6d 6d 65 6e 74 2d 6c 69 6e 65 20 70 61   comment-line pa
17870 72 61 6d 65 74 65 72 73 20 61 73 20 66 69 6c 65  rameters as file
17880 6e 61 6d 65 73 2c 5c 6e 22 0a 20 20 20 20 22 20  names,\n".    " 
17890 20 20 20 20 20 20 20 20 20 20 20 20 20 65 76 65               eve
178a0 6e 20 69 66 20 74 68 65 79 20 62 65 67 69 6e 20  n if they begin 
178b0 77 69 74 68 20 5c 22 2d 5c 22 2e 5c 6e 22 2c 0a  with \"-\".\n",.
178c0 20 20 20 20 61 72 67 76 30 0a 20 20 29 3b 0a 7d      argv0.  );.}
178d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
178e0 6f 77 69 6e 67 20 74 65 78 74 20 63 6f 6e 74 61  owing text conta
178f0 69 6e 73 20 61 20 66 65 77 20 73 69 6d 70 6c 65  ins a few simple
17900 20 23 64 65 66 69 6e 65 73 20 74 68 61 74 20 77   #defines that w
17910 65 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 62 65 20  e want.** to be 
17920 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 65 76 65  available to eve
17930 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ry file..*/.stat
17940 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 49  ic const char zI
17950 6e 69 74 5b 5d 20 3d 0a 20 20 22 23 64 65 66 69  nit[] =.  "#defi
17960 6e 65 20 49 4e 54 45 52 46 41 43 45 20 30 5c 6e  ne INTERFACE 0\n
17970 22 0a 20 20 22 23 64 65 66 69 6e 65 20 45 58 50  ".  "#define EXP
17980 4f 52 54 5f 49 4e 54 45 52 46 41 43 45 20 30 5c  ORT_INTERFACE 0\
17990 6e 22 0a 20 20 22 23 64 65 66 69 6e 65 20 4c 4f  n".  "#define LO
179a0 43 41 4c 5f 49 4e 54 45 52 46 41 43 45 20 30 5c  CAL_INTERFACE 0\
179b0 6e 22 0a 20 20 22 23 64 65 66 69 6e 65 20 45 58  n".  "#define EX
179c0 50 4f 52 54 5c 6e 22 0a 20 20 22 23 64 65 66 69  PORT\n".  "#defi
179d0 6e 65 20 4c 4f 43 41 4c 20 73 74 61 74 69 63 5c  ne LOCAL static\
179e0 6e 22 0a 20 20 22 23 64 65 66 69 6e 65 20 50 55  n".  "#define PU
179f0 42 4c 49 43 5c 6e 22 0a 20 20 22 23 64 65 66 69  BLIC\n".  "#defi
17a00 6e 65 20 50 52 49 56 41 54 45 5c 6e 22 0a 20 20  ne PRIVATE\n".  
17a10 22 23 64 65 66 69 6e 65 20 50 52 4f 54 45 43 54  "#define PROTECT
17a20 45 44 5c 6e 22 0a 3b 0a 0a 23 69 66 20 54 45 53  ED\n".;..#if TES
17a30 54 3d 3d 30 0a 69 6e 74 20 6d 61 69 6e 28 69 6e  T==0.int main(in
17a40 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
17a50 72 67 76 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  rgv){.  int i;  
17a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17a70 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
17a80 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
17a90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17aa0 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
17ab0 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 54 6f  ountered */.  To
17ac0 6b 65 6e 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  ken *pList;     
17ad0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 69      /* List of i
17ae0 6e 70 75 74 20 74 6f 6b 65 6e 73 20 66 6f 72 20  nput tokens for 
17af0 6f 6e 65 20 66 69 6c 65 20 2a 2f 0a 20 20 49 6e  one file */.  In
17b00 46 69 6c 65 20 2a 70 46 69 6c 65 4c 69 73 74 20  File *pFileList 
17b10 3d 20 30 3b 2f 2a 20 4c 69 73 74 20 6f 66 20 61  = 0;/* List of a
17b20 6c 6c 20 69 6e 70 75 74 20 66 69 6c 65 73 20 2a  ll input files *
17b30 2f 0a 20 20 49 6e 46 69 6c 65 20 2a 70 54 61 69  /.  InFile *pTai
17b40 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4c 61 73  l = 0;    /* Las
17b50 74 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 69  t file on the li
17b60 73 74 20 2a 2f 0a 20 20 49 6e 46 69 6c 65 20 2a  st */.  InFile *
17b70 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  pFile;        /*
17b80 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   for looping ove
17b90 72 20 74 68 65 20 66 69 6c 65 20 6c 69 73 74 20  r the file list 
17ba0 2a 2f 0a 20 20 69 6e 74 20 68 5f 66 6c 61 67 20  */.  int h_flag 
17bb0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  = 0;       /* Tr
17bc0 75 65 20 69 66 20 2d 68 20 69 73 20 70 72 65 73  ue if -h is pres
17bd0 65 6e 74 2e 20 20 4f 75 74 70 75 74 20 75 6e 69  ent.  Output uni
17be0 66 69 65 64 20 68 65 61 64 65 72 20 2a 2f 0a 20  fied header */. 
17bf0 20 69 6e 74 20 48 5f 66 6c 61 67 20 3d 20 30 3b   int H_flag = 0;
17c00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
17c10 66 20 2d 48 20 69 73 20 70 72 65 73 65 6e 74 2e  f -H is present.
17c20 20 20 4f 75 74 70 75 74 20 45 58 50 4f 52 54 20    Output EXPORT 
17c30 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
17c40 76 5f 66 6c 61 67 20 3d 20 30 3b 20 20 20 20 20  v_flag = 0;     
17c50 20 20 2f 2a 20 56 65 72 62 6f 73 65 20 2a 2f 0a    /* Verbose */.
17c60 20 20 69 6e 74 20 6e 6f 4d 6f 72 65 46 6c 61 67    int noMoreFlag
17c70 73 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  s;      /* True 
17c80 69 66 20 2d 2d 20 68 61 73 20 62 65 65 6e 20 73  if -- has been s
17c90 65 65 6e 2e 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  een. */.  FILE *
17ca0 72 65 70 6f 72 74 3b 20 20 20 20 20 20 20 20 20  report;         
17cb0 2f 2a 20 53 65 6e 64 20 70 72 6f 67 72 65 73 73  /* Send progress
17cc0 20 72 65 70 6f 72 74 73 20 74 6f 20 74 68 69 73   reports to this
17cd0 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  , if not NULL */
17ce0 0a 0a 20 20 6e 6f 4d 6f 72 65 46 6c 61 67 73 20  ..  noMoreFlags 
17cf0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  = 0;.  for(i=1; 
17d00 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
17d10 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d    if( argv[i][0]
17d20 3d 3d 27 2d 27 20 26 26 20 21 6e 6f 4d 6f 72 65  =='-' && !noMore
17d30 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 73  Flags ){.      s
17d40 77 69 74 63 68 28 20 61 72 67 76 5b 69 5d 5b 31  witch( argv[i][1
17d50 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  ] ){.        cas
17d60 65 20 27 68 27 3a 20 20 20 68 5f 66 6c 61 67 20  e 'h':   h_flag 
17d70 3d 20 31 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  = 1;   break;.  
17d80 20 20 20 20 20 20 63 61 73 65 20 27 48 27 3a 20        case 'H': 
17d90 20 20 48 5f 66 6c 61 67 20 3d 20 31 3b 20 20 20    H_flag = 1;   
17da0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
17db0 61 73 65 20 27 76 27 3a 20 20 20 76 5f 66 6c 61  ase 'v':   v_fla
17dc0 67 20 3d 20 31 3b 20 20 20 62 72 65 61 6b 3b 0a  g = 1;   break;.
17dd0 20 20 20 20 20 20 20 20 63 61 73 65 20 27 64 27          case 'd'
17de0 3a 20 20 20 64 6f 63 5f 66 6c 61 67 20 3d 20 31  :   doc_flag = 1
17df0 3b 20 70 72 6f 74 6f 5f 73 74 61 74 69 63 20 3d  ; proto_static =
17e00 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20   1; break;.     
17e10 20 20 20 63 61 73 65 20 27 6c 27 3a 20 20 20 70     case 'l':   p
17e20 72 6f 74 6f 5f 73 74 61 74 69 63 20 3d 20 31 3b  roto_static = 1;
17e30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
17e40 63 61 73 65 20 27 66 27 3a 20 20 20 41 64 64 50  case 'f':   AddP
17e50 61 72 61 6d 65 74 65 72 73 28 69 2c 20 26 61 72  arameters(i, &ar
17e60 67 63 2c 20 26 61 72 67 76 29 3b 20 62 72 65 61  gc, &argv); brea
17e70 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
17e80 27 2d 27 3a 20 20 20 6e 6f 4d 6f 72 65 46 6c 61  '-':   noMoreFla
17e90 67 73 20 3d 20 31 3b 20 20 20 62 72 65 61 6b 3b  gs = 1;   break;
17ea0 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a 20 20  .#ifdef DEBUG.  
17eb0 20 20 20 20 20 20 63 61 73 65 20 27 21 27 3a 20        case '!': 
17ec0 20 20 69 2b 2b 3b 20 20 64 65 62 75 67 4d 61 73    i++;  debugMas
17ed0 6b 20 3d 20 73 74 72 74 6f 6c 28 61 72 67 76 5b  k = strtol(argv[
17ee0 69 5d 2c 30 2c 30 29 3b 20 62 72 65 61 6b 3b 0a  i],0,0); break;.
17ef0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64  #endif.        d
17f00 65 66 61 75 6c 74 3a 20 20 20 20 55 73 61 67 65  efault:    Usage
17f10 28 61 72 67 76 5b 30 5d 2c 61 72 67 76 5b 69 5d  (argv[0],argv[i]
17f20 29 3b 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20  ); return 1;.   
17f30 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
17f40 20 20 20 20 20 20 70 46 69 6c 65 20 3d 20 43 72        pFile = Cr
17f50 65 61 74 65 49 6e 46 69 6c 65 28 61 72 67 76 5b  eateInFile(argv[
17f60 69 5d 2c 26 6e 45 72 72 29 3b 0a 20 20 20 20 20  i],&nErr);.     
17f70 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20   if( pFile ){.  
17f80 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 4c        if( pFileL
17f90 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
17fa0 20 70 54 61 69 6c 2d 3e 70 4e 65 78 74 20 3d 20   pTail->pNext = 
17fb0 70 46 69 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  pFile;.         
17fc0 20 70 54 61 69 6c 20 3d 20 70 46 69 6c 65 3b 0a   pTail = pFile;.
17fd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17fe0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 4c 69           pFileLi
17ff0 73 74 20 3d 20 70 54 61 69 6c 20 3d 20 70 46 69  st = pTail = pFi
18000 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  le;.        }.  
18010 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18020 20 20 69 66 28 20 68 5f 66 6c 61 67 20 26 26 20    if( h_flag && 
18030 48 5f 66 6c 61 67 20 29 7b 0a 20 20 20 20 68 5f  H_flag ){.    h_
18040 66 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  flag = 0;.  }.  
18050 69 66 28 20 76 5f 66 6c 61 67 20 29 7b 0a 20 20  if( v_flag ){.  
18060 20 20 72 65 70 6f 72 74 20 3d 20 28 68 5f 66 6c    report = (h_fl
18070 61 67 20 7c 7c 20 48 5f 66 6c 61 67 29 20 3f 20  ag || H_flag) ? 
18080 73 74 64 65 72 72 20 3a 20 73 74 64 6f 75 74 3b  stderr : stdout;
18090 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
180a0 70 6f 72 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  port = 0;.  }.  
180b0 69 66 28 20 6e 45 72 72 3e 30 20 29 7b 0a 20 20  if( nErr>0 ){.  
180c0 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20    return nErr;. 
180d0 20 7d 0a 20 20 66 6f 72 28 70 46 69 6c 65 3d 70   }.  for(pFile=p
180e0 46 69 6c 65 4c 69 73 74 3b 20 70 46 69 6c 65 3b  FileList; pFile;
180f0 20 70 46 69 6c 65 3d 70 46 69 6c 65 2d 3e 70 4e   pFile=pFile->pN
18100 65 78 74 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ext){.    char *
18110 7a 46 69 6c 65 3b 0a 0a 20 20 20 20 7a 46 69 6c  zFile;..    zFil
18120 65 6e 61 6d 65 20 3d 20 70 46 69 6c 65 2d 3e 7a  ename = pFile->z
18130 53 72 63 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  Src;.    if( zFi
18140 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74  lename==0 ) cont
18150 69 6e 75 65 3b 0a 20 20 20 20 7a 46 69 6c 65 20  inue;.    zFile 
18160 3d 20 52 65 61 64 46 69 6c 65 28 7a 46 69 6c 65  = ReadFile(zFile
18170 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  name);.    if( z
18180 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
18190 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
181a0 22 43 61 6e 27 74 20 72 65 61 64 20 69 6e 70 75  "Can't read inpu
181b0 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 5c 6e 22  t file \"%s\"\n"
181c0 2c 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  ,zFilename);.   
181d0 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
181e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
181f0 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
18200 28 7a 46 69 6c 65 2c 7a 54 6f 70 4c 69 6e 65 2c  (zFile,zTopLine,
18210 6e 54 6f 70 4c 69 6e 65 29 3d 3d 30 20 29 7b 0a  nTopLine)==0 ){.
18220 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 7a 53 72        pFile->zSr
18230 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
18240 7b 0a 20 20 20 20 20 20 69 66 28 20 72 65 70 6f  {.      if( repo
18250 72 74 20 29 20 66 70 72 69 6e 74 66 28 72 65 70  rt ) fprintf(rep
18260 6f 72 74 2c 22 52 65 61 64 69 6e 67 20 25 73 2e  ort,"Reading %s.
18270 2e 2e 5c 6e 22 2c 7a 46 69 6c 65 6e 61 6d 65 29  ..\n",zFilename)
18280 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  ;.      pList = 
18290 54 6f 6b 65 6e 69 7a 65 46 69 6c 65 28 7a 46 69  TokenizeFile(zFi
182a0 6c 65 2c 26 70 46 69 6c 65 2d 3e 69 64 54 61 62  le,&pFile->idTab
182b0 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  le);.      if( p
182c0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
182d0 6e 45 72 72 20 2b 3d 20 50 61 72 73 65 46 69 6c  nErr += ParseFil
182e0 65 28 70 4c 69 73 74 2c 70 46 69 6c 65 2d 3e 66  e(pList,pFile->f
182f0 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 46  lags);.        F
18300 72 65 65 54 6f 6b 65 6e 4c 69 73 74 28 70 4c 69  reeTokenList(pLi
18310 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
18320 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30   if( zFile[0]==0
18330 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
18340 6e 74 66 28 73 74 64 65 72 72 2c 22 49 6e 70 75  ntf(stderr,"Inpu
18350 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 20 69 73  t file \"%s\" is
18360 20 65 6d 70 74 79 2e 5c 6e 22 2c 20 7a 46 69 6c   empty.\n", zFil
18370 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
18380 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  nErr++;.      }e
18390 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
183a0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
183b0 6f 72 73 20 77 68 69 6c 65 20 70 72 6f 63 65 73  ors while proces
183c0 73 69 6e 67 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  sing \"%s\"\n", 
183d0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
183e0 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
183f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18400 28 20 21 64 6f 63 5f 66 6c 61 67 20 29 20 53 61  ( !doc_flag ) Sa
18410 66 65 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20  feFree(zFile);. 
18420 20 20 20 69 66 28 20 64 6f 63 5f 66 6c 61 67 20     if( doc_flag 
18430 29 20 50 72 69 6e 74 4d 6f 64 75 6c 65 52 65 63  ) PrintModuleRec
18440 6f 72 64 28 7a 46 69 6c 65 2c 7a 46 69 6c 65 6e  ord(zFile,zFilen
18450 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ame);.  }.  if( 
18460 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65  nErr>0 ){.    re
18470 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20 7d 0a 23  turn nErr;.  }.#
18480 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 69 66  ifdef DEBUG.  if
18490 28 20 64 65 62 75 67 4d 61 73 6b 20 26 20 44 45  ( debugMask & DE
184a0 43 4c 5f 44 55 4d 50 20 29 7b 0a 20 20 20 20 44  CL_DUMP ){.    D
184b0 75 6d 70 44 65 63 6c 4c 69 73 74 28 29 3b 0a 20  umpDeclList();. 
184c0 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a     return nErr;.
184d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
184e0 20 64 6f 63 5f 66 6c 61 67 20 29 7b 0a 20 20 20   doc_flag ){.   
184f0 20 44 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 44 75   DocumentationDu
18500 6d 70 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  mp();.    return
18510 20 6e 45 72 72 3b 0a 20 20 7d 0a 20 20 7a 46 69   nErr;.  }.  zFi
18520 6c 65 6e 61 6d 65 20 3d 20 22 2d 2d 69 6e 74 65  lename = "--inte
18530 72 6e 61 6c 2d 2d 22 3b 0a 20 20 70 4c 69 73 74  rnal--";.  pList
18540 20 3d 20 54 6f 6b 65 6e 69 7a 65 46 69 6c 65 28   = TokenizeFile(
18550 7a 49 6e 69 74 2c 30 29 3b 0a 20 20 69 66 28 20  zInit,0);.  if( 
18560 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
18570 72 65 74 75 72 6e 20 6e 45 72 72 2b 31 3b 0a 20  return nErr+1;. 
18580 20 7d 0a 20 20 50 61 72 73 65 46 69 6c 65 28 70   }.  ParseFile(p
18590 4c 69 73 74 2c 50 53 5f 49 6e 74 65 72 66 61 63  List,PS_Interfac
185a0 65 29 3b 0a 20 20 46 72 65 65 54 6f 6b 65 6e 4c  e);.  FreeTokenL
185b0 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 69 66  ist(pList);.  if
185c0 28 20 68 5f 66 6c 61 67 20 7c 7c 20 48 5f 66 6c  ( h_flag || H_fl
185d0 61 67 20 29 7b 0a 20 20 20 20 6e 45 72 72 20 2b  ag ){.    nErr +
185e0 3d 20 4d 61 6b 65 47 6c 6f 62 61 6c 48 65 61 64  = MakeGlobalHead
185f0 65 72 28 48 5f 66 6c 61 67 29 3b 0a 20 20 7d 65  er(H_flag);.  }e
18600 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 46 69  lse{.    for(pFi
18610 6c 65 3d 70 46 69 6c 65 4c 69 73 74 3b 20 70 46  le=pFileList; pF
18620 69 6c 65 3b 20 70 46 69 6c 65 3d 70 46 69 6c 65  ile; pFile=pFile
18630 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
18640 69 66 28 20 70 46 69 6c 65 2d 3e 7a 53 72 63 3d  if( pFile->zSrc=
18650 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
18660 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 4d 61 6b       nErr += Mak
18670 65 48 65 61 64 65 72 28 70 46 69 6c 65 2c 72 65  eHeader(pFile,re
18680 70 6f 72 74 2c 30 29 3b 0a 20 20 20 20 7d 0a 20  port,0);.    }. 
18690 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
186a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a                 ;.}.#endif.