Fossil

Hex Artifact Content
Login

Artifact ef97646ffc78b8400b06ab9751925bcc7b28dbc1:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72  /*.** This progr
0010: 61 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77  am is free softw
0020: 61 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64  are; you can red
0030: 69 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64  istribute it and
0040: 2f 6f 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74  /or.** modify it
0050: 20 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73   under the terms
0060: 20 6f 66 20 74 68 65 20 53 69 6d 70 6c 69 66 69   of the Simplifi
0070: 65 64 20 42 53 44 20 4c 69 63 65 6e 73 65 20 28  ed BSD License (
0080: 61 6c 73 6f 0a 2a 2a 20 6b 6e 6f 77 6e 20 61 73  also.** known as
0090: 20 74 68 65 20 22 32 2d 43 6c 61 75 73 65 20 4c   the "2-Clause L
00a0: 69 63 65 6e 73 65 22 20 6f 72 20 22 46 72 65 65  icense" or "Free
00b0: 42 53 44 20 4c 69 63 65 6e 73 65 22 2e 29 0a 2a  BSD License".).*
00c0: 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20 31  *.** Copyright 1
00d0: 39 39 33 20 44 2e 20 52 69 63 68 61 72 64 20 48  993 D. Richard H
00e0: 69 70 70 2e 20 41 6c 6c 20 72 69 67 68 74 73 20  ipp. All rights 
00f0: 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
0100: 52 65 64 69 73 74 72 69 62 75 74 69 6f 6e 20 61  Redistribution a
0110: 6e 64 20 75 73 65 20 69 6e 20 73 6f 75 72 63 65  nd use in source
0120: 20 61 6e 64 20 62 69 6e 61 72 79 20 66 6f 72 6d   and binary form
0130: 73 2c 20 77 69 74 68 20 6f 72 0a 2a 2a 20 77 69  s, with or.** wi
0140: 74 68 6f 75 74 20 6d 6f 64 69 66 69 63 61 74 69  thout modificati
0150: 6f 6e 2c 20 61 72 65 20 70 65 72 6d 69 74 74 65  on, are permitte
0160: 64 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20  d provided that 
0170: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
0180: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20   conditions are 
0190: 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  met:.**.**   1. 
01a0: 52 65 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20  Redistributions 
01b0: 6f 66 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6d  of source code m
01c0: 75 73 74 20 72 65 74 61 69 6e 20 74 68 65 20 61  ust retain the a
01d0: 62 6f 76 65 20 63 6f 70 79 72 69 67 68 74 0a 2a  bove copyright.*
01e0: 2a 20 20 20 20 20 20 6e 6f 74 69 63 65 2c 20 74  *      notice, t
01f0: 68 69 73 20 6c 69 73 74 20 6f 66 20 63 6f 6e 64  his list of cond
0200: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 66  itions and the f
0210: 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63 6c 61 69  ollowing disclai
0220: 6d 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20  mer..**.**   2. 
0230: 52 65 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20  Redistributions 
0240: 69 6e 20 62 69 6e 61 72 79 20 66 6f 72 6d 20 6d  in binary form m
0250: 75 73 74 20 72 65 70 72 6f 64 75 63 65 20 74 68  ust reproduce th
0260: 65 20 61 62 6f 76 65 20 63 6f 70 79 72 69 67 68  e above copyrigh
0270: 74 0a 2a 2a 20 20 20 20 20 20 6e 6f 74 69 63 65  t.**      notice
0280: 2c 20 74 68 69 73 20 6c 69 73 74 20 6f 66 20 63  , this list of c
0290: 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  onditions and th
02a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63  e following disc
02b0: 6c 61 69 6d 65 72 20 69 6e 0a 2a 2a 20 20 20 20  laimer in.**    
02c0: 20 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74    the documentat
02d0: 69 6f 6e 20 61 6e 64 2f 6f 72 20 6f 74 68 65 72  ion and/or other
02e0: 20 6d 61 74 65 72 69 61 6c 73 20 70 72 6f 76 69   materials provi
02f0: 64 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ded with the.** 
0300: 20 20 20 20 20 64 69 73 74 72 69 62 75 74 69 6f       distributio
0310: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 6f  n..**.** This so
0320: 66 74 77 61 72 65 20 69 73 20 70 72 6f 76 69 64  ftware is provid
0330: 65 64 20 22 61 73 20 69 73 22 20 61 6e 64 20 61  ed "as is" and a
0340: 6e 79 20 65 78 70 72 65 73 73 20 6f 72 20 69 6d  ny express or im
0350: 70 6c 69 65 64 20 77 61 72 72 61 6e 74 69 65 73  plied warranties
0360: 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 2c 20  ,.** including, 
0370: 62 75 74 20 6e 6f 74 20 6c 69 6d 69 74 65 64 20  but not limited 
0380: 74 6f 2c 20 74 68 65 20 69 6d 70 6c 69 65 64 20  to, the implied 
0390: 77 61 72 72 61 6e 74 69 65 73 20 6f 66 20 6d 65  warranties of me
03a0: 72 63 68 61 6e 74 61 62 69 6c 69 74 79 0a 2a 2a  rchantability.**
03b0: 20 61 6e 64 20 66 69 74 6e 65 73 73 20 66 6f 72   and fitness for
03c0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75   a particular pu
03d0: 72 70 6f 73 65 20 61 72 65 20 64 69 73 63 6c 61  rpose are discla
03e0: 69 6d 65 64 2e 20 20 49 6e 20 6e 6f 20 65 76 65  imed.  In no eve
03f0: 6e 74 20 73 68 61 6c 6c 0a 2a 2a 20 74 68 65 20  nt shall.** the 
0400: 61 75 74 68 6f 72 20 6f 72 20 63 6f 6e 74 72 69  author or contri
0410: 62 75 74 6f 72 73 20 62 65 20 6c 69 61 62 6c 65  butors be liable
0420: 20 66 6f 72 20 61 6e 79 20 64 69 72 65 63 74 2c   for any direct,
0430: 20 69 6e 64 69 72 65 63 74 2c 20 69 6e 63 69 64   indirect, incid
0440: 65 6e 74 61 6c 2c 0a 2a 2a 20 73 70 65 63 69 61  ental,.** specia
0450: 6c 2c 20 65 78 65 6d 70 6c 61 72 79 2c 20 6f 72  l, exemplary, or
0460: 20 63 6f 6e 73 65 71 75 65 6e 74 69 61 6c 20 64   consequential d
0470: 61 6d 61 67 65 73 20 28 69 6e 63 6c 75 64 69 6e  amages (includin
0480: 67 2c 20 62 75 74 20 6e 6f 74 20 6c 69 6d 69 74  g, but not limit
0490: 65 64 0a 2a 2a 20 74 6f 2c 20 70 72 6f 63 75 72  ed.** to, procur
04a0: 65 6d 65 6e 74 20 6f 66 20 73 75 62 73 74 69 74  ement of substit
04b0: 75 74 65 20 67 6f 6f 64 73 20 6f 72 20 73 65 72  ute goods or ser
04c0: 76 69 63 65 73 3b 20 6c 6f 73 73 20 6f 66 20 75  vices; loss of u
04d0: 73 65 2c 20 64 61 74 61 20 6f 72 0a 2a 2a 20 70  se, data or.** p
04e0: 72 6f 66 69 74 73 3b 20 6f 72 20 62 75 73 69 6e  rofits; or busin
04f0: 65 73 73 20 69 6e 74 65 72 72 75 70 74 69 6f 6e  ess interruption
0500: 29 20 68 6f 77 65 76 65 72 20 63 61 75 73 65 64  ) however caused
0510: 20 61 6e 64 20 6f 6e 20 61 6e 79 20 74 68 65 6f   and on any theo
0520: 72 79 20 6f 66 0a 2a 2a 20 6c 69 61 62 69 6c 69  ry of.** liabili
0530: 74 79 2c 20 77 68 65 74 68 65 72 20 69 6e 20 63  ty, whether in c
0540: 6f 6e 74 72 61 63 74 2c 20 73 74 72 69 63 74 20  ontract, strict 
0550: 6c 69 61 62 69 6c 69 74 79 2c 20 6f 72 20 74 6f  liability, or to
0560: 72 74 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  rt (including.**
0570: 20 6e 65 67 6c 69 67 65 6e 63 65 20 6f 72 20 6f   negligence or o
0580: 74 68 65 72 77 69 73 65 29 20 61 72 69 73 69 6e  therwise) arisin
0590: 67 20 69 6e 20 61 6e 79 20 77 61 79 20 6f 75 74  g in any way out
05a0: 20 6f 66 20 74 68 65 20 75 73 65 20 6f 66 20 74   of the use of t
05b0: 68 69 73 0a 2a 2a 20 73 6f 66 74 77 61 72 65 2c  his.** software,
05c0: 20 65 76 65 6e 20 69 66 20 61 64 76 69 73 65 64   even if advised
05d0: 20 6f 66 20 74 68 65 20 70 6f 73 73 69 62 69 6c   of the possibil
05e0: 69 74 79 20 6f 66 20 73 75 63 68 20 64 61 6d 61  ity of such dama
05f0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ge..**.** This p
0600: 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74 72 69  rogram is distri
0610: 62 75 74 65 64 20 69 6e 20 74 68 65 20 68 6f 70  buted in the hop
0620: 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  e that it will b
0630: 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62 75 74  e useful,.** but
0640: 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77 61 72   without any war
0650: 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74 20 65  ranty; without e
0660: 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65 64 20  ven the implied 
0670: 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a 20 6d  warranty of.** m
0680: 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79 20 6f  erchantability o
0690: 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20 61 20  r fitness for a 
06a0: 70 61 72 74 69 63 75 6c 61 72 20 70 75 72 70 6f  particular purpo
06b0: 73 65 2e 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61  se..** appropria
06c0: 74 65 20 68 65 61 64 65 72 20 66 69 6c 65 73 2e  te header files.
06d0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .*/.#include <st
06e0: 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  dio.h>.#include 
06f0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
0700: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0710: 6e 63 6c 75 64 65 20 3c 6d 65 6d 6f 72 79 2e 68  nclude <memory.h
0720: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0730: 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  stat.h>.#include
0740: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
0750: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0760: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 20 5f 5f  .#if defined( __
0770: 4d 49 4e 47 57 33 32 5f 5f 29 20 7c 7c 20 20 64  MINGW32__) ||  d
0780: 65 66 69 6e 65 64 28 5f 5f 44 4d 43 5f 5f 29 20  efined(__DMC__) 
0790: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f  || defined(_MSC_
07a0: 56 45 52 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  VER) || defined(
07b0: 5f 5f 50 4f 43 43 5f 5f 29 0a 23 20 20 69 66 6e  __POCC__).#  ifn
07c0: 64 65 66 20 57 49 4e 33 32 0a 23 20 20 20 20 64  def WIN32.#    d
07d0: 65 66 69 6e 65 20 57 49 4e 33 32 0a 23 20 20 65  efine WIN32.#  e
07e0: 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 69 6e 63  ndif.#else.# inc
07f0: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
0800: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0810: 63 72 6f 73 20 66 6f 72 20 64 65 62 75 67 67 69  cros for debuggi
0820: 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 44 45  ng..*/.#ifdef DE
0830: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 64  BUG.static int d
0840: 65 62 75 67 4d 61 73 6b 20 3d 20 30 3b 0a 23 20  ebugMask = 0;.# 
0850: 64 65 66 69 6e 65 20 64 65 62 75 67 30 28 46 2c  define debug0(F,
0860: 4d 29 20 20 20 20 20 20 20 69 66 28 20 28 46 29  M)       if( (F)
0870: 26 64 65 62 75 67 4d 61 73 6b 20 29 7b 20 66 70  &debugMask ){ fp
0880: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 4d 29 3b  rintf(stderr,M);
0890: 20 7d 0a 23 20 64 65 66 69 6e 65 20 64 65 62 75   }.# define debu
08a0: 67 31 28 46 2c 4d 2c 41 29 20 20 20 20 20 69 66  g1(F,M,A)     if
08b0: 28 20 28 46 29 26 64 65 62 75 67 4d 61 73 6b 20  ( (F)&debugMask 
08c0: 29 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  ){ fprintf(stder
08d0: 72 2c 4d 2c 41 29 3b 20 7d 0a 23 20 64 65 66 69  r,M,A); }.# defi
08e0: 6e 65 20 64 65 62 75 67 32 28 46 2c 4d 2c 41 2c  ne debug2(F,M,A,
08f0: 42 29 20 20 20 69 66 28 20 28 46 29 26 64 65 62  B)   if( (F)&deb
0900: 75 67 4d 61 73 6b 20 29 7b 20 66 70 72 69 6e 74  ugMask ){ fprint
0910: 66 28 73 74 64 65 72 72 2c 4d 2c 41 2c 42 29 3b  f(stderr,M,A,B);
0920: 20 7d 0a 23 20 64 65 66 69 6e 65 20 64 65 62 75   }.# define debu
0930: 67 33 28 46 2c 4d 2c 41 2c 42 2c 43 29 20 69 66  g3(F,M,A,B,C) if
0940: 28 20 28 46 29 26 64 65 62 75 67 4d 61 73 6b 20  ( (F)&debugMask 
0950: 29 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  ){ fprintf(stder
0960: 72 2c 4d 2c 41 2c 42 2c 43 29 3b 20 7d 0a 23 20  r,M,A,B,C); }.# 
0970: 64 65 66 69 6e 65 20 50 41 52 53 45 52 20 20 20  define PARSER   
0980: 20 20 20 30 78 30 30 30 30 30 30 30 31 0a 23 20     0x00000001.# 
0990: 64 65 66 69 6e 65 20 44 45 43 4c 5f 44 55 4d 50  define DECL_DUMP
09a0: 20 20 20 30 78 30 30 30 30 30 30 30 32 0a 23 20     0x00000002.# 
09b0: 64 65 66 69 6e 65 20 54 4f 4b 45 4e 49 5a 45 52  define TOKENIZER
09c0: 20 20 20 30 78 30 30 30 30 30 30 30 34 0a 23 65     0x00000004.#e
09d0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 65 62  lse.# define deb
09e0: 75 67 30 28 46 6c 61 67 73 2c 20 46 6f 72 6d 61  ug0(Flags, Forma
09f0: 74 29 0a 23 20 64 65 66 69 6e 65 20 64 65 62 75  t).# define debu
0a00: 67 31 28 46 6c 61 67 73 2c 20 46 6f 72 6d 61 74  g1(Flags, Format
0a10: 2c 20 41 29 0a 23 20 64 65 66 69 6e 65 20 64 65  , A).# define de
0a20: 62 75 67 32 28 46 6c 61 67 73 2c 20 46 6f 72 6d  bug2(Flags, Form
0a30: 61 74 2c 20 41 2c 20 42 29 0a 23 20 64 65 66 69  at, A, B).# defi
0a40: 6e 65 20 64 65 62 75 67 33 28 46 6c 61 67 73 2c  ne debug3(Flags,
0a50: 20 46 6f 72 6d 61 74 2c 20 41 2c 20 42 2c 20 43   Format, A, B, C
0a60: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
0a70: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  The following ma
0a80: 63 72 6f 73 20 61 72 65 20 70 75 72 65 6c 79 20  cros are purely 
0a90: 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20  for the purpose 
0aa0: 6f 66 20 74 65 73 74 69 6e 67 20 74 68 69 73 0a  of testing this.
0ab0: 2a 2a 20 70 72 6f 67 72 61 6d 20 6f 6e 20 69 74  ** program on it
0ac0: 73 65 6c 66 2e 20 20 54 68 65 79 20 64 6f 6e 27  self.  They don'
0ad0: 74 20 72 65 61 6c 6c 79 20 63 6f 6e 74 72 69 62  t really contrib
0ae0: 75 74 65 20 74 6f 20 74 68 65 20 63 6f 64 65 2e  ute to the code.
0af0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4e 54 45  .*/.#define INTE
0b00: 52 46 41 43 45 20 31 0a 23 64 65 66 69 6e 65 20  RFACE 1.#define 
0b10: 45 58 50 4f 52 54 5f 49 4e 54 45 52 46 41 43 45  EXPORT_INTERFACE
0b20: 20 31 0a 23 64 65 66 69 6e 65 20 45 58 50 4f 52   1.#define EXPOR
0b30: 54 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 74 6f  T../*.** Each to
0b40: 6b 65 6e 20 69 6e 20 61 20 73 6f 75 72 63 65 20  ken in a source 
0b50: 66 69 6c 65 20 69 73 20 72 65 70 72 65 73 65 6e  file is represen
0b60: 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  ted by an instan
0b70: 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c  ce of.** the fol
0b80: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
0b90: 2e 20 20 54 6f 6b 65 6e 73 20 61 72 65 20 63 6f  .  Tokens are co
0ba0: 6c 6c 65 63 74 65 64 20 6f 6e 74 6f 20 61 20 6c  llected onto a l
0bb0: 69 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ist..*/.typedef 
0bc0: 73 74 72 75 63 74 20 54 6f 6b 65 6e 20 54 6f 6b  struct Token Tok
0bd0: 65 6e 3b 0a 73 74 72 75 63 74 20 54 6f 6b 65 6e  en;.struct Token
0be0: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
0bf0: 2a 7a 54 65 78 74 3b 20 20 20 20 20 20 2f 2a 20  *zText;      /* 
0c00: 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  The text of the 
0c10: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  token */.  int n
0c20: 54 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Text;           
0c30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0c40: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
0c50: 65 20 74 6f 6b 65 6e 27 73 20 74 65 78 74 20 2a  e token's text *
0c60: 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  /.  int eType;  
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0c80: 68 65 20 74 79 70 65 20 6f 66 20 74 68 69 73 20  he type of this 
0c90: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  token */.  int n
0ca0: 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20  Line;           
0cb0: 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e     /* The line n
0cc0: 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20 74  umber on which t
0cd0: 68 65 20 74 6f 6b 65 6e 20 73 74 61 72 74 73 20  he token starts 
0ce0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6d  */.  Token *pCom
0cf0: 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  ment;        /* 
0d00: 4d 6f 73 74 20 72 65 63 65 6e 74 20 62 6c 6f 63  Most recent bloc
0d10: 6b 20 63 6f 6d 6d 65 6e 74 20 62 65 66 6f 72 65  k comment before
0d20: 20 74 68 69 73 20 74 6f 6b 65 6e 20 2a 2f 0a 20   this token */. 
0d30: 20 54 6f 6b 65 6e 20 2a 70 4e 65 78 74 3b 20 20   Token *pNext;  
0d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
0d50: 20 74 6f 6b 65 6e 20 6f 6e 20 74 68 65 20 6c 69   token on the li
0d60: 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  st */.  Token *p
0d70: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
0d80: 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 6f 6b 65  /* Previous toke
0d90: 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  n on the list */
0da0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  .};../*.** Durin
0db0: 67 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 2c 20  g tokenization, 
0dc0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
0dd0: 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  t the state of t
0de0: 68 65 20 69 6e 70 75 74 0a 2a 2a 20 73 74 72 65  he input.** stre
0df0: 61 6d 20 69 73 20 68 65 6c 64 20 69 6e 20 61 6e  am is held in an
0e00: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0e10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
0e20: 74 75 72 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ture.*/.typedef 
0e30: 73 74 72 75 63 74 20 49 6e 53 74 72 65 61 6d 20  struct InStream 
0e40: 49 6e 53 74 72 65 61 6d 3b 0a 73 74 72 75 63 74  InStream;.struct
0e50: 20 49 6e 53 74 72 65 61 6d 20 7b 0a 20 20 63 6f   InStream {.  co
0e60: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  nst char *z;    
0e70: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
0e80: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 69 6e  e text of the in
0e90: 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  put */.  int i; 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0eb0: 20 2f 2a 20 4e 65 78 74 20 63 68 61 72 61 63 74   /* Next charact
0ec0: 65 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  er to read from 
0ed0: 74 68 65 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69  the input */.  i
0ee0: 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20  nt nLine;       
0ef0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
0f00: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 68  ne number for ch
0f10: 61 72 61 63 74 65 72 20 7a 5b 69 5d 20 2a 2f 0a  aracter z[i] */.
0f20: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 64  };../*.** Each d
0f30: 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 20 74 68  eclaration in th
0f40: 65 20 43 20 6f 72 20 43 2b 2b 20 73 6f 75 72 63  e C or C++ sourc
0f50: 65 20 66 69 6c 65 73 20 69 73 20 70 61 72 73 65  e files is parse
0f60: 64 20 6f 75 74 20 61 6e 64 20 73 74 6f 72 65 64  d out and stored
0f70: 20 61 73 0a 2a 2a 20 61 6e 20 69 6e 73 74 61 6e   as.** an instan
0f80: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0f90: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0fa0: 2a 0a 2a 2a 20 41 20 22 66 6f 72 77 61 72 64 20  *.** A "forward 
0fb0: 64 65 63 6c 61 72 61 74 69 6f 6e 22 20 69 73 20  declaration" is 
0fc0: 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 68  a declaration th
0fd0: 61 74 20 61 6e 20 6f 62 6a 65 63 74 20 65 78 69  at an object exi
0fe0: 73 74 73 20 74 68 61 74 0a 2a 2a 20 64 6f 65 73  sts that.** does
0ff0: 6e 27 74 20 74 65 6c 6c 20 61 62 6f 75 74 20 74  n't tell about t
1000: 68 65 20 6f 62 6a 65 63 74 73 20 73 74 72 75 63  he objects struc
1010: 74 75 72 65 2e 20 20 41 20 74 79 70 69 63 61 6c  ture.  A typical
1020: 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   forward declara
1030: 74 69 6f 6e 0a 2a 2a 20 69 73 3a 0a 2a 2a 0a 2a  tion.** is:.**.*
1040: 2a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  *          struc
1050: 74 20 58 79 7a 7a 79 3b 0a 2a 2a 0a 2a 2a 20 4e  t Xyzzy;.**.** N
1060: 6f 74 20 65 76 65 72 79 20 6f 62 6a 65 63 74 20  ot every object 
1070: 68 61 73 20 61 20 66 6f 72 77 61 72 64 20 64 65  has a forward de
1080: 63 6c 61 72 61 74 69 6f 6e 2e 20 20 49 66 20 69  claration.  If i
1090: 74 20 64 6f 65 73 2c 20 74 68 6f 75 67 68 74 2c  t does, thought,
10a0: 20 74 68 65 0a 2a 2a 20 66 6f 72 77 61 72 64 20   the.** forward 
10b0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 77 69 6c 6c  declaration will
10c0: 20 62 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   be contained in
10d0: 20 74 68 65 20 7a 46 77 64 20 66 69 65 6c 64 20   the zFwd field 
10e0: 66 6f 72 20 43 20 61 6e 64 0a 2a 2a 20 74 68 65  for C and.** the
10f0: 20 7a 46 77 64 43 70 70 20 66 6f 72 20 43 2b 2b   zFwdCpp for C++
1100: 2e 20 20 54 68 65 20 7a 44 65 63 6c 20 66 69 65  .  The zDecl fie
1110: 6c 64 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ld contains the 
1120: 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20 64 65 63 6c  complete.** decl
1130: 61 72 61 74 69 6f 6e 20 74 65 78 74 2e 0a 2a 2f  aration text..*/
1140: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1150: 44 65 63 6c 20 44 65 63 6c 3b 0a 73 74 72 75 63  Decl Decl;.struc
1160: 74 20 44 65 63 6c 20 7b 0a 20 20 63 68 61 72 20  t Decl {.  char 
1170: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a  *zName;       /*
1180: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a   Name of the obj
1190: 65 63 74 20 62 65 69 6e 67 20 64 65 63 6c 61 72  ect being declar
11a0: 65 64 2e 20 20 54 68 65 20 61 70 70 65 61 72 61  ed.  The appeara
11b0: 6e 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  nce.            
11c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74           ** of t
11d0: 68 69 73 20 6e 61 6d 65 20 69 73 20 61 20 73 6f  his name is a so
11e0: 75 72 63 65 20 66 69 6c 65 20 74 72 69 67 67 65  urce file trigge
11f0: 72 73 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rs the declarati
1200: 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  on.             
1210: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
1220: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 68 65   added to the he
1230: 61 64 65 72 20 66 6f 72 20 74 68 61 74 20 66 69  ader for that fi
1240: 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  le. */.  const c
1250: 68 61 72 20 2a 7a 46 69 6c 65 3b 20 2f 2a 20 46  har *zFile; /* F
1260: 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 65  ile from which e
1270: 78 74 72 61 63 74 65 64 2e 20 20 2a 2f 0a 20 20  xtracted.  */.  
1280: 63 68 61 72 20 2a 7a 49 66 3b 20 20 20 20 20 20  char *zIf;      
1290: 20 20 20 2f 2a 20 53 75 72 72 6f 75 6e 64 20 74     /* Surround t
12a0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 77  he declaration w
12b0: 69 74 68 20 74 68 69 73 20 23 69 66 20 2a 2f 0a  ith this #if */.
12c0: 20 20 63 68 61 72 20 2a 7a 46 77 64 3b 20 20 20    char *zFwd;   
12d0: 20 20 20 20 20 2f 2a 20 41 20 66 6f 72 77 61 72       /* A forwar
12e0: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 20  d declaration.  
12f0: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
1300: 20 6e 6f 6e 65 2e 20 2a 2f 0a 20 20 63 68 61 72   none. */.  char
1310: 20 2a 7a 46 77 64 43 70 70 3b 20 20 20 20 20 2f   *zFwdCpp;     /
1320: 2a 20 55 73 65 20 74 68 69 73 20 66 6f 72 77 61  * Use this forwa
1330: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 66  rd declaration f
1340: 6f 72 20 43 2b 2b 2e 20 2a 2f 0a 20 20 63 68 61  or C++. */.  cha
1350: 72 20 2a 7a 44 65 63 6c 3b 20 20 20 20 20 20 20  r *zDecl;       
1360: 2f 2a 20 41 20 66 75 6c 6c 20 64 65 63 6c 61 72  /* A full declar
1370: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 6f 62  ation of this ob
1380: 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
1390: 7a 45 78 74 72 61 3b 20 20 20 20 20 20 2f 2a 20  zExtra;      /* 
13a0: 45 78 74 72 61 20 64 65 63 6c 61 72 61 74 69 6f  Extra declaratio
13b0: 6e 20 74 65 78 74 20 69 6e 73 65 72 74 65 64 20  n text inserted 
13c0: 69 6e 74 6f 20 63 6c 61 73 73 20 6f 62 6a 65 63  into class objec
13d0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 78 74 72  ts */.  int extr
13e0: 61 54 79 70 65 3b 20 20 20 20 20 2f 2a 20 4c 61  aType;     /* La
13f0: 73 74 20 70 75 62 6c 69 63 3a 2c 20 70 72 6f 74  st public:, prot
1400: 65 63 74 65 64 3a 20 6f 72 20 70 72 69 76 61 74  ected: or privat
1410: 65 3a 20 69 6e 20 7a 45 78 74 72 61 44 65 63 6c  e: in zExtraDecl
1420: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 49 6e 63   */.  struct Inc
1430: 6c 75 64 65 20 2a 70 49 6e 63 6c 75 64 65 3b 20  lude *pInclude; 
1440: 20 20 2f 2a 20 23 69 6e 63 6c 75 64 65 73 20 74    /* #includes t
1450: 68 61 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20  hat come before 
1460: 74 68 69 73 20 64 65 63 6c 61 72 61 74 69 6f 6e  this declaration
1470: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   */.  int flags;
1480: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20           /* See 
1490: 74 68 65 20 22 50 72 6f 70 65 72 74 69 65 73 22  the "Properties"
14a0: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 54 6f 6b 65   below */.  Toke
14b0: 6e 20 2a 70 43 6f 6d 6d 65 6e 74 3b 20 20 20 2f  n *pComment;   /
14c0: 2a 20 41 20 62 6c 6f 63 6b 20 63 6f 6d 6d 65 6e  * A block commen
14d0: 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
14e0: 68 20 74 68 69 73 20 64 65 63 6c 61 72 61 74 69  h this declarati
14f0: 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 74 6f  on */.  Token to
1500: 6b 65 6e 43 6f 64 65 3b 20 20 20 2f 2a 20 49 6d  kenCode;   /* Im
1510: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1520: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 70 72  functions and pr
1530: 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 44 65  ocedures */.  De
1540: 63 6c 20 2a 70 53 61 6d 65 4e 61 6d 65 3b 20 20  cl *pSameName;  
1550: 20 2f 2a 20 4e 65 78 74 20 64 65 63 6c 61 72 61   /* Next declara
1560: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73 61  tion with the sa
1570: 6d 65 20 22 7a 4e 61 6d 65 22 20 2a 2f 0a 20 20  me "zName" */.  
1580: 44 65 63 6c 20 2a 70 53 61 6d 65 48 61 73 68 3b  Decl *pSameHash;
1590: 20 20 20 2f 2a 20 4e 65 78 74 20 64 65 63 6c 61     /* Next decla
15a0: 72 61 74 69 6f 6e 20 77 69 74 68 20 73 61 6d 65  ration with same
15b0: 20 68 61 73 68 20 62 75 74 20 64 69 66 66 65 72   hash but differ
15c0: 65 6e 74 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 44  ent zName */.  D
15d0: 65 63 6c 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ecl *pNext;     
15e0: 20 20 2f 2a 20 4e 65 78 74 20 64 65 63 6c 61 72    /* Next declar
15f0: 61 74 69 6f 6e 20 77 69 74 68 20 61 20 64 69 66  ation with a dif
1600: 66 65 72 65 6e 74 20 6e 61 6d 65 20 2a 2f 0a 7d  ferent name */.}
1610: 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 65 72 74  ;../*.** Propert
1620: 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
1630: 69 74 68 20 64 65 63 6c 61 72 61 74 69 6f 6e 73  ith declarations
1640: 2e 0a 2a 2a 0a 2a 2a 20 44 50 5f 46 6f 72 77 61  ..**.** DP_Forwa
1650: 72 64 20 61 6e 64 20 44 50 5f 44 65 63 6c 61 72  rd and DP_Declar
1660: 65 64 20 61 72 65 20 75 73 65 64 20 64 75 72 69  ed are used duri
1670: 6e 67 20 74 68 65 20 67 65 6e 65 72 61 74 69 6f  ng the generatio
1680: 6e 20 6f 66 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  n of a single.**
1690: 20 68 65 61 64 65 72 20 66 69 6c 65 20 69 6e 20   header file in 
16a0: 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e 74  order to prevent
16b0: 20 64 75 70 6c 69 63 61 74 65 20 64 65 63 6c 61   duplicate decla
16c0: 72 61 74 69 6f 6e 73 20 61 6e 64 20 64 65 66 69  rations and defi
16d0: 6e 69 74 69 6f 6e 73 2e 0a 2a 2a 20 44 50 5f 46  nitions..** DP_F
16e0: 6f 72 77 61 72 64 20 69 73 20 73 65 74 20 61 66  orward is set af
16f0: 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 68  ter the object h
1700: 61 73 20 62 65 65 6e 20 67 69 76 65 6e 20 61 20  as been given a 
1710: 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  forward declarat
1720: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 44 50 5f 44 65  ion.** and DP_De
1730: 63 6c 61 72 65 64 20 69 73 20 73 65 74 20 61 66  clared is set af
1740: 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 67  ter the object g
1750: 65 74 73 20 61 20 66 75 6c 6c 20 64 65 63 6c 61  ets a full decla
1760: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 20 28 45 78 61  rations..** (Exa
1770: 6d 70 6c 65 3a 20 20 41 20 66 6f 72 77 61 72 64  mple:  A forward
1780: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 73 20   declaration is 
1790: 22 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  "typedef struct 
17a0: 41 62 63 20 41 62 63 3b 22 20 61 6e 64 20 74 68  Abc Abc;" and th
17b0: 65 0a 2a 2a 20 66 75 6c 6c 20 64 65 63 6c 61 72  e.** full declar
17c0: 61 74 69 6f 6e 20 69 73 20 22 73 74 72 75 63 74  ation is "struct
17d0: 20 41 62 63 20 7b 20 69 6e 74 20 61 3b 20 66 6c   Abc { int a; fl
17e0: 6f 61 74 20 62 3b 20 7d 3b 22 2e 29 0a 2a 2a 0a  oat b; };".).**.
17f0: 2a 2a 20 54 68 65 20 44 50 5f 45 78 70 6f 72 74  ** The DP_Export
1800: 20 61 6e 64 20 44 50 5f 4c 6f 63 61 6c 20 66 6c   and DP_Local fl
1810: 61 67 73 20 61 72 65 20 6d 6f 72 65 20 70 65 72  ags are more per
1820: 6d 61 6e 65 6e 74 2e 20 20 54 68 65 79 20 6d 61  manent.  They ma
1830: 72 6b 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 74 68  rk objects.** th
1840: 61 74 20 68 61 76 65 20 45 58 50 4f 52 54 20 73  at have EXPORT s
1850: 63 6f 70 65 20 61 6e 64 20 4c 4f 43 41 4c 20 73  cope and LOCAL s
1860: 63 6f 70 65 20 72 65 73 70 65 63 74 69 76 65 6c  cope respectivel
1870: 79 2e 20 20 49 66 20 62 6f 74 68 20 6f 66 20 74  y.  If both of t
1880: 68 65 73 65 0a 2a 2a 20 6d 61 72 6b 73 20 61 72  hese.** marks ar
1890: 65 20 6d 69 73 73 69 6e 67 2c 20 74 68 65 6e 20  e missing, then 
18a0: 74 68 65 20 6f 62 6a 65 63 74 20 68 61 73 20 6c  the object has l
18b0: 69 62 72 61 72 79 20 73 63 6f 70 65 2e 20 20 54  ibrary scope.  T
18c0: 68 65 20 6d 65 61 6e 69 6e 67 73 20 6f 66 0a 2a  he meanings of.*
18d0: 2a 20 74 68 65 20 73 63 6f 70 65 73 20 61 72 65  * the scopes are
18e0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
18f0: 2a 2a 20 20 20 20 4c 4f 43 41 4c 20 73 63 6f 70  **    LOCAL scop
1900: 65 20 20 20 20 20 20 20 20 20 54 68 65 20 6f 62  e         The ob
1910: 6a 65 63 74 20 69 73 20 6f 6e 6c 79 20 75 73 61  ject is only usa
1920: 62 6c 65 20 77 69 74 68 69 6e 20 74 68 65 20 66  ble within the f
1930: 69 6c 65 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ile in.**       
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 77 68 69 63 68 20 69 74 20 69 73 20 64 65 63   which it is dec
1960: 6c 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lared..**.**    
1970: 6c 69 62 72 61 72 79 20 73 63 6f 70 65 20 20 20  library scope   
1980: 20 20 20 20 54 68 65 20 6f 62 6a 65 63 74 20 69      The object i
1990: 73 20 76 69 73 69 62 6c 65 20 61 6e 64 20 75 73  s visible and us
19a0: 61 62 6c 65 20 77 69 74 68 69 6e 20 6f 74 68 65  able within othe
19b0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
19d0: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  s in the same pr
19e0: 6f 6a 65 63 74 2e 20 20 42 79 20 69 66 20 74 68  oject.  By if th
19f0: 65 20 70 72 6f 6a 65 63 74 20 69 73 0a 2a 2a 20  e project is.** 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 20 20 20 61 20 6c 69 62 72 61 72 79         a library
1a20: 2c 20 74 68 65 6e 20 74 68 65 20 6f 62 6a 65 63  , then the objec
1a30: 74 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65  t is not visible
1a40: 20 74 6f 20 75 73 65 72 73 0a 2a 2a 20 20 20 20   to users.**    
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 6f 66 20 74 68 65 20 6c 69 62 72 61      of the libra
1a70: 72 79 2e 20 20 28 69 2e 65 2e 20 74 68 65 20 6f  ry.  (i.e. the o
1a80: 62 6a 65 63 74 20 64 6f 65 73 20 6e 6f 74 20 61  bject does not a
1a90: 70 70 65 61 72 0a 2a 2a 20 20 20 20 20 20 20 20  ppear.**        
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 77 68  in the output wh
1ac0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 2d 48 20  en using the -H 
1ad0: 6f 70 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 20  option.).**.**  
1ae0: 20 20 45 58 50 4f 52 54 20 73 63 6f 70 65 20 20    EXPORT scope  
1af0: 20 20 20 20 20 20 54 68 65 20 6f 62 6a 65 63 74        The object
1b00: 20 69 73 20 76 69 73 69 62 6c 65 20 61 6e 64 20   is visible and 
1b10: 75 73 61 62 6c 65 20 65 76 65 72 79 77 68 65 72  usable everywher
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 44 50 5f  e..**.** The DP_
1b30: 46 6c 61 67 20 69 73 20 61 20 74 65 6d 70 6f 72  Flag is a tempor
1b40: 61 72 79 20 75 73 65 20 66 6c 61 67 20 74 68 61  ary use flag tha
1b50: 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  t is used during
1b60: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 6f 0a 2a   processing to.*
1b70: 2a 20 70 72 65 76 65 6e 74 20 61 6e 20 69 6e 66  * prevent an inf
1b80: 69 6e 69 74 65 20 6c 6f 6f 70 2e 20 20 49 74 27  inite loop.  It'
1b90: 73 20 75 73 65 20 69 73 20 6c 6f 63 61 6c 69 7a  s use is localiz
1ba0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 44 50  ed..**.** The DP
1bb0: 5f 43 70 6c 75 73 70 6c 75 73 2c 20 44 50 5f 45  _Cplusplus, DP_E
1bc0: 78 74 65 72 6e 43 52 65 71 64 20 61 6e 64 20 44  xternCReqd and D
1bd0: 50 5f 45 78 74 65 72 6e 52 65 71 64 20 66 6c 61  P_ExternReqd fla
1be0: 67 73 20 61 72 65 20 70 65 72 6d 61 6e 65 6e 74  gs are permanent
1bf0: 0a 2a 2a 20 61 6e 64 20 61 72 65 20 75 73 65 64  .** and are used
1c00: 20 74 6f 20 73 70 65 63 69 66 79 20 77 68 61 74   to specify what
1c10: 20 74 79 70 65 20 6f 66 20 64 65 63 6c 61 72 61   type of declara
1c20: 74 69 6f 6e 20 74 68 65 20 6f 62 6a 65 63 74 20  tion the object 
1c30: 72 65 71 75 69 72 65 73 2e 0a 2a 2f 0a 23 64 65  requires..*/.#de
1c40: 66 69 6e 65 20 44 50 5f 46 6f 72 77 61 72 64 20  fine DP_Forward 
1c50: 20 20 20 20 20 30 78 30 30 31 20 20 20 2f 2a 20       0x001   /* 
1c60: 48 61 73 20 61 20 66 6f 72 77 61 72 64 20 64 65  Has a forward de
1c70: 63 6c 61 72 61 74 69 6f 6e 20 69 6e 20 74 68 69  claration in thi
1c80: 73 20 66 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e  s file */.#defin
1c90: 65 20 44 50 5f 44 65 63 6c 61 72 65 64 20 20 20  e DP_Declared   
1ca0: 20 20 30 78 30 30 32 20 20 20 2f 2a 20 48 61 73    0x002   /* Has
1cb0: 20 61 20 66 75 6c 6c 20 64 65 63 6c 61 72 61 74   a full declarat
1cc0: 69 6f 6e 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ion in this file
1cd0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 50 5f 45   */.#define DP_E
1ce0: 78 70 6f 72 74 20 20 20 20 20 20 20 30 78 30 30  xport       0x00
1cf0: 34 20 20 20 2f 2a 20 45 78 70 6f 72 74 20 74 68  4   /* Export th
1d00: 69 73 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  is declaration *
1d10: 2f 0a 23 64 65 66 69 6e 65 20 44 50 5f 4c 6f 63  /.#define DP_Loc
1d20: 61 6c 20 20 20 20 20 20 20 20 30 78 30 30 38 20  al        0x008 
1d30: 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 69 6e 20    /* Declare in 
1d40: 69 74 73 20 68 6f 6d 65 20 66 69 6c 65 20 6f 6e  its home file on
1d50: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 50  ly */.#define DP
1d60: 5f 46 6c 61 67 20 20 20 20 20 20 20 20 20 30 78  _Flag         0x
1d70: 30 31 30 20 20 20 2f 2a 20 55 73 65 20 74 6f 20  010   /* Use to 
1d80: 6d 61 72 6b 20 61 20 73 75 62 73 65 74 20 6f 66  mark a subset of
1d90: 20 61 20 44 65 63 6c 20 6c 69 73 74 0a 20 20 20   a Decl list.   
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1dc0: 66 6f 72 20 73 70 65 63 69 61 6c 20 70 72 6f 63  for special proc
1dd0: 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e  essing */.#defin
1de0: 65 20 44 50 5f 43 70 6c 75 73 70 6c 75 73 20 20  e DP_Cplusplus  
1df0: 20 20 30 78 30 32 30 20 20 20 2f 2a 20 48 61 73    0x020   /* Has
1e00: 20 43 2b 2b 20 6c 69 6e 6b 61 67 65 20 61 6e 64   C++ linkage and
1e10: 20 63 61 6e 6e 6f 74 20 61 70 70 65 61 72 20 69   cannot appear i
1e20: 6e 20 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  n a.            
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 2a 2a 20 43 20 68 65 61 64 65 72 20      ** C header 
1e50: 66 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  file */.#define 
1e60: 44 50 5f 45 78 74 65 72 6e 43 52 65 71 64 20 20  DP_ExternCReqd  
1e70: 30 78 30 34 30 20 20 20 2f 2a 20 50 72 65 70 65  0x040   /* Prepe
1e80: 6e 64 20 27 65 78 74 65 72 6e 20 22 43 22 27 20  nd 'extern "C"' 
1e90: 69 6e 20 61 20 43 2b 2b 20 68 65 61 64 65 72 2e  in a C++ header.
1ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 2a 2a 20 50 72 65 70 65 6e 64 20 6e 6f 74 68   ** Prepend noth
1ed0: 69 6e 67 20 69 6e 20 61 20 43 20 68 65 61 64 65  ing in a C heade
1ee0: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 50 5f  r */.#define DP_
1ef0: 45 78 74 65 72 6e 52 65 71 64 20 20 20 30 78 30  ExternReqd   0x0
1f00: 38 30 20 20 20 2f 2a 20 50 72 65 70 65 6e 64 20  80   /* Prepend 
1f10: 27 65 78 74 65 72 6e 20 22 43 22 27 20 69 6e 20  'extern "C"' in 
1f20: 61 20 43 2b 2b 20 68 65 61 64 65 72 20 69 66 0a  a C++ header if.
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 2a 2a 20 44 50 5f 43 70 6c 75 73 70 6c 75 73 20  ** DP_Cplusplus 
1f60: 69 73 20 6e 6f 74 20 61 6c 73 6f 20 73 65 74 2e  is not also set.
1f70: 20 49 66 20 44 50 5f 43 70 6c 75 73 70 6c 75 73   If DP_Cplusplus
1f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa0: 20 2a 2a 20 69 73 20 73 65 74 20 6f 72 20 74 68   ** is set or th
1fb0: 69 73 20 69 73 20 61 20 43 20 68 65 61 64 65 72  is is a C header
1fc0: 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20   then.          
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 2a 2a 20 70 72 65 70 65 6e 64        ** prepend
1ff0: 20 27 65 78 74 65 72 6e 27 20 2a 2f 0a 0a 2f 2a   'extern' */../*
2000: 0a 2a 2a 20 43 6f 6e 76 65 6e 69 65 6e 63 65 20  .** Convenience 
2010: 6d 61 63 72 6f 73 20 66 6f 72 20 64 65 61 6c 69  macros for deali
2020: 6e 67 20 77 69 74 68 20 64 65 63 6c 61 72 61 74  ng with declarat
2030: 69 6f 6e 20 70 72 6f 70 65 72 74 69 65 73 0a 2a  ion properties.*
2040: 2f 0a 23 64 65 66 69 6e 65 20 44 65 63 6c 48 61  /.#define DeclHa
2050: 73 50 72 6f 70 65 72 74 79 28 44 2c 50 29 20 20  sProperty(D,P)  
2060: 20 20 28 28 28 44 29 2d 3e 66 6c 61 67 73 26 28    (((D)->flags&(
2070: 50 29 29 3d 3d 28 50 29 29 0a 23 64 65 66 69 6e  P))==(P)).#defin
2080: 65 20 44 65 63 6c 48 61 73 41 6e 79 50 72 6f 70  e DeclHasAnyProp
2090: 65 72 74 79 28 44 2c 50 29 20 28 28 28 44 29 2d  erty(D,P) (((D)-
20a0: 3e 66 6c 61 67 73 26 28 50 29 29 21 3d 30 29 0a  >flags&(P))!=0).
20b0: 23 64 65 66 69 6e 65 20 44 65 63 6c 53 65 74 50  #define DeclSetP
20c0: 72 6f 70 65 72 74 79 28 44 2c 50 29 20 20 20 20  roperty(D,P)    
20d0: 28 44 29 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 50  (D)->flags |= (P
20e0: 29 0a 23 64 65 66 69 6e 65 20 44 65 63 6c 43 6c  ).#define DeclCl
20f0: 65 61 72 50 72 6f 70 65 72 74 79 28 44 2c 50 29  earProperty(D,P)
2100: 20 20 28 44 29 2d 3e 66 6c 61 67 73 20 26 3d 20    (D)->flags &= 
2110: 7e 28 50 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  ~(P)../*.** Thes
2120: 65 20 61 72 65 20 73 74 61 74 65 20 70 72 6f 70  e are state prop
2130: 65 72 74 69 65 73 20 6f 66 20 74 68 65 20 70 61  erties of the pa
2140: 72 73 65 72 2e 20 20 45 61 63 68 20 6f 66 20 74  rser.  Each of t
2150: 68 65 20 76 61 6c 75 65 73 20 69 73 0a 2a 2a 20  he values is.** 
2160: 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20 74 68  distinct from th
2170: 65 20 44 50 5f 20 76 61 6c 75 65 73 20 61 62 6f  e DP_ values abo
2180: 76 65 20 73 6f 20 74 68 61 74 20 62 6f 74 68 20  ve so that both 
2190: 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 0a 2a  can be used in.*
21a0: 2a 20 74 68 65 20 73 61 6d 65 20 22 66 6c 61 67  * the same "flag
21b0: 73 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  s" field..**.** 
21c0: 42 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  Be careful not t
21d0: 6f 20 63 6f 6e 66 75 73 65 20 50 53 5f 45 78 70  o confuse PS_Exp
21e0: 6f 72 74 20 77 69 74 68 20 44 50 5f 45 78 70 6f  ort with DP_Expo
21f0: 72 74 20 6f 72 0a 2a 2a 20 50 53 5f 4c 6f 63 61  rt or.** PS_Loca
2200: 6c 20 77 69 74 68 20 44 50 5f 4c 6f 63 61 6c 2e  l with DP_Local.
2210: 20 20 54 68 65 69 72 20 6e 61 6d 65 73 20 61 72    Their names ar
2220: 65 20 73 69 6d 69 6c 61 72 2c 20 62 75 74 20 74  e similar, but t
2230: 68 65 20 6d 65 61 6e 69 6e 67 73 0a 2a 2a 20 6f  he meanings.** o
2240: 66 20 74 68 65 73 65 20 66 6c 61 67 73 20 61 72  f these flags ar
2250: 65 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  e very different
2260: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f  ..*/.#define PS_
2270: 45 78 74 65 72 6e 20 20 20 20 20 20 20 20 30 78  Extern        0x
2280: 30 30 30 38 30 30 20 20 20 20 2f 2a 20 22 65 78  000800    /* "ex
2290: 74 65 72 6e 22 20 68 61 73 20 62 65 65 6e 20 73  tern" has been s
22a0: 65 65 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  een */.#define P
22b0: 53 5f 45 78 70 6f 72 74 20 20 20 20 20 20 20 20  S_Export        
22c0: 30 78 30 30 31 30 30 30 20 20 20 20 2f 2a 20 49  0x001000    /* I
22d0: 66 20 62 65 74 77 65 65 6e 20 22 23 69 66 20 45  f between "#if E
22e0: 58 50 4f 52 54 5f 49 4e 54 45 52 46 41 43 45 22  XPORT_INTERFACE"
22f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 22 23 65        ** and "#e
2320: 6e 64 69 66 22 20 2a 2f 0a 23 64 65 66 69 6e 65  ndif" */.#define
2330: 20 50 53 5f 45 78 70 6f 72 74 32 20 20 20 20 20   PS_Export2     
2340: 20 20 30 78 30 30 32 30 30 30 20 20 20 20 2f 2a    0x002000    /*
2350: 20 49 66 20 22 45 58 50 4f 52 54 22 20 73 65 65   If "EXPORT" see
2360: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f  n */.#define PS_
2370: 54 79 70 65 64 65 66 20 20 20 20 20 20 20 30 78  Typedef       0x
2380: 30 30 34 30 30 30 20 20 20 20 2f 2a 20 49 66 20  004000    /* If 
2390: 22 74 79 70 65 64 65 66 22 20 68 61 73 20 62 65  "typedef" has be
23a0: 65 6e 20 73 65 65 6e 20 2a 2f 0a 23 64 65 66 69  en seen */.#defi
23b0: 6e 65 20 50 53 5f 53 74 61 74 69 63 20 20 20 20  ne PS_Static    
23c0: 20 20 20 20 30 78 30 30 38 30 30 30 20 20 20 20      0x008000    
23d0: 2f 2a 20 49 66 20 22 73 74 61 74 69 63 22 20 68  /* If "static" h
23e0: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 2a 2f 0a  as been seen */.
23f0: 23 64 65 66 69 6e 65 20 50 53 5f 49 6e 74 65 72  #define PS_Inter
2400: 66 61 63 65 20 20 20 20 20 30 78 30 31 30 30 30  face     0x01000
2410: 30 20 20 20 20 2f 2a 20 49 66 20 77 69 74 68 69  0    /* If withi
2420: 6e 20 23 69 66 20 49 4e 54 45 52 46 41 43 45 2e  n #if INTERFACE.
2430: 2e 23 65 6e 64 69 66 20 2a 2f 0a 23 64 65 66 69  .#endif */.#defi
2440: 6e 65 20 50 53 5f 4d 65 74 68 6f 64 20 20 20 20  ne PS_Method    
2450: 20 20 20 20 30 78 30 32 30 30 30 30 20 20 20 20      0x020000    
2460: 2f 2a 20 49 66 20 22 3a 3a 22 20 74 6f 6b 65 6e  /* If "::" token
2470: 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 2a   has been seen *
2480: 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 4c 6f 63  /.#define PS_Loc
2490: 61 6c 20 20 20 20 20 20 20 20 20 30 78 30 34 30  al         0x040
24a0: 30 30 30 20 20 20 20 2f 2a 20 49 66 20 77 69 74  000    /* If wit
24b0: 68 69 6e 20 23 69 66 20 4c 4f 43 41 4c 5f 49 4e  hin #if LOCAL_IN
24c0: 54 45 52 46 41 43 45 2e 2e 23 65 6e 64 69 66 20  TERFACE..#endif 
24d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 4c 6f  */.#define PS_Lo
24e0: 63 61 6c 32 20 20 20 20 20 20 20 20 30 78 30 38  cal2        0x08
24f0: 30 30 30 30 20 20 20 20 2f 2a 20 49 66 20 22 4c  0000    /* If "L
2500: 4f 43 41 4c 22 20 73 65 65 6e 2e 20 2a 2f 0a 23  OCAL" seen. */.#
2510: 64 65 66 69 6e 65 20 50 53 5f 50 75 62 6c 69 63  define PS_Public
2520: 20 20 20 20 20 20 20 20 30 78 31 30 30 30 30 30          0x100000
2530: 20 20 20 20 2f 2a 20 49 66 20 22 50 55 42 4c 49      /* If "PUBLI
2540: 43 22 20 73 65 65 6e 2e 20 2a 2f 0a 23 64 65 66  C" seen. */.#def
2550: 69 6e 65 20 50 53 5f 50 72 6f 74 65 63 74 65 64  ine PS_Protected
2560: 20 20 20 20 20 30 78 32 30 30 30 30 30 20 20 20       0x200000   
2570: 20 2f 2a 20 49 66 20 22 50 52 4f 54 45 43 54 45   /* If "PROTECTE
2580: 44 22 20 73 65 65 6e 2e 20 2a 2f 0a 23 64 65 66  D" seen. */.#def
2590: 69 6e 65 20 50 53 5f 50 72 69 76 61 74 65 20 20  ine PS_Private  
25a0: 20 20 20 20 20 30 78 34 30 30 30 30 30 20 20 20       0x400000   
25b0: 20 2f 2a 20 49 66 20 22 50 52 49 56 41 54 45 22   /* If "PRIVATE"
25c0: 20 73 65 65 6e 2e 20 2a 2f 0a 23 64 65 66 69 6e   seen. */.#defin
25d0: 65 20 50 53 5f 50 50 50 20 20 20 20 20 20 20 20  e PS_PPP        
25e0: 20 20 20 30 78 37 30 30 30 30 30 20 20 20 20 2f     0x700000    /
25f0: 2a 20 49 66 20 61 6e 79 20 6f 66 20 50 55 42 4c  * If any of PUBL
2600: 49 43 2c 20 50 52 49 56 41 54 45 2c 20 50 52 4f  IC, PRIVATE, PRO
2610: 54 45 43 54 45 44 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  TECTED */../*.**
2620: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
2630: 65 74 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20  et of flags are 
2640: 4f 52 65 64 20 69 6e 74 6f 20 74 68 65 20 22 66  ORed into the "f
2650: 6c 61 67 73 22 20 66 69 65 6c 64 20 6f 66 0a 2a  lags" field of.*
2660: 2a 20 61 20 44 65 63 6c 20 69 6e 20 6f 72 64 65  * a Decl in orde
2670: 72 20 74 6f 20 69 64 65 6e 74 69 66 79 20 77 68  r to identify wh
2680: 61 74 20 74 79 70 65 20 6f 66 20 6f 62 6a 65 63  at type of objec
2690: 74 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 64 65  t is being.** de
26a0: 63 6c 61 72 65 64 2e 0a 2a 2f 0a 23 64 65 66 69  clared..*/.#defi
26b0: 6e 65 20 54 59 5f 43 6c 61 73 73 20 20 20 20 20  ne TY_Class     
26c0: 20 20 20 20 30 78 30 30 31 30 30 30 30 30 0a 23      0x00100000.#
26d0: 64 65 66 69 6e 65 20 54 59 5f 53 75 62 72 6f 75  define TY_Subrou
26e0: 74 69 6e 65 20 20 20 20 30 78 30 30 32 30 30 30  tine    0x002000
26f0: 30 30 0a 23 64 65 66 69 6e 65 20 54 59 5f 4d 61  00.#define TY_Ma
2700: 63 72 6f 20 20 20 20 20 20 20 20 20 30 78 30 30  cro         0x00
2710: 34 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 54  400000.#define T
2720: 59 5f 54 79 70 65 64 65 66 20 20 20 20 20 20 20  Y_Typedef       
2730: 30 78 30 30 38 30 30 30 30 30 0a 23 64 65 66 69  0x00800000.#defi
2740: 6e 65 20 54 59 5f 56 61 72 69 61 62 6c 65 20 20  ne TY_Variable  
2750: 20 20 20 20 30 78 30 31 30 30 30 30 30 30 0a 23      0x01000000.#
2760: 64 65 66 69 6e 65 20 54 59 5f 53 74 72 75 63 74  define TY_Struct
2770: 75 72 65 20 20 20 20 20 30 78 30 32 30 30 30 30  ure     0x020000
2780: 30 30 0a 23 64 65 66 69 6e 65 20 54 59 5f 55 6e  00.#define TY_Un
2790: 69 6f 6e 20 20 20 20 20 20 20 20 20 30 78 30 34  ion         0x04
27a0: 30 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 54  000000.#define T
27b0: 59 5f 45 6e 75 6d 65 72 61 74 69 6f 6e 20 20 20  Y_Enumeration   
27c0: 30 78 30 38 30 30 30 30 30 30 0a 23 64 65 66 69  0x08000000.#defi
27d0: 6e 65 20 54 59 5f 44 65 66 75 6e 63 74 20 20 20  ne TY_Defunct   
27e0: 20 20 20 20 30 78 31 30 30 30 30 30 30 30 20 20      0x10000000  
27f0: 2f 2a 20 55 73 65 64 20 74 6f 20 65 72 61 73 65  /* Used to erase
2800: 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a   a declaration *
2810: 2f 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 6e 65  /../*.** Each ne
2820: 73 74 65 64 20 23 69 66 20 28 6f 72 20 23 69 66  sted #if (or #if
2830: 64 65 66 20 6f 72 20 23 69 66 6e 64 65 66 29 20  def or #ifndef) 
2840: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  is stored in a s
2850: 74 61 63 6b 20 6f 66 0a 2a 2a 20 69 6e 73 74 61  tack of.** insta
2860: 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  nces of the foll
2870: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
2880: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2890: 63 74 20 49 66 6d 61 63 72 6f 20 49 66 6d 61 63  ct Ifmacro Ifmac
28a0: 72 6f 3b 0a 73 74 72 75 63 74 20 49 66 6d 61 63  ro;.struct Ifmac
28b0: 72 6f 20 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  ro {.  int nLine
28c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e  ;         /* Lin
28d0: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  e number where t
28e0: 68 69 73 20 6d 61 63 72 6f 20 6f 63 63 75 72 73  his macro occurs
28f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
2900: 64 69 74 69 6f 6e 3b 20 20 2f 2a 20 54 65 78 74  dition;  /* Text
2910: 20 6f 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   of the conditio
2920: 6e 20 66 6f 72 20 74 68 69 73 20 6d 61 63 72 6f  n for this macro
2930: 20 2a 2f 0a 20 20 49 66 6d 61 63 72 6f 20 2a 70   */.  Ifmacro *p
2940: 4e 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74  Next;    /* Next
2950: 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 73 74 61   down in the sta
2960: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ck */.  int flag
2970: 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  s;         /* Ca
2980: 6e 20 68 6f 6c 64 20 50 53 5f 45 78 70 6f 72 74  n hold PS_Export
2990: 2c 20 50 53 5f 49 6e 74 65 72 66 61 63 65 20 6f  , PS_Interface o
29a0: 72 20 50 53 5f 4c 6f 63 61 6c 20 66 6c 61 67 73  r PS_Local flags
29b0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 57 68   */.};../*.** Wh
29c0: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 66 69 6c  en parsing a fil
29d0: 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 65  e, we need to ke
29e0: 65 70 20 74 72 61 63 6b 20 6f 66 20 77 68 61 74  ep track of what
29f0: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 68 61 76   other files hav
2a00: 65 0a 2a 2a 20 62 65 20 23 69 6e 63 6c 75 64 65  e.** be #include
2a10: 2d 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 23  -ed.  For each #
2a20: 69 6e 63 6c 75 64 65 20 66 6f 75 6e 64 2c 20 77  include found, w
2a30: 65 20 63 72 65 61 74 65 20 61 6e 20 69 6e 73 74  e create an inst
2a40: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ance of.** the f
2a50: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2a60: 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  re..*/.typedef s
2a70: 74 72 75 63 74 20 49 6e 63 6c 75 64 65 20 49 6e  truct Include In
2a80: 63 6c 75 64 65 3b 0a 73 74 72 75 63 74 20 49 6e  clude;.struct In
2a90: 63 6c 75 64 65 20 7b 0a 20 20 63 68 61 72 20 2a  clude {.  char *
2aa0: 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  zFile;       /* 
2ab0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 66 69 6c 65  The name of file
2ac0: 20 69 6e 63 6c 75 64 65 2e 20 20 49 6e 63 6c 75   include.  Inclu
2ad0: 64 65 73 20 22 22 20 6f 72 20 3c 3e 20 2a 2f 0a  des "" or <> */.
2ae0: 20 20 63 68 61 72 20 2a 7a 49 66 3b 20 20 20 20    char *zIf;    
2af0: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2b00: 55 4c 4c 2c 20 23 69 6e 63 6c 75 64 65 20 73 68  ULL, #include sh
2b10: 6f 75 6c 64 20 62 65 20 65 6e 63 6c 6f 73 65 64  ould be enclosed
2b20: 20 69 6e 20 23 69 66 20 2a 2f 0a 20 20 63 68 61   in #if */.  cha
2b30: 72 20 2a 7a 4c 61 62 65 6c 3b 20 20 20 20 20 20  r *zLabel;      
2b40: 2f 2a 20 41 20 75 6e 69 71 75 65 20 6c 61 62 65  /* A unique labe
2b50: 6c 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 69  l used to test i
2b60: 66 20 74 68 69 73 20 23 69 6e 63 6c 75 64 65 20  f this #include 
2b70: 68 61 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  has.            
2b80: 20 20 20 20 20 20 20 20 20 20 2a 20 61 70 70 65            * appe
2b90: 61 72 65 64 20 61 6c 72 65 61 64 79 20 69 6e 20  ared already in 
2ba0: 61 20 66 69 6c 65 20 6f 72 20 6e 6f 74 20 2a 2f  a file or not */
2bb0: 0a 20 20 49 6e 63 6c 75 64 65 20 2a 70 4e 65 78  .  Include *pNex
2bc0: 74 3b 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  t;    /* Previou
2bd0: 73 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 2c 20  s include file, 
2be0: 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 20  or NULL if this 
2bf0: 69 73 20 74 68 65 20 66 69 72 73 74 20 2a 2f 0a  is the first */.
2c00: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 64 65 6e 74 69  };../*.** Identi
2c10: 66 69 65 72 73 20 66 6f 75 6e 64 20 69 6e 20 61  fiers found in a
2c20: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 74 68 61   source file tha
2c30: 74 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  t might be used 
2c40: 6c 61 74 65 72 20 74 6f 20 70 72 6f 76 6f 6b 65  later to provoke
2c50: 0a 2a 2a 20 74 68 65 20 63 6f 70 79 69 6e 67 20  .** the copying 
2c60: 6f 66 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e  of a declaration
2c70: 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 73   into the corres
2c80: 70 6f 6e 64 69 6e 67 20 68 65 61 64 65 72 20 66  ponding header f
2c90: 69 6c 65 20 61 72 65 0a 2a 2a 20 73 74 6f 72 65  ile are.** store
2ca0: 64 20 69 6e 20 61 20 68 61 73 68 20 74 61 62 6c  d in a hash tabl
2cb0: 65 20 61 73 20 69 6e 73 74 61 6e 63 65 73 20 6f  e as instances o
2cc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2cd0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
2ce0: 70 65 64 65 66 20 73 74 72 75 63 74 20 49 64 65  pedef struct Ide
2cf0: 6e 74 20 49 64 65 6e 74 3b 0a 73 74 72 75 63 74  nt Ident;.struct
2d00: 20 49 64 65 6e 74 20 7b 0a 20 20 63 68 61 72 20   Ident {.  char 
2d10: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 2f  *zName;        /
2d20: 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68  * The text of th
2d30: 69 73 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f  is identifier */
2d40: 0a 20 20 49 64 65 6e 74 20 2a 70 43 6f 6c 6c 69  .  Ident *pColli
2d50: 64 65 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20 69  de;    /* Next i
2d60: 64 65 6e 74 69 66 69 65 72 20 77 69 74 68 20 74  dentifier with t
2d70: 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a  he same hash */.
2d80: 20 20 49 64 65 6e 74 20 2a 70 4e 65 78 74 3b 20    Ident *pNext; 
2d90: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 64        /* Next id
2da0: 65 6e 74 69 66 69 65 72 20 69 6e 20 61 20 6c 69  entifier in a li
2db0: 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a  st of them all *
2dc0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 6f  /.};../*.** A co
2dd0: 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 6f 66 20  mplete table of 
2de0: 69 64 65 6e 74 69 66 69 65 72 73 20 69 73 20 73  identifiers is s
2df0: 74 6f 72 65 64 20 69 6e 20 61 6e 20 69 6e 73 74  tored in an inst
2e00: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ance of.** the n
2e10: 65 78 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ext structure..*
2e20: 2f 0a 23 64 65 66 69 6e 65 20 49 44 45 4e 54 5f  /.#define IDENT_
2e30: 48 41 53 48 5f 53 49 5a 45 20 32 32 33 37 0a 74  HASH_SIZE 2237.t
2e40: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49 64  ypedef struct Id
2e50: 65 6e 74 54 61 62 6c 65 20 49 64 65 6e 74 54 61  entTable IdentTa
2e60: 62 6c 65 3b 0a 73 74 72 75 63 74 20 49 64 65 6e  ble;.struct Iden
2e70: 74 54 61 62 6c 65 20 7b 0a 20 20 49 64 65 6e 74  tTable {.  Ident
2e80: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ea0: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 69 64 65 6e  List of all iden
2eb0: 74 69 66 69 65 72 73 20 69 6e 20 74 68 69 73 20  tifiers in this 
2ec0: 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64 65 6e 74  table */.  Ident
2ed0: 20 2a 61 70 54 61 62 6c 65 5b 49 44 45 4e 54 5f   *apTable[IDENT_
2ee0: 48 41 53 48 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20  HASH_SIZE];  /* 
2ef0: 54 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a  The hash table *
2f00: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
2f10: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2f20: 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e  ure holds all in
2f30: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
2f40: 73 69 6e 67 6c 65 0a 2a 2a 20 73 6f 75 72 63 65  single.** source
2f50: 20 66 69 6c 65 20 6e 61 6d 65 64 20 6f 6e 20 74   file named on t
2f60: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
2f70: 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 2e  of this program.
2f80: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2f90: 63 74 20 49 6e 46 69 6c 65 20 49 6e 46 69 6c 65  ct InFile InFile
2fa0: 3b 0a 73 74 72 75 63 74 20 49 6e 46 69 6c 65 20  ;.struct InFile 
2fb0: 7b 0a 20 20 63 68 61 72 20 2a 7a 53 72 63 3b 20  {.  char *zSrc; 
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fd0: 4e 61 6d 65 20 6f 66 20 69 6e 70 75 74 20 66 69  Name of input fi
2fe0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48  le */.  char *zH
2ff0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
3000: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3010: 67 65 6e 65 72 61 74 65 64 20 2e 68 20 66 69 6c  generated .h fil
3020: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 70 75 74  e for this input
3030: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
3050: 57 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  Will be NULL if 
3060: 69 6e 70 75 74 20 69 73 20 74 6f 20 62 65 20 73  input is to be s
3070: 63 61 6e 6e 65 64 20 6f 6e 6c 79 20 2a 2f 0a 20  canned only */. 
3080: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
3090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
30a0: 20 6f 72 20 6d 6f 72 65 20 44 50 5f 2c 20 50 53   or more DP_, PS
30b0: 5f 20 61 6e 64 2f 6f 72 20 54 59 5f 20 66 6c 61  _ and/or TY_ fla
30c0: 67 73 20 2a 2f 0a 20 20 49 6e 46 69 6c 65 20 2a  gs */.  InFile *
30d0: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
30e0: 20 2f 2a 20 4e 65 78 74 20 69 6e 70 75 74 20 66   /* Next input f
30f0: 69 6c 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ile in the list 
3100: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20  of them all */. 
3110: 20 49 64 65 6e 74 54 61 62 6c 65 20 69 64 54 61   IdentTable idTa
3120: 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ble;      /* All
3130: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
3140: 74 68 69 73 20 69 6e 70 75 74 20 66 69 6c 65 20  this input file 
3150: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
3160: 75 6e 62 6f 75 6e 64 65 64 20 73 74 72 69 6e 67  unbounded string
3170: 20 69 73 20 61 62 6c 65 20 74 6f 20 67 72 6f 77   is able to grow
3180: 20 77 69 74 68 6f 75 74 20 6c 69 6d 69 74 2e 20   without limit. 
3190: 20 57 65 20 75 73 65 20 74 68 65 73 65 0a 2a 2a   We use these.**
31a0: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 6c 61   to construct la
31b0: 72 67 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  rge in-memory st
31c0: 72 69 6e 67 73 20 66 72 6f 6d 20 6c 6f 74 73 20  rings from lots 
31d0: 6f 66 20 73 6d 61 6c 6c 65 72 20 63 6f 6d 70 6f  of smaller compo
31e0: 6e 65 6e 74 73 2e 0a 2a 2f 0a 74 79 70 65 64 65  nents..*/.typede
31f0: 66 20 73 74 72 75 63 74 20 53 74 72 69 6e 67 20  f struct String 
3200: 53 74 72 69 6e 67 3b 0a 73 74 72 75 63 74 20 53  String;.struct S
3210: 74 72 69 6e 67 20 7b 0a 20 20 69 6e 74 20 6e 41  tring {.  int nA
3220: 6c 6c 6f 63 3b 20 20 20 20 20 20 2f 2a 20 4e 75  lloc;      /* Nu
3230: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
3240: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  located */.  int
3250: 20 6e 55 73 65 64 3b 20 20 20 20 20 20 20 2f 2a   nUsed;       /*
3260: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
3270: 20 75 73 65 64 20 28 6e 6f 74 20 63 6f 75 6e 74   used (not count
3280: 69 6e 67 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61  ing null termina
3290: 74 6f 72 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tor) */.  char *
32a0: 7a 54 65 78 74 3b 20 20 20 20 20 2f 2a 20 54 65  zText;     /* Te
32b0: 78 74 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  xt of the string
32c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
32d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
32e0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
32f0: 20 6c 6f 74 20 6f 66 20 73 74 61 74 65 20 69 6e   lot of state in
3300: 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 0a 2a  formation used.*
3310: 2a 20 77 68 69 6c 65 20 67 65 6e 65 72 61 74 69  * while generati
3320: 6e 67 20 61 20 2e 68 20 66 69 6c 65 2e 20 20 57  ng a .h file.  W
3330: 65 20 70 75 74 20 74 68 65 20 69 6e 66 6f 72 6d  e put the inform
3340: 61 74 69 6f 6e 20 69 6e 20 74 68 69 73 20 73 74  ation in this st
3350: 72 75 63 74 75 72 65 0a 2a 2a 20 61 6e 64 20 70  ructure.** and p
3360: 61 73 73 20 61 72 6f 75 6e 64 20 61 20 70 6f 69  ass around a poi
3370: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73 74 72  nter to this str
3380: 75 63 74 75 72 65 2c 20 72 61 74 68 65 72 20 74  ucture, rather t
3390: 68 61 6e 20 70 61 73 73 20 61 72 6f 75 6e 64 0a  han pass around.
33a0: 2a 2a 20 61 6c 6c 20 6f 66 20 74 68 65 20 69 6e  ** all of the in
33b0: 66 6f 72 6d 61 74 69 6f 6e 20 73 65 70 61 72 61  formation separa
33c0: 74 65 6c 79 2e 20 20 54 68 69 73 20 68 65 6c 70  tely.  This help
33d0: 73 20 72 65 64 75 63 65 20 74 68 65 20 6e 75 6d  s reduce the num
33e0: 62 65 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65  ber of.** argume
33f0: 6e 74 73 20 74 6f 20 67 65 6e 65 72 61 74 6f 72  nts to generator
3400: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 74   functions..*/.t
3410: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 47 65  ypedef struct Ge
3420: 6e 53 74 61 74 65 20 47 65 6e 53 74 61 74 65 3b  nState GenState;
3430: 0a 73 74 72 75 63 74 20 47 65 6e 53 74 61 74 65  .struct GenState
3440: 20 7b 0a 20 20 53 74 72 69 6e 67 20 2a 70 53 74   {.  String *pSt
3450: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  r;          /* W
3460: 72 69 74 65 20 6f 75 74 70 75 74 20 74 6f 20 74  rite output to t
3470: 68 69 73 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  his string */.  
3480: 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 54 61 62  IdentTable *pTab
3490: 6c 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c  le;    /* A tabl
34a0: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 7a 4c  e holding the zL
34b0: 61 62 65 6c 20 6f 66 20 65 76 65 72 79 20 23 69  abel of every #i
34c0: 6e 63 6c 75 64 65 20 74 68 61 74 0a 20 20 20 20  nclude that.    
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e0: 20 20 20 20 20 20 2a 20 68 61 73 20 61 6c 72 65        * has alre
34f0: 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74  ady been generat
3500: 65 64 2e 20 20 55 73 65 64 20 74 6f 20 61 76 6f  ed.  Used to avo
3510: 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  id.             
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 67               * g
3530: 65 6e 65 72 61 74 69 6e 67 20 64 75 70 6c 69 63  enerating duplic
3540: 61 74 65 20 23 69 6e 63 6c 75 64 65 73 2e 20 2a  ate #includes. *
3550: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3560: 7a 49 66 3b 20 20 20 20 20 20 20 2f 2a 20 49 66  zIf;       /* If
3570: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
3580: 77 65 20 61 72 65 20 77 69 74 68 69 6e 20 61 20  we are within a 
3590: 23 69 66 20 77 69 74 68 0a 20 20 20 20 20 20 20  #if with.       
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 20 20 20 2a 20 74 68 69 73 20 61 72 67 75 6d 65     * this argume
35c0: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  nt. */.  int nEr
35d0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
35e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
35f0: 6f 72 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ors */.  const c
3600: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
3610: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
3620: 6f 75 72 63 65 20 66 69 6c 65 20 62 65 69 6e 67  ource file being
3630: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
3640: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
3650: 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
3660: 66 6c 61 67 73 20 28 44 50 5f 20 61 6e 64 20 50  flags (DP_ and P
3670: 53 5f 20 66 6c 61 67 73 20 61 62 6f 76 65 29 20  S_ flags above) 
3680: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
3690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 20   following text 
36a0: 6c 69 6e 65 20 61 70 70 65 61 72 73 20 61 74 20  line appears at 
36b0: 74 68 65 20 74 6f 70 20 6f 66 20 65 76 65 72 79  the top of every
36c0: 20 66 69 6c 65 20 67 65 6e 65 72 61 74 65 64 0a   file generated.
36d0: 2a 2a 20 62 79 20 74 68 69 73 20 70 72 6f 67 72  ** by this progr
36e0: 61 6d 2e 20 20 42 79 20 72 65 63 6f 67 6e 69 7a  am.  By recogniz
36f0: 69 6e 67 20 74 68 69 73 20 6c 69 6e 65 2c 20 74  ing this line, t
3700: 68 65 20 70 72 6f 67 72 61 6d 20 63 61 6e 20 62  he program can b
3710: 65 20 73 75 72 65 0a 2a 2a 20 6e 65 76 65 72 20  e sure.** never 
3720: 74 6f 20 72 65 61 64 20 61 20 66 69 6c 65 20 74  to read a file t
3730: 68 61 74 20 69 74 20 67 65 6e 65 72 61 74 65 64  hat it generated
3740: 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 54   itself..**.** T
3750: 68 65 20 22 23 75 6e 64 65 66 20 49 4e 54 45 52  he "#undef INTER
3760: 46 41 43 45 22 20 70 61 72 74 20 69 73 20 61 20  FACE" part is a 
3770: 68 61 63 6b 20 74 6f 20 77 6f 72 6b 20 61 72 6f  hack to work aro
3780: 75 6e 64 20 61 20 6e 61 6d 65 20 63 6f 6c 6c 69  und a name colli
3790: 73 69 6f 6e 0a 2a 2a 20 69 6e 20 4d 53 56 43 20  sion.** in MSVC 
37a0: 32 30 30 38 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  2008..*/.const c
37b0: 68 61 72 20 7a 54 6f 70 4c 69 6e 65 5b 5d 20 3d  har zTopLine[] =
37c0: 0a 20 20 22 2f 2a 20 5c 61 54 68 69 73 20 66 69  .  "/* \aThis fi
37d0: 6c 65 20 77 61 73 20 61 75 74 6f 6d 61 74 69 63  le was automatic
37e0: 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 2e 20  ally generated. 
37f0: 20 44 6f 20 6e 6f 74 20 65 64 69 74 21 20 2a 2f   Do not edit! */
3800: 5c 6e 22 0a 20 20 22 23 75 6e 64 65 66 20 49 4e  \n".  "#undef IN
3810: 54 45 52 46 41 43 45 5c 6e 22 3b 0a 23 64 65 66  TERFACE\n";.#def
3820: 69 6e 65 20 6e 54 6f 70 4c 69 6e 65 20 28 73 69  ine nTopLine (si
3830: 7a 65 6f 66 28 7a 54 6f 70 4c 69 6e 65 29 2d 31  zeof(zTopLine)-1
3840: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d  )../*.** The nam
3850: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
3860: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61  rrently being pa
3870: 72 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsed..*/.static 
3880: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
3890: 65 6e 61 6d 65 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ename;../*.** Th
38a0: 65 20 73 74 61 63 6b 20 6f 66 20 23 69 66 20 6d  e stack of #if m
38b0: 61 63 72 6f 73 20 66 6f 72 20 74 68 65 20 66 69  acros for the fi
38c0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
38d0: 6e 67 20 70 61 72 73 65 64 2e 0a 2a 2f 0a 73 74  ng parsed..*/.st
38e0: 61 74 69 63 20 49 66 6d 61 63 72 6f 20 2a 69 66  atic Ifmacro *if
38f0: 53 74 61 63 6b 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  Stack = 0;../*.*
3900: 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
3910: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
3920: 62 65 65 6e 20 23 69 6e 63 6c 75 64 65 64 20 73  been #included s
3930: 6f 20 66 61 72 20 69 6e 20 61 20 66 69 6c 65 20  o far in a file 
3940: 62 65 69 6e 67 0a 2a 2a 20 70 61 72 73 65 64 2e  being.** parsed.
3950: 0a 2a 2f 0a 73 74 61 74 69 63 20 49 6e 63 6c 75  .*/.static Inclu
3960: 64 65 20 2a 69 6e 63 6c 75 64 65 4c 69 73 74 20  de *includeList 
3970: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  = 0;../*.** The 
3980: 6c 61 73 74 20 62 6c 6f 63 6b 20 63 6f 6d 6d 65  last block comme
3990: 6e 74 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74  nt seen..*/.stat
39a0: 69 63 20 54 6f 6b 65 6e 20 2a 62 6c 6f 63 6b 43  ic Token *blockC
39b0: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  omment = 0;../*.
39c0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
39d0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 66 20   flag is set if 
39e0: 74 68 65 20 2d 64 6f 63 20 66 6c 61 67 20 61 70  the -doc flag ap
39f0: 70 65 61 72 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  pears on the.** 
3a00: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 0a 2a 2f  command line..*/
3a10: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 63 5f  .static int doc_
3a20: 66 6c 61 67 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  flag = 0;../*.**
3a30: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
3a40: 67 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  g flag is set, t
3a50: 68 65 6e 20 6d 61 6b 65 68 65 61 64 65 72 73 20  hen makeheaders 
3a60: 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a  will attempt to.
3a70: 2a 2a 20 67 65 6e 65 72 61 74 65 20 70 72 6f 74  ** generate prot
3a80: 6f 74 79 70 65 73 20 66 6f 72 20 73 74 61 74 69  otypes for stati
3a90: 63 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  c functions and 
3aa0: 70 72 6f 63 65 64 75 72 65 73 2e 0a 2a 2f 0a 73  procedures..*/.s
3ab0: 74 61 74 69 63 20 69 6e 74 20 70 72 6f 74 6f 5f  tatic int proto_
3ac0: 73 74 61 74 69 63 20 3d 20 30 3b 0a 0a 2f 2a 0a  static = 0;../*.
3ad0: 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  ** A list of all
3ae0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 20 20   declarations.  
3af0: 54 68 65 20 6c 69 73 74 20 69 73 20 68 65 6c 64  The list is held
3b00: 20 74 6f 67 65 74 68 65 72 20 75 73 69 6e 67 20   together using 
3b10: 74 68 65 0a 2a 2a 20 70 4e 65 78 74 20 66 69 65  the.** pNext fie
3b20: 6c 64 20 6f 66 20 74 68 65 20 44 65 63 6c 20 73  ld of the Decl s
3b30: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
3b40: 74 69 63 20 44 65 63 6c 20 2a 70 44 65 63 6c 46  tic Decl *pDeclF
3b50: 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73  irst;    /* Firs
3b60: 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  t on the list */
3b70: 0a 73 74 61 74 69 63 20 44 65 63 6c 20 2a 70 44  .static Decl *pD
3b80: 65 63 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  eclLast;     /* 
3b90: 4c 61 73 74 20 6f 6e 20 74 68 65 20 6c 69 73 74  Last on the list
3ba0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 68 61 73   */../*.** A has
3bb0: 68 20 74 61 62 6c 65 20 6f 66 20 61 6c 6c 20 64  h table of all d
3bc0: 65 63 6c 61 72 61 74 69 6f 6e 73 0a 2a 2f 0a 23  eclarations.*/.#
3bd0: 64 65 66 69 6e 65 20 44 45 43 4c 5f 48 41 53 48  define DECL_HASH
3be0: 5f 53 49 5a 45 20 33 33 37 31 0a 73 74 61 74 69  _SIZE 3371.stati
3bf0: 63 20 44 65 63 6c 20 2a 61 70 54 61 62 6c 65 5b  c Decl *apTable[
3c00: 44 45 43 4c 5f 48 41 53 48 5f 53 49 5a 45 5d 3b  DECL_HASH_SIZE];
3c10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 45 53 54  ../*.** The TEST
3c20: 20 6d 61 63 72 6f 20 6d 75 73 74 20 62 65 20 64   macro must be d
3c30: 65 66 69 6e 65 64 20 74 6f 20 73 6f 6d 65 74 68  efined to someth
3c40: 69 6e 67 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ing.  Make sure 
3c50: 74 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 63  this is the.** c
3c60: 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ase..*/.#ifndef 
3c70: 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54 45  TEST.# define TE
3c80: 53 54 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ST 0.#endif..#if
3c90: 64 65 66 20 4e 4f 54 5f 55 53 45 44 0a 2f 2a 0a  def NOT_USED./*.
3ca0: 2a 2a 20 57 65 20 64 6f 20 6f 75 72 20 6f 77 6e  ** We do our own
3cb0: 20 61 73 73 65 72 74 69 6f 6e 20 6d 61 63 72 6f   assertion macro
3cc0: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
3cd0: 68 61 76 65 20 6d 6f 72 65 20 63 6f 6e 74 72 6f  have more contro
3ce0: 6c 0a 2a 2a 20 6f 76 65 72 20 64 65 62 75 67 67  l.** over debugg
3cf0: 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ing..*/.#define 
3d00: 41 73 73 65 72 74 28 58 29 20 20 20 20 69 66 28  Assert(X)    if(
3d10: 21 28 58 29 29 7b 20 43 61 6e 74 48 61 70 70 65  !(X)){ CantHappe
3d20: 6e 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 7d 0a 23  n(__LINE__); }.#
3d30: 64 65 66 69 6e 65 20 43 41 4e 54 5f 48 41 50 50  define CANT_HAPP
3d40: 45 4e 20 20 43 61 6e 74 48 61 70 70 65 6e 28 5f  EN  CantHappen(_
3d50: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
3d60: 76 6f 69 64 20 43 61 6e 74 48 61 70 70 65 6e 28  void CantHappen(
3d70: 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 66 70  int iLine){.  fp
3d80: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 41 73  rintf(stderr,"As
3d90: 73 65 72 74 69 6f 6e 20 66 61 69 6c 65 64 20 6f  sertion failed o
3da0: 6e 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 69 4c 69  n line %d\n",iLi
3db0: 6e 65 29 3b 0a 20 20 2a 28 63 68 61 72 2a 29 31  ne);.  *(char*)1
3dc0: 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 63 65 20   = 0;  /* Force 
3dd0: 61 20 63 6f 72 65 2d 64 75 6d 70 20 2a 2f 0a 7d  a core-dump */.}
3de0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
3df0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3e00: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
3e10: 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 6e  are guaranteed n
3e20: 65 76 65 72 20 74 6f 20 72 65 74 75 72 6e 20 4e  ever to return N
3e30: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ULL..*/.static v
3e40: 6f 69 64 20 2a 53 61 66 65 4d 61 6c 6c 6f 63 28  oid *SafeMalloc(
3e50: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f  int nByte){.  vo
3e60: 69 64 20 2a 70 20 3d 20 6d 61 6c 6c 6f 63 28 20  id *p = malloc( 
3e70: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
3e80: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
3e90: 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f  tf(stderr,"Out o
3ea0: 66 20 6d 65 6d 6f 72 79 2e 20 20 43 61 6e 27 74  f memory.  Can't
3eb0: 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 62 79 74   allocate %d byt
3ec0: 65 73 2e 5c 6e 22 2c 6e 42 79 74 65 29 3b 0a 20  es.\n",nByte);. 
3ed0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
3ee0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 73 74    return p;.}.st
3ef0: 61 74 69 63 20 76 6f 69 64 20 53 61 66 65 46 72  atic void SafeFr
3f00: 65 65 28 76 6f 69 64 20 2a 70 4f 6c 64 29 7b 0a  ee(void *pOld){.
3f10: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
3f20: 20 20 66 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20    free(pOld);.  
3f30: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
3f40: 2a 53 61 66 65 52 65 61 6c 6c 6f 63 28 76 6f 69  *SafeRealloc(voi
3f50: 64 20 2a 70 4f 6c 64 2c 20 69 6e 74 20 6e 42 79  d *pOld, int nBy
3f60: 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a  te){.  void *p;.
3f70: 20 20 69 66 28 20 70 4f 6c 64 3d 3d 30 20 29 7b    if( pOld==0 ){
3f80: 0a 20 20 20 20 70 20 3d 20 53 61 66 65 4d 61 6c  .    p = SafeMal
3f90: 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 7d 65  loc(nByte);.  }e
3fa0: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 72 65 61  lse{.    p = rea
3fb0: 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 42 79 74 65  lloc(pOld, nByte
3fc0: 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
3fd0: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
3fe0: 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20  (stderr,.       
3ff0: 20 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e   "Out of memory.
4000: 20 20 43 61 6e 27 74 20 65 6e 6c 61 72 67 65 20    Can't enlarge 
4010: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 74 6f  an allocation to
4020: 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 6e 42 79   %d bytes\n",nBy
4030: 74 65 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  te);.      exit(
4040: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
4050: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 73 74 61 74  return p;.}.stat
4060: 69 63 20 63 68 61 72 20 2a 53 74 72 44 75 70 28  ic char *StrDup(
4070: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
4080: 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  , int nByte){.  
4090: 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20 69  char *zDest;.  i
40a0: 66 28 20 6e 42 79 74 65 3c 3d 30 20 29 7b 0a 20  f( nByte<=0 ){. 
40b0: 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65     nByte = strle
40c0: 6e 28 7a 53 72 63 29 3b 0a 20 20 7d 0a 20 20 7a  n(zSrc);.  }.  z
40d0: 44 65 73 74 20 3d 20 53 61 66 65 4d 61 6c 6c 6f  Dest = SafeMallo
40e0: 63 28 20 6e 42 79 74 65 20 2b 20 31 20 29 3b 0a  c( nByte + 1 );.
40f0: 20 20 73 74 72 6e 63 70 79 28 7a 44 65 73 74 2c    strncpy(zDest,
4100: 7a 53 72 63 2c 6e 42 79 74 65 29 3b 0a 20 20 7a  zSrc,nByte);.  z
4110: 44 65 73 74 5b 6e 42 79 74 65 5d 20 3d 20 30 3b  Dest[nByte] = 0;
4120: 0a 20 20 72 65 74 75 72 6e 20 7a 44 65 73 74 3b  .  return zDest;
4130: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4140: 20 54 52 55 45 20 69 66 20 74 68 65 20 63 68 61   TRUE if the cha
4150: 72 61 63 74 65 72 20 58 20 63 61 6e 20 62 65 20  racter X can be 
4160: 70 61 72 74 20 6f 66 20 61 6e 20 69 64 65 6e 74  part of an ident
4170: 69 66 69 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  ifier.*/.#define
4180: 20 49 53 41 4c 4e 55 4d 28 58 29 20 20 28 28 58   ISALNUM(X)  ((X
4190: 29 3d 3d 27 5f 27 20 7c 7c 20 69 73 61 6c 6e 75  )=='_' || isalnu
41a0: 6d 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75  m(X))../*.** Rou
41b0: 74 69 6e 65 73 20 66 6f 72 20 64 65 61 6c 69 6e  tines for dealin
41c0: 67 20 77 69 74 68 20 75 6e 62 6f 75 6e 64 65 64  g with unbounded
41d0: 20 73 74 72 69 6e 67 73 2e 0a 2a 2f 0a 73 74 61   strings..*/.sta
41e0: 74 69 63 20 76 6f 69 64 20 53 74 72 69 6e 67 49  tic void StringI
41f0: 6e 69 74 28 53 74 72 69 6e 67 20 2a 70 53 74 72  nit(String *pStr
4200: 29 7b 0a 20 20 70 53 74 72 2d 3e 6e 41 6c 6c 6f  ){.  pStr->nAllo
4210: 63 20 3d 20 30 3b 0a 20 20 70 53 74 72 2d 3e 6e  c = 0;.  pStr->n
4220: 55 73 65 64 20 3d 20 30 3b 0a 20 20 70 53 74 72  Used = 0;.  pStr
4230: 2d 3e 7a 54 65 78 74 20 3d 20 30 3b 0a 7d 0a 73  ->zText = 0;.}.s
4240: 74 61 74 69 63 20 76 6f 69 64 20 53 74 72 69 6e  tatic void Strin
4250: 67 52 65 73 65 74 28 53 74 72 69 6e 67 20 2a 70  gReset(String *p
4260: 53 74 72 29 7b 0a 20 20 53 61 66 65 46 72 65 65  Str){.  SafeFree
4270: 28 70 53 74 72 2d 3e 7a 54 65 78 74 29 3b 0a 20  (pStr->zText);. 
4280: 20 53 74 72 69 6e 67 49 6e 69 74 28 70 53 74 72   StringInit(pStr
4290: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
42a0: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 53 74   StringAppend(St
42b0: 72 69 6e 67 20 2a 70 53 74 72 2c 20 63 6f 6e 73  ring *pStr, cons
42c0: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69  t char *zText, i
42d0: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28  nt nByte){.  if(
42e0: 20 6e 42 79 74 65 3c 3d 30 20 29 7b 0a 20 20 20   nByte<=0 ){.   
42f0: 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 28   nByte = strlen(
4300: 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69 66  zText);.  }.  if
4310: 28 20 70 53 74 72 2d 3e 6e 55 73 65 64 20 2b 20  ( pStr->nUsed + 
4320: 6e 42 79 74 65 20 3e 3d 20 70 53 74 72 2d 3e 6e  nByte >= pStr->n
4330: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 66 28  Alloc ){.    if(
4340: 20 70 53 74 72 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30   pStr->nAlloc==0
4350: 20 29 7b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e   ){.      pStr->
4360: 6e 41 6c 6c 6f 63 20 3d 20 6e 42 79 74 65 20 2b  nAlloc = nByte +
4370: 20 31 30 30 3b 0a 20 20 20 20 20 20 70 53 74 72   100;.      pStr
4380: 2d 3e 7a 54 65 78 74 20 3d 20 53 61 66 65 4d 61  ->zText = SafeMa
4390: 6c 6c 6f 63 28 20 70 53 74 72 2d 3e 6e 41 6c 6c  lloc( pStr->nAll
43a0: 6f 63 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oc );.    }else{
43b0: 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 6e 41 6c  .      pStr->nAl
43c0: 6c 6f 63 20 3d 20 70 53 74 72 2d 3e 6e 41 6c 6c  loc = pStr->nAll
43d0: 6f 63 2a 32 20 2b 20 6e 42 79 74 65 3b 0a 20 20  oc*2 + nByte;.  
43e0: 20 20 20 20 70 53 74 72 2d 3e 7a 54 65 78 74 20      pStr->zText 
43f0: 3d 20 53 61 66 65 52 65 61 6c 6c 6f 63 28 70 53  = SafeRealloc(pS
4400: 74 72 2d 3e 7a 54 65 78 74 2c 20 70 53 74 72 2d  tr->zText, pStr-
4410: 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 0a  >nAlloc);.    }.
4420: 20 20 7d 0a 20 20 73 74 72 6e 63 70 79 28 26 70    }.  strncpy(&p
4430: 53 74 72 2d 3e 7a 54 65 78 74 5b 70 53 74 72 2d  Str->zText[pStr-
4440: 3e 6e 55 73 65 64 5d 2c 7a 54 65 78 74 2c 6e 42  >nUsed],zText,nB
4450: 79 74 65 29 3b 0a 20 20 70 53 74 72 2d 3e 6e 55  yte);.  pStr->nU
4460: 73 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  sed += nByte;.  
4470: 70 53 74 72 2d 3e 7a 54 65 78 74 5b 70 53 74 72  pStr->zText[pStr
4480: 2d 3e 6e 55 73 65 64 5d 20 3d 20 30 3b 0a 7d 0a  ->nUsed] = 0;.}.
4490: 23 64 65 66 69 6e 65 20 53 74 72 69 6e 67 47 65  #define StringGe
44a0: 74 28 53 29 20 28 28 53 29 2d 3e 7a 54 65 78 74  t(S) ((S)->zText
44b0: 3f 28 53 29 2d 3e 7a 54 65 78 74 3a 22 22 29 0a  ?(S)->zText:"").
44c0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
44d0: 20 68 61 73 68 20 6f 6e 20 61 20 73 74 72 69 6e   hash on a strin
44e0: 67 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72  g.  The number r
44f0: 65 74 75 72 6e 65 64 20 69 73 20 61 20 6e 6f 6e  eturned is a non
4500: 2d 6e 65 67 61 74 69 76 65 0a 2a 2a 20 76 61 6c  -negative.** val
4510: 75 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  ue between 0 and
4520: 20 32 2a 2a 33 31 20 2d 20 31 0a 2a 2f 0a 73 74   2**31 - 1.*/.st
4530: 61 74 69 63 20 69 6e 74 20 48 61 73 68 28 63 6f  atic int Hash(co
4540: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
4550: 20 6e 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30   n){.  int h = 0
4560: 3b 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b 0a  ;.  if( n<=0 ){.
4570: 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a      n = strlen(z
4580: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
4590: 6e 2d 2d 20 29 7b 0a 20 20 20 20 68 20 3d 20 68  n-- ){.    h = h
45a0: 20 5e 20 28 68 3c 3c 35 29 20 5e 20 2a 7a 2b 2b   ^ (h<<5) ^ *z++
45b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
45c0: 20 26 20 30 78 37 66 66 66 66 66 66 66 3b 0a 7d   & 0x7fffffff;.}
45d0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
45e0: 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
45f0: 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 20  , try to find a 
4600: 64 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20  declaration for 
4610: 74 68 61 74 0a 2a 2a 20 69 64 65 6e 74 69 66 69  that.** identifi
4620: 65 72 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  er in the hash t
4630: 61 62 6c 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c  able.  If found,
4640: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
4650: 72 20 74 6f 0a 2a 2a 20 74 68 65 20 44 65 63 6c  r to.** the Decl
4660: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20   structure.  If 
4670: 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  not found, retur
4680: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 44  n 0..*/.static D
4690: 65 63 6c 20 2a 46 69 6e 64 44 65 63 6c 28 63 6f  ecl *FindDecl(co
46a0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
46b0: 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 69 6e 74   int len){.  int
46c0: 20 68 3b 0a 20 20 44 65 63 6c 20 2a 70 3b 0a 0a   h;.  Decl *p;..
46d0: 20 20 69 66 28 20 6c 65 6e 3c 3d 30 20 29 7b 0a    if( len<=0 ){.
46e0: 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e      len = strlen
46f0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 68  (zName);.  }.  h
4700: 20 3d 20 48 61 73 68 28 7a 4e 61 6d 65 2c 6c 65   = Hash(zName,le
4710: 6e 29 20 25 20 44 45 43 4c 5f 48 41 53 48 5f 53  n) % DECL_HASH_S
4720: 49 5a 45 3b 0a 20 20 70 20 3d 20 61 70 54 61 62  IZE;.  p = apTab
4730: 6c 65 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  le[h];.  while( 
4740: 70 20 26 26 20 28 73 74 72 6e 63 6d 70 28 70 2d  p && (strncmp(p-
4750: 3e 7a 4e 61 6d 65 2c 7a 4e 61 6d 65 2c 6c 65 6e  >zName,zName,len
4760: 29 21 3d 30 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65  )!=0 || p->zName
4770: 5b 6c 65 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20  [len]!=0) ){.   
4780: 20 70 20 3d 20 70 2d 3e 70 53 61 6d 65 48 61 73   p = p->pSameHas
4790: 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  h;.  }.  return 
47a0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 74  p;.}../*.** Inst
47b0: 61 6c 6c 20 74 68 65 20 67 69 76 65 6e 20 64 65  all the given de
47c0: 63 6c 61 72 61 74 69 6f 6e 20 62 6f 74 68 20 69  claration both i
47d0: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
47e0: 20 61 6e 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c   and on.** the l
47f0: 69 73 74 20 6f 66 20 61 6c 6c 20 64 65 63 6c 61  ist of all decla
4800: 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  rations..*/.stat
4810: 69 63 20 76 6f 69 64 20 49 6e 73 74 61 6c 6c 44  ic void InstallD
4820: 65 63 6c 28 44 65 63 6c 20 2a 70 44 65 63 6c 29  ecl(Decl *pDecl)
4830: 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 44 65 63  {.  int h;.  Dec
4840: 6c 20 2a 70 4f 74 68 65 72 3b 0a 0a 20 20 68 20  l *pOther;..  h 
4850: 3d 20 48 61 73 68 28 70 44 65 63 6c 2d 3e 7a 4e  = Hash(pDecl->zN
4860: 61 6d 65 2c 30 29 20 25 20 44 45 43 4c 5f 48 41  ame,0) % DECL_HA
4870: 53 48 5f 53 49 5a 45 3b 0a 20 20 70 4f 74 68 65  SH_SIZE;.  pOthe
4880: 72 20 3d 20 61 70 54 61 62 6c 65 5b 68 5d 3b 0a  r = apTable[h];.
4890: 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 20    while( pOther 
48a0: 26 26 20 73 74 72 63 6d 70 28 70 44 65 63 6c 2d  && strcmp(pDecl-
48b0: 3e 7a 4e 61 6d 65 2c 70 4f 74 68 65 72 2d 3e 7a  >zName,pOther->z
48c0: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
48d0: 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
48e0: 3e 70 53 61 6d 65 48 61 73 68 3b 0a 20 20 7d 0a  >pSameHash;.  }.
48f0: 20 20 69 66 28 20 70 4f 74 68 65 72 20 29 7b 0a    if( pOther ){.
4900: 20 20 20 20 70 44 65 63 6c 2d 3e 70 53 61 6d 65      pDecl->pSame
4910: 4e 61 6d 65 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Name = pOther->p
4920: 53 61 6d 65 4e 61 6d 65 3b 0a 20 20 20 20 70 4f  SameName;.    pO
4930: 74 68 65 72 2d 3e 70 53 61 6d 65 4e 61 6d 65 20  ther->pSameName 
4940: 3d 20 70 44 65 63 6c 3b 0a 20 20 7d 65 6c 73 65  = pDecl;.  }else
4950: 7b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 70 53 61  {.    pDecl->pSa
4960: 6d 65 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  meName = 0;.    
4970: 70 44 65 63 6c 2d 3e 70 53 61 6d 65 48 61 73 68  pDecl->pSameHash
4980: 20 3d 20 61 70 54 61 62 6c 65 5b 68 5d 3b 0a 20   = apTable[h];. 
4990: 20 20 20 61 70 54 61 62 6c 65 5b 68 5d 20 3d 20     apTable[h] = 
49a0: 70 44 65 63 6c 3b 0a 20 20 7d 0a 20 20 70 44 65  pDecl;.  }.  pDe
49b0: 63 6c 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  cl->pNext = 0;. 
49c0: 20 69 66 28 20 70 44 65 63 6c 46 69 72 73 74 3d   if( pDeclFirst=
49d0: 3d 30 20 29 7b 0a 20 20 20 20 70 44 65 63 6c 46  =0 ){.    pDeclF
49e0: 69 72 73 74 20 3d 20 70 44 65 63 6c 4c 61 73 74  irst = pDeclLast
49f0: 20 3d 20 70 44 65 63 6c 3b 0a 20 20 7d 65 6c 73   = pDecl;.  }els
4a00: 65 7b 0a 20 20 20 20 70 44 65 63 6c 4c 61 73 74  e{.    pDeclLast
4a10: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 65 63 6c 3b  ->pNext = pDecl;
4a20: 0a 20 20 20 20 70 44 65 63 6c 4c 61 73 74 20 3d  .    pDeclLast =
4a30: 20 70 44 65 63 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pDecl;.  }.}../
4a40: 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65  *.** Look at the
4a50: 20 63 75 72 72 65 6e 74 20 69 66 53 74 61 63 6b   current ifStack
4a60: 2e 20 20 49 66 20 61 6e 79 74 68 69 6e 67 20 64  .  If anything d
4a70: 65 63 6c 61 72 65 64 20 61 74 20 74 68 65 20 63  eclared at the c
4a80: 75 72 72 65 6e 74 0a 2a 2a 20 70 6f 73 69 74 69  urrent.** positi
4a90: 6f 6e 20 6d 75 73 74 20 62 65 20 73 75 72 72 6f  on must be surro
4aa0: 75 6e 64 65 64 20 77 69 74 68 0a 2a 2a 0a 2a 2a  unded with.**.**
4ab0: 20 20 20 20 20 20 23 69 66 20 20 20 53 54 55 46        #if   STUF
4ac0: 46 0a 2a 2a 20 20 20 20 20 20 23 65 6e 64 69 66  F.**      #endif
4ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 69 73  .**.** Then this
4ae0: 20 72 6f 75 74 69 6e 65 20 63 6f 6d 70 75 74 65   routine compute
4af0: 73 20 53 54 55 46 46 20 61 6e 64 20 72 65 74 75  s STUFF and retu
4b00: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
4b10: 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20   it.  Memory.** 
4b20: 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75  to hold the valu
4b30: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 6f 62  e returned is ob
4b40: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
4b50: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
4b60: 63 68 61 72 20 2a 47 65 74 49 66 53 74 72 69 6e  char *GetIfStrin
4b70: 67 28 76 6f 69 64 29 7b 0a 20 20 49 66 6d 61 63  g(void){.  Ifmac
4b80: 72 6f 20 2a 70 49 66 3b 0a 20 20 63 68 61 72 20  ro *pIf;.  char 
4b90: 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  *zResult = 0;.  
4ba0: 69 6e 74 20 68 61 73 49 66 20 3d 20 30 3b 0a 20  int hasIf = 0;. 
4bb0: 20 53 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20   String str;..  
4bc0: 66 6f 72 28 70 49 66 20 3d 20 69 66 53 74 61 63  for(pIf = ifStac
4bd0: 6b 3b 20 70 49 66 3b 20 70 49 66 3d 70 49 66 2d  k; pIf; pIf=pIf-
4be0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4bf0: 20 70 49 66 2d 3e 7a 43 6f 6e 64 69 74 69 6f 6e   pIf->zCondition
4c00: 3d 3d 30 20 7c 7c 20 2a 70 49 66 2d 3e 7a 43 6f  ==0 || *pIf->zCo
4c10: 6e 64 69 74 69 6f 6e 3d 3d 30 20 29 20 63 6f 6e  ndition==0 ) con
4c20: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21  tinue;.    if( !
4c30: 68 61 73 49 66 20 29 7b 0a 20 20 20 20 20 20 68  hasIf ){.      h
4c40: 61 73 49 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  asIf = 1;.      
4c50: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
4c60: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4c70: 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28     StringAppend(
4c80: 26 73 74 72 2c 22 20 26 26 20 22 2c 34 29 3b 0a  &str," && ",4);.
4c90: 20 20 20 20 7d 0a 20 20 20 20 53 74 72 69 6e 67      }.    String
4ca0: 41 70 70 65 6e 64 28 26 73 74 72 2c 70 49 66 2d  Append(&str,pIf-
4cb0: 3e 7a 43 6f 6e 64 69 74 69 6f 6e 2c 30 29 3b 0a  >zCondition,0);.
4cc0: 20 20 7d 0a 20 20 69 66 28 20 68 61 73 49 66 20    }.  if( hasIf 
4cd0: 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d  ){.    zResult =
4ce0: 20 53 74 72 44 75 70 28 53 74 72 69 6e 67 47 65   StrDup(StringGe
4cf0: 74 28 26 73 74 72 29 2c 30 29 3b 0a 20 20 20 20  t(&str),0);.    
4d00: 53 74 72 69 6e 67 52 65 73 65 74 28 26 73 74 72  StringReset(&str
4d10: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4d20: 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 7d  zResult = 0;.  }
4d30: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73 75 6c  .  return zResul
4d40: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t;.}../*.** Crea
4d50: 74 65 20 61 20 6e 65 77 20 64 65 63 6c 61 72 61  te a new declara
4d60: 74 69 6f 6e 20 61 6e 64 20 70 75 74 20 69 74 20  tion and put it 
4d70: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
4d80: 65 2e 20 20 41 6c 73 6f 0a 2a 2a 20 72 65 74 75  e.  Also.** retu
4d90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
4da0: 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  it so that we ca
4db0: 6e 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 7a 46  n fill in the zF
4dc0: 77 64 20 61 6e 64 20 7a 44 65 63 6c 0a 2a 2a 20  wd and zDecl.** 
4dd0: 66 69 65 6c 64 73 2c 20 61 6e 64 20 73 6f 20 66  fields, and so f
4de0: 6f 72 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  orth..*/.static 
4df0: 44 65 63 6c 20 2a 43 72 65 61 74 65 44 65 63 6c  Decl *CreateDecl
4e00: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
4e10: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20  zName,       /* 
4e20: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a 65  Name of the obje
4e30: 63 74 20 62 65 69 6e 67 20 64 65 63 6c 61 72 65  ct being declare
4e40: 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  d. */.  int nNam
4e50: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
4e60: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
4e70: 65 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 44  e name */.){.  D
4e80: 65 63 6c 20 2a 70 44 65 63 6c 3b 0a 0a 20 20 70  ecl *pDecl;..  p
4e90: 44 65 63 6c 20 3d 20 53 61 66 65 4d 61 6c 6c 6f  Decl = SafeMallo
4ea0: 63 28 20 73 69 7a 65 6f 66 28 44 65 63 6c 29 20  c( sizeof(Decl) 
4eb0: 2b 20 6e 4e 61 6d 65 20 2b 20 31 29 3b 0a 20 20  + nName + 1);.  
4ec0: 6d 65 6d 73 65 74 28 70 44 65 63 6c 2c 30 2c 73  memset(pDecl,0,s
4ed0: 69 7a 65 6f 66 28 44 65 63 6c 29 29 3b 0a 20 20  izeof(Decl));.  
4ee0: 70 44 65 63 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 28  pDecl->zName = (
4ef0: 63 68 61 72 2a 29 26 70 44 65 63 6c 5b 31 5d 3b  char*)&pDecl[1];
4f00: 0a 20 20 73 70 72 69 6e 74 66 28 70 44 65 63 6c  .  sprintf(pDecl
4f10: 2d 3e 7a 4e 61 6d 65 2c 22 25 2e 2a 73 22 2c 6e  ->zName,"%.*s",n
4f20: 4e 61 6d 65 2c 7a 4e 61 6d 65 29 3b 0a 20 20 70  Name,zName);.  p
4f30: 44 65 63 6c 2d 3e 7a 46 69 6c 65 20 3d 20 7a 46  Decl->zFile = zF
4f40: 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 44 65 63 6c  ilename;.  pDecl
4f50: 2d 3e 70 49 6e 63 6c 75 64 65 20 3d 20 69 6e 63  ->pInclude = inc
4f60: 6c 75 64 65 4c 69 73 74 3b 0a 20 20 70 44 65 63  ludeList;.  pDec
4f70: 6c 2d 3e 7a 49 66 20 3d 20 47 65 74 49 66 53 74  l->zIf = GetIfSt
4f80: 72 69 6e 67 28 29 3b 0a 20 20 49 6e 73 74 61 6c  ring();.  Instal
4f90: 6c 44 65 63 6c 28 70 44 65 63 6c 29 3b 0a 20 20  lDecl(pDecl);.  
4fa0: 72 65 74 75 72 6e 20 70 44 65 63 6c 3b 0a 7d 0a  return pDecl;.}.
4fb0: 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
4fc0: 6e 65 77 20 69 64 65 6e 74 69 66 69 65 72 20 69  new identifier i
4fd0: 6e 74 6f 20 61 6e 20 74 61 62 6c 65 20 6f 66 20  nto an table of 
4fe0: 69 64 65 6e 74 69 66 69 65 72 73 2e 20 20 52 65  identifiers.  Re
4ff0: 74 75 72 6e 20 54 52 55 45 20 69 66 0a 2a 2a 20  turn TRUE if.** 
5000: 61 20 6e 65 77 20 69 64 65 6e 74 69 66 69 65 72  a new identifier
5010: 20 77 61 73 20 69 6e 73 65 72 74 65 64 20 61 6e   was inserted an
5020: 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69  d return FALSE i
5030: 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
5040: 20 77 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   was.** already 
5050: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
5060: 0a 73 74 61 74 69 63 20 69 6e 74 20 49 64 65 6e  .static int Iden
5070: 74 54 61 62 6c 65 49 6e 73 65 72 74 28 0a 20 20  tTableInsert(.  
5080: 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 54 61 62  IdentTable *pTab
5090: 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  le,       /* The
50a0: 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63   table into whic
50b0: 68 20 77 65 20 77 69 6c 6c 20 69 6e 73 65 72 74  h we will insert
50c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
50d0: 20 2a 7a 49 64 2c 20 20 20 20 20 20 20 20 20 20   *zId,          
50e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
50f0: 64 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a 20 20  dentifiers */.  
5100: 69 6e 74 20 6e 49 64 20 20 20 20 20 20 20 20 20  int nId         
5110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
5120: 67 74 68 20 6f 66 20 74 68 65 20 69 64 65 6e 74  gth of the ident
5130: 69 66 69 65 72 20 6e 61 6d 65 20 2a 2f 0a 29 7b  ifier name */.){
5140: 0a 20 20 69 6e 74 20 68 3b 0a 20 20 49 64 65 6e  .  int h;.  Iden
5150: 74 20 2a 70 49 64 3b 0a 0a 20 20 69 66 28 20 6e  t *pId;..  if( n
5160: 49 64 3c 3d 30 20 29 7b 0a 20 20 20 20 6e 49 64  Id<=0 ){.    nId
5170: 20 3d 20 73 74 72 6c 65 6e 28 7a 49 64 29 3b 0a   = strlen(zId);.
5180: 20 20 7d 0a 20 20 68 20 3d 20 48 61 73 68 28 7a    }.  h = Hash(z
5190: 49 64 2c 6e 49 64 29 20 25 20 49 44 45 4e 54 5f  Id,nId) % IDENT_
51a0: 48 41 53 48 5f 53 49 5a 45 3b 0a 20 20 66 6f 72  HASH_SIZE;.  for
51b0: 28 70 49 64 20 3d 20 70 54 61 62 6c 65 2d 3e 61  (pId = pTable->a
51c0: 70 54 61 62 6c 65 5b 68 5d 3b 20 70 49 64 3b 20  pTable[h]; pId; 
51d0: 70 49 64 3d 70 49 64 2d 3e 70 43 6f 6c 6c 69 64  pId=pId->pCollid
51e0: 65 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e  e){.    if( strn
51f0: 63 6d 70 28 7a 49 64 2c 70 49 64 2d 3e 7a 4e 61  cmp(zId,pId->zNa
5200: 6d 65 2c 6e 49 64 29 3d 3d 30 20 26 26 20 70 49  me,nId)==0 && pI
5210: 64 2d 3e 7a 4e 61 6d 65 5b 6e 49 64 5d 3d 3d 30  d->zName[nId]==0
5220: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 72 69   ){.      /* pri
5230: 6e 74 66 28 22 41 6c 72 65 61 64 79 20 69 6e 20  ntf("Already in 
5240: 74 61 62 6c 65 3a 20 25 2e 2a 73 5c 6e 22 2c 6e  table: %.*s\n",n
5250: 49 64 2c 7a 49 64 29 3b 20 2a 2f 0a 20 20 20 20  Id,zId); */.    
5260: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
5270: 7d 0a 20 20 7d 0a 20 20 70 49 64 20 3d 20 53 61  }.  }.  pId = Sa
5280: 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  feMalloc( sizeof
5290: 28 49 64 65 6e 74 29 20 2b 20 6e 49 64 20 2b 20  (Ident) + nId + 
52a0: 31 20 29 3b 0a 20 20 70 49 64 2d 3e 7a 4e 61 6d  1 );.  pId->zNam
52b0: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 64 5b  e = (char*)&pId[
52c0: 31 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 70 49  1];.  sprintf(pI
52d0: 64 2d 3e 7a 4e 61 6d 65 2c 22 25 2e 2a 73 22 2c  d->zName,"%.*s",
52e0: 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 70 49 64 2d  nId,zId);.  pId-
52f0: 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 6c 65 2d  >pNext = pTable-
5300: 3e 70 4c 69 73 74 3b 0a 20 20 70 54 61 62 6c 65  >pList;.  pTable
5310: 2d 3e 70 4c 69 73 74 20 3d 20 70 49 64 3b 0a 20  ->pList = pId;. 
5320: 20 70 49 64 2d 3e 70 43 6f 6c 6c 69 64 65 20 3d   pId->pCollide =
5330: 20 70 54 61 62 6c 65 2d 3e 61 70 54 61 62 6c 65   pTable->apTable
5340: 5b 68 5d 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  [h];.  pTable->a
5350: 70 54 61 62 6c 65 5b 68 5d 20 3d 20 70 49 64 3b  pTable[h] = pId;
5360: 0a 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 41 64  .  /* printf("Ad
5370: 64 20 74 6f 20 74 61 62 6c 65 3a 20 25 2e 2a 73  d to table: %.*s
5380: 5c 6e 22 2c 6e 49 64 2c 7a 49 64 29 3b 20 2a 2f  \n",nId,zId); */
5390: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
53a0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
53b0: 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ee if the given 
53c0: 76 61 6c 75 65 20 69 73 20 69 6e 20 74 68 65 20  value is in the 
53d0: 67 69 76 65 6e 20 49 64 65 6e 74 54 61 62 6c 65  given IdentTable
53e0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
53f0: 65 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 66  e if it is and f
5400: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 6e 6f  alse if it is no
5410: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5420: 20 49 64 65 6e 74 54 61 62 6c 65 54 65 73 74 28   IdentTableTest(
5430: 0a 20 20 49 64 65 6e 74 54 61 62 6c 65 20 2a 70  .  IdentTable *p
5440: 54 61 62 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20  Table,       /* 
5450: 54 68 65 20 74 61 62 6c 65 20 69 6e 20 77 68 69  The table in whi
5460: 63 68 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  ch to search */.
5470: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
5480: 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  d,          /* N
5490: 61 6d 65 20 6f 66 20 74 68 65 20 69 64 65 6e 74  ame of the ident
54a0: 69 66 69 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  ifiers */.  int 
54b0: 6e 49 64 20 20 20 20 20 20 20 20 20 20 20 20 20  nId             
54c0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
54d0: 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
54e0: 72 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69  r name */.){.  i
54f0: 6e 74 20 68 3b 0a 20 20 49 64 65 6e 74 20 2a 70  nt h;.  Ident *p
5500: 49 64 3b 0a 0a 20 20 69 66 28 20 6e 49 64 3c 3d  Id;..  if( nId<=
5510: 30 20 29 7b 0a 20 20 20 20 6e 49 64 20 3d 20 73  0 ){.    nId = s
5520: 74 72 6c 65 6e 28 7a 49 64 29 3b 0a 20 20 7d 0a  trlen(zId);.  }.
5530: 20 20 68 20 3d 20 48 61 73 68 28 7a 49 64 2c 6e    h = Hash(zId,n
5540: 49 64 29 20 25 20 49 44 45 4e 54 5f 48 41 53 48  Id) % IDENT_HASH
5550: 5f 53 49 5a 45 3b 0a 20 20 66 6f 72 28 70 49 64  _SIZE;.  for(pId
5560: 20 3d 20 70 54 61 62 6c 65 2d 3e 61 70 54 61 62   = pTable->apTab
5570: 6c 65 5b 68 5d 3b 20 70 49 64 3b 20 70 49 64 3d  le[h]; pId; pId=
5580: 70 49 64 2d 3e 70 43 6f 6c 6c 69 64 65 29 7b 0a  pId->pCollide){.
5590: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
55a0: 7a 49 64 2c 70 49 64 2d 3e 7a 4e 61 6d 65 2c 6e  zId,pId->zName,n
55b0: 49 64 29 3d 3d 30 20 26 26 20 70 49 64 2d 3e 7a  Id)==0 && pId->z
55c0: 4e 61 6d 65 5b 6e 49 64 5d 3d 3d 30 20 29 7b 0a  Name[nId]==0 ){.
55d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
55e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
55f0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
5600: 65 6d 6f 76 65 20 65 76 65 72 79 20 69 64 65 6e  emove every iden
5610: 74 69 66 69 65 72 20 66 72 6f 6d 20 74 68 65 20  tifier from the 
5620: 67 69 76 65 6e 20 74 61 62 6c 65 2e 20 20 20 52  given table.   R
5630: 65 73 65 74 20 74 68 65 20 74 61 62 6c 65 20 74  eset the table t
5640: 6f 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69 61 6c  o.** its initial
5650: 20 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69   state..*/.stati
5660: 63 20 76 6f 69 64 20 49 64 65 6e 74 54 61 62 6c  c void IdentTabl
5670: 65 52 65 73 65 74 28 49 64 65 6e 74 54 61 62 6c  eReset(IdentTabl
5680: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 64  e *pTable){.  Id
5690: 65 6e 74 20 2a 70 49 64 2c 20 2a 70 4e 65 78 74  ent *pId, *pNext
56a0: 3b 0a 0a 20 20 66 6f 72 28 70 49 64 20 3d 20 70  ;..  for(pId = p
56b0: 54 61 62 6c 65 2d 3e 70 4c 69 73 74 3b 20 70 49  Table->pList; pI
56c0: 64 3b 20 70 49 64 20 3d 20 70 4e 65 78 74 29 7b  d; pId = pNext){
56d0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 64  .    pNext = pId
56e0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 53 61 66  ->pNext;.    Saf
56f0: 65 46 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a  eFree(pId);.  }.
5700: 20 20 6d 65 6d 73 65 74 28 70 54 61 62 6c 65 2c    memset(pTable,
5710: 30 2c 73 69 7a 65 6f 66 28 49 64 65 6e 74 54 61  0,sizeof(IdentTa
5720: 62 6c 65 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  ble));.}..#ifdef
5730: 20 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69   DEBUG./*.** Pri
5740: 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  nt the name of e
5750: 76 65 72 79 20 69 64 65 6e 74 69 66 69 65 72 20  very identifier 
5760: 69 6e 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  in the given tab
5770: 6c 65 2c 20 6f 6e 65 20 70 65 72 20 6c 69 6e 65  le, one per line
5780: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5790: 49 64 65 6e 74 54 61 62 6c 65 50 72 69 6e 74 28  IdentTablePrint(
57a0: 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 54 61 62  IdentTable *pTab
57b0: 6c 65 2c 20 46 49 4c 45 20 2a 70 4f 75 74 29 7b  le, FILE *pOut){
57c0: 0a 20 20 49 64 65 6e 74 20 2a 70 49 64 3b 0a 0a  .  Ident *pId;..
57d0: 20 20 66 6f 72 28 70 49 64 20 3d 20 70 54 61 62    for(pId = pTab
57e0: 6c 65 2d 3e 70 4c 69 73 74 3b 20 70 49 64 3b 20  le->pList; pId; 
57f0: 70 49 64 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74  pId = pId->pNext
5800: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  ){.    fprintf(p
5810: 4f 75 74 2c 22 25 73 5c 6e 22 2c 70 49 64 2d 3e  Out,"%s\n",pId->
5820: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  zName);.  }.}.#e
5830: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
5840: 20 61 6e 20 65 6e 74 69 72 65 20 66 69 6c 65 20   an entire file 
5850: 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 20 52 65  into memory.  Re
5860: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
5870: 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  o the memory..**
5880: 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 69  .** The memory i
5890: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
58a0: 53 61 66 65 4d 61 6c 6c 6f 63 20 61 6e 64 20 6d  SafeMalloc and m
58b0: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
58c0: 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  the.** calling f
58d0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
58e0: 66 20 74 68 65 20 72 65 61 64 20 66 61 69 6c 73  f the read fails
58f0: 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
5900: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a   0 is returned..
5910: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
5920: 52 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20 63  ReadFile(const c
5930: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
5940: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
5950: 53 74 61 74 3b 0a 20 20 46 49 4c 45 20 2a 70 49  Stat;.  FILE *pI
5960: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b  n;.  char *zBuf;
5970: 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28  .  int n;..  if(
5980: 20 73 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65 2c   stat(zFilename,
5990: 26 73 53 74 61 74 29 21 3d 30 0a 23 69 66 6e 64  &sStat)!=0.#ifnd
59a0: 65 66 20 57 49 4e 33 32 0a 20 20 20 20 7c 7c 20  ef WIN32.    || 
59b0: 21 53 5f 49 53 52 45 47 28 73 53 74 61 74 2e 73  !S_ISREG(sStat.s
59c0: 74 5f 6d 6f 64 65 29 0a 23 65 6e 64 69 66 0a 20  t_mode).#endif. 
59d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
59e0: 3b 0a 20 20 7d 0a 20 20 70 49 6e 20 3d 20 66 6f  ;.  }.  pIn = fo
59f0: 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 72  pen(zFilename,"r
5a00: 22 29 3b 0a 20 20 69 66 28 20 70 49 6e 3d 3d 30  ");.  if( pIn==0
5a10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
5a20: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 20 3d 20 53  ;.  }.  zBuf = S
5a30: 61 66 65 4d 61 6c 6c 6f 63 28 20 73 53 74 61 74  afeMalloc( sStat
5a40: 2e 73 74 5f 73 69 7a 65 20 2b 20 31 20 29 3b 0a  .st_size + 1 );.
5a50: 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66    n = fread(zBuf
5a60: 2c 31 2c 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  ,1,sStat.st_size
5a70: 2c 70 49 6e 29 3b 0a 20 20 7a 42 75 66 5b 6e 5d  ,pIn);.  zBuf[n]
5a80: 20 3d 20 30 3b 0a 20 20 66 63 6c 6f 73 65 28 70   = 0;.  fclose(p
5a90: 49 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42  In);.  return zB
5aa0: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  uf;.}../*.** Wri
5ab0: 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
5ac0: 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e 74 6f  of a string into
5ad0: 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
5ae0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
5af0: 2a 20 65 72 72 6f 72 73 0a 2a 2f 0a 73 74 61 74  * errors.*/.stat
5b00: 69 63 20 69 6e 74 20 57 72 69 74 65 46 69 6c 65  ic int WriteFile
5b10: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
5b20: 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
5b30: 61 72 20 2a 7a 4f 75 74 70 75 74 29 7b 0a 20 20  ar *zOutput){.  
5b40: 46 49 4c 45 20 2a 70 4f 75 74 3b 0a 20 20 70 4f  FILE *pOut;.  pO
5b50: 75 74 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65  ut = fopen(zFile
5b60: 6e 61 6d 65 2c 22 77 22 29 3b 0a 20 20 69 66 28  name,"w");.  if(
5b70: 20 70 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pOut==0 ){.    
5b80: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
5b90: 66 77 72 69 74 65 28 7a 4f 75 74 70 75 74 2c 31  fwrite(zOutput,1
5ba0: 2c 73 74 72 6c 65 6e 28 7a 4f 75 74 70 75 74 29  ,strlen(zOutput)
5bb0: 2c 70 4f 75 74 29 3b 0a 20 20 66 63 6c 6f 73 65  ,pOut);.  fclose
5bc0: 28 70 4f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e  (pOut);.  return
5bd0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6a   0;.}../*.** Maj
5be0: 6f 72 20 74 6f 6b 65 6e 20 74 79 70 65 73 0a 2a  or token types.*
5bf0: 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 53 70 61  /.#define TT_Spa
5c00: 63 65 20 20 20 20 20 20 20 20 20 20 20 31 20 20  ce           1  
5c10: 20 2f 2a 20 43 6f 6e 74 69 67 75 6f 75 73 20 77   /* Contiguous w
5c20: 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 23 64  hite space */.#d
5c30: 65 66 69 6e 65 20 54 54 5f 49 64 20 20 20 20 20  efine TT_Id     
5c40: 20 20 20 20 20 20 20 20 20 32 20 20 20 2f 2a 20           2   /* 
5c50: 41 6e 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f  An identifier */
5c60: 0a 23 64 65 66 69 6e 65 20 54 54 5f 50 72 65 70  .#define TT_Prep
5c70: 72 6f 63 65 73 73 6f 72 20 20 20 20 33 20 20 20  rocessor    3   
5c80: 2f 2a 20 41 6e 79 20 43 20 70 72 65 70 72 6f 63  /* Any C preproc
5c90: 65 73 73 6f 72 20 64 69 72 65 63 74 69 76 65 20  essor directive 
5ca0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 43 6f  */.#define TT_Co
5cb0: 6d 6d 65 6e 74 20 20 20 20 20 20 20 20 20 34 20  mment         4 
5cc0: 20 20 2f 2a 20 45 69 74 68 65 72 20 43 20 6f 72    /* Either C or
5cd0: 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65   C++ style comme
5ce0: 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 54  nt */.#define TT
5cf0: 5f 4e 75 6d 62 65 72 20 20 20 20 20 20 20 20 20  _Number         
5d00: 20 35 20 20 20 2f 2a 20 41 6e 79 20 6e 75 6d 65   5   /* Any nume
5d10: 72 69 63 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a  ric constant */.
5d20: 23 64 65 66 69 6e 65 20 54 54 5f 53 74 72 69 6e  #define TT_Strin
5d30: 67 20 20 20 20 20 20 20 20 20 20 36 20 20 20 2f  g          6   /
5d40: 2a 20 53 74 72 69 6e 67 20 6f 72 20 63 68 61 72  * String or char
5d50: 61 63 74 65 72 20 63 6f 6e 73 74 61 6e 74 73 2e  acter constants.
5d60: 20 22 2e 2e 22 20 6f 72 20 27 2e 27 20 2a 2f 0a   ".." or '.' */.
5d70: 23 64 65 66 69 6e 65 20 54 54 5f 42 72 61 63 65  #define TT_Brace
5d80: 73 20 20 20 20 20 20 20 20 20 20 37 20 20 20 2f  s          7   /
5d90: 2a 20 41 6c 6c 20 74 65 78 74 20 62 65 74 77 65  * All text betwe
5da0: 65 6e 20 7b 20 61 6e 64 20 61 20 6d 61 74 63 68  en { and a match
5db0: 69 6e 67 20 7d 20 2a 2f 0a 23 64 65 66 69 6e 65  ing } */.#define
5dc0: 20 54 54 5f 45 4f 46 20 20 20 20 20 20 20 20 20   TT_EOF         
5dd0: 20 20 20 20 38 20 20 20 2f 2a 20 45 6e 64 20 6f      8   /* End o
5de0: 66 20 66 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e  f file */.#defin
5df0: 65 20 54 54 5f 45 72 72 6f 72 20 20 20 20 20 20  e TT_Error      
5e00: 20 20 20 20 20 39 20 20 20 2f 2a 20 41 6e 20 65       9   /* An e
5e10: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a  rror condition *
5e20: 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 42 6c 6f  /.#define TT_Blo
5e30: 63 6b 43 6f 6d 6d 65 6e 74 20 20 20 20 31 30 20  ckComment    10 
5e40: 20 2f 2a 20 41 20 43 2d 53 74 79 6c 65 20 63 6f   /* A C-Style co
5e50: 6d 6d 65 6e 74 20 61 74 20 74 68 65 20 6c 65 66  mment at the lef
5e60: 74 20 6d 61 72 67 69 6e 20 74 68 61 74 0a 20 20  t margin that.  
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20                * 
5e90: 73 70 61 6e 73 20 6d 75 6c 74 69 70 6c 65 20 6c  spans multiple l
5ea0: 69 6e 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ines */.#define 
5eb0: 54 54 5f 4f 74 68 65 72 20 20 20 20 20 20 20 20  TT_Other        
5ec0: 20 20 20 30 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f     0   /* None o
5ed0: 66 20 74 68 65 20 61 62 6f 76 65 20 2a 2f 0a 0a  f the above */..
5ee0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 73 69 6e 67  /*.** Get a sing
5ef0: 6c 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 74 6f 6b  le low-level tok
5f00: 65 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  en from the inpu
5f10: 74 20 66 69 6c 65 2e 20 20 55 70 64 61 74 65 20  t file.  Update 
5f20: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 70 6f 69 6e  the.** file poin
5f30: 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
5f40: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
5f50: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 79  st character bey
5f60: 6f 6e 64 20 74 68 65 0a 2a 2a 20 74 6f 6b 65 6e  ond the.** token
5f70: 2e 0a 2a 2a 0a 2a 2a 20 41 20 22 6c 6f 77 2d 6c  ..**.** A "low-l
5f80: 65 76 65 6c 20 74 6f 6b 65 6e 22 20 69 73 20 61  evel token" is a
5f90: 6e 79 20 74 6f 6b 65 6e 20 65 78 63 65 70 74 20  ny token except 
5fa0: 54 54 5f 42 72 61 63 65 73 2e 20 20 41 20 54 54  TT_Braces.  A TT
5fb0: 5f 42 72 61 63 65 73 20 74 6f 6b 65 6e 0a 2a 2a  _Braces token.**
5fc0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 6d 61 6e   consists of man
5fd0: 79 20 73 6d 61 6c 6c 65 72 20 74 6f 6b 65 6e 73  y smaller tokens
5fe0: 20 61 6e 64 20 69 73 20 61 73 73 65 6d 62 6c 65   and is assemble
5ff0: 64 20 62 79 20 61 20 72 6f 75 74 69 6e 65 20 74  d by a routine t
6000: 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69  hat.** calls thi
6010: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  s one..**.** The
6020: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
6030: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
6040: 65 72 72 6f 72 73 2e 20 20 41 6e 20 65 72 72 6f  errors.  An erro
6050: 72 20 69 73 20 61 6e 0a 2a 2a 20 75 6e 74 65 72  r is an.** unter
6060: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 6f  minated string o
6070: 72 20 63 68 61 72 61 63 74 65 72 20 6c 69 74 65  r character lite
6080: 72 61 6c 20 6f 72 20 61 6e 20 75 6e 74 65 72 6d  ral or an unterm
6090: 69 6e 61 74 65 64 0a 2a 2a 20 63 6f 6d 6d 65 6e  inated.** commen
60a0: 74 2e 0a 2a 2a 0a 2a 2a 20 50 72 6f 66 69 6c 69  t..**.** Profili
60b0: 6e 67 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ng shows that th
60c0: 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 73 75  is routine consu
60d0: 6d 65 73 20 61 62 6f 75 74 20 68 61 6c 66 20 74  mes about half t
60e0: 68 65 0a 2a 2a 20 43 50 55 20 74 69 6d 65 20 6f  he.** CPU time o
60f0: 6e 20 61 20 74 79 70 69 63 61 6c 20 72 75 6e 20  n a typical run 
6100: 6f 66 20 6d 61 6b 65 68 65 61 64 65 72 73 2e 0a  of makeheaders..
6110: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 47 65  */.static int Ge
6120: 74 54 6f 6b 65 6e 28 49 6e 53 74 72 65 61 6d 20  tToken(InStream 
6130: 2a 70 49 6e 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  *pIn, Token *pTo
6140: 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ken){.  int i;. 
6150: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
6160: 20 20 69 6e 74 20 63 53 74 61 72 74 3b 0a 20 20    int cStart;.  
6170: 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 73 74 61  int c;.  int sta
6180: 72 74 4c 69 6e 65 3b 20 20 20 2f 2a 20 4c 69 6e  rtLine;   /* Lin
6190: 65 20 6f 6e 20 77 68 69 63 68 20 61 20 73 74 72  e on which a str
61a0: 75 63 74 75 72 65 20 62 65 67 69 6e 73 20 2a 2f  ucture begins */
61b0: 0a 20 20 69 6e 74 20 6e 6c 69 73 63 20 3d 20 30  .  int nlisc = 0
61c0: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ;   /* True if t
61d0: 68 65 72 65 20 69 73 20 61 20 6e 65 77 2d 6c 69  here is a new-li
61e0: 6e 65 20 69 6e 20 61 20 22 2e 2e 22 20 6f 72 20  ne in a ".." or 
61f0: 27 2e 2e 27 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  '..' */.  int nE
6200: 72 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  rr = 0;    /* Nu
6210: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
6220: 65 65 6e 20 2a 2f 0a 0a 20 20 7a 20 3d 20 70 49  een */..  z = pI
6230: 6e 2d 3e 7a 3b 0a 20 20 69 20 3d 20 70 49 6e 2d  n->z;.  i = pIn-
6240: 3e 69 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 6e 4c  >i;.  pToken->nL
6250: 69 6e 65 20 3d 20 70 49 6e 2d 3e 6e 4c 69 6e 65  ine = pIn->nLine
6260: 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78  ;.  pToken->zTex
6270: 74 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20 73 77 69  t = &z[i];.  swi
6280: 74 63 68 28 20 7a 5b 69 5d 20 29 7b 0a 20 20 20  tch( z[i] ){.   
6290: 20 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20 70   case 0:.      p
62a0: 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54  Token->eType = T
62b0: 54 5f 45 4f 46 3b 0a 20 20 20 20 20 20 70 54 6f  T_EOF;.      pTo
62c0: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 30 3b 0a  ken->nText = 0;.
62d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
62e0: 20 20 63 61 73 65 20 27 23 27 3a 0a 20 20 20 20    case '#':.    
62f0: 20 20 69 66 28 20 69 3d 3d 30 20 7c 7c 20 7a 5b    if( i==0 || z[
6300: 69 2d 31 5d 3d 3d 27 5c 6e 27 20 7c 7c 20 28 69  i-1]=='\n' || (i
6310: 3e 31 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27 5c  >1 && z[i-1]=='\
6320: 72 27 20 26 26 20 7a 5b 69 2d 32 5d 3d 3d 27 5c  r' && z[i-2]=='\
6330: 6e 27 29 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  n')){.        /*
6340: 20 57 65 20 66 6f 75 6e 64 20 61 20 70 72 65 70   We found a prep
6350: 72 6f 63 65 73 73 6f 72 20 73 74 61 74 65 6d 65  rocessor stateme
6360: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  nt */.        pT
6370: 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54  oken->eType = TT
6380: 5f 50 72 65 70 72 6f 63 65 73 73 6f 72 3b 0a 20  _Preprocessor;. 
6390: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
63a0: 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 21      while( z[i]!
63b0: 3d 30 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 6e 27  =0 && z[i]!='\n'
63c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
63d0: 28 20 7a 5b 69 5d 3d 3d 27 5c 5c 27 20 29 7b 0a  ( z[i]=='\\' ){.
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b              i++;
63f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6400: 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 70 49   z[i]=='\n' ) pI
6410: 6e 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20  n->nLine++;.    
6420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6430: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    i++;.        }
6440: 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d  .        pToken-
6450: 3e 6e 54 65 78 74 20 3d 20 69 20 2d 20 70 49 6e  >nText = i - pIn
6460: 2d 3e 69 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ->i;.      }else
6470: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 73  {.        /* Jus
6480: 74 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  t an operator */
6490: 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d  .        pToken-
64a0: 3e 65 54 79 70 65 20 3d 20 54 54 5f 4f 74 68 65  >eType = TT_Othe
64b0: 72 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65  r;.        pToke
64c0: 6e 2d 3e 6e 54 65 78 74 20 3d 20 31 3b 0a 20 20  n->nText = 1;.  
64d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
64e0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 27 20 27  k;..    case ' '
64f0: 3a 0a 20 20 20 20 63 61 73 65 20 27 5c 74 27 3a  :.    case '\t':
6500: 0a 20 20 20 20 63 61 73 65 20 27 5c 72 27 3a 0a  .    case '\r':.
6510: 20 20 20 20 63 61 73 65 20 27 5c 66 27 3a 0a 20      case '\f':. 
6520: 20 20 20 63 61 73 65 20 27 5c 6e 27 3a 0a 20 20     case '\n':.  
6530: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
6540: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
6550: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c      if( z[i]=='\
6560: 6e 27 20 29 20 70 49 6e 2d 3e 6e 4c 69 6e 65 2b  n' ) pIn->nLine+
6570: 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  +;.        i++;.
6580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
6590: 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54  oken->eType = TT
65a0: 5f 53 70 61 63 65 3b 0a 20 20 20 20 20 20 70 54  _Space;.      pT
65b0: 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 69 20  oken->nText = i 
65c0: 2d 20 70 49 6e 2d 3e 69 3b 0a 20 20 20 20 20 20  - pIn->i;.      
65d0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
65e0: 20 27 5c 5c 27 3a 0a 20 20 20 20 20 20 70 54 6f   '\\':.      pTo
65f0: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 32 3b 0a  ken->nText = 2;.
6600: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54        pToken->eT
6610: 79 70 65 20 3d 20 54 54 5f 4f 74 68 65 72 3b 0a  ype = TT_Other;.
6620: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
6630: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
6640: 20 20 70 49 6e 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a    pIn->nLine++;.
6650: 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e          pToken->
6660: 65 54 79 70 65 20 3d 20 54 54 5f 53 70 61 63 65  eType = TT_Space
6670: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6680: 28 20 7a 5b 69 2b 31 5d 3d 3d 30 20 29 7b 0a 20  ( z[i+1]==0 ){. 
6690: 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e         pToken->n
66a0: 54 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Text = 1;.      
66b0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  }.      break;..
66c0: 20 20 20 20 63 61 73 65 20 27 5c 27 27 3a 0a 20      case '\'':. 
66d0: 20 20 20 63 61 73 65 20 27 5c 22 27 3a 0a 20 20     case '\"':.  
66e0: 20 20 20 20 63 53 74 61 72 74 20 3d 20 7a 5b 69      cStart = z[i
66f0: 5d 3b 0a 20 20 20 20 20 20 73 74 61 72 74 4c 69  ];.      startLi
6700: 6e 65 20 3d 20 70 49 6e 2d 3e 6e 4c 69 6e 65 3b  ne = pIn->nLine;
6710: 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
6720: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
6730: 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  c = z[i];.      
6740: 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b    if( c=='\n' ){
6750: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
6760: 6e 6c 69 73 63 20 29 7b 0a 20 20 20 20 20 20 20  nlisc ){.       
6770: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
6780: 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  err,.           
6790: 20 20 20 22 25 73 3a 25 64 3a 20 28 77 61 72 6e     "%s:%d: (warn
67a0: 69 6e 67 29 20 4e 65 77 6c 69 6e 65 20 69 6e 20  ing) Newline in 
67b0: 73 74 72 69 6e 67 20 6f 72 20 63 68 61 72 61 63  string or charac
67c0: 74 65 72 20 6c 69 74 65 72 61 6c 2e 5c 6e 22 2c  ter literal.\n",
67d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
67e0: 46 69 6c 65 6e 61 6d 65 2c 20 70 49 6e 2d 3e 6e  Filename, pIn->n
67f0: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Line);.         
6800: 20 20 20 6e 6c 69 73 63 20 3d 20 31 3b 0a 20 20     nlisc = 1;.  
6810: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6820: 20 20 20 20 70 49 6e 2d 3e 6e 4c 69 6e 65 2b 2b      pIn->nLine++
6830: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6840: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20      if( c=='\\' 
6850: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b  ){.          i++
6860: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
6870: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  z[i];.          
6880: 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20  if( c=='\n' ){. 
6890: 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e             pIn->
68a0: 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20  nLine++;.       
68b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
68c0: 73 65 20 69 66 28 20 63 3d 3d 63 53 74 61 72 74  se if( c==cStart
68d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b   ){.          i+
68e0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  +;.          c =
68f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
6900: 65 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20  e if( c==0 ){.  
6910: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
6920: 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
6930: 55 6e 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  Unterminated str
6940: 69 6e 67 20 6f 72 20 63 68 61 72 61 63 74 65 72  ing or character
6950: 20 6c 69 74 65 72 61 6c 2e 5c 6e 22 2c 0a 20 20   literal.\n",.  
6960: 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
6970: 6e 61 6d 65 2c 20 73 74 61 72 74 4c 69 6e 65 29  name, startLine)
6980: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72 72  ;.          nErr
6990: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
69a0: 20 20 20 20 7d 77 68 69 6c 65 28 20 63 20 29 3b      }while( c );
69b0: 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65  .      pToken->e
69c0: 54 79 70 65 20 3d 20 54 54 5f 53 74 72 69 6e 67  Type = TT_String
69d0: 3b 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e  ;.      pToken->
69e0: 6e 54 65 78 74 20 3d 20 69 20 2d 20 70 49 6e 2d  nText = i - pIn-
69f0: 3e 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  >i;.      break;
6a00: 0a 0a 20 20 20 20 63 61 73 65 20 27 2f 27 3a 0a  ..    case '/':.
6a10: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
6a20: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
6a30: 20 2f 2a 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f   /* C++ style co
6a40: 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  mment */.       
6a50: 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20 26 26 20   while( z[i] && 
6a60: 7a 5b 69 5d 21 3d 27 5c 6e 27 20 29 7b 20 69 2b  z[i]!='\n' ){ i+
6a70: 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 70 54 6f  +; }.        pTo
6a80: 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f  ken->eType = TT_
6a90: 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20  Comment;.       
6aa0: 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d   pToken->nText =
6ab0: 20 69 20 2d 20 70 49 6e 2d 3e 69 3b 0a 20 20 20   i - pIn->i;.   
6ac0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69     }else if( z[i
6ad0: 2b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20  +1]=='*' ){.    
6ae0: 20 20 20 20 2f 2a 20 43 20 73 74 79 6c 65 20 63      /* C style c
6af0: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  omment */.      
6b00: 20 20 69 6e 74 20 69 73 42 6c 6f 63 6b 43 6f 6d    int isBlockCom
6b10: 6d 65 6e 74 20 3d 20 69 3d 3d 30 20 7c 7c 20 7a  ment = i==0 || z
6b20: 5b 69 2d 31 5d 3d 3d 27 5c 6e 27 3b 0a 20 20 20  [i-1]=='\n';.   
6b30: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
6b40: 20 20 20 20 20 73 74 61 72 74 4c 69 6e 65 20 3d       startLine =
6b50: 20 70 49 6e 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20   pIn->nLine;.   
6b60: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d       while( z[i]
6b70: 20 26 26 20 28 7a 5b 69 5d 21 3d 27 2a 27 20 7c   && (z[i]!='*' |
6b80: 7c 20 7a 5b 69 2b 31 5d 21 3d 27 2f 27 29 20 29  | z[i+1]!='/') )
6b90: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
6ba0: 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  z[i]=='\n' ){.  
6bb0: 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 6e            pIn->n
6bc0: 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Line++;.        
6bd0: 20 20 20 20 69 66 28 20 69 73 42 6c 6f 63 6b 43      if( isBlockC
6be0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
6bf0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b          if( z[i+
6c00: 31 5d 3d 3d 27 2a 27 20 7c 7c 20 7a 5b 69 2b 32  1]=='*' || z[i+2
6c10: 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20  ]=='*' ){.      
6c20: 20 20 20 20 20 20 20 20 20 20 20 69 73 42 6c 6f             isBlo
6c30: 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20 32 3b 0a 20  ckComment = 2;. 
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
6c50: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
6c60: 20 20 20 20 20 69 73 42 6c 6f 63 6b 43 6f 6d 6d       isBlockComm
6c70: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ent = 0;.       
6c80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6c90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6ca0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b   }.          i++
6cb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6cc0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 7b 0a      if( z[i] ){.
6cd0: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32            i += 2
6ce0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
6cf0: 0a 20 20 20 20 20 20 20 20 20 20 69 73 42 6c 6f  .          isBlo
6d00: 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20  ckComment = 0;. 
6d10: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
6d20: 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20  (stderr,"%s:%d: 
6d30: 55 6e 74 65 72 6d 69 6e 61 74 65 64 20 63 6f 6d  Unterminated com
6d40: 6d 65 6e 74 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ment\n",.       
6d50: 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20       zFilename, 
6d60: 73 74 61 72 74 4c 69 6e 65 29 3b 0a 20 20 20 20  startLine);.    
6d70: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
6d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6d90: 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20  pToken->eType = 
6da0: 69 73 42 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 3d 3d  isBlockComment==
6db0: 32 20 3f 20 54 54 5f 42 6c 6f 63 6b 43 6f 6d 6d  2 ? TT_BlockComm
6dc0: 65 6e 74 20 3a 20 54 54 5f 43 6f 6d 6d 65 6e 74  ent : TT_Comment
6dd0: 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e  ;.        pToken
6de0: 2d 3e 6e 54 65 78 74 20 3d 20 69 20 2d 20 70 49  ->nText = i - pI
6df0: 6e 2d 3e 69 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n->i;.      }els
6e00: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  e{.        /* A 
6e10: 64 69 76 69 64 65 20 6f 70 65 72 61 74 6f 72 20  divide operator 
6e20: 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65  */.        pToke
6e30: 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f 4f 74  n->eType = TT_Ot
6e40: 68 65 72 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  her;.        pTo
6e50: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 31 20 2b  ken->nText = 1 +
6e60: 20 28 7a 5b 69 2b 31 5d 3d 3d 27 2b 27 29 3b 0a   (z[i+1]=='+');.
6e70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
6e80: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 27  eak;..    case '
6e90: 30 27 3a 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  0':.      if( z[
6ea0: 69 2b 31 5d 3d 3d 27 78 27 20 7c 7c 20 7a 5b 69  i+1]=='x' || z[i
6eb0: 2b 31 5d 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20  +1]=='X' ){.    
6ec0: 20 20 20 20 2f 2a 20 41 20 68 65 78 20 63 6f 6e      /* A hex con
6ed0: 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  stant */.       
6ee0: 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20   i += 2;.       
6ef0: 20 77 68 69 6c 65 28 20 69 73 78 64 69 67 69 74   while( isxdigit
6f00: 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d  (z[i]) ){ i++; }
6f10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6f20: 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 63 74 61        /* An octa
6f30: 6c 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20  l constant */.  
6f40: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64        while( isd
6f50: 69 67 69 74 28 7a 5b 69 5d 29 20 29 7b 20 69 2b  igit(z[i]) ){ i+
6f60: 2b 3b 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20  +; }.      }.   
6f70: 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65     pToken->eType
6f80: 20 3d 20 54 54 5f 4e 75 6d 62 65 72 3b 0a 20 20   = TT_Number;.  
6f90: 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78      pToken->nTex
6fa0: 74 20 3d 20 69 20 2d 20 70 49 6e 2d 3e 69 3b 0a  t = i - pIn->i;.
6fb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
6fc0: 20 20 63 61 73 65 20 27 31 27 3a 20 63 61 73 65    case '1': case
6fd0: 20 27 32 27 3a 20 63 61 73 65 20 27 33 27 3a 20   '2': case '3': 
6fe0: 63 61 73 65 20 27 34 27 3a 0a 20 20 20 20 63 61  case '4':.    ca
6ff0: 73 65 20 27 35 27 3a 20 63 61 73 65 20 27 36 27  se '5': case '6'
7000: 3a 20 63 61 73 65 20 27 37 27 3a 20 63 61 73 65  : case '7': case
7010: 20 27 38 27 3a 20 63 61 73 65 20 27 39 27 3a 0a   '8': case '9':.
7020: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64        while( isd
7030: 69 67 69 74 28 7a 5b 69 5d 29 20 29 7b 20 69 2b  igit(z[i]) ){ i+
7040: 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28  +; }.      if( (
7050: 63 3d 7a 5b 69 5d 29 3d 3d 27 2e 27 20 29 7b 0a  c=z[i])=='.' ){.
7060: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
7070: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73         while( is
7080: 64 69 67 69 74 28 7a 5b 69 5d 29 20 29 7b 20 69  digit(z[i]) ){ i
7090: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 63  ++; }.         c
70a0: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20   = z[i];.       
70b0: 20 20 69 66 28 20 63 3d 3d 27 65 27 20 7c 7c 20    if( c=='e' || 
70c0: 63 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 20 20  c=='E' ){.      
70d0: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
70e0: 20 20 20 20 20 69 66 28 20 28 28 63 3d 7a 5b 69       if( ((c=z[i
70f0: 5d 29 3d 3d 27 2b 27 20 7c 7c 20 63 3d 3d 27 2d  ])=='+' || c=='-
7100: 27 29 20 26 26 20 69 73 64 69 67 69 74 28 7a 5b  ') && isdigit(z[
7110: 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a  i+1]) ){ i++; }.
7120: 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
7130: 28 20 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 20  ( isdigit(z[i]) 
7140: 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ i++; }.      
7150: 20 20 20 20 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20       c = z[i];. 
7160: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7170: 20 20 20 69 66 28 20 63 3d 3d 27 66 27 20 7c 7c     if( c=='f' ||
7180: 20 63 3d 3d 27 46 27 20 7c 7c 20 63 3d 3d 27 6c   c=='F' || c=='l
7190: 27 20 7c 7c 20 63 3d 3d 27 4c 27 20 29 7b 20 69  ' || c=='L' ){ i
71a0: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73  ++; }.      }els
71b0: 65 20 69 66 28 20 63 3d 3d 27 65 27 20 7c 7c 20  e if( c=='e' || 
71c0: 63 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 20 20  c=='E' ){.      
71d0: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
71e0: 20 69 66 28 20 28 28 63 3d 7a 5b 69 5d 29 3d 3d   if( ((c=z[i])==
71f0: 27 2b 27 20 7c 7c 20 63 3d 3d 27 2d 27 29 20 26  '+' || c=='-') &
7200: 26 20 69 73 64 69 67 69 74 28 7a 5b 69 2b 31 5d  & isdigit(z[i+1]
7210: 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ i++; }.    
7220: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69       while( isdi
7230: 67 69 74 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b  git(z[i]) ){ i++
7240: 3b 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ; }.      }else 
7250: 69 66 28 20 63 3d 3d 27 4c 27 20 7c 7c 20 63 3d  if( c=='L' || c=
7260: 3d 27 6c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='l' ){.        
7270: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 63   i++;.         c
7280: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20   = z[i];.       
7290: 20 20 69 66 28 20 63 3d 3d 27 75 27 20 7c 7c 20    if( c=='u' || 
72a0: 63 3d 3d 27 55 27 20 29 7b 20 69 2b 2b 3b 20 7d  c=='U' ){ i++; }
72b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
72c0: 20 63 3d 3d 27 75 27 20 7c 7c 20 63 3d 3d 27 55   c=='u' || c=='U
72d0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 69 2b  ' ){.         i+
72e0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 63 20 3d 20  +;.         c = 
72f0: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 69  z[i];.         i
7300: 66 28 20 63 3d 3d 27 6c 27 20 7c 7c 20 63 3d 3d  f( c=='l' || c==
7310: 27 4c 27 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20  'L' ){ i++; }.  
7320: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 6f 6b      }.      pTok
7330: 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f 4e  en->eType = TT_N
7340: 75 6d 62 65 72 3b 0a 20 20 20 20 20 20 70 54 6f  umber;.      pTo
7350: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 69 20 2d  ken->nText = i -
7360: 20 70 49 6e 2d 3e 69 3b 0a 20 20 20 20 20 20 62   pIn->i;.      b
7370: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
7380: 27 61 27 3a 20 63 61 73 65 20 27 62 27 3a 20 63  'a': case 'b': c
7390: 61 73 65 20 27 63 27 3a 20 63 61 73 65 20 27 64  ase 'c': case 'd
73a0: 27 3a 20 63 61 73 65 20 27 65 27 3a 20 63 61 73  ': case 'e': cas
73b0: 65 20 27 66 27 3a 20 63 61 73 65 20 27 67 27 3a  e 'f': case 'g':
73c0: 0a 20 20 20 20 63 61 73 65 20 27 68 27 3a 20 63  .    case 'h': c
73d0: 61 73 65 20 27 69 27 3a 20 63 61 73 65 20 27 6a  ase 'i': case 'j
73e0: 27 3a 20 63 61 73 65 20 27 6b 27 3a 20 63 61 73  ': case 'k': cas
73f0: 65 20 27 6c 27 3a 20 63 61 73 65 20 27 6d 27 3a  e 'l': case 'm':
7400: 20 63 61 73 65 20 27 6e 27 3a 0a 20 20 20 20 63   case 'n':.    c
7410: 61 73 65 20 27 6f 27 3a 20 63 61 73 65 20 27 70  ase 'o': case 'p
7420: 27 3a 20 63 61 73 65 20 27 71 27 3a 20 63 61 73  ': case 'q': cas
7430: 65 20 27 72 27 3a 20 63 61 73 65 20 27 73 27 3a  e 'r': case 's':
7440: 20 63 61 73 65 20 27 74 27 3a 20 63 61 73 65 20   case 't': case 
7450: 27 75 27 3a 0a 20 20 20 20 63 61 73 65 20 27 76  'u':.    case 'v
7460: 27 3a 20 63 61 73 65 20 27 77 27 3a 20 63 61 73  ': case 'w': cas
7470: 65 20 27 78 27 3a 20 63 61 73 65 20 27 79 27 3a  e 'x': case 'y':
7480: 20 63 61 73 65 20 27 7a 27 3a 20 63 61 73 65 20   case 'z': case 
7490: 27 41 27 3a 20 63 61 73 65 20 27 42 27 3a 0a 20  'A': case 'B':. 
74a0: 20 20 20 63 61 73 65 20 27 43 27 3a 20 63 61 73     case 'C': cas
74b0: 65 20 27 44 27 3a 20 63 61 73 65 20 27 45 27 3a  e 'D': case 'E':
74c0: 20 63 61 73 65 20 27 46 27 3a 20 63 61 73 65 20   case 'F': case 
74d0: 27 47 27 3a 20 63 61 73 65 20 27 48 27 3a 20 63  'G': case 'H': c
74e0: 61 73 65 20 27 49 27 3a 0a 20 20 20 20 63 61 73  ase 'I':.    cas
74f0: 65 20 27 4a 27 3a 20 63 61 73 65 20 27 4b 27 3a  e 'J': case 'K':
7500: 20 63 61 73 65 20 27 4c 27 3a 20 63 61 73 65 20   case 'L': case 
7510: 27 4d 27 3a 20 63 61 73 65 20 27 4e 27 3a 20 63  'M': case 'N': c
7520: 61 73 65 20 27 4f 27 3a 20 63 61 73 65 20 27 50  ase 'O': case 'P
7530: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 51 27 3a  ':.    case 'Q':
7540: 20 63 61 73 65 20 27 52 27 3a 20 63 61 73 65 20   case 'R': case 
7550: 27 53 27 3a 20 63 61 73 65 20 27 54 27 3a 20 63  'S': case 'T': c
7560: 61 73 65 20 27 55 27 3a 20 63 61 73 65 20 27 56  ase 'U': case 'V
7570: 27 3a 20 63 61 73 65 20 27 57 27 3a 0a 20 20 20  ': case 'W':.   
7580: 20 63 61 73 65 20 27 58 27 3a 20 63 61 73 65 20   case 'X': case 
7590: 27 59 27 3a 20 63 61 73 65 20 27 5a 27 3a 20 63  'Y': case 'Z': c
75a0: 61 73 65 20 27 5f 27 3a 0a 20 20 20 20 20 20 77  ase '_':.      w
75b0: 68 69 6c 65 28 20 69 73 61 6c 6e 75 6d 28 7a 5b  hile( isalnum(z[
75c0: 69 5d 29 20 7c 7c 20 7a 5b 69 5d 3d 3d 27 5f 27  i]) || z[i]=='_'
75d0: 20 29 7b 20 69 2b 2b 3b 20 7d 3b 0a 20 20 20 20   ){ i++; };.    
75e0: 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20    pToken->eType 
75f0: 3d 20 54 54 5f 49 64 3b 0a 20 20 20 20 20 20 70  = TT_Id;.      p
7600: 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 69  Token->nText = i
7610: 20 2d 20 70 49 6e 2d 3e 69 3b 0a 20 20 20 20 20   - pIn->i;.     
7620: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
7630: 65 20 27 3a 27 3a 0a 20 20 20 20 20 20 70 54 6f  e ':':.      pTo
7640: 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f  ken->eType = TT_
7650: 4f 74 68 65 72 3b 0a 20 20 20 20 20 20 70 54 6f  Other;.      pTo
7660: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 31 20 2b  ken->nText = 1 +
7670: 20 28 7a 5b 69 2b 31 5d 3d 3d 27 3a 27 29 3b 0a   (z[i+1]==':');.
7680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
7690: 20 20 63 61 73 65 20 27 3d 27 3a 0a 20 20 20 20    case '=':.    
76a0: 63 61 73 65 20 27 3c 27 3a 0a 20 20 20 20 63 61  case '<':.    ca
76b0: 73 65 20 27 3e 27 3a 0a 20 20 20 20 63 61 73 65  se '>':.    case
76c0: 20 27 2b 27 3a 0a 20 20 20 20 63 61 73 65 20 27   '+':.    case '
76d0: 2d 27 3a 0a 20 20 20 20 63 61 73 65 20 27 2a 27  -':.    case '*'
76e0: 3a 0a 20 20 20 20 63 61 73 65 20 27 25 27 3a 0a  :.    case '%':.
76f0: 20 20 20 20 63 61 73 65 20 27 5e 27 3a 0a 20 20      case '^':.  
7700: 20 20 63 61 73 65 20 27 26 27 3a 0a 20 20 20 20    case '&':.    
7710: 63 61 73 65 20 27 7c 27 3a 0a 20 20 20 20 20 20  case '|':.      
7720: 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20  pToken->eType = 
7730: 54 54 5f 4f 74 68 65 72 3b 0a 20 20 20 20 20 20  TT_Other;.      
7740: 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20  pToken->nText = 
7750: 31 20 2b 20 28 7a 5b 69 2b 31 5d 3d 3d 27 3d 27  1 + (z[i+1]=='='
7760: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7770: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
7780: 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70      pToken->eTyp
7790: 65 20 3d 20 54 54 5f 4f 74 68 65 72 3b 0a 20 20  e = TT_Other;.  
77a0: 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78      pToken->nTex
77b0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  t = 1;.      bre
77c0: 61 6b 3b 0a 20 20 7d 0a 20 20 70 49 6e 2d 3e 69  ak;.  }.  pIn->i
77d0: 20 2b 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78   += pToken->nTex
77e0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72  t;.  return nErr
77f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
7800: 72 6f 75 74 69 6e 65 20 72 65 63 6f 76 65 72 73  routine recovers
7810: 20 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 20   the next token 
7820: 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 66  from the input f
7830: 69 6c 65 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ile which is.** 
7840: 6e 6f 74 20 61 20 73 70 61 63 65 20 6f 72 20 61  not a space or a
7850: 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 61 6e 79 20   comment or any 
7860: 74 65 78 74 20 62 65 74 77 65 65 6e 20 61 6e 20  text between an 
7870: 22 23 69 66 20 30 22 20 61 6e 64 20 22 23 65 6e  "#if 0" and "#en
7880: 64 69 66 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dif"..**.** This
7890: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
78a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
78b0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
78c0: 64 2e 20 20 41 6e 20 65 72 72 6f 72 0a 2a 2a 20  d.  An error.** 
78d0: 69 73 20 61 6e 20 75 6e 74 65 72 6d 69 6e 61 74  is an unterminat
78e0: 65 64 20 74 6f 6b 65 6e 20 6f 72 20 75 6e 6d 61  ed token or unma
78f0: 74 63 68 65 64 20 22 23 69 66 20 30 22 2e 0a 2a  tched "#if 0"..*
7900: 2a 0a 2a 2a 20 50 72 6f 66 69 6c 69 6e 67 20 73  *.** Profiling s
7910: 68 6f 77 73 20 74 68 61 74 20 74 68 69 73 20 72  hows that this r
7920: 6f 75 74 69 6e 65 20 75 73 65 73 20 61 62 6f 75  outine uses abou
7930: 74 20 61 20 71 75 61 72 74 65 72 20 6f 66 20 74  t a quarter of t
7940: 68 65 0a 2a 2a 20 43 50 55 20 74 69 6d 65 20 69  he.** CPU time i
7950: 6e 20 61 20 74 79 70 69 63 61 6c 20 72 75 6e 2e  n a typical run.
7960: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 47  .*/.static int G
7970: 65 74 4e 6f 6e 73 70 61 63 65 54 6f 6b 65 6e 28  etNonspaceToken(
7980: 49 6e 53 74 72 65 61 6d 20 2a 70 49 6e 2c 20 54  InStream *pIn, T
7990: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
79a0: 20 69 6e 74 20 6e 49 66 20 3d 20 30 3b 0a 20 20   int nIf = 0;.  
79b0: 69 6e 74 20 69 6e 5a 65 72 6f 20 3d 20 30 3b 0a  int inZero = 0;.
79c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
79d0: 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20  .  int value;.  
79e0: 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 3b 0a 20  int startLine;. 
79f0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a   int nErr = 0;..
7a00: 20 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 49    startLine = pI
7a10: 6e 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 77 68 69 6c  n->nLine;.  whil
7a20: 65 28 20 31 20 29 7b 0a 20 20 20 20 6e 45 72 72  e( 1 ){.    nErr
7a30: 20 2b 3d 20 47 65 74 54 6f 6b 65 6e 28 70 49 6e   += GetToken(pIn
7a40: 2c 70 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 2f 2a  ,pToken);.    /*
7a50: 20 70 72 69 6e 74 66 28 22 25 30 34 64 3a 20 54   printf("%04d: T
7a60: 79 70 65 3d 25 64 20 6e 49 66 3d 25 64 20 5b 25  ype=%d nIf=%d [%
7a70: 2e 2a 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  .*s]\n",.       
7a80: 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 70 54  pToken->nLine,pT
7a90: 6f 6b 65 6e 2d 3e 65 54 79 70 65 2c 6e 49 66 2c  oken->eType,nIf,
7aa0: 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 2c 0a 20  pToken->nText,. 
7ab0: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54        pToken->eT
7ac0: 79 70 65 21 3d 54 54 5f 53 70 61 63 65 20 3f 20  ype!=TT_Space ? 
7ad0: 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 20 3a 20  pToken->zText : 
7ae0: 22 3c 73 70 61 63 65 3e 22 29 3b 20 2a 2f 0a 20  "<space>"); */. 
7af0: 20 20 20 70 54 6f 6b 65 6e 2d 3e 70 43 6f 6d 6d     pToken->pComm
7b00: 65 6e 74 20 3d 20 62 6c 6f 63 6b 43 6f 6d 6d 65  ent = blockComme
7b10: 6e 74 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  nt;.    switch( 
7b20: 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 29 7b  pToken->eType ){
7b30: 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 43  .      case TT_C
7b40: 6f 6d 6d 65 6e 74 3a 20 20 20 20 20 20 20 20 20  omment:         
7b50: 20 2f 2a 30 31 32 33 34 35 36 37 38 39 20 31 32   /*0123456789 12
7b60: 33 34 35 36 37 38 20 2a 2f 0a 20 20 20 20 20 20  345678 */.      
7b70: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 70 54 6f   if( strncmp(pTo
7b80: 6b 65 6e 2d 3e 7a 54 65 78 74 2c 20 22 2f 2a 4d  ken->zText, "/*M
7b90: 41 4b 45 48 45 41 44 45 52 53 2d 53 54 4f 50 22  AKEHEADERS-STOP"
7ba0: 2c 20 31 38 29 3d 3d 30 20 29 20 72 65 74 75 72  , 18)==0 ) retur
7bb0: 6e 20 6e 45 72 72 3b 0a 20 20 20 20 20 20 20 62  n nErr;.       b
7bc0: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
7bd0: 65 20 54 54 5f 53 70 61 63 65 3a 0a 20 20 20 20  e TT_Space:.    
7be0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
7bf0: 20 20 63 61 73 65 20 54 54 5f 42 6c 6f 63 6b 43    case TT_BlockC
7c00: 6f 6d 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20  omment:.        
7c10: 69 66 28 20 64 6f 63 5f 66 6c 61 67 20 29 7b 0a  if( doc_flag ){.
7c20: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 63 6b 43            blockC
7c30: 6f 6d 6d 65 6e 74 20 3d 20 53 61 66 65 4d 61 6c  omment = SafeMal
7c40: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 6f 6b 65  loc( sizeof(Toke
7c50: 6e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n) );.          
7c60: 2a 62 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20  *blockComment = 
7c70: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  *pToken;.       
7c80: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
7c90: 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 54 54  ;..      case TT
7ca0: 5f 45 4f 46 3a 0a 20 20 20 20 20 20 20 20 69 66  _EOF:.        if
7cb0: 28 20 6e 49 66 20 29 7b 0a 20 20 20 20 20 20 20  ( nIf ){.       
7cc0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
7cd0: 72 2c 22 25 73 3a 25 64 3a 20 55 6e 74 65 72 6d  r,"%s:%d: Unterm
7ce0: 69 6e 61 74 65 64 20 5c 22 23 69 66 5c 22 5c 6e  inated \"#if\"\n
7cf0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
7d00: 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 74 61 72 74  zFilename, start
7d10: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Line);.         
7d20: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
7d30: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
7d40: 6e 20 6e 45 72 72 3b 0a 0a 20 20 20 20 20 20 63  n nErr;..      c
7d50: 61 73 65 20 54 54 5f 50 72 65 70 72 6f 63 65 73  ase TT_Preproces
7d60: 73 6f 72 3a 0a 20 20 20 20 20 20 20 20 7a 20 3d  sor:.        z =
7d70: 20 26 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 5b   &pToken->zText[
7d80: 31 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  1];.        whil
7d90: 65 28 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a  e( *z==' ' || *z
7da0: 3d 3d 27 5c 74 27 20 29 20 7a 2b 2b 3b 0a 20 20  =='\t' ) z++;.  
7db0: 20 20 20 20 20 20 69 66 28 20 73 73 63 61 6e 66        if( sscanf
7dc0: 28 7a 2c 22 69 66 20 25 64 22 2c 26 76 61 6c 75  (z,"if %d",&valu
7dd0: 65 29 3d 3d 31 20 26 26 20 76 61 6c 75 65 3d 3d  e)==1 && value==
7de0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  0 ){.          n
7df0: 49 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  If++;.          
7e00: 69 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20  inZero = 1;.    
7e10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 6e      }else if( in
7e20: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Zero ){.        
7e30: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c    if( strncmp(z,
7e40: 22 69 66 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "if",2)==0 ){.  
7e50: 20 20 20 20 20 20 20 20 20 20 6e 49 66 2b 2b 3b            nIf++;
7e60: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
7e70: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c 22   if( strncmp(z,"
7e80: 65 6e 64 69 66 22 2c 35 29 3d 3d 30 20 29 7b 0a  endif",5)==0 ){.
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 6e 49 66 2d              nIf-
7ea0: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  -;.            i
7eb0: 66 28 20 6e 49 66 3d 3d 30 20 29 20 69 6e 5a 65  f( nIf==0 ) inZe
7ec0: 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
7ed0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
7ee0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  e{.          ret
7ef0: 75 72 6e 20 6e 45 72 72 3b 0a 20 20 20 20 20 20  urn nErr;.      
7f00: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
7f10: 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c  k;..      defaul
7f20: 74 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  t:.        if( !
7f30: 69 6e 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  inZero ){.      
7f40: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b      return nErr;
7f50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7f60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7f70: 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41    }.  /* NOT REA
7f80: 43 48 45 44 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  CHED */.}../*.**
7f90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   This routine lo
7fa0: 6f 6b 73 20 66 6f 72 20 69 64 65 6e 74 69 66 69  oks for identifi
7fb0: 65 72 73 20 28 73 74 72 69 6e 67 73 20 6f 66 20  ers (strings of 
7fc0: 63 6f 6e 74 69 67 75 6f 75 73 20 61 6c 70 68 61  contiguous alpha
7fd0: 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61  numeric.** chara
7fe0: 63 74 65 72 73 29 20 77 69 74 68 69 6e 20 61 20  cters) within a 
7ff0: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 64 69 72  preprocessor dir
8000: 65 63 74 69 76 65 20 61 6e 64 20 61 64 64 73 20  ective and adds 
8010: 65 76 65 72 79 20 73 75 63 68 20 73 74 72 69 6e  every such strin
8020: 67 0a 2a 2a 20 66 6f 75 6e 64 20 74 6f 20 74 68  g.** found to th
8030: 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69  e given identifi
8040: 65 72 20 74 61 62 6c 65 0a 2a 2f 0a 73 74 61 74  er table.*/.stat
8050: 69 63 20 76 6f 69 64 20 46 69 6e 64 49 64 65 6e  ic void FindIden
8060: 74 69 66 69 65 72 73 49 6e 4d 61 63 72 6f 28 54  tifiersInMacro(T
8070: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 49 64  oken *pToken, Id
8080: 65 6e 74 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  entTable *pTable
8090: 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 54 6f 6b 65  ){.  Token sToke
80a0: 6e 3b 0a 20 20 49 6e 53 74 72 65 61 6d 20 73 49  n;.  InStream sI
80b0: 6e 3b 0a 20 20 69 6e 74 20 67 6f 20 3d 20 31 3b  n;.  int go = 1;
80c0: 0a 0a 20 20 73 49 6e 2e 7a 20 3d 20 70 54 6f 6b  ..  sIn.z = pTok
80d0: 65 6e 2d 3e 7a 54 65 78 74 3b 0a 20 20 73 49 6e  en->zText;.  sIn
80e0: 2e 69 20 3d 20 31 3b 0a 20 20 73 49 6e 2e 6e 4c  .i = 1;.  sIn.nL
80f0: 69 6e 65 20 3d 20 31 3b 0a 20 20 77 68 69 6c 65  ine = 1;.  while
8100: 28 20 67 6f 20 26 26 20 73 49 6e 2e 69 20 3c 20  ( go && sIn.i < 
8110: 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 29 7b  pToken->nText ){
8120: 0a 20 20 20 20 47 65 74 54 6f 6b 65 6e 28 26 73  .    GetToken(&s
8130: 49 6e 2c 26 73 54 6f 6b 65 6e 29 3b 0a 20 20 20  In,&sToken);.   
8140: 20 73 77 69 74 63 68 28 20 73 54 6f 6b 65 6e 2e   switch( sToken.
8150: 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  eType ){.      c
8160: 61 73 65 20 54 54 5f 49 64 3a 0a 20 20 20 20 20  ase TT_Id:.     
8170: 20 20 20 49 64 65 6e 74 54 61 62 6c 65 49 6e 73     IdentTableIns
8180: 65 72 74 28 70 54 61 62 6c 65 2c 73 54 6f 6b 65  ert(pTable,sToke
8190: 6e 2e 7a 54 65 78 74 2c 73 54 6f 6b 65 6e 2e 6e  n.zText,sToken.n
81a0: 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Text);.        b
81b0: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
81c0: 65 20 54 54 5f 45 4f 46 3a 0a 20 20 20 20 20 20  e TT_EOF:.      
81d0: 20 20 67 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20    go = 0;.      
81e0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
81f0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
8200: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8210: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
8220: 72 6f 75 74 69 6e 65 20 67 65 74 73 20 74 68 65  routine gets the
8230: 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 20 20 45 76   next token.  Ev
8240: 65 72 79 74 68 69 6e 67 20 63 6f 6e 74 61 69 6e  erything contain
8250: 65 64 20 77 69 74 68 69 6e 0a 2a 2a 20 7b 2e 2e  ed within.** {..
8260: 2e 7d 20 69 73 20 63 6f 6c 6c 61 70 73 65 64 20  .} is collapsed 
8270: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 54 54  into a single TT
8280: 5f 42 72 61 63 65 73 20 74 6f 6b 65 6e 2e 20 20  _Braces token.  
8290: 57 68 69 74 65 73 70 61 63 65 20 69 73 0a 2a 2a  Whitespace is.**
82a0: 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   omitted..**.** 
82b0: 49 66 20 70 54 61 62 6c 65 20 69 73 20 6e 6f 74  If pTable is not
82c0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e 73 65   NULL, then inse
82d0: 72 74 20 65 76 65 72 79 20 69 64 65 6e 74 69 66  rt every identif
82e0: 69 65 72 20 73 65 65 6e 20 69 6e 74 6f 20 74 68  ier seen into th
82f0: 65 0a 2a 2a 20 49 64 65 6e 74 54 61 62 6c 65 2e  e.** IdentTable.
8300: 20 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20    This includes 
8310: 61 6e 79 20 69 64 65 6e 74 69 66 69 65 72 73 20  any identifiers 
8320: 73 65 65 6e 20 69 6e 73 69 64 65 20 6f 66 20 7b  seen inside of {
8330: 2e 2e 2e 7d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ...}..**.** The 
8340: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
8350: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 73 20   encountered is 
8360: 72 65 74 75 72 6e 65 64 2e 20 20 41 6e 20 65 72  returned.  An er
8370: 72 6f 72 20 69 73 20 61 6e 0a 2a 2a 20 75 6e 74  ror is an.** unt
8380: 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 2e  erminated token.
8390: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 47  .*/.static int G
83a0: 65 74 42 69 67 54 6f 6b 65 6e 28 49 6e 53 74 72  etBigToken(InStr
83b0: 65 61 6d 20 2a 70 49 6e 2c 20 54 6f 6b 65 6e 20  eam *pIn, Token 
83c0: 2a 70 54 6f 6b 65 6e 2c 20 49 64 65 6e 74 54 61  *pToken, IdentTa
83d0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
83e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
83f0: 72 74 3b 0a 20 20 69 6e 74 20 69 53 74 61 72 74  rt;.  int iStart
8400: 3b 0a 20 20 69 6e 74 20 6e 42 72 61 63 65 3b 0a  ;.  int nBrace;.
8410: 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e    int c;.  int n
8420: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 45 72 72  Line;.  int nErr
8430: 3b 0a 0a 20 20 6e 45 72 72 20 3d 20 47 65 74 4e  ;..  nErr = GetN
8440: 6f 6e 73 70 61 63 65 54 6f 6b 65 6e 28 70 49 6e  onspaceToken(pIn
8450: 2c 70 54 6f 6b 65 6e 29 3b 0a 20 20 73 77 69 74  ,pToken);.  swit
8460: 63 68 28 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70  ch( pToken->eTyp
8470: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 54  e ){.    case TT
8480: 5f 49 64 3a 0a 20 20 20 20 20 20 69 66 28 20 70  _Id:.      if( p
8490: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
84a0: 20 20 20 20 49 64 65 6e 74 54 61 62 6c 65 49 6e      IdentTableIn
84b0: 73 65 72 74 28 70 54 61 62 6c 65 2c 70 54 6f 6b  sert(pTable,pTok
84c0: 65 6e 2d 3e 7a 54 65 78 74 2c 70 54 6f 6b 65 6e  en->zText,pToken
84d0: 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20  ->nText);.      
84e0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  }.      return n
84f0: 45 72 72 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  Err;..    case T
8500: 54 5f 50 72 65 70 72 6f 63 65 73 73 6f 72 3a 0a  T_Preprocessor:.
8510: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 6c 65        if( pTable
8520: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 46  !=0 ){.        F
8530: 69 6e 64 49 64 65 6e 74 69 66 69 65 72 73 49 6e  indIdentifiersIn
8540: 4d 61 63 72 6f 28 70 54 6f 6b 65 6e 2c 70 54 61  Macro(pToken,pTa
8550: 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ble);.      }.  
8560: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b      return nErr;
8570: 0a 0a 20 20 20 20 63 61 73 65 20 54 54 5f 4f 74  ..    case TT_Ot
8580: 68 65 72 3a 0a 20 20 20 20 20 20 69 66 28 20 70  her:.      if( p
8590: 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 5b 30 5d 3d  Token->zText[0]=
85a0: 3d 27 7b 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='{' ) break;.  
85b0: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b      return nErr;
85c0: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
85d0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72       return nErr
85e0: 3b 0a 20 20 7d 0a 0a 20 20 69 53 74 61 72 74 20  ;.  }..  iStart 
85f0: 3d 20 70 49 6e 2d 3e 69 3b 0a 20 20 7a 53 74 61  = pIn->i;.  zSta
8600: 72 74 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 54 65  rt = pToken->zTe
8610: 78 74 3b 0a 20 20 6e 4c 69 6e 65 20 3d 20 70 54  xt;.  nLine = pT
8620: 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 6e  oken->nLine;.  n
8630: 42 72 61 63 65 20 3d 20 31 3b 0a 20 20 77 68 69  Brace = 1;.  whi
8640: 6c 65 28 20 6e 42 72 61 63 65 20 29 7b 0a 20 20  le( nBrace ){.  
8650: 20 20 6e 45 72 72 20 2b 3d 20 47 65 74 4e 6f 6e    nErr += GetNon
8660: 73 70 61 63 65 54 6f 6b 65 6e 28 70 49 6e 2c 70  spaceToken(pIn,p
8670: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 2f 2a 20 70  Token);.    /* p
8680: 72 69 6e 74 66 28 22 25 30 34 64 3a 20 6e 42 72  rintf("%04d: nBr
8690: 61 63 65 3d 25 64 20 5b 25 2e 2a 73 5d 5c 6e 22  ace=%d [%.*s]\n"
86a0: 2c 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 6e  ,pToken->nLine,n
86b0: 42 72 61 63 65 2c 0a 20 20 20 20 20 20 20 70 54  Brace,.       pT
86c0: 6f 6b 65 6e 2d 3e 6e 54 65 78 74 2c 70 54 6f 6b  oken->nText,pTok
86d0: 65 6e 2d 3e 7a 54 65 78 74 29 3b 20 2a 2f 0a 20  en->zText); */. 
86e0: 20 20 20 73 77 69 74 63 68 28 20 70 54 6f 6b 65     switch( pToke
86f0: 6e 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20  n->eType ){.    
8700: 20 20 63 61 73 65 20 54 54 5f 45 4f 46 3a 0a 20    case TT_EOF:. 
8710: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
8720: 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 55 6e  tderr,"%s:%d: Un
8730: 74 65 72 6d 69 6e 61 74 65 64 20 5c 22 7b 5c 22  terminated \"{\"
8740: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
8750: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 4c 69 6e 65  zFilename, nLine
8760: 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  );.        nErr+
8770: 2b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65  +;.        pToke
8780: 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f 45 72  n->eType = TT_Er
8790: 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ror;.        ret
87a0: 75 72 6e 20 6e 45 72 72 3b 0a 0a 20 20 20 20 20  urn nErr;..     
87b0: 20 63 61 73 65 20 54 54 5f 49 64 3a 0a 20 20 20   case TT_Id:.   
87c0: 20 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20       if( pTable 
87d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 64 65  ){.          Ide
87e0: 6e 74 54 61 62 6c 65 49 6e 73 65 72 74 28 70 54  ntTableInsert(pT
87f0: 61 62 6c 65 2c 70 54 6f 6b 65 6e 2d 3e 7a 54 65  able,pToken->zTe
8800: 78 74 2c 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74  xt,pToken->nText
8810: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
8820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
8830: 20 20 20 63 61 73 65 20 54 54 5f 50 72 65 70 72     case TT_Prepr
8840: 6f 63 65 73 73 6f 72 3a 0a 20 20 20 20 20 20 20  ocessor:.       
8850: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29   if( pTable!=0 )
8860: 7b 0a 20 20 20 20 20 20 20 20 20 20 46 69 6e 64  {.          Find
8870: 49 64 65 6e 74 69 66 69 65 72 73 49 6e 4d 61 63  IdentifiersInMac
8880: 72 6f 28 70 54 6f 6b 65 6e 2c 70 54 61 62 6c 65  ro(pToken,pTable
8890: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
88a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
88b0: 20 20 20 63 61 73 65 20 54 54 5f 4f 74 68 65 72     case TT_Other
88c0: 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63  :.        if( (c
88d0: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74   = pToken->zText
88e0: 5b 30 5d 29 3d 3d 27 7b 27 20 29 7b 0a 20 20 20  [0])=='{' ){.   
88f0: 20 20 20 20 20 20 20 6e 42 72 61 63 65 2b 2b 3b         nBrace++;
8900: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
8910: 66 28 20 63 3d 3d 27 7d 27 20 29 7b 0a 20 20 20  f( c=='}' ){.   
8920: 20 20 20 20 20 20 20 6e 42 72 61 63 65 2d 2d 3b         nBrace--;
8930: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8940: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
8950: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
8960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8970: 20 7d 0a 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79   }.  pToken->eTy
8980: 70 65 20 3d 20 54 54 5f 42 72 61 63 65 73 3b 0a  pe = TT_Braces;.
8990: 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20    pToken->nText 
89a0: 3d 20 31 20 2b 20 70 49 6e 2d 3e 69 20 2d 20 69  = 1 + pIn->i - i
89b0: 53 74 61 72 74 3b 0a 20 20 70 54 6f 6b 65 6e 2d  Start;.  pToken-
89c0: 3e 7a 54 65 78 74 20 3d 20 7a 53 74 61 72 74 3b  >zText = zStart;
89d0: 0a 20 20 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65  .  pToken->nLine
89e0: 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 72 65 74 75   = nLine;.  retu
89f0: 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nErr;.}../*.*
8a00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66  * This routine f
8a10: 72 65 65 73 20 75 70 20 61 20 6c 69 73 74 20 6f  rees up a list o
8a20: 66 20 54 6f 6b 65 6e 73 2e 20 20 54 68 65 20 70  f Tokens.  The p
8a30: 43 6f 6d 6d 65 6e 74 20 74 6f 6b 65 6e 73 20 61  Comment tokens a
8a40: 72 65 0a 2a 2a 20 6e 6f 74 20 63 6c 65 61 72 65  re.** not cleare
8a50: 64 20 62 79 20 74 68 69 73 2e 20 20 53 6f 20 77  d by this.  So w
8a60: 65 20 6c 65 61 6b 20 61 20 6c 69 74 74 6c 65 20  e leak a little 
8a70: 6d 65 6d 6f 72 79 20 77 68 65 6e 20 75 73 69 6e  memory when usin
8a80: 67 20 74 68 65 20 2d 64 6f 63 0a 2a 2a 20 6f 70  g the -doc.** op
8a90: 74 69 6f 6e 2e 20 20 53 6f 20 77 68 61 74 2e 0a  tion.  So what..
8aa0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 46  */.static void F
8ab0: 72 65 65 54 6f 6b 65 6e 4c 69 73 74 28 54 6f 6b  reeTokenList(Tok
8ac0: 65 6e 20 2a 70 4c 69 73 74 29 7b 0a 20 20 54 6f  en *pList){.  To
8ad0: 6b 65 6e 20 2a 70 4e 65 78 74 3b 0a 20 20 77 68  ken *pNext;.  wh
8ae0: 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20  ile( pList ){.  
8af0: 20 20 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d    pNext = pList-
8b00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 53 61 66 65  >pNext;.    Safe
8b10: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  Free(pList);.   
8b20: 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a   pList = pNext;.
8b30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b    }.}../*.** Tok
8b40: 65 6e 69 7a 65 20 61 6e 20 65 6e 74 69 72 65 20  enize an entire 
8b50: 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 61 20  file.  Return a 
8b60: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  pointer to the l
8b70: 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73 2e 0a 2a  ist of tokens..*
8b80: 2a 0a 2a 2a 20 53 70 61 63 65 20 66 6f 72 20 65  *.** Space for e
8b90: 61 63 68 20 74 6f 6b 65 6e 20 69 73 20 6f 62 74  ach token is obt
8ba0: 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 73 65 70  ained from a sep
8bb0: 61 72 61 74 65 20 6d 61 6c 6c 6f 63 28 29 20 63  arate malloc() c
8bc0: 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c  all.  The.** cal
8bd0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ling function is
8be0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
8bf0: 20 66 72 65 65 69 6e 67 20 74 68 69 73 20 73 70   freeing this sp
8c00: 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54  ace..**.** If pT
8c10: 61 62 6c 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  able is not NULL
8c20: 2c 20 74 68 65 6e 20 66 69 6c 6c 20 74 68 65 20  , then fill the 
8c30: 74 61 62 6c 65 20 77 69 74 68 20 61 6c 6c 20 69  table with all i
8c40: 64 65 6e 74 69 66 69 65 72 73 20 73 65 65 6e 20  dentifiers seen 
8c50: 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 70 75 74 20  in.** the input 
8c60: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
8c70: 54 6f 6b 65 6e 20 2a 54 6f 6b 65 6e 69 7a 65 46  Token *TokenizeF
8c80: 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ile(const char *
8c90: 7a 46 69 6c 65 2c 20 49 64 65 6e 74 54 61 62 6c  zFile, IdentTabl
8ca0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
8cb0: 53 74 72 65 61 6d 20 73 49 6e 3b 0a 20 20 54 6f  Stream sIn;.  To
8cc0: 6b 65 6e 20 2a 70 46 69 72 73 74 20 3d 20 30 2c  ken *pFirst = 0,
8cd0: 20 2a 70 4c 61 73 74 20 3d 20 30 2c 20 2a 70 4e   *pLast = 0, *pN
8ce0: 65 77 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  ew;.  int nErr =
8cf0: 20 30 3b 0a 0a 20 20 73 49 6e 2e 7a 20 3d 20 7a   0;..  sIn.z = z
8d00: 46 69 6c 65 3b 0a 20 20 73 49 6e 2e 69 20 3d 20  File;.  sIn.i = 
8d10: 30 3b 0a 20 20 73 49 6e 2e 6e 4c 69 6e 65 20 3d  0;.  sIn.nLine =
8d20: 20 31 3b 0a 20 20 62 6c 6f 63 6b 43 6f 6d 6d 65   1;.  blockComme
8d30: 6e 74 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  nt = 0;..  while
8d40: 28 20 73 49 6e 2e 7a 5b 73 49 6e 2e 69 5d 21 3d  ( sIn.z[sIn.i]!=
8d50: 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 ){.    pNew = 
8d60: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  SafeMalloc( size
8d70: 6f 66 28 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20  of(Token) );.   
8d80: 20 6e 45 72 72 20 2b 3d 20 47 65 74 42 69 67 54   nErr += GetBigT
8d90: 6f 6b 65 6e 28 26 73 49 6e 2c 70 4e 65 77 2c 70  oken(&sIn,pNew,p
8da0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 64 65 62 75  Table);.    debu
8db0: 67 33 28 54 4f 4b 45 4e 49 5a 45 52 2c 20 22 54  g3(TOKENIZER, "T
8dc0: 6f 6b 65 6e 20 6f 6e 20 6c 69 6e 65 20 25 64 3a  oken on line %d:
8dd0: 20 5b 25 2e 2a 73 5d 5c 6e 22 2c 0a 20 20 20 20   [%.*s]\n",.    
8de0: 20 20 20 70 4e 65 77 2d 3e 6e 4c 69 6e 65 2c 20     pNew->nLine, 
8df0: 70 4e 65 77 2d 3e 6e 54 65 78 74 3c 35 30 20 3f  pNew->nText<50 ?
8e00: 20 70 4e 65 77 2d 3e 6e 54 65 78 74 20 3a 20 35   pNew->nText : 5
8e10: 30 2c 20 70 4e 65 77 2d 3e 7a 54 65 78 74 29 3b  0, pNew->zText);
8e20: 0a 20 20 20 20 69 66 28 20 70 46 69 72 73 74 3d  .    if( pFirst=
8e30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 72  =0 ){.      pFir
8e40: 73 74 20 3d 20 70 4c 61 73 74 20 3d 20 70 4e 65  st = pLast = pNe
8e50: 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  w;.      pNew->p
8e60: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Prev = 0;.    }e
8e70: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 61 73 74  lse{.      pLast
8e80: 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
8e90: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 65        pNew->pPre
8ea0: 76 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 20  v = pLast;.     
8eb0: 20 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pLast = pNew;. 
8ec0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4e 65     }.    if( pNe
8ed0: 77 2d 3e 65 54 79 70 65 3d 3d 54 54 5f 45 4f 46  w->eType==TT_EOF
8ee0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
8ef0: 69 66 28 20 70 4c 61 73 74 20 29 20 70 4c 61 73  if( pLast ) pLas
8f00: 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  t->pNext = 0;.  
8f10: 62 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20 30  blockComment = 0
8f20: 3b 0a 20 20 69 66 28 20 6e 45 72 72 20 29 7b 0a  ;.  if( nErr ){.
8f30: 20 20 20 20 46 72 65 65 54 6f 6b 65 6e 4c 69 73      FreeTokenLis
8f40: 74 28 70 46 69 72 73 74 29 3b 0a 20 20 20 20 70  t(pFirst);.    p
8f50: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  First = 0;.  }..
8f60: 20 20 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b    return pFirst;
8f70: 0a 7d 0a 0a 23 69 66 20 54 45 53 54 3d 3d 31 0a  .}..#if TEST==1.
8f80: 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6f  /*.** Use the fo
8f90: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
8fa0: 74 6f 20 74 65 73 74 20 6f 72 20 64 65 62 75 67  to test or debug
8fb0: 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a   the tokenizer..
8fc0: 2a 2f 0a 76 6f 69 64 20 6d 61 69 6e 28 69 6e 74  */.void main(int
8fd0: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
8fe0: 67 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  gv){.  char *zFi
8ff0: 6c 65 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4c 69  le;.  Token *pLi
9000: 73 74 2c 20 2a 70 3b 0a 20 20 49 64 65 6e 74 54  st, *p;.  IdentT
9010: 61 62 6c 65 20 73 54 61 62 6c 65 3b 0a 0a 20 20  able sTable;..  
9020: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
9030: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
9040: 72 2c 22 55 73 61 67 65 3a 20 25 73 20 66 69 6c  r,"Usage: %s fil
9050: 65 6e 61 6d 65 5c 6e 22 2c 2a 61 72 67 76 29 3b  ename\n",*argv);
9060: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
9070: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 73 54 61 62  }.  memset(&sTab
9080: 6c 65 2c 30 2c 73 69 7a 65 6f 66 28 73 54 61 62  le,0,sizeof(sTab
9090: 6c 65 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20  le));.  zFile = 
90a0: 52 65 61 64 46 69 6c 65 28 61 72 67 76 5b 31 5d  ReadFile(argv[1]
90b0: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d  );.  if( zFile==
90c0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
90d0: 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 72  (stderr,"Can't r
90e0: 65 61 64 20 66 69 6c 65 20 5c 22 25 73 5c 22 5c  ead file \"%s\"\
90f0: 6e 22 2c 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  n",argv[1]);.   
9100: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
9110: 70 4c 69 73 74 20 3d 20 54 6f 6b 65 6e 69 7a 65  pList = Tokenize
9120: 46 69 6c 65 28 7a 46 69 6c 65 2c 26 73 54 61 62  File(zFile,&sTab
9130: 6c 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69  le);.  for(p=pLi
9140: 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  st; p; p=p->pNex
9150: 74 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20  t){.    int j;. 
9160: 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 54     switch( p->eT
9170: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
9180: 65 20 54 54 5f 53 70 61 63 65 3a 0a 20 20 20 20  e TT_Space:.    
9190: 20 20 20 20 70 72 69 6e 74 66 28 22 25 34 64 3a      printf("%4d:
91a0: 20 53 70 61 63 65 5c 6e 22 2c 70 2d 3e 6e 4c 69   Space\n",p->nLi
91b0: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ne);.        bre
91c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 54  ak;.      case T
91d0: 54 5f 49 64 3a 0a 20 20 20 20 20 20 20 20 70 72  T_Id:.        pr
91e0: 69 6e 74 66 28 22 25 34 64 3a 20 49 64 20 20 20  intf("%4d: Id   
91f0: 20 20 20 20 20 20 20 20 25 2e 2a 73 5c 6e 22 2c          %.*s\n",
9200: 70 2d 3e 6e 4c 69 6e 65 2c 70 2d 3e 6e 54 65 78  p->nLine,p->nTex
9210: 74 2c 70 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20  t,p->zText);.   
9220: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9230: 20 20 63 61 73 65 20 54 54 5f 50 72 65 70 72 6f    case TT_Prepro
9240: 63 65 73 73 6f 72 3a 0a 20 20 20 20 20 20 20 20  cessor:.        
9250: 70 72 69 6e 74 66 28 22 25 34 64 3a 20 50 72 65  printf("%4d: Pre
9260: 70 72 6f 63 65 73 73 6f 72 20 25 2e 2a 73 5c 6e  processor %.*s\n
9270: 22 2c 70 2d 3e 6e 4c 69 6e 65 2c 70 2d 3e 6e 54  ",p->nLine,p->nT
9280: 65 78 74 2c 70 2d 3e 7a 54 65 78 74 29 3b 0a 20  ext,p->zText);. 
9290: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
92a0: 20 20 20 20 63 61 73 65 20 54 54 5f 43 6f 6d 6d      case TT_Comm
92b0: 65 6e 74 3a 0a 20 20 20 20 20 20 20 20 70 72 69  ent:.        pri
92c0: 6e 74 66 28 22 25 34 64 3a 20 43 6f 6d 6d 65 6e  ntf("%4d: Commen
92d0: 74 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 29 3b 0a  t\n",p->nLine);.
92e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
92f0: 20 20 20 20 20 63 61 73 65 20 54 54 5f 42 6c 6f       case TT_Blo
9300: 63 6b 43 6f 6d 6d 65 6e 74 3a 0a 20 20 20 20 20  ckComment:.     
9310: 20 20 20 70 72 69 6e 74 66 28 22 25 34 64 3a 20     printf("%4d: 
9320: 42 6c 6f 63 6b 20 43 6f 6d 6d 65 6e 74 5c 6e 22  Block Comment\n"
9330: 2c 70 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  ,p->nLine);.    
9340: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9350: 20 63 61 73 65 20 54 54 5f 4e 75 6d 62 65 72 3a   case TT_Number:
9360: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
9370: 22 25 34 64 3a 20 4e 75 6d 62 65 72 20 20 20 20  "%4d: Number    
9380: 20 20 20 25 2e 2a 73 5c 6e 22 2c 70 2d 3e 6e 4c     %.*s\n",p->nL
9390: 69 6e 65 2c 70 2d 3e 6e 54 65 78 74 2c 70 2d 3e  ine,p->nText,p->
93a0: 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  zText);.        
93b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
93c0: 65 20 54 54 5f 53 74 72 69 6e 67 3a 0a 20 20 20  e TT_String:.   
93d0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 34 64       printf("%4d
93e0: 3a 20 53 74 72 69 6e 67 20 20 20 20 20 20 20 25  : String       %
93f0: 2e 2a 73 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 2c  .*s\n",p->nLine,
9400: 70 2d 3e 6e 54 65 78 74 2c 70 2d 3e 7a 54 65 78  p->nText,p->zTex
9410: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
9420: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 54 54  k;.      case TT
9430: 5f 4f 74 68 65 72 3a 0a 20 20 20 20 20 20 20 20  _Other:.        
9440: 70 72 69 6e 74 66 28 22 25 34 64 3a 20 4f 74 68  printf("%4d: Oth
9450: 65 72 20 20 20 20 20 20 20 20 25 2e 2a 73 5c 6e  er        %.*s\n
9460: 22 2c 70 2d 3e 6e 4c 69 6e 65 2c 70 2d 3e 6e 54  ",p->nLine,p->nT
9470: 65 78 74 2c 70 2d 3e 7a 54 65 78 74 29 3b 0a 20  ext,p->zText);. 
9480: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9490: 20 20 20 20 63 61 73 65 20 54 54 5f 42 72 61 63      case TT_Brac
94a0: 65 73 3a 0a 20 20 20 20 20 20 20 20 66 6f 72 28  es:.        for(
94b0: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 54 65 78 74 20  j=0; j<p->nText 
94c0: 26 26 20 6a 3c 33 30 20 26 26 20 70 2d 3e 7a 54  && j<30 && p->zT
94d0: 65 78 74 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b  ext[j]!='\n'; j+
94e0: 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 70 72 69  +){}.        pri
94f0: 6e 74 66 28 22 25 34 64 3a 20 42 72 61 63 65 73  ntf("%4d: Braces
9500: 20 20 20 20 20 20 20 25 2e 2a 73 2e 2e 2e 7d 5c         %.*s...}\
9510: 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 2c 6a 2c 70 2d  n",p->nLine,j,p-
9520: 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20  >zText);.       
9530: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9540: 73 65 20 54 54 5f 45 4f 46 3a 0a 20 20 20 20 20  se TT_EOF:.     
9550: 20 20 20 70 72 69 6e 74 66 28 22 25 34 64 3a 20     printf("%4d: 
9560: 45 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 70  End of file\n",p
9570: 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  ->nLine);.      
9580: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64    break;.      d
9590: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
95a0: 70 72 69 6e 74 66 28 22 25 34 64 3a 20 74 79 70  printf("%4d: typ
95b0: 65 20 25 64 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65  e %d\n",p->nLine
95c0: 2c 70 2d 3e 65 54 79 70 65 29 3b 0a 20 20 20 20  ,p->eType);.    
95d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
95e0: 0a 20 20 7d 0a 20 20 46 72 65 65 54 6f 6b 65 6e  .  }.  FreeToken
95f0: 4c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 53  List(pList);.  S
9600: 61 66 65 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a  afeFree(zFile);.
9610: 20 20 49 64 65 6e 74 54 61 62 6c 65 50 72 69 6e    IdentTablePrin
9620: 74 28 26 73 54 61 62 6c 65 2c 73 74 64 6f 75 74  t(&sTable,stdout
9630: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
9640: 64 65 66 20 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  def DEBUG./*.** 
9650: 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75  For debugging pu
9660: 72 70 6f 73 65 73 2c 20 77 72 69 74 65 20 6f 75  rposes, write ou
9670: 74 20 61 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65  t a list of toke
9680: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
9690: 69 64 20 50 72 69 6e 74 54 6f 6b 65 6e 73 28 54  id PrintTokens(T
96a0: 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f  oken *pFirst, To
96b0: 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 69  ken *pLast){.  i
96c0: 6e 74 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30  nt needSpace = 0
96d0: 3b 0a 20 20 69 6e 74 20 63 3b 0a 0a 20 20 70 4c  ;.  int c;..  pL
96e0: 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70 4e 65  ast = pLast->pNe
96f0: 78 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 46 69  xt;.  while( pFi
9700: 72 73 74 21 3d 70 4c 61 73 74 20 29 7b 0a 20 20  rst!=pLast ){.  
9710: 20 20 73 77 69 74 63 68 28 20 70 46 69 72 73 74    switch( pFirst
9720: 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20  ->eType ){.     
9730: 20 63 61 73 65 20 54 54 5f 50 72 65 70 72 6f 63   case TT_Preproc
9740: 65 73 73 6f 72 3a 0a 20 20 20 20 20 20 20 20 70  essor:.        p
9750: 72 69 6e 74 66 28 22 5c 6e 25 2e 2a 73 5c 6e 22  rintf("\n%.*s\n"
9760: 2c 70 46 69 72 73 74 2d 3e 6e 54 65 78 74 2c 70  ,pFirst->nText,p
9770: 46 69 72 73 74 2d 3e 7a 54 65 78 74 29 3b 0a 20  First->zText);. 
9780: 20 20 20 20 20 20 20 6e 65 65 64 53 70 61 63 65         needSpace
9790: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
97a0: 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
97b0: 20 54 54 5f 49 64 3a 0a 20 20 20 20 20 20 63 61   TT_Id:.      ca
97c0: 73 65 20 54 54 5f 4e 75 6d 62 65 72 3a 0a 20 20  se TT_Number:.  
97d0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73        printf("%s
97e0: 25 2e 2a 73 22 2c 20 6e 65 65 64 53 70 61 63 65  %.*s", needSpace
97f0: 20 3f 20 22 20 22 20 3a 20 22 22 2c 20 70 46 69   ? " " : "", pFi
9800: 72 73 74 2d 3e 6e 54 65 78 74 2c 20 70 46 69 72  rst->nText, pFir
9810: 73 74 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20  st->zText);.    
9820: 20 20 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20      needSpace = 
9830: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
9840: 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  ;..      default
9850: 3a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 70 46  :.        c = pF
9860: 69 72 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 3b 0a  irst->zText[0];.
9870: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
9880: 25 73 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  %s%.*s",.       
9890: 20 20 20 28 6e 65 65 64 53 70 61 63 65 20 26 26     (needSpace &&
98a0: 20 28 63 3d 3d 27 2a 27 20 7c 7c 20 63 3d 3d 27   (c=='*' || c=='
98b0: 7b 27 29 29 20 3f 20 22 20 22 20 3a 20 22 22 2c  {')) ? " " : "",
98c0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 72 73  .          pFirs
98d0: 74 2d 3e 6e 54 65 78 74 2c 20 70 46 69 72 73 74  t->nText, pFirst
98e0: 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20  ->zText);.      
98f0: 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20 70 46    needSpace = pF
9900: 69 72 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d  irst->zText[0]==
9910: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ',';.        bre
9920: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  ak;.    }.    pF
9930: 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
9940: 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Next;.  }.}.#end
9950: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
9960: 74 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  t a sequence of 
9970: 74 6f 6b 65 6e 73 20 69 6e 74 6f 20 61 20 73 74  tokens into a st
9980: 72 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  ring and return 
9990: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
99a0: 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20 53 70  that string.  Sp
99b0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
99c0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
99d0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
99e0: 0a 2a 2a 20 61 6e 64 20 6d 75 73 74 20 62 65 20  .** and must be 
99f0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
9a00: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
9a10: 2a 0a 2a 2a 20 43 65 72 74 61 69 6e 20 6b 65 79  *.** Certain key
9a20: 77 6f 72 64 73 20 28 45 58 50 4f 52 54 2c 20 50  words (EXPORT, P
9a30: 52 49 56 41 54 45 2c 20 50 55 42 4c 49 43 2c 20  RIVATE, PUBLIC, 
9a40: 50 52 4f 54 45 43 54 45 44 29 20 61 72 65 20 61  PROTECTED) are a
9a50: 6c 77 61 79 73 0a 2a 2a 20 73 6b 69 70 70 65 64  lways.** skipped
9a60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 6b 69 70  ..**.** If pSkip
9a70: 21 3d 30 20 74 68 65 6e 20 73 6b 69 70 20 6f 76  !=0 then skip ov
9a80: 65 72 20 6e 53 6b 69 70 20 74 6f 6b 65 6e 73 20  er nSkip tokens 
9a90: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 70  beginning with p
9aa0: 53 6b 69 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  Skip..**.** If z
9ab0: 54 65 72 6d 21 3d 30 20 74 68 65 6e 20 61 70 70  Term!=0 then app
9ac0: 65 6e 64 20 74 68 65 20 74 65 78 74 20 74 6f 20  end the text to 
9ad0: 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74  the end..*/.stat
9ae0: 69 63 20 63 68 61 72 20 2a 54 6f 6b 65 6e 73 54  ic char *TokensT
9af0: 6f 53 74 72 69 6e 67 28 0a 20 20 54 6f 6b 65 6e  oString(.  Token
9b00: 20 2a 70 46 69 72 73 74 2c 20 20 20 20 2f 2a 20   *pFirst,    /* 
9b10: 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 6e 20 74  First token in t
9b20: 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 54  he string */.  T
9b30: 6f 6b 65 6e 20 2a 70 4c 61 73 74 2c 20 20 20 20  oken *pLast,    
9b40: 20 2f 2a 20 4c 61 73 74 20 74 6f 6b 65 6e 20 69   /* Last token i
9b50: 6e 20 74 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a  n the string */.
9b60: 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20    char *zTerm,  
9b70: 20 20 20 20 2f 2a 20 54 65 72 6d 69 6e 61 74 65      /* Terminate
9b80: 20 74 68 65 20 73 74 72 69 6e 67 20 77 69 74 68   the string with
9b90: 20 74 68 69 73 20 74 65 78 74 20 69 66 20 6e 6f   this text if no
9ba0: 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  t NULL */.  Toke
9bb0: 6e 20 2a 70 53 6b 69 70 2c 20 20 20 20 20 2f 2a  n *pSkip,     /*
9bc0: 20 53 6b 69 70 20 74 68 69 73 20 74 6f 6b 65 6e   Skip this token
9bd0: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
9be0: 20 20 69 6e 74 20 6e 53 6b 69 70 20 20 20 20 20    int nSkip     
9bf0: 20 20 20 20 2f 2a 20 53 6b 69 70 20 61 20 74 6f      /* Skip a to
9c00: 74 61 6c 20 6f 66 20 74 68 69 73 20 6d 61 6e 79  tal of this many
9c10: 20 74 6f 6b 65 6e 73 20 2a 2f 0a 29 7b 0a 20 20   tokens */.){.  
9c20: 63 68 61 72 20 2a 7a 52 65 74 75 72 6e 3b 0a 20  char *zReturn;. 
9c30: 20 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69   String str;.  i
9c40: 6e 74 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30  nt needSpace = 0
9c50: 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74  ;.  int c;.  int
9c60: 20 69 53 6b 69 70 20 3d 20 30 3b 0a 20 20 69 6e   iSkip = 0;.  in
9c70: 74 20 73 6b 69 70 4f 6e 65 20 3d 20 30 3b 0a 0a  t skipOne = 0;..
9c80: 20 20 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74    StringInit(&st
9c90: 72 29 3b 0a 20 20 70 4c 61 73 74 20 3d 20 70 4c  r);.  pLast = pL
9ca0: 61 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 77 68  ast->pNext;.  wh
9cb0: 69 6c 65 28 20 70 46 69 72 73 74 21 3d 70 4c 61  ile( pFirst!=pLa
9cc0: 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  st ){.    if( pF
9cd0: 69 72 73 74 3d 3d 70 53 6b 69 70 20 29 7b 20 69  irst==pSkip ){ i
9ce0: 53 6b 69 70 20 3d 20 6e 53 6b 69 70 3b 20 7d 0a  Skip = nSkip; }.
9cf0: 20 20 20 20 69 66 28 20 69 53 6b 69 70 3e 30 20      if( iSkip>0 
9d00: 29 7b 0a 20 20 20 20 20 20 69 53 6b 69 70 2d 2d  ){.      iSkip--
9d10: 3b 0a 20 20 20 20 20 20 70 46 69 72 73 74 3d 70  ;.      pFirst=p
9d20: 46 69 72 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  First->pNext;.  
9d30: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
9d40: 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20    }.    switch( 
9d50: 70 46 69 72 73 74 2d 3e 65 54 79 70 65 20 29 7b  pFirst->eType ){
9d60: 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 50  .      case TT_P
9d70: 72 65 70 72 6f 63 65 73 73 6f 72 3a 0a 20 20 20  reprocessor:.   
9d80: 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e       StringAppen
9d90: 64 28 26 73 74 72 2c 22 5c 6e 22 2c 31 29 3b 0a  d(&str,"\n",1);.
9da0: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 41 70          StringAp
9db0: 70 65 6e 64 28 26 73 74 72 2c 70 46 69 72 73 74  pend(&str,pFirst
9dc0: 2d 3e 7a 54 65 78 74 2c 70 46 69 72 73 74 2d 3e  ->zText,pFirst->
9dd0: 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  nText);.        
9de0: 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74  StringAppend(&st
9df0: 72 2c 22 5c 6e 22 2c 31 29 3b 0a 20 20 20 20 20  r,"\n",1);.     
9e00: 20 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30     needSpace = 0
9e10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9e20: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f  ..      case TT_
9e30: 49 64 3a 0a 20 20 20 20 20 20 20 20 73 77 69 74  Id:.        swit
9e40: 63 68 28 20 70 46 69 72 73 74 2d 3e 7a 54 65 78  ch( pFirst->zTex
9e50: 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  t[0] ){.        
9e60: 20 20 63 61 73 65 20 27 45 27 3a 0a 20 20 20 20    case 'E':.    
9e70: 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 72          if( pFir
9e80: 73 74 2d 3e 6e 54 65 78 74 3d 3d 36 20 26 26 20  st->nText==6 && 
9e90: 73 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e  strncmp(pFirst->
9ea0: 7a 54 65 78 74 2c 22 45 58 50 4f 52 54 22 2c 36  zText,"EXPORT",6
9eb0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9ec0: 20 20 20 20 20 20 73 6b 69 70 4f 6e 65 20 3d 20        skipOne = 
9ed0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
9ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
9ef0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61  ak;.          ca
9f00: 73 65 20 27 50 27 3a 0a 20 20 20 20 20 20 20 20  se 'P':.        
9f10: 20 20 20 20 73 77 69 74 63 68 28 20 70 46 69 72      switch( pFir
9f20: 73 74 2d 3e 6e 54 65 78 74 20 29 7b 0a 20 20 20  st->nText ){.   
9f30: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
9f40: 36 3a 20 20 73 6b 69 70 4f 6e 65 20 3d 20 21 73  6:  skipOne = !s
9f50: 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e 7a  trncmp(pFirst->z
9f60: 54 65 78 74 2c 22 50 55 42 4c 49 43 22 2c 20 36  Text,"PUBLIC", 6
9f70: 29 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  );    break;.   
9f80: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
9f90: 37 3a 20 20 73 6b 69 70 4f 6e 65 20 3d 20 21 73  7:  skipOne = !s
9fa0: 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e 7a  trncmp(pFirst->z
9fb0: 54 65 78 74 2c 22 50 52 49 56 41 54 45 22 2c 37  Text,"PRIVATE",7
9fc0: 29 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  );    break;.   
9fd0: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
9fe0: 39 3a 20 20 73 6b 69 70 4f 6e 65 20 3d 20 21 73  9:  skipOne = !s
9ff0: 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e 7a  trncmp(pFirst->z
a000: 54 65 78 74 2c 22 50 52 4f 54 45 43 54 45 44 22  Text,"PROTECTED"
a010: 2c 39 29 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ,9);  break;.   
a020: 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75             defau
a030: 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  lt: break;.     
a040: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a050: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a060: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
a070: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a080: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a090: 20 20 20 20 69 66 28 20 73 6b 69 70 4f 6e 65 20      if( skipOne 
a0a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
a0b0: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 4e  rst = pFirst->pN
a0c0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ext;.          c
a0d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
a0e0: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61   }.        /* Fa
a0f0: 6c 6c 20 74 68 72 75 20 74 6f 20 74 68 65 20 6e  ll thru to the n
a100: 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ext case */.    
a110: 20 20 63 61 73 65 20 54 54 5f 4e 75 6d 62 65 72    case TT_Number
a120: 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  :.        if( ne
a130: 65 64 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  edSpace ){.     
a140: 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e       StringAppen
a150: 64 28 26 73 74 72 2c 22 20 22 2c 31 29 3b 0a 20  d(&str," ",1);. 
a160: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a170: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73   StringAppend(&s
a180: 74 72 2c 70 46 69 72 73 74 2d 3e 7a 54 65 78 74  tr,pFirst->zText
a190: 2c 70 46 69 72 73 74 2d 3e 6e 54 65 78 74 29 3b  ,pFirst->nText);
a1a0: 0a 20 20 20 20 20 20 20 20 6e 65 65 64 53 70 61  .        needSpa
a1b0: 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ce = 1;.        
a1c0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65  break;..      de
a1d0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 63  fault:.        c
a1e0: 20 3d 20 70 46 69 72 73 74 2d 3e 7a 54 65 78 74   = pFirst->zText
a1f0: 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
a200: 20 6e 65 65 64 53 70 61 63 65 20 26 26 20 28 63   needSpace && (c
a210: 3d 3d 27 2a 27 20 7c 7c 20 63 3d 3d 27 7b 27 29  =='*' || c=='{')
a220: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 74   ){.          St
a230: 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c  ringAppend(&str,
a240: 22 20 22 2c 31 29 3b 0a 20 20 20 20 20 20 20 20  " ",1);.        
a250: 7d 0a 20 20 20 20 20 20 20 20 53 74 72 69 6e 67  }.        String
a260: 41 70 70 65 6e 64 28 26 73 74 72 2c 70 46 69 72  Append(&str,pFir
a270: 73 74 2d 3e 7a 54 65 78 74 2c 70 46 69 72 73 74  st->zText,pFirst
a280: 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20  ->nText);.      
a290: 20 20 2f 2a 20 6e 65 65 64 53 70 61 63 65 20 3d    /* needSpace =
a2a0: 20 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 5b 30   pFirst->zText[0
a2b0: 5d 3d 3d 27 2c 27 3b 20 2a 2f 0a 20 20 20 20 20  ]==','; */.     
a2c0: 20 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30     needSpace = 0
a2d0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
a2e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 72 73  .    }.    pFirs
a2f0: 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 4e 65 78  t = pFirst->pNex
a300: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 65  t;.  }.  if( zTe
a310: 72 6d 20 26 26 20 2a 7a 54 65 72 6d 20 29 7b 0a  rm && *zTerm ){.
a320: 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64      StringAppend
a330: 28 26 73 74 72 2c 7a 54 65 72 6d 2c 73 74 72 6c  (&str,zTerm,strl
a340: 65 6e 28 7a 54 65 72 6d 29 29 3b 0a 20 20 7d 0a  en(zTerm));.  }.
a350: 20 20 7a 52 65 74 75 72 6e 20 3d 20 53 74 72 44    zReturn = StrD
a360: 75 70 28 53 74 72 69 6e 67 47 65 74 28 26 73 74  up(StringGet(&st
a370: 72 29 2c 30 29 3b 0a 20 20 53 74 72 69 6e 67 52  r),0);.  StringR
a380: 65 73 65 74 28 26 73 74 72 29 3b 0a 20 20 72 65  eset(&str);.  re
a390: 74 75 72 6e 20 7a 52 65 74 75 72 6e 3b 0a 7d 0a  turn zReturn;.}.
a3a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
a3b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
a3c0: 65 6e 20 77 65 20 73 65 65 20 6f 6e 65 20 6f 66  en we see one of
a3d0: 20 74 68 65 20 6b 65 79 77 6f 72 64 73 20 22 73   the keywords "s
a3e0: 74 72 75 63 74 22 2c 0a 2a 2a 20 22 65 6e 75 6d  truct",.** "enum
a3f0: 22 2c 20 22 75 6e 69 6f 6e 22 20 6f 72 20 22 63  ", "union" or "c
a400: 6c 61 73 73 22 2e 20 20 54 68 69 73 20 6d 69 67  lass".  This mig
a410: 68 74 20 62 65 20 74 68 65 20 62 65 67 69 6e 6e  ht be the beginn
a420: 69 6e 67 20 6f 66 20 61 0a 2a 2a 20 74 79 70 65  ing of a.** type
a430: 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 20 54   declaration.  T
a440: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
a450: 20 70 72 6f 63 65 73 73 20 74 68 65 20 64 65 63   process the dec
a460: 6c 61 72 61 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  laration and.** 
a470: 72 65 6d 6f 76 65 20 74 68 65 20 64 65 63 6c 61  remove the decla
a480: 72 61 74 69 6f 6e 20 74 6f 6b 65 6e 73 20 66 72  ration tokens fr
a490: 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  om the input str
a4a0: 65 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eam..**.** If th
a4b0: 69 73 20 69 73 20 61 20 74 79 70 65 20 64 65 63  is is a type dec
a4c0: 6c 61 72 61 74 69 6f 6e 20 74 68 61 74 20 69 73  laration that is
a4d0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
a4e0: 6c 6f 77 65 64 20 62 79 20 61 0a 2a 2a 20 73 65  lowed by a.** se
a4f0: 6d 69 63 6f 6c 6f 6e 20 28 69 6e 20 6f 74 68 65  micolon (in othe
a500: 72 20 77 6f 72 64 73 20 69 74 20 69 73 6e 27 74  r words it isn't
a510: 20 61 6c 73 6f 20 61 20 76 61 72 69 61 62 6c 65   also a variable
a520: 20 64 65 66 69 6e 69 74 69 6f 6e 29 0a 2a 2a 20   definition).** 
a530: 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 65 74  then set *pReset
a540: 20 74 6f 20 27 3b 27 2e 20 20 4f 74 68 65 72 77   to ';'.  Otherw
a550: 69 73 65 20 6c 65 61 76 65 20 2a 70 52 65 73 65  ise leave *pRese
a560: 74 20 61 74 20 30 2e 20 20 54 68 65 0a 2a 2a 20  t at 0.  The.** 
a570: 2a 70 52 65 73 65 74 20 66 6c 61 67 20 63 61 75  *pReset flag cau
a580: 73 65 73 20 74 68 65 20 70 61 72 73 65 72 20 74  ses the parser t
a590: 6f 20 73 6b 69 70 20 61 68 65 61 64 20 74 6f 20  o skip ahead to 
a5a0: 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 0a 2a  the next token.*
a5b0: 2a 20 74 68 61 74 20 62 65 67 69 6e 73 20 77 69  * that begins wi
a5c0: 74 68 20 74 68 65 20 76 61 6c 75 65 20 70 6c 61  th the value pla
a5d0: 63 65 64 20 69 6e 20 74 68 65 20 2a 70 52 65 73  ced in the *pRes
a5e0: 65 74 20 66 6c 61 67 2c 20 69 66 20 74 68 61 74  et flag, if that
a5f0: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 64 69 66  .** value is dif
a600: 66 65 72 65 6e 74 20 66 72 6f 6d 20 30 2e 0a 2a  ferent from 0..*
a610: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 50 72 6f  /.static int Pro
a620: 63 65 73 73 54 79 70 65 44 65 63 6c 28 54 6f 6b  cessTypeDecl(Tok
a630: 65 6e 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 66  en *pList, int f
a640: 6c 61 67 73 2c 20 69 6e 74 20 2a 70 52 65 73 65  lags, int *pRese
a650: 74 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61  t){.  Token *pNa
a660: 6d 65 2c 20 2a 70 45 6e 64 3b 0a 20 20 44 65 63  me, *pEnd;.  Dec
a670: 6c 20 2a 70 44 65 63 6c 3b 0a 20 20 53 74 72 69  l *pDecl;.  Stri
a680: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 6e 65  ng str;.  int ne
a690: 65 64 5f 74 6f 5f 63 6f 6c 6c 61 70 73 65 20 3d  ed_to_collapse =
a6a0: 20 31 3b 0a 20 20 69 6e 74 20 74 79 70 65 20 3d   1;.  int type =
a6b0: 20 30 3b 0a 0a 20 20 2a 70 52 65 73 65 74 20 3d   0;..  *pReset =
a6c0: 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   0;.  if( pList=
a6d0: 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 4e 65  =0 || pList->pNe
a6e0: 78 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  xt==0 || pList->
a6f0: 70 4e 65 78 74 2d 3e 65 54 79 70 65 21 3d 54 54  pNext->eType!=TT
a700: 5f 49 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _Id ){.    retur
a710: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 61 6d 65  n 0;.  }.  pName
a720: 20 3d 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b   = pList->pNext;
a730: 0a 0a 20 20 2f 2a 20 43 61 74 63 68 20 74 68 65  ..  /* Catch the
a740: 20 63 61 73 65 20 6f 66 20 22 73 74 72 75 63 74   case of "struct
a750: 20 46 6f 6f 3b 22 20 61 6e 64 20 73 6b 69 70 20   Foo;" and skip 
a760: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  it. */.  if( pNa
a770: 6d 65 2d 3e 70 4e 65 78 74 20 26 26 20 70 4e 61  me->pNext && pNa
a780: 6d 65 2d 3e 70 4e 65 78 74 2d 3e 7a 54 65 78 74  me->pNext->zText
a790: 5b 30 5d 3d 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]==';' ){.    
a7a0: 2a 70 52 65 73 65 74 20 3d 20 27 3b 27 3b 0a 20  *pReset = ';';. 
a7b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a7c0: 0a 0a 20 20 66 6f 72 28 70 45 6e 64 3d 70 4e 61  ..  for(pEnd=pNa
a7d0: 6d 65 2d 3e 70 4e 65 78 74 3b 20 70 45 6e 64 20  me->pNext; pEnd 
a7e0: 26 26 20 70 45 6e 64 2d 3e 65 54 79 70 65 21 3d  && pEnd->eType!=
a7f0: 54 54 5f 42 72 61 63 65 73 3b 20 70 45 6e 64 3d  TT_Braces; pEnd=
a800: 70 45 6e 64 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pEnd->pNext){.  
a810: 20 20 73 77 69 74 63 68 28 20 70 45 6e 64 2d 3e    switch( pEnd->
a820: 7a 54 65 78 74 5b 30 5d 20 29 7b 0a 20 20 20 20  zText[0] ){.    
a830: 20 20 63 61 73 65 20 27 28 27 3a 0a 20 20 20 20    case '(':.    
a840: 20 20 63 61 73 65 20 27 2a 27 3a 0a 20 20 20 20    case '*':.    
a850: 20 20 63 61 73 65 20 27 5b 27 3a 0a 20 20 20 20    case '[':.    
a860: 20 20 63 61 73 65 20 27 3d 27 3a 0a 20 20 20 20    case '=':.    
a870: 20 20 63 61 73 65 20 27 3b 27 3a 0a 20 20 20 20    case ';':.    
a880: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a890: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 45    }.  }.  if( pE
a8a0: 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  nd==0 ){.    ret
a8b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
a8c0: 0a 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f  .  ** At this po
a8d0: 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 77 65 20  int, we know we 
a8e0: 68 61 76 65 20 61 20 74 79 70 65 20 64 65 63 6c  have a type decl
a8f0: 61 72 61 74 69 6f 6e 20 74 68 61 74 20 69 73 20  aration that is 
a900: 62 6f 75 6e 64 65 64 0a 20 20 2a 2a 20 62 79 20  bounded.  ** by 
a910: 70 4c 69 73 74 20 61 6e 64 20 70 45 6e 64 20 61  pList and pEnd a
a920: 6e 64 20 68 61 73 20 74 68 65 20 6e 61 6d 65 20  nd has the name 
a930: 70 4e 61 6d 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  pName..  */..  /
a940: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 62 72  *.  ** If the br
a950: 61 63 65 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65  aces are followe
a960: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 79  d immediately by
a970: 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 2c 20 74 68   a semicolon, th
a980: 65 6e 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  en we are.  ** d
a990: 65 61 6c 69 6e 67 20 61 20 74 79 70 65 20 64 65  ealing a type de
a9a0: 63 6c 61 72 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20  claration only. 
a9b0: 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20 76 61   There is not va
a9c0: 72 69 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f  riable definitio
a9d0: 6e 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  n.  ** following
a9e0: 20 74 68 65 20 74 79 70 65 20 64 65 63 6c 61 72   the type declar
a9f0: 61 74 69 6f 6e 2e 20 20 53 6f 20 72 65 73 65 74  ation.  So reset
aa00: 2e 2e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ....  */.  if( p
aa10: 45 6e 64 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c  End->pNext==0 ||
aa20: 20 70 45 6e 64 2d 3e 70 4e 65 78 74 2d 3e 7a 54   pEnd->pNext->zT
aa30: 65 78 74 5b 30 5d 3d 3d 27 3b 27 20 29 7b 0a 20  ext[0]==';' ){. 
aa40: 20 20 20 2a 70 52 65 73 65 74 20 3d 20 27 3b 27     *pReset = ';'
aa50: 3b 0a 20 20 20 20 6e 65 65 64 5f 74 6f 5f 63 6f  ;.    need_to_co
aa60: 6c 6c 61 70 73 65 20 3d 20 30 3b 0a 20 20 7d 65  llapse = 0;.  }e
aa70: 6c 73 65 7b 0a 20 20 20 20 6e 65 65 64 5f 74 6f  lse{.    need_to
aa80: 5f 63 6f 6c 6c 61 70 73 65 20 3d 20 31 3b 0a 20  _collapse = 1;. 
aa90: 20 7d 0a 0a 20 20 69 66 28 20 70 72 6f 74 6f 5f   }..  if( proto_
aaa0: 73 74 61 74 69 63 3d 3d 30 20 26 26 20 28 66 6c  static==0 && (fl
aab0: 61 67 73 20 26 20 28 50 53 5f 4c 6f 63 61 6c 7c  ags & (PS_Local|
aac0: 50 53 5f 45 78 70 6f 72 74 7c 50 53 5f 49 6e 74  PS_Export|PS_Int
aad0: 65 72 66 61 63 65 29 29 3d 3d 30 20 29 7b 0a 20  erface))==0 ){. 
aae0: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65     /* Ignore the
aaf0: 73 65 20 6f 62 6a 65 63 74 73 20 75 6e 6c 65 73  se objects unles
ab00: 73 20 74 68 65 79 20 61 72 65 20 65 78 70 6c 69  s they are expli
ab10: 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 61  citly declared a
ab20: 73 20 69 6e 74 65 72 66 61 63 65 2c 0a 20 20 20  s interface,.   
ab30: 20 2a 2a 20 6f 72 20 75 6e 6c 65 73 73 20 74 68   ** or unless th
ab40: 65 20 22 2d 6c 6f 63 61 6c 22 20 63 6f 6d 6d 61  e "-local" comma
ab50: 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 77  nd line option w
ab60: 61 73 20 73 70 65 63 69 66 69 65 64 2e 20 2a 2f  as specified. */
ab70: 0a 20 20 20 20 2a 70 52 65 73 65 74 20 3d 20 27  .    *pReset = '
ab80: 3b 27 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ;';.    return 0
ab90: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 44 45  ;.  }..#ifdef DE
aba0: 42 55 47 0a 20 20 69 66 28 20 64 65 62 75 67 4d  BUG.  if( debugM
abb0: 61 73 6b 20 26 20 50 41 52 53 45 52 20 29 7b 0a  ask & PARSER ){.
abc0: 20 20 20 20 70 72 69 6e 74 66 28 22 2a 2a 2a 2a      printf("****
abd0: 20 46 6f 75 6e 64 20 74 79 70 65 3a 20 25 2e 2a   Found type: %.*
abe0: 73 20 25 2e 2a 73 2e 2e 2e 5c 6e 22 2c 0a 20 20  s %.*s...\n",.  
abf0: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74      pList->nText
ac00: 2c 20 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 20  , pList->zText, 
ac10: 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 2c 20 70 4e  pName->nText, pN
ac20: 61 6d 65 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20  ame->zText);.   
ac30: 20 50 72 69 6e 74 54 6f 6b 65 6e 73 28 70 4c 69   PrintTokens(pLi
ac40: 73 74 2c 70 45 6e 64 29 3b 0a 20 20 20 20 70 72  st,pEnd);.    pr
ac50: 69 6e 74 66 28 22 3b 5c 6e 22 29 3b 0a 20 20 7d  intf(";\n");.  }
ac60: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
ac70: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
ac80: 44 65 63 6c 20 6f 62 6a 65 63 74 20 66 6f 72 20  Decl object for 
ac90: 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e  this definition.
aca0: 20 20 41 63 74 75 61 6c 6c 79 2c 20 69 66 20 74    Actually, if t
acb0: 68 69 73 0a 20 20 2a 2a 20 69 73 20 61 20 43 2b  his.  ** is a C+
acc0: 2b 20 63 6c 61 73 73 20 64 65 66 69 6e 69 74 69  + class definiti
acd0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 44 65 63  on, then the Dec
ace0: 6c 20 6f 62 6a 65 63 74 20 6d 69 67 68 74 20 61  l object might a
acf0: 6c 72 65 61 64 79 20 65 78 69 73 74 2c 0a 20 20  lready exist,.  
ad00: 2a 2a 20 73 6f 20 63 68 65 63 6b 20 66 69 72 73  ** so check firs
ad10: 74 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20  t for that case 
ad20: 62 65 66 6f 72 65 20 63 72 65 61 74 69 6e 67 20  before creating 
ad30: 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
ad40: 20 20 73 77 69 74 63 68 28 20 2a 70 4c 69 73 74    switch( *pList
ad50: 2d 3e 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 63  ->zText ){.    c
ad60: 61 73 65 20 27 63 27 3a 20 20 74 79 70 65 20 3d  ase 'c':  type =
ad70: 20 54 59 5f 43 6c 61 73 73 3b 20 20 20 20 20 20   TY_Class;      
ad80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
ad90: 65 20 27 73 27 3a 20 20 74 79 70 65 20 3d 20 54  e 's':  type = T
ada0: 59 5f 53 74 72 75 63 74 75 72 65 3b 20 20 20 20  Y_Structure;    
adb0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
adc0: 27 65 27 3a 20 20 74 79 70 65 20 3d 20 54 59 5f  'e':  type = TY_
add0: 45 6e 75 6d 65 72 61 74 69 6f 6e 3b 20 20 62 72  Enumeration;  br
ade0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 75  eak;.    case 'u
adf0: 27 3a 20 20 74 79 70 65 20 3d 20 54 59 5f 55 6e  ':  type = TY_Un
ae00: 69 6f 6e 3b 20 20 20 20 20 20 20 20 62 72 65 61  ion;        brea
ae10: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
ae20: 20 20 2f 2a 20 43 61 6e 27 74 20 48 61 70 70 65    /* Can't Happe
ae30: 6e 20 2a 2f 20 20 20 20 20 20 62 72 65 61 6b 3b  n */      break;
ae40: 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 21  .  }.  if( type!
ae50: 3d 54 59 5f 43 6c 61 73 73 20 29 7b 0a 20 20 20  =TY_Class ){.   
ae60: 20 70 44 65 63 6c 20 3d 20 30 3b 0a 20 20 7d 65   pDecl = 0;.  }e
ae70: 6c 73 65 7b 0a 20 20 20 20 70 44 65 63 6c 20 3d  lse{.    pDecl =
ae80: 20 46 69 6e 64 44 65 63 6c 28 70 4e 61 6d 65 2d   FindDecl(pName-
ae90: 3e 7a 54 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 6e  >zText, pName->n
aea0: 54 65 78 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Text);.    if( p
aeb0: 44 65 63 6c 20 26 26 20 28 70 44 65 63 6c 2d 3e  Decl && (pDecl->
aec0: 66 6c 61 67 73 20 26 20 74 79 70 65 29 21 3d 74  flags & type)!=t
aed0: 79 70 65 20 29 20 70 44 65 63 6c 20 3d 20 30 3b  ype ) pDecl = 0;
aee0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 63 6c  .  }.  if( pDecl
aef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 65 63 6c  ==0 ){.    pDecl
af00: 20 3d 20 43 72 65 61 74 65 44 65 63 6c 28 70 4e   = CreateDecl(pN
af10: 61 6d 65 2d 3e 7a 54 65 78 74 2c 70 4e 61 6d 65  ame->zText,pName
af20: 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20  ->nText);.  }.  
af30: 69 66 28 20 28 66 6c 61 67 73 20 26 20 50 53 5f  if( (flags & PS_
af40: 53 74 61 74 69 63 29 20 7c 7c 20 21 28 66 6c 61  Static) || !(fla
af50: 67 73 20 26 20 28 50 53 5f 49 6e 74 65 72 66 61  gs & (PS_Interfa
af60: 63 65 7c 50 53 5f 45 78 70 6f 72 74 29 29 20 29  ce|PS_Export)) )
af70: 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f  {.    DeclSetPro
af80: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 4c  perty(pDecl,DP_L
af90: 6f 63 61 6c 29 3b 0a 20 20 7d 0a 20 20 44 65 63  ocal);.  }.  Dec
afa0: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65  lSetProperty(pDe
afb0: 63 6c 2c 74 79 70 65 29 3b 0a 0a 20 20 2f 2a 20  cl,type);..  /* 
afc0: 54 68 65 20 6f 62 6a 65 63 74 20 68 61 73 20 61  The object has a
afd0: 20 66 75 6c 6c 20 64 65 63 6c 61 72 61 74 69 6f   full declaratio
afe0: 6e 20 6f 6e 6c 79 20 69 66 20 69 74 20 69 73 20  n only if it is 
aff0: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
b000: 0a 20 20 2a 2a 20 22 23 69 66 20 49 4e 54 45 52  .  ** "#if INTER
b010: 46 41 43 45 2e 2e 2e 23 65 6e 64 69 66 22 20 6f  FACE...#endif" o
b020: 72 20 22 23 69 66 20 45 58 50 4f 52 54 5f 49 4e  r "#if EXPORT_IN
b030: 54 45 52 46 41 43 45 2e 2e 2e 23 65 6e 64 69 66  TERFACE...#endif
b040: 22 20 6f 72 0a 20 20 2a 2a 20 22 23 69 66 20 4c  " or.  ** "#if L
b050: 4f 43 41 4c 5f 49 4e 54 45 52 46 41 43 45 2e 2e  OCAL_INTERFACE..
b060: 2e 23 65 6e 64 69 66 22 2e 20 20 4f 74 68 65 72  .#endif".  Other
b070: 77 69 73 65 2c 20 77 65 20 6f 6e 6c 79 20 67 69  wise, we only gi
b080: 76 65 20 69 74 20 61 0a 20 20 2a 2a 20 66 6f 72  ve it a.  ** for
b090: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
b0a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 6c 61  ..  */.  if( fla
b0b0: 67 73 20 26 20 28 50 53 5f 4c 6f 63 61 6c 20 7c  gs & (PS_Local |
b0c0: 20 50 53 5f 45 78 70 6f 72 74 20 7c 20 50 53 5f   PS_Export | PS_
b0d0: 49 6e 74 65 72 66 61 63 65 29 20 20 29 7b 0a 20  Interface)  ){. 
b0e0: 20 20 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 20     pDecl->zDecl 
b0f0: 3d 20 54 6f 6b 65 6e 73 54 6f 53 74 72 69 6e 67  = TokensToString
b100: 28 70 4c 69 73 74 2c 70 45 6e 64 2c 22 3b 5c 6e  (pList,pEnd,";\n
b110: 22 2c 30 2c 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  ",0,0);.  }else{
b120: 0a 20 20 20 20 70 44 65 63 6c 2d 3e 7a 44 65 63  .    pDecl->zDec
b130: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 44 65  l = 0;.  }.  pDe
b140: 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20 3d 20 70  cl->pComment = p
b150: 4c 69 73 74 2d 3e 70 43 6f 6d 6d 65 6e 74 3b 0a  List->pComment;.
b160: 20 20 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74    StringInit(&st
b170: 72 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70 65  r);.  StringAppe
b180: 6e 64 28 26 73 74 72 2c 22 74 79 70 65 64 65 66  nd(&str,"typedef
b190: 20 22 2c 30 29 3b 0a 20 20 53 74 72 69 6e 67 41   ",0);.  StringA
b1a0: 70 70 65 6e 64 28 26 73 74 72 2c 70 4c 69 73 74  ppend(&str,pList
b1b0: 2d 3e 7a 54 65 78 74 2c 70 4c 69 73 74 2d 3e 6e  ->zText,pList->n
b1c0: 54 65 78 74 29 3b 0a 20 20 53 74 72 69 6e 67 41  Text);.  StringA
b1d0: 70 70 65 6e 64 28 26 73 74 72 2c 22 20 22 2c 30  ppend(&str," ",0
b1e0: 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70 65 6e  );.  StringAppen
b1f0: 64 28 26 73 74 72 2c 70 4e 61 6d 65 2d 3e 7a 54  d(&str,pName->zT
b200: 65 78 74 2c 70 4e 61 6d 65 2d 3e 6e 54 65 78 74  ext,pName->nText
b210: 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70 65 6e  );.  StringAppen
b220: 64 28 26 73 74 72 2c 22 20 22 2c 30 29 3b 0a 20  d(&str," ",0);. 
b230: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73   StringAppend(&s
b240: 74 72 2c 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c  tr,pName->zText,
b250: 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 29 3b 0a 20  pName->nText);. 
b260: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73   StringAppend(&s
b270: 74 72 2c 22 3b 5c 6e 22 2c 32 29 3b 0a 20 20 70  tr,";\n",2);.  p
b280: 44 65 63 6c 2d 3e 7a 46 77 64 20 3d 20 53 74 72  Decl->zFwd = Str
b290: 44 75 70 28 53 74 72 69 6e 67 47 65 74 28 26 73  Dup(StringGet(&s
b2a0: 74 72 29 2c 30 29 3b 0a 20 20 53 74 72 69 6e 67  tr),0);.  String
b2b0: 52 65 73 65 74 28 26 73 74 72 29 3b 0a 20 20 53  Reset(&str);.  S
b2c0: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
b2d0: 0a 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28  .  StringAppend(
b2e0: 26 73 74 72 2c 70 4c 69 73 74 2d 3e 7a 54 65 78  &str,pList->zTex
b2f0: 74 2c 70 4c 69 73 74 2d 3e 6e 54 65 78 74 29 3b  t,pList->nText);
b300: 0a 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28  .  StringAppend(
b310: 26 73 74 72 2c 22 20 22 2c 30 29 3b 0a 20 20 53  &str," ",0);.  S
b320: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72  tringAppend(&str
b330: 2c 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 70 4e  ,pName->zText,pN
b340: 61 6d 65 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 53  ame->nText);.  S
b350: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72  tringAppend(&str
b360: 2c 22 3b 5c 6e 22 2c 32 29 3b 0a 20 20 70 44 65  ,";\n",2);.  pDe
b370: 63 6c 2d 3e 7a 46 77 64 43 70 70 20 3d 20 53 74  cl->zFwdCpp = St
b380: 72 44 75 70 28 53 74 72 69 6e 67 47 65 74 28 26  rDup(StringGet(&
b390: 73 74 72 29 2c 30 29 3b 0a 20 20 53 74 72 69 6e  str),0);.  Strin
b3a0: 67 52 65 73 65 74 28 26 73 74 72 29 3b 0a 20 20  gReset(&str);.  
b3b0: 69 66 28 20 66 6c 61 67 73 20 26 20 50 53 5f 45  if( flags & PS_E
b3c0: 78 70 6f 72 74 20 29 7b 0a 20 20 20 20 44 65 63  xport ){.    Dec
b3d0: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65  lSetProperty(pDe
b3e0: 63 6c 2c 44 50 5f 45 78 70 6f 72 74 29 3b 0a 20  cl,DP_Export);. 
b3f0: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
b400: 20 26 20 50 53 5f 4c 6f 63 61 6c 20 29 7b 0a 20   & PS_Local ){. 
b410: 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72     DeclSetProper
b420: 74 79 28 70 44 65 63 6c 2c 44 50 5f 4c 6f 63 61  ty(pDecl,DP_Loca
b430: 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 48 65  l);.  }..  /* He
b440: 72 65 27 73 20 73 6f 6d 65 74 68 69 6e 67 20 77  re's something w
b450: 65 69 72 64 2e 20 20 41 4e 53 49 2d 43 20 64 6f  eird.  ANSI-C do
b460: 65 73 6e 27 74 20 61 6c 6c 6f 77 20 61 20 66 6f  esn't allow a fo
b470: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
b480: 6e 0a 20 20 2a 2a 20 6f 66 20 61 6e 20 65 6e 75  n.  ** of an enu
b490: 6d 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 77 65  meration.  So we
b4a0: 20 68 61 76 65 20 74 6f 20 62 75 69 6c 64 20 74   have to build t
b4b0: 68 65 20 74 79 70 65 64 65 66 20 69 6e 74 6f 20  he typedef into 
b4c0: 74 68 65 0a 20 20 2a 2a 20 64 65 66 69 6e 69 74  the.  ** definit
b4d0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
b4e0: 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 20 26 26 20  pDecl->zDecl && 
b4f0: 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28  DeclHasProperty(
b500: 70 44 65 63 6c 2c 20 54 59 5f 45 6e 75 6d 65 72  pDecl, TY_Enumer
b510: 61 74 69 6f 6e 29 20 29 7b 0a 20 20 20 20 53 74  ation) ){.    St
b520: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
b530: 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64      StringAppend
b540: 28 26 73 74 72 2c 70 44 65 63 6c 2d 3e 7a 44 65  (&str,pDecl->zDe
b550: 63 6c 2c 30 29 3b 0a 20 20 20 20 53 74 72 69 6e  cl,0);.    Strin
b560: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 70 44 65  gAppend(&str,pDe
b570: 63 6c 2d 3e 7a 46 77 64 2c 30 29 3b 0a 20 20 20  cl->zFwd,0);.   
b580: 20 53 61 66 65 46 72 65 65 28 70 44 65 63 6c 2d   SafeFree(pDecl-
b590: 3e 7a 44 65 63 6c 29 3b 0a 20 20 20 20 53 61 66  >zDecl);.    Saf
b5a0: 65 46 72 65 65 28 70 44 65 63 6c 2d 3e 7a 46 77  eFree(pDecl->zFw
b5b0: 64 29 3b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 7a  d);.    pDecl->z
b5c0: 46 77 64 20 3d 20 30 3b 0a 20 20 20 20 70 44 65  Fwd = 0;.    pDe
b5d0: 63 6c 2d 3e 7a 44 65 63 6c 20 3d 20 53 74 72 44  cl->zDecl = StrD
b5e0: 75 70 28 53 74 72 69 6e 67 47 65 74 28 26 73 74  up(StringGet(&st
b5f0: 72 29 2c 30 29 3b 0a 20 20 20 20 53 74 72 69 6e  r),0);.    Strin
b600: 67 52 65 73 65 74 28 26 73 74 72 29 3b 0a 20 20  gReset(&str);.  
b610: 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e  }..  if( pName->
b620: 70 4e 65 78 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d  pNext->zText[0]=
b630: 3d 27 3a 27 20 29 7b 0a 20 20 20 20 44 65 63 6c  =':' ){.    Decl
b640: 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63  SetProperty(pDec
b650: 6c 2c 44 50 5f 43 70 6c 75 73 70 6c 75 73 29 3b  l,DP_Cplusplus);
b660: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 61 6d 65  .  }.  if( pName
b670: 2d 3e 6e 54 65 78 74 3d 3d 35 20 26 26 20 73 74  ->nText==5 && st
b680: 72 6e 63 6d 70 28 70 4e 61 6d 65 2d 3e 7a 54 65  rncmp(pName->zTe
b690: 78 74 2c 22 63 6c 61 73 73 22 2c 35 29 3d 3d 30  xt,"class",5)==0
b6a0: 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50   ){.    DeclSetP
b6b0: 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50  roperty(pDecl,DP
b6c0: 5f 43 70 6c 75 73 70 6c 75 73 29 3b 0a 20 20 7d  _Cplusplus);.  }
b6d0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 6d 6f  ..  /*.  ** Remo
b6e0: 76 65 20 61 6c 6c 20 62 75 74 20 70 4c 69 73 74  ve all but pList
b6f0: 20 61 6e 64 20 70 4e 61 6d 65 20 66 72 6f 6d 20   and pName from 
b700: 74 68 65 20 69 6e 70 75 74 20 73 74 72 65 61 6d  the input stream
b710: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65  ..  */.  if( nee
b720: 64 5f 74 6f 5f 63 6f 6c 6c 61 70 73 65 20 29 7b  d_to_collapse ){
b730: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 45 6e 64  .    while( pEnd
b740: 21 3d 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  !=pName ){.     
b750: 20 54 6f 6b 65 6e 20 2a 70 50 72 65 76 20 3d 20   Token *pPrev = 
b760: 70 45 6e 64 2d 3e 70 50 72 65 76 3b 0a 20 20 20  pEnd->pPrev;.   
b770: 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20     pPrev->pNext 
b780: 3d 20 70 45 6e 64 2d 3e 70 4e 65 78 74 3b 0a 20  = pEnd->pNext;. 
b790: 20 20 20 20 20 70 45 6e 64 2d 3e 70 4e 65 78 74       pEnd->pNext
b7a0: 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 76 3b  ->pPrev = pPrev;
b7b0: 0a 20 20 20 20 20 20 53 61 66 65 46 72 65 65 28  .      SafeFree(
b7c0: 70 45 6e 64 29 3b 0a 20 20 20 20 20 20 70 45 6e  pEnd);.      pEn
b7d0: 64 20 3d 20 70 50 72 65 76 3b 0a 20 20 20 20 7d  d = pPrev;.    }
b7e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
b7f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
b800: 61 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73  a list of tokens
b810: 20 74 68 61 74 20 64 65 63 6c 61 72 65 20 73 6f   that declare so
b820: 6d 65 74 68 69 6e 67 20 28 61 20 66 75 6e 63 74  mething (a funct
b830: 69 6f 6e 2c 20 70 72 6f 63 65 64 75 72 65 2c 0a  ion, procedure,.
b840: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6f 72 20 74  ** variable or t
b850: 79 70 65 64 65 66 29 20 66 69 6e 64 20 74 68 65  ypedef) find the
b860: 20 74 6f 6b 65 6e 20 77 68 69 63 68 20 63 6f 6e   token which con
b870: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
b880: 66 20 74 68 65 0a 2a 2a 20 74 68 69 6e 67 20 62  f the.** thing b
b890: 65 69 6e 67 20 64 65 63 6c 61 72 65 64 2e 0a 2a  eing declared..*
b8a0: 2a 0a 2a 2a 20 41 6c 67 6f 72 69 74 68 6d 3a 0a  *.** Algorithm:.
b8b0: 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 6e 61 6d 65  **.**   The name
b8c0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 31   is:.**.**     1
b8d0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 64 65  .  The first ide
b8e0: 6e 74 69 66 69 65 72 20 74 68 61 74 20 69 73 20  ntifier that is 
b8f0: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 22 5b  followed by a "[
b900: 22 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ", or.**.**     
b910: 32 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 64  2.  The first id
b920: 65 6e 74 69 66 69 65 72 20 74 68 61 74 20 69 73  entifier that is
b930: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 22   followed by a "
b940: 28 22 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  (" where the.** 
b950: 20 20 20 20 20 20 20 20 22 28 22 20 69 73 20 66          "(" is f
b960: 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 6f 74 68  ollowed by anoth
b970: 65 72 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f  er identifier, o
b980: 72 0a 2a 2a 0a 2a 2a 20 20 20 20 20 33 2e 20 20  r.**.**     3.  
b990: 54 68 65 20 66 69 72 73 74 20 69 64 65 6e 74 69  The first identi
b9a0: 66 69 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  fier followed by
b9b0: 20 22 3a 3a 22 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20   "::", or.**.** 
b9c0: 20 20 20 20 34 2e 20 20 49 66 20 6e 6f 6e 65 20      4.  If none 
b9d0: 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68  of the above, th
b9e0: 65 6e 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e  en the last iden
b9f0: 74 69 66 69 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  tifier..**.**   
ba00: 49 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  In all of the ab
ba10: 6f 76 65 2c 20 63 65 72 74 61 69 6e 20 72 65 73  ove, certain res
ba20: 65 72 76 65 64 20 77 6f 72 64 73 20 28 6c 69 6b  erved words (lik
ba30: 65 20 22 63 68 61 72 22 29 20 61 72 65 0a 2a 2a  e "char") are.**
ba40: 20 20 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65     not considere
ba50: 64 20 69 64 65 6e 74 69 66 69 65 72 73 2e 0a 2a  d identifiers..*
ba60: 2f 0a 73 74 61 74 69 63 20 54 6f 6b 65 6e 20 2a  /.static Token *
ba70: 46 69 6e 64 44 65 63 6c 4e 61 6d 65 28 54 6f 6b  FindDeclName(Tok
ba80: 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65  en *pFirst, Toke
ba90: 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 6f 6b  n *pLast){.  Tok
baa0: 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20  en *pName = 0;. 
bab0: 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 69 6e 74   Token *p;.  int
bac0: 20 63 3b 0a 0a 20 20 69 66 28 20 70 46 69 72 73   c;..  if( pFirs
bad0: 74 3d 3d 30 20 7c 7c 20 70 4c 61 73 74 3d 3d 30  t==0 || pLast==0
bae0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
baf0: 3b 0a 20 20 7d 0a 20 20 70 4c 61 73 74 20 3d 20  ;.  }.  pLast = 
bb00: 70 4c 61 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLast->pNext;.  
bb10: 66 6f 72 28 70 3d 70 46 69 72 73 74 3b 20 70 20  for(p=pFirst; p 
bb20: 26 26 20 70 21 3d 70 4c 61 73 74 3b 20 70 3d 70  && p!=pLast; p=p
bb30: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
bb40: 28 20 70 2d 3e 65 54 79 70 65 3d 3d 54 54 5f 49  ( p->eType==TT_I
bb50: 64 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69  d ){.      stati
bb60: 63 20 49 64 65 6e 74 54 61 62 6c 65 20 73 52 65  c IdentTable sRe
bb70: 73 65 72 76 65 64 3b 0a 20 20 20 20 20 20 73 74  served;.      st
bb80: 61 74 69 63 20 69 6e 74 20 69 73 49 6e 69 74 20  atic int isInit 
bb90: 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 74 69  = 0;.      stati
bba0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 57  c const char *aW
bbb0: 6f 72 64 73 5b 5d 20 3d 20 7b 20 22 63 68 61 72  ords[] = { "char
bbc0: 22 2c 20 22 63 6c 61 73 73 22 2c 0a 20 20 20 20  ", "class",.    
bbd0: 20 20 20 22 63 6f 6e 73 74 22 2c 20 22 64 6f 75     "const", "dou
bbe0: 62 6c 65 22 2c 20 22 65 6e 75 6d 22 2c 20 22 65  ble", "enum", "e
bbf0: 78 74 65 72 6e 22 2c 20 22 45 58 50 4f 52 54 22  xtern", "EXPORT"
bc00: 2c 20 22 45 54 5f 50 52 4f 43 22 2c 0a 20 20 20  , "ET_PROC",.   
bc10: 20 20 20 20 22 66 6c 6f 61 74 22 2c 20 22 69 6e      "float", "in
bc20: 74 22 2c 20 22 6c 6f 6e 67 22 2c 0a 20 20 20 20  t", "long",.    
bc30: 20 20 20 22 50 52 49 56 41 54 45 22 2c 20 22 50     "PRIVATE", "P
bc40: 52 4f 54 45 43 54 45 44 22 2c 20 22 50 55 42 4c  ROTECTED", "PUBL
bc50: 49 43 22 2c 0a 20 20 20 20 20 20 20 22 72 65 67  IC",.       "reg
bc60: 69 73 74 65 72 22 2c 20 22 73 74 61 74 69 63 22  ister", "static"
bc70: 2c 20 22 73 74 72 75 63 74 22 2c 20 22 73 69 7a  , "struct", "siz
bc80: 65 6f 66 22 2c 20 22 73 69 67 6e 65 64 22 2c 20  eof", "signed", 
bc90: 22 74 79 70 65 64 65 66 22 2c 0a 20 20 20 20 20  "typedef",.     
bca0: 20 20 22 75 6e 69 6f 6e 22 2c 20 22 76 6f 6c 61    "union", "vola
bcb0: 74 69 6c 65 22 2c 20 22 76 69 72 74 75 61 6c 22  tile", "virtual"
bcc0: 2c 20 22 76 6f 69 64 22 2c 20 7d 3b 0a 0a 20 20  , "void", };..  
bcd0: 20 20 20 20 69 66 28 20 21 69 73 49 6e 69 74 20      if( !isInit 
bce0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
bcf0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
bd00: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 57 6f 72  0; i<sizeof(aWor
bd10: 64 73 29 2f 73 69 7a 65 6f 66 28 61 57 6f 72 64  ds)/sizeof(aWord
bd20: 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  s[0]); i++){.   
bd30: 20 20 20 20 20 20 20 49 64 65 6e 74 54 61 62 6c         IdentTabl
bd40: 65 49 6e 73 65 72 74 28 26 73 52 65 73 65 72 76  eInsert(&sReserv
bd50: 65 64 2c 61 57 6f 72 64 73 5b 69 5d 2c 30 29 3b  ed,aWords[i],0);
bd60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bd70: 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20     isInit = 1;. 
bd80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
bd90: 20 21 49 64 65 6e 74 54 61 62 6c 65 54 65 73 74   !IdentTableTest
bda0: 28 26 73 52 65 73 65 72 76 65 64 2c 70 2d 3e 7a  (&sReserved,p->z
bdb0: 54 65 78 74 2c 70 2d 3e 6e 54 65 78 74 29 20 29  Text,p->nText) )
bdc0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20  {.        pName 
bdd0: 3d 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = p;.      }.   
bde0: 20 7d 65 6c 73 65 20 69 66 28 20 70 3d 3d 70 46   }else if( p==pF
bdf0: 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 63 6f  irst ){.      co
be00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73  ntinue;.    }els
be10: 65 20 69 66 28 20 28 63 3d 70 2d 3e 7a 54 65 78  e if( (c=p->zTex
be20: 74 5b 30 5d 29 3d 3d 27 5b 27 20 26 26 20 70 4e  t[0])=='[' && pN
be30: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 62 72 65  ame ){.      bre
be40: 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ak;.    }else if
be50: 28 20 63 3d 3d 27 28 27 20 26 26 20 70 2d 3e 70  ( c=='(' && p->p
be60: 4e 65 78 74 20 26 26 20 70 2d 3e 70 4e 65 78 74  Next && p->pNext
be70: 2d 3e 65 54 79 70 65 3d 3d 54 54 5f 49 64 20 26  ->eType==TT_Id &
be80: 26 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  & pName ){.     
be90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
bea0: 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20  e if( c==':' && 
beb0: 70 2d 3e 7a 54 65 78 74 5b 31 5d 3d 3d 27 3a 27  p->zText[1]==':'
bec0: 20 26 26 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20   && pName ){.   
bed0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bee0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 61    }.  return pNa
bef0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  me;.}../*.** Thi
bf00: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
bf10: 6c 65 64 20 77 68 65 6e 20 77 65 20 73 65 65 20  led when we see 
bf20: 61 20 6d 65 74 68 6f 64 20 66 6f 72 20 61 20 63  a method for a c
bf30: 6c 61 73 73 20 74 68 61 74 20 62 65 67 69 6e 73  lass that begins
bf40: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 50 55 42  .** with the PUB
bf50: 4c 49 43 2c 20 50 52 49 56 41 54 45 2c 20 6f 72  LIC, PRIVATE, or
bf60: 20 50 52 4f 54 45 43 54 45 44 20 6b 65 79 77 6f   PROTECTED keywo
bf70: 72 64 73 2e 20 20 53 75 63 68 20 6d 65 74 68 6f  rds.  Such metho
bf80: 64 73 20 61 72 65 0a 2a 2a 20 61 64 64 65 64 20  ds are.** added 
bf90: 74 6f 20 74 68 65 69 72 20 63 6c 61 73 73 20 64  to their class d
bfa0: 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 73  efinitions..*/.s
bfb0: 74 61 74 69 63 20 69 6e 74 20 50 72 6f 63 65 73  tatic int Proces
bfc0: 73 4d 65 74 68 6f 64 44 65 66 28 54 6f 6b 65 6e  sMethodDef(Token
bfd0: 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20   *pFirst, Token 
bfe0: 2a 70 4c 61 73 74 2c 20 69 6e 74 20 66 6c 61 67  *pLast, int flag
bff0: 73 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6c  s){.  Token *pCl
c000: 61 73 73 3b 0a 20 20 63 68 61 72 20 2a 7a 44 65  ass;.  char *zDe
c010: 63 6c 3b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63  cl;.  Decl *pDec
c020: 6c 3b 0a 20 20 53 74 72 69 6e 67 20 73 74 72 3b  l;.  String str;
c030: 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 0a 20 20  .  int type;..  
c040: 70 4c 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70  pLast = pLast->p
c050: 50 72 65 76 3b 0a 20 20 77 68 69 6c 65 28 20 70  Prev;.  while( p
c060: 46 69 72 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d  First->zText[0]=
c070: 3d 27 50 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='P' ){.    int 
c080: 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 77 69 74  rc = 1;.    swit
c090: 63 68 28 20 70 46 69 72 73 74 2d 3e 6e 54 65 78  ch( pFirst->nTex
c0a0: 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  t ){.      case 
c0b0: 36 3a 20 20 72 63 20 3d 20 73 74 72 6e 63 6d 70  6:  rc = strncmp
c0c0: 28 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22  (pFirst->zText,"
c0d0: 50 55 42 4c 49 43 22 2c 36 29 3b 20 62 72 65 61  PUBLIC",6); brea
c0e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 37 3a  k;.      case 7:
c0f0: 20 20 72 63 20 3d 20 73 74 72 6e 63 6d 70 28 70    rc = strncmp(p
c100: 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 50 52  First->zText,"PR
c110: 49 56 41 54 45 22 2c 37 29 3b 20 62 72 65 61 6b  IVATE",7); break
c120: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 39 3a 20  ;.      case 9: 
c130: 20 72 63 20 3d 20 73 74 72 6e 63 6d 70 28 70 46   rc = strncmp(pF
c140: 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 50 52 4f  irst->zText,"PRO
c150: 54 45 43 54 45 44 22 2c 39 29 3b 20 62 72 65 61  TECTED",9); brea
c160: 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  k;.      default
c170: 3a 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  :  break;.    }.
c180: 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
c190: 61 6b 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d  ak;.    pFirst =
c1a0: 20 70 46 69 72 73 74 2d 3e 70 4e 65 78 74 3b 0a   pFirst->pNext;.
c1b0: 20 20 7d 0a 20 20 70 43 6c 61 73 73 20 3d 20 46    }.  pClass = F
c1c0: 69 6e 64 44 65 63 6c 4e 61 6d 65 28 70 46 69 72  indDeclName(pFir
c1d0: 73 74 2c 70 4c 61 73 74 29 3b 0a 20 20 69 66 28  st,pLast);.  if(
c1e0: 20 70 43 6c 61 73 73 3d 3d 30 20 29 7b 0a 20 20   pClass==0 ){.  
c1f0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
c200: 2c 22 25 73 3a 25 64 3a 20 55 6e 61 62 6c 65 20  ,"%s:%d: Unable 
c210: 74 6f 20 66 69 6e 64 20 74 68 65 20 63 6c 61 73  to find the clas
c220: 73 20 6e 61 6d 65 20 66 6f 72 20 74 68 69 73 20  s name for this 
c230: 6d 65 74 68 6f 64 5c 6e 22 2c 0a 20 20 20 20 20  method\n",.     
c240: 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69    zFilename, pFi
c250: 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20  rst->nLine);.   
c260: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
c270: 20 70 44 65 63 6c 20 3d 20 46 69 6e 64 44 65 63   pDecl = FindDec
c280: 6c 28 70 43 6c 61 73 73 2d 3e 7a 54 65 78 74 2c  l(pClass->zText,
c290: 20 70 43 6c 61 73 73 2d 3e 6e 54 65 78 74 29 3b   pClass->nText);
c2a0: 0a 20 20 69 66 28 20 70 44 65 63 6c 3d 3d 30 20  .  if( pDecl==0 
c2b0: 7c 7c 20 28 70 44 65 63 6c 2d 3e 66 6c 61 67 73  || (pDecl->flags
c2c0: 20 26 20 54 59 5f 43 6c 61 73 73 29 21 3d 54 59   & TY_Class)!=TY
c2d0: 5f 43 6c 61 73 73 20 29 7b 0a 20 20 20 20 70 44  _Class ){.    pD
c2e0: 65 63 6c 20 3d 20 43 72 65 61 74 65 44 65 63 6c  ecl = CreateDecl
c2f0: 28 70 43 6c 61 73 73 2d 3e 7a 54 65 78 74 2c 20  (pClass->zText, 
c300: 70 43 6c 61 73 73 2d 3e 6e 54 65 78 74 29 3b 0a  pClass->nText);.
c310: 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65      DeclSetPrope
c320: 72 74 79 28 70 44 65 63 6c 2c 20 54 59 5f 43 6c  rty(pDecl, TY_Cl
c330: 61 73 73 29 3b 0a 20 20 7d 0a 20 20 53 74 72 69  ass);.  }.  Stri
c340: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
c350: 69 66 28 20 70 44 65 63 6c 2d 3e 7a 45 78 74 72  if( pDecl->zExtr
c360: 61 20 29 7b 0a 20 20 20 20 53 74 72 69 6e 67 41  a ){.    StringA
c370: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 65 63  ppend(&str, pDec
c380: 6c 2d 3e 7a 45 78 74 72 61 2c 20 30 29 3b 0a 20  l->zExtra, 0);. 
c390: 20 20 20 53 61 66 65 46 72 65 65 28 70 44 65 63     SafeFree(pDec
c3a0: 6c 2d 3e 7a 45 78 74 72 61 29 3b 0a 20 20 20 20  l->zExtra);.    
c3b0: 70 44 65 63 6c 2d 3e 7a 45 78 74 72 61 20 3d 20  pDecl->zExtra = 
c3c0: 30 3b 0a 20 20 7d 0a 20 20 74 79 70 65 20 3d 20  0;.  }.  type = 
c3d0: 66 6c 61 67 73 20 26 20 50 53 5f 50 50 50 3b 0a  flags & PS_PPP;.
c3e0: 20 20 69 66 28 20 70 44 65 63 6c 2d 3e 65 78 74    if( pDecl->ext
c3f0: 72 61 54 79 70 65 21 3d 74 79 70 65 20 29 7b 0a  raType!=type ){.
c400: 20 20 20 20 69 66 28 20 74 79 70 65 20 26 20 50      if( type & P
c410: 53 5f 50 75 62 6c 69 63 20 29 7b 0a 20 20 20 20  S_Public ){.    
c420: 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26    StringAppend(&
c430: 73 74 72 2c 20 22 70 75 62 6c 69 63 3a 5c 6e 22  str, "public:\n"
c440: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 44 65 63  , 0);.      pDec
c450: 6c 2d 3e 65 78 74 72 61 54 79 70 65 20 3d 20 50  l->extraType = P
c460: 53 5f 50 75 62 6c 69 63 3b 0a 20 20 20 20 7d 65  S_Public;.    }e
c470: 6c 73 65 20 69 66 28 20 74 79 70 65 20 26 20 50  lse if( type & P
c480: 53 5f 50 72 6f 74 65 63 74 65 64 20 29 7b 0a 20  S_Protected ){. 
c490: 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e       StringAppen
c4a0: 64 28 26 73 74 72 2c 20 22 70 72 6f 74 65 63 74  d(&str, "protect
c4b0: 65 64 3a 5c 6e 22 2c 20 30 29 3b 0a 20 20 20 20  ed:\n", 0);.    
c4c0: 20 20 70 44 65 63 6c 2d 3e 65 78 74 72 61 54 79    pDecl->extraTy
c4d0: 70 65 20 3d 20 50 53 5f 50 72 6f 74 65 63 74 65  pe = PS_Protecte
c4e0: 64 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  d;.    }else if(
c4f0: 20 74 79 70 65 20 26 20 50 53 5f 50 72 69 76 61   type & PS_Priva
c500: 74 65 20 29 7b 0a 20 20 20 20 20 20 53 74 72 69  te ){.      Stri
c510: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22  ngAppend(&str, "
c520: 70 72 69 76 61 74 65 3a 5c 6e 22 2c 20 30 29 3b  private:\n", 0);
c530: 0a 20 20 20 20 20 20 70 44 65 63 6c 2d 3e 65 78  .      pDecl->ex
c540: 74 72 61 54 79 70 65 20 3d 20 50 53 5f 50 72 69  traType = PS_Pri
c550: 76 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  vate;.    }.  }.
c560: 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26    StringAppend(&
c570: 73 74 72 2c 20 22 20 20 22 2c 20 30 29 3b 0a 20  str, "  ", 0);. 
c580: 20 7a 44 65 63 6c 20 3d 20 54 6f 6b 65 6e 73 54   zDecl = TokensT
c590: 6f 53 74 72 69 6e 67 28 70 46 69 72 73 74 2c 20  oString(pFirst, 
c5a0: 70 4c 61 73 74 2c 20 22 3b 5c 6e 22 2c 20 70 43  pLast, ";\n", pC
c5b0: 6c 61 73 73 2c 20 32 29 3b 0a 20 20 53 74 72 69  lass, 2);.  Stri
c5c0: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 7a  ngAppend(&str, z
c5d0: 44 65 63 6c 2c 20 30 29 3b 0a 20 20 53 61 66 65  Decl, 0);.  Safe
c5e0: 46 72 65 65 28 7a 44 65 63 6c 29 3b 0a 20 20 70  Free(zDecl);.  p
c5f0: 44 65 63 6c 2d 3e 7a 45 78 74 72 61 20 3d 20 53  Decl->zExtra = S
c600: 74 72 44 75 70 28 53 74 72 69 6e 67 47 65 74 28  trDup(StringGet(
c610: 26 73 74 72 29 2c 20 30 29 3b 0a 20 20 53 74 72  &str), 0);.  Str
c620: 69 6e 67 52 65 73 65 74 28 26 73 74 72 29 3b 0a  ingReset(&str);.
c630: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c640: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c650: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
c660: 20 77 65 20 73 65 65 20 61 20 66 75 6e 63 74 69   we see a functi
c670: 6f 6e 20 6f 72 20 70 72 6f 63 65 64 75 72 65 20  on or procedure 
c680: 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2a 20 57  definition..** W
c690: 65 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  e make an entry 
c6a0: 69 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  in the declarati
c6b0: 6f 6e 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  on table that is
c6c0: 20 61 20 70 72 6f 74 6f 74 79 70 65 20 66 6f 72   a prototype for
c6d0: 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
c6e0: 6e 20 6f 72 20 70 72 6f 63 65 64 75 72 65 2e 0a  n or procedure..
c6f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 50 72  */.static int Pr
c700: 6f 63 65 73 73 50 72 6f 63 65 64 75 72 65 44 65  ocessProcedureDe
c710: 66 28 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c  f(Token *pFirst,
c720: 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 2c 20 69   Token *pLast, i
c730: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 54 6f 6b  nt flags){.  Tok
c740: 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 44 65 63  en *pName;.  Dec
c750: 6c 20 2a 70 44 65 63 6c 3b 0a 20 20 54 6f 6b 65  l *pDecl;.  Toke
c760: 6e 20 2a 70 43 6f 64 65 3b 0a 0a 20 20 69 66 28  n *pCode;..  if(
c770: 20 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 70 4c   pFirst==0 || pL
c780: 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ast==0 ){.    re
c790: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
c7a0: 28 20 66 6c 61 67 73 20 26 20 50 53 5f 4d 65 74  ( flags & PS_Met
c7b0: 68 6f 64 20 29 7b 0a 20 20 20 20 69 66 28 20 66  hod ){.    if( f
c7c0: 6c 61 67 73 20 26 20 50 53 5f 50 50 50 20 29 7b  lags & PS_PPP ){
c7d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 50 72  .      return Pr
c7e0: 6f 63 65 73 73 4d 65 74 68 6f 64 44 65 66 28 70  ocessMethodDef(p
c7f0: 46 69 72 73 74 2c 20 70 4c 61 73 74 2c 20 66 6c  First, pLast, fl
c800: 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ags);.    }else{
c810: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
c820: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c830: 20 28 66 6c 61 67 73 20 26 20 50 53 5f 53 74 61   (flags & PS_Sta
c840: 74 69 63 29 21 3d 30 20 26 26 20 21 70 72 6f 74  tic)!=0 && !prot
c850: 6f 5f 73 74 61 74 69 63 20 29 7b 0a 20 20 20 20  o_static ){.    
c860: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c870: 70 43 6f 64 65 20 3d 20 70 4c 61 73 74 3b 0a 20  pCode = pLast;. 
c880: 20 77 68 69 6c 65 28 20 70 4c 61 73 74 20 26 26   while( pLast &&
c890: 20 70 4c 61 73 74 21 3d 70 46 69 72 73 74 20 26   pLast!=pFirst &
c8a0: 26 20 70 4c 61 73 74 2d 3e 7a 54 65 78 74 5b 30  & pLast->zText[0
c8b0: 5d 21 3d 27 29 27 20 29 7b 0a 20 20 20 20 70 4c  ]!=')' ){.    pL
c8c0: 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70 50 72  ast = pLast->pPr
c8d0: 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ev;.  }.  if( pL
c8e0: 61 73 74 3d 3d 30 20 7c 7c 20 70 4c 61 73 74 3d  ast==0 || pLast=
c8f0: 3d 70 46 69 72 73 74 20 7c 7c 20 70 46 69 72 73  =pFirst || pFirs
c900: 74 2d 3e 70 4e 65 78 74 3d 3d 70 4c 61 73 74 20  t->pNext==pLast 
c910: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
c920: 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 55 6e  tderr,"%s:%d: Un
c930: 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 6e 74 61  recognized synta
c940: 78 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 46 69  x.\n",.      zFi
c950: 6c 65 6e 61 6d 65 2c 20 70 46 69 72 73 74 2d 3e  lename, pFirst->
c960: 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 72 65 74 75  nLine);.    retu
c970: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
c980: 66 6c 61 67 73 20 26 20 28 50 53 5f 49 6e 74 65  flags & (PS_Inte
c990: 72 66 61 63 65 7c 50 53 5f 45 78 70 6f 72 74 7c  rface|PS_Export|
c9a0: 50 53 5f 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20  PS_Local) ){.   
c9b0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
c9c0: 22 25 73 3a 25 64 3a 20 4d 69 73 73 69 6e 67 20  "%s:%d: Missing 
c9d0: 5c 22 69 6e 6c 69 6e 65 5c 22 20 6f 6e 20 66 75  \"inline\" on fu
c9e0: 6e 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 64  nction or proced
c9f0: 75 72 65 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a  ure.\n",.      z
ca00: 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 72 73 74  Filename, pFirst
ca10: 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 72 65  ->nLine);.    re
ca20: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 4e  turn 1;.  }.  pN
ca30: 61 6d 65 20 3d 20 46 69 6e 64 44 65 63 6c 4e 61  ame = FindDeclNa
ca40: 6d 65 28 70 46 69 72 73 74 2c 70 4c 61 73 74 29  me(pFirst,pLast)
ca50: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30  ;.  if( pName==0
ca60: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
ca70: 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 4d  stderr,"%s:%d: M
ca80: 61 6c 66 6f 72 6d 65 64 20 66 75 6e 63 74 69 6f  alformed functio
ca90: 6e 20 6f 72 20 70 72 6f 63 65 64 75 72 65 20 64  n or procedure d
caa0: 65 66 69 6e 69 74 69 6f 6e 2e 5c 6e 22 2c 0a 20  efinition.\n",. 
cab0: 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20       zFilename, 
cac0: 70 46 69 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a  pFirst->nLine);.
cad0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
cae0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 74 20  }..  /*.  ** At 
caf0: 74 68 69 73 20 70 6f 69 6e 74 20 77 65 27 76 65  this point we've
cb00: 20 69 73 6f 6c 61 74 65 64 20 61 20 70 72 6f 63   isolated a proc
cb10: 65 64 75 72 65 20 64 65 63 6c 61 72 61 74 69 6f  edure declaratio
cb20: 6e 20 62 65 74 77 65 65 6e 20 70 46 69 72 73 74  n between pFirst
cb30: 0a 20 20 2a 2a 20 61 6e 64 20 70 4c 61 73 74 20  .  ** and pLast 
cb40: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 70 4e  with the name pN
cb50: 61 6d 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ame..  */.#ifdef
cb60: 20 44 45 42 55 47 0a 20 20 69 66 28 20 64 65 62   DEBUG.  if( deb
cb70: 75 67 4d 61 73 6b 20 26 20 50 41 52 53 45 52 20  ugMask & PARSER 
cb80: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2a  ){.    printf("*
cb90: 2a 2a 2a 20 46 6f 75 6e 64 20 72 6f 75 74 69 6e  *** Found routin
cba0: 65 3a 20 25 2e 2a 73 20 6f 6e 20 6c 69 6e 65 20  e: %.*s on line 
cbb0: 25 64 2e 2e 2e 5c 6e 22 2c 20 70 4e 61 6d 65 2d  %d...\n", pName-
cbc0: 3e 6e 54 65 78 74 2c 0a 20 20 20 20 20 20 20 70  >nText,.       p
cbd0: 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 20 70 46 69  Name->zText, pFi
cbe0: 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20  rst->nLine);.   
cbf0: 20 50 72 69 6e 74 54 6f 6b 65 6e 73 28 70 46 69   PrintTokens(pFi
cc00: 72 73 74 2c 70 4c 61 73 74 29 3b 0a 20 20 20 20  rst,pLast);.    
cc10: 70 72 69 6e 74 66 28 22 3b 5c 6e 22 29 3b 0a 20  printf(";\n");. 
cc20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 44 65 63   }.#endif.  pDec
cc30: 6c 20 3d 20 43 72 65 61 74 65 44 65 63 6c 28 70  l = CreateDecl(p
cc40: 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 70 4e 61 6d  Name->zText,pNam
cc50: 65 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 70 44 65  e->nText);.  pDe
cc60: 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20 3d 20 70  cl->pComment = p
cc70: 46 69 72 73 74 2d 3e 70 43 6f 6d 6d 65 6e 74 3b  First->pComment;
cc80: 0a 20 20 69 66 28 20 70 43 6f 64 65 20 26 26 20  .  if( pCode && 
cc90: 70 43 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 54 54  pCode->eType==TT
cca0: 5f 42 72 61 63 65 73 20 29 7b 0a 20 20 20 20 70  _Braces ){.    p
ccb0: 44 65 63 6c 2d 3e 74 6f 6b 65 6e 43 6f 64 65 20  Decl->tokenCode 
ccc0: 3d 20 2a 70 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  = *pCode;.  }.  
ccd0: 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28  DeclSetProperty(
cce0: 70 44 65 63 6c 2c 54 59 5f 53 75 62 72 6f 75 74  pDecl,TY_Subrout
ccf0: 69 6e 65 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a  ine);.  pDecl->z
cd00: 44 65 63 6c 20 3d 20 54 6f 6b 65 6e 73 54 6f 53  Decl = TokensToS
cd10: 74 72 69 6e 67 28 70 46 69 72 73 74 2c 70 4c 61  tring(pFirst,pLa
cd20: 73 74 2c 22 3b 5c 6e 22 2c 30 2c 30 29 3b 0a 20  st,";\n",0,0);. 
cd30: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 50   if( (flags & (P
cd40: 53 5f 53 74 61 74 69 63 7c 50 53 5f 4c 6f 63 61  S_Static|PS_Loca
cd50: 6c 32 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 44  l2))!=0 ){.    D
cd60: 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70  eclSetProperty(p
cd70: 44 65 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29 3b 0a  Decl,DP_Local);.
cd80: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
cd90: 67 73 20 26 20 28 50 53 5f 45 78 70 6f 72 74 32  gs & (PS_Export2
cda0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 44 65 63  ))!=0 ){.    Dec
cdb0: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65  lSetProperty(pDe
cdc0: 63 6c 2c 44 50 5f 45 78 70 6f 72 74 29 3b 0a 20  cl,DP_Export);. 
cdd0: 20 7d 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20   }..  if( flags 
cde0: 26 20 44 50 5f 43 70 6c 75 73 70 6c 75 73 20 29  & DP_Cplusplus )
cdf0: 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f  {.    DeclSetPro
ce00: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 43  perty(pDecl,DP_C
ce10: 70 6c 75 73 70 6c 75 73 29 3b 0a 20 20 7d 65 6c  plusplus);.  }el
ce20: 73 65 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50  se{.    DeclSetP
ce30: 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50  roperty(pDecl,DP
ce40: 5f 45 78 74 65 72 6e 43 52 65 71 64 29 3b 0a 20  _ExternCReqd);. 
ce50: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
ce60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ce70: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
ce80: 77 68 65 6e 65 76 65 72 20 77 65 20 73 65 65 20  whenever we see 
ce90: 74 68 65 20 22 69 6e 6c 69 6e 65 22 20 6b 65 79  the "inline" key
cea0: 77 6f 72 64 2e 20 20 57 65 0a 2a 2a 20 6e 65 65  word.  We.** nee
ceb0: 64 20 74 6f 20 73 65 65 6b 2d 6f 75 74 20 74 68  d to seek-out th
cec0: 65 20 69 6e 6c 69 6e 65 20 66 75 6e 63 74 69 6f  e inline functio
ced0: 6e 20 6f 72 20 70 72 6f 63 65 64 75 72 65 20 61  n or procedure a
cee0: 6e 64 20 6d 61 6b 65 20 61 0a 2a 2a 20 64 65 63  nd make a.** dec
cef0: 6c 61 72 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20  laration out of 
cf00: 74 68 65 20 65 6e 74 69 72 65 20 64 65 66 69 6e  the entire defin
cf10: 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
cf20: 20 69 6e 74 20 50 72 6f 63 65 73 73 49 6e 6c 69   int ProcessInli
cf30: 6e 65 50 72 6f 63 28 54 6f 6b 65 6e 20 2a 70 46  neProc(Token *pF
cf40: 69 72 73 74 2c 20 69 6e 74 20 66 6c 61 67 73 2c  irst, int flags,
cf50: 20 69 6e 74 20 2a 70 52 65 73 65 74 29 7b 0a 20   int *pReset){. 
cf60: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20   Token *pName;. 
cf70: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 3b 0a 20 20   Token *pEnd;.  
cf80: 44 65 63 6c 20 2a 70 44 65 63 6c 3b 0a 0a 20 20  Decl *pDecl;..  
cf90: 66 6f 72 28 70 45 6e 64 3d 70 46 69 72 73 74 3b  for(pEnd=pFirst;
cfa0: 20 70 45 6e 64 3b 20 70 45 6e 64 20 3d 20 70 45   pEnd; pEnd = pE
cfb0: 6e 64 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  nd->pNext){.    
cfc0: 69 66 28 20 70 45 6e 64 2d 3e 7a 54 65 78 74 5b  if( pEnd->zText[
cfd0: 30 5d 3d 3d 27 7b 27 20 7c 7c 20 70 45 6e 64 2d  0]=='{' || pEnd-
cfe0: 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 3b 27 20 29  >zText[0]==';' )
cff0: 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 65 74 20  {.      *pReset 
d000: 3d 20 70 45 6e 64 2d 3e 7a 54 65 78 74 5b 30 5d  = pEnd->zText[0]
d010: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d020: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
d030: 45 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  End==0 ){.    *p
d040: 52 65 73 65 74 20 3d 20 27 3b 27 3b 0a 20 20 20  Reset = ';';.   
d050: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
d060: 22 25 73 3a 25 64 3a 20 69 6e 63 6f 6d 70 6c 65  "%s:%d: incomple
d070: 74 65 20 69 6e 6c 69 6e 65 20 70 72 6f 63 65 64  te inline proced
d080: 75 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 5c 6e  ure definition\n
d090: 22 2c 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  ",.      zFilena
d0a0: 6d 65 2c 20 70 46 69 72 73 74 2d 3e 6e 4c 69 6e  me, pFirst->nLin
d0b0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
d0c0: 3b 0a 20 20 7d 0a 20 20 70 4e 61 6d 65 20 3d 20  ;.  }.  pName = 
d0d0: 46 69 6e 64 44 65 63 6c 4e 61 6d 65 28 70 46 69  FindDeclName(pFi
d0e0: 72 73 74 2c 70 45 6e 64 29 3b 0a 20 20 69 66 28  rst,pEnd);.  if(
d0f0: 20 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   pName==0 ){.   
d100: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
d110: 22 25 73 3a 25 64 3a 20 6d 61 6c 66 6f 72 6d 65  "%s:%d: malforme
d120: 64 20 69 6e 6c 69 6e 65 20 70 72 6f 63 65 64 75  d inline procedu
d130: 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 5c 6e 22  re definition\n"
d140: 2c 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  ,.      zFilenam
d150: 65 2c 20 70 46 69 72 73 74 2d 3e 6e 4c 69 6e 65  e, pFirst->nLine
d160: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
d170: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 44 45 42  .  }..#ifdef DEB
d180: 55 47 0a 20 20 69 66 28 20 64 65 62 75 67 4d 61  UG.  if( debugMa
d190: 73 6b 20 26 20 50 41 52 53 45 52 20 29 7b 0a 20  sk & PARSER ){. 
d1a0: 20 20 20 70 72 69 6e 74 66 28 22 2a 2a 2a 2a 20     printf("**** 
d1b0: 46 6f 75 6e 64 20 69 6e 6c 69 6e 65 20 72 6f 75  Found inline rou
d1c0: 74 69 6e 65 3a 20 25 2e 2a 73 20 6f 6e 20 6c 69  tine: %.*s on li
d1d0: 6e 65 20 25 64 2e 2e 2e 5c 6e 22 2c 0a 20 20 20  ne %d...\n",.   
d1e0: 20 20 20 20 70 4e 61 6d 65 2d 3e 6e 54 65 78 74      pName->nText
d1f0: 2c 20 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 20  , pName->zText, 
d200: 70 46 69 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a  pFirst->nLine);.
d210: 20 20 20 20 50 72 69 6e 74 54 6f 6b 65 6e 73 28      PrintTokens(
d220: 70 46 69 72 73 74 2c 70 45 6e 64 29 3b 0a 20 20  pFirst,pEnd);.  
d230: 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a    printf("\n");.
d240: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 44 65    }.#endif.  pDe
d250: 63 6c 20 3d 20 43 72 65 61 74 65 44 65 63 6c 28  cl = CreateDecl(
d260: 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 70 4e 61  pName->zText,pNa
d270: 6d 65 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 70 44  me->nText);.  pD
d280: 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20 3d 20  ecl->pComment = 
d290: 70 46 69 72 73 74 2d 3e 70 43 6f 6d 6d 65 6e 74  pFirst->pComment
d2a0: 3b 0a 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65  ;.  DeclSetPrope
d2b0: 72 74 79 28 70 44 65 63 6c 2c 54 59 5f 53 75 62  rty(pDecl,TY_Sub
d2c0: 72 6f 75 74 69 6e 65 29 3b 0a 20 20 70 44 65 63  routine);.  pDec
d2d0: 6c 2d 3e 7a 44 65 63 6c 20 3d 20 54 6f 6b 65 6e  l->zDecl = Token
d2e0: 73 54 6f 53 74 72 69 6e 67 28 70 46 69 72 73 74  sToString(pFirst
d2f0: 2c 70 45 6e 64 2c 22 3b 5c 6e 22 2c 30 2c 30 29  ,pEnd,";\n",0,0)
d300: 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20 26  ;.  if( (flags &
d310: 20 28 50 53 5f 53 74 61 74 69 63 7c 50 53 5f 4c   (PS_Static|PS_L
d320: 6f 63 61 6c 7c 50 53 5f 4c 6f 63 61 6c 32 29 29  ocal|PS_Local2))
d330: 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50   ){.    DeclSetP
d340: 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50  roperty(pDecl,DP
d350: 5f 4c 6f 63 61 6c 29 3b 0a 20 20 7d 65 6c 73 65  _Local);.  }else
d360: 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 50 53   if( flags & (PS
d370: 5f 45 78 70 6f 72 74 7c 50 53 5f 45 78 70 6f 72  _Export|PS_Expor
d380: 74 32 29 20 29 7b 0a 20 20 20 20 44 65 63 6c 53  t2) ){.    DeclS
d390: 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c  etProperty(pDecl
d3a0: 2c 44 50 5f 45 78 70 6f 72 74 29 3b 0a 20 20 7d  ,DP_Export);.  }
d3b0: 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ..  if( flags & 
d3c0: 44 50 5f 43 70 6c 75 73 70 6c 75 73 20 29 7b 0a  DP_Cplusplus ){.
d3d0: 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65      DeclSetPrope
d3e0: 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 43 70 6c  rty(pDecl,DP_Cpl
d3f0: 75 73 70 6c 75 73 29 3b 0a 20 20 7d 65 6c 73 65  usplus);.  }else
d400: 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f  {.    DeclSetPro
d410: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45  perty(pDecl,DP_E
d420: 78 74 65 72 6e 43 52 65 71 64 29 3b 0a 20 20 7d  xternCReqd);.  }
d430: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
d440: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
d450: 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 73 20 62   if the tokens b
d460: 65 74 77 65 65 6e 20 70 46 69 72 73 74 20 61 6e  etween pFirst an
d470: 64 20 70 45 6e 64 20 66 6f 72 6d 20 61 20 76 61  d pEnd form a va
d480: 72 69 61 62 6c 65 0a 2a 2a 20 64 65 66 69 6e 69  riable.** defini
d490: 74 69 6f 6e 20 6f 72 20 61 20 66 75 6e 63 74 69  tion or a functi
d4a0: 6f 6e 20 70 72 6f 74 6f 74 79 70 65 2e 20 20 52  on prototype.  R
d4b0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 77 65  eturn TRUE if we
d4c0: 20 61 72 65 20 64 65 61 6c 69 6e 67 0a 2a 2a 20   are dealing.** 
d4d0: 77 69 74 68 20 61 20 76 61 72 69 61 62 6c 65 20  with a variable 
d4e0: 64 65 66 69 6e 74 69 6f 6e 20 61 6e 64 20 46 41  defintion and FA
d4f0: 4c 53 45 20 66 6f 72 20 61 20 70 72 6f 74 6f 74  LSE for a protot
d500: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 70 45 6e 64 20  ype..**.** pEnd 
d510: 69 73 20 74 68 65 20 74 6f 6b 65 6e 20 74 68 61  is the token tha
d520: 74 20 65 6e 64 73 20 74 68 65 20 6f 62 6a 65 63  t ends the objec
d530: 74 2e 20 20 49 74 20 63 61 6e 20 62 65 20 65 69  t.  It can be ei
d540: 74 68 65 72 20 61 20 27 3b 27 20 6f 72 0a 2a 2a  ther a ';' or.**
d550: 20 61 20 27 3d 27 2e 20 20 49 66 20 69 74 20 69   a '='.  If it i
d560: 73 20 27 3d 27 2c 20 74 68 65 6e 20 61 73 73 75  s '=', then assu
d570: 6d 65 20 77 65 20 68 61 76 65 20 61 20 76 61 72  me we have a var
d580: 69 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  iable definition
d590: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 6e 64 20  ..**.** If pEnd 
d5a0: 69 73 20 27 3b 27 2c 20 74 68 65 6e 20 74 68 65  is ';', then the
d5b0: 20 64 65 74 65 72 6d 69 6e 61 74 69 6f 6e 20 69   determination i
d5c0: 73 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74  s more difficult
d5d0: 2e 20 20 57 65 20 68 61 76 65 0a 2a 2a 20 74 6f  .  We have.** to
d5e0: 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 6f   search for an o
d5f0: 63 63 75 72 72 65 6e 63 65 20 6f 66 20 61 6e 20  ccurrence of an 
d600: 49 44 20 66 6f 6c 6c 6f 77 65 64 20 69 6d 6d 65  ID followed imme
d610: 64 69 61 74 65 6c 79 20 62 79 20 27 28 27 2e 0a  diately by '('..
d620: 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 77 65 20  ** If found, we 
d630: 68 61 76 65 20 61 20 70 72 6f 74 6f 74 79 70 65  have a prototype
d640: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 77 65 20  .  Otherwise we 
d650: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
d660: 20 61 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 64   a.** variable d
d670: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  efinition..*/.st
d680: 61 74 69 63 20 69 6e 74 20 69 73 56 61 72 69 61  atic int isVaria
d690: 62 6c 65 44 65 66 28 54 6f 6b 65 6e 20 2a 70 46  bleDef(Token *pF
d6a0: 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e  irst, Token *pEn
d6b0: 64 29 7b 0a 20 20 69 66 28 20 70 45 6e 64 20 26  d){.  if( pEnd &
d6c0: 26 20 70 45 6e 64 2d 3e 7a 54 65 78 74 5b 30 5d  & pEnd->zText[0]
d6d0: 3d 3d 27 3d 27 20 26 26 0a 20 20 20 20 28 70 45  =='=' &&.    (pE
d6e0: 6e 64 2d 3e 70 50 72 65 76 2d 3e 6e 54 65 78 74  nd->pPrev->nText
d6f0: 21 3d 38 20 7c 7c 20 73 74 72 6e 63 6d 70 28 70  !=8 || strncmp(p
d700: 45 6e 64 2d 3e 70 50 72 65 76 2d 3e 7a 54 65 78  End->pPrev->zTex
d710: 74 2c 22 6f 70 65 72 61 74 6f 72 22 2c 38 29 21  t,"operator",8)!
d720: 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  =0).  ){.    ret
d730: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 77 68 69  urn 1;.  }.  whi
d740: 6c 65 28 20 70 46 69 72 73 74 20 26 26 20 70 46  le( pFirst && pF
d750: 69 72 73 74 21 3d 70 45 6e 64 20 26 26 20 70 46  irst!=pEnd && pF
d760: 69 72 73 74 2d 3e 70 4e 65 78 74 20 26 26 20 70  irst->pNext && p
d770: 46 69 72 73 74 2d 3e 70 4e 65 78 74 21 3d 70 45  First->pNext!=pE
d780: 6e 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  nd ){.    if( pF
d790: 69 72 73 74 2d 3e 65 54 79 70 65 3d 3d 54 54 5f  irst->eType==TT_
d7a0: 49 64 20 26 26 20 70 46 69 72 73 74 2d 3e 70 4e  Id && pFirst->pN
d7b0: 65 78 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27  ext->zText[0]=='
d7c0: 28 27 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  (' ){.      retu
d7d0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
d7e0: 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
d7f0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  >pNext;.  }.  re
d800: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 1;.}.../*.*
d810: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
d820: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
d830: 72 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61  r we encounter a
d840: 20 22 3b 22 20 6f 72 20 22 3d 22 2e 20 20 54 68   ";" or "=".  Th
d850: 65 20 73 74 75 66 66 0a 2a 2a 20 62 65 74 77 65  e stuff.** betwe
d860: 65 6e 20 70 46 69 72 73 74 20 61 6e 64 20 70 4c  en pFirst and pL
d870: 61 73 74 20 63 6f 6e 73 74 69 74 75 74 65 73 20  ast constitutes 
d880: 65 69 74 68 65 72 20 61 20 74 79 70 65 64 65 66  either a typedef
d890: 20 6f 72 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20   or a global.** 
d8a0: 76 61 72 69 61 62 6c 65 20 64 65 66 69 6e 69 74  variable definit
d8b0: 69 6f 6e 2e 20 20 44 6f 20 74 68 65 20 72 69 67  ion.  Do the rig
d8c0: 68 74 20 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61  ht thing..*/.sta
d8d0: 74 69 63 20 69 6e 74 20 50 72 6f 63 65 73 73 44  tic int ProcessD
d8e0: 65 63 6c 28 54 6f 6b 65 6e 20 2a 70 46 69 72 73  ecl(Token *pFirs
d8f0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  t, Token *pEnd, 
d900: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 54 6f  int flags){.  To
d910: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 44 65  ken *pName;.  De
d920: 63 6c 20 2a 70 44 65 63 6c 3b 0a 20 20 69 6e 74  cl *pDecl;.  int
d930: 20 69 73 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20   isLocal = 0;.  
d940: 69 6e 74 20 69 73 56 61 72 3b 0a 20 20 69 6e 74  int isVar;.  int
d950: 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66   nErr = 0;..  if
d960: 28 20 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 70  ( pFirst==0 || p
d970: 45 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  End==0 ){.    re
d980: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
d990: 28 20 66 6c 61 67 73 20 26 20 50 53 5f 54 79 70  ( flags & PS_Typ
d9a0: 65 64 65 66 20 29 7b 0a 20 20 20 20 69 66 28 20  edef ){.    if( 
d9b0: 28 66 6c 61 67 73 20 26 20 28 50 53 5f 45 78 70  (flags & (PS_Exp
d9c0: 6f 72 74 32 7c 50 53 5f 4c 6f 63 61 6c 32 29 29  ort2|PS_Local2))
d9d0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  !=0 ){.      fpr
d9e0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
d9f0: 25 64 3a 20 5c 22 45 58 50 4f 52 54 5c 22 20 6f  %d: \"EXPORT\" o
da00: 72 20 5c 22 4c 4f 43 41 4c 5c 22 20 69 67 6e 6f  r \"LOCAL\" igno
da10: 72 65 64 20 62 65 66 6f 72 65 20 74 79 70 65 64  red before typed
da20: 65 66 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ef.\n",.        
da30: 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 72 73  zFilename, pFirs
da40: 74 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20  t->nLine);.     
da50: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nErr++;.    }. 
da60: 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
da70: 28 50 53 5f 49 6e 74 65 72 66 61 63 65 7c 50 53  (PS_Interface|PS
da80: 5f 45 78 70 6f 72 74 7c 50 53 5f 4c 6f 63 61 6c  _Export|PS_Local
da90: 7c 44 50 5f 43 70 6c 75 73 70 6c 75 73 29 29 3d  |DP_Cplusplus))=
daa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
dab0: 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
dac0: 64 75 70 6c 69 63 61 74 65 20 61 20 74 79 70 65  duplicate a type
dad0: 64 65 66 20 69 6e 20 43 20 28 62 75 74 20 4f 4b  def in C (but OK
dae0: 20 69 6e 20 43 2b 2b 29 2e 0a 20 20 20 20 20 20   in C++)..      
daf0: 2a 2a 20 53 6f 20 64 6f 6e 27 74 20 72 65 63 6f  ** So don't reco
db00: 72 64 20 74 79 70 65 64 65 66 73 20 74 68 61 74  rd typedefs that
db10: 20 61 72 65 6e 27 74 20 77 69 74 68 69 6e 20 61   aren't within a
db20: 20 43 2b 2b 20 66 69 6c 65 20 6f 72 0a 20 20 20   C++ file or.   
db30: 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 23 69 66     ** within #if
db40: 20 49 4e 54 45 52 46 41 43 45 2e 2e 23 65 6e 64   INTERFACE..#end
db50: 69 66 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  if */.      retu
db60: 72 6e 20 6e 45 72 72 3b 0a 20 20 20 20 7d 0a 20  rn nErr;.    }. 
db70: 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
db80: 28 50 53 5f 49 6e 74 65 72 66 61 63 65 7c 50 53  (PS_Interface|PS
db90: 5f 45 78 70 6f 72 74 7c 50 53 5f 4c 6f 63 61 6c  _Export|PS_Local
dba0: 29 29 3d 3d 30 20 26 26 20 70 72 6f 74 6f 5f 73  ))==0 && proto_s
dbb0: 74 61 74 69 63 3d 3d 30 20 29 7b 0a 20 20 20 20  tatic==0 ){.    
dbc0: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 79 70 65    /* Ignore type
dbd0: 64 65 66 73 20 74 68 61 74 20 61 72 65 20 6e 6f  defs that are no
dbe0: 74 20 77 69 74 68 20 22 23 69 66 20 49 4e 54 45  t with "#if INTE
dbf0: 52 46 41 43 45 2e 2e 23 65 6e 64 69 66 22 20 75  RFACE..#endif" u
dc00: 6e 6c 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 74  nless.      ** t
dc10: 68 65 20 22 2d 6c 6f 63 61 6c 22 20 63 6f 6d 6d  he "-local" comm
dc20: 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and line option 
dc30: 69 73 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20  is used. */.    
dc40: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20    return nErr;. 
dc50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
dc60: 61 67 73 20 26 20 28 50 53 5f 49 6e 74 65 72 66  ags & (PS_Interf
dc70: 61 63 65 7c 50 53 5f 45 78 70 6f 72 74 29 29 3d  ace|PS_Export))=
dc80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74  =0 ){.      /* t
dc90: 79 70 65 64 65 66 73 20 61 72 65 20 61 6c 77 61  ypedefs are alwa
dca0: 79 73 20 6c 6f 63 61 6c 2c 20 75 6e 6c 65 73 73  ys local, unless
dcb0: 20 77 69 74 68 69 6e 20 23 69 66 20 49 4e 54 45   within #if INTE
dcc0: 52 46 41 43 45 2e 2e 23 65 6e 64 69 66 20 2a 2f  RFACE..#endif */
dcd0: 0a 20 20 20 20 20 20 69 73 4c 6f 63 61 6c 20 3d  .      isLocal =
dce0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
dcf0: 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 50  e if( flags & (P
dd00: 53 5f 53 74 61 74 69 63 7c 50 53 5f 4c 6f 63 61  S_Static|PS_Loca
dd10: 6c 32 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  l2) ){.    if( p
dd20: 72 6f 74 6f 5f 73 74 61 74 69 63 3d 3d 30 20 26  roto_static==0 &
dd30: 26 20 28 66 6c 61 67 73 20 26 20 50 53 5f 4c 6f  & (flags & PS_Lo
dd40: 63 61 6c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  cal2)==0 ){.    
dd50: 20 20 2f 2a 20 44 6f 6e 27 74 20 72 65 63 6f 72    /* Don't recor
dd60: 64 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c  d static variabl
dd70: 65 73 20 75 6e 6c 65 73 73 20 74 68 65 20 22 2d  es unless the "-
dd80: 6c 6f 63 61 6c 22 20 63 6f 6d 6d 61 6e 64 20 6c  local" command l
dd90: 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 6f 70 74  ine.      ** opt
dda0: 69 6f 6e 20 77 61 73 20 73 70 65 63 69 66 69 65  ion was specifie
ddb0: 64 20 6f 72 20 74 68 65 20 22 4c 4f 43 41 4c 22  d or the "LOCAL"
ddc0: 20 6b 65 79 77 6f 72 64 20 69 73 20 75 73 65 64   keyword is used
ddd0: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
dde0: 6e 20 6e 45 72 72 3b 0a 20 20 20 20 7d 0a 20 20  n nErr;.    }.  
ddf0: 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 21    while( pFirst!
de00: 3d 30 20 26 26 20 70 46 69 72 73 74 2d 3e 70 4e  =0 && pFirst->pN
de10: 65 78 74 21 3d 70 45 6e 64 20 26 26 0a 20 20 20  ext!=pEnd &&.   
de20: 20 20 20 20 28 28 70 46 69 72 73 74 2d 3e 6e 54      ((pFirst->nT
de30: 65 78 74 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d  ext==6 && strncm
de40: 70 28 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c  p(pFirst->zText,
de50: 22 73 74 61 74 69 63 22 2c 36 29 3d 3d 30 29 0a  "static",6)==0).
de60: 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46 69 72          || (pFir
de70: 73 74 2d 3e 6e 54 65 78 74 3d 3d 35 20 26 26 20  st->nText==5 && 
de80: 73 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e  strncmp(pFirst->
de90: 7a 54 65 78 74 2c 22 4c 4f 43 41 4c 22 2c 36 29  zText,"LOCAL",6)
dea0: 3d 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ==0)).    ){.   
deb0: 20 20 20 2f 2a 20 4c 6f 73 65 20 74 68 65 20 69     /* Lose the i
dec0: 6e 69 74 69 61 6c 20 22 73 74 61 74 69 63 22 20  nitial "static" 
ded0: 6f 72 20 6c 6f 63 61 6c 20 66 72 6f 6d 20 6c 6f  or local from lo
dee0: 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2e 0a 20  cal variables.. 
def0: 20 20 20 20 20 2a 2a 20 57 65 27 6c 6c 20 70 72       ** We'll pr
df00: 65 70 65 6e 64 20 22 65 78 74 65 72 6e 22 20 6c  epend "extern" l
df10: 61 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ater. */.      p
df20: 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
df30: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 73 4c  pNext;.      isL
df40: 6f 63 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ocal = 1;.    }.
df50: 20 20 20 20 69 66 28 20 70 46 69 72 73 74 3d 3d      if( pFirst==
df60: 30 20 7c 7c 20 21 69 73 4c 6f 63 61 6c 20 29 7b  0 || !isLocal ){
df70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45  .      return nE
df80: 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rr;.    }.  }els
df90: 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 53  e if( flags & PS
dfa0: 5f 4d 65 74 68 6f 64 20 29 7b 0a 20 20 20 20 2f  _Method ){.    /
dfb0: 2a 20 4d 65 74 68 6f 64 73 20 61 72 65 20 64 65  * Methods are de
dfc0: 63 6c 61 72 65 64 20 62 79 20 74 68 65 69 72 20  clared by their 
dfd0: 63 6c 61 73 73 2e 20 20 44 6f 6e 27 74 20 64 65  class.  Don't de
dfe0: 63 6c 61 72 65 20 73 65 70 61 72 61 74 65 6c 79  clare separately
dff0: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
e000: 6e 45 72 72 3b 0a 20 20 7d 0a 20 20 69 73 56 61  nErr;.  }.  isVa
e010: 72 20 3d 20 20 28 66 6c 61 67 73 20 26 20 28 50  r =  (flags & (P
e020: 53 5f 54 79 70 65 64 65 66 7c 50 53 5f 4d 65 74  S_Typedef|PS_Met
e030: 68 6f 64 29 29 3d 3d 30 20 26 26 20 69 73 56 61  hod))==0 && isVa
e040: 72 69 61 62 6c 65 44 65 66 28 70 46 69 72 73 74  riableDef(pFirst
e050: 2c 70 45 6e 64 29 3b 0a 20 20 69 66 28 20 69 73  ,pEnd);.  if( is
e060: 56 61 72 20 26 26 20 28 66 6c 61 67 73 20 26 20  Var && (flags & 
e070: 28 50 53 5f 49 6e 74 65 72 66 61 63 65 7c 50 53  (PS_Interface|PS
e080: 5f 45 78 70 6f 72 74 7c 50 53 5f 4c 6f 63 61 6c  _Export|PS_Local
e090: 29 29 21 3d 30 0a 20 20 26 26 20 28 66 6c 61 67  ))!=0.  && (flag
e0a0: 73 20 26 20 50 53 5f 45 78 74 65 72 6e 29 3d 3d  s & PS_Extern)==
e0b0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
e0c0: 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20  (stderr,"%s:%d: 
e0d0: 43 61 6e 27 74 20 64 65 66 69 6e 65 20 61 20 76  Can't define a v
e0e0: 61 72 69 61 62 6c 65 20 69 6e 20 74 68 69 73 20  ariable in this 
e0f0: 63 6f 6e 74 65 78 74 5c 6e 22 2c 0a 20 20 20 20  context\n",.    
e100: 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69    zFilename, pFi
e110: 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20  rst->nLine);.   
e120: 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70   nErr++;.  }.  p
e130: 4e 61 6d 65 20 3d 20 46 69 6e 64 44 65 63 6c 4e  Name = FindDeclN
e140: 61 6d 65 28 70 46 69 72 73 74 2c 70 45 6e 64 2d  ame(pFirst,pEnd-
e150: 3e 70 50 72 65 76 29 3b 0a 20 20 69 66 28 20 70  >pPrev);.  if( p
e160: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
e170: 66 28 20 70 46 69 72 73 74 2d 3e 6e 54 65 78 74  f( pFirst->nText
e180: 3d 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28 70  ==4 && strncmp(p
e190: 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 65 6e  First->zText,"en
e1a0: 75 6d 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20  um",4)==0 ){.   
e1b0: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 63 6f 6d     /* Ignore com
e1c0: 70 6c 65 74 65 6c 79 20 61 6e 6f 6e 79 6d 6f 75  pletely anonymou
e1d0: 73 20 65 6e 75 6d 73 2e 20 20 53 65 65 20 64 6f  s enums.  See do
e1e0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 73 65 63 74  cumentation sect
e1f0: 69 6f 6e 20 33 2e 38 2e 31 2e 20 2a 2f 0a 20 20  ion 3.8.1. */.  
e200: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b      return nErr;
e210: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e220: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
e230: 2c 22 25 73 3a 25 64 3a 20 43 61 6e 27 74 20 66  ,"%s:%d: Can't f
e240: 69 6e 64 20 61 20 6e 61 6d 65 20 66 6f 72 20 74  ind a name for t
e250: 68 65 20 6f 62 6a 65 63 74 20 64 65 63 6c 61 72  he object declar
e260: 65 64 20 68 65 72 65 2e 5c 6e 22 2c 0a 20 20 20  ed here.\n",.   
e270: 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20       zFilename, 
e280: 70 46 69 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a  pFirst->nLine);.
e290: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72        return nEr
e2a0: 72 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r+1;.    }.  }..
e2b0: 23 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 69  #ifdef DEBUG.  i
e2c0: 66 28 20 64 65 62 75 67 4d 61 73 6b 20 26 20 50  f( debugMask & P
e2d0: 41 52 53 45 52 20 29 7b 0a 20 20 20 20 69 66 28  ARSER ){.    if(
e2e0: 20 66 6c 61 67 73 20 26 20 50 53 5f 54 79 70 65   flags & PS_Type
e2f0: 64 65 66 20 29 7b 0a 20 20 20 20 20 20 70 72 69  def ){.      pri
e300: 6e 74 66 28 22 2a 2a 2a 2a 20 46 6f 75 6e 64 20  ntf("**** Found 
e310: 74 79 70 65 64 65 66 20 25 2e 2a 73 20 61 74 20  typedef %.*s at 
e320: 6c 69 6e 65 20 25 64 2e 2e 2e 5c 6e 22 2c 0a 20  line %d...\n",. 
e330: 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 6e 54         pName->nT
e340: 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 7a 54 65 78  ext, pName->zTex
e350: 74 2c 20 70 4e 61 6d 65 2d 3e 6e 4c 69 6e 65 29  t, pName->nLine)
e360: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
e370: 69 73 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70  isVar ){.      p
e380: 72 69 6e 74 66 28 22 2a 2a 2a 2a 20 46 6f 75 6e  rintf("**** Foun
e390: 64 20 76 61 72 69 61 62 6c 65 20 25 2e 2a 73 20  d variable %.*s 
e3a0: 61 74 20 6c 69 6e 65 20 25 64 2e 2e 2e 5c 6e 22  at line %d...\n"
e3b0: 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d  ,.        pName-
e3c0: 3e 6e 54 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 7a  >nText, pName->z
e3d0: 54 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 6e 4c 69  Text, pName->nLi
e3e0: 6e 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ne);.    }else{.
e3f0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 2a 2a        printf("**
e400: 2a 2a 20 46 6f 75 6e 64 20 70 72 6f 74 6f 74 79  ** Found prototy
e410: 70 65 20 25 2e 2a 73 20 61 74 20 6c 69 6e 65 20  pe %.*s at line 
e420: 25 64 2e 2e 2e 5c 6e 22 2c 0a 20 20 20 20 20 20  %d...\n",.      
e430: 20 20 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 2c 20    pName->nText, 
e440: 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 20 70 4e  pName->zText, pN
e450: 61 6d 65 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20  ame->nLine);.   
e460: 20 7d 0a 20 20 20 20 50 72 69 6e 74 54 6f 6b 65   }.    PrintToke
e470: 6e 73 28 70 46 69 72 73 74 2c 70 45 6e 64 2d 3e  ns(pFirst,pEnd->
e480: 70 50 72 65 76 29 3b 0a 20 20 20 20 70 72 69 6e  pPrev);.    prin
e490: 74 66 28 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 23  tf(";\n");.  }.#
e4a0: 65 6e 64 69 66 0a 0a 20 20 70 44 65 63 6c 20 3d  endif..  pDecl =
e4b0: 20 43 72 65 61 74 65 44 65 63 6c 28 70 4e 61 6d   CreateDecl(pNam
e4c0: 65 2d 3e 7a 54 65 78 74 2c 70 4e 61 6d 65 2d 3e  e->zText,pName->
e4d0: 6e 54 65 78 74 29 3b 0a 20 20 69 66 28 20 28 66  nText);.  if( (f
e4e0: 6c 61 67 73 20 26 20 50 53 5f 54 79 70 65 64 65  lags & PS_Typede
e4f0: 66 29 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65  f) ){.    DeclSe
e500: 74 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c  tProperty(pDecl,
e510: 20 54 59 5f 54 79 70 65 64 65 66 29 3b 0a 20 20   TY_Typedef);.  
e520: 7d 65 6c 73 65 20 69 66 28 20 69 73 56 61 72 20  }else if( isVar 
e530: 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72  ){.    DeclSetPr
e540: 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f  operty(pDecl,DP_
e550: 45 78 74 65 72 6e 52 65 71 64 20 7c 20 54 59 5f  ExternReqd | TY_
e560: 56 61 72 69 61 62 6c 65 29 3b 0a 20 20 20 20 69  Variable);.    i
e570: 66 28 20 21 28 66 6c 61 67 73 20 26 20 44 50 5f  f( !(flags & DP_
e580: 43 70 6c 75 73 70 6c 75 73 29 20 29 7b 0a 20 20  Cplusplus) ){.  
e590: 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65      DeclSetPrope
e5a0: 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 78 74  rty(pDecl,DP_Ext
e5b0: 65 72 6e 43 52 65 71 64 29 3b 0a 20 20 20 20 7d  ernCReqd);.    }
e5c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 44 65  .  }else{.    De
e5d0: 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44  clSetProperty(pD
e5e0: 65 63 6c 2c 20 54 59 5f 53 75 62 72 6f 75 74 69  ecl, TY_Subrouti
e5f0: 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 21 28 66  ne);.    if( !(f
e600: 6c 61 67 73 20 26 20 44 50 5f 43 70 6c 75 73 70  lags & DP_Cplusp
e610: 6c 75 73 29 20 29 7b 0a 20 20 20 20 20 20 44 65  lus) ){.      De
e620: 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44  clSetProperty(pD
e630: 65 63 6c 2c 44 50 5f 45 78 74 65 72 6e 43 52 65  ecl,DP_ExternCRe
e640: 71 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  qd);.    }.  }. 
e650: 20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74   pDecl->pComment
e660: 20 3d 20 70 46 69 72 73 74 2d 3e 70 43 6f 6d 6d   = pFirst->pComm
e670: 65 6e 74 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a 44  ent;.  pDecl->zD
e680: 65 63 6c 20 3d 20 54 6f 6b 65 6e 73 54 6f 53 74  ecl = TokensToSt
e690: 72 69 6e 67 28 70 46 69 72 73 74 2c 70 45 6e 64  ring(pFirst,pEnd
e6a0: 2d 3e 70 50 72 65 76 2c 22 3b 5c 6e 22 2c 30 2c  ->pPrev,";\n",0,
e6b0: 30 29 3b 0a 20 20 69 66 28 20 69 73 4c 6f 63 61  0);.  if( isLoca
e6c0: 6c 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 28 50  l || (flags & (P
e6d0: 53 5f 4c 6f 63 61 6c 7c 50 53 5f 4c 6f 63 61 6c  S_Local|PS_Local
e6e0: 32 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 44 65  2))!=0 ){.    De
e6f0: 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44  clSetProperty(pD
e700: 65 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29 3b 0a 20  ecl,DP_Local);. 
e710: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
e720: 20 26 20 28 50 53 5f 45 78 70 6f 72 74 7c 50 53   & (PS_Export|PS
e730: 5f 45 78 70 6f 72 74 32 29 20 29 7b 0a 20 20 20  _Export2) ){.   
e740: 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79   DeclSetProperty
e750: 28 70 44 65 63 6c 2c 44 50 5f 45 78 70 6f 72 74  (pDecl,DP_Export
e760: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  );.  }.  if( fla
e770: 67 73 20 26 20 44 50 5f 43 70 6c 75 73 70 6c 75  gs & DP_Cplusplu
e780: 73 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74  s ){.    DeclSet
e790: 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44  Property(pDecl,D
e7a0: 50 5f 43 70 6c 75 73 70 6c 75 73 29 3b 0a 20 20  P_Cplusplus);.  
e7b0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  }.  return nErr;
e7c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61  .}../*.** Push a
e7d0: 6e 20 69 66 20 63 6f 6e 64 69 74 69 6f 6e 20 6f  n if condition o
e7e0: 6e 74 6f 20 74 68 65 20 69 66 20 73 74 61 63 6b  nto the if stack
e7f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e800: 50 75 73 68 49 66 4d 61 63 72 6f 28 0a 20 20 63  PushIfMacro(.  c
e810: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 66  onst char *zPref
e820: 69 78 2c 20 20 20 20 20 20 2f 2a 20 41 20 70 72  ix,      /* A pr
e830: 65 66 69 78 2c 20 6c 69 6b 65 20 22 64 65 66 69  efix, like "defi
e840: 6e 65 22 20 6f 72 20 22 21 22 20 2a 2f 0a 20 20  ne" or "!" */.  
e850: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78  const char *zTex
e860: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t,        /* The
e870: 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20   condition */.  
e880: 69 6e 74 20 6e 54 65 78 74 2c 20 20 20 20 20 20  int nText,      
e890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e8a0: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
e8b0: 73 20 69 6e 20 7a 54 65 78 74 20 2a 2f 0a 20 20  s in zText */.  
e8c0: 69 6e 74 20 6e 4c 69 6e 65 2c 20 20 20 20 20 20  int nLine,      
e8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
e8e0: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  e number where t
e8f0: 68 69 73 20 6d 61 63 72 6f 20 6f 63 63 75 72 73  his macro occurs
e900: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
e910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e920: 2f 2a 20 45 69 74 68 65 72 20 30 2c 20 50 53 5f  /* Either 0, PS_
e930: 49 6e 74 65 72 66 61 63 65 2c 20 50 53 5f 45 78  Interface, PS_Ex
e940: 70 6f 72 74 20 6f 72 20 50 53 5f 4c 6f 63 61 6c  port or PS_Local
e950: 20 2a 2f 0a 29 7b 0a 20 20 49 66 6d 61 63 72 6f   */.){.  Ifmacro
e960: 20 2a 70 49 66 3b 0a 20 20 69 6e 74 20 6e 42 79   *pIf;.  int nBy
e970: 74 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73  te;..  nByte = s
e980: 69 7a 65 6f 66 28 49 66 6d 61 63 72 6f 29 3b 0a  izeof(Ifmacro);.
e990: 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20    if( zText ){. 
e9a0: 20 20 20 69 66 28 20 7a 50 72 65 66 69 78 20 29     if( zPrefix )
e9b0: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
e9c0: 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78 29   strlen(zPrefix)
e9d0: 20 2b 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20   + 2;.    }.    
e9e0: 6e 42 79 74 65 20 2b 3d 20 6e 54 65 78 74 20 2b  nByte += nText +
e9f0: 20 31 3b 0a 20 20 7d 0a 20 20 70 49 66 20 3d 20   1;.  }.  pIf = 
ea00: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74  SafeMalloc( nByt
ea10: 65 20 29 3b 0a 20 20 69 66 28 20 7a 54 65 78 74  e );.  if( zText
ea20: 20 29 7b 0a 20 20 20 20 70 49 66 2d 3e 7a 43 6f   ){.    pIf->zCo
ea30: 6e 64 69 74 69 6f 6e 20 3d 20 28 63 68 61 72 2a  ndition = (char*
ea40: 29 26 70 49 66 5b 31 5d 3b 0a 20 20 20 20 69 66  )&pIf[1];.    if
ea50: 28 20 7a 50 72 65 66 69 78 20 29 7b 0a 20 20 20  ( zPrefix ){.   
ea60: 20 20 20 73 70 72 69 6e 74 66 28 70 49 66 2d 3e     sprintf(pIf->
ea70: 7a 43 6f 6e 64 69 74 69 6f 6e 2c 22 25 73 28 25  zCondition,"%s(%
ea80: 2e 2a 73 29 22 2c 7a 50 72 65 66 69 78 2c 6e 54  .*s)",zPrefix,nT
ea90: 65 78 74 2c 7a 54 65 78 74 29 3b 0a 20 20 20 20  ext,zText);.    
eaa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 70 72  }else{.      spr
eab0: 69 6e 74 66 28 70 49 66 2d 3e 7a 43 6f 6e 64 69  intf(pIf->zCondi
eac0: 74 69 6f 6e 2c 22 25 2e 2a 73 22 2c 6e 54 65 78  tion,"%.*s",nTex
ead0: 74 2c 7a 54 65 78 74 29 3b 0a 20 20 20 20 7d 0a  t,zText);.    }.
eae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 66    }else{.    pIf
eaf0: 2d 3e 7a 43 6f 6e 64 69 74 69 6f 6e 20 3d 20 30  ->zCondition = 0
eb00: 3b 0a 20 20 7d 0a 20 20 70 49 66 2d 3e 6e 4c 69  ;.  }.  pIf->nLi
eb10: 6e 65 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 70 49  ne = nLine;.  pI
eb20: 66 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  f->flags = flags
eb30: 3b 0a 20 20 70 49 66 2d 3e 70 4e 65 78 74 20 3d  ;.  pIf->pNext =
eb40: 20 69 66 53 74 61 63 6b 3b 0a 20 20 69 66 53 74   ifStack;.  ifSt
eb50: 61 63 6b 20 3d 20 70 49 66 3b 0a 7d 0a 0a 2f 2a  ack = pIf;.}../*
eb60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
eb70: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61   is called to ha
eb80: 6e 64 6c 65 20 61 6c 6c 20 70 72 65 70 72 6f 63  ndle all preproc
eb90: 65 73 73 6f 72 20 64 69 72 65 63 74 69 76 65 73  essor directives
eba0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
ebb0: 74 69 6e 65 20 77 69 6c 6c 20 72 65 63 6f 6d 70  tine will recomp
ebc0: 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ute the value of
ebd0: 20 2a 70 50 72 65 73 65 74 46 6c 61 67 73 20 74   *pPresetFlags t
ebe0: 6f 20 62 65 20 74 68 65 0a 2a 2a 20 6c 6f 67 69  o be the.** logi
ebf0: 63 61 6c 20 6f 72 20 6f 66 20 61 6c 6c 20 66 6c  cal or of all fl
ec00: 61 67 73 20 6f 6e 20 61 6c 6c 20 6e 65 73 74 65  ags on all neste
ec10: 64 20 23 69 66 73 2e 20 20 54 68 65 20 23 69 66  d #ifs.  The #if
ec20: 73 20 74 68 61 74 20 73 65 74 20 66 6c 61 67 73  s that set flags
ec30: 0a 2a 2a 20 61 72 65 20 61 73 20 66 6f 6c 6c 6f  .** are as follo
ec40: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ws:.**.**       
ec50: 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 20 20 20   conditional    
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
ec70: 6c 61 67 20 73 65 74 0a 2a 2a 20 20 20 20 20 20  lag set.**      
ec80: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
ec90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20  ----------      
eca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ecb0: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 20 20 23  ----.**        #
ecc0: 69 66 20 49 4e 54 45 52 46 41 43 45 20 20 20 20  if INTERFACE    
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 53 5f               PS_
ece0: 49 6e 74 65 72 66 61 63 65 0a 2a 2a 20 20 20 20  Interface.**    
ecf0: 20 20 20 20 23 69 66 20 45 58 50 4f 52 54 5f 49      #if EXPORT_I
ed00: 4e 54 45 52 46 41 43 45 20 20 20 20 20 20 20 20  NTERFACE        
ed10: 20 20 50 53 5f 45 78 70 6f 72 74 0a 2a 2a 20 20    PS_Export.**  
ed20: 20 20 20 20 20 20 23 69 66 20 4c 4f 43 41 4c 5f        #if LOCAL_
ed30: 49 4e 54 45 52 46 41 43 45 20 20 20 20 20 20 20  INTERFACE       
ed40: 20 20 20 20 50 53 5f 4c 6f 63 61 6c 0a 2a 2a 0a      PS_Local.**.
ed50: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
ed60: 69 66 20 61 66 74 65 72 20 70 72 6f 63 65 73 73  if after process
ed70: 69 6e 67 20 74 68 65 20 70 72 65 70 72 6f 63 65  ing the preproce
ed80: 73 73 6f 72 20 74 6f 6b 65 6e 20 67 69 76 65 6e  ssor token given
ed90: 0a 2a 2a 20 62 79 20 70 54 6f 6b 65 6e 20 74 68  .** by pToken th
eda0: 65 72 65 20 69 73 20 61 6e 20 22 23 69 66 20 49  ere is an "#if I
edb0: 4e 54 45 52 46 41 43 45 22 20 6f 6e 20 74 68 65  NTERFACE" on the
edc0: 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 2a 2a   preprocessor.**
edd0: 20 73 74 61 63 6b 2c 20 74 68 65 6e 20 2a 70 50   stack, then *pP
ede0: 72 65 73 65 74 46 6c 61 67 73 20 77 69 6c 6c 20  resetFlags will 
edf0: 62 65 20 73 65 74 20 74 6f 20 50 53 5f 49 6e 74  be set to PS_Int
ee00: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
ee10: 63 20 69 6e 74 20 50 61 72 73 65 50 72 65 70 72  c int ParsePrepr
ee20: 6f 63 65 73 73 6f 72 28 54 6f 6b 65 6e 20 2a 70  ocessor(Token *p
ee30: 54 6f 6b 65 6e 2c 20 69 6e 74 20 66 6c 61 67 73  Token, int flags
ee40: 2c 20 69 6e 74 20 2a 70 50 72 65 73 65 74 46 6c  , int *pPresetFl
ee50: 61 67 73 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  ags){.  const ch
ee60: 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 6e 74 20  ar *zCmd;.  int 
ee70: 6e 43 6d 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nCmd;.  const ch
ee80: 61 72 20 2a 7a 41 72 67 3b 0a 20 20 69 6e 74 20  ar *zArg;.  int 
ee90: 6e 41 72 67 3b 0a 20 20 69 6e 74 20 6e 45 72 72  nArg;.  int nErr
eea0: 20 3d 20 30 3b 0a 20 20 49 66 6d 61 63 72 6f 20   = 0;.  Ifmacro 
eeb0: 2a 70 49 66 3b 0a 0a 20 20 7a 43 6d 64 20 3d 20  *pIf;..  zCmd = 
eec0: 26 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 5b 31  &pToken->zText[1
eed0: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70  ];.  while( issp
eee0: 61 63 65 28 2a 7a 43 6d 64 29 20 26 26 20 2a 7a  ace(*zCmd) && *z
eef0: 43 6d 64 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  Cmd!='\n' ){.   
ef00: 20 7a 43 6d 64 2b 2b 3b 0a 20 20 7d 0a 20 20 69   zCmd++;.  }.  i
ef10: 66 28 20 21 69 73 61 6c 70 68 61 28 2a 7a 43 6d  f( !isalpha(*zCm
ef20: 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d) ){.    return
ef30: 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 6d 64 20 3d   0;.  }.  nCmd =
ef40: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 61   1;.  while( isa
ef50: 6c 70 68 61 28 7a 43 6d 64 5b 6e 43 6d 64 5d 29  lpha(zCmd[nCmd])
ef60: 20 29 7b 0a 20 20 20 20 6e 43 6d 64 2b 2b 3b 0a   ){.    nCmd++;.
ef70: 20 20 7d 0a 0a 20 20 69 66 28 20 6e 43 6d 64 3d    }..  if( nCmd=
ef80: 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 43  =5 && strncmp(zC
ef90: 6d 64 2c 22 65 6e 64 69 66 22 2c 35 29 3d 3d 30  md,"endif",5)==0
efa0: 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
efb0: 2a 20 50 6f 70 20 74 68 65 20 69 66 20 73 74 61  * Pop the if sta
efc0: 63 6b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  ck.    */.    pI
efd0: 66 20 3d 20 69 66 53 74 61 63 6b 3b 0a 20 20 20  f = ifStack;.   
efe0: 20 69 66 28 20 70 49 66 3d 3d 30 20 29 7b 0a 20   if( pIf==0 ){. 
eff0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
f000: 65 72 72 2c 22 25 73 3a 25 64 3a 20 65 78 74 72  err,"%s:%d: extr
f010: 61 20 27 23 65 6e 64 69 66 27 2e 5c 6e 22 2c 7a  a '#endif'.\n",z
f020: 46 69 6c 65 6e 61 6d 65 2c 70 54 6f 6b 65 6e 2d  Filename,pToken-
f030: 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 72  >nLine);.      r
f040: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
f050: 20 20 20 69 66 53 74 61 63 6b 20 3d 20 70 49 66     ifStack = pIf
f060: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 53 61 66  ->pNext;.    Saf
f070: 65 46 72 65 65 28 70 49 66 29 3b 0a 20 20 7d 65  eFree(pIf);.  }e
f080: 6c 73 65 20 69 66 28 20 6e 43 6d 64 3d 3d 36 20  lse if( nCmd==6 
f090: 26 26 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c  && strncmp(zCmd,
f0a0: 22 64 65 66 69 6e 65 22 2c 36 29 3d 3d 30 20 29  "define",6)==0 )
f0b0: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
f0c0: 52 65 63 6f 72 64 20 61 20 23 64 65 66 69 6e 65  Record a #define
f0d0: 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 50 53   if we are in PS
f0e0: 5f 49 6e 74 65 72 66 61 63 65 20 6f 72 20 50 53  _Interface or PS
f0f0: 5f 45 78 70 6f 72 74 0a 20 20 20 20 2a 2f 0a 20  _Export.    */. 
f100: 20 20 20 44 65 63 6c 20 2a 70 44 65 63 6c 3b 0a     Decl *pDecl;.
f110: 20 20 20 20 69 66 28 20 21 28 66 6c 61 67 73 20      if( !(flags 
f120: 26 20 28 50 53 5f 4c 6f 63 61 6c 7c 50 53 5f 49  & (PS_Local|PS_I
f130: 6e 74 65 72 66 61 63 65 7c 50 53 5f 45 78 70 6f  nterface|PS_Expo
f140: 72 74 29 29 20 29 7b 20 72 65 74 75 72 6e 20 30  rt)) ){ return 0
f150: 3b 20 7d 0a 20 20 20 20 7a 41 72 67 20 3d 20 26  ; }.    zArg = &
f160: 7a 43 6d 64 5b 36 5d 3b 0a 20 20 20 20 77 68 69  zCmd[6];.    whi
f170: 6c 65 28 20 2a 7a 41 72 67 20 26 26 20 69 73 73  le( *zArg && iss
f180: 70 61 63 65 28 2a 7a 41 72 67 29 20 26 26 20 2a  pace(*zArg) && *
f190: 7a 41 72 67 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  zArg!='\n' ){.  
f1a0: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20      zArg++;.    
f1b0: 7d 0a 20 20 20 20 69 66 28 20 2a 7a 41 72 67 3d  }.    if( *zArg=
f1c0: 3d 30 20 7c 7c 20 2a 7a 41 72 67 3d 3d 27 5c 6e  =0 || *zArg=='\n
f1d0: 27 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  ' ){ return 0; }
f1e0: 0a 20 20 20 20 66 6f 72 28 6e 41 72 67 3d 30 3b  .    for(nArg=0;
f1f0: 20 49 53 41 4c 4e 55 4d 28 7a 41 72 67 5b 6e 41   ISALNUM(zArg[nA
f200: 72 67 5d 29 3b 20 6e 41 72 67 2b 2b 29 7b 7d 0a  rg]); nArg++){}.
f210: 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20      if( nArg==0 
f220: 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a 20  ){ return 0; }. 
f230: 20 20 20 70 44 65 63 6c 20 3d 20 43 72 65 61 74     pDecl = Creat
f240: 65 44 65 63 6c 28 7a 41 72 67 2c 6e 41 72 67 29  eDecl(zArg,nArg)
f250: 3b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 70 43 6f  ;.    pDecl->pCo
f260: 6d 6d 65 6e 74 20 3d 20 70 54 6f 6b 65 6e 2d 3e  mment = pToken->
f270: 70 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 44 65  pComment;.    De
f280: 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44  clSetProperty(pD
f290: 65 63 6c 2c 54 59 5f 4d 61 63 72 6f 29 3b 0a 20  ecl,TY_Macro);. 
f2a0: 20 20 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 20     pDecl->zDecl 
f2b0: 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 70 54  = SafeMalloc( pT
f2c0: 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 2b 20 32 20  oken->nText + 2 
f2d0: 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70  );.    sprintf(p
f2e0: 44 65 63 6c 2d 3e 7a 44 65 63 6c 2c 22 25 2e 2a  Decl->zDecl,"%.*
f2f0: 73 5c 6e 22 2c 70 54 6f 6b 65 6e 2d 3e 6e 54 65  s\n",pToken->nTe
f300: 78 74 2c 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74  xt,pToken->zText
f310: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
f320: 20 26 20 50 53 5f 45 78 70 6f 72 74 20 29 7b 0a   & PS_Export ){.
f330: 20 20 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f        DeclSetPro
f340: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45  perty(pDecl,DP_E
f350: 78 70 6f 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73  xport);.    }els
f360: 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 53  e if( flags & PS
f370: 5f 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  _Local ){.      
f380: 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28  DeclSetProperty(
f390: 70 44 65 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29 3b  pDecl,DP_Local);
f3a0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
f3b0: 66 28 20 6e 43 6d 64 3d 3d 37 20 26 26 20 73 74  f( nCmd==7 && st
f3c0: 72 6e 63 6d 70 28 7a 43 6d 64 2c 22 69 6e 63 6c  rncmp(zCmd,"incl
f3d0: 75 64 65 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20  ude",7)==0 ){.  
f3e0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 63 6f    /*.    ** Reco
f3f0: 72 64 20 61 6e 20 23 69 6e 63 6c 75 64 65 20 69  rd an #include i
f400: 66 20 77 65 20 61 72 65 20 69 6e 20 50 53 5f 49  f we are in PS_I
f410: 6e 74 65 72 66 61 63 65 20 6f 72 20 50 53 5f 45  nterface or PS_E
f420: 78 70 6f 72 74 0a 20 20 20 20 2a 2f 0a 20 20 20  xport.    */.   
f430: 20 49 6e 63 6c 75 64 65 20 2a 70 49 6e 63 6c 75   Include *pInclu
f440: 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  de;.    char *zI
f450: 66 3b 0a 0a 20 20 20 20 69 66 28 20 21 28 66 6c  f;..    if( !(fl
f460: 61 67 73 20 26 20 28 50 53 5f 49 6e 74 65 72 66  ags & (PS_Interf
f470: 61 63 65 7c 50 53 5f 45 78 70 6f 72 74 29 29 20  ace|PS_Export)) 
f480: 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a 20  ){ return 0; }. 
f490: 20 20 20 7a 41 72 67 20 3d 20 26 7a 43 6d 64 5b     zArg = &zCmd[
f4a0: 37 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  7];.    while( *
f4b0: 7a 41 72 67 20 26 26 20 69 73 73 70 61 63 65 28  zArg && isspace(
f4c0: 2a 7a 41 72 67 29 20 29 7b 20 7a 41 72 67 2b 2b  *zArg) ){ zArg++
f4d0: 3b 20 7d 0a 20 20 20 20 66 6f 72 28 6e 41 72 67  ; }.    for(nArg
f4e0: 3d 30 3b 20 21 69 73 73 70 61 63 65 28 7a 41 72  =0; !isspace(zAr
f4f0: 67 5b 6e 41 72 67 5d 29 3b 20 6e 41 72 67 2b 2b  g[nArg]); nArg++
f500: 29 7b 7d 0a 20 20 20 20 69 66 28 20 28 7a 41 72  ){}.    if( (zAr
f510: 67 5b 30 5d 3d 3d 27 22 27 20 26 26 20 7a 41 72  g[0]=='"' && zAr
f520: 67 5b 6e 41 72 67 2d 31 5d 21 3d 27 22 27 29 0a  g[nArg-1]!='"').
f530: 20 20 20 20 20 20 7c 7c 28 7a 41 72 67 5b 30 5d        ||(zArg[0]
f540: 3d 3d 27 3c 27 20 26 26 20 7a 41 72 67 5b 6e 41  =='<' && zArg[nA
f550: 72 67 2d 31 5d 21 3d 27 3e 27 29 0a 20 20 20 20  rg-1]!='>').    
f560: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
f570: 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20  (stderr,"%s:%d: 
f580: 6d 61 6c 66 6f 72 6d 65 64 20 23 69 6e 63 6c 75  malformed #inclu
f590: 64 65 20 73 74 61 74 65 6d 65 6e 74 2e 5c 6e 22  de statement.\n"
f5a0: 2c 0a 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e  ,.        zFilen
f5b0: 61 6d 65 2c 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e  ame,pToken->nLin
f5c0: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
f5d0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49   1;.    }.    zI
f5e0: 66 20 3d 20 47 65 74 49 66 53 74 72 69 6e 67 28  f = GetIfString(
f5f0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 49 66 20 29  );.    if( zIf )
f600: 7b 0a 20 20 20 20 20 20 70 49 6e 63 6c 75 64 65  {.      pInclude
f610: 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73   = SafeMalloc( s
f620: 69 7a 65 6f 66 28 49 6e 63 6c 75 64 65 29 20 2b  izeof(Include) +
f630: 20 6e 41 72 67 2a 32 20 2b 20 73 74 72 6c 65 6e   nArg*2 + strlen
f640: 28 7a 49 66 29 20 2b 20 31 30 20 29 3b 0a 20 20  (zIf) + 10 );.  
f650: 20 20 20 20 70 49 6e 63 6c 75 64 65 2d 3e 7a 46      pInclude->zF
f660: 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49  ile = (char*)&pI
f670: 6e 63 6c 75 64 65 5b 31 5d 3b 0a 20 20 20 20 20  nclude[1];.     
f680: 20 70 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61 62 65   pInclude->zLabe
f690: 6c 20 3d 20 26 70 49 6e 63 6c 75 64 65 2d 3e 7a  l = &pInclude->z
f6a0: 46 69 6c 65 5b 6e 41 72 67 2b 31 5d 3b 0a 20 20  File[nArg+1];.  
f6b0: 20 20 20 20 73 70 72 69 6e 74 66 28 70 49 6e 63      sprintf(pInc
f6c0: 6c 75 64 65 2d 3e 7a 46 69 6c 65 2c 22 25 2e 2a  lude->zFile,"%.*
f6d0: 73 22 2c 6e 41 72 67 2c 7a 41 72 67 29 3b 0a 20  s",nArg,zArg);. 
f6e0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 70 49 6e       sprintf(pIn
f6f0: 63 6c 75 64 65 2d 3e 7a 4c 61 62 65 6c 2c 22 25  clude->zLabel,"%
f700: 2e 2a 73 3a 25 73 22 2c 6e 41 72 67 2c 7a 41 72  .*s:%s",nArg,zAr
f710: 67 2c 7a 49 66 29 3b 0a 20 20 20 20 20 20 70 49  g,zIf);.      pI
f720: 6e 63 6c 75 64 65 2d 3e 7a 49 66 20 3d 20 26 70  nclude->zIf = &p
f730: 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61 62 65 6c 5b  Include->zLabel[
f740: 6e 41 72 67 2b 31 5d 3b 0a 20 20 20 20 20 20 53  nArg+1];.      S
f750: 61 66 65 46 72 65 65 28 7a 49 66 29 3b 0a 20 20  afeFree(zIf);.  
f760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
f770: 49 6e 63 6c 75 64 65 20 3d 20 53 61 66 65 4d 61  Include = SafeMa
f780: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 63  lloc( sizeof(Inc
f790: 6c 75 64 65 29 20 2b 20 6e 41 72 67 20 2b 20 31  lude) + nArg + 1
f7a0: 20 29 3b 0a 20 20 20 20 20 20 70 49 6e 63 6c 75   );.      pInclu
f7b0: 64 65 2d 3e 7a 46 69 6c 65 20 3d 20 28 63 68 61  de->zFile = (cha
f7c0: 72 2a 29 26 70 49 6e 63 6c 75 64 65 5b 31 5d 3b  r*)&pInclude[1];
f7d0: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 70  .      sprintf(p
f7e0: 49 6e 63 6c 75 64 65 2d 3e 7a 46 69 6c 65 2c 22  Include->zFile,"
f7f0: 25 2e 2a 73 22 2c 6e 41 72 67 2c 7a 41 72 67 29  %.*s",nArg,zArg)
f800: 3b 0a 20 20 20 20 20 20 70 49 6e 63 6c 75 64 65  ;.      pInclude
f810: 2d 3e 7a 49 66 20 3d 20 30 3b 0a 20 20 20 20 20  ->zIf = 0;.     
f820: 20 70 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61 62 65   pInclude->zLabe
f830: 6c 20 3d 20 70 49 6e 63 6c 75 64 65 2d 3e 7a 46  l = pInclude->zF
f840: 69 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ile;.    }.    p
f850: 49 6e 63 6c 75 64 65 2d 3e 70 4e 65 78 74 20 3d  Include->pNext =
f860: 20 69 6e 63 6c 75 64 65 4c 69 73 74 3b 0a 20 20   includeList;.  
f870: 20 20 69 6e 63 6c 75 64 65 4c 69 73 74 20 3d 20    includeList = 
f880: 70 49 6e 63 6c 75 64 65 3b 0a 20 20 7d 65 6c 73  pInclude;.  }els
f890: 65 20 69 66 28 20 6e 43 6d 64 3d 3d 32 20 26 26  e if( nCmd==2 &&
f8a0: 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c 22 69   strncmp(zCmd,"i
f8b0: 66 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  f",2)==0 ){.    
f8c0: 2f 2a 0a 20 20 20 20 2a 2a 20 50 75 73 68 20 61  /*.    ** Push a
f8d0: 6e 20 23 69 66 2e 20 20 57 61 74 63 68 20 66 6f  n #if.  Watch fo
f8e0: 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  r the special ca
f8f0: 73 65 73 20 6f 66 20 49 4e 54 45 52 46 41 43 45  ses of INTERFACE
f900: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 45 58 50 4f  .    ** and EXPO
f910: 52 54 5f 49 4e 54 45 52 46 41 43 45 20 61 6e 64  RT_INTERFACE and
f920: 20 4c 4f 43 41 4c 5f 49 4e 54 45 52 46 41 43 45   LOCAL_INTERFACE
f930: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 41 72 67  .    */.    zArg
f940: 20 3d 20 26 7a 43 6d 64 5b 32 5d 3b 0a 20 20 20   = &zCmd[2];.   
f950: 20 77 68 69 6c 65 28 20 2a 7a 41 72 67 20 26 26   while( *zArg &&
f960: 20 69 73 73 70 61 63 65 28 2a 7a 41 72 67 29 20   isspace(*zArg) 
f970: 26 26 20 2a 7a 41 72 67 21 3d 27 5c 6e 27 20 29  && *zArg!='\n' )
f980: 7b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  {.      zArg++;.
f990: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 7a      }.    if( *z
f9a0: 41 72 67 3d 3d 30 20 7c 7c 20 2a 7a 41 72 67 3d  Arg==0 || *zArg=
f9b0: 3d 27 5c 6e 27 20 29 7b 20 72 65 74 75 72 6e 20  ='\n' ){ return 
f9c0: 30 3b 20 7d 0a 20 20 20 20 6e 41 72 67 20 3d 20  0; }.    nArg = 
f9d0: 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 2b 20  pToken->nText + 
f9e0: 28 69 6e 74 29 28 70 54 6f 6b 65 6e 2d 3e 7a 54  (int)(pToken->zT
f9f0: 65 78 74 20 2d 20 7a 41 72 67 29 3b 0a 20 20 20  ext - zArg);.   
fa00: 20 69 66 28 20 6e 41 72 67 3d 3d 39 20 26 26 20   if( nArg==9 && 
fa10: 73 74 72 6e 63 6d 70 28 7a 41 72 67 2c 22 49 4e  strncmp(zArg,"IN
fa20: 54 45 52 46 41 43 45 22 2c 39 29 3d 3d 30 20 29  TERFACE",9)==0 )
fa30: 7b 0a 20 20 20 20 20 20 50 75 73 68 49 66 4d 61  {.      PushIfMa
fa40: 63 72 6f 28 30 2c 30 2c 30 2c 70 54 6f 6b 65 6e  cro(0,0,0,pToken
fa50: 2d 3e 6e 4c 69 6e 65 2c 50 53 5f 49 6e 74 65 72  ->nLine,PS_Inter
fa60: 66 61 63 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  face);.    }else
fa70: 20 69 66 28 20 6e 41 72 67 3d 3d 31 36 20 26 26   if( nArg==16 &&
fa80: 20 73 74 72 6e 63 6d 70 28 7a 41 72 67 2c 22 45   strncmp(zArg,"E
fa90: 58 50 4f 52 54 5f 49 4e 54 45 52 46 41 43 45 22  XPORT_INTERFACE"
faa0: 2c 31 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,16)==0 ){.     
fab0: 20 50 75 73 68 49 66 4d 61 63 72 6f 28 30 2c 30   PushIfMacro(0,0
fac0: 2c 30 2c 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65  ,0,pToken->nLine
fad0: 2c 50 53 5f 45 78 70 6f 72 74 29 3b 0a 20 20 20  ,PS_Export);.   
fae0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d   }else if( nArg=
faf0: 3d 31 35 20 26 26 20 73 74 72 6e 63 6d 70 28 7a  =15 && strncmp(z
fb00: 41 72 67 2c 22 4c 4f 43 41 4c 5f 49 4e 54 45 52  Arg,"LOCAL_INTER
fb10: 46 41 43 45 22 2c 31 35 29 3d 3d 30 20 29 7b 0a  FACE",15)==0 ){.
fb20: 20 20 20 20 20 20 50 75 73 68 49 66 4d 61 63 72        PushIfMacr
fb30: 6f 28 30 2c 30 2c 30 2c 70 54 6f 6b 65 6e 2d 3e  o(0,0,0,pToken->
fb40: 6e 4c 69 6e 65 2c 50 53 5f 4c 6f 63 61 6c 29 3b  nLine,PS_Local);
fb50: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
fb60: 41 72 67 3d 3d 31 35 20 26 26 20 73 74 72 6e 63  Arg==15 && strnc
fb70: 6d 70 28 7a 41 72 67 2c 22 4d 41 4b 45 48 45 41  mp(zArg,"MAKEHEA
fb80: 44 45 52 53 5f 53 54 4f 50 4c 4f 43 41 4c 5f 49  DERS_STOPLOCAL_I
fb90: 4e 54 45 52 46 41 43 45 22 2c 31 35 29 3d 3d 30  NTERFACE",15)==0
fba0: 20 29 7b 0a 20 20 20 20 20 20 50 75 73 68 49 66   ){.      PushIf
fbb0: 4d 61 63 72 6f 28 30 2c 30 2c 30 2c 70 54 6f 6b  Macro(0,0,0,pTok
fbc0: 65 6e 2d 3e 6e 4c 69 6e 65 2c 50 53 5f 4c 6f 63  en->nLine,PS_Loc
fbd0: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
fbe0: 20 20 20 20 20 20 50 75 73 68 49 66 4d 61 63 72        PushIfMacr
fbf0: 6f 28 30 2c 7a 41 72 67 2c 6e 41 72 67 2c 70 54  o(0,zArg,nArg,pT
fc00: 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 30 29 3b 0a  oken->nLine,0);.
fc10: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
fc20: 28 20 6e 43 6d 64 3d 3d 35 20 26 26 20 73 74 72  ( nCmd==5 && str
fc30: 6e 63 6d 70 28 7a 43 6d 64 2c 22 69 66 64 65 66  ncmp(zCmd,"ifdef
fc40: 22 2c 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ",5)==0 ){.    /
fc50: 2a 0a 20 20 20 20 2a 2a 20 50 75 73 68 20 61 6e  *.    ** Push an
fc60: 20 23 69 66 64 65 66 2e 0a 20 20 20 20 2a 2f 0a   #ifdef..    */.
fc70: 20 20 20 20 7a 41 72 67 20 3d 20 26 7a 43 6d 64      zArg = &zCmd
fc80: 5b 35 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [5];.    while( 
fc90: 2a 7a 41 72 67 20 26 26 20 69 73 73 70 61 63 65  *zArg && isspace
fca0: 28 2a 7a 41 72 67 29 20 26 26 20 2a 7a 41 72 67  (*zArg) && *zArg
fcb0: 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  !='\n' ){.      
fcc0: 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  zArg++;.    }.  
fcd0: 20 20 69 66 28 20 2a 7a 41 72 67 3d 3d 30 20 7c    if( *zArg==0 |
fce0: 7c 20 2a 7a 41 72 67 3d 3d 27 5c 6e 27 20 29 7b  | *zArg=='\n' ){
fcf0: 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a 20 20 20   return 0; }.   
fd00: 20 6e 41 72 67 20 3d 20 70 54 6f 6b 65 6e 2d 3e   nArg = pToken->
fd10: 6e 54 65 78 74 20 2b 20 28 69 6e 74 29 28 70 54  nText + (int)(pT
fd20: 6f 6b 65 6e 2d 3e 7a 54 65 78 74 20 2d 20 7a 41  oken->zText - zA
fd30: 72 67 29 3b 0a 20 20 20 20 50 75 73 68 49 66 4d  rg);.    PushIfM
fd40: 61 63 72 6f 28 22 64 65 66 69 6e 65 64 22 2c 7a  acro("defined",z
fd50: 41 72 67 2c 6e 41 72 67 2c 70 54 6f 6b 65 6e 2d  Arg,nArg,pToken-
fd60: 3e 6e 4c 69 6e 65 2c 30 29 3b 0a 20 20 7d 65 6c  >nLine,0);.  }el
fd70: 73 65 20 69 66 28 20 6e 43 6d 64 3d 3d 36 20 26  se if( nCmd==6 &
fd80: 26 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c 22  & strncmp(zCmd,"
fd90: 69 66 6e 64 65 66 22 2c 36 29 3d 3d 30 20 29 7b  ifndef",6)==0 ){
fda0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50  .    /*.    ** P
fdb0: 75 73 68 20 61 6e 20 23 69 66 6e 64 65 66 2e 0a  ush an #ifndef..
fdc0: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 41 72 67 20      */.    zArg 
fdd0: 3d 20 26 7a 43 6d 64 5b 36 5d 3b 0a 20 20 20 20  = &zCmd[6];.    
fde0: 77 68 69 6c 65 28 20 2a 7a 41 72 67 20 26 26 20  while( *zArg && 
fdf0: 69 73 73 70 61 63 65 28 2a 7a 41 72 67 29 20 26  isspace(*zArg) &
fe00: 26 20 2a 7a 41 72 67 21 3d 27 5c 6e 27 20 29 7b  & *zArg!='\n' ){
fe10: 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20  .      zArg++;. 
fe20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 7a 41     }.    if( *zA
fe30: 72 67 3d 3d 30 20 7c 7c 20 2a 7a 41 72 67 3d 3d  rg==0 || *zArg==
fe40: 27 5c 6e 27 20 29 7b 20 72 65 74 75 72 6e 20 30  '\n' ){ return 0
fe50: 3b 20 7d 0a 20 20 20 20 6e 41 72 67 20 3d 20 70  ; }.    nArg = p
fe60: 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 2b 20 28  Token->nText + (
fe70: 69 6e 74 29 28 70 54 6f 6b 65 6e 2d 3e 7a 54 65  int)(pToken->zTe
fe80: 78 74 20 2d 20 7a 41 72 67 29 3b 0a 20 20 20 20  xt - zArg);.    
fe90: 50 75 73 68 49 66 4d 61 63 72 6f 28 22 21 64 65  PushIfMacro("!de
fea0: 66 69 6e 65 64 22 2c 7a 41 72 67 2c 6e 41 72 67  fined",zArg,nArg
feb0: 2c 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 30  ,pToken->nLine,0
fec0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  );.  }else if( n
fed0: 43 6d 64 3d 3d 34 20 26 26 20 73 74 72 6e 63 6d  Cmd==4 && strncm
fee0: 70 28 7a 43 6d 64 2c 22 65 6c 73 65 22 2c 34 29  p(zCmd,"else",4)
fef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
ff00: 20 20 2a 2a 20 49 6e 76 65 72 74 20 74 68 65 20    ** Invert the 
ff10: 23 69 66 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  #if on the top o
ff20: 66 20 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20  f the stack.    
ff30: 2a 2f 0a 20 20 20 20 69 66 28 20 69 66 53 74 61  */.    if( ifSta
ff40: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ck==0 ){.      f
ff50: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
ff60: 73 3a 25 64 3a 20 27 23 65 6c 73 65 27 20 77 69  s:%d: '#else' wi
ff70: 74 68 6f 75 74 20 61 6e 20 27 23 69 66 27 5c 6e  thout an '#if'\n
ff80: 22 2c 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  ",zFilename,.   
ff90: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e 4c        pToken->nL
ffa0: 69 6e 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ine);.      retu
ffb0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
ffc0: 70 49 66 20 3d 20 69 66 53 74 61 63 6b 3b 0a 20  pIf = ifStack;. 
ffd0: 20 20 20 69 66 28 20 70 49 66 2d 3e 7a 43 6f 6e     if( pIf->zCon
ffe0: 64 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  dition ){.      
fff0: 69 66 53 74 61 63 6b 20 3d 20 69 66 53 74 61 63  ifStack = ifStac
10000 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  k->pNext;.      
10010 50 75 73 68 49 66 4d 61 63 72 6f 28 22 21 22 2c  PushIfMacro("!",
10020 70 49 66 2d 3e 7a 43 6f 6e 64 69 74 69 6f 6e 2c  pIf->zCondition,
10030 73 74 72 6c 65 6e 28 70 49 66 2d 3e 7a 43 6f 6e  strlen(pIf->zCon
10040 64 69 74 69 6f 6e 29 2c 70 49 66 2d 3e 6e 4c 69  dition),pIf->nLi
10050 6e 65 2c 30 29 3b 0a 20 20 20 20 20 20 53 61 66  ne,0);.      Saf
10060 65 46 72 65 65 28 70 49 66 29 3b 0a 20 20 20 20  eFree(pIf);.    
10070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 66  }else{.      pIf
10080 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  ->flags = 0;.   
10090 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
100a0 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 64  /*.    ** This d
100b0 69 72 65 63 74 69 76 65 20 63 61 6e 20 62 65 20  irective can be 
100c0 73 61 66 65 6c 79 20 69 67 6e 6f 72 65 64 0a 20  safely ignored. 
100d0 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e     */.    return
100e0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20   0;.  }..  /*.  
100f0 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 74 68 65  ** Recompute the
10100 20 70 72 65 73 65 74 20 66 6c 61 67 73 0a 20 20   preset flags.  
10110 2a 2f 0a 20 20 2a 70 50 72 65 73 65 74 46 6c 61  */.  *pPresetFla
10120 67 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 49  gs = 0;.  for(pI
10130 66 20 3d 20 69 66 53 74 61 63 6b 3b 20 70 49 66  f = ifStack; pIf
10140 3b 20 70 49 66 3d 70 49 66 2d 3e 70 4e 65 78 74  ; pIf=pIf->pNext
10150 29 7b 0a 20 20 20 20 2a 70 50 72 65 73 65 74 46  ){.    *pPresetF
10160 6c 61 67 73 20 7c 3d 20 70 49 66 2d 3e 66 6c 61  lags |= pIf->fla
10170 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  gs;.  }..  retur
10180 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nErr;.}../*.**
10190 20 50 61 72 73 65 20 61 6e 20 65 6e 74 69 72 65   Parse an entire
101a0 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74   file.  Return t
101b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
101c0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ors..**.** pList
101d0 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 6f   is a list of to
101e0 6b 65 6e 73 20 69 6e 20 74 68 65 20 66 69 6c 65  kens in the file
101f0 2e 20 20 57 68 69 74 65 73 70 61 63 65 20 74 6f  .  Whitespace to
10200 6b 65 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a  kens have been.*
10210 2a 20 65 6c 69 6d 69 6e 61 74 65 64 2c 20 61 6e  * eliminated, an
10220 64 20 74 65 78 74 20 77 69 74 68 20 7b 2e 2e 2e  d text with {...
10230 7d 20 68 61 73 20 62 65 65 6e 20 63 6f 6c 6c 61  } has been colla
10240 70 73 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73  psed into a.** s
10250 69 6e 67 6c 65 20 54 54 5f 42 72 61 63 65 20 74  ingle TT_Brace t
10260 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 69 74  oken..**.** init
10270 46 6c 61 67 73 20 61 72 65 20 61 20 73 65 74 20  Flags are a set 
10280 6f 66 20 70 61 72 73 65 20 66 6c 61 67 73 20 74  of parse flags t
10290 68 61 74 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  hat should alway
102a0 73 20 62 65 20 73 65 74 20 66 6f 72 20 74 68 69  s be set for thi
102b0 73 0a 2a 2a 20 66 69 6c 65 2e 20 20 46 6f 72 20  s.** file.  For 
102c0 2e 63 20 66 69 6c 65 73 20 74 68 69 73 20 69 73  .c files this is
102d0 20 6e 6f 72 6d 61 6c 6c 79 20 30 2e 20 20 46 6f   normally 0.  Fo
102e0 72 20 2e 68 20 66 69 6c 65 73 20 69 74 20 69 73  r .h files it is
102f0 20 50 53 5f 49 6e 74 65 72 66 61 63 65 2e 0a 2a   PS_Interface..*
10300 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 50 61 72  /.static int Par
10310 73 65 46 69 6c 65 28 54 6f 6b 65 6e 20 2a 70 4c  seFile(Token *pL
10320 69 73 74 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61  ist, int initFla
10330 67 73 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20  gs){.  int nErr 
10340 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  = 0;.  Token *pS
10350 74 61 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  tart = 0;.  int 
10360 66 6c 61 67 73 20 3d 20 69 6e 69 74 46 6c 61 67  flags = initFlag
10370 73 3b 0a 20 20 69 6e 74 20 70 72 65 73 65 74 46  s;.  int presetF
10380 6c 61 67 73 20 3d 20 69 6e 69 74 46 6c 61 67 73  lags = initFlags
10390 3b 0a 20 20 69 6e 74 20 72 65 73 65 74 46 6c 61  ;.  int resetFla
103a0 67 20 3d 20 30 3b 0a 0a 20 20 69 6e 63 6c 75 64  g = 0;..  includ
103b0 65 4c 69 73 74 20 3d 20 30 3b 0a 20 20 77 68 69  eList = 0;.  whi
103c0 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  le( pList ){.   
103d0 20 73 77 69 74 63 68 28 20 70 4c 69 73 74 2d 3e   switch( pList->
103e0 65 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  eType ){.    cas
103f0 65 20 54 54 5f 45 4f 46 3a 0a 20 20 20 20 20 20  e TT_EOF:.      
10400 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 6c 6f 6f 70  goto end_of_loop
10410 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 54 5f 50  ;..    case TT_P
10420 72 65 70 72 6f 63 65 73 73 6f 72 3a 0a 20 20 20  reprocessor:.   
10430 20 20 20 6e 45 72 72 20 2b 3d 20 50 61 72 73 65     nErr += Parse
10440 50 72 65 70 72 6f 63 65 73 73 6f 72 28 70 4c 69  Preprocessor(pLi
10450 73 74 2c 66 6c 61 67 73 2c 26 70 72 65 73 65 74  st,flags,&preset
10460 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 70 53  Flags);.      pS
10470 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  tart = 0;.      
10480 70 72 65 73 65 74 46 6c 61 67 73 20 7c 3d 20 69  presetFlags |= i
10490 6e 69 74 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  nitFlags;.      
104a0 66 6c 61 67 73 20 3d 20 70 72 65 73 65 74 46 6c  flags = presetFl
104b0 61 67 73 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ags;.      break
104c0 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 54 5f 4f  ;..    case TT_O
104d0 74 68 65 72 3a 0a 20 20 20 20 20 20 73 77 69 74  ther:.      swit
104e0 63 68 28 20 70 4c 69 73 74 2d 3e 7a 54 65 78 74  ch( pList->zText
104f0 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73  [0] ){.      cas
10500 65 20 27 3b 27 3a 0a 20 20 20 20 20 20 20 20 6e  e ';':.        n
10510 45 72 72 20 2b 3d 20 50 72 6f 63 65 73 73 44 65  Err += ProcessDe
10520 63 6c 28 70 53 74 61 72 74 2c 70 4c 69 73 74 2c  cl(pStart,pList,
10530 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
10540 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20  pStart = 0;.    
10550 20 20 20 20 66 6c 61 67 73 20 3d 20 70 72 65 73      flags = pres
10560 65 74 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  etFlags;.       
10570 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
10580 61 73 65 20 27 3d 27 3a 0a 20 20 20 20 20 20 20  ase '=':.       
10590 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 50 72 65   if( pList->pPre
105a0 76 2d 3e 6e 54 65 78 74 3d 3d 38 0a 20 20 20 20  v->nText==8.    
105b0 20 20 20 20 20 20 20 20 26 26 20 73 74 72 6e 63          && strnc
105c0 6d 70 28 70 4c 69 73 74 2d 3e 70 50 72 65 76 2d  mp(pList->pPrev-
105d0 3e 7a 54 65 78 74 2c 22 6f 70 65 72 61 74 6f 72  >zText,"operator
105e0 22 2c 38 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",8)==0 ){.     
105f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10600 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 45      }.        nE
10610 72 72 20 2b 3d 20 50 72 6f 63 65 73 73 44 65 63  rr += ProcessDec
10620 6c 28 70 53 74 61 72 74 2c 70 4c 69 73 74 2c 66  l(pStart,pList,f
10630 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 70  lags);.        p
10640 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  Start = 0;.     
10650 20 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20     while( pList 
10660 26 26 20 70 4c 69 73 74 2d 3e 7a 54 65 78 74 5b  && pList->zText[
10670 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 20  0]!=';' ){.     
10680 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69       pList = pLi
10690 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
106a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
106b0 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
106c0 20 65 6e 64 5f 6f 66 5f 6c 6f 6f 70 3b 0a 20 20   end_of_loop;.  
106d0 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 70 72        flags = pr
106e0 65 73 65 74 46 6c 61 67 73 3b 0a 20 20 20 20 20  esetFlags;.     
106f0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
10700 20 63 61 73 65 20 27 3a 27 3a 0a 20 20 20 20 20   case ':':.     
10710 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 7a 54     if( pList->zT
10720 65 78 74 5b 31 5d 3d 3d 27 3a 27 20 29 7b 0a 20  ext[1]==':' ){. 
10730 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
10740 3d 20 50 53 5f 4d 65 74 68 6f 64 3b 0a 20 20 20  = PS_Method;.   
10750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
10760 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66  reak;..      def
10770 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 62 72  ault:.        br
10780 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
10790 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
107a0 61 73 65 20 54 54 5f 42 72 61 63 65 73 3a 0a 20  ase TT_Braces:. 
107b0 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 50 72 6f       nErr += Pro
107c0 63 65 73 73 50 72 6f 63 65 64 75 72 65 44 65 66  cessProcedureDef
107d0 28 70 53 74 61 72 74 2c 70 4c 69 73 74 2c 66 6c  (pStart,pList,fl
107e0 61 67 73 29 3b 0a 20 20 20 20 20 20 70 53 74 61  ags);.      pSta
107f0 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6c  rt = 0;.      fl
10800 61 67 73 20 3d 20 70 72 65 73 65 74 46 6c 61 67  ags = presetFlag
10810 73 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  s;.      break;.
10820 0a 20 20 20 20 63 61 73 65 20 54 54 5f 49 64 3a  .    case TT_Id:
10830 0a 20 20 20 20 20 20 20 69 66 28 20 70 53 74 61  .       if( pSta
10840 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rt==0 ){.       
10850 20 20 20 70 53 74 61 72 74 20 3d 20 70 4c 69 73     pStart = pLis
10860 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  t;.          fla
10870 67 73 20 3d 20 70 72 65 73 65 74 46 6c 61 67 73  gs = presetFlags
10880 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
10890 20 20 72 65 73 65 74 46 6c 61 67 20 3d 20 30 3b    resetFlag = 0;
108a0 0a 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20  .       switch( 
108b0 70 4c 69 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 20  pList->zText[0] 
108c0 29 7b 0a 20 20 20 20 20 20 20 63 61 73 65 20 27  ){.       case '
108d0 63 27 3a 0a 20 20 20 20 20 20 20 20 20 69 66 28  c':.         if(
108e0 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 35   pList->nText==5
108f0 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 73   && strncmp(pLis
10900 74 2d 3e 7a 54 65 78 74 2c 22 63 6c 61 73 73 22  t->zText,"class"
10910 2c 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,5)==0 ){.      
10920 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 50 72 6f       nErr += Pro
10930 63 65 73 73 54 79 70 65 44 65 63 6c 28 70 4c 69  cessTypeDecl(pLi
10940 73 74 2c 66 6c 61 67 73 2c 26 72 65 73 65 74 46  st,flags,&resetF
10950 6c 61 67 29 3b 0a 20 20 20 20 20 20 20 20 20 7d  lag);.         }
10960 0a 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  .         break;
10970 0a 0a 20 20 20 20 20 20 20 63 61 73 65 20 27 45  ..       case 'E
10980 27 3a 0a 20 20 20 20 20 20 20 20 20 69 66 28 20  ':.         if( 
10990 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 36 20  pList->nText==6 
109a0 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74  && strncmp(pList
109b0 2d 3e 7a 54 65 78 74 2c 22 45 58 50 4f 52 54 22  ->zText,"EXPORT"
109c0 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,6)==0 ){.      
109d0 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 50 53       flags |= PS
109e0 5f 45 78 70 6f 72 74 32 3b 0a 20 20 20 20 20 20  _Export2;.      
109f0 20 20 20 20 20 2f 2a 20 70 53 74 61 72 74 20 3d       /* pStart =
10a00 20 30 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   0; */.         
10a10 7d 0a 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  }.         break
10a20 3b 0a 0a 20 20 20 20 20 20 20 63 61 73 65 20 27  ;..       case '
10a30 65 27 3a 0a 20 20 20 20 20 20 20 20 20 69 66 28  e':.         if(
10a40 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 34   pList->nText==4
10a50 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 73   && strncmp(pLis
10a60 74 2d 3e 7a 54 65 78 74 2c 22 65 6e 75 6d 22 2c  t->zText,"enum",
10a70 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)==0 ){.       
10a80 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
10a90 4e 65 78 74 20 26 26 20 70 4c 69 73 74 2d 3e 70  Next && pList->p
10aa0 4e 65 78 74 2d 3e 65 54 79 70 65 3d 3d 54 54 5f  Next->eType==TT_
10ab0 42 72 61 63 65 73 20 29 7b 0a 20 20 20 20 20 20  Braces ){.      
10ac0 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70         pList = p
10ad0 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
10ae0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
10af0 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 72 72              nErr
10b00 20 2b 3d 20 50 72 6f 63 65 73 73 54 79 70 65 44   += ProcessTypeD
10b10 65 63 6c 28 70 4c 69 73 74 2c 66 6c 61 67 73 2c  ecl(pList,flags,
10b20 26 72 65 73 65 74 46 6c 61 67 29 3b 0a 20 20 20  &resetFlag);.   
10b30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10b40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69     }else if( pLi
10b50 73 74 2d 3e 6e 54 65 78 74 3d 3d 36 20 26 26 20  st->nText==6 && 
10b60 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 7a  strncmp(pList->z
10b70 54 65 78 74 2c 22 65 78 74 65 72 6e 22 2c 36 29  Text,"extern",6)
10b80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10b90 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
10ba0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
10bb0 20 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20     if( pList && 
10bc0 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 33 20  pList->nText==3 
10bd0 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74  && strncmp(pList
10be0 2d 3e 7a 54 65 78 74 2c 22 5c 22 43 5c 22 22 2c  ->zText,"\"C\"",
10bf0 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  3)==0 ){.       
10c00 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c        pList = pL
10c10 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
10c20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26           flags &
10c30 3d 20 7e 44 50 5f 43 70 6c 75 73 70 6c 75 73 3b  = ~DP_Cplusplus;
10c40 0a 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  .           }els
10c50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
10c60 66 6c 61 67 73 20 7c 3d 20 50 53 5f 45 78 74 65  flags |= PS_Exte
10c70 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d  rn;.           }
10c80 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 61  .           pSta
10c90 72 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  rt = pList;.    
10ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10cb0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 63  break;..       c
10cc0 61 73 65 20 27 69 27 3a 0a 20 20 20 20 20 20 20  ase 'i':.       
10cd0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65    if( pList->nTe
10ce0 78 74 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d 70  xt==6 && strncmp
10cf0 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 22 69  (pList->zText,"i
10d00 6e 6c 69 6e 65 22 2c 36 29 3d 3d 30 0a 20 20 20  nline",6)==0.   
10d10 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73         && (flags
10d20 20 26 20 50 53 5f 53 74 61 74 69 63 29 3d 3d 30   & PS_Static)==0
10d30 0a 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  .         ){.   
10d40 20 20 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20          nErr += 
10d50 50 72 6f 63 65 73 73 49 6e 6c 69 6e 65 50 72 6f  ProcessInlinePro
10d60 63 28 70 4c 69 73 74 2c 66 6c 61 67 73 2c 26 72  c(pList,flags,&r
10d70 65 73 65 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  esetFlag);.     
10d80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 62      }.         b
10d90 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 63 61  reak;..       ca
10da0 73 65 20 27 4c 27 3a 0a 20 20 20 20 20 20 20 20  se 'L':.        
10db0 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78   if( pList->nTex
10dc0 74 3d 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28  t==5 && strncmp(
10dd0 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 22 4c 4f  pList->zText,"LO
10de0 43 41 4c 22 2c 35 29 3d 3d 30 20 29 7b 0a 20 20  CAL",5)==0 ){.  
10df0 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
10e00 3d 20 50 53 5f 4c 6f 63 61 6c 32 3b 0a 20 20 20  = PS_Local2;.   
10e10 20 20 20 20 20 20 20 20 70 53 74 61 72 74 20 3d          pStart =
10e20 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   pList;.        
10e30 20 7d 0a 20 20 20 20 20 20 20 20 20 62 72 65 61   }.         brea
10e40 6b 3b 0a 0a 20 20 20 20 20 20 20 63 61 73 65 20  k;..       case 
10e50 27 50 27 3a 0a 20 20 20 20 20 20 20 20 20 69 66  'P':.         if
10e60 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d  ( pList->nText==
10e70 36 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69  6 && strncmp(pLi
10e80 73 74 2d 3e 7a 54 65 78 74 2c 20 22 50 55 42 4c  st->zText, "PUBL
10e90 49 43 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20  IC",6)==0 ){.   
10ea0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
10eb0 20 50 53 5f 50 75 62 6c 69 63 3b 0a 20 20 20 20   PS_Public;.    
10ec0 20 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20         pStart = 
10ed0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  pList;.         
10ee0 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d  }else if( pList-
10ef0 3e 6e 54 65 78 74 3d 3d 37 20 26 26 20 73 74 72  >nText==7 && str
10f00 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78  ncmp(pList->zTex
10f10 74 2c 20 22 50 52 49 56 41 54 45 22 2c 37 29 3d  t, "PRIVATE",7)=
10f20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10f30 20 66 6c 61 67 73 20 7c 3d 20 50 53 5f 50 72 69   flags |= PS_Pri
10f40 76 61 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20  vate;.          
10f50 20 70 53 74 61 72 74 20 3d 20 70 4c 69 73 74 3b   pStart = pList;
10f60 0a 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  .         }else 
10f70 69 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74  if( pList->nText
10f80 3d 3d 39 20 26 26 20 73 74 72 6e 63 6d 70 28 70  ==9 && strncmp(p
10f90 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 22 50 52 4f  List->zText,"PRO
10fa0 54 45 43 54 45 44 22 2c 39 29 3d 3d 30 20 29 7b  TECTED",9)==0 ){
10fb0 0a 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  .           flag
10fc0 73 20 7c 3d 20 50 53 5f 50 72 6f 74 65 63 74 65  s |= PS_Protecte
10fd0 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  d;.           pS
10fe0 74 61 72 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  tart = pList;.  
10ff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11000 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
11010 20 63 61 73 65 20 27 73 27 3a 0a 20 20 20 20 20   case 's':.     
11020 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
11030 54 65 78 74 3d 3d 36 20 26 26 20 73 74 72 6e 63  Text==6 && strnc
11040 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c  mp(pList->zText,
11050 22 73 74 72 75 63 74 22 2c 36 29 3d 3d 30 20 29  "struct",6)==0 )
11060 7b 0a 20 20 20 20 20 20 20 20 20 20 20 69 66 28  {.           if(
11070 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 26 26   pList->pNext &&
11080 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 2d 3e 65   pList->pNext->e
11090 54 79 70 65 3d 3d 54 54 5f 42 72 61 63 65 73 20  Type==TT_Braces 
110a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
110b0 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
110c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
110d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
110e0 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 50 72 6f       nErr += Pro
110f0 63 65 73 73 54 79 70 65 44 65 63 6c 28 70 4c 69  cessTypeDecl(pLi
11100 73 74 2c 66 6c 61 67 73 2c 26 72 65 73 65 74 46  st,flags,&resetF
11110 6c 61 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lag);.          
11120 20 7d 0a 20 20 20 20 20 20 20 20 20 7d 65 6c 73   }.         }els
11130 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65  e if( pList->nTe
11140 78 74 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d 70  xt==6 && strncmp
11150 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 22 73  (pList->zText,"s
11160 74 61 74 69 63 22 2c 36 29 3d 3d 30 20 29 7b 0a  tatic",6)==0 ){.
11170 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73             flags
11180 20 7c 3d 20 50 53 5f 53 74 61 74 69 63 3b 0a 20   |= PS_Static;. 
11190 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
111a0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
111b0 20 20 63 61 73 65 20 27 74 27 3a 0a 20 20 20 20    case 't':.    
111c0 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
111d0 6e 54 65 78 74 3d 3d 37 20 26 26 20 73 74 72 6e  nText==7 && strn
111e0 63 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74  cmp(pList->zText
111f0 2c 22 74 79 70 65 64 65 66 22 2c 37 29 3d 3d 30  ,"typedef",7)==0
11200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 66   ){.           f
11210 6c 61 67 73 20 7c 3d 20 50 53 5f 54 79 70 65 64  lags |= PS_Typed
11220 65 66 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20  ef;.         }. 
11230 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
11240 20 20 20 20 20 20 20 63 61 73 65 20 27 75 27 3a         case 'u':
11250 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  .         if( pL
11260 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 35 20 26 26  ist->nText==5 &&
11270 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d 3e   strncmp(pList->
11280 7a 54 65 78 74 2c 22 75 6e 69 6f 6e 22 2c 35 29  zText,"union",5)
11290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
112a0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 4e 65    if( pList->pNe
112b0 78 74 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  xt && pList->pNe
112c0 78 74 2d 3e 65 54 79 70 65 3d 3d 54 54 5f 42 72  xt->eType==TT_Br
112d0 61 63 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  aces ){.        
112e0 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69       pList = pLi
112f0 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
11300 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11310 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 20 2b            nErr +
11320 3d 20 50 72 6f 63 65 73 73 54 79 70 65 44 65 63  = ProcessTypeDec
11330 6c 28 70 4c 69 73 74 2c 66 6c 61 67 73 2c 26 72  l(pList,flags,&r
11340 65 73 65 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  esetFlag);.     
11350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11360 20 7d 0a 20 20 20 20 20 20 20 20 20 62 72 65 61   }.         brea
11370 6b 3b 0a 0a 20 20 20 20 20 20 20 64 65 66 61 75  k;..       defau
11380 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 62 72 65  lt:.         bre
11390 61 6b 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  ak;.       }.   
113a0 20 20 20 20 69 66 28 20 72 65 73 65 74 46 6c 61      if( resetFla
113b0 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=0 ){.        
113c0 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26   while( pList &&
113d0 20 70 4c 69 73 74 2d 3e 7a 54 65 78 74 5b 30 5d   pList->zText[0]
113e0 21 3d 72 65 73 65 74 46 6c 61 67 20 29 7b 0a 20  !=resetFlag ){. 
113f0 20 20 20 20 20 20 20 20 20 20 70 4c 69 73 74 20            pList 
11400 3d 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  = pList->pNext;.
11410 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11420 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
11430 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 6c   ) goto end_of_l
11440 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 70 53  oop;.         pS
11450 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  tart = 0;.      
11460 20 20 20 66 6c 61 67 73 20 3d 20 70 72 65 73 65     flags = prese
11470 74 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 7d  tFlags;.       }
11480 0a 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  .       break;..
11490 20 20 20 20 63 61 73 65 20 54 54 5f 53 74 72 69      case TT_Stri
114a0 6e 67 3a 0a 20 20 20 20 63 61 73 65 20 54 54 5f  ng:.    case TT_
114b0 4e 75 6d 62 65 72 3a 0a 20 20 20 20 20 20 20 62  Number:.       b
114c0 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
114d0 6c 74 3a 0a 20 20 20 20 20 20 20 70 53 74 61 72  lt:.       pStar
114e0 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  t = pList;.     
114f0 20 20 66 6c 61 67 73 20 3d 20 70 72 65 73 65 74    flags = preset
11500 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 62 72  Flags;.       br
11510 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
11520 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 4e  List = pList->pN
11530 65 78 74 3b 0a 20 20 7d 0a 20 20 65 6e 64 5f 6f  ext;.  }.  end_o
11540 66 5f 6c 6f 6f 70 3a 0a 0a 20 20 2f 2a 20 56 65  f_loop:..  /* Ve
11550 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 23 69  rify that all #i
11560 66 73 20 68 61 76 65 20 61 20 6d 61 74 63 68 69  fs have a matchi
11570 6e 67 20 22 23 65 6e 64 69 66 22 20 2a 2f 0a 20  ng "#endif" */. 
11580 20 77 68 69 6c 65 28 20 69 66 53 74 61 63 6b 20   while( ifStack 
11590 29 7b 0a 20 20 20 20 49 66 6d 61 63 72 6f 20 2a  ){.    Ifmacro *
115a0 70 49 66 20 3d 20 69 66 53 74 61 63 6b 3b 0a 20  pIf = ifStack;. 
115b0 20 20 20 69 66 53 74 61 63 6b 20 3d 20 70 49 66     ifStack = pIf
115c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 66 70 72  ->pNext;.    fpr
115d0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
115e0 25 64 3a 20 54 68 69 73 20 27 23 69 66 27 20 68  %d: This '#if' h
115f0 61 73 20 6e 6f 20 27 23 65 6e 64 69 66 27 5c 6e  as no '#endif'\n
11600 22 2c 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  ",zFilename,.   
11610 20 20 20 70 49 66 2d 3e 6e 4c 69 6e 65 29 3b 0a     pIf->nLine);.
11620 20 20 20 20 53 61 66 65 46 72 65 65 28 70 49 66      SafeFree(pIf
11630 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
11640 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nErr;.}../*.** 
11650 49 66 20 74 68 65 20 67 69 76 65 6e 20 44 65 63  If the given Dec
11660 6c 20 6f 62 6a 65 63 74 20 68 61 73 20 61 20 6e  l object has a n
11670 6f 6e 2d 6e 75 6c 6c 20 7a 45 78 74 72 61 20 66  on-null zExtra f
11680 69 65 6c 64 2c 20 74 68 65 6e 20 74 68 65 20 74  ield, then the t
11690 65 78 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 7a  ext.** of that z
116a0 45 78 74 72 61 20 66 69 65 6c 64 20 6e 65 65 64  Extra field need
116b0 73 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  s to be inserted
116c0 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
116d0 66 20 74 68 65 0a 2a 2a 20 7a 44 65 63 6c 20 66  f the.** zDecl f
116e0 69 65 6c 64 20 62 65 66 6f 72 65 20 74 68 65 20  ield before the 
116f0 6c 61 73 74 20 22 7d 22 20 69 6e 20 74 68 65 20  last "}" in the 
11700 7a 44 65 63 6c 2e 20 20 54 68 69 73 20 72 6f 75  zDecl.  This rou
11710 74 69 6e 65 20 64 6f 65 73 20 74 68 61 74 2e 0a  tine does that..
11720 2a 2a 20 49 66 20 74 68 65 20 7a 45 78 74 72 61  ** If the zExtra
11730 20 69 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72   is NULL, this r
11740 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
11750 70 2e 0a 2a 2a 0a 2a 2a 20 7a 45 78 74 72 61 20  p..**.** zExtra 
11760 68 6f 6c 64 73 20 65 78 74 72 61 20 6d 65 74 68  holds extra meth
11770 6f 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20  od declarations 
11780 66 6f 72 20 63 6c 61 73 73 65 73 2e 20 20 54 68  for classes.  Th
11790 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 2a  e declarations.*
117a0 2a 20 68 61 76 65 20 74 6f 20 62 65 20 69 6e 73  * have to be ins
117b0 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 63  erted into the c
117c0 6c 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e  lass definition.
117d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
117e0 49 6e 73 65 72 74 45 78 74 72 61 44 65 63 6c 28  InsertExtraDecl(
117f0 44 65 63 6c 20 2a 70 44 65 63 6c 29 7b 0a 20 20  Decl *pDecl){.  
11800 69 6e 74 20 69 3b 0a 20 20 53 74 72 69 6e 67 20  int i;.  String 
11810 73 74 72 3b 0a 0a 20 20 69 66 28 20 70 44 65 63  str;..  if( pDec
11820 6c 3d 3d 30 20 7c 7c 20 70 44 65 63 6c 2d 3e 7a  l==0 || pDecl->z
11830 45 78 74 72 61 3d 3d 30 20 7c 7c 20 70 44 65 63  Extra==0 || pDec
11840 6c 2d 3e 7a 44 65 63 6c 3d 3d 30 20 29 20 72 65  l->zDecl==0 ) re
11850 74 75 72 6e 3b 0a 20 20 69 20 3d 20 73 74 72 6c  turn;.  i = strl
11860 65 6e 28 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 29  en(pDecl->zDecl)
11870 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 69   - 1;.  while( i
11880 3e 30 20 26 26 20 70 44 65 63 6c 2d 3e 7a 44 65  >0 && pDecl->zDe
11890 63 6c 5b 69 5d 21 3d 27 7d 27 20 29 7b 20 69 2d  cl[i]!='}' ){ i-
118a0 2d 3b 20 7d 0a 20 20 53 74 72 69 6e 67 49 6e 69  -; }.  StringIni
118b0 74 28 26 73 74 72 29 3b 0a 20 20 53 74 72 69 6e  t(&str);.  Strin
118c0 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
118d0 65 63 6c 2d 3e 7a 44 65 63 6c 2c 20 69 29 3b 0a  ecl->zDecl, i);.
118e0 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26    StringAppend(&
118f0 73 74 72 2c 20 70 44 65 63 6c 2d 3e 7a 45 78 74  str, pDecl->zExt
11900 72 61 2c 20 30 29 3b 0a 20 20 53 74 72 69 6e 67  ra, 0);.  String
11910 41 70 70 65 6e 64 28 26 73 74 72 2c 20 26 70 44  Append(&str, &pD
11920 65 63 6c 2d 3e 7a 44 65 63 6c 5b 69 5d 2c 20 30  ecl->zDecl[i], 0
11930 29 3b 0a 20 20 53 61 66 65 46 72 65 65 28 70 44  );.  SafeFree(pD
11940 65 63 6c 2d 3e 7a 44 65 63 6c 29 3b 0a 20 20 53  ecl->zDecl);.  S
11950 61 66 65 46 72 65 65 28 70 44 65 63 6c 2d 3e 7a  afeFree(pDecl->z
11960 45 78 74 72 61 29 3b 0a 20 20 70 44 65 63 6c 2d  Extra);.  pDecl-
11970 3e 7a 44 65 63 6c 20 3d 20 53 74 72 44 75 70 28  >zDecl = StrDup(
11980 53 74 72 69 6e 67 47 65 74 28 26 73 74 72 29 2c  StringGet(&str),
11990 20 30 29 3b 0a 20 20 53 74 72 69 6e 67 52 65 73   0);.  StringRes
119a0 65 74 28 26 73 74 72 29 3b 0a 20 20 70 44 65 63  et(&str);.  pDec
119b0 6c 2d 3e 7a 45 78 74 72 61 20 3d 20 30 3b 0a 7d  l->zExtra = 0;.}
119c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
119d0 65 20 44 50 5f 46 6f 72 77 61 72 64 20 61 6e 64  e DP_Forward and
119e0 20 44 50 5f 44 65 63 6c 61 72 65 64 20 66 6c 61   DP_Declared fla
119f0 67 73 20 6f 6e 20 61 6c 6c 20 44 65 63 6c 20 73  gs on all Decl s
11a00 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20 53 65  tructures..** Se
11a10 74 20 62 6f 74 68 20 66 6c 61 67 73 20 66 6f 72  t both flags for
11a20 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69   anything that i
11a30 73 20 74 61 67 67 65 64 20 61 73 20 6c 6f 63 61  s tagged as loca
11a40 6c 20 61 6e 64 20 69 73 6e 27 74 0a 2a 2a 20 69  l and isn't.** i
11a50 6e 20 74 68 65 20 66 69 6c 65 20 7a 46 69 6c 65  n the file zFile
11a60 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
11a70 77 6f 6e 27 74 20 62 65 20 70 72 69 6e 74 69 6e  won't be printin
11a80 67 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  g in other files
11a90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11aa0 20 52 65 73 65 74 44 65 63 6c 46 6c 61 67 73 28   ResetDeclFlags(
11ab0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
11ac0 7b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63 6c 3b  {.  Decl *pDecl;
11ad0 0a 0a 20 20 66 6f 72 28 70 44 65 63 6c 20 3d 20  ..  for(pDecl = 
11ae0 70 44 65 63 6c 46 69 72 73 74 3b 20 70 44 65 63  pDeclFirst; pDec
11af0 6c 3b 20 70 44 65 63 6c 20 3d 20 70 44 65 63 6c  l; pDecl = pDecl
11b00 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 44 65  ->pNext){.    De
11b10 63 6c 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  clClearProperty(
11b20 70 44 65 63 6c 2c 44 50 5f 46 6f 72 77 61 72 64  pDecl,DP_Forward
11b30 7c 44 50 5f 44 65 63 6c 61 72 65 64 29 3b 0a 20  |DP_Declared);. 
11b40 20 20 20 69 66 28 20 44 65 63 6c 48 61 73 50 72     if( DeclHasPr
11b50 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f  operty(pDecl,DP_
11b60 4c 6f 63 61 6c 29 20 26 26 20 70 44 65 63 6c 2d  Local) && pDecl-
11b70 3e 7a 46 69 6c 65 21 3d 7a 46 69 6c 65 6e 61 6d  >zFile!=zFilenam
11b80 65 20 29 7b 0a 20 20 20 20 20 20 44 65 63 6c 53  e ){.      DeclS
11b90 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c  etProperty(pDecl
11ba0 2c 44 50 5f 46 6f 72 77 61 72 64 7c 44 50 5f 44  ,DP_Forward|DP_D
11bb0 65 63 6c 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  eclared);.    }.
11bc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72    }.}../*.** For
11bd0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
11be0 20 6f 66 20 74 68 65 20 53 63 61 6e 54 65 78 74   of the ScanText
11bf0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
11c00 73 74 61 74 69 63 20 76 6f 69 64 20 53 63 61 6e  static void Scan
11c10 54 65 78 74 28 63 6f 6e 73 74 20 63 68 61 72 2a  Text(const char*
11c20 2c 20 47 65 6e 53 74 61 74 65 20 2a 70 53 74 61  , GenState *pSta
11c30 74 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  te);../*.** The 
11c40 6f 75 74 70 75 74 20 69 6e 20 70 53 74 72 20 69  output in pStr i
11c50 73 20 63 75 72 72 65 6e 74 6c 79 20 77 69 74 68  s currently with
11c60 69 6e 20 61 6e 20 23 69 66 20 43 4f 4e 54 45 58  in an #if CONTEX
11c70 54 20 77 68 65 72 65 20 63 6f 6e 74 65 78 74 0a  T where context.
11c80 2a 2a 20 69 73 20 65 71 75 61 6c 20 74 6f 20 2a  ** is equal to *
11c90 70 7a 49 66 2e 20 20 28 2a 70 7a 49 66 20 6d 69  pzIf.  (*pzIf mi
11ca0 67 68 74 20 62 65 20 4e 55 4c 4c 20 74 6f 20 69  ght be NULL to i
11cb0 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65 20  ndicate that we 
11cc0 61 72 65 0a 2a 2a 20 6e 6f 74 20 77 69 74 68 69  are.** not withi
11cd0 6e 20 61 6e 79 20 23 69 66 20 61 74 20 74 68 65  n any #if at the
11ce0 20 6d 6f 6d 65 6e 74 2e 29 20 20 57 65 20 61 72   moment.)  We ar
11cf0 65 20 67 65 74 74 69 6e 67 20 72 65 61 64 79 20  e getting ready 
11d00 74 6f 20 6f 75 74 70 75 74 0a 2a 2a 20 73 6f 6d  to output.** som
11d10 65 20 74 65 78 74 20 74 68 61 74 20 6e 65 65 64  e text that need
11d20 73 20 74 6f 20 62 65 20 77 69 74 68 69 6e 20 74  s to be within t
11d30 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 22 23  he context of "#
11d40 69 66 20 4e 45 57 22 20 77 68 65 72 65 0a 2a 2a  if NEW" where.**
11d50 20 4e 45 57 20 69 73 20 7a 49 66 2e 20 20 4d 61   NEW is zIf.  Ma
11d60 6b 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ke an appropriat
11d70 65 20 63 68 61 6e 67 65 20 74 6f 20 74 68 65 20  e change to the 
11d80 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74  context..*/.stat
11d90 69 63 20 76 6f 69 64 20 43 68 61 6e 67 65 49 66  ic void ChangeIf
11da0 43 6f 6e 74 65 78 74 28 0a 20 20 63 6f 6e 73 74  Context(.  const
11db0 20 63 68 61 72 20 2a 7a 49 66 2c 20 20 20 20 20   char *zIf,     
11dc0 20 20 2f 2a 20 54 68 65 20 64 65 73 69 72 65 64    /* The desired
11dd0 20 23 69 66 20 63 6f 6e 74 65 78 74 20 2a 2f 0a   #if context */.
11de0 20 20 47 65 6e 53 74 61 74 65 20 2a 70 53 74 61    GenState *pSta
11df0 74 65 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72  te       /* Curr
11e00 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
11e10 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
11e20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 7a 49 66 3d  */.){.  if( zIf=
11e30 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  =0 ){.    if( pS
11e40 74 61 74 65 2d 3e 7a 49 66 3d 3d 30 20 29 20 72  tate->zIf==0 ) r
11e50 65 74 75 72 6e 3b 0a 20 20 20 20 53 74 72 69 6e  eturn;.    Strin
11e60 67 41 70 70 65 6e 64 28 70 53 74 61 74 65 2d 3e  gAppend(pState->
11e70 70 53 74 72 2c 22 23 65 6e 64 69 66 5c 6e 22 2c  pStr,"#endif\n",
11e80 30 29 3b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e  0);.    pState->
11e90 7a 49 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  zIf = 0;.  }else
11ea0 7b 0a 20 20 20 20 69 66 28 20 70 53 74 61 74 65  {.    if( pState
11eb0 2d 3e 7a 49 66 20 29 7b 0a 20 20 20 20 20 20 69  ->zIf ){.      i
11ec0 66 28 20 73 74 72 63 6d 70 28 7a 49 66 2c 70 53  f( strcmp(zIf,pS
11ed0 74 61 74 65 2d 3e 7a 49 66 29 3d 3d 30 20 29 20  tate->zIf)==0 ) 
11ee0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 53 74  return;.      St
11ef0 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61 74  ringAppend(pStat
11f00 65 2d 3e 70 53 74 72 2c 22 23 65 6e 64 69 66 5c  e->pStr,"#endif\
11f10 6e 22 2c 30 29 3b 0a 20 20 20 20 20 20 70 53 74  n",0);.      pSt
11f20 61 74 65 2d 3e 7a 49 66 20 3d 20 30 3b 0a 20 20  ate->zIf = 0;.  
11f30 20 20 7d 0a 20 20 20 20 53 63 61 6e 54 65 78 74    }.    ScanText
11f40 28 7a 49 66 2c 20 70 53 74 61 74 65 29 3b 0a 20  (zIf, pState);. 
11f50 20 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 7a     if( pState->z
11f60 49 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  If!=0 ){.      S
11f70 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61  tringAppend(pSta
11f80 74 65 2d 3e 70 53 74 72 2c 22 23 65 6e 64 69 66  te->pStr,"#endif
11f90 5c 6e 22 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20  \n",0);.    }.  
11fa0 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 70    StringAppend(p
11fb0 53 74 61 74 65 2d 3e 70 53 74 72 2c 22 23 69 66  State->pStr,"#if
11fc0 20 22 2c 30 29 3b 0a 20 20 20 20 53 74 72 69 6e   ",0);.    Strin
11fd0 67 41 70 70 65 6e 64 28 70 53 74 61 74 65 2d 3e  gAppend(pState->
11fe0 70 53 74 72 2c 7a 49 66 2c 30 29 3b 0a 20 20 20  pStr,zIf,0);.   
11ff0 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53   StringAppend(pS
12000 74 61 74 65 2d 3e 70 53 74 72 2c 22 5c 6e 22 2c  tate->pStr,"\n",
12010 30 29 3b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e  0);.    pState->
12020 7a 49 66 20 3d 20 7a 49 66 3b 0a 20 20 7d 0a 7d  zIf = zIf;.  }.}
12030 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 6f 20 74  ../*.** Add to t
12040 68 65 20 73 74 72 69 6e 67 20 70 53 74 72 20 61  he string pStr a
12050 20 23 69 6e 63 6c 75 64 65 20 6f 66 20 65 76 65   #include of eve
12060 72 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c  ry file on the l
12070 69 73 74 20 6f 66 0a 2a 2a 20 69 6e 63 6c 75 64  ist of.** includ
12080 65 20 66 69 6c 65 73 20 70 49 6e 63 6c 75 64 65  e files pInclude
12090 2e 20 20 54 68 65 20 74 61 62 6c 65 20 70 54 61  .  The table pTa
120a0 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ble contains all
120b0 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 68   files that.** h
120c0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
120d0 20 23 69 6e 63 6c 75 64 65 64 20 61 74 20 6c 65   #included at le
120e0 61 73 74 20 6f 6e 63 65 2e 20 20 44 6f 6e 27 74  ast once.  Don't
120f0 20 61 64 64 20 61 6e 79 0a 2a 2a 20 64 75 70 6c   add any.** dupl
12100 69 63 61 74 65 73 2e 20 20 55 70 64 61 74 65 20  icates.  Update 
12110 70 54 61 62 6c 65 20 77 69 74 68 20 65 76 65 72  pTable with ever
12120 79 20 6e 65 77 20 23 69 6e 63 6c 75 64 65 20 74  y new #include t
12130 68 61 74 20 69 73 20 61 64 64 65 64 2e 0a 2a 2f  hat is added..*/
12140 0a 73 74 61 74 69 63 20 76 6f 69 64 20 41 64 64  .static void Add
12150 49 6e 63 6c 75 64 65 73 28 0a 20 20 49 6e 63 6c  Includes(.  Incl
12160 75 64 65 20 2a 70 49 6e 63 6c 75 64 65 2c 20 20  ude *pInclude,  
12170 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 65 76       /* Write ev
12180 65 72 79 20 23 69 6e 63 6c 75 64 65 20 6f 6e 20  ery #include on 
12190 74 68 69 73 20 6c 69 73 74 20 2a 2f 0a 20 20 47  this list */.  G
121a0 65 6e 53 74 61 74 65 20 2a 70 53 74 61 74 65 20  enState *pState 
121b0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
121c0 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
121d0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 2a  code generator *
121e0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 49 6e 63 6c  /.){.  if( pIncl
121f0 75 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ude ){.    if( p
12200 49 6e 63 6c 75 64 65 2d 3e 70 4e 65 78 74 20 29  Include->pNext )
12210 7b 0a 20 20 20 20 20 20 41 64 64 49 6e 63 6c 75  {.      AddInclu
12220 64 65 73 28 70 49 6e 63 6c 75 64 65 2d 3e 70 4e  des(pInclude->pN
12230 65 78 74 2c 70 53 74 61 74 65 29 3b 0a 20 20 20  ext,pState);.   
12240 20 7d 0a 20 20 20 20 69 66 28 20 49 64 65 6e 74   }.    if( Ident
12250 54 61 62 6c 65 49 6e 73 65 72 74 28 70 53 74 61  TableInsert(pSta
12260 74 65 2d 3e 70 54 61 62 6c 65 2c 70 49 6e 63 6c  te->pTable,pIncl
12270 75 64 65 2d 3e 7a 4c 61 62 65 6c 2c 30 29 20 29  ude->zLabel,0) )
12280 7b 0a 20 20 20 20 20 20 43 68 61 6e 67 65 49 66  {.      ChangeIf
12290 43 6f 6e 74 65 78 74 28 70 49 6e 63 6c 75 64 65  Context(pInclude
122a0 2d 3e 7a 49 66 2c 70 53 74 61 74 65 29 3b 0a 20  ->zIf,pState);. 
122b0 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e       StringAppen
122c0 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c 22  d(pState->pStr,"
122d0 23 69 6e 63 6c 75 64 65 20 22 2c 30 29 3b 0a 20  #include ",0);. 
122e0 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e       StringAppen
122f0 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c 70  d(pState->pStr,p
12300 49 6e 63 6c 75 64 65 2d 3e 7a 46 69 6c 65 2c 30  Include->zFile,0
12310 29 3b 0a 20 20 20 20 20 20 53 74 72 69 6e 67 41  );.      StringA
12320 70 70 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53  ppend(pState->pS
12330 74 72 2c 22 5c 6e 22 2c 31 29 3b 0a 20 20 20 20  tr,"\n",1);.    
12340 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
12350 64 64 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67  dd to the string
12360 20 70 53 74 72 20 61 20 64 65 63 6c 61 72 61 74   pStr a declarat
12370 69 6f 6e 20 66 6f 72 20 74 68 65 20 6f 62 6a 65  ion for the obje
12380 63 74 20 64 65 73 63 72 69 62 65 64 0a 2a 2a 20  ct described.** 
12390 69 6e 20 70 44 65 63 6c 2e 0a 2a 2a 0a 2a 2a 20  in pDecl..**.** 
123a0 49 66 20 70 44 65 63 6c 20 68 61 73 20 61 6c 72  If pDecl has alr
123b0 65 61 64 79 20 62 65 65 6e 20 64 65 63 6c 61 72  eady been declar
123c0 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2c  ed in this file,
123d0 20 64 65 74 65 63 74 20 74 68 61 74 0a 2a 2a 20   detect that.** 
123e0 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 20 65  fact and abort e
123f0 61 72 6c 79 2e 20 20 44 6f 20 6e 6f 74 20 64 75  arly.  Do not du
12400 70 6c 69 63 61 74 65 20 61 20 64 65 63 6c 61 72  plicate a declar
12410 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
12420 74 68 65 20 6e 65 65 64 46 75 6c 6c 44 65 63 6c  the needFullDecl
12430 20 66 6c 61 67 20 69 73 20 66 61 6c 73 65 20 61   flag is false a
12440 6e 64 20 74 68 69 73 20 6f 62 6a 65 63 74 20 68  nd this object h
12450 61 73 20 61 20 66 6f 72 77 61 72 64 0a 2a 2a 20  as a forward.** 
12460 64 65 63 6c 61 72 61 74 69 6f 6e 2c 20 74 68 65  declaration, the
12470 6e 20 73 75 70 70 6c 79 20 74 68 65 20 66 6f 72  n supply the for
12480 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
12490 20 6f 6e 6c 79 2e 20 20 41 20 6c 61 74 65 72 0a   only.  A later.
124a0 2a 2a 20 63 61 6c 6c 20 74 6f 20 43 6f 6d 70 6c  ** call to Compl
124b0 65 74 65 46 6f 72 77 61 72 64 44 65 63 6c 61 72  eteForwardDeclar
124c0 61 74 69 6f 6e 73 28 29 20 77 69 6c 6c 20 66 69  ations() will fi
124d0 6e 69 73 68 20 74 68 65 20 64 65 63 6c 61 72 61  nish the declara
124e0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 75 73 2e 20  tion.** for us. 
124f0 20 42 75 74 20 69 66 20 6e 65 65 64 46 75 6c 6c   But if needFull
12500 44 65 63 6c 20 69 73 20 74 72 75 65 2c 20 77 65  Decl is true, we
12510 20 6d 75 73 74 20 73 75 70 70 6c 79 20 74 68 65   must supply the
12520 20 66 75 6c 6c 0a 2a 2a 20 64 65 63 6c 61 72 61   full.** declara
12530 74 69 6f 6e 20 6e 6f 77 2e 20 20 53 6f 6d 65 20  tion now.  Some 
12540 6f 62 6a 65 63 74 73 20 64 6f 20 6e 6f 74 20 68  objects do not h
12550 61 76 65 20 61 20 66 6f 72 77 61 72 64 20 64 65  ave a forward de
12560 63 6c 61 72 61 74 69 6f 6e 2e 0a 2a 2a 20 46 6f  claration..** Fo
12570 72 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c  r those objects,
12580 20 77 65 20 6d 75 73 74 20 70 72 69 6e 74 20 74   we must print t
12590 68 65 20 66 75 6c 6c 20 64 65 63 6c 61 72 61 74  he full declarat
125a0 69 6f 6e 20 6e 6f 77 2e 0a 2a 2a 0a 2a 2a 20 42  ion now..**.** B
125b0 65 63 61 75 73 65 20 69 74 20 69 73 20 69 6c 6c  ecause it is ill
125c0 65 67 61 6c 20 74 6f 20 64 75 70 6c 69 63 61 74  egal to duplicat
125d0 65 20 61 20 74 79 70 65 64 65 66 20 69 6e 20 43  e a typedef in C
125e0 2c 20 63 61 72 65 20 69 73 20 74 61 6b 65 6e 0a  , care is taken.
125f0 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 74 68 61  ** to insure tha
12600 74 20 74 79 70 65 64 65 66 73 20 66 6f 72 20 74  t typedefs for t
12610 68 65 20 73 61 6d 65 20 69 64 65 6e 74 69 66 69  he same identifi
12620 65 72 20 61 72 65 20 6f 6e 6c 79 20 69 73 73 75  er are only issu
12630 65 64 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  ed once..*/.stat
12640 69 63 20 76 6f 69 64 20 44 65 63 6c 61 72 65 4f  ic void DeclareO
12650 62 6a 65 63 74 28 0a 20 20 44 65 63 6c 20 2a 70  bject(.  Decl *p
12660 44 65 63 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Decl,        /* 
12670 54 68 65 20 74 68 69 6e 67 20 74 6f 20 62 65 20  The thing to be 
12680 64 65 63 6c 61 72 65 64 20 2a 2f 0a 20 20 47 65  declared */.  Ge
12690 6e 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  nState *pState, 
126a0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61    /* Current sta
126b0 74 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20 67  te of the code g
126c0 65 6e 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  enerator */.  in
126d0 74 20 6e 65 65 64 46 75 6c 6c 44 65 63 6c 20 20  t needFullDecl  
126e0 20 20 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 74    /* Must have t
126f0 68 65 20 66 75 6c 6c 20 64 65 63 6c 61 72 61 74  he full declarat
12700 69 6f 6e 2e 20 20 41 20 66 6f 72 77 61 72 64 0a  ion.  A forward.
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 20 20 20 20 20 20 2a 20 64 65 63 6c 61 72 61         * declara
12730 74 69 6f 6e 20 69 73 6e 27 74 20 65 6e 6f 75 67  tion isn't enoug
12740 68 20 2a 2f 0a 29 7b 0a 20 20 44 65 63 6c 20 2a  h */.){.  Decl *
12750 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
12760 20 2f 2a 20 54 68 65 20 6f 62 6a 65 63 74 20 74   /* The object t
12770 6f 20 62 65 20 64 65 63 6c 61 72 65 64 20 2a 2f  o be declared */
12780 0a 20 20 69 6e 74 20 66 6c 61 67 3b 0a 20 20 69  .  int flag;.  i
12790 6e 74 20 69 73 43 70 70 3b 20 20 20 20 20 20 20  nt isCpp;       
127a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
127b0 20 67 65 6e 65 72 61 74 69 6e 67 20 43 2b 2b 20   generating C++ 
127c0 2a 2f 0a 20 20 69 6e 74 20 64 6f 6e 65 54 79 70  */.  int doneTyp
127d0 65 64 65 66 20 3d 20 30 3b 20 20 20 2f 2a 20 54  edef = 0;   /* T
127e0 72 75 65 20 69 66 20 61 20 74 79 70 65 64 65 66  rue if a typedef
127f0 20 68 61 73 20 62 65 65 6e 20 64 6f 6e 65 20 66   has been done f
12800 6f 72 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  or this object *
12810 2f 0a 0a 20 20 2f 2a 20 70 72 69 6e 74 66 28 22  /..  /* printf("
12820 42 45 47 49 4e 20 25 73 20 6f 66 20 25 73 5c 6e  BEGIN %s of %s\n
12830 22 2c 6e 65 65 64 46 75 6c 6c 44 65 63 6c 3f 22  ",needFullDecl?"
12840 46 55 4c 4c 22 3a 22 50 52 4f 54 4f 54 59 50 45  FULL":"PROTOTYPE
12850 22 2c 70 44 65 63 6c 2d 3e 7a 4e 61 6d 65 29 3b  ",pDecl->zName);
12860 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72  */.  /*.  ** For
12870 20 61 6e 79 20 6f 62 6a 65 63 74 20 74 68 61 74   any object that
12880 20 68 61 73 20 61 20 66 6f 72 77 61 72 64 20 64   has a forward d
12890 65 63 6c 61 72 61 74 69 6f 6e 2c 20 67 6f 20 61  eclaration, go a
128a0 68 65 61 64 20 61 6e 64 20 64 6f 20 74 68 65 0a  head and do the.
128b0 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 64 65 63    ** forward dec
128c0 6c 61 72 61 74 69 6f 6e 20 66 69 72 73 74 2e 0a  laration first..
128d0 20 20 2a 2f 0a 20 20 69 73 43 70 70 20 3d 20 28    */.  isCpp = (
128e0 70 53 74 61 74 65 2d 3e 66 6c 61 67 73 20 26 20  pState->flags & 
128f0 44 50 5f 43 70 6c 75 73 70 6c 75 73 29 20 21 3d  DP_Cplusplus) !=
12900 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44 65 63   0;.  for(p=pDec
12910 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 61 6d 65  l; p; p=p->pSame
12920 4e 61 6d 65 29 7b 0a 20 20 20 20 69 66 28 20 70  Name){.    if( p
12930 2d 3e 7a 46 77 64 20 29 7b 0a 20 20 20 20 20 20  ->zFwd ){.      
12940 69 66 28 20 21 44 65 63 6c 48 61 73 50 72 6f 70  if( !DeclHasProp
12950 65 72 74 79 28 70 2c 44 50 5f 46 6f 72 77 61 72  erty(p,DP_Forwar
12960 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 44 65  d) ){.        De
12970 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  clSetProperty(p,
12980 44 50 5f 46 6f 72 77 61 72 64 29 3b 0a 20 20 20  DP_Forward);.   
12990 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
129a0 28 70 2d 3e 7a 46 77 64 2c 22 74 79 70 65 64 65  (p->zFwd,"typede
129b0 66 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  f",7)==0 ){.    
129c0 20 20 20 20 20 20 69 66 28 20 64 6f 6e 65 54 79        if( doneTy
129d0 70 65 64 65 66 20 29 20 63 6f 6e 74 69 6e 75 65  pedef ) continue
129e0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 6e 65  ;.          done
129f0 54 79 70 65 64 65 66 20 3d 20 31 3b 0a 20 20 20  Typedef = 1;.   
12a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 43       }.        C
12a10 68 61 6e 67 65 49 66 43 6f 6e 74 65 78 74 28 70  hangeIfContext(p
12a20 2d 3e 7a 49 66 2c 70 53 74 61 74 65 29 3b 0a 20  ->zIf,pState);. 
12a30 20 20 20 20 20 20 20 53 74 72 69 6e 67 41 70 70         StringApp
12a40 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72  end(pState->pStr
12a50 2c 69 73 43 70 70 20 3f 20 70 2d 3e 7a 46 77 64  ,isCpp ? p->zFwd
12a60 43 70 70 20 3a 20 70 2d 3e 7a 46 77 64 2c 30 29  Cpp : p->zFwd,0)
12a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12a80 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45    }..  /*.  ** E
12a90 61 72 6c 79 20 6f 75 74 20 69 66 20 65 76 65 72  arly out if ever
12aa0 79 74 68 69 6e 67 20 69 73 20 61 6c 72 65 61 64  ything is alread
12ab0 79 20 73 75 69 74 61 62 6c 79 20 64 65 63 6c 61  y suitably decla
12ac0 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  red..  **.  ** T
12ad0 68 69 73 20 69 73 20 61 20 76 65 72 79 20 69 6d  his is a very im
12ae0 70 6f 72 74 61 6e 74 20 73 74 65 70 20 62 65 63  portant step bec
12af0 61 75 73 65 20 69 74 20 70 72 65 76 65 6e 74 73  ause it prevents
12b00 20 75 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 78   us from.  ** ex
12b10 65 63 75 74 69 6e 67 20 74 68 65 20 63 6f 64 65  ecuting the code
12b20 20 74 68 65 20 66 6f 6c 6c 6f 77 73 20 69 6e 20   the follows in 
12b30 61 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  a recursive call
12b40 20 74 6f 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   to this.  ** fu
12b50 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
12b60 73 61 6d 65 20 76 61 6c 75 65 20 66 6f 72 20 70  same value for p
12b70 44 65 63 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61  Decl..  */.  fla
12b80 67 20 3d 20 6e 65 65 64 46 75 6c 6c 44 65 63 6c  g = needFullDecl
12b90 20 3f 20 44 50 5f 44 65 63 6c 61 72 65 64 7c 44   ? DP_Declared|D
12ba0 50 5f 46 6f 72 77 61 72 64 20 3a 20 44 50 5f 46  P_Forward : DP_F
12bb0 6f 72 77 61 72 64 3b 0a 20 20 66 6f 72 28 70 3d  orward;.  for(p=
12bc0 70 44 65 63 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  pDecl; p; p=p->p
12bd0 53 61 6d 65 4e 61 6d 65 29 7b 0a 20 20 20 20 69  SameName){.    i
12be0 66 28 20 21 44 65 63 6c 48 61 73 50 72 6f 70 65  f( !DeclHasPrope
12bf0 72 74 79 28 70 2c 66 6c 61 67 29 20 29 20 62 72  rty(p,flag) ) br
12c00 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  eak;.  }.  if( p
12c10 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
12c20 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  n;.  }..  /*.  *
12c30 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
12c40 61 76 65 20 61 6c 6c 20 6e 65 63 65 73 73 61 72  ave all necessar
12c50 79 20 23 69 6e 63 6c 75 64 65 73 0a 20 20 2a 2f  y #includes.  */
12c60 0a 20 20 66 6f 72 28 70 3d 70 44 65 63 6c 3b 20  .  for(p=pDecl; 
12c70 70 3b 20 70 3d 70 2d 3e 70 53 61 6d 65 4e 61 6d  p; p=p->pSameNam
12c80 65 29 7b 0a 20 20 20 20 41 64 64 49 6e 63 6c 75  e){.    AddInclu
12c90 64 65 73 28 70 2d 3e 70 49 6e 63 6c 75 64 65 2c  des(p->pInclude,
12ca0 70 53 74 61 74 65 29 3b 0a 20 20 7d 0a 0a 20 20  pState);.  }..  
12cb0 2f 2a 0a 20 20 2a 2a 20 47 6f 20 61 68 65 61 64  /*.  ** Go ahead
12cc0 20 61 6e 20 6d 61 72 6b 20 65 76 65 72 79 74 68   an mark everyth
12cd0 69 6e 67 20 61 73 20 62 65 69 6e 67 20 64 65 63  ing as being dec
12ce0 6c 61 72 65 64 2c 20 74 6f 20 70 72 65 76 65 6e  lared, to preven
12cf0 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 66 69 6e 69  t an.  ** infini
12d00 74 65 20 6c 6f 6f 70 20 74 68 72 75 20 74 68 65  te loop thru the
12d10 20 53 63 61 6e 54 65 78 74 28 29 20 66 75 6e 63   ScanText() func
12d20 74 69 6f 6e 2e 20 20 41 74 20 74 68 65 20 73 61  tion.  At the sa
12d30 6d 65 20 74 69 6d 65 2c 0a 20 20 2a 2a 20 77 65  me time,.  ** we
12d40 20 64 65 63 69 64 65 20 77 68 69 63 68 20 6f 62   decide which ob
12d50 6a 65 63 74 73 20 6e 65 65 64 20 61 20 66 75 6c  jects need a ful
12d60 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61 6e  l declaration an
12d70 64 20 6d 61 72 6b 20 74 68 65 6d 0a 20 20 2a 2a  d mark them.  **
12d80 20 77 69 74 68 20 74 68 65 20 44 50 5f 46 6c 61   with the DP_Fla
12d90 67 20 62 69 74 2e 20 20 57 65 20 61 72 65 20 6f  g bit.  We are o
12da0 6e 6c 79 20 61 62 6c 65 20 74 6f 20 75 73 65 20  nly able to use 
12db0 44 50 5f 46 6c 61 67 20 69 6e 20 74 68 69 73 0a  DP_Flag in this.
12dc0 20 20 2a 2a 20 77 61 79 20 62 65 63 61 75 73 65    ** way because
12dd0 20 77 65 20 6b 6e 6f 77 20 77 65 27 6c 6c 20 6e   we know we'll n
12de0 65 76 65 72 20 65 78 65 63 75 74 65 20 74 68 69  ever execute thi
12df0 73 20 66 61 72 20 69 6e 74 6f 20 74 68 69 73 0a  s far into this.
12e00 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e    ** function on
12e10 20 61 20 72 65 63 75 72 73 69 76 65 20 63 61 6c   a recursive cal
12e20 6c 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  l with the same 
12e30 70 44 65 63 6c 2e 20 20 48 65 6e 63 65 2c 20 72  pDecl.  Hence, r
12e40 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 63 61  ecursive.  ** ca
12e50 6c 6c 73 20 74 6f 20 74 68 69 73 20 66 75 6e 63  lls to this func
12e60 74 69 6f 6e 20 28 74 68 72 6f 75 67 68 20 53 63  tion (through Sc
12e70 61 6e 54 65 78 74 28 29 29 20 63 61 6e 20 6e 65  anText()) can ne
12e80 76 65 72 20 63 68 61 6e 67 65 20 74 68 65 0a 20  ver change the. 
12e90 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 44 50 5f   ** value of DP_
12ea0 46 6c 61 67 20 6f 75 74 20 66 72 6f 6d 20 75 6e  Flag out from un
12eb0 64 65 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 66  der us..  */.  f
12ec0 6f 72 28 70 3d 70 44 65 63 6c 3b 20 70 3b 20 70  or(p=pDecl; p; p
12ed0 3d 70 2d 3e 70 53 61 6d 65 4e 61 6d 65 29 7b 0a  =p->pSameName){.
12ee0 20 20 20 20 69 66 28 20 21 44 65 63 6c 48 61 73      if( !DeclHas
12ef0 50 72 6f 70 65 72 74 79 28 70 2c 44 50 5f 44 65  Property(p,DP_De
12f00 63 6c 61 72 65 64 29 0a 20 20 20 20 20 26 26 20  clared).     && 
12f10 28 70 2d 3e 7a 46 77 64 3d 3d 30 20 7c 7c 20 6e  (p->zFwd==0 || n
12f20 65 65 64 46 75 6c 6c 44 65 63 6c 29 0a 20 20 20  eedFullDecl).   
12f30 20 20 26 26 20 70 2d 3e 7a 44 65 63 6c 21 3d 30    && p->zDecl!=0
12f40 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 44 65  .    ){.      De
12f50 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  clSetProperty(p,
12f60 44 50 5f 46 6f 72 77 61 72 64 7c 44 50 5f 44 65  DP_Forward|DP_De
12f70 63 6c 61 72 65 64 7c 44 50 5f 46 6c 61 67 29 3b  clared|DP_Flag);
12f80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12f90 20 20 44 65 63 6c 43 6c 65 61 72 50 72 6f 70 65    DeclClearPrope
12fa0 72 74 79 28 70 2c 44 50 5f 46 6c 61 67 29 3b 0a  rty(p,DP_Flag);.
12fb0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
12fc0 20 20 2a 2a 20 43 61 6c 6c 20 53 63 61 6e 54 65    ** Call ScanTe
12fd0 78 74 28 29 20 72 65 63 75 72 73 69 76 65 6c 79  xt() recursively
12fe0 20 28 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69   (this routine i
12ff0 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 53 63  s called from Sc
13000 61 6e 54 65 78 74 28 29 29 0a 20 20 2a 2a 20 74  anText()).  ** t
13010 6f 20 69 6e 63 6c 75 64 65 20 64 65 63 6c 61 72  o include declar
13020 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ations required 
13030 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74  to come before t
13040 68 65 73 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  hese declaration
13050 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 3d  s..  */.  for(p=
13060 70 44 65 63 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  pDecl; p; p=p->p
13070 53 61 6d 65 4e 61 6d 65 29 7b 0a 20 20 20 20 69  SameName){.    i
13080 66 28 20 44 65 63 6c 48 61 73 50 72 6f 70 65 72  f( DeclHasProper
13090 74 79 28 70 2c 44 50 5f 46 6c 61 67 29 20 29 7b  ty(p,DP_Flag) ){
130a0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 44  .      if( p->zD
130b0 65 63 6c 5b 30 5d 3d 3d 27 23 27 20 29 7b 0a 20  ecl[0]=='#' ){. 
130c0 20 20 20 20 20 20 20 53 63 61 6e 54 65 78 74 28         ScanText(
130d0 26 70 2d 3e 7a 44 65 63 6c 5b 31 5d 2c 70 53 74  &p->zDecl[1],pSt
130e0 61 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ate);.      }els
130f0 65 7b 0a 20 20 20 20 20 20 20 20 49 6e 73 65 72  e{.        Inser
13100 74 45 78 74 72 61 44 65 63 6c 28 70 29 3b 0a 20  tExtraDecl(p);. 
13110 20 20 20 20 20 20 20 53 63 61 6e 54 65 78 74 28         ScanText(
13120 70 2d 3e 7a 44 65 63 6c 2c 70 53 74 61 74 65 29  p->zDecl,pState)
13130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13140 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4f    }..  /*.  ** O
13150 75 74 70 75 74 20 74 68 65 20 64 65 63 6c 61 72  utput the declar
13160 61 74 69 6f 6e 73 2e 20 20 44 6f 20 74 68 69 73  ations.  Do this
13170 20 69 6e 20 74 77 6f 20 70 61 73 73 65 73 2e 20   in two passes. 
13180 20 46 69 72 73 74 0a 20 20 2a 2a 20 6f 75 74 70   First.  ** outp
13190 75 74 20 65 76 65 72 79 74 68 69 6e 67 20 74 68  ut everything th
131a0 61 74 20 69 73 6e 27 74 20 61 20 74 79 70 65 64  at isn't a typed
131b0 65 66 2e 20 20 54 68 65 6e 20 67 6f 20 62 61 63  ef.  Then go bac
131c0 6b 20 61 6e 64 0a 20 20 2a 2a 20 67 65 74 20 74  k and.  ** get t
131d0 68 65 20 74 79 70 65 64 65 66 73 20 62 79 20 74  he typedefs by t
131e0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 0a 20 20  he same name..  
131f0 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 44 65 63 6c  */.  for(p=pDecl
13200 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 61 6d 65 4e  ; p; p=p->pSameN
13210 61 6d 65 29 7b 0a 20 20 20 20 69 66 28 20 44 65  ame){.    if( De
13220 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  clHasProperty(p,
13230 44 50 5f 46 6c 61 67 29 20 26 26 20 21 44 65 63  DP_Flag) && !Dec
13240 6c 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 54  lHasProperty(p,T
13250 59 5f 54 79 70 65 64 65 66 29 20 29 7b 0a 20 20  Y_Typedef) ){.  
13260 20 20 20 20 69 66 28 20 44 65 63 6c 48 61 73 41      if( DeclHasA
13270 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 54 59 5f  nyProperty(p,TY_
13280 45 6e 75 6d 65 72 61 74 69 6f 6e 29 20 29 7b 0a  Enumeration) ){.
13290 20 20 20 20 20 20 20 20 69 66 28 20 64 6f 6e 65          if( done
132a0 54 79 70 65 64 65 66 20 29 20 63 6f 6e 74 69 6e  Typedef ) contin
132b0 75 65 3b 0a 20 20 20 20 20 20 20 20 64 6f 6e 65  ue;.        done
132c0 54 79 70 65 64 65 66 20 3d 20 31 3b 0a 20 20 20  Typedef = 1;.   
132d0 20 20 20 7d 0a 20 20 20 20 20 20 43 68 61 6e 67     }.      Chang
132e0 65 49 66 43 6f 6e 74 65 78 74 28 70 2d 3e 7a 49  eIfContext(p->zI
132f0 66 2c 70 53 74 61 74 65 29 3b 0a 20 20 20 20 20  f,pState);.     
13300 20 69 66 28 20 21 69 73 43 70 70 20 26 26 20 44   if( !isCpp && D
13310 65 63 6c 48 61 73 41 6e 79 50 72 6f 70 65 72 74  eclHasAnyPropert
13320 79 28 70 2c 44 50 5f 45 78 74 65 72 6e 52 65 71  y(p,DP_ExternReq
13330 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 53 74  d) ){.        St
13340 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61 74  ringAppend(pStat
13350 65 2d 3e 70 53 74 72 2c 22 65 78 74 65 72 6e 20  e->pStr,"extern 
13360 22 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ",0);.      }els
13370 65 20 69 66 28 20 69 73 43 70 70 20 26 26 20 44  e if( isCpp && D
13380 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28 70  eclHasProperty(p
13390 2c 44 50 5f 43 70 6c 75 73 70 6c 75 73 7c 44 50  ,DP_Cplusplus|DP
133a0 5f 45 78 74 65 72 6e 52 65 71 64 29 20 29 7b 0a  _ExternReqd) ){.
133b0 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 41 70          StringAp
133c0 70 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74  pend(pState->pSt
133d0 72 2c 22 65 78 74 65 72 6e 20 22 2c 30 29 3b 0a  r,"extern ",0);.
133e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
133f0 69 73 43 70 70 20 26 26 20 44 65 63 6c 48 61 73  isCpp && DeclHas
13400 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 44 50  AnyProperty(p,DP
13410 5f 45 78 74 65 72 6e 43 52 65 71 64 7c 44 50 5f  _ExternCReqd|DP_
13420 45 78 74 65 72 6e 52 65 71 64 29 20 29 7b 0a 20  ExternReqd) ){. 
13430 20 20 20 20 20 20 20 53 74 72 69 6e 67 41 70 70         StringApp
13440 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72  end(pState->pStr
13450 2c 22 65 78 74 65 72 6e 20 5c 22 43 5c 22 20 22  ,"extern \"C\" "
13460 2c 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ,0);.      }.   
13470 20 20 20 49 6e 73 65 72 74 45 78 74 72 61 44 65     InsertExtraDe
13480 63 6c 28 70 29 3b 0a 20 20 20 20 20 20 53 74 72  cl(p);.      Str
13490 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61 74 65  ingAppend(pState
134a0 2d 3e 70 53 74 72 2c 70 2d 3e 7a 44 65 63 6c 2c  ->pStr,p->zDecl,
134b0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69  0);.      if( !i
134c0 73 43 70 70 20 26 26 20 44 65 63 6c 48 61 73 50  sCpp && DeclHasP
134d0 72 6f 70 65 72 74 79 28 70 2c 44 50 5f 43 70 6c  roperty(p,DP_Cpl
134e0 75 73 70 6c 75 73 29 20 29 7b 0a 20 20 20 20 20  usplus) ){.     
134f0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
13500 72 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 73  r,.          "%s
13510 3a 20 43 20 63 6f 64 65 20 6f 75 67 68 74 20 6e  : C code ought n
13520 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
13530 20 43 2b 2b 20 6f 62 6a 65 63 74 20 5c 22 25 73   C++ object \"%s
13540 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  \"\n",.         
13550 20 70 53 74 61 74 65 2d 3e 7a 46 69 6c 65 6e 61   pState->zFilena
13560 6d 65 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  me, p->zName);. 
13570 20 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 6e         pState->n
13580 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Err++;.      }. 
13590 20 20 20 20 20 44 65 63 6c 43 6c 65 61 72 50 72       DeclClearPr
135a0 6f 70 65 72 74 79 28 70 2c 44 50 5f 46 6c 61 67  operty(p,DP_Flag
135b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
135c0 6f 72 28 70 3d 70 44 65 63 6c 3b 20 70 20 26 26  or(p=pDecl; p &&
135d0 20 21 64 6f 6e 65 54 79 70 65 64 65 66 3b 20 70   !doneTypedef; p
135e0 3d 70 2d 3e 70 53 61 6d 65 4e 61 6d 65 29 7b 0a  =p->pSameName){.
135f0 20 20 20 20 69 66 28 20 44 65 63 6c 48 61 73 50      if( DeclHasP
13600 72 6f 70 65 72 74 79 28 70 2c 44 50 5f 46 6c 61  roperty(p,DP_Fla
13610 67 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  g) ){.      /* T
13620 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
13630 74 79 70 65 64 65 66 20 2a 2f 0a 20 20 20 20 20  typedef */.     
13640 20 64 6f 6e 65 54 79 70 65 64 65 66 20 3d 20 31   doneTypedef = 1
13650 3b 0a 20 20 20 20 20 20 43 68 61 6e 67 65 49 66  ;.      ChangeIf
13660 43 6f 6e 74 65 78 74 28 70 2d 3e 7a 49 66 2c 70  Context(p->zIf,p
13670 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20 49 6e  State);.      In
13680 73 65 72 74 45 78 74 72 61 44 65 63 6c 28 70 29  sertExtraDecl(p)
13690 3b 0a 20 20 20 20 20 20 53 74 72 69 6e 67 41 70  ;.      StringAp
136a0 70 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74  pend(pState->pSt
136b0 72 2c 70 2d 3e 7a 44 65 63 6c 2c 30 29 3b 0a 20  r,p->zDecl,0);. 
136c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
136d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
136e0 63 61 6e 73 20 74 68 65 20 69 6e 70 75 74 20 74  cans the input t
136f0 65 78 74 20 67 69 76 65 6e 2c 20 61 6e 64 20 61  ext given, and a
13700 70 70 65 6e 64 73 20 74 6f 20 74 68 65 0a 2a 2a  ppends to the.**
13710 20 73 74 72 69 6e 67 20 69 6e 20 70 53 74 61 74   string in pStat
13720 65 2d 3e 70 53 74 72 20 74 68 65 20 74 65 78 74  e->pStr the text
13730 20 6f 66 20 61 6e 79 20 64 65 63 6c 61 72 61 74   of any declarat
13740 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 0a 2a  ions that must.*
13750 2a 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74  * occur before t
13760 68 65 20 74 65 78 74 20 69 6e 20 7a 54 65 78 74  he text in zText
13770 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 64  ..**.** If an id
13780 65 6e 74 69 66 69 65 72 20 69 6e 20 7a 54 65 78  entifier in zTex
13790 74 20 69 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  t is immediately
137a0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 27 2a 27   followed by '*'
137b0 2c 20 74 68 65 6e 0a 2a 2a 20 6f 6e 6c 79 20 66  , then.** only f
137c0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
137d0 6f 6e 73 20 61 72 65 20 6e 65 65 64 65 64 20 66  ons are needed f
137e0 6f 72 20 74 68 61 74 20 69 64 65 6e 74 69 66 69  or that identifi
137f0 65 72 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 69  er.  If the.** i
13800 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 20 69  dentifier name i
13810 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 65 64 20 69  s not followed i
13820 6d 6d 65 64 69 61 74 65 6c 79 20 62 79 20 27 2a  mmediately by '*
13830 27 2c 20 77 65 20 6d 75 73 74 20 73 75 70 70 6c  ', we must suppl
13840 79 0a 2a 2a 20 61 20 66 75 6c 6c 20 64 65 63 6c  y.** a full decl
13850 61 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  aration..*/.stat
13860 69 63 20 76 6f 69 64 20 53 63 61 6e 54 65 78 74  ic void ScanText
13870 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
13880 7a 54 65 78 74 2c 20 20 20 20 2f 2a 20 54 68 65  zText,    /* The
13890 20 69 6e 70 75 74 20 74 65 78 74 20 74 6f 20 62   input text to b
138a0 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 47  e scanned */.  G
138b0 65 6e 53 74 61 74 65 20 2a 70 53 74 61 74 65 20  enState *pState 
138c0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
138d0 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 6f 64  state of the cod
138e0 65 20 67 65 6e 65 72 61 74 6f 72 20 2a 2f 0a 29  e generator */.)
138f0 7b 0a 20 20 69 6e 74 20 6e 65 78 74 56 61 6c 69  {.  int nextVali
13900 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 72 75  d = 0;    /* Tru
13910 65 20 69 73 20 73 4e 65 78 74 20 63 6f 6e 74 61  e is sNext conta
13920 69 6e 73 20 76 61 6c 69 64 20 64 61 74 61 20 2a  ins valid data *
13930 2f 0a 20 20 49 6e 53 74 72 65 61 6d 20 73 49 6e  /.  InStream sIn
13940 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
13950 20 69 6e 70 75 74 20 74 65 78 74 20 2a 2f 0a 20   input text */. 
13960 20 54 6f 6b 65 6e 20 73 54 6f 6b 65 6e 3b 20 20   Token sToken;  
13970 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
13980 72 72 65 6e 74 20 74 6f 6b 65 6e 20 62 65 69 6e  rrent token bein
13990 67 20 65 78 61 6d 69 6e 65 64 20 2a 2f 0a 20 20  g examined */.  
139a0 54 6f 6b 65 6e 20 73 4e 65 78 74 3b 20 20 20 20  Token sNext;    
139b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
139c0 74 20 6e 6f 6e 2d 73 70 61 63 65 20 74 6f 6b 65  t non-space toke
139d0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 70 72 69 6e 74  n */..  /* print
139e0 66 28 22 42 45 47 49 4e 20 53 43 41 4e 20 54 45  f("BEGIN SCAN TE
139f0 58 54 20 6f 6e 20 25 73 5c 6e 22 2c 20 7a 54 65  XT on %s\n", zTe
13a00 78 74 29 3b 20 2a 2f 0a 0a 20 20 73 49 6e 2e 7a  xt); */..  sIn.z
13a10 20 3d 20 7a 54 65 78 74 3b 0a 20 20 73 49 6e 2e   = zText;.  sIn.
13a20 69 20 3d 20 30 3b 0a 20 20 73 49 6e 2e 6e 4c 69  i = 0;.  sIn.nLi
13a30 6e 65 20 3d 20 31 3b 0a 20 20 77 68 69 6c 65 28  ne = 1;.  while(
13a40 20 73 49 6e 2e 7a 5b 73 49 6e 2e 69 5d 21 3d 30   sIn.z[sIn.i]!=0
13a50 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 78 74   ){.    if( next
13a60 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 73  Valid ){.      s
13a70 54 6f 6b 65 6e 20 3d 20 73 4e 65 78 74 3b 0a 20  Token = sNext;. 
13a80 20 20 20 20 20 6e 65 78 74 56 61 6c 69 64 20 3d       nextValid =
13a90 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
13aa0 20 20 20 20 20 47 65 74 4e 6f 6e 73 70 61 63 65       GetNonspace
13ab0 54 6f 6b 65 6e 28 26 73 49 6e 2c 26 73 54 6f 6b  Token(&sIn,&sTok
13ac0 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  en);.    }.    i
13ad0 66 28 20 73 54 6f 6b 65 6e 2e 65 54 79 70 65 3d  f( sToken.eType=
13ae0 3d 54 54 5f 49 64 20 29 7b 0a 20 20 20 20 20 20  =TT_Id ){.      
13af0 69 6e 74 20 6e 65 65 64 46 75 6c 6c 44 65 63 6c  int needFullDecl
13b00 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77  ;   /* True if w
13b10 65 20 6e 65 65 64 20 74 6f 20 70 72 6f 76 69 64  e need to provid
13b20 65 20 74 68 65 20 66 75 6c 6c 20 64 65 63 6c 61  e the full decla
13b30 72 61 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  ration,.        
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b50 20 20 2a 2a 20 6e 6f 74 20 6a 75 73 74 20 74 68    ** not just th
13b60 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72  e forward declar
13b70 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 44  ation */.      D
13b80 65 63 6c 20 2a 70 44 65 63 6c 3b 20 20 20 20 20  ecl *pDecl;     
13b90 20 20 20 2f 2a 20 54 68 65 20 64 65 63 6c 61 72     /* The declar
13ba0 61 74 69 6f 6e 20 68 61 76 69 6e 67 20 74 68 65  ation having the
13bb0 20 6e 61 6d 65 20 69 6e 20 73 54 6f 6b 65 6e 20   name in sToken 
13bc0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20  */..      /*.   
13bd0 20 20 20 2a 2a 20 53 65 65 20 69 66 20 74 68 65     ** See if the
13be0 72 65 20 69 73 20 61 20 64 65 63 6c 61 72 61 74  re is a declarat
13bf0 69 6f 6e 20 69 6e 20 74 68 65 20 64 61 74 61 62  ion in the datab
13c00 61 73 65 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ase with the nam
13c10 65 20 67 69 76 65 6e 0a 20 20 20 20 20 20 2a 2a  e given.      **
13c20 20 62 79 20 73 54 6f 6b 65 6e 2e 0a 20 20 20 20   by sToken..    
13c30 20 20 2a 2f 0a 20 20 20 20 20 20 70 44 65 63 6c    */.      pDecl
13c40 20 3d 20 46 69 6e 64 44 65 63 6c 28 73 54 6f 6b   = FindDecl(sTok
13c50 65 6e 2e 7a 54 65 78 74 2c 73 54 6f 6b 65 6e 2e  en.zText,sToken.
13c60 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  nText);.      if
13c70 28 20 70 44 65 63 6c 3d 3d 30 20 29 20 63 6f 6e  ( pDecl==0 ) con
13c80 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a  tinue;..      /*
13c90 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20  .      ** If we 
13ca0 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 77 65  get this far, we
13cb0 27 76 65 20 66 6f 75 6e 64 20 61 6e 20 69 64 65  've found an ide
13cc0 6e 74 69 66 69 65 72 20 74 68 61 74 20 68 61 73  ntifier that has
13cd0 20 61 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c   a.      ** decl
13ce0 61 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 64  aration in the d
13cf0 61 74 61 62 61 73 65 2e 20 20 4e 6f 77 20 73 65  atabase.  Now se
13d00 65 20 69 66 20 77 65 20 74 68 65 20 66 75 6c 6c  e if we the full
13d10 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 20 20 20   declaration.   
13d20 20 20 20 2a 2a 20 6f 72 20 6a 75 73 74 20 61 20     ** or just a 
13d30 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  forward declarat
13d40 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
13d50 20 20 20 20 47 65 74 4e 6f 6e 73 70 61 63 65 54      GetNonspaceT
13d60 6f 6b 65 6e 28 26 73 49 6e 2c 26 73 4e 65 78 74  oken(&sIn,&sNext
13d70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 4e 65  );.      if( sNe
13d80 78 74 2e 7a 54 65 78 74 5b 30 5d 3d 3d 27 2a 27  xt.zText[0]=='*'
13d90 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 65 64   ){.        need
13da0 46 75 6c 6c 44 65 63 6c 20 3d 20 30 3b 0a 20 20  FullDecl = 0;.  
13db0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13dc0 20 20 20 6e 65 65 64 46 75 6c 6c 44 65 63 6c 20     needFullDecl 
13dd0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 65 78  = 1;.        nex
13de0 74 56 61 6c 69 64 20 3d 20 73 4e 65 78 74 2e 65  tValid = sNext.e
13df0 54 79 70 65 3d 3d 54 54 5f 49 64 3b 0a 20 20 20  Type==TT_Id;.   
13e00 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 0a 20     }..      /*. 
13e10 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
13e20 20 74 68 65 20 6e 65 65 64 65 64 20 64 65 63 6c   the needed decl
13e30 61 72 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  aration..      *
13e40 2f 0a 20 20 20 20 20 20 44 65 63 6c 61 72 65 4f  /.      DeclareO
13e50 62 6a 65 63 74 28 70 44 65 63 6c 2c 70 53 74 61  bject(pDecl,pSta
13e60 74 65 2c 6e 65 65 64 46 75 6c 6c 44 65 63 6c 29  te,needFullDecl)
13e70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13e80 73 54 6f 6b 65 6e 2e 65 54 79 70 65 3d 3d 54 54  sToken.eType==TT
13e90 5f 50 72 65 70 72 6f 63 65 73 73 6f 72 20 29 7b  _Preprocessor ){
13ea0 0a 20 20 20 20 20 20 73 49 6e 2e 69 20 2d 3d 20  .      sIn.i -= 
13eb0 73 54 6f 6b 65 6e 2e 6e 54 65 78 74 20 2d 20 31  sToken.nText - 1
13ec0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
13ed0 20 70 72 69 6e 74 66 28 22 45 4e 44 20 53 43 41   printf("END SCA
13ee0 4e 54 45 58 54 5c 6e 22 29 3b 20 2a 2f 0a 7d 0a  NTEXT\n"); */.}.
13ef0 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61  ./*.** Provide a
13f00 20 66 75 6c 6c 20 64 65 63 6c 61 72 61 74 69 6f   full declaratio
13f10 6e 20 74 6f 20 61 6e 79 20 6f 62 6a 65 63 74 20  n to any object 
13f20 77 68 69 63 68 20 73 6f 20 66 61 72 20 68 61 73  which so far has
13f30 20 68 61 64 20 6f 6e 6c 79 0a 2a 2a 20 61 20 66   had only.** a f
13f40 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
13f50 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
13f60 69 64 20 43 6f 6d 70 6c 65 74 65 46 6f 72 77 61  id CompleteForwa
13f70 72 64 44 65 63 6c 61 72 61 74 69 6f 6e 73 28 47  rdDeclarations(G
13f80 65 6e 53 74 61 74 65 20 2a 70 53 74 61 74 65 29  enState *pState)
13f90 7b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63 6c 3b  {.  Decl *pDecl;
13fa0 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b  .  int progress;
13fb0 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67  ..  do{.    prog
13fc0 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ress = 0;.    fo
13fd0 72 28 70 44 65 63 6c 3d 70 44 65 63 6c 46 69 72  r(pDecl=pDeclFir
13fe0 73 74 3b 20 70 44 65 63 6c 3b 20 70 44 65 63 6c  st; pDecl; pDecl
13ff0 3d 70 44 65 63 6c 2d 3e 70 4e 65 78 74 29 7b 0a  =pDecl->pNext){.
14000 20 20 20 20 20 20 69 66 28 20 44 65 63 6c 48 61        if( DeclHa
14010 73 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c  sProperty(pDecl,
14020 44 50 5f 46 6f 72 77 61 72 64 29 0a 20 20 20 20  DP_Forward).    
14030 20 20 20 26 26 20 21 44 65 63 6c 48 61 73 50 72     && !DeclHasPr
14040 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f  operty(pDecl,DP_
14050 44 65 63 6c 61 72 65 64 29 0a 20 20 20 20 20 20  Declared).      
14060 29 7b 0a 20 20 20 20 20 20 20 20 44 65 63 6c 61  ){.        Decla
14070 72 65 4f 62 6a 65 63 74 28 70 44 65 63 6c 2c 70  reObject(pDecl,p
14080 53 74 61 74 65 2c 31 29 3b 0a 20 20 20 20 20 20  State,1);.      
14090 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a    progress = 1;.
140a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
140b0 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28  DeclHasProperty(
140c0 70 44 65 63 6c 2c 44 50 5f 44 65 63 6c 61 72 65  pDecl,DP_Declare
140d0 64 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d) );.      }.  
140e0 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72    }.  }while( pr
140f0 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ogress );.}../*.
14100 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
14110 6e 63 6c 75 64 65 20 66 69 6c 65 20 66 6f 72 20  nclude file for 
14120 74 68 65 20 67 69 76 65 6e 20 73 6f 75 72 63 65  the given source
14130 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74   file.  Return t
14140 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
14150 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
14160 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6e 6f 6c  ed..**.** if nol
14170 6f 63 61 6c 5f 66 6c 61 67 20 69 73 20 74 72 75  ocal_flag is tru
14180 65 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 6e 6f  e, then we do no
14190 74 20 67 65 6e 65 72 61 74 65 20 64 65 63 6c 61  t generate decla
141a0 72 61 74 69 6f 6e 73 20 66 6f 72 0a 2a 2a 20 6f  rations for.** o
141b0 62 6a 65 63 74 65 64 20 6d 61 72 6b 65 64 20 44  bjected marked D
141c0 50 5f 4c 6f 63 61 6c 2e 0a 2a 2f 0a 73 74 61 74  P_Local..*/.stat
141d0 69 63 20 69 6e 74 20 4d 61 6b 65 48 65 61 64 65  ic int MakeHeade
141e0 72 28 49 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  r(InFile *pFile,
141f0 20 46 49 4c 45 20 2a 72 65 70 6f 72 74 2c 20 69   FILE *report, i
14200 6e 74 20 6e 6f 6c 6f 63 61 6c 5f 66 6c 61 67 29  nt nolocal_flag)
14210 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  {.  int nErr = 0
14220 3b 0a 20 20 47 65 6e 53 74 61 74 65 20 73 53 74  ;.  GenState sSt
14230 61 74 65 3b 0a 20 20 53 74 72 69 6e 67 20 6f 75  ate;.  String ou
14240 74 53 74 72 3b 0a 20 20 49 64 65 6e 74 54 61 62  tStr;.  IdentTab
14250 6c 65 20 69 6e 63 6c 75 64 65 54 61 62 6c 65 3b  le includeTable;
14260 0a 20 20 49 64 65 6e 74 20 2a 70 49 64 3b 0a 20  .  Ident *pId;. 
14270 20 63 68 61 72 20 2a 7a 4e 65 77 56 65 72 73 69   char *zNewVersi
14280 6f 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 6c 64  on;.  char *zOld
14290 56 65 72 73 69 6f 6e 3b 0a 0a 20 20 69 66 28 20  Version;..  if( 
142a0 70 46 69 6c 65 2d 3e 7a 48 64 72 3d 3d 30 20 7c  pFile->zHdr==0 |
142b0 7c 20 2a 70 46 69 6c 65 2d 3e 7a 48 64 72 3d 3d  | *pFile->zHdr==
142c0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
142d0 73 53 74 61 74 65 2e 70 53 74 72 20 3d 20 26 6f  sState.pStr = &o
142e0 75 74 53 74 72 3b 0a 20 20 53 74 72 69 6e 67 49  utStr;.  StringI
142f0 6e 69 74 28 26 6f 75 74 53 74 72 29 3b 0a 20 20  nit(&outStr);.  
14300 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 6f 75  StringAppend(&ou
14310 74 53 74 72 2c 7a 54 6f 70 4c 69 6e 65 2c 6e 54  tStr,zTopLine,nT
14320 6f 70 4c 69 6e 65 29 3b 0a 20 20 73 53 74 61 74  opLine);.  sStat
14330 65 2e 70 54 61 62 6c 65 20 3d 20 26 69 6e 63 6c  e.pTable = &incl
14340 75 64 65 54 61 62 6c 65 3b 0a 20 20 6d 65 6d 73  udeTable;.  mems
14350 65 74 28 26 69 6e 63 6c 75 64 65 54 61 62 6c 65  et(&includeTable
14360 2c 30 2c 73 69 7a 65 6f 66 28 69 6e 63 6c 75 64  ,0,sizeof(includ
14370 65 54 61 62 6c 65 29 29 3b 0a 20 20 73 53 74 61  eTable));.  sSta
14380 74 65 2e 7a 49 66 20 3d 20 30 3b 0a 20 20 73 53  te.zIf = 0;.  sS
14390 74 61 74 65 2e 6e 45 72 72 20 3d 20 30 3b 0a 20  tate.nErr = 0;. 
143a0 20 73 53 74 61 74 65 2e 7a 46 69 6c 65 6e 61 6d   sState.zFilenam
143b0 65 20 3d 20 70 46 69 6c 65 2d 3e 7a 53 72 63 3b  e = pFile->zSrc;
143c0 0a 20 20 73 53 74 61 74 65 2e 66 6c 61 67 73 20  .  sState.flags 
143d0 3d 20 70 46 69 6c 65 2d 3e 66 6c 61 67 73 20 26  = pFile->flags &
143e0 20 44 50 5f 43 70 6c 75 73 70 6c 75 73 3b 0a 20   DP_Cplusplus;. 
143f0 20 52 65 73 65 74 44 65 63 6c 46 6c 61 67 73 28   ResetDeclFlags(
14400 6e 6f 6c 6f 63 61 6c 5f 66 6c 61 67 20 3f 20 22  nolocal_flag ? "
14410 6e 6f 22 20 3a 20 70 46 69 6c 65 2d 3e 7a 53 72  no" : pFile->zSr
14420 63 29 3b 0a 20 20 66 6f 72 28 70 49 64 20 3d 20  c);.  for(pId = 
14430 70 46 69 6c 65 2d 3e 69 64 54 61 62 6c 65 2e 70  pFile->idTable.p
14440 4c 69 73 74 3b 20 70 49 64 3b 20 70 49 64 3d 70  List; pId; pId=p
14450 49 64 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Id->pNext){.    
14460 44 65 63 6c 20 2a 70 44 65 63 6c 20 3d 20 46 69  Decl *pDecl = Fi
14470 6e 64 44 65 63 6c 28 70 49 64 2d 3e 7a 4e 61 6d  ndDecl(pId->zNam
14480 65 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 70 44  e,0);.    if( pD
14490 65 63 6c 20 29 7b 0a 20 20 20 20 20 20 44 65 63  ecl ){.      Dec
144a0 6c 61 72 65 4f 62 6a 65 63 74 28 70 44 65 63 6c  lareObject(pDecl
144b0 2c 26 73 53 74 61 74 65 2c 31 29 3b 0a 20 20 20  ,&sState,1);.   
144c0 20 7d 0a 20 20 7d 0a 20 20 43 6f 6d 70 6c 65 74   }.  }.  Complet
144d0 65 46 6f 72 77 61 72 64 44 65 63 6c 61 72 61 74  eForwardDeclarat
144e0 69 6f 6e 73 28 26 73 53 74 61 74 65 29 3b 0a 20  ions(&sState);. 
144f0 20 43 68 61 6e 67 65 49 66 43 6f 6e 74 65 78 74   ChangeIfContext
14500 28 30 2c 26 73 53 74 61 74 65 29 3b 0a 20 20 6e  (0,&sState);.  n
14510 45 72 72 20 2b 3d 20 73 53 74 61 74 65 2e 6e 45  Err += sState.nE
14520 72 72 3b 0a 20 20 7a 4f 6c 64 56 65 72 73 69 6f  rr;.  zOldVersio
14530 6e 20 3d 20 52 65 61 64 46 69 6c 65 28 70 46 69  n = ReadFile(pFi
14540 6c 65 2d 3e 7a 48 64 72 29 3b 0a 20 20 7a 4e 65  le->zHdr);.  zNe
14550 77 56 65 72 73 69 6f 6e 20 3d 20 53 74 72 69 6e  wVersion = Strin
14560 67 47 65 74 28 26 6f 75 74 53 74 72 29 3b 0a 20  gGet(&outStr);. 
14570 20 69 66 28 20 72 65 70 6f 72 74 20 29 20 66 70   if( report ) fp
14580 72 69 6e 74 66 28 72 65 70 6f 72 74 2c 22 25 73  rintf(report,"%s
14590 3a 20 22 2c 70 46 69 6c 65 2d 3e 7a 48 64 72 29  : ",pFile->zHdr)
145a0 3b 0a 20 20 69 66 28 20 7a 4f 6c 64 56 65 72 73  ;.  if( zOldVers
145b0 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ion==0 ){.    if
145c0 28 20 72 65 70 6f 72 74 20 29 20 66 70 72 69 6e  ( report ) fprin
145d0 74 66 28 72 65 70 6f 72 74 2c 22 75 70 64 61 74  tf(report,"updat
145e0 65 64 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20  ed\n");.    if( 
145f0 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
14600 3e 7a 48 64 72 2c 7a 4e 65 77 56 65 72 73 69 6f  >zHdr,zNewVersio
14610 6e 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  n) ){.      fpri
14620 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
14630 43 61 6e 27 74 20 77 72 69 74 65 20 74 6f 20 66  Can't write to f
14640 69 6c 65 5c 6e 22 2c 70 46 69 6c 65 2d 3e 7a 48  ile\n",pFile->zH
14650 64 72 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  dr);.      nErr+
14660 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  +;.    }.  }else
14670 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4f 6c   if( strncmp(zOl
14680 64 56 65 72 73 69 6f 6e 2c 7a 54 6f 70 4c 69 6e  dVersion,zTopLin
14690 65 2c 6e 54 6f 70 4c 69 6e 65 29 21 3d 30 20 29  e,nTopLine)!=0 )
146a0 7b 0a 20 20 20 20 69 66 28 20 72 65 70 6f 72 74  {.    if( report
146b0 20 29 20 66 70 72 69 6e 74 66 28 72 65 70 6f 72   ) fprintf(repor
146c0 74 2c 22 65 72 72 6f 72 21 5c 6e 22 29 3b 0a 20  t,"error!\n");. 
146d0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
146e0 72 2c 0a 20 20 20 20 20 20 20 22 25 73 3a 20 43  r,.       "%s: C
146f0 61 6e 27 74 20 6f 76 65 72 77 72 69 74 65 20 74  an't overwrite t
14700 68 69 73 20 66 69 6c 65 20 62 65 63 61 75 73 65  his file because
14710 20 69 74 20 77 61 73 6e 27 74 20 70 72 65 76 69   it wasn't previ
14720 6f 75 73 6c 79 5c 6e 22 0a 20 20 20 20 20 20 20  ously\n".       
14730 22 25 2a 73 20 20 67 65 6e 65 72 61 74 65 64 20  "%*s  generated 
14740 62 79 20 27 6d 61 6b 65 68 65 61 64 65 72 73 27  by 'makeheaders'
14750 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 46 69  .\n",.       pFi
14760 6c 65 2d 3e 7a 48 64 72 2c 20 28 69 6e 74 29 73  le->zHdr, (int)s
14770 74 72 6c 65 6e 28 70 46 69 6c 65 2d 3e 7a 48 64  trlen(pFile->zHd
14780 72 29 2c 20 22 22 29 3b 0a 20 20 20 20 6e 45 72  r), "");.    nEr
14790 72 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  r++;.  }else if(
147a0 20 73 74 72 63 6d 70 28 7a 4f 6c 64 56 65 72 73   strcmp(zOldVers
147b0 69 6f 6e 2c 7a 4e 65 77 56 65 72 73 69 6f 6e 29  ion,zNewVersion)
147c0 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72  !=0 ){.    if( r
147d0 65 70 6f 72 74 20 29 20 66 70 72 69 6e 74 66 28  eport ) fprintf(
147e0 72 65 70 6f 72 74 2c 22 75 70 64 61 74 65 64 5c  report,"updated\
147f0 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 57 72 69  n");.    if( Wri
14800 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 7a 48  teFile(pFile->zH
14810 64 72 2c 7a 4e 65 77 56 65 72 73 69 6f 6e 29 20  dr,zNewVersion) 
14820 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
14830 28 73 74 64 65 72 72 2c 22 25 73 3a 20 43 61 6e  (stderr,"%s: Can
14840 27 74 20 77 72 69 74 65 20 74 6f 20 66 69 6c 65  't write to file
14850 5c 6e 22 2c 70 46 69 6c 65 2d 3e 7a 48 64 72 29  \n",pFile->zHdr)
14860 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
14870 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
14880 28 20 72 65 70 6f 72 74 20 29 7b 0a 20 20 20 20  ( report ){.    
14890 66 70 72 69 6e 74 66 28 72 65 70 6f 72 74 2c 22  fprintf(report,"
148a0 75 6e 63 68 61 6e 67 65 64 5c 6e 22 29 3b 0a 20  unchanged\n");. 
148b0 20 7d 0a 20 20 53 61 66 65 46 72 65 65 28 7a 4f   }.  SafeFree(zO
148c0 6c 64 56 65 72 73 69 6f 6e 29 3b 0a 20 20 49 64  ldVersion);.  Id
148d0 65 6e 74 54 61 62 6c 65 52 65 73 65 74 28 26 69  entTableReset(&i
148e0 6e 63 6c 75 64 65 54 61 62 6c 65 29 3b 0a 20 20  ncludeTable);.  
148f0 53 74 72 69 6e 67 52 65 73 65 74 28 26 6f 75 74  StringReset(&out
14900 53 74 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Str);.  return n
14910 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Err;.}../*.** Ge
14920 6e 65 72 61 74 65 20 61 20 67 6c 6f 62 61 6c 20  nerate a global 
14930 68 65 61 64 65 72 20 66 69 6c 65 20 2d 2d 20 61  header file -- a
14940 20 68 65 61 64 65 72 20 66 69 6c 65 20 74 68 61   header file tha
14950 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a  t contains all.*
14960 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 20  * declarations. 
14970 20 49 66 20 74 68 65 20 66 6f 72 45 78 70 6f 72   If the forExpor
14980 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
14990 74 68 65 6e 20 6f 6e 6c 79 20 74 68 6f 73 65 0a  then only those.
149a0 2a 2a 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  ** objects that 
149b0 61 72 65 20 65 78 70 6f 72 74 65 64 20 61 72 65  are exported are
149c0 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
149d0 20 68 65 61 64 65 72 20 66 69 6c 65 2e 0a 2a 2f   header file..*/
149e0 0a 73 74 61 74 69 63 20 69 6e 74 20 4d 61 6b 65  .static int Make
149f0 47 6c 6f 62 61 6c 48 65 61 64 65 72 28 69 6e 74  GlobalHeader(int
14a00 20 66 6f 72 45 78 70 6f 72 74 29 7b 0a 20 20 47   forExport){.  G
14a10 65 6e 53 74 61 74 65 20 73 53 74 61 74 65 3b 0a  enState sState;.
14a20 20 20 53 74 72 69 6e 67 20 6f 75 74 53 74 72 3b    String outStr;
14a30 0a 20 20 49 64 65 6e 74 54 61 62 6c 65 20 69 6e  .  IdentTable in
14a40 63 6c 75 64 65 54 61 62 6c 65 3b 0a 20 20 44 65  cludeTable;.  De
14a50 63 6c 20 2a 70 44 65 63 6c 3b 0a 0a 20 20 73 53  cl *pDecl;..  sS
14a60 74 61 74 65 2e 70 53 74 72 20 3d 20 26 6f 75 74  tate.pStr = &out
14a70 53 74 72 3b 0a 20 20 53 74 72 69 6e 67 49 6e 69  Str;.  StringIni
14a80 74 28 26 6f 75 74 53 74 72 29 3b 0a 20 20 2f 2a  t(&outStr);.  /*
14a90 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 6f   StringAppend(&o
14aa0 75 74 53 74 72 2c 7a 54 6f 70 4c 69 6e 65 2c 6e  utStr,zTopLine,n
14ab0 54 6f 70 4c 69 6e 65 29 3b 20 2a 2f 0a 20 20 73  TopLine); */.  s
14ac0 53 74 61 74 65 2e 70 54 61 62 6c 65 20 3d 20 26  State.pTable = &
14ad0 69 6e 63 6c 75 64 65 54 61 62 6c 65 3b 0a 20 20  includeTable;.  
14ae0 6d 65 6d 73 65 74 28 26 69 6e 63 6c 75 64 65 54  memset(&includeT
14af0 61 62 6c 65 2c 30 2c 73 69 7a 65 6f 66 28 69 6e  able,0,sizeof(in
14b00 63 6c 75 64 65 54 61 62 6c 65 29 29 3b 0a 20 20  cludeTable));.  
14b10 73 53 74 61 74 65 2e 7a 49 66 20 3d 20 30 3b 0a  sState.zIf = 0;.
14b20 20 20 73 53 74 61 74 65 2e 6e 45 72 72 20 3d 20    sState.nErr = 
14b30 30 3b 0a 20 20 73 53 74 61 74 65 2e 7a 46 69 6c  0;.  sState.zFil
14b40 65 6e 61 6d 65 20 3d 20 22 28 61 6c 6c 29 22 3b  ename = "(all)";
14b50 0a 20 20 73 53 74 61 74 65 2e 66 6c 61 67 73 20  .  sState.flags 
14b60 3d 20 30 3b 0a 20 20 52 65 73 65 74 44 65 63 6c  = 0;.  ResetDecl
14b70 46 6c 61 67 73 28 30 29 3b 0a 20 20 66 6f 72 28  Flags(0);.  for(
14b80 70 44 65 63 6c 3d 70 44 65 63 6c 46 69 72 73 74  pDecl=pDeclFirst
14b90 3b 20 70 44 65 63 6c 3b 20 70 44 65 63 6c 3d 70  ; pDecl; pDecl=p
14ba0 44 65 63 6c 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Decl->pNext){.  
14bb0 20 20 69 66 28 20 66 6f 72 45 78 70 6f 72 74 3d    if( forExport=
14bc0 3d 30 20 7c 7c 20 44 65 63 6c 48 61 73 50 72 6f  =0 || DeclHasPro
14bd0 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45  perty(pDecl,DP_E
14be0 78 70 6f 72 74 29 20 29 7b 0a 20 20 20 20 20 20  xport) ){.      
14bf0 44 65 63 6c 61 72 65 4f 62 6a 65 63 74 28 70 44  DeclareObject(pD
14c00 65 63 6c 2c 26 73 53 74 61 74 65 2c 31 29 3b 0a  ecl,&sState,1);.
14c10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 68 61 6e      }.  }.  Chan
14c20 67 65 49 66 43 6f 6e 74 65 78 74 28 30 2c 26 73  geIfContext(0,&s
14c30 53 74 61 74 65 29 3b 0a 20 20 70 72 69 6e 74 66  State);.  printf
14c40 28 22 25 73 22 2c 53 74 72 69 6e 67 47 65 74 28  ("%s",StringGet(
14c50 26 6f 75 74 53 74 72 29 29 3b 0a 20 20 49 64 65  &outStr));.  Ide
14c60 6e 74 54 61 62 6c 65 52 65 73 65 74 28 26 69 6e  ntTableReset(&in
14c70 63 6c 75 64 65 54 61 62 6c 65 29 3b 0a 20 20 53  cludeTable);.  S
14c80 74 72 69 6e 67 52 65 73 65 74 28 26 6f 75 74 53  tringReset(&outS
14c90 74 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  tr);.  return 0;
14ca0 0a 7d 0a 0a 23 69 66 64 65 66 20 44 45 42 55 47  .}..#ifdef DEBUG
14cb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
14cc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
14cd0 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 67 69  acters in the gi
14ce0 76 65 6e 20 73 74 72 69 6e 67 20 70 72 69 6f 72  ven string prior
14cf0 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
14d00 20 6e 65 77 6c 69 6e 65 2e 0a 2a 2f 0a 73 74 61   newline..*/.sta
14d10 74 69 63 20 69 6e 74 20 43 6c 69 70 54 72 61 69  tic int ClipTrai
14d20 6c 69 6e 67 4e 65 77 6c 69 6e 65 28 63 68 61 72  lingNewline(char
14d30 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20   *z){.  int n = 
14d40 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 77 68 69  strlen(z);.  whi
14d50 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d  le( n>0 && (z[n-
14d60 31 5d 3d 3d 27 5c 6e 27 20 7c 7c 20 7a 5b 6e 2d  1]=='\n' || z[n-
14d70 31 5d 3d 3d 27 5c 72 27 29 20 29 7b 20 6e 2d 2d  1]=='\r') ){ n--
14d80 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  ; }.  return n;.
14d90 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 6d 70 20 74 68  }../*.** Dump th
14da0 65 20 65 6e 74 69 72 65 20 64 65 63 6c 61 72 61  e entire declara
14db0 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 64 65  tion list for de
14dc0 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73  bugging purposes
14dd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14de0 44 75 6d 70 44 65 63 6c 4c 69 73 74 28 76 6f 69  DumpDeclList(voi
14df0 64 29 7b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63  d){.  Decl *pDec
14e00 6c 3b 0a 0a 20 20 66 6f 72 28 70 44 65 63 6c 20  l;..  for(pDecl 
14e10 3d 20 70 44 65 63 6c 46 69 72 73 74 3b 20 70 44  = pDeclFirst; pD
14e20 65 63 6c 3b 20 70 44 65 63 6c 3d 70 44 65 63 6c  ecl; pDecl=pDecl
14e30 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 72  ->pNext){.    pr
14e40 69 6e 74 66 28 22 2a 2a 2a 2a 20 25 73 20 66 72  intf("**** %s fr
14e50 6f 6d 20 66 69 6c 65 20 25 73 20 2a 2a 2a 2a 5c  om file %s ****\
14e60 6e 22 2c 70 44 65 63 6c 2d 3e 7a 4e 61 6d 65 2c  n",pDecl->zName,
14e70 70 44 65 63 6c 2d 3e 7a 46 69 6c 65 29 3b 0a 20  pDecl->zFile);. 
14e80 20 20 20 69 66 28 20 70 44 65 63 6c 2d 3e 7a 49     if( pDecl->zI
14e90 66 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74  f ){.      print
14ea0 66 28 22 49 66 3a 20 5b 25 2e 2a 73 5d 5c 6e 22  f("If: [%.*s]\n"
14eb0 2c 43 6c 69 70 54 72 61 69 6c 69 6e 67 4e 65 77  ,ClipTrailingNew
14ec0 6c 69 6e 65 28 70 44 65 63 6c 2d 3e 7a 49 66 29  line(pDecl->zIf)
14ed0 2c 70 44 65 63 6c 2d 3e 7a 49 66 29 3b 0a 20 20  ,pDecl->zIf);.  
14ee0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 65 63    }.    if( pDec
14ef0 6c 2d 3e 7a 46 77 64 20 29 7b 0a 20 20 20 20 20  l->zFwd ){.     
14f00 20 70 72 69 6e 74 66 28 22 44 65 63 6c 3a 20 5b   printf("Decl: [
14f10 25 2e 2a 73 5d 5c 6e 22 2c 43 6c 69 70 54 72 61  %.*s]\n",ClipTra
14f20 69 6c 69 6e 67 4e 65 77 6c 69 6e 65 28 70 44 65  ilingNewline(pDe
14f30 63 6c 2d 3e 7a 46 77 64 29 2c 70 44 65 63 6c 2d  cl->zFwd),pDecl-
14f40 3e 7a 46 77 64 29 3b 0a 20 20 20 20 7d 0a 20 20  >zFwd);.    }.  
14f50 20 20 69 66 28 20 70 44 65 63 6c 2d 3e 7a 44 65    if( pDecl->zDe
14f60 63 6c 20 29 7b 0a 20 20 20 20 20 20 49 6e 73 65  cl ){.      Inse
14f70 72 74 45 78 74 72 61 44 65 63 6c 28 70 44 65 63  rtExtraDecl(pDec
14f80 6c 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66  l);.      printf
14f90 28 22 44 65 66 3a 20 5b 25 2e 2a 73 5d 5c 6e 22  ("Def: [%.*s]\n"
14fa0 2c 43 6c 69 70 54 72 61 69 6c 69 6e 67 4e 65 77  ,ClipTrailingNew
14fb0 6c 69 6e 65 28 70 44 65 63 6c 2d 3e 7a 44 65 63  line(pDecl->zDec
14fc0 6c 29 2c 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 29  l),pDecl->zDecl)
14fd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14fe0 70 44 65 63 6c 2d 3e 66 6c 61 67 73 20 29 7b 0a  pDecl->flags ){.
14ff0 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72        static str
15000 75 63 74 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  uct {.        in
15010 74 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  t mask;.        
15020 63 68 61 72 20 2a 64 65 73 63 3b 0a 20 20 20 20  char *desc;.    
15030 20 20 7d 20 66 6c 61 67 53 65 74 5b 5d 20 3d 20    } flagSet[] = 
15040 7b 0a 20 20 20 20 20 20 20 20 7b 20 54 59 5f 43  {.        { TY_C
15050 6c 61 73 73 2c 20 20 20 20 20 20 20 22 63 6c 61  lass,       "cla
15060 73 73 22 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b  ss" },.        {
15070 20 54 59 5f 45 6e 75 6d 65 72 61 74 69 6f 6e 2c   TY_Enumeration,
15080 20 22 65 6e 75 6d 22 20 7d 2c 0a 20 20 20 20 20   "enum" },.     
15090 20 20 20 7b 20 54 59 5f 53 74 72 75 63 74 75 72     { TY_Structur
150a0 65 2c 20 20 20 22 73 74 72 75 63 74 22 20 7d 2c  e,   "struct" },
150b0 0a 20 20 20 20 20 20 20 20 7b 20 54 59 5f 55 6e  .        { TY_Un
150c0 69 6f 6e 2c 20 20 20 20 20 20 20 22 75 6e 69 6f  ion,       "unio
150d0 6e 22 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  n" },.        { 
150e0 54 59 5f 56 61 72 69 61 62 6c 65 2c 20 20 20 20  TY_Variable,    
150f0 22 76 61 72 69 61 62 6c 65 22 20 7d 2c 0a 20 20  "variable" },.  
15100 20 20 20 20 20 20 7b 20 54 59 5f 53 75 62 72 6f        { TY_Subro
15110 75 74 69 6e 65 2c 20 20 22 66 75 6e 63 74 69 6f  utine,  "functio
15120 6e 22 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  n" },.        { 
15130 54 59 5f 54 79 70 65 64 65 66 2c 20 20 20 20 20  TY_Typedef,     
15140 22 74 79 70 65 64 65 66 22 20 7d 2c 0a 20 20 20  "typedef" },.   
15150 20 20 20 20 20 7b 20 54 59 5f 4d 61 63 72 6f 2c       { TY_Macro,
15160 20 20 20 20 20 20 20 22 6d 61 63 72 6f 22 20 7d         "macro" }
15170 2c 0a 20 20 20 20 20 20 20 20 7b 20 44 50 5f 45  ,.        { DP_E
15180 78 70 6f 72 74 2c 20 20 20 20 20 20 22 65 78 70  xport,      "exp
15190 6f 72 74 22 20 7d 2c 0a 20 20 20 20 20 20 20 20  ort" },.        
151a0 7b 20 44 50 5f 4c 6f 63 61 6c 2c 20 20 20 20 20  { DP_Local,     
151b0 20 20 22 6c 6f 63 61 6c 22 20 7d 2c 0a 20 20 20    "local" },.   
151c0 20 20 20 20 20 7b 20 44 50 5f 43 70 6c 75 73 70       { DP_Cplusp
151d0 6c 75 73 2c 20 20 20 22 43 2b 2b 22 20 7d 2c 0a  lus,   "C++" },.
151e0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
151f0 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 72 69 6e  nt i;.      prin
15200 74 66 28 22 66 6c 61 67 73 3a 22 29 3b 0a 20 20  tf("flags:");.  
15210 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
15220 69 7a 65 6f 66 28 66 6c 61 67 53 65 74 29 2f 73  izeof(flagSet)/s
15230 69 7a 65 6f 66 28 66 6c 61 67 53 65 74 5b 30 5d  izeof(flagSet[0]
15240 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
15250 20 69 66 28 20 66 6c 61 67 53 65 74 5b 69 5d 2e   if( flagSet[i].
15260 6d 61 73 6b 20 26 20 70 44 65 63 6c 2d 3e 66 6c  mask & pDecl->fl
15270 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ags ){.         
15280 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c 20 66   printf(" %s", f
15290 6c 61 67 53 65 74 5b 69 5d 2e 64 65 73 63 29 3b  lagSet[i].desc);
152a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
152b0 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28   }.      printf(
152c0 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  "\n");.    }.   
152d0 20 69 66 28 20 70 44 65 63 6c 2d 3e 70 49 6e 63   if( pDecl->pInc
152e0 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 49 6e  lude ){.      In
152f0 63 6c 75 64 65 20 2a 70 3b 0a 20 20 20 20 20 20  clude *p;.      
15300 70 72 69 6e 74 66 28 22 69 6e 63 6c 75 64 65 73  printf("includes
15310 3a 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  :");.      for(p
15320 3d 70 44 65 63 6c 2d 3e 70 49 6e 63 6c 75 64 65  =pDecl->pInclude
15330 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
15340 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
15350 28 22 20 25 73 22 2c 70 2d 3e 7a 46 69 6c 65 29  (" %s",p->zFile)
15360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15370 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  printf("\n");.  
15380 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
15390 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ../*.** When the
153a0 20 22 2d 64 6f 63 22 20 63 6f 6d 6d 61 6e 64 2d   "-doc" command-
153b0 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 69 73 20 75  line option is u
153c0 73 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  sed, this routin
153d0 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 74  e is called.** t
153e0 6f 20 70 72 69 6e 74 20 61 6c 6c 20 6f 66 20 74  o print all of t
153f0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 66 6f  he database info
15400 72 6d 61 74 69 6f 6e 20 74 6f 20 73 74 61 6e 64  rmation to stand
15410 61 72 64 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73  ard output..*/.s
15420 74 61 74 69 63 20 76 6f 69 64 20 44 6f 63 75 6d  tatic void Docum
15430 65 6e 74 61 74 69 6f 6e 44 75 6d 70 28 76 6f 69  entationDump(voi
15440 64 29 7b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63  d){.  Decl *pDec
15450 6c 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  l;.  static stru
15460 63 74 20 7b 0a 20 20 20 20 69 6e 74 20 6d 61 73  ct {.    int mas
15470 6b 3b 0a 20 20 20 20 63 68 61 72 20 66 6c 61 67  k;.    char flag
15480 3b 0a 20 20 7d 20 66 6c 61 67 53 65 74 5b 5d 20  ;.  } flagSet[] 
15490 3d 20 7b 0a 20 20 20 20 7b 20 54 59 5f 43 6c 61  = {.    { TY_Cla
154a0 73 73 2c 20 20 20 20 20 20 20 27 63 27 20 7d 2c  ss,       'c' },
154b0 0a 20 20 20 20 7b 20 54 59 5f 45 6e 75 6d 65 72  .    { TY_Enumer
154c0 61 74 69 6f 6e 2c 20 27 65 27 20 7d 2c 0a 20 20  ation, 'e' },.  
154d0 20 20 7b 20 54 59 5f 53 74 72 75 63 74 75 72 65    { TY_Structure
154e0 2c 20 20 20 27 73 27 20 7d 2c 0a 20 20 20 20 7b  ,   's' },.    {
154f0 20 54 59 5f 55 6e 69 6f 6e 2c 20 20 20 20 20 20   TY_Union,      
15500 20 27 75 27 20 7d 2c 0a 20 20 20 20 7b 20 54 59   'u' },.    { TY
15510 5f 56 61 72 69 61 62 6c 65 2c 20 20 20 20 27 76  _Variable,    'v
15520 27 20 7d 2c 0a 20 20 20 20 7b 20 54 59 5f 53 75  ' },.    { TY_Su
15530 62 72 6f 75 74 69 6e 65 2c 20 20 27 66 27 20 7d  broutine,  'f' }
15540 2c 0a 20 20 20 20 7b 20 54 59 5f 54 79 70 65 64  ,.    { TY_Typed
15550 65 66 2c 20 20 20 20 20 27 74 27 20 7d 2c 0a 20  ef,     't' },. 
15560 20 20 20 7b 20 54 59 5f 4d 61 63 72 6f 2c 20 20     { TY_Macro,  
15570 20 20 20 20 20 27 6d 27 20 7d 2c 0a 20 20 20 20       'm' },.    
15580 7b 20 44 50 5f 45 78 70 6f 72 74 2c 20 20 20 20  { DP_Export,    
15590 20 20 27 78 27 20 7d 2c 0a 20 20 20 20 7b 20 44    'x' },.    { D
155a0 50 5f 4c 6f 63 61 6c 2c 20 20 20 20 20 20 20 27  P_Local,       '
155b0 6c 27 20 7d 2c 0a 20 20 20 20 7b 20 44 50 5f 43  l' },.    { DP_C
155c0 70 6c 75 73 70 6c 75 73 2c 20 20 20 27 2b 27 20  plusplus,   '+' 
155d0 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 66 6f 72 28 70  },.  };..  for(p
155e0 44 65 63 6c 20 3d 20 70 44 65 63 6c 46 69 72 73  Decl = pDeclFirs
155f0 74 3b 20 70 44 65 63 6c 3b 20 70 44 65 63 6c 3d  t; pDecl; pDecl=
15600 70 44 65 63 6c 2d 3e 70 4e 65 78 74 29 7b 0a 20  pDecl->pNext){. 
15610 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
15620 74 20 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20  t nLabel = 0;.  
15630 20 20 63 68 61 72 20 2a 7a 44 65 63 6c 3b 0a 20    char *zDecl;. 
15640 20 20 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 35     char zLabel[5
15650 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  0];.    for(i=0;
15660 20 69 3c 73 69 7a 65 6f 66 28 66 6c 61 67 53 65   i<sizeof(flagSe
15670 74 29 2f 73 69 7a 65 6f 66 28 66 6c 61 67 53 65  t)/sizeof(flagSe
15680 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  t[0]); i++){.   
15690 20 20 20 69 66 28 20 44 65 63 6c 48 61 73 50 72     if( DeclHasPr
156a0 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 66 6c 61  operty(pDecl,fla
156b0 67 53 65 74 5b 69 5d 2e 6d 61 73 6b 29 20 29 7b  gSet[i].mask) ){
156c0 0a 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c 5b  .        zLabel[
156d0 6e 4c 61 62 65 6c 2b 2b 5d 20 3d 20 66 6c 61 67  nLabel++] = flag
156e0 53 65 74 5b 69 5d 2e 66 6c 61 67 3b 0a 20 20 20  Set[i].flag;.   
156f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
15700 66 28 20 6e 4c 61 62 65 6c 3d 3d 30 20 29 20 63  f( nLabel==0 ) c
15710 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 4c 61  ontinue;.    zLa
15720 62 65 6c 5b 6e 4c 61 62 65 6c 5d 20 3d 20 30 3b  bel[nLabel] = 0;
15730 0a 20 20 20 20 49 6e 73 65 72 74 45 78 74 72 61  .    InsertExtra
15740 44 65 63 6c 28 70 44 65 63 6c 29 3b 0a 20 20 20  Decl(pDecl);.   
15750 20 7a 44 65 63 6c 20 3d 20 70 44 65 63 6c 2d 3e   zDecl = pDecl->
15760 7a 44 65 63 6c 3b 0a 20 20 20 20 69 66 28 20 7a  zDecl;.    if( z
15770 44 65 63 6c 3d 3d 30 20 29 20 7a 44 65 63 6c 20  Decl==0 ) zDecl 
15780 3d 20 70 44 65 63 6c 2d 3e 7a 46 77 64 3b 0a 20  = pDecl->zFwd;. 
15790 20 20 20 70 72 69 6e 74 66 28 22 25 73 20 25 73     printf("%s %s
157a0 20 25 73 20 25 70 20 25 64 20 25 64 20 25 64 20   %s %p %d %d %d 
157b0 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
157c0 20 70 44 65 63 6c 2d 3e 7a 4e 61 6d 65 2c 0a 20   pDecl->zName,. 
157d0 20 20 20 20 20 20 7a 4c 61 62 65 6c 2c 0a 20 20        zLabel,.  
157e0 20 20 20 20 20 70 44 65 63 6c 2d 3e 7a 46 69 6c       pDecl->zFil
157f0 65 2c 0a 20 20 20 20 20 20 20 70 44 65 63 6c 2d  e,.       pDecl-
15800 3e 70 43 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20 20  >pComment,.     
15810 20 20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e    pDecl->pCommen
15820 74 20 3f 20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d  t ? pDecl->pComm
15830 65 6e 74 2d 3e 6e 54 65 78 74 2b 31 20 3a 20 30  ent->nText+1 : 0
15840 2c 0a 20 20 20 20 20 20 20 70 44 65 63 6c 2d 3e  ,.       pDecl->
15850 7a 49 66 20 3f 20 28 69 6e 74 29 73 74 72 6c 65  zIf ? (int)strle
15860 6e 28 70 44 65 63 6c 2d 3e 7a 49 66 29 2b 31 20  n(pDecl->zIf)+1 
15870 3a 20 30 2c 0a 20 20 20 20 20 20 20 7a 44 65 63  : 0,.       zDec
15880 6c 20 3f 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  l ? (int)strlen(
15890 7a 44 65 63 6c 29 20 3a 20 30 2c 0a 20 20 20 20  zDecl) : 0,.    
158a0 20 20 20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65     pDecl->pComme
158b0 6e 74 20 3f 20 70 44 65 63 6c 2d 3e 70 43 6f 6d  nt ? pDecl->pCom
158c0 6d 65 6e 74 2d 3e 6e 4c 69 6e 65 20 3a 20 30 2c  ment->nLine : 0,
158d0 0a 20 20 20 20 20 20 20 70 44 65 63 6c 2d 3e 74  .       pDecl->t
158e0 6f 6b 65 6e 43 6f 64 65 2e 6e 54 65 78 74 20 3f  okenCode.nText ?
158f0 20 70 44 65 63 6c 2d 3e 74 6f 6b 65 6e 43 6f 64   pDecl->tokenCod
15900 65 2e 6e 54 65 78 74 2b 31 20 3a 20 30 0a 20 20  e.nText+1 : 0.  
15910 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 44 65    );.    if( pDe
15920 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20 29 7b 0a  cl->pComment ){.
15930 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 2e        printf("%.
15940 2a 73 5c 6e 22 2c 70 44 65 63 6c 2d 3e 70 43 6f  *s\n",pDecl->pCo
15950 6d 6d 65 6e 74 2d 3e 6e 54 65 78 74 2c 20 70 44  mment->nText, pD
15960 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 2d 3e 7a  ecl->pComment->z
15970 54 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Text);.    }.   
15980 20 69 66 28 20 70 44 65 63 6c 2d 3e 7a 49 66 20   if( pDecl->zIf 
15990 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
159a0 22 25 73 5c 6e 22 2c 70 44 65 63 6c 2d 3e 7a 49  "%s\n",pDecl->zI
159b0 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  f);.    }.    if
159c0 28 20 7a 44 65 63 6c 20 29 7b 0a 20 20 20 20 20  ( zDecl ){.     
159d0 20 70 72 69 6e 74 66 28 22 25 73 22 2c 7a 44 65   printf("%s",zDe
159e0 63 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  cl);.    }.    i
159f0 66 28 20 70 44 65 63 6c 2d 3e 74 6f 6b 65 6e 43  f( pDecl->tokenC
15a00 6f 64 65 2e 6e 54 65 78 74 20 29 7b 0a 20 20 20  ode.nText ){.   
15a10 20 20 20 70 72 69 6e 74 66 28 22 25 2e 2a 73 5c     printf("%.*s\
15a20 6e 22 2c 70 44 65 63 6c 2d 3e 74 6f 6b 65 6e 43  n",pDecl->tokenC
15a30 6f 64 65 2e 6e 54 65 78 74 2c 20 70 44 65 63 6c  ode.nText, pDecl
15a40 2d 3e 74 6f 6b 65 6e 43 6f 64 65 2e 7a 54 65 78  ->tokenCode.zTex
15a50 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
15a60 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
15a70 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
15a80 66 20 61 6e 20 69 6e 70 75 74 20 66 69 6c 65 2c  f an input file,
15a90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72   this routine pr
15aa0 69 6e 74 73 20 61 0a 2a 2a 20 64 6f 63 75 6d 65  ints a.** docume
15ab0 6e 74 61 74 69 6f 6e 20 72 65 63 6f 72 64 20 66  ntation record f
15ac0 6f 72 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  or the header co
15ad0 6d 6d 65 6e 74 20 61 74 20 74 68 65 20 62 65 67  mment at the beg
15ae0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 0a 2a 2a  inning of the.**
15af0 20 66 69 6c 65 20 28 69 66 20 74 68 65 20 66 69   file (if the fi
15b00 6c 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20  le has a header 
15b10 63 6f 6d 6d 65 6e 74 2e 29 0a 2a 2f 0a 76 6f 69  comment.).*/.voi
15b20 64 20 50 72 69 6e 74 4d 6f 64 75 6c 65 52 65 63  d PrintModuleRec
15b30 6f 72 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ord(const char *
15b40 7a 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61  zFile, const cha
15b50 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
15b60 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63   int i;.  static
15b70 20 69 6e 74 20 61 64 64 72 20 3d 20 35 3b 0a 20   int addr = 5;. 
15b80 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
15b90 2a 7a 46 69 6c 65 29 20 29 7b 20 7a 46 69 6c 65  *zFile) ){ zFile
15ba0 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 46 69  ++; }.  if( *zFi
15bb0 6c 65 21 3d 27 2f 27 20 7c 7c 20 7a 46 69 6c 65  le!='/' || zFile
15bc0 5b 31 5d 21 3d 27 2a 27 20 29 20 72 65 74 75 72  [1]!='*' ) retur
15bd0 6e 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20 7a 46  n;.  for(i=2; zF
15be0 69 6c 65 5b 69 5d 20 26 26 20 28 7a 46 69 6c 65  ile[i] && (zFile
15bf0 5b 69 2d 31 5d 21 3d 27 2f 27 20 7c 7c 20 7a 46  [i-1]!='/' || zF
15c00 69 6c 65 5b 69 2d 32 5d 21 3d 27 2a 27 29 3b 20  ile[i-2]!='*'); 
15c10 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 46 69  i++){}.  if( zFi
15c20 6c 65 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72  le[i]==0 ) retur
15c30 6e 3b 0a 20 20 70 72 69 6e 74 66 28 22 25 73 20  n;.  printf("%s 
15c40 4d 20 25 73 20 25 64 20 25 64 20 30 20 30 20 30  M %s %d %d 0 0 0
15c50 20 30 5c 6e 25 2e 2a 73 5c 6e 22 2c 0a 20 20 20   0\n%.*s\n",.   
15c60 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 69 6c   zFilename, zFil
15c70 65 6e 61 6d 65 2c 20 61 64 64 72 2c 20 69 2b 31  ename, addr, i+1
15c80 2c 20 69 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 61  , i, zFile);.  a
15c90 64 64 72 20 2b 3d 20 34 3b 0a 7d 0a 0a 0a 2f 2a  ddr += 4;.}.../*
15ca0 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 69 6e 70  .** Given an inp
15cb0 75 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  ut argument to t
15cc0 68 65 20 70 72 6f 67 72 61 6d 2c 20 63 6f 6e 73  he program, cons
15cd0 74 72 75 63 74 20 61 20 6e 65 77 20 49 6e 46 69  truct a new InFi
15ce0 6c 65 0a 2a 2a 20 6f 62 6a 65 63 74 2e 0a 2a 2f  le.** object..*/
15cf0 0a 73 74 61 74 69 63 20 49 6e 46 69 6c 65 20 2a  .static InFile *
15d00 43 72 65 61 74 65 49 6e 46 69 6c 65 28 63 68 61  CreateInFile(cha
15d10 72 20 2a 7a 41 72 67 2c 20 69 6e 74 20 2a 70 6e  r *zArg, int *pn
15d20 45 72 72 29 7b 0a 20 20 69 6e 74 20 6e 53 72 63  Err){.  int nSrc
15d30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 72 63 3b 0a  ;.  char *zSrc;.
15d40 20 20 49 6e 46 69 6c 65 20 2a 70 46 69 6c 65 3b    InFile *pFile;
15d50 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 0a  .  int i;..  /*.
15d60 20 20 2a 2a 20 47 65 74 20 74 68 65 20 6e 61 6d    ** Get the nam
15d70 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  e of the input f
15d80 69 6c 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  ile to be scanne
15d90 64 2e 20 20 54 68 65 20 69 6e 70 75 74 20 66 69  d.  The input fi
15da0 6c 65 20 69 73 0a 20 20 2a 2a 20 65 76 65 72 79  le is.  ** every
15db0 74 68 69 6e 67 20 62 65 66 6f 72 65 20 74 68 65  thing before the
15dc0 20 66 69 72 73 74 20 27 3a 27 20 6f 72 20 74 68   first ':' or th
15dd0 65 20 77 68 6f 6c 65 20 66 69 6c 65 20 69 66 20  e whole file if 
15de0 6e 6f 20 27 3a 27 20 69 73 20 73 65 65 6e 2e 0a  no ':' is seen..
15df0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
15e00 2c 20 6f 6e 20 77 69 6e 64 6f 77 73 2c 20 69 67  , on windows, ig
15e10 6e 6f 72 65 20 61 6e 79 20 27 3a 27 20 74 68 61  nore any ':' tha
15e20 74 20 6f 63 63 75 72 73 20 61 73 20 74 68 65 20  t occurs as the 
15e30 73 65 63 6f 6e 64 20 63 68 61 72 61 63 74 65 72  second character
15e40 0a 20 20 2a 2a 20 73 69 6e 63 65 20 69 74 20 6d  .  ** since it m
15e50 69 67 68 74 20 62 65 20 70 61 72 74 20 6f 66 20  ight be part of 
15e60 74 68 65 20 64 72 69 76 65 20 73 70 65 63 69 66  the drive specif
15e70 69 65 72 2e 20 20 53 6f 20 72 65 61 6c 6c 79 2c  ier.  So really,
15e80 20 74 68 65 20 22 3a 27 20 68 61 73 0a 20 20 2a   the ":' has.  *
15e90 2a 20 74 6f 20 62 65 20 74 68 65 20 33 72 64 20  * to be the 3rd 
15ea0 6f 72 20 6c 61 74 65 72 20 63 68 61 72 61 63 74  or later charact
15eb0 65 72 20 69 6e 20 74 68 65 20 6e 61 6d 65 2e 20  er in the name. 
15ec0 20 54 68 69 73 20 70 72 65 63 6c 75 64 65 73 20   This precludes 
15ed0 31 2d 63 68 61 72 61 63 74 65 72 0a 20 20 2a 2a  1-character.  **
15ee0 20 66 69 6c 65 20 6e 61 6d 65 73 2c 20 77 68 69   file names, whi
15ef0 63 68 20 72 65 61 6c 6c 79 20 73 68 6f 75 6c 64  ch really should
15f00 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
15f10 6d 2e 0a 20 20 2a 2f 0a 20 20 7a 53 72 63 20 3d  m..  */.  zSrc =
15f20 20 7a 41 72 67 3b 0a 20 20 66 6f 72 28 6e 53 72   zArg;.  for(nSr
15f30 63 3d 32 3b 20 7a 53 72 63 5b 6e 53 72 63 5d 20  c=2; zSrc[nSrc] 
15f40 26 26 20 7a 41 72 67 5b 6e 53 72 63 5d 21 3d 27  && zArg[nSrc]!='
15f50 3a 27 3b 20 6e 53 72 63 2b 2b 29 7b 7d 0a 20 20  :'; nSrc++){}.  
15f60 70 46 69 6c 65 20 3d 20 53 61 66 65 4d 61 6c 6c  pFile = SafeMall
15f70 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 46 69 6c  oc( sizeof(InFil
15f80 65 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  e) );.  memset(p
15f90 46 69 6c 65 2c 30 2c 73 69 7a 65 6f 66 28 49 6e  File,0,sizeof(In
15fa0 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d  File));.  pFile-
15fb0 3e 7a 53 72 63 20 3d 20 53 74 72 44 75 70 28 7a  >zSrc = StrDup(z
15fc0 53 72 63 2c 6e 53 72 63 29 3b 0a 0a 20 20 2f 2a  Src,nSrc);..  /*
15fd0 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20 77   Figure out if w
15fe0 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
15ff0 74 68 20 43 20 6f 72 20 43 2b 2b 20 63 6f 64 65  th C or C++ code
16000 2e 20 20 41 73 73 75 6d 65 20 61 6e 79 0a 20 20  .  Assume any.  
16010 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 22 2e 63  ** file with ".c
16020 22 20 6f 72 20 22 2e 68 22 20 69 73 20 43 20 63  " or ".h" is C c
16030 6f 64 65 20 61 6e 64 20 61 6c 6c 20 65 6c 73 65  ode and all else
16040 20 69 73 20 43 2b 2b 2e 0a 20 20 2a 2f 0a 20 20   is C++..  */.  
16050 69 66 28 20 6e 53 72 63 3e 32 20 26 26 20 7a 53  if( nSrc>2 && zS
16060 72 63 5b 6e 53 72 63 2d 32 5d 3d 3d 27 2e 27 20  rc[nSrc-2]=='.' 
16070 26 26 20 28 7a 53 72 63 5b 6e 53 72 63 2d 31 5d  && (zSrc[nSrc-1]
16080 3d 3d 27 63 27 20 7c 7c 20 7a 53 72 63 5b 6e 53  =='c' || zSrc[nS
16090 72 63 2d 31 5d 3d 3d 27 68 27 29 29 7b 0a 20 20  rc-1]=='h')){.  
160a0 20 20 70 46 69 6c 65 2d 3e 66 6c 61 67 73 20 26    pFile->flags &
160b0 3d 20 7e 44 50 5f 43 70 6c 75 73 70 6c 75 73 3b  = ~DP_Cplusplus;
160c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
160d0 69 6c 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 50  ile->flags |= DP
160e0 5f 43 70 6c 75 73 70 6c 75 73 3b 0a 20 20 7d 0a  _Cplusplus;.  }.
160f0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 61 20  .  /*.  ** If a 
16100 73 65 70 61 72 61 74 65 20 68 65 61 64 65 72 20  separate header 
16110 66 69 6c 65 20 69 73 20 73 70 65 63 69 66 69 65  file is specifie
16120 64 2c 20 75 73 65 20 69 74 0a 20 20 2a 2f 0a 20  d, use it.  */. 
16130 20 69 66 28 20 7a 53 72 63 5b 6e 53 72 63 5d 3d   if( zSrc[nSrc]=
16140 3d 27 3a 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  =':' ){.    int 
16150 6e 48 64 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  nHdr;.    char *
16160 7a 48 64 72 3b 0a 20 20 20 20 7a 48 64 72 20 3d  zHdr;.    zHdr =
16170 20 26 7a 53 72 63 5b 6e 53 72 63 2b 31 5d 3b 0a   &zSrc[nSrc+1];.
16180 20 20 20 20 66 6f 72 28 6e 48 64 72 3d 30 3b 20      for(nHdr=0; 
16190 7a 48 64 72 5b 6e 48 64 72 5d 3b 20 6e 48 64 72  zHdr[nHdr]; nHdr
161a0 2b 2b 29 7b 7d 0a 20 20 20 20 70 46 69 6c 65 2d  ++){}.    pFile-
161b0 3e 7a 48 64 72 20 3d 20 53 74 72 44 75 70 28 7a  >zHdr = StrDup(z
161c0 48 64 72 2c 6e 48 64 72 29 3b 0a 20 20 7d 0a 0a  Hdr,nHdr);.  }..
161d0 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e    /* Look for an
161e0 79 20 27 63 27 20 6f 72 20 27 43 27 20 69 6e 20  y 'c' or 'C' in 
161f0 74 68 65 20 73 75 66 66 69 78 20 6f 66 20 74 68  the suffix of th
16200 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  e file name and 
16210 63 68 61 6e 67 65 0a 20 20 2a 2a 20 74 68 61 74  change.  ** that
16220 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 27 68   character to 'h
16230 27 20 6f 72 20 27 48 27 20 72 65 73 70 65 63 74  ' or 'H' respect
16240 69 76 65 6c 79 2e 20 20 49 66 20 6e 6f 20 27 63  ively.  If no 'c
16250 27 20 6f 72 20 27 43 27 20 69 73 20 66 6f 75 6e  ' or 'C' is foun
16260 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 61 73 73  d,.  ** then ass
16270 75 6d 65 20 77 65 20 61 72 65 20 64 65 61 6c 69  ume we are deali
16280 6e 67 20 77 69 74 68 20 61 20 68 65 61 64 65 72  ng with a header
16290 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20  ..  */.  else{. 
162a0 20 20 20 69 6e 74 20 66 6f 75 6e 64 43 20 3d 20     int foundC = 
162b0 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 48  0;.    pFile->zH
162c0 64 72 20 3d 20 53 74 72 44 75 70 28 7a 53 72 63  dr = StrDup(zSrc
162d0 2c 6e 53 72 63 29 3b 0a 20 20 20 20 66 6f 72 28  ,nSrc);.    for(
162e0 69 20 3d 20 6e 53 72 63 2d 31 3b 20 69 3e 30 20  i = nSrc-1; i>0 
162f0 26 26 20 70 46 69 6c 65 2d 3e 7a 48 64 72 5b 69  && pFile->zHdr[i
16300 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b 0a 20 20  ]!='.'; i--){.  
16310 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a      if( pFile->z
16320 48 64 72 5b 69 5d 3d 3d 27 63 27 20 29 7b 0a 20  Hdr[i]=='c' ){. 
16330 20 20 20 20 20 20 20 66 6f 75 6e 64 43 20 3d 20         foundC = 
16340 31 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  1;.        pFile
16350 2d 3e 7a 48 64 72 5b 69 5d 20 3d 20 27 68 27 3b  ->zHdr[i] = 'h';
16360 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
16370 20 70 46 69 6c 65 2d 3e 7a 48 64 72 5b 69 5d 3d   pFile->zHdr[i]=
16380 3d 27 43 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='C' ){.        
16390 66 6f 75 6e 64 43 20 3d 20 31 3b 0a 20 20 20 20  foundC = 1;.    
163a0 20 20 20 20 70 46 69 6c 65 2d 3e 7a 48 64 72 5b      pFile->zHdr[
163b0 69 5d 20 3d 20 27 48 27 3b 0a 20 20 20 20 20 20  i] = 'H';.      
163c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
163d0 21 66 6f 75 6e 64 43 20 29 7b 0a 20 20 20 20 20  !foundC ){.     
163e0 20 53 61 66 65 46 72 65 65 28 70 46 69 6c 65 2d   SafeFree(pFile-
163f0 3e 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 70 46  >zHdr);.      pF
16400 69 6c 65 2d 3e 7a 48 64 72 20 3d 20 30 3b 0a 20  ile->zHdr = 0;. 
16410 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
16420 20 2a 2a 20 49 66 20 70 46 69 6c 65 2d 3e 7a 53   ** If pFile->zS
16430 72 63 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 27  rc contains no '
16440 63 27 20 6f 72 20 27 43 27 20 69 6e 20 69 74 73  c' or 'C' in its
16450 20 65 78 74 65 6e 73 69 6f 6e 2c 20 69 74 0a 20   extension, it. 
16460 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 20 68 65   ** must be a he
16470 61 64 65 72 20 66 69 6c 65 2e 20 20 20 49 6e 20  ader file.   In 
16480 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 6e 65  that case, we ne
16490 65 64 20 74 6f 20 73 65 74 20 74 68 65 0a 20 20  ed to set the.  
164a0 2a 2a 20 50 53 5f 49 6e 74 65 72 66 61 63 65 20  ** PS_Interface 
164b0 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 70 46 69  flag..  */.  pFi
164c0 6c 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 53 5f  le->flags |= PS_
164d0 49 6e 74 65 72 66 61 63 65 3b 0a 20 20 66 6f 72  Interface;.  for
164e0 28 69 3d 6e 53 72 63 2d 31 3b 20 69 3e 30 20 26  (i=nSrc-1; i>0 &
164f0 26 20 7a 53 72 63 5b 69 5d 21 3d 27 2e 27 3b 20  & zSrc[i]!='.'; 
16500 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  i--){.    if( zS
16510 72 63 5b 69 5d 3d 3d 27 63 27 20 7c 7c 20 7a 53  rc[i]=='c' || zS
16520 72 63 5b 69 5d 3d 3d 27 43 27 20 29 7b 0a 20 20  rc[i]=='C' ){.  
16530 20 20 20 20 70 46 69 6c 65 2d 3e 66 6c 61 67 73      pFile->flags
16540 20 26 3d 20 7e 50 53 5f 49 6e 74 65 72 66 61 63   &= ~PS_Interfac
16550 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
16560 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16570 44 6f 6e 65 21 0a 20 20 2a 2f 0a 20 20 72 65 74  Done!.  */.  ret
16580 75 72 6e 20 70 46 69 6c 65 3b 0a 7d 0a 0a 2f 2a  urn pFile;.}../*
16590 20 4d 53 2d 57 69 6e 64 6f 77 73 20 61 6e 64 20   MS-Windows and 
165a0 4d 53 2d 44 4f 53 20 62 6f 74 68 20 68 61 76 65  MS-DOS both have
165b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
165c0 65 72 69 6f 75 73 20 4f 53 20 62 75 67 3a 20 20  erious OS bug:  
165d0 74 68 65 0a 2a 2a 20 6c 65 6e 67 74 68 20 6f 66  the.** length of
165e0 20 61 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20   a command line 
165f0 69 73 20 73 65 76 65 72 65 6c 79 20 72 65 73 74  is severely rest
16600 72 69 63 74 65 64 2e 20 20 42 75 74 20 74 68 69  ricted.  But thi
16610 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 63 63  s program.** occ
16620 61 73 69 6f 6e 61 6c 6c 79 20 72 65 71 75 69 72  asionally requir
16630 65 73 20 6c 6f 6e 67 20 63 6f 6d 6d 61 6e 64 20  es long command 
16640 6c 69 6e 65 73 2e 20 20 48 65 6e 63 65 20 74 68  lines.  Hence th
16650 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 77  e following.** w
16660 6f 72 6b 20 61 72 6f 75 6e 64 2e 0a 2a 2a 0a 2a  ork around..**.*
16670 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  * If the paramet
16680 65 72 73 20 22 2d 66 20 46 49 4c 45 4e 41 4d 45  ers "-f FILENAME
16690 22 20 61 70 70 65 61 72 20 61 6e 79 77 68 65 72  " appear anywher
166a0 65 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  e on the command
166b0 20 6c 69 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20 74   line,.** then t
166c0 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73  he named file is
166d0 20 73 63 61 6e 6e 65 64 20 66 6f 72 20 61 64 64   scanned for add
166e0 69 74 69 6f 6e 61 6c 20 63 6f 6d 6d 61 6e 64 20  itional command 
166f0 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a  line arguments..
16700 2a 2a 20 54 68 65 73 65 20 61 72 67 75 6d 65 6e  ** These argumen
16710 74 73 20 61 72 65 20 73 75 62 73 74 69 74 75 74  ts are substitut
16720 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ed in place of t
16730 68 65 20 22 46 49 4c 45 4e 41 4d 45 22 20 61 72  he "FILENAME" ar
16740 67 75 6d 65 6e 74 0a 2a 2a 20 69 6e 20 74 68 65  gument.** in the
16750 20 6f 72 69 67 69 6e 61 6c 20 61 72 67 75 6d 65   original argume
16760 6e 74 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  nt list..**.** T
16770 68 69 73 20 66 69 72 73 74 20 70 61 72 61 6d 65  his first parame
16780 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ter to this rout
16790 69 6e 65 20 69 73 20 74 68 65 20 69 6e 64 65 78  ine is the index
167a0 20 6f 66 20 74 68 65 20 22 2d 66 22 0a 2a 2a 20   of the "-f".** 
167b0 70 61 72 61 6d 65 74 65 72 20 69 6e 20 74 68 65  parameter in the
167c0 20 61 72 67 76 5b 5d 20 61 72 72 61 79 2e 20 20   argv[] array.  
167d0 54 68 65 20 61 72 67 63 20 61 6e 64 20 61 72 67  The argc and arg
167e0 76 20 61 72 65 20 70 61 73 73 65 64 20 62 79 0a  v are passed by.
167f0 2a 2a 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68  ** pointer so th
16800 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 63  at they can be c
16810 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
16820 72 73 69 6e 67 20 6f 66 20 74 68 65 20 70 61 72  rsing of the par
16830 61 6d 65 74 65 72 73 20 69 6e 20 74 68 65 20 66  ameters in the f
16840 69 6c 65 20 69 73 20 76 65 72 79 20 73 69 6d 70  ile is very simp
16850 6c 65 2e 20 20 50 61 72 61 6d 65 74 65 72 73 0a  le.  Parameters.
16860 2a 2a 20 63 61 6e 20 62 65 20 73 65 70 61 72 61  ** can be separa
16870 74 65 64 20 62 79 20 61 6e 79 20 61 6d 6f 75 6e  ted by any amoun
16880 74 20 6f 66 20 77 68 69 74 65 2d 73 70 61 63 65  t of white-space
16890 20 28 69 6e 63 6c 75 64 69 6e 67 20 6e 65 77 6c   (including newl
168a0 69 6e 65 73 0a 2a 2a 20 61 6e 64 20 63 61 72 72  ines.** and carr
168b0 69 61 67 65 20 72 65 74 75 72 6e 73 2e 29 20 20  iage returns.)  
168c0 54 68 65 72 65 20 61 72 65 20 6e 6f 77 20 71 75  There are now qu
168d0 6f 74 69 6e 67 20 63 68 61 72 61 63 74 65 72 73  oting characters
168e0 20 6f 66 20 61 6e 79 0a 2a 2a 20 6b 69 6e 64 2e   of any.** kind.
168f0 20 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20    The length of 
16900 61 20 74 6f 6b 65 6e 20 69 73 20 6c 69 6d 69 74  a token is limit
16910 65 64 20 74 6f 20 61 62 6f 75 74 20 31 30 30 30  ed to about 1000
16920 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a   characters..*/.
16930 73 74 61 74 69 63 20 76 6f 69 64 20 41 64 64 50  static void AddP
16940 61 72 61 6d 65 74 65 72 73 28 69 6e 74 20 69 6e  arameters(int in
16950 64 65 78 2c 20 69 6e 74 20 2a 70 41 72 67 63 2c  dex, int *pArgc,
16960 20 63 68 61 72 20 2a 2a 2a 70 41 72 67 76 29 7b   char ***pArgv){
16970 0a 20 20 69 6e 74 20 61 72 67 63 20 3d 20 2a 70  .  int argc = *p
16980 41 72 67 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  Argc;      /* Th
16990 65 20 6f 72 69 67 69 6e 61 6c 20 61 72 67 63 20  e original argc 
169a0 76 61 6c 75 65 20 2a 2f 0a 20 20 63 68 61 72 20  value */.  char 
169b0 2a 2a 61 72 67 76 20 3d 20 2a 70 41 72 67 76 3b  **argv = *pArgv;
169c0 20 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e     /* The origin
169d0 61 6c 20 61 72 67 76 20 76 61 6c 75 65 20 2a 2f  al argv value */
169e0 0a 20 20 69 6e 74 20 6e 65 77 41 72 67 63 3b 20  .  int newArgc; 
169f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
16a00 6c 75 65 20 66 6f 72 20 61 72 67 63 20 61 66 74  lue for argc aft
16a10 65 72 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  er inserting new
16a20 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
16a30 63 68 61 72 20 2a 2a 7a 4e 65 77 20 3d 20 30 3b  char **zNew = 0;
16a40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
16a50 65 77 20 61 72 67 76 20 61 66 74 65 72 20 74 68  ew argv after th
16a60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 6f  is routine is do
16a70 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ne */.  char *zF
16a80 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
16a90 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
16aa0 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69  nput file */.  i
16ab0 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20  nt nNew = 0;    
16ac0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16ad0 20 6f 66 20 6e 65 77 20 65 6e 74 72 69 65 73 20   of new entries 
16ae0 69 6e 20 74 68 65 20 61 72 67 76 5b 5d 20 66 69  in the argv[] fi
16af0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c  le */.  int nAll
16b00 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  oc = 0;         
16b10 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
16b20 65 64 20 66 6f 72 20 7a 4e 65 77 5b 5d 20 2a 2f  ed for zNew[] */
16b30 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
16b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
16b50 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
16b60 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
16b70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16b80 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
16b90 69 6e 20 61 20 6e 65 77 20 61 72 67 75 6d 65 6e  in a new argumen
16ba0 74 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20  t */.  int c;   
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16bc0 2a 20 4e 65 78 74 20 63 68 61 72 61 63 74 65 72  * Next character
16bd0 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69   of input */.  i
16be0 6e 74 20 73 74 61 72 74 4f 66 4c 69 6e 65 20 3d  nt startOfLine =
16bf0 20 31 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69   1;    /* True i
16c00 66 20 77 65 20 61 72 65 20 77 68 65 72 65 20 27  f we are where '
16c10 23 27 20 63 61 6e 20 73 74 61 72 74 20 61 20 63  #' can start a c
16c20 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 46 49 4c 45  omment */.  FILE
16c30 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
16c40 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74      /* The input
16c50 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
16c60 7a 42 75 66 5b 31 30 30 30 5d 3b 20 20 20 20 20  zBuf[1000];     
16c70 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 61     /* A single a
16c80 72 67 75 6d 65 6e 74 20 69 73 20 61 63 63 75 6d  rgument is accum
16c90 75 6c 61 74 65 64 20 68 65 72 65 20 2a 2f 0a 0a  ulated here */..
16ca0 20 20 69 66 28 20 69 6e 64 65 78 2b 31 3d 3d 61    if( index+1==a
16cb0 72 67 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  rgc ) return;.  
16cc0 7a 46 69 6c 65 20 3d 20 61 72 67 76 5b 69 6e 64  zFile = argv[ind
16cd0 65 78 2b 31 5d 3b 0a 20 20 69 6e 20 3d 20 66 6f  ex+1];.  in = fo
16ce0 70 65 6e 28 7a 46 69 6c 65 2c 22 72 22 29 3b 0a  pen(zFile,"r");.
16cf0 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
16d00 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
16d10 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 69 6e  r,"Can't open in
16d20 70 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 5c  put file \"%s\"\
16d30 6e 22 2c 7a 46 69 6c 65 29 3b 0a 20 20 20 20 65  n",zFile);.    e
16d40 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 63 20  xit(1);.  }.  c 
16d50 3d 20 27 20 27 3b 0a 20 20 77 68 69 6c 65 28 20  = ' ';.  while( 
16d60 63 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20 77 68  c!=EOF ){.    wh
16d70 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 69  ile( c!=EOF && i
16d80 73 73 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20  sspace(c) ){.   
16d90 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
16da0 7b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 4f  {.        startO
16db0 66 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  fLine = 1;.     
16dc0 20 7d 0a 20 20 20 20 20 20 63 20 3d 20 67 65 74   }.      c = get
16dd0 63 28 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  c(in);.      if(
16de0 20 73 74 61 72 74 4f 66 4c 69 6e 65 20 26 26 20   startOfLine && 
16df0 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  c=='#' ){.      
16e00 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20    while( c!=EOF 
16e10 26 26 20 63 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  && c!='\n' ){.  
16e20 20 20 20 20 20 20 20 20 63 20 3d 20 67 65 74 63          c = getc
16e30 28 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  (in);.        }.
16e40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16e50 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 77 68 69    n = 0;.    whi
16e60 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 21 69  le( c!=EOF && !i
16e70 73 73 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20  sspace(c) ){.   
16e80 20 20 20 69 66 28 20 6e 3c 73 69 7a 65 6f 66 28     if( n<sizeof(
16e90 7a 42 75 66 29 2d 31 20 29 7b 20 7a 42 75 66 5b  zBuf)-1 ){ zBuf[
16ea0 6e 2b 2b 5d 20 3d 20 63 3b 20 7d 0a 20 20 20 20  n++] = c; }.    
16eb0 20 20 73 74 61 72 74 4f 66 4c 69 6e 65 20 3d 20    startOfLine = 
16ec0 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 67 65 74  0;.      c = get
16ed0 63 28 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  c(in);.    }.   
16ee0 20 7a 42 75 66 5b 6e 5d 20 3d 20 30 3b 0a 20 20   zBuf[n] = 0;.  
16ef0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
16f00 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
16f10 20 69 66 28 20 6e 4e 65 77 20 2b 20 61 72 67 63   if( nNew + argc
16f20 20 3e 20 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20   > nAlloc ){.   
16f30 20 20 20 20 20 69 66 28 20 6e 41 6c 6c 6f 63 3d       if( nAlloc=
16f40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16f50 6e 41 6c 6c 6f 63 20 3d 20 31 30 30 20 2b 20 61  nAlloc = 100 + a
16f60 72 67 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  rgc;.          z
16f70 4e 65 77 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69  New = malloc( si
16f80 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 41  zeof(char*) * nA
16f90 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 20 20 20 20  lloc );.        
16fa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16fb0 20 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20   nAlloc *= 2;.  
16fc0 20 20 20 20 20 20 20 20 7a 4e 65 77 20 3d 20 72          zNew = r
16fd0 65 61 6c 6c 6f 63 28 20 7a 4e 65 77 2c 20 73 69  ealloc( zNew, si
16fe0 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 41  zeof(char*) * nA
16ff0 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 20 20 20 20  lloc );.        
17000 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
17010 69 66 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20  if( zNew ){.    
17020 20 20 20 20 69 6e 74 20 6a 20 3d 20 6e 4e 65 77      int j = nNew
17030 20 2b 20 69 6e 64 65 78 3b 0a 20 20 20 20 20 20   + index;.      
17040 20 20 7a 4e 65 77 5b 6a 5d 20 3d 20 6d 61 6c 6c    zNew[j] = mall
17050 6f 63 28 20 6e 20 2b 20 31 20 29 3b 0a 20 20 20  oc( n + 1 );.   
17060 20 20 20 20 20 69 66 28 20 7a 4e 65 77 5b 6a 5d       if( zNew[j]
17070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
17080 72 63 70 79 28 20 7a 4e 65 77 5b 6a 5d 2c 20 7a  rcpy( zNew[j], z
17090 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  Buf );.        }
170a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
170b0 20 7d 0a 20 20 6e 65 77 41 72 67 63 20 3d 20 61   }.  newArgc = a
170c0 72 67 63 20 2b 20 6e 4e 65 77 20 2d 20 31 3b 0a  rgc + nNew - 1;.
170d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 69 6e    for(i=0; i<=in
170e0 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  dex; i++){.    z
170f0 4e 65 77 5b 69 5d 20 3d 20 61 72 67 76 5b 69 5d  New[i] = argv[i]
17100 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6e 4e  ;.  }.  for(i=nN
17110 65 77 20 2b 20 69 6e 64 65 78 20 2b 20 31 3b 20  ew + index + 1; 
17120 69 3c 6e 65 77 41 72 67 63 3b 20 69 2b 2b 29 7b  i<newArgc; i++){
17130 0a 20 20 20 20 7a 4e 65 77 5b 69 5d 20 3d 20 61  .    zNew[i] = a
17140 72 67 76 5b 69 20 2b 20 31 20 2d 20 6e 4e 65 77  rgv[i + 1 - nNew
17150 5d 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77 5b 6e 65  ];.  }.  zNew[ne
17160 77 41 72 67 63 5d 20 3d 20 30 3b 0a 20 20 2a 70  wArgc] = 0;.  *p
17170 41 72 67 63 20 3d 20 6e 65 77 41 72 67 63 3b 0a  Argc = newArgc;.
17180 20 20 2a 70 41 72 67 76 20 3d 20 7a 4e 65 77 3b    *pArgv = zNew;
17190 0a 7d 0a 0a 23 69 66 64 65 66 20 4e 4f 54 5f 55  .}..#ifdef NOT_U
171a0 53 45 44 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  SED./*.** Return
171b0 20 74 68 65 20 74 69 6d 65 20 74 68 61 74 20 74   the time that t
171c0 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 77 61  he given file wa
171d0 73 20 6c 61 73 74 20 6d 6f 64 69 66 69 65 64 2e  s last modified.
171e0 20 20 49 66 20 77 65 20 63 61 6e 27 74 0a 2a 2a    If we can't.**
171f0 20 6c 6f 63 61 74 65 20 74 68 65 20 66 69 6c 65   locate the file
17200 20 28 62 65 63 61 75 73 65 2c 20 66 6f 72 20 65   (because, for e
17210 78 61 6d 70 6c 65 2c 20 69 74 20 64 6f 65 73 6e  xample, it doesn
17220 27 74 20 65 78 69 73 74 29 2c 20 74 68 65 6e 0a  't exist), then.
17230 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  ** return 0..*/.
17240 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
17250 69 6e 74 20 4d 6f 64 54 69 6d 65 28 63 6f 6e 73  int ModTime(cons
17260 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
17270 65 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  e){.  unsigned i
17280 6e 74 20 6d 54 69 6d 65 20 3d 20 30 3b 0a 20 20  nt mTime = 0;.  
17290 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
172a0 74 3b 0a 20 20 69 66 28 20 73 74 61 74 28 7a 46  t;.  if( stat(zF
172b0 69 6c 65 6e 61 6d 65 2c 26 73 53 74 61 74 29 3d  ilename,&sStat)=
172c0 3d 30 20 29 7b 0a 20 20 20 20 6d 54 69 6d 65 20  =0 ){.    mTime 
172d0 3d 20 73 53 74 61 74 2e 73 74 5f 6d 74 69 6d 65  = sStat.st_mtime
172e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
172f0 54 69 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Time;.}.#endif..
17300 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 75 73  /*.** Print a us
17310 61 67 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20  age comment for 
17320 74 68 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  this program..*/
17330 0a 73 74 61 74 69 63 20 76 6f 69 64 20 55 73 61  .static void Usa
17340 67 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ge(const char *a
17350 72 67 76 30 2c 20 63 6f 6e 73 74 20 63 68 61 72  rgv0, const char
17360 20 2a 61 72 67 76 4e 29 7b 0a 20 20 66 70 72 69   *argvN){.  fpri
17370 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
17380 49 6c 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74  Illegal argument
17390 20 5c 22 25 73 5c 22 5c 6e 22 2c 61 72 67 76 30   \"%s\"\n",argv0
173a0 2c 61 72 67 76 4e 29 3b 0a 20 20 66 70 72 69 6e  ,argvN);.  fprin
173b0 74 66 28 73 74 64 65 72 72 2c 22 55 73 61 67 65  tf(stderr,"Usage
173c0 3a 20 25 73 20 5b 6f 70 74 69 6f 6e 73 5d 20 66  : %s [options] f
173d0 69 6c 65 6e 61 6d 65 2e 2e 2e 5c 6e 22 0a 20 20  ilename...\n".  
173e0 20 20 22 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 20    "Options:\n". 
173f0 20 20 20 22 20 20 2d 68 20 20 20 20 20 20 20 20     "  -h        
17400 20 20 47 65 6e 65 72 61 74 65 20 61 20 73 69 6e    Generate a sin
17410 67 6c 65 20 2e 68 20 74 6f 20 73 74 61 6e 64 61  gle .h to standa
17420 72 64 20 6f 75 74 70 75 74 2e 5c 6e 22 0a 20 20  rd output.\n".  
17430 20 20 22 20 20 2d 48 20 20 20 20 20 20 20 20 20    "  -H         
17440 20 4c 69 6b 65 20 2d 68 2c 20 62 75 74 20 6f 6e   Like -h, but on
17450 6c 79 20 6f 75 74 70 75 74 20 45 58 50 4f 52 54  ly output EXPORT
17460 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 5c 6e   declarations.\n
17470 22 0a 20 20 20 20 22 20 20 2d 76 20 20 20 20 20  ".    "  -v     
17480 20 20 20 20 20 28 76 65 72 62 6f 73 65 29 20 57       (verbose) W
17490 72 69 74 65 20 73 74 61 74 75 73 20 69 6e 66 6f  rite status info
174a0 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 73  rmation to the s
174b0 63 72 65 65 6e 2e 5c 6e 22 0a 20 20 20 20 22 20  creen.\n".    " 
174c0 20 2d 64 6f 63 20 20 20 20 20 20 20 20 47 65 6e   -doc        Gen
174d0 65 72 61 74 65 20 6e 6f 20 68 65 61 64 65 72 20  erate no header 
174e0 66 69 6c 65 73 2e 20 20 49 6e 73 74 65 61 64 2c  files.  Instead,
174f0 20 6f 75 74 70 75 74 20 69 6e 66 6f 72 6d 61 74   output informat
17500 69 6f 6e 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  ion\n".    "    
17510 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 63            that c
17520 61 6e 20 62 65 20 75 73 65 64 20 62 79 20 61 6e  an be used by an
17530 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 67 72   automatic progr
17540 61 6d 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  am documentation
17550 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
17560 20 20 20 20 20 20 20 61 6e 64 20 63 72 6f 73 73         and cross
17570 2d 72 65 66 65 72 65 6e 63 65 20 67 65 6e 65 72  -reference gener
17580 61 74 6f 72 2e 5c 6e 22 0a 20 20 20 20 22 20 20  ator.\n".    "  
17590 2d 6c 6f 63 61 6c 20 20 20 20 20 20 47 65 6e 65  -local      Gene
175a0 72 61 74 65 20 70 72 6f 74 6f 74 79 70 65 73 20  rate prototypes 
175b0 66 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20 66  for \"static\" f
175c0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 5c 6e 22 0a  unctions and\n".
175d0 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20      "           
175e0 20 20 20 70 72 6f 63 65 64 75 72 65 73 2e 5c 6e     procedures.\n
175f0 22 0a 20 20 20 20 22 20 20 2d 66 20 46 49 4c 45  ".    "  -f FILE
17600 20 20 20 20 20 52 65 61 64 20 61 64 64 69 74 69       Read additi
17610 6f 6e 61 6c 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  onal command-lin
17620 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d  e arguments from
17630 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 5c   the file named\
17640 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  n".    "        
17650 20 20 20 20 20 20 5c 22 46 49 4c 45 5c 22 2e 5c        \"FILE\".\
17660 6e 22 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a  n".#ifdef DEBUG.
17670 20 20 20 20 22 20 20 2d 21 20 4d 41 53 4b 20 20      "  -! MASK  
17680 20 20 20 53 65 74 20 74 68 65 20 64 65 62 75 67     Set the debug
17690 67 69 6e 67 20 6d 61 73 6b 20 74 6f 20 74 68 65  ging mask to the
176a0 20 6e 75 6d 62 65 72 20 5c 22 4d 41 53 4b 5c 22   number \"MASK\"
176b0 2e 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 20 20  .\n".#endif.    
176c0 22 20 20 2d 2d 20 20 20 20 20 20 20 20 20 20 54  "  --          T
176d0 72 65 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75  reat all subsequ
176e0 65 6e 74 20 63 6f 6d 6d 65 6e 74 2d 6c 69 6e 65  ent comment-line
176f0 20 70 61 72 61 6d 65 74 65 72 73 20 61 73 20 66   parameters as f
17700 69 6c 65 6e 61 6d 65 73 2c 5c 6e 22 0a 20 20 20  ilenames,\n".   
17710 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
17720 65 76 65 6e 20 69 66 20 74 68 65 79 20 62 65 67  even if they beg
17730 69 6e 20 77 69 74 68 20 5c 22 2d 5c 22 2e 5c 6e  in with \"-\".\n
17740 22 2c 0a 20 20 20 20 61 72 67 76 30 0a 20 20 29  ",.    argv0.  )
17750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
17760 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 20 63 6f  ollowing text co
17770 6e 74 61 69 6e 73 20 61 20 66 65 77 20 73 69 6d  ntains a few sim
17780 70 6c 65 20 23 64 65 66 69 6e 65 73 20 74 68 61  ple #defines tha
17790 74 20 77 65 20 77 61 6e 74 0a 2a 2a 20 74 6f 20  t we want.** to 
177a0 62 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  be available to 
177b0 65 76 65 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73  every file..*/.s
177c0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
177d0 20 7a 49 6e 69 74 5b 5d 20 3d 0a 20 20 22 23 64   zInit[] =.  "#d
177e0 65 66 69 6e 65 20 49 4e 54 45 52 46 41 43 45 20  efine INTERFACE 
177f0 30 5c 6e 22 0a 20 20 22 23 64 65 66 69 6e 65 20  0\n".  "#define 
17800 45 58 50 4f 52 54 5f 49 4e 54 45 52 46 41 43 45  EXPORT_INTERFACE
17810 20 30 5c 6e 22 0a 20 20 22 23 64 65 66 69 6e 65   0\n".  "#define
17820 20 4c 4f 43 41 4c 5f 49 4e 54 45 52 46 41 43 45   LOCAL_INTERFACE
17830 20 30 5c 6e 22 0a 20 20 22 23 64 65 66 69 6e 65   0\n".  "#define
17840 20 45 58 50 4f 52 54 5c 6e 22 0a 20 20 22 23 64   EXPORT\n".  "#d
17850 65 66 69 6e 65 20 4c 4f 43 41 4c 20 73 74 61 74  efine LOCAL stat
17860 69 63 5c 6e 22 0a 20 20 22 23 64 65 66 69 6e 65  ic\n".  "#define
17870 20 50 55 42 4c 49 43 5c 6e 22 0a 20 20 22 23 64   PUBLIC\n".  "#d
17880 65 66 69 6e 65 20 50 52 49 56 41 54 45 5c 6e 22  efine PRIVATE\n"
17890 0a 20 20 22 23 64 65 66 69 6e 65 20 50 52 4f 54  .  "#define PROT
178a0 45 43 54 45 44 5c 6e 22 0a 3b 0a 0a 23 69 66 20  ECTED\n".;..#if 
178b0 54 45 53 54 3d 3d 30 0a 69 6e 74 20 6d 61 69 6e  TEST==0.int main
178c0 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
178d0 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 69  **argv){.  int i
178e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
178f0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
17900 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   */.  int nErr =
17910 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
17920 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
17930 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20  encountered */. 
17940 20 54 6f 6b 65 6e 20 2a 70 4c 69 73 74 3b 20 20   Token *pList;  
17950 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
17960 66 20 69 6e 70 75 74 20 74 6f 6b 65 6e 73 20 66  f input tokens f
17970 6f 72 20 6f 6e 65 20 66 69 6c 65 20 2a 2f 0a 20  or one file */. 
17980 20 49 6e 46 69 6c 65 20 2a 70 46 69 6c 65 4c 69   InFile *pFileLi
17990 73 74 20 3d 20 30 3b 2f 2a 20 4c 69 73 74 20 6f  st = 0;/* List o
179a0 66 20 61 6c 6c 20 69 6e 70 75 74 20 66 69 6c 65  f all input file
179b0 73 20 2a 2f 0a 20 20 49 6e 46 69 6c 65 20 2a 70  s */.  InFile *p
179c0 54 61 69 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Tail = 0;    /* 
179d0 4c 61 73 74 20 66 69 6c 65 20 6f 6e 20 74 68 65  Last file on the
179e0 20 6c 69 73 74 20 2a 2f 0a 20 20 49 6e 46 69 6c   list */.  InFil
179f0 65 20 2a 70 46 69 6c 65 3b 20 20 20 20 20 20 20  e *pFile;       
17a00 20 2f 2a 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* for looping 
17a10 6f 76 65 72 20 74 68 65 20 66 69 6c 65 20 6c 69  over the file li
17a20 73 74 20 2a 2f 0a 20 20 69 6e 74 20 68 5f 66 6c  st */.  int h_fl
17a30 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ag = 0;       /*
17a40 20 54 72 75 65 20 69 66 20 2d 68 20 69 73 20 70   True if -h is p
17a50 72 65 73 65 6e 74 2e 20 20 4f 75 74 70 75 74 20  resent.  Output 
17a60 75 6e 69 66 69 65 64 20 68 65 61 64 65 72 20 2a  unified header *
17a70 2f 0a 20 20 69 6e 74 20 48 5f 66 6c 61 67 20 3d  /.  int H_flag =
17a80 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75   0;       /* Tru
17a90 65 20 69 66 20 2d 48 20 69 73 20 70 72 65 73 65  e if -H is prese
17aa0 6e 74 2e 20 20 4f 75 74 70 75 74 20 45 58 50 4f  nt.  Output EXPO
17ab0 52 54 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  RT header */.  i
17ac0 6e 74 20 76 5f 66 6c 61 67 20 3d 20 30 3b 20 20  nt v_flag = 0;  
17ad0 20 20 20 20 20 2f 2a 20 56 65 72 62 6f 73 65 20       /* Verbose 
17ae0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4d 6f 72 65 46  */.  int noMoreF
17af0 6c 61 67 73 3b 20 20 20 20 20 20 2f 2a 20 54 72  lags;      /* Tr
17b00 75 65 20 69 66 20 2d 2d 20 68 61 73 20 62 65 65  ue if -- has bee
17b10 6e 20 73 65 65 6e 2e 20 2a 2f 0a 20 20 46 49 4c  n seen. */.  FIL
17b20 45 20 2a 72 65 70 6f 72 74 3b 20 20 20 20 20 20  E *report;      
17b30 20 20 20 2f 2a 20 53 65 6e 64 20 70 72 6f 67 72     /* Send progr
17b40 65 73 73 20 72 65 70 6f 72 74 73 20 74 6f 20 74  ess reports to t
17b50 68 69 73 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  his, if not NULL
17b60 20 2a 2f 0a 0a 20 20 6e 6f 4d 6f 72 65 46 6c 61   */..  noMoreFla
17b70 67 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  gs = 0;.  for(i=
17b80 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  1; i<argc; i++){
17b90 0a 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d  .    if( argv[i]
17ba0 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 21 6e 6f 4d  [0]=='-' && !noM
17bb0 6f 72 65 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  oreFlags ){.    
17bc0 20 20 73 77 69 74 63 68 28 20 61 72 67 76 5b 69    switch( argv[i
17bd0 5d 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  ][1] ){.        
17be0 63 61 73 65 20 27 68 27 3a 20 20 20 68 5f 66 6c  case 'h':   h_fl
17bf0 61 67 20 3d 20 31 3b 20 20 20 62 72 65 61 6b 3b  ag = 1;   break;
17c00 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 48  .        case 'H
17c10 27 3a 20 20 20 48 5f 66 6c 61 67 20 3d 20 31 3b  ':   H_flag = 1;
17c20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17c30 20 20 63 61 73 65 20 27 76 27 3a 20 20 20 76 5f    case 'v':   v_
17c40 66 6c 61 67 20 3d 20 31 3b 20 20 20 62 72 65 61  flag = 1;   brea
17c50 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
17c60 27 64 27 3a 20 20 20 64 6f 63 5f 66 6c 61 67 20  'd':   doc_flag 
17c70 3d 20 31 3b 20 70 72 6f 74 6f 5f 73 74 61 74 69  = 1; proto_stati
17c80 63 20 3d 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20  c = 1; break;.  
17c90 20 20 20 20 20 20 63 61 73 65 20 27 6c 27 3a 20        case 'l': 
17ca0 20 20 70 72 6f 74 6f 5f 73 74 61 74 69 63 20 3d    proto_static =
17cb0 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20   1; break;.     
17cc0 20 20 20 63 61 73 65 20 27 66 27 3a 20 20 20 41     case 'f':   A
17cd0 64 64 50 61 72 61 6d 65 74 65 72 73 28 69 2c 20  ddParameters(i, 
17ce0 26 61 72 67 63 2c 20 26 61 72 67 76 29 3b 20 62  &argc, &argv); b
17cf0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
17d00 73 65 20 27 2d 27 3a 20 20 20 6e 6f 4d 6f 72 65  se '-':   noMore
17d10 46 6c 61 67 73 20 3d 20 31 3b 20 20 20 62 72 65  Flags = 1;   bre
17d20 61 6b 3b 0a 23 69 66 64 65 66 20 44 45 42 55 47  ak;.#ifdef DEBUG
17d30 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 21  .        case '!
17d40 27 3a 20 20 20 69 2b 2b 3b 20 20 64 65 62 75 67  ':   i++;  debug
17d50 4d 61 73 6b 20 3d 20 73 74 72 74 6f 6c 28 61 72  Mask = strtol(ar
17d60 67 76 5b 69 5d 2c 30 2c 30 29 3b 20 62 72 65 61  gv[i],0,0); brea
17d70 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  k;.#endif.      
17d80 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 55 73    default:    Us
17d90 61 67 65 28 61 72 67 76 5b 30 5d 2c 61 72 67 76  age(argv[0],argv
17da0 5b 69 5d 29 3b 20 72 65 74 75 72 6e 20 31 3b 0a  [i]); return 1;.
17db0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
17dc0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 20 3d  e{.      pFile =
17dd0 20 43 72 65 61 74 65 49 6e 46 69 6c 65 28 61 72   CreateInFile(ar
17de0 67 76 5b 69 5d 2c 26 6e 45 72 72 29 3b 0a 20 20  gv[i],&nErr);.  
17df0 20 20 20 20 69 66 28 20 70 46 69 6c 65 20 29 7b      if( pFile ){
17e00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
17e10 6c 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  leList ){.      
17e20 20 20 20 20 70 54 61 69 6c 2d 3e 70 4e 65 78 74      pTail->pNext
17e30 20 3d 20 70 46 69 6c 65 3b 0a 20 20 20 20 20 20   = pFile;.      
17e40 20 20 20 20 70 54 61 69 6c 20 3d 20 70 46 69 6c      pTail = pFil
17e50 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  e;.        }else
17e60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
17e70 65 4c 69 73 74 20 3d 20 70 54 61 69 6c 20 3d 20  eList = pTail = 
17e80 70 46 69 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d  pFile;.        }
17e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17ea0 20 7d 0a 20 20 69 66 28 20 68 5f 66 6c 61 67 20   }.  if( h_flag 
17eb0 26 26 20 48 5f 66 6c 61 67 20 29 7b 0a 20 20 20  && H_flag ){.   
17ec0 20 68 5f 66 6c 61 67 20 3d 20 30 3b 0a 20 20 7d   h_flag = 0;.  }
17ed0 0a 20 20 69 66 28 20 76 5f 66 6c 61 67 20 29 7b  .  if( v_flag ){
17ee0 0a 20 20 20 20 72 65 70 6f 72 74 20 3d 20 28 68  .    report = (h
17ef0 5f 66 6c 61 67 20 7c 7c 20 48 5f 66 6c 61 67 29  _flag || H_flag)
17f00 20 3f 20 73 74 64 65 72 72 20 3a 20 73 74 64 6f   ? stderr : stdo
17f10 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ut;.  }else{.   
17f20 20 72 65 70 6f 72 74 20 3d 20 30 3b 0a 20 20 7d   report = 0;.  }
17f30 0a 20 20 69 66 28 20 6e 45 72 72 3e 30 20 29 7b  .  if( nErr>0 ){
17f40 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72  .    return nErr
17f50 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 69 6c  ;.  }.  for(pFil
17f60 65 3d 70 46 69 6c 65 4c 69 73 74 3b 20 70 46 69  e=pFileList; pFi
17f70 6c 65 3b 20 70 46 69 6c 65 3d 70 46 69 6c 65 2d  le; pFile=pFile-
17f80 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 68 61  >pNext){.    cha
17f90 72 20 2a 7a 46 69 6c 65 3b 0a 0a 20 20 20 20 7a  r *zFile;..    z
17fa0 46 69 6c 65 6e 61 6d 65 20 3d 20 70 46 69 6c 65  Filename = pFile
17fb0 2d 3e 7a 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->zSrc;.    if( 
17fc0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 63  zFilename==0 ) c
17fd0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 46 69  ontinue;.    zFi
17fe0 6c 65 20 3d 20 52 65 61 64 46 69 6c 65 28 7a 46  le = ReadFile(zF
17ff0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ilename);.    if
18000 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ( zFile==0 ){.  
18010 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
18020 72 72 2c 22 43 61 6e 27 74 20 72 65 61 64 20 69  rr,"Can't read i
18030 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22  nput file \"%s\"
18040 5c 6e 22 2c 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  \n",zFilename);.
18050 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
18060 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
18070 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 6e    }.    if( strn
18080 63 6d 70 28 7a 46 69 6c 65 2c 7a 54 6f 70 4c 69  cmp(zFile,zTopLi
18090 6e 65 2c 6e 54 6f 70 4c 69 6e 65 29 3d 3d 30 20  ne,nTopLine)==0 
180a0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
180b0 7a 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65  zSrc = 0;.    }e
180c0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 72  lse{.      if( r
180d0 65 70 6f 72 74 20 29 20 66 70 72 69 6e 74 66 28  eport ) fprintf(
180e0 72 65 70 6f 72 74 2c 22 52 65 61 64 69 6e 67 20  report,"Reading 
180f0 25 73 2e 2e 2e 5c 6e 22 2c 7a 46 69 6c 65 6e 61  %s...\n",zFilena
18100 6d 65 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  me);.      pList
18110 20 3d 20 54 6f 6b 65 6e 69 7a 65 46 69 6c 65 28   = TokenizeFile(
18120 7a 46 69 6c 65 2c 26 70 46 69 6c 65 2d 3e 69 64  zFile,&pFile->id
18130 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  Table);.      if
18140 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
18150 20 20 20 6e 45 72 72 20 2b 3d 20 50 61 72 73 65     nErr += Parse
18160 46 69 6c 65 28 70 4c 69 73 74 2c 70 46 69 6c 65  File(pList,pFile
18170 2d 3e 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ->flags);.      
18180 20 20 46 72 65 65 54 6f 6b 65 6e 4c 69 73 74 28    FreeTokenList(
18190 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  pList);.      }e
181a0 6c 73 65 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d  lse if( zFile[0]
181b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
181c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 49  printf(stderr,"I
181d0 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22  nput file \"%s\"
181e0 20 69 73 20 65 6d 70 74 79 2e 5c 6e 22 2c 20 7a   is empty.\n", z
181f0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
18200 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
18210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18220 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
18230 45 72 72 6f 72 73 20 77 68 69 6c 65 20 70 72 6f  Errors while pro
18240 63 65 73 73 69 6e 67 20 5c 22 25 73 5c 22 5c 6e  cessing \"%s\"\n
18250 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
18260 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20         nErr++;. 
18270 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18280 20 69 66 28 20 21 64 6f 63 5f 66 6c 61 67 20 29   if( !doc_flag )
18290 20 53 61 66 65 46 72 65 65 28 7a 46 69 6c 65 29   SafeFree(zFile)
182a0 3b 0a 20 20 20 20 69 66 28 20 64 6f 63 5f 66 6c  ;.    if( doc_fl
182b0 61 67 20 29 20 50 72 69 6e 74 4d 6f 64 75 6c 65  ag ) PrintModule
182c0 52 65 63 6f 72 64 28 7a 46 69 6c 65 2c 7a 46 69  Record(zFile,zFi
182d0 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69  lename);.  }.  i
182e0 66 28 20 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20  f( nErr>0 ){.   
182f0 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20   return nErr;.  
18300 7d 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a 20  }.#ifdef DEBUG. 
18310 20 69 66 28 20 64 65 62 75 67 4d 61 73 6b 20 26   if( debugMask &
18320 20 44 45 43 4c 5f 44 55 4d 50 20 29 7b 0a 20 20   DECL_DUMP ){.  
18330 20 20 44 75 6d 70 44 65 63 6c 4c 69 73 74 28 29    DumpDeclList()
18340 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72  ;.    return nEr
18350 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  r;.  }.#endif.  
18360 69 66 28 20 64 6f 63 5f 66 6c 61 67 20 29 7b 0a  if( doc_flag ){.
18370 20 20 20 20 44 6f 63 75 6d 65 6e 74 61 74 69 6f      Documentatio
18380 6e 44 75 6d 70 28 29 3b 0a 20 20 20 20 72 65 74  nDump();.    ret
18390 75 72 6e 20 6e 45 72 72 3b 0a 20 20 7d 0a 20 20  urn nErr;.  }.  
183a0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 2d 2d 69  zFilename = "--i
183b0 6e 74 65 72 6e 61 6c 2d 2d 22 3b 0a 20 20 70 4c  nternal--";.  pL
183c0 69 73 74 20 3d 20 54 6f 6b 65 6e 69 7a 65 46 69  ist = TokenizeFi
183d0 6c 65 28 7a 49 6e 69 74 2c 30 29 3b 0a 20 20 69  le(zInit,0);.  i
183e0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
183f0 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 2b 31     return nErr+1
18400 3b 0a 20 20 7d 0a 20 20 50 61 72 73 65 46 69 6c  ;.  }.  ParseFil
18410 65 28 70 4c 69 73 74 2c 50 53 5f 49 6e 74 65 72  e(pList,PS_Inter
18420 66 61 63 65 29 3b 0a 20 20 46 72 65 65 54 6f 6b  face);.  FreeTok
18430 65 6e 4c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20  enList(pList);. 
18440 20 69 66 28 20 68 5f 66 6c 61 67 20 7c 7c 20 48   if( h_flag || H
18450 5f 66 6c 61 67 20 29 7b 0a 20 20 20 20 6e 45 72  _flag ){.    nEr
18460 72 20 2b 3d 20 4d 61 6b 65 47 6c 6f 62 61 6c 48  r += MakeGlobalH
18470 65 61 64 65 72 28 48 5f 66 6c 61 67 29 3b 0a 20  eader(H_flag);. 
18480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
18490 70 46 69 6c 65 3d 70 46 69 6c 65 4c 69 73 74 3b  pFile=pFileList;
184a0 20 70 46 69 6c 65 3b 20 70 46 69 6c 65 3d 70 46   pFile; pFile=pF
184b0 69 6c 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ile->pNext){.   
184c0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 53     if( pFile->zS
184d0 72 63 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rc==0 ) continue
184e0 3b 0a 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20  ;.      nErr += 
184f0 4d 61 6b 65 48 65 61 64 65 72 28 70 46 69 6c 65  MakeHeader(pFile
18500 2c 72 65 70 6f 72 74 2c 30 29 3b 0a 20 20 20 20  ,report,0);.    
18510 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
18520 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a        Err;.}.#endif.