Hex Artifact Content
Not logged in

Artifact b7bbc46f28d9e4396b772a389103158e1eff05d3:

File src/makeheaders.c part of check-in [dbda8d6ce9] - Initial check-in of m1 sources. by drh on 2007-07-21 14:10:57.

0000: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0010: 72 20 69 64 65 6e 74 5b 5d 20 3d 20 22 40 28 23  r ident[] = "@(#
0020: 29 20 24 48 65 61 64 65 72 3a 20 2f 63 76 73 74  ) $Header: /cvst
0030: 72 61 63 2f 63 76 73 74 72 61 63 2f 6d 61 6b 65  rac/cvstrac/make
0040: 68 65 61 64 65 72 73 2e 63 2c 76 20 31 2e 34 20  headers.c,v 1.4 
0050: 32 30 30 35 2f 30 33 2f 31 36 20 32 32 3a 31 37  2005/03/16 22:17
0060: 3a 35 31 20 64 72 68 20 45 78 70 20 24 22 3b 0a  :51 drh Exp $";.
0070: 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72  /*.** This progr
0080: 61 6d 20 73 63 61 6e 73 20 43 20 61 6e 64 20 43  am scans C and C
0090: 2b 2b 20 73 6f 75 72 63 65 20 66 69 6c 65 73 20  ++ source files 
00a0: 61 6e 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  and automaticall
00b0: 79 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61  y generates.** a
00c0: 70 70 72 6f 70 72 69 61 74 65 20 68 65 61 64 65  ppropriate heade
00d0: 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e 63  r files..*/.#inc
00e0: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
00f0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0100: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79  h>.#include <cty
0110: 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  pe.h>.#include <
0120: 6d 65 6d 6f 72 79 2e 68 3e 0a 23 69 6e 63 6c 75  memory.h>.#inclu
0130: 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a  de <sys/stat.h>.
0140: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0150: 2e 68 3e 0a 23 69 66 6e 64 65 66 20 57 49 4e 33  .h>.#ifndef WIN3
0160: 32 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e 69  2.# include <uni
0170: 73 74 64 2e 68 3e 0a 23 65 6c 73 65 0a 23 20 69  std.h>.#else.# i
0180: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
0190: 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  >.#endif../*.** 
01a0: 4d 61 63 72 6f 73 20 66 6f 72 20 64 65 62 75 67  Macros for debug
01b0: 67 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ging..*/.#ifdef 
01c0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
01d0: 20 64 65 62 75 67 4d 61 73 6b 20 3d 20 30 3b 0a   debugMask = 0;.
01e0: 23 20 64 65 66 69 6e 65 20 64 65 62 75 67 30 28  # define debug0(
01f0: 46 2c 4d 29 20 20 20 20 20 20 20 69 66 28 20 28  F,M)       if( (
0200: 46 29 26 64 65 62 75 67 4d 61 73 6b 20 29 7b 20  F)&debugMask ){ 
0210: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 4d  fprintf(stderr,M
0220: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 64 65  ); }.# define de
0230: 62 75 67 31 28 46 2c 4d 2c 41 29 20 20 20 20 20  bug1(F,M,A)     
0240: 69 66 28 20 28 46 29 26 64 65 62 75 67 4d 61 73  if( (F)&debugMas
0250: 6b 20 29 7b 20 66 70 72 69 6e 74 66 28 73 74 64  k ){ fprintf(std
0260: 65 72 72 2c 4d 2c 41 29 3b 20 7d 0a 23 20 64 65  err,M,A); }.# de
0270: 66 69 6e 65 20 64 65 62 75 67 32 28 46 2c 4d 2c  fine debug2(F,M,
0280: 41 2c 42 29 20 20 20 69 66 28 20 28 46 29 26 64  A,B)   if( (F)&d
0290: 65 62 75 67 4d 61 73 6b 20 29 7b 20 66 70 72 69  ebugMask ){ fpri
02a0: 6e 74 66 28 73 74 64 65 72 72 2c 4d 2c 41 2c 42  ntf(stderr,M,A,B
02b0: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 64 65  ); }.# define de
02c0: 62 75 67 33 28 46 2c 4d 2c 41 2c 42 2c 43 29 20  bug3(F,M,A,B,C) 
02d0: 69 66 28 20 28 46 29 26 64 65 62 75 67 4d 61 73  if( (F)&debugMas
02e0: 6b 20 29 7b 20 66 70 72 69 6e 74 66 28 73 74 64  k ){ fprintf(std
02f0: 65 72 72 2c 4d 2c 41 2c 42 2c 43 29 3b 20 7d 0a  err,M,A,B,C); }.
0300: 23 20 64 65 66 69 6e 65 20 50 41 52 53 45 52 20  # define PARSER 
0310: 20 20 20 20 20 30 78 30 30 30 30 30 30 30 31 0a       0x00000001.
0320: 23 20 64 65 66 69 6e 65 20 44 45 43 4c 5f 44 55  # define DECL_DU
0330: 4d 50 20 20 20 30 78 30 30 30 30 30 30 30 32 0a  MP   0x00000002.
0340: 23 20 64 65 66 69 6e 65 20 54 4f 4b 45 4e 49 5a  # define TOKENIZ
0350: 45 52 20 20 20 30 78 30 30 30 30 30 30 30 34 0a  ER   0x00000004.
0360: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64  #else.# define d
0370: 65 62 75 67 30 28 46 6c 61 67 73 2c 20 46 6f 72  ebug0(Flags, For
0380: 6d 61 74 29 0a 23 20 64 65 66 69 6e 65 20 64 65  mat).# define de
0390: 62 75 67 31 28 46 6c 61 67 73 2c 20 46 6f 72 6d  bug1(Flags, Form
03a0: 61 74 2c 20 41 29 0a 23 20 64 65 66 69 6e 65 20  at, A).# define 
03b0: 64 65 62 75 67 32 28 46 6c 61 67 73 2c 20 46 6f  debug2(Flags, Fo
03c0: 72 6d 61 74 2c 20 41 2c 20 42 29 0a 23 20 64 65  rmat, A, B).# de
03d0: 66 69 6e 65 20 64 65 62 75 67 33 28 46 6c 61 67  fine debug3(Flag
03e0: 73 2c 20 46 6f 72 6d 61 74 2c 20 41 2c 20 42 2c  s, Format, A, B,
03f0: 20 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   C).#endif../*.*
0400: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0410: 6d 61 63 72 6f 73 20 61 72 65 20 70 75 72 65 6c  macros are purel
0420: 79 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  y for the purpos
0430: 65 20 6f 66 20 74 65 73 74 69 6e 67 20 74 68 69  e of testing thi
0440: 73 0a 2a 2a 20 70 72 6f 67 72 61 6d 20 6f 6e 20  s.** program on 
0450: 69 74 73 65 6c 66 2e 20 20 54 68 65 79 20 64 6f  itself.  They do
0460: 6e 27 74 20 72 65 61 6c 6c 79 20 63 6f 6e 74 72  n't really contr
0470: 69 62 75 74 65 20 74 6f 20 74 68 65 20 63 6f 64  ibute to the cod
0480: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4e  e..*/.#define IN
0490: 54 45 52 46 41 43 45 20 31 0a 23 64 65 66 69 6e  TERFACE 1.#defin
04a0: 65 20 45 58 50 4f 52 54 5f 49 4e 54 45 52 46 41  e EXPORT_INTERFA
04b0: 43 45 20 31 0a 23 64 65 66 69 6e 65 20 45 58 50  CE 1.#define EXP
04c0: 4f 52 54 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  ORT../*.** Each 
04d0: 74 6f 6b 65 6e 20 69 6e 20 61 20 73 6f 75 72 63  token in a sourc
04e0: 65 20 66 69 6c 65 20 69 73 20 72 65 70 72 65 73  e file is repres
04f0: 65 6e 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74  ented by an inst
0500: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ance of.** the f
0510: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
0520: 72 65 2e 20 20 54 6f 6b 65 6e 73 20 61 72 65 20  re.  Tokens are 
0530: 63 6f 6c 6c 65 63 74 65 64 20 6f 6e 74 6f 20 61  collected onto a
0540: 20 6c 69 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65   list..*/.typede
0550: 66 20 73 74 72 75 63 74 20 54 6f 6b 65 6e 20 54  f struct Token T
0560: 6f 6b 65 6e 3b 0a 73 74 72 75 63 74 20 54 6f 6b  oken;.struct Tok
0570: 65 6e 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  en {.  const cha
0580: 72 20 2a 7a 54 65 78 74 3b 20 20 20 20 20 20 2f  r *zText;      /
0590: 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68  * The text of th
05a0: 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74  e token */.  int
05b0: 20 6e 54 65 78 74 3b 20 20 20 20 20 20 20 20 20   nText;         
05c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
05d0: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
05e0: 74 68 65 20 74 6f 6b 65 6e 27 73 20 74 65 78 74  the token's text
05f0: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b   */.  int eType;
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0610: 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 68 69   The type of thi
0620: 73 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74  s token */.  int
0630: 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20   nLine;         
0640: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65       /* The line
0650: 20 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68   number on which
0660: 20 74 68 65 20 74 6f 6b 65 6e 20 73 74 61 72 74   the token start
0670: 73 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43  s */.  Token *pC
0680: 6f 6d 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  omment;        /
0690: 2a 20 4d 6f 73 74 20 72 65 63 65 6e 74 20 62 6c  * Most recent bl
06a0: 6f 63 6b 20 63 6f 6d 6d 65 6e 74 20 62 65 66 6f  ock comment befo
06b0: 72 65 20 74 68 69 73 20 74 6f 6b 65 6e 20 2a 2f  re this token */
06c0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 65 78 74 3b  .  Token *pNext;
06d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
06e0: 78 74 20 74 6f 6b 65 6e 20 6f 6e 20 74 68 65 20  xt token on the 
06f0: 6c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  list */.  Token 
0700: 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  *pPrev;         
0710: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 6f    /* Previous to
0720: 6b 65 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ken on the list 
0730: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 44 75 72  */.};../*.** Dur
0740: 69 6e 67 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e  ing tokenization
0750: 2c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  , information ab
0760: 6f 75 74 20 74 68 65 20 73 74 61 74 65 20 6f 66  out the state of
0770: 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 73 74   the input.** st
0780: 72 65 61 6d 20 69 73 20 68 65 6c 64 20 69 6e 20  ream is held in 
0790: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
07a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
07b0: 75 63 74 75 72 65 0a 2a 2f 0a 74 79 70 65 64 65  ucture.*/.typede
07c0: 66 20 73 74 72 75 63 74 20 49 6e 53 74 72 65 61  f struct InStrea
07d0: 6d 20 49 6e 53 74 72 65 61 6d 3b 0a 73 74 72 75  m InStream;.stru
07e0: 63 74 20 49 6e 53 74 72 65 61 6d 20 7b 0a 20 20  ct InStream {.  
07f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20 20  const char *z;  
0800: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
0810: 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
0820: 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69  input */.  int i
0830: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0840: 20 20 20 2f 2a 20 4e 65 78 74 20 63 68 61 72 61     /* Next chara
0850: 63 74 65 72 20 74 6f 20 72 65 61 64 20 66 72 6f  cter to read fro
0860: 6d 20 74 68 65 20 69 6e 70 75 74 20 2a 2f 0a 20  m the input */. 
0870: 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20   int nLine;     
0880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0890: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  line number for 
08a0: 63 68 61 72 61 63 74 65 72 20 7a 5b 69 5d 20 2a  character z[i] *
08b0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  /.};../*.** Each
08c0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 20   declaration in 
08d0: 74 68 65 20 43 20 6f 72 20 43 2b 2b 20 73 6f 75  the C or C++ sou
08e0: 72 63 65 20 66 69 6c 65 73 20 69 73 20 70 61 72  rce files is par
08f0: 73 65 64 20 6f 75 74 20 61 6e 64 20 73 74 6f 72  sed out and stor
0900: 65 64 20 61 73 0a 2a 2a 20 61 6e 20 69 6e 73 74  ed as.** an inst
0910: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
0920: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
0930: 0a 2a 2a 0a 2a 2a 20 41 20 22 66 6f 72 77 61 72  .**.** A "forwar
0940: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 22 20 69  d declaration" i
0950: 73 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  s a declaration 
0960: 74 68 61 74 20 61 6e 20 6f 62 6a 65 63 74 20 65  that an object e
0970: 78 69 73 74 73 20 74 68 61 74 0a 2a 2a 20 64 6f  xists that.** do
0980: 65 73 6e 27 74 20 74 65 6c 6c 20 61 62 6f 75 74  esn't tell about
0990: 20 74 68 65 20 6f 62 6a 65 63 74 73 20 73 74 72   the objects str
09a0: 75 63 74 75 72 65 2e 20 20 41 20 74 79 70 69 63  ucture.  A typic
09b0: 61 6c 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61  al forward decla
09c0: 72 61 74 69 6f 6e 0a 2a 2a 20 69 73 3a 0a 2a 2a  ration.** is:.**
09d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 74 72  .**          str
09e0: 75 63 74 20 58 79 7a 7a 79 3b 0a 2a 2a 0a 2a 2a  uct Xyzzy;.**.**
09f0: 20 4e 6f 74 20 65 76 65 72 79 20 6f 62 6a 65 63   Not every objec
0a00: 74 20 68 61 73 20 61 20 66 6f 72 77 61 72 64 20  t has a forward 
0a10: 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 20 49 66  declaration.  If
0a20: 20 69 74 20 64 6f 65 73 2c 20 74 68 6f 75 67 68   it does, though
0a30: 74 2c 20 74 68 65 0a 2a 2a 20 66 6f 72 77 61 72  t, the.** forwar
0a40: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 77 69  d declaration wi
0a50: 6c 6c 20 62 65 20 63 6f 6e 74 61 69 6e 65 64 20  ll be contained 
0a60: 69 6e 20 74 68 65 20 7a 46 77 64 20 66 69 65 6c  in the zFwd fiel
0a70: 64 20 66 6f 72 20 43 20 61 6e 64 0a 2a 2a 20 74  d for C and.** t
0a80: 68 65 20 7a 46 77 64 43 70 70 20 66 6f 72 20 43  he zFwdCpp for C
0a90: 2b 2b 2e 20 20 54 68 65 20 7a 44 65 63 6c 20 66  ++.  The zDecl f
0aa0: 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20 74 68  ield contains th
0ab0: 65 20 63 6f 6d 70 6c 65 74 65 20 0a 2a 2a 20 64  e complete .** d
0ac0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 65 78 74 2e  eclaration text.
0ad0: 20 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74    .*/.typedef st
0ae0: 72 75 63 74 20 44 65 63 6c 20 44 65 63 6c 3b 0a  ruct Decl Decl;.
0af0: 73 74 72 75 63 74 20 44 65 63 6c 20 7b 0a 20 20  struct Decl {.  
0b00: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
0b10: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
0b20: 65 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 64  e object being d
0b30: 65 63 6c 61 72 65 64 2e 20 20 54 68 65 20 61 70  eclared.  The ap
0b40: 70 65 61 72 61 6e 63 65 0a 20 20 20 20 20 20 20  pearance.       
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
0b60: 20 6f 66 20 74 68 69 73 20 6e 61 6d 65 20 69 73   of this name is
0b70: 20 61 20 73 6f 75 72 63 65 20 66 69 6c 65 20 74   a source file t
0b80: 72 69 67 67 65 72 73 20 74 68 65 20 64 65 63 6c  riggers the decl
0b90: 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  aration.        
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
0bb0: 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
0bc0: 68 65 20 68 65 61 64 65 72 20 66 6f 72 20 74 68  he header for th
0bd0: 61 74 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 63 68  at file. */.  ch
0be0: 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
0bf0: 20 2f 2a 20 46 69 6c 65 20 66 72 6f 6d 20 77 68   /* File from wh
0c00: 69 63 68 20 65 78 74 72 61 63 74 65 64 2e 20 20  ich extracted.  
0c10: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 66 3b 20  */.  char *zIf; 
0c20: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 72 72 6f          /* Surro
0c30: 75 6e 64 20 74 68 65 20 64 65 63 6c 61 72 61 74  und the declarat
0c40: 69 6f 6e 20 77 69 74 68 20 74 68 69 73 20 23 69  ion with this #i
0c50: 66 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 77  f */.  char *zFw
0c60: 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66  d;        /* A f
0c70: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
0c80: 6f 6e 2e 20 20 4e 55 4c 4c 20 69 66 20 74 68 65  on.  NULL if the
0c90: 72 65 20 69 73 20 6e 6f 6e 65 2e 20 2a 2f 0a 20  re is none. */. 
0ca0: 20 63 68 61 72 20 2a 7a 46 77 64 43 70 70 3b 20   char *zFwdCpp; 
0cb0: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20      /* Use this 
0cc0: 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  forward declarat
0cd0: 69 6f 6e 20 66 6f 72 20 43 2b 2b 2e 20 2a 2f 0a  ion for C++. */.
0ce0: 20 20 63 68 61 72 20 2a 7a 44 65 63 6c 3b 20 20    char *zDecl;  
0cf0: 20 20 20 20 20 2f 2a 20 41 20 66 75 6c 6c 20 64       /* A full d
0d00: 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 74 68  eclaration of th
0d10: 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
0d20: 68 61 72 20 2a 7a 45 78 74 72 61 3b 20 20 20 20  har *zExtra;    
0d30: 20 20 2f 2a 20 45 78 74 72 61 20 64 65 63 6c 61    /* Extra decla
0d40: 72 61 74 69 6f 6e 20 74 65 78 74 20 69 6e 73 65  ration text inse
0d50: 72 74 65 64 20 69 6e 74 6f 20 63 6c 61 73 73 20  rted into class 
0d60: 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69 6e 74  objects */.  int
0d70: 20 65 78 74 72 61 54 79 70 65 3b 20 20 20 20 20   extraType;     
0d80: 2f 2a 20 4c 61 73 74 20 70 75 62 6c 69 63 3a 2c  /* Last public:,
0d90: 20 70 72 6f 74 65 63 74 65 64 3a 20 6f 72 20 70   protected: or p
0da0: 72 69 76 61 74 65 3a 20 69 6e 20 7a 45 78 74 72  rivate: in zExtr
0db0: 61 44 65 63 6c 20 2a 2f 0a 20 20 73 74 72 75 63  aDecl */.  struc
0dc0: 74 20 49 6e 63 6c 75 64 65 20 2a 70 49 6e 63 6c  t Include *pIncl
0dd0: 75 64 65 3b 20 20 20 2f 2a 20 23 69 6e 63 6c 75  ude;   /* #inclu
0de0: 64 65 73 20 74 68 61 74 20 63 6f 6d 65 20 62 65  des that come be
0df0: 66 6f 72 65 20 74 68 69 73 20 64 65 63 6c 61 72  fore this declar
0e00: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 66  ation */.  int f
0e10: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 2f 2a  lags;         /*
0e20: 20 53 65 65 20 74 68 65 20 22 50 72 6f 70 65 72   See the "Proper
0e30: 74 69 65 73 22 20 62 65 6c 6f 77 20 2a 2f 0a 20  ties" below */. 
0e40: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6d 6d 65 6e 74   Token *pComment
0e50: 3b 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20 63  ;   /* A block c
0e60: 6f 6d 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  omment associate
0e70: 64 20 77 69 74 68 20 74 68 69 73 20 64 65 63 6c  d with this decl
0e80: 61 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b  aration */.  Tok
0e90: 65 6e 20 74 6f 6b 65 6e 43 6f 64 65 3b 20 20 20  en tokenCode;   
0ea0: 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  /* Implementatio
0eb0: 6e 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 20 61  n of functions a
0ec0: 6e 64 20 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  nd procedures */
0ed0: 0a 20 20 44 65 63 6c 20 2a 70 53 61 6d 65 4e 61  .  Decl *pSameNa
0ee0: 6d 65 3b 20 20 20 2f 2a 20 4e 65 78 74 20 64 65  me;   /* Next de
0ef0: 63 6c 61 72 61 74 69 6f 6e 20 77 69 74 68 20 74  claration with t
0f00: 68 65 20 73 61 6d 65 20 22 7a 4e 61 6d 65 22 20  he same "zName" 
0f10: 2a 2f 0a 20 20 44 65 63 6c 20 2a 70 53 61 6d 65  */.  Decl *pSame
0f20: 48 61 73 68 3b 20 20 20 2f 2a 20 4e 65 78 74 20  Hash;   /* Next 
0f30: 64 65 63 6c 61 72 61 74 69 6f 6e 20 77 69 74 68  declaration with
0f40: 20 73 61 6d 65 20 68 61 73 68 20 62 75 74 20 64   same hash but d
0f50: 69 66 66 65 72 65 6e 74 20 7a 4e 61 6d 65 20 2a  ifferent zName *
0f60: 2f 0a 20 20 44 65 63 6c 20 2a 70 4e 65 78 74 3b  /.  Decl *pNext;
0f70: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64         /* Next d
0f80: 65 63 6c 61 72 61 74 69 6f 6e 20 77 69 74 68 20  eclaration with 
0f90: 61 20 64 69 66 66 65 72 65 6e 74 20 6e 61 6d 65  a different name
0fa0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72   */.};../*.** Pr
0fb0: 6f 70 65 72 74 69 65 73 20 61 73 73 6f 63 69 61  operties associa
0fc0: 74 65 64 20 77 69 74 68 20 64 65 63 6c 61 72 61  ted with declara
0fd0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 44 50 5f  tions..**.** DP_
0fe0: 46 6f 72 77 61 72 64 20 61 6e 64 20 44 50 5f 44  Forward and DP_D
0ff0: 65 63 6c 61 72 65 64 20 61 72 65 20 75 73 65 64  eclared are used
1000: 20 64 75 72 69 6e 67 20 74 68 65 20 67 65 6e 65   during the gene
1010: 72 61 74 69 6f 6e 20 6f 66 20 61 20 73 69 6e 67  ration of a sing
1020: 6c 65 0a 2a 2a 20 68 65 61 64 65 72 20 66 69 6c  le.** header fil
1030: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  e in order to pr
1040: 65 76 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20  event duplicate 
1050: 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e 64  declarations and
1060: 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 2a 2a   definitions..**
1070: 20 44 50 5f 46 6f 72 77 61 72 64 20 69 73 20 73   DP_Forward is s
1080: 65 74 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a  et after the obj
1090: 65 63 74 20 68 61 73 20 62 65 65 6e 20 67 69 76  ect has been giv
10a0: 65 6e 20 61 20 66 6f 72 77 61 72 64 20 64 65 63  en a forward dec
10b0: 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  laration.** and 
10c0: 44 50 5f 44 65 63 6c 61 72 65 64 20 69 73 20 73  DP_Declared is s
10d0: 65 74 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a  et after the obj
10e0: 65 63 74 20 67 65 74 73 20 61 20 66 75 6c 6c 20  ect gets a full 
10f0: 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a  declarations..**
1100: 20 28 45 78 61 6d 70 6c 65 3a 20 20 41 20 66 6f   (Example:  A fo
1110: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1120: 6e 20 69 73 20 22 74 79 70 65 64 65 66 20 73 74  n is "typedef st
1130: 72 75 63 74 20 41 62 63 20 41 62 63 3b 22 20 61  ruct Abc Abc;" a
1140: 6e 64 20 74 68 65 0a 2a 2a 20 66 75 6c 6c 20 64  nd the.** full d
1150: 65 63 6c 61 72 61 74 69 6f 6e 20 69 73 20 22 73  eclaration is "s
1160: 74 72 75 63 74 20 41 62 63 20 7b 20 69 6e 74 20  truct Abc { int 
1170: 61 3b 20 66 6c 6f 61 74 20 62 3b 20 7d 3b 22 2e  a; float b; };".
1180: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 44 50 5f 45  ).**.** The DP_E
1190: 78 70 6f 72 74 20 61 6e 64 20 44 50 5f 4c 6f 63  xport and DP_Loc
11a0: 61 6c 20 66 6c 61 67 73 20 61 72 65 20 6d 6f 72  al flags are mor
11b0: 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 54 68  e permanent.  Th
11c0: 65 79 20 6d 61 72 6b 20 6f 62 6a 65 63 74 73 0a  ey mark objects.
11d0: 2a 2a 20 74 68 61 74 20 68 61 76 65 20 45 58 50  ** that have EXP
11e0: 4f 52 54 20 73 63 6f 70 65 20 61 6e 64 20 4c 4f  ORT scope and LO
11f0: 43 41 4c 20 73 63 6f 70 65 20 72 65 73 70 65 63  CAL scope respec
1200: 74 69 76 65 6c 79 2e 20 20 49 66 20 62 6f 74 68  tively.  If both
1210: 20 6f 66 20 74 68 65 73 65 0a 2a 2a 20 6d 61 72   of these.** mar
1220: 6b 73 20 61 72 65 20 6d 69 73 73 69 6e 67 2c 20  ks are missing, 
1230: 74 68 65 6e 20 74 68 65 20 6f 62 6a 65 63 74 20  then the object 
1240: 68 61 73 20 6c 69 62 72 61 72 79 20 73 63 6f 70  has library scop
1250: 65 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 73  e.  The meanings
1260: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 63 6f 70 65   of.** the scope
1270: 73 20 61 72 65 20 61 73 20 66 6f 6c 6c 6f 77 73  s are as follows
1280: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4c 4f 43 41 4c  :.**.**    LOCAL
1290: 20 73 63 6f 70 65 20 20 20 20 20 20 20 20 20 54   scope         T
12a0: 68 65 20 6f 62 6a 65 63 74 20 69 73 20 6f 6e 6c  he object is onl
12b0: 79 20 75 73 61 62 6c 65 20 77 69 74 68 69 6e 20  y usable within 
12c0: 74 68 65 20 66 69 6c 65 20 69 6e 0a 2a 2a 20 20  the file in.**  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 20 20 20 20 20 77 68 69 63 68 20 69 74 20 69        which it i
12f0: 73 20 64 65 63 6c 61 72 65 64 2e 0a 2a 2a 0a 2a  s declared..**.*
1300: 2a 20 20 20 20 6c 69 62 72 61 72 79 20 73 63 6f  *    library sco
1310: 70 65 20 20 20 20 20 20 20 54 68 65 20 6f 62 6a  pe       The obj
1320: 65 63 74 20 69 73 20 76 69 73 69 62 6c 65 20 61  ect is visible a
1330: 6e 64 20 75 73 61 62 6c 65 20 77 69 74 68 69 6e  nd usable within
1340: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 66 69 6c 65 73 20 69 6e 20 74 68 65 20 73 61   files in the sa
1370: 6d 65 20 70 72 6f 6a 65 63 74 2e 20 20 42 79 20  me project.  By 
1380: 69 66 20 74 68 65 20 70 72 6f 6a 65 63 74 20 69  if the project i
1390: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 61 20 6c 69              a li
13b0: 62 72 61 72 79 2c 20 74 68 65 6e 20 74 68 65 20  brary, then the 
13c0: 6f 62 6a 65 63 74 20 69 73 20 6e 6f 74 20 76 69  object is not vi
13d0: 73 69 62 6c 65 20 74 6f 20 75 73 65 72 73 0a 2a  sible to users.*
13e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
13f0: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1400: 6c 69 62 72 61 72 79 2e 20 20 28 69 2e 65 2e 20  library.  (i.e. 
1410: 74 68 65 20 6f 62 6a 65 63 74 20 64 6f 65 73 20  the object does 
1420: 6e 6f 74 20 61 70 70 65 61 72 0a 2a 2a 20 20 20  not appear.**   
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 69 6e 20 74 68 65 20 6f 75 74 70       in the outp
1450: 75 74 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68  ut when using th
1460: 65 20 2d 48 20 6f 70 74 69 6f 6e 2e 29 0a 2a 2a  e -H option.).**
1470: 0a 2a 2a 20 20 20 20 45 58 50 4f 52 54 20 73 63  .**    EXPORT sc
1480: 6f 70 65 20 20 20 20 20 20 20 20 54 68 65 20 6f  ope        The o
1490: 62 6a 65 63 74 20 69 73 20 76 69 73 69 62 6c 65  bject is visible
14a0: 20 61 6e 64 20 75 73 61 62 6c 65 20 65 76 65 72   and usable ever
14b0: 79 77 68 65 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ywhere..**.** Th
14c0: 65 20 44 50 5f 46 6c 61 67 20 69 73 20 61 20 74  e DP_Flag is a t
14d0: 65 6d 70 6f 72 61 72 79 20 75 73 65 20 66 6c 61  emporary use fla
14e0: 67 20 74 68 61 74 20 69 73 20 75 73 65 64 20 64  g that is used d
14f0: 75 72 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67  uring processing
1500: 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 61   to.** prevent a
1510: 6e 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 2e  n infinite loop.
1520: 20 20 49 74 27 73 20 75 73 65 20 69 73 20 6c 6f    It's use is lo
1530: 63 61 6c 69 7a 65 64 2e 20 20 0a 2a 2a 0a 2a 2a  calized.  .**.**
1540: 20 54 68 65 20 44 50 5f 43 70 6c 75 73 70 6c 75   The DP_Cplusplu
1550: 73 2c 20 44 50 5f 45 78 74 65 72 6e 43 52 65 71  s, DP_ExternCReq
1560: 64 20 61 6e 64 20 44 50 5f 45 78 74 65 72 6e 52  d and DP_ExternR
1570: 65 71 64 20 66 6c 61 67 73 20 61 72 65 20 70 65  eqd flags are pe
1580: 72 6d 61 6e 65 6e 74 0a 2a 2a 20 61 6e 64 20 61  rmanent.** and a
1590: 72 65 20 75 73 65 64 20 74 6f 20 73 70 65 63 69  re used to speci
15a0: 66 79 20 77 68 61 74 20 74 79 70 65 20 6f 66 20  fy what type of 
15b0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 68 65 20  declaration the 
15c0: 6f 62 6a 65 63 74 20 72 65 71 75 69 72 65 73 2e  object requires.
15d0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 50 5f 46  .*/.#define DP_F
15e0: 6f 72 77 61 72 64 20 20 20 20 20 20 30 78 30 30  orward      0x00
15f0: 31 20 20 20 2f 2a 20 48 61 73 20 61 20 66 6f 72  1   /* Has a for
1600: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1610: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   in this file */
1620: 0a 23 64 65 66 69 6e 65 20 44 50 5f 44 65 63 6c  .#define DP_Decl
1630: 61 72 65 64 20 20 20 20 20 30 78 30 30 32 20 20  ared     0x002  
1640: 20 2f 2a 20 48 61 73 20 61 20 66 75 6c 6c 20 64   /* Has a full d
1650: 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 20 74 68  eclaration in th
1660: 69 73 20 66 69 6c 65 20 2a 2f 0a 23 64 65 66 69  is file */.#defi
1670: 6e 65 20 44 50 5f 45 78 70 6f 72 74 20 20 20 20  ne DP_Export    
1680: 20 20 20 30 78 30 30 34 20 20 20 2f 2a 20 45 78     0x004   /* Ex
1690: 70 6f 72 74 20 74 68 69 73 20 64 65 63 6c 61 72  port this declar
16a0: 61 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  ation */.#define
16b0: 20 44 50 5f 4c 6f 63 61 6c 20 20 20 20 20 20 20   DP_Local       
16c0: 20 30 78 30 30 38 20 20 20 2f 2a 20 44 65 63 6c   0x008   /* Decl
16d0: 61 72 65 20 69 6e 20 69 74 73 20 68 6f 6d 65 20  are in its home 
16e0: 66 69 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  file only */.#de
16f0: 66 69 6e 65 20 44 50 5f 46 6c 61 67 20 20 20 20  fine DP_Flag    
1700: 20 20 20 20 20 30 78 30 31 30 20 20 20 2f 2a 20       0x010   /* 
1710: 55 73 65 20 74 6f 20 6d 61 72 6b 20 61 20 73 75  Use to mark a su
1720: 62 73 65 74 20 6f 66 20 61 20 44 65 63 6c 20 6c  bset of a Decl l
1730: 69 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ist.            
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 20 20 20 20 2a 2a 20 66 6f 72 20 73 70 65 63 69      ** for speci
1760: 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  al processing */
1770: 0a 23 64 65 66 69 6e 65 20 44 50 5f 43 70 6c 75  .#define DP_Cplu
1780: 73 70 6c 75 73 20 20 20 20 30 78 30 32 30 20 20  splus    0x020  
1790: 20 2f 2a 20 48 61 73 20 43 2b 2b 20 6c 69 6e 6b   /* Has C++ link
17a0: 61 67 65 20 61 6e 64 20 63 61 6e 6e 6f 74 20 61  age and cannot a
17b0: 70 70 65 61 72 20 69 6e 20 61 0a 20 20 20 20 20  ppear in a.     
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 20             ** C 
17e0: 68 65 61 64 65 72 20 66 69 6c 65 20 2a 2f 0a 23  header file */.#
17f0: 64 65 66 69 6e 65 20 44 50 5f 45 78 74 65 72 6e  define DP_Extern
1800: 43 52 65 71 64 20 20 30 78 30 34 30 20 20 20 2f  CReqd  0x040   /
1810: 2a 20 50 72 65 70 65 6e 64 20 27 65 78 74 65 72  * Prepend 'exter
1820: 6e 20 22 43 22 27 20 69 6e 20 61 20 43 2b 2b 20  n "C"' in a C++ 
1830: 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 20 20 20 20 20 20 20 2a 2a 20 50 72 65 70 65          ** Prepe
1860: 6e 64 20 6e 6f 74 68 69 6e 67 20 69 6e 20 61 20  nd nothing in a 
1870: 43 20 68 65 61 64 65 72 20 2a 2f 0a 23 64 65 66  C header */.#def
1880: 69 6e 65 20 44 50 5f 45 78 74 65 72 6e 52 65 71  ine DP_ExternReq
1890: 64 20 20 20 30 78 30 38 30 20 20 20 2f 2a 20 50  d   0x080   /* P
18a0: 72 65 70 65 6e 64 20 27 65 78 74 65 72 6e 20 22  repend 'extern "
18b0: 43 22 27 20 69 6e 20 61 20 43 2b 2b 20 68 65 61  C"' in a C++ hea
18c0: 64 65 72 20 69 66 0a 20 20 20 20 20 20 20 20 20  der if.         
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 20 20 20 2a 2a 20 44 50 5f 43 70 6c         ** DP_Cpl
18f0: 75 73 70 6c 75 73 20 69 73 20 6e 6f 74 20 61 6c  usplus is not al
1900: 73 6f 20 73 65 74 2e 20 49 66 20 44 50 5f 43 70  so set. If DP_Cp
1910: 6c 75 73 70 6c 75 73 0a 20 20 20 20 20 20 20 20  lusplus.        
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65          ** is se
1940: 74 20 6f 72 20 74 68 69 73 20 69 73 20 61 20 43  t or this is a C
1950: 20 68 65 61 64 65 72 20 74 68 65 6e 0a 20 20 20   header then.   
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1980: 70 72 65 70 65 6e 64 20 27 65 78 74 65 72 6e 27  prepend 'extern'
1990: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65   */../*.** Conve
19a0: 6e 69 65 6e 63 65 20 6d 61 63 72 6f 73 20 66 6f  nience macros fo
19b0: 72 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 64  r dealing with d
19c0: 65 63 6c 61 72 61 74 69 6f 6e 20 70 72 6f 70 65  eclaration prope
19d0: 72 74 69 65 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  rties.*/.#define
19e0: 20 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79   DeclHasProperty
19f0: 28 44 2c 50 29 20 20 20 20 28 28 28 44 29 2d 3e  (D,P)    (((D)->
1a00: 66 6c 61 67 73 26 28 50 29 29 3d 3d 28 50 29 29  flags&(P))==(P))
1a10: 0a 23 64 65 66 69 6e 65 20 44 65 63 6c 48 61 73  .#define DeclHas
1a20: 41 6e 79 50 72 6f 70 65 72 74 79 28 44 2c 50 29  AnyProperty(D,P)
1a30: 20 28 28 28 44 29 2d 3e 66 6c 61 67 73 26 28 50   (((D)->flags&(P
1a40: 29 29 21 3d 30 29 0a 23 64 65 66 69 6e 65 20 44  ))!=0).#define D
1a50: 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 44  eclSetProperty(D
1a60: 2c 50 29 20 20 20 20 28 44 29 2d 3e 66 6c 61 67  ,P)    (D)->flag
1a70: 73 20 7c 3d 20 28 50 29 0a 23 64 65 66 69 6e 65  s |= (P).#define
1a80: 20 44 65 63 6c 43 6c 65 61 72 50 72 6f 70 65 72   DeclClearProper
1a90: 74 79 28 44 2c 50 29 20 20 28 44 29 2d 3e 66 6c  ty(D,P)  (D)->fl
1aa0: 61 67 73 20 26 3d 20 7e 28 50 29 0a 0a 2f 2a 0a  ags &= ~(P)../*.
1ab0: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 73 74 61  ** These are sta
1ac0: 74 65 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66  te properties of
1ad0: 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 45 61   the parser.  Ea
1ae0: 63 68 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73  ch of the values
1af0: 20 69 73 0a 2a 2a 20 64 69 73 74 69 6e 63 74 20   is.** distinct 
1b00: 66 72 6f 6d 20 74 68 65 20 44 50 5f 20 76 61 6c  from the DP_ val
1b10: 75 65 73 20 61 62 6f 76 65 20 73 6f 20 74 68 61  ues above so tha
1b20: 74 20 62 6f 74 68 20 63 61 6e 20 62 65 20 75 73  t both can be us
1b30: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 73 61 6d  ed in.** the sam
1b40: 65 20 22 66 6c 61 67 73 22 20 66 69 65 6c 64 2e  e "flags" field.
1b50: 0a 2a 2a 0a 2a 2a 20 42 65 20 63 61 72 65 66 75  .**.** Be carefu
1b60: 6c 20 6e 6f 74 20 74 6f 20 63 6f 6e 66 75 73 65  l not to confuse
1b70: 20 50 53 5f 45 78 70 6f 72 74 20 77 69 74 68 20   PS_Export with 
1b80: 44 50 5f 45 78 70 6f 72 74 20 6f 72 0a 2a 2a 20  DP_Export or.** 
1b90: 50 53 5f 4c 6f 63 61 6c 20 77 69 74 68 20 44 50  PS_Local with DP
1ba0: 5f 4c 6f 63 61 6c 2e 20 20 54 68 65 69 72 20 6e  _Local.  Their n
1bb0: 61 6d 65 73 20 61 72 65 20 73 69 6d 69 6c 61 72  ames are similar
1bc0: 2c 20 62 75 74 20 74 68 65 20 6d 65 61 6e 69 6e  , but the meanin
1bd0: 67 73 0a 2a 2a 20 6f 66 20 74 68 65 73 65 20 66  gs.** of these f
1be0: 6c 61 67 73 20 61 72 65 20 76 65 72 79 20 64 69  lags are very di
1bf0: 66 66 65 72 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66  fferent..*/.#def
1c00: 69 6e 65 20 50 53 5f 45 78 74 65 72 6e 20 20 20  ine PS_Extern   
1c10: 20 20 20 20 20 30 78 30 30 30 38 30 30 20 20 20       0x000800   
1c20: 20 2f 2a 20 22 65 78 74 65 72 6e 22 20 68 61 73   /* "extern" has
1c30: 20 62 65 65 6e 20 73 65 65 6e 20 2a 2f 0a 23 64   been seen */.#d
1c40: 65 66 69 6e 65 20 50 53 5f 45 78 70 6f 72 74 20  efine PS_Export 
1c50: 20 20 20 20 20 20 20 30 78 30 30 31 30 30 30 20         0x001000 
1c60: 20 20 20 2f 2a 20 49 66 20 62 65 74 77 65 65 6e     /* If between
1c70: 20 22 23 69 66 20 45 58 50 4f 52 54 5f 49 4e 54   "#if EXPORT_INT
1c80: 45 52 46 41 43 45 22 20 0a 20 20 20 20 20 20 20  ERFACE" .       
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1cb0: 20 61 6e 64 20 22 23 65 6e 64 69 66 22 20 2a 2f   and "#endif" */
1cc0: 0a 23 64 65 66 69 6e 65 20 50 53 5f 45 78 70 6f  .#define PS_Expo
1cd0: 72 74 32 20 20 20 20 20 20 20 30 78 30 30 32 30  rt2       0x0020
1ce0: 30 30 20 20 20 20 2f 2a 20 49 66 20 22 45 58 50  00    /* If "EXP
1cf0: 4f 52 54 22 20 73 65 65 6e 20 2a 2f 0a 23 64 65  ORT" seen */.#de
1d00: 66 69 6e 65 20 50 53 5f 54 79 70 65 64 65 66 20  fine PS_Typedef 
1d10: 20 20 20 20 20 20 30 78 30 30 34 30 30 30 20 20        0x004000  
1d20: 20 20 2f 2a 20 49 66 20 22 74 79 70 65 64 65 66    /* If "typedef
1d30: 22 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  " has been seen 
1d40: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 53 74  */.#define PS_St
1d50: 61 74 69 63 20 20 20 20 20 20 20 20 30 78 30 30  atic        0x00
1d60: 38 30 30 30 20 20 20 20 2f 2a 20 49 66 20 22 73  8000    /* If "s
1d70: 74 61 74 69 63 22 20 68 61 73 20 62 65 65 6e 20  tatic" has been 
1d80: 73 65 65 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  seen */.#define 
1d90: 50 53 5f 49 6e 74 65 72 66 61 63 65 20 20 20 20  PS_Interface    
1da0: 20 30 78 30 31 30 30 30 30 20 20 20 20 2f 2a 20   0x010000    /* 
1db0: 49 66 20 77 69 74 68 69 6e 20 23 69 66 20 49 4e  If within #if IN
1dc0: 54 45 52 46 41 43 45 2e 2e 23 65 6e 64 69 66 20  TERFACE..#endif 
1dd0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 4d 65  */.#define PS_Me
1de0: 74 68 6f 64 20 20 20 20 20 20 20 20 30 78 30 32  thod        0x02
1df0: 30 30 30 30 20 20 20 20 2f 2a 20 49 66 20 22 3a  0000    /* If ":
1e00: 3a 22 20 74 6f 6b 65 6e 20 68 61 73 20 62 65 65  :" token has bee
1e10: 6e 20 73 65 65 6e 20 2a 2f 0a 23 64 65 66 69 6e  n seen */.#defin
1e20: 65 20 50 53 5f 4c 6f 63 61 6c 20 20 20 20 20 20  e PS_Local      
1e30: 20 20 20 30 78 30 34 30 30 30 30 20 20 20 20 2f     0x040000    /
1e40: 2a 20 49 66 20 77 69 74 68 69 6e 20 23 69 66 20  * If within #if 
1e50: 4c 4f 43 41 4c 5f 49 4e 54 45 52 46 41 43 45 2e  LOCAL_INTERFACE.
1e60: 2e 23 65 6e 64 69 66 20 2a 2f 0a 23 64 65 66 69  .#endif */.#defi
1e70: 6e 65 20 50 53 5f 4c 6f 63 61 6c 32 20 20 20 20  ne PS_Local2    
1e80: 20 20 20 20 30 78 30 38 30 30 30 30 20 20 20 20      0x080000    
1e90: 2f 2a 20 49 66 20 22 4c 4f 43 41 4c 22 20 73 65  /* If "LOCAL" se
1ea0: 65 6e 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  en. */.#define P
1eb0: 53 5f 50 75 62 6c 69 63 20 20 20 20 20 20 20 20  S_Public        
1ec0: 30 78 31 30 30 30 30 30 20 20 20 20 2f 2a 20 49  0x100000    /* I
1ed0: 66 20 22 50 55 42 4c 49 43 22 20 73 65 65 6e 2e  f "PUBLIC" seen.
1ee0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 50   */.#define PS_P
1ef0: 72 6f 74 65 63 74 65 64 20 20 20 20 20 30 78 32  rotected     0x2
1f00: 30 30 30 30 30 20 20 20 20 2f 2a 20 49 66 20 22  00000    /* If "
1f10: 50 52 4f 54 45 43 54 45 44 22 20 73 65 65 6e 2e  PROTECTED" seen.
1f20: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 50   */.#define PS_P
1f30: 72 69 76 61 74 65 20 20 20 20 20 20 20 30 78 34  rivate       0x4
1f40: 30 30 30 30 30 20 20 20 20 2f 2a 20 49 66 20 22  00000    /* If "
1f50: 50 52 49 56 41 54 45 22 20 73 65 65 6e 2e 20 2a  PRIVATE" seen. *
1f60: 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 50 50 50  /.#define PS_PPP
1f70: 20 20 20 20 20 20 20 20 20 20 20 30 78 37 30 30             0x700
1f80: 30 30 30 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  000    /* If any
1f90: 20 6f 66 20 50 55 42 4c 49 43 2c 20 50 52 49 56   of PUBLIC, PRIV
1fa0: 41 54 45 2c 20 50 52 4f 54 45 43 54 45 44 20 2a  ATE, PROTECTED *
1fb0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
1fc0: 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 66 6c  lowing set of fl
1fd0: 61 67 73 20 61 72 65 20 4f 52 65 64 20 69 6e 74  ags are ORed int
1fe0: 6f 20 74 68 65 20 22 66 6c 61 67 73 22 20 66 69  o the "flags" fi
1ff0: 65 6c 64 20 6f 66 0a 2a 2a 20 61 20 44 65 63 6c  eld of.** a Decl
2000: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 64 65   in order to ide
2010: 6e 74 69 66 79 20 77 68 61 74 20 74 79 70 65 20  ntify what type 
2020: 6f 66 20 6f 62 6a 65 63 74 20 69 73 20 62 65 69  of object is bei
2030: 6e 67 0a 2a 2a 20 64 65 63 6c 61 72 65 64 2e 0a  ng.** declared..
2040: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 59 5f 43 6c  */.#define TY_Cl
2050: 61 73 73 20 20 20 20 20 20 20 20 20 30 78 30 30  ass         0x00
2060: 31 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 54  100000.#define T
2070: 59 5f 53 75 62 72 6f 75 74 69 6e 65 20 20 20 20  Y_Subroutine    
2080: 30 78 30 30 32 30 30 30 30 30 0a 23 64 65 66 69  0x00200000.#defi
2090: 6e 65 20 54 59 5f 4d 61 63 72 6f 20 20 20 20 20  ne TY_Macro     
20a0: 20 20 20 20 30 78 30 30 34 30 30 30 30 30 0a 23      0x00400000.#
20b0: 64 65 66 69 6e 65 20 54 59 5f 54 79 70 65 64 65  define TY_Typede
20c0: 66 20 20 20 20 20 20 20 30 78 30 30 38 30 30 30  f       0x008000
20d0: 30 30 0a 23 64 65 66 69 6e 65 20 54 59 5f 56 61  00.#define TY_Va
20e0: 72 69 61 62 6c 65 20 20 20 20 20 20 30 78 30 31  riable      0x01
20f0: 30 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 54  000000.#define T
2100: 59 5f 53 74 72 75 63 74 75 72 65 20 20 20 20 20  Y_Structure     
2110: 30 78 30 32 30 30 30 30 30 30 0a 23 64 65 66 69  0x02000000.#defi
2120: 6e 65 20 54 59 5f 55 6e 69 6f 6e 20 20 20 20 20  ne TY_Union     
2130: 20 20 20 20 30 78 30 34 30 30 30 30 30 30 0a 23      0x04000000.#
2140: 64 65 66 69 6e 65 20 54 59 5f 45 6e 75 6d 65 72  define TY_Enumer
2150: 61 74 69 6f 6e 20 20 20 30 78 30 38 30 30 30 30  ation   0x080000
2160: 30 30 0a 23 64 65 66 69 6e 65 20 54 59 5f 44 65  00.#define TY_De
2170: 66 75 6e 63 74 20 20 20 20 20 20 20 30 78 31 30  funct       0x10
2180: 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 64 20  000000  /* Used 
2190: 74 6f 20 65 72 61 73 65 20 61 20 64 65 63 6c 61  to erase a decla
21a0: 72 61 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ration */../*.**
21b0: 20 45 61 63 68 20 6e 65 73 74 65 64 20 23 69 66   Each nested #if
21c0: 20 28 6f 72 20 23 69 66 64 65 66 20 6f 72 20 23   (or #ifdef or #
21d0: 69 66 6e 64 65 66 29 20 69 73 20 73 74 6f 72 65  ifndef) is store
21e0: 64 20 69 6e 20 61 20 73 74 61 63 6b 20 6f 66 20  d in a stack of 
21f0: 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  .** instances of
2200: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2210: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
2220: 65 64 65 66 20 73 74 72 75 63 74 20 49 66 6d 61  edef struct Ifma
2230: 63 72 6f 20 49 66 6d 61 63 72 6f 3b 0a 73 74 72  cro Ifmacro;.str
2240: 75 63 74 20 49 66 6d 61 63 72 6f 20 7b 0a 20 20  uct Ifmacro {.  
2250: 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20  int nLine;      
2260: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
2270: 72 20 77 68 65 72 65 20 74 68 69 73 20 6d 61 63  r where this mac
2280: 72 6f 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 63  ro occurs */.  c
2290: 68 61 72 20 2a 7a 43 6f 6e 64 69 74 69 6f 6e 3b  har *zCondition;
22a0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
22b0: 20 63 6f 6e 64 69 74 69 6f 6e 20 66 6f 72 20 74   condition for t
22c0: 68 69 73 20 6d 61 63 72 6f 20 2a 2f 0a 20 20 49  his macro */.  I
22d0: 66 6d 61 63 72 6f 20 2a 70 4e 65 78 74 3b 20 20  fmacro *pNext;  
22e0: 20 20 2f 2a 20 4e 65 78 74 20 64 6f 77 6e 20 69    /* Next down i
22f0: 6e 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 20  n the stack */. 
2300: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
2310: 20 20 20 20 2f 2a 20 43 61 6e 20 68 6f 6c 64 20      /* Can hold 
2320: 50 53 5f 45 78 70 6f 72 74 2c 20 50 53 5f 49 6e  PS_Export, PS_In
2330: 74 65 72 66 61 63 65 20 6f 72 20 50 53 5f 4c 6f  terface or PS_Lo
2340: 63 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 7d 3b 0a  cal flags */.};.
2350: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 70 61 72 73  ./*.** When pars
2360: 69 6e 67 20 61 20 66 69 6c 65 2c 20 77 65 20 6e  ing a file, we n
2370: 65 65 64 20 74 6f 20 6b 65 65 70 20 74 72 61 63  eed to keep trac
2380: 6b 20 6f 66 20 77 68 61 74 20 6f 74 68 65 72 20  k of what other 
2390: 66 69 6c 65 73 20 68 61 76 65 0a 2a 2a 20 62 65  files have.** be
23a0: 20 23 69 6e 63 6c 75 64 65 2d 65 64 2e 20 20 46   #include-ed.  F
23b0: 6f 72 20 65 61 63 68 20 23 69 6e 63 6c 75 64 65  or each #include
23c0: 20 66 6f 75 6e 64 2c 20 77 65 20 63 72 65 61 74   found, we creat
23d0: 65 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  e an instance of
23e0: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
23f0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
2400: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49  typedef struct I
2410: 6e 63 6c 75 64 65 20 49 6e 63 6c 75 64 65 3b 0a  nclude Include;.
2420: 73 74 72 75 63 74 20 49 6e 63 6c 75 64 65 20 7b  struct Include {
2430: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20  .  char *zFile; 
2440: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d        /* The nam
2450: 65 20 6f 66 20 66 69 6c 65 20 69 6e 63 6c 75 64  e of file includ
2460: 65 2e 20 20 49 6e 63 6c 75 64 65 73 20 22 22 20  e.  Includes "" 
2470: 6f 72 20 3c 3e 20 2a 2f 0a 20 20 63 68 61 72 20  or <> */.  char 
2480: 2a 7a 49 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  *zIf;         /*
2490: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 23 69   If not NULL, #i
24a0: 6e 63 6c 75 64 65 20 73 68 6f 75 6c 64 20 62 65  nclude should be
24b0: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 23 69 66   enclosed in #if
24c0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 61 62   */.  char *zLab
24d0: 65 6c 3b 20 20 20 20 20 20 2f 2a 20 41 20 75 6e  el;      /* A un
24e0: 69 71 75 65 20 6c 61 62 65 6c 20 75 73 65 64 20  ique label used 
24f0: 74 6f 20 74 65 73 74 20 69 66 20 74 68 69 73 20  to test if this 
2500: 23 69 6e 63 6c 75 64 65 20 68 61 73 0a 20 20 20  #include has.   
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 2a 20 61 70 70 65 61 72 65 64 20 61 6c     * appeared al
2530: 72 65 61 64 79 20 69 6e 20 61 20 66 69 6c 65 20  ready in a file 
2540: 6f 72 20 6e 6f 74 20 2a 2f 0a 20 20 49 6e 63 6c  or not */.  Incl
2550: 75 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 2f  ude *pNext;    /
2560: 2a 20 50 72 65 76 69 6f 75 73 20 69 6e 63 6c 75  * Previous inclu
2570: 64 65 20 66 69 6c 65 2c 20 6f 72 20 4e 55 4c 4c  de file, or NULL
2580: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
2590: 66 69 72 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  first */.};../*.
25a0: 2a 2a 20 49 64 65 6e 74 69 66 69 65 72 73 20 66  ** Identifiers f
25b0: 6f 75 6e 64 20 69 6e 20 61 20 73 6f 75 72 63 65  ound in a source
25c0: 20 66 69 6c 65 20 74 68 61 74 20 6d 69 67 68 74   file that might
25d0: 20 62 65 20 75 73 65 64 20 6c 61 74 65 72 20 74   be used later t
25e0: 6f 20 70 72 6f 76 6f 6b 65 0a 2a 2a 20 74 68 65  o provoke.** the
25f0: 20 63 6f 70 79 69 6e 67 20 6f 66 20 61 20 64 65   copying of a de
2600: 63 6c 61 72 61 74 69 6f 6e 20 69 6e 74 6f 20 74  claration into t
2610: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2620: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 72 65   header file are
2630: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20  .** stored in a 
2640: 68 61 73 68 20 74 61 62 6c 65 20 61 73 20 69 6e  hash table as in
2650: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66  stances of the f
2660: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2670: 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  re..*/.typedef s
2680: 74 72 75 63 74 20 49 64 65 6e 74 20 49 64 65 6e  truct Ident Iden
2690: 74 3b 0a 73 74 72 75 63 74 20 49 64 65 6e 74 20  t;.struct Ident 
26a0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
26b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
26c0: 65 78 74 20 6f 66 20 74 68 69 73 20 69 64 65 6e  ext of this iden
26d0: 74 69 66 69 65 72 20 2a 2f 0a 20 20 49 64 65 6e  tifier */.  Iden
26e0: 74 20 2a 70 43 6f 6c 6c 69 64 65 3b 20 20 20 20  t *pCollide;    
26f0: 2f 2a 20 4e 65 78 74 20 69 64 65 6e 74 69 66 69  /* Next identifi
2700: 65 72 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  er with the same
2710: 20 68 61 73 68 20 2a 2f 0a 20 20 49 64 65 6e 74   hash */.  Ident
2720: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f   *pNext;       /
2730: 2a 20 4e 65 78 74 20 69 64 65 6e 74 69 66 69 65  * Next identifie
2740: 72 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  r in a list of t
2750: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  hem all */.};../
2760: 2a 0a 2a 2a 20 41 20 63 6f 6d 70 6c 65 74 65 20  *.** A complete 
2770: 74 61 62 6c 65 20 6f 66 20 69 64 65 6e 74 69 66  table of identif
2780: 69 65 72 73 20 69 73 20 73 74 6f 72 65 64 20 69  iers is stored i
2790: 6e 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  n an instance of
27a0: 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 73 74 72  .** the next str
27b0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 23 64 65 66 69  ucture..*/.#defi
27c0: 6e 65 20 49 44 45 4e 54 5f 48 41 53 48 5f 53 49  ne IDENT_HASH_SI
27d0: 5a 45 20 32 32 33 37 0a 74 79 70 65 64 65 66 20  ZE 2237.typedef 
27e0: 73 74 72 75 63 74 20 49 64 65 6e 74 54 61 62 6c  struct IdentTabl
27f0: 65 20 49 64 65 6e 74 54 61 62 6c 65 3b 0a 73 74  e IdentTable;.st
2800: 72 75 63 74 20 49 64 65 6e 74 54 61 62 6c 65 20  ruct IdentTable 
2810: 7b 0a 20 20 49 64 65 6e 74 20 2a 70 4c 69 73 74  {.  Ident *pList
2820: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2830: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
2840: 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73   all identifiers
2850: 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 2a   in this table *
2860: 2f 0a 20 20 49 64 65 6e 74 20 2a 61 70 54 61 62  /.  Ident *apTab
2870: 6c 65 5b 49 44 45 4e 54 5f 48 41 53 48 5f 53 49  le[IDENT_HASH_SI
2880: 5a 45 5d 3b 20 20 2f 2a 20 54 68 65 20 68 61 73  ZE];  /* The has
2890: 68 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f  h table */.};../
28a0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
28b0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c  ng structure hol
28c0: 64 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  ds all informati
28d0: 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 0a  on for a single.
28e0: 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6e  ** source file n
28f0: 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  amed on the comm
2900: 61 6e 64 20 6c 69 6e 65 20 6f 66 20 74 68 69 73  and line of this
2910: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 74 79 70   program..*/.typ
2920: 65 64 65 66 20 73 74 72 75 63 74 20 49 6e 46 69  edef struct InFi
2930: 6c 65 20 49 6e 46 69 6c 65 3b 0a 73 74 72 75 63  le InFile;.struc
2940: 74 20 49 6e 46 69 6c 65 20 7b 0a 20 20 63 68 61  t InFile {.  cha
2950: 72 20 2a 7a 53 72 63 3b 20 20 20 20 20 20 20 20  r *zSrc;        
2960: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2970: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
2980: 20 63 68 61 72 20 2a 7a 48 64 72 3b 20 20 20 20   char *zHdr;    
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
29a0: 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74  e of the generat
29b0: 65 64 20 2e 68 20 66 69 6c 65 20 66 6f 72 20 74  ed .h file for t
29c0: 68 69 73 20 69 6e 70 75 74 2e 0a 20 20 20 20 20  his input..     
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 20 20 20 20 2a 2a 20 57 69 6c 6c 20 62 65        ** Will be
29f0: 20 4e 55 4c 4c 20 69 66 20 69 6e 70 75 74 20 69   NULL if input i
2a00: 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
2a10: 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  only */.  int fl
2a20: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
2a30: 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72     /* One or mor
2a40: 65 20 44 50 5f 2c 20 50 53 5f 20 61 6e 64 2f 6f  e DP_, PS_ and/o
2a50: 72 20 54 59 5f 20 66 6c 61 67 73 20 2a 2f 0a 20  r TY_ flags */. 
2a60: 20 49 6e 46 69 6c 65 20 2a 70 4e 65 78 74 3b 20   InFile *pNext; 
2a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
2a80: 74 20 69 6e 70 75 74 20 66 69 6c 65 20 69 6e 20  t input file in 
2a90: 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  the list of them
2aa0: 20 61 6c 6c 20 2a 2f 0a 20 20 49 64 65 6e 74 54   all */.  IdentT
2ab0: 61 62 6c 65 20 69 64 54 61 62 6c 65 3b 20 20 20  able idTable;   
2ac0: 20 20 20 2f 2a 20 41 6c 6c 20 69 64 65 6e 74 69     /* All identi
2ad0: 66 69 65 72 73 20 69 6e 20 74 68 69 73 20 69 6e  fiers in this in
2ae0: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  put file */.};..
2af0: 2f 2a 20 0a 2a 2a 20 41 6e 20 75 6e 62 6f 75 6e  /* .** An unboun
2b00: 64 65 64 20 73 74 72 69 6e 67 20 69 73 20 61 62  ded string is ab
2b10: 6c 65 20 74 6f 20 67 72 6f 77 20 77 69 74 68 6f  le to grow witho
2b20: 75 74 20 6c 69 6d 69 74 2e 20 20 57 65 20 75 73  ut limit.  We us
2b30: 65 20 74 68 65 73 65 0a 2a 2a 20 74 6f 20 63 6f  e these.** to co
2b40: 6e 73 74 72 75 63 74 20 6c 61 72 67 65 20 69 6e  nstruct large in
2b50: 2d 6d 65 6d 6f 72 79 20 73 74 72 69 6e 67 73 20  -memory strings 
2b60: 66 72 6f 6d 20 6c 6f 74 73 20 6f 66 20 73 6d 61  from lots of sma
2b70: 6c 6c 65 72 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e  ller components.
2b80: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2b90: 63 74 20 53 74 72 69 6e 67 20 53 74 72 69 6e 67  ct String String
2ba0: 3b 0a 73 74 72 75 63 74 20 53 74 72 69 6e 67 20  ;.struct String 
2bb0: 7b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20  {.  int nAlloc; 
2bc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2bd0: 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  f bytes allocate
2be0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64  d */.  int nUsed
2bf0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2c00: 72 20 6f 66 20 62 79 74 65 73 20 75 73 65 64 20  r of bytes used 
2c10: 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6e 75  (not counting nu
2c20: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 29 20 2a  ll terminator) *
2c30: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74 3b  /.  char *zText;
2c40: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
2c50: 74 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a 7d 3b  the string */.};
2c60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2c70: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2c80: 63 6f 6e 74 61 69 6e 73 20 61 20 6c 6f 74 20 6f  contains a lot o
2c90: 66 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  f state informat
2ca0: 69 6f 6e 20 75 73 65 64 0a 2a 2a 20 77 68 69 6c  ion used.** whil
2cb0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 2e  e generating a .
2cc0: 68 20 66 69 6c 65 2e 20 20 57 65 20 70 75 74 20  h file.  We put 
2cd0: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
2ce0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
2cf0: 65 0a 2a 2a 20 61 6e 64 20 70 61 73 73 20 61 72  e.** and pass ar
2d00: 6f 75 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74  ound a pointer t
2d10: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
2d20: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 61  , rather than pa
2d30: 73 73 20 61 72 6f 75 6e 64 0a 2a 2a 20 61 6c 6c  ss around.** all
2d40: 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
2d50: 69 6f 6e 20 73 65 70 61 72 61 74 65 6c 79 2e 20  ion separately. 
2d60: 20 54 68 69 73 20 68 65 6c 70 73 20 72 65 64 75   This helps redu
2d70: 63 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ce the number of
2d80: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  .** arguments to
2d90: 20 67 65 6e 65 72 61 74 6f 72 20 66 75 6e 63 74   generator funct
2da0: 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ions..*/.typedef
2db0: 20 73 74 72 75 63 74 20 47 65 6e 53 74 61 74 65   struct GenState
2dc0: 20 47 65 6e 53 74 61 74 65 3b 0a 73 74 72 75 63   GenState;.struc
2dd0: 74 20 47 65 6e 53 74 61 74 65 20 7b 0a 20 20 53  t GenState {.  S
2de0: 74 72 69 6e 67 20 2a 70 53 74 72 3b 20 20 20 20  tring *pStr;    
2df0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f        /* Write o
2e00: 75 74 70 75 74 20 74 6f 20 74 68 69 73 20 73 74  utput to this st
2e10: 72 69 6e 67 20 2a 2f 0a 20 20 49 64 65 6e 74 54  ring */.  IdentT
2e20: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20  able *pTable;   
2e30: 20 2f 2a 20 41 20 74 61 62 6c 65 20 68 6f 6c 64   /* A table hold
2e40: 69 6e 67 20 74 68 65 20 7a 4c 61 62 65 6c 20 6f  ing the zLabel o
2e50: 66 20 65 76 65 72 79 20 23 69 6e 63 6c 75 64 65  f every #include
2e60: 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
2e90: 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 55  en generated.  U
2ea0: 73 65 64 20 74 6f 20 61 76 6f 69 64 0a 20 20 20  sed to avoid.   
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 20 20 20 20 2a 20 67 65 6e 65 72 61 74         * generat
2ed0: 69 6e 67 20 64 75 70 6c 69 63 61 74 65 20 23 69  ing duplicate #i
2ee0: 6e 63 6c 75 64 65 73 2e 20 2a 2f 0a 20 20 63 6f  ncludes. */.  co
2ef0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 66 3b 20 20  nst char *zIf;  
2f00: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2f10: 55 4c 4c 2c 20 74 68 65 6e 20 77 65 20 61 72 65  ULL, then we are
2f20: 20 77 69 74 68 69 6e 20 61 20 23 69 66 20 77 69   within a #if wi
2f30: 74 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  th.             
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 74               * t
2f50: 68 69 73 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f  his argument. */
2f60: 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20  .  int nErr;    
2f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2f80: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  ber of errors */
2f90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2fa0: 46 69 6c 65 6e 61 6d 65 3b 20 2f 2a 20 4e 61 6d  Filename; /* Nam
2fb0: 65 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20  e of the source 
2fc0: 66 69 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e  file being scann
2fd0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ed */.  int flag
2fe0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
2ff0: 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20  * Various flags 
3000: 28 44 50 5f 20 61 6e 64 20 50 53 5f 20 66 6c 61  (DP_ and PS_ fla
3010: 67 73 20 61 62 6f 76 65 29 20 2a 2f 0a 7d 3b 0a  gs above) */.};.
3020: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
3030: 77 69 6e 67 20 74 65 78 74 20 6c 69 6e 65 20 61  wing text line a
3040: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 74 6f  ppears at the to
3050: 70 20 6f 66 20 65 76 65 72 79 20 66 69 6c 65 20  p of every file 
3060: 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20  generated.** by 
3070: 74 68 69 73 20 70 72 6f 67 72 61 6d 2e 20 20 42  this program.  B
3080: 79 20 72 65 63 6f 67 6e 69 7a 69 6e 67 20 74 68  y recognizing th
3090: 69 73 20 6c 69 6e 65 2c 20 74 68 65 20 70 72 6f  is line, the pro
30a0: 67 72 61 6d 20 63 61 6e 20 62 65 20 73 75 72 65  gram can be sure
30b0: 0a 2a 2a 20 6e 65 76 65 72 20 74 6f 20 72 65 61  .** never to rea
30c0: 64 20 61 20 66 69 6c 65 20 74 68 61 74 20 69 74  d a file that it
30d0: 20 67 65 6e 65 72 61 74 65 64 20 69 74 73 65 6c   generated itsel
30e0: 66 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  f..*/.const char
30f0: 20 7a 54 6f 70 4c 69 6e 65 5b 5d 20 3d 20 0a 20   zTopLine[] = . 
3100: 20 22 2f 2a 20 5c 61 54 68 69 73 20 66 69 6c 65   "/* \aThis file
3110: 20 77 61 73 20 61 75 74 6f 6d 61 74 69 63 61 6c   was automatical
3120: 6c 79 20 67 65 6e 65 72 61 74 65 64 2e 20 20 44  ly generated.  D
3130: 6f 20 6e 6f 74 20 65 64 69 74 21 20 2a 2f 5c 6e  o not edit! */\n
3140: 22 3b 0a 23 64 65 66 69 6e 65 20 6e 54 6f 70 4c  ";.#define nTopL
3150: 69 6e 65 20 28 73 69 7a 65 6f 66 28 7a 54 6f 70  ine (sizeof(zTop
3160: 4c 69 6e 65 29 2d 31 29 0a 0a 2f 2a 0a 2a 2a 20  Line)-1)../*.** 
3170: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
3180: 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62  file currently b
3190: 65 69 6e 67 20 70 61 72 73 65 64 2e 0a 2a 2f 0a  eing parsed..*/.
31a0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 46 69  static char *zFi
31b0: 6c 65 6e 61 6d 65 3b 0a 0a 2f 2a 0a 2a 2a 20 54  lename;../*.** T
31c0: 68 65 20 73 74 61 63 6b 20 6f 66 20 23 69 66 20  he stack of #if 
31d0: 6d 61 63 72 6f 73 20 66 6f 72 20 74 68 65 20 66  macros for the f
31e0: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ile currently be
31f0: 69 6e 67 20 70 61 72 73 65 64 2e 0a 2a 2f 0a 73  ing parsed..*/.s
3200: 74 61 74 69 63 20 49 66 6d 61 63 72 6f 20 2a 69  tatic Ifmacro *i
3210: 66 53 74 61 63 6b 20 3d 20 30 3b 0a 0a 2f 2a 0a  fStack = 0;../*.
3220: 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  ** A list of all
3230: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
3240: 20 62 65 65 6e 20 23 69 6e 63 6c 75 64 65 64 20   been #included 
3250: 73 6f 20 66 61 72 20 69 6e 20 61 20 66 69 6c 65  so far in a file
3260: 20 62 65 69 6e 67 0a 2a 2a 20 70 61 72 73 65 64   being.** parsed
3270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 49 6e 63 6c  ..*/.static Incl
3280: 75 64 65 20 2a 69 6e 63 6c 75 64 65 4c 69 73 74  ude *includeList
3290: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   = 0;../*.** The
32a0: 20 6c 61 73 74 20 62 6c 6f 63 6b 20 63 6f 6d 6d   last block comm
32b0: 65 6e 74 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61  ent seen..*/.sta
32c0: 74 69 63 20 54 6f 6b 65 6e 20 2a 62 6c 6f 63 6b  tic Token *block
32d0: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 0a 2f 2a  Comment = 0;../*
32e0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
32f0: 67 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 66  g flag is set if
3300: 20 74 68 65 20 2d 64 6f 63 20 66 6c 61 67 20 61   the -doc flag a
3310: 70 70 65 61 72 73 20 6f 6e 20 74 68 65 0a 2a 2a  ppears on the.**
3320: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 0a 2a   command line..*
3330: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 63  /.static int doc
3340: 5f 66 6c 61 67 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  _flag = 0;../*.*
3350: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
3360: 6e 67 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ng flag is set, 
3370: 74 68 65 6e 20 6d 61 6b 65 68 65 61 64 65 72 73  then makeheaders
3380: 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f   will attempt to
3390: 0a 2a 2a 20 67 65 6e 65 72 61 74 65 20 70 72 6f  .** generate pro
33a0: 74 6f 74 79 70 65 73 20 66 6f 72 20 73 74 61 74  totypes for stat
33b0: 69 63 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  ic functions and
33c0: 20 70 72 6f 63 65 64 75 72 65 73 2e 0a 2a 2f 0a   procedures..*/.
33d0: 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 74 6f  static int proto
33e0: 5f 73 74 61 74 69 63 20 3d 20 30 3b 0a 0a 2f 2a  _static = 0;../*
33f0: 0a 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c  .** A list of al
3400: 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 20  l declarations. 
3410: 20 54 68 65 20 6c 69 73 74 20 69 73 20 68 65 6c   The list is hel
3420: 64 20 74 6f 67 65 74 68 65 72 20 75 73 69 6e 67  d together using
3430: 20 74 68 65 0a 2a 2a 20 70 4e 65 78 74 20 66 69   the.** pNext fi
3440: 65 6c 64 20 6f 66 20 74 68 65 20 44 65 63 6c 20  eld of the Decl 
3450: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
3460: 61 74 69 63 20 44 65 63 6c 20 2a 70 44 65 63 6c  atic Decl *pDecl
3470: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
3480: 73 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a  st on the list *
3490: 2f 0a 73 74 61 74 69 63 20 44 65 63 6c 20 2a 70  /.static Decl *p
34a0: 44 65 63 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a  DeclLast;     /*
34b0: 20 4c 61 73 74 20 6f 6e 20 74 68 65 20 6c 69 73   Last on the lis
34c0: 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 68 61  t */../*.** A ha
34d0: 73 68 20 74 61 62 6c 65 20 6f 66 20 61 6c 6c 20  sh table of all 
34e0: 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 2a 2f 0a  declarations.*/.
34f0: 23 64 65 66 69 6e 65 20 44 45 43 4c 5f 48 41 53  #define DECL_HAS
3500: 48 5f 53 49 5a 45 20 33 33 37 31 0a 73 74 61 74  H_SIZE 3371.stat
3510: 69 63 20 44 65 63 6c 20 2a 61 70 54 61 62 6c 65  ic Decl *apTable
3520: 5b 44 45 43 4c 5f 48 41 53 48 5f 53 49 5a 45 5d  [DECL_HASH_SIZE]
3530: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 45 53  ;../*.** The TES
3540: 54 20 6d 61 63 72 6f 20 6d 75 73 74 20 62 65 20  T macro must be 
3550: 64 65 66 69 6e 65 64 20 74 6f 20 73 6f 6d 65 74  defined to somet
3560: 68 69 6e 67 2e 20 20 4d 61 6b 65 20 73 75 72 65  hing.  Make sure
3570: 20 74 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20   this is the.** 
3580: 63 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  case..*/.#ifndef
3590: 20 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54   TEST.# define T
35a0: 45 53 54 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69  EST 0.#endif..#i
35b0: 66 64 65 66 20 4e 4f 54 5f 55 53 45 44 0a 2f 2a  fdef NOT_USED./*
35c0: 0a 2a 2a 20 57 65 20 64 6f 20 6f 75 72 20 6f 77  .** We do our ow
35d0: 6e 20 61 73 73 65 72 74 69 6f 6e 20 6d 61 63 72  n assertion macr
35e0: 6f 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  o so that we can
35f0: 20 68 61 76 65 20 6d 6f 72 65 20 63 6f 6e 74 72   have more contr
3600: 6f 6c 0a 2a 2a 20 6f 76 65 72 20 64 65 62 75 67  ol.** over debug
3610: 67 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ging..*/.#define
3620: 20 41 73 73 65 72 74 28 58 29 20 20 20 20 69 66   Assert(X)    if
3630: 28 21 28 58 29 29 7b 20 43 61 6e 74 48 61 70 70  (!(X)){ CantHapp
3640: 65 6e 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 7d 0a  en(__LINE__); }.
3650: 23 64 65 66 69 6e 65 20 43 41 4e 54 5f 48 41 50  #define CANT_HAP
3660: 50 45 4e 20 20 43 61 6e 74 48 61 70 70 65 6e 28  PEN  CantHappen(
3670: 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63  __LINE__).static
3680: 20 76 6f 69 64 20 43 61 6e 74 48 61 70 70 65 6e   void CantHappen
3690: 28 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 66  (int iLine){.  f
36a0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 41  printf(stderr,"A
36b0: 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 65 64 20  ssertion failed 
36c0: 6f 6e 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 69 4c  on line %d\n",iL
36d0: 69 6e 65 29 3b 0a 20 20 2a 28 63 68 61 72 2a 29  ine);.  *(char*)
36e0: 31 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 63 65  1 = 0;  /* Force
36f0: 20 61 20 63 6f 72 65 2d 64 75 6d 70 20 2a 2f 0a   a core-dump */.
3700: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3710: 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  Memory allocatio
3720: 6e 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  n functions that
3730: 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
3740: 6e 65 76 65 72 20 74 6f 20 72 65 74 75 72 6e 20  never to return 
3750: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
3760: 76 6f 69 64 20 2a 53 61 66 65 4d 61 6c 6c 6f 63  void *SafeMalloc
3770: 28 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76  (int nByte){.  v
3780: 6f 69 64 20 2a 70 20 3d 20 6d 61 6c 6c 6f 63 28  oid *p = malloc(
3790: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
37a0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  p==0 ){.    fpri
37b0: 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20  ntf(stderr,"Out 
37c0: 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 43 61 6e 27  of memory.  Can'
37d0: 74 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 62 79  t allocate %d by
37e0: 74 65 73 2e 5c 6e 22 2c 6e 42 79 74 65 29 3b 0a  tes.\n",nByte);.
37f0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
3800: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 73  .  return p;.}.s
3810: 74 61 74 69 63 20 76 6f 69 64 20 53 61 66 65 46  tatic void SafeF
3820: 72 65 65 28 76 6f 69 64 20 2a 70 4f 6c 64 29 7b  ree(void *pOld){
3830: 0a 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20  .  if( pOld ){. 
3840: 20 20 20 66 72 65 65 28 70 4f 6c 64 29 3b 0a 20     free(pOld);. 
3850: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
3860: 20 2a 53 61 66 65 52 65 61 6c 6c 6f 63 28 76 6f   *SafeRealloc(vo
3870: 69 64 20 2a 70 4f 6c 64 2c 20 69 6e 74 20 6e 42  id *pOld, int nB
3880: 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b  yte){.  void *p;
3890: 0a 20 20 69 66 28 20 70 4f 6c 64 3d 3d 30 20 29  .  if( pOld==0 )
38a0: 7b 0a 20 20 20 20 70 20 3d 20 53 61 66 65 4d 61  {.    p = SafeMa
38b0: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 7d  lloc(nByte);.  }
38c0: 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 72 65  else{.    p = re
38d0: 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 42 79 74  alloc(pOld, nByt
38e0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  e);.    if( p==0
38f0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
3900: 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
3910: 20 20 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79    "Out of memory
3920: 2e 20 20 43 61 6e 27 74 20 65 6e 6c 61 72 67 65  .  Can't enlarge
3930: 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 74   an allocation t
3940: 6f 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 6e 42  o %d bytes\n",nB
3950: 79 74 65 29 3b 0a 20 20 20 20 20 20 65 78 69 74  yte);.      exit
3960: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (1);.    }.  }. 
3970: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 73 74 61   return p;.}.sta
3980: 74 69 63 20 63 68 61 72 20 2a 53 74 72 44 75 70  tic char *StrDup
3990: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72  (const char *zSr
39a0: 63 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20  c, int nByte){. 
39b0: 20 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20   char *zDest;.  
39c0: 69 66 28 20 6e 42 79 74 65 3c 3d 30 20 29 7b 0a  if( nByte<=0 ){.
39d0: 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c      nByte = strl
39e0: 65 6e 28 7a 53 72 63 29 3b 0a 20 20 7d 0a 20 20  en(zSrc);.  }.  
39f0: 7a 44 65 73 74 20 3d 20 53 61 66 65 4d 61 6c 6c  zDest = SafeMall
3a00: 6f 63 28 20 6e 42 79 74 65 20 2b 20 31 20 29 3b  oc( nByte + 1 );
3a10: 0a 20 20 73 74 72 6e 63 70 79 28 7a 44 65 73 74  .  strncpy(zDest
3a20: 2c 7a 53 72 63 2c 6e 42 79 74 65 29 3b 0a 20 20  ,zSrc,nByte);.  
3a30: 7a 44 65 73 74 5b 6e 42 79 74 65 5d 20 3d 20 30  zDest[nByte] = 0
3a40: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44 65 73 74  ;.  return zDest
3a50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3a60: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 68  n TRUE if the ch
3a70: 61 72 61 63 74 65 72 20 58 20 63 61 6e 20 62 65  aracter X can be
3a80: 20 70 61 72 74 20 6f 66 20 61 6e 20 69 64 65 6e   part of an iden
3a90: 74 69 66 69 65 72 0a 2a 2f 0a 23 64 65 66 69 6e  tifier.*/.#defin
3aa0: 65 20 49 53 41 4c 4e 55 4d 28 58 29 20 20 28 28  e ISALNUM(X)  ((
3ab0: 58 29 3d 3d 27 5f 27 20 7c 7c 20 69 73 61 6c 6e  X)=='_' || isaln
3ac0: 75 6d 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 6f  um(X))../*.** Ro
3ad0: 75 74 69 6e 65 73 20 66 6f 72 20 64 65 61 6c 69  utines for deali
3ae0: 6e 67 20 77 69 74 68 20 75 6e 62 6f 75 6e 64 65  ng with unbounde
3af0: 64 20 73 74 72 69 6e 67 73 2e 0a 2a 2f 0a 73 74  d strings..*/.st
3b00: 61 74 69 63 20 76 6f 69 64 20 53 74 72 69 6e 67  atic void String
3b10: 49 6e 69 74 28 53 74 72 69 6e 67 20 2a 70 53 74  Init(String *pSt
3b20: 72 29 7b 0a 20 20 70 53 74 72 2d 3e 6e 41 6c 6c  r){.  pStr->nAll
3b30: 6f 63 20 3d 20 30 3b 0a 20 20 70 53 74 72 2d 3e  oc = 0;.  pStr->
3b40: 6e 55 73 65 64 20 3d 20 30 3b 0a 20 20 70 53 74  nUsed = 0;.  pSt
3b50: 72 2d 3e 7a 54 65 78 74 20 3d 20 30 3b 0a 7d 0a  r->zText = 0;.}.
3b60: 73 74 61 74 69 63 20 76 6f 69 64 20 53 74 72 69  static void Stri
3b70: 6e 67 52 65 73 65 74 28 53 74 72 69 6e 67 20 2a  ngReset(String *
3b80: 70 53 74 72 29 7b 0a 20 20 53 61 66 65 46 72 65  pStr){.  SafeFre
3b90: 65 28 70 53 74 72 2d 3e 7a 54 65 78 74 29 3b 0a  e(pStr->zText);.
3ba0: 20 20 53 74 72 69 6e 67 49 6e 69 74 28 70 53 74    StringInit(pSt
3bb0: 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  r);.}.static voi
3bc0: 64 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 53  d StringAppend(S
3bd0: 74 72 69 6e 67 20 2a 70 53 74 72 2c 20 63 6f 6e  tring *pStr, con
3be0: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20  st char *zText, 
3bf0: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  int nByte){.  if
3c00: 28 20 6e 42 79 74 65 3c 3d 30 20 29 7b 0a 20 20  ( nByte<=0 ){.  
3c10: 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e    nByte = strlen
3c20: 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69  (zText);.  }.  i
3c30: 66 28 20 70 53 74 72 2d 3e 6e 55 73 65 64 20 2b  f( pStr->nUsed +
3c40: 20 6e 42 79 74 65 20 3e 3d 20 70 53 74 72 2d 3e   nByte >= pStr->
3c50: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 66  nAlloc ){.    if
3c60: 28 20 70 53 74 72 2d 3e 6e 41 6c 6c 6f 63 3d 3d  ( pStr->nAlloc==
3c70: 30 20 29 7b 0a 20 20 20 20 20 20 70 53 74 72 2d  0 ){.      pStr-
3c80: 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 42 79 74 65 20  >nAlloc = nByte 
3c90: 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 70 53 74  + 100;.      pSt
3ca0: 72 2d 3e 7a 54 65 78 74 20 3d 20 53 61 66 65 4d  r->zText = SafeM
3cb0: 61 6c 6c 6f 63 28 20 70 53 74 72 2d 3e 6e 41 6c  alloc( pStr->nAl
3cc0: 6c 6f 63 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc );.    }else
3cd0: 7b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 6e 41  {.      pStr->nA
3ce0: 6c 6c 6f 63 20 3d 20 70 53 74 72 2d 3e 6e 41 6c  lloc = pStr->nAl
3cf0: 6c 6f 63 2a 32 20 2b 20 6e 42 79 74 65 3b 0a 20  loc*2 + nByte;. 
3d00: 20 20 20 20 20 70 53 74 72 2d 3e 7a 54 65 78 74       pStr->zText
3d10: 20 3d 20 53 61 66 65 52 65 61 6c 6c 6f 63 28 70   = SafeRealloc(p
3d20: 53 74 72 2d 3e 7a 54 65 78 74 2c 20 70 53 74 72  Str->zText, pStr
3d30: 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d  ->nAlloc);.    }
3d40: 0a 20 20 7d 0a 20 20 73 74 72 6e 63 70 79 28 26  .  }.  strncpy(&
3d50: 70 53 74 72 2d 3e 7a 54 65 78 74 5b 70 53 74 72  pStr->zText[pStr
3d60: 2d 3e 6e 55 73 65 64 5d 2c 7a 54 65 78 74 2c 6e  ->nUsed],zText,n
3d70: 42 79 74 65 29 3b 0a 20 20 70 53 74 72 2d 3e 6e  Byte);.  pStr->n
3d80: 55 73 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  Used += nByte;. 
3d90: 20 70 53 74 72 2d 3e 7a 54 65 78 74 5b 70 53 74   pStr->zText[pSt
3da0: 72 2d 3e 6e 55 73 65 64 5d 20 3d 20 30 3b 0a 7d  r->nUsed] = 0;.}
3db0: 0a 23 64 65 66 69 6e 65 20 53 74 72 69 6e 67 47  .#define StringG
3dc0: 65 74 28 53 29 20 28 28 53 29 2d 3e 7a 54 65 78  et(S) ((S)->zTex
3dd0: 74 3f 28 53 29 2d 3e 7a 54 65 78 74 3a 22 22 29  t?(S)->zText:"")
3de0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
3df0: 61 20 68 61 73 68 20 6f 6e 20 61 20 73 74 72 69  a hash on a stri
3e00: 6e 67 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  ng.  The number 
3e10: 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 6e 6f  returned is a no
3e20: 6e 2d 6e 65 67 61 74 69 76 65 0a 2a 2a 20 76 61  n-negative.** va
3e30: 6c 75 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e  lue between 0 an
3e40: 64 20 32 2a 2a 33 31 20 2d 20 31 0a 2a 2f 0a 73  d 2**31 - 1.*/.s
3e50: 74 61 74 69 63 20 69 6e 74 20 48 61 73 68 28 63  tatic int Hash(c
3e60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
3e70: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20  t n){.  int h = 
3e80: 30 3b 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b  0;.  if( n<=0 ){
3e90: 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28  .    n = strlen(
3ea0: 7a 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  z);.  }.  while(
3eb0: 20 6e 2d 2d 20 29 7b 0a 20 20 20 20 68 20 3d 20   n-- ){.    h = 
3ec0: 68 20 5e 20 28 68 3c 3c 35 29 20 5e 20 2a 7a 2b  h ^ (h<<5) ^ *z+
3ed0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
3ee0: 68 20 26 20 30 78 37 66 66 66 66 66 66 66 3b 0a  h & 0x7fffffff;.
3ef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
3f00: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  n identifier nam
3f10: 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  e, try to find a
3f20: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72   declaration for
3f30: 20 74 68 61 74 0a 2a 2a 20 69 64 65 6e 74 69 66   that.** identif
3f40: 69 65 72 20 69 6e 20 74 68 65 20 68 61 73 68 20  ier in the hash 
3f50: 74 61 62 6c 65 2e 20 20 49 66 20 66 6f 75 6e 64  table.  If found
3f60: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
3f70: 65 72 20 74 6f 0a 2a 2a 20 74 68 65 20 44 65 63  er to.** the Dec
3f80: 6c 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  l structure.  If
3f90: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75   not found, retu
3fa0: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
3fb0: 44 65 63 6c 20 2a 46 69 6e 64 44 65 63 6c 28 63  Decl *FindDecl(c
3fc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
3fd0: 2c 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 69 6e  , int len){.  in
3fe0: 74 20 68 3b 0a 20 20 44 65 63 6c 20 2a 70 3b 0a  t h;.  Decl *p;.
3ff0: 0a 20 20 69 66 28 20 6c 65 6e 3c 3d 30 20 29 7b  .  if( len<=0 ){
4000: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  .    len = strle
4010: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  n(zName);.  }.  
4020: 68 20 3d 20 48 61 73 68 28 7a 4e 61 6d 65 2c 6c  h = Hash(zName,l
4030: 65 6e 29 20 25 20 44 45 43 4c 5f 48 41 53 48 5f  en) % DECL_HASH_
4040: 53 49 5a 45 3b 0a 20 20 70 20 3d 20 61 70 54 61  SIZE;.  p = apTa
4050: 62 6c 65 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  ble[h];.  while(
4060: 20 70 20 26 26 20 28 73 74 72 6e 63 6d 70 28 70   p && (strncmp(p
4070: 2d 3e 7a 4e 61 6d 65 2c 7a 4e 61 6d 65 2c 6c 65  ->zName,zName,le
4080: 6e 29 21 3d 30 20 7c 7c 20 70 2d 3e 7a 4e 61 6d  n)!=0 || p->zNam
4090: 65 5b 6c 65 6e 5d 21 3d 30 29 20 29 7b 0a 20 20  e[len]!=0) ){.  
40a0: 20 20 70 20 3d 20 70 2d 3e 70 53 61 6d 65 48 61    p = p->pSameHa
40b0: 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  sh;.  }.  return
40c0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   p;.}../*.** Ins
40d0: 74 61 6c 6c 20 74 68 65 20 67 69 76 65 6e 20 64  tall the given d
40e0: 65 63 6c 61 72 61 74 69 6f 6e 20 62 6f 74 68 20  eclaration both 
40f0: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
4100: 65 20 61 6e 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  e and on.** the 
4110: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 64 65 63 6c  list of all decl
4120: 61 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  arations..*/.sta
4130: 74 69 63 20 76 6f 69 64 20 49 6e 73 74 61 6c 6c  tic void Install
4140: 44 65 63 6c 28 44 65 63 6c 20 2a 70 44 65 63 6c  Decl(Decl *pDecl
4150: 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 44 65  ){.  int h;.  De
4160: 63 6c 20 2a 70 4f 74 68 65 72 3b 0a 0a 20 20 68  cl *pOther;..  h
4170: 20 3d 20 48 61 73 68 28 70 44 65 63 6c 2d 3e 7a   = Hash(pDecl->z
4180: 4e 61 6d 65 2c 30 29 20 25 20 44 45 43 4c 5f 48  Name,0) % DECL_H
4190: 41 53 48 5f 53 49 5a 45 3b 0a 20 20 70 4f 74 68  ASH_SIZE;.  pOth
41a0: 65 72 20 3d 20 61 70 54 61 62 6c 65 5b 68 5d 3b  er = apTable[h];
41b0: 0a 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72  .  while( pOther
41c0: 20 26 26 20 73 74 72 63 6d 70 28 70 44 65 63 6c   && strcmp(pDecl
41d0: 2d 3e 7a 4e 61 6d 65 2c 70 4f 74 68 65 72 2d 3e  ->zName,pOther->
41e0: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
41f0: 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
4200: 2d 3e 70 53 61 6d 65 48 61 73 68 3b 0a 20 20 7d  ->pSameHash;.  }
4210: 0a 20 20 69 66 28 20 70 4f 74 68 65 72 20 29 7b  .  if( pOther ){
4220: 0a 20 20 20 20 70 44 65 63 6c 2d 3e 70 53 61 6d  .    pDecl->pSam
4230: 65 4e 61 6d 65 20 3d 20 70 4f 74 68 65 72 2d 3e  eName = pOther->
4240: 70 53 61 6d 65 4e 61 6d 65 3b 0a 20 20 20 20 70  pSameName;.    p
4250: 4f 74 68 65 72 2d 3e 70 53 61 6d 65 4e 61 6d 65  Other->pSameName
4260: 20 3d 20 70 44 65 63 6c 3b 0a 20 20 7d 65 6c 73   = pDecl;.  }els
4270: 65 7b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 70 53  e{.    pDecl->pS
4280: 61 6d 65 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ameName = 0;.   
4290: 20 70 44 65 63 6c 2d 3e 70 53 61 6d 65 48 61 73   pDecl->pSameHas
42a0: 68 20 3d 20 61 70 54 61 62 6c 65 5b 68 5d 3b 0a  h = apTable[h];.
42b0: 20 20 20 20 61 70 54 61 62 6c 65 5b 68 5d 20 3d      apTable[h] =
42c0: 20 70 44 65 63 6c 3b 0a 20 20 7d 0a 20 20 70 44   pDecl;.  }.  pD
42d0: 65 63 6c 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ecl->pNext = 0;.
42e0: 20 20 69 66 28 20 70 44 65 63 6c 46 69 72 73 74    if( pDeclFirst
42f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 65 63 6c  ==0 ){.    pDecl
4300: 46 69 72 73 74 20 3d 20 70 44 65 63 6c 4c 61 73  First = pDeclLas
4310: 74 20 3d 20 70 44 65 63 6c 3b 0a 20 20 7d 65 6c  t = pDecl;.  }el
4320: 73 65 7b 0a 20 20 20 20 70 44 65 63 6c 4c 61 73  se{.    pDeclLas
4330: 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 65 63 6c  t->pNext = pDecl
4340: 3b 0a 20 20 20 20 70 44 65 63 6c 4c 61 73 74 20  ;.    pDeclLast 
4350: 3d 20 70 44 65 63 6c 3b 0a 20 20 7d 0a 7d 0a 0a  = pDecl;.  }.}..
4360: 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68  /*.** Look at th
4370: 65 20 63 75 72 72 65 6e 74 20 69 66 53 74 61 63  e current ifStac
4380: 6b 2e 20 20 49 66 20 61 6e 79 74 68 69 6e 67 20  k.  If anything 
4390: 64 65 63 6c 61 72 65 64 20 61 74 20 74 68 65 20  declared at the 
43a0: 63 75 72 72 65 6e 74 0a 2a 2a 20 70 6f 73 69 74  current.** posit
43b0: 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 75 72 72  ion must be surr
43c0: 6f 75 6e 64 65 64 20 77 69 74 68 0a 2a 2a 0a 2a  ounded with.**.*
43d0: 2a 20 20 20 20 20 20 23 69 66 20 20 20 53 54 55  *      #if   STU
43e0: 46 46 0a 2a 2a 20 20 20 20 20 20 23 65 6e 64 69  FF.**      #endi
43f0: 66 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 69  f.**.** Then thi
4400: 73 20 72 6f 75 74 69 6e 65 20 63 6f 6d 70 75 74  s routine comput
4410: 65 73 20 53 54 55 46 46 20 61 6e 64 20 72 65 74  es STUFF and ret
4420: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
4430: 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a  o it.  Memory.**
4440: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
4450: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 6f  ue returned is o
4460: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
4470: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
4480: 20 63 68 61 72 20 2a 47 65 74 49 66 53 74 72 69   char *GetIfStri
4490: 6e 67 28 76 6f 69 64 29 7b 0a 20 20 49 66 6d 61  ng(void){.  Ifma
44a0: 63 72 6f 20 2a 70 49 66 3b 0a 20 20 63 68 61 72  cro *pIf;.  char
44b0: 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20   *zResult = 0;. 
44c0: 20 69 6e 74 20 68 61 73 49 66 20 3d 20 30 3b 0a   int hasIf = 0;.
44d0: 20 20 53 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20    String str;.. 
44e0: 20 66 6f 72 28 70 49 66 20 3d 20 69 66 53 74 61   for(pIf = ifSta
44f0: 63 6b 3b 20 70 49 66 3b 20 70 49 66 3d 70 49 66  ck; pIf; pIf=pIf
4500: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
4510: 28 20 70 49 66 2d 3e 7a 43 6f 6e 64 69 74 69 6f  ( pIf->zConditio
4520: 6e 3d 3d 30 20 7c 7c 20 2a 70 49 66 2d 3e 7a 43  n==0 || *pIf->zC
4530: 6f 6e 64 69 74 69 6f 6e 3d 3d 30 20 29 20 63 6f  ondition==0 ) co
4540: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
4550: 21 68 61 73 49 66 20 29 7b 0a 20 20 20 20 20 20  !hasIf ){.      
4560: 68 61 73 49 66 20 3d 20 31 3b 0a 20 20 20 20 20  hasIf = 1;.     
4570: 20 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72   StringInit(&str
4580: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
4590: 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64      StringAppend
45a0: 28 26 73 74 72 2c 22 20 26 26 20 22 2c 34 29 3b  (&str," && ",4);
45b0: 0a 20 20 20 20 7d 0a 20 20 20 20 53 74 72 69 6e  .    }.    Strin
45c0: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 70 49 66  gAppend(&str,pIf
45d0: 2d 3e 7a 43 6f 6e 64 69 74 69 6f 6e 2c 30 29 3b  ->zCondition,0);
45e0: 0a 20 20 7d 0a 20 20 69 66 28 20 68 61 73 49 66  .  }.  if( hasIf
45f0: 20 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20   ){.    zResult 
4600: 3d 20 53 74 72 44 75 70 28 53 74 72 69 6e 67 47  = StrDup(StringG
4610: 65 74 28 26 73 74 72 29 2c 30 29 3b 0a 20 20 20  et(&str),0);.   
4620: 20 53 74 72 69 6e 67 52 65 73 65 74 28 26 73 74   StringReset(&st
4630: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
4640: 20 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20   zResult = 0;.  
4650: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73 75  }.  return zResu
4660: 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  lt;.}../*.** Cre
4670: 61 74 65 20 61 20 6e 65 77 20 64 65 63 6c 61 72  ate a new declar
4680: 61 74 69 6f 6e 20 61 6e 64 20 70 75 74 20 69 74  ation and put it
4690: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
46a0: 6c 65 2e 20 20 41 6c 73 6f 0a 2a 2a 20 72 65 74  le.  Also.** ret
46b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
46c0: 20 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63   it so that we c
46d0: 61 6e 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 7a  an fill in the z
46e0: 46 77 64 20 61 6e 64 20 7a 44 65 63 6c 0a 2a 2a  Fwd and zDecl.**
46f0: 20 66 69 65 6c 64 73 2c 20 61 6e 64 20 73 6f 20   fields, and so 
4700: 66 6f 72 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  forth..*/.static
4710: 20 44 65 63 6c 20 2a 43 72 65 61 74 65 44 65 63   Decl *CreateDec
4720: 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
4730: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a  *zName,       /*
4740: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a   Name of the obj
4750: 65 63 74 20 62 65 69 6e 67 20 64 65 63 6c 61 72  ect being declar
4760: 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ed. */.  int nNa
4770: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
4780: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
4790: 68 65 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  he name */.){.  
47a0: 44 65 63 6c 20 2a 70 44 65 63 6c 3b 0a 0a 20 20  Decl *pDecl;..  
47b0: 70 44 65 63 6c 20 3d 20 53 61 66 65 4d 61 6c 6c  pDecl = SafeMall
47c0: 6f 63 28 20 73 69 7a 65 6f 66 28 44 65 63 6c 29  oc( sizeof(Decl)
47d0: 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 29 3b 0a 20   + nName + 1);. 
47e0: 20 6d 65 6d 73 65 74 28 70 44 65 63 6c 2c 30 2c   memset(pDecl,0,
47f0: 73 69 7a 65 6f 66 28 44 65 63 6c 29 29 3b 0a 20  sizeof(Decl));. 
4800: 20 70 44 65 63 6c 2d 3e 7a 4e 61 6d 65 20 3d 20   pDecl->zName = 
4810: 28 63 68 61 72 2a 29 26 70 44 65 63 6c 5b 31 5d  (char*)&pDecl[1]
4820: 3b 0a 20 20 73 70 72 69 6e 74 66 28 70 44 65 63  ;.  sprintf(pDec
4830: 6c 2d 3e 7a 4e 61 6d 65 2c 22 25 2e 2a 73 22 2c  l->zName,"%.*s",
4840: 6e 4e 61 6d 65 2c 7a 4e 61 6d 65 29 3b 0a 20 20  nName,zName);.  
4850: 70 44 65 63 6c 2d 3e 7a 46 69 6c 65 20 3d 20 7a  pDecl->zFile = z
4860: 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 44 65 63  Filename;.  pDec
4870: 6c 2d 3e 70 49 6e 63 6c 75 64 65 20 3d 20 69 6e  l->pInclude = in
4880: 63 6c 75 64 65 4c 69 73 74 3b 0a 20 20 70 44 65  cludeList;.  pDe
4890: 63 6c 2d 3e 7a 49 66 20 3d 20 47 65 74 49 66 53  cl->zIf = GetIfS
48a0: 74 72 69 6e 67 28 29 3b 0a 20 20 49 6e 73 74 61  tring();.  Insta
48b0: 6c 6c 44 65 63 6c 28 70 44 65 63 6c 29 3b 0a 20  llDecl(pDecl);. 
48c0: 20 72 65 74 75 72 6e 20 70 44 65 63 6c 3b 0a 7d   return pDecl;.}
48d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
48e0: 20 6e 65 77 20 69 64 65 6e 74 69 66 69 65 72 20   new identifier 
48f0: 69 6e 74 6f 20 61 6e 20 74 61 62 6c 65 20 6f 66  into an table of
4900: 20 69 64 65 6e 74 69 66 69 65 72 73 2e 20 20 52   identifiers.  R
4910: 65 74 75 72 6e 20 54 52 55 45 20 69 66 0a 2a 2a  eturn TRUE if.**
4920: 20 61 20 6e 65 77 20 69 64 65 6e 74 69 66 69 65   a new identifie
4930: 72 20 77 61 73 20 69 6e 73 65 72 74 65 64 20 61  r was inserted a
4940: 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20  nd return FALSE 
4950: 69 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  if the identifie
4960: 72 20 77 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79  r was.** already
4970: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
4980: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 49 64 65  /.static int Ide
4990: 6e 74 54 61 62 6c 65 49 6e 73 65 72 74 28 0a 20  ntTableInsert(. 
49a0: 20 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 54 61   IdentTable *pTa
49b0: 62 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ble,       /* Th
49c0: 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  e table into whi
49d0: 63 68 20 77 65 20 77 69 6c 6c 20 69 6e 73 65 72  ch we will inser
49e0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
49f0: 72 20 2a 7a 49 64 2c 20 20 20 20 20 20 20 20 20  r *zId,         
4a00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4a10: 69 64 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a 20  identifiers */. 
4a20: 20 69 6e 74 20 6e 49 64 20 20 20 20 20 20 20 20   int nId        
4a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
4a40: 6e 67 74 68 20 6f 66 20 74 68 65 20 69 64 65 6e  ngth of the iden
4a50: 74 69 66 69 65 72 20 6e 61 6d 65 20 2a 2f 0a 29  tifier name */.)
4a60: 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 49 64 65  {.  int h;.  Ide
4a70: 6e 74 20 2a 70 49 64 3b 0a 0a 20 20 69 66 28 20  nt *pId;..  if( 
4a80: 6e 49 64 3c 3d 30 20 29 7b 0a 20 20 20 20 6e 49  nId<=0 ){.    nI
4a90: 64 20 3d 20 73 74 72 6c 65 6e 28 7a 49 64 29 3b  d = strlen(zId);
4aa0: 0a 20 20 7d 0a 20 20 68 20 3d 20 48 61 73 68 28  .  }.  h = Hash(
4ab0: 7a 49 64 2c 6e 49 64 29 20 25 20 49 44 45 4e 54  zId,nId) % IDENT
4ac0: 5f 48 41 53 48 5f 53 49 5a 45 3b 0a 20 20 66 6f  _HASH_SIZE;.  fo
4ad0: 72 28 70 49 64 20 3d 20 70 54 61 62 6c 65 2d 3e  r(pId = pTable->
4ae0: 61 70 54 61 62 6c 65 5b 68 5d 3b 20 70 49 64 3b  apTable[h]; pId;
4af0: 20 70 49 64 3d 70 49 64 2d 3e 70 43 6f 6c 6c 69   pId=pId->pColli
4b00: 64 65 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  de){.    if( str
4b10: 6e 63 6d 70 28 7a 49 64 2c 70 49 64 2d 3e 7a 4e  ncmp(zId,pId->zN
4b20: 61 6d 65 2c 6e 49 64 29 3d 3d 30 20 26 26 20 70  ame,nId)==0 && p
4b30: 49 64 2d 3e 7a 4e 61 6d 65 5b 6e 49 64 5d 3d 3d  Id->zName[nId]==
4b40: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 72  0 ){.      /* pr
4b50: 69 6e 74 66 28 22 41 6c 72 65 61 64 79 20 69 6e  intf("Already in
4b60: 20 74 61 62 6c 65 3a 20 25 2e 2a 73 5c 6e 22 2c   table: %.*s\n",
4b70: 6e 49 64 2c 7a 49 64 29 3b 20 2a 2f 0a 20 20 20  nId,zId); */.   
4b80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
4b90: 20 7d 0a 20 20 7d 0a 20 20 70 49 64 20 3d 20 53   }.  }.  pId = S
4ba0: 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  afeMalloc( sizeo
4bb0: 66 28 49 64 65 6e 74 29 20 2b 20 6e 49 64 20 2b  f(Ident) + nId +
4bc0: 20 31 20 29 3b 0a 20 20 70 49 64 2d 3e 7a 4e 61   1 );.  pId->zNa
4bd0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 64  me = (char*)&pId
4be0: 5b 31 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 70  [1];.  sprintf(p
4bf0: 49 64 2d 3e 7a 4e 61 6d 65 2c 22 25 2e 2a 73 22  Id->zName,"%.*s"
4c00: 2c 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 70 49 64  ,nId,zId);.  pId
4c10: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 6c 65  ->pNext = pTable
4c20: 2d 3e 70 4c 69 73 74 3b 0a 20 20 70 54 61 62 6c  ->pList;.  pTabl
4c30: 65 2d 3e 70 4c 69 73 74 20 3d 20 70 49 64 3b 0a  e->pList = pId;.
4c40: 20 20 70 49 64 2d 3e 70 43 6f 6c 6c 69 64 65 20    pId->pCollide 
4c50: 3d 20 70 54 61 62 6c 65 2d 3e 61 70 54 61 62 6c  = pTable->apTabl
4c60: 65 5b 68 5d 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  e[h];.  pTable->
4c70: 61 70 54 61 62 6c 65 5b 68 5d 20 3d 20 70 49 64  apTable[h] = pId
4c80: 3b 0a 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 41  ;.  /* printf("A
4c90: 64 64 20 74 6f 20 74 61 62 6c 65 3a 20 25 2e 2a  dd to table: %.*
4ca0: 73 5c 6e 22 2c 6e 49 64 2c 7a 49 64 29 3b 20 2a  s\n",nId,zId); *
4cb0: 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  /.  return 1;.}.
4cc0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
4cd0: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  see if the given
4ce0: 20 76 61 6c 75 65 20 69 73 20 69 6e 20 74 68 65   value is in the
4cf0: 20 67 69 76 65 6e 20 49 64 65 6e 74 54 61 62 6c   given IdentTabl
4d00: 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  e.  Return.** tr
4d10: 75 65 20 69 66 20 69 74 20 69 73 20 61 6e 64 20  ue if it is and 
4d20: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 6e  false if it is n
4d30: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
4d40: 74 20 49 64 65 6e 74 54 61 62 6c 65 54 65 73 74  t IdentTableTest
4d50: 28 0a 20 20 49 64 65 6e 74 54 61 62 6c 65 20 2a  (.  IdentTable *
4d60: 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 2f 2a  pTable,       /*
4d70: 20 54 68 65 20 74 61 62 6c 65 20 69 6e 20 77 68   The table in wh
4d80: 69 63 68 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  ich to search */
4d90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4da0: 49 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Id,          /* 
4db0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 65 6e  Name of the iden
4dc0: 74 69 66 69 65 72 73 20 2a 2f 0a 20 20 69 6e 74  tifiers */.  int
4dd0: 20 6e 49 64 20 20 20 20 20 20 20 20 20 20 20 20   nId            
4de0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
4df0: 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
4e00: 65 72 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  er name */.){.  
4e10: 69 6e 74 20 68 3b 0a 20 20 49 64 65 6e 74 20 2a  int h;.  Ident *
4e20: 70 49 64 3b 0a 0a 20 20 69 66 28 20 6e 49 64 3c  pId;..  if( nId<
4e30: 3d 30 20 29 7b 0a 20 20 20 20 6e 49 64 20 3d 20  =0 ){.    nId = 
4e40: 73 74 72 6c 65 6e 28 7a 49 64 29 3b 0a 20 20 7d  strlen(zId);.  }
4e50: 0a 20 20 68 20 3d 20 48 61 73 68 28 7a 49 64 2c  .  h = Hash(zId,
4e60: 6e 49 64 29 20 25 20 49 44 45 4e 54 5f 48 41 53  nId) % IDENT_HAS
4e70: 48 5f 53 49 5a 45 3b 0a 20 20 66 6f 72 28 70 49  H_SIZE;.  for(pI
4e80: 64 20 3d 20 70 54 61 62 6c 65 2d 3e 61 70 54 61  d = pTable->apTa
4e90: 62 6c 65 5b 68 5d 3b 20 70 49 64 3b 20 70 49 64  ble[h]; pId; pId
4ea0: 3d 70 49 64 2d 3e 70 43 6f 6c 6c 69 64 65 29 7b  =pId->pCollide){
4eb0: 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
4ec0: 28 7a 49 64 2c 70 49 64 2d 3e 7a 4e 61 6d 65 2c  (zId,pId->zName,
4ed0: 6e 49 64 29 3d 3d 30 20 26 26 20 70 49 64 2d 3e  nId)==0 && pId->
4ee0: 7a 4e 61 6d 65 5b 6e 49 64 5d 3d 3d 30 20 29 7b  zName[nId]==0 ){
4ef0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
4f00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4f10: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4f20: 52 65 6d 6f 76 65 20 65 76 65 72 79 20 69 64 65  Remove every ide
4f30: 6e 74 69 66 69 65 72 20 66 72 6f 6d 20 74 68 65  ntifier from the
4f40: 20 67 69 76 65 6e 20 74 61 62 6c 65 2e 20 20 20   given table.   
4f50: 52 65 73 65 74 20 74 68 65 20 74 61 62 6c 65 20  Reset the table 
4f60: 74 6f 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69 61  to.** its initia
4f70: 6c 20 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  l state..*/.stat
4f80: 69 63 20 76 6f 69 64 20 49 64 65 6e 74 54 61 62  ic void IdentTab
4f90: 6c 65 52 65 73 65 74 28 49 64 65 6e 74 54 61 62  leReset(IdentTab
4fa0: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49  le *pTable){.  I
4fb0: 64 65 6e 74 20 2a 70 49 64 2c 20 2a 70 4e 65 78  dent *pId, *pNex
4fc0: 74 3b 0a 0a 20 20 66 6f 72 28 70 49 64 20 3d 20  t;..  for(pId = 
4fd0: 70 54 61 62 6c 65 2d 3e 70 4c 69 73 74 3b 20 70  pTable->pList; p
4fe0: 49 64 3b 20 70 49 64 20 3d 20 70 4e 65 78 74 29  Id; pId = pNext)
4ff0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
5000: 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 53 61  d->pNext;.    Sa
5010: 66 65 46 72 65 65 28 70 49 64 29 3b 0a 20 20 7d  feFree(pId);.  }
5020: 0a 20 20 6d 65 6d 73 65 74 28 70 54 61 62 6c 65  .  memset(pTable
5030: 2c 30 2c 73 69 7a 65 6f 66 28 49 64 65 6e 74 54  ,0,sizeof(IdentT
5040: 61 62 6c 65 29 29 3b 0a 7d 0a 0a 23 69 66 64 65  able));.}..#ifde
5050: 66 20 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  f DEBUG./*.** Pr
5060: 69 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  int the name of 
5070: 65 76 65 72 79 20 69 64 65 6e 74 69 66 69 65 72  every identifier
5080: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 74 61   in the given ta
5090: 62 6c 65 2c 20 6f 6e 65 20 70 65 72 20 6c 69 6e  ble, one per lin
50a0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
50b0: 20 49 64 65 6e 74 54 61 62 6c 65 50 72 69 6e 74   IdentTablePrint
50c0: 28 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 54 61  (IdentTable *pTa
50d0: 62 6c 65 2c 20 46 49 4c 45 20 2a 70 4f 75 74 29  ble, FILE *pOut)
50e0: 7b 0a 20 20 49 64 65 6e 74 20 2a 70 49 64 3b 0a  {.  Ident *pId;.
50f0: 0a 20 20 66 6f 72 28 70 49 64 20 3d 20 70 54 61  .  for(pId = pTa
5100: 62 6c 65 2d 3e 70 4c 69 73 74 3b 20 70 49 64 3b  ble->pList; pId;
5110: 20 70 49 64 20 3d 20 70 49 64 2d 3e 70 4e 65 78   pId = pId->pNex
5120: 74 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  t){.    fprintf(
5130: 70 4f 75 74 2c 22 25 73 5c 6e 22 2c 70 49 64 2d  pOut,"%s\n",pId-
5140: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23  >zName);.  }.}.#
5150: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
5160: 64 20 61 6e 20 65 6e 74 69 72 65 20 66 69 6c 65  d an entire file
5170: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 20 52   into memory.  R
5180: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
5190: 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a 2a  to the memory..*
51a0: 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20  *.** The memory 
51b0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
51c0: 20 53 61 66 65 4d 61 6c 6c 6f 63 20 61 6e 64 20   SafeMalloc and 
51d0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
51e0: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   the.** calling 
51f0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
5200: 49 66 20 74 68 65 20 72 65 61 64 20 66 61 69 6c  If the read fail
5210: 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
5220: 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
5230: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
5240: 2a 52 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20  *ReadFile(const 
5250: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
5260: 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  {.  struct stat 
5270: 73 53 74 61 74 3b 0a 20 20 46 49 4c 45 20 2a 70  sStat;.  FILE *p
5280: 49 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66  In;.  char *zBuf
5290: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66  ;.  int n;..  if
52a0: 28 20 73 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65  ( stat(zFilename
52b0: 2c 26 73 53 74 61 74 29 21 3d 30 20 0a 23 69 66  ,&sStat)!=0 .#if
52c0: 6e 64 65 66 20 57 49 4e 33 32 0a 20 20 20 20 7c  ndef WIN32.    |
52d0: 7c 20 21 53 5f 49 53 52 45 47 28 73 53 74 61 74  | !S_ISREG(sStat
52e0: 2e 73 74 5f 6d 6f 64 65 29 0a 23 65 6e 64 69 66  .st_mode).#endif
52f0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
5300: 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 20 3d 20   0;.  }.  pIn = 
5310: 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  fopen(zFilename,
5320: 22 72 22 29 3b 0a 20 20 69 66 28 20 70 49 6e 3d  "r");.  if( pIn=
5330: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
5340: 20 30 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 20 3d   0;.  }.  zBuf =
5350: 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 53 74   SafeMalloc( sSt
5360: 61 74 2e 73 74 5f 73 69 7a 65 20 2b 20 31 20 29  at.st_size + 1 )
5370: 3b 0a 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42  ;.  n = fread(zB
5380: 75 66 2c 31 2c 73 53 74 61 74 2e 73 74 5f 73 69  uf,1,sStat.st_si
5390: 7a 65 2c 70 49 6e 29 3b 0a 20 20 7a 42 75 66 5b  ze,pIn);.  zBuf[
53a0: 6e 5d 20 3d 20 30 3b 0a 20 20 66 63 6c 6f 73 65  n] = 0;.  fclose
53b0: 28 70 49 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pIn);.  return 
53c0: 7a 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  zBuf;.}../*.** W
53d0: 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
53e0: 73 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e  s of a string in
53f0: 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
5400: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
5410: 0a 2a 2a 20 65 72 72 6f 72 73 0a 2a 2f 0a 73 74  .** errors.*/.st
5420: 61 74 69 63 20 69 6e 74 20 57 72 69 74 65 46 69  atic int WriteFi
5430: 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  le(const char *z
5440: 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  Filename, const 
5450: 63 68 61 72 20 2a 7a 4f 75 74 70 75 74 29 7b 0a  char *zOutput){.
5460: 20 20 46 49 4c 45 20 2a 70 4f 75 74 3b 0a 20 20    FILE *pOut;.  
5470: 70 4f 75 74 20 3d 20 66 6f 70 65 6e 28 7a 46 69  pOut = fopen(zFi
5480: 6c 65 6e 61 6d 65 2c 22 77 22 29 3b 0a 20 20 69  lename,"w");.  i
5490: 66 28 20 70 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  f( pOut==0 ){.  
54a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
54b0: 20 20 66 77 72 69 74 65 28 7a 4f 75 74 70 75 74    fwrite(zOutput
54c0: 2c 31 2c 73 74 72 6c 65 6e 28 7a 4f 75 74 70 75  ,1,strlen(zOutpu
54d0: 74 29 2c 70 4f 75 74 29 3b 0a 20 20 66 63 6c 6f  t),pOut);.  fclo
54e0: 73 65 28 70 4f 75 74 29 3b 0a 20 20 72 65 74 75  se(pOut);.  retu
54f0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  rn 0;.}../*.** M
5500: 61 6a 6f 72 20 74 6f 6b 65 6e 20 74 79 70 65 73  ajor token types
5510: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 53  .*/.#define TT_S
5520: 70 61 63 65 20 20 20 20 20 20 20 20 20 20 20 31  pace           1
5530: 20 20 20 2f 2a 20 43 6f 6e 74 69 67 75 6f 75 73     /* Contiguous
5540: 20 77 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a   white space */.
5550: 23 64 65 66 69 6e 65 20 54 54 5f 49 64 20 20 20  #define TT_Id   
5560: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 2f             2   /
5570: 2a 20 41 6e 20 69 64 65 6e 74 69 66 69 65 72 20  * An identifier 
5580: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 50 72  */.#define TT_Pr
5590: 65 70 72 6f 63 65 73 73 6f 72 20 20 20 20 33 20  eprocessor    3 
55a0: 20 20 2f 2a 20 41 6e 79 20 43 20 70 72 65 70 72    /* Any C prepr
55b0: 6f 63 65 73 73 6f 72 20 64 69 72 65 63 74 69 76  ocessor directiv
55c0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f  e */.#define TT_
55d0: 43 6f 6d 6d 65 6e 74 20 20 20 20 20 20 20 20 20  Comment         
55e0: 34 20 20 20 2f 2a 20 45 69 74 68 65 72 20 43 20  4   /* Either C 
55f0: 6f 72 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d  or C++ style com
5600: 6d 65 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ment */.#define 
5610: 54 54 5f 4e 75 6d 62 65 72 20 20 20 20 20 20 20  TT_Number       
5620: 20 20 20 35 20 20 20 2f 2a 20 41 6e 79 20 6e 75     5   /* Any nu
5630: 6d 65 72 69 63 20 63 6f 6e 73 74 61 6e 74 20 2a  meric constant *
5640: 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 53 74 72  /.#define TT_Str
5650: 69 6e 67 20 20 20 20 20 20 20 20 20 20 36 20 20  ing          6  
5660: 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 63 68   /* String or ch
5670: 61 72 61 63 74 65 72 20 63 6f 6e 73 74 61 6e 74  aracter constant
5680: 73 2e 20 22 2e 2e 22 20 6f 72 20 27 2e 27 20 2a  s. ".." or '.' *
5690: 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 42 72 61  /.#define TT_Bra
56a0: 63 65 73 20 20 20 20 20 20 20 20 20 20 37 20 20  ces          7  
56b0: 20 2f 2a 20 41 6c 6c 20 74 65 78 74 20 62 65 74   /* All text bet
56c0: 77 65 65 6e 20 7b 20 61 6e 64 20 61 20 6d 61 74  ween { and a mat
56d0: 63 68 69 6e 67 20 7d 20 2a 2f 0a 23 64 65 66 69  ching } */.#defi
56e0: 6e 65 20 54 54 5f 45 4f 46 20 20 20 20 20 20 20  ne TT_EOF       
56f0: 20 20 20 20 20 20 38 20 20 20 2f 2a 20 45 6e 64        8   /* End
5700: 20 6f 66 20 66 69 6c 65 20 2a 2f 0a 23 64 65 66   of file */.#def
5710: 69 6e 65 20 54 54 5f 45 72 72 6f 72 20 20 20 20  ine TT_Error    
5720: 20 20 20 20 20 20 20 39 20 20 20 2f 2a 20 41 6e         9   /* An
5730: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
5740: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 42   */.#define TT_B
5750: 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 20 20 20 20 31  lockComment    1
5760: 30 20 20 2f 2a 20 41 20 43 2d 53 74 79 6c 65 20  0  /* A C-Style 
5770: 63 6f 6d 6d 65 6e 74 20 61 74 20 74 68 65 20 6c  comment at the l
5780: 65 66 74 20 6d 61 72 67 69 6e 20 74 68 61 74 0a  eft margin that.
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 2a 20 73 70 61 6e 73 20 6d 75 6c 74 70 6c 65 20  * spans multple 
57c0: 6c 69 6e 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65  lines */.#define
57d0: 20 54 54 5f 4f 74 68 65 72 20 20 20 20 20 20 20   TT_Other       
57e0: 20 20 20 20 30 20 20 20 2f 2a 20 4e 6f 6e 65 20      0   /* None 
57f0: 6f 66 20 74 68 65 20 61 62 6f 76 65 20 2a 2f 0a  of the above */.
5800: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 73 69 6e  ./*.** Get a sin
5810: 67 6c 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 74 6f  gle low-level to
5820: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  ken from the inp
5830: 75 74 20 66 69 6c 65 2e 20 20 55 70 64 61 74 65  ut file.  Update
5840: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 70 6f 69   the.** file poi
5850: 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20  nter so that it 
5860: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
5870: 72 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65  rst character be
5880: 79 6f 6e 64 20 74 68 65 0a 2a 2a 20 74 6f 6b 65  yond the.** toke
5890: 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 22 6c 6f 77 2d  n..**.** A "low-
58a0: 6c 65 76 65 6c 20 74 6f 6b 65 6e 22 20 69 73 20  level token" is 
58b0: 61 6e 79 20 74 6f 6b 65 6e 20 65 78 63 65 70 74  any token except
58c0: 20 54 54 5f 42 72 61 63 65 73 2e 20 20 41 20 54   TT_Braces.  A T
58d0: 54 5f 42 72 61 63 65 73 20 74 6f 6b 65 6e 0a 2a  T_Braces token.*
58e0: 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 6d 61  * consists of ma
58f0: 6e 79 20 73 6d 61 6c 6c 65 72 20 74 6f 6b 65 6e  ny smaller token
5900: 73 20 61 6e 64 20 69 73 20 61 73 73 65 6d 62 6c  s and is assembl
5910: 65 64 20 62 79 20 61 20 72 6f 75 74 69 6e 65 20  ed by a routine 
5920: 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68  that.** calls th
5930: 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  is one..**.** Th
5940: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
5950: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
5960: 20 65 72 72 6f 72 73 2e 20 20 41 6e 20 65 72 72   errors.  An err
5970: 6f 72 20 69 73 20 61 6e 0a 2a 2a 20 75 6e 74 65  or is an.** unte
5980: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
5990: 6f 72 20 63 68 61 72 61 63 74 65 72 20 6c 69 74  or character lit
59a0: 65 72 61 6c 20 6f 72 20 61 6e 20 75 6e 74 65 72  eral or an unter
59b0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 63 6f 6d 6d 65  minated.** comme
59c0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 72 6f 66 69 6c  nt..**.** Profil
59d0: 69 6e 67 20 73 68 6f 77 73 20 74 68 61 74 20 74  ing shows that t
59e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 73  his routine cons
59f0: 75 6d 65 73 20 61 62 6f 75 74 20 68 61 6c 66 20  umes about half 
5a00: 74 68 65 0a 2a 2a 20 43 50 55 20 74 69 6d 65 20  the.** CPU time 
5a10: 6f 6e 20 61 20 74 79 70 69 63 61 6c 20 72 75 6e  on a typical run
5a20: 20 6f 66 20 6d 61 6b 65 68 65 61 64 65 72 73 2e   of makeheaders.
5a30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 47  .*/.static int G
5a40: 65 74 54 6f 6b 65 6e 28 49 6e 53 74 72 65 61 6d  etToken(InStream
5a50: 20 2a 70 49 6e 2c 20 54 6f 6b 65 6e 20 2a 70 54   *pIn, Token *pT
5a60: 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  oken){.  int i;.
5a70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
5a80: 0a 20 20 69 6e 74 20 63 53 74 61 72 74 3b 0a 20  .  int cStart;. 
5a90: 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 73 74   int c;.  int st
5aa0: 61 72 74 4c 69 6e 65 3b 20 20 20 2f 2a 20 4c 69  artLine;   /* Li
5ab0: 6e 65 20 6f 6e 20 77 68 69 63 68 20 61 20 73 74  ne on which a st
5ac0: 72 75 63 74 75 72 65 20 62 65 67 69 6e 73 20 2a  ructure begins *
5ad0: 2f 0a 20 20 69 6e 74 20 6e 6c 69 73 63 20 3d 20  /.  int nlisc = 
5ae0: 30 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  0;   /* True if 
5af0: 74 68 65 72 65 20 69 73 20 61 20 6e 65 77 2d 6c  there is a new-l
5b00: 69 6e 65 20 69 6e 20 61 20 22 2e 2e 22 20 6f 72  ine in a ".." or
5b10: 20 27 2e 2e 27 20 2a 2f 0a 20 20 69 6e 74 20 6e   '..' */.  int n
5b20: 45 72 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  Err = 0;    /* N
5b30: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
5b40: 73 65 65 6e 20 2a 2f 0a 0a 20 20 7a 20 3d 20 70  seen */..  z = p
5b50: 49 6e 2d 3e 7a 3b 0a 20 20 69 20 3d 20 70 49 6e  In->z;.  i = pIn
5b60: 2d 3e 69 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 6e  ->i;.  pToken->n
5b70: 4c 69 6e 65 20 3d 20 70 49 6e 2d 3e 6e 4c 69 6e  Line = pIn->nLin
5b80: 65 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 7a 54 65  e;.  pToken->zTe
5b90: 78 74 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20 73 77  xt = &z[i];.  sw
5ba0: 69 74 63 68 28 20 7a 5b 69 5d 20 29 7b 0a 20 20  itch( z[i] ){.  
5bb0: 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20    case 0:.      
5bc0: 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20  pToken->eType = 
5bd0: 54 54 5f 45 4f 46 3b 0a 20 20 20 20 20 20 70 54  TT_EOF;.      pT
5be0: 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 30 3b  oken->nText = 0;
5bf0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
5c00: 20 20 20 63 61 73 65 20 27 23 27 3a 0a 20 20 20     case '#':.   
5c10: 20 20 20 69 66 28 20 69 3d 3d 30 20 7c 7c 20 7a     if( i==0 || z
5c20: 5b 69 2d 31 5d 3d 3d 27 5c 6e 27 20 7c 7c 20 28  [i-1]=='\n' || (
5c30: 69 3e 31 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27  i>1 && z[i-1]=='
5c40: 5c 72 27 20 26 26 20 7a 5b 69 2d 32 5d 3d 3d 27  \r' && z[i-2]=='
5c50: 5c 6e 27 29 29 7b 0a 20 20 20 20 20 20 20 20 2f  \n')){.        /
5c60: 2a 20 57 65 20 66 6f 75 6e 64 20 61 20 70 72 65  * We found a pre
5c70: 70 72 6f 63 65 73 73 6f 72 20 73 74 61 74 65 6d  processor statem
5c80: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ent */.        p
5c90: 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54  Token->eType = T
5ca0: 54 5f 50 72 65 70 72 6f 63 65 73 73 6f 72 3b 0a  T_Preprocessor;.
5cb0: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
5cc0: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d       while( z[i]
5cd0: 21 3d 30 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 6e  !=0 && z[i]!='\n
5ce0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
5cf0: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 5c 27 20 29 7b  f( z[i]=='\\' ){
5d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b  .            i++
5d10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
5d20: 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 70  ( z[i]=='\n' ) p
5d30: 49 6e 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20  In->nLine++;.   
5d40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5d50: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
5d60: 7d 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e  }.        pToken
5d70: 2d 3e 6e 54 65 78 74 20 3d 20 69 20 2d 20 70 49  ->nText = i - pI
5d80: 6e 2d 3e 69 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n->i;.      }els
5d90: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  e{.        /* Ju
5da0: 73 74 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 2a  st an operator *
5db0: 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e  /.        pToken
5dc0: 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f 4f 74 68  ->eType = TT_Oth
5dd0: 65 72 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 6b  er;.        pTok
5de0: 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 31 3b 0a 20  en->nText = 1;. 
5df0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5e00: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 27 20  ak;..    case ' 
5e10: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 5c 74 27  ':.    case '\t'
5e20: 3a 0a 20 20 20 20 63 61 73 65 20 27 5c 72 27 3a  :.    case '\r':
5e30: 0a 20 20 20 20 63 61 73 65 20 27 5c 66 27 3a 0a  .    case '\f':.
5e40: 20 20 20 20 63 61 73 65 20 27 5c 6e 27 3a 0a 20      case '\n':. 
5e50: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70       while( issp
5e60: 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20  ace(z[i]) ){.   
5e70: 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27       if( z[i]=='
5e80: 5c 6e 27 20 29 20 70 49 6e 2d 3e 6e 4c 69 6e 65  \n' ) pIn->nLine
5e90: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b  ++;.        i++;
5ea0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
5eb0: 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54  Token->eType = T
5ec0: 54 5f 53 70 61 63 65 3b 0a 20 20 20 20 20 20 70  T_Space;.      p
5ed0: 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 69  Token->nText = i
5ee0: 20 2d 20 70 49 6e 2d 3e 69 3b 0a 20 20 20 20 20   - pIn->i;.     
5ef0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
5f00: 65 20 27 5c 5c 27 3a 0a 20 20 20 20 20 20 70 54  e '\\':.      pT
5f10: 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 32 3b  oken->nText = 2;
5f20: 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65  .      pToken->e
5f30: 54 79 70 65 20 3d 20 54 54 5f 4f 74 68 65 72 3b  Type = TT_Other;
5f40: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
5f50: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]=='\n' ){.     
5f60: 20 20 20 70 49 6e 2d 3e 6e 4c 69 6e 65 2b 2b 3b     pIn->nLine++;
5f70: 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d  .        pToken-
5f80: 3e 65 54 79 70 65 20 3d 20 54 54 5f 53 70 61 63  >eType = TT_Spac
5f90: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  e;.      }else i
5fa0: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 30 20 29 7b 0a  f( z[i+1]==0 ){.
5fb0: 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e          pToken->
5fc0: 6e 54 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 20  nText = 1;.     
5fd0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5fe0: 0a 20 20 20 20 63 61 73 65 20 27 5c 27 27 3a 0a  .    case '\'':.
5ff0: 20 20 20 20 63 61 73 65 20 27 5c 22 27 3a 0a 20      case '\"':. 
6000: 20 20 20 20 20 63 53 74 61 72 74 20 3d 20 7a 5b       cStart = z[
6010: 69 5d 3b 0a 20 20 20 20 20 20 73 74 61 72 74 4c  i];.      startL
6020: 69 6e 65 20 3d 20 70 49 6e 2d 3e 6e 4c 69 6e 65  ine = pIn->nLine
6030: 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
6040: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
6050: 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20   c = z[i];.     
6060: 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
6070: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
6080: 21 6e 6c 69 73 63 20 29 7b 0a 20 20 20 20 20 20  !nlisc ){.      
6090: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
60a0: 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  derr,.          
60b0: 20 20 20 20 22 25 73 3a 25 64 3a 20 28 77 61 72      "%s:%d: (war
60c0: 6e 69 6e 67 29 20 4e 65 77 6c 69 6e 65 20 69 6e  ning) Newline in
60d0: 20 73 74 72 69 6e 67 20 6f 72 20 63 68 61 72 61   string or chara
60e0: 63 74 65 72 20 6c 69 74 65 72 61 6c 2e 5c 6e 22  cter literal.\n"
60f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6100: 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49 6e 2d 3e  zFilename, pIn->
6110: 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  nLine);.        
6120: 20 20 20 20 6e 6c 69 73 63 20 3d 20 31 3b 0a 20      nlisc = 1;. 
6130: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6140: 20 20 20 20 20 70 49 6e 2d 3e 6e 4c 69 6e 65 2b       pIn->nLine+
6150: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
6160: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27       if( c=='\\'
6170: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b   ){.          i+
6180: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  +;.          c =
6190: 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20   z[i];.         
61a0: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a   if( c=='\n' ){.
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d              pIn-
61c0: 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20  >nLine++;.      
61d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
61e0: 6c 73 65 20 69 66 28 20 63 3d 3d 63 53 74 61 72  lse if( c==cStar
61f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
6200: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  ++;.          c 
6210: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
6220: 73 65 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20  se if( c==0 ){. 
6230: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
6240: 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
6250: 20 55 6e 74 65 72 6d 69 6e 61 74 65 64 20 73 74   Unterminated st
6260: 72 69 6e 67 20 6f 72 20 63 68 61 72 61 63 74 65  ring or characte
6270: 72 20 6c 69 74 65 72 61 6c 2e 5c 6e 22 2c 0a 20  r literal.\n",. 
6280: 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c              zFil
6290: 65 6e 61 6d 65 2c 20 73 74 61 72 74 4c 69 6e 65  ename, startLine
62a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72  );.          nEr
62b0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
62c0: 20 20 20 20 20 7d 77 68 69 6c 65 28 20 63 20 29       }while( c )
62d0: 3b 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e  ;.      pToken->
62e0: 65 54 79 70 65 20 3d 20 54 54 5f 53 74 72 69 6e  eType = TT_Strin
62f0: 67 3b 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d  g;.      pToken-
6300: 3e 6e 54 65 78 74 20 3d 20 69 20 2d 20 70 49 6e  >nText = i - pIn
6310: 2d 3e 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ->i;.      break
6320: 3b 0a 0a 20 20 20 20 63 61 73 65 20 27 2f 27 3a  ;..    case '/':
6330: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
6340: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
6350: 20 20 2f 2a 20 43 2b 2b 20 73 74 79 6c 65 20 63    /* C++ style c
6360: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  omment */.      
6370: 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20 26 26    while( z[i] &&
6380: 20 7a 5b 69 5d 21 3d 27 5c 6e 27 20 29 7b 20 69   z[i]!='\n' ){ i
6390: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 70 54  ++; }.        pT
63a0: 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54  oken->eType = TT
63b0: 5f 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20  _Comment;.      
63c0: 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20    pToken->nText 
63d0: 3d 20 69 20 2d 20 70 49 6e 2d 3e 69 3b 0a 20 20  = i - pIn->i;.  
63e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
63f0: 69 2b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20  i+1]=='*' ){.   
6400: 20 20 20 20 20 2f 2a 20 43 20 73 74 79 6c 65 20       /* C style 
6410: 63 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  comment */.     
6420: 20 20 20 69 6e 74 20 69 73 42 6c 6f 63 6b 43 6f     int isBlockCo
6430: 6d 6d 65 6e 74 20 3d 20 69 3d 3d 30 20 7c 7c 20  mment = i==0 || 
6440: 7a 5b 69 2d 31 5d 3d 3d 27 5c 6e 27 3b 0a 20 20  z[i-1]=='\n';.  
6450: 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20        i += 2;.  
6460: 20 20 20 20 20 20 73 74 61 72 74 4c 69 6e 65 20        startLine 
6470: 3d 20 70 49 6e 2d 3e 6e 4c 69 6e 65 3b 0a 20 20  = pIn->nLine;.  
6480: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69        while( z[i
6490: 5d 20 26 26 20 28 7a 5b 69 5d 21 3d 27 2a 27 20  ] && (z[i]!='*' 
64a0: 7c 7c 20 7a 5b 69 2b 31 5d 21 3d 27 2f 27 29 20  || z[i+1]!='/') 
64b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
64c0: 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20   z[i]=='\n' ){. 
64d0: 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e             pIn->
64e0: 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20  nLine++;.       
64f0: 20 20 20 20 20 69 66 28 20 69 73 42 6c 6f 63 6b       if( isBlock
6500: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  Comment ){.     
6510: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
6520: 2b 31 5d 3d 3d 27 2a 27 20 7c 7c 20 7a 5b 69 2b  +1]=='*' || z[i+
6530: 32 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20  2]=='*' ){.     
6540: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 42 6c              isBl
6550: 6f 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20 32 3b 0a  ockComment = 2;.
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
6570: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
6580: 20 20 20 20 20 20 69 73 42 6c 6f 63 6b 43 6f 6d        isBlockCom
6590: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ment = 0;.      
65a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
65b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
65c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 2b    }.          i+
65d0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
65e0: 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 7b       if( z[i] ){
65f0: 20 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d   .          i +=
6600: 20 32 3b 20 0a 20 20 20 20 20 20 20 20 7d 65 6c   2; .        }el
6610: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73  se{.          is
6620: 42 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20 30  BlockComment = 0
6630: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  ;.          fpri
6640: 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25  ntf(stderr,"%s:%
6650: 64 3a 20 55 6e 74 65 72 6d 69 6e 61 74 65 64 20  d: Unterminated 
6660: 63 6f 6d 6d 65 6e 74 5c 6e 22 2c 0a 20 20 20 20  comment\n",.    
6670: 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
6680: 65 2c 20 73 74 61 72 74 4c 69 6e 65 29 3b 0a 20  e, startLine);. 
6690: 20 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b           nErr++;
66a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
66b0: 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65     pToken->eType
66c0: 20 3d 20 69 73 42 6c 6f 63 6b 43 6f 6d 6d 65 6e   = isBlockCommen
66d0: 74 3d 3d 32 20 3f 20 54 54 5f 42 6c 6f 63 6b 43  t==2 ? TT_BlockC
66e0: 6f 6d 6d 65 6e 74 20 3a 20 54 54 5f 43 6f 6d 6d  omment : TT_Comm
66f0: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ent;.        pTo
6700: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 69 20 2d  ken->nText = i -
6710: 20 70 49 6e 2d 3e 69 3b 0a 20 20 20 20 20 20 7d   pIn->i;.      }
6720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
6730: 20 41 20 64 69 76 69 64 65 20 6f 70 65 72 61 74   A divide operat
6740: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  or */.        pT
6750: 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54  oken->eType = TT
6760: 5f 4f 74 68 65 72 3b 0a 20 20 20 20 20 20 20 20  _Other;.        
6770: 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20  pToken->nText = 
6780: 31 20 2b 20 28 7a 5b 69 2b 31 5d 3d 3d 27 2b 27  1 + (z[i+1]=='+'
6790: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
67a0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
67b0: 65 20 27 30 27 3a 20 0a 20 20 20 20 20 20 69 66  e '0': .      if
67c0: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 78 27 20 7c 7c  ( z[i+1]=='x' ||
67d0: 20 7a 5b 69 2b 31 5d 3d 3d 27 58 27 20 29 7b 0a   z[i+1]=='X' ){.
67e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 68 65 78          /* A hex
67f0: 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20   constant */.   
6800: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
6810: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 78 64       while( isxd
6820: 69 67 69 74 28 7a 5b 69 5d 29 20 29 7b 20 69 2b  igit(z[i]) ){ i+
6830: 2b 3b 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65  +; }.      }else
6840: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  {.        /* An 
6850: 6f 63 74 61 6c 20 63 6f 6e 73 74 61 6e 74 20 2a  octal constant *
6860: 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  /.        while(
6870: 20 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 20 29   isdigit(z[i]) )
6880: 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7d  { i++; }.      }
6890: 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65  .      pToken->e
68a0: 54 79 70 65 20 3d 20 54 54 5f 4e 75 6d 62 65 72  Type = TT_Number
68b0: 3b 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e  ;.      pToken->
68c0: 6e 54 65 78 74 20 3d 20 69 20 2d 20 70 49 6e 2d  nText = i - pIn-
68d0: 3e 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  >i;.      break;
68e0: 0a 0a 20 20 20 20 63 61 73 65 20 27 31 27 3a 20  ..    case '1': 
68f0: 63 61 73 65 20 27 32 27 3a 20 63 61 73 65 20 27  case '2': case '
6900: 33 27 3a 20 63 61 73 65 20 27 34 27 3a 0a 20 20  3': case '4':.  
6910: 20 20 63 61 73 65 20 27 35 27 3a 20 63 61 73 65    case '5': case
6920: 20 27 36 27 3a 20 63 61 73 65 20 27 37 27 3a 20   '6': case '7': 
6930: 63 61 73 65 20 27 38 27 3a 20 63 61 73 65 20 27  case '8': case '
6940: 39 27 3a 0a 20 20 20 20 20 20 77 68 69 6c 65 28  9':.      while(
6950: 20 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 20 29   isdigit(z[i]) )
6960: 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69  { i++; }.      i
6970: 66 28 20 28 63 3d 7a 5b 69 5d 29 3d 3d 27 2e 27  f( (c=z[i])=='.'
6980: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 69 2b 2b   ){.         i++
6990: 3b 0a 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  ;.         while
69a0: 28 20 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 20  ( isdigit(z[i]) 
69b0: 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ i++; }.      
69c0: 20 20 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20     c = z[i];.   
69d0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 65 27        if( c=='e'
69e0: 20 7c 7c 20 63 3d 3d 27 45 27 20 29 7b 0a 20 20   || c=='E' ){.  
69f0: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
6a00: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 28 63           if( ((c
6a10: 3d 7a 5b 69 5d 29 3d 3d 27 2b 27 20 7c 7c 20 63  =z[i])=='+' || c
6a20: 3d 3d 27 2d 27 29 20 26 26 20 69 73 64 69 67 69  =='-') && isdigi
6a30: 74 28 7a 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b  t(z[i+1]) ){ i++
6a40: 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 77  ; }.           w
6a50: 68 69 6c 65 28 20 69 73 64 69 67 69 74 28 7a 5b  hile( isdigit(z[
6a60: 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20  i]) ){ i++; }.  
6a70: 20 20 20 20 20 20 20 20 20 63 20 3d 20 7a 5b 69           c = z[i
6a80: 5d 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ];.         }.  
6a90: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 66         if( c=='f
6aa0: 27 20 7c 7c 20 63 3d 3d 27 46 27 20 7c 7c 20 63  ' || c=='F' || c
6ab0: 3d 3d 27 6c 27 20 7c 7c 20 63 3d 3d 27 4c 27 20  =='l' || c=='L' 
6ac0: 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ i++; }.      
6ad0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 65 27  }else if( c=='e'
6ae0: 20 7c 7c 20 63 3d 3d 27 45 27 20 29 7b 0a 20 20   || c=='E' ){.  
6af0: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
6b00: 20 20 20 20 20 69 66 28 20 28 28 63 3d 7a 5b 69       if( ((c=z[i
6b10: 5d 29 3d 3d 27 2b 27 20 7c 7c 20 63 3d 3d 27 2d  ])=='+' || c=='-
6b20: 27 29 20 26 26 20 69 73 64 69 67 69 74 28 7a 5b  ') && isdigit(z[
6b30: 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a  i+1]) ){ i++; }.
6b40: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
6b50: 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 20 29 7b  isdigit(z[i]) ){
6b60: 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7d 65   i++; }.      }e
6b70: 6c 73 65 20 69 66 28 20 63 3d 3d 27 4c 27 20 7c  lse if( c=='L' |
6b80: 7c 20 63 3d 3d 27 6c 27 20 29 7b 0a 20 20 20 20  | c=='l' ){.    
6b90: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
6ba0: 20 20 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20     c = z[i];.   
6bb0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 75 27        if( c=='u'
6bc0: 20 7c 7c 20 63 3d 3d 27 55 27 20 29 7b 20 69 2b   || c=='U' ){ i+
6bd0: 2b 3b 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65  +; }.      }else
6be0: 20 69 66 28 20 63 3d 3d 27 75 27 20 7c 7c 20 63   if( c=='u' || c
6bf0: 3d 3d 27 55 27 20 29 7b 0a 20 20 20 20 20 20 20  =='U' ){.       
6c00: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
6c10: 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  c = z[i];.      
6c20: 20 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 7c 7c     if( c=='l' ||
6c30: 20 63 3d 3d 27 4c 27 20 29 7b 20 69 2b 2b 3b 20   c=='L' ){ i++; 
6c40: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
6c50: 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20  pToken->eType = 
6c60: 54 54 5f 4e 75 6d 62 65 72 3b 0a 20 20 20 20 20  TT_Number;.     
6c70: 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d   pToken->nText =
6c80: 20 69 20 2d 20 70 49 6e 2d 3e 69 3b 0a 20 20 20   i - pIn->i;.   
6c90: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
6ca0: 61 73 65 20 27 61 27 3a 20 63 61 73 65 20 27 62  ase 'a': case 'b
6cb0: 27 3a 20 63 61 73 65 20 27 63 27 3a 20 63 61 73  ': case 'c': cas
6cc0: 65 20 27 64 27 3a 20 63 61 73 65 20 27 65 27 3a  e 'd': case 'e':
6cd0: 20 63 61 73 65 20 27 66 27 3a 20 63 61 73 65 20   case 'f': case 
6ce0: 27 67 27 3a 0a 20 20 20 20 63 61 73 65 20 27 68  'g':.    case 'h
6cf0: 27 3a 20 63 61 73 65 20 27 69 27 3a 20 63 61 73  ': case 'i': cas
6d00: 65 20 27 6a 27 3a 20 63 61 73 65 20 27 6b 27 3a  e 'j': case 'k':
6d10: 20 63 61 73 65 20 27 6c 27 3a 20 63 61 73 65 20   case 'l': case 
6d20: 27 6d 27 3a 20 63 61 73 65 20 27 6e 27 3a 0a 20  'm': case 'n':. 
6d30: 20 20 20 63 61 73 65 20 27 6f 27 3a 20 63 61 73     case 'o': cas
6d40: 65 20 27 70 27 3a 20 63 61 73 65 20 27 71 27 3a  e 'p': case 'q':
6d50: 20 63 61 73 65 20 27 72 27 3a 20 63 61 73 65 20   case 'r': case 
6d60: 27 73 27 3a 20 63 61 73 65 20 27 74 27 3a 20 63  's': case 't': c
6d70: 61 73 65 20 27 75 27 3a 0a 20 20 20 20 63 61 73  ase 'u':.    cas
6d80: 65 20 27 76 27 3a 20 63 61 73 65 20 27 77 27 3a  e 'v': case 'w':
6d90: 20 63 61 73 65 20 27 78 27 3a 20 63 61 73 65 20   case 'x': case 
6da0: 27 79 27 3a 20 63 61 73 65 20 27 7a 27 3a 20 63  'y': case 'z': c
6db0: 61 73 65 20 27 41 27 3a 20 63 61 73 65 20 27 42  ase 'A': case 'B
6dc0: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 43 27 3a  ':.    case 'C':
6dd0: 20 63 61 73 65 20 27 44 27 3a 20 63 61 73 65 20   case 'D': case 
6de0: 27 45 27 3a 20 63 61 73 65 20 27 46 27 3a 20 63  'E': case 'F': c
6df0: 61 73 65 20 27 47 27 3a 20 63 61 73 65 20 27 48  ase 'G': case 'H
6e00: 27 3a 20 63 61 73 65 20 27 49 27 3a 0a 20 20 20  ': case 'I':.   
6e10: 20 63 61 73 65 20 27 4a 27 3a 20 63 61 73 65 20   case 'J': case 
6e20: 27 4b 27 3a 20 63 61 73 65 20 27 4c 27 3a 20 63  'K': case 'L': c
6e30: 61 73 65 20 27 4d 27 3a 20 63 61 73 65 20 27 4e  ase 'M': case 'N
6e40: 27 3a 20 63 61 73 65 20 27 4f 27 3a 20 63 61 73  ': case 'O': cas
6e50: 65 20 27 50 27 3a 0a 20 20 20 20 63 61 73 65 20  e 'P':.    case 
6e60: 27 51 27 3a 20 63 61 73 65 20 27 52 27 3a 20 63  'Q': case 'R': c
6e70: 61 73 65 20 27 53 27 3a 20 63 61 73 65 20 27 54  ase 'S': case 'T
6e80: 27 3a 20 63 61 73 65 20 27 55 27 3a 20 63 61 73  ': case 'U': cas
6e90: 65 20 27 56 27 3a 20 63 61 73 65 20 27 57 27 3a  e 'V': case 'W':
6ea0: 0a 20 20 20 20 63 61 73 65 20 27 58 27 3a 20 63  .    case 'X': c
6eb0: 61 73 65 20 27 59 27 3a 20 63 61 73 65 20 27 5a  ase 'Y': case 'Z
6ec0: 27 3a 20 63 61 73 65 20 27 5f 27 3a 0a 20 20 20  ': case '_':.   
6ed0: 20 20 20 77 68 69 6c 65 28 20 69 73 61 6c 6e 75     while( isalnu
6ee0: 6d 28 7a 5b 69 5d 29 20 7c 7c 20 7a 5b 69 5d 3d  m(z[i]) || z[i]=
6ef0: 3d 27 5f 27 20 29 7b 20 69 2b 2b 3b 20 7d 3b 0a  ='_' ){ i++; };.
6f00: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54        pToken->eT
6f10: 79 70 65 20 3d 20 54 54 5f 49 64 3b 0a 20 20 20  ype = TT_Id;.   
6f20: 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74     pToken->nText
6f30: 20 3d 20 69 20 2d 20 70 49 6e 2d 3e 69 3b 0a 20   = i - pIn->i;. 
6f40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
6f50: 20 63 61 73 65 20 27 3a 27 3a 20 0a 20 20 20 20   case ':': .    
6f60: 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20    pToken->eType 
6f70: 3d 20 54 54 5f 4f 74 68 65 72 3b 0a 20 20 20 20  = TT_Other;.    
6f80: 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20    pToken->nText 
6f90: 3d 20 31 20 2b 20 28 7a 5b 69 2b 31 5d 3d 3d 27  = 1 + (z[i+1]=='
6fa0: 3a 27 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  :');.      break
6fb0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 27 3d 27 3a  ;..    case '=':
6fc0: 0a 20 20 20 20 63 61 73 65 20 27 3c 27 3a 0a 20  .    case '<':. 
6fd0: 20 20 20 63 61 73 65 20 27 3e 27 3a 0a 20 20 20     case '>':.   
6fe0: 20 63 61 73 65 20 27 2b 27 3a 0a 20 20 20 20 63   case '+':.    c
6ff0: 61 73 65 20 27 2d 27 3a 0a 20 20 20 20 63 61 73  ase '-':.    cas
7000: 65 20 27 2a 27 3a 0a 20 20 20 20 63 61 73 65 20  e '*':.    case 
7010: 27 25 27 3a 0a 20 20 20 20 63 61 73 65 20 27 5e  '%':.    case '^
7020: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 26 27 3a  ':.    case '&':
7030: 0a 20 20 20 20 63 61 73 65 20 27 7c 27 3a 20 0a  .    case '|': .
7040: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54        pToken->eT
7050: 79 70 65 20 3d 20 54 54 5f 4f 74 68 65 72 3b 0a  ype = TT_Other;.
7060: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54        pToken->nT
7070: 65 78 74 20 3d 20 31 20 2b 20 28 7a 5b 69 2b 31  ext = 1 + (z[i+1
7080: 5d 3d 3d 27 3d 27 29 3b 0a 20 20 20 20 20 20 62  ]=='=');.      b
7090: 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
70a0: 6c 74 3a 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e  lt:.      pToken
70b0: 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f 4f 74 68  ->eType = TT_Oth
70c0: 65 72 3b 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e  er;.      pToken
70d0: 2d 3e 6e 54 65 78 74 20 3d 20 31 3b 0a 20 20 20  ->nText = 1;.   
70e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
70f0: 70 49 6e 2d 3e 69 20 2b 3d 20 70 54 6f 6b 65 6e  pIn->i += pToken
7100: 2d 3e 6e 54 65 78 74 3b 0a 20 20 72 65 74 75 72  ->nText;.  retur
7110: 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nErr;.}../*.**
7120: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
7130: 63 6f 76 65 72 73 20 74 68 65 20 6e 65 78 74 20  covers the next 
7140: 74 6f 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 69  token from the i
7150: 6e 70 75 74 20 66 69 6c 65 20 77 68 69 63 68 20  nput file which 
7160: 69 73 0a 2a 2a 20 6e 6f 74 20 61 20 73 70 61 63  is.** not a spac
7170: 65 20 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f  e or a comment o
7180: 72 20 61 6e 79 20 74 65 78 74 20 62 65 74 77 65  r any text betwe
7190: 65 6e 20 61 6e 20 22 23 69 66 20 30 22 20 61 6e  en an "#if 0" an
71a0: 64 20 22 23 65 6e 64 69 66 22 2e 0a 2a 2a 0a 2a  d "#endif"..**.*
71b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
71c0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
71d0: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
71e0: 75 6e 74 65 72 65 64 2e 20 20 41 6e 20 65 72 72  untered.  An err
71f0: 6f 72 0a 2a 2a 20 69 73 20 61 6e 20 75 6e 74 65  or.** is an unte
7200: 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20 6f  rminated token o
7210: 72 20 75 6e 6d 61 74 63 68 65 64 20 22 23 69 66  r unmatched "#if
7220: 20 30 22 2e 0a 2a 2a 0a 2a 2a 20 50 72 6f 66 69   0"..**.** Profi
7230: 6c 69 6e 67 20 73 68 6f 77 73 20 74 68 61 74 20  ling shows that 
7240: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  this routine use
7250: 73 20 61 62 6f 75 74 20 61 20 71 75 61 72 74 65  s about a quarte
7260: 72 20 6f 66 20 74 68 65 0a 2a 2a 20 43 50 55 20  r of the.** CPU 
7270: 74 69 6d 65 20 69 6e 20 61 20 74 79 70 69 63 61  time in a typica
7280: 6c 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  l run..*/.static
7290: 20 69 6e 74 20 47 65 74 4e 6f 6e 73 70 61 63 65   int GetNonspace
72a0: 54 6f 6b 65 6e 28 49 6e 53 74 72 65 61 6d 20 2a  Token(InStream *
72b0: 70 49 6e 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  pIn, Token *pTok
72c0: 65 6e 29 7b 0a 20 20 69 6e 74 20 6e 49 66 20 3d  en){.  int nIf =
72d0: 20 30 3b 0a 20 20 69 6e 74 20 69 6e 5a 65 72 6f   0;.  int inZero
72e0: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
72f0: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 76 61 6c  ar *z;.  int val
7300: 75 65 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 4c  ue;.  int startL
7310: 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20  ine;.  int nErr 
7320: 3d 20 30 3b 0a 0a 20 20 73 74 61 72 74 4c 69 6e  = 0;..  startLin
7330: 65 20 3d 20 70 49 6e 2d 3e 6e 4c 69 6e 65 3b 0a  e = pIn->nLine;.
7340: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
7350: 20 20 6e 45 72 72 20 2b 3d 20 47 65 74 54 6f 6b    nErr += GetTok
7360: 65 6e 28 70 49 6e 2c 70 54 6f 6b 65 6e 29 3b 0a  en(pIn,pToken);.
7370: 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 25      /* printf("%
7380: 30 34 64 3a 20 54 79 70 65 3d 25 64 20 6e 49 66  04d: Type=%d nIf
7390: 3d 25 64 20 5b 25 2e 2a 73 5d 5c 6e 22 2c 0a 20  =%d [%.*s]\n",. 
73a0: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e 4c        pToken->nL
73b0: 69 6e 65 2c 70 54 6f 6b 65 6e 2d 3e 65 54 79 70  ine,pToken->eTyp
73c0: 65 2c 6e 49 66 2c 70 54 6f 6b 65 6e 2d 3e 6e 54  e,nIf,pToken->nT
73d0: 65 78 74 2c 0a 20 20 20 20 20 20 20 70 54 6f 6b  ext,.       pTok
73e0: 65 6e 2d 3e 65 54 79 70 65 21 3d 54 54 5f 53 70  en->eType!=TT_Sp
73f0: 61 63 65 20 3f 20 70 54 6f 6b 65 6e 2d 3e 7a 54  ace ? pToken->zT
7400: 65 78 74 20 3a 20 22 3c 73 70 61 63 65 3e 22 29  ext : "<space>")
7410: 3b 20 2a 2f 0a 20 20 20 20 70 54 6f 6b 65 6e 2d  ; */.    pToken-
7420: 3e 70 43 6f 6d 6d 65 6e 74 20 3d 20 62 6c 6f 63  >pComment = bloc
7430: 6b 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 73 77  kComment;.    sw
7440: 69 74 63 68 28 20 70 54 6f 6b 65 6e 2d 3e 65 54  itch( pToken->eT
7450: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
7460: 65 20 54 54 5f 43 6f 6d 6d 65 6e 74 3a 0a 20 20  e TT_Comment:.  
7470: 20 20 20 20 63 61 73 65 20 54 54 5f 53 70 61 63      case TT_Spac
7480: 65 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e:.        break
7490: 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 54 54  ;..      case TT
74a0: 5f 42 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 3a 0a 20  _BlockComment:. 
74b0: 20 20 20 20 20 20 20 69 66 28 20 64 6f 63 5f 66         if( doc_f
74c0: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
74d0: 20 62 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20   blockComment = 
74e0: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  SafeMalloc( size
74f0: 6f 66 28 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20  of(Token) );.   
7500: 20 20 20 20 20 20 20 2a 62 6c 6f 63 6b 43 6f 6d         *blockCom
7510: 6d 65 6e 74 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  ment = *pToken;.
7520: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7530: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
7540: 63 61 73 65 20 54 54 5f 45 4f 46 3a 0a 20 20 20  case TT_EOF:.   
7550: 20 20 20 20 20 69 66 28 20 6e 49 66 20 29 7b 0a       if( nIf ){.
7560: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
7570: 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a  f(stderr,"%s:%d:
7580: 20 55 6e 74 65 72 6d 69 6e 61 74 65 64 20 5c 22   Unterminated \"
7590: 23 69 66 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20  #if\"\n",.      
75a0: 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65         zFilename
75b0: 2c 20 73 74 61 72 74 4c 69 6e 65 29 3b 0a 20 20  , startLine);.  
75c0: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
75d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
75e0: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 0a    return nErr;..
75f0: 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 50 72        case TT_Pr
7600: 65 70 72 6f 63 65 73 73 6f 72 3a 0a 20 20 20 20  eprocessor:.    
7610: 20 20 20 20 7a 20 3d 20 26 70 54 6f 6b 65 6e 2d      z = &pToken-
7620: 3e 7a 54 65 78 74 5b 31 5d 3b 0a 20 20 20 20 20  >zText[1];.     
7630: 20 20 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 27 20     while( *z==' 
7640: 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 29 20  ' || *z=='\t' ) 
7650: 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  z++;.        if(
7660: 20 73 73 63 61 6e 66 28 7a 2c 22 69 66 20 25 64   sscanf(z,"if %d
7670: 22 2c 26 76 61 6c 75 65 29 3d 3d 31 20 26 26 20  ",&value)==1 && 
7680: 76 61 6c 75 65 3d 3d 30 20 29 7b 0a 20 20 20 20  value==0 ){.    
7690: 20 20 20 20 20 20 6e 49 66 2b 2b 3b 0a 20 20 20        nIf++;.   
76a0: 20 20 20 20 20 20 20 69 6e 5a 65 72 6f 20 3d 20         inZero = 
76b0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
76c0: 20 69 66 28 20 69 6e 5a 65 72 6f 20 29 7b 0a 20   if( inZero ){. 
76d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
76e0: 6e 63 6d 70 28 7a 2c 22 69 66 22 2c 32 29 3d 3d  ncmp(z,"if",2)==
76f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7700: 20 6e 49 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20   nIf++;.        
7710: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
7720: 63 6d 70 28 7a 2c 22 65 6e 64 69 66 22 2c 35 29  cmp(z,"endif",5)
7730: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7740: 20 20 20 6e 49 66 2d 2d 3b 0a 20 20 20 20 20 20     nIf--;.      
7750: 20 20 20 20 20 20 69 66 28 20 6e 49 66 3d 3d 30        if( nIf==0
7760: 20 29 20 69 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20   ) inZero = 0;. 
7770: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7780: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7790: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b      return nErr;
77a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
77b0: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
77c0: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
77d0: 20 20 69 66 28 20 21 69 6e 5a 65 72 6f 20 29 7b    if( !inZero ){
77e0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
77f0: 6e 20 6e 45 72 72 3b 0a 20 20 20 20 20 20 20 20  n nErr;.        
7800: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
7810: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
7820: 4e 4f 54 20 52 45 41 43 48 45 44 20 2a 2f 0a 7d  NOT REACHED */.}
7830: 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
7840: 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20  utine looks for 
7850: 69 64 65 6e 74 69 66 69 65 72 73 20 28 73 74 72  identifiers (str
7860: 69 6e 67 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f  ings of contiguo
7870: 75 73 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 0a  us alphanumeric.
7880: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 29 20 77  ** characters) w
7890: 69 74 68 69 6e 20 61 20 70 72 65 70 72 6f 63 65  ithin a preproce
78a0: 73 73 6f 72 20 64 69 72 65 63 74 69 76 65 20 61  ssor directive a
78b0: 6e 64 20 61 64 64 73 20 65 76 65 72 79 20 73 75  nd adds every su
78c0: 63 68 20 73 74 72 69 6e 67 0a 2a 2a 20 66 6f 75  ch string.** fou
78d0: 6e 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nd to the given 
78e0: 69 64 65 6e 74 69 66 69 65 72 20 74 61 62 6c 65  identifier table
78f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7900: 46 69 6e 64 49 64 65 6e 74 69 66 69 65 72 73 49  FindIdentifiersI
7910: 6e 4d 61 63 72 6f 28 54 6f 6b 65 6e 20 2a 70 54  nMacro(Token *pT
7920: 6f 6b 65 6e 2c 20 49 64 65 6e 74 54 61 62 6c 65  oken, IdentTable
7930: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 6f 6b   *pTable){.  Tok
7940: 65 6e 20 73 54 6f 6b 65 6e 3b 0a 20 20 49 6e 53  en sToken;.  InS
7950: 74 72 65 61 6d 20 73 49 6e 3b 0a 20 20 69 6e 74  tream sIn;.  int
7960: 20 67 6f 20 3d 20 31 3b 0a 0a 20 20 73 49 6e 2e   go = 1;..  sIn.
7970: 7a 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78  z = pToken->zTex
7980: 74 3b 0a 20 20 73 49 6e 2e 69 20 3d 20 31 3b 0a  t;.  sIn.i = 1;.
7990: 20 20 73 49 6e 2e 6e 4c 69 6e 65 20 3d 20 31 3b    sIn.nLine = 1;
79a0: 0a 20 20 77 68 69 6c 65 28 20 67 6f 20 26 26 20  .  while( go && 
79b0: 73 49 6e 2e 69 20 3c 20 70 54 6f 6b 65 6e 2d 3e  sIn.i < pToken->
79c0: 6e 54 65 78 74 20 29 7b 0a 20 20 20 20 47 65 74  nText ){.    Get
79d0: 54 6f 6b 65 6e 28 26 73 49 6e 2c 26 73 54 6f 6b  Token(&sIn,&sTok
79e0: 65 6e 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  en);.    switch(
79f0: 20 73 54 6f 6b 65 6e 2e 65 54 79 70 65 20 29 7b   sToken.eType ){
7a00: 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 49  .      case TT_I
7a10: 64 3a 0a 20 20 20 20 20 20 20 20 49 64 65 6e 74  d:.        Ident
7a20: 54 61 62 6c 65 49 6e 73 65 72 74 28 70 54 61 62  TableInsert(pTab
7a30: 6c 65 2c 73 54 6f 6b 65 6e 2e 7a 54 65 78 74 2c  le,sToken.zText,
7a40: 73 54 6f 6b 65 6e 2e 6e 54 65 78 74 29 3b 0a 20  sToken.nText);. 
7a50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
7a60: 20 20 20 20 20 63 61 73 65 20 54 54 5f 45 4f 46       case TT_EOF
7a70: 3a 0a 20 20 20 20 20 20 20 20 67 6f 20 3d 20 30  :.        go = 0
7a80: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7a90: 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ..      default:
7aa0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7ab0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
7ac0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7ad0: 67 65 74 73 20 74 68 65 20 6e 65 78 74 20 74 6f  gets the next to
7ae0: 6b 65 6e 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ken.  Everything
7af0: 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
7b00: 6e 0a 2a 2a 20 7b 2e 2e 2e 7d 20 69 73 20 63 6f  n.** {...} is co
7b10: 6c 6c 61 70 73 65 64 20 69 6e 74 6f 20 61 20 73  llapsed into a s
7b20: 69 6e 67 6c 65 20 54 54 5f 42 72 61 63 65 73 20  ingle TT_Braces 
7b30: 74 6f 6b 65 6e 2e 20 20 57 68 69 74 65 73 70 61  token.  Whitespa
7b40: 63 65 20 69 73 0a 2a 2a 20 6f 6d 69 74 74 65 64  ce is.** omitted
7b50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 61 62 6c  ..**.** If pTabl
7b60: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
7b70: 68 65 6e 20 69 6e 73 65 72 74 20 65 76 65 72 79  hen insert every
7b80: 20 69 64 65 6e 74 69 66 69 65 72 20 73 65 65 6e   identifier seen
7b90: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 49 64 65   into the.** Ide
7ba0: 6e 74 54 61 62 6c 65 2e 20 20 54 68 69 73 20 69  ntTable.  This i
7bb0: 6e 63 6c 75 64 65 73 20 61 6e 79 20 69 64 65 6e  ncludes any iden
7bc0: 74 69 66 69 65 72 73 20 73 65 65 6e 20 69 6e 73  tifiers seen ins
7bd0: 69 64 65 20 6f 66 20 7b 2e 2e 2e 7d 2e 0a 2a 2a  ide of {...}..**
7be0: 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
7bf0: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
7c00: 65 72 65 64 20 69 73 20 72 65 74 75 72 6e 65 64  ered is returned
7c10: 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 61  .  An error is a
7c20: 6e 0a 2a 2a 20 75 6e 74 65 72 6d 69 6e 61 74 65  n.** unterminate
7c30: 64 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74  d token..*/.stat
7c40: 69 63 20 69 6e 74 20 47 65 74 42 69 67 54 6f 6b  ic int GetBigTok
7c50: 65 6e 28 49 6e 53 74 72 65 61 6d 20 2a 70 49 6e  en(InStream *pIn
7c60: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  , Token *pToken,
7c70: 20 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 54 61   IdentTable *pTa
7c80: 62 6c 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  ble){.  const ch
7c90: 61 72 20 2a 7a 2c 20 2a 7a 53 74 61 72 74 3b 0a  ar *z, *zStart;.
7ca0: 20 20 69 6e 74 20 69 53 74 61 72 74 3b 0a 20 20    int iStart;.  
7cb0: 69 6e 74 20 6e 42 72 61 63 65 3b 0a 20 20 69 6e  int nBrace;.  in
7cc0: 74 20 63 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  t c;.  int nLine
7cd0: 3b 0a 20 20 69 6e 74 20 6e 45 72 72 3b 0a 0a 20  ;.  int nErr;.. 
7ce0: 20 6e 45 72 72 20 3d 20 47 65 74 4e 6f 6e 73 70   nErr = GetNonsp
7cf0: 61 63 65 54 6f 6b 65 6e 28 70 49 6e 2c 70 54 6f  aceToken(pIn,pTo
7d00: 6b 65 6e 29 3b 0a 20 20 73 77 69 74 63 68 28 20  ken);.  switch( 
7d10: 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 29 7b  pToken->eType ){
7d20: 0a 20 20 20 20 63 61 73 65 20 54 54 5f 49 64 3a  .    case TT_Id:
7d30: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 6c  .      if( pTabl
7d40: 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
7d50: 49 64 65 6e 74 54 61 62 6c 65 49 6e 73 65 72 74  IdentTableInsert
7d60: 28 70 54 61 62 6c 65 2c 70 54 6f 6b 65 6e 2d 3e  (pTable,pToken->
7d70: 7a 54 65 78 74 2c 70 54 6f 6b 65 6e 2d 3e 6e 54  zText,pToken->nT
7d80: 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ext);.      }.  
7d90: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b      return nErr;
7da0: 0a 0a 20 20 20 20 63 61 73 65 20 54 54 5f 50 72  ..    case TT_Pr
7db0: 65 70 72 6f 63 65 73 73 6f 72 3a 0a 20 20 20 20  eprocessor:.    
7dc0: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
7dd0: 29 7b 0a 20 20 20 20 20 20 20 20 46 69 6e 64 49  ){.        FindI
7de0: 64 65 6e 74 69 66 69 65 72 73 49 6e 4d 61 63 72  dentifiersInMacr
7df0: 6f 28 70 54 6f 6b 65 6e 2c 70 54 61 62 6c 65 29  o(pToken,pTable)
7e00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7e10: 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 0a 20 20  return nErr;..  
7e20: 20 20 63 61 73 65 20 54 54 5f 4f 74 68 65 72 3a    case TT_Other:
7e30: 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65  .      if( pToke
7e40: 6e 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 7b 27  n->zText[0]=='{'
7e50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
7e60: 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 0a 20 20  return nErr;..  
7e70: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
7e80: 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20   return nErr;.  
7e90: 7d 0a 0a 20 20 7a 20 3d 20 70 49 6e 2d 3e 7a 3b  }..  z = pIn->z;
7ea0: 0a 20 20 69 53 74 61 72 74 20 3d 20 70 49 6e 2d  .  iStart = pIn-
7eb0: 3e 69 3b 0a 20 20 7a 53 74 61 72 74 20 3d 20 70  >i;.  zStart = p
7ec0: 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 3b 0a 20 20  Token->zText;.  
7ed0: 6e 4c 69 6e 65 20 3d 20 70 54 6f 6b 65 6e 2d 3e  nLine = pToken->
7ee0: 6e 4c 69 6e 65 3b 0a 20 20 6e 42 72 61 63 65 20  nLine;.  nBrace 
7ef0: 3d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 6e 42  = 1;.  while( nB
7f00: 72 61 63 65 20 29 7b 0a 20 20 20 20 6e 45 72 72  race ){.    nErr
7f10: 20 2b 3d 20 47 65 74 4e 6f 6e 73 70 61 63 65 54   += GetNonspaceT
7f20: 6f 6b 65 6e 28 70 49 6e 2c 70 54 6f 6b 65 6e 29  oken(pIn,pToken)
7f30: 3b 0a 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28  ;.    /* printf(
7f40: 22 25 30 34 64 3a 20 6e 42 72 61 63 65 3d 25 64  "%04d: nBrace=%d
7f50: 20 5b 25 2e 2a 73 5d 5c 6e 22 2c 70 54 6f 6b 65   [%.*s]\n",pToke
7f60: 6e 2d 3e 6e 4c 69 6e 65 2c 6e 42 72 61 63 65 2c  n->nLine,nBrace,
7f70: 0a 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e  .       pToken->
7f80: 6e 54 65 78 74 2c 70 54 6f 6b 65 6e 2d 3e 7a 54  nText,pToken->zT
7f90: 65 78 74 29 3b 20 2a 2f 0a 20 20 20 20 73 77 69  ext); */.    swi
7fa0: 74 63 68 28 20 70 54 6f 6b 65 6e 2d 3e 65 54 79  tch( pToken->eTy
7fb0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
7fc0: 20 54 54 5f 45 4f 46 3a 0a 20 20 20 20 20 20 20   TT_EOF:.       
7fd0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
7fe0: 22 25 73 3a 25 64 3a 20 55 6e 74 65 72 6d 69 6e  "%s:%d: Untermin
7ff0: 61 74 65 64 20 5c 22 7b 5c 22 5c 6e 22 2c 0a 20  ated \"{\"\n",. 
8000: 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
8010: 61 6d 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20  ame, nLine);.   
8020: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
8030: 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79       pToken->eTy
8040: 70 65 20 3d 20 54 54 5f 45 72 72 6f 72 3b 0a 20  pe = TT_Error;. 
8050: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45         return nE
8060: 72 72 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  rr;..      case 
8070: 54 54 5f 49 64 3a 0a 20 20 20 20 20 20 20 20 69  TT_Id:.        i
8080: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
8090: 20 20 20 20 20 20 20 49 64 65 6e 74 54 61 62 6c         IdentTabl
80a0: 65 49 6e 73 65 72 74 28 70 54 61 62 6c 65 2c 70  eInsert(pTable,p
80b0: 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 2c 70 54 6f  Token->zText,pTo
80c0: 6b 65 6e 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 20  ken->nText);.   
80d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
80e0: 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 20 20 63  reak;.  .      c
80f0: 61 73 65 20 54 54 5f 50 72 65 70 72 6f 63 65 73  ase TT_Preproces
8100: 73 6f 72 3a 0a 20 20 20 20 20 20 20 20 69 66 28  sor:.        if(
8110: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
8120: 20 20 20 20 20 20 20 20 46 69 6e 64 49 64 65 6e          FindIden
8130: 74 69 66 69 65 72 73 49 6e 4d 61 63 72 6f 28 70  tifiersInMacro(p
8140: 54 6f 6b 65 6e 2c 70 54 61 62 6c 65 29 3b 0a 20  Token,pTable);. 
8150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8160: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
8170: 61 73 65 20 54 54 5f 4f 74 68 65 72 3a 0a 20 20  ase TT_Other:.  
8180: 20 20 20 20 20 20 69 66 28 20 28 63 20 3d 20 70        if( (c = p
8190: 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 5b 30 5d 29  Token->zText[0])
81a0: 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='{' ){.       
81b0: 20 20 20 6e 42 72 61 63 65 2b 2b 3b 0a 20 20 20     nBrace++;.   
81c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
81d0: 3d 3d 27 7d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='}' ){.       
81e0: 20 20 20 6e 42 72 61 63 65 2d 2d 3b 0a 20 20 20     nBrace--;.   
81f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
8200: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66  reak;..      def
8210: 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 62 72  ault:.        br
8220: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
8230: 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d   pToken->eType =
8240: 20 54 54 5f 42 72 61 63 65 73 3b 0a 20 20 70 54   TT_Braces;.  pT
8250: 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 31 20  oken->nText = 1 
8260: 2b 20 70 49 6e 2d 3e 69 20 2d 20 69 53 74 61 72  + pIn->i - iStar
8270: 74 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 7a 54 65  t;.  pToken->zTe
8280: 78 74 20 3d 20 7a 53 74 61 72 74 3b 0a 20 20 70  xt = zStart;.  p
8290: 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 20 3d 20 6e  Token->nLine = n
82a0: 4c 69 6e 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Line;.  return n
82b0: 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Err;.}../*.** Th
82c0: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 65 65 73  is routine frees
82d0: 20 75 70 20 61 20 6c 69 73 74 20 6f 66 20 54 6f   up a list of To
82e0: 6b 65 6e 73 2e 20 20 54 68 65 20 70 43 6f 6d 6d  kens.  The pComm
82f0: 65 6e 74 20 74 6f 6b 65 6e 73 20 61 72 65 0a 2a  ent tokens are.*
8300: 2a 20 6e 6f 74 20 63 6c 65 61 72 65 64 20 62 79  * not cleared by
8310: 20 74 68 69 73 2e 20 20 53 6f 20 77 65 20 6c 65   this.  So we le
8320: 61 6b 20 61 20 6c 69 74 74 6c 65 20 6d 65 6d 6f  ak a little memo
8330: 72 79 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68  ry when using th
8340: 65 20 2d 64 6f 63 0a 2a 2a 20 6f 70 74 69 6f 6e  e -doc.** option
8350: 2e 20 20 53 6f 20 77 68 61 74 2e 0a 2a 2f 0a 73  .  So what..*/.s
8360: 74 61 74 69 63 20 76 6f 69 64 20 46 72 65 65 54  tatic void FreeT
8370: 6f 6b 65 6e 4c 69 73 74 28 54 6f 6b 65 6e 20 2a  okenList(Token *
8380: 70 4c 69 73 74 29 7b 0a 20 20 54 6f 6b 65 6e 20  pList){.  Token 
8390: 2a 70 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65 28  *pNext;.  while(
83a0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 70 4e   pList ){.    pN
83b0: 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 4e 65  ext = pList->pNe
83c0: 78 74 3b 0a 20 20 20 20 53 61 66 65 46 72 65 65  xt;.    SafeFree
83d0: 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69  (pList);.    pLi
83e0: 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a  st = pNext;.  }.
83f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 69 7a  }../*.** Tokeniz
8400: 65 20 61 6e 20 65 6e 74 69 72 65 20 66 69 6c 65  e an entire file
8410: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
8420: 74 65 72 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ter to the list 
8430: 6f 66 20 74 6f 6b 65 6e 73 2e 0a 2a 2a 0a 2a 2a  of tokens..**.**
8440: 20 53 70 61 63 65 20 66 6f 72 20 65 61 63 68 20   Space for each 
8450: 74 6f 6b 65 6e 20 69 73 20 6f 62 74 61 69 6e 65  token is obtaine
8460: 64 20 66 72 6f 6d 20 61 20 73 65 70 61 72 61 74  d from a separat
8470: 65 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6c 6c 2e  e malloc() call.
8480: 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
8490: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
84a0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65  ponsible for fre
84b0: 65 69 6e 67 20 74 68 69 73 20 73 70 61 63 65 2e  eing this space.
84c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 61 62 6c 65  .**.** If pTable
84d0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
84e0: 65 6e 20 66 69 6c 6c 20 74 68 65 20 74 61 62 6c  en fill the tabl
84f0: 65 20 77 69 74 68 20 61 6c 6c 20 69 64 65 6e 74  e with all ident
8500: 69 66 69 65 72 73 20 73 65 65 6e 20 69 6e 0a 2a  ifiers seen in.*
8510: 2a 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  * the input file
8520: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 6f 6b 65  ..*/.static Toke
8530: 6e 20 2a 54 6f 6b 65 6e 69 7a 65 46 69 6c 65 28  n *TokenizeFile(
8540: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
8550: 65 2c 20 49 64 65 6e 74 54 61 62 6c 65 20 2a 70  e, IdentTable *p
8560: 54 61 62 6c 65 29 7b 0a 20 20 49 6e 53 74 72 65  Table){.  InStre
8570: 61 6d 20 73 49 6e 3b 0a 20 20 54 6f 6b 65 6e 20  am sIn;.  Token 
8580: 2a 70 46 69 72 73 74 20 3d 20 30 2c 20 2a 70 4c  *pFirst = 0, *pL
8590: 61 73 74 20 3d 20 30 2c 20 2a 70 4e 65 77 3b 0a  ast = 0, *pNew;.
85a0: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
85b0: 0a 20 20 73 49 6e 2e 7a 20 3d 20 7a 46 69 6c 65  .  sIn.z = zFile
85c0: 3b 0a 20 20 73 49 6e 2e 69 20 3d 20 30 3b 0a 20  ;.  sIn.i = 0;. 
85d0: 20 73 49 6e 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a   sIn.nLine = 1;.
85e0: 20 20 62 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 20 3d    blockComment =
85f0: 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 73 49   0;..  while( sI
8600: 6e 2e 7a 5b 73 49 6e 2e 69 5d 21 3d 30 20 29 7b  n.z[sIn.i]!=0 ){
8610: 0a 20 20 20 20 70 4e 65 77 20 3d 20 53 61 66 65  .    pNew = Safe
8620: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  Malloc( sizeof(T
8630: 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 6e 45 72  oken) );.    nEr
8640: 72 20 2b 3d 20 47 65 74 42 69 67 54 6f 6b 65 6e  r += GetBigToken
8650: 28 26 73 49 6e 2c 70 4e 65 77 2c 70 54 61 62 6c  (&sIn,pNew,pTabl
8660: 65 29 3b 0a 20 20 20 20 64 65 62 75 67 33 28 54  e);.    debug3(T
8670: 4f 4b 45 4e 49 5a 45 52 2c 20 22 54 6f 6b 65 6e  OKENIZER, "Token
8680: 20 6f 6e 20 6c 69 6e 65 20 25 64 3a 20 5b 25 2e   on line %d: [%.
8690: 2a 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70  *s]\n",.       p
86a0: 4e 65 77 2d 3e 6e 4c 69 6e 65 2c 20 70 4e 65 77  New->nLine, pNew
86b0: 2d 3e 6e 54 65 78 74 3c 35 30 20 3f 20 70 4e 65  ->nText<50 ? pNe
86c0: 77 2d 3e 6e 54 65 78 74 20 3a 20 35 30 2c 20 70  w->nText : 50, p
86d0: 4e 65 77 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20  New->zText);.   
86e0: 20 69 66 28 20 70 46 69 72 73 74 3d 3d 30 20 29   if( pFirst==0 )
86f0: 7b 0a 20 20 20 20 20 20 70 46 69 72 73 74 20 3d  {.      pFirst =
8700: 20 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pLast = pNew;. 
8710: 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 65 76       pNew->pPrev
8720: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
8730: 0a 20 20 20 20 20 20 70 4c 61 73 74 2d 3e 70 4e  .      pLast->pN
8740: 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ext = pNew;.    
8750: 20 20 70 4e 65 77 2d 3e 70 50 72 65 76 20 3d 20    pNew->pPrev = 
8760: 70 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 4c 61  pLast;.      pLa
8770: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  st = pNew;.    }
8780: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 65  .    if( pNew->e
8790: 54 79 70 65 3d 3d 54 54 5f 45 4f 46 20 29 20 62  Type==TT_EOF ) b
87a0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
87b0: 70 4c 61 73 74 20 29 20 70 4c 61 73 74 2d 3e 70  pLast ) pLast->p
87c0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 62 6c 6f 63  Next = 0;.  bloc
87d0: 6b 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  kComment = 0;.  
87e0: 69 66 28 20 6e 45 72 72 20 29 7b 0a 20 20 20 20  if( nErr ){.    
87f0: 46 72 65 65 54 6f 6b 65 6e 4c 69 73 74 28 70 46  FreeTokenList(pF
8800: 69 72 73 74 29 3b 0a 20 20 20 20 70 46 69 72 73  irst);.    pFirs
8810: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
8820: 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a  turn pFirst;.}..
8830: 23 69 66 20 54 45 53 54 3d 3d 31 0a 2f 2a 0a 2a  #if TEST==1./*.*
8840: 2a 20 55 73 65 20 74 68 65 20 66 6f 6c 6c 6f 77  * Use the follow
8850: 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 74  ing routine to t
8860: 65 73 74 20 6f 72 20 64 65 62 75 67 20 74 68 65  est or debug the
8870: 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 2a 2f 0a 76   tokenizer..*/.v
8880: 6f 69 64 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  oid main(int arg
8890: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
88a0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
88b0: 20 20 54 6f 6b 65 6e 20 2a 70 4c 69 73 74 2c 20    Token *pList, 
88c0: 2a 70 3b 0a 20 20 49 64 65 6e 74 54 61 62 6c 65  *p;.  IdentTable
88d0: 20 73 54 61 62 6c 65 3b 0a 0a 20 20 69 66 28 20   sTable;..  if( 
88e0: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 66  argc!=2 ){.    f
88f0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55  printf(stderr,"U
8900: 73 61 67 65 3a 20 25 73 20 66 69 6c 65 6e 61 6d  sage: %s filenam
8910: 65 5c 6e 22 2c 2a 61 72 67 76 29 3b 0a 20 20 20  e\n",*argv);.   
8920: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
8930: 6d 65 6d 73 65 74 28 26 73 54 61 62 6c 65 2c 30  memset(&sTable,0
8940: 2c 73 69 7a 65 6f 66 28 73 54 61 62 6c 65 29 29  ,sizeof(sTable))
8950: 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 52 65 61 64  ;.  zFile = Read
8960: 46 69 6c 65 28 61 72 67 76 5b 31 5d 29 3b 0a 20  File(argv[1]);. 
8970: 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b   if( zFile==0 ){
8980: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
8990: 65 72 72 2c 22 43 61 6e 27 74 20 72 65 61 64 20  err,"Can't read 
89a0: 66 69 6c 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 61  file \"%s\"\n",a
89b0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 78 69  rgv[1]);.    exi
89c0: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  t(1);.  }.  pLis
89d0: 74 20 3d 20 54 6f 6b 65 6e 69 7a 65 46 69 6c 65  t = TokenizeFile
89e0: 28 7a 46 69 6c 65 2c 26 73 54 61 62 6c 65 29 3b  (zFile,&sTable);
89f0: 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
8a00: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
8a10: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 73      int j;.    s
8a20: 77 69 74 63 68 28 20 70 2d 3e 65 54 79 70 65 20  witch( p->eType 
8a30: 29 7b 20 0a 20 20 20 20 20 20 63 61 73 65 20 54  ){ .      case T
8a40: 54 5f 53 70 61 63 65 3a 0a 20 20 20 20 20 20 20  T_Space:.       
8a50: 20 70 72 69 6e 74 66 28 22 25 34 64 3a 20 53 70   printf("%4d: Sp
8a60: 61 63 65 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 29  ace\n",p->nLine)
8a70: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
8a80: 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 49  .      case TT_I
8a90: 64 3a 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  d:.        print
8aa0: 66 28 22 25 34 64 3a 20 49 64 20 20 20 20 20 20  f("%4d: Id      
8ab0: 20 20 20 20 20 25 2e 2a 73 5c 6e 22 2c 70 2d 3e       %.*s\n",p->
8ac0: 6e 4c 69 6e 65 2c 70 2d 3e 6e 54 65 78 74 2c 70  nLine,p->nText,p
8ad0: 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20  ->zText);.      
8ae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8af0: 61 73 65 20 54 54 5f 50 72 65 70 72 6f 63 65 73  ase TT_Preproces
8b00: 73 6f 72 3a 0a 20 20 20 20 20 20 20 20 70 72 69  sor:.        pri
8b10: 6e 74 66 28 22 25 34 64 3a 20 50 72 65 70 72 6f  ntf("%4d: Prepro
8b20: 63 65 73 73 6f 72 20 25 2e 2a 73 5c 6e 22 2c 70  cessor %.*s\n",p
8b30: 2d 3e 6e 4c 69 6e 65 2c 70 2d 3e 6e 54 65 78 74  ->nLine,p->nText
8b40: 2c 70 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20  ,p->zText);.    
8b50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8b60: 20 63 61 73 65 20 54 54 5f 43 6f 6d 6d 65 6e 74   case TT_Comment
8b70: 3a 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  :.        printf
8b80: 28 22 25 34 64 3a 20 43 6f 6d 6d 65 6e 74 5c 6e  ("%4d: Comment\n
8b90: 22 2c 70 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20  ",p->nLine);.   
8ba0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8bb0: 20 20 63 61 73 65 20 54 54 5f 42 6c 6f 63 6b 43    case TT_BlockC
8bc0: 6f 6d 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20  omment:.        
8bd0: 70 72 69 6e 74 66 28 22 25 34 64 3a 20 42 6c 6f  printf("%4d: Blo
8be0: 63 6b 20 43 6f 6d 6d 65 6e 74 5c 6e 22 2c 70 2d  ck Comment\n",p-
8bf0: 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20  >nLine);.       
8c00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8c10: 73 65 20 54 54 5f 4e 75 6d 62 65 72 3a 0a 20 20  se TT_Number:.  
8c20: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 34        printf("%4
8c30: 64 3a 20 4e 75 6d 62 65 72 20 20 20 20 20 20 20  d: Number       
8c40: 25 2e 2a 73 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65  %.*s\n",p->nLine
8c50: 2c 70 2d 3e 6e 54 65 78 74 2c 70 2d 3e 7a 54 65  ,p->nText,p->zTe
8c60: 78 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  xt);.        bre
8c70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 54  ak;.      case T
8c80: 54 5f 53 74 72 69 6e 67 3a 0a 20 20 20 20 20 20  T_String:.      
8c90: 20 20 70 72 69 6e 74 66 28 22 25 34 64 3a 20 53    printf("%4d: S
8ca0: 74 72 69 6e 67 20 20 20 20 20 20 20 25 2e 2a 73  tring       %.*s
8cb0: 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 2c 70 2d 3e  \n",p->nLine,p->
8cc0: 6e 54 65 78 74 2c 70 2d 3e 7a 54 65 78 74 29 3b  nText,p->zText);
8cd0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
8ce0: 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 4f 74        case TT_Ot
8cf0: 68 65 72 3a 0a 20 20 20 20 20 20 20 20 70 72 69  her:.        pri
8d00: 6e 74 66 28 22 25 34 64 3a 20 4f 74 68 65 72 20  ntf("%4d: Other 
8d10: 20 20 20 20 20 20 20 25 2e 2a 73 5c 6e 22 2c 70         %.*s\n",p
8d20: 2d 3e 6e 4c 69 6e 65 2c 70 2d 3e 6e 54 65 78 74  ->nLine,p->nText
8d30: 2c 70 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20  ,p->zText);.    
8d40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8d50: 20 63 61 73 65 20 54 54 5f 42 72 61 63 65 73 3a   case TT_Braces:
8d60: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
8d70: 3b 20 6a 3c 70 2d 3e 6e 54 65 78 74 20 26 26 20  ; j<p->nText && 
8d80: 6a 3c 33 30 20 26 26 20 70 2d 3e 7a 54 65 78 74  j<30 && p->zText
8d90: 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 7b  [j]!='\n'; j++){
8da0: 7d 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  }.        printf
8db0: 28 22 25 34 64 3a 20 42 72 61 63 65 73 20 20 20  ("%4d: Braces   
8dc0: 20 20 20 20 25 2e 2a 73 2e 2e 2e 7d 5c 6e 22 2c      %.*s...}\n",
8dd0: 70 2d 3e 6e 4c 69 6e 65 2c 6a 2c 70 2d 3e 7a 54  p->nLine,j,p->zT
8de0: 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ext);.        br
8df0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8e00: 54 54 5f 45 4f 46 3a 0a 20 20 20 20 20 20 20 20  TT_EOF:.        
8e10: 70 72 69 6e 74 66 28 22 25 34 64 3a 20 45 6e 64  printf("%4d: End
8e20: 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 70 2d 3e 6e   of file\n",p->n
8e30: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 62  Line);.        b
8e40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
8e50: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 70 72 69  ult:.        pri
8e60: 6e 74 66 28 22 25 34 64 3a 20 74 79 70 65 20 25  ntf("%4d: type %
8e70: 64 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 2c 70 2d  d\n",p->nLine,p-
8e80: 3e 65 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20  >eType);.       
8e90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8ea0: 7d 0a 20 20 46 72 65 65 54 6f 6b 65 6e 4c 69 73  }.  FreeTokenLis
8eb0: 74 28 70 4c 69 73 74 29 3b 0a 20 20 53 61 66 65  t(pList);.  Safe
8ec0: 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 49  Free(zFile);.  I
8ed0: 64 65 6e 74 54 61 62 6c 65 50 72 69 6e 74 28 26  dentTablePrint(&
8ee0: 73 54 61 62 6c 65 2c 73 74 64 6f 75 74 29 3b 0a  sTable,stdout);.
8ef0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
8f00: 20 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 46 6f 72   DEBUG./*.** For
8f10: 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f   debugging purpo
8f20: 73 65 73 2c 20 77 72 69 74 65 20 6f 75 74 20 61  ses, write out a
8f30: 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73 2e   list of tokens.
8f40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8f50: 50 72 69 6e 74 54 6f 6b 65 6e 73 28 54 6f 6b 65  PrintTokens(Toke
8f60: 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e  n *pFirst, Token
8f70: 20 2a 70 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20   *pLast){.  int 
8f80: 6e 65 65 64 53 70 61 63 65 20 3d 20 30 3b 0a 20  needSpace = 0;. 
8f90: 20 69 6e 74 20 63 3b 0a 0a 20 20 70 4c 61 73 74   int c;..  pLast
8fa0: 20 3d 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74 3b   = pLast->pNext;
8fb0: 0a 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74  .  while( pFirst
8fc0: 21 3d 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 73  !=pLast ){.    s
8fd0: 77 69 74 63 68 28 20 70 46 69 72 73 74 2d 3e 65  witch( pFirst->e
8fe0: 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Type ){.      ca
8ff0: 73 65 20 54 54 5f 50 72 65 70 72 6f 63 65 73 73  se TT_Preprocess
9000: 6f 72 3a 0a 20 20 20 20 20 20 20 20 70 72 69 6e  or:.        prin
9010: 74 66 28 22 5c 6e 25 2e 2a 73 5c 6e 22 2c 70 46  tf("\n%.*s\n",pF
9020: 69 72 73 74 2d 3e 6e 54 65 78 74 2c 70 46 69 72  irst->nText,pFir
9030: 73 74 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20  st->zText);.    
9040: 20 20 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20      needSpace = 
9050: 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  0;.        break
9060: 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 54 54  ;..      case TT
9070: 5f 49 64 3a 0a 20 20 20 20 20 20 63 61 73 65 20  _Id:.      case 
9080: 54 54 5f 4e 75 6d 62 65 72 3a 0a 20 20 20 20 20  TT_Number:.     
9090: 20 20 20 70 72 69 6e 74 66 28 22 25 73 25 2e 2a     printf("%s%.*
90a0: 73 22 2c 20 6e 65 65 64 53 70 61 63 65 20 3f 20  s", needSpace ? 
90b0: 22 20 22 20 3a 20 22 22 2c 20 70 46 69 72 73 74  " " : "", pFirst
90c0: 2d 3e 6e 54 65 78 74 2c 20 70 46 69 72 73 74 2d  ->nText, pFirst-
90d0: 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20  >zText);.       
90e0: 20 6e 65 65 64 53 70 61 63 65 20 3d 20 31 3b 0a   needSpace = 1;.
90f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
9100: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
9110: 20 20 20 20 20 20 20 63 20 3d 20 70 46 69 72 73         c = pFirs
9120: 74 2d 3e 7a 54 65 78 74 5b 30 5d 3b 0a 20 20 20  t->zText[0];.   
9130: 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 25       printf("%s%
9140: 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  .*s", .         
9150: 20 28 6e 65 65 64 53 70 61 63 65 20 26 26 20 28   (needSpace && (
9160: 63 3d 3d 27 2a 27 20 7c 7c 20 63 3d 3d 27 7b 27  c=='*' || c=='{'
9170: 29 29 20 3f 20 22 20 22 20 3a 20 22 22 2c 0a 20  )) ? " " : "",. 
9180: 20 20 20 20 20 20 20 20 20 70 46 69 72 73 74 2d           pFirst-
9190: 3e 6e 54 65 78 74 2c 20 70 46 69 72 73 74 2d 3e  >nText, pFirst->
91a0: 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  zText);.        
91b0: 6e 65 65 64 53 70 61 63 65 20 3d 20 70 46 69 72  needSpace = pFir
91c0: 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 2c  st->zText[0]==',
91d0: 27 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ';.        break
91e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 72  ;.    }.    pFir
91f0: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 4e 65  st = pFirst->pNe
9200: 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  xt;.  }.}.#endif
9210: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
9220: 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f  a sequence of to
9230: 6b 65 6e 73 20 69 6e 74 6f 20 61 20 73 74 72 69  kens into a stri
9240: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  ng and return a 
9250: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
9260: 61 74 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63  at string.  Spac
9270: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 74  e to hold the st
9280: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
9290: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a   from malloc().*
92a0: 2a 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  * and must be fr
92b0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
92c0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ng function..**.
92d0: 2a 2a 20 43 65 72 74 61 69 6e 20 6b 65 79 77 6f  ** Certain keywo
92e0: 72 64 73 20 28 45 58 50 4f 52 54 2c 20 50 52 49  rds (EXPORT, PRI
92f0: 56 41 54 45 2c 20 50 55 42 4c 49 43 2c 20 50 52  VATE, PUBLIC, PR
9300: 4f 54 45 43 54 45 44 29 20 61 72 65 20 61 6c 77  OTECTED) are alw
9310: 61 79 73 0a 2a 2a 20 73 6b 69 70 70 65 64 2e 0a  ays.** skipped..
9320: 2a 2a 0a 2a 2a 20 49 66 20 70 53 6b 69 70 21 3d  **.** If pSkip!=
9330: 30 20 74 68 65 6e 20 73 6b 69 70 20 6f 76 65 72  0 then skip over
9340: 20 6e 53 6b 69 70 20 74 6f 6b 65 6e 73 20 62 65   nSkip tokens be
9350: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 70 53 6b  ginning with pSk
9360: 69 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 54 65  ip..**.** If zTe
9370: 72 6d 21 3d 30 20 74 68 65 6e 20 61 70 70 65 6e  rm!=0 then appen
9380: 64 20 74 68 65 20 74 65 78 74 20 74 6f 20 74 68  d the text to th
9390: 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  e end..*/.static
93a0: 20 63 68 61 72 20 2a 54 6f 6b 65 6e 73 54 6f 53   char *TokensToS
93b0: 74 72 69 6e 67 28 0a 20 20 54 6f 6b 65 6e 20 2a  tring(.  Token *
93c0: 70 46 69 72 73 74 2c 20 20 20 20 2f 2a 20 46 69  pFirst,    /* Fi
93d0: 72 73 74 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  rst token in the
93e0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 54 6f 6b   string */.  Tok
93f0: 65 6e 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f  en *pLast,     /
9400: 2a 20 4c 61 73 74 20 74 6f 6b 65 6e 20 69 6e 20  * Last token in 
9410: 74 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  the string */.  
9420: 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20  char *zTerm,    
9430: 20 20 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 74    /* Terminate t
9440: 68 65 20 73 74 72 69 6e 67 20 77 69 74 68 20 74  he string with t
9450: 68 69 73 20 74 65 78 74 20 69 66 20 6e 6f 74 20  his text if not 
9460: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
9470: 2a 70 53 6b 69 70 2c 20 20 20 20 20 2f 2a 20 53  *pSkip,     /* S
9480: 6b 69 70 20 74 68 69 73 20 74 6f 6b 65 6e 20 69  kip this token i
9490: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20  f not NULL */.  
94a0: 69 6e 74 20 6e 53 6b 69 70 20 20 20 20 20 20 20  int nSkip       
94b0: 20 20 2f 2a 20 53 6b 69 70 20 61 20 74 6f 74 61    /* Skip a tota
94c0: 6c 20 6f 66 20 74 68 69 73 20 6d 61 6e 79 20 74  l of this many t
94d0: 6f 6b 65 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 68  okens */.){.  ch
94e0: 61 72 20 2a 7a 52 65 74 75 72 6e 3b 0a 20 20 53  ar *zReturn;.  S
94f0: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
9500: 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30 3b 0a   needSpace = 0;.
9510: 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 69    int c;.  int i
9520: 53 6b 69 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Skip = 0;.  int 
9530: 73 6b 69 70 4f 6e 65 20 3d 20 30 3b 0a 0a 20 20  skipOne = 0;..  
9540: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
9550: 3b 0a 20 20 70 4c 61 73 74 20 3d 20 70 4c 61 73  ;.  pLast = pLas
9560: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 77 68 69 6c  t->pNext;.  whil
9570: 65 28 20 70 46 69 72 73 74 21 3d 70 4c 61 73 74  e( pFirst!=pLast
9580: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 72   ){.    if( pFir
9590: 73 74 3d 3d 70 53 6b 69 70 20 29 7b 20 69 53 6b  st==pSkip ){ iSk
95a0: 69 70 20 3d 20 6e 53 6b 69 70 3b 20 7d 0a 20 20  ip = nSkip; }.  
95b0: 20 20 69 66 28 20 69 53 6b 69 70 3e 30 20 29 7b    if( iSkip>0 ){
95c0: 20 0a 20 20 20 20 20 20 69 53 6b 69 70 2d 2d 3b   .      iSkip--;
95d0: 0a 20 20 20 20 20 20 70 46 69 72 73 74 3d 70 46  .      pFirst=pF
95e0: 69 72 73 74 2d 3e 70 4e 65 78 74 3b 20 0a 20 20  irst->pNext; .  
95f0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
9600: 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20    }.    switch( 
9610: 70 46 69 72 73 74 2d 3e 65 54 79 70 65 20 29 7b  pFirst->eType ){
9620: 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 50  .      case TT_P
9630: 72 65 70 72 6f 63 65 73 73 6f 72 3a 0a 20 20 20  reprocessor:.   
9640: 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e       StringAppen
9650: 64 28 26 73 74 72 2c 22 5c 6e 22 2c 31 29 3b 0a  d(&str,"\n",1);.
9660: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 41 70          StringAp
9670: 70 65 6e 64 28 26 73 74 72 2c 70 46 69 72 73 74  pend(&str,pFirst
9680: 2d 3e 7a 54 65 78 74 2c 70 46 69 72 73 74 2d 3e  ->zText,pFirst->
9690: 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  nText);.        
96a0: 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74  StringAppend(&st
96b0: 72 2c 22 5c 6e 22 2c 31 29 3b 0a 20 20 20 20 20  r,"\n",1);.     
96c0: 20 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30     needSpace = 0
96d0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
96e0: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f  ..      case TT_
96f0: 49 64 3a 20 0a 20 20 20 20 20 20 20 20 73 77 69  Id: .        swi
9700: 74 63 68 28 20 70 46 69 72 73 74 2d 3e 7a 54 65  tch( pFirst->zTe
9710: 78 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  xt[0] ){.       
9720: 20 20 20 63 61 73 65 20 27 45 27 3a 20 20 20 20     case 'E':    
9730: 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
9740: 20 69 66 28 20 70 46 69 72 73 74 2d 3e 6e 54 65   if( pFirst->nTe
9750: 78 74 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d 70  xt==6 && strncmp
9760: 28 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22  (pFirst->zText,"
9770: 45 58 50 4f 52 54 22 2c 36 29 3d 3d 30 20 29 7b  EXPORT",6)==0 ){
9780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
9790: 6b 69 70 4f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  kipOne = 1;.    
97a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
97b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
97c0: 20 20 20 20 20 20 20 63 61 73 65 20 27 50 27 3a         case 'P':
97d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69  .            swi
97e0: 74 63 68 28 20 70 46 69 72 73 74 2d 3e 6e 54 65  tch( pFirst->nTe
97f0: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
9800: 20 20 20 20 63 61 73 65 20 36 3a 20 20 73 6b 69      case 6:  ski
9810: 70 4f 6e 65 20 3d 20 21 73 74 72 6e 63 6d 70 28  pOne = !strncmp(
9820: 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 50  pFirst->zText,"P
9830: 55 42 4c 49 43 22 2c 20 36 29 3b 20 20 20 20 62  UBLIC", 6);    b
9840: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
9850: 20 20 20 20 63 61 73 65 20 37 3a 20 20 73 6b 69      case 7:  ski
9860: 70 4f 6e 65 20 3d 20 21 73 74 72 6e 63 6d 70 28  pOne = !strncmp(
9870: 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 50  pFirst->zText,"P
9880: 52 49 56 41 54 45 22 2c 37 29 3b 20 20 20 20 62  RIVATE",7);    b
9890: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
98a0: 20 20 20 20 63 61 73 65 20 39 3a 20 20 73 6b 69      case 9:  ski
98b0: 70 4f 6e 65 20 3d 20 21 73 74 72 6e 63 6d 70 28  pOne = !strncmp(
98c0: 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 50  pFirst->zText,"P
98d0: 52 4f 54 45 43 54 45 44 22 2c 39 29 3b 20 20 62  ROTECTED",9);  b
98e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
98f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
9900: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
9910: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  }.            br
9920: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64  eak;.          d
9930: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
9940: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9950: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
9960: 20 73 6b 69 70 4f 6e 65 20 29 7b 0a 20 20 20 20   skipOne ){.    
9970: 20 20 20 20 20 20 70 46 69 72 73 74 20 3d 20 70        pFirst = p
9980: 46 69 72 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  First->pNext;.  
9990: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
99a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
99b0: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
99c0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73   to the next cas
99d0: 65 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20  e */.      case 
99e0: 54 54 5f 4e 75 6d 62 65 72 3a 0a 20 20 20 20 20  TT_Number:.     
99f0: 20 20 20 69 66 28 20 6e 65 65 64 53 70 61 63 65     if( needSpace
9a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 74   ){.          St
9a10: 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c  ringAppend(&str,
9a20: 22 20 22 2c 31 29 3b 0a 20 20 20 20 20 20 20 20  " ",1);.        
9a30: 7d 0a 20 20 20 20 20 20 20 20 53 74 72 69 6e 67  }.        String
9a40: 41 70 70 65 6e 64 28 26 73 74 72 2c 70 46 69 72  Append(&str,pFir
9a50: 73 74 2d 3e 7a 54 65 78 74 2c 70 46 69 72 73 74  st->zText,pFirst
9a60: 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20  ->nText);.      
9a70: 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20 31 3b    needSpace = 1;
9a80: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9a90: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
9aa0: 20 20 20 20 20 20 20 20 63 20 3d 20 70 46 69 72          c = pFir
9ab0: 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 3b 0a 20 20  st->zText[0];.  
9ac0: 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 53 70        if( needSp
9ad0: 61 63 65 20 26 26 20 28 63 3d 3d 27 2a 27 20 7c  ace && (c=='*' |
9ae0: 7c 20 63 3d 3d 27 7b 27 29 20 29 7b 0a 20 20 20  | c=='{') ){.   
9af0: 20 20 20 20 20 20 20 53 74 72 69 6e 67 41 70 70         StringApp
9b00: 65 6e 64 28 26 73 74 72 2c 22 20 22 2c 31 29 3b  end(&str," ",1);
9b10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9b20: 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28     StringAppend(
9b30: 26 73 74 72 2c 70 46 69 72 73 74 2d 3e 7a 54 65  &str,pFirst->zTe
9b40: 78 74 2c 70 46 69 72 73 74 2d 3e 6e 54 65 78 74  xt,pFirst->nText
9b50: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 65  );.        /* ne
9b60: 65 64 53 70 61 63 65 20 3d 20 70 46 69 72 73 74  edSpace = pFirst
9b70: 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 2c 27 3b  ->zText[0]==',';
9b80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 65 65 64   */.        need
9b90: 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Space = 0;.     
9ba0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9bb0: 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 46 69      pFirst = pFi
9bc0: 72 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  rst->pNext;.  }.
9bd0: 20 20 69 66 28 20 7a 54 65 72 6d 20 26 26 20 2a    if( zTerm && *
9be0: 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 53 74 72  zTerm ){.    Str
9bf0: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 7a  ingAppend(&str,z
9c00: 54 65 72 6d 2c 73 74 72 6c 65 6e 28 7a 54 65 72  Term,strlen(zTer
9c10: 6d 29 29 3b 0a 20 20 7d 0a 20 20 7a 52 65 74 75  m));.  }.  zRetu
9c20: 72 6e 20 3d 20 53 74 72 44 75 70 28 53 74 72 69  rn = StrDup(Stri
9c30: 6e 67 47 65 74 28 26 73 74 72 29 2c 30 29 3b 0a  ngGet(&str),0);.
9c40: 20 20 53 74 72 69 6e 67 52 65 73 65 74 28 26 73    StringReset(&s
9c50: 74 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52  tr);.  return zR
9c60: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
9c70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9c80: 63 61 6c 6c 65 64 20 77 68 65 6e 20 77 65 20 73  called when we s
9c90: 65 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65  ee one of the ke
9ca0: 79 77 6f 72 64 73 20 22 73 74 72 75 63 74 22 2c  ywords "struct",
9cb0: 0a 2a 2a 20 22 65 6e 75 6d 22 2c 20 22 75 6e 69  .** "enum", "uni
9cc0: 6f 6e 22 20 6f 72 20 22 63 6c 61 73 73 22 2e 20  on" or "class". 
9cd0: 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 74   This might be t
9ce0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
9cf0: 61 0a 2a 2a 20 74 79 70 65 20 64 65 63 6c 61 72  a.** type declar
9d00: 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75  ation.  This rou
9d10: 74 69 6e 65 20 77 69 6c 6c 20 70 72 6f 63 65 73  tine will proces
9d20: 73 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  s the declaratio
9d30: 6e 20 61 6e 64 0a 2a 2a 20 72 65 6d 6f 76 65 20  n and.** remove 
9d40: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
9d50: 74 6f 6b 65 6e 73 20 66 72 6f 6d 20 74 68 65 20  tokens from the 
9d60: 69 6e 70 75 74 20 73 74 72 65 61 6d 2e 0a 2a 2a  input stream..**
9d70: 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61  .** If this is a
9d80: 20 74 79 70 65 20 64 65 63 6c 61 72 61 74 69 6f   type declaratio
9d90: 6e 20 74 68 61 74 20 69 73 20 69 6d 6d 65 64 69  n that is immedi
9da0: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 65 64 20 62  ately followed b
9db0: 79 20 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e  y a.** semicolon
9dc0: 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
9dd0: 20 69 74 20 69 73 6e 27 74 20 61 6c 73 6f 20 61   it isn't also a
9de0: 20 76 61 72 69 61 62 6c 65 20 64 65 66 69 6e 69   variable defini
9df0: 74 69 6f 6e 29 0a 2a 2a 20 74 68 65 6e 20 73 65  tion).** then se
9e00: 74 20 2a 70 52 65 73 65 74 20 74 6f 20 27 3b 27  t *pReset to ';'
9e10: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 6c 65 61  .  Otherwise lea
9e20: 76 65 20 2a 70 52 65 73 65 74 20 61 74 20 30 2e  ve *pReset at 0.
9e30: 20 20 54 68 65 0a 2a 2a 20 2a 70 52 65 73 65 74    The.** *pReset
9e40: 20 66 6c 61 67 20 63 61 75 73 65 73 20 74 68 65   flag causes the
9e50: 20 70 61 72 73 65 72 20 74 6f 20 73 6b 69 70 20   parser to skip 
9e60: 61 68 65 61 64 20 74 6f 20 74 68 65 20 6e 65 78  ahead to the nex
9e70: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 74 68 61 74 20  t token.** that 
9e80: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
9e90: 76 61 6c 75 65 20 70 6c 61 63 65 64 20 69 6e 20  value placed in 
9ea0: 74 68 65 20 2a 70 52 65 73 65 74 20 66 6c 61 67  the *pReset flag
9eb0: 2c 20 69 66 20 74 68 61 74 0a 2a 2a 20 76 61 6c  , if that.** val
9ec0: 75 65 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ue is different 
9ed0: 66 72 6f 6d 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  from 0..*/.stati
9ee0: 63 20 69 6e 74 20 50 72 6f 63 65 73 73 54 79 70  c int ProcessTyp
9ef0: 65 44 65 63 6c 28 54 6f 6b 65 6e 20 2a 70 4c 69  eDecl(Token *pLi
9f00: 73 74 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69  st, int flags, i
9f10: 6e 74 20 2a 70 52 65 73 65 74 29 7b 0a 20 20 54  nt *pReset){.  T
9f20: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 2a 70 45  oken *pName, *pE
9f30: 6e 64 3b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63  nd;.  Decl *pDec
9f40: 6c 3b 0a 20 20 53 74 72 69 6e 67 20 73 74 72 3b  l;.  String str;
9f50: 0a 20 20 69 6e 74 20 6e 65 65 64 5f 74 6f 5f 63  .  int need_to_c
9f60: 6f 6c 6c 61 70 73 65 20 3d 20 31 3b 0a 20 20 69  ollapse = 1;.  i
9f70: 6e 74 20 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20  nt type = 0;..  
9f80: 2a 70 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 69  *pReset = 0;.  i
9f90: 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  f( pList==0 || p
9fa0: 4c 69 73 74 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c  List->pNext==0 |
9fb0: 7c 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 2d 3e  | pList->pNext->
9fc0: 65 54 79 70 65 21 3d 54 54 5f 49 64 20 29 7b 0a  eType!=TT_Id ){.
9fd0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9fe0: 7d 0a 20 20 70 4e 61 6d 65 20 3d 20 70 4c 69 73  }.  pName = pLis
9ff0: 74 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  t->pNext;..  /* 
a000: 43 61 74 63 68 20 74 68 65 20 63 61 73 65 20 6f  Catch the case o
a010: 66 20 22 73 74 72 75 63 74 20 46 6f 6f 3b 22 20  f "struct Foo;" 
a020: 61 6e 64 20 73 6b 69 70 20 69 74 2e 20 2a 2f 0a  and skip it. */.
a030: 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 70 4e 65    if( pName->pNe
a040: 78 74 20 26 26 20 70 4e 61 6d 65 2d 3e 70 4e 65  xt && pName->pNe
a050: 78 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 3b  xt->zText[0]==';
a060: 27 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 65 74  ' ){.    *pReset
a070: 20 3d 20 27 3b 27 3b 0a 20 20 20 20 72 65 74 75   = ';';.    retu
a080: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  rn 0;.  }..  for
a090: 28 70 45 6e 64 3d 70 4e 61 6d 65 2d 3e 70 4e 65  (pEnd=pName->pNe
a0a0: 78 74 3b 20 70 45 6e 64 20 26 26 20 70 45 6e 64  xt; pEnd && pEnd
a0b0: 2d 3e 65 54 79 70 65 21 3d 54 54 5f 42 72 61 63  ->eType!=TT_Brac
a0c0: 65 73 3b 20 70 45 6e 64 3d 70 45 6e 64 2d 3e 70  es; pEnd=pEnd->p
a0d0: 4e 65 78 74 29 7b 0a 20 20 20 20 73 77 69 74 63  Next){.    switc
a0e0: 68 28 20 70 45 6e 64 2d 3e 7a 54 65 78 74 5b 30  h( pEnd->zText[0
a0f0: 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  ] ){.      case 
a100: 27 28 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  '(':.      case 
a110: 27 2a 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  '*':.      case 
a120: 27 5b 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  '[':.      case 
a130: 27 3d 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  '=':.      case 
a140: 27 3b 27 3a 0a 20 20 20 20 20 20 20 20 72 65 74  ';':.        ret
a150: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
a160: 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20 29  .  if( pEnd==0 )
a170: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a180: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41    }..  /*.  ** A
a190: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  t this point, we
a1a0: 20 6b 6e 6f 77 20 77 65 20 68 61 76 65 20 61 20   know we have a 
a1b0: 74 79 70 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  type declaration
a1c0: 20 74 68 61 74 20 69 73 20 62 6f 75 6e 64 65 64   that is bounded
a1d0: 0a 20 20 2a 2a 20 62 79 20 70 4c 69 73 74 20 61  .  ** by pList a
a1e0: 6e 64 20 70 45 6e 64 20 61 6e 64 20 68 61 73 20  nd pEnd and has 
a1f0: 74 68 65 20 6e 61 6d 65 20 70 4e 61 6d 65 2e 0a  the name pName..
a200: 20 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20    */..  /*.  ** 
a210: 49 66 20 74 68 65 20 62 72 61 63 65 73 20 61 72  If the braces ar
a220: 65 20 66 6f 6c 6c 6f 77 65 64 20 69 6d 6d 65 64  e followed immed
a230: 61 74 65 6c 79 20 62 79 20 61 20 73 65 6d 69 63  ately by a semic
a240: 6f 6c 6f 6e 2c 20 74 68 65 6e 20 77 65 20 61 72  olon, then we ar
a250: 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 61  e.  ** dealing a
a260: 20 74 79 70 65 20 64 65 63 6c 61 72 61 74 69 6f   type declaratio
a270: 6e 20 6f 6e 6c 79 2e 20 20 54 68 65 72 65 20 69  n only.  There i
a280: 73 20 6e 6f 74 20 76 61 72 69 61 62 6c 65 20 64  s not variable d
a290: 65 66 69 6e 69 74 69 6f 6e 0a 20 20 2a 2a 20 66  efinition.  ** f
a2a0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 79 70  ollowing the typ
a2b0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 20  e declaration.  
a2c0: 53 6f 20 72 65 73 65 74 2e 2e 2e 0a 20 20 2a 2f  So reset....  */
a2d0: 0a 20 20 69 66 28 20 70 45 6e 64 2d 3e 70 4e 65  .  if( pEnd->pNe
a2e0: 78 74 3d 3d 30 20 7c 7c 20 70 45 6e 64 2d 3e 70  xt==0 || pEnd->p
a2f0: 4e 65 78 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d  Next->zText[0]==
a300: 27 3b 27 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ';' ){.    *pRes
a310: 65 74 20 3d 20 27 3b 27 3b 0a 20 20 20 20 6e 65  et = ';';.    ne
a320: 65 64 5f 74 6f 5f 63 6f 6c 6c 61 70 73 65 20 3d  ed_to_collapse =
a330: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
a340: 20 6e 65 65 64 5f 74 6f 5f 63 6f 6c 6c 61 70 73   need_to_collaps
a350: 65 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66  e = 1;.  }..  if
a360: 28 20 70 72 6f 74 6f 5f 73 74 61 74 69 63 3d 3d  ( proto_static==
a370: 30 20 26 26 20 28 66 6c 61 67 73 20 26 20 28 50  0 && (flags & (P
a380: 53 5f 4c 6f 63 61 6c 7c 50 53 5f 45 78 70 6f 72  S_Local|PS_Expor
a390: 74 7c 50 53 5f 49 6e 74 65 72 66 61 63 65 29 29  t|PS_Interface))
a3a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 67  ==0 ){.    /* Ig
a3b0: 6e 6f 72 65 20 74 68 65 73 65 20 6f 62 6a 65 63  nore these objec
a3c0: 74 73 20 75 6e 6c 65 73 73 20 74 68 65 79 20 61  ts unless they a
a3d0: 72 65 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65  re explicitly de
a3e0: 63 6c 61 72 65 64 20 61 73 20 69 6e 74 65 72 66  clared as interf
a3f0: 61 63 65 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ace,.    ** or u
a400: 6e 6c 65 73 73 20 74 68 65 20 22 2d 6c 6f 63 61  nless the "-loca
a410: 6c 22 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  l" command line 
a420: 6f 70 74 69 6f 6e 20 77 61 73 20 73 70 65 63 69  option was speci
a430: 66 69 65 64 2e 20 2a 2f 0a 20 20 20 20 2a 70 52  fied. */.    *pR
a440: 65 73 65 74 20 3d 20 27 3b 27 3b 0a 20 20 20 20  eset = ';';.    
a450: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 23  return 0;.  }..#
a460: 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 69 66  ifdef DEBUG.  if
a470: 28 20 64 65 62 75 67 4d 61 73 6b 20 26 20 50 41  ( debugMask & PA
a480: 52 53 45 52 20 29 7b 0a 20 20 20 20 70 72 69 6e  RSER ){.    prin
a490: 74 66 28 22 2a 2a 2a 2a 20 46 6f 75 6e 64 20 74  tf("**** Found t
a4a0: 79 70 65 3a 20 25 2e 2a 73 20 25 2e 2a 73 2e 2e  ype: %.*s %.*s..
a4b0: 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 70 4c 69 73  .\n",.      pLis
a4c0: 74 2d 3e 6e 54 65 78 74 2c 20 70 4c 69 73 74 2d  t->nText, pList-
a4d0: 3e 7a 54 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 6e  >zText, pName->n
a4e0: 54 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 7a 54 65  Text, pName->zTe
a4f0: 78 74 29 3b 0a 20 20 20 20 50 72 69 6e 74 54 6f  xt);.    PrintTo
a500: 6b 65 6e 73 28 70 4c 69 73 74 2c 70 45 6e 64 29  kens(pList,pEnd)
a510: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 3b 5c  ;.    printf(";\
a520: 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n");.  }.#endif.
a530: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 72 65 61 74  .  /*.  ** Creat
a540: 65 20 61 20 6e 65 77 20 44 65 63 6c 20 6f 62 6a  e a new Decl obj
a550: 65 63 74 20 66 6f 72 20 74 68 69 73 20 64 65 66  ect for this def
a560: 69 6e 69 74 69 6f 6e 2e 20 20 41 63 74 75 61 6c  inition.  Actual
a570: 6c 79 2c 20 69 66 20 74 68 69 73 0a 20 20 2a 2a  ly, if this.  **
a580: 20 69 73 20 61 20 43 2b 2b 20 63 6c 61 73 73 20   is a C++ class 
a590: 64 65 66 69 6e 69 74 69 6f 6e 2c 20 74 68 65 6e  definition, then
a5a0: 20 74 68 65 20 44 65 63 6c 20 6f 62 6a 65 63 74   the Decl object
a5b0: 20 6d 69 67 68 74 20 61 6c 72 65 61 64 79 20 65   might already e
a5c0: 78 69 73 74 2c 0a 20 20 2a 2a 20 73 6f 20 63 68  xist,.  ** so ch
a5d0: 65 63 6b 20 66 69 72 73 74 20 66 6f 72 20 74 68  eck first for th
a5e0: 61 74 20 63 61 73 65 20 62 65 66 6f 72 65 20 63  at case before c
a5f0: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e  reating a new on
a600: 65 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  e..  */.  switch
a610: 28 20 2a 70 4c 69 73 74 2d 3e 7a 54 65 78 74 20  ( *pList->zText 
a620: 29 7b 0a 20 20 20 20 63 61 73 65 20 27 63 27 3a  ){.    case 'c':
a630: 20 20 74 79 70 65 20 3d 20 54 59 5f 43 6c 61 73    type = TY_Clas
a640: 73 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  s;        break;
a650: 0a 20 20 20 20 63 61 73 65 20 27 73 27 3a 20 20  .    case 's':  
a660: 74 79 70 65 20 3d 20 54 59 5f 53 74 72 75 63 74  type = TY_Struct
a670: 75 72 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ure;    break;. 
a680: 20 20 20 63 61 73 65 20 27 65 27 3a 20 20 74 79     case 'e':  ty
a690: 70 65 20 3d 20 54 59 5f 45 6e 75 6d 65 72 61 74  pe = TY_Enumerat
a6a0: 69 6f 6e 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ion;  break;.   
a6b0: 20 63 61 73 65 20 27 75 27 3a 20 20 74 79 70 65   case 'u':  type
a6c0: 20 3d 20 54 59 5f 55 6e 69 6f 6e 3b 20 20 20 20   = TY_Union;    
a6d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
a6e0: 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 43 61 6e  efault:   /* Can
a6f0: 27 74 20 48 61 70 70 65 6e 20 2a 2f 20 20 20 20  't Happen */    
a700: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69    break;.  }.  i
a710: 66 28 20 74 79 70 65 21 3d 54 59 5f 43 6c 61 73  f( type!=TY_Clas
a720: 73 20 29 7b 0a 20 20 20 20 70 44 65 63 6c 20 3d  s ){.    pDecl =
a730: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
a740: 20 70 44 65 63 6c 20 3d 20 46 69 6e 64 44 65 63   pDecl = FindDec
a750: 6c 28 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 20  l(pName->zText, 
a760: 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 29 3b 0a 20  pName->nText);. 
a770: 20 20 20 69 66 28 20 70 44 65 63 6c 20 26 26 20     if( pDecl && 
a780: 28 70 44 65 63 6c 2d 3e 66 6c 61 67 73 20 26 20  (pDecl->flags & 
a790: 74 79 70 65 29 21 3d 74 79 70 65 20 29 20 70 44  type)!=type ) pD
a7a0: 65 63 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ecl = 0;.  }.  i
a7b0: 66 28 20 70 44 65 63 6c 3d 3d 30 20 29 7b 0a 20  f( pDecl==0 ){. 
a7c0: 20 20 20 70 44 65 63 6c 20 3d 20 43 72 65 61 74     pDecl = Creat
a7d0: 65 44 65 63 6c 28 70 4e 61 6d 65 2d 3e 7a 54 65  eDecl(pName->zTe
a7e0: 78 74 2c 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 29  xt,pName->nText)
a7f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 66 6c 61  ;.  }.  if( (fla
a800: 67 73 20 26 20 50 53 5f 53 74 61 74 69 63 29 20  gs & PS_Static) 
a810: 7c 7c 20 21 28 66 6c 61 67 73 20 26 20 28 50 53  || !(flags & (PS
a820: 5f 49 6e 74 65 72 66 61 63 65 7c 50 53 5f 45 78  _Interface|PS_Ex
a830: 70 6f 72 74 29 29 20 29 7b 0a 20 20 20 20 44 65  port)) ){.    De
a840: 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44  clSetProperty(pD
a850: 65 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29 3b 0a 20  ecl,DP_Local);. 
a860: 20 7d 0a 20 20 44 65 63 6c 53 65 74 50 72 6f 70   }.  DeclSetProp
a870: 65 72 74 79 28 70 44 65 63 6c 2c 74 79 70 65 29  erty(pDecl,type)
a880: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6f 62 6a 65  ;..  /* The obje
a890: 63 74 20 68 61 73 20 61 20 66 75 6c 6c 20 64 65  ct has a full de
a8a0: 63 6c 61 72 61 74 69 6f 6e 20 6f 6e 6c 79 20 69  claration only i
a8b0: 66 20 69 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  f it is containe
a8c0: 64 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 22 23  d within.  ** "#
a8d0: 69 66 20 49 4e 54 45 52 46 41 43 45 2e 2e 2e 23  if INTERFACE...#
a8e0: 65 6e 64 69 66 22 20 6f 72 20 22 23 69 66 20 45  endif" or "#if E
a8f0: 58 50 4f 52 54 5f 49 4e 54 45 52 46 41 43 45 2e  XPORT_INTERFACE.
a900: 2e 2e 23 65 6e 64 69 66 22 20 6f 72 0a 20 20 2a  ..#endif" or.  *
a910: 2a 20 22 23 69 66 20 4c 4f 43 41 4c 5f 49 4e 54  * "#if LOCAL_INT
a920: 45 52 46 41 43 45 2e 2e 2e 23 65 6e 64 69 66 22  ERFACE...#endif"
a930: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 77 65  .  Otherwise, we
a940: 20 6f 6e 6c 79 20 67 69 76 65 20 69 74 20 61 0a   only give it a.
a950: 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 64 65 63    ** forward dec
a960: 6c 61 72 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  laration..  */. 
a970: 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 50 53   if( flags & (PS
a980: 5f 4c 6f 63 61 6c 20 7c 20 50 53 5f 45 78 70 6f  _Local | PS_Expo
a990: 72 74 20 7c 20 50 53 5f 49 6e 74 65 72 66 61 63  rt | PS_Interfac
a9a0: 65 29 20 20 29 7b 0a 20 20 20 20 70 44 65 63 6c  e)  ){.    pDecl
a9b0: 2d 3e 7a 44 65 63 6c 20 3d 20 54 6f 6b 65 6e 73  ->zDecl = Tokens
a9c0: 54 6f 53 74 72 69 6e 67 28 70 4c 69 73 74 2c 70  ToString(pList,p
a9d0: 45 6e 64 2c 22 3b 5c 6e 22 2c 30 2c 30 29 3b 0a  End,";\n",0,0);.
a9e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 44 65    }else{.    pDe
a9f0: 63 6c 2d 3e 7a 44 65 63 6c 20 3d 20 30 3b 0a 20  cl->zDecl = 0;. 
aa00: 20 7d 0a 20 20 70 44 65 63 6c 2d 3e 70 43 6f 6d   }.  pDecl->pCom
aa10: 6d 65 6e 74 20 3d 20 70 4c 69 73 74 2d 3e 70 43  ment = pList->pC
aa20: 6f 6d 6d 65 6e 74 3b 0a 20 20 53 74 72 69 6e 67  omment;.  String
aa30: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 53 74  Init(&str);.  St
aa40: 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c  ringAppend(&str,
aa50: 22 74 79 70 65 64 65 66 20 22 2c 30 29 3b 0a 20  "typedef ",0);. 
aa60: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73   StringAppend(&s
aa70: 74 72 2c 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c  tr,pList->zText,
aa80: 70 4c 69 73 74 2d 3e 6e 54 65 78 74 29 3b 0a 20  pList->nText);. 
aa90: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73   StringAppend(&s
aaa0: 74 72 2c 22 20 22 2c 30 29 3b 0a 20 20 53 74 72  tr," ",0);.  Str
aab0: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 70  ingAppend(&str,p
aac0: 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 70 4e 61 6d  Name->zText,pNam
aad0: 65 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 53 74 72  e->nText);.  Str
aae0: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 22  ingAppend(&str,"
aaf0: 20 22 2c 30 29 3b 0a 20 20 53 74 72 69 6e 67 41   ",0);.  StringA
ab00: 70 70 65 6e 64 28 26 73 74 72 2c 70 4e 61 6d 65  ppend(&str,pName
ab10: 2d 3e 7a 54 65 78 74 2c 70 4e 61 6d 65 2d 3e 6e  ->zText,pName->n
ab20: 54 65 78 74 29 3b 0a 20 20 53 74 72 69 6e 67 41  Text);.  StringA
ab30: 70 70 65 6e 64 28 26 73 74 72 2c 22 3b 5c 6e 22  ppend(&str,";\n"
ab40: 2c 32 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a 46  ,2);.  pDecl->zF
ab50: 77 64 20 3d 20 53 74 72 44 75 70 28 53 74 72 69  wd = StrDup(Stri
ab60: 6e 67 47 65 74 28 26 73 74 72 29 2c 30 29 3b 0a  ngGet(&str),0);.
ab70: 20 20 53 74 72 69 6e 67 52 65 73 65 74 28 26 73    StringReset(&s
ab80: 74 72 29 3b 0a 20 20 53 74 72 69 6e 67 49 6e 69  tr);.  StringIni
ab90: 74 28 26 73 74 72 29 3b 0a 20 20 53 74 72 69 6e  t(&str);.  Strin
aba0: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 70 4c 69  gAppend(&str,pLi
abb0: 73 74 2d 3e 7a 54 65 78 74 2c 70 4c 69 73 74 2d  st->zText,pList-
abc0: 3e 6e 54 65 78 74 29 3b 0a 20 20 53 74 72 69 6e  >nText);.  Strin
abd0: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 22 20 22  gAppend(&str," "
abe0: 2c 30 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70  ,0);.  StringApp
abf0: 65 6e 64 28 26 73 74 72 2c 70 4e 61 6d 65 2d 3e  end(&str,pName->
ac00: 7a 54 65 78 74 2c 70 4e 61 6d 65 2d 3e 6e 54 65  zText,pName->nTe
ac10: 78 74 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70  xt);.  StringApp
ac20: 65 6e 64 28 26 73 74 72 2c 22 3b 5c 6e 22 2c 32  end(&str,";\n",2
ac30: 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a 46 77 64  );.  pDecl->zFwd
ac40: 43 70 70 20 3d 20 53 74 72 44 75 70 28 53 74 72  Cpp = StrDup(Str
ac50: 69 6e 67 47 65 74 28 26 73 74 72 29 2c 30 29 3b  ingGet(&str),0);
ac60: 0a 20 20 53 74 72 69 6e 67 52 65 73 65 74 28 26  .  StringReset(&
ac70: 73 74 72 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  str);.  if( flag
ac80: 73 20 26 20 50 53 5f 45 78 70 6f 72 74 20 29 7b  s & PS_Export ){
ac90: 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70  .    DeclSetProp
aca0: 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 78  erty(pDecl,DP_Ex
acb0: 70 6f 72 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  port);.  }else i
acc0: 66 28 20 66 6c 61 67 73 20 26 20 50 53 5f 4c 6f  f( flags & PS_Lo
acd0: 63 61 6c 20 29 7b 0a 20 20 20 20 44 65 63 6c 53  cal ){.    DeclS
ace0: 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c  etProperty(pDecl
acf0: 2c 44 50 5f 4c 6f 63 61 6c 29 3b 0a 20 20 7d 0a  ,DP_Local);.  }.
ad00: 0a 20 20 2f 2a 20 48 65 72 65 27 73 20 73 6f 6d  .  /* Here's som
ad10: 65 74 68 69 6e 67 20 77 65 69 72 64 2e 20 20 41  ething weird.  A
ad20: 4e 53 49 2d 43 20 64 6f 65 73 6e 27 74 20 61 6c  NSI-C doesn't al
ad30: 6c 6f 77 20 61 20 66 6f 72 77 61 72 64 20 64 65  low a forward de
ad40: 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f  claration.  ** o
ad50: 66 20 61 6e 20 65 6e 75 6d 65 72 61 74 69 6f 6e  f an enumeration
ad60: 2e 20 20 53 6f 20 77 65 20 68 61 76 65 20 74 6f  .  So we have to
ad70: 20 62 75 69 6c 64 20 74 68 65 20 74 79 70 65 64   build the typed
ad80: 65 66 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ef into the.  **
ad90: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a   definition..  *
ada0: 2f 0a 20 20 69 66 28 20 70 44 65 63 6c 2d 3e 7a  /.  if( pDecl->z
adb0: 44 65 63 6c 20 26 26 20 44 65 63 6c 48 61 73 50  Decl && DeclHasP
adc0: 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 20 54  roperty(pDecl, T
add0: 59 5f 45 6e 75 6d 65 72 61 74 69 6f 6e 29 20 29  Y_Enumeration) )
ade0: 7b 0a 20 20 20 20 53 74 72 69 6e 67 49 6e 69 74  {.    StringInit
adf0: 28 26 73 74 72 29 3b 0a 20 20 20 20 53 74 72 69  (&str);.    Stri
ae00: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 70 44  ngAppend(&str,pD
ae10: 65 63 6c 2d 3e 7a 44 65 63 6c 2c 30 29 3b 0a 20  ecl->zDecl,0);. 
ae20: 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28     StringAppend(
ae30: 26 73 74 72 2c 70 44 65 63 6c 2d 3e 7a 46 77 64  &str,pDecl->zFwd
ae40: 2c 30 29 3b 0a 20 20 20 20 53 61 66 65 46 72 65  ,0);.    SafeFre
ae50: 65 28 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 29 3b  e(pDecl->zDecl);
ae60: 0a 20 20 20 20 53 61 66 65 46 72 65 65 28 70 44  .    SafeFree(pD
ae70: 65 63 6c 2d 3e 7a 46 77 64 29 3b 0a 20 20 20 20  ecl->zFwd);.    
ae80: 70 44 65 63 6c 2d 3e 7a 46 77 64 20 3d 20 30 3b  pDecl->zFwd = 0;
ae90: 0a 20 20 20 20 70 44 65 63 6c 2d 3e 7a 44 65 63  .    pDecl->zDec
aea0: 6c 20 3d 20 53 74 72 44 75 70 28 53 74 72 69 6e  l = StrDup(Strin
aeb0: 67 47 65 74 28 26 73 74 72 29 2c 30 29 3b 0a 20  gGet(&str),0);. 
aec0: 20 20 20 53 74 72 69 6e 67 52 65 73 65 74 28 26     StringReset(&
aed0: 73 74 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  str);.  }..  if(
aee0: 20 70 4e 61 6d 65 2d 3e 70 4e 65 78 74 2d 3e 7a   pName->pNext->z
aef0: 54 65 78 74 5b 30 5d 3d 3d 27 3a 27 20 29 7b 0a  Text[0]==':' ){.
af00: 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65      DeclSetPrope
af10: 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 43 70 6c  rty(pDecl,DP_Cpl
af20: 75 73 70 6c 75 73 29 3b 0a 20 20 7d 0a 20 20 69  usplus);.  }.  i
af30: 66 28 20 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 3d  f( pName->nText=
af40: 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4e  =5 && strncmp(pN
af50: 61 6d 65 2d 3e 7a 54 65 78 74 2c 22 63 6c 61 73  ame->zText,"clas
af60: 73 22 2c 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20  s",5)==0 ){.    
af70: 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28  DeclSetProperty(
af80: 70 44 65 63 6c 2c 44 50 5f 43 70 6c 75 73 70 6c  pDecl,DP_Cpluspl
af90: 75 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  us);.  }..  /*. 
afa0: 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 62   ** Remove all b
afb0: 75 74 20 70 4c 69 73 74 20 61 6e 64 20 70 4e 61  ut pList and pNa
afc0: 6d 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  me from the inpu
afd0: 74 20 73 74 72 65 61 6d 2e 0a 20 20 2a 2f 0a 20  t stream..  */. 
afe0: 20 69 66 28 20 6e 65 65 64 5f 74 6f 5f 63 6f 6c   if( need_to_col
aff0: 6c 61 70 73 65 20 29 7b 0a 20 20 20 20 77 68 69  lapse ){.    whi
b000: 6c 65 28 20 70 45 6e 64 21 3d 70 4e 61 6d 65 20  le( pEnd!=pName 
b010: 29 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  ){.      Token *
b020: 70 50 72 65 76 20 3d 20 70 45 6e 64 2d 3e 70 50  pPrev = pEnd->pP
b030: 72 65 76 3b 0a 20 20 20 20 20 20 70 50 72 65 76  rev;.      pPrev
b040: 2d 3e 70 4e 65 78 74 20 3d 20 70 45 6e 64 2d 3e  ->pNext = pEnd->
b050: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 45 6e  pNext;.      pEn
b060: 64 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  d->pNext->pPrev 
b070: 3d 20 70 50 72 65 76 3b 0a 20 20 20 20 20 20 53  = pPrev;.      S
b080: 61 66 65 46 72 65 65 28 70 45 6e 64 29 3b 0a 20  afeFree(pEnd);. 
b090: 20 20 20 20 20 70 45 6e 64 20 3d 20 70 50 72 65       pEnd = pPre
b0a0: 76 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  v;.    }.  }.  r
b0b0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
b0c0: 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
b0d0: 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65  f tokens that de
b0e0: 63 6c 61 72 65 20 73 6f 6d 65 74 68 69 6e 67 20  clare something 
b0f0: 28 61 20 66 75 6e 63 74 69 6f 6e 2c 20 70 72 6f  (a function, pro
b100: 63 65 64 75 72 65 2c 0a 2a 2a 20 76 61 72 69 61  cedure,.** varia
b110: 62 6c 65 20 6f 72 20 74 79 70 65 64 65 66 29 20  ble or typedef) 
b120: 66 69 6e 64 20 74 68 65 20 74 6f 6b 65 6e 20 77  find the token w
b130: 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68  hich contains th
b140: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
b150: 20 74 68 69 6e 67 20 62 65 69 6e 67 20 64 65 63   thing being dec
b160: 6c 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 67  lared..**.** Alg
b170: 6f 72 69 74 68 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  orithm:.**.**   
b180: 54 68 65 20 6e 61 6d 65 20 69 73 3a 0a 2a 2a 0a  The name is:.**.
b190: 2a 2a 20 20 20 20 20 31 2e 20 20 54 68 65 20 66  **     1.  The f
b1a0: 69 72 73 74 20 69 64 65 6e 74 69 66 69 65 72 20  irst identifier 
b1b0: 74 68 61 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64  that is followed
b1c0: 20 62 79 20 61 20 22 5b 22 2c 20 6f 72 0a 2a 2a   by a "[", or.**
b1d0: 0a 2a 2a 20 20 20 20 20 32 2e 20 20 54 68 65 20  .**     2.  The 
b1e0: 66 69 72 73 74 20 69 64 65 6e 74 69 66 69 65 72  first identifier
b1f0: 20 74 68 61 74 20 69 73 20 66 6f 6c 6c 6f 77 65   that is followe
b200: 64 20 62 79 20 61 20 22 28 22 20 77 68 65 72 65  d by a "(" where
b210: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
b220: 22 28 22 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20  "(" is followed 
b230: 62 79 20 61 6e 6f 74 68 65 72 20 69 64 65 6e 74  by another ident
b240: 69 66 69 65 72 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20  ifier, or.**.** 
b250: 20 20 20 20 33 2e 20 20 54 68 65 20 66 69 72 73      3.  The firs
b260: 74 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f 6c  t identifier fol
b270: 6c 6f 77 65 64 20 62 79 20 22 3a 3a 22 2c 20 6f  lowed by "::", o
b280: 72 0a 2a 2a 0a 2a 2a 20 20 20 20 20 34 2e 20 20  r.**.**     4.  
b290: 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61  If none of the a
b2a0: 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 6c  bove, then the l
b2b0: 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 2e 0a  ast identifier..
b2c0: 2a 2a 0a 2a 2a 20 20 20 49 6e 20 61 6c 6c 20 6f  **.**   In all o
b2d0: 66 20 74 68 65 20 61 62 6f 76 65 2c 20 63 65 72  f the above, cer
b2e0: 74 61 69 6e 20 72 65 73 65 72 76 65 64 20 77 6f  tain reserved wo
b2f0: 72 64 73 20 28 6c 69 6b 65 20 22 63 68 61 72 22  rds (like "char"
b300: 29 20 61 72 65 0a 2a 2a 20 20 20 6e 6f 74 20 63  ) are.**   not c
b310: 6f 6e 73 69 64 65 72 65 64 20 69 64 65 6e 74 69  onsidered identi
b320: 66 69 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fiers..*/.static
b330: 20 54 6f 6b 65 6e 20 2a 46 69 6e 64 44 65 63 6c   Token *FindDecl
b340: 4e 61 6d 65 28 54 6f 6b 65 6e 20 2a 70 46 69 72  Name(Token *pFir
b350: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74  st, Token *pLast
b360: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  ){.  Token *pNam
b370: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
b380: 70 3b 0a 20 20 69 6e 74 20 63 3b 0a 0a 20 20 69  p;.  int c;..  i
b390: 66 28 20 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20  f( pFirst==0 || 
b3a0: 70 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pLast==0 ){.    
b3b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
b3c0: 70 4c 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70  pLast = pLast->p
b3d0: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 46  Next;.  for(p=pF
b3e0: 69 72 73 74 3b 20 70 20 26 26 20 70 21 3d 70 4c  irst; p && p!=pL
b3f0: 61 73 74 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ast; p=p->pNext)
b400: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 54 79  {.    if( p->eTy
b410: 70 65 3d 3d 54 54 5f 49 64 20 29 7b 0a 20 20 20  pe==TT_Id ){.   
b420: 20 20 20 73 74 61 74 69 63 20 49 64 65 6e 74 54     static IdentT
b430: 61 62 6c 65 20 73 52 65 73 65 72 76 65 64 3b 0a  able sReserved;.
b440: 20 20 20 20 20 20 73 74 61 74 69 63 20 69 6e 74        static int
b450: 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20   isInit = 0;.   
b460: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a     static char *
b470: 61 57 6f 72 64 73 5b 5d 20 3d 20 7b 20 22 63 68  aWords[] = { "ch
b480: 61 72 22 2c 20 22 63 6c 61 73 73 22 2c 20 0a 20  ar", "class", . 
b490: 20 20 20 20 20 20 22 63 6f 6e 73 74 22 2c 20 22        "const", "
b4a0: 64 6f 75 62 6c 65 22 2c 20 22 65 6e 75 6d 22 2c  double", "enum",
b4b0: 20 22 65 78 74 65 72 6e 22 2c 20 22 45 58 50 4f   "extern", "EXPO
b4c0: 52 54 22 2c 20 22 45 54 5f 50 52 4f 43 22 2c 20  RT", "ET_PROC", 
b4d0: 0a 20 20 20 20 20 20 20 22 66 6c 6f 61 74 22 2c  .       "float",
b4e0: 20 22 69 6e 74 22 2c 20 22 6c 6f 6e 67 22 2c 0a   "int", "long",.
b4f0: 20 20 20 20 20 20 20 22 50 52 49 56 41 54 45 22         "PRIVATE"
b500: 2c 20 22 50 52 4f 54 45 43 54 45 44 22 2c 20 22  , "PROTECTED", "
b510: 50 55 42 4c 49 43 22 2c 0a 20 20 20 20 20 20 20  PUBLIC",.       
b520: 22 72 65 67 69 73 74 65 72 22 2c 20 22 73 74 61  "register", "sta
b530: 74 69 63 22 2c 20 22 73 74 72 75 63 74 22 2c 20  tic", "struct", 
b540: 22 73 69 7a 65 6f 66 22 2c 20 22 73 69 67 6e 65  "sizeof", "signe
b550: 64 22 2c 20 22 74 79 70 65 64 65 66 22 2c 20 0a  d", "typedef", .
b560: 20 20 20 20 20 20 20 22 75 6e 69 6f 6e 22 2c 20         "union", 
b570: 22 76 6f 6c 61 74 69 6c 65 22 2c 20 22 76 69 72  "volatile", "vir
b580: 74 75 61 6c 22 2c 20 22 76 6f 69 64 22 2c 20 7d  tual", "void", }
b590: 3b 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 21  ;.  .      if( !
b5a0: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20  isInit ){.      
b5b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
b5c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
b5d0: 6f 66 28 61 57 6f 72 64 73 29 2f 73 69 7a 65 6f  of(aWords)/sizeo
b5e0: 66 28 61 57 6f 72 64 73 5b 30 5d 29 3b 20 69 2b  f(aWords[0]); i+
b5f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 64  +){.          Id
b600: 65 6e 74 54 61 62 6c 65 49 6e 73 65 72 74 28 26  entTableInsert(&
b610: 73 52 65 73 65 72 76 65 64 2c 61 57 6f 72 64 73  sReserved,aWords
b620: 5b 69 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  [i],0);.        
b630: 7d 0a 20 20 20 20 20 20 20 20 69 73 49 6e 69 74  }.        isInit
b640: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
b650: 20 20 20 20 69 66 28 20 21 49 64 65 6e 74 54 61      if( !IdentTa
b660: 62 6c 65 54 65 73 74 28 26 73 52 65 73 65 72 76  bleTest(&sReserv
b670: 65 64 2c 70 2d 3e 7a 54 65 78 74 2c 70 2d 3e 6e  ed,p->zText,p->n
b680: 54 65 78 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Text) ){.       
b690: 20 70 4e 61 6d 65 20 3d 20 70 3b 0a 20 20 20 20   pName = p;.    
b6a0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
b6b0: 28 20 70 3d 3d 70 46 69 72 73 74 20 29 7b 0a 20  ( p==pFirst ){. 
b6c0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
b6d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
b6e0: 70 2d 3e 7a 54 65 78 74 5b 30 5d 29 3d 3d 27 5b  p->zText[0])=='[
b6f0: 27 20 26 26 20 70 4e 61 6d 65 20 29 7b 0a 20 20  ' && pName ){.  
b700: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b710: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 28 27 20  else if( c=='(' 
b720: 26 26 20 70 2d 3e 70 4e 65 78 74 20 26 26 20 70  && p->pNext && p
b730: 2d 3e 70 4e 65 78 74 2d 3e 65 54 79 70 65 3d 3d  ->pNext->eType==
b740: 54 54 5f 49 64 20 26 26 20 70 4e 61 6d 65 20 29  TT_Id && pName )
b750: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
b760: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
b770: 27 3a 27 20 26 26 20 70 2d 3e 7a 54 65 78 74 5b  ':' && p->zText[
b780: 31 5d 3d 3d 27 3a 27 20 26 26 20 70 4e 61 6d 65  1]==':' && pName
b790: 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
b7a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b7b0: 75 72 6e 20 70 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn pName;.}../*
b7c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b7d0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
b7e0: 77 65 20 73 65 65 20 61 20 6d 65 74 68 6f 64 20  we see a method 
b7f0: 66 6f 72 20 61 20 63 6c 61 73 73 20 74 68 61 74  for a class that
b800: 20 62 65 67 69 6e 73 0a 2a 2a 20 77 69 74 68 20   begins.** with 
b810: 74 68 65 20 50 55 42 4c 49 43 2c 20 50 52 49 56  the PUBLIC, PRIV
b820: 41 54 45 2c 20 6f 72 20 50 52 4f 54 45 43 54 45  ATE, or PROTECTE
b830: 44 20 6b 65 79 77 6f 72 64 73 2e 20 20 53 75 63  D keywords.  Suc
b840: 68 20 6d 65 74 68 6f 64 73 20 61 72 65 0a 2a 2a  h methods are.**
b850: 20 61 64 64 65 64 20 74 6f 20 74 68 65 69 72 20   added to their 
b860: 63 6c 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e  class definition
b870: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
b880: 20 50 72 6f 63 65 73 73 4d 65 74 68 6f 64 44 65   ProcessMethodDe
b890: 66 28 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c  f(Token *pFirst,
b8a0: 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 2c 20 69   Token *pLast, i
b8b0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 54 6f 6b  nt flags){.  Tok
b8c0: 65 6e 20 2a 70 43 6f 64 65 3b 0a 20 20 54 6f 6b  en *pCode;.  Tok
b8d0: 65 6e 20 2a 70 43 6c 61 73 73 3b 0a 20 20 63 68  en *pClass;.  ch
b8e0: 61 72 20 2a 7a 44 65 63 6c 3b 0a 20 20 44 65 63  ar *zDecl;.  Dec
b8f0: 6c 20 2a 70 44 65 63 6c 3b 0a 20 20 53 74 72 69  l *pDecl;.  Stri
b900: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 74 79  ng str;.  int ty
b910: 70 65 3b 0a 0a 20 20 70 43 6f 64 65 20 3d 20 70  pe;..  pCode = p
b920: 4c 61 73 74 3b 0a 20 20 70 4c 61 73 74 20 3d 20  Last;.  pLast = 
b930: 70 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20  pLast->pPrev;.  
b940: 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 7a  while( pFirst->z
b950: 54 65 78 74 5b 30 5d 3d 3d 27 50 27 20 29 7b 0a  Text[0]=='P' ){.
b960: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 0a      int rc = 1;.
b970: 20 20 20 20 73 77 69 74 63 68 28 20 70 46 69 72      switch( pFir
b980: 73 74 2d 3e 6e 54 65 78 74 20 29 7b 0a 20 20 20  st->nText ){.   
b990: 20 20 20 63 61 73 65 20 36 3a 20 20 72 63 20 3d     case 6:  rc =
b9a0: 20 73 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d   strncmp(pFirst-
b9b0: 3e 7a 54 65 78 74 2c 22 50 55 42 4c 49 43 22 2c  >zText,"PUBLIC",
b9c0: 36 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  6); break;.     
b9d0: 20 63 61 73 65 20 37 3a 20 20 72 63 20 3d 20 73   case 7:  rc = s
b9e0: 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e 7a  trncmp(pFirst->z
b9f0: 54 65 78 74 2c 22 50 52 49 56 41 54 45 22 2c 37  Text,"PRIVATE",7
ba00: 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ); break;.      
ba10: 63 61 73 65 20 39 3a 20 20 72 63 20 3d 20 73 74  case 9:  rc = st
ba20: 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e 7a 54  rncmp(pFirst->zT
ba30: 65 78 74 2c 22 50 52 4f 54 45 43 54 45 44 22 2c  ext,"PROTECTED",
ba40: 39 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  9); break;.     
ba50: 20 64 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b   default:  break
ba60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ba70: 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
ba80: 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
ba90: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43  >pNext;.  }.  pC
baa0: 6c 61 73 73 20 3d 20 46 69 6e 64 44 65 63 6c 4e  lass = FindDeclN
bab0: 61 6d 65 28 70 46 69 72 73 74 2c 70 4c 61 73 74  ame(pFirst,pLast
bac0: 29 3b 0a 20 20 69 66 28 20 70 43 6c 61 73 73 3d  );.  if( pClass=
bad0: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
bae0: 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a  f(stderr,"%s:%d:
baf0: 20 55 6e 61 62 6c 65 20 74 6f 20 66 69 6e 64 20   Unable to find 
bb00: 74 68 65 20 63 6c 61 73 73 20 6e 61 6d 65 20 66  the class name f
bb10: 6f 72 20 74 68 69 73 20 6d 65 74 68 6f 64 5c 6e  or this method\n
bb20: 22 2c 0a 20 20 20 20 20 20 20 7a 46 69 6c 65 6e  ",.       zFilen
bb30: 61 6d 65 2c 20 70 46 69 72 73 74 2d 3e 6e 4c 69  ame, pFirst->nLi
bb40: 6e 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ne);.    return 
bb50: 31 3b 0a 20 20 7d 0a 20 20 70 44 65 63 6c 20 3d  1;.  }.  pDecl =
bb60: 20 46 69 6e 64 44 65 63 6c 28 70 43 6c 61 73 73   FindDecl(pClass
bb70: 2d 3e 7a 54 65 78 74 2c 20 70 43 6c 61 73 73 2d  ->zText, pClass-
bb80: 3e 6e 54 65 78 74 29 3b 0a 20 20 69 66 28 20 70  >nText);.  if( p
bb90: 44 65 63 6c 3d 3d 30 20 7c 7c 20 28 70 44 65 63  Decl==0 || (pDec
bba0: 6c 2d 3e 66 6c 61 67 73 20 26 20 54 59 5f 43 6c  l->flags & TY_Cl
bbb0: 61 73 73 29 21 3d 54 59 5f 43 6c 61 73 73 20 29  ass)!=TY_Class )
bbc0: 7b 0a 20 20 20 20 70 44 65 63 6c 20 3d 20 43 72  {.    pDecl = Cr
bbd0: 65 61 74 65 44 65 63 6c 28 70 43 6c 61 73 73 2d  eateDecl(pClass-
bbe0: 3e 7a 54 65 78 74 2c 20 70 43 6c 61 73 73 2d 3e  >zText, pClass->
bbf0: 6e 54 65 78 74 29 3b 0a 20 20 20 20 44 65 63 6c  nText);.    Decl
bc00: 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63  SetProperty(pDec
bc10: 6c 2c 20 54 59 5f 43 6c 61 73 73 29 3b 0a 20 20  l, TY_Class);.  
bc20: 7d 0a 20 20 53 74 72 69 6e 67 49 6e 69 74 28 26  }.  StringInit(&
bc30: 73 74 72 29 3b 0a 20 20 69 66 28 20 70 44 65 63  str);.  if( pDec
bc40: 6c 2d 3e 7a 45 78 74 72 61 20 29 7b 0a 20 20 20  l->zExtra ){.   
bc50: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73   StringAppend(&s
bc60: 74 72 2c 20 70 44 65 63 6c 2d 3e 7a 45 78 74 72  tr, pDecl->zExtr
bc70: 61 2c 20 30 29 3b 0a 20 20 20 20 53 61 66 65 46  a, 0);.    SafeF
bc80: 72 65 65 28 70 44 65 63 6c 2d 3e 7a 45 78 74 72  ree(pDecl->zExtr
bc90: 61 29 3b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 7a  a);.    pDecl->z
bca0: 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 7d 0a 20  Extra = 0;.  }. 
bcb0: 20 74 79 70 65 20 3d 20 66 6c 61 67 73 20 26 20   type = flags & 
bcc0: 50 53 5f 50 50 50 3b 0a 20 20 69 66 28 20 70 44  PS_PPP;.  if( pD
bcd0: 65 63 6c 2d 3e 65 78 74 72 61 54 79 70 65 21 3d  ecl->extraType!=
bce0: 74 79 70 65 20 29 7b 0a 20 20 20 20 69 66 28 20  type ){.    if( 
bcf0: 74 79 70 65 20 26 20 50 53 5f 50 75 62 6c 69 63  type & PS_Public
bd00: 20 29 7b 0a 20 20 20 20 20 20 53 74 72 69 6e 67   ){.      String
bd10: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22 70 75  Append(&str, "pu
bd20: 62 6c 69 63 3a 5c 6e 22 2c 20 30 29 3b 0a 20 20  blic:\n", 0);.  
bd30: 20 20 20 20 70 44 65 63 6c 2d 3e 65 78 74 72 61      pDecl->extra
bd40: 54 79 70 65 20 3d 20 50 53 5f 50 75 62 6c 69 63  Type = PS_Public
bd50: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
bd60: 74 79 70 65 20 26 20 50 53 5f 50 72 6f 74 65 63  type & PS_Protec
bd70: 74 65 64 20 29 7b 0a 20 20 20 20 20 20 53 74 72  ted ){.      Str
bd80: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20  ingAppend(&str, 
bd90: 22 70 72 6f 74 65 63 74 65 64 3a 5c 6e 22 2c 20  "protected:\n", 
bda0: 30 29 3b 0a 20 20 20 20 20 20 70 44 65 63 6c 2d  0);.      pDecl-
bdb0: 3e 65 78 74 72 61 54 79 70 65 20 3d 20 50 53 5f  >extraType = PS_
bdc0: 50 72 6f 74 65 63 74 65 64 3b 0a 20 20 20 20 7d  Protected;.    }
bdd0: 65 6c 73 65 20 69 66 28 20 74 79 70 65 20 26 20  else if( type & 
bde0: 50 53 5f 50 72 69 76 61 74 65 20 29 7b 0a 20 20  PS_Private ){.  
bdf0: 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64      StringAppend
be00: 28 26 73 74 72 2c 20 22 70 72 69 76 61 74 65 3a  (&str, "private:
be10: 5c 6e 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  \n", 0);.      p
be20: 44 65 63 6c 2d 3e 65 78 74 72 61 54 79 70 65 20  Decl->extraType 
be30: 3d 20 50 53 5f 50 72 69 76 61 74 65 3b 0a 20 20  = PS_Private;.  
be40: 20 20 7d 0a 20 20 7d 0a 20 20 53 74 72 69 6e 67    }.  }.  String
be50: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22 20 20  Append(&str, "  
be60: 22 2c 20 30 29 3b 0a 20 20 7a 44 65 63 6c 20 3d  ", 0);.  zDecl =
be70: 20 54 6f 6b 65 6e 73 54 6f 53 74 72 69 6e 67 28   TokensToString(
be80: 70 46 69 72 73 74 2c 20 70 4c 61 73 74 2c 20 22  pFirst, pLast, "
be90: 3b 5c 6e 22 2c 20 70 43 6c 61 73 73 2c 20 32 29  ;\n", pClass, 2)
bea0: 3b 0a 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64  ;.  StringAppend
beb0: 28 26 73 74 72 2c 20 7a 44 65 63 6c 2c 20 30 29  (&str, zDecl, 0)
bec0: 3b 0a 20 20 53 61 66 65 46 72 65 65 28 7a 44 65  ;.  SafeFree(zDe
bed0: 63 6c 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a 45  cl);.  pDecl->zE
bee0: 78 74 72 61 20 3d 20 53 74 72 44 75 70 28 53 74  xtra = StrDup(St
bef0: 72 69 6e 67 47 65 74 28 26 73 74 72 29 2c 20 30  ringGet(&str), 0
bf00: 29 3b 0a 20 20 53 74 72 69 6e 67 52 65 73 65 74  );.  StringReset
bf10: 28 26 73 74 72 29 3b 0a 20 20 72 65 74 75 72 6e  (&str);.  return
bf20: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
bf30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
bf40: 6c 65 64 20 77 68 65 6e 20 77 65 20 73 65 65 20  led when we see 
bf50: 61 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 70 72  a function or pr
bf60: 6f 63 65 64 75 72 65 20 64 65 66 69 6e 69 74 69  ocedure definiti
bf70: 6f 6e 2e 0a 2a 2a 20 57 65 20 6d 61 6b 65 20 61  on..** We make a
bf80: 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  n entry in the d
bf90: 65 63 6c 61 72 61 74 69 6f 6e 20 74 61 62 6c 65  eclaration table
bfa0: 20 74 68 61 74 20 69 73 20 61 20 70 72 6f 74 6f   that is a proto
bfb0: 74 79 70 65 20 66 6f 72 20 74 68 69 73 0a 2a 2a  type for this.**
bfc0: 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 70 72 6f   function or pro
bfd0: 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  cedure..*/.stati
bfe0: 63 20 69 6e 74 20 50 72 6f 63 65 73 73 50 72 6f  c int ProcessPro
bff0: 63 65 64 75 72 65 44 65 66 28 54 6f 6b 65 6e 20  cedureDef(Token 
c000: 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a  *pFirst, Token *
c010: 70 4c 61 73 74 2c 20 69 6e 74 20 66 6c 61 67 73  pLast, int flags
c020: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  ){.  Token *pNam
c030: 65 3b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63 6c  e;.  Decl *pDecl
c040: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 64 65  ;.  Token *pCode
c050: 3b 0a 0a 20 20 69 66 28 20 70 46 69 72 73 74 3d  ;..  if( pFirst=
c060: 3d 30 20 7c 7c 20 70 4c 61 73 74 3d 3d 30 20 29  =0 || pLast==0 )
c070: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
c080: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20    }.  if( flags 
c090: 26 20 50 53 5f 4d 65 74 68 6f 64 20 29 7b 0a 20  & PS_Method ){. 
c0a0: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50     if( flags & P
c0b0: 53 5f 50 50 50 20 29 7b 0a 20 20 20 20 20 20 72  S_PPP ){.      r
c0c0: 65 74 75 72 6e 20 50 72 6f 63 65 73 73 4d 65 74  eturn ProcessMet
c0d0: 68 6f 64 44 65 66 28 70 46 69 72 73 74 2c 20 70  hodDef(pFirst, p
c0e0: 4c 61 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Last, flags);.  
c0f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
c100: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
c110: 20 7d 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20   }.  if( (flags 
c120: 26 20 50 53 5f 53 74 61 74 69 63 29 21 3d 30 20  & PS_Static)!=0 
c130: 26 26 20 21 70 72 6f 74 6f 5f 73 74 61 74 69 63  && !proto_static
c140: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
c150: 3b 0a 20 20 7d 0a 20 20 70 43 6f 64 65 20 3d 20  ;.  }.  pCode = 
c160: 70 4c 61 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  pLast;.  while( 
c170: 70 4c 61 73 74 20 26 26 20 70 4c 61 73 74 21 3d  pLast && pLast!=
c180: 70 46 69 72 73 74 20 26 26 20 70 4c 61 73 74 2d  pFirst && pLast-
c190: 3e 7a 54 65 78 74 5b 30 5d 21 3d 27 29 27 20 29  >zText[0]!=')' )
c1a0: 7b 0a 20 20 20 20 70 4c 61 73 74 20 3d 20 70 4c  {.    pLast = pL
c1b0: 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  ast->pPrev;.  }.
c1c0: 20 20 69 66 28 20 70 4c 61 73 74 3d 3d 30 20 7c    if( pLast==0 |
c1d0: 7c 20 70 4c 61 73 74 3d 3d 70 46 69 72 73 74 20  | pLast==pFirst 
c1e0: 7c 7c 20 70 46 69 72 73 74 2d 3e 70 4e 65 78 74  || pFirst->pNext
c1f0: 3d 3d 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 66  ==pLast ){.    f
c200: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
c210: 73 3a 25 64 3a 20 55 6e 72 65 63 6f 67 6e 69 7a  s:%d: Unrecogniz
c220: 65 64 20 73 79 6e 74 61 78 2e 5c 6e 22 2c 20 0a  ed syntax.\n", .
c230: 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c        zFilename,
c240: 20 70 46 69 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b   pFirst->nLine);
c250: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
c260: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26   }.  if( flags &
c270: 20 28 50 53 5f 49 6e 74 65 72 66 61 63 65 7c 50   (PS_Interface|P
c280: 53 5f 45 78 70 6f 72 74 7c 50 53 5f 4c 6f 63 61  S_Export|PS_Loca
c290: 6c 29 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  l) ){.    fprint
c2a0: 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a  f(stderr,"%s:%d:
c2b0: 20 4d 69 73 73 69 6e 67 20 5c 22 69 6e 6c 69 6e   Missing \"inlin
c2c0: 65 5c 22 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  e\" on function 
c2d0: 6f 72 20 70 72 6f 63 65 64 75 72 65 2e 5c 6e 22  or procedure.\n"
c2e0: 2c 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  ,.      zFilenam
c2f0: 65 2c 20 70 46 69 72 73 74 2d 3e 6e 4c 69 6e 65  e, pFirst->nLine
c300: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
c310: 0a 20 20 7d 0a 20 20 70 4e 61 6d 65 20 3d 20 46  .  }.  pName = F
c320: 69 6e 64 44 65 63 6c 4e 61 6d 65 28 70 46 69 72  indDeclName(pFir
c330: 73 74 2c 70 4c 61 73 74 29 3b 0a 20 20 69 66 28  st,pLast);.  if(
c340: 20 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   pName==0 ){.   
c350: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
c360: 22 25 73 3a 25 64 3a 20 4d 61 6c 66 6f 72 6d 65  "%s:%d: Malforme
c370: 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 70 72  d function or pr
c380: 6f 63 65 64 75 72 65 20 64 65 66 69 6e 69 74 69  ocedure definiti
c390: 6f 6e 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 46  on.\n",.      zF
c3a0: 69 6c 65 6e 61 6d 65 2c 20 70 46 69 72 73 74 2d  ilename, pFirst-
c3b0: 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 72 65 74  >nLine);.    ret
c3c0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
c3d0: 0a 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f  .  ** At this po
c3e0: 69 6e 74 20 77 65 27 76 65 20 69 73 6f 6c 61 74  int we've isolat
c3f0: 65 64 20 61 20 70 72 6f 63 65 64 75 72 65 20 64  ed a procedure d
c400: 65 63 6c 61 72 61 74 69 6f 6e 20 62 65 74 77 65  eclaration betwe
c410: 65 6e 20 70 46 69 72 73 74 0a 20 20 2a 2a 20 61  en pFirst.  ** a
c420: 6e 64 20 70 4c 61 73 74 20 77 69 74 68 20 74 68  nd pLast with th
c430: 65 20 6e 61 6d 65 20 70 4e 61 6d 65 2e 0a 20 20  e name pName..  
c440: 2a 2f 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a  */.#ifdef DEBUG.
c450: 20 20 69 66 28 20 64 65 62 75 67 4d 61 73 6b 20    if( debugMask 
c460: 26 20 50 41 52 53 45 52 20 29 7b 0a 20 20 20 20  & PARSER ){.    
c470: 70 72 69 6e 74 66 28 22 2a 2a 2a 2a 20 46 6f 75  printf("**** Fou
c480: 6e 64 20 72 6f 75 74 69 6e 65 3a 20 25 2e 2a 73  nd routine: %.*s
c490: 20 6f 6e 20 6c 69 6e 65 20 25 64 2e 2e 2e 5c 6e   on line %d...\n
c4a0: 22 2c 20 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 2c  ", pName->nText,
c4b0: 0a 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a  .       pName->z
c4c0: 54 65 78 74 2c 20 70 46 69 72 73 74 2d 3e 6e 4c  Text, pFirst->nL
c4d0: 69 6e 65 29 3b 0a 20 20 20 20 50 72 69 6e 74 54  ine);.    PrintT
c4e0: 6f 6b 65 6e 73 28 70 46 69 72 73 74 2c 70 4c 61  okens(pFirst,pLa
c4f0: 73 74 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  st);.    printf(
c500: 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64  ";\n");.  }.#end
c510: 69 66 0a 20 20 70 44 65 63 6c 20 3d 20 43 72 65  if.  pDecl = Cre
c520: 61 74 65 44 65 63 6c 28 70 4e 61 6d 65 2d 3e 7a  ateDecl(pName->z
c530: 54 65 78 74 2c 70 4e 61 6d 65 2d 3e 6e 54 65 78  Text,pName->nTex
c540: 74 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 70 43 6f  t);.  pDecl->pCo
c550: 6d 6d 65 6e 74 20 3d 20 70 46 69 72 73 74 2d 3e  mment = pFirst->
c560: 70 43 6f 6d 6d 65 6e 74 3b 0a 20 20 69 66 28 20  pComment;.  if( 
c570: 70 43 6f 64 65 20 26 26 20 70 43 6f 64 65 2d 3e  pCode && pCode->
c580: 65 54 79 70 65 3d 3d 54 54 5f 42 72 61 63 65 73  eType==TT_Braces
c590: 20 29 7b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 74   ){.    pDecl->t
c5a0: 6f 6b 65 6e 43 6f 64 65 20 3d 20 2a 70 43 6f 64  okenCode = *pCod
c5b0: 65 3b 0a 20 20 7d 0a 20 20 44 65 63 6c 53 65 74  e;.  }.  DeclSet
c5c0: 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 54  Property(pDecl,T
c5d0: 59 5f 53 75 62 72 6f 75 74 69 6e 65 29 3b 0a 20  Y_Subroutine);. 
c5e0: 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 20 3d 20   pDecl->zDecl = 
c5f0: 54 6f 6b 65 6e 73 54 6f 53 74 72 69 6e 67 28 70  TokensToString(p
c600: 46 69 72 73 74 2c 70 4c 61 73 74 2c 22 3b 5c 6e  First,pLast,";\n
c610: 22 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 28 66  ",0,0);.  if( (f
c620: 6c 61 67 73 20 26 20 28 50 53 5f 53 74 61 74 69  lags & (PS_Stati
c630: 63 7c 50 53 5f 4c 6f 63 61 6c 32 29 29 21 3d 30  c|PS_Local2))!=0
c640: 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50   ){.    DeclSetP
c650: 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50  roperty(pDecl,DP
c660: 5f 4c 6f 63 61 6c 29 3b 0a 20 20 7d 65 6c 73 65  _Local);.  }else
c670: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 50   if( (flags & (P
c680: 53 5f 45 78 70 6f 72 74 32 29 29 21 3d 30 20 29  S_Export2))!=0 )
c690: 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f  {.    DeclSetPro
c6a0: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45  perty(pDecl,DP_E
c6b0: 78 70 6f 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 69  xport);.  }..  i
c6c0: 66 28 20 66 6c 61 67 73 20 26 20 44 50 5f 43 70  f( flags & DP_Cp
c6d0: 6c 75 73 70 6c 75 73 20 29 7b 0a 20 20 20 20 44  lusplus ){.    D
c6e0: 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70  eclSetProperty(p
c6f0: 44 65 63 6c 2c 44 50 5f 43 70 6c 75 73 70 6c 75  Decl,DP_Cplusplu
c700: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
c710: 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79   DeclSetProperty
c720: 28 70 44 65 63 6c 2c 44 50 5f 45 78 74 65 72 6e  (pDecl,DP_Extern
c730: 43 52 65 71 64 29 3b 0a 20 20 7d 0a 0a 20 20 72  CReqd);.  }..  r
c740: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
c750: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
c760: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
c770: 72 20 77 65 20 73 65 65 20 74 68 65 20 22 69 6e  r we see the "in
c780: 6c 69 6e 65 22 20 6b 65 79 77 6f 72 64 2e 20 20  line" keyword.  
c790: 57 65 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 65  We.** need to se
c7a0: 65 6b 2d 6f 75 74 20 74 68 65 20 69 6e 6c 69 6e  ek-out the inlin
c7b0: 65 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 70 72  e function or pr
c7c0: 6f 63 65 64 75 72 65 20 61 6e 64 20 6d 61 6b 65  ocedure and make
c7d0: 20 61 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f   a.** declaratio
c7e0: 6e 20 6f 75 74 20 6f 66 20 74 68 65 20 65 6e 74  n out of the ent
c7f0: 69 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  ire definition..
c800: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 50 72  */.static int Pr
c810: 6f 63 65 73 73 49 6e 6c 69 6e 65 50 72 6f 63 28  ocessInlineProc(
c820: 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 69  Token *pFirst, i
c830: 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 2a 70  nt flags, int *p
c840: 52 65 73 65 74 29 7b 0a 20 20 54 6f 6b 65 6e 20  Reset){.  Token 
c850: 2a 70 4e 61 6d 65 3b 0a 20 20 54 6f 6b 65 6e 20  *pName;.  Token 
c860: 2a 70 45 6e 64 3b 0a 20 20 44 65 63 6c 20 2a 70  *pEnd;.  Decl *p
c870: 44 65 63 6c 3b 0a 0a 20 20 66 6f 72 28 70 45 6e  Decl;..  for(pEn
c880: 64 3d 70 46 69 72 73 74 3b 20 70 45 6e 64 3b 20  d=pFirst; pEnd; 
c890: 70 45 6e 64 20 3d 20 70 45 6e 64 2d 3e 70 4e 65  pEnd = pEnd->pNe
c8a0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 45 6e  xt){.    if( pEn
c8b0: 64 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 7b 27  d->zText[0]=='{'
c8c0: 20 7c 7c 20 70 45 6e 64 2d 3e 7a 54 65 78 74 5b   || pEnd->zText[
c8d0: 30 5d 3d 3d 27 3b 27 20 29 7b 0a 20 20 20 20 20  0]==';' ){.     
c8e0: 20 2a 70 52 65 73 65 74 20 3d 20 70 45 6e 64 2d   *pReset = pEnd-
c8f0: 3e 7a 54 65 78 74 5b 30 5d 3b 0a 20 20 20 20 20  >zText[0];.     
c900: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c910: 7d 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20  }.  if( pEnd==0 
c920: 29 7b 0a 20 20 20 20 2a 70 52 65 73 65 74 20 3d  ){.    *pReset =
c930: 20 27 3b 27 3b 0a 20 20 20 20 66 70 72 69 6e 74   ';';.    fprint
c940: 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a  f(stderr,"%s:%d:
c950: 20 69 6e 63 6f 6d 70 6c 65 74 65 20 69 6e 6c 69   incomplete inli
c960: 6e 65 20 70 72 6f 63 65 64 75 72 65 20 64 65 66  ne procedure def
c970: 69 6e 69 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20  inition\n",.    
c980: 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69    zFilename, pFi
c990: 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20  rst->nLine);.   
c9a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
c9b0: 20 70 4e 61 6d 65 20 3d 20 46 69 6e 64 44 65 63   pName = FindDec
c9c0: 6c 4e 61 6d 65 28 70 46 69 72 73 74 2c 70 45 6e  lName(pFirst,pEn
c9d0: 64 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d  d);.  if( pName=
c9e0: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
c9f0: 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a  f(stderr,"%s:%d:
ca00: 20 6d 61 6c 66 6f 72 6d 65 64 20 69 6e 6c 69 6e   malformed inlin
ca10: 65 20 70 72 6f 63 65 64 75 72 65 20 64 65 66 69  e procedure defi
ca20: 6e 69 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20 20  nition\n",.     
ca30: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 72   zFilename, pFir
ca40: 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  st->nLine);.    
ca50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 23  return 1;.  }..#
ca60: 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 69 66  ifdef DEBUG.  if
ca70: 28 20 64 65 62 75 67 4d 61 73 6b 20 26 20 50 41  ( debugMask & PA
ca80: 52 53 45 52 20 29 7b 0a 20 20 20 20 70 72 69 6e  RSER ){.    prin
ca90: 74 66 28 22 2a 2a 2a 2a 20 46 6f 75 6e 64 20 69  tf("**** Found i
caa0: 6e 6c 69 6e 65 20 72 6f 75 74 69 6e 65 3a 20 25  nline routine: %
cab0: 2e 2a 73 20 6f 6e 20 6c 69 6e 65 20 25 64 2e 2e  .*s on line %d..
cac0: 2e 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 4e  .\n", .       pN
cad0: 61 6d 65 2d 3e 6e 54 65 78 74 2c 20 70 4e 61 6d  ame->nText, pNam
cae0: 65 2d 3e 7a 54 65 78 74 2c 20 70 46 69 72 73 74  e->zText, pFirst
caf0: 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 50 72  ->nLine);.    Pr
cb00: 69 6e 74 54 6f 6b 65 6e 73 28 70 46 69 72 73 74  intTokens(pFirst
cb10: 2c 70 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e  ,pEnd);.    prin
cb20: 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65  tf("\n");.  }.#e
cb30: 6e 64 69 66 0a 20 20 70 44 65 63 6c 20 3d 20 43  ndif.  pDecl = C
cb40: 72 65 61 74 65 44 65 63 6c 28 70 4e 61 6d 65 2d  reateDecl(pName-
cb50: 3e 7a 54 65 78 74 2c 70 4e 61 6d 65 2d 3e 6e 54  >zText,pName->nT
cb60: 65 78 74 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 70  ext);.  pDecl->p
cb70: 43 6f 6d 6d 65 6e 74 20 3d 20 70 46 69 72 73 74  Comment = pFirst
cb80: 2d 3e 70 43 6f 6d 6d 65 6e 74 3b 0a 20 20 44 65  ->pComment;.  De
cb90: 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44  clSetProperty(pD
cba0: 65 63 6c 2c 54 59 5f 53 75 62 72 6f 75 74 69 6e  ecl,TY_Subroutin
cbb0: 65 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a 44 65  e);.  pDecl->zDe
cbc0: 63 6c 20 3d 20 54 6f 6b 65 6e 73 54 6f 53 74 72  cl = TokensToStr
cbd0: 69 6e 67 28 70 46 69 72 73 74 2c 70 45 6e 64 2c  ing(pFirst,pEnd,
cbe0: 22 3b 5c 6e 22 2c 30 2c 30 29 3b 0a 20 20 69 66  ";\n",0,0);.  if
cbf0: 28 20 28 66 6c 61 67 73 20 26 20 28 50 53 5f 53  ( (flags & (PS_S
cc00: 74 61 74 69 63 7c 50 53 5f 4c 6f 63 61 6c 7c 50  tatic|PS_Local|P
cc10: 53 5f 4c 6f 63 61 6c 32 29 29 20 29 7b 0a 20 20  S_Local2)) ){.  
cc20: 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74    DeclSetPropert
cc30: 79 28 70 44 65 63 6c 2c 44 50 5f 4c 6f 63 61 6c  y(pDecl,DP_Local
cc40: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  );.  }else if( f
cc50: 6c 61 67 73 20 26 20 28 50 53 5f 45 78 70 6f 72  lags & (PS_Expor
cc60: 74 7c 50 53 5f 45 78 70 6f 72 74 32 29 20 29 7b  t|PS_Export2) ){
cc70: 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70  .    DeclSetProp
cc80: 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 78  erty(pDecl,DP_Ex
cc90: 70 6f 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  port);.  }..  if
cca0: 28 20 66 6c 61 67 73 20 26 20 44 50 5f 43 70 6c  ( flags & DP_Cpl
ccb0: 75 73 70 6c 75 73 20 29 7b 0a 20 20 20 20 44 65  usplus ){.    De
ccc0: 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44  clSetProperty(pD
ccd0: 65 63 6c 2c 44 50 5f 43 70 6c 75 73 70 6c 75 73  ecl,DP_Cplusplus
cce0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ccf0: 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28  DeclSetProperty(
cd00: 70 44 65 63 6c 2c 44 50 5f 45 78 74 65 72 6e 43  pDecl,DP_ExternC
cd10: 52 65 71 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Reqd);.  }..  re
cd20: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
cd30: 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   Determine if th
cd40: 65 20 74 6f 6b 65 6e 73 20 62 65 74 77 65 65 6e  e tokens between
cd50: 20 70 46 69 72 73 74 20 61 6e 64 20 70 45 6e 64   pFirst and pEnd
cd60: 20 66 6f 72 6d 20 61 20 76 61 72 69 61 62 6c 65   form a variable
cd70: 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  .** definition o
cd80: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f  r a function pro
cd90: 74 6f 74 79 70 65 2e 20 20 52 65 74 75 72 6e 20  totype.  Return 
cda0: 54 52 55 45 20 69 66 20 77 65 20 61 72 65 20 64  TRUE if we are d
cdb0: 65 61 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20 61  ealing.** with a
cdc0: 20 76 61 72 69 61 62 6c 65 20 64 65 66 69 6e 74   variable defint
cdd0: 69 6f 6e 20 61 6e 64 20 46 41 4c 53 45 20 66 6f  ion and FALSE fo
cde0: 72 20 61 20 70 72 6f 74 6f 74 79 70 65 2e 0a 2a  r a prototype..*
cdf0: 2a 0a 2a 2a 20 70 45 6e 64 20 69 73 20 74 68 65  *.** pEnd is the
ce00: 20 74 6f 6b 65 6e 20 74 68 61 74 20 65 6e 64 73   token that ends
ce10: 20 74 68 65 20 6f 62 6a 65 63 74 2e 20 20 49 74   the object.  It
ce20: 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 61   can be either a
ce30: 20 27 3b 27 20 6f 72 0a 2a 2a 20 61 20 27 3d 27   ';' or.** a '='
ce40: 2e 20 20 49 66 20 69 74 20 69 73 20 27 3d 27 2c  .  If it is '=',
ce50: 20 74 68 65 6e 20 61 73 73 75 6d 65 20 77 65 20   then assume we 
ce60: 68 61 76 65 20 61 20 76 61 72 69 61 62 6c 65 20  have a variable 
ce70: 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  definition..**.*
ce80: 2a 20 49 66 20 70 45 6e 64 20 69 73 20 27 3b 27  * If pEnd is ';'
ce90: 2c 20 74 68 65 6e 20 74 68 65 20 64 65 74 65 72  , then the deter
cea0: 6d 69 6e 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65  mination is more
ceb0: 20 64 69 66 66 69 63 75 6c 74 2e 20 20 57 65 20   difficult.  We 
cec0: 68 61 76 65 0a 2a 2a 20 74 6f 20 73 65 61 72 63  have.** to searc
ced0: 68 20 66 6f 72 20 61 6e 20 6f 63 63 75 72 61 6e  h for an occuran
cee0: 63 65 20 6f 66 20 61 6e 20 49 44 20 66 6f 6c 6c  ce of an ID foll
cef0: 6f 77 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  owed immediately
cf00: 20 62 79 20 27 28 27 2e 0a 2a 2a 20 49 66 20 66   by '('..** If f
cf10: 6f 75 6e 64 2c 20 77 65 20 68 61 76 65 20 61 20  ound, we have a 
cf20: 70 72 6f 74 6f 74 79 70 65 2e 20 20 4f 74 68 65  prototype.  Othe
cf30: 72 77 69 73 65 20 77 65 20 61 72 65 20 64 65 61  rwise we are dea
cf40: 6c 69 6e 67 20 77 69 74 68 20 61 0a 2a 2a 20 76  ling with a.** v
cf50: 61 72 69 61 62 6c 65 20 64 65 66 69 6e 69 74 69  ariable definiti
cf60: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
cf70: 74 20 69 73 56 61 72 69 61 62 6c 65 44 65 66 28  t isVariableDef(
cf80: 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54  Token *pFirst, T
cf90: 6f 6b 65 6e 20 2a 70 45 6e 64 29 7b 0a 20 20 69  oken *pEnd){.  i
cfa0: 66 28 20 70 45 6e 64 20 26 26 20 70 45 6e 64 2d  f( pEnd && pEnd-
cfb0: 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 3d 27 20 26  >zText[0]=='=' &
cfc0: 26 20 0a 20 20 20 20 28 70 45 6e 64 2d 3e 70 50  & .    (pEnd->pP
cfd0: 72 65 76 2d 3e 6e 54 65 78 74 21 3d 38 20 7c 7c  rev->nText!=8 ||
cfe0: 20 73 74 72 6e 63 6d 70 28 70 45 6e 64 2d 3e 70   strncmp(pEnd->p
cff0: 50 72 65 76 2d 3e 7a 54 65 78 74 2c 22 6f 70 65  Prev->zText,"ope
d000: 72 61 74 6f 72 22 2c 38 29 21 3d 30 29 0a 20 20  rator",8)!=0).  
d010: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
d020: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 46  .  }.  while( pF
d030: 69 72 73 74 20 26 26 20 70 46 69 72 73 74 21 3d  irst && pFirst!=
d040: 70 45 6e 64 20 26 26 20 70 46 69 72 73 74 2d 3e  pEnd && pFirst->
d050: 70 4e 65 78 74 20 26 26 20 70 46 69 72 73 74 2d  pNext && pFirst-
d060: 3e 70 4e 65 78 74 21 3d 70 45 6e 64 20 29 7b 0a  >pNext!=pEnd ){.
d070: 20 20 20 20 69 66 28 20 70 46 69 72 73 74 2d 3e      if( pFirst->
d080: 65 54 79 70 65 3d 3d 54 54 5f 49 64 20 26 26 20  eType==TT_Id && 
d090: 70 46 69 72 73 74 2d 3e 70 4e 65 78 74 2d 3e 7a  pFirst->pNext->z
d0a0: 54 65 78 74 5b 30 5d 3d 3d 27 28 27 20 29 7b 0a  Text[0]=='(' ){.
d0b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
d0c0: 20 20 20 20 7d 0a 20 20 20 20 70 46 69 72 73 74      }.    pFirst
d0d0: 20 3d 20 70 46 69 72 73 74 2d 3e 70 4e 65 78 74   = pFirst->pNext
d0e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
d0f0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
d100: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d110: 65 64 20 77 68 65 6e 65 76 65 72 20 77 65 20 65  ed whenever we e
d120: 6e 63 6f 75 6e 74 65 72 20 61 20 22 3b 22 20 6f  ncounter a ";" o
d130: 72 20 22 3d 22 2e 20 20 54 68 65 20 73 74 75 66  r "=".  The stuf
d140: 66 0a 2a 2a 20 62 65 74 77 65 65 6e 20 70 46 69  f.** between pFi
d150: 72 73 74 20 61 6e 64 20 70 4c 61 73 74 20 63 6f  rst and pLast co
d160: 6e 73 74 69 74 75 74 65 73 20 65 69 74 68 65 72  nstitutes either
d170: 20 61 20 74 79 70 65 64 65 66 20 6f 72 20 61 20   a typedef or a 
d180: 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62  global.** variab
d190: 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20  le definition.  
d1a0: 44 6f 20 74 68 65 20 72 69 67 68 74 20 74 68 69  Do the right thi
d1b0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
d1c0: 74 20 50 72 6f 63 65 73 73 44 65 63 6c 28 54 6f  t ProcessDecl(To
d1d0: 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b  ken *pFirst, Tok
d1e0: 65 6e 20 2a 70 45 6e 64 2c 20 69 6e 74 20 66 6c  en *pEnd, int fl
d1f0: 61 67 73 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70  ags){.  Token *p
d200: 4e 61 6d 65 3b 0a 20 20 44 65 63 6c 20 2a 70 44  Name;.  Decl *pD
d210: 65 63 6c 3b 0a 20 20 69 6e 74 20 69 73 4c 6f 63  ecl;.  int isLoc
d220: 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73  al = 0;.  int is
d230: 56 61 72 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20  Var;.  int nErr 
d240: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 46 69 72  = 0;..  if( pFir
d250: 73 74 3d 3d 30 20 7c 7c 20 70 45 6e 64 3d 3d 30  st==0 || pEnd==0
d260: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
d270: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
d280: 73 20 26 20 50 53 5f 54 79 70 65 64 65 66 20 29  s & PS_Typedef )
d290: 7b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  {.    if( (flags
d2a0: 20 26 20 28 50 53 5f 45 78 70 6f 72 74 32 7c 50   & (PS_Export2|P
d2b0: 53 5f 4c 6f 63 61 6c 32 29 29 21 3d 30 20 29 7b  S_Local2))!=0 ){
d2c0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
d2d0: 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 5c 22  tderr,"%s:%d: \"
d2e0: 45 58 50 4f 52 54 5c 22 20 6f 72 20 5c 22 4c 4f  EXPORT\" or \"LO
d2f0: 43 41 4c 5c 22 20 69 67 6e 6f 72 65 64 20 62 65  CAL\" ignored be
d300: 66 6f 72 65 20 74 79 70 65 64 65 66 2e 5c 6e 22  fore typedef.\n"
d310: 2c 0a 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e  ,.        zFilen
d320: 61 6d 65 2c 20 70 46 69 72 73 74 2d 3e 6e 4c 69  ame, pFirst->nLi
d330: 6e 65 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  ne);.      nErr+
d340: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
d350: 20 28 66 6c 61 67 73 20 26 20 28 50 53 5f 49 6e   (flags & (PS_In
d360: 74 65 72 66 61 63 65 7c 50 53 5f 45 78 70 6f 72  terface|PS_Expor
d370: 74 7c 50 53 5f 4c 6f 63 61 6c 7c 44 50 5f 43 70  t|PS_Local|DP_Cp
d380: 6c 75 73 70 6c 75 73 29 29 3d 3d 30 20 29 7b 0a  lusplus))==0 ){.
d390: 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 69        /* It is i
d3a0: 6c 6c 65 67 61 6c 20 74 6f 20 64 75 70 6c 69 63  llegal to duplic
d3b0: 61 74 65 20 61 20 74 79 70 65 64 65 66 20 69 6e  ate a typedef in
d3c0: 20 43 20 28 62 75 74 20 4f 4b 20 69 6e 20 43 2b   C (but OK in C+
d3d0: 2b 29 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20  +)..      ** So 
d3e0: 64 6f 6e 27 74 20 72 65 63 6f 72 64 20 74 79 70  don't record typ
d3f0: 65 64 65 66 73 20 74 68 61 74 20 61 72 65 6e 27  edefs that aren'
d400: 74 20 77 69 74 68 69 6e 20 61 20 43 2b 2b 20 66  t within a C++ f
d410: 69 6c 65 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ile or.      ** 
d420: 77 69 74 68 69 6e 20 23 69 66 20 49 4e 54 45 52  within #if INTER
d430: 46 41 43 45 2e 2e 23 65 6e 64 69 66 20 2a 2f 0a  FACE..#endif */.
d440: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72        return nEr
d450: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
d460: 20 28 66 6c 61 67 73 20 26 20 28 50 53 5f 49 6e   (flags & (PS_In
d470: 74 65 72 66 61 63 65 7c 50 53 5f 45 78 70 6f 72  terface|PS_Expor
d480: 74 7c 50 53 5f 4c 6f 63 61 6c 29 29 3d 3d 30 20  t|PS_Local))==0 
d490: 26 26 20 70 72 6f 74 6f 5f 73 74 61 74 69 63 3d  && proto_static=
d4a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
d4b0: 67 6e 6f 72 65 20 74 79 70 65 64 65 66 73 20 74  gnore typedefs t
d4c0: 68 61 74 20 61 72 65 20 6e 6f 74 20 77 69 74 68  hat are not with
d4d0: 20 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 2e   "#if INTERFACE.
d4e0: 2e 23 65 6e 64 69 66 22 20 75 6e 6c 65 73 73 0a  .#endif" unless.
d4f0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 22 2d 6c        ** the "-l
d500: 6f 63 61 6c 22 20 63 6f 6d 6d 61 6e 64 20 6c 69  ocal" command li
d510: 6e 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  ne option is use
d520: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  d. */.      retu
d530: 72 6e 20 6e 45 72 72 3b 0a 20 20 20 20 7d 0a 20  rn nErr;.    }. 
d540: 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
d550: 28 50 53 5f 49 6e 74 65 72 66 61 63 65 7c 50 53  (PS_Interface|PS
d560: 5f 45 78 70 6f 72 74 29 29 3d 3d 30 20 29 7b 0a  _Export))==0 ){.
d570: 20 20 20 20 20 20 2f 2a 20 74 79 70 65 64 65 66        /* typedef
d580: 73 20 61 72 65 20 61 6c 77 61 79 73 20 6c 6f 63  s are always loc
d590: 61 6c 2c 20 75 6e 6c 65 73 73 20 77 69 74 68 69  al, unless withi
d5a0: 6e 20 23 69 66 20 49 4e 54 45 52 46 41 43 45 2e  n #if INTERFACE.
d5b0: 2e 23 65 6e 64 69 66 20 2a 2f 0a 20 20 20 20 20  .#endif */.     
d5c0: 20 69 73 4c 6f 63 61 6c 20 3d 20 31 3b 0a 20 20   isLocal = 1;.  
d5d0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
d5e0: 66 6c 61 67 73 20 26 20 28 50 53 5f 53 74 61 74  flags & (PS_Stat
d5f0: 69 63 7c 50 53 5f 4c 6f 63 61 6c 32 29 20 29 7b  ic|PS_Local2) ){
d600: 0a 20 20 20 20 69 66 28 20 70 72 6f 74 6f 5f 73  .    if( proto_s
d610: 74 61 74 69 63 3d 3d 30 20 26 26 20 28 66 6c 61  tatic==0 && (fla
d620: 67 73 20 26 20 50 53 5f 4c 6f 63 61 6c 32 29 3d  gs & PS_Local2)=
d630: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44  =0 ){.      /* D
d640: 6f 6e 27 74 20 72 65 63 6f 72 64 20 73 74 61 74  on't record stat
d650: 69 63 20 76 61 72 69 61 62 6c 65 73 20 75 6e 6c  ic variables unl
d660: 65 73 73 20 74 68 65 20 22 2d 6c 6f 63 61 6c 22  ess the "-local"
d670: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 20 20   command line.  
d680: 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 77 61      ** option wa
d690: 73 20 73 70 65 63 69 66 69 65 64 20 6f 72 20 74  s specified or t
d6a0: 68 65 20 22 4c 4f 43 41 4c 22 20 6b 65 79 77 6f  he "LOCAL" keywo
d6b0: 72 64 20 69 73 20 75 73 65 64 2e 20 2a 2f 0a 20  rd is used. */. 
d6c0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72       return nErr
d6d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
d6e0: 65 28 20 70 46 69 72 73 74 21 3d 30 20 26 26 20  e( pFirst!=0 && 
d6f0: 70 46 69 72 73 74 2d 3e 70 4e 65 78 74 21 3d 70  pFirst->pNext!=p
d700: 45 6e 64 20 26 26 0a 20 20 20 20 20 20 20 28 28  End &&.       ((
d710: 70 46 69 72 73 74 2d 3e 6e 54 65 78 74 3d 3d 36  pFirst->nText==6
d720: 20 26 26 20 73 74 72 6e 63 6d 70 28 70 46 69 72   && strncmp(pFir
d730: 73 74 2d 3e 7a 54 65 78 74 2c 22 73 74 61 74 69  st->zText,"stati
d740: 63 22 2c 36 29 3d 3d 30 29 0a 20 20 20 20 20 20  c",6)==0).      
d750: 20 20 7c 7c 20 28 70 46 69 72 73 74 2d 3e 6e 54    || (pFirst->nT
d760: 65 78 74 3d 3d 35 20 26 26 20 73 74 72 6e 63 6d  ext==5 && strncm
d770: 70 28 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c  p(pFirst->zText,
d780: 22 4c 4f 43 41 4c 22 2c 36 29 3d 3d 30 29 29 0a  "LOCAL",6)==0)).
d790: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
d7a0: 4c 6f 73 65 20 74 68 65 20 69 6e 69 74 69 61 6c  Lose the initial
d7b0: 20 22 73 74 61 74 69 63 22 20 6f 72 20 6c 6f 63   "static" or loc
d7c0: 61 6c 20 66 72 6f 6d 20 6c 6f 63 61 6c 20 76 61  al from local va
d7d0: 72 69 61 62 6c 65 73 2e 20 0a 20 20 20 20 20 20  riables. .      
d7e0: 2a 2a 20 57 65 27 6c 6c 20 70 72 65 70 65 6e 64  ** We'll prepend
d7f0: 20 22 65 78 74 65 72 6e 22 20 6c 61 74 65 72 2e   "extern" later.
d800: 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 72 73 74   */.      pFirst
d810: 20 3d 20 70 46 69 72 73 74 2d 3e 70 4e 65 78 74   = pFirst->pNext
d820: 3b 0a 20 20 20 20 20 20 69 73 4c 6f 63 61 6c 20  ;.      isLocal 
d830: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
d840: 66 28 20 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20  f( pFirst==0 || 
d850: 21 69 73 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  !isLocal ){.    
d860: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20    return nErr;. 
d870: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
d880: 20 66 6c 61 67 73 20 26 20 50 53 5f 4d 65 74 68   flags & PS_Meth
d890: 6f 64 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 65 74  od ){.    /* Met
d8a0: 68 6f 64 73 20 61 72 65 20 64 65 63 6c 61 72 65  hods are declare
d8b0: 64 20 62 79 20 74 68 65 69 72 20 63 6c 61 73 73  d by their class
d8c0: 2e 20 20 44 6f 6e 27 74 20 64 65 63 6c 61 72 65  .  Don't declare
d8d0: 20 73 65 70 61 72 61 74 65 6c 79 2e 20 2a 2f 0a   separately. */.
d8e0: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b      return nErr;
d8f0: 0a 20 20 7d 0a 20 20 69 73 56 61 72 20 3d 20 20  .  }.  isVar =  
d900: 28 66 6c 61 67 73 20 26 20 28 50 53 5f 54 79 70  (flags & (PS_Typ
d910: 65 64 65 66 7c 50 53 5f 4d 65 74 68 6f 64 29 29  edef|PS_Method))
d920: 3d 3d 30 20 26 26 20 69 73 56 61 72 69 61 62 6c  ==0 && isVariabl
d930: 65 44 65 66 28 70 46 69 72 73 74 2c 70 45 6e 64  eDef(pFirst,pEnd
d940: 29 3b 0a 20 20 69 66 28 20 69 73 56 61 72 20 26  );.  if( isVar &
d950: 26 20 28 66 6c 61 67 73 20 26 20 28 50 53 5f 49  & (flags & (PS_I
d960: 6e 74 65 72 66 61 63 65 7c 50 53 5f 45 78 70 6f  nterface|PS_Expo
d970: 72 74 7c 50 53 5f 4c 6f 63 61 6c 29 29 21 3d 30  rt|PS_Local))!=0
d980: 20 0a 20 20 26 26 20 28 66 6c 61 67 73 20 26 20   .  && (flags & 
d990: 50 53 5f 45 78 74 65 72 6e 29 3d 3d 30 20 29 7b  PS_Extern)==0 ){
d9a0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
d9b0: 65 72 72 2c 22 25 73 3a 25 64 3a 20 43 61 6e 27  err,"%s:%d: Can'
d9c0: 74 20 64 65 66 69 6e 65 20 61 20 76 61 72 69 61  t define a varia
d9d0: 62 6c 65 20 69 6e 20 74 68 69 73 20 63 6f 6e 74  ble in this cont
d9e0: 65 78 74 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 46  ext\n",.      zF
d9f0: 69 6c 65 6e 61 6d 65 2c 20 70 46 69 72 73 74 2d  ilename, pFirst-
da00: 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 6e 45 72  >nLine);.    nEr
da10: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 4e 61 6d 65  r++;.  }.  pName
da20: 20 3d 20 46 69 6e 64 44 65 63 6c 4e 61 6d 65 28   = FindDeclName(
da30: 70 46 69 72 73 74 2c 70 45 6e 64 2d 3e 70 50 72  pFirst,pEnd->pPr
da40: 65 76 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ev);.  if( pName
da50: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
da60: 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64  tf(stderr,"%s:%d
da70: 3a 20 43 61 6e 27 74 20 66 69 6e 64 20 61 20 6e  : Can't find a n
da80: 61 6d 65 20 66 6f 72 20 74 68 65 20 6f 62 6a 65  ame for the obje
da90: 63 74 20 64 65 63 6c 61 72 65 64 20 68 65 72 65  ct declared here
daa0: 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 46 69 6c  .\n",.      zFil
dab0: 65 6e 61 6d 65 2c 20 70 46 69 72 73 74 2d 3e 6e  ename, pFirst->n
dac0: 4c 69 6e 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Line);.    retur
dad0: 6e 20 6e 45 72 72 2b 31 3b 0a 20 20 7d 0a 0a 23  n nErr+1;.  }..#
dae0: 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 69 66  ifdef DEBUG.  if
daf0: 28 20 64 65 62 75 67 4d 61 73 6b 20 26 20 50 41  ( debugMask & PA
db00: 52 53 45 52 20 29 7b 0a 20 20 20 20 69 66 28 20  RSER ){.    if( 
db10: 66 6c 61 67 73 20 26 20 50 53 5f 54 79 70 65 64  flags & PS_Typed
db20: 65 66 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e  ef ){.      prin
db30: 74 66 28 22 2a 2a 2a 2a 20 46 6f 75 6e 64 20 74  tf("**** Found t
db40: 79 70 65 64 65 66 20 25 2e 2a 73 20 61 74 20 6c  ypedef %.*s at l
db50: 69 6e 65 20 25 64 2e 2e 2e 5c 6e 22 2c 0a 20 20  ine %d...\n",.  
db60: 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 6e 54 65        pName->nTe
db70: 78 74 2c 20 70 4e 61 6d 65 2d 3e 7a 54 65 78 74  xt, pName->zText
db80: 2c 20 70 4e 61 6d 65 2d 3e 6e 4c 69 6e 65 29 3b  , pName->nLine);
db90: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
dba0: 73 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 72  sVar ){.      pr
dbb0: 69 6e 74 66 28 22 2a 2a 2a 2a 20 46 6f 75 6e 64  intf("**** Found
dbc0: 20 76 61 72 69 61 62 6c 65 20 25 2e 2a 73 20 61   variable %.*s a
dbd0: 74 20 6c 69 6e 65 20 25 64 2e 2e 2e 5c 6e 22 2c  t line %d...\n",
dbe0: 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e  .        pName->
dbf0: 6e 54 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 7a 54  nText, pName->zT
dc00: 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 6e 4c 69 6e  ext, pName->nLin
dc10: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
dc20: 20 20 20 20 20 70 72 69 6e 74 66 28 22 2a 2a 2a       printf("***
dc30: 2a 20 46 6f 75 6e 64 20 70 72 6f 74 6f 74 79 70  * Found prototyp
dc40: 65 20 25 2e 2a 73 20 61 74 20 6c 69 6e 65 20 25  e %.*s at line %
dc50: 64 2e 2e 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d...\n",.       
dc60: 20 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 2c 20 70   pName->nText, p
dc70: 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 20 70 4e 61  Name->zText, pNa
dc80: 6d 65 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  me->nLine);.    
dc90: 7d 0a 20 20 20 20 50 72 69 6e 74 54 6f 6b 65 6e  }.    PrintToken
dca0: 73 28 70 46 69 72 73 74 2c 70 45 6e 64 2d 3e 70  s(pFirst,pEnd->p
dcb0: 50 72 65 76 29 3b 0a 20 20 20 20 70 72 69 6e 74  Prev);.    print
dcc0: 66 28 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65  f(";\n");.  }.#e
dcd0: 6e 64 69 66 0a 0a 20 20 70 44 65 63 6c 20 3d 20  ndif..  pDecl = 
dce0: 43 72 65 61 74 65 44 65 63 6c 28 70 4e 61 6d 65  CreateDecl(pName
dcf0: 2d 3e 7a 54 65 78 74 2c 70 4e 61 6d 65 2d 3e 6e  ->zText,pName->n
dd00: 54 65 78 74 29 3b 0a 20 20 69 66 28 20 28 66 6c  Text);.  if( (fl
dd10: 61 67 73 20 26 20 50 53 5f 54 79 70 65 64 65 66  ags & PS_Typedef
dd20: 29 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74  ) ){.    DeclSet
dd30: 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 20  Property(pDecl, 
dd40: 54 59 5f 54 79 70 65 64 65 66 29 3b 0a 20 20 7d  TY_Typedef);.  }
dd50: 65 6c 73 65 20 69 66 28 20 69 73 56 61 72 20 29  else if( isVar )
dd60: 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f  {.    DeclSetPro
dd70: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45  perty(pDecl,DP_E
dd80: 78 74 65 72 6e 52 65 71 64 20 7c 20 54 59 5f 56  xternReqd | TY_V
dd90: 61 72 69 61 62 6c 65 29 3b 0a 20 20 20 20 69 66  ariable);.    if
dda0: 28 20 21 28 66 6c 61 67 73 20 26 20 44 50 5f 43  ( !(flags & DP_C
ddb0: 70 6c 75 73 70 6c 75 73 29 20 29 7b 0a 20 20 20  plusplus) ){.   
ddc0: 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72     DeclSetProper
ddd0: 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 78 74 65  ty(pDecl,DP_Exte
dde0: 72 6e 43 52 65 71 64 29 3b 0a 20 20 20 20 7d 0a  rnCReqd);.    }.
ddf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 44 65 63    }else{.    Dec
de00: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65  lSetProperty(pDe
de10: 63 6c 2c 20 54 59 5f 53 75 62 72 6f 75 74 69 6e  cl, TY_Subroutin
de20: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 28 66 6c  e);.    if( !(fl
de30: 61 67 73 20 26 20 44 50 5f 43 70 6c 75 73 70 6c  ags & DP_Cpluspl
de40: 75 73 29 20 29 7b 0a 20 20 20 20 20 20 44 65 63  us) ){.      Dec
de50: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65  lSetProperty(pDe
de60: 63 6c 2c 44 50 5f 45 78 74 65 72 6e 43 52 65 71  cl,DP_ExternCReq
de70: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  d);.    }.  }.  
de80: 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20  pDecl->pComment 
de90: 3d 20 70 46 69 72 73 74 2d 3e 70 43 6f 6d 6d 65  = pFirst->pComme
dea0: 6e 74 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a 44 65  nt;.  pDecl->zDe
deb0: 63 6c 20 3d 20 54 6f 6b 65 6e 73 54 6f 53 74 72  cl = TokensToStr
dec0: 69 6e 67 28 70 46 69 72 73 74 2c 70 45 6e 64 2d  ing(pFirst,pEnd-
ded0: 3e 70 50 72 65 76 2c 22 3b 5c 6e 22 2c 30 2c 30  >pPrev,";\n",0,0
dee0: 29 3b 0a 20 20 69 66 28 20 69 73 4c 6f 63 61 6c  );.  if( isLocal
def0: 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 28 50 53   || (flags & (PS
df00: 5f 4c 6f 63 61 6c 7c 50 53 5f 4c 6f 63 61 6c 32  _Local|PS_Local2
df10: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 44 65 63  ))!=0 ){.    Dec
df20: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65  lSetProperty(pDe
df30: 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29 3b 0a 20 20  cl,DP_Local);.  
df40: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
df50: 26 20 28 50 53 5f 45 78 70 6f 72 74 7c 50 53 5f  & (PS_Export|PS_
df60: 45 78 70 6f 72 74 32 29 20 29 7b 0a 20 20 20 20  Export2) ){.    
df70: 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28  DeclSetProperty(
df80: 70 44 65 63 6c 2c 44 50 5f 45 78 70 6f 72 74 29  pDecl,DP_Export)
df90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
dfa0: 73 20 26 20 44 50 5f 43 70 6c 75 73 70 6c 75 73  s & DP_Cplusplus
dfb0: 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50   ){.    DeclSetP
dfc0: 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50  roperty(pDecl,DP
dfd0: 5f 43 70 6c 75 73 70 6c 75 73 29 3b 0a 20 20 7d  _Cplusplus);.  }
dfe0: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a  .  return nErr;.
dff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 6e  }../*.** Push an
e000: 20 69 66 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 6e   if condition on
e010: 74 6f 20 74 68 65 20 69 66 20 73 74 61 63 6b 0a  to the if stack.
e020: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 50  */.static void P
e030: 75 73 68 49 66 4d 61 63 72 6f 28 0a 20 20 63 6f  ushIfMacro(.  co
e040: 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 66 69  nst char *zPrefi
e050: 78 2c 20 20 20 20 20 20 2f 2a 20 41 20 70 72 65  x,      /* A pre
e060: 66 69 78 2c 20 6c 69 6b 65 20 22 64 65 66 69 6e  fix, like "defin
e070: 65 22 20 6f 72 20 22 21 22 20 2a 2f 0a 20 20 63  e" or "!" */.  c
e080: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
e090: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
e0a0: 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 69  condition */.  i
e0b0: 6e 74 20 6e 54 65 78 74 2c 20 20 20 20 20 20 20  nt nText,       
e0c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e0d0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
e0e0: 20 69 6e 20 7a 54 65 78 74 20 2a 2f 0a 20 20 69   in zText */.  i
e0f0: 6e 74 20 6e 4c 69 6e 65 2c 20 20 20 20 20 20 20  nt nLine,       
e100: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
e110: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68   number where th
e120: 69 73 20 6d 61 63 72 6f 20 6f 63 63 75 72 73 20  is macro occurs 
e130: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e150: 2a 20 45 69 74 68 65 72 20 30 2c 20 50 53 5f 49  * Either 0, PS_I
e160: 6e 74 65 72 66 61 63 65 2c 20 50 53 5f 45 78 70  nterface, PS_Exp
e170: 6f 72 74 20 6f 72 20 50 53 5f 4c 6f 63 61 6c 20  ort or PS_Local 
e180: 2a 2f 0a 29 7b 0a 20 20 49 66 6d 61 63 72 6f 20  */.){.  Ifmacro 
e190: 2a 70 49 66 3b 0a 20 20 69 6e 74 20 6e 42 79 74  *pIf;.  int nByt
e1a0: 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 69  e;..  nByte = si
e1b0: 7a 65 6f 66 28 49 66 6d 61 63 72 6f 29 3b 0a 20  zeof(Ifmacro);. 
e1c0: 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20   if( zText ){.  
e1d0: 20 20 69 66 28 20 7a 50 72 65 66 69 78 20 29 7b    if( zPrefix ){
e1e0: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
e1f0: 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78 29 20  strlen(zPrefix) 
e200: 2b 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  + 2;.    }.    n
e210: 42 79 74 65 20 2b 3d 20 6e 54 65 78 74 20 2b 20  Byte += nText + 
e220: 31 3b 0a 20 20 7d 0a 20 20 70 49 66 20 3d 20 53  1;.  }.  pIf = S
e230: 61 66 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  afeMalloc( nByte
e240: 20 29 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 20   );.  if( zText 
e250: 29 7b 0a 20 20 20 20 70 49 66 2d 3e 7a 43 6f 6e  ){.    pIf->zCon
e260: 64 69 74 69 6f 6e 20 3d 20 28 63 68 61 72 2a 29  dition = (char*)
e270: 26 70 49 66 5b 31 5d 3b 0a 20 20 20 20 69 66 28  &pIf[1];.    if(
e280: 20 7a 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20   zPrefix ){.    
e290: 20 20 73 70 72 69 6e 74 66 28 70 49 66 2d 3e 7a    sprintf(pIf->z
e2a0: 43 6f 6e 64 69 74 69 6f 6e 2c 22 25 73 28 25 2e  Condition,"%s(%.
e2b0: 2a 73 29 22 2c 7a 50 72 65 66 69 78 2c 6e 54 65  *s)",zPrefix,nTe
e2c0: 78 74 2c 7a 54 65 78 74 29 3b 0a 20 20 20 20 7d  xt,zText);.    }
e2d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 70 72 69  else{.      spri
e2e0: 6e 74 66 28 70 49 66 2d 3e 7a 43 6f 6e 64 69 74  ntf(pIf->zCondit
e2f0: 69 6f 6e 2c 22 25 2e 2a 73 22 2c 6e 54 65 78 74  ion,"%.*s",nText
e300: 2c 7a 54 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20  ,zText);.    }. 
e310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 66 2d   }else{.    pIf-
e320: 3e 7a 43 6f 6e 64 69 74 69 6f 6e 20 3d 20 30 3b  >zCondition = 0;
e330: 0a 20 20 7d 0a 20 20 70 49 66 2d 3e 6e 4c 69 6e  .  }.  pIf->nLin
e340: 65 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 70 49 66  e = nLine;.  pIf
e350: 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ->flags = flags;
e360: 0a 20 20 70 49 66 2d 3e 70 4e 65 78 74 20 3d 20  .  pIf->pNext = 
e370: 69 66 53 74 61 63 6b 3b 0a 20 20 69 66 53 74 61  ifStack;.  ifSta
e380: 63 6b 20 3d 20 70 49 66 3b 0a 7d 0a 0a 2f 2a 0a  ck = pIf;.}../*.
e390: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e3a0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e  is called to han
e3b0: 64 6c 65 20 61 6c 6c 20 70 72 65 70 72 6f 63 65  dle all preproce
e3c0: 73 73 6f 72 20 64 69 72 65 63 74 69 76 65 73 2e  ssor directives.
e3d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e3e0: 69 6e 65 20 77 69 6c 6c 20 72 65 63 6f 6d 70 75  ine will recompu
e3f0: 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
e400: 2a 70 50 72 65 73 65 74 46 6c 61 67 73 20 74 6f  *pPresetFlags to
e410: 20 62 65 20 74 68 65 0a 2a 2a 20 6c 6f 67 69 63   be the.** logic
e420: 61 6c 20 6f 72 20 6f 66 20 61 6c 6c 20 66 6c 61  al or of all fla
e430: 67 73 20 6f 6e 20 61 6c 6c 20 6e 65 73 74 65 64  gs on all nested
e440: 20 23 69 66 73 2e 20 20 54 68 65 20 23 69 66 73   #ifs.  The #ifs
e450: 20 74 68 61 74 20 73 65 74 20 66 6c 61 67 73 0a   that set flags.
e460: 2a 2a 20 61 72 65 20 61 73 20 66 6f 6c 6c 6f 77  ** are as follow
e470: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
e480: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 20 20 20 20  conditional     
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c                fl
e4a0: 61 67 20 73 65 74 0a 2a 2a 20 20 20 20 20 20 20  ag set.**       
e4b0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
e4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 2d  ---------      -
e4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e4e0: 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 20 20 23 69  ---.**        #i
e4f0: 66 20 49 4e 54 45 52 46 41 43 45 20 20 20 20 20  f INTERFACE     
e500: 20 20 20 20 20 20 20 20 20 20 20 20 50 53 5f 49              PS_I
e510: 6e 74 65 72 66 61 63 65 0a 2a 2a 20 20 20 20 20  nterface.**     
e520: 20 20 20 23 69 66 20 45 58 50 4f 52 54 5f 49 4e     #if EXPORT_IN
e530: 54 45 52 46 41 43 45 20 20 20 20 20 20 20 20 20  TERFACE         
e540: 20 50 53 5f 45 78 70 6f 72 74 0a 2a 2a 20 20 20   PS_Export.**   
e550: 20 20 20 20 20 23 69 66 20 4c 4f 43 41 4c 5f 49       #if LOCAL_I
e560: 4e 54 45 52 46 41 43 45 20 20 20 20 20 20 20 20  NTERFACE        
e570: 20 20 20 50 53 5f 4c 6f 63 61 6c 0a 2a 2a 0a 2a     PS_Local.**.*
e580: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
e590: 66 20 61 66 74 65 72 20 70 72 6f 63 65 73 73 69  f after processi
e5a0: 6e 67 20 74 68 65 20 70 72 65 70 72 6f 63 65 73  ng the preproces
e5b0: 73 6f 72 20 74 6f 6b 65 6e 20 67 69 76 65 6e 0a  sor token given.
e5c0: 2a 2a 20 62 79 20 70 54 6f 6b 65 6e 20 74 68 65  ** by pToken the
e5d0: 72 65 20 69 73 20 61 6e 20 22 23 69 66 20 49 4e  re is an "#if IN
e5e0: 54 45 52 46 41 43 45 22 20 6f 6e 20 74 68 65 20  TERFACE" on the 
e5f0: 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 2a 2a 20  preprocessor.** 
e600: 73 74 61 63 6b 2c 20 74 68 65 6e 20 2a 70 50 72  stack, then *pPr
e610: 65 73 65 74 46 6c 61 67 73 20 77 69 6c 6c 20 62  esetFlags will b
e620: 65 20 73 65 74 20 74 6f 20 50 53 5f 49 6e 74 65  e set to PS_Inte
e630: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
e640: 20 69 6e 74 20 50 61 72 73 65 50 72 65 70 72 6f   int ParsePrepro
e650: 63 65 73 73 6f 72 28 54 6f 6b 65 6e 20 2a 70 54  cessor(Token *pT
e660: 6f 6b 65 6e 2c 20 69 6e 74 20 66 6c 61 67 73 2c  oken, int flags,
e670: 20 69 6e 74 20 2a 70 50 72 65 73 65 74 46 6c 61   int *pPresetFla
e680: 67 73 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  gs){.  const cha
e690: 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 6e 74 20 6e  r *zCmd;.  int n
e6a0: 43 6d 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Cmd;.  const cha
e6b0: 72 20 2a 7a 41 72 67 3b 0a 20 20 69 6e 74 20 6e  r *zArg;.  int n
e6c0: 41 72 67 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20  Arg;.  int nErr 
e6d0: 3d 20 30 3b 0a 20 20 49 66 6d 61 63 72 6f 20 2a  = 0;.  Ifmacro *
e6e0: 70 49 66 3b 0a 0a 20 20 7a 43 6d 64 20 3d 20 26  pIf;..  zCmd = &
e6f0: 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 5b 31 5d  pToken->zText[1]
e700: 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61  ;.  while( isspa
e710: 63 65 28 2a 7a 43 6d 64 29 20 26 26 20 2a 7a 43  ce(*zCmd) && *zC
e720: 6d 64 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  md!='\n' ){.    
e730: 7a 43 6d 64 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  zCmd++;.  }.  if
e740: 28 20 21 69 73 61 6c 70 68 61 28 2a 7a 43 6d 64  ( !isalpha(*zCmd
e750: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
e760: 30 3b 0a 20 20 7d 0a 20 20 6e 43 6d 64 20 3d 20  0;.  }.  nCmd = 
e770: 31 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 61 6c  1;.  while( isal
e780: 70 68 61 28 7a 43 6d 64 5b 6e 43 6d 64 5d 29 20  pha(zCmd[nCmd]) 
e790: 29 7b 0a 20 20 20 20 6e 43 6d 64 2b 2b 3b 0a 20  ){.    nCmd++;. 
e7a0: 20 7d 0a 0a 20 20 69 66 28 20 6e 43 6d 64 3d 3d   }..  if( nCmd==
e7b0: 35 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 43 6d  5 && strncmp(zCm
e7c0: 64 2c 22 65 6e 64 69 66 22 2c 35 29 3d 3d 30 20  d,"endif",5)==0 
e7d0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
e7e0: 20 50 6f 70 20 74 68 65 20 69 66 20 73 74 61 63   Pop the if stac
e7f0: 6b 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  k .    */.    pI
e800: 66 20 3d 20 69 66 53 74 61 63 6b 3b 0a 20 20 20  f = ifStack;.   
e810: 20 69 66 28 20 70 49 66 3d 3d 30 20 29 7b 0a 20   if( pIf==0 ){. 
e820: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
e830: 65 72 72 2c 22 25 73 3a 25 64 3a 20 65 78 74 72  err,"%s:%d: extr
e840: 61 20 27 23 65 6e 64 69 66 27 2e 5c 6e 22 2c 7a  a '#endif'.\n",z
e850: 46 69 6c 65 6e 61 6d 65 2c 70 54 6f 6b 65 6e 2d  Filename,pToken-
e860: 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 72  >nLine);.      r
e870: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
e880: 20 20 20 69 66 53 74 61 63 6b 20 3d 20 70 49 66     ifStack = pIf
e890: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 53 61 66  ->pNext;.    Saf
e8a0: 65 46 72 65 65 28 70 49 66 29 3b 0a 20 20 7d 65  eFree(pIf);.  }e
e8b0: 6c 73 65 20 69 66 28 20 6e 43 6d 64 3d 3d 36 20  lse if( nCmd==6 
e8c0: 26 26 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c  && strncmp(zCmd,
e8d0: 22 64 65 66 69 6e 65 22 2c 36 29 3d 3d 30 20 29  "define",6)==0 )
e8e0: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
e8f0: 52 65 63 6f 72 64 20 61 20 23 64 65 66 69 6e 65  Record a #define
e900: 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 50 53   if we are in PS
e910: 5f 49 6e 74 65 72 66 61 63 65 20 6f 72 20 50 53  _Interface or PS
e920: 5f 45 78 70 6f 72 74 20 0a 20 20 20 20 2a 2f 0a  _Export .    */.
e930: 20 20 20 20 44 65 63 6c 20 2a 70 44 65 63 6c 3b      Decl *pDecl;
e940: 0a 20 20 20 20 69 66 28 20 21 28 66 6c 61 67 73  .    if( !(flags
e950: 20 26 20 28 50 53 5f 4c 6f 63 61 6c 7c 50 53 5f   & (PS_Local|PS_
e960: 49 6e 74 65 72 66 61 63 65 7c 50 53 5f 45 78 70  Interface|PS_Exp
e970: 6f 72 74 29 29 20 29 7b 20 72 65 74 75 72 6e 20  ort)) ){ return 
e980: 30 3b 20 7d 0a 20 20 20 20 7a 41 72 67 20 3d 20  0; }.    zArg = 
e990: 26 7a 43 6d 64 5b 36 5d 3b 0a 20 20 20 20 77 68  &zCmd[6];.    wh
e9a0: 69 6c 65 28 20 2a 7a 41 72 67 20 26 26 20 69 73  ile( *zArg && is
e9b0: 73 70 61 63 65 28 2a 7a 41 72 67 29 20 26 26 20  space(*zArg) && 
e9c0: 2a 7a 41 72 67 21 3d 27 5c 6e 27 20 29 7b 0a 20  *zArg!='\n' ){. 
e9d0: 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20       zArg++;.   
e9e0: 20 7d 0a 20 20 20 20 69 66 28 20 2a 7a 41 72 67   }.    if( *zArg
e9f0: 3d 3d 30 20 7c 7c 20 2a 7a 41 72 67 3d 3d 27 5c  ==0 || *zArg=='\
ea00: 6e 27 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20  n' ){ return 0; 
ea10: 7d 0a 20 20 20 20 66 6f 72 28 6e 41 72 67 3d 30  }.    for(nArg=0
ea20: 3b 20 49 53 41 4c 4e 55 4d 28 7a 41 72 67 5b 6e  ; ISALNUM(zArg[n
ea30: 41 72 67 5d 29 3b 20 6e 41 72 67 2b 2b 29 7b 7d  Arg]); nArg++){}
ea40: 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 30  .    if( nArg==0
ea50: 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a   ){ return 0; }.
ea60: 20 20 20 20 70 44 65 63 6c 20 3d 20 43 72 65 61      pDecl = Crea
ea70: 74 65 44 65 63 6c 28 7a 41 72 67 2c 6e 41 72 67  teDecl(zArg,nArg
ea80: 29 3b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 70 43  );.    pDecl->pC
ea90: 6f 6d 6d 65 6e 74 20 3d 20 70 54 6f 6b 65 6e 2d  omment = pToken-
eaa0: 3e 70 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 44  >pComment;.    D
eab0: 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70  eclSetProperty(p
eac0: 44 65 63 6c 2c 54 59 5f 4d 61 63 72 6f 29 3b 0a  Decl,TY_Macro);.
ead0: 20 20 20 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c      pDecl->zDecl
eae0: 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 70   = SafeMalloc( p
eaf0: 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 2b 20 32  Token->nText + 2
eb00: 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   );.    sprintf(
eb10: 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 2c 22 25 2e  pDecl->zDecl,"%.
eb20: 2a 73 5c 6e 22 2c 70 54 6f 6b 65 6e 2d 3e 6e 54  *s\n",pToken->nT
eb30: 65 78 74 2c 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78  ext,pToken->zTex
eb40: 74 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67  t);.    if( flag
eb50: 73 20 26 20 50 53 5f 45 78 70 6f 72 74 20 29 7b  s & PS_Export ){
eb60: 0a 20 20 20 20 20 20 44 65 63 6c 53 65 74 50 72  .      DeclSetPr
eb70: 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f  operty(pDecl,DP_
eb80: 45 78 70 6f 72 74 29 3b 0a 20 20 20 20 7d 65 6c  Export);.    }el
eb90: 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 50  se if( flags & P
eba0: 53 5f 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  S_Local ){.     
ebb0: 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79   DeclSetProperty
ebc0: 28 70 44 65 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29  (pDecl,DP_Local)
ebd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
ebe0: 69 66 28 20 6e 43 6d 64 3d 3d 37 20 26 26 20 73  if( nCmd==7 && s
ebf0: 74 72 6e 63 6d 70 28 7a 43 6d 64 2c 22 69 6e 63  trncmp(zCmd,"inc
ec00: 6c 75 64 65 22 2c 37 29 3d 3d 30 20 29 7b 0a 20  lude",7)==0 ){. 
ec10: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 63     /*.    ** Rec
ec20: 6f 72 64 20 61 6e 20 23 69 6e 63 6c 75 64 65 20  ord an #include 
ec30: 69 66 20 77 65 20 61 72 65 20 69 6e 20 50 53 5f  if we are in PS_
ec40: 49 6e 74 65 72 66 61 63 65 20 6f 72 20 50 53 5f  Interface or PS_
ec50: 45 78 70 6f 72 74 20 0a 20 20 20 20 2a 2f 0a 20  Export .    */. 
ec60: 20 20 20 49 6e 63 6c 75 64 65 20 2a 70 49 6e 63     Include *pInc
ec70: 6c 75 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  lude;.    char *
ec80: 7a 49 66 3b 0a 0a 20 20 20 20 69 66 28 20 21 28  zIf;..    if( !(
ec90: 66 6c 61 67 73 20 26 20 28 50 53 5f 49 6e 74 65  flags & (PS_Inte
eca0: 72 66 61 63 65 7c 50 53 5f 45 78 70 6f 72 74 29  rface|PS_Export)
ecb0: 29 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  ) ){ return 0; }
ecc0: 0a 20 20 20 20 7a 41 72 67 20 3d 20 26 7a 43 6d  .    zArg = &zCm
ecd0: 64 5b 37 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  d[7];.    while(
ece0: 20 2a 7a 41 72 67 20 26 26 20 69 73 73 70 61 63   *zArg && isspac
ecf0: 65 28 2a 7a 41 72 67 29 20 29 7b 20 7a 41 72 67  e(*zArg) ){ zArg
ed00: 2b 2b 3b 20 7d 0a 20 20 20 20 66 6f 72 28 6e 41  ++; }.    for(nA
ed10: 72 67 3d 30 3b 20 21 69 73 73 70 61 63 65 28 7a  rg=0; !isspace(z
ed20: 41 72 67 5b 6e 41 72 67 5d 29 3b 20 6e 41 72 67  Arg[nArg]); nArg
ed30: 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 28 7a  ++){}.    if( (z
ed40: 41 72 67 5b 30 5d 3d 3d 27 22 27 20 26 26 20 7a  Arg[0]=='"' && z
ed50: 41 72 67 5b 6e 41 72 67 2d 31 5d 21 3d 27 22 27  Arg[nArg-1]!='"'
ed60: 29 0a 20 20 20 20 20 20 7c 7c 28 7a 41 72 67 5b  ).      ||(zArg[
ed70: 30 5d 3d 3d 27 3c 27 20 26 26 20 7a 41 72 67 5b  0]=='<' && zArg[
ed80: 6e 41 72 67 2d 31 5d 21 3d 27 3e 27 29 0a 20 20  nArg-1]!='>').  
ed90: 20 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e    ){.      fprin
eda0: 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64  tf(stderr,"%s:%d
edb0: 3a 20 6d 61 6c 66 6f 72 6d 65 64 20 23 69 6e 63  : malformed #inc
edc0: 6c 75 64 65 20 73 74 61 74 65 6d 65 6e 74 2e 5c  lude statement.\
edd0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 7a 46 69 6c  n",.        zFil
ede0: 65 6e 61 6d 65 2c 70 54 6f 6b 65 6e 2d 3e 6e 4c  ename,pToken->nL
edf0: 69 6e 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ine);.      retu
ee00: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
ee10: 7a 49 66 20 3d 20 47 65 74 49 66 53 74 72 69 6e  zIf = GetIfStrin
ee20: 67 28 29 3b 0a 20 20 20 20 69 66 28 20 7a 49 66  g();.    if( zIf
ee30: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 63 6c 75   ){.      pInclu
ee40: 64 65 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28  de = SafeMalloc(
ee50: 20 73 69 7a 65 6f 66 28 49 6e 63 6c 75 64 65 29   sizeof(Include)
ee60: 20 2b 20 6e 41 72 67 2a 32 20 2b 20 73 74 72 6c   + nArg*2 + strl
ee70: 65 6e 28 7a 49 66 29 20 2b 20 31 30 20 29 3b 0a  en(zIf) + 10 );.
ee80: 20 20 20 20 20 20 70 49 6e 63 6c 75 64 65 2d 3e        pInclude->
ee90: 7a 46 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 26  zFile = (char*)&
eea0: 70 49 6e 63 6c 75 64 65 5b 31 5d 3b 0a 20 20 20  pInclude[1];.   
eeb0: 20 20 20 70 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61     pInclude->zLa
eec0: 62 65 6c 20 3d 20 26 70 49 6e 63 6c 75 64 65 2d  bel = &pInclude-
eed0: 3e 7a 46 69 6c 65 5b 6e 41 72 67 2b 31 5d 3b 0a  >zFile[nArg+1];.
eee0: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 70 49        sprintf(pI
eef0: 6e 63 6c 75 64 65 2d 3e 7a 46 69 6c 65 2c 22 25  nclude->zFile,"%
ef00: 2e 2a 73 22 2c 6e 41 72 67 2c 7a 41 72 67 29 3b  .*s",nArg,zArg);
ef10: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 70  .      sprintf(p
ef20: 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61 62 65 6c 2c  Include->zLabel,
ef30: 22 25 2e 2a 73 3a 25 73 22 2c 6e 41 72 67 2c 7a  "%.*s:%s",nArg,z
ef40: 41 72 67 2c 7a 49 66 29 3b 0a 20 20 20 20 20 20  Arg,zIf);.      
ef50: 70 49 6e 63 6c 75 64 65 2d 3e 7a 49 66 20 3d 20  pInclude->zIf = 
ef60: 26 70 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61 62 65  &pInclude->zLabe
ef70: 6c 5b 6e 41 72 67 2b 31 5d 3b 0a 20 20 20 20 20  l[nArg+1];.     
ef80: 20 53 61 66 65 46 72 65 65 28 7a 49 66 29 3b 0a   SafeFree(zIf);.
ef90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
efa0: 20 70 49 6e 63 6c 75 64 65 20 3d 20 53 61 66 65   pInclude = Safe
efb0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
efc0: 6e 63 6c 75 64 65 29 20 2b 20 6e 41 72 67 20 2b  nclude) + nArg +
efd0: 20 31 20 29 3b 0a 20 20 20 20 20 20 70 49 6e 63   1 );.      pInc
efe0: 6c 75 64 65 2d 3e 7a 46 69 6c 65 20 3d 20 28 63  lude->zFile = (c
eff0: 68 61 72 2a 29 26 70 49 6e 63 6c 75 64 65 5b 31  har*)&pInclude[1
f000: 5d 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ];.      sprintf
f010: 28 70 49 6e 63 6c 75 64 65 2d 3e 7a 46 69 6c 65  (pInclude->zFile
f020: 2c 22 25 2e 2a 73 22 2c 6e 41 72 67 2c 7a 41 72  ,"%.*s",nArg,zAr
f030: 67 29 3b 0a 20 20 20 20 20 20 70 49 6e 63 6c 75  g);.      pInclu
f040: 64 65 2d 3e 7a 49 66 20 3d 20 30 3b 0a 20 20 20  de->zIf = 0;.   
f050: 20 20 20 70 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61     pInclude->zLa
f060: 62 65 6c 20 3d 20 70 49 6e 63 6c 75 64 65 2d 3e  bel = pInclude->
f070: 7a 46 69 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  zFile;.    }.   
f080: 20 70 49 6e 63 6c 75 64 65 2d 3e 70 4e 65 78 74   pInclude->pNext
f090: 20 3d 20 69 6e 63 6c 75 64 65 4c 69 73 74 3b 0a   = includeList;.
f0a0: 20 20 20 20 69 6e 63 6c 75 64 65 4c 69 73 74 20      includeList 
f0b0: 3d 20 70 49 6e 63 6c 75 64 65 3b 0a 20 20 7d 65  = pInclude;.  }e
f0c0: 6c 73 65 20 69 66 28 20 6e 43 6d 64 3d 3d 32 20  lse if( nCmd==2 
f0d0: 26 26 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c  && strncmp(zCmd,
f0e0: 22 69 66 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "if",2)==0 ){.  
f0f0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 75 73 68    /*.    ** Push
f100: 20 61 6e 20 23 69 66 2e 20 20 57 61 74 63 68 20   an #if.  Watch 
f110: 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 20  for the special 
f120: 63 61 73 65 73 20 6f 66 20 49 4e 54 45 52 46 41  cases of INTERFA
f130: 43 45 0a 20 20 20 20 2a 2a 20 61 6e 64 20 45 58  CE.    ** and EX
f140: 50 4f 52 54 5f 49 4e 54 45 52 46 41 43 45 20 61  PORT_INTERFACE a
f150: 6e 64 20 4c 4f 43 41 4c 5f 49 4e 54 45 52 46 41  nd LOCAL_INTERFA
f160: 43 45 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 41  CE.    */.    zA
f170: 72 67 20 3d 20 26 7a 43 6d 64 5b 32 5d 3b 0a 20  rg = &zCmd[2];. 
f180: 20 20 20 77 68 69 6c 65 28 20 2a 7a 41 72 67 20     while( *zArg 
f190: 26 26 20 69 73 73 70 61 63 65 28 2a 7a 41 72 67  && isspace(*zArg
f1a0: 29 20 26 26 20 2a 7a 41 72 67 21 3d 27 5c 6e 27  ) && *zArg!='\n'
f1b0: 20 29 7b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b   ){.      zArg++
f1c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f1d0: 2a 7a 41 72 67 3d 3d 30 20 7c 7c 20 2a 7a 41 72  *zArg==0 || *zAr
f1e0: 67 3d 3d 27 5c 6e 27 20 29 7b 20 72 65 74 75 72  g=='\n' ){ retur
f1f0: 6e 20 30 3b 20 7d 0a 20 20 20 20 6e 41 72 67 20  n 0; }.    nArg 
f200: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20  = pToken->nText 
f210: 2b 20 28 69 6e 74 29 70 54 6f 6b 65 6e 2d 3e 7a  + (int)pToken->z
f220: 54 65 78 74 20 2d 20 28 69 6e 74 29 7a 41 72 67  Text - (int)zArg
f230: 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  ;.    if( nArg==
f240: 39 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 41 72  9 && strncmp(zAr
f250: 67 2c 22 49 4e 54 45 52 46 41 43 45 22 2c 39 29  g,"INTERFACE",9)
f260: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 50 75 73  ==0 ){.      Pus
f270: 68 49 66 4d 61 63 72 6f 28 30 2c 30 2c 30 2c 70  hIfMacro(0,0,0,p
f280: 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 50 53 5f  Token->nLine,PS_
f290: 49 6e 74 65 72 66 61 63 65 29 3b 0a 20 20 20 20  Interface);.    
f2a0: 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d  }else if( nArg==
f2b0: 31 36 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 41  16 && strncmp(zA
f2c0: 72 67 2c 22 45 58 50 4f 52 54 5f 49 4e 54 45 52  rg,"EXPORT_INTER
f2d0: 46 41 43 45 22 2c 31 36 29 3d 3d 30 20 29 7b 0a  FACE",16)==0 ){.
f2e0: 20 20 20 20 20 20 50 75 73 68 49 66 4d 61 63 72        PushIfMacr
f2f0: 6f 28 30 2c 30 2c 30 2c 70 54 6f 6b 65 6e 2d 3e  o(0,0,0,pToken->
f300: 6e 4c 69 6e 65 2c 50 53 5f 45 78 70 6f 72 74 29  nLine,PS_Export)
f310: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
f320: 6e 41 72 67 3d 3d 31 35 20 26 26 20 73 74 72 6e  nArg==15 && strn
f330: 63 6d 70 28 7a 41 72 67 2c 22 4c 4f 43 41 4c 5f  cmp(zArg,"LOCAL_
f340: 49 4e 54 45 52 46 41 43 45 22 2c 31 35 29 3d 3d  INTERFACE",15)==
f350: 30 20 29 7b 0a 20 20 20 20 20 20 50 75 73 68 49  0 ){.      PushI
f360: 66 4d 61 63 72 6f 28 30 2c 30 2c 30 2c 70 54 6f  fMacro(0,0,0,pTo
f370: 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 50 53 5f 4c 6f  ken->nLine,PS_Lo
f380: 63 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  cal);.    }else{
f390: 0a 20 20 20 20 20 20 50 75 73 68 49 66 4d 61 63  .      PushIfMac
f3a0: 72 6f 28 30 2c 7a 41 72 67 2c 6e 41 72 67 2c 70  ro(0,zArg,nArg,p
f3b0: 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 30 29 3b  Token->nLine,0);
f3c0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
f3d0: 66 28 20 6e 43 6d 64 3d 3d 35 20 26 26 20 73 74  f( nCmd==5 && st
f3e0: 72 6e 63 6d 70 28 7a 43 6d 64 2c 22 69 66 64 65  rncmp(zCmd,"ifde
f3f0: 66 22 2c 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20  f",5)==0 ){.    
f400: 2f 2a 20 0a 20 20 20 20 2a 2a 20 50 75 73 68 20  /* .    ** Push 
f410: 61 6e 20 23 69 66 64 65 66 2e 0a 20 20 20 20 2a  an #ifdef..    *
f420: 2f 0a 20 20 20 20 7a 41 72 67 20 3d 20 26 7a 43  /.    zArg = &zC
f430: 6d 64 5b 35 5d 3b 0a 20 20 20 20 77 68 69 6c 65  md[5];.    while
f440: 28 20 2a 7a 41 72 67 20 26 26 20 69 73 73 70 61  ( *zArg && isspa
f450: 63 65 28 2a 7a 41 72 67 29 20 26 26 20 2a 7a 41  ce(*zArg) && *zA
f460: 72 67 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  rg!='\n' ){.    
f470: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a    zArg++;.    }.
f480: 20 20 20 20 69 66 28 20 2a 7a 41 72 67 3d 3d 30      if( *zArg==0
f490: 20 7c 7c 20 2a 7a 41 72 67 3d 3d 27 5c 6e 27 20   || *zArg=='\n' 
f4a0: 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a 20  ){ return 0; }. 
f4b0: 20 20 20 6e 41 72 67 20 3d 20 70 54 6f 6b 65 6e     nArg = pToken
f4c0: 2d 3e 6e 54 65 78 74 20 2b 20 28 69 6e 74 29 70  ->nText + (int)p
f4d0: 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 20 2d 20 28  Token->zText - (
f4e0: 69 6e 74 29 7a 41 72 67 3b 0a 20 20 20 20 50 75  int)zArg;.    Pu
f4f0: 73 68 49 66 4d 61 63 72 6f 28 22 64 65 66 69 6e  shIfMacro("defin
f500: 65 64 22 2c 7a 41 72 67 2c 6e 41 72 67 2c 70 54  ed",zArg,nArg,pT
f510: 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 30 29 3b 0a  oken->nLine,0);.
f520: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 6d 64    }else if( nCmd
f530: 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d 70 28 7a  ==6 && strncmp(z
f540: 43 6d 64 2c 22 69 66 6e 64 65 66 22 2c 36 29 3d  Cmd,"ifndef",6)=
f550: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
f560: 20 2a 2a 20 50 75 73 68 20 61 6e 20 23 69 66 6e   ** Push an #ifn
f570: 64 65 66 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  def..    */.    
f580: 7a 41 72 67 20 3d 20 26 7a 43 6d 64 5b 36 5d 3b  zArg = &zCmd[6];
f590: 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 41 72  .    while( *zAr
f5a0: 67 20 26 26 20 69 73 73 70 61 63 65 28 2a 7a 41  g && isspace(*zA
f5b0: 72 67 29 20 26 26 20 2a 7a 41 72 67 21 3d 27 5c  rg) && *zArg!='\
f5c0: 6e 27 20 29 7b 0a 20 20 20 20 20 20 7a 41 72 67  n' ){.      zArg
f5d0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
f5e0: 28 20 2a 7a 41 72 67 3d 3d 30 20 7c 7c 20 2a 7a  ( *zArg==0 || *z
f5f0: 41 72 67 3d 3d 27 5c 6e 27 20 29 7b 20 72 65 74  Arg=='\n' ){ ret
f600: 75 72 6e 20 30 3b 20 7d 0a 20 20 20 20 6e 41 72  urn 0; }.    nAr
f610: 67 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78  g = pToken->nTex
f620: 74 20 2b 20 28 69 6e 74 29 70 54 6f 6b 65 6e 2d  t + (int)pToken-
f630: 3e 7a 54 65 78 74 20 2d 20 28 69 6e 74 29 7a 41  >zText - (int)zA
f640: 72 67 3b 0a 20 20 20 20 50 75 73 68 49 66 4d 61  rg;.    PushIfMa
f650: 63 72 6f 28 22 21 64 65 66 69 6e 65 64 22 2c 7a  cro("!defined",z
f660: 41 72 67 2c 6e 41 72 67 2c 70 54 6f 6b 65 6e 2d  Arg,nArg,pToken-
f670: 3e 6e 4c 69 6e 65 2c 30 29 3b 0a 20 20 7d 65 6c  >nLine,0);.  }el
f680: 73 65 20 69 66 28 20 6e 43 6d 64 3d 3d 34 20 26  se if( nCmd==4 &
f690: 26 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c 22  & strncmp(zCmd,"
f6a0: 65 6c 73 65 22 2c 34 29 3d 3d 30 20 29 7b 0a 20  else",4)==0 ){. 
f6b0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 6e 76     /*.    ** Inv
f6c0: 65 72 74 20 74 68 65 20 23 69 66 20 6f 6e 20 74  ert the #if on t
f6d0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
f6e0: 61 63 6b 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack .    */.    
f6f0: 69 66 28 20 69 66 53 74 61 63 6b 3d 3d 30 20 29  if( ifStack==0 )
f700: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
f710: 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 27  stderr,"%s:%d: '
f720: 23 65 6c 73 65 27 20 77 69 74 68 6f 75 74 20 61  #else' without a
f730: 6e 20 27 23 69 66 27 5c 6e 22 2c 7a 46 69 6c 65  n '#if'\n",zFile
f740: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 70  name,.         p
f750: 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 29 3b 0a 20  Token->nLine);. 
f760: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
f770: 20 20 20 7d 0a 20 20 20 20 70 49 66 20 3d 20 69     }.    pIf = i
f780: 66 53 74 61 63 6b 3b 0a 20 20 20 20 69 66 28 20  fStack;.    if( 
f790: 70 49 66 2d 3e 7a 43 6f 6e 64 69 74 69 6f 6e 20  pIf->zCondition 
f7a0: 29 7b 0a 20 20 20 20 20 20 69 66 53 74 61 63 6b  ){.      ifStack
f7b0: 20 3d 20 69 66 53 74 61 63 6b 2d 3e 70 4e 65 78   = ifStack->pNex
f7c0: 74 3b 0a 20 20 20 20 20 20 50 75 73 68 49 66 4d  t;.      PushIfM
f7d0: 61 63 72 6f 28 22 21 22 2c 70 49 66 2d 3e 7a 43  acro("!",pIf->zC
f7e0: 6f 6e 64 69 74 69 6f 6e 2c 73 74 72 6c 65 6e 28  ondition,strlen(
f7f0: 70 49 66 2d 3e 7a 43 6f 6e 64 69 74 69 6f 6e 29  pIf->zCondition)
f800: 2c 70 49 66 2d 3e 6e 4c 69 6e 65 2c 30 29 3b 0a  ,pIf->nLine,0);.
f810: 20 20 20 20 20 20 53 61 66 65 46 72 65 65 28 70        SafeFree(p
f820: 49 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  If);.    }else{.
f830: 20 20 20 20 20 20 70 49 66 2d 3e 66 6c 61 67 73        pIf->flags
f840: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
f850: 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  lse{.    /*.    
f860: 2a 2a 20 54 68 69 73 20 64 69 72 65 63 74 69 76  ** This directiv
f870: 65 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20  e can be safely 
f880: 69 67 6e 6f 72 65 64 20 0a 20 20 20 20 2a 2f 0a  ignored .    */.
f890: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f8a0: 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 52 65  }..  /* .  ** Re
f8b0: 63 6f 6d 70 75 74 65 20 74 68 65 20 70 72 65 73  compute the pres
f8c0: 65 74 20 66 6c 61 67 73 20 0a 20 20 2a 2f 0a 20  et flags .  */. 
f8d0: 20 2a 70 50 72 65 73 65 74 46 6c 61 67 73 20 3d   *pPresetFlags =
f8e0: 20 30 3b 0a 20 20 66 6f 72 28 70 49 66 20 3d 20   0;.  for(pIf = 
f8f0: 69 66 53 74 61 63 6b 3b 20 70 49 66 3b 20 70 49  ifStack; pIf; pI
f900: 66 3d 70 49 66 2d 3e 70 4e 65 78 74 29 7b 0a 20  f=pIf->pNext){. 
f910: 20 20 20 2a 70 50 72 65 73 65 74 46 6c 61 67 73     *pPresetFlags
f920: 20 7c 3d 20 70 49 66 2d 3e 66 6c 61 67 73 3b 0a   |= pIf->flags;.
f930: 20 20 7d 0a 20 20 20 20 0a 20 20 72 65 74 75 72    }.    .  retur
f940: 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nErr;.}../*.**
f950: 20 50 61 72 73 65 20 61 6e 20 65 6e 74 69 72 65   Parse an entire
f960: 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74   file.  Return t
f970: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
f980: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ors..**.** pList
f990: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 6f   is a list of to
f9a0: 6b 65 6e 73 20 69 6e 20 74 68 65 20 66 69 6c 65  kens in the file
f9b0: 2e 20 20 57 68 69 74 65 73 70 61 63 65 20 74 6f  .  Whitespace to
f9c0: 6b 65 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a  kens have been.*
f9d0: 2a 20 65 6c 69 6d 69 6e 61 74 65 64 2c 20 61 6e  * eliminated, an
f9e0: 64 20 74 65 78 74 20 77 69 74 68 20 7b 2e 2e 2e  d text with {...
f9f0: 7d 20 68 61 73 20 62 65 65 6e 20 63 6f 6c 6c 61  } has been colla
fa00: 70 73 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73  psed into a.** s
fa10: 69 6e 67 6c 65 20 54 54 5f 42 72 61 63 65 20 74  ingle TT_Brace t
fa20: 6f 6b 65 6e 2e 0a 2a 2a 20 0a 2a 2a 20 69 6e 69  oken..** .** ini
fa30: 74 46 6c 61 67 73 20 61 72 65 20 61 20 73 65 74  tFlags are a set
fa40: 20 6f 66 20 70 61 72 73 65 20 66 6c 61 67 73 20   of parse flags 
fa50: 74 68 61 74 20 73 68 6f 75 6c 64 20 61 6c 77 61  that should alwa
fa60: 79 73 20 62 65 20 73 65 74 20 66 6f 72 20 74 68  ys be set for th
fa70: 69 73 0a 2a 2a 20 66 69 6c 65 2e 20 20 46 6f 72  is.** file.  For
fa80: 20 2e 63 20 66 69 6c 65 73 20 74 68 69 73 20 69   .c files this i
fa90: 73 20 6e 6f 72 6d 61 6c 6c 79 20 30 2e 20 20 46  s normally 0.  F
faa0: 6f 72 20 2e 68 20 66 69 6c 65 73 20 69 74 20 69  or .h files it i
fab0: 73 20 50 53 5f 49 6e 74 65 72 66 61 63 65 2e 0a  s PS_Interface..
fac0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 50 61  */.static int Pa
fad0: 72 73 65 46 69 6c 65 28 54 6f 6b 65 6e 20 2a 70  rseFile(Token *p
fae0: 4c 69 73 74 2c 20 69 6e 74 20 69 6e 69 74 46 6c  List, int initFl
faf0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72  ags){.  int nErr
fb00: 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70   = 0;.  Token *p
fb10: 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Start = 0;.  int
fb20: 20 66 6c 61 67 73 20 3d 20 69 6e 69 74 46 6c 61   flags = initFla
fb30: 67 73 3b 0a 20 20 69 6e 74 20 70 72 65 73 65 74  gs;.  int preset
fb40: 46 6c 61 67 73 20 3d 20 69 6e 69 74 46 6c 61 67  Flags = initFlag
fb50: 73 3b 0a 20 20 69 6e 74 20 72 65 73 65 74 46 6c  s;.  int resetFl
fb60: 61 67 20 3d 20 30 3b 0a 0a 20 20 69 6e 63 6c 75  ag = 0;..  inclu
fb70: 64 65 4c 69 73 74 20 3d 20 30 3b 0a 20 20 77 68  deList = 0;.  wh
fb80: 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20  ile( pList ){.  
fb90: 20 20 73 77 69 74 63 68 28 20 70 4c 69 73 74 2d    switch( pList-
fba0: 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61  >eType ){.    ca
fbb0: 73 65 20 54 54 5f 45 4f 46 3a 0a 20 20 20 20 20  se TT_EOF:.     
fbc0: 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 6c 6f 6f   goto end_of_loo
fbd0: 70 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 54 5f  p;..    case TT_
fbe0: 50 72 65 70 72 6f 63 65 73 73 6f 72 3a 0a 20 20  Preprocessor:.  
fbf0: 20 20 20 20 6e 45 72 72 20 2b 3d 20 50 61 72 73      nErr += Pars
fc00: 65 50 72 65 70 72 6f 63 65 73 73 6f 72 28 70 4c  ePreprocessor(pL
fc10: 69 73 74 2c 66 6c 61 67 73 2c 26 70 72 65 73 65  ist,flags,&prese
fc20: 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 70  tFlags);.      p
fc30: 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  Start = 0;.     
fc40: 20 70 72 65 73 65 74 46 6c 61 67 73 20 7c 3d 20   presetFlags |= 
fc50: 69 6e 69 74 46 6c 61 67 73 3b 0a 20 20 20 20 20  initFlags;.     
fc60: 20 66 6c 61 67 73 20 3d 20 70 72 65 73 65 74 46   flags = presetF
fc70: 6c 61 67 73 3b 0a 20 20 20 20 20 20 62 72 65 61  lags;.      brea
fc80: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 54 5f  k;..    case TT_
fc90: 4f 74 68 65 72 3a 0a 20 20 20 20 20 20 73 77 69  Other:.      swi
fca0: 74 63 68 28 20 70 4c 69 73 74 2d 3e 7a 54 65 78  tch( pList->zTex
fcb0: 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61  t[0] ){.      ca
fcc0: 73 65 20 27 3b 27 3a 0a 20 20 20 20 20 20 20 20  se ';':.        
fcd0: 6e 45 72 72 20 2b 3d 20 50 72 6f 63 65 73 73 44  nErr += ProcessD
fce0: 65 63 6c 28 70 53 74 61 72 74 2c 70 4c 69 73 74  ecl(pStart,pList
fcf0: 2c 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  ,flags);.       
fd00: 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20   pStart = 0;.   
fd10: 20 20 20 20 20 66 6c 61 67 73 20 3d 20 70 72 65       flags = pre
fd20: 73 65 74 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  setFlags;.      
fd30: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
fd40: 63 61 73 65 20 27 3d 27 3a 0a 20 20 20 20 20 20  case '=':.      
fd50: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 50 72    if( pList->pPr
fd60: 65 76 2d 3e 6e 54 65 78 74 3d 3d 38 20 0a 20 20  ev->nText==8 .  
fd70: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 74 72            && str
fd80: 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 70 50 72 65  ncmp(pList->pPre
fd90: 76 2d 3e 7a 54 65 78 74 2c 22 6f 70 65 72 61 74  v->zText,"operat
fda0: 6f 72 22 2c 38 29 3d 3d 30 20 29 7b 0a 20 20 20  or",8)==0 ){.   
fdb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
fdc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fdd0: 6e 45 72 72 20 2b 3d 20 50 72 6f 63 65 73 73 44  nErr += ProcessD
fde0: 65 63 6c 28 70 53 74 61 72 74 2c 70 4c 69 73 74  ecl(pStart,pList
fdf0: 2c 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  ,flags);.       
fe00: 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20   pStart = 0;.   
fe10: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4c 69 73       while( pLis
fe20: 74 20 26 26 20 70 4c 69 73 74 2d 3e 7a 54 65 78  t && pList->zTex
fe30: 74 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  t[0]!=';' ){.   
fe40: 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70         pList = p
fe50: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
fe60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
fe70: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
fe80: 74 6f 20 65 6e 64 5f 6f 66 5f 6c 6f 6f 70 3b 0a  to end_of_loop;.
fe90: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20          flags = 
fea0: 70 72 65 73 65 74 46 6c 61 67 73 3b 0a 20 20 20  presetFlags;.   
feb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
fec0: 20 20 20 63 61 73 65 20 27 3a 27 3a 0a 20 20 20     case ':':.   
fed0: 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
fee0: 7a 54 65 78 74 5b 31 5d 3d 3d 27 3a 27 20 29 7b  zText[1]==':' ){
fef0: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
ff00: 20 7c 3d 20 50 53 5f 4d 65 74 68 6f 64 3b 0a 20   |= PS_Method;. 
ff10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ff20: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64   break;..      d
ff30: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
ff40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
ff50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
ff60: 20 63 61 73 65 20 54 54 5f 42 72 61 63 65 73 3a   case TT_Braces:
ff70: 0a 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 50  .      nErr += P
ff80: 72 6f 63 65 73 73 50 72 6f 63 65 64 75 72 65 44  rocessProcedureD
ff90: 65 66 28 70 53 74 61 72 74 2c 70 4c 69 73 74 2c  ef(pStart,pList,
ffa0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 70 53  flags);.      pS
ffb0: 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  tart = 0;.      
ffc0: 66 6c 61 67 73 20 3d 20 70 72 65 73 65 74 46 6c  flags = presetFl
ffd0: 61 67 73 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ags;.      break
ffe0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 54 5f 49  ;..    case TT_I
fff0: 64 3a 0a 20 20 20 20 20 20 20 69 66 28 20 70 53  d:.       if( pS
10000 74 61 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tart==0 ){.     
10010 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 4c       pStart = pL
10020 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
10030 6c 61 67 73 20 3d 20 70 72 65 73 65 74 46 6c 61  lags = presetFla
10040 67 73 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  gs;.       }.   
10050 20 20 20 20 72 65 73 65 74 46 6c 61 67 20 3d 20      resetFlag = 
10060 30 3b 0a 20 20 20 20 20 20 20 73 77 69 74 63 68  0;.       switch
10070 28 20 70 4c 69 73 74 2d 3e 7a 54 65 78 74 5b 30  ( pList->zText[0
10080 5d 20 29 7b 0a 20 20 20 20 20 20 20 63 61 73 65  ] ){.       case
10090 20 27 63 27 3a 0a 20 20 20 20 20 20 20 20 20 69   'c':.         i
100a0 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d  f( pList->nText=
100b0 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c  =5 && strncmp(pL
100c0 69 73 74 2d 3e 7a 54 65 78 74 2c 22 63 6c 61 73  ist->zText,"clas
100d0 73 22 2c 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20  s",5)==0 ){.    
100e0 20 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 50         nErr += P
100f0 72 6f 63 65 73 73 54 79 70 65 44 65 63 6c 28 70  rocessTypeDecl(p
10100 4c 69 73 74 2c 66 6c 61 67 73 2c 26 72 65 73 65  List,flags,&rese
10110 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 20 20  tFlag);.        
10120 20 7d 0a 20 20 20 20 20 20 20 20 20 62 72 65 61   }.         brea
10130 6b 3b 0a 0a 20 20 20 20 20 20 20 63 61 73 65 20  k;..       case 
10140 27 45 27 3a 0a 20 20 20 20 20 20 20 20 20 69 66  'E':.         if
10150 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d  ( pList->nText==
10160 36 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69  6 && strncmp(pLi
10170 73 74 2d 3e 7a 54 65 78 74 2c 22 45 58 50 4f 52  st->zText,"EXPOR
10180 54 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  T",6)==0 ){.    
10190 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
101a0 50 53 5f 45 78 70 6f 72 74 32 3b 0a 20 20 20 20  PS_Export2;.    
101b0 20 20 20 20 20 20 20 2f 2a 20 70 53 74 61 72 74         /* pStart
101c0 20 3d 20 30 3b 20 2a 2f 0a 20 20 20 20 20 20 20   = 0; */.       
101d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 62 72 65    }.         bre
101e0 61 6b 3b 0a 0a 20 20 20 20 20 20 20 63 61 73 65  ak;..       case
101f0 20 27 65 27 3a 0a 20 20 20 20 20 20 20 20 20 69   'e':.         i
10200 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d  f( pList->nText=
10210 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c  =4 && strncmp(pL
10220 69 73 74 2d 3e 7a 54 65 78 74 2c 22 65 6e 75 6d  ist->zText,"enum
10230 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",4)==0 ){.     
10240 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
10250 3e 70 4e 65 78 74 20 26 26 20 70 4c 69 73 74 2d  >pNext && pList-
10260 3e 70 4e 65 78 74 2d 3e 65 54 79 70 65 3d 3d 54  >pNext->eType==T
10270 54 5f 42 72 61 63 65 73 20 29 7b 0a 20 20 20 20  T_Braces ){.    
10280 20 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d           pList =
10290 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20   pList->pNext;. 
102a0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
102b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 45  .             nE
102c0 72 72 20 2b 3d 20 50 72 6f 63 65 73 73 54 79 70  rr += ProcessTyp
102d0 65 44 65 63 6c 28 70 4c 69 73 74 2c 66 6c 61 67  eDecl(pList,flag
102e0 73 2c 26 72 65 73 65 74 46 6c 61 67 29 3b 0a 20  s,&resetFlag);. 
102f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10300 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
10310 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 36 20 26  List->nText==6 &
10320 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d  & strncmp(pList-
10330 3e 7a 54 65 78 74 2c 22 65 78 74 65 72 6e 22 2c  >zText,"extern",
10340 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  6)==0 ){.       
10350 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
10360 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
10370 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 26       if( pList &
10380 26 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d  & pList->nText==
10390 33 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69  3 && strncmp(pLi
103a0 73 74 2d 3e 7a 54 65 78 74 2c 22 5c 22 43 5c 22  st->zText,"\"C\"
103b0 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)==0 ){.     
103c0 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20          pList = 
103d0 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
103e0 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73             flags
103f0 20 26 3d 20 7e 44 50 5f 43 70 6c 75 73 70 6c 75   &= ~DP_Cplusplu
10400 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 65  s;.           }e
10410 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
10420 20 20 66 6c 61 67 73 20 7c 3d 20 50 53 5f 45 78    flags |= PS_Ex
10430 74 65 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  tern;.          
10440 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 70 53   }.           pS
10450 74 61 72 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  tart = pList;.  
10460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10470 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
10480 20 63 61 73 65 20 27 69 27 3a 0a 20 20 20 20 20   case 'i':.     
10490 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
104a0 54 65 78 74 3d 3d 36 20 26 26 20 73 74 72 6e 63  Text==6 && strnc
104b0 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c  mp(pList->zText,
104c0 22 69 6e 6c 69 6e 65 22 2c 36 29 3d 3d 30 20 29  "inline",6)==0 )
104d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 6e 45 72  {.           nEr
104e0 72 20 2b 3d 20 50 72 6f 63 65 73 73 49 6e 6c 69  r += ProcessInli
104f0 6e 65 50 72 6f 63 28 70 4c 69 73 74 2c 66 6c 61  neProc(pList,fla
10500 67 73 2c 26 72 65 73 65 74 46 6c 61 67 29 3b 0a  gs,&resetFlag);.
10510 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10520 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
10530 20 20 20 63 61 73 65 20 27 4c 27 3a 0a 20 20 20     case 'L':.   
10540 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
10550 3e 6e 54 65 78 74 3d 3d 35 20 26 26 20 73 74 72  >nText==5 && str
10560 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78  ncmp(pList->zTex
10570 74 2c 22 4c 4f 43 41 4c 22 2c 35 29 3d 3d 30 20  t,"LOCAL",5)==0 
10580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 66 6c  ){.           fl
10590 61 67 73 20 7c 3d 20 50 53 5f 4c 6f 63 61 6c 32  ags |= PS_Local2
105a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74  ;.           pSt
105b0 61 72 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  art = pList;.   
105c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
105d0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
105e0 63 61 73 65 20 27 50 27 3a 0a 20 20 20 20 20 20  case 'P':.      
105f0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 54     if( pList->nT
10600 65 78 74 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d  ext==6 && strncm
10610 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 20  p(pList->zText, 
10620 22 50 55 42 4c 49 43 22 2c 36 29 3d 3d 30 20 29  "PUBLIC",6)==0 )
10630 7b 0a 20 20 20 20 20 20 20 20 20 20 20 66 6c 61  {.           fla
10640 67 73 20 7c 3d 20 50 53 5f 50 75 62 6c 69 63 3b  gs |= PS_Public;
10650 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 61  .           pSta
10660 72 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  rt = pList;.    
10670 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
10680 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 37 20 26  List->nText==7 &
10690 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d  & strncmp(pList-
106a0 3e 7a 54 65 78 74 2c 20 22 50 52 49 56 41 54 45  >zText, "PRIVATE
106b0 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",7)==0 ){.     
106c0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 50        flags |= P
106d0 53 5f 50 72 69 76 61 74 65 3b 0a 20 20 20 20 20  S_Private;.     
106e0 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70        pStart = p
106f0 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 7d  List;.         }
10700 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e  else if( pList->
10710 6e 54 65 78 74 3d 3d 39 20 26 26 20 73 74 72 6e  nText==9 && strn
10720 63 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74  cmp(pList->zText
10730 2c 22 50 52 4f 54 45 43 54 45 44 22 2c 39 29 3d  ,"PROTECTED",9)=
10740 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10750 20 66 6c 61 67 73 20 7c 3d 20 50 53 5f 50 72 6f   flags |= PS_Pro
10760 74 65 63 74 65 64 3b 0a 20 20 20 20 20 20 20 20  tected;.        
10770 20 20 20 70 53 74 61 72 74 20 3d 20 70 4c 69 73     pStart = pLis
10780 74 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20 20  t;.         }.  
10790 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
107a0 20 20 20 20 20 20 63 61 73 65 20 27 73 27 3a 0a        case 's':.
107b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 69           if( pLi
107c0 73 74 2d 3e 6e 54 65 78 74 3d 3d 36 20 26 26 20  st->nText==6 && 
107d0 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 7a  strncmp(pList->z
107e0 54 65 78 74 2c 22 73 74 72 75 63 74 22 2c 36 29  Text,"struct",6)
107f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10800 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 4e 65    if( pList->pNe
10810 78 74 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  xt && pList->pNe
10820 78 74 2d 3e 65 54 79 70 65 3d 3d 54 54 5f 42 72  xt->eType==TT_Br
10830 61 63 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  aces ){.        
10840 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69       pList = pLi
10850 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
10860 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10870 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 20 2b            nErr +
10880 3d 20 50 72 6f 63 65 73 73 54 79 70 65 44 65 63  = ProcessTypeDec
10890 6c 28 70 4c 69 73 74 2c 66 6c 61 67 73 2c 26 72  l(pList,flags,&r
108a0 65 73 65 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  esetFlag);.     
108b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
108c0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74   }else if( pList
108d0 2d 3e 6e 54 65 78 74 3d 3d 36 20 26 26 20 73 74  ->nText==6 && st
108e0 72 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65  rncmp(pList->zTe
108f0 78 74 2c 22 73 74 61 74 69 63 22 2c 36 29 3d 3d  xt,"static",6)==
10900 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
10910 66 6c 61 67 73 20 7c 3d 20 50 53 5f 53 74 61 74  flags |= PS_Stat
10920 69 63 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20  ic;.         }. 
10930 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
10940 20 20 20 20 20 20 20 63 61 73 65 20 27 74 27 3a         case 't':
10950 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  .         if( pL
10960 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 37 20 26 26  ist->nText==7 &&
10970 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d 3e   strncmp(pList->
10980 7a 54 65 78 74 2c 22 74 79 70 65 64 65 66 22 2c  zText,"typedef",
10990 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
109a0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 50 53 5f      flags |= PS_
109b0 54 79 70 65 64 65 66 3b 0a 20 20 20 20 20 20 20  Typedef;.       
109c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 62 72 65    }.         bre
109d0 61 6b 3b 0a 0a 20 20 20 20 20 20 20 63 61 73 65  ak;..       case
109e0 20 27 75 27 3a 0a 20 20 20 20 20 20 20 20 20 69   'u':.         i
109f0 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d  f( pList->nText=
10a00 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c  =5 && strncmp(pL
10a10 69 73 74 2d 3e 7a 54 65 78 74 2c 22 75 6e 69 6f  ist->zText,"unio
10a20 6e 22 2c 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20  n",5)==0 ){.    
10a30 20 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74         if( pList
10a40 2d 3e 70 4e 65 78 74 20 26 26 20 70 4c 69 73 74  ->pNext && pList
10a50 2d 3e 70 4e 65 78 74 2d 3e 65 54 79 70 65 3d 3d  ->pNext->eType==
10a60 54 54 5f 42 72 61 63 65 73 20 29 7b 0a 20 20 20  TT_Braces ){.   
10a70 20 20 20 20 20 20 20 20 20 20 70 4c 69 73 74 20            pList 
10a80 3d 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  = pList->pNext;.
10a90 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
10aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  {.             n
10ab0 45 72 72 20 2b 3d 20 50 72 6f 63 65 73 73 54 79  Err += ProcessTy
10ac0 70 65 44 65 63 6c 28 70 4c 69 73 74 2c 66 6c 61  peDecl(pList,fla
10ad0 67 73 2c 26 72 65 73 65 74 46 6c 61 67 29 3b 0a  gs,&resetFlag);.
10ae0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
10af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10b00 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
10b10 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
10b20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10b30 7d 0a 20 20 20 20 20 20 20 69 66 28 20 72 65 73  }.       if( res
10b40 65 74 46 6c 61 67 21 3d 30 20 29 7b 0a 20 20 20  etFlag!=0 ){.   
10b50 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4c 69        while( pLi
10b60 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 7a 54 65  st && pList->zTe
10b70 78 74 5b 30 5d 21 3d 72 65 73 65 74 46 6c 61 67  xt[0]!=resetFlag
10b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70   ){.           p
10b90 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 4e  List = pList->pN
10ba0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a  ext;.         }.
10bb0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 69           if( pLi
10bc0 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64  st==0 ) goto end
10bd0 5f 6f 66 5f 6c 6f 6f 70 3b 0a 20 20 20 20 20 20  _of_loop;.      
10be0 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20     pStart = 0;. 
10bf0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20          flags = 
10c00 70 72 65 73 65 74 46 6c 61 67 73 3b 0a 20 20 20  presetFlags;.   
10c10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 62 72 65      }.       bre
10c20 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 54  ak;..    case TT
10c30 5f 53 74 72 69 6e 67 3a 0a 20 20 20 20 63 61 73  _String:.    cas
10c40 65 20 54 54 5f 4e 75 6d 62 65 72 3a 0a 20 20 20  e TT_Number:.   
10c50 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
10c60 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
10c70 70 53 74 61 72 74 20 3d 20 70 4c 69 73 74 3b 0a  pStart = pList;.
10c80 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 70         flags = p
10c90 72 65 73 65 74 46 6c 61 67 73 3b 0a 20 20 20 20  resetFlags;.    
10ca0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10cb0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
10cc0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  t->pNext;.  }.  
10cd0 65 6e 64 5f 6f 66 5f 6c 6f 6f 70 3a 0a 0a 20 20  end_of_loop:..  
10ce0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61  /* Verify that a
10cf0 6c 6c 20 23 69 66 73 20 68 61 76 65 20 61 20 6d  ll #ifs have a m
10d00 61 74 63 68 69 6e 67 20 22 23 65 6e 64 69 66 22  atching "#endif"
10d10 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 66 53   */.  while( ifS
10d20 74 61 63 6b 20 29 7b 0a 20 20 20 20 49 66 6d 61  tack ){.    Ifma
10d30 63 72 6f 20 2a 70 49 66 20 3d 20 69 66 53 74 61  cro *pIf = ifSta
10d40 63 6b 3b 0a 20 20 20 20 69 66 53 74 61 63 6b 20  ck;.    ifStack 
10d50 3d 20 70 49 66 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pIf->pNext;.  
10d60 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
10d70 2c 22 25 73 3a 25 64 3a 20 54 68 69 73 20 27 23  ,"%s:%d: This '#
10d80 69 66 27 20 68 61 73 20 6e 6f 20 27 23 65 6e 64  if' has no '#end
10d90 69 66 27 5c 6e 22 2c 7a 46 69 6c 65 6e 61 6d 65  if'\n",zFilename
10da0 2c 0a 20 20 20 20 20 20 70 49 66 2d 3e 6e 4c 69  ,.      pIf->nLi
10db0 6e 65 29 3b 0a 20 20 20 20 53 61 66 65 46 72 65  ne);.    SafeFre
10dc0 65 28 70 49 66 29 3b 0a 20 20 7d 0a 0a 20 20 72  e(pIf);.  }..  r
10dd0 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f  eturn nErr;.}../
10de0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 67 69 76 65  *.** If the give
10df0 6e 20 44 65 63 6c 20 6f 62 6a 65 63 74 20 68 61  n Decl object ha
10e00 73 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 7a 45 78  s a non-null zEx
10e10 74 72 61 20 66 69 65 6c 64 2c 20 74 68 65 6e 20  tra field, then 
10e20 74 68 65 20 74 65 78 74 0a 2a 2a 20 6f 66 20 74  the text.** of t
10e30 68 61 74 20 7a 45 78 74 72 61 20 66 69 65 6c 64  hat zExtra field
10e40 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 73   needs to be ins
10e50 65 72 74 65 64 20 69 6e 20 74 68 65 20 6d 69 64  erted in the mid
10e60 64 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20 7a 44  dle of the.** zD
10e70 65 63 6c 20 66 69 65 6c 64 20 62 65 66 6f 72 65  ecl field before
10e80 20 74 68 65 20 6c 61 73 74 20 22 7d 22 20 69 6e   the last "}" in
10e90 20 74 68 65 20 7a 44 65 63 6c 2e 20 20 54 68 69   the zDecl.  Thi
10ea0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
10eb0 68 61 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 7a  hat..** If the z
10ec0 45 78 74 72 61 20 69 73 20 4e 55 4c 4c 2c 20 74  Extra is NULL, t
10ed0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
10ee0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 7a 45   no-op..**.** zE
10ef0 78 74 72 61 20 68 6f 6c 64 73 20 65 78 74 72 61  xtra holds extra
10f00 20 6d 65 74 68 6f 64 20 64 65 63 6c 61 72 61 74   method declarat
10f10 69 6f 6e 73 20 66 6f 72 20 63 6c 61 73 73 65 73  ions for classes
10f20 2e 20 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  .  The declarati
10f30 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74 6f 20 62  ons.** have to b
10f40 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
10f50 74 68 65 20 63 6c 61 73 73 20 64 65 66 69 6e 69  the class defini
10f60 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
10f70 76 6f 69 64 20 49 6e 73 65 72 74 45 78 74 72 61  void InsertExtra
10f80 44 65 63 6c 28 44 65 63 6c 20 2a 70 44 65 63 6c  Decl(Decl *pDecl
10f90 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 74  ){.  int i;.  St
10fa0 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 69 66 28  ring str;..  if(
10fb0 20 70 44 65 63 6c 3d 3d 30 20 7c 7c 20 70 44 65   pDecl==0 || pDe
10fc0 63 6c 2d 3e 7a 45 78 74 72 61 3d 3d 30 20 7c 7c  cl->zExtra==0 ||
10fd0 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 3d 3d 30   pDecl->zDecl==0
10fe0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
10ff0 20 73 74 72 6c 65 6e 28 70 44 65 63 6c 2d 3e 7a   strlen(pDecl->z
11000 44 65 63 6c 29 20 2d 20 31 3b 0a 20 20 77 68 69  Decl) - 1;.  whi
11010 6c 65 28 20 69 3e 30 20 26 26 20 70 44 65 63 6c  le( i>0 && pDecl
11020 2d 3e 7a 44 65 63 6c 5b 69 5d 21 3d 27 7d 27 20  ->zDecl[i]!='}' 
11030 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 53 74 72 69  ){ i--; }.  Stri
11040 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
11050 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74  StringAppend(&st
11060 72 2c 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 2c  r, pDecl->zDecl,
11070 20 69 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70   i);.  StringApp
11080 65 6e 64 28 26 73 74 72 2c 20 70 44 65 63 6c 2d  end(&str, pDecl-
11090 3e 7a 45 78 74 72 61 2c 20 30 29 3b 0a 20 20 53  >zExtra, 0);.  S
110a0 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72  tringAppend(&str
110b0 2c 20 26 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 5b  , &pDecl->zDecl[
110c0 69 5d 2c 20 30 29 3b 0a 20 20 53 61 66 65 46 72  i], 0);.  SafeFr
110d0 65 65 28 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 29  ee(pDecl->zDecl)
110e0 3b 0a 20 20 53 61 66 65 46 72 65 65 28 70 44 65  ;.  SafeFree(pDe
110f0 63 6c 2d 3e 7a 45 78 74 72 61 29 3b 0a 20 20 70  cl->zExtra);.  p
11100 44 65 63 6c 2d 3e 7a 44 65 63 6c 20 3d 20 53 74  Decl->zDecl = St
11110 72 44 75 70 28 53 74 72 69 6e 67 47 65 74 28 26  rDup(StringGet(&
11120 73 74 72 29 2c 20 30 29 3b 0a 20 20 53 74 72 69  str), 0);.  Stri
11130 6e 67 52 65 73 65 74 28 26 73 74 72 29 3b 0a 20  ngReset(&str);. 
11140 20 70 44 65 63 6c 2d 3e 7a 45 78 74 72 61 20 3d   pDecl->zExtra =
11150 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73   0;.}../*.** Res
11160 65 74 20 74 68 65 20 44 50 5f 46 6f 72 77 61 72  et the DP_Forwar
11170 64 20 61 6e 64 20 44 50 5f 44 65 63 6c 61 72 65  d and DP_Declare
11180 64 20 66 6c 61 67 73 20 6f 6e 20 61 6c 6c 20 44  d flags on all D
11190 65 63 6c 20 73 74 72 75 63 74 75 72 65 73 2e 0a  ecl structures..
111a0 2a 2a 20 53 65 74 20 62 6f 74 68 20 66 6c 61 67  ** Set both flag
111b0 73 20 66 6f 72 20 61 6e 79 74 68 69 6e 67 20 74  s for anything t
111c0 68 61 74 20 69 73 20 74 61 67 67 65 64 20 61 73  hat is tagged as
111d0 20 6c 6f 63 61 6c 20 61 6e 64 20 69 73 6e 27 74   local and isn't
111e0 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65   .** in the file
111f0 20 7a 46 69 6c 65 6e 61 6d 65 20 73 6f 20 74 68   zFilename so th
11200 61 74 20 69 74 20 77 6f 6e 27 74 20 62 65 20 70  at it won't be p
11210 72 69 6e 74 69 6e 67 20 69 6e 20 6f 74 68 65 72  rinting in other
11220 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   files..*/.stati
11230 63 20 76 6f 69 64 20 52 65 73 65 74 44 65 63 6c  c void ResetDecl
11240 46 6c 61 67 73 28 63 68 61 72 20 2a 7a 46 69 6c  Flags(char *zFil
11250 65 6e 61 6d 65 29 7b 0a 20 20 44 65 63 6c 20 2a  ename){.  Decl *
11260 70 44 65 63 6c 3b 0a 0a 20 20 66 6f 72 28 70 44  pDecl;..  for(pD
11270 65 63 6c 20 3d 20 70 44 65 63 6c 46 69 72 73 74  ecl = pDeclFirst
11280 3b 20 70 44 65 63 6c 3b 20 70 44 65 63 6c 20 3d  ; pDecl; pDecl =
11290 20 70 44 65 63 6c 2d 3e 70 4e 65 78 74 29 7b 0a   pDecl->pNext){.
112a0 20 20 20 20 44 65 63 6c 43 6c 65 61 72 50 72 6f      DeclClearPro
112b0 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 46  perty(pDecl,DP_F
112c0 6f 72 77 61 72 64 7c 44 50 5f 44 65 63 6c 61 72  orward|DP_Declar
112d0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 44 65 63  ed);.    if( Dec
112e0 6c 48 61 73 50 72 6f 70 65 72 74 79 28 70 44 65  lHasProperty(pDe
112f0 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29 20 26 26 20  cl,DP_Local) && 
11300 70 44 65 63 6c 2d 3e 7a 46 69 6c 65 21 3d 7a 46  pDecl->zFile!=zF
11310 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ilename ){.     
11320 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79   DeclSetProperty
11330 28 70 44 65 63 6c 2c 44 50 5f 46 6f 72 77 61 72  (pDecl,DP_Forwar
11340 64 7c 44 50 5f 44 65 63 6c 61 72 65 64 29 3b 0a  d|DP_Declared);.
11350 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
11360 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
11370 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 63  ration of the Sc
11380 61 6e 54 65 78 74 28 29 20 66 75 6e 63 74 69 6f  anText() functio
11390 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
113a0 64 20 53 63 61 6e 54 65 78 74 28 63 6f 6e 73 74  d ScanText(const
113b0 20 63 68 61 72 2a 2c 20 47 65 6e 53 74 61 74 65   char*, GenState
113c0 20 2a 70 53 74 61 74 65 29 3b 0a 0a 2f 2a 0a 2a   *pState);../*.*
113d0 2a 20 54 68 65 20 6f 75 74 70 75 74 20 69 6e 20  * The output in 
113e0 70 53 74 72 20 69 73 20 63 75 72 72 65 6e 74 6c  pStr is currentl
113f0 79 20 77 69 74 68 69 6e 20 61 6e 20 23 69 66 20  y within an #if 
11400 43 4f 4e 54 45 58 54 20 77 68 65 72 65 20 63 6f  CONTEXT where co
11410 6e 74 65 78 74 0a 2a 2a 20 69 73 20 65 71 75 61  ntext.** is equa
11420 6c 20 74 6f 20 2a 70 7a 49 66 2e 20 20 28 2a 70  l to *pzIf.  (*p
11430 7a 49 66 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  zIf might be NUL
11440 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  L to indicate th
11450 61 74 20 77 65 20 61 72 65 0a 2a 2a 20 6e 6f 74  at we are.** not
11460 20 77 69 74 68 69 6e 20 61 6e 79 20 23 69 66 20   within any #if 
11470 61 74 20 74 68 65 20 6d 6f 6d 65 6e 74 2e 29 20  at the moment.) 
11480 20 57 65 20 61 72 65 20 67 65 74 74 69 6e 67 20   We are getting 
11490 72 65 61 64 79 20 74 6f 20 6f 75 74 70 75 74 0a  ready to output.
114a0 2a 2a 20 73 6f 6d 65 20 74 65 78 74 20 74 68 61  ** some text tha
114b0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 69  t needs to be wi
114c0 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  thin the context
114d0 20 6f 66 20 22 23 69 66 20 4e 45 57 22 20 77 68   of "#if NEW" wh
114e0 65 72 65 0a 2a 2a 20 4e 45 57 20 69 73 20 7a 49  ere.** NEW is zI
114f0 66 2e 20 20 4d 61 6b 65 20 61 6e 20 61 70 70 72  f.  Make an appr
11500 6f 70 72 69 61 74 65 20 63 68 61 6e 67 65 20 74  opriate change t
11510 6f 20 74 68 65 20 63 6f 6e 74 65 78 74 2e 0a 2a  o the context..*
11520 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 68  /.static void Ch
11530 61 6e 67 65 49 66 43 6f 6e 74 65 78 74 28 0a 20  angeIfContext(. 
11540 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 66   const char *zIf
11550 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ,       /* The d
11560 65 73 69 72 65 64 20 23 69 66 20 63 6f 6e 74 65  esired #if conte
11570 78 74 20 2a 2f 0a 20 20 47 65 6e 53 74 61 74 65  xt */.  GenState
11580 20 2a 70 53 74 61 74 65 20 20 20 20 20 20 20 2f   *pState       /
11590 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 20  * Current state 
115a0 6f 66 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  of the code gene
115b0 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  rator */.){.  if
115c0 28 20 7a 49 66 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zIf==0 ){.    
115d0 69 66 28 20 70 53 74 61 74 65 2d 3e 7a 49 66 3d  if( pState->zIf=
115e0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
115f0 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53   StringAppend(pS
11600 74 61 74 65 2d 3e 70 53 74 72 2c 22 23 65 6e 64  tate->pStr,"#end
11610 69 66 5c 6e 22 2c 30 29 3b 0a 20 20 20 20 70 53  if\n",0);.    pS
11620 74 61 74 65 2d 3e 7a 49 66 20 3d 20 30 3b 0a 20  tate->zIf = 0;. 
11630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
11640 70 53 74 61 74 65 2d 3e 7a 49 66 20 29 7b 0a 20  pState->zIf ){. 
11650 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
11660 7a 49 66 2c 70 53 74 61 74 65 2d 3e 7a 49 66 29  zIf,pState->zIf)
11670 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
11680 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64      StringAppend
11690 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c 22 23  (pState->pStr,"#
116a0 65 6e 64 69 66 5c 6e 22 2c 30 29 3b 0a 20 20 20  endif\n",0);.   
116b0 20 20 20 70 53 74 61 74 65 2d 3e 7a 49 66 20 3d     pState->zIf =
116c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 63   0;.    }.    Sc
116d0 61 6e 54 65 78 74 28 7a 49 66 2c 20 70 53 74 61  anText(zIf, pSta
116e0 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  te);.    if( pSt
116f0 61 74 65 2d 3e 7a 49 66 21 3d 30 20 29 7b 0a 20  ate->zIf!=0 ){. 
11700 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e       StringAppen
11710 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c 22  d(pState->pStr,"
11720 23 65 6e 64 69 66 5c 6e 22 2c 30 29 3b 0a 20 20  #endif\n",0);.  
11730 20 20 7d 0a 20 20 20 20 53 74 72 69 6e 67 41 70    }.    StringAp
11740 70 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74  pend(pState->pSt
11750 72 2c 22 23 69 66 20 22 2c 30 29 3b 0a 20 20 20  r,"#if ",0);.   
11760 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53   StringAppend(pS
11770 74 61 74 65 2d 3e 70 53 74 72 2c 7a 49 66 2c 30  tate->pStr,zIf,0
11780 29 3b 0a 20 20 20 20 53 74 72 69 6e 67 41 70 70  );.    StringApp
11790 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72  end(pState->pStr
117a0 2c 22 5c 6e 22 2c 30 29 3b 0a 20 20 20 20 70 53  ,"\n",0);.    pS
117b0 74 61 74 65 2d 3e 7a 49 66 20 3d 20 7a 49 66 3b  tate->zIf = zIf;
117c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
117d0 64 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67 20  d to the string 
117e0 70 53 74 72 20 61 20 23 69 6e 63 6c 75 64 65 20  pStr a #include 
117f0 6f 66 20 65 76 65 72 79 20 66 69 6c 65 20 6f 6e  of every file on
11800 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 2a 2a 20   the list of.** 
11810 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20 70 49  include files pI
11820 6e 63 6c 75 64 65 2e 20 20 54 68 65 20 74 61 62  nclude.  The tab
11830 6c 65 20 70 54 61 62 6c 65 20 63 6f 6e 74 61 69  le pTable contai
11840 6e 73 20 61 6c 6c 20 66 69 6c 65 73 20 74 68 61  ns all files tha
11850 74 0a 2a 2a 20 68 61 76 65 20 61 6c 72 65 61 64  t.** have alread
11860 79 20 62 65 65 6e 20 23 69 6e 63 6c 75 64 65 64  y been #included
11870 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
11880 20 44 6f 6e 27 74 20 61 64 64 20 61 6e 79 0a 2a   Don't add any.*
11890 2a 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 55  * duplicates.  U
118a0 70 64 61 74 65 20 70 54 61 62 6c 65 20 77 69 74  pdate pTable wit
118b0 68 20 65 76 65 72 79 20 6e 65 77 20 23 69 6e 63  h every new #inc
118c0 6c 75 64 65 20 74 68 61 74 20 69 73 20 61 64 64  lude that is add
118d0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
118e0 69 64 20 41 64 64 49 6e 63 6c 75 64 65 73 28 0a  id AddIncludes(.
118f0 20 20 49 6e 63 6c 75 64 65 20 2a 70 49 6e 63 6c    Include *pIncl
11900 75 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 57 72  ude,       /* Wr
11910 69 74 65 20 65 76 65 72 79 20 23 69 6e 63 6c 75  ite every #inclu
11920 64 65 20 6f 6e 20 74 68 69 73 20 6c 69 73 74 20  de on this list 
11930 2a 2f 0a 20 20 47 65 6e 53 74 61 74 65 20 2a 70  */.  GenState *p
11940 53 74 61 74 65 20 20 20 20 20 20 20 20 20 2f 2a  State         /*
11950 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   Current state o
11960 66 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  f the code gener
11970 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ator */.){.  if(
11980 20 70 49 6e 63 6c 75 64 65 20 29 7b 0a 20 20 20   pInclude ){.   
11990 20 69 66 28 20 70 49 6e 63 6c 75 64 65 2d 3e 70   if( pInclude->p
119a0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 41 64  Next ){.      Ad
119b0 64 49 6e 63 6c 75 64 65 73 28 70 49 6e 63 6c 75  dIncludes(pInclu
119c0 64 65 2d 3e 70 4e 65 78 74 2c 70 53 74 61 74 65  de->pNext,pState
119d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
119e0 20 49 64 65 6e 74 54 61 62 6c 65 49 6e 73 65 72   IdentTableInser
119f0 74 28 70 53 74 61 74 65 2d 3e 70 54 61 62 6c 65  t(pState->pTable
11a00 2c 70 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61 62 65  ,pInclude->zLabe
11a10 6c 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 43 68  l,0) ){.      Ch
11a20 61 6e 67 65 49 66 43 6f 6e 74 65 78 74 28 70 49  angeIfContext(pI
11a30 6e 63 6c 75 64 65 2d 3e 7a 49 66 2c 70 53 74 61  nclude->zIf,pSta
11a40 74 65 29 3b 0a 20 20 20 20 20 20 53 74 72 69 6e  te);.      Strin
11a50 67 41 70 70 65 6e 64 28 70 53 74 61 74 65 2d 3e  gAppend(pState->
11a60 70 53 74 72 2c 22 23 69 6e 63 6c 75 64 65 20 22  pStr,"#include "
11a70 2c 30 29 3b 0a 20 20 20 20 20 20 53 74 72 69 6e  ,0);.      Strin
11a80 67 41 70 70 65 6e 64 28 70 53 74 61 74 65 2d 3e  gAppend(pState->
11a90 70 53 74 72 2c 70 49 6e 63 6c 75 64 65 2d 3e 7a  pStr,pInclude->z
11aa0 46 69 6c 65 2c 30 29 3b 0a 20 20 20 20 20 20 53  File,0);.      S
11ab0 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61  tringAppend(pSta
11ac0 74 65 2d 3e 70 53 74 72 2c 22 5c 6e 22 2c 31 29  te->pStr,"\n",1)
11ad0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11ae0 2a 0a 2a 2a 20 41 64 64 20 74 6f 20 74 68 65 20  *.** Add to the 
11af0 73 74 72 69 6e 67 20 70 53 74 72 20 61 20 64 65  string pStr a de
11b00 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20 74 68  claration for th
11b10 65 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62  e object describ
11b20 65 64 0a 2a 2a 20 69 6e 20 70 44 65 63 6c 2e 0a  ed.** in pDecl..
11b30 2a 2a 0a 2a 2a 20 49 66 20 70 44 65 63 6c 20 68  **.** If pDecl h
11b40 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
11b50 64 65 63 6c 61 72 65 64 20 69 6e 20 74 68 69 73  declared in this
11b60 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
11b70 61 74 0a 2a 2a 20 66 61 63 74 20 61 6e 64 20 61  at.** fact and a
11b80 62 6f 72 74 20 65 61 72 6c 79 2e 20 20 44 6f 20  bort early.  Do 
11b90 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 20 61 20  not duplicate a 
11ba0 64 65 63 6c 61 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  declaration..**.
11bb0 2a 2a 20 49 66 20 74 68 65 20 6e 65 65 64 46 75  ** If the needFu
11bc0 6c 6c 44 65 63 6c 20 66 6c 61 67 20 69 73 20 66  llDecl flag is f
11bd0 61 6c 73 65 20 61 6e 64 20 74 68 69 73 20 6f 62  alse and this ob
11be0 6a 65 63 74 20 68 61 73 20 61 20 66 6f 72 77 61  ject has a forwa
11bf0 72 64 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  rd.** declaratio
11c00 6e 2c 20 74 68 65 6e 20 73 75 70 70 6c 79 20 74  n, then supply t
11c10 68 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61  he forward decla
11c20 72 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 41 20  ration only.  A 
11c30 6c 61 74 65 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  later.** call to
11c40 20 43 6f 6d 70 6c 65 74 65 46 6f 72 77 61 72 64   CompleteForward
11c50 44 65 63 6c 61 72 61 74 69 6f 6e 73 28 29 20 77  Declarations() w
11c60 69 6c 6c 20 66 69 6e 69 73 68 20 74 68 65 20 64  ill finish the d
11c70 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 66 6f  eclaration.** fo
11c80 72 20 75 73 2e 20 20 42 75 74 20 69 66 20 6e 65  r us.  But if ne
11c90 65 64 46 75 6c 6c 44 65 63 6c 20 69 73 20 74 72  edFullDecl is tr
11ca0 75 65 2c 20 77 65 20 6d 75 73 74 20 73 75 70 70  ue, we must supp
11cb0 6c 79 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 64  ly the full.** d
11cc0 65 63 6c 61 72 61 74 69 6f 6e 20 6e 6f 77 2e 20  eclaration now. 
11cd0 20 53 6f 6d 65 20 6f 62 6a 65 63 74 73 20 64 6f   Some objects do
11ce0 20 6e 6f 74 20 68 61 76 65 20 61 20 66 6f 72 77   not have a forw
11cf0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e  ard declaration.
11d00 0a 2a 2a 20 46 6f 72 20 74 68 6f 73 65 20 6f 62  .** For those ob
11d10 6a 65 63 74 73 2c 20 77 65 20 6d 75 73 74 20 70  jects, we must p
11d20 72 69 6e 74 20 74 68 65 20 66 75 6c 6c 20 64 65  rint the full de
11d30 63 6c 61 72 61 74 69 6f 6e 20 6e 6f 77 2e 0a 2a  claration now..*
11d40 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 69 74 20  *.** Because it 
11d50 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64 75  is illegal to du
11d60 70 6c 69 63 61 74 65 20 61 20 74 79 70 65 64 65  plicate a typede
11d70 66 20 69 6e 20 43 2c 20 63 61 72 65 20 69 73 20  f in C, care is 
11d80 74 61 6b 65 6e 0a 2a 2a 20 74 6f 20 69 6e 73 75  taken.** to insu
11d90 72 65 20 74 68 61 74 20 74 79 70 65 64 65 66 73  re that typedefs
11da0 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 69 64   for the same id
11db0 65 6e 74 69 66 69 65 72 20 61 72 65 20 6f 6e 6c  entifier are onl
11dc0 79 20 69 73 73 75 65 64 20 6f 6e 63 65 2e 0a 2a  y issued once..*
11dd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 65  /.static void De
11de0 63 6c 61 72 65 4f 62 6a 65 63 74 28 0a 20 20 44  clareObject(.  D
11df0 65 63 6c 20 2a 70 44 65 63 6c 2c 20 20 20 20 20  ecl *pDecl,     
11e00 20 20 20 2f 2a 20 54 68 65 20 74 68 69 6e 67 20     /* The thing 
11e10 74 6f 20 62 65 20 64 65 63 6c 61 72 65 64 20 2a  to be declared *
11e20 2f 0a 20 20 47 65 6e 53 74 61 74 65 20 2a 70 53  /.  GenState *pS
11e30 74 61 74 65 2c 20 20 20 2f 2a 20 43 75 72 72 65  tate,   /* Curre
11e40 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
11e50 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 2a  code generator *
11e60 2f 0a 20 20 69 6e 74 20 6e 65 65 64 46 75 6c 6c  /.  int needFull
11e70 44 65 63 6c 20 20 20 20 2f 2a 20 4d 75 73 74 20  Decl    /* Must 
11e80 68 61 76 65 20 74 68 65 20 66 75 6c 6c 20 64 65  have the full de
11e90 63 6c 61 72 61 74 69 6f 6e 2e 20 20 41 20 66 6f  claration.  A fo
11ea0 72 77 61 72 64 0a 20 20 20 20 20 20 20 20 20 20  rward.          
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 64               * d
11ec0 65 63 6c 61 72 61 74 69 6f 6e 20 69 73 6e 27 74  eclaration isn't
11ed0 20 65 6e 6f 75 67 68 20 2a 2f 0a 29 7b 0a 20 20   enough */.){.  
11ee0 44 65 63 6c 20 2a 70 3b 20 20 20 20 20 20 20 20  Decl *p;        
11ef0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 62         /* The ob
11f00 6a 65 63 74 20 74 6f 20 62 65 20 64 65 63 6c 61  ject to be decla
11f10 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  red */.  int fla
11f20 67 3b 0a 20 20 69 6e 74 20 69 73 43 70 70 3b 20  g;.  int isCpp; 
11f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11f40 72 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e  rue if generatin
11f50 67 20 43 2b 2b 20 2a 2f 0a 20 20 69 6e 74 20 64  g C++ */.  int d
11f60 6f 6e 65 54 79 70 65 64 65 66 20 3d 20 30 3b 20  oneTypedef = 0; 
11f70 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74    /* True if a t
11f80 79 70 65 64 65 66 20 68 61 73 20 62 65 65 6e 20  ypedef has been 
11f90 64 6f 6e 65 20 66 6f 72 20 74 68 69 73 20 6f 62  done for this ob
11fa0 6a 65 63 74 20 2a 2f 0a 0a 20 20 2f 2a 20 70 72  ject */..  /* pr
11fb0 69 6e 74 66 28 22 42 45 47 49 4e 20 25 73 20 6f  intf("BEGIN %s o
11fc0 66 20 25 73 5c 6e 22 2c 6e 65 65 64 46 75 6c 6c  f %s\n",needFull
11fd0 44 65 63 6c 3f 22 46 55 4c 4c 22 3a 22 50 52 4f  Decl?"FULL":"PRO
11fe0 54 4f 54 59 50 45 22 2c 70 44 65 63 6c 2d 3e 7a  TOTYPE",pDecl->z
11ff0 4e 61 6d 65 29 3b 2a 2f 0a 20 20 2f 2a 20 0a 20  Name);*/.  /* . 
12000 20 2a 2a 20 46 6f 72 20 61 6e 79 20 6f 62 6a 65   ** For any obje
12010 63 74 20 74 68 61 74 20 68 61 73 20 61 20 66 6f  ct that has a fo
12020 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
12030 6e 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  n, go ahead and 
12040 64 6f 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 77  do the.  ** forw
12050 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
12060 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 73  first..  */.  is
12070 43 70 70 20 3d 20 28 70 53 74 61 74 65 2d 3e 66  Cpp = (pState->f
12080 6c 61 67 73 20 26 20 44 50 5f 43 70 6c 75 73 70  lags & DP_Cplusp
12090 6c 75 73 29 20 21 3d 20 30 3b 0a 20 20 66 6f 72  lus) != 0;.  for
120a0 28 70 3d 70 44 65 63 6c 3b 20 70 3b 20 70 3d 70  (p=pDecl; p; p=p
120b0 2d 3e 70 53 61 6d 65 4e 61 6d 65 29 7b 0a 20 20  ->pSameName){.  
120c0 20 20 69 66 28 20 70 2d 3e 7a 46 77 64 20 29 7b    if( p->zFwd ){
120d0 0a 20 20 20 20 20 20 69 66 28 20 21 44 65 63 6c  .      if( !Decl
120e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 44 50  HasProperty(p,DP
120f0 5f 46 6f 72 77 61 72 64 29 20 29 7b 0a 20 20 20  _Forward) ){.   
12100 20 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70       DeclSetProp
12110 65 72 74 79 28 70 2c 44 50 5f 46 6f 72 77 61 72  erty(p,DP_Forwar
12120 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  d);.        if( 
12130 73 74 72 6e 63 6d 70 28 70 2d 3e 7a 46 77 64 2c  strncmp(p->zFwd,
12140 22 74 79 70 65 64 65 66 22 2c 37 29 3d 3d 30 20  "typedef",7)==0 
12150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
12160 20 64 6f 6e 65 54 79 70 65 64 65 66 20 29 20 63   doneTypedef ) c
12170 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12180 20 20 20 64 6f 6e 65 54 79 70 65 64 65 66 20 3d     doneTypedef =
12190 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
121a0 20 20 20 20 20 20 43 68 61 6e 67 65 49 66 43 6f        ChangeIfCo
121b0 6e 74 65 78 74 28 70 2d 3e 7a 49 66 2c 70 53 74  ntext(p->zIf,pSt
121c0 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20 53 74  ate);.        St
121d0 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61 74  ringAppend(pStat
121e0 65 2d 3e 70 53 74 72 2c 69 73 43 70 70 20 3f 20  e->pStr,isCpp ? 
121f0 70 2d 3e 7a 46 77 64 43 70 70 20 3a 20 70 2d 3e  p->zFwdCpp : p->
12200 7a 46 77 64 2c 30 29 3b 0a 20 20 20 20 20 20 7d  zFwd,0);.      }
12210 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12220 0a 20 20 2a 2a 20 45 61 72 6c 79 20 6f 75 74 20  .  ** Early out 
12230 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
12240 20 61 6c 72 65 61 64 79 20 73 75 69 74 61 62 6c   already suitabl
12250 79 20 64 65 63 6c 61 72 65 64 2e 0a 20 20 2a 2a  y declared..  **
12260 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20  .  ** This is a 
12270 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 73  very important s
12280 74 65 70 20 62 65 63 61 75 73 65 20 69 74 20 70  tep because it p
12290 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 0a  revents us from.
122a0 20 20 2a 2a 20 65 78 65 63 75 74 69 6e 67 20 74    ** executing t
122b0 68 65 20 63 6f 64 65 20 74 68 65 20 66 6f 6c 6c  he code the foll
122c0 6f 77 73 20 69 6e 20 61 20 72 65 63 75 72 73 69  ows in a recursi
122d0 76 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a  ve call to this.
122e0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 69    ** function wi
122f0 74 68 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  th the same valu
12300 65 20 66 6f 72 20 70 44 65 63 6c 2e 0a 20 20 2a  e for pDecl..  *
12310 2f 0a 20 20 66 6c 61 67 20 3d 20 6e 65 65 64 46  /.  flag = needF
12320 75 6c 6c 44 65 63 6c 20 3f 20 44 50 5f 44 65 63  ullDecl ? DP_Dec
12330 6c 61 72 65 64 7c 44 50 5f 46 6f 72 77 61 72 64  lared|DP_Forward
12340 20 3a 20 44 50 5f 46 6f 72 77 61 72 64 3b 0a 20   : DP_Forward;. 
12350 20 66 6f 72 28 70 3d 70 44 65 63 6c 3b 20 70 3b   for(p=pDecl; p;
12360 20 70 3d 70 2d 3e 70 53 61 6d 65 4e 61 6d 65 29   p=p->pSameName)
12370 7b 0a 20 20 20 20 69 66 28 20 21 44 65 63 6c 48  {.    if( !DeclH
12380 61 73 50 72 6f 70 65 72 74 79 28 70 2c 66 6c 61  asProperty(p,fla
12390 67 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  g) ) break;.  }.
123a0 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
123b0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
123c0 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 73 75   /*.  ** Make su
123d0 72 65 20 77 65 20 68 61 76 65 20 61 6c 6c 20 6e  re we have all n
123e0 65 63 65 73 73 61 72 79 20 23 69 6e 63 6c 75 64  ecessary #includ
123f0 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 3d  es.  */.  for(p=
12400 70 44 65 63 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  pDecl; p; p=p->p
12410 53 61 6d 65 4e 61 6d 65 29 7b 0a 20 20 20 20 41  SameName){.    A
12420 64 64 49 6e 63 6c 75 64 65 73 28 70 2d 3e 70 49  ddIncludes(p->pI
12430 6e 63 6c 75 64 65 2c 70 53 74 61 74 65 29 3b 0a  nclude,pState);.
12440 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 47    }..  /*.  ** G
12450 6f 20 61 68 65 61 64 20 61 6e 20 6d 61 72 6b 20  o ahead an mark 
12460 65 76 65 72 79 74 68 69 6e 67 20 61 73 20 62 65  everything as be
12470 69 6e 67 20 64 65 63 6c 61 72 65 64 2c 20 74 6f  ing declared, to
12480 20 70 72 65 76 65 6e 74 20 61 6e 0a 20 20 2a 2a   prevent an.  **
12490 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 20 74   infinite loop t
124a0 68 72 75 20 74 68 65 20 53 63 61 6e 54 65 78 74  hru the ScanText
124b0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 74  () function.  At
124c0 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 0a   the same time,.
124d0 20 20 2a 2a 20 77 65 20 64 65 63 69 64 65 20 77    ** we decide w
124e0 68 69 63 68 20 6f 62 6a 65 63 74 73 20 6e 65 65  hich objects nee
124f0 64 20 61 20 66 75 6c 6c 20 64 65 63 6c 61 72 61  d a full declara
12500 74 69 6f 6e 20 61 6e 64 20 6d 61 72 6b 20 74 68  tion and mark th
12510 65 6d 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  em.  ** with the
12520 20 44 50 5f 46 6c 61 67 20 62 69 74 2e 20 20 57   DP_Flag bit.  W
12530 65 20 61 72 65 20 6f 6e 6c 79 20 61 62 6c 65 20  e are only able 
12540 74 6f 20 75 73 65 20 44 50 5f 46 6c 61 67 20 69  to use DP_Flag i
12550 6e 20 74 68 69 73 0a 20 20 2a 2a 20 77 61 79 20  n this.  ** way 
12560 62 65 63 61 75 73 65 20 77 65 20 6b 6e 6f 77 20  because we know 
12570 77 65 27 6c 6c 20 6e 65 76 65 72 20 65 78 65 63  we'll never exec
12580 75 74 65 20 74 68 69 73 20 66 61 72 20 69 6e 74  ute this far int
12590 6f 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  o this.  ** func
125a0 74 69 6f 6e 20 6f 6e 20 61 20 72 65 63 75 72 73  tion on a recurs
125b0 69 76 65 20 63 61 6c 6c 20 77 69 74 68 20 74 68  ive call with th
125c0 65 20 73 61 6d 65 20 70 44 65 63 6c 2e 20 20 48  e same pDecl.  H
125d0 65 6e 63 65 2c 20 72 65 63 75 72 73 69 76 65 0a  ence, recursive.
125e0 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68    ** calls to th
125f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 28 74 68 72  is function (thr
12600 6f 75 67 68 20 53 63 61 6e 54 65 78 74 28 29 29  ough ScanText())
12610 20 63 61 6e 20 6e 65 76 65 72 20 63 68 61 6e 67   can never chang
12620 65 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65  e the.  ** value
12630 20 6f 66 20 44 50 5f 46 6c 61 67 20 6f 75 74 20   of DP_Flag out 
12640 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
12650 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 44 65 63   */.  for(p=pDec
12660 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 61 6d 65  l; p; p=p->pSame
12670 4e 61 6d 65 29 7b 0a 20 20 20 20 69 66 28 20 21  Name){.    if( !
12680 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28  DeclHasProperty(
12690 70 2c 44 50 5f 44 65 63 6c 61 72 65 64 29 20 0a  p,DP_Declared) .
126a0 20 20 20 20 20 26 26 20 28 70 2d 3e 7a 46 77 64       && (p->zFwd
126b0 3d 3d 30 20 7c 7c 20 6e 65 65 64 46 75 6c 6c 44  ==0 || needFullD
126c0 65 63 6c 29 20 0a 20 20 20 20 20 26 26 20 70 2d  ecl) .     && p-
126d0 3e 7a 44 65 63 6c 21 3d 30 0a 20 20 20 20 29 7b  >zDecl!=0.    ){
126e0 0a 20 20 20 20 20 20 44 65 63 6c 53 65 74 50 72  .      DeclSetPr
126f0 6f 70 65 72 74 79 28 70 2c 44 50 5f 46 6f 72 77  operty(p,DP_Forw
12700 61 72 64 7c 44 50 5f 44 65 63 6c 61 72 65 64 7c  ard|DP_Declared|
12710 44 50 5f 46 6c 61 67 29 3b 0a 20 20 20 20 7d 65  DP_Flag);.    }e
12720 6c 73 65 7b 0a 20 20 20 20 20 20 44 65 63 6c 43  lse{.      DeclC
12730 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 44  learProperty(p,D
12740 50 5f 46 6c 61 67 29 3b 0a 20 20 20 20 7d 0a 20  P_Flag);.    }. 
12750 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 61   }..  /*.  ** Ca
12760 6c 6c 20 53 63 61 6e 54 65 78 74 28 29 20 72 65  ll ScanText() re
12770 63 75 73 69 76 65 6c 79 20 28 74 68 69 73 20 72  cusively (this r
12780 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12790 20 66 72 6f 6d 20 53 63 61 6e 54 65 78 74 28 29   from ScanText()
127a0 29 0a 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64  ).  ** to includ
127b0 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 72  e declarations r
127c0 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 65 20  equired to come 
127d0 62 65 66 6f 72 65 20 74 68 65 73 65 20 64 65 63  before these dec
127e0 6c 61 72 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  larations..  */.
127f0 20 20 66 6f 72 28 70 3d 70 44 65 63 6c 3b 20 70    for(p=pDecl; p
12800 3b 20 70 3d 70 2d 3e 70 53 61 6d 65 4e 61 6d 65  ; p=p->pSameName
12810 29 7b 0a 20 20 20 20 69 66 28 20 44 65 63 6c 48  ){.    if( DeclH
12820 61 73 50 72 6f 70 65 72 74 79 28 70 2c 44 50 5f  asProperty(p,DP_
12830 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20 69  Flag) ){.      i
12840 66 28 20 70 2d 3e 7a 44 65 63 6c 5b 30 5d 3d 3d  f( p->zDecl[0]==
12850 27 23 27 20 29 7b 0a 20 20 20 20 20 20 20 20 53  '#' ){.        S
12860 63 61 6e 54 65 78 74 28 26 70 2d 3e 7a 44 65 63  canText(&p->zDec
12870 6c 5b 31 5d 2c 70 53 74 61 74 65 29 3b 0a 20 20  l[1],pState);.  
12880 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12890 20 20 20 49 6e 73 65 72 74 45 78 74 72 61 44 65     InsertExtraDe
128a0 63 6c 28 70 29 3b 0a 20 20 20 20 20 20 20 20 53  cl(p);.        S
128b0 63 61 6e 54 65 78 74 28 70 2d 3e 7a 44 65 63 6c  canText(p->zDecl
128c0 2c 70 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20  ,pState);.      
128d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
128e0 2a 0a 20 20 2a 2a 20 4f 75 74 70 75 74 20 74 68  *.  ** Output th
128f0 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 20  e declarations. 
12900 20 44 6f 20 74 68 69 73 20 69 6e 20 74 77 6f 20   Do this in two 
12910 70 61 73 73 65 73 2e 20 20 46 69 72 73 74 0a 20  passes.  First. 
12920 20 2a 2a 20 6f 75 74 70 75 74 20 65 76 65 72 79   ** output every
12930 74 68 69 6e 67 20 74 68 61 74 20 69 73 6e 27 74  thing that isn't
12940 20 61 20 74 79 70 65 64 65 66 2e 20 20 54 68 65   a typedef.  The
12950 6e 20 67 6f 20 62 61 63 6b 20 61 6e 64 0a 20 20  n go back and.  
12960 2a 2a 20 67 65 74 20 74 68 65 20 74 79 70 65 64  ** get the typed
12970 65 66 73 20 62 79 20 74 68 65 20 73 61 6d 65 20  efs by the same 
12980 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  name..  */.  for
12990 28 70 3d 70 44 65 63 6c 3b 20 70 3b 20 70 3d 70  (p=pDecl; p; p=p
129a0 2d 3e 70 53 61 6d 65 4e 61 6d 65 29 7b 0a 20 20  ->pSameName){.  
129b0 20 20 69 66 28 20 44 65 63 6c 48 61 73 50 72 6f    if( DeclHasPro
129c0 70 65 72 74 79 28 70 2c 44 50 5f 46 6c 61 67 29  perty(p,DP_Flag)
129d0 20 26 26 20 21 44 65 63 6c 48 61 73 50 72 6f 70   && !DeclHasProp
129e0 65 72 74 79 28 70 2c 54 59 5f 54 79 70 65 64 65  erty(p,TY_Typede
129f0 66 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  f) ){.      if( 
12a00 44 65 63 6c 48 61 73 41 6e 79 50 72 6f 70 65 72  DeclHasAnyProper
12a10 74 79 28 70 2c 54 59 5f 45 6e 75 6d 65 72 61 74  ty(p,TY_Enumerat
12a20 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ion) ){.        
12a30 69 66 28 20 64 6f 6e 65 54 79 70 65 64 65 66 20  if( doneTypedef 
12a40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
12a50 20 20 20 20 64 6f 6e 65 54 79 70 65 64 65 66 20      doneTypedef 
12a60 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
12a70 20 20 20 43 68 61 6e 67 65 49 66 43 6f 6e 74 65     ChangeIfConte
12a80 78 74 28 70 2d 3e 7a 49 66 2c 70 53 74 61 74 65  xt(p->zIf,pState
12a90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  );.      if( !is
12aa0 43 70 70 20 26 26 20 44 65 63 6c 48 61 73 41 6e  Cpp && DeclHasAn
12ab0 79 50 72 6f 70 65 72 74 79 28 70 2c 44 50 5f 45  yProperty(p,DP_E
12ac0 78 74 65 72 6e 52 65 71 64 29 20 29 7b 0a 20 20  xternReqd) ){.  
12ad0 20 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65        StringAppe
12ae0 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c  nd(pState->pStr,
12af0 22 65 78 74 65 72 6e 20 22 2c 30 29 3b 0a 20 20  "extern ",0);.  
12b00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
12b10 43 70 70 20 26 26 20 44 65 63 6c 48 61 73 50 72  Cpp && DeclHasPr
12b20 6f 70 65 72 74 79 28 70 2c 44 50 5f 43 70 6c 75  operty(p,DP_Cplu
12b30 73 70 6c 75 73 7c 44 50 5f 45 78 74 65 72 6e 52  splus|DP_ExternR
12b40 65 71 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eqd) ){.        
12b50 53 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74  StringAppend(pSt
12b60 61 74 65 2d 3e 70 53 74 72 2c 22 65 78 74 65 72  ate->pStr,"exter
12b70 6e 20 22 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  n ",0);.      }e
12b80 6c 73 65 20 69 66 28 20 69 73 43 70 70 20 26 26  lse if( isCpp &&
12b90 20 44 65 63 6c 48 61 73 41 6e 79 50 72 6f 70 65   DeclHasAnyPrope
12ba0 72 74 79 28 70 2c 44 50 5f 45 78 74 65 72 6e 43  rty(p,DP_ExternC
12bb0 52 65 71 64 7c 44 50 5f 45 78 74 65 72 6e 52 65  Reqd|DP_ExternRe
12bc0 71 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 53  qd) ){.        S
12bd0 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61  tringAppend(pSta
12be0 74 65 2d 3e 70 53 74 72 2c 22 65 78 74 65 72 6e  te->pStr,"extern
12bf0 20 5c 22 43 5c 22 20 22 2c 30 29 3b 0a 20 20 20   \"C\" ",0);.   
12c00 20 20 20 7d 0a 20 20 20 20 20 20 49 6e 73 65 72     }.      Inser
12c10 74 45 78 74 72 61 44 65 63 6c 28 70 29 3b 0a 20  tExtraDecl(p);. 
12c20 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e       StringAppen
12c30 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c 70  d(pState->pStr,p
12c40 2d 3e 7a 44 65 63 6c 2c 30 29 3b 0a 20 20 20 20  ->zDecl,0);.    
12c50 20 20 69 66 28 20 21 69 73 43 70 70 20 26 26 20    if( !isCpp && 
12c60 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28  DeclHasProperty(
12c70 70 2c 44 50 5f 43 70 6c 75 73 70 6c 75 73 29 20  p,DP_Cplusplus) 
12c80 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
12c90 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
12ca0 20 20 20 20 20 22 25 73 3a 20 43 20 63 6f 64 65       "%s: C code
12cb0 20 6f 75 67 68 74 20 6e 6f 74 20 72 65 66 65 72   ought not refer
12cc0 65 6e 63 65 20 74 68 65 20 43 2b 2b 20 6f 62 6a  ence the C++ obj
12cd0 65 63 74 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20  ect \"%s\"\n",. 
12ce0 20 20 20 20 20 20 20 20 20 70 53 74 61 74 65 2d           pState-
12cf0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 2d 3e 7a  >zFilename, p->z
12d00 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
12d10 53 74 61 74 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  State->nErr++;. 
12d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 44 65 63       }.      Dec
12d30 6c 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70  lClearProperty(p
12d40 2c 44 50 5f 46 6c 61 67 29 3b 0a 20 20 20 20 7d  ,DP_Flag);.    }
12d50 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d 70 44 65  .  }.  for(p=pDe
12d60 63 6c 3b 20 70 20 26 26 20 21 64 6f 6e 65 54 79  cl; p && !doneTy
12d70 70 65 64 65 66 3b 20 70 3d 70 2d 3e 70 53 61 6d  pedef; p=p->pSam
12d80 65 4e 61 6d 65 29 7b 0a 20 20 20 20 69 66 28 20  eName){.    if( 
12d90 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28  DeclHasProperty(
12da0 70 2c 44 50 5f 46 6c 61 67 29 20 29 7b 0a 20 20  p,DP_Flag) ){.  
12db0 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20      /* This has 
12dc0 74 6f 20 62 65 20 61 20 74 79 70 65 64 65 66 20  to be a typedef 
12dd0 2a 2f 0a 20 20 20 20 20 20 64 6f 6e 65 54 79 70  */.      doneTyp
12de0 65 64 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  edef = 1;.      
12df0 43 68 61 6e 67 65 49 66 43 6f 6e 74 65 78 74 28  ChangeIfContext(
12e00 70 2d 3e 7a 49 66 2c 70 53 74 61 74 65 29 3b 0a  p->zIf,pState);.
12e10 20 20 20 20 20 20 49 6e 73 65 72 74 45 78 74 72        InsertExtr
12e20 61 44 65 63 6c 28 70 29 3b 0a 20 20 20 20 20 20  aDecl(p);.      
12e30 53 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74  StringAppend(pSt
12e40 61 74 65 2d 3e 70 53 74 72 2c 70 2d 3e 7a 44 65  ate->pStr,p->zDe
12e50 63 6c 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  cl,0);.    }.  }
12e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
12e70 6f 75 74 69 6e 65 20 73 63 61 6e 73 20 74 68 65  outine scans the
12e80 20 69 6e 70 75 74 20 74 65 78 74 20 67 69 76 65   input text give
12e90 6e 2c 20 61 6e 64 20 61 70 70 65 6e 64 73 20 74  n, and appends t
12ea0 6f 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20  o the.** string 
12eb0 69 6e 20 70 53 74 61 74 65 2d 3e 70 53 74 72 20  in pState->pStr 
12ec0 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 79 20  the text of any 
12ed0 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 74 68 61  declarations tha
12ee0 74 20 6d 75 73 74 0a 2a 2a 20 6f 63 63 75 72 20  t must.** occur 
12ef0 62 65 66 6f 72 65 20 74 68 65 20 74 65 78 74 20  before the text 
12f00 69 6e 20 7a 54 65 78 74 2e 0a 2a 2a 0a 2a 2a 20  in zText..**.** 
12f10 49 66 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  If an identifier
12f20 20 69 6e 20 7a 54 65 78 74 20 69 73 20 69 6d 6d   in zText is imm
12f30 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 65  ediately followe
12f40 64 20 62 79 20 27 2a 27 2c 20 74 68 65 6e 0a 2a  d by '*', then.*
12f50 2a 20 6f 6e 6c 79 20 66 6f 72 77 61 72 64 20 64  * only forward d
12f60 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 72 65 20  eclarations are 
12f70 6e 65 65 64 65 64 20 66 6f 72 20 74 68 61 74 20  needed for that 
12f80 69 64 65 6e 74 69 66 69 65 72 2e 20 20 49 66 20  identifier.  If 
12f90 74 68 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  the.** identifie
12fa0 72 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 6f  r name is not fo
12fb0 6c 6c 6f 77 65 64 20 69 6d 6d 65 64 69 61 74 65  llowed immediate
12fc0 6c 79 20 62 79 20 27 2a 27 2c 20 77 65 20 6d 75  ly by '*', we mu
12fd0 73 74 20 73 75 70 70 6c 79 0a 2a 2a 20 61 20 66  st supply.** a f
12fe0 75 6c 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e  ull declaration.
12ff0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13000 53 63 61 6e 54 65 78 74 28 0a 20 20 63 6f 6e 73  ScanText(.  cons
13010 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 20  t char *zText,  
13020 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 74    /* The input t
13030 65 78 74 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  ext to be scanne
13040 64 20 2a 2f 0a 20 20 47 65 6e 53 74 61 74 65 20  d */.  GenState 
13050 2a 70 53 74 61 74 65 20 20 20 20 20 20 2f 2a 20  *pState      /* 
13060 43 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  Current state of
13070 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
13080 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tor */.){.  int 
13090 6e 65 78 74 56 61 6c 69 64 20 3d 20 30 3b 20 20  nextValid = 0;  
130a0 20 20 2f 2a 20 54 72 75 65 20 69 73 20 73 4e 65    /* True is sNe
130b0 78 74 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  xt contains vali
130c0 64 20 64 61 74 61 20 2a 2f 0a 20 20 49 6e 53 74  d data */.  InSt
130d0 72 65 61 6d 20 73 49 6e 3b 20 20 20 20 20 20 20  ream sIn;       
130e0 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 74    /* The input t
130f0 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 73  ext */.  Token s
13100 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20 2f  Token;         /
13110 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 6f  * The current to
13120 6b 65 6e 20 62 65 69 6e 67 20 65 78 61 6d 69 6e  ken being examin
13130 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 73 4e  ed */.  Token sN
13140 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ext;          /*
13150 20 54 68 65 20 6e 65 78 74 20 6e 6f 6e 2d 73 70   The next non-sp
13160 61 63 65 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20  ace token */..  
13170 2f 2a 20 70 72 69 6e 74 66 28 22 42 45 47 49 4e  /* printf("BEGIN
13180 20 53 43 41 4e 20 54 45 58 54 20 6f 6e 20 25 73   SCAN TEXT on %s
13190 5c 6e 22 2c 20 7a 54 65 78 74 29 3b 20 2a 2f 0a  \n", zText); */.
131a0 0a 20 20 73 49 6e 2e 7a 20 3d 20 7a 54 65 78 74  .  sIn.z = zText
131b0 3b 0a 20 20 73 49 6e 2e 69 20 3d 20 30 3b 0a 20  ;.  sIn.i = 0;. 
131c0 20 73 49 6e 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a   sIn.nLine = 1;.
131d0 20 20 77 68 69 6c 65 28 20 73 49 6e 2e 7a 5b 73    while( sIn.z[s
131e0 49 6e 2e 69 5d 21 3d 30 20 29 7b 0a 20 20 20 20  In.i]!=0 ){.    
131f0 69 66 28 20 6e 65 78 74 56 61 6c 69 64 20 29 7b  if( nextValid ){
13200 0a 20 20 20 20 20 20 73 54 6f 6b 65 6e 20 3d 20  .      sToken = 
13210 73 4e 65 78 74 3b 0a 20 20 20 20 20 20 6e 65 78  sNext;.      nex
13220 74 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  tValid = 0;.    
13230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 47 65 74  }else{.      Get
13240 4e 6f 6e 73 70 61 63 65 54 6f 6b 65 6e 28 26 73  NonspaceToken(&s
13250 49 6e 2c 26 73 54 6f 6b 65 6e 29 3b 0a 20 20 20  In,&sToken);.   
13260 20 7d 0a 20 20 20 20 69 66 28 20 73 54 6f 6b 65   }.    if( sToke
13270 6e 2e 65 54 79 70 65 3d 3d 54 54 5f 49 64 20 29  n.eType==TT_Id )
13280 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 65 64  {.      int need
13290 46 75 6c 6c 44 65 63 6c 3b 20 20 20 2f 2a 20 54  FullDecl;   /* T
132a0 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  rue if we need t
132b0 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 66 75  o provide the fu
132c0 6c 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 2c 0a  ll declaration,.
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
132f0 20 6a 75 73 74 20 74 68 65 20 66 6f 72 77 61 72   just the forwar
13300 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
13310 0a 20 20 20 20 20 20 44 65 63 6c 20 2a 70 44 65  .      Decl *pDe
13320 63 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  cl;        /* Th
13330 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 68 61  e declaration ha
13340 76 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 69 6e  ving the name in
13350 20 73 54 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20   sToken */..    
13360 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 53 65    /*.      ** Se
13370 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  e if there is a 
13380 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 20 74  declaration in t
13390 68 65 20 64 61 74 61 62 61 73 65 20 77 69 74 68  he database with
133a0 20 74 68 65 20 6e 61 6d 65 20 67 69 76 65 6e 0a   the name given.
133b0 20 20 20 20 20 20 2a 2a 20 62 79 20 73 54 6f 6b        ** by sTok
133c0 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  en..      */.   
133d0 20 20 20 70 44 65 63 6c 20 3d 20 46 69 6e 64 44     pDecl = FindD
133e0 65 63 6c 28 73 54 6f 6b 65 6e 2e 7a 54 65 78 74  ecl(sToken.zText
133f0 2c 73 54 6f 6b 65 6e 2e 6e 54 65 78 74 29 3b 0a  ,sToken.nText);.
13400 20 20 20 20 20 20 69 66 28 20 70 44 65 63 6c 3d        if( pDecl=
13410 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
13420 20 20 20 20 20 20 2f 2a 20 0a 20 20 20 20 20 20        /* .      
13430 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  ** If we get thi
13440 73 20 66 61 72 2c 20 77 65 27 76 65 20 66 6f 75  s far, we've fou
13450 6e 64 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  nd an identifier
13460 20 74 68 61 74 20 68 61 73 20 61 20 0a 20 20 20   that has a .   
13470 20 20 20 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f     ** declaratio
13480 6e 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  n in the databas
13490 65 2e 20 20 4e 6f 77 20 73 65 65 20 69 66 20 77  e.  Now see if w
134a0 65 20 74 68 65 20 66 75 6c 6c 20 64 65 63 6c 61  e the full decla
134b0 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
134c0 6f 72 20 6a 75 73 74 20 61 20 66 6f 72 77 61 72  or just a forwar
134d0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 0a 20  d declaration.. 
134e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 47 65       */.      Ge
134f0 74 4e 6f 6e 73 70 61 63 65 54 6f 6b 65 6e 28 26  tNonspaceToken(&
13500 73 49 6e 2c 26 73 4e 65 78 74 29 3b 0a 20 20 20  sIn,&sNext);.   
13510 20 20 20 69 66 28 20 73 4e 65 78 74 2e 7a 54 65     if( sNext.zTe
13520 78 74 5b 30 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20  xt[0]=='*' ){.  
13530 20 20 20 20 20 20 6e 65 65 64 46 75 6c 6c 44 65        needFullDe
13540 63 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  cl = 0;.      }e
13550 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 65  lse{.        nee
13560 64 46 75 6c 6c 44 65 63 6c 20 3d 20 31 3b 0a 20  dFullDecl = 1;. 
13570 20 20 20 20 20 20 20 6e 65 78 74 56 61 6c 69 64         nextValid
13580 20 3d 20 73 4e 65 78 74 2e 65 54 79 70 65 3d 3d   = sNext.eType==
13590 54 54 5f 49 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  TT_Id;.      }..
135a0 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a        /*.      *
135b0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 6e  * Generate the n
135c0 65 65 64 65 64 20 64 65 63 6c 61 72 61 74 69 6f  eeded declaratio
135d0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
135e0 20 20 44 65 63 6c 61 72 65 4f 62 6a 65 63 74 28    DeclareObject(
135f0 70 44 65 63 6c 2c 70 53 74 61 74 65 2c 6e 65 65  pDecl,pState,nee
13600 64 46 75 6c 6c 44 65 63 6c 29 3b 0a 20 20 20 20  dFullDecl);.    
13610 7d 65 6c 73 65 20 69 66 28 20 73 54 6f 6b 65 6e  }else if( sToken
13620 2e 65 54 79 70 65 3d 3d 54 54 5f 50 72 65 70 72  .eType==TT_Prepr
13630 6f 63 65 73 73 6f 72 20 29 7b 0a 20 20 20 20 20  ocessor ){.     
13640 20 73 49 6e 2e 69 20 2d 3d 20 73 54 6f 6b 65 6e   sIn.i -= sToken
13650 2e 6e 54 65 78 74 20 2d 20 31 3b 0a 20 20 20 20  .nText - 1;.    
13660 7d 0a 20 20 7d 0a 20 20 2f 2a 20 70 72 69 6e 74  }.  }.  /* print
13670 66 28 22 45 4e 44 20 53 43 41 4e 54 45 58 54 5c  f("END SCANTEXT\
13680 6e 22 29 3b 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  n"); */.}../*.**
13690 20 50 72 6f 76 69 64 65 20 61 20 66 75 6c 6c 20   Provide a full 
136a0 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 6f 20 61  declaration to a
136b0 6e 79 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20  ny object which 
136c0 73 6f 20 66 61 72 20 68 61 73 20 68 61 64 20 6f  so far has had o
136d0 6e 6c 79 0a 2a 2a 20 61 20 66 6f 77 61 72 64 20  nly.** a foward 
136e0 64 65 63 6c 61 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  declaration..*/.
136f0 73 74 61 74 69 63 20 76 6f 69 64 20 43 6f 6d 70  static void Comp
13700 6c 65 74 65 46 6f 72 77 61 72 64 44 65 63 6c 61  leteForwardDecla
13710 72 61 74 69 6f 6e 73 28 47 65 6e 53 74 61 74 65  rations(GenState
13720 20 2a 70 53 74 61 74 65 29 7b 0a 20 20 44 65 63   *pState){.  Dec
13730 6c 20 2a 70 44 65 63 6c 3b 0a 20 20 69 6e 74 20  l *pDecl;.  int 
13740 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20 64 6f 7b  progress;..  do{
13750 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20  .    progress = 
13760 30 3b 0a 20 20 20 20 66 6f 72 28 70 44 65 63 6c  0;.    for(pDecl
13770 3d 70 44 65 63 6c 46 69 72 73 74 3b 20 70 44 65  =pDeclFirst; pDe
13780 63 6c 3b 20 70 44 65 63 6c 3d 70 44 65 63 6c 2d  cl; pDecl=pDecl-
13790 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
137a0 66 28 20 44 65 63 6c 48 61 73 50 72 6f 70 65 72  f( DeclHasProper
137b0 74 79 28 70 44 65 63 6c 2c 44 50 5f 46 6f 72 77  ty(pDecl,DP_Forw
137c0 61 72 64 29 20 0a 20 20 20 20 20 20 20 26 26 20  ard) .       && 
137d0 21 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79  !DeclHasProperty
137e0 28 70 44 65 63 6c 2c 44 50 5f 44 65 63 6c 61 72  (pDecl,DP_Declar
137f0 65 64 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  ed) .      ){.  
13800 20 20 20 20 20 20 44 65 63 6c 61 72 65 4f 62 6a        DeclareObj
13810 65 63 74 28 70 44 65 63 6c 2c 70 53 74 61 74 65  ect(pDecl,pState
13820 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 70 72 6f  ,1);.        pro
13830 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20  gress = 1;.     
13840 20 20 20 61 73 73 65 72 74 28 20 44 65 63 6c 48     assert( DeclH
13850 61 73 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c  asProperty(pDecl
13860 2c 44 50 5f 44 65 63 6c 61 72 65 64 29 20 29 3b  ,DP_Declared) );
13870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13880 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
13890 73 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  s );.}../*.** Ge
138a0 6e 65 72 61 74 65 20 61 6e 20 69 6e 63 6c 75 64  nerate an includ
138b0 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 67  e file for the g
138c0 69 76 65 6e 20 73 6f 75 72 63 65 20 66 69 6c 65  iven source file
138d0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
138e0 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
138f0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
13900 2a 0a 2a 2a 20 69 66 20 6e 6f 6c 6f 63 61 6c 5f  *.** if nolocal_
13910 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
13920 65 6e 20 77 65 20 64 6f 20 6e 6f 74 20 67 65 6e  en we do not gen
13930 65 72 61 74 65 20 64 65 63 6c 61 72 61 74 69 6f  erate declaratio
13940 6e 73 20 66 6f 72 0a 2a 2a 20 6f 62 6a 65 63 74  ns for.** object
13950 65 64 20 6d 61 72 6b 65 64 20 44 50 5f 4c 6f 63  ed marked DP_Loc
13960 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
13970 74 20 4d 61 6b 65 48 65 61 64 65 72 28 49 6e 46  t MakeHeader(InF
13980 69 6c 65 20 2a 70 46 69 6c 65 2c 20 46 49 4c 45  ile *pFile, FILE
13990 20 2a 72 65 70 6f 72 74 2c 20 69 6e 74 20 6e 6f   *report, int no
139a0 6c 6f 63 61 6c 5f 66 6c 61 67 29 7b 0a 20 20 69  local_flag){.  i
139b0 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 47  nt nErr = 0;.  G
139c0 65 6e 53 74 61 74 65 20 73 53 74 61 74 65 3b 0a  enState sState;.
139d0 20 20 53 74 72 69 6e 67 20 6f 75 74 53 74 72 3b    String outStr;
139e0 0a 20 20 49 64 65 6e 74 54 61 62 6c 65 20 69 6e  .  IdentTable in
139f0 63 6c 75 64 65 54 61 62 6c 65 3b 0a 20 20 49 64  cludeTable;.  Id
13a00 65 6e 74 20 2a 70 49 64 3b 0a 20 20 63 68 61 72  ent *pId;.  char
13a10 20 2a 7a 4e 65 77 56 65 72 73 69 6f 6e 3b 0a 20   *zNewVersion;. 
13a20 20 63 68 61 72 20 2a 7a 4f 6c 64 56 65 72 73 69   char *zOldVersi
13a30 6f 6e 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65  on;..  if( pFile
13a40 2d 3e 7a 48 64 72 3d 3d 30 20 7c 7c 20 2a 70 46  ->zHdr==0 || *pF
13a50 69 6c 65 2d 3e 7a 48 64 72 3d 3d 30 20 29 20 72  ile->zHdr==0 ) r
13a60 65 74 75 72 6e 20 30 3b 0a 20 20 73 53 74 61 74  eturn 0;.  sStat
13a70 65 2e 70 53 74 72 20 3d 20 26 6f 75 74 53 74 72  e.pStr = &outStr
13a80 3b 0a 20 20 53 74 72 69 6e 67 49 6e 69 74 28 26  ;.  StringInit(&
13a90 6f 75 74 53 74 72 29 3b 0a 20 20 53 74 72 69 6e  outStr);.  Strin
13aa0 67 41 70 70 65 6e 64 28 26 6f 75 74 53 74 72 2c  gAppend(&outStr,
13ab0 7a 54 6f 70 4c 69 6e 65 2c 6e 54 6f 70 4c 69 6e  zTopLine,nTopLin
13ac0 65 29 3b 0a 20 20 73 53 74 61 74 65 2e 70 54 61  e);.  sState.pTa
13ad0 62 6c 65 20 3d 20 26 69 6e 63 6c 75 64 65 54 61  ble = &includeTa
13ae0 62 6c 65 3b 0a 20 20 6d 65 6d 73 65 74 28 26 69  ble;.  memset(&i
13af0 6e 63 6c 75 64 65 54 61 62 6c 65 2c 30 2c 73 69  ncludeTable,0,si
13b00 7a 65 6f 66 28 69 6e 63 6c 75 64 65 54 61 62 6c  zeof(includeTabl
13b10 65 29 29 3b 0a 20 20 73 53 74 61 74 65 2e 7a 49  e));.  sState.zI
13b20 66 20 3d 20 30 3b 0a 20 20 73 53 74 61 74 65 2e  f = 0;.  sState.
13b30 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73 53 74 61  nErr = 0;.  sSta
13b40 74 65 2e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 70  te.zFilename = p
13b50 46 69 6c 65 2d 3e 7a 53 72 63 3b 0a 20 20 73 53  File->zSrc;.  sS
13b60 74 61 74 65 2e 66 6c 61 67 73 20 3d 20 70 46 69  tate.flags = pFi
13b70 6c 65 2d 3e 66 6c 61 67 73 20 26 20 44 50 5f 43  le->flags & DP_C
13b80 70 6c 75 73 70 6c 75 73 3b 0a 20 20 52 65 73 65  plusplus;.  Rese
13b90 74 44 65 63 6c 46 6c 61 67 73 28 6e 6f 6c 6f 63  tDeclFlags(noloc
13ba0 61 6c 5f 66 6c 61 67 20 3f 20 22 6e 6f 22 20 3a  al_flag ? "no" :
13bb0 20 70 46 69 6c 65 2d 3e 7a 53 72 63 29 3b 0a 20   pFile->zSrc);. 
13bc0 20 66 6f 72 28 70 49 64 20 3d 20 70 46 69 6c 65   for(pId = pFile
13bd0 2d 3e 69 64 54 61 62 6c 65 2e 70 4c 69 73 74 3b  ->idTable.pList;
13be0 20 70 49 64 3b 20 70 49 64 3d 70 49 64 2d 3e 70   pId; pId=pId->p
13bf0 4e 65 78 74 29 7b 0a 20 20 20 20 44 65 63 6c 20  Next){.    Decl 
13c00 2a 70 44 65 63 6c 20 3d 20 46 69 6e 64 44 65 63  *pDecl = FindDec
13c10 6c 28 70 49 64 2d 3e 7a 4e 61 6d 65 2c 30 29 3b  l(pId->zName,0);
13c20 0a 20 20 20 20 69 66 28 20 70 44 65 63 6c 20 29  .    if( pDecl )
13c30 7b 0a 20 20 20 20 20 20 44 65 63 6c 61 72 65 4f  {.      DeclareO
13c40 62 6a 65 63 74 28 70 44 65 63 6c 2c 26 73 53 74  bject(pDecl,&sSt
13c50 61 74 65 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ate,1);.    }.  
13c60 7d 0a 20 20 43 6f 6d 70 6c 65 74 65 46 6f 72 77  }.  CompleteForw
13c70 61 72 64 44 65 63 6c 61 72 61 74 69 6f 6e 73 28  ardDeclarations(
13c80 26 73 53 74 61 74 65 29 3b 0a 20 20 43 68 61 6e  &sState);.  Chan
13c90 67 65 49 66 43 6f 6e 74 65 78 74 28 30 2c 26 73  geIfContext(0,&s
13ca0 53 74 61 74 65 29 3b 0a 20 20 6e 45 72 72 20 2b  State);.  nErr +
13cb0 3d 20 73 53 74 61 74 65 2e 6e 45 72 72 3b 0a 20  = sState.nErr;. 
13cc0 20 7a 4f 6c 64 56 65 72 73 69 6f 6e 20 3d 20 52   zOldVersion = R
13cd0 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 7a  eadFile(pFile->z
13ce0 48 64 72 29 3b 0a 20 20 7a 4e 65 77 56 65 72 73  Hdr);.  zNewVers
13cf0 69 6f 6e 20 3d 20 53 74 72 69 6e 67 47 65 74 28  ion = StringGet(
13d00 26 6f 75 74 53 74 72 29 3b 0a 20 20 69 66 28 20  &outStr);.  if( 
13d10 72 65 70 6f 72 74 20 29 20 66 70 72 69 6e 74 66  report ) fprintf
13d20 28 72 65 70 6f 72 74 2c 22 25 73 3a 20 22 2c 70  (report,"%s: ",p
13d30 46 69 6c 65 2d 3e 7a 48 64 72 29 3b 0a 20 20 69  File->zHdr);.  i
13d40 66 28 20 7a 4f 6c 64 56 65 72 73 69 6f 6e 3d 3d  f( zOldVersion==
13d50 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 70  0 ){.    if( rep
13d60 6f 72 74 20 29 20 66 70 72 69 6e 74 66 28 72 65  ort ) fprintf(re
13d70 70 6f 72 74 2c 22 75 70 64 61 74 65 64 5c 6e 22  port,"updated\n"
13d80 29 3b 0a 20 20 20 20 69 66 28 20 57 72 69 74 65  );.    if( Write
13d90 46 69 6c 65 28 70 46 69 6c 65 2d 3e 7a 48 64 72  File(pFile->zHdr
13da0 2c 7a 4e 65 77 56 65 72 73 69 6f 6e 29 20 29 7b  ,zNewVersion) ){
13db0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
13dc0 74 64 65 72 72 2c 22 25 73 3a 20 43 61 6e 27 74  tderr,"%s: Can't
13dd0 20 77 72 69 74 65 20 74 6f 20 66 69 6c 65 5c 6e   write to file\n
13de0 22 2c 70 46 69 6c 65 2d 3e 7a 48 64 72 29 3b 0a  ",pFile->zHdr);.
13df0 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
13e00 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
13e10 73 74 72 6e 63 6d 70 28 7a 4f 6c 64 56 65 72 73  strncmp(zOldVers
13e20 69 6f 6e 2c 7a 54 6f 70 4c 69 6e 65 2c 6e 54 6f  ion,zTopLine,nTo
13e30 70 4c 69 6e 65 29 21 3d 30 20 29 7b 0a 20 20 20  pLine)!=0 ){.   
13e40 20 69 66 28 20 72 65 70 6f 72 74 20 29 20 66 70   if( report ) fp
13e50 72 69 6e 74 66 28 72 65 70 6f 72 74 2c 22 65 72  rintf(report,"er
13e60 72 6f 72 21 5c 6e 22 29 3b 0a 20 20 20 20 66 70  ror!\n");.    fp
13e70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
13e80 20 20 20 20 20 22 25 73 3a 20 43 61 6e 27 74 20       "%s: Can't 
13e90 6f 76 65 72 77 72 69 74 65 20 74 68 69 73 20 66  overwrite this f
13ea0 69 6c 65 20 62 65 63 61 75 73 65 20 69 74 20 77  ile because it w
13eb0 61 73 6e 27 74 20 70 72 65 76 69 6f 75 73 6c 79  asn't previously
13ec0 5c 6e 22 0a 20 20 20 20 20 20 20 22 25 2a 73 20  \n".       "%*s 
13ed0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 27 6d   generated by 'm
13ee0 61 6b 65 68 65 61 64 65 72 73 27 2e 5c 6e 22 2c  akeheaders'.\n",
13ef0 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 7a  .       pFile->z
13f00 48 64 72 2c 20 73 74 72 6c 65 6e 28 70 46 69 6c  Hdr, strlen(pFil
13f10 65 2d 3e 7a 48 64 72 29 2c 20 22 22 29 3b 0a 20  e->zHdr), "");. 
13f20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 65 6c     nErr++;.  }el
13f30 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f  se if( strcmp(zO
13f40 6c 64 56 65 72 73 69 6f 6e 2c 7a 4e 65 77 56 65  ldVersion,zNewVe
13f50 72 73 69 6f 6e 29 21 3d 30 20 29 7b 0a 20 20 20  rsion)!=0 ){.   
13f60 20 69 66 28 20 72 65 70 6f 72 74 20 29 20 66 70   if( report ) fp
13f70 72 69 6e 74 66 28 72 65 70 6f 72 74 2c 22 75 70  rintf(report,"up
13f80 64 61 74 65 64 5c 6e 22 29 3b 0a 20 20 20 20 69  dated\n");.    i
13f90 66 28 20 57 72 69 74 65 46 69 6c 65 28 70 46 69  f( WriteFile(pFi
13fa0 6c 65 2d 3e 7a 48 64 72 2c 7a 4e 65 77 56 65 72  le->zHdr,zNewVer
13fb0 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 66  sion) ){.      f
13fc0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
13fd0 73 3a 20 43 61 6e 27 74 20 77 72 69 74 65 20 74  s: Can't write t
13fe0 6f 20 66 69 6c 65 5c 6e 22 2c 70 46 69 6c 65 2d  o file\n",pFile-
13ff0 3e 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 6e 45  >zHdr);.      nE
14000 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rr++;.    }.  }e
14010 6c 73 65 20 69 66 28 20 72 65 70 6f 72 74 20 29  lse if( report )
14020 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 72 65  {.    fprintf(re
14030 70 6f 72 74 2c 22 75 6e 63 68 61 6e 67 65 64 5c  port,"unchanged\
14040 6e 22 29 3b 0a 20 20 7d 0a 20 20 53 61 66 65 46  n");.  }.  SafeF
14050 72 65 65 28 7a 4f 6c 64 56 65 72 73 69 6f 6e 29  ree(zOldVersion)
14060 3b 20 0a 20 20 49 64 65 6e 74 54 61 62 6c 65 52  ; .  IdentTableR
14070 65 73 65 74 28 26 69 6e 63 6c 75 64 65 54 61 62  eset(&includeTab
14080 6c 65 29 3b 0a 20 20 53 74 72 69 6e 67 52 65 73  le);.  StringRes
14090 65 74 28 26 6f 75 74 53 74 72 29 3b 0a 20 20 72  et(&outStr);.  r
140a0 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f  eturn nErr;.}../
140b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
140c0 67 6c 6f 62 61 6c 20 68 65 61 64 65 72 20 66 69  global header fi
140d0 6c 65 20 2d 2d 20 61 20 68 65 61 64 65 72 20 66  le -- a header f
140e0 69 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ile that contain
140f0 73 20 61 6c 6c 0a 2a 2a 20 64 65 63 6c 61 72 61  s all.** declara
14100 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 20 66  tions.  If the f
14110 6f 72 45 78 70 6f 72 74 20 66 6c 61 67 20 69 73  orExport flag is
14120 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
14130 20 74 68 6f 73 65 0a 2a 2a 20 6f 62 6a 65 63 74   those.** object
14140 73 20 74 68 61 74 20 61 72 65 20 65 78 70 6f 72  s that are expor
14150 74 65 64 20 61 72 65 20 69 6e 63 6c 75 64 65 64  ted are included
14160 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 66   in the header f
14170 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
14180 6e 74 20 4d 61 6b 65 47 6c 6f 62 61 6c 48 65 61  nt MakeGlobalHea
14190 64 65 72 28 69 6e 74 20 66 6f 72 45 78 70 6f 72  der(int forExpor
141a0 74 29 7b 0a 20 20 47 65 6e 53 74 61 74 65 20 73  t){.  GenState s
141b0 53 74 61 74 65 3b 0a 20 20 53 74 72 69 6e 67 20  State;.  String 
141c0 6f 75 74 53 74 72 3b 0a 20 20 49 64 65 6e 74 54  outStr;.  IdentT
141d0 61 62 6c 65 20 69 6e 63 6c 75 64 65 54 61 62 6c  able includeTabl
141e0 65 3b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63 6c  e;.  Decl *pDecl
141f0 3b 0a 0a 20 20 73 53 74 61 74 65 2e 70 53 74 72  ;..  sState.pStr
14200 20 3d 20 26 6f 75 74 53 74 72 3b 0a 20 20 53 74   = &outStr;.  St
14210 72 69 6e 67 49 6e 69 74 28 26 6f 75 74 53 74 72  ringInit(&outStr
14220 29 3b 0a 20 20 2f 2a 20 53 74 72 69 6e 67 41 70  );.  /* StringAp
14230 70 65 6e 64 28 26 6f 75 74 53 74 72 2c 7a 54 6f  pend(&outStr,zTo
14240 70 4c 69 6e 65 2c 6e 54 6f 70 4c 69 6e 65 29 3b  pLine,nTopLine);
14250 20 2a 2f 0a 20 20 73 53 74 61 74 65 2e 70 54 61   */.  sState.pTa
14260 62 6c 65 20 3d 20 26 69 6e 63 6c 75 64 65 54 61  ble = &includeTa
14270 62 6c 65 3b 0a 20 20 6d 65 6d 73 65 74 28 26 69  ble;.  memset(&i
14280 6e 63 6c 75 64 65 54 61 62 6c 65 2c 30 2c 73 69  ncludeTable,0,si
14290 7a 65 6f 66 28 69 6e 63 6c 75 64 65 54 61 62 6c  zeof(includeTabl
142a0 65 29 29 3b 0a 20 20 73 53 74 61 74 65 2e 7a 49  e));.  sState.zI
142b0 66 20 3d 20 30 3b 0a 20 20 73 53 74 61 74 65 2e  f = 0;.  sState.
142c0 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73 53 74 61  nErr = 0;.  sSta
142d0 74 65 2e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22  te.zFilename = "
142e0 28 61 6c 6c 29 22 3b 0a 20 20 73 53 74 61 74 65  (all)";.  sState
142f0 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 52 65  .flags = 0;.  Re
14300 73 65 74 44 65 63 6c 46 6c 61 67 73 28 30 29 3b  setDeclFlags(0);
14310 0a 20 20 66 6f 72 28 70 44 65 63 6c 3d 70 44 65  .  for(pDecl=pDe
14320 63 6c 46 69 72 73 74 3b 20 70 44 65 63 6c 3b 20  clFirst; pDecl; 
14330 70 44 65 63 6c 3d 70 44 65 63 6c 2d 3e 70 4e 65  pDecl=pDecl->pNe
14340 78 74 29 7b 0a 20 20 20 20 69 66 28 20 66 6f 72  xt){.    if( for
14350 45 78 70 6f 72 74 3d 3d 30 20 7c 7c 20 44 65 63  Export==0 || Dec
14360 6c 48 61 73 50 72 6f 70 65 72 74 79 28 70 44 65  lHasProperty(pDe
14370 63 6c 2c 44 50 5f 45 78 70 6f 72 74 29 20 29 7b  cl,DP_Export) ){
14380 0a 20 20 20 20 20 20 44 65 63 6c 61 72 65 4f 62  .      DeclareOb
14390 6a 65 63 74 28 70 44 65 63 6c 2c 26 73 53 74 61  ject(pDecl,&sSta
143a0 74 65 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  te,1);.    }.  }
143b0 0a 20 20 43 68 61 6e 67 65 49 66 43 6f 6e 74 65  .  ChangeIfConte
143c0 78 74 28 30 2c 26 73 53 74 61 74 65 29 3b 0a 20  xt(0,&sState);. 
143d0 20 70 72 69 6e 74 66 28 22 25 73 22 2c 53 74 72   printf("%s",Str
143e0 69 6e 67 47 65 74 28 26 6f 75 74 53 74 72 29 29  ingGet(&outStr))
143f0 3b 0a 20 20 49 64 65 6e 74 54 61 62 6c 65 52 65  ;.  IdentTableRe
14400 73 65 74 28 26 69 6e 63 6c 75 64 65 54 61 62 6c  set(&includeTabl
14410 65 29 3b 0a 20 20 53 74 72 69 6e 67 52 65 73 65  e);.  StringRese
14420 74 28 26 6f 75 74 53 74 72 29 3b 0a 20 20 72 65  t(&outStr);.  re
14430 74 75 72 6e 20 30 3b 20 20 0a 7d 0a 0a 23 69 66  turn 0;  .}..#if
14440 64 65 66 20 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  def DEBUG./*.** 
14450 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
14460 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
14470 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  in the given str
14480 69 6e 67 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ing prior to the
14490 0a 2a 2a 20 66 69 72 73 74 20 6e 65 77 6c 69 6e  .** first newlin
144a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
144b0 20 43 6c 69 70 54 72 61 69 6c 69 6e 67 4e 65 77   ClipTrailingNew
144c0 6c 69 6e 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20  line(char *z){. 
144d0 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
144e0 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  z);.  while( n>0
144f0 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 5c 6e   && (z[n-1]=='\n
14500 27 20 7c 7c 20 7a 5b 6e 2d 31 5d 3d 3d 27 5c 72  ' || z[n-1]=='\r
14510 27 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72  ') ){ n--; }.  r
14520 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
14530 2a 20 44 75 6d 70 20 74 68 65 20 65 6e 74 69 72  * Dump the entir
14540 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c 69  e declaration li
14550 73 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  st for debugging
14560 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61   purposes.*/.sta
14570 74 69 63 20 76 6f 69 64 20 44 75 6d 70 44 65 63  tic void DumpDec
14580 6c 4c 69 73 74 28 76 6f 69 64 29 7b 0a 20 20 44  lList(void){.  D
14590 65 63 6c 20 2a 70 44 65 63 6c 3b 0a 0a 20 20 66  ecl *pDecl;..  f
145a0 6f 72 28 70 44 65 63 6c 20 3d 20 70 44 65 63 6c  or(pDecl = pDecl
145b0 46 69 72 73 74 3b 20 70 44 65 63 6c 3b 20 70 44  First; pDecl; pD
145c0 65 63 6c 3d 70 44 65 63 6c 2d 3e 70 4e 65 78 74  ecl=pDecl->pNext
145d0 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2a  ){.    printf("*
145e0 2a 2a 2a 20 25 73 20 66 72 6f 6d 20 66 69 6c 65  *** %s from file
145f0 20 25 73 20 2a 2a 2a 2a 5c 6e 22 2c 70 44 65 63   %s ****\n",pDec
14600 6c 2d 3e 7a 4e 61 6d 65 2c 70 44 65 63 6c 2d 3e  l->zName,pDecl->
14610 7a 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  zFile);.    if( 
14620 70 44 65 63 6c 2d 3e 7a 49 66 20 29 7b 0a 20 20  pDecl->zIf ){.  
14630 20 20 20 20 70 72 69 6e 74 66 28 22 49 66 3a 20      printf("If: 
14640 5b 25 2e 2a 73 5d 5c 6e 22 2c 43 6c 69 70 54 72  [%.*s]\n",ClipTr
14650 61 69 6c 69 6e 67 4e 65 77 6c 69 6e 65 28 70 44  ailingNewline(pD
14660 65 63 6c 2d 3e 7a 49 66 29 2c 70 44 65 63 6c 2d  ecl->zIf),pDecl-
14670 3e 7a 49 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >zIf);.    }.   
14680 20 69 66 28 20 70 44 65 63 6c 2d 3e 7a 46 77 64   if( pDecl->zFwd
14690 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66   ){.      printf
146a0 28 22 44 65 63 6c 3a 20 5b 25 2e 2a 73 5d 5c 6e  ("Decl: [%.*s]\n
146b0 22 2c 43 6c 69 70 54 72 61 69 6c 69 6e 67 4e 65  ",ClipTrailingNe
146c0 77 6c 69 6e 65 28 70 44 65 63 6c 2d 3e 7a 46 77  wline(pDecl->zFw
146d0 64 29 2c 70 44 65 63 6c 2d 3e 7a 46 77 64 29 3b  d),pDecl->zFwd);
146e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
146f0 44 65 63 6c 2d 3e 7a 44 65 63 6c 20 29 7b 0a 20  Decl->zDecl ){. 
14700 20 20 20 20 20 49 6e 73 65 72 74 45 78 74 72 61       InsertExtra
14710 44 65 63 6c 28 70 44 65 63 6c 29 3b 0a 20 20 20  Decl(pDecl);.   
14720 20 20 20 70 72 69 6e 74 66 28 22 44 65 66 3a 20     printf("Def: 
14730 5b 25 2e 2a 73 5d 5c 6e 22 2c 43 6c 69 70 54 72  [%.*s]\n",ClipTr
14740 61 69 6c 69 6e 67 4e 65 77 6c 69 6e 65 28 70 44  ailingNewline(pD
14750 65 63 6c 2d 3e 7a 44 65 63 6c 29 2c 70 44 65 63  ecl->zDecl),pDec
14760 6c 2d 3e 7a 44 65 63 6c 29 3b 0a 20 20 20 20 7d  l->zDecl);.    }
14770 0a 20 20 20 20 69 66 28 20 70 44 65 63 6c 2d 3e  .    if( pDecl->
14780 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 73  flags ){.      s
14790 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
147a0 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b         int mask;
147b0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 64  .        char *d
147c0 65 73 63 3b 0a 20 20 20 20 20 20 7d 20 66 6c 61  esc;.      } fla
147d0 67 53 65 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  gSet[] = {.     
147e0 20 20 20 7b 20 54 59 5f 43 6c 61 73 73 2c 20 20     { TY_Class,  
147f0 20 20 20 20 20 22 63 6c 61 73 73 22 20 7d 2c 0a       "class" },.
14800 20 20 20 20 20 20 20 20 7b 20 54 59 5f 45 6e 75          { TY_Enu
14810 6d 65 72 61 74 69 6f 6e 2c 20 22 65 6e 75 6d 22  meration, "enum"
14820 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 54 59   },.        { TY
14830 5f 53 74 72 75 63 74 75 72 65 2c 20 20 20 22 73  _Structure,   "s
14840 74 72 75 63 74 22 20 7d 2c 0a 20 20 20 20 20 20  truct" },.      
14850 20 20 7b 20 54 59 5f 55 6e 69 6f 6e 2c 20 20 20    { TY_Union,   
14860 20 20 20 20 22 75 6e 69 6f 6e 22 20 7d 2c 0a 20      "union" },. 
14870 20 20 20 20 20 20 20 7b 20 54 59 5f 56 61 72 69         { TY_Vari
14880 61 62 6c 65 2c 20 20 20 20 22 76 61 72 69 61 62  able,    "variab
14890 6c 65 22 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b  le" },.        {
148a0 20 54 59 5f 53 75 62 72 6f 75 74 69 6e 65 2c 20   TY_Subroutine, 
148b0 20 22 66 75 6e 63 74 69 6f 6e 22 20 7d 2c 0a 20   "function" },. 
148c0 20 20 20 20 20 20 20 7b 20 54 59 5f 54 79 70 65         { TY_Type
148d0 64 65 66 2c 20 20 20 20 20 22 74 79 70 65 64 65  def,     "typede
148e0 66 22 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  f" },.        { 
148f0 54 59 5f 4d 61 63 72 6f 2c 20 20 20 20 20 20 20  TY_Macro,       
14900 22 6d 61 63 72 6f 22 20 7d 2c 0a 20 20 20 20 20  "macro" },.     
14910 20 20 20 7b 20 44 50 5f 45 78 70 6f 72 74 2c 20     { DP_Export, 
14920 20 20 20 20 20 22 65 78 70 6f 72 74 22 20 7d 2c       "export" },
14930 0a 20 20 20 20 20 20 20 20 7b 20 44 50 5f 4c 6f  .        { DP_Lo
14940 63 61 6c 2c 20 20 20 20 20 20 20 22 6c 6f 63 61  cal,       "loca
14950 6c 22 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  l" },.        { 
14960 44 50 5f 43 70 6c 75 73 70 6c 75 73 2c 20 20 20  DP_Cplusplus,   
14970 22 43 2b 2b 22 20 7d 2c 0a 20 20 20 20 20 20 7d  "C++" },.      }
14980 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
14990 20 20 20 20 20 70 72 69 6e 74 66 28 22 66 6c 61       printf("fla
149a0 67 73 3a 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  gs:");.      for
149b0 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 66  (i=0; i<sizeof(f
149c0 6c 61 67 53 65 74 29 2f 73 69 7a 65 6f 66 28 66  lagSet)/sizeof(f
149d0 6c 61 67 53 65 74 5b 30 5d 29 3b 20 69 2b 2b 29  lagSet[0]); i++)
149e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  {.        if( fl
149f0 61 67 53 65 74 5b 69 5d 2e 6d 61 73 6b 20 26 20  agSet[i].mask & 
14a00 70 44 65 63 6c 2d 3e 66 6c 61 67 73 20 29 7b 0a  pDecl->flags ){.
14a10 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
14a20 28 22 20 25 73 22 2c 20 66 6c 61 67 53 65 74 5b  (" %s", flagSet[
14a30 69 5d 2e 64 65 73 63 29 3b 0a 20 20 20 20 20 20  i].desc);.      
14a40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14a50 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a    printf("\n");.
14a60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44      }.    if( pD
14a70 65 63 6c 2d 3e 70 49 6e 63 6c 75 64 65 20 29 7b  ecl->pInclude ){
14a80 0a 20 20 20 20 20 20 49 6e 63 6c 75 64 65 20 2a  .      Include *
14a90 70 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  p;.      printf(
14aa0 22 69 6e 63 6c 75 64 65 73 3a 22 29 3b 0a 20 20  "includes:");.  
14ab0 20 20 20 20 66 6f 72 28 70 3d 70 44 65 63 6c 2d      for(p=pDecl-
14ac0 3e 70 49 6e 63 6c 75 64 65 3b 20 70 3b 20 70 3d  >pInclude; p; p=
14ad0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  p->pNext){.     
14ae0 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c     printf(" %s",
14af0 70 2d 3e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20  p->zFile);.     
14b00 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28   }.      printf(
14b10 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  "\n");.    }.  }
14b20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
14b30 20 57 68 65 6e 20 74 68 65 20 22 2d 64 6f 63 22   When the "-doc"
14b40 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
14b50 74 69 6f 6e 20 69 73 20 75 73 65 64 2c 20 74 68  tion is used, th
14b60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
14b70 6c 6c 65 64 0a 2a 2a 20 74 6f 20 70 72 69 6e 74  lled.** to print
14b80 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
14b90 62 61 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  base information
14ba0 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74   to standard out
14bb0 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  put..*/.static v
14bc0 6f 69 64 20 44 6f 63 75 6d 65 6e 74 61 74 69 6f  oid Documentatio
14bd0 6e 44 75 6d 70 28 76 6f 69 64 29 7b 0a 20 20 44  nDump(void){.  D
14be0 65 63 6c 20 2a 70 44 65 63 6c 3b 0a 20 20 73 74  ecl *pDecl;.  st
14bf0 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20  atic struct {.  
14c00 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 20 20    int mask;.    
14c10 63 68 61 72 20 66 6c 61 67 3b 0a 20 20 7d 20 66  char flag;.  } f
14c20 6c 61 67 53 65 74 5b 5d 20 3d 20 7b 0a 20 20 20  lagSet[] = {.   
14c30 20 7b 20 54 59 5f 43 6c 61 73 73 2c 20 20 20 20   { TY_Class,    
14c40 20 20 20 27 63 27 20 7d 2c 0a 20 20 20 20 7b 20     'c' },.    { 
14c50 54 59 5f 45 6e 75 6d 65 72 61 74 69 6f 6e 2c 20  TY_Enumeration, 
14c60 27 65 27 20 7d 2c 0a 20 20 20 20 7b 20 54 59 5f  'e' },.    { TY_
14c70 53 74 72 75 63 74 75 72 65 2c 20 20 20 27 73 27  Structure,   's'
14c80 20 7d 2c 0a 20 20 20 20 7b 20 54 59 5f 55 6e 69   },.    { TY_Uni
14c90 6f 6e 2c 20 20 20 20 20 20 20 27 75 27 20 7d 2c  on,       'u' },
14ca0 0a 20 20 20 20 7b 20 54 59 5f 56 61 72 69 61 62  .    { TY_Variab
14cb0 6c 65 2c 20 20 20 20 27 76 27 20 7d 2c 0a 20 20  le,    'v' },.  
14cc0 20 20 7b 20 54 59 5f 53 75 62 72 6f 75 74 69 6e    { TY_Subroutin
14cd0 65 2c 20 20 27 66 27 20 7d 2c 0a 20 20 20 20 7b  e,  'f' },.    {
14ce0 20 54 59 5f 54 79 70 65 64 65 66 2c 20 20 20 20   TY_Typedef,    
14cf0 20 27 74 27 20 7d 2c 0a 20 20 20 20 7b 20 54 59   't' },.    { TY
14d00 5f 4d 61 63 72 6f 2c 20 20 20 20 20 20 20 27 6d  _Macro,       'm
14d10 27 20 7d 2c 0a 20 20 20 20 7b 20 44 50 5f 45 78  ' },.    { DP_Ex
14d20 70 6f 72 74 2c 20 20 20 20 20 20 27 78 27 20 7d  port,      'x' }
14d30 2c 0a 20 20 20 20 7b 20 44 50 5f 4c 6f 63 61 6c  ,.    { DP_Local
14d40 2c 20 20 20 20 20 20 20 27 6c 27 20 7d 2c 0a 20  ,       'l' },. 
14d50 20 20 20 7b 20 44 50 5f 43 70 6c 75 73 70 6c 75     { DP_Cplusplu
14d60 73 2c 20 20 20 27 2b 27 20 7d 2c 0a 20 20 7d 3b  s,   '+' },.  };
14d70 0a 0a 20 20 66 6f 72 28 70 44 65 63 6c 20 3d 20  ..  for(pDecl = 
14d80 70 44 65 63 6c 46 69 72 73 74 3b 20 70 44 65 63  pDeclFirst; pDec
14d90 6c 3b 20 70 44 65 63 6c 3d 70 44 65 63 6c 2d 3e  l; pDecl=pDecl->
14da0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
14db0 69 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 61 62 65  i;.    int nLabe
14dc0 6c 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  l = 0;.    char 
14dd0 2a 7a 44 65 63 6c 3b 0a 20 20 20 20 63 68 61 72  *zDecl;.    char
14de0 20 7a 4c 61 62 65 6c 5b 35 30 5d 3b 0a 20 20 20   zLabel[50];.   
14df0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
14e00 6f 66 28 66 6c 61 67 53 65 74 29 2f 73 69 7a 65  of(flagSet)/size
14e10 6f 66 28 66 6c 61 67 53 65 74 5b 30 5d 29 3b 20  of(flagSet[0]); 
14e20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
14e30 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28  DeclHasProperty(
14e40 70 44 65 63 6c 2c 66 6c 61 67 53 65 74 5b 69 5d  pDecl,flagSet[i]
14e50 2e 6d 61 73 6b 29 20 29 7b 0a 20 20 20 20 20 20  .mask) ){.      
14e60 20 20 7a 4c 61 62 65 6c 5b 6e 4c 61 62 65 6c 2b    zLabel[nLabel+
14e70 2b 5d 20 3d 20 66 6c 61 67 53 65 74 5b 69 5d 2e  +] = flagSet[i].
14e80 66 6c 61 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  flag;.      }.  
14e90 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 61 62    }.    if( nLab
14ea0 65 6c 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  el==0 ) continue
14eb0 3b 0a 20 20 20 20 7a 4c 61 62 65 6c 5b 6e 4c 61  ;.    zLabel[nLa
14ec0 62 65 6c 5d 20 3d 20 30 3b 0a 20 20 20 20 49 6e  bel] = 0;.    In
14ed0 73 65 72 74 45 78 74 72 61 44 65 63 6c 28 70 44  sertExtraDecl(pD
14ee0 65 63 6c 29 3b 0a 20 20 20 20 7a 44 65 63 6c 20  ecl);.    zDecl 
14ef0 3d 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 3b 0a  = pDecl->zDecl;.
14f00 20 20 20 20 69 66 28 20 7a 44 65 63 6c 3d 3d 30      if( zDecl==0
14f10 20 29 20 7a 44 65 63 6c 20 3d 20 70 44 65 63 6c   ) zDecl = pDecl
14f20 2d 3e 7a 46 77 64 3b 0a 20 20 20 20 70 72 69 6e  ->zFwd;.    prin
14f30 74 66 28 22 25 73 20 25 73 20 25 73 20 25 64 20  tf("%s %s %s %d 
14f40 25 64 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %d %d %d %d %d\n
14f50 22 2c 0a 20 20 20 20 20 20 20 70 44 65 63 6c 2d  ",.       pDecl-
14f60 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 7a  >zName,.       z
14f70 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 70 44  Label,.       pD
14f80 65 63 6c 2d 3e 7a 46 69 6c 65 2c 0a 20 20 20 20  ecl->zFile,.    
14f90 20 20 20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65     pDecl->pComme
14fa0 6e 74 20 3f 20 28 69 6e 74 29 70 44 65 63 6c 2d  nt ? (int)pDecl-
14fb0 3e 70 43 6f 6d 6d 65 6e 74 2f 73 69 7a 65 6f 66  >pComment/sizeof
14fc0 28 54 6f 6b 65 6e 29 20 3a 20 30 2c 0a 20 20 20  (Token) : 0,.   
14fd0 20 20 20 20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d      pDecl->pComm
14fe0 65 6e 74 20 3f 20 70 44 65 63 6c 2d 3e 70 43 6f  ent ? pDecl->pCo
14ff0 6d 6d 65 6e 74 2d 3e 6e 54 65 78 74 2b 31 20 3a  mment->nText+1 :
15000 20 30 2c 0a 20 20 20 20 20 20 20 70 44 65 63 6c   0,.       pDecl
15010 2d 3e 7a 49 66 20 3f 20 73 74 72 6c 65 6e 28 70  ->zIf ? strlen(p
15020 44 65 63 6c 2d 3e 7a 49 66 29 2b 31 20 3a 20 30  Decl->zIf)+1 : 0
15030 2c 0a 20 20 20 20 20 20 20 7a 44 65 63 6c 20 3f  ,.       zDecl ?
15040 20 73 74 72 6c 65 6e 28 7a 44 65 63 6c 29 20 3a   strlen(zDecl) :
15050 20 30 2c 0a 20 20 20 20 20 20 20 70 44 65 63 6c   0,.       pDecl
15060 2d 3e 70 43 6f 6d 6d 65 6e 74 20 3f 20 70 44 65  ->pComment ? pDe
15070 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 2d 3e 6e 4c  cl->pComment->nL
15080 69 6e 65 20 3a 20 30 2c 0a 20 20 20 20 20 20 20  ine : 0,.       
15090 70 44 65 63 6c 2d 3e 74 6f 6b 65 6e 43 6f 64 65  pDecl->tokenCode
150a0 2e 6e 54 65 78 74 20 3f 20 70 44 65 63 6c 2d 3e  .nText ? pDecl->
150b0 74 6f 6b 65 6e 43 6f 64 65 2e 6e 54 65 78 74 2b  tokenCode.nText+
150c0 31 20 3a 20 30 0a 20 20 20 20 29 3b 0a 20 20 20  1 : 0.    );.   
150d0 20 69 66 28 20 70 44 65 63 6c 2d 3e 70 43 6f 6d   if( pDecl->pCom
150e0 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 72  ment ){.      pr
150f0 69 6e 74 66 28 22 25 2e 2a 73 5c 6e 22 2c 70 44  intf("%.*s\n",pD
15100 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 2d 3e 6e  ecl->pComment->n
15110 54 65 78 74 2c 20 70 44 65 63 6c 2d 3e 70 43 6f  Text, pDecl->pCo
15120 6d 6d 65 6e 74 2d 3e 7a 54 65 78 74 29 3b 0a 20  mment->zText);. 
15130 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 65     }.    if( pDe
15140 63 6c 2d 3e 7a 49 66 20 29 7b 0a 20 20 20 20 20  cl->zIf ){.     
15150 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 70   printf("%s\n",p
15160 44 65 63 6c 2d 3e 7a 49 66 29 3b 0a 20 20 20 20  Decl->zIf);.    
15170 7d 0a 20 20 20 20 69 66 28 20 7a 44 65 63 6c 20  }.    if( zDecl 
15180 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
15190 22 25 73 22 2c 7a 44 65 63 6c 29 3b 0a 20 20 20  "%s",zDecl);.   
151a0 20 7d 0a 20 20 20 20 69 66 28 20 70 44 65 63 6c   }.    if( pDecl
151b0 2d 3e 74 6f 6b 65 6e 43 6f 64 65 2e 6e 54 65 78  ->tokenCode.nTex
151c0 74 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74  t ){.      print
151d0 66 28 22 25 2e 2a 73 5c 6e 22 2c 70 44 65 63 6c  f("%.*s\n",pDecl
151e0 2d 3e 74 6f 6b 65 6e 43 6f 64 65 2e 6e 54 65 78  ->tokenCode.nTex
151f0 74 2c 20 70 44 65 63 6c 2d 3e 74 6f 6b 65 6e 43  t, pDecl->tokenC
15200 6f 64 65 2e 7a 54 65 78 74 29 3b 0a 20 20 20 20  ode.zText);.    
15210 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
15220 69 76 65 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74  iven the complet
15230 65 20 74 65 78 74 20 6f 66 20 61 6e 20 69 6e 70  e text of an inp
15240 75 74 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  ut file, this ro
15250 75 74 69 6e 65 20 70 72 69 6e 74 73 20 61 0a 2a  utine prints a.*
15260 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  * documentation 
15270 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 68  record for the h
15280 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 74  eader comment at
15290 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
152a0 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 28 69  f the.** file (i
152b0 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61  f the file has a
152c0 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 2e   header comment.
152d0 29 0a 2a 2f 0a 76 6f 69 64 20 50 72 69 6e 74 4d  ).*/.void PrintM
152e0 6f 64 75 6c 65 52 65 63 6f 72 64 28 63 6f 6e 73  oduleRecord(cons
152f0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 63  t char *zFile, c
15300 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
15310 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  name){.  int i;.
15320 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 64 64    static int add
15330 72 20 3d 20 35 3b 0a 20 20 77 68 69 6c 65 28 20  r = 5;.  while( 
15340 69 73 73 70 61 63 65 28 2a 7a 46 69 6c 65 29 20  isspace(*zFile) 
15350 29 7b 20 7a 46 69 6c 65 2b 2b 3b 20 7d 0a 20 20  ){ zFile++; }.  
15360 69 66 28 20 2a 7a 46 69 6c 65 21 3d 27 2f 27 20  if( *zFile!='/' 
15370 7c 7c 20 7a 46 69 6c 65 5b 31 5d 21 3d 27 2a 27  || zFile[1]!='*'
15380 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
15390 28 69 3d 32 3b 20 7a 46 69 6c 65 5b 69 5d 20 26  (i=2; zFile[i] &
153a0 26 20 28 7a 46 69 6c 65 5b 69 2d 31 5d 21 3d 27  & (zFile[i-1]!='
153b0 2f 27 20 7c 7c 20 7a 46 69 6c 65 5b 69 2d 32 5d  /' || zFile[i-2]
153c0 21 3d 27 2a 27 29 3b 20 69 2b 2b 29 7b 7d 0a 20  !='*'); i++){}. 
153d0 20 69 66 28 20 7a 46 69 6c 65 5b 69 5d 3d 3d 30   if( zFile[i]==0
153e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 72 69   ) return;.  pri
153f0 6e 74 66 28 22 25 73 20 4d 20 25 73 20 25 64 20  ntf("%s M %s %d 
15400 25 64 20 30 20 30 20 30 20 30 5c 6e 25 2e 2a 73  %d 0 0 0 0\n%.*s
15410 5c 6e 22 2c 0a 20 20 20 20 7a 46 69 6c 65 6e 61  \n",.    zFilena
15420 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 61  me, zFilename, a
15430 64 64 72 2c 20 69 2b 31 2c 20 69 2c 20 7a 46 69  ddr, i+1, i, zFi
15440 6c 65 29 3b 0a 20 20 61 64 64 72 20 2b 3d 20 34  le);.  addr += 4
15450 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ;.}.../*.** Give
15460 6e 20 61 6e 20 69 6e 70 75 74 20 61 72 67 75 6d  n an input argum
15470 65 6e 74 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ent to the progr
15480 61 6d 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20  am, construct a 
15490 6e 65 77 20 49 6e 46 69 6c 65 0a 2a 2a 20 6f 62  new InFile.** ob
154a0 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
154b0 49 6e 46 69 6c 65 20 2a 43 72 65 61 74 65 49 6e  InFile *CreateIn
154c0 46 69 6c 65 28 63 68 61 72 20 2a 7a 41 72 67 2c  File(char *zArg,
154d0 20 69 6e 74 20 2a 70 6e 45 72 72 29 7b 0a 20 20   int *pnErr){.  
154e0 69 6e 74 20 6e 53 72 63 3b 0a 20 20 63 68 61 72  int nSrc;.  char
154f0 20 2a 7a 53 72 63 3b 0a 20 20 49 6e 46 69 6c 65   *zSrc;.  InFile
15500 20 2a 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 69   *pFile;.  int i
15510 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 65  ;..  /* .  ** Ge
15520 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
15530 65 20 69 6e 70 75 74 20 66 69 6c 65 20 74 6f 20  e input file to 
15540 62 65 20 73 63 61 6e 6e 65 64 0a 20 20 2a 2f 0a  be scanned.  */.
15550 20 20 7a 53 72 63 20 3d 20 7a 41 72 67 3b 0a 20    zSrc = zArg;. 
15560 20 66 6f 72 28 6e 53 72 63 3d 30 3b 20 7a 53 72   for(nSrc=0; zSr
15570 63 5b 6e 53 72 63 5d 20 26 26 20 7a 41 72 67 5b  c[nSrc] && zArg[
15580 6e 53 72 63 5d 21 3d 27 3a 27 3b 20 6e 53 72 63  nSrc]!=':'; nSrc
15590 2b 2b 29 7b 7d 0a 20 20 70 46 69 6c 65 20 3d 20  ++){}.  pFile = 
155a0 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  SafeMalloc( size
155b0 6f 66 28 49 6e 46 69 6c 65 29 20 29 3b 0a 20 20  of(InFile) );.  
155c0 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 30 2c 73  memset(pFile,0,s
155d0 69 7a 65 6f 66 28 49 6e 46 69 6c 65 29 29 3b 0a  izeof(InFile));.
155e0 20 20 70 46 69 6c 65 2d 3e 7a 53 72 63 20 3d 20    pFile->zSrc = 
155f0 53 74 72 44 75 70 28 7a 53 72 63 2c 6e 53 72 63  StrDup(zSrc,nSrc
15600 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
15610 6f 75 74 20 69 66 20 77 65 20 61 72 65 20 64 65  out if we are de
15620 61 6c 69 6e 67 20 77 69 74 68 20 43 20 6f 72 20  aling with C or 
15630 43 2b 2b 20 63 6f 64 65 2e 20 20 41 73 73 75 6d  C++ code.  Assum
15640 65 20 61 6e 79 0a 20 20 2a 2a 20 66 69 6c 65 20  e any.  ** file 
15650 77 69 74 68 20 22 2e 63 22 20 6f 72 20 22 2e 68  with ".c" or ".h
15660 22 20 69 73 20 43 20 63 6f 64 65 20 61 6e 64 20  " is C code and 
15670 61 6c 6c 20 65 6c 73 65 20 69 73 20 43 2b 2b 2e  all else is C++.
15680 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 53 72 63  .  */.  if( nSrc
15690 3e 32 20 26 26 20 7a 53 72 63 5b 6e 53 72 63 2d  >2 && zSrc[nSrc-
156a0 32 5d 3d 3d 27 2e 27 20 26 26 20 28 7a 53 72 63  2]=='.' && (zSrc
156b0 5b 6e 53 72 63 2d 31 5d 3d 3d 27 63 27 20 7c 7c  [nSrc-1]=='c' ||
156c0 20 7a 53 72 63 5b 6e 53 72 63 2d 31 5d 3d 3d 27   zSrc[nSrc-1]=='
156d0 68 27 29 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  h')){.    pFile-
156e0 3e 66 6c 61 67 73 20 26 3d 20 7e 44 50 5f 43 70  >flags &= ~DP_Cp
156f0 6c 75 73 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65  lusplus;.  }else
15700 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 66 6c 61  {.    pFile->fla
15710 67 73 20 7c 3d 20 44 50 5f 43 70 6c 75 73 70 6c  gs |= DP_Cpluspl
15720 75 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  us;.  }..  /*.  
15730 2a 2a 20 49 66 20 61 20 73 65 70 61 72 61 74 65  ** If a separate
15740 20 68 65 61 64 65 72 20 66 69 6c 65 20 69 73 20   header file is 
15750 73 70 65 63 69 66 69 65 64 2c 20 75 73 65 20 69  specified, use i
15760 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53 72  t.  */.  if( zSr
15770 63 5b 6e 53 72 63 5d 3d 3d 27 3a 27 20 29 7b 0a  c[nSrc]==':' ){.
15780 20 20 20 20 69 6e 74 20 6e 48 64 72 3b 0a 20 20      int nHdr;.  
15790 20 20 63 68 61 72 20 2a 7a 48 64 72 3b 0a 20 20    char *zHdr;.  
157a0 20 20 7a 48 64 72 20 3d 20 26 7a 53 72 63 5b 6e    zHdr = &zSrc[n
157b0 53 72 63 2b 31 5d 3b 0a 20 20 20 20 66 6f 72 28  Src+1];.    for(
157c0 6e 48 64 72 3d 30 3b 20 7a 48 64 72 5b 6e 48 64  nHdr=0; zHdr[nHd
157d0 72 5d 20 26 26 20 7a 48 64 72 5b 6e 48 64 72 5d  r] && zHdr[nHdr]
157e0 21 3d 27 3a 27 3b 20 6e 48 64 72 2b 2b 29 7b 7d  !=':'; nHdr++){}
157f0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 48 64 72  .    pFile->zHdr
15800 20 3d 20 53 74 72 44 75 70 28 7a 48 64 72 2c 6e   = StrDup(zHdr,n
15810 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Hdr);.  }..  /* 
15820 4c 6f 6f 6b 20 66 6f 72 20 61 6e 79 20 27 63 27  Look for any 'c'
15830 20 6f 72 20 27 43 27 20 69 6e 20 74 68 65 20 73   or 'C' in the s
15840 75 66 66 69 78 20 6f 66 20 74 68 65 20 66 69 6c  uffix of the fil
15850 65 20 6e 61 6d 65 20 61 6e 64 20 63 68 61 6e 67  e name and chang
15860 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61 72  e.  ** that char
15870 61 63 74 65 72 20 74 6f 20 27 68 27 20 6f 72 20  acter to 'h' or 
15880 27 48 27 20 72 65 73 70 65 63 74 69 76 65 6c 79  'H' respectively
15890 2e 20 20 49 66 20 6e 6f 20 27 63 27 20 6f 72 20  .  If no 'c' or 
158a0 27 43 27 20 69 73 20 66 6f 75 6e 64 2c 0a 20 20  'C' is found,.  
158b0 2a 2a 20 74 68 65 6e 20 61 73 73 75 6d 65 20 77  ** then assume w
158c0 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
158d0 74 68 20 61 20 68 65 61 64 65 72 2e 0a 20 20 2a  th a header..  *
158e0 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e  /.  else{.    in
158f0 74 20 66 6f 75 6e 64 43 20 3d 20 30 3b 0a 20 20  t foundC = 0;.  
15900 20 20 70 46 69 6c 65 2d 3e 7a 48 64 72 20 3d 20    pFile->zHdr = 
15910 53 74 72 44 75 70 28 7a 53 72 63 2c 6e 53 72 63  StrDup(zSrc,nSrc
15920 29 3b 0a 20 20 20 20 66 6f 72 28 69 20 3d 20 6e  );.    for(i = n
15930 53 72 63 2d 31 3b 20 69 3e 30 20 26 26 20 70 46  Src-1; i>0 && pF
15940 69 6c 65 2d 3e 7a 48 64 72 5b 69 5d 21 3d 27 2e  ile->zHdr[i]!='.
15950 27 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69  '; i--){.      i
15960 66 28 20 70 46 69 6c 65 2d 3e 7a 48 64 72 5b 69  f( pFile->zHdr[i
15970 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20 20 20  ]=='c' ){.      
15980 20 20 66 6f 75 6e 64 43 20 3d 20 31 3b 0a 20 20    foundC = 1;.  
15990 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 7a 48 64        pFile->zHd
159a0 72 5b 69 5d 20 3d 20 27 68 27 3b 0a 20 20 20 20  r[i] = 'h';.    
159b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 46 69 6c    }else if( pFil
159c0 65 2d 3e 7a 48 64 72 5b 69 5d 3d 3d 27 43 27 20  e->zHdr[i]=='C' 
159d0 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 75 6e 64  ){.        found
159e0 43 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  C = 1;.        p
159f0 46 69 6c 65 2d 3e 7a 48 64 72 5b 69 5d 20 3d 20  File->zHdr[i] = 
15a00 27 48 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  'H';.      }.   
15a10 20 7d 0a 20 20 20 20 69 66 28 20 21 66 6f 75 6e   }.    if( !foun
15a20 64 43 20 29 7b 0a 20 20 20 20 20 20 53 61 66 65  dC ){.      Safe
15a30 46 72 65 65 28 70 46 69 6c 65 2d 3e 7a 48 64 72  Free(pFile->zHdr
15a40 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
15a50 7a 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  zHdr = 0;.    }.
15a60 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
15a70 66 20 70 46 69 6c 65 2d 3e 7a 53 72 63 20 63 6f  f pFile->zSrc co
15a80 6e 74 61 69 6e 73 20 6e 6f 20 27 63 27 20 6f 72  ntains no 'c' or
15a90 20 27 43 27 20 69 6e 20 69 74 73 20 65 78 74 65   'C' in its exte
15aa0 6e 73 69 6f 6e 2c 20 69 74 0a 20 20 2a 2a 20 6d  nsion, it.  ** m
15ab0 75 73 74 20 62 65 20 61 20 68 65 61 64 65 72 20  ust be a header 
15ac0 66 69 6c 65 2e 20 20 20 49 6e 20 74 68 61 74 20  file.   In that 
15ad0 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  case, we need to
15ae0 20 73 65 74 20 74 68 65 20 0a 20 20 2a 2a 20 50   set the .  ** P
15af0 53 5f 49 6e 74 65 72 66 61 63 65 20 66 6c 61 67  S_Interface flag
15b00 2e 0a 20 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e  ..  */.  pFile->
15b10 66 6c 61 67 73 20 7c 3d 20 50 53 5f 49 6e 74 65  flags |= PS_Inte
15b20 72 66 61 63 65 3b 0a 20 20 66 6f 72 28 69 3d 6e  rface;.  for(i=n
15b30 53 72 63 2d 31 3b 20 69 3e 30 20 26 26 20 7a 53  Src-1; i>0 && zS
15b40 72 63 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29  rc[i]!='.'; i--)
15b50 7b 0a 20 20 20 20 69 66 28 20 7a 53 72 63 5b 69  {.    if( zSrc[i
15b60 5d 3d 3d 27 63 27 20 7c 7c 20 7a 53 72 63 5b 69  ]=='c' || zSrc[i
15b70 5d 3d 3d 27 43 27 20 29 7b 0a 20 20 20 20 20 20  ]=='C' ){.      
15b80 70 46 69 6c 65 2d 3e 66 6c 61 67 73 20 26 3d 20  pFile->flags &= 
15b90 7e 50 53 5f 49 6e 74 65 72 66 61 63 65 3b 0a 20  ~PS_Interface;. 
15ba0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15bb0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65  }.  }..  /* Done
15bc0 21 20 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ! .  */.  return
15bd0 20 70 46 69 6c 65 3b 0a 7d 0a 0a 2f 2a 20 4d 53   pFile;.}../* MS
15be0 2d 57 69 6e 64 6f 77 73 20 61 6e 64 20 4d 53 2d  -Windows and MS-
15bf0 44 4f 53 20 62 6f 74 68 20 68 61 76 65 20 74 68  DOS both have th
15c00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 72 69  e following seri
15c10 6f 75 73 20 4f 53 20 62 75 67 3a 20 20 74 68 65  ous OS bug:  the
15c20 0a 2a 2a 20 6c 65 6e 67 74 68 20 6f 66 20 61 20  .** length of a 
15c30 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 69 73 20  command line is 
15c40 73 65 76 65 72 65 6c 79 20 72 65 73 74 72 69 63  severely restric
15c50 74 65 64 2e 20 20 42 75 74 20 74 68 69 73 20 70  ted.  But this p
15c60 72 6f 67 72 61 6d 0a 2a 2a 20 6f 63 63 61 73 69  rogram.** occasi
15c70 6f 6e 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20  onally requires 
15c80 6c 6f 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  long command lin
15c90 65 73 2e 20 20 48 65 6e 63 65 20 74 68 65 20 66  es.  Hence the f
15ca0 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 77 6f 72 6b  ollowing.** work
15cb0 20 61 72 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49   around..**.** I
15cc0 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
15cd0 20 22 2d 66 20 46 49 4c 45 4e 41 4d 45 22 20 61   "-f FILENAME" a
15ce0 70 70 65 61 72 20 61 6e 79 77 68 65 72 65 20 6f  ppear anywhere o
15cf0 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
15d00 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ne,.** then the 
15d10 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 73 63  named file is sc
15d20 61 6e 6e 65 64 20 66 6f 72 20 61 64 64 69 74 69  anned for additi
15d30 6f 6e 61 6c 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  onal command lin
15d40 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20  e arguments..** 
15d50 54 68 65 73 65 20 61 72 67 75 6d 65 6e 74 73 20  These arguments 
15d60 61 72 65 20 73 75 62 73 74 69 74 75 74 65 64 20  are substituted 
15d70 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  in place of the 
15d80 22 46 49 4c 45 4e 41 4d 45 22 20 61 72 67 75 6d  "FILENAME" argum
15d90 65 6e 74 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ent.** in the or
15da0 69 67 69 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20  iginal argument 
15db0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  list..**.** This
15dc0 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
15dd0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
15de0 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
15df0 20 74 68 65 20 22 2d 66 22 0a 2a 2a 20 70 61 72   the "-f".** par
15e00 61 6d 65 74 65 72 20 69 6e 20 74 68 65 20 61 72  ameter in the ar
15e10 67 76 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65  gv[] array.  The
15e20 20 61 72 67 63 20 61 6e 64 20 61 72 67 76 20 61   argc and argv a
15e30 72 65 20 70 61 73 73 65 64 20 62 79 0a 2a 2a 20  re passed by.** 
15e40 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20  pointer so that 
15e50 74 68 65 79 20 63 61 6e 20 62 65 20 63 68 61 6e  they can be chan
15e60 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 69  ged..**.** Parsi
15e70 6e 67 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  ng of the parame
15e80 74 65 72 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ters in the file
15e90 20 69 73 20 76 65 72 79 20 73 69 6d 70 6c 65 2e   is very simple.
15ea0 20 20 50 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20    Parameters.** 
15eb0 63 61 6e 20 62 65 20 73 65 70 61 72 61 74 65 64  can be separated
15ec0 20 62 79 20 61 6e 79 20 61 6d 6f 75 6e 74 20 6f   by any amount o
15ed0 66 20 77 68 69 74 65 2d 73 70 61 63 65 20 28 69  f white-space (i
15ee0 6e 63 6c 75 64 69 6e 67 20 6e 65 77 6c 69 6e 65  ncluding newline
15ef0 73 0a 2a 2a 20 61 6e 64 20 63 61 72 72 69 61 67  s.** and carriag
15f00 65 20 72 65 74 75 72 6e 73 2e 29 20 20 54 68 65  e returns.)  The
15f10 72 65 20 61 72 65 20 6e 6f 77 20 71 75 6f 74 69  re are now quoti
15f20 6e 67 20 63 68 61 72 61 63 74 65 72 73 20 6f 66  ng characters of
15f30 20 61 6e 79 0a 2a 2a 20 6b 69 6e 64 2e 20 20 54   any.** kind.  T
15f40 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 74  he length of a t
15f50 6f 6b 65 6e 20 69 73 20 6c 69 6d 69 74 65 64 20  oken is limited 
15f60 74 6f 20 61 62 6f 75 74 20 31 30 30 30 20 63 68  to about 1000 ch
15f70 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
15f80 74 69 63 20 76 6f 69 64 20 41 64 64 50 61 72 61  tic void AddPara
15f90 6d 65 74 65 72 73 28 69 6e 74 20 69 6e 64 65 78  meters(int index
15fa0 2c 20 69 6e 74 20 2a 70 41 72 67 63 2c 20 63 68  , int *pArgc, ch
15fb0 61 72 20 2a 2a 2a 70 41 72 67 76 29 7b 0a 20 20  ar ***pArgv){.  
15fc0 69 6e 74 20 61 72 67 63 20 3d 20 2a 70 41 72 67  int argc = *pArg
15fd0 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  c;      /* The o
15fe0 72 69 67 69 6e 61 6c 20 61 72 67 63 20 76 61 6c  riginal argc val
15ff0 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ue */.  char **a
16000 72 67 76 20 3d 20 2a 70 41 72 67 76 3b 20 20 20  rgv = *pArgv;   
16010 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  /* The original 
16020 61 72 67 76 20 76 61 6c 75 65 20 2a 2f 0a 20 20  argv value */.  
16030 69 6e 74 20 6e 65 77 41 72 67 63 3b 20 20 20 20  int newArgc;    
16040 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
16050 20 66 6f 72 20 61 72 67 63 20 61 66 74 65 72 20   for argc after 
16060 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 61 72  inserting new ar
16070 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
16080 72 20 2a 2a 7a 4e 65 77 20 3d 20 30 3b 20 20 20  r **zNew = 0;   
16090 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
160a0 61 72 67 76 20 61 66 74 65 72 20 74 68 69 73 20  argv after this 
160b0 72 6f 75 74 69 6e 65 20 69 73 20 64 6f 6e 65 20  routine is done 
160c0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
160d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
160e0 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75  Name of the inpu
160f0 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  t file */.  int 
16100 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  nNew = 0;       
16110 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16120 20 6e 65 77 20 65 6e 74 72 69 65 73 20 69 6e 20   new entries in 
16130 74 68 65 20 61 72 67 76 5b 5d 20 66 69 6c 65 20  the argv[] file 
16140 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  */.  int nAlloc 
16150 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
16160 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  Space allocated 
16170 66 6f 72 20 7a 4e 65 77 5b 5d 20 2a 2f 0a 20 20  for zNew[] */.  
16180 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
16190 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
161a0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
161b0 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
161c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
161d0 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
161e0 61 20 6e 65 77 20 61 72 67 75 6d 65 6e 74 20 2a  a new argument *
161f0 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20  /.  int c;      
16200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16210 65 78 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ext character of
16220 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20   input */.  int 
16230 73 74 61 72 74 4f 66 4c 69 6e 65 20 3d 20 31 3b  startOfLine = 1;
16240 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
16250 65 20 61 72 65 20 77 68 65 72 65 20 27 23 27 20  e are where '#' 
16260 63 61 6e 20 73 74 61 72 74 20 61 20 63 6f 6d 6d  can start a comm
16270 65 6e 74 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69  ent */.  FILE *i
16280 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
16290 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69   /* The input fi
162a0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 7a 42 75  le */.  char zBu
162b0 66 5b 31 30 30 30 5d 3b 20 20 20 20 20 20 20 20  f[1000];        
162c0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 61 72 67 75  /* A single argu
162d0 6d 65 6e 74 20 69 73 20 61 63 63 75 6d 75 6c 61  ment is accumula
162e0 74 65 64 20 68 65 72 65 20 2a 2f 0a 0a 20 20 69  ted here */..  i
162f0 66 28 20 69 6e 64 65 78 2b 31 3d 3d 61 72 67 63  f( index+1==argc
16300 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 46 69   ) return;.  zFi
16310 6c 65 20 3d 20 61 72 67 76 5b 69 6e 64 65 78 2b  le = argv[index+
16320 31 5d 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e  1];.  in = fopen
16330 28 7a 46 69 6c 65 2c 22 72 22 29 3b 0a 20 20 69  (zFile,"r");.  i
16340 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
16350 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
16360 43 61 6e 27 74 20 6f 70 65 6e 20 69 6e 70 75 74  Can't open input
16370 20 66 69 6c 65 20 5c 22 25 73 5c 22 5c 6e 22 2c   file \"%s\"\n",
16380 7a 46 69 6c 65 29 3b 0a 20 20 20 20 65 78 69 74  zFile);.    exit
16390 28 31 29 3b 0a 20 20 7d 0a 20 20 63 20 3d 20 27  (1);.  }.  c = '
163a0 20 27 3b 0a 20 20 77 68 69 6c 65 28 20 63 21 3d   ';.  while( c!=
163b0 45 4f 46 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  EOF ){.    while
163c0 28 20 63 21 3d 45 4f 46 20 26 26 20 69 73 73 70  ( c!=EOF && issp
163d0 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20  ace(c) ){.      
163e0 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20  if( c=='\n' ){. 
163f0 20 20 20 20 20 20 20 73 74 61 72 74 4f 66 4c 69         startOfLi
16400 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ne = 1;.      }.
16410 20 20 20 20 20 20 63 20 3d 20 67 65 74 63 28 69        c = getc(i
16420 6e 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 73  n); .      if( s
16430 74 61 72 74 4f 66 4c 69 6e 65 20 26 26 20 63 3d  tartOfLine && c=
16440 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='#' ){.        
16450 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26  while( c!=EOF &&
16460 20 63 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20   c!='\n' ){.    
16470 20 20 20 20 20 20 63 20 3d 20 67 65 74 63 28 69        c = getc(i
16480 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
16490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
164a0 6e 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  n = 0;.    while
164b0 28 20 63 21 3d 45 4f 46 20 26 26 20 21 69 73 73  ( c!=EOF && !iss
164c0 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20  pace(c) ){.     
164d0 20 69 66 28 20 6e 3c 73 69 7a 65 6f 66 28 7a 42   if( n<sizeof(zB
164e0 75 66 29 2d 31 20 29 7b 20 7a 42 75 66 5b 6e 2b  uf)-1 ){ zBuf[n+
164f0 2b 5d 20 3d 20 63 3b 20 7d 0a 20 20 20 20 20 20  +] = c; }.      
16500 73 74 61 72 74 4f 66 4c 69 6e 65 20 3d 20 30 3b  startOfLine = 0;
16510 0a 20 20 20 20 20 20 63 20 3d 20 67 65 74 63 28  .      c = getc(
16520 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  in);.    }.    z
16530 42 75 66 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  Buf[n] = 0;.    
16540 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20  if( n>0 ){.     
16550 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69   nNew++;.      i
16560 66 28 20 6e 4e 65 77 20 2b 20 61 72 67 63 20 3e  f( nNew + argc >
16570 20 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20   nAlloc ){.     
16580 20 20 20 69 66 28 20 6e 41 6c 6c 6f 63 3d 3d 30     if( nAlloc==0
16590 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 41   ){.          nA
165a0 6c 6c 6f 63 20 3d 20 31 30 30 20 2b 20 61 72 67  lloc = 100 + arg
165b0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4e 65  c;.          zNe
165c0 77 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  w = malloc( size
165d0 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 41 6c 6c  of(char*) * nAll
165e0 6f 63 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oc );.        }e
165f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  lse{.          n
16600 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20  Alloc *= 2;.    
16610 20 20 20 20 20 20 7a 4e 65 77 20 3d 20 72 65 61        zNew = rea
16620 6c 6c 6f 63 28 20 7a 4e 65 77 2c 20 73 69 7a 65  lloc( zNew, size
16630 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 41 6c 6c  of(char*) * nAll
16640 6f 63 20 29 3b 20 20 0a 20 20 20 20 20 20 20 20  oc );  .        
16650 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
16660 69 66 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20  if( zNew ){.    
16670 20 20 20 20 69 6e 74 20 6a 20 3d 20 6e 4e 65 77      int j = nNew
16680 20 2b 20 69 6e 64 65 78 3b 0a 20 20 20 20 20 20   + index;.      
16690 20 20 7a 4e 65 77 5b 6a 5d 20 3d 20 6d 61 6c 6c    zNew[j] = mall
166a0 6f 63 28 20 6e 20 2b 20 31 20 29 3b 0a 20 20 20  oc( n + 1 );.   
166b0 20 20 20 20 20 69 66 28 20 7a 4e 65 77 5b 6a 5d       if( zNew[j]
166c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
166d0 72 63 70 79 28 20 7a 4e 65 77 5b 6a 5d 2c 20 7a  rcpy( zNew[j], z
166e0 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  Buf );.        }
166f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16700 20 7d 0a 20 20 6e 65 77 41 72 67 63 20 3d 20 61   }.  newArgc = a
16710 72 67 63 20 2b 20 6e 4e 65 77 20 2d 20 31 3b 0a  rgc + nNew - 1;.
16720 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 69 6e    for(i=0; i<=in
16730 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  dex; i++){.    z
16740 4e 65 77 5b 69 5d 20 3d 20 61 72 67 76 5b 69 5d  New[i] = argv[i]
16750 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6e 4e  ;.  }.  for(i=nN
16760 65 77 20 2b 20 69 6e 64 65 78 20 2b 20 31 3b 20  ew + index + 1; 
16770 69 3c 6e 65 77 41 72 67 63 3b 20 69 2b 2b 29 7b  i<newArgc; i++){
16780 0a 20 20 20 20 7a 4e 65 77 5b 69 5d 20 3d 20 61  .    zNew[i] = a
16790 72 67 76 5b 69 20 2b 20 31 20 2d 20 6e 4e 65 77  rgv[i + 1 - nNew
167a0 5d 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77 5b 6e 65  ];.  }.  zNew[ne
167b0 77 41 72 67 63 5d 20 3d 20 30 3b 0a 20 20 2a 70  wArgc] = 0;.  *p
167c0 41 72 67 63 20 3d 20 6e 65 77 41 72 67 63 3b 0a  Argc = newArgc;.
167d0 20 20 2a 70 41 72 67 76 20 3d 20 7a 4e 65 77 3b    *pArgv = zNew;
167e0 0a 7d 0a 0a 23 69 66 64 65 66 20 4e 4f 54 5f 55  .}..#ifdef NOT_U
167f0 53 45 44 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  SED./*.** Return
16800 20 74 68 65 20 74 69 6d 65 20 74 68 61 74 20 74   the time that t
16810 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 77 61  he given file wa
16820 73 20 6c 61 73 74 20 6d 6f 64 69 66 69 65 64 2e  s last modified.
16830 20 20 49 66 20 77 65 20 63 61 6e 27 74 0a 2a 2a    If we can't.**
16840 20 6c 6f 63 61 74 65 20 74 68 65 20 66 69 6c 65   locate the file
16850 20 28 62 65 63 61 75 73 65 2c 20 66 6f 72 20 65   (because, for e
16860 78 61 6d 70 6c 65 2c 20 69 74 20 64 6f 65 73 6e  xample, it doesn
16870 27 74 20 65 78 69 73 74 29 2c 20 74 68 65 6e 0a  't exist), then.
16880 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  ** return 0..*/.
16890 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
168a0 69 6e 74 20 4d 6f 64 54 69 6d 65 28 63 6f 6e 73  int ModTime(cons
168b0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
168c0 65 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  e){.  unsigned i
168d0 6e 74 20 6d 54 69 6d 65 20 3d 20 30 3b 0a 20 20  nt mTime = 0;.  
168e0 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
168f0 74 3b 0a 20 20 69 66 28 20 73 74 61 74 28 7a 46  t;.  if( stat(zF
16900 69 6c 65 6e 61 6d 65 2c 26 73 53 74 61 74 29 3d  ilename,&sStat)=
16910 3d 30 20 29 7b 0a 20 20 20 20 6d 54 69 6d 65 20  =0 ){.    mTime 
16920 3d 20 73 53 74 61 74 2e 73 74 5f 6d 74 69 6d 65  = sStat.st_mtime
16930 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
16940 54 69 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Time;.}.#endif..
16950 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 75 73  /*.** Print a us
16960 61 67 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20  age comment for 
16970 74 68 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  this program..*/
16980 0a 73 74 61 74 69 63 20 76 6f 69 64 20 55 73 61  .static void Usa
16990 67 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ge(const char *a
169a0 72 67 76 30 2c 20 63 6f 6e 73 74 20 63 68 61 72  rgv0, const char
169b0 20 2a 61 72 67 76 4e 29 7b 0a 20 20 66 70 72 69   *argvN){.  fpri
169c0 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
169d0 49 6c 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74  Illegal argument
169e0 20 5c 22 25 73 5c 22 5c 6e 22 2c 61 72 67 76 30   \"%s\"\n",argv0
169f0 2c 61 72 67 76 4e 29 3b 0a 20 20 66 70 72 69 6e  ,argvN);.  fprin
16a00 74 66 28 73 74 64 65 72 72 2c 22 55 73 61 67 65  tf(stderr,"Usage
16a10 3a 20 25 73 20 5b 6f 70 74 69 6f 6e 73 5d 20 66  : %s [options] f
16a20 69 6c 65 6e 61 6d 65 2e 2e 2e 5c 6e 22 0a 20 20  ilename...\n".  
16a30 20 20 22 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 20    "Options:\n". 
16a40 20 20 20 22 20 20 2d 68 20 20 20 20 20 20 20 20     "  -h        
16a50 20 20 47 65 6e 65 72 61 74 65 20 61 20 73 69 6e    Generate a sin
16a60 67 6c 65 20 2e 68 20 74 6f 20 73 74 61 6e 64 61  gle .h to standa
16a70 72 64 20 6f 75 74 70 75 74 2e 5c 6e 22 0a 20 20  rd output.\n".  
16a80 20 20 22 20 20 2d 48 20 20 20 20 20 20 20 20 20    "  -H         
16a90 20 4c 69 6b 65 20 2d 68 2c 20 62 75 74 20 6f 6e   Like -h, but on
16aa0 6c 79 20 6f 75 74 70 75 74 20 45 58 50 4f 52 54  ly output EXPORT
16ab0 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 5c 6e   declarations.\n
16ac0 22 0a 20 20 20 20 22 20 20 2d 76 20 20 20 20 20  ".    "  -v     
16ad0 20 20 20 20 20 28 76 65 72 62 6f 73 65 29 20 57       (verbose) W
16ae0 72 69 74 65 20 73 74 61 74 75 73 20 69 6e 66 6f  rite status info
16af0 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 73  rmation to the s
16b00 63 72 65 65 6e 2e 5c 6e 22 0a 20 20 20 20 22 20  creen.\n".    " 
16b10 20 2d 64 6f 63 20 20 20 20 20 20 20 20 47 65 6e   -doc        Gen
16b20 65 72 61 74 65 20 6e 6f 20 68 65 61 64 65 72 20  erate no header 
16b30 66 69 6c 65 73 2e 20 20 49 6e 73 74 65 61 64 2c  files.  Instead,
16b40 20 6f 75 74 70 75 74 20 69 6e 66 6f 72 6d 61 74   output informat
16b50 69 6f 6e 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  ion\n".    "    
16b60 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 63            that c
16b70 61 6e 20 62 65 20 75 73 65 64 20 62 79 20 61 6e  an be used by an
16b80 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 67 72   automatic progr
16b90 61 6d 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  am documentation
16ba0 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
16bb0 20 20 20 20 20 20 20 61 6e 64 20 63 72 6f 73 73         and cross
16bc0 2d 72 65 66 65 72 65 6e 63 65 20 67 65 6e 65 72  -reference gener
16bd0 61 74 6f 72 2e 5c 6e 22 0a 20 20 20 20 22 20 20  ator.\n".    "  
16be0 2d 6c 6f 63 61 6c 20 20 20 20 20 20 47 65 6e 65  -local      Gene
16bf0 72 61 74 65 20 70 72 6f 74 6f 74 79 70 65 73 20  rate prototypes 
16c00 66 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20 66  for \"static\" f
16c10 75 6e 63 74 69 6f 6e 73 20 61 6e 64 5c 6e 22 0a  unctions and\n".
16c20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20      "           
16c30 20 20 20 70 72 6f 63 65 64 75 72 65 73 2e 5c 6e     procedures.\n
16c40 22 0a 20 20 20 20 22 20 20 2d 66 20 46 49 4c 45  ".    "  -f FILE
16c50 20 20 20 20 20 52 65 61 64 20 61 64 64 69 74 69       Read additi
16c60 6f 6e 61 6c 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  onal command-lin
16c70 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d  e arguments from
16c80 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 5c   the file named\
16c90 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  n".    "        
16ca0 20 20 20 20 20 20 5c 22 46 49 4c 45 5c 22 2e 5c        \"FILE\".\
16cb0 6e 22 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a  n".#ifdef DEBUG.
16cc0 20 20 20 20 22 20 20 2d 21 20 4d 41 53 4b 20 20      "  -! MASK  
16cd0 20 20 20 53 65 74 20 74 68 65 20 64 65 62 75 67     Set the debug
16ce0 67 69 6e 67 20 6d 61 73 6b 20 74 6f 20 74 68 65  ging mask to the
16cf0 20 6e 75 6d 62 65 72 20 5c 22 4d 41 53 4b 5c 22   number \"MASK\"
16d00 2e 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 20 20  .\n".#endif.    
16d10 22 20 20 2d 2d 20 20 20 20 20 20 20 20 20 20 54  "  --          T
16d20 72 65 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75  reat all subsequ
16d30 65 6e 74 20 63 6f 6d 6d 65 6e 74 2d 6c 69 6e 65  ent comment-line
16d40 20 70 61 72 61 6d 65 74 65 72 73 20 61 73 20 66   parameters as f
16d50 69 6c 65 6e 61 6d 65 73 2c 5c 6e 22 0a 20 20 20  ilenames,\n".   
16d60 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
16d70 65 76 65 6e 20 69 66 20 74 68 65 79 20 62 65 67  even if they beg
16d80 69 6e 20 77 69 74 68 20 5c 22 2d 5c 22 2e 5c 6e  in with \"-\".\n
16d90 22 2c 0a 20 20 20 20 61 72 67 76 30 0a 20 20 29  ",.    argv0.  )
16da0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
16db0 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 20 63 6f  ollowing text co
16dc0 6e 74 61 69 6e 73 20 61 20 66 65 77 20 73 69 6d  ntains a few sim
16dd0 70 6c 65 20 23 64 65 66 69 6e 65 73 20 74 68 61  ple #defines tha
16de0 74 20 77 65 20 77 61 6e 74 0a 2a 2a 20 74 6f 20  t we want.** to 
16df0 62 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  be available to 
16e00 65 76 65 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73  every file..*/.s
16e10 74 61 74 69 63 20 63 68 61 72 20 7a 49 6e 69 74  tatic char zInit
16e20 5b 5d 20 3d 20 0a 20 20 22 23 64 65 66 69 6e 65  [] = .  "#define
16e30 20 49 4e 54 45 52 46 41 43 45 20 30 5c 6e 22 0a   INTERFACE 0\n".
16e40 20 20 22 23 64 65 66 69 6e 65 20 45 58 50 4f 52    "#define EXPOR
16e50 54 5f 49 4e 54 45 52 46 41 43 45 20 30 5c 6e 22  T_INTERFACE 0\n"
16e60 0a 20 20 22 23 64 65 66 69 6e 65 20 4c 4f 43 41  .  "#define LOCA
16e70 4c 5f 49 4e 54 45 52 46 41 43 45 20 30 5c 6e 22  L_INTERFACE 0\n"
16e80 0a 20 20 22 23 64 65 66 69 6e 65 20 45 58 50 4f  .  "#define EXPO
16e90 52 54 5c 6e 22 0a 20 20 22 23 64 65 66 69 6e 65  RT\n".  "#define
16ea0 20 4c 4f 43 41 4c 20 73 74 61 74 69 63 5c 6e 22   LOCAL static\n"
16eb0 0a 20 20 22 23 64 65 66 69 6e 65 20 50 55 42 4c  .  "#define PUBL
16ec0 49 43 5c 6e 22 0a 20 20 22 23 64 65 66 69 6e 65  IC\n".  "#define
16ed0 20 50 52 49 56 41 54 45 5c 6e 22 0a 20 20 22 23   PRIVATE\n".  "#
16ee0 64 65 66 69 6e 65 20 50 52 4f 54 45 43 54 45 44  define PROTECTED
16ef0 5c 6e 22 0a 3b 0a 0a 23 69 66 20 54 45 53 54 3d  \n".;..#if TEST=
16f00 3d 30 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20  =0.int main(int 
16f10 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
16f20 76 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  v){.  int i;    
16f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
16f40 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
16f50 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
16f60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16f70 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
16f80 6e 74 65 72 65 64 20 2a 2f 0a 20 20 54 6f 6b 65  ntered */.  Toke
16f90 6e 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20  n *pList;       
16fa0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 69 6e 70    /* List of inp
16fb0 75 74 20 74 6f 6b 65 6e 73 20 66 6f 72 20 6f 6e  ut tokens for on
16fc0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 49 6e 46 69  e file */.  InFi
16fd0 6c 65 20 2a 70 46 69 6c 65 4c 69 73 74 20 3d 20  le *pFileList = 
16fe0 30 3b 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c  0;/* List of all
16ff0 20 69 6e 70 75 74 20 66 69 6c 65 73 20 2a 2f 0a   input files */.
17000 20 20 49 6e 46 69 6c 65 20 2a 70 54 61 69 6c 20    InFile *pTail 
17010 3d 20 30 3b 20 20 20 20 2f 2a 20 4c 61 73 74 20  = 0;    /* Last 
17020 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  file on the list
17030 20 2a 2f 0a 20 20 49 6e 46 69 6c 65 20 2a 70 46   */.  InFile *pF
17040 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 66  ile;        /* f
17050 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
17060 74 68 65 20 66 69 6c 65 20 6c 69 73 74 20 2a 2f  the file list */
17070 0a 20 20 69 6e 74 20 68 5f 66 6c 61 67 20 3d 20  .  int h_flag = 
17080 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  0;       /* True
17090 20 69 66 20 2d 68 20 69 73 20 70 72 65 73 65 6e   if -h is presen
170a0 74 2e 20 20 4f 75 74 70 75 74 20 75 6e 69 66 69  t.  Output unifi
170b0 65 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ed header */.  i
170c0 6e 74 20 48 5f 66 6c 61 67 20 3d 20 30 3b 20 20  nt H_flag = 0;  
170d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
170e0 2d 48 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20  -H is present.  
170f0 4f 75 74 70 75 74 20 45 58 50 4f 52 54 20 68 65  Output EXPORT he
17100 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 76 5f  ader */.  int v_
17110 66 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20  flag = 0;       
17120 2f 2a 20 56 65 72 62 6f 73 65 20 2a 2f 0a 20 20  /* Verbose */.  
17130 69 6e 74 20 6e 6f 4d 6f 72 65 46 6c 61 67 73 3b  int noMoreFlags;
17140 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
17150 20 2d 2d 20 68 61 73 20 62 65 65 6e 20 73 65 65   -- has been see
17160 6e 2e 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 72 65  n. */.  FILE *re
17170 70 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  port;         /*
17180 20 53 65 6e 64 20 70 72 6f 67 72 65 73 73 20 72   Send progress r
17190 65 70 6f 72 74 73 20 74 6f 20 74 68 69 73 2c 20  eports to this, 
171a0 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 0a  if not NULL */..
171b0 20 20 6e 6f 4d 6f 72 65 46 6c 61 67 73 20 3d 20    noMoreFlags = 
171c0 30 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  0;.  for(i=1; i<
171d0 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
171e0 69 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d  if( argv[i][0]==
171f0 27 2d 27 20 26 26 20 21 6e 6f 4d 6f 72 65 46 6c  '-' && !noMoreFl
17200 61 67 73 20 29 7b 0a 20 20 20 20 20 20 73 77 69  ags ){.      swi
17210 74 63 68 28 20 61 72 67 76 5b 69 5d 5b 31 5d 20  tch( argv[i][1] 
17220 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
17230 27 68 27 3a 20 20 20 68 5f 66 6c 61 67 20 3d 20  'h':   h_flag = 
17240 31 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  1;   break;.    
17250 20 20 20 20 63 61 73 65 20 27 48 27 3a 20 20 20      case 'H':   
17260 48 5f 66 6c 61 67 20 3d 20 31 3b 20 20 20 62 72  H_flag = 1;   br
17270 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
17280 65 20 27 76 27 3a 20 20 20 76 5f 66 6c 61 67 20  e 'v':   v_flag 
17290 3d 20 31 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  = 1;   break;.  
172a0 20 20 20 20 20 20 63 61 73 65 20 27 64 27 3a 20        case 'd': 
172b0 20 20 64 6f 63 5f 66 6c 61 67 20 3d 20 31 3b 20    doc_flag = 1; 
172c0 70 72 6f 74 6f 5f 73 74 61 74 69 63 20 3d 20 31  proto_static = 1
172d0 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
172e0 20 63 61 73 65 20 27 6c 27 3a 20 20 20 70 72 6f   case 'l':   pro
172f0 74 6f 5f 73 74 61 74 69 63 20 3d 20 31 3b 20 62  to_static = 1; b
17300 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
17310 73 65 20 27 66 27 3a 20 20 20 41 64 64 50 61 72  se 'f':   AddPar
17320 61 6d 65 74 65 72 73 28 69 2c 20 26 61 72 67 63  ameters(i, &argc
17330 2c 20 26 61 72 67 76 29 3b 20 62 72 65 61 6b 3b  , &argv); break;
17340 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 2d  .        case '-
17350 27 3a 20 20 20 6e 6f 4d 6f 72 65 46 6c 61 67 73  ':   noMoreFlags
17360 20 3d 20 31 3b 20 20 20 62 72 65 61 6b 3b 0a 23   = 1;   break;.#
17370 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 20 20  ifdef DEBUG.    
17380 20 20 20 20 63 61 73 65 20 27 21 27 3a 20 20 20      case '!':   
17390 69 2b 2b 3b 20 20 64 65 62 75 67 4d 61 73 6b 20  i++;  debugMask 
173a0 3d 20 73 74 72 74 6f 6c 28 61 72 67 76 5b 69 5d  = strtol(argv[i]
173b0 2c 30 2c 30 29 3b 20 62 72 65 61 6b 3b 0a 23 65  ,0,0); break;.#e
173c0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 65 66  ndif.        def
173d0 61 75 6c 74 3a 20 20 20 20 55 73 61 67 65 28 61  ault:    Usage(a
173e0 72 67 76 5b 30 5d 2c 61 72 67 76 5b 69 5d 29 3b  rgv[0],argv[i]);
173f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
17400 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
17410 20 20 20 20 70 46 69 6c 65 20 3d 20 43 72 65 61      pFile = Crea
17420 74 65 49 6e 46 69 6c 65 28 61 72 67 76 5b 69 5d  teInFile(argv[i]
17430 2c 26 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 69  ,&nErr);.      i
17440 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  f( pFile ){.    
17450 20 20 20 20 69 66 28 20 70 46 69 6c 65 4c 69 73      if( pFileLis
17460 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
17470 54 61 69 6c 2d 3e 70 4e 65 78 74 20 3d 20 70 46  Tail->pNext = pF
17480 69 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ile;.          p
17490 54 61 69 6c 20 3d 20 70 46 69 6c 65 3b 0a 20 20  Tail = pFile;.  
174a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
174b0 20 20 20 20 20 20 20 70 46 69 6c 65 4c 69 73 74         pFileList
174c0 20 3d 20 70 54 61 69 6c 20 3d 20 70 46 69 6c 65   = pTail = pFile
174d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
174e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
174f0 69 66 28 20 68 5f 66 6c 61 67 20 26 26 20 48 5f  if( h_flag && H_
17500 66 6c 61 67 20 29 7b 0a 20 20 20 20 68 5f 66 6c  flag ){.    h_fl
17510 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ag = 0;.  }.  if
17520 28 20 76 5f 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( v_flag ){.    
17530 72 65 70 6f 72 74 20 3d 20 28 68 5f 66 6c 61 67  report = (h_flag
17540 20 7c 7c 20 48 5f 66 6c 61 67 29 20 3f 20 73 74   || H_flag) ? st
17550 64 65 72 72 20 3a 20 73 74 64 6f 75 74 3b 0a 20  derr : stdout;. 
17560 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 70 6f   }else{.    repo
17570 72 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  rt = 0;.  }.  if
17580 28 20 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20  ( nErr>0 ){.    
17590 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20 7d  return nErr;.  }
175a0 0a 20 20 66 6f 72 28 70 46 69 6c 65 3d 70 46 69  .  for(pFile=pFi
175b0 6c 65 4c 69 73 74 3b 20 70 46 69 6c 65 3b 20 70  leList; pFile; p
175c0 46 69 6c 65 3d 70 46 69 6c 65 2d 3e 70 4e 65 78  File=pFile->pNex
175d0 74 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46  t){.    char *zF
175e0 69 6c 65 3b 0a 0a 20 20 20 20 7a 46 69 6c 65 6e  ile;..    zFilen
175f0 61 6d 65 20 3d 20 70 46 69 6c 65 2d 3e 7a 53 72  ame = pFile->zSr
17600 63 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65  c;.    if( zFile
17610 6e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  name==0 ) contin
17620 75 65 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  ue;.    zFile = 
17630 52 65 61 64 46 69 6c 65 28 7a 46 69 6c 65 6e 61  ReadFile(zFilena
17640 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  me);.    if( zFi
17650 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  le==0 ){.      f
17660 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
17670 61 6e 27 74 20 72 65 61 64 20 69 6e 70 75 74 20  an't read input 
17680 66 69 6c 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 7a  file \"%s\"\n",z
17690 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
176a0 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 63   nErr++;.      c
176b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
176c0 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
176d0 46 69 6c 65 2c 7a 54 6f 70 4c 69 6e 65 2c 6e 54  File,zTopLine,nT
176e0 6f 70 4c 69 6e 65 29 3d 3d 30 20 29 7b 0a 20 20  opLine)==0 ){.  
176f0 20 20 20 20 70 46 69 6c 65 2d 3e 7a 53 72 63 20      pFile->zSrc 
17700 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
17710 20 20 20 20 20 20 69 66 28 20 72 65 70 6f 72 74        if( report
17720 20 29 20 66 70 72 69 6e 74 66 28 72 65 70 6f 72   ) fprintf(repor
17730 74 2c 22 52 65 61 64 69 6e 67 20 25 73 2e 2e 2e  t,"Reading %s...
17740 5c 6e 22 2c 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  \n",zFilename);.
17750 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 54 6f        pList = To
17760 6b 65 6e 69 7a 65 46 69 6c 65 28 7a 46 69 6c 65  kenizeFile(zFile
17770 2c 26 70 46 69 6c 65 2d 3e 69 64 54 61 62 6c 65  ,&pFile->idTable
17780 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
17790 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45  st ){.        nE
177a0 72 72 20 2b 3d 20 50 61 72 73 65 46 69 6c 65 28  rr += ParseFile(
177b0 70 4c 69 73 74 2c 70 46 69 6c 65 2d 3e 66 6c 61  pList,pFile->fla
177c0 67 73 29 3b 0a 20 20 20 20 20 20 20 20 46 72 65  gs);.        Fre
177d0 65 54 6f 6b 65 6e 4c 69 73 74 28 70 4c 69 73 74  eTokenList(pList
177e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
177f0 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29  f( zFile[0]==0 )
17800 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
17810 66 28 73 74 64 65 72 72 2c 22 49 6e 70 75 74 20  f(stderr,"Input 
17820 66 69 6c 65 20 5c 22 25 73 5c 22 20 69 73 20 65  file \"%s\" is e
17830 6d 70 74 79 2e 5c 6e 22 2c 20 7a 46 69 6c 65 6e  mpty.\n", zFilen
17840 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 45  ame);.        nE
17850 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rr++;.      }els
17860 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  e{.        fprin
17870 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
17880 73 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  s while processi
17890 6e 67 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  ng \"%s\"\n", zF
178a0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
178b0 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
178c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
178d0 21 64 6f 63 5f 66 6c 61 67 20 29 20 53 61 66 65  !doc_flag ) Safe
178e0 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20  Free(zFile);.   
178f0 20 69 66 28 20 64 6f 63 5f 66 6c 61 67 20 29 20   if( doc_flag ) 
17900 50 72 69 6e 74 4d 6f 64 75 6c 65 52 65 63 6f 72  PrintModuleRecor
17910 64 28 7a 46 69 6c 65 2c 7a 46 69 6c 65 6e 61 6d  d(zFile,zFilenam
17920 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 45  e);.  }.  if( nE
17930 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  rr>0 ){.    retu
17940 72 6e 20 6e 45 72 72 3b 0a 20 20 7d 0a 23 69 66  rn nErr;.  }.#if
17950 64 65 66 20 44 45 42 55 47 0a 20 20 69 66 28 20  def DEBUG.  if( 
17960 64 65 62 75 67 4d 61 73 6b 20 26 20 44 45 43 4c  debugMask & DECL
17970 5f 44 55 4d 50 20 29 7b 0a 20 20 20 20 44 75 6d  _DUMP ){.    Dum
17980 70 44 65 63 6c 4c 69 73 74 28 29 3b 0a 20 20 20  pDeclList();.   
17990 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20   return nErr;.  
179a0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 64  }.#endif.  if( d
179b0 6f 63 5f 66 6c 61 67 20 29 7b 0a 20 20 20 20 44  oc_flag ){.    D
179c0 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 44 75 6d 70  ocumentationDump
179d0 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e  ();.    return n
179e0 45 72 72 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  Err;.  }.  zFile
179f0 6e 61 6d 65 20 3d 20 22 2d 2d 69 6e 74 65 72 6e  name = "--intern
17a00 61 6c 2d 2d 22 3b 0a 20 20 70 4c 69 73 74 20 3d  al--";.  pList =
17a10 20 54 6f 6b 65 6e 69 7a 65 46 69 6c 65 28 7a 49   TokenizeFile(zI
17a20 6e 69 74 2c 30 29 3b 0a 20 20 69 66 28 20 70 4c  nit,0);.  if( pL
17a30 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ist==0 ){.    re
17a40 74 75 72 6e 20 6e 45 72 72 2b 31 3b 0a 20 20 7d  turn nErr+1;.  }
17a50 0a 20 20 50 61 72 73 65 46 69 6c 65 28 70 4c 69  .  ParseFile(pLi
17a60 73 74 2c 50 53 5f 49 6e 74 65 72 66 61 63 65 29  st,PS_Interface)
17a70 3b 0a 20 20 46 72 65 65 54 6f 6b 65 6e 4c 69 73  ;.  FreeTokenLis
17a80 74 28 70 4c 69 73 74 29 3b 0a 20 20 69 66 28 20  t(pList);.  if( 
17a90 68 5f 66 6c 61 67 20 7c 7c 20 48 5f 66 6c 61 67  h_flag || H_flag
17aa0 20 29 7b 0a 20 20 20 20 6e 45 72 72 20 2b 3d 20   ){.    nErr += 
17ab0 4d 61 6b 65 47 6c 6f 62 61 6c 48 65 61 64 65 72  MakeGlobalHeader
17ac0 28 48 5f 66 6c 61 67 29 3b 0a 20 20 7d 65 6c 73  (H_flag);.  }els
17ad0 65 7b 0a 20 20 20 20 66 6f 72 28 70 46 69 6c 65  e{.    for(pFile
17ae0 3d 70 46 69 6c 65 4c 69 73 74 3b 20 70 46 69 6c  =pFileList; pFil
17af0 65 3b 20 70 46 69 6c 65 3d 70 46 69 6c 65 2d 3e  e; pFile=pFile->
17b00 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
17b10 28 20 70 46 69 6c 65 2d 3e 7a 53 72 63 3d 3d 30  ( pFile->zSrc==0
17b20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
17b30 20 20 20 6e 45 72 72 20 2b 3d 20 4d 61 6b 65 48     nErr += MakeH
17b40 65 61 64 65 72 28 70 46 69 6c 65 2c 72 65 70 6f  eader(pFile,repo
17b50 72 74 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rt,0);.    }.  }
17b60 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a  .  return nErr;.
17b70 7d 0a 23 65 6e 64 69 66 0a                       }.#endif.