0000: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
0010: 72 20 69 64 65 6e 74 5b 5d 20 3d 20 22 40 28 23 r ident[] = "@(#
0020: 29 20 24 48 65 61 64 65 72 3a 20 2f 63 76 73 74 ) $Header: /cvst
0030: 72 61 63 2f 63 76 73 74 72 61 63 2f 6d 61 6b 65 rac/cvstrac/make
0040: 68 65 61 64 65 72 73 2e 63 2c 76 20 31 2e 34 20 headers.c,v 1.4
0050: 32 30 30 35 2f 30 33 2f 31 36 20 32 32 3a 31 37 2005/03/16 22:17
0060: 3a 35 31 20 64 72 68 20 45 78 70 20 24 22 3b 0a :51 drh Exp $";.
0070: 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 /*.** This progr
0080: 61 6d 20 73 63 61 6e 73 20 43 20 61 6e 64 20 43 am scans C and C
0090: 2b 2b 20 73 6f 75 72 63 65 20 66 69 6c 65 73 20 ++ source files
00a0: 61 6e 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c and automaticall
00b0: 79 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61 y generates.** a
00c0: 70 70 72 6f 70 72 69 61 74 65 20 68 65 61 64 65 ppropriate heade
00d0: 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e 63 r files..*/.#inc
00e0: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 lude <stdio.h>.#
00f0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e include <stdlib.
0100: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 h>.#include <cty
0110: 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c pe.h>.#include <
0120: 6d 65 6d 6f 72 79 2e 68 3e 0a 23 69 6e 63 6c 75 memory.h>.#inclu
0130: 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a de <sys/stat.h>.
0140: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 #include <assert
0150: 2e 68 3e 0a 23 69 66 6e 64 65 66 20 57 49 4e 33 .h>.#ifndef WIN3
0160: 32 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e 69 2.# include <uni
0170: 73 74 64 2e 68 3e 0a 23 65 6c 73 65 0a 23 20 69 std.h>.#else.# i
0180: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 nclude <string.h
0190: 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 >.#endif../*.**
01a0: 4d 61 63 72 6f 73 20 66 6f 72 20 64 65 62 75 67 Macros for debug
01b0: 67 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 ging..*/.#ifdef
01c0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 DEBUG.static int
01d0: 20 64 65 62 75 67 4d 61 73 6b 20 3d 20 30 3b 0a debugMask = 0;.
01e0: 23 20 64 65 66 69 6e 65 20 64 65 62 75 67 30 28 # define debug0(
01f0: 46 2c 4d 29 20 20 20 20 20 20 20 69 66 28 20 28 F,M) if( (
0200: 46 29 26 64 65 62 75 67 4d 61 73 6b 20 29 7b 20 F)&debugMask ){
0210: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 4d fprintf(stderr,M
0220: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 64 65 ); }.# define de
0230: 62 75 67 31 28 46 2c 4d 2c 41 29 20 20 20 20 20 bug1(F,M,A)
0240: 69 66 28 20 28 46 29 26 64 65 62 75 67 4d 61 73 if( (F)&debugMas
0250: 6b 20 29 7b 20 66 70 72 69 6e 74 66 28 73 74 64 k ){ fprintf(std
0260: 65 72 72 2c 4d 2c 41 29 3b 20 7d 0a 23 20 64 65 err,M,A); }.# de
0270: 66 69 6e 65 20 64 65 62 75 67 32 28 46 2c 4d 2c fine debug2(F,M,
0280: 41 2c 42 29 20 20 20 69 66 28 20 28 46 29 26 64 A,B) if( (F)&d
0290: 65 62 75 67 4d 61 73 6b 20 29 7b 20 66 70 72 69 ebugMask ){ fpri
02a0: 6e 74 66 28 73 74 64 65 72 72 2c 4d 2c 41 2c 42 ntf(stderr,M,A,B
02b0: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 64 65 ); }.# define de
02c0: 62 75 67 33 28 46 2c 4d 2c 41 2c 42 2c 43 29 20 bug3(F,M,A,B,C)
02d0: 69 66 28 20 28 46 29 26 64 65 62 75 67 4d 61 73 if( (F)&debugMas
02e0: 6b 20 29 7b 20 66 70 72 69 6e 74 66 28 73 74 64 k ){ fprintf(std
02f0: 65 72 72 2c 4d 2c 41 2c 42 2c 43 29 3b 20 7d 0a err,M,A,B,C); }.
0300: 23 20 64 65 66 69 6e 65 20 50 41 52 53 45 52 20 # define PARSER
0310: 20 20 20 20 20 30 78 30 30 30 30 30 30 30 31 0a 0x00000001.
0320: 23 20 64 65 66 69 6e 65 20 44 45 43 4c 5f 44 55 # define DECL_DU
0330: 4d 50 20 20 20 30 78 30 30 30 30 30 30 30 32 0a MP 0x00000002.
0340: 23 20 64 65 66 69 6e 65 20 54 4f 4b 45 4e 49 5a # define TOKENIZ
0350: 45 52 20 20 20 30 78 30 30 30 30 30 30 30 34 0a ER 0x00000004.
0360: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 #else.# define d
0370: 65 62 75 67 30 28 46 6c 61 67 73 2c 20 46 6f 72 ebug0(Flags, For
0380: 6d 61 74 29 0a 23 20 64 65 66 69 6e 65 20 64 65 mat).# define de
0390: 62 75 67 31 28 46 6c 61 67 73 2c 20 46 6f 72 6d bug1(Flags, Form
03a0: 61 74 2c 20 41 29 0a 23 20 64 65 66 69 6e 65 20 at, A).# define
03b0: 64 65 62 75 67 32 28 46 6c 61 67 73 2c 20 46 6f debug2(Flags, Fo
03c0: 72 6d 61 74 2c 20 41 2c 20 42 29 0a 23 20 64 65 rmat, A, B).# de
03d0: 66 69 6e 65 20 64 65 62 75 67 33 28 46 6c 61 67 fine debug3(Flag
03e0: 73 2c 20 46 6f 72 6d 61 74 2c 20 41 2c 20 42 2c s, Format, A, B,
03f0: 20 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a C).#endif../*.*
0400: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 * The following
0410: 6d 61 63 72 6f 73 20 61 72 65 20 70 75 72 65 6c macros are purel
0420: 79 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 y for the purpos
0430: 65 20 6f 66 20 74 65 73 74 69 6e 67 20 74 68 69 e of testing thi
0440: 73 0a 2a 2a 20 70 72 6f 67 72 61 6d 20 6f 6e 20 s.** program on
0450: 69 74 73 65 6c 66 2e 20 20 54 68 65 79 20 64 6f itself. They do
0460: 6e 27 74 20 72 65 61 6c 6c 79 20 63 6f 6e 74 72 n't really contr
0470: 69 62 75 74 65 20 74 6f 20 74 68 65 20 63 6f 64 ibute to the cod
0480: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4e e..*/.#define IN
0490: 54 45 52 46 41 43 45 20 31 0a 23 64 65 66 69 6e TERFACE 1.#defin
04a0: 65 20 45 58 50 4f 52 54 5f 49 4e 54 45 52 46 41 e EXPORT_INTERFA
04b0: 43 45 20 31 0a 23 64 65 66 69 6e 65 20 45 58 50 CE 1.#define EXP
04c0: 4f 52 54 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 ORT../*.** Each
04d0: 74 6f 6b 65 6e 20 69 6e 20 61 20 73 6f 75 72 63 token in a sourc
04e0: 65 20 66 69 6c 65 20 69 73 20 72 65 70 72 65 73 e file is repres
04f0: 65 6e 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74 ented by an inst
0500: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66 ance of.** the f
0510: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 ollowing structu
0520: 72 65 2e 20 20 54 6f 6b 65 6e 73 20 61 72 65 20 re. Tokens are
0530: 63 6f 6c 6c 65 63 74 65 64 20 6f 6e 74 6f 20 61 collected onto a
0540: 20 6c 69 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 list..*/.typede
0550: 66 20 73 74 72 75 63 74 20 54 6f 6b 65 6e 20 54 f struct Token T
0560: 6f 6b 65 6e 3b 0a 73 74 72 75 63 74 20 54 6f 6b oken;.struct Tok
0570: 65 6e 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 en {. const cha
0580: 72 20 2a 7a 54 65 78 74 3b 20 20 20 20 20 20 2f r *zText; /
0590: 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 * The text of th
05a0: 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 e token */. int
05b0: 20 6e 54 65 78 74 3b 20 20 20 20 20 20 20 20 20 nText;
05c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
05d0: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 f characters in
05e0: 74 68 65 20 74 6f 6b 65 6e 27 73 20 74 65 78 74 the token's text
05f0: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b */. int eType;
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
0610: 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 68 69 The type of thi
0620: 73 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 s token */. int
0630: 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 nLine;
0640: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65 /* The line
0650: 20 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 number on which
0660: 20 74 68 65 20 74 6f 6b 65 6e 20 73 74 61 72 74 the token start
0670: 73 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 s */. Token *pC
0680: 6f 6d 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 2f omment; /
0690: 2a 20 4d 6f 73 74 20 72 65 63 65 6e 74 20 62 6c * Most recent bl
06a0: 6f 63 6b 20 63 6f 6d 6d 65 6e 74 20 62 65 66 6f ock comment befo
06b0: 72 65 20 74 68 69 73 20 74 6f 6b 65 6e 20 2a 2f re this token */
06c0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 65 78 74 3b . Token *pNext;
06d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 /* Ne
06e0: 78 74 20 74 6f 6b 65 6e 20 6f 6e 20 74 68 65 20 xt token on the
06f0: 6c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 list */. Token
0700: 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 *pPrev;
0710: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 6f /* Previous to
0720: 6b 65 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 ken on the list
0730: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 */.};../*.** Dur
0740: 69 6e 67 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e ing tokenization
0750: 2c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 , information ab
0760: 6f 75 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 out the state of
0770: 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 73 74 the input.** st
0780: 72 65 61 6d 20 69 73 20 68 65 6c 64 20 69 6e 20 ream is held in
0790: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 an instance of t
07a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 he following str
07b0: 75 63 74 75 72 65 0a 2a 2f 0a 74 79 70 65 64 65 ucture.*/.typede
07c0: 66 20 73 74 72 75 63 74 20 49 6e 53 74 72 65 61 f struct InStrea
07d0: 6d 20 49 6e 53 74 72 65 61 6d 3b 0a 73 74 72 75 m InStream;.stru
07e0: 63 74 20 49 6e 53 74 72 65 61 6d 20 7b 0a 20 20 ct InStream {.
07f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20 20 const char *z;
0800: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c /* Compl
0810: 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 ete text of the
0820: 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 input */. int i
0830: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
0840: 20 20 20 2f 2a 20 4e 65 78 74 20 63 68 61 72 61 /* Next chara
0850: 63 74 65 72 20 74 6f 20 72 65 61 64 20 66 72 6f cter to read fro
0860: 6d 20 74 68 65 20 69 6e 70 75 74 20 2a 2f 0a 20 m the input */.
0870: 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 int nLine;
0880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
0890: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 line number for
08a0: 63 68 61 72 61 63 74 65 72 20 7a 5b 69 5d 20 2a character z[i] *
08b0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 /.};../*.** Each
08c0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 20 declaration in
08d0: 74 68 65 20 43 20 6f 72 20 43 2b 2b 20 73 6f 75 the C or C++ sou
08e0: 72 63 65 20 66 69 6c 65 73 20 69 73 20 70 61 72 rce files is par
08f0: 73 65 64 20 6f 75 74 20 61 6e 64 20 73 74 6f 72 sed out and stor
0900: 65 64 20 61 73 0a 2a 2a 20 61 6e 20 69 6e 73 74 ed as.** an inst
0910: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c ance of the foll
0920: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e owing structure.
0930: 0a 2a 2a 0a 2a 2a 20 41 20 22 66 6f 72 77 61 72 .**.** A "forwar
0940: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 22 20 69 d declaration" i
0950: 73 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 s a declaration
0960: 74 68 61 74 20 61 6e 20 6f 62 6a 65 63 74 20 65 that an object e
0970: 78 69 73 74 73 20 74 68 61 74 0a 2a 2a 20 64 6f xists that.** do
0980: 65 73 6e 27 74 20 74 65 6c 6c 20 61 62 6f 75 74 esn't tell about
0990: 20 74 68 65 20 6f 62 6a 65 63 74 73 20 73 74 72 the objects str
09a0: 75 63 74 75 72 65 2e 20 20 41 20 74 79 70 69 63 ucture. A typic
09b0: 61 6c 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 al forward decla
09c0: 72 61 74 69 6f 6e 0a 2a 2a 20 69 73 3a 0a 2a 2a ration.** is:.**
09d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 74 72 .** str
09e0: 75 63 74 20 58 79 7a 7a 79 3b 0a 2a 2a 0a 2a 2a uct Xyzzy;.**.**
09f0: 20 4e 6f 74 20 65 76 65 72 79 20 6f 62 6a 65 63 Not every objec
0a00: 74 20 68 61 73 20 61 20 66 6f 72 77 61 72 64 20 t has a forward
0a10: 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 20 49 66 declaration. If
0a20: 20 69 74 20 64 6f 65 73 2c 20 74 68 6f 75 67 68 it does, though
0a30: 74 2c 20 74 68 65 0a 2a 2a 20 66 6f 72 77 61 72 t, the.** forwar
0a40: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 77 69 d declaration wi
0a50: 6c 6c 20 62 65 20 63 6f 6e 74 61 69 6e 65 64 20 ll be contained
0a60: 69 6e 20 74 68 65 20 7a 46 77 64 20 66 69 65 6c in the zFwd fiel
0a70: 64 20 66 6f 72 20 43 20 61 6e 64 0a 2a 2a 20 74 d for C and.** t
0a80: 68 65 20 7a 46 77 64 43 70 70 20 66 6f 72 20 43 he zFwdCpp for C
0a90: 2b 2b 2e 20 20 54 68 65 20 7a 44 65 63 6c 20 66 ++. The zDecl f
0aa0: 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20 74 68 ield contains th
0ab0: 65 20 63 6f 6d 70 6c 65 74 65 20 0a 2a 2a 20 64 e complete .** d
0ac0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 65 78 74 2e eclaration text.
0ad0: 20 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 .*/.typedef st
0ae0: 72 75 63 74 20 44 65 63 6c 20 44 65 63 6c 3b 0a ruct Decl Decl;.
0af0: 73 74 72 75 63 74 20 44 65 63 6c 20 7b 0a 20 20 struct Decl {.
0b00: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 char *zName;
0b10: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 /* Name of th
0b20: 65 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 64 e object being d
0b30: 65 63 6c 61 72 65 64 2e 20 20 54 68 65 20 61 70 eclared. The ap
0b40: 70 65 61 72 61 6e 63 65 0a 20 20 20 20 20 20 20 pearance.
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a **
0b60: 20 6f 66 20 74 68 69 73 20 6e 61 6d 65 20 69 73 of this name is
0b70: 20 61 20 73 6f 75 72 63 65 20 66 69 6c 65 20 74 a source file t
0b80: 72 69 67 67 65 72 73 20 74 68 65 20 64 65 63 6c riggers the decl
0b90: 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 aration.
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 **
0bb0: 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 to be added to t
0bc0: 68 65 20 68 65 61 64 65 72 20 66 6f 72 20 74 68 he header for th
0bd0: 61 74 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 63 68 at file. */. ch
0be0: 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 ar *zFile;
0bf0: 20 2f 2a 20 46 69 6c 65 20 66 72 6f 6d 20 77 68 /* File from wh
0c00: 69 63 68 20 65 78 74 72 61 63 74 65 64 2e 20 20 ich extracted.
0c10: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 66 3b 20 */. char *zIf;
0c20: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 72 72 6f /* Surro
0c30: 75 6e 64 20 74 68 65 20 64 65 63 6c 61 72 61 74 und the declarat
0c40: 69 6f 6e 20 77 69 74 68 20 74 68 69 73 20 23 69 ion with this #i
0c50: 66 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 77 f */. char *zFw
0c60: 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 d; /* A f
0c70: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 orward declarati
0c80: 6f 6e 2e 20 20 4e 55 4c 4c 20 69 66 20 74 68 65 on. NULL if the
0c90: 72 65 20 69 73 20 6e 6f 6e 65 2e 20 2a 2f 0a 20 re is none. */.
0ca0: 20 63 68 61 72 20 2a 7a 46 77 64 43 70 70 3b 20 char *zFwdCpp;
0cb0: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 /* Use this
0cc0: 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 forward declarat
0cd0: 69 6f 6e 20 66 6f 72 20 43 2b 2b 2e 20 2a 2f 0a ion for C++. */.
0ce0: 20 20 63 68 61 72 20 2a 7a 44 65 63 6c 3b 20 20 char *zDecl;
0cf0: 20 20 20 20 20 2f 2a 20 41 20 66 75 6c 6c 20 64 /* A full d
0d00: 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 74 68 eclaration of th
0d10: 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 is object */. c
0d20: 68 61 72 20 2a 7a 45 78 74 72 61 3b 20 20 20 20 har *zExtra;
0d30: 20 20 2f 2a 20 45 78 74 72 61 20 64 65 63 6c 61 /* Extra decla
0d40: 72 61 74 69 6f 6e 20 74 65 78 74 20 69 6e 73 65 ration text inse
0d50: 72 74 65 64 20 69 6e 74 6f 20 63 6c 61 73 73 20 rted into class
0d60: 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69 6e 74 objects */. int
0d70: 20 65 78 74 72 61 54 79 70 65 3b 20 20 20 20 20 extraType;
0d80: 2f 2a 20 4c 61 73 74 20 70 75 62 6c 69 63 3a 2c /* Last public:,
0d90: 20 70 72 6f 74 65 63 74 65 64 3a 20 6f 72 20 70 protected: or p
0da0: 72 69 76 61 74 65 3a 20 69 6e 20 7a 45 78 74 72 rivate: in zExtr
0db0: 61 44 65 63 6c 20 2a 2f 0a 20 20 73 74 72 75 63 aDecl */. struc
0dc0: 74 20 49 6e 63 6c 75 64 65 20 2a 70 49 6e 63 6c t Include *pIncl
0dd0: 75 64 65 3b 20 20 20 2f 2a 20 23 69 6e 63 6c 75 ude; /* #inclu
0de0: 64 65 73 20 74 68 61 74 20 63 6f 6d 65 20 62 65 des that come be
0df0: 66 6f 72 65 20 74 68 69 73 20 64 65 63 6c 61 72 fore this declar
0e00: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 ation */. int f
0e10: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 2f 2a lags; /*
0e20: 20 53 65 65 20 74 68 65 20 22 50 72 6f 70 65 72 See the "Proper
0e30: 74 69 65 73 22 20 62 65 6c 6f 77 20 2a 2f 0a 20 ties" below */.
0e40: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6d 6d 65 6e 74 Token *pComment
0e50: 3b 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20 63 ; /* A block c
0e60: 6f 6d 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 omment associate
0e70: 64 20 77 69 74 68 20 74 68 69 73 20 64 65 63 6c d with this decl
0e80: 61 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b aration */. Tok
0e90: 65 6e 20 74 6f 6b 65 6e 43 6f 64 65 3b 20 20 20 en tokenCode;
0ea0: 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f /* Implementatio
0eb0: 6e 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 20 61 n of functions a
0ec0: 6e 64 20 70 72 6f 63 65 64 75 72 65 73 20 2a 2f nd procedures */
0ed0: 0a 20 20 44 65 63 6c 20 2a 70 53 61 6d 65 4e 61 . Decl *pSameNa
0ee0: 6d 65 3b 20 20 20 2f 2a 20 4e 65 78 74 20 64 65 me; /* Next de
0ef0: 63 6c 61 72 61 74 69 6f 6e 20 77 69 74 68 20 74 claration with t
0f00: 68 65 20 73 61 6d 65 20 22 7a 4e 61 6d 65 22 20 he same "zName"
0f10: 2a 2f 0a 20 20 44 65 63 6c 20 2a 70 53 61 6d 65 */. Decl *pSame
0f20: 48 61 73 68 3b 20 20 20 2f 2a 20 4e 65 78 74 20 Hash; /* Next
0f30: 64 65 63 6c 61 72 61 74 69 6f 6e 20 77 69 74 68 declaration with
0f40: 20 73 61 6d 65 20 68 61 73 68 20 62 75 74 20 64 same hash but d
0f50: 69 66 66 65 72 65 6e 74 20 7a 4e 61 6d 65 20 2a ifferent zName *
0f60: 2f 0a 20 20 44 65 63 6c 20 2a 70 4e 65 78 74 3b /. Decl *pNext;
0f70: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 /* Next d
0f80: 65 63 6c 61 72 61 74 69 6f 6e 20 77 69 74 68 20 eclaration with
0f90: 61 20 64 69 66 66 65 72 65 6e 74 20 6e 61 6d 65 a different name
0fa0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 */.};../*.** Pr
0fb0: 6f 70 65 72 74 69 65 73 20 61 73 73 6f 63 69 61 operties associa
0fc0: 74 65 64 20 77 69 74 68 20 64 65 63 6c 61 72 61 ted with declara
0fd0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 44 50 5f tions..**.** DP_
0fe0: 46 6f 72 77 61 72 64 20 61 6e 64 20 44 50 5f 44 Forward and DP_D
0ff0: 65 63 6c 61 72 65 64 20 61 72 65 20 75 73 65 64 eclared are used
1000: 20 64 75 72 69 6e 67 20 74 68 65 20 67 65 6e 65 during the gene
1010: 72 61 74 69 6f 6e 20 6f 66 20 61 20 73 69 6e 67 ration of a sing
1020: 6c 65 0a 2a 2a 20 68 65 61 64 65 72 20 66 69 6c le.** header fil
1030: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 e in order to pr
1040: 65 76 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 event duplicate
1050: 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e 64 declarations and
1060: 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 2a 2a definitions..**
1070: 20 44 50 5f 46 6f 72 77 61 72 64 20 69 73 20 73 DP_Forward is s
1080: 65 74 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a et after the obj
1090: 65 63 74 20 68 61 73 20 62 65 65 6e 20 67 69 76 ect has been giv
10a0: 65 6e 20 61 20 66 6f 72 77 61 72 64 20 64 65 63 en a forward dec
10b0: 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 laration.** and
10c0: 44 50 5f 44 65 63 6c 61 72 65 64 20 69 73 20 73 DP_Declared is s
10d0: 65 74 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a et after the obj
10e0: 65 63 74 20 67 65 74 73 20 61 20 66 75 6c 6c 20 ect gets a full
10f0: 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a declarations..**
1100: 20 28 45 78 61 6d 70 6c 65 3a 20 20 41 20 66 6f (Example: A fo
1110: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f rward declaratio
1120: 6e 20 69 73 20 22 74 79 70 65 64 65 66 20 73 74 n is "typedef st
1130: 72 75 63 74 20 41 62 63 20 41 62 63 3b 22 20 61 ruct Abc Abc;" a
1140: 6e 64 20 74 68 65 0a 2a 2a 20 66 75 6c 6c 20 64 nd the.** full d
1150: 65 63 6c 61 72 61 74 69 6f 6e 20 69 73 20 22 73 eclaration is "s
1160: 74 72 75 63 74 20 41 62 63 20 7b 20 69 6e 74 20 truct Abc { int
1170: 61 3b 20 66 6c 6f 61 74 20 62 3b 20 7d 3b 22 2e a; float b; };".
1180: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 44 50 5f 45 ).**.** The DP_E
1190: 78 70 6f 72 74 20 61 6e 64 20 44 50 5f 4c 6f 63 xport and DP_Loc
11a0: 61 6c 20 66 6c 61 67 73 20 61 72 65 20 6d 6f 72 al flags are mor
11b0: 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 54 68 e permanent. Th
11c0: 65 79 20 6d 61 72 6b 20 6f 62 6a 65 63 74 73 0a ey mark objects.
11d0: 2a 2a 20 74 68 61 74 20 68 61 76 65 20 45 58 50 ** that have EXP
11e0: 4f 52 54 20 73 63 6f 70 65 20 61 6e 64 20 4c 4f ORT scope and LO
11f0: 43 41 4c 20 73 63 6f 70 65 20 72 65 73 70 65 63 CAL scope respec
1200: 74 69 76 65 6c 79 2e 20 20 49 66 20 62 6f 74 68 tively. If both
1210: 20 6f 66 20 74 68 65 73 65 0a 2a 2a 20 6d 61 72 of these.** mar
1220: 6b 73 20 61 72 65 20 6d 69 73 73 69 6e 67 2c 20 ks are missing,
1230: 74 68 65 6e 20 74 68 65 20 6f 62 6a 65 63 74 20 then the object
1240: 68 61 73 20 6c 69 62 72 61 72 79 20 73 63 6f 70 has library scop
1250: 65 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 73 e. The meanings
1260: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 63 6f 70 65 of.** the scope
1270: 73 20 61 72 65 20 61 73 20 66 6f 6c 6c 6f 77 73 s are as follows
1280: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4c 4f 43 41 4c :.**.** LOCAL
1290: 20 73 63 6f 70 65 20 20 20 20 20 20 20 20 20 54 scope T
12a0: 68 65 20 6f 62 6a 65 63 74 20 69 73 20 6f 6e 6c he object is onl
12b0: 79 20 75 73 61 62 6c 65 20 77 69 74 68 69 6e 20 y usable within
12c0: 74 68 65 20 66 69 6c 65 20 69 6e 0a 2a 2a 20 20 the file in.**
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12e0: 20 20 20 20 20 20 77 68 69 63 68 20 69 74 20 69 which it i
12f0: 73 20 64 65 63 6c 61 72 65 64 2e 0a 2a 2a 0a 2a s declared..**.*
1300: 2a 20 20 20 20 6c 69 62 72 61 72 79 20 73 63 6f * library sco
1310: 70 65 20 20 20 20 20 20 20 54 68 65 20 6f 62 6a pe The obj
1320: 65 63 74 20 69 73 20 76 69 73 69 62 6c 65 20 61 ect is visible a
1330: 6e 64 20 75 73 61 62 6c 65 20 77 69 74 68 69 6e nd usable within
1340: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 other.**
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1360: 20 66 69 6c 65 73 20 69 6e 20 74 68 65 20 73 61 files in the sa
1370: 6d 65 20 70 72 6f 6a 65 63 74 2e 20 20 42 79 20 me project. By
1380: 69 66 20 74 68 65 20 70 72 6f 6a 65 63 74 20 69 if the project i
1390: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 s.**
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 61 20 6c 69 a li
13b0: 62 72 61 72 79 2c 20 74 68 65 6e 20 74 68 65 20 brary, then the
13c0: 6f 62 6a 65 63 74 20 69 73 20 6e 6f 74 20 76 69 object is not vi
13d0: 73 69 62 6c 65 20 74 6f 20 75 73 65 72 73 0a 2a sible to users.*
13e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
13f0: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 of the
1400: 6c 69 62 72 61 72 79 2e 20 20 28 69 2e 65 2e 20 library. (i.e.
1410: 74 68 65 20 6f 62 6a 65 63 74 20 64 6f 65 73 20 the object does
1420: 6e 6f 74 20 61 70 70 65 61 72 0a 2a 2a 20 20 20 not appear.**
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1440: 20 20 20 20 20 69 6e 20 74 68 65 20 6f 75 74 70 in the outp
1450: 75 74 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 ut when using th
1460: 65 20 2d 48 20 6f 70 74 69 6f 6e 2e 29 0a 2a 2a e -H option.).**
1470: 0a 2a 2a 20 20 20 20 45 58 50 4f 52 54 20 73 63 .** EXPORT sc
1480: 6f 70 65 20 20 20 20 20 20 20 20 54 68 65 20 6f ope The o
1490: 62 6a 65 63 74 20 69 73 20 76 69 73 69 62 6c 65 bject is visible
14a0: 20 61 6e 64 20 75 73 61 62 6c 65 20 65 76 65 72 and usable ever
14b0: 79 77 68 65 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 ywhere..**.** Th
14c0: 65 20 44 50 5f 46 6c 61 67 20 69 73 20 61 20 74 e DP_Flag is a t
14d0: 65 6d 70 6f 72 61 72 79 20 75 73 65 20 66 6c 61 emporary use fla
14e0: 67 20 74 68 61 74 20 69 73 20 75 73 65 64 20 64 g that is used d
14f0: 75 72 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 uring processing
1500: 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 61 to.** prevent a
1510: 6e 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 2e n infinite loop.
1520: 20 20 49 74 27 73 20 75 73 65 20 69 73 20 6c 6f It's use is lo
1530: 63 61 6c 69 7a 65 64 2e 20 20 0a 2a 2a 0a 2a 2a calized. .**.**
1540: 20 54 68 65 20 44 50 5f 43 70 6c 75 73 70 6c 75 The DP_Cplusplu
1550: 73 2c 20 44 50 5f 45 78 74 65 72 6e 43 52 65 71 s, DP_ExternCReq
1560: 64 20 61 6e 64 20 44 50 5f 45 78 74 65 72 6e 52 d and DP_ExternR
1570: 65 71 64 20 66 6c 61 67 73 20 61 72 65 20 70 65 eqd flags are pe
1580: 72 6d 61 6e 65 6e 74 0a 2a 2a 20 61 6e 64 20 61 rmanent.** and a
1590: 72 65 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 re used to speci
15a0: 66 79 20 77 68 61 74 20 74 79 70 65 20 6f 66 20 fy what type of
15b0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 68 65 20 declaration the
15c0: 6f 62 6a 65 63 74 20 72 65 71 75 69 72 65 73 2e object requires.
15d0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 50 5f 46 .*/.#define DP_F
15e0: 6f 72 77 61 72 64 20 20 20 20 20 20 30 78 30 30 orward 0x00
15f0: 31 20 20 20 2f 2a 20 48 61 73 20 61 20 66 6f 72 1 /* Has a for
1600: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e ward declaration
1610: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f in this file */
1620: 0a 23 64 65 66 69 6e 65 20 44 50 5f 44 65 63 6c .#define DP_Decl
1630: 61 72 65 64 20 20 20 20 20 30 78 30 30 32 20 20 ared 0x002
1640: 20 2f 2a 20 48 61 73 20 61 20 66 75 6c 6c 20 64 /* Has a full d
1650: 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 20 74 68 eclaration in th
1660: 69 73 20 66 69 6c 65 20 2a 2f 0a 23 64 65 66 69 is file */.#defi
1670: 6e 65 20 44 50 5f 45 78 70 6f 72 74 20 20 20 20 ne DP_Export
1680: 20 20 20 30 78 30 30 34 20 20 20 2f 2a 20 45 78 0x004 /* Ex
1690: 70 6f 72 74 20 74 68 69 73 20 64 65 63 6c 61 72 port this declar
16a0: 61 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 ation */.#define
16b0: 20 44 50 5f 4c 6f 63 61 6c 20 20 20 20 20 20 20 DP_Local
16c0: 20 30 78 30 30 38 20 20 20 2f 2a 20 44 65 63 6c 0x008 /* Decl
16d0: 61 72 65 20 69 6e 20 69 74 73 20 68 6f 6d 65 20 are in its home
16e0: 66 69 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 file only */.#de
16f0: 66 69 6e 65 20 44 50 5f 46 6c 61 67 20 20 20 20 fine DP_Flag
1700: 20 20 20 20 20 30 78 30 31 30 20 20 20 2f 2a 20 0x010 /*
1710: 55 73 65 20 74 6f 20 6d 61 72 6b 20 61 20 73 75 Use to mark a su
1720: 62 73 65 74 20 6f 66 20 61 20 44 65 63 6c 20 6c bset of a Decl l
1730: 69 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 ist.
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1750: 20 20 20 20 2a 2a 20 66 6f 72 20 73 70 65 63 69 ** for speci
1760: 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f al processing */
1770: 0a 23 64 65 66 69 6e 65 20 44 50 5f 43 70 6c 75 .#define DP_Cplu
1780: 73 70 6c 75 73 20 20 20 20 30 78 30 32 30 20 20 splus 0x020
1790: 20 2f 2a 20 48 61 73 20 43 2b 2b 20 6c 69 6e 6b /* Has C++ link
17a0: 61 67 65 20 61 6e 64 20 63 61 6e 6e 6f 74 20 61 age and cannot a
17b0: 70 70 65 61 72 20 69 6e 20 61 0a 20 20 20 20 20 ppear in a.
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17d0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 20 ** C
17e0: 68 65 61 64 65 72 20 66 69 6c 65 20 2a 2f 0a 23 header file */.#
17f0: 64 65 66 69 6e 65 20 44 50 5f 45 78 74 65 72 6e define DP_Extern
1800: 43 52 65 71 64 20 20 30 78 30 34 30 20 20 20 2f CReqd 0x040 /
1810: 2a 20 50 72 65 70 65 6e 64 20 27 65 78 74 65 72 * Prepend 'exter
1820: 6e 20 22 43 22 27 20 69 6e 20 61 20 43 2b 2b 20 n "C"' in a C++
1830: 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 header..
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1850: 20 20 20 20 20 20 20 20 2a 2a 20 50 72 65 70 65 ** Prepe
1860: 6e 64 20 6e 6f 74 68 69 6e 67 20 69 6e 20 61 20 nd nothing in a
1870: 43 20 68 65 61 64 65 72 20 2a 2f 0a 23 64 65 66 C header */.#def
1880: 69 6e 65 20 44 50 5f 45 78 74 65 72 6e 52 65 71 ine DP_ExternReq
1890: 64 20 20 20 30 78 30 38 30 20 20 20 2f 2a 20 50 d 0x080 /* P
18a0: 72 65 70 65 6e 64 20 27 65 78 74 65 72 6e 20 22 repend 'extern "
18b0: 43 22 27 20 69 6e 20 61 20 43 2b 2b 20 68 65 61 C"' in a C++ hea
18c0: 64 65 72 20 69 66 0a 20 20 20 20 20 20 20 20 20 der if.
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18e0: 20 20 20 20 20 20 20 2a 2a 20 44 50 5f 43 70 6c ** DP_Cpl
18f0: 75 73 70 6c 75 73 20 69 73 20 6e 6f 74 20 61 6c usplus is not al
1900: 73 6f 20 73 65 74 2e 20 49 66 20 44 50 5f 43 70 so set. If DP_Cp
1910: 6c 75 73 70 6c 75 73 0a 20 20 20 20 20 20 20 20 lusplus.
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1930: 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 ** is se
1940: 74 20 6f 72 20 74 68 69 73 20 69 73 20 61 20 43 t or this is a C
1950: 20 68 65 61 64 65 72 20 74 68 65 6e 0a 20 20 20 header then.
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 **
1980: 70 72 65 70 65 6e 64 20 27 65 78 74 65 72 6e 27 prepend 'extern'
1990: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 */../*.** Conve
19a0: 6e 69 65 6e 63 65 20 6d 61 63 72 6f 73 20 66 6f nience macros fo
19b0: 72 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 64 r dealing with d
19c0: 65 63 6c 61 72 61 74 69 6f 6e 20 70 72 6f 70 65 eclaration prope
19d0: 72 74 69 65 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 rties.*/.#define
19e0: 20 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 DeclHasProperty
19f0: 28 44 2c 50 29 20 20 20 20 28 28 28 44 29 2d 3e (D,P) (((D)->
1a00: 66 6c 61 67 73 26 28 50 29 29 3d 3d 28 50 29 29 flags&(P))==(P))
1a10: 0a 23 64 65 66 69 6e 65 20 44 65 63 6c 48 61 73 .#define DeclHas
1a20: 41 6e 79 50 72 6f 70 65 72 74 79 28 44 2c 50 29 AnyProperty(D,P)
1a30: 20 28 28 28 44 29 2d 3e 66 6c 61 67 73 26 28 50 (((D)->flags&(P
1a40: 29 29 21 3d 30 29 0a 23 64 65 66 69 6e 65 20 44 ))!=0).#define D
1a50: 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 44 eclSetProperty(D
1a60: 2c 50 29 20 20 20 20 28 44 29 2d 3e 66 6c 61 67 ,P) (D)->flag
1a70: 73 20 7c 3d 20 28 50 29 0a 23 64 65 66 69 6e 65 s |= (P).#define
1a80: 20 44 65 63 6c 43 6c 65 61 72 50 72 6f 70 65 72 DeclClearProper
1a90: 74 79 28 44 2c 50 29 20 20 28 44 29 2d 3e 66 6c ty(D,P) (D)->fl
1aa0: 61 67 73 20 26 3d 20 7e 28 50 29 0a 0a 2f 2a 0a ags &= ~(P)../*.
1ab0: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 73 74 61 ** These are sta
1ac0: 74 65 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 te properties of
1ad0: 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 45 61 the parser. Ea
1ae0: 63 68 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 ch of the values
1af0: 20 69 73 0a 2a 2a 20 64 69 73 74 69 6e 63 74 20 is.** distinct
1b00: 66 72 6f 6d 20 74 68 65 20 44 50 5f 20 76 61 6c from the DP_ val
1b10: 75 65 73 20 61 62 6f 76 65 20 73 6f 20 74 68 61 ues above so tha
1b20: 74 20 62 6f 74 68 20 63 61 6e 20 62 65 20 75 73 t both can be us
1b30: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 73 61 6d ed in.** the sam
1b40: 65 20 22 66 6c 61 67 73 22 20 66 69 65 6c 64 2e e "flags" field.
1b50: 0a 2a 2a 0a 2a 2a 20 42 65 20 63 61 72 65 66 75 .**.** Be carefu
1b60: 6c 20 6e 6f 74 20 74 6f 20 63 6f 6e 66 75 73 65 l not to confuse
1b70: 20 50 53 5f 45 78 70 6f 72 74 20 77 69 74 68 20 PS_Export with
1b80: 44 50 5f 45 78 70 6f 72 74 20 6f 72 0a 2a 2a 20 DP_Export or.**
1b90: 50 53 5f 4c 6f 63 61 6c 20 77 69 74 68 20 44 50 PS_Local with DP
1ba0: 5f 4c 6f 63 61 6c 2e 20 20 54 68 65 69 72 20 6e _Local. Their n
1bb0: 61 6d 65 73 20 61 72 65 20 73 69 6d 69 6c 61 72 ames are similar
1bc0: 2c 20 62 75 74 20 74 68 65 20 6d 65 61 6e 69 6e , but the meanin
1bd0: 67 73 0a 2a 2a 20 6f 66 20 74 68 65 73 65 20 66 gs.** of these f
1be0: 6c 61 67 73 20 61 72 65 20 76 65 72 79 20 64 69 lags are very di
1bf0: 66 66 65 72 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 fferent..*/.#def
1c00: 69 6e 65 20 50 53 5f 45 78 74 65 72 6e 20 20 20 ine PS_Extern
1c10: 20 20 20 20 20 30 78 30 30 30 38 30 30 20 20 20 0x000800
1c20: 20 2f 2a 20 22 65 78 74 65 72 6e 22 20 68 61 73 /* "extern" has
1c30: 20 62 65 65 6e 20 73 65 65 6e 20 2a 2f 0a 23 64 been seen */.#d
1c40: 65 66 69 6e 65 20 50 53 5f 45 78 70 6f 72 74 20 efine PS_Export
1c50: 20 20 20 20 20 20 20 30 78 30 30 31 30 30 30 20 0x001000
1c60: 20 20 20 2f 2a 20 49 66 20 62 65 74 77 65 65 6e /* If between
1c70: 20 22 23 69 66 20 45 58 50 4f 52 54 5f 49 4e 54 "#if EXPORT_INT
1c80: 45 52 46 41 43 45 22 20 0a 20 20 20 20 20 20 20 ERFACE" .
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a **
1cb0: 20 61 6e 64 20 22 23 65 6e 64 69 66 22 20 2a 2f and "#endif" */
1cc0: 0a 23 64 65 66 69 6e 65 20 50 53 5f 45 78 70 6f .#define PS_Expo
1cd0: 72 74 32 20 20 20 20 20 20 20 30 78 30 30 32 30 rt2 0x0020
1ce0: 30 30 20 20 20 20 2f 2a 20 49 66 20 22 45 58 50 00 /* If "EXP
1cf0: 4f 52 54 22 20 73 65 65 6e 20 2a 2f 0a 23 64 65 ORT" seen */.#de
1d00: 66 69 6e 65 20 50 53 5f 54 79 70 65 64 65 66 20 fine PS_Typedef
1d10: 20 20 20 20 20 20 30 78 30 30 34 30 30 30 20 20 0x004000
1d20: 20 20 2f 2a 20 49 66 20 22 74 79 70 65 64 65 66 /* If "typedef
1d30: 22 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 " has been seen
1d40: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 53 74 */.#define PS_St
1d50: 61 74 69 63 20 20 20 20 20 20 20 20 30 78 30 30 atic 0x00
1d60: 38 30 30 30 20 20 20 20 2f 2a 20 49 66 20 22 73 8000 /* If "s
1d70: 74 61 74 69 63 22 20 68 61 73 20 62 65 65 6e 20 tatic" has been
1d80: 73 65 65 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 seen */.#define
1d90: 50 53 5f 49 6e 74 65 72 66 61 63 65 20 20 20 20 PS_Interface
1da0: 20 30 78 30 31 30 30 30 30 20 20 20 20 2f 2a 20 0x010000 /*
1db0: 49 66 20 77 69 74 68 69 6e 20 23 69 66 20 49 4e If within #if IN
1dc0: 54 45 52 46 41 43 45 2e 2e 23 65 6e 64 69 66 20 TERFACE..#endif
1dd0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 4d 65 */.#define PS_Me
1de0: 74 68 6f 64 20 20 20 20 20 20 20 20 30 78 30 32 thod 0x02
1df0: 30 30 30 30 20 20 20 20 2f 2a 20 49 66 20 22 3a 0000 /* If ":
1e00: 3a 22 20 74 6f 6b 65 6e 20 68 61 73 20 62 65 65 :" token has bee
1e10: 6e 20 73 65 65 6e 20 2a 2f 0a 23 64 65 66 69 6e n seen */.#defin
1e20: 65 20 50 53 5f 4c 6f 63 61 6c 20 20 20 20 20 20 e PS_Local
1e30: 20 20 20 30 78 30 34 30 30 30 30 20 20 20 20 2f 0x040000 /
1e40: 2a 20 49 66 20 77 69 74 68 69 6e 20 23 69 66 20 * If within #if
1e50: 4c 4f 43 41 4c 5f 49 4e 54 45 52 46 41 43 45 2e LOCAL_INTERFACE.
1e60: 2e 23 65 6e 64 69 66 20 2a 2f 0a 23 64 65 66 69 .#endif */.#defi
1e70: 6e 65 20 50 53 5f 4c 6f 63 61 6c 32 20 20 20 20 ne PS_Local2
1e80: 20 20 20 20 30 78 30 38 30 30 30 30 20 20 20 20 0x080000
1e90: 2f 2a 20 49 66 20 22 4c 4f 43 41 4c 22 20 73 65 /* If "LOCAL" se
1ea0: 65 6e 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 en. */.#define P
1eb0: 53 5f 50 75 62 6c 69 63 20 20 20 20 20 20 20 20 S_Public
1ec0: 30 78 31 30 30 30 30 30 20 20 20 20 2f 2a 20 49 0x100000 /* I
1ed0: 66 20 22 50 55 42 4c 49 43 22 20 73 65 65 6e 2e f "PUBLIC" seen.
1ee0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 50 */.#define PS_P
1ef0: 72 6f 74 65 63 74 65 64 20 20 20 20 20 30 78 32 rotected 0x2
1f00: 30 30 30 30 30 20 20 20 20 2f 2a 20 49 66 20 22 00000 /* If "
1f10: 50 52 4f 54 45 43 54 45 44 22 20 73 65 65 6e 2e PROTECTED" seen.
1f20: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 50 */.#define PS_P
1f30: 72 69 76 61 74 65 20 20 20 20 20 20 20 30 78 34 rivate 0x4
1f40: 30 30 30 30 30 20 20 20 20 2f 2a 20 49 66 20 22 00000 /* If "
1f50: 50 52 49 56 41 54 45 22 20 73 65 65 6e 2e 20 2a PRIVATE" seen. *
1f60: 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 50 50 50 /.#define PS_PPP
1f70: 20 20 20 20 20 20 20 20 20 20 20 30 78 37 30 30 0x700
1f80: 30 30 30 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 000 /* If any
1f90: 20 6f 66 20 50 55 42 4c 49 43 2c 20 50 52 49 56 of PUBLIC, PRIV
1fa0: 41 54 45 2c 20 50 52 4f 54 45 43 54 45 44 20 2a ATE, PROTECTED *
1fb0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c /../*.** The fol
1fc0: 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 66 6c lowing set of fl
1fd0: 61 67 73 20 61 72 65 20 4f 52 65 64 20 69 6e 74 ags are ORed int
1fe0: 6f 20 74 68 65 20 22 66 6c 61 67 73 22 20 66 69 o the "flags" fi
1ff0: 65 6c 64 20 6f 66 0a 2a 2a 20 61 20 44 65 63 6c eld of.** a Decl
2000: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 64 65 in order to ide
2010: 6e 74 69 66 79 20 77 68 61 74 20 74 79 70 65 20 ntify what type
2020: 6f 66 20 6f 62 6a 65 63 74 20 69 73 20 62 65 69 of object is bei
2030: 6e 67 0a 2a 2a 20 64 65 63 6c 61 72 65 64 2e 0a ng.** declared..
2040: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 59 5f 43 6c */.#define TY_Cl
2050: 61 73 73 20 20 20 20 20 20 20 20 20 30 78 30 30 ass 0x00
2060: 31 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 54 100000.#define T
2070: 59 5f 53 75 62 72 6f 75 74 69 6e 65 20 20 20 20 Y_Subroutine
2080: 30 78 30 30 32 30 30 30 30 30 0a 23 64 65 66 69 0x00200000.#defi
2090: 6e 65 20 54 59 5f 4d 61 63 72 6f 20 20 20 20 20 ne TY_Macro
20a0: 20 20 20 20 30 78 30 30 34 30 30 30 30 30 0a 23 0x00400000.#
20b0: 64 65 66 69 6e 65 20 54 59 5f 54 79 70 65 64 65 define TY_Typede
20c0: 66 20 20 20 20 20 20 20 30 78 30 30 38 30 30 30 f 0x008000
20d0: 30 30 0a 23 64 65 66 69 6e 65 20 54 59 5f 56 61 00.#define TY_Va
20e0: 72 69 61 62 6c 65 20 20 20 20 20 20 30 78 30 31 riable 0x01
20f0: 30 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 54 000000.#define T
2100: 59 5f 53 74 72 75 63 74 75 72 65 20 20 20 20 20 Y_Structure
2110: 30 78 30 32 30 30 30 30 30 30 0a 23 64 65 66 69 0x02000000.#defi
2120: 6e 65 20 54 59 5f 55 6e 69 6f 6e 20 20 20 20 20 ne TY_Union
2130: 20 20 20 20 30 78 30 34 30 30 30 30 30 30 0a 23 0x04000000.#
2140: 64 65 66 69 6e 65 20 54 59 5f 45 6e 75 6d 65 72 define TY_Enumer
2150: 61 74 69 6f 6e 20 20 20 30 78 30 38 30 30 30 30 ation 0x080000
2160: 30 30 0a 23 64 65 66 69 6e 65 20 54 59 5f 44 65 00.#define TY_De
2170: 66 75 6e 63 74 20 20 20 20 20 20 20 30 78 31 30 funct 0x10
2180: 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 64 20 000000 /* Used
2190: 74 6f 20 65 72 61 73 65 20 61 20 64 65 63 6c 61 to erase a decla
21a0: 72 61 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a ration */../*.**
21b0: 20 45 61 63 68 20 6e 65 73 74 65 64 20 23 69 66 Each nested #if
21c0: 20 28 6f 72 20 23 69 66 64 65 66 20 6f 72 20 23 (or #ifdef or #
21d0: 69 66 6e 64 65 66 29 20 69 73 20 73 74 6f 72 65 ifndef) is store
21e0: 64 20 69 6e 20 61 20 73 74 61 63 6b 20 6f 66 20 d in a stack of
21f0: 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 .** instances of
2200: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 the following s
2210: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 tructure..*/.typ
2220: 65 64 65 66 20 73 74 72 75 63 74 20 49 66 6d 61 edef struct Ifma
2230: 63 72 6f 20 49 66 6d 61 63 72 6f 3b 0a 73 74 72 cro Ifmacro;.str
2240: 75 63 74 20 49 66 6d 61 63 72 6f 20 7b 0a 20 20 uct Ifmacro {.
2250: 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 int nLine;
2260: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 /* Line numbe
2270: 72 20 77 68 65 72 65 20 74 68 69 73 20 6d 61 63 r where this mac
2280: 72 6f 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 63 ro occurs */. c
2290: 68 61 72 20 2a 7a 43 6f 6e 64 69 74 69 6f 6e 3b har *zCondition;
22a0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 /* Text of the
22b0: 20 63 6f 6e 64 69 74 69 6f 6e 20 66 6f 72 20 74 condition for t
22c0: 68 69 73 20 6d 61 63 72 6f 20 2a 2f 0a 20 20 49 his macro */. I
22d0: 66 6d 61 63 72 6f 20 2a 70 4e 65 78 74 3b 20 20 fmacro *pNext;
22e0: 20 20 2f 2a 20 4e 65 78 74 20 64 6f 77 6e 20 69 /* Next down i
22f0: 6e 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 20 n the stack */.
2300: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 int flags;
2310: 20 20 20 20 2f 2a 20 43 61 6e 20 68 6f 6c 64 20 /* Can hold
2320: 50 53 5f 45 78 70 6f 72 74 2c 20 50 53 5f 49 6e PS_Export, PS_In
2330: 74 65 72 66 61 63 65 20 6f 72 20 50 53 5f 4c 6f terface or PS_Lo
2340: 63 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 7d 3b 0a cal flags */.};.
2350: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 70 61 72 73 ./*.** When pars
2360: 69 6e 67 20 61 20 66 69 6c 65 2c 20 77 65 20 6e ing a file, we n
2370: 65 65 64 20 74 6f 20 6b 65 65 70 20 74 72 61 63 eed to keep trac
2380: 6b 20 6f 66 20 77 68 61 74 20 6f 74 68 65 72 20 k of what other
2390: 66 69 6c 65 73 20 68 61 76 65 0a 2a 2a 20 62 65 files have.** be
23a0: 20 23 69 6e 63 6c 75 64 65 2d 65 64 2e 20 20 46 #include-ed. F
23b0: 6f 72 20 65 61 63 68 20 23 69 6e 63 6c 75 64 65 or each #include
23c0: 20 66 6f 75 6e 64 2c 20 77 65 20 63 72 65 61 74 found, we creat
23d0: 65 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 e an instance of
23e0: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e .** the followin
23f0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a g structure..*/.
2400: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49 typedef struct I
2410: 6e 63 6c 75 64 65 20 49 6e 63 6c 75 64 65 3b 0a nclude Include;.
2420: 73 74 72 75 63 74 20 49 6e 63 6c 75 64 65 20 7b struct Include {
2430: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 . char *zFile;
2440: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d /* The nam
2450: 65 20 6f 66 20 66 69 6c 65 20 69 6e 63 6c 75 64 e of file includ
2460: 65 2e 20 20 49 6e 63 6c 75 64 65 73 20 22 22 20 e. Includes ""
2470: 6f 72 20 3c 3e 20 2a 2f 0a 20 20 63 68 61 72 20 or <> */. char
2480: 2a 7a 49 66 3b 20 20 20 20 20 20 20 20 20 2f 2a *zIf; /*
2490: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 23 69 If not NULL, #i
24a0: 6e 63 6c 75 64 65 20 73 68 6f 75 6c 64 20 62 65 nclude should be
24b0: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 23 69 66 enclosed in #if
24c0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 61 62 */. char *zLab
24d0: 65 6c 3b 20 20 20 20 20 20 2f 2a 20 41 20 75 6e el; /* A un
24e0: 69 71 75 65 20 6c 61 62 65 6c 20 75 73 65 64 20 ique label used
24f0: 74 6f 20 74 65 73 74 20 69 66 20 74 68 69 73 20 to test if this
2500: 23 69 6e 63 6c 75 64 65 20 68 61 73 0a 20 20 20 #include has.
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2520: 20 20 20 2a 20 61 70 70 65 61 72 65 64 20 61 6c * appeared al
2530: 72 65 61 64 79 20 69 6e 20 61 20 66 69 6c 65 20 ready in a file
2540: 6f 72 20 6e 6f 74 20 2a 2f 0a 20 20 49 6e 63 6c or not */. Incl
2550: 75 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 2f ude *pNext; /
2560: 2a 20 50 72 65 76 69 6f 75 73 20 69 6e 63 6c 75 * Previous inclu
2570: 64 65 20 66 69 6c 65 2c 20 6f 72 20 4e 55 4c 4c de file, or NULL
2580: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 if this is the
2590: 66 69 72 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a first */.};../*.
25a0: 2a 2a 20 49 64 65 6e 74 69 66 69 65 72 73 20 66 ** Identifiers f
25b0: 6f 75 6e 64 20 69 6e 20 61 20 73 6f 75 72 63 65 ound in a source
25c0: 20 66 69 6c 65 20 74 68 61 74 20 6d 69 67 68 74 file that might
25d0: 20 62 65 20 75 73 65 64 20 6c 61 74 65 72 20 74 be used later t
25e0: 6f 20 70 72 6f 76 6f 6b 65 0a 2a 2a 20 74 68 65 o provoke.** the
25f0: 20 63 6f 70 79 69 6e 67 20 6f 66 20 61 20 64 65 copying of a de
2600: 63 6c 61 72 61 74 69 6f 6e 20 69 6e 74 6f 20 74 claration into t
2610: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 he corresponding
2620: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 72 65 header file are
2630: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 .** stored in a
2640: 68 61 73 68 20 74 61 62 6c 65 20 61 73 20 69 6e hash table as in
2650: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 stances of the f
2660: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 ollowing structu
2670: 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 re..*/.typedef s
2680: 74 72 75 63 74 20 49 64 65 6e 74 20 49 64 65 6e truct Ident Iden
2690: 74 3b 0a 73 74 72 75 63 74 20 49 64 65 6e 74 20 t;.struct Ident
26a0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b {. char *zName;
26b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 /* The t
26c0: 65 78 74 20 6f 66 20 74 68 69 73 20 69 64 65 6e ext of this iden
26d0: 74 69 66 69 65 72 20 2a 2f 0a 20 20 49 64 65 6e tifier */. Iden
26e0: 74 20 2a 70 43 6f 6c 6c 69 64 65 3b 20 20 20 20 t *pCollide;
26f0: 2f 2a 20 4e 65 78 74 20 69 64 65 6e 74 69 66 69 /* Next identifi
2700: 65 72 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 er with the same
2710: 20 68 61 73 68 20 2a 2f 0a 20 20 49 64 65 6e 74 hash */. Ident
2720: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f *pNext; /
2730: 2a 20 4e 65 78 74 20 69 64 65 6e 74 69 66 69 65 * Next identifie
2740: 72 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 r in a list of t
2750: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f hem all */.};../
2760: 2a 0a 2a 2a 20 41 20 63 6f 6d 70 6c 65 74 65 20 *.** A complete
2770: 74 61 62 6c 65 20 6f 66 20 69 64 65 6e 74 69 66 table of identif
2780: 69 65 72 73 20 69 73 20 73 74 6f 72 65 64 20 69 iers is stored i
2790: 6e 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 n an instance of
27a0: 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 73 74 72 .** the next str
27b0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 23 64 65 66 69 ucture..*/.#defi
27c0: 6e 65 20 49 44 45 4e 54 5f 48 41 53 48 5f 53 49 ne IDENT_HASH_SI
27d0: 5a 45 20 32 32 33 37 0a 74 79 70 65 64 65 66 20 ZE 2237.typedef
27e0: 73 74 72 75 63 74 20 49 64 65 6e 74 54 61 62 6c struct IdentTabl
27f0: 65 20 49 64 65 6e 74 54 61 62 6c 65 3b 0a 73 74 e IdentTable;.st
2800: 72 75 63 74 20 49 64 65 6e 74 54 61 62 6c 65 20 ruct IdentTable
2810: 7b 0a 20 20 49 64 65 6e 74 20 2a 70 4c 69 73 74 {. Ident *pList
2820: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
2830: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 /* List of
2840: 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 all identifiers
2850: 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 2a in this table *
2860: 2f 0a 20 20 49 64 65 6e 74 20 2a 61 70 54 61 62 /. Ident *apTab
2870: 6c 65 5b 49 44 45 4e 54 5f 48 41 53 48 5f 53 49 le[IDENT_HASH_SI
2880: 5a 45 5d 3b 20 20 2f 2a 20 54 68 65 20 68 61 73 ZE]; /* The has
2890: 68 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f h table */.};../
28a0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 *.** The followi
28b0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c ng structure hol
28c0: 64 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 ds all informati
28d0: 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 0a on for a single.
28e0: 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6e ** source file n
28f0: 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d amed on the comm
2900: 61 6e 64 20 6c 69 6e 65 20 6f 66 20 74 68 69 73 and line of this
2910: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 74 79 70 program..*/.typ
2920: 65 64 65 66 20 73 74 72 75 63 74 20 49 6e 46 69 edef struct InFi
2930: 6c 65 20 49 6e 46 69 6c 65 3b 0a 73 74 72 75 63 le InFile;.struc
2940: 74 20 49 6e 46 69 6c 65 20 7b 0a 20 20 63 68 61 t InFile {. cha
2950: 72 20 2a 7a 53 72 63 3b 20 20 20 20 20 20 20 20 r *zSrc;
2960: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 /* Name of
2970: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 input file */.
2980: 20 63 68 61 72 20 2a 7a 48 64 72 3b 20 20 20 20 char *zHdr;
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d /* Nam
29a0: 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 e of the generat
29b0: 65 64 20 2e 68 20 66 69 6c 65 20 66 6f 72 20 74 ed .h file for t
29c0: 68 69 73 20 69 6e 70 75 74 2e 0a 20 20 20 20 20 his input..
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
29e0: 20 20 20 20 20 20 2a 2a 20 57 69 6c 6c 20 62 65 ** Will be
29f0: 20 4e 55 4c 4c 20 69 66 20 69 6e 70 75 74 20 69 NULL if input i
2a00: 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 s to be scanned
2a10: 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 66 6c only */. int fl
2a20: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 ags;
2a30: 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 /* One or mor
2a40: 65 20 44 50 5f 2c 20 50 53 5f 20 61 6e 64 2f 6f e DP_, PS_ and/o
2a50: 72 20 54 59 5f 20 66 6c 61 67 73 20 2a 2f 0a 20 r TY_ flags */.
2a60: 20 49 6e 46 69 6c 65 20 2a 70 4e 65 78 74 3b 20 InFile *pNext;
2a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 /* Nex
2a80: 74 20 69 6e 70 75 74 20 66 69 6c 65 20 69 6e 20 t input file in
2a90: 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d the list of them
2aa0: 20 61 6c 6c 20 2a 2f 0a 20 20 49 64 65 6e 74 54 all */. IdentT
2ab0: 61 62 6c 65 20 69 64 54 61 62 6c 65 3b 20 20 20 able idTable;
2ac0: 20 20 20 2f 2a 20 41 6c 6c 20 69 64 65 6e 74 69 /* All identi
2ad0: 66 69 65 72 73 20 69 6e 20 74 68 69 73 20 69 6e fiers in this in
2ae0: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a put file */.};..
2af0: 2f 2a 20 0a 2a 2a 20 41 6e 20 75 6e 62 6f 75 6e /* .** An unboun
2b00: 64 65 64 20 73 74 72 69 6e 67 20 69 73 20 61 62 ded string is ab
2b10: 6c 65 20 74 6f 20 67 72 6f 77 20 77 69 74 68 6f le to grow witho
2b20: 75 74 20 6c 69 6d 69 74 2e 20 20 57 65 20 75 73 ut limit. We us
2b30: 65 20 74 68 65 73 65 0a 2a 2a 20 74 6f 20 63 6f e these.** to co
2b40: 6e 73 74 72 75 63 74 20 6c 61 72 67 65 20 69 6e nstruct large in
2b50: 2d 6d 65 6d 6f 72 79 20 73 74 72 69 6e 67 73 20 -memory strings
2b60: 66 72 6f 6d 20 6c 6f 74 73 20 6f 66 20 73 6d 61 from lots of sma
2b70: 6c 6c 65 72 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e ller components.
2b80: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 .*/.typedef stru
2b90: 63 74 20 53 74 72 69 6e 67 20 53 74 72 69 6e 67 ct String String
2ba0: 3b 0a 73 74 72 75 63 74 20 53 74 72 69 6e 67 20 ;.struct String
2bb0: 7b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 {. int nAlloc;
2bc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
2bd0: 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 f bytes allocate
2be0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64 d */. int nUsed
2bf0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 ; /* Numbe
2c00: 72 20 6f 66 20 62 79 74 65 73 20 75 73 65 64 20 r of bytes used
2c10: 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6e 75 (not counting nu
2c20: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 29 20 2a ll terminator) *
2c30: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74 3b /. char *zText;
2c40: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 /* Text of
2c50: 74 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a 7d 3b the string */.};
2c60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c ../*.** The foll
2c70: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 owing structure
2c80: 63 6f 6e 74 61 69 6e 73 20 61 20 6c 6f 74 20 6f contains a lot o
2c90: 66 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 f state informat
2ca0: 69 6f 6e 20 75 73 65 64 0a 2a 2a 20 77 68 69 6c ion used.** whil
2cb0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 2e e generating a .
2cc0: 68 20 66 69 6c 65 2e 20 20 57 65 20 70 75 74 20 h file. We put
2cd0: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 the information
2ce0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 in this structur
2cf0: 65 0a 2a 2a 20 61 6e 64 20 70 61 73 73 20 61 72 e.** and pass ar
2d00: 6f 75 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 ound a pointer t
2d10: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 o this structure
2d20: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 61 , rather than pa
2d30: 73 73 20 61 72 6f 75 6e 64 0a 2a 2a 20 61 6c 6c ss around.** all
2d40: 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 of the informat
2d50: 69 6f 6e 20 73 65 70 61 72 61 74 65 6c 79 2e 20 ion separately.
2d60: 20 54 68 69 73 20 68 65 6c 70 73 20 72 65 64 75 This helps redu
2d70: 63 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 ce the number of
2d80: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 74 6f .** arguments to
2d90: 20 67 65 6e 65 72 61 74 6f 72 20 66 75 6e 63 74 generator funct
2da0: 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 ions..*/.typedef
2db0: 20 73 74 72 75 63 74 20 47 65 6e 53 74 61 74 65 struct GenState
2dc0: 20 47 65 6e 53 74 61 74 65 3b 0a 73 74 72 75 63 GenState;.struc
2dd0: 74 20 47 65 6e 53 74 61 74 65 20 7b 0a 20 20 53 t GenState {. S
2de0: 74 72 69 6e 67 20 2a 70 53 74 72 3b 20 20 20 20 tring *pStr;
2df0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f /* Write o
2e00: 75 74 70 75 74 20 74 6f 20 74 68 69 73 20 73 74 utput to this st
2e10: 72 69 6e 67 20 2a 2f 0a 20 20 49 64 65 6e 74 54 ring */. IdentT
2e20: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 able *pTable;
2e30: 20 2f 2a 20 41 20 74 61 62 6c 65 20 68 6f 6c 64 /* A table hold
2e40: 69 6e 67 20 74 68 65 20 7a 4c 61 62 65 6c 20 6f ing the zLabel o
2e50: 66 20 65 76 65 72 79 20 23 69 6e 63 6c 75 64 65 f every #include
2e60: 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 that.
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2e80: 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 * has already be
2e90: 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 55 en generated. U
2ea0: 73 65 64 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 sed to avoid.
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ec0: 20 20 20 20 20 20 20 2a 20 67 65 6e 65 72 61 74 * generat
2ed0: 69 6e 67 20 64 75 70 6c 69 63 61 74 65 20 23 69 ing duplicate #i
2ee0: 6e 63 6c 75 64 65 73 2e 20 2a 2f 0a 20 20 63 6f ncludes. */. co
2ef0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 66 3b 20 20 nst char *zIf;
2f00: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e /* If not N
2f10: 55 4c 4c 2c 20 74 68 65 6e 20 77 65 20 61 72 65 ULL, then we are
2f20: 20 77 69 74 68 69 6e 20 61 20 23 69 66 20 77 69 within a #if wi
2f30: 74 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 th.
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 74 * t
2f50: 68 69 73 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f his argument. */
2f60: 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 . int nErr;
2f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
2f80: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f ber of errors */
2f90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
2fa0: 46 69 6c 65 6e 61 6d 65 3b 20 2f 2a 20 4e 61 6d Filename; /* Nam
2fb0: 65 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20 e of the source
2fc0: 66 69 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e file being scann
2fd0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 ed */. int flag
2fe0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f s; /
2ff0: 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20 * Various flags
3000: 28 44 50 5f 20 61 6e 64 20 50 53 5f 20 66 6c 61 (DP_ and PS_ fla
3010: 67 73 20 61 62 6f 76 65 29 20 2a 2f 0a 7d 3b 0a gs above) */.};.
3020: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f ./*.** The follo
3030: 77 69 6e 67 20 74 65 78 74 20 6c 69 6e 65 20 61 wing text line a
3040: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 74 6f ppears at the to
3050: 70 20 6f 66 20 65 76 65 72 79 20 66 69 6c 65 20 p of every file
3060: 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 generated.** by
3070: 74 68 69 73 20 70 72 6f 67 72 61 6d 2e 20 20 42 this program. B
3080: 79 20 72 65 63 6f 67 6e 69 7a 69 6e 67 20 74 68 y recognizing th
3090: 69 73 20 6c 69 6e 65 2c 20 74 68 65 20 70 72 6f is line, the pro
30a0: 67 72 61 6d 20 63 61 6e 20 62 65 20 73 75 72 65 gram can be sure
30b0: 0a 2a 2a 20 6e 65 76 65 72 20 74 6f 20 72 65 61 .** never to rea
30c0: 64 20 61 20 66 69 6c 65 20 74 68 61 74 20 69 74 d a file that it
30d0: 20 67 65 6e 65 72 61 74 65 64 20 69 74 73 65 6c generated itsel
30e0: 66 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 f..*/.const char
30f0: 20 7a 54 6f 70 4c 69 6e 65 5b 5d 20 3d 20 0a 20 zTopLine[] = .
3100: 20 22 2f 2a 20 5c 61 54 68 69 73 20 66 69 6c 65 "/* \aThis file
3110: 20 77 61 73 20 61 75 74 6f 6d 61 74 69 63 61 6c was automatical
3120: 6c 79 20 67 65 6e 65 72 61 74 65 64 2e 20 20 44 ly generated. D
3130: 6f 20 6e 6f 74 20 65 64 69 74 21 20 2a 2f 5c 6e o not edit! */\n
3140: 22 3b 0a 23 64 65 66 69 6e 65 20 6e 54 6f 70 4c ";.#define nTopL
3150: 69 6e 65 20 28 73 69 7a 65 6f 66 28 7a 54 6f 70 ine (sizeof(zTop
3160: 4c 69 6e 65 29 2d 31 29 0a 0a 2f 2a 0a 2a 2a 20 Line)-1)../*.**
3170: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 The name of the
3180: 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 file currently b
3190: 65 69 6e 67 20 70 61 72 73 65 64 2e 0a 2a 2f 0a eing parsed..*/.
31a0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 46 69 static char *zFi
31b0: 6c 65 6e 61 6d 65 3b 0a 0a 2f 2a 0a 2a 2a 20 54 lename;../*.** T
31c0: 68 65 20 73 74 61 63 6b 20 6f 66 20 23 69 66 20 he stack of #if
31d0: 6d 61 63 72 6f 73 20 66 6f 72 20 74 68 65 20 66 macros for the f
31e0: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 ile currently be
31f0: 69 6e 67 20 70 61 72 73 65 64 2e 0a 2a 2f 0a 73 ing parsed..*/.s
3200: 74 61 74 69 63 20 49 66 6d 61 63 72 6f 20 2a 69 tatic Ifmacro *i
3210: 66 53 74 61 63 6b 20 3d 20 30 3b 0a 0a 2f 2a 0a fStack = 0;../*.
3220: 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c ** A list of all
3230: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 files that have
3240: 20 62 65 65 6e 20 23 69 6e 63 6c 75 64 65 64 20 been #included
3250: 73 6f 20 66 61 72 20 69 6e 20 61 20 66 69 6c 65 so far in a file
3260: 20 62 65 69 6e 67 0a 2a 2a 20 70 61 72 73 65 64 being.** parsed
3270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 49 6e 63 6c ..*/.static Incl
3280: 75 64 65 20 2a 69 6e 63 6c 75 64 65 4c 69 73 74 ude *includeList
3290: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 = 0;../*.** The
32a0: 20 6c 61 73 74 20 62 6c 6f 63 6b 20 63 6f 6d 6d last block comm
32b0: 65 6e 74 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61 ent seen..*/.sta
32c0: 74 69 63 20 54 6f 6b 65 6e 20 2a 62 6c 6f 63 6b tic Token *block
32d0: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 0a 2f 2a Comment = 0;../*
32e0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e .** The followin
32f0: 67 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 66 g flag is set if
3300: 20 74 68 65 20 2d 64 6f 63 20 66 6c 61 67 20 61 the -doc flag a
3310: 70 70 65 61 72 73 20 6f 6e 20 74 68 65 0a 2a 2a ppears on the.**
3320: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 0a 2a command line..*
3330: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 63 /.static int doc
3340: 5f 66 6c 61 67 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a _flag = 0;../*.*
3350: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 * If the followi
3360: 6e 67 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 ng flag is set,
3370: 74 68 65 6e 20 6d 61 6b 65 68 65 61 64 65 72 73 then makeheaders
3380: 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f will attempt to
3390: 0a 2a 2a 20 67 65 6e 65 72 61 74 65 20 70 72 6f .** generate pro
33a0: 74 6f 74 79 70 65 73 20 66 6f 72 20 73 74 61 74 totypes for stat
33b0: 69 63 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 ic functions and
33c0: 20 70 72 6f 63 65 64 75 72 65 73 2e 0a 2a 2f 0a procedures..*/.
33d0: 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 74 6f static int proto
33e0: 5f 73 74 61 74 69 63 20 3d 20 30 3b 0a 0a 2f 2a _static = 0;../*
33f0: 0a 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c .** A list of al
3400: 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 20 l declarations.
3410: 20 54 68 65 20 6c 69 73 74 20 69 73 20 68 65 6c The list is hel
3420: 64 20 74 6f 67 65 74 68 65 72 20 75 73 69 6e 67 d together using
3430: 20 74 68 65 0a 2a 2a 20 70 4e 65 78 74 20 66 69 the.** pNext fi
3440: 65 6c 64 20 6f 66 20 74 68 65 20 44 65 63 6c 20 eld of the Decl
3450: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 structure..*/.st
3460: 61 74 69 63 20 44 65 63 6c 20 2a 70 44 65 63 6c atic Decl *pDecl
3470: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 First; /* Fir
3480: 73 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a st on the list *
3490: 2f 0a 73 74 61 74 69 63 20 44 65 63 6c 20 2a 70 /.static Decl *p
34a0: 44 65 63 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a DeclLast; /*
34b0: 20 4c 61 73 74 20 6f 6e 20 74 68 65 20 6c 69 73 Last on the lis
34c0: 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 68 61 t */../*.** A ha
34d0: 73 68 20 74 61 62 6c 65 20 6f 66 20 61 6c 6c 20 sh table of all
34e0: 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 2a 2f 0a declarations.*/.
34f0: 23 64 65 66 69 6e 65 20 44 45 43 4c 5f 48 41 53 #define DECL_HAS
3500: 48 5f 53 49 5a 45 20 33 33 37 31 0a 73 74 61 74 H_SIZE 3371.stat
3510: 69 63 20 44 65 63 6c 20 2a 61 70 54 61 62 6c 65 ic Decl *apTable
3520: 5b 44 45 43 4c 5f 48 41 53 48 5f 53 49 5a 45 5d [DECL_HASH_SIZE]
3530: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 45 53 ;../*.** The TES
3540: 54 20 6d 61 63 72 6f 20 6d 75 73 74 20 62 65 20 T macro must be
3550: 64 65 66 69 6e 65 64 20 74 6f 20 73 6f 6d 65 74 defined to somet
3560: 68 69 6e 67 2e 20 20 4d 61 6b 65 20 73 75 72 65 hing. Make sure
3570: 20 74 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 this is the.**
3580: 63 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 case..*/.#ifndef
3590: 20 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54 TEST.# define T
35a0: 45 53 54 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 EST 0.#endif..#i
35b0: 66 64 65 66 20 4e 4f 54 5f 55 53 45 44 0a 2f 2a fdef NOT_USED./*
35c0: 0a 2a 2a 20 57 65 20 64 6f 20 6f 75 72 20 6f 77 .** We do our ow
35d0: 6e 20 61 73 73 65 72 74 69 6f 6e 20 6d 61 63 72 n assertion macr
35e0: 6f 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e o so that we can
35f0: 20 68 61 76 65 20 6d 6f 72 65 20 63 6f 6e 74 72 have more contr
3600: 6f 6c 0a 2a 2a 20 6f 76 65 72 20 64 65 62 75 67 ol.** over debug
3610: 67 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 ging..*/.#define
3620: 20 41 73 73 65 72 74 28 58 29 20 20 20 20 69 66 Assert(X) if
3630: 28 21 28 58 29 29 7b 20 43 61 6e 74 48 61 70 70 (!(X)){ CantHapp
3640: 65 6e 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 7d 0a en(__LINE__); }.
3650: 23 64 65 66 69 6e 65 20 43 41 4e 54 5f 48 41 50 #define CANT_HAP
3660: 50 45 4e 20 20 43 61 6e 74 48 61 70 70 65 6e 28 PEN CantHappen(
3670: 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 __LINE__).static
3680: 20 76 6f 69 64 20 43 61 6e 74 48 61 70 70 65 6e void CantHappen
3690: 28 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 66 (int iLine){. f
36a0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 41 printf(stderr,"A
36b0: 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 65 64 20 ssertion failed
36c0: 6f 6e 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 69 4c on line %d\n",iL
36d0: 69 6e 65 29 3b 0a 20 20 2a 28 63 68 61 72 2a 29 ine);. *(char*)
36e0: 31 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 63 65 1 = 0; /* Force
36f0: 20 61 20 63 6f 72 65 2d 64 75 6d 70 20 2a 2f 0a a core-dump */.
3700: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 }.#endif../*.**
3710: 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f Memory allocatio
3720: 6e 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 n functions that
3730: 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 are guaranteed
3740: 6e 65 76 65 72 20 74 6f 20 72 65 74 75 72 6e 20 never to return
3750: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 NULL..*/.static
3760: 76 6f 69 64 20 2a 53 61 66 65 4d 61 6c 6c 6f 63 void *SafeMalloc
3770: 28 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 (int nByte){. v
3780: 6f 69 64 20 2a 70 20 3d 20 6d 61 6c 6c 6f 63 28 oid *p = malloc(
3790: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 nByte );. if(
37a0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 p==0 ){. fpri
37b0: 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 ntf(stderr,"Out
37c0: 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 43 61 6e 27 of memory. Can'
37d0: 74 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 62 79 t allocate %d by
37e0: 74 65 73 2e 5c 6e 22 2c 6e 42 79 74 65 29 3b 0a tes.\n",nByte);.
37f0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d exit(1);. }
3800: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 73 . return p;.}.s
3810: 74 61 74 69 63 20 76 6f 69 64 20 53 61 66 65 46 tatic void SafeF
3820: 72 65 65 28 76 6f 69 64 20 2a 70 4f 6c 64 29 7b ree(void *pOld){
3830: 0a 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 . if( pOld ){.
3840: 20 20 20 66 72 65 65 28 70 4f 6c 64 29 3b 0a 20 free(pOld);.
3850: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 }.}.static void
3860: 20 2a 53 61 66 65 52 65 61 6c 6c 6f 63 28 76 6f *SafeRealloc(vo
3870: 69 64 20 2a 70 4f 6c 64 2c 20 69 6e 74 20 6e 42 id *pOld, int nB
3880: 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b yte){. void *p;
3890: 0a 20 20 69 66 28 20 70 4f 6c 64 3d 3d 30 20 29 . if( pOld==0 )
38a0: 7b 0a 20 20 20 20 70 20 3d 20 53 61 66 65 4d 61 {. p = SafeMa
38b0: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 7d lloc(nByte);. }
38c0: 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 72 65 else{. p = re
38d0: 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 42 79 74 alloc(pOld, nByt
38e0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 e);. if( p==0
38f0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 ){. fprint
3900: 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 f(stderr,.
3910: 20 20 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 "Out of memory
3920: 2e 20 20 43 61 6e 27 74 20 65 6e 6c 61 72 67 65 . Can't enlarge
3930: 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 74 an allocation t
3940: 6f 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 6e 42 o %d bytes\n",nB
3950: 79 74 65 29 3b 0a 20 20 20 20 20 20 65 78 69 74 yte);. exit
3960: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 (1);. }. }.
3970: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 73 74 61 return p;.}.sta
3980: 74 69 63 20 63 68 61 72 20 2a 53 74 72 44 75 70 tic char *StrDup
3990: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 (const char *zSr
39a0: 63 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 c, int nByte){.
39b0: 20 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20 char *zDest;.
39c0: 69 66 28 20 6e 42 79 74 65 3c 3d 30 20 29 7b 0a if( nByte<=0 ){.
39d0: 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c nByte = strl
39e0: 65 6e 28 7a 53 72 63 29 3b 0a 20 20 7d 0a 20 20 en(zSrc);. }.
39f0: 7a 44 65 73 74 20 3d 20 53 61 66 65 4d 61 6c 6c zDest = SafeMall
3a00: 6f 63 28 20 6e 42 79 74 65 20 2b 20 31 20 29 3b oc( nByte + 1 );
3a10: 0a 20 20 73 74 72 6e 63 70 79 28 7a 44 65 73 74 . strncpy(zDest
3a20: 2c 7a 53 72 63 2c 6e 42 79 74 65 29 3b 0a 20 20 ,zSrc,nByte);.
3a30: 7a 44 65 73 74 5b 6e 42 79 74 65 5d 20 3d 20 30 zDest[nByte] = 0
3a40: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44 65 73 74 ;. return zDest
3a50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 ;.}../*.** Retur
3a60: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 68 n TRUE if the ch
3a70: 61 72 61 63 74 65 72 20 58 20 63 61 6e 20 62 65 aracter X can be
3a80: 20 70 61 72 74 20 6f 66 20 61 6e 20 69 64 65 6e part of an iden
3a90: 74 69 66 69 65 72 0a 2a 2f 0a 23 64 65 66 69 6e tifier.*/.#defin
3aa0: 65 20 49 53 41 4c 4e 55 4d 28 58 29 20 20 28 28 e ISALNUM(X) ((
3ab0: 58 29 3d 3d 27 5f 27 20 7c 7c 20 69 73 61 6c 6e X)=='_' || isaln
3ac0: 75 6d 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 6f um(X))../*.** Ro
3ad0: 75 74 69 6e 65 73 20 66 6f 72 20 64 65 61 6c 69 utines for deali
3ae0: 6e 67 20 77 69 74 68 20 75 6e 62 6f 75 6e 64 65 ng with unbounde
3af0: 64 20 73 74 72 69 6e 67 73 2e 0a 2a 2f 0a 73 74 d strings..*/.st
3b00: 61 74 69 63 20 76 6f 69 64 20 53 74 72 69 6e 67 atic void String
3b10: 49 6e 69 74 28 53 74 72 69 6e 67 20 2a 70 53 74 Init(String *pSt
3b20: 72 29 7b 0a 20 20 70 53 74 72 2d 3e 6e 41 6c 6c r){. pStr->nAll
3b30: 6f 63 20 3d 20 30 3b 0a 20 20 70 53 74 72 2d 3e oc = 0;. pStr->
3b40: 6e 55 73 65 64 20 3d 20 30 3b 0a 20 20 70 53 74 nUsed = 0;. pSt
3b50: 72 2d 3e 7a 54 65 78 74 20 3d 20 30 3b 0a 7d 0a r->zText = 0;.}.
3b60: 73 74 61 74 69 63 20 76 6f 69 64 20 53 74 72 69 static void Stri
3b70: 6e 67 52 65 73 65 74 28 53 74 72 69 6e 67 20 2a ngReset(String *
3b80: 70 53 74 72 29 7b 0a 20 20 53 61 66 65 46 72 65 pStr){. SafeFre
3b90: 65 28 70 53 74 72 2d 3e 7a 54 65 78 74 29 3b 0a e(pStr->zText);.
3ba0: 20 20 53 74 72 69 6e 67 49 6e 69 74 28 70 53 74 StringInit(pSt
3bb0: 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 r);.}.static voi
3bc0: 64 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 53 d StringAppend(S
3bd0: 74 72 69 6e 67 20 2a 70 53 74 72 2c 20 63 6f 6e tring *pStr, con
3be0: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 st char *zText,
3bf0: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 int nByte){. if
3c00: 28 20 6e 42 79 74 65 3c 3d 30 20 29 7b 0a 20 20 ( nByte<=0 ){.
3c10: 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e nByte = strlen
3c20: 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69 (zText);. }. i
3c30: 66 28 20 70 53 74 72 2d 3e 6e 55 73 65 64 20 2b f( pStr->nUsed +
3c40: 20 6e 42 79 74 65 20 3e 3d 20 70 53 74 72 2d 3e nByte >= pStr->
3c50: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 66 nAlloc ){. if
3c60: 28 20 70 53 74 72 2d 3e 6e 41 6c 6c 6f 63 3d 3d ( pStr->nAlloc==
3c70: 30 20 29 7b 0a 20 20 20 20 20 20 70 53 74 72 2d 0 ){. pStr-
3c80: 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 42 79 74 65 20 >nAlloc = nByte
3c90: 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 70 53 74 + 100;. pSt
3ca0: 72 2d 3e 7a 54 65 78 74 20 3d 20 53 61 66 65 4d r->zText = SafeM
3cb0: 61 6c 6c 6f 63 28 20 70 53 74 72 2d 3e 6e 41 6c alloc( pStr->nAl
3cc0: 6c 6f 63 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 loc );. }else
3cd0: 7b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 6e 41 {. pStr->nA
3ce0: 6c 6c 6f 63 20 3d 20 70 53 74 72 2d 3e 6e 41 6c lloc = pStr->nAl
3cf0: 6c 6f 63 2a 32 20 2b 20 6e 42 79 74 65 3b 0a 20 loc*2 + nByte;.
3d00: 20 20 20 20 20 70 53 74 72 2d 3e 7a 54 65 78 74 pStr->zText
3d10: 20 3d 20 53 61 66 65 52 65 61 6c 6c 6f 63 28 70 = SafeRealloc(p
3d20: 53 74 72 2d 3e 7a 54 65 78 74 2c 20 70 53 74 72 Str->zText, pStr
3d30: 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d ->nAlloc);. }
3d40: 0a 20 20 7d 0a 20 20 73 74 72 6e 63 70 79 28 26 . }. strncpy(&
3d50: 70 53 74 72 2d 3e 7a 54 65 78 74 5b 70 53 74 72 pStr->zText[pStr
3d60: 2d 3e 6e 55 73 65 64 5d 2c 7a 54 65 78 74 2c 6e ->nUsed],zText,n
3d70: 42 79 74 65 29 3b 0a 20 20 70 53 74 72 2d 3e 6e Byte);. pStr->n
3d80: 55 73 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 Used += nByte;.
3d90: 20 70 53 74 72 2d 3e 7a 54 65 78 74 5b 70 53 74 pStr->zText[pSt
3da0: 72 2d 3e 6e 55 73 65 64 5d 20 3d 20 30 3b 0a 7d r->nUsed] = 0;.}
3db0: 0a 23 64 65 66 69 6e 65 20 53 74 72 69 6e 67 47 .#define StringG
3dc0: 65 74 28 53 29 20 28 28 53 29 2d 3e 7a 54 65 78 et(S) ((S)->zTex
3dd0: 74 3f 28 53 29 2d 3e 7a 54 65 78 74 3a 22 22 29 t?(S)->zText:"")
3de0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 ../*.** Compute
3df0: 61 20 68 61 73 68 20 6f 6e 20 61 20 73 74 72 69 a hash on a stri
3e00: 6e 67 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 ng. The number
3e10: 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 6e 6f returned is a no
3e20: 6e 2d 6e 65 67 61 74 69 76 65 0a 2a 2a 20 76 61 n-negative.** va
3e30: 6c 75 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e lue between 0 an
3e40: 64 20 32 2a 2a 33 31 20 2d 20 31 0a 2a 2f 0a 73 d 2**31 - 1.*/.s
3e50: 74 61 74 69 63 20 69 6e 74 20 48 61 73 68 28 63 tatic int Hash(c
3e60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e onst char *z, in
3e70: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 t n){. int h =
3e80: 30 3b 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b 0;. if( n<=0 ){
3e90: 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 . n = strlen(
3ea0: 7a 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 z);. }. while(
3eb0: 20 6e 2d 2d 20 29 7b 0a 20 20 20 20 68 20 3d 20 n-- ){. h =
3ec0: 68 20 5e 20 28 68 3c 3c 35 29 20 5e 20 2a 7a 2b h ^ (h<<5) ^ *z+
3ed0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 +;. }. return
3ee0: 68 20 26 20 30 78 37 66 66 66 66 66 66 66 3b 0a h & 0x7fffffff;.
3ef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 }../*.** Given a
3f00: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d n identifier nam
3f10: 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 e, try to find a
3f20: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 declaration for
3f30: 20 74 68 61 74 0a 2a 2a 20 69 64 65 6e 74 69 66 that.** identif
3f40: 69 65 72 20 69 6e 20 74 68 65 20 68 61 73 68 20 ier in the hash
3f50: 74 61 62 6c 65 2e 20 20 49 66 20 66 6f 75 6e 64 table. If found
3f60: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 , return a point
3f70: 65 72 20 74 6f 0a 2a 2a 20 74 68 65 20 44 65 63 er to.** the Dec
3f80: 6c 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 l structure. If
3f90: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 not found, retu
3fa0: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 rn 0..*/.static
3fb0: 44 65 63 6c 20 2a 46 69 6e 64 44 65 63 6c 28 63 Decl *FindDecl(c
3fc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 onst char *zName
3fd0: 2c 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 69 6e , int len){. in
3fe0: 74 20 68 3b 0a 20 20 44 65 63 6c 20 2a 70 3b 0a t h;. Decl *p;.
3ff0: 0a 20 20 69 66 28 20 6c 65 6e 3c 3d 30 20 29 7b . if( len<=0 ){
4000: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 . len = strle
4010: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 n(zName);. }.
4020: 68 20 3d 20 48 61 73 68 28 7a 4e 61 6d 65 2c 6c h = Hash(zName,l
4030: 65 6e 29 20 25 20 44 45 43 4c 5f 48 41 53 48 5f en) % DECL_HASH_
4040: 53 49 5a 45 3b 0a 20 20 70 20 3d 20 61 70 54 61 SIZE;. p = apTa
4050: 62 6c 65 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 ble[h];. while(
4060: 20 70 20 26 26 20 28 73 74 72 6e 63 6d 70 28 70 p && (strncmp(p
4070: 2d 3e 7a 4e 61 6d 65 2c 7a 4e 61 6d 65 2c 6c 65 ->zName,zName,le
4080: 6e 29 21 3d 30 20 7c 7c 20 70 2d 3e 7a 4e 61 6d n)!=0 || p->zNam
4090: 65 5b 6c 65 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 e[len]!=0) ){.
40a0: 20 20 70 20 3d 20 70 2d 3e 70 53 61 6d 65 48 61 p = p->pSameHa
40b0: 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e sh;. }. return
40c0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 p;.}../*.** Ins
40d0: 74 61 6c 6c 20 74 68 65 20 67 69 76 65 6e 20 64 tall the given d
40e0: 65 63 6c 61 72 61 74 69 6f 6e 20 62 6f 74 68 20 eclaration both
40f0: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c in the hash tabl
4100: 65 20 61 6e 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 e and on.** the
4110: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 64 65 63 6c list of all decl
4120: 61 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 arations..*/.sta
4130: 74 69 63 20 76 6f 69 64 20 49 6e 73 74 61 6c 6c tic void Install
4140: 44 65 63 6c 28 44 65 63 6c 20 2a 70 44 65 63 6c Decl(Decl *pDecl
4150: 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 44 65 ){. int h;. De
4160: 63 6c 20 2a 70 4f 74 68 65 72 3b 0a 0a 20 20 68 cl *pOther;.. h
4170: 20 3d 20 48 61 73 68 28 70 44 65 63 6c 2d 3e 7a = Hash(pDecl->z
4180: 4e 61 6d 65 2c 30 29 20 25 20 44 45 43 4c 5f 48 Name,0) % DECL_H
4190: 41 53 48 5f 53 49 5a 45 3b 0a 20 20 70 4f 74 68 ASH_SIZE;. pOth
41a0: 65 72 20 3d 20 61 70 54 61 62 6c 65 5b 68 5d 3b er = apTable[h];
41b0: 0a 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 . while( pOther
41c0: 20 26 26 20 73 74 72 63 6d 70 28 70 44 65 63 6c && strcmp(pDecl
41d0: 2d 3e 7a 4e 61 6d 65 2c 70 4f 74 68 65 72 2d 3e ->zName,pOther->
41e0: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 zName)!=0 ){.
41f0: 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 pOther = pOther
4200: 2d 3e 70 53 61 6d 65 48 61 73 68 3b 0a 20 20 7d ->pSameHash;. }
4210: 0a 20 20 69 66 28 20 70 4f 74 68 65 72 20 29 7b . if( pOther ){
4220: 0a 20 20 20 20 70 44 65 63 6c 2d 3e 70 53 61 6d . pDecl->pSam
4230: 65 4e 61 6d 65 20 3d 20 70 4f 74 68 65 72 2d 3e eName = pOther->
4240: 70 53 61 6d 65 4e 61 6d 65 3b 0a 20 20 20 20 70 pSameName;. p
4250: 4f 74 68 65 72 2d 3e 70 53 61 6d 65 4e 61 6d 65 Other->pSameName
4260: 20 3d 20 70 44 65 63 6c 3b 0a 20 20 7d 65 6c 73 = pDecl;. }els
4270: 65 7b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 70 53 e{. pDecl->pS
4280: 61 6d 65 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 ameName = 0;.
4290: 20 70 44 65 63 6c 2d 3e 70 53 61 6d 65 48 61 73 pDecl->pSameHas
42a0: 68 20 3d 20 61 70 54 61 62 6c 65 5b 68 5d 3b 0a h = apTable[h];.
42b0: 20 20 20 20 61 70 54 61 62 6c 65 5b 68 5d 20 3d apTable[h] =
42c0: 20 70 44 65 63 6c 3b 0a 20 20 7d 0a 20 20 70 44 pDecl;. }. pD
42d0: 65 63 6c 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a ecl->pNext = 0;.
42e0: 20 20 69 66 28 20 70 44 65 63 6c 46 69 72 73 74 if( pDeclFirst
42f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 65 63 6c ==0 ){. pDecl
4300: 46 69 72 73 74 20 3d 20 70 44 65 63 6c 4c 61 73 First = pDeclLas
4310: 74 20 3d 20 70 44 65 63 6c 3b 0a 20 20 7d 65 6c t = pDecl;. }el
4320: 73 65 7b 0a 20 20 20 20 70 44 65 63 6c 4c 61 73 se{. pDeclLas
4330: 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 65 63 6c t->pNext = pDecl
4340: 3b 0a 20 20 20 20 70 44 65 63 6c 4c 61 73 74 20 ;. pDeclLast
4350: 3d 20 70 44 65 63 6c 3b 0a 20 20 7d 0a 7d 0a 0a = pDecl;. }.}..
4360: 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 /*.** Look at th
4370: 65 20 63 75 72 72 65 6e 74 20 69 66 53 74 61 63 e current ifStac
4380: 6b 2e 20 20 49 66 20 61 6e 79 74 68 69 6e 67 20 k. If anything
4390: 64 65 63 6c 61 72 65 64 20 61 74 20 74 68 65 20 declared at the
43a0: 63 75 72 72 65 6e 74 0a 2a 2a 20 70 6f 73 69 74 current.** posit
43b0: 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 75 72 72 ion must be surr
43c0: 6f 75 6e 64 65 64 20 77 69 74 68 0a 2a 2a 0a 2a ounded with.**.*
43d0: 2a 20 20 20 20 20 20 23 69 66 20 20 20 53 54 55 * #if STU
43e0: 46 46 0a 2a 2a 20 20 20 20 20 20 23 65 6e 64 69 FF.** #endi
43f0: 66 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 69 f.**.** Then thi
4400: 73 20 72 6f 75 74 69 6e 65 20 63 6f 6d 70 75 74 s routine comput
4410: 65 73 20 53 54 55 46 46 20 61 6e 64 20 72 65 74 es STUFF and ret
4420: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 urns a pointer t
4430: 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a o it. Memory.**
4440: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c to hold the val
4450: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 6f ue returned is o
4460: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c btained from mal
4470: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 loc()..*/.static
4480: 20 63 68 61 72 20 2a 47 65 74 49 66 53 74 72 69 char *GetIfStri
4490: 6e 67 28 76 6f 69 64 29 7b 0a 20 20 49 66 6d 61 ng(void){. Ifma
44a0: 63 72 6f 20 2a 70 49 66 3b 0a 20 20 63 68 61 72 cro *pIf;. char
44b0: 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 *zResult = 0;.
44c0: 20 69 6e 74 20 68 61 73 49 66 20 3d 20 30 3b 0a int hasIf = 0;.
44d0: 20 20 53 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20 String str;..
44e0: 20 66 6f 72 28 70 49 66 20 3d 20 69 66 53 74 61 for(pIf = ifSta
44f0: 63 6b 3b 20 70 49 66 3b 20 70 49 66 3d 70 49 66 ck; pIf; pIf=pIf
4500: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 ->pNext){. if
4510: 28 20 70 49 66 2d 3e 7a 43 6f 6e 64 69 74 69 6f ( pIf->zConditio
4520: 6e 3d 3d 30 20 7c 7c 20 2a 70 49 66 2d 3e 7a 43 n==0 || *pIf->zC
4530: 6f 6e 64 69 74 69 6f 6e 3d 3d 30 20 29 20 63 6f ondition==0 ) co
4540: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 ntinue;. if(
4550: 21 68 61 73 49 66 20 29 7b 0a 20 20 20 20 20 20 !hasIf ){.
4560: 68 61 73 49 66 20 3d 20 31 3b 0a 20 20 20 20 20 hasIf = 1;.
4570: 20 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 StringInit(&str
4580: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 );. }else{.
4590: 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 StringAppend
45a0: 28 26 73 74 72 2c 22 20 26 26 20 22 2c 34 29 3b (&str," && ",4);
45b0: 0a 20 20 20 20 7d 0a 20 20 20 20 53 74 72 69 6e . }. Strin
45c0: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 70 49 66 gAppend(&str,pIf
45d0: 2d 3e 7a 43 6f 6e 64 69 74 69 6f 6e 2c 30 29 3b ->zCondition,0);
45e0: 0a 20 20 7d 0a 20 20 69 66 28 20 68 61 73 49 66 . }. if( hasIf
45f0: 20 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 ){. zResult
4600: 3d 20 53 74 72 44 75 70 28 53 74 72 69 6e 67 47 = StrDup(StringG
4610: 65 74 28 26 73 74 72 29 2c 30 29 3b 0a 20 20 20 et(&str),0);.
4620: 20 53 74 72 69 6e 67 52 65 73 65 74 28 26 73 74 StringReset(&st
4630: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 r);. }else{.
4640: 20 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 zResult = 0;.
4650: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73 75 }. return zResu
4660: 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 lt;.}../*.** Cre
4670: 61 74 65 20 61 20 6e 65 77 20 64 65 63 6c 61 72 ate a new declar
4680: 61 74 69 6f 6e 20 61 6e 64 20 70 75 74 20 69 74 ation and put it
4690: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 in the hash tab
46a0: 6c 65 2e 20 20 41 6c 73 6f 0a 2a 2a 20 72 65 74 le. Also.** ret
46b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f urn a pointer to
46c0: 20 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 it so that we c
46d0: 61 6e 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 7a an fill in the z
46e0: 46 77 64 20 61 6e 64 20 7a 44 65 63 6c 0a 2a 2a Fwd and zDecl.**
46f0: 20 66 69 65 6c 64 73 2c 20 61 6e 64 20 73 6f 20 fields, and so
4700: 66 6f 72 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 forth..*/.static
4710: 20 44 65 63 6c 20 2a 43 72 65 61 74 65 44 65 63 Decl *CreateDec
4720: 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 l(. const char
4730: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a *zName, /*
4740: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a Name of the obj
4750: 65 63 74 20 62 65 69 6e 67 20 64 65 63 6c 61 72 ect being declar
4760: 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 ed. */. int nNa
4770: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 me
4780: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 /* Length of t
4790: 68 65 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 he name */.){.
47a0: 44 65 63 6c 20 2a 70 44 65 63 6c 3b 0a 0a 20 20 Decl *pDecl;..
47b0: 70 44 65 63 6c 20 3d 20 53 61 66 65 4d 61 6c 6c pDecl = SafeMall
47c0: 6f 63 28 20 73 69 7a 65 6f 66 28 44 65 63 6c 29 oc( sizeof(Decl)
47d0: 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 29 3b 0a 20 + nName + 1);.
47e0: 20 6d 65 6d 73 65 74 28 70 44 65 63 6c 2c 30 2c memset(pDecl,0,
47f0: 73 69 7a 65 6f 66 28 44 65 63 6c 29 29 3b 0a 20 sizeof(Decl));.
4800: 20 70 44 65 63 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 pDecl->zName =
4810: 28 63 68 61 72 2a 29 26 70 44 65 63 6c 5b 31 5d (char*)&pDecl[1]
4820: 3b 0a 20 20 73 70 72 69 6e 74 66 28 70 44 65 63 ;. sprintf(pDec
4830: 6c 2d 3e 7a 4e 61 6d 65 2c 22 25 2e 2a 73 22 2c l->zName,"%.*s",
4840: 6e 4e 61 6d 65 2c 7a 4e 61 6d 65 29 3b 0a 20 20 nName,zName);.
4850: 70 44 65 63 6c 2d 3e 7a 46 69 6c 65 20 3d 20 7a pDecl->zFile = z
4860: 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 44 65 63 Filename;. pDec
4870: 6c 2d 3e 70 49 6e 63 6c 75 64 65 20 3d 20 69 6e l->pInclude = in
4880: 63 6c 75 64 65 4c 69 73 74 3b 0a 20 20 70 44 65 cludeList;. pDe
4890: 63 6c 2d 3e 7a 49 66 20 3d 20 47 65 74 49 66 53 cl->zIf = GetIfS
48a0: 74 72 69 6e 67 28 29 3b 0a 20 20 49 6e 73 74 61 tring();. Insta
48b0: 6c 6c 44 65 63 6c 28 70 44 65 63 6c 29 3b 0a 20 llDecl(pDecl);.
48c0: 20 72 65 74 75 72 6e 20 70 44 65 63 6c 3b 0a 7d return pDecl;.}
48d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 ../*.** Insert a
48e0: 20 6e 65 77 20 69 64 65 6e 74 69 66 69 65 72 20 new identifier
48f0: 69 6e 74 6f 20 61 6e 20 74 61 62 6c 65 20 6f 66 into an table of
4900: 20 69 64 65 6e 74 69 66 69 65 72 73 2e 20 20 52 identifiers. R
4910: 65 74 75 72 6e 20 54 52 55 45 20 69 66 0a 2a 2a eturn TRUE if.**
4920: 20 61 20 6e 65 77 20 69 64 65 6e 74 69 66 69 65 a new identifie
4930: 72 20 77 61 73 20 69 6e 73 65 72 74 65 64 20 61 r was inserted a
4940: 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 nd return FALSE
4950: 69 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 if the identifie
4960: 72 20 77 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 r was.** already
4970: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a in the table..*
4980: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 49 64 65 /.static int Ide
4990: 6e 74 54 61 62 6c 65 49 6e 73 65 72 74 28 0a 20 ntTableInsert(.
49a0: 20 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 54 61 IdentTable *pTa
49b0: 62 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 ble, /* Th
49c0: 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 e table into whi
49d0: 63 68 20 77 65 20 77 69 6c 6c 20 69 6e 73 65 72 ch we will inser
49e0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 t */. const cha
49f0: 72 20 2a 7a 49 64 2c 20 20 20 20 20 20 20 20 20 r *zId,
4a00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 /* Name of the
4a10: 69 64 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a 20 identifiers */.
4a20: 20 69 6e 74 20 6e 49 64 20 20 20 20 20 20 20 20 int nId
4a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 /* Le
4a40: 6e 67 74 68 20 6f 66 20 74 68 65 20 69 64 65 6e ngth of the iden
4a50: 74 69 66 69 65 72 20 6e 61 6d 65 20 2a 2f 0a 29 tifier name */.)
4a60: 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 49 64 65 {. int h;. Ide
4a70: 6e 74 20 2a 70 49 64 3b 0a 0a 20 20 69 66 28 20 nt *pId;.. if(
4a80: 6e 49 64 3c 3d 30 20 29 7b 0a 20 20 20 20 6e 49 nId<=0 ){. nI
4a90: 64 20 3d 20 73 74 72 6c 65 6e 28 7a 49 64 29 3b d = strlen(zId);
4aa0: 0a 20 20 7d 0a 20 20 68 20 3d 20 48 61 73 68 28 . }. h = Hash(
4ab0: 7a 49 64 2c 6e 49 64 29 20 25 20 49 44 45 4e 54 zId,nId) % IDENT
4ac0: 5f 48 41 53 48 5f 53 49 5a 45 3b 0a 20 20 66 6f _HASH_SIZE;. fo
4ad0: 72 28 70 49 64 20 3d 20 70 54 61 62 6c 65 2d 3e r(pId = pTable->
4ae0: 61 70 54 61 62 6c 65 5b 68 5d 3b 20 70 49 64 3b apTable[h]; pId;
4af0: 20 70 49 64 3d 70 49 64 2d 3e 70 43 6f 6c 6c 69 pId=pId->pColli
4b00: 64 65 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 de){. if( str
4b10: 6e 63 6d 70 28 7a 49 64 2c 70 49 64 2d 3e 7a 4e ncmp(zId,pId->zN
4b20: 61 6d 65 2c 6e 49 64 29 3d 3d 30 20 26 26 20 70 ame,nId)==0 && p
4b30: 49 64 2d 3e 7a 4e 61 6d 65 5b 6e 49 64 5d 3d 3d Id->zName[nId]==
4b40: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 72 0 ){. /* pr
4b50: 69 6e 74 66 28 22 41 6c 72 65 61 64 79 20 69 6e intf("Already in
4b60: 20 74 61 62 6c 65 3a 20 25 2e 2a 73 5c 6e 22 2c table: %.*s\n",
4b70: 6e 49 64 2c 7a 49 64 29 3b 20 2a 2f 0a 20 20 20 nId,zId); */.
4b80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 return 0;.
4b90: 20 7d 0a 20 20 7d 0a 20 20 70 49 64 20 3d 20 53 }. }. pId = S
4ba0: 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f afeMalloc( sizeo
4bb0: 66 28 49 64 65 6e 74 29 20 2b 20 6e 49 64 20 2b f(Ident) + nId +
4bc0: 20 31 20 29 3b 0a 20 20 70 49 64 2d 3e 7a 4e 61 1 );. pId->zNa
4bd0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 64 me = (char*)&pId
4be0: 5b 31 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 70 [1];. sprintf(p
4bf0: 49 64 2d 3e 7a 4e 61 6d 65 2c 22 25 2e 2a 73 22 Id->zName,"%.*s"
4c00: 2c 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 70 49 64 ,nId,zId);. pId
4c10: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 6c 65 ->pNext = pTable
4c20: 2d 3e 70 4c 69 73 74 3b 0a 20 20 70 54 61 62 6c ->pList;. pTabl
4c30: 65 2d 3e 70 4c 69 73 74 20 3d 20 70 49 64 3b 0a e->pList = pId;.
4c40: 20 20 70 49 64 2d 3e 70 43 6f 6c 6c 69 64 65 20 pId->pCollide
4c50: 3d 20 70 54 61 62 6c 65 2d 3e 61 70 54 61 62 6c = pTable->apTabl
4c60: 65 5b 68 5d 3b 0a 20 20 70 54 61 62 6c 65 2d 3e e[h];. pTable->
4c70: 61 70 54 61 62 6c 65 5b 68 5d 20 3d 20 70 49 64 apTable[h] = pId
4c80: 3b 0a 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 41 ;. /* printf("A
4c90: 64 64 20 74 6f 20 74 61 62 6c 65 3a 20 25 2e 2a dd to table: %.*
4ca0: 73 5c 6e 22 2c 6e 49 64 2c 7a 49 64 29 3b 20 2a s\n",nId,zId); *
4cb0: 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a /. return 1;.}.
4cc0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 ./*.** Check to
4cd0: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e see if the given
4ce0: 20 76 61 6c 75 65 20 69 73 20 69 6e 20 74 68 65 value is in the
4cf0: 20 67 69 76 65 6e 20 49 64 65 6e 74 54 61 62 6c given IdentTabl
4d00: 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 e. Return.** tr
4d10: 75 65 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 ue if it is and
4d20: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 6e false if it is n
4d30: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e ot..*/.static in
4d40: 74 20 49 64 65 6e 74 54 61 62 6c 65 54 65 73 74 t IdentTableTest
4d50: 28 0a 20 20 49 64 65 6e 74 54 61 62 6c 65 20 2a (. IdentTable *
4d60: 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 2f 2a pTable, /*
4d70: 20 54 68 65 20 74 61 62 6c 65 20 69 6e 20 77 68 The table in wh
4d80: 69 63 68 20 74 6f 20 73 65 61 72 63 68 20 2a 2f ich to search */
4d90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
4da0: 49 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 Id, /*
4db0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 65 6e Name of the iden
4dc0: 74 69 66 69 65 72 73 20 2a 2f 0a 20 20 69 6e 74 tifiers */. int
4dd0: 20 6e 49 64 20 20 20 20 20 20 20 20 20 20 20 20 nId
4de0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 /* Length
4df0: 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 of the identifi
4e00: 65 72 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 er name */.){.
4e10: 69 6e 74 20 68 3b 0a 20 20 49 64 65 6e 74 20 2a int h;. Ident *
4e20: 70 49 64 3b 0a 0a 20 20 69 66 28 20 6e 49 64 3c pId;.. if( nId<
4e30: 3d 30 20 29 7b 0a 20 20 20 20 6e 49 64 20 3d 20 =0 ){. nId =
4e40: 73 74 72 6c 65 6e 28 7a 49 64 29 3b 0a 20 20 7d strlen(zId);. }
4e50: 0a 20 20 68 20 3d 20 48 61 73 68 28 7a 49 64 2c . h = Hash(zId,
4e60: 6e 49 64 29 20 25 20 49 44 45 4e 54 5f 48 41 53 nId) % IDENT_HAS
4e70: 48 5f 53 49 5a 45 3b 0a 20 20 66 6f 72 28 70 49 H_SIZE;. for(pI
4e80: 64 20 3d 20 70 54 61 62 6c 65 2d 3e 61 70 54 61 d = pTable->apTa
4e90: 62 6c 65 5b 68 5d 3b 20 70 49 64 3b 20 70 49 64 ble[h]; pId; pId
4ea0: 3d 70 49 64 2d 3e 70 43 6f 6c 6c 69 64 65 29 7b =pId->pCollide){
4eb0: 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 . if( strncmp
4ec0: 28 7a 49 64 2c 70 49 64 2d 3e 7a 4e 61 6d 65 2c (zId,pId->zName,
4ed0: 6e 49 64 29 3d 3d 30 20 26 26 20 70 49 64 2d 3e nId)==0 && pId->
4ee0: 7a 4e 61 6d 65 5b 6e 49 64 5d 3d 3d 30 20 29 7b zName[nId]==0 ){
4ef0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b . return 1;
4f00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 . }. }. ret
4f10: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 urn 0;.}../*.**
4f20: 52 65 6d 6f 76 65 20 65 76 65 72 79 20 69 64 65 Remove every ide
4f30: 6e 74 69 66 69 65 72 20 66 72 6f 6d 20 74 68 65 ntifier from the
4f40: 20 67 69 76 65 6e 20 74 61 62 6c 65 2e 20 20 20 given table.
4f50: 52 65 73 65 74 20 74 68 65 20 74 61 62 6c 65 20 Reset the table
4f60: 74 6f 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69 61 to.** its initia
4f70: 6c 20 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 l state..*/.stat
4f80: 69 63 20 76 6f 69 64 20 49 64 65 6e 74 54 61 62 ic void IdentTab
4f90: 6c 65 52 65 73 65 74 28 49 64 65 6e 74 54 61 62 leReset(IdentTab
4fa0: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 le *pTable){. I
4fb0: 64 65 6e 74 20 2a 70 49 64 2c 20 2a 70 4e 65 78 dent *pId, *pNex
4fc0: 74 3b 0a 0a 20 20 66 6f 72 28 70 49 64 20 3d 20 t;.. for(pId =
4fd0: 70 54 61 62 6c 65 2d 3e 70 4c 69 73 74 3b 20 70 pTable->pList; p
4fe0: 49 64 3b 20 70 49 64 20 3d 20 70 4e 65 78 74 29 Id; pId = pNext)
4ff0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 {. pNext = pI
5000: 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 53 61 d->pNext;. Sa
5010: 66 65 46 72 65 65 28 70 49 64 29 3b 0a 20 20 7d feFree(pId);. }
5020: 0a 20 20 6d 65 6d 73 65 74 28 70 54 61 62 6c 65 . memset(pTable
5030: 2c 30 2c 73 69 7a 65 6f 66 28 49 64 65 6e 74 54 ,0,sizeof(IdentT
5040: 61 62 6c 65 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 able));.}..#ifde
5050: 66 20 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 f DEBUG./*.** Pr
5060: 69 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 int the name of
5070: 65 76 65 72 79 20 69 64 65 6e 74 69 66 69 65 72 every identifier
5080: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 74 61 in the given ta
5090: 62 6c 65 2c 20 6f 6e 65 20 70 65 72 20 6c 69 6e ble, one per lin
50a0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 e.*/.static void
50b0: 20 49 64 65 6e 74 54 61 62 6c 65 50 72 69 6e 74 IdentTablePrint
50c0: 28 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 54 61 (IdentTable *pTa
50d0: 62 6c 65 2c 20 46 49 4c 45 20 2a 70 4f 75 74 29 ble, FILE *pOut)
50e0: 7b 0a 20 20 49 64 65 6e 74 20 2a 70 49 64 3b 0a {. Ident *pId;.
50f0: 0a 20 20 66 6f 72 28 70 49 64 20 3d 20 70 54 61 . for(pId = pTa
5100: 62 6c 65 2d 3e 70 4c 69 73 74 3b 20 70 49 64 3b ble->pList; pId;
5110: 20 70 49 64 20 3d 20 70 49 64 2d 3e 70 4e 65 78 pId = pId->pNex
5120: 74 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 t){. fprintf(
5130: 70 4f 75 74 2c 22 25 73 5c 6e 22 2c 70 49 64 2d pOut,"%s\n",pId-
5140: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 >zName);. }.}.#
5150: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 endif../*.** Rea
5160: 64 20 61 6e 20 65 6e 74 69 72 65 20 66 69 6c 65 d an entire file
5170: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 20 52 into memory. R
5180: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 eturn a pointer
5190: 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a 2a to the memory..*
51a0: 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 *.** The memory
51b0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d is obtained from
51c0: 20 53 61 66 65 4d 61 6c 6c 6f 63 20 61 6e 64 20 SafeMalloc and
51d0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 must be freed by
51e0: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 the.** calling
51f0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 function..**.**
5200: 49 66 20 74 68 65 20 72 65 61 64 20 66 61 69 6c If the read fail
5210: 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e s for any reason
5220: 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e , 0 is returned.
5230: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 .*/.static char
5240: 2a 52 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20 *ReadFile(const
5250: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 char *zFilename)
5260: 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 {. struct stat
5270: 73 53 74 61 74 3b 0a 20 20 46 49 4c 45 20 2a 70 sStat;. FILE *p
5280: 49 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 In;. char *zBuf
5290: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 ;. int n;.. if
52a0: 28 20 73 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65 ( stat(zFilename
52b0: 2c 26 73 53 74 61 74 29 21 3d 30 20 0a 23 69 66 ,&sStat)!=0 .#if
52c0: 6e 64 65 66 20 57 49 4e 33 32 0a 20 20 20 20 7c ndef WIN32. |
52d0: 7c 20 21 53 5f 49 53 52 45 47 28 73 53 74 61 74 | !S_ISREG(sStat
52e0: 2e 73 74 5f 6d 6f 64 65 29 0a 23 65 6e 64 69 66 .st_mode).#endif
52f0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e . ){. return
5300: 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 20 3d 20 0;. }. pIn =
5310: 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c fopen(zFilename,
5320: 22 72 22 29 3b 0a 20 20 69 66 28 20 70 49 6e 3d "r");. if( pIn=
5330: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e =0 ){. return
5340: 20 30 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 20 3d 0;. }. zBuf =
5350: 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 53 74 SafeMalloc( sSt
5360: 61 74 2e 73 74 5f 73 69 7a 65 20 2b 20 31 20 29 at.st_size + 1 )
5370: 3b 0a 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 ;. n = fread(zB
5380: 75 66 2c 31 2c 73 53 74 61 74 2e 73 74 5f 73 69 uf,1,sStat.st_si
5390: 7a 65 2c 70 49 6e 29 3b 0a 20 20 7a 42 75 66 5b ze,pIn);. zBuf[
53a0: 6e 5d 20 3d 20 30 3b 0a 20 20 66 63 6c 6f 73 65 n] = 0;. fclose
53b0: 28 70 49 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 (pIn);. return
53c0: 7a 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 zBuf;.}../*.** W
53d0: 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 rite the content
53e0: 73 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e s of a string in
53f0: 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 to a file. Retu
5400: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 rn the number of
5410: 0a 2a 2a 20 65 72 72 6f 72 73 0a 2a 2f 0a 73 74 .** errors.*/.st
5420: 61 74 69 63 20 69 6e 74 20 57 72 69 74 65 46 69 atic int WriteFi
5430: 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a le(const char *z
5440: 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 Filename, const
5450: 63 68 61 72 20 2a 7a 4f 75 74 70 75 74 29 7b 0a char *zOutput){.
5460: 20 20 46 49 4c 45 20 2a 70 4f 75 74 3b 0a 20 20 FILE *pOut;.
5470: 70 4f 75 74 20 3d 20 66 6f 70 65 6e 28 7a 46 69 pOut = fopen(zFi
5480: 6c 65 6e 61 6d 65 2c 22 77 22 29 3b 0a 20 20 69 lename,"w");. i
5490: 66 28 20 70 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 f( pOut==0 ){.
54a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a return 1;. }.
54b0: 20 20 66 77 72 69 74 65 28 7a 4f 75 74 70 75 74 fwrite(zOutput
54c0: 2c 31 2c 73 74 72 6c 65 6e 28 7a 4f 75 74 70 75 ,1,strlen(zOutpu
54d0: 74 29 2c 70 4f 75 74 29 3b 0a 20 20 66 63 6c 6f t),pOut);. fclo
54e0: 73 65 28 70 4f 75 74 29 3b 0a 20 20 72 65 74 75 se(pOut);. retu
54f0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d rn 0;.}../*.** M
5500: 61 6a 6f 72 20 74 6f 6b 65 6e 20 74 79 70 65 73 ajor token types
5510: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 53 .*/.#define TT_S
5520: 70 61 63 65 20 20 20 20 20 20 20 20 20 20 20 31 pace 1
5530: 20 20 20 2f 2a 20 43 6f 6e 74 69 67 75 6f 75 73 /* Contiguous
5540: 20 77 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a white space */.
5550: 23 64 65 66 69 6e 65 20 54 54 5f 49 64 20 20 20 #define TT_Id
5560: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 2f 2 /
5570: 2a 20 41 6e 20 69 64 65 6e 74 69 66 69 65 72 20 * An identifier
5580: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 50 72 */.#define TT_Pr
5590: 65 70 72 6f 63 65 73 73 6f 72 20 20 20 20 33 20 eprocessor 3
55a0: 20 20 2f 2a 20 41 6e 79 20 43 20 70 72 65 70 72 /* Any C prepr
55b0: 6f 63 65 73 73 6f 72 20 64 69 72 65 63 74 69 76 ocessor directiv
55c0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f e */.#define TT_
55d0: 43 6f 6d 6d 65 6e 74 20 20 20 20 20 20 20 20 20 Comment
55e0: 34 20 20 20 2f 2a 20 45 69 74 68 65 72 20 43 20 4 /* Either C
55f0: 6f 72 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d or C++ style com
5600: 6d 65 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 ment */.#define
5610: 54 54 5f 4e 75 6d 62 65 72 20 20 20 20 20 20 20 TT_Number
5620: 20 20 20 35 20 20 20 2f 2a 20 41 6e 79 20 6e 75 5 /* Any nu
5630: 6d 65 72 69 63 20 63 6f 6e 73 74 61 6e 74 20 2a meric constant *
5640: 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 53 74 72 /.#define TT_Str
5650: 69 6e 67 20 20 20 20 20 20 20 20 20 20 36 20 20 ing 6
5660: 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 63 68 /* String or ch
5670: 61 72 61 63 74 65 72 20 63 6f 6e 73 74 61 6e 74 aracter constant
5680: 73 2e 20 22 2e 2e 22 20 6f 72 20 27 2e 27 20 2a s. ".." or '.' *
5690: 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 42 72 61 /.#define TT_Bra
56a0: 63 65 73 20 20 20 20 20 20 20 20 20 20 37 20 20 ces 7
56b0: 20 2f 2a 20 41 6c 6c 20 74 65 78 74 20 62 65 74 /* All text bet
56c0: 77 65 65 6e 20 7b 20 61 6e 64 20 61 20 6d 61 74 ween { and a mat
56d0: 63 68 69 6e 67 20 7d 20 2a 2f 0a 23 64 65 66 69 ching } */.#defi
56e0: 6e 65 20 54 54 5f 45 4f 46 20 20 20 20 20 20 20 ne TT_EOF
56f0: 20 20 20 20 20 20 38 20 20 20 2f 2a 20 45 6e 64 8 /* End
5700: 20 6f 66 20 66 69 6c 65 20 2a 2f 0a 23 64 65 66 of file */.#def
5710: 69 6e 65 20 54 54 5f 45 72 72 6f 72 20 20 20 20 ine TT_Error
5720: 20 20 20 20 20 20 20 39 20 20 20 2f 2a 20 41 6e 9 /* An
5730: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e error condition
5740: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 42 */.#define TT_B
5750: 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 20 20 20 20 31 lockComment 1
5760: 30 20 20 2f 2a 20 41 20 43 2d 53 74 79 6c 65 20 0 /* A C-Style
5770: 63 6f 6d 6d 65 6e 74 20 61 74 20 74 68 65 20 6c comment at the l
5780: 65 66 74 20 6d 61 72 67 69 6e 20 74 68 61 74 0a eft margin that.
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
57b0: 2a 20 73 70 61 6e 73 20 6d 75 6c 74 70 6c 65 20 * spans multple
57c0: 6c 69 6e 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 lines */.#define
57d0: 20 54 54 5f 4f 74 68 65 72 20 20 20 20 20 20 20 TT_Other
57e0: 20 20 20 20 30 20 20 20 2f 2a 20 4e 6f 6e 65 20 0 /* None
57f0: 6f 66 20 74 68 65 20 61 62 6f 76 65 20 2a 2f 0a of the above */.
5800: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 73 69 6e ./*.** Get a sin
5810: 67 6c 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 74 6f gle low-level to
5820: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 ken from the inp
5830: 75 74 20 66 69 6c 65 2e 20 20 55 70 64 61 74 65 ut file. Update
5840: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 70 6f 69 the.** file poi
5850: 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 nter so that it
5860: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 points to the fi
5870: 72 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 rst character be
5880: 79 6f 6e 64 20 74 68 65 0a 2a 2a 20 74 6f 6b 65 yond the.** toke
5890: 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 22 6c 6f 77 2d n..**.** A "low-
58a0: 6c 65 76 65 6c 20 74 6f 6b 65 6e 22 20 69 73 20 level token" is
58b0: 61 6e 79 20 74 6f 6b 65 6e 20 65 78 63 65 70 74 any token except
58c0: 20 54 54 5f 42 72 61 63 65 73 2e 20 20 41 20 54 TT_Braces. A T
58d0: 54 5f 42 72 61 63 65 73 20 74 6f 6b 65 6e 0a 2a T_Braces token.*
58e0: 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 6d 61 * consists of ma
58f0: 6e 79 20 73 6d 61 6c 6c 65 72 20 74 6f 6b 65 6e ny smaller token
5900: 73 20 61 6e 64 20 69 73 20 61 73 73 65 6d 62 6c s and is assembl
5910: 65 64 20 62 79 20 61 20 72 6f 75 74 69 6e 65 20 ed by a routine
5920: 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 that.** calls th
5930: 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 is one..**.** Th
5940: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 e function retur
5950: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 ns the number of
5960: 20 65 72 72 6f 72 73 2e 20 20 41 6e 20 65 72 72 errors. An err
5970: 6f 72 20 69 73 20 61 6e 0a 2a 2a 20 75 6e 74 65 or is an.** unte
5980: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 rminated string
5990: 6f 72 20 63 68 61 72 61 63 74 65 72 20 6c 69 74 or character lit
59a0: 65 72 61 6c 20 6f 72 20 61 6e 20 75 6e 74 65 72 eral or an unter
59b0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 63 6f 6d 6d 65 minated.** comme
59c0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 72 6f 66 69 6c nt..**.** Profil
59d0: 69 6e 67 20 73 68 6f 77 73 20 74 68 61 74 20 74 ing shows that t
59e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 73 his routine cons
59f0: 75 6d 65 73 20 61 62 6f 75 74 20 68 61 6c 66 20 umes about half
5a00: 74 68 65 0a 2a 2a 20 43 50 55 20 74 69 6d 65 20 the.** CPU time
5a10: 6f 6e 20 61 20 74 79 70 69 63 61 6c 20 72 75 6e on a typical run
5a20: 20 6f 66 20 6d 61 6b 65 68 65 61 64 65 72 73 2e of makeheaders.
5a30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 47 .*/.static int G
5a40: 65 74 54 6f 6b 65 6e 28 49 6e 53 74 72 65 61 6d etToken(InStream
5a50: 20 2a 70 49 6e 2c 20 54 6f 6b 65 6e 20 2a 70 54 *pIn, Token *pT
5a60: 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a oken){. int i;.
5a70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b const char *z;
5a80: 0a 20 20 69 6e 74 20 63 53 74 61 72 74 3b 0a 20 . int cStart;.
5a90: 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 73 74 int c;. int st
5aa0: 61 72 74 4c 69 6e 65 3b 20 20 20 2f 2a 20 4c 69 artLine; /* Li
5ab0: 6e 65 20 6f 6e 20 77 68 69 63 68 20 61 20 73 74 ne on which a st
5ac0: 72 75 63 74 75 72 65 20 62 65 67 69 6e 73 20 2a ructure begins *
5ad0: 2f 0a 20 20 69 6e 74 20 6e 6c 69 73 63 20 3d 20 /. int nlisc =
5ae0: 30 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 0; /* True if
5af0: 74 68 65 72 65 20 69 73 20 61 20 6e 65 77 2d 6c there is a new-l
5b00: 69 6e 65 20 69 6e 20 61 20 22 2e 2e 22 20 6f 72 ine in a ".." or
5b10: 20 27 2e 2e 27 20 2a 2f 0a 20 20 69 6e 74 20 6e '..' */. int n
5b20: 45 72 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e Err = 0; /* N
5b30: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 umber of errors
5b40: 73 65 65 6e 20 2a 2f 0a 0a 20 20 7a 20 3d 20 70 seen */.. z = p
5b50: 49 6e 2d 3e 7a 3b 0a 20 20 69 20 3d 20 70 49 6e In->z;. i = pIn
5b60: 2d 3e 69 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 6e ->i;. pToken->n
5b70: 4c 69 6e 65 20 3d 20 70 49 6e 2d 3e 6e 4c 69 6e Line = pIn->nLin
5b80: 65 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 7a 54 65 e;. pToken->zTe
5b90: 78 74 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20 73 77 xt = &z[i];. sw
5ba0: 69 74 63 68 28 20 7a 5b 69 5d 20 29 7b 0a 20 20 itch( z[i] ){.
5bb0: 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20 case 0:.
5bc0: 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 pToken->eType =
5bd0: 54 54 5f 45 4f 46 3b 0a 20 20 20 20 20 20 70 54 TT_EOF;. pT
5be0: 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 30 3b oken->nText = 0;
5bf0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 . break;..
5c00: 20 20 20 63 61 73 65 20 27 23 27 3a 0a 20 20 20 case '#':.
5c10: 20 20 20 69 66 28 20 69 3d 3d 30 20 7c 7c 20 7a if( i==0 || z
5c20: 5b 69 2d 31 5d 3d 3d 27 5c 6e 27 20 7c 7c 20 28 [i-1]=='\n' || (
5c30: 69 3e 31 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27 i>1 && z[i-1]=='
5c40: 5c 72 27 20 26 26 20 7a 5b 69 2d 32 5d 3d 3d 27 \r' && z[i-2]=='
5c50: 5c 6e 27 29 29 7b 0a 20 20 20 20 20 20 20 20 2f \n')){. /
5c60: 2a 20 57 65 20 66 6f 75 6e 64 20 61 20 70 72 65 * We found a pre
5c70: 70 72 6f 63 65 73 73 6f 72 20 73 74 61 74 65 6d processor statem
5c80: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 ent */. p
5c90: 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 Token->eType = T
5ca0: 54 5f 50 72 65 70 72 6f 63 65 73 73 6f 72 3b 0a T_Preprocessor;.
5cb0: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 i++;.
5cc0: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d while( z[i]
5cd0: 21 3d 30 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 6e !=0 && z[i]!='\n
5ce0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 ' ){. i
5cf0: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 5c 27 20 29 7b f( z[i]=='\\' ){
5d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b . i++
5d10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 ;. if
5d20: 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 70 ( z[i]=='\n' ) p
5d30: 49 6e 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 In->nLine++;.
5d40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
5d50: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 i++;.
5d60: 7d 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e }. pToken
5d70: 2d 3e 6e 54 65 78 74 20 3d 20 69 20 2d 20 70 49 ->nText = i - pI
5d80: 6e 2d 3e 69 3b 0a 20 20 20 20 20 20 7d 65 6c 73 n->i;. }els
5d90: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 e{. /* Ju
5da0: 73 74 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 2a st an operator *
5db0: 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e /. pToken
5dc0: 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f 4f 74 68 ->eType = TT_Oth
5dd0: 65 72 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 6b er;. pTok
5de0: 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 31 3b 0a 20 en->nText = 1;.
5df0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 }. bre
5e00: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 27 20 ak;.. case '
5e10: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 5c 74 27 ':. case '\t'
5e20: 3a 0a 20 20 20 20 63 61 73 65 20 27 5c 72 27 3a :. case '\r':
5e30: 0a 20 20 20 20 63 61 73 65 20 27 5c 66 27 3a 0a . case '\f':.
5e40: 20 20 20 20 63 61 73 65 20 27 5c 6e 27 3a 0a 20 case '\n':.
5e50: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 while( issp
5e60: 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 ace(z[i]) ){.
5e70: 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 if( z[i]=='
5e80: 5c 6e 27 20 29 20 70 49 6e 2d 3e 6e 4c 69 6e 65 \n' ) pIn->nLine
5e90: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b ++;. i++;
5ea0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 . }. p
5eb0: 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 Token->eType = T
5ec0: 54 5f 53 70 61 63 65 3b 0a 20 20 20 20 20 20 70 T_Space;. p
5ed0: 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 69 Token->nText = i
5ee0: 20 2d 20 70 49 6e 2d 3e 69 3b 0a 20 20 20 20 20 - pIn->i;.
5ef0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 break;.. cas
5f00: 65 20 27 5c 5c 27 3a 0a 20 20 20 20 20 20 70 54 e '\\':. pT
5f10: 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 32 3b oken->nText = 2;
5f20: 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 . pToken->e
5f30: 54 79 70 65 20 3d 20 54 54 5f 4f 74 68 65 72 3b Type = TT_Other;
5f40: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 . if( z[i+1
5f50: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 ]=='\n' ){.
5f60: 20 20 20 70 49 6e 2d 3e 6e 4c 69 6e 65 2b 2b 3b pIn->nLine++;
5f70: 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d . pToken-
5f80: 3e 65 54 79 70 65 20 3d 20 54 54 5f 53 70 61 63 >eType = TT_Spac
5f90: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 e;. }else i
5fa0: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 30 20 29 7b 0a f( z[i+1]==0 ){.
5fb0: 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e pToken->
5fc0: 6e 54 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 20 nText = 1;.
5fd0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a }. break;.
5fe0: 0a 20 20 20 20 63 61 73 65 20 27 5c 27 27 3a 0a . case '\'':.
5ff0: 20 20 20 20 63 61 73 65 20 27 5c 22 27 3a 0a 20 case '\"':.
6000: 20 20 20 20 20 63 53 74 61 72 74 20 3d 20 7a 5b cStart = z[
6010: 69 5d 3b 0a 20 20 20 20 20 20 73 74 61 72 74 4c i];. startL
6020: 69 6e 65 20 3d 20 70 49 6e 2d 3e 6e 4c 69 6e 65 ine = pIn->nLine
6030: 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 ;. do{.
6040: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 i++;.
6050: 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 c = z[i];.
6060: 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 if( c=='\n' )
6070: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 {. if(
6080: 21 6e 6c 69 73 63 20 29 7b 0a 20 20 20 20 20 20 !nlisc ){.
6090: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 fprintf(st
60a0: 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 derr,.
60b0: 20 20 20 20 22 25 73 3a 25 64 3a 20 28 77 61 72 "%s:%d: (war
60c0: 6e 69 6e 67 29 20 4e 65 77 6c 69 6e 65 20 69 6e ning) Newline in
60d0: 20 73 74 72 69 6e 67 20 6f 72 20 63 68 61 72 61 string or chara
60e0: 63 74 65 72 20 6c 69 74 65 72 61 6c 2e 5c 6e 22 cter literal.\n"
60f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
6100: 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49 6e 2d 3e zFilename, pIn->
6110: 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 nLine);.
6120: 20 20 20 20 6e 6c 69 73 63 20 3d 20 31 3b 0a 20 nlisc = 1;.
6130: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
6140: 20 20 20 20 20 70 49 6e 2d 3e 6e 4c 69 6e 65 2b pIn->nLine+
6150: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 +;. }.
6160: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 if( c=='\\'
6170: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b ){. i+
6180: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d +;. c =
6190: 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 z[i];.
61a0: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a if( c=='\n' ){.
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d pIn-
61c0: 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 >nLine++;.
61d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 }. }e
61e0: 6c 73 65 20 69 66 28 20 63 3d 3d 63 53 74 61 72 lse if( c==cStar
61f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 t ){. i
6200: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 ++;. c
6210: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c = 0;. }el
6220: 73 65 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 se if( c==0 ){.
6230: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 fprintf
6240: 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a (stderr, "%s:%d:
6250: 20 55 6e 74 65 72 6d 69 6e 61 74 65 64 20 73 74 Unterminated st
6260: 72 69 6e 67 20 6f 72 20 63 68 61 72 61 63 74 65 ring or characte
6270: 72 20 6c 69 74 65 72 61 6c 2e 5c 6e 22 2c 0a 20 r literal.\n",.
6280: 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c zFil
6290: 65 6e 61 6d 65 2c 20 73 74 61 72 74 4c 69 6e 65 ename, startLine
62a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72 );. nEr
62b0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 r++;. }.
62c0: 20 20 20 20 20 7d 77 68 69 6c 65 28 20 63 20 29 }while( c )
62d0: 3b 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e ;. pToken->
62e0: 65 54 79 70 65 20 3d 20 54 54 5f 53 74 72 69 6e eType = TT_Strin
62f0: 67 3b 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d g;. pToken-
6300: 3e 6e 54 65 78 74 20 3d 20 69 20 2d 20 70 49 6e >nText = i - pIn
6310: 2d 3e 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b ->i;. break
6320: 3b 0a 0a 20 20 20 20 63 61 73 65 20 27 2f 27 3a ;.. case '/':
6330: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 . if( z[i+1
6340: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 ]=='/' ){.
6350: 20 20 2f 2a 20 43 2b 2b 20 73 74 79 6c 65 20 63 /* C++ style c
6360: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 omment */.
6370: 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20 26 26 while( z[i] &&
6380: 20 7a 5b 69 5d 21 3d 27 5c 6e 27 20 29 7b 20 69 z[i]!='\n' ){ i
6390: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 70 54 ++; }. pT
63a0: 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 oken->eType = TT
63b0: 5f 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 _Comment;.
63c0: 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 pToken->nText
63d0: 3d 20 69 20 2d 20 70 49 6e 2d 3e 69 3b 0a 20 20 = i - pIn->i;.
63e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b }else if( z[
63f0: 69 2b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 i+1]=='*' ){.
6400: 20 20 20 20 20 2f 2a 20 43 20 73 74 79 6c 65 20 /* C style
6410: 63 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 comment */.
6420: 20 20 20 69 6e 74 20 69 73 42 6c 6f 63 6b 43 6f int isBlockCo
6430: 6d 6d 65 6e 74 20 3d 20 69 3d 3d 30 20 7c 7c 20 mment = i==0 ||
6440: 7a 5b 69 2d 31 5d 3d 3d 27 5c 6e 27 3b 0a 20 20 z[i-1]=='\n';.
6450: 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 i += 2;.
6460: 20 20 20 20 20 20 73 74 61 72 74 4c 69 6e 65 20 startLine
6470: 3d 20 70 49 6e 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 = pIn->nLine;.
6480: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69 while( z[i
6490: 5d 20 26 26 20 28 7a 5b 69 5d 21 3d 27 2a 27 20 ] && (z[i]!='*'
64a0: 7c 7c 20 7a 5b 69 2b 31 5d 21 3d 27 2f 27 29 20 || z[i+1]!='/')
64b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 ){. if(
64c0: 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 z[i]=='\n' ){.
64d0: 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e pIn->
64e0: 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20 nLine++;.
64f0: 20 20 20 20 20 69 66 28 20 69 73 42 6c 6f 63 6b if( isBlock
6500: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 Comment ){.
6510: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 if( z[i
6520: 2b 31 5d 3d 3d 27 2a 27 20 7c 7c 20 7a 5b 69 2b +1]=='*' || z[i+
6530: 32 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 2]=='*' ){.
6540: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 42 6c isBl
6550: 6f 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20 32 3b 0a ockComment = 2;.
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 }e
6570: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 lse{.
6580: 20 20 20 20 20 20 69 73 42 6c 6f 63 6b 43 6f 6d isBlockCom
6590: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 ment = 0;.
65a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
65b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
65c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 2b }. i+
65d0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 +;. }.
65e0: 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 7b if( z[i] ){
65f0: 20 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d . i +=
6600: 20 32 3b 20 0a 20 20 20 20 20 20 20 20 7d 65 6c 2; . }el
6610: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 se{. is
6620: 42 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20 30 BlockComment = 0
6630: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 ;. fpri
6640: 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 ntf(stderr,"%s:%
6650: 64 3a 20 55 6e 74 65 72 6d 69 6e 61 74 65 64 20 d: Unterminated
6660: 63 6f 6d 6d 65 6e 74 5c 6e 22 2c 0a 20 20 20 20 comment\n",.
6670: 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d zFilenam
6680: 65 2c 20 73 74 61 72 74 4c 69 6e 65 29 3b 0a 20 e, startLine);.
6690: 20 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b nErr++;
66a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
66b0: 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 pToken->eType
66c0: 20 3d 20 69 73 42 6c 6f 63 6b 43 6f 6d 6d 65 6e = isBlockCommen
66d0: 74 3d 3d 32 20 3f 20 54 54 5f 42 6c 6f 63 6b 43 t==2 ? TT_BlockC
66e0: 6f 6d 6d 65 6e 74 20 3a 20 54 54 5f 43 6f 6d 6d omment : TT_Comm
66f0: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f ent;. pTo
6700: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 69 20 2d ken->nText = i -
6710: 20 70 49 6e 2d 3e 69 3b 0a 20 20 20 20 20 20 7d pIn->i;. }
6720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a else{. /*
6730: 20 41 20 64 69 76 69 64 65 20 6f 70 65 72 61 74 A divide operat
6740: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 or */. pT
6750: 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 oken->eType = TT
6760: 5f 4f 74 68 65 72 3b 0a 20 20 20 20 20 20 20 20 _Other;.
6770: 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 pToken->nText =
6780: 31 20 2b 20 28 7a 5b 69 2b 31 5d 3d 3d 27 2b 27 1 + (z[i+1]=='+'
6790: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 );. }.
67a0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 break;.. cas
67b0: 65 20 27 30 27 3a 20 0a 20 20 20 20 20 20 69 66 e '0': . if
67c0: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 78 27 20 7c 7c ( z[i+1]=='x' ||
67d0: 20 7a 5b 69 2b 31 5d 3d 3d 27 58 27 20 29 7b 0a z[i+1]=='X' ){.
67e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 68 65 78 /* A hex
67f0: 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 constant */.
6800: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 i += 2;.
6810: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 78 64 while( isxd
6820: 69 67 69 74 28 7a 5b 69 5d 29 20 29 7b 20 69 2b igit(z[i]) ){ i+
6830: 2b 3b 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 +; }. }else
6840: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 {. /* An
6850: 6f 63 74 61 6c 20 63 6f 6e 73 74 61 6e 74 20 2a octal constant *
6860: 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 /. while(
6870: 20 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 20 29 isdigit(z[i]) )
6880: 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7d { i++; }. }
6890: 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 . pToken->e
68a0: 54 79 70 65 20 3d 20 54 54 5f 4e 75 6d 62 65 72 Type = TT_Number
68b0: 3b 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e ;. pToken->
68c0: 6e 54 65 78 74 20 3d 20 69 20 2d 20 70 49 6e 2d nText = i - pIn-
68d0: 3e 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b >i;. break;
68e0: 0a 0a 20 20 20 20 63 61 73 65 20 27 31 27 3a 20 .. case '1':
68f0: 63 61 73 65 20 27 32 27 3a 20 63 61 73 65 20 27 case '2': case '
6900: 33 27 3a 20 63 61 73 65 20 27 34 27 3a 0a 20 20 3': case '4':.
6910: 20 20 63 61 73 65 20 27 35 27 3a 20 63 61 73 65 case '5': case
6920: 20 27 36 27 3a 20 63 61 73 65 20 27 37 27 3a 20 '6': case '7':
6930: 63 61 73 65 20 27 38 27 3a 20 63 61 73 65 20 27 case '8': case '
6940: 39 27 3a 0a 20 20 20 20 20 20 77 68 69 6c 65 28 9':. while(
6950: 20 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 20 29 isdigit(z[i]) )
6960: 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 { i++; }. i
6970: 66 28 20 28 63 3d 7a 5b 69 5d 29 3d 3d 27 2e 27 f( (c=z[i])=='.'
6980: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 69 2b 2b ){. i++
6990: 3b 0a 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 ;. while
69a0: 28 20 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 20 ( isdigit(z[i])
69b0: 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 ){ i++; }.
69c0: 20 20 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 c = z[i];.
69d0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 65 27 if( c=='e'
69e0: 20 7c 7c 20 63 3d 3d 27 45 27 20 29 7b 0a 20 20 || c=='E' ){.
69f0: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 i++;.
6a00: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 28 63 if( ((c
6a10: 3d 7a 5b 69 5d 29 3d 3d 27 2b 27 20 7c 7c 20 63 =z[i])=='+' || c
6a20: 3d 3d 27 2d 27 29 20 26 26 20 69 73 64 69 67 69 =='-') && isdigi
6a30: 74 28 7a 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b t(z[i+1]) ){ i++
6a40: 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 77 ; }. w
6a50: 68 69 6c 65 28 20 69 73 64 69 67 69 74 28 7a 5b hile( isdigit(z[
6a60: 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 i]) ){ i++; }.
6a70: 20 20 20 20 20 20 20 20 20 63 20 3d 20 7a 5b 69 c = z[i
6a80: 5d 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20 20 ];. }.
6a90: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 66 if( c=='f
6aa0: 27 20 7c 7c 20 63 3d 3d 27 46 27 20 7c 7c 20 63 ' || c=='F' || c
6ab0: 3d 3d 27 6c 27 20 7c 7c 20 63 3d 3d 27 4c 27 20 =='l' || c=='L'
6ac0: 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 ){ i++; }.
6ad0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 65 27 }else if( c=='e'
6ae0: 20 7c 7c 20 63 3d 3d 27 45 27 20 29 7b 0a 20 20 || c=='E' ){.
6af0: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 i++;.
6b00: 20 20 20 20 20 69 66 28 20 28 28 63 3d 7a 5b 69 if( ((c=z[i
6b10: 5d 29 3d 3d 27 2b 27 20 7c 7c 20 63 3d 3d 27 2d ])=='+' || c=='-
6b20: 27 29 20 26 26 20 69 73 64 69 67 69 74 28 7a 5b ') && isdigit(z[
6b30: 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a i+1]) ){ i++; }.
6b40: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 while(
6b50: 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 20 29 7b isdigit(z[i]) ){
6b60: 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7d 65 i++; }. }e
6b70: 6c 73 65 20 69 66 28 20 63 3d 3d 27 4c 27 20 7c lse if( c=='L' |
6b80: 7c 20 63 3d 3d 27 6c 27 20 29 7b 0a 20 20 20 20 | c=='l' ){.
6b90: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 i++;.
6ba0: 20 20 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 c = z[i];.
6bb0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 75 27 if( c=='u'
6bc0: 20 7c 7c 20 63 3d 3d 27 55 27 20 29 7b 20 69 2b || c=='U' ){ i+
6bd0: 2b 3b 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 +; }. }else
6be0: 20 69 66 28 20 63 3d 3d 27 75 27 20 7c 7c 20 63 if( c=='u' || c
6bf0: 3d 3d 27 55 27 20 29 7b 0a 20 20 20 20 20 20 20 =='U' ){.
6c00: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 i++;.
6c10: 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 c = z[i];.
6c20: 20 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 7c 7c if( c=='l' ||
6c30: 20 63 3d 3d 27 4c 27 20 29 7b 20 69 2b 2b 3b 20 c=='L' ){ i++;
6c40: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }. }.
6c50: 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 pToken->eType =
6c60: 54 54 5f 4e 75 6d 62 65 72 3b 0a 20 20 20 20 20 TT_Number;.
6c70: 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d pToken->nText =
6c80: 20 69 20 2d 20 70 49 6e 2d 3e 69 3b 0a 20 20 20 i - pIn->i;.
6c90: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 break;.. c
6ca0: 61 73 65 20 27 61 27 3a 20 63 61 73 65 20 27 62 ase 'a': case 'b
6cb0: 27 3a 20 63 61 73 65 20 27 63 27 3a 20 63 61 73 ': case 'c': cas
6cc0: 65 20 27 64 27 3a 20 63 61 73 65 20 27 65 27 3a e 'd': case 'e':
6cd0: 20 63 61 73 65 20 27 66 27 3a 20 63 61 73 65 20 case 'f': case
6ce0: 27 67 27 3a 0a 20 20 20 20 63 61 73 65 20 27 68 'g':. case 'h
6cf0: 27 3a 20 63 61 73 65 20 27 69 27 3a 20 63 61 73 ': case 'i': cas
6d00: 65 20 27 6a 27 3a 20 63 61 73 65 20 27 6b 27 3a e 'j': case 'k':
6d10: 20 63 61 73 65 20 27 6c 27 3a 20 63 61 73 65 20 case 'l': case
6d20: 27 6d 27 3a 20 63 61 73 65 20 27 6e 27 3a 0a 20 'm': case 'n':.
6d30: 20 20 20 63 61 73 65 20 27 6f 27 3a 20 63 61 73 case 'o': cas
6d40: 65 20 27 70 27 3a 20 63 61 73 65 20 27 71 27 3a e 'p': case 'q':
6d50: 20 63 61 73 65 20 27 72 27 3a 20 63 61 73 65 20 case 'r': case
6d60: 27 73 27 3a 20 63 61 73 65 20 27 74 27 3a 20 63 's': case 't': c
6d70: 61 73 65 20 27 75 27 3a 0a 20 20 20 20 63 61 73 ase 'u':. cas
6d80: 65 20 27 76 27 3a 20 63 61 73 65 20 27 77 27 3a e 'v': case 'w':
6d90: 20 63 61 73 65 20 27 78 27 3a 20 63 61 73 65 20 case 'x': case
6da0: 27 79 27 3a 20 63 61 73 65 20 27 7a 27 3a 20 63 'y': case 'z': c
6db0: 61 73 65 20 27 41 27 3a 20 63 61 73 65 20 27 42 ase 'A': case 'B
6dc0: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 43 27 3a ':. case 'C':
6dd0: 20 63 61 73 65 20 27 44 27 3a 20 63 61 73 65 20 case 'D': case
6de0: 27 45 27 3a 20 63 61 73 65 20 27 46 27 3a 20 63 'E': case 'F': c
6df0: 61 73 65 20 27 47 27 3a 20 63 61 73 65 20 27 48 ase 'G': case 'H
6e00: 27 3a 20 63 61 73 65 20 27 49 27 3a 0a 20 20 20 ': case 'I':.
6e10: 20 63 61 73 65 20 27 4a 27 3a 20 63 61 73 65 20 case 'J': case
6e20: 27 4b 27 3a 20 63 61 73 65 20 27 4c 27 3a 20 63 'K': case 'L': c
6e30: 61 73 65 20 27 4d 27 3a 20 63 61 73 65 20 27 4e ase 'M': case 'N
6e40: 27 3a 20 63 61 73 65 20 27 4f 27 3a 20 63 61 73 ': case 'O': cas
6e50: 65 20 27 50 27 3a 0a 20 20 20 20 63 61 73 65 20 e 'P':. case
6e60: 27 51 27 3a 20 63 61 73 65 20 27 52 27 3a 20 63 'Q': case 'R': c
6e70: 61 73 65 20 27 53 27 3a 20 63 61 73 65 20 27 54 ase 'S': case 'T
6e80: 27 3a 20 63 61 73 65 20 27 55 27 3a 20 63 61 73 ': case 'U': cas
6e90: 65 20 27 56 27 3a 20 63 61 73 65 20 27 57 27 3a e 'V': case 'W':
6ea0: 0a 20 20 20 20 63 61 73 65 20 27 58 27 3a 20 63 . case 'X': c
6eb0: 61 73 65 20 27 59 27 3a 20 63 61 73 65 20 27 5a ase 'Y': case 'Z
6ec0: 27 3a 20 63 61 73 65 20 27 5f 27 3a 0a 20 20 20 ': case '_':.
6ed0: 20 20 20 77 68 69 6c 65 28 20 69 73 61 6c 6e 75 while( isalnu
6ee0: 6d 28 7a 5b 69 5d 29 20 7c 7c 20 7a 5b 69 5d 3d m(z[i]) || z[i]=
6ef0: 3d 27 5f 27 20 29 7b 20 69 2b 2b 3b 20 7d 3b 0a ='_' ){ i++; };.
6f00: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 pToken->eT
6f10: 79 70 65 20 3d 20 54 54 5f 49 64 3b 0a 20 20 20 ype = TT_Id;.
6f20: 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 pToken->nText
6f30: 20 3d 20 69 20 2d 20 70 49 6e 2d 3e 69 3b 0a 20 = i - pIn->i;.
6f40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 break;..
6f50: 20 63 61 73 65 20 27 3a 27 3a 20 0a 20 20 20 20 case ':': .
6f60: 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 pToken->eType
6f70: 3d 20 54 54 5f 4f 74 68 65 72 3b 0a 20 20 20 20 = TT_Other;.
6f80: 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 pToken->nText
6f90: 3d 20 31 20 2b 20 28 7a 5b 69 2b 31 5d 3d 3d 27 = 1 + (z[i+1]=='
6fa0: 3a 27 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b :');. break
6fb0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 27 3d 27 3a ;.. case '=':
6fc0: 0a 20 20 20 20 63 61 73 65 20 27 3c 27 3a 0a 20 . case '<':.
6fd0: 20 20 20 63 61 73 65 20 27 3e 27 3a 0a 20 20 20 case '>':.
6fe0: 20 63 61 73 65 20 27 2b 27 3a 0a 20 20 20 20 63 case '+':. c
6ff0: 61 73 65 20 27 2d 27 3a 0a 20 20 20 20 63 61 73 ase '-':. cas
7000: 65 20 27 2a 27 3a 0a 20 20 20 20 63 61 73 65 20 e '*':. case
7010: 27 25 27 3a 0a 20 20 20 20 63 61 73 65 20 27 5e '%':. case '^
7020: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 26 27 3a ':. case '&':
7030: 0a 20 20 20 20 63 61 73 65 20 27 7c 27 3a 20 0a . case '|': .
7040: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 pToken->eT
7050: 79 70 65 20 3d 20 54 54 5f 4f 74 68 65 72 3b 0a ype = TT_Other;.
7060: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 pToken->nT
7070: 65 78 74 20 3d 20 31 20 2b 20 28 7a 5b 69 2b 31 ext = 1 + (z[i+1
7080: 5d 3d 3d 27 3d 27 29 3b 0a 20 20 20 20 20 20 62 ]=='=');. b
7090: 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 reak;.. defau
70a0: 6c 74 3a 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e lt:. pToken
70b0: 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f 4f 74 68 ->eType = TT_Oth
70c0: 65 72 3b 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e er;. pToken
70d0: 2d 3e 6e 54 65 78 74 20 3d 20 31 3b 0a 20 20 20 ->nText = 1;.
70e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 break;. }.
70f0: 70 49 6e 2d 3e 69 20 2b 3d 20 70 54 6f 6b 65 6e pIn->i += pToken
7100: 2d 3e 6e 54 65 78 74 3b 0a 20 20 72 65 74 75 72 ->nText;. retur
7110: 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a n nErr;.}../*.**
7120: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 This routine re
7130: 63 6f 76 65 72 73 20 74 68 65 20 6e 65 78 74 20 covers the next
7140: 74 6f 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 69 token from the i
7150: 6e 70 75 74 20 66 69 6c 65 20 77 68 69 63 68 20 nput file which
7160: 69 73 0a 2a 2a 20 6e 6f 74 20 61 20 73 70 61 63 is.** not a spac
7170: 65 20 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f e or a comment o
7180: 72 20 61 6e 79 20 74 65 78 74 20 62 65 74 77 65 r any text betwe
7190: 65 6e 20 61 6e 20 22 23 69 66 20 30 22 20 61 6e en an "#if 0" an
71a0: 64 20 22 23 65 6e 64 69 66 22 2e 0a 2a 2a 0a 2a d "#endif"..**.*
71b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 * This routine r
71c0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 eturns the numbe
71d0: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f r of errors enco
71e0: 75 6e 74 65 72 65 64 2e 20 20 41 6e 20 65 72 72 untered. An err
71f0: 6f 72 0a 2a 2a 20 69 73 20 61 6e 20 75 6e 74 65 or.** is an unte
7200: 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20 6f rminated token o
7210: 72 20 75 6e 6d 61 74 63 68 65 64 20 22 23 69 66 r unmatched "#if
7220: 20 30 22 2e 0a 2a 2a 0a 2a 2a 20 50 72 6f 66 69 0"..**.** Profi
7230: 6c 69 6e 67 20 73 68 6f 77 73 20 74 68 61 74 20 ling shows that
7240: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 this routine use
7250: 73 20 61 62 6f 75 74 20 61 20 71 75 61 72 74 65 s about a quarte
7260: 72 20 6f 66 20 74 68 65 0a 2a 2a 20 43 50 55 20 r of the.** CPU
7270: 74 69 6d 65 20 69 6e 20 61 20 74 79 70 69 63 61 time in a typica
7280: 6c 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 l run..*/.static
7290: 20 69 6e 74 20 47 65 74 4e 6f 6e 73 70 61 63 65 int GetNonspace
72a0: 54 6f 6b 65 6e 28 49 6e 53 74 72 65 61 6d 20 2a Token(InStream *
72b0: 70 49 6e 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b pIn, Token *pTok
72c0: 65 6e 29 7b 0a 20 20 69 6e 74 20 6e 49 66 20 3d en){. int nIf =
72d0: 20 30 3b 0a 20 20 69 6e 74 20 69 6e 5a 65 72 6f 0;. int inZero
72e0: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 = 0;. const ch
72f0: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 76 61 6c ar *z;. int val
7300: 75 65 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 4c ue;. int startL
7310: 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 ine;. int nErr
7320: 3d 20 30 3b 0a 0a 20 20 73 74 61 72 74 4c 69 6e = 0;.. startLin
7330: 65 20 3d 20 70 49 6e 2d 3e 6e 4c 69 6e 65 3b 0a e = pIn->nLine;.
7340: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 while( 1 ){.
7350: 20 20 6e 45 72 72 20 2b 3d 20 47 65 74 54 6f 6b nErr += GetTok
7360: 65 6e 28 70 49 6e 2c 70 54 6f 6b 65 6e 29 3b 0a en(pIn,pToken);.
7370: 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 25 /* printf("%
7380: 30 34 64 3a 20 54 79 70 65 3d 25 64 20 6e 49 66 04d: Type=%d nIf
7390: 3d 25 64 20 5b 25 2e 2a 73 5d 5c 6e 22 2c 0a 20 =%d [%.*s]\n",.
73a0: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e 4c pToken->nL
73b0: 69 6e 65 2c 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 ine,pToken->eTyp
73c0: 65 2c 6e 49 66 2c 70 54 6f 6b 65 6e 2d 3e 6e 54 e,nIf,pToken->nT
73d0: 65 78 74 2c 0a 20 20 20 20 20 20 20 70 54 6f 6b ext,. pTok
73e0: 65 6e 2d 3e 65 54 79 70 65 21 3d 54 54 5f 53 70 en->eType!=TT_Sp
73f0: 61 63 65 20 3f 20 70 54 6f 6b 65 6e 2d 3e 7a 54 ace ? pToken->zT
7400: 65 78 74 20 3a 20 22 3c 73 70 61 63 65 3e 22 29 ext : "<space>")
7410: 3b 20 2a 2f 0a 20 20 20 20 70 54 6f 6b 65 6e 2d ; */. pToken-
7420: 3e 70 43 6f 6d 6d 65 6e 74 20 3d 20 62 6c 6f 63 >pComment = bloc
7430: 6b 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 73 77 kComment;. sw
7440: 69 74 63 68 28 20 70 54 6f 6b 65 6e 2d 3e 65 54 itch( pToken->eT
7450: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 ype ){. cas
7460: 65 20 54 54 5f 43 6f 6d 6d 65 6e 74 3a 0a 20 20 e TT_Comment:.
7470: 20 20 20 20 63 61 73 65 20 54 54 5f 53 70 61 63 case TT_Spac
7480: 65 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b e:. break
7490: 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 ;.. case TT
74a0: 5f 42 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 3a 0a 20 _BlockComment:.
74b0: 20 20 20 20 20 20 20 69 66 28 20 64 6f 63 5f 66 if( doc_f
74c0: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 lag ){.
74d0: 20 62 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20 blockComment =
74e0: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 SafeMalloc( size
74f0: 6f 66 28 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 of(Token) );.
7500: 20 20 20 20 20 20 20 2a 62 6c 6f 63 6b 43 6f 6d *blockCom
7510: 6d 65 6e 74 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a ment = *pToken;.
7520: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
7530: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 break;..
7540: 63 61 73 65 20 54 54 5f 45 4f 46 3a 0a 20 20 20 case TT_EOF:.
7550: 20 20 20 20 20 69 66 28 20 6e 49 66 20 29 7b 0a if( nIf ){.
7560: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 fprint
7570: 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a f(stderr,"%s:%d:
7580: 20 55 6e 74 65 72 6d 69 6e 61 74 65 64 20 5c 22 Unterminated \"
7590: 23 69 66 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 #if\"\n",.
75a0: 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 zFilename
75b0: 2c 20 73 74 61 72 74 4c 69 6e 65 29 3b 0a 20 20 , startLine);.
75c0: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a nErr++;.
75d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
75e0: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 0a return nErr;..
75f0: 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 50 72 case TT_Pr
7600: 65 70 72 6f 63 65 73 73 6f 72 3a 0a 20 20 20 20 eprocessor:.
7610: 20 20 20 20 7a 20 3d 20 26 70 54 6f 6b 65 6e 2d z = &pToken-
7620: 3e 7a 54 65 78 74 5b 31 5d 3b 0a 20 20 20 20 20 >zText[1];.
7630: 20 20 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 27 20 while( *z=='
7640: 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 29 20 ' || *z=='\t' )
7650: 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 z++;. if(
7660: 20 73 73 63 61 6e 66 28 7a 2c 22 69 66 20 25 64 sscanf(z,"if %d
7670: 22 2c 26 76 61 6c 75 65 29 3d 3d 31 20 26 26 20 ",&value)==1 &&
7680: 76 61 6c 75 65 3d 3d 30 20 29 7b 0a 20 20 20 20 value==0 ){.
7690: 20 20 20 20 20 20 6e 49 66 2b 2b 3b 0a 20 20 20 nIf++;.
76a0: 20 20 20 20 20 20 20 69 6e 5a 65 72 6f 20 3d 20 inZero =
76b0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 1;. }else
76c0: 20 69 66 28 20 69 6e 5a 65 72 6f 20 29 7b 0a 20 if( inZero ){.
76d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 if( str
76e0: 6e 63 6d 70 28 7a 2c 22 69 66 22 2c 32 29 3d 3d ncmp(z,"if",2)==
76f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 0 ){.
7700: 20 6e 49 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 nIf++;.
7710: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e }else if( strn
7720: 63 6d 70 28 7a 2c 22 65 6e 64 69 66 22 2c 35 29 cmp(z,"endif",5)
7730: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ==0 ){.
7740: 20 20 20 6e 49 66 2d 2d 3b 0a 20 20 20 20 20 20 nIf--;.
7750: 20 20 20 20 20 20 69 66 28 20 6e 49 66 3d 3d 30 if( nIf==0
7760: 20 29 20 69 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 ) inZero = 0;.
7770: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
7780: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
7790: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b return nErr;
77a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
77b0: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 break;..
77c0: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 default:.
77d0: 20 20 69 66 28 20 21 69 6e 5a 65 72 6f 20 29 7b if( !inZero ){
77e0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 . retur
77f0: 6e 20 6e 45 72 72 3b 0a 20 20 20 20 20 20 20 20 n nErr;.
7800: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b }. break;
7810: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 . }. }. /*
7820: 4e 4f 54 20 52 45 41 43 48 45 44 20 2a 2f 0a 7d NOT REACHED */.}
7830: 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f ../* .** This ro
7840: 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 utine looks for
7850: 69 64 65 6e 74 69 66 69 65 72 73 20 28 73 74 72 identifiers (str
7860: 69 6e 67 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f ings of contiguo
7870: 75 73 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 0a us alphanumeric.
7880: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 29 20 77 ** characters) w
7890: 69 74 68 69 6e 20 61 20 70 72 65 70 72 6f 63 65 ithin a preproce
78a0: 73 73 6f 72 20 64 69 72 65 63 74 69 76 65 20 61 ssor directive a
78b0: 6e 64 20 61 64 64 73 20 65 76 65 72 79 20 73 75 nd adds every su
78c0: 63 68 20 73 74 72 69 6e 67 0a 2a 2a 20 66 6f 75 ch string.** fou
78d0: 6e 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 nd to the given
78e0: 69 64 65 6e 74 69 66 69 65 72 20 74 61 62 6c 65 identifier table
78f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
7900: 46 69 6e 64 49 64 65 6e 74 69 66 69 65 72 73 49 FindIdentifiersI
7910: 6e 4d 61 63 72 6f 28 54 6f 6b 65 6e 20 2a 70 54 nMacro(Token *pT
7920: 6f 6b 65 6e 2c 20 49 64 65 6e 74 54 61 62 6c 65 oken, IdentTable
7930: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 6f 6b *pTable){. Tok
7940: 65 6e 20 73 54 6f 6b 65 6e 3b 0a 20 20 49 6e 53 en sToken;. InS
7950: 74 72 65 61 6d 20 73 49 6e 3b 0a 20 20 69 6e 74 tream sIn;. int
7960: 20 67 6f 20 3d 20 31 3b 0a 0a 20 20 73 49 6e 2e go = 1;.. sIn.
7970: 7a 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 z = pToken->zTex
7980: 74 3b 0a 20 20 73 49 6e 2e 69 20 3d 20 31 3b 0a t;. sIn.i = 1;.
7990: 20 20 73 49 6e 2e 6e 4c 69 6e 65 20 3d 20 31 3b sIn.nLine = 1;
79a0: 0a 20 20 77 68 69 6c 65 28 20 67 6f 20 26 26 20 . while( go &&
79b0: 73 49 6e 2e 69 20 3c 20 70 54 6f 6b 65 6e 2d 3e sIn.i < pToken->
79c0: 6e 54 65 78 74 20 29 7b 0a 20 20 20 20 47 65 74 nText ){. Get
79d0: 54 6f 6b 65 6e 28 26 73 49 6e 2c 26 73 54 6f 6b Token(&sIn,&sTok
79e0: 65 6e 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 en);. switch(
79f0: 20 73 54 6f 6b 65 6e 2e 65 54 79 70 65 20 29 7b sToken.eType ){
7a00: 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 49 . case TT_I
7a10: 64 3a 0a 20 20 20 20 20 20 20 20 49 64 65 6e 74 d:. Ident
7a20: 54 61 62 6c 65 49 6e 73 65 72 74 28 70 54 61 62 TableInsert(pTab
7a30: 6c 65 2c 73 54 6f 6b 65 6e 2e 7a 54 65 78 74 2c le,sToken.zText,
7a40: 73 54 6f 6b 65 6e 2e 6e 54 65 78 74 29 3b 0a 20 sToken.nText);.
7a50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 break;..
7a60: 20 20 20 20 20 63 61 73 65 20 54 54 5f 45 4f 46 case TT_EOF
7a70: 3a 0a 20 20 20 20 20 20 20 20 67 6f 20 3d 20 30 :. go = 0
7a80: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
7a90: 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a .. default:
7aa0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a . break;.
7ab0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a }. }.}../*.
7ac0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
7ad0: 67 65 74 73 20 74 68 65 20 6e 65 78 74 20 74 6f gets the next to
7ae0: 6b 65 6e 2e 20 20 45 76 65 72 79 74 68 69 6e 67 ken. Everything
7af0: 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 contained withi
7b00: 6e 0a 2a 2a 20 7b 2e 2e 2e 7d 20 69 73 20 63 6f n.** {...} is co
7b10: 6c 6c 61 70 73 65 64 20 69 6e 74 6f 20 61 20 73 llapsed into a s
7b20: 69 6e 67 6c 65 20 54 54 5f 42 72 61 63 65 73 20 ingle TT_Braces
7b30: 74 6f 6b 65 6e 2e 20 20 57 68 69 74 65 73 70 61 token. Whitespa
7b40: 63 65 20 69 73 0a 2a 2a 20 6f 6d 69 74 74 65 64 ce is.** omitted
7b50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 61 62 6c ..**.** If pTabl
7b60: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 e is not NULL, t
7b70: 68 65 6e 20 69 6e 73 65 72 74 20 65 76 65 72 79 hen insert every
7b80: 20 69 64 65 6e 74 69 66 69 65 72 20 73 65 65 6e identifier seen
7b90: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 49 64 65 into the.** Ide
7ba0: 6e 74 54 61 62 6c 65 2e 20 20 54 68 69 73 20 69 ntTable. This i
7bb0: 6e 63 6c 75 64 65 73 20 61 6e 79 20 69 64 65 6e ncludes any iden
7bc0: 74 69 66 69 65 72 73 20 73 65 65 6e 20 69 6e 73 tifiers seen ins
7bd0: 69 64 65 20 6f 66 20 7b 2e 2e 2e 7d 2e 0a 2a 2a ide of {...}..**
7be0: 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f .** The number o
7bf0: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 f errors encount
7c00: 65 72 65 64 20 69 73 20 72 65 74 75 72 6e 65 64 ered is returned
7c10: 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 61 . An error is a
7c20: 6e 0a 2a 2a 20 75 6e 74 65 72 6d 69 6e 61 74 65 n.** unterminate
7c30: 64 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 d token..*/.stat
7c40: 69 63 20 69 6e 74 20 47 65 74 42 69 67 54 6f 6b ic int GetBigTok
7c50: 65 6e 28 49 6e 53 74 72 65 61 6d 20 2a 70 49 6e en(InStream *pIn
7c60: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c , Token *pToken,
7c70: 20 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 54 61 IdentTable *pTa
7c80: 62 6c 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 ble){. const ch
7c90: 61 72 20 2a 7a 2c 20 2a 7a 53 74 61 72 74 3b 0a ar *z, *zStart;.
7ca0: 20 20 69 6e 74 20 69 53 74 61 72 74 3b 0a 20 20 int iStart;.
7cb0: 69 6e 74 20 6e 42 72 61 63 65 3b 0a 20 20 69 6e int nBrace;. in
7cc0: 74 20 63 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 t c;. int nLine
7cd0: 3b 0a 20 20 69 6e 74 20 6e 45 72 72 3b 0a 0a 20 ;. int nErr;..
7ce0: 20 6e 45 72 72 20 3d 20 47 65 74 4e 6f 6e 73 70 nErr = GetNonsp
7cf0: 61 63 65 54 6f 6b 65 6e 28 70 49 6e 2c 70 54 6f aceToken(pIn,pTo
7d00: 6b 65 6e 29 3b 0a 20 20 73 77 69 74 63 68 28 20 ken);. switch(
7d10: 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 29 7b pToken->eType ){
7d20: 0a 20 20 20 20 63 61 73 65 20 54 54 5f 49 64 3a . case TT_Id:
7d30: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 6c . if( pTabl
7d40: 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 e!=0 ){.
7d50: 49 64 65 6e 74 54 61 62 6c 65 49 6e 73 65 72 74 IdentTableInsert
7d60: 28 70 54 61 62 6c 65 2c 70 54 6f 6b 65 6e 2d 3e (pTable,pToken->
7d70: 7a 54 65 78 74 2c 70 54 6f 6b 65 6e 2d 3e 6e 54 zText,pToken->nT
7d80: 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 ext);. }.
7d90: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b return nErr;
7da0: 0a 0a 20 20 20 20 63 61 73 65 20 54 54 5f 50 72 .. case TT_Pr
7db0: 65 70 72 6f 63 65 73 73 6f 72 3a 0a 20 20 20 20 eprocessor:.
7dc0: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 if( pTable!=0
7dd0: 29 7b 0a 20 20 20 20 20 20 20 20 46 69 6e 64 49 ){. FindI
7de0: 64 65 6e 74 69 66 69 65 72 73 49 6e 4d 61 63 72 dentifiersInMacr
7df0: 6f 28 70 54 6f 6b 65 6e 2c 70 54 61 62 6c 65 29 o(pToken,pTable)
7e00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
7e10: 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 0a 20 20 return nErr;..
7e20: 20 20 63 61 73 65 20 54 54 5f 4f 74 68 65 72 3a case TT_Other:
7e30: 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 . if( pToke
7e40: 6e 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 7b 27 n->zText[0]=='{'
7e50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 ) break;.
7e60: 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 0a 20 20 return nErr;..
7e70: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 default:.
7e80: 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20 return nErr;.
7e90: 7d 0a 0a 20 20 7a 20 3d 20 70 49 6e 2d 3e 7a 3b }.. z = pIn->z;
7ea0: 0a 20 20 69 53 74 61 72 74 20 3d 20 70 49 6e 2d . iStart = pIn-
7eb0: 3e 69 3b 0a 20 20 7a 53 74 61 72 74 20 3d 20 70 >i;. zStart = p
7ec0: 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 3b 0a 20 20 Token->zText;.
7ed0: 6e 4c 69 6e 65 20 3d 20 70 54 6f 6b 65 6e 2d 3e nLine = pToken->
7ee0: 6e 4c 69 6e 65 3b 0a 20 20 6e 42 72 61 63 65 20 nLine;. nBrace
7ef0: 3d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 6e 42 = 1;. while( nB
7f00: 72 61 63 65 20 29 7b 0a 20 20 20 20 6e 45 72 72 race ){. nErr
7f10: 20 2b 3d 20 47 65 74 4e 6f 6e 73 70 61 63 65 54 += GetNonspaceT
7f20: 6f 6b 65 6e 28 70 49 6e 2c 70 54 6f 6b 65 6e 29 oken(pIn,pToken)
7f30: 3b 0a 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 ;. /* printf(
7f40: 22 25 30 34 64 3a 20 6e 42 72 61 63 65 3d 25 64 "%04d: nBrace=%d
7f50: 20 5b 25 2e 2a 73 5d 5c 6e 22 2c 70 54 6f 6b 65 [%.*s]\n",pToke
7f60: 6e 2d 3e 6e 4c 69 6e 65 2c 6e 42 72 61 63 65 2c n->nLine,nBrace,
7f70: 0a 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e . pToken->
7f80: 6e 54 65 78 74 2c 70 54 6f 6b 65 6e 2d 3e 7a 54 nText,pToken->zT
7f90: 65 78 74 29 3b 20 2a 2f 0a 20 20 20 20 73 77 69 ext); */. swi
7fa0: 74 63 68 28 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 tch( pToken->eTy
7fb0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 pe ){. case
7fc0: 20 54 54 5f 45 4f 46 3a 0a 20 20 20 20 20 20 20 TT_EOF:.
7fd0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c fprintf(stderr,
7fe0: 22 25 73 3a 25 64 3a 20 55 6e 74 65 72 6d 69 6e "%s:%d: Untermin
7ff0: 61 74 65 64 20 5c 22 7b 5c 22 5c 6e 22 2c 0a 20 ated \"{\"\n",.
8000: 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e zFilen
8010: 61 6d 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 ame, nLine);.
8020: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 nErr++;.
8030: 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 pToken->eTy
8040: 70 65 20 3d 20 54 54 5f 45 72 72 6f 72 3b 0a 20 pe = TT_Error;.
8050: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45 return nE
8060: 72 72 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 rr;.. case
8070: 54 54 5f 49 64 3a 0a 20 20 20 20 20 20 20 20 69 TT_Id:. i
8080: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 f( pTable ){.
8090: 20 20 20 20 20 20 20 49 64 65 6e 74 54 61 62 6c IdentTabl
80a0: 65 49 6e 73 65 72 74 28 70 54 61 62 6c 65 2c 70 eInsert(pTable,p
80b0: 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 2c 70 54 6f Token->zText,pTo
80c0: 6b 65 6e 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 20 ken->nText);.
80d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 }. b
80e0: 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 20 20 63 reak;. . c
80f0: 61 73 65 20 54 54 5f 50 72 65 70 72 6f 63 65 73 ase TT_Preproces
8100: 73 6f 72 3a 0a 20 20 20 20 20 20 20 20 69 66 28 sor:. if(
8110: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 pTable!=0 ){.
8120: 20 20 20 20 20 20 20 20 46 69 6e 64 49 64 65 6e FindIden
8130: 74 69 66 69 65 72 73 49 6e 4d 61 63 72 6f 28 70 tifiersInMacro(p
8140: 54 6f 6b 65 6e 2c 70 54 61 62 6c 65 29 3b 0a 20 Token,pTable);.
8150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
8160: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 break;.. c
8170: 61 73 65 20 54 54 5f 4f 74 68 65 72 3a 0a 20 20 ase TT_Other:.
8180: 20 20 20 20 20 20 69 66 28 20 28 63 20 3d 20 70 if( (c = p
8190: 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 5b 30 5d 29 Token->zText[0])
81a0: 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 =='{' ){.
81b0: 20 20 20 6e 42 72 61 63 65 2b 2b 3b 0a 20 20 20 nBrace++;.
81c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 }else if( c
81d0: 3d 3d 27 7d 27 20 29 7b 0a 20 20 20 20 20 20 20 =='}' ){.
81e0: 20 20 20 6e 42 72 61 63 65 2d 2d 3b 0a 20 20 20 nBrace--;.
81f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 }. b
8200: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 reak;.. def
8210: 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 62 72 ault:. br
8220: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 eak;. }. }.
8230: 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d pToken->eType =
8240: 20 54 54 5f 42 72 61 63 65 73 3b 0a 20 20 70 54 TT_Braces;. pT
8250: 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 31 20 oken->nText = 1
8260: 2b 20 70 49 6e 2d 3e 69 20 2d 20 69 53 74 61 72 + pIn->i - iStar
8270: 74 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 7a 54 65 t;. pToken->zTe
8280: 78 74 20 3d 20 7a 53 74 61 72 74 3b 0a 20 20 70 xt = zStart;. p
8290: 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 20 3d 20 6e Token->nLine = n
82a0: 4c 69 6e 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e Line;. return n
82b0: 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 Err;.}../*.** Th
82c0: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 65 65 73 is routine frees
82d0: 20 75 70 20 61 20 6c 69 73 74 20 6f 66 20 54 6f up a list of To
82e0: 6b 65 6e 73 2e 20 20 54 68 65 20 70 43 6f 6d 6d kens. The pComm
82f0: 65 6e 74 20 74 6f 6b 65 6e 73 20 61 72 65 0a 2a ent tokens are.*
8300: 2a 20 6e 6f 74 20 63 6c 65 61 72 65 64 20 62 79 * not cleared by
8310: 20 74 68 69 73 2e 20 20 53 6f 20 77 65 20 6c 65 this. So we le
8320: 61 6b 20 61 20 6c 69 74 74 6c 65 20 6d 65 6d 6f ak a little memo
8330: 72 79 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 ry when using th
8340: 65 20 2d 64 6f 63 0a 2a 2a 20 6f 70 74 69 6f 6e e -doc.** option
8350: 2e 20 20 53 6f 20 77 68 61 74 2e 0a 2a 2f 0a 73 . So what..*/.s
8360: 74 61 74 69 63 20 76 6f 69 64 20 46 72 65 65 54 tatic void FreeT
8370: 6f 6b 65 6e 4c 69 73 74 28 54 6f 6b 65 6e 20 2a okenList(Token *
8380: 70 4c 69 73 74 29 7b 0a 20 20 54 6f 6b 65 6e 20 pList){. Token
8390: 2a 70 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65 28 *pNext;. while(
83a0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 70 4e pList ){. pN
83b0: 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 4e 65 ext = pList->pNe
83c0: 78 74 3b 0a 20 20 20 20 53 61 66 65 46 72 65 65 xt;. SafeFree
83d0: 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 (pList);. pLi
83e0: 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a st = pNext;. }.
83f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 69 7a }../*.** Tokeniz
8400: 65 20 61 6e 20 65 6e 74 69 72 65 20 66 69 6c 65 e an entire file
8410: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e . Return a poin
8420: 74 65 72 20 74 6f 20 74 68 65 20 6c 69 73 74 20 ter to the list
8430: 6f 66 20 74 6f 6b 65 6e 73 2e 0a 2a 2a 0a 2a 2a of tokens..**.**
8440: 20 53 70 61 63 65 20 66 6f 72 20 65 61 63 68 20 Space for each
8450: 74 6f 6b 65 6e 20 69 73 20 6f 62 74 61 69 6e 65 token is obtaine
8460: 64 20 66 72 6f 6d 20 61 20 73 65 70 61 72 61 74 d from a separat
8470: 65 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6c 6c 2e e malloc() call.
8480: 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 The.** calling
8490: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 function is res
84a0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 ponsible for fre
84b0: 65 69 6e 67 20 74 68 69 73 20 73 70 61 63 65 2e eing this space.
84c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 61 62 6c 65 .**.** If pTable
84d0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 is not NULL, th
84e0: 65 6e 20 66 69 6c 6c 20 74 68 65 20 74 61 62 6c en fill the tabl
84f0: 65 20 77 69 74 68 20 61 6c 6c 20 69 64 65 6e 74 e with all ident
8500: 69 66 69 65 72 73 20 73 65 65 6e 20 69 6e 0a 2a ifiers seen in.*
8510: 2a 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 * the input file
8520: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 6f 6b 65 ..*/.static Toke
8530: 6e 20 2a 54 6f 6b 65 6e 69 7a 65 46 69 6c 65 28 n *TokenizeFile(
8540: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c const char *zFil
8550: 65 2c 20 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 e, IdentTable *p
8560: 54 61 62 6c 65 29 7b 0a 20 20 49 6e 53 74 72 65 Table){. InStre
8570: 61 6d 20 73 49 6e 3b 0a 20 20 54 6f 6b 65 6e 20 am sIn;. Token
8580: 2a 70 46 69 72 73 74 20 3d 20 30 2c 20 2a 70 4c *pFirst = 0, *pL
8590: 61 73 74 20 3d 20 30 2c 20 2a 70 4e 65 77 3b 0a ast = 0, *pNew;.
85a0: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a int nErr = 0;.
85b0: 0a 20 20 73 49 6e 2e 7a 20 3d 20 7a 46 69 6c 65 . sIn.z = zFile
85c0: 3b 0a 20 20 73 49 6e 2e 69 20 3d 20 30 3b 0a 20 ;. sIn.i = 0;.
85d0: 20 73 49 6e 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a sIn.nLine = 1;.
85e0: 20 20 62 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 20 3d blockComment =
85f0: 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 73 49 0;.. while( sI
8600: 6e 2e 7a 5b 73 49 6e 2e 69 5d 21 3d 30 20 29 7b n.z[sIn.i]!=0 ){
8610: 0a 20 20 20 20 70 4e 65 77 20 3d 20 53 61 66 65 . pNew = Safe
8620: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 Malloc( sizeof(T
8630: 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 6e 45 72 oken) );. nEr
8640: 72 20 2b 3d 20 47 65 74 42 69 67 54 6f 6b 65 6e r += GetBigToken
8650: 28 26 73 49 6e 2c 70 4e 65 77 2c 70 54 61 62 6c (&sIn,pNew,pTabl
8660: 65 29 3b 0a 20 20 20 20 64 65 62 75 67 33 28 54 e);. debug3(T
8670: 4f 4b 45 4e 49 5a 45 52 2c 20 22 54 6f 6b 65 6e OKENIZER, "Token
8680: 20 6f 6e 20 6c 69 6e 65 20 25 64 3a 20 5b 25 2e on line %d: [%.
8690: 2a 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 *s]\n",. p
86a0: 4e 65 77 2d 3e 6e 4c 69 6e 65 2c 20 70 4e 65 77 New->nLine, pNew
86b0: 2d 3e 6e 54 65 78 74 3c 35 30 20 3f 20 70 4e 65 ->nText<50 ? pNe
86c0: 77 2d 3e 6e 54 65 78 74 20 3a 20 35 30 2c 20 70 w->nText : 50, p
86d0: 4e 65 77 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 New->zText);.
86e0: 20 69 66 28 20 70 46 69 72 73 74 3d 3d 30 20 29 if( pFirst==0 )
86f0: 7b 0a 20 20 20 20 20 20 70 46 69 72 73 74 20 3d {. pFirst =
8700: 20 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 20 pLast = pNew;.
8710: 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 65 76 pNew->pPrev
8720: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b = 0;. }else{
8730: 0a 20 20 20 20 20 20 70 4c 61 73 74 2d 3e 70 4e . pLast->pN
8740: 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 ext = pNew;.
8750: 20 20 70 4e 65 77 2d 3e 70 50 72 65 76 20 3d 20 pNew->pPrev =
8760: 70 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 4c 61 pLast;. pLa
8770: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d st = pNew;. }
8780: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 65 . if( pNew->e
8790: 54 79 70 65 3d 3d 54 54 5f 45 4f 46 20 29 20 62 Type==TT_EOF ) b
87a0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 reak;. }. if(
87b0: 70 4c 61 73 74 20 29 20 70 4c 61 73 74 2d 3e 70 pLast ) pLast->p
87c0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 62 6c 6f 63 Next = 0;. bloc
87d0: 6b 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 kComment = 0;.
87e0: 69 66 28 20 6e 45 72 72 20 29 7b 0a 20 20 20 20 if( nErr ){.
87f0: 46 72 65 65 54 6f 6b 65 6e 4c 69 73 74 28 70 46 FreeTokenList(pF
8800: 69 72 73 74 29 3b 0a 20 20 20 20 70 46 69 72 73 irst);. pFirs
8810: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 t = 0;. }.. re
8820: 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a turn pFirst;.}..
8830: 23 69 66 20 54 45 53 54 3d 3d 31 0a 2f 2a 0a 2a #if TEST==1./*.*
8840: 2a 20 55 73 65 20 74 68 65 20 66 6f 6c 6c 6f 77 * Use the follow
8850: 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 74 ing routine to t
8860: 65 73 74 20 6f 72 20 64 65 62 75 67 20 74 68 65 est or debug the
8870: 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 2a 2f 0a 76 tokenizer..*/.v
8880: 6f 69 64 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 oid main(int arg
8890: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b c, char **argv){
88a0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a . char *zFile;.
88b0: 20 20 54 6f 6b 65 6e 20 2a 70 4c 69 73 74 2c 20 Token *pList,
88c0: 2a 70 3b 0a 20 20 49 64 65 6e 74 54 61 62 6c 65 *p;. IdentTable
88d0: 20 73 54 61 62 6c 65 3b 0a 0a 20 20 69 66 28 20 sTable;.. if(
88e0: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 66 argc!=2 ){. f
88f0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 printf(stderr,"U
8900: 73 61 67 65 3a 20 25 73 20 66 69 6c 65 6e 61 6d sage: %s filenam
8910: 65 5c 6e 22 2c 2a 61 72 67 76 29 3b 0a 20 20 20 e\n",*argv);.
8920: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 exit(1);. }.
8930: 6d 65 6d 73 65 74 28 26 73 54 61 62 6c 65 2c 30 memset(&sTable,0
8940: 2c 73 69 7a 65 6f 66 28 73 54 61 62 6c 65 29 29 ,sizeof(sTable))
8950: 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 52 65 61 64 ;. zFile = Read
8960: 46 69 6c 65 28 61 72 67 76 5b 31 5d 29 3b 0a 20 File(argv[1]);.
8970: 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b if( zFile==0 ){
8980: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 . fprintf(std
8990: 65 72 72 2c 22 43 61 6e 27 74 20 72 65 61 64 20 err,"Can't read
89a0: 66 69 6c 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 61 file \"%s\"\n",a
89b0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 78 69 rgv[1]);. exi
89c0: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 t(1);. }. pLis
89d0: 74 20 3d 20 54 6f 6b 65 6e 69 7a 65 46 69 6c 65 t = TokenizeFile
89e0: 28 7a 46 69 6c 65 2c 26 73 54 61 62 6c 65 29 3b (zFile,&sTable);
89f0: 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 . for(p=pList;
8a00: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a p; p=p->pNext){.
8a10: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 73 int j;. s
8a20: 77 69 74 63 68 28 20 70 2d 3e 65 54 79 70 65 20 witch( p->eType
8a30: 29 7b 20 0a 20 20 20 20 20 20 63 61 73 65 20 54 ){ . case T
8a40: 54 5f 53 70 61 63 65 3a 0a 20 20 20 20 20 20 20 T_Space:.
8a50: 20 70 72 69 6e 74 66 28 22 25 34 64 3a 20 53 70 printf("%4d: Sp
8a60: 61 63 65 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 29 ace\n",p->nLine)
8a70: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
8a80: 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 49 . case TT_I
8a90: 64 3a 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 d:. print
8aa0: 66 28 22 25 34 64 3a 20 49 64 20 20 20 20 20 20 f("%4d: Id
8ab0: 20 20 20 20 20 25 2e 2a 73 5c 6e 22 2c 70 2d 3e %.*s\n",p->
8ac0: 6e 4c 69 6e 65 2c 70 2d 3e 6e 54 65 78 74 2c 70 nLine,p->nText,p
8ad0: 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 ->zText);.
8ae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 break;. c
8af0: 61 73 65 20 54 54 5f 50 72 65 70 72 6f 63 65 73 ase TT_Preproces
8b00: 73 6f 72 3a 0a 20 20 20 20 20 20 20 20 70 72 69 sor:. pri
8b10: 6e 74 66 28 22 25 34 64 3a 20 50 72 65 70 72 6f ntf("%4d: Prepro
8b20: 63 65 73 73 6f 72 20 25 2e 2a 73 5c 6e 22 2c 70 cessor %.*s\n",p
8b30: 2d 3e 6e 4c 69 6e 65 2c 70 2d 3e 6e 54 65 78 74 ->nLine,p->nText
8b40: 2c 70 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20 ,p->zText);.
8b50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
8b60: 20 63 61 73 65 20 54 54 5f 43 6f 6d 6d 65 6e 74 case TT_Comment
8b70: 3a 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 :. printf
8b80: 28 22 25 34 64 3a 20 43 6f 6d 6d 65 6e 74 5c 6e ("%4d: Comment\n
8b90: 22 2c 70 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 ",p->nLine);.
8ba0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
8bb0: 20 20 63 61 73 65 20 54 54 5f 42 6c 6f 63 6b 43 case TT_BlockC
8bc0: 6f 6d 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20 omment:.
8bd0: 70 72 69 6e 74 66 28 22 25 34 64 3a 20 42 6c 6f printf("%4d: Blo
8be0: 63 6b 20 43 6f 6d 6d 65 6e 74 5c 6e 22 2c 70 2d ck Comment\n",p-
8bf0: 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 >nLine);.
8c00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 break;. ca
8c10: 73 65 20 54 54 5f 4e 75 6d 62 65 72 3a 0a 20 20 se TT_Number:.
8c20: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 34 printf("%4
8c30: 64 3a 20 4e 75 6d 62 65 72 20 20 20 20 20 20 20 d: Number
8c40: 25 2e 2a 73 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 %.*s\n",p->nLine
8c50: 2c 70 2d 3e 6e 54 65 78 74 2c 70 2d 3e 7a 54 65 ,p->nText,p->zTe
8c60: 78 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 xt);. bre
8c70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 54 ak;. case T
8c80: 54 5f 53 74 72 69 6e 67 3a 0a 20 20 20 20 20 20 T_String:.
8c90: 20 20 70 72 69 6e 74 66 28 22 25 34 64 3a 20 53 printf("%4d: S
8ca0: 74 72 69 6e 67 20 20 20 20 20 20 20 25 2e 2a 73 tring %.*s
8cb0: 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 2c 70 2d 3e \n",p->nLine,p->
8cc0: 6e 54 65 78 74 2c 70 2d 3e 7a 54 65 78 74 29 3b nText,p->zText);
8cd0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a . break;.
8ce0: 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 4f 74 case TT_Ot
8cf0: 68 65 72 3a 0a 20 20 20 20 20 20 20 20 70 72 69 her:. pri
8d00: 6e 74 66 28 22 25 34 64 3a 20 4f 74 68 65 72 20 ntf("%4d: Other
8d10: 20 20 20 20 20 20 20 25 2e 2a 73 5c 6e 22 2c 70 %.*s\n",p
8d20: 2d 3e 6e 4c 69 6e 65 2c 70 2d 3e 6e 54 65 78 74 ->nLine,p->nText
8d30: 2c 70 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20 ,p->zText);.
8d40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
8d50: 20 63 61 73 65 20 54 54 5f 42 72 61 63 65 73 3a case TT_Braces:
8d60: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 . for(j=0
8d70: 3b 20 6a 3c 70 2d 3e 6e 54 65 78 74 20 26 26 20 ; j<p->nText &&
8d80: 6a 3c 33 30 20 26 26 20 70 2d 3e 7a 54 65 78 74 j<30 && p->zText
8d90: 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 7b [j]!='\n'; j++){
8da0: 7d 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 }. printf
8db0: 28 22 25 34 64 3a 20 42 72 61 63 65 73 20 20 20 ("%4d: Braces
8dc0: 20 20 20 20 25 2e 2a 73 2e 2e 2e 7d 5c 6e 22 2c %.*s...}\n",
8dd0: 70 2d 3e 6e 4c 69 6e 65 2c 6a 2c 70 2d 3e 7a 54 p->nLine,j,p->zT
8de0: 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 ext);. br
8df0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 eak;. case
8e00: 54 54 5f 45 4f 46 3a 0a 20 20 20 20 20 20 20 20 TT_EOF:.
8e10: 70 72 69 6e 74 66 28 22 25 34 64 3a 20 45 6e 64 printf("%4d: End
8e20: 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 70 2d 3e 6e of file\n",p->n
8e30: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 62 Line);. b
8e40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 reak;. defa
8e50: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 70 72 69 ult:. pri
8e60: 6e 74 66 28 22 25 34 64 3a 20 74 79 70 65 20 25 ntf("%4d: type %
8e70: 64 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 2c 70 2d d\n",p->nLine,p-
8e80: 3e 65 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 >eType);.
8e90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
8ea0: 7d 0a 20 20 46 72 65 65 54 6f 6b 65 6e 4c 69 73 }. FreeTokenLis
8eb0: 74 28 70 4c 69 73 74 29 3b 0a 20 20 53 61 66 65 t(pList);. Safe
8ec0: 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 49 Free(zFile);. I
8ed0: 64 65 6e 74 54 61 62 6c 65 50 72 69 6e 74 28 26 dentTablePrint(&
8ee0: 73 54 61 62 6c 65 2c 73 74 64 6f 75 74 29 3b 0a sTable,stdout);.
8ef0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 }.#endif..#ifdef
8f00: 20 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 46 6f 72 DEBUG./*.** For
8f10: 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f debugging purpo
8f20: 73 65 73 2c 20 77 72 69 74 65 20 6f 75 74 20 61 ses, write out a
8f30: 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73 2e list of tokens.
8f40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
8f50: 50 72 69 6e 74 54 6f 6b 65 6e 73 28 54 6f 6b 65 PrintTokens(Toke
8f60: 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e n *pFirst, Token
8f70: 20 2a 70 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 *pLast){. int
8f80: 6e 65 65 64 53 70 61 63 65 20 3d 20 30 3b 0a 20 needSpace = 0;.
8f90: 20 69 6e 74 20 63 3b 0a 0a 20 20 70 4c 61 73 74 int c;.. pLast
8fa0: 20 3d 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74 3b = pLast->pNext;
8fb0: 0a 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 . while( pFirst
8fc0: 21 3d 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 73 !=pLast ){. s
8fd0: 77 69 74 63 68 28 20 70 46 69 72 73 74 2d 3e 65 witch( pFirst->e
8fe0: 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 Type ){. ca
8ff0: 73 65 20 54 54 5f 50 72 65 70 72 6f 63 65 73 73 se TT_Preprocess
9000: 6f 72 3a 0a 20 20 20 20 20 20 20 20 70 72 69 6e or:. prin
9010: 74 66 28 22 5c 6e 25 2e 2a 73 5c 6e 22 2c 70 46 tf("\n%.*s\n",pF
9020: 69 72 73 74 2d 3e 6e 54 65 78 74 2c 70 46 69 72 irst->nText,pFir
9030: 73 74 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20 st->zText);.
9040: 20 20 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20 needSpace =
9050: 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 0;. break
9060: 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 ;.. case TT
9070: 5f 49 64 3a 0a 20 20 20 20 20 20 63 61 73 65 20 _Id:. case
9080: 54 54 5f 4e 75 6d 62 65 72 3a 0a 20 20 20 20 20 TT_Number:.
9090: 20 20 20 70 72 69 6e 74 66 28 22 25 73 25 2e 2a printf("%s%.*
90a0: 73 22 2c 20 6e 65 65 64 53 70 61 63 65 20 3f 20 s", needSpace ?
90b0: 22 20 22 20 3a 20 22 22 2c 20 70 46 69 72 73 74 " " : "", pFirst
90c0: 2d 3e 6e 54 65 78 74 2c 20 70 46 69 72 73 74 2d ->nText, pFirst-
90d0: 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 >zText);.
90e0: 20 6e 65 65 64 53 70 61 63 65 20 3d 20 31 3b 0a needSpace = 1;.
90f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a break;..
9100: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 default:.
9110: 20 20 20 20 20 20 20 63 20 3d 20 70 46 69 72 73 c = pFirs
9120: 74 2d 3e 7a 54 65 78 74 5b 30 5d 3b 0a 20 20 20 t->zText[0];.
9130: 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 25 printf("%s%
9140: 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 .*s", .
9150: 20 28 6e 65 65 64 53 70 61 63 65 20 26 26 20 28 (needSpace && (
9160: 63 3d 3d 27 2a 27 20 7c 7c 20 63 3d 3d 27 7b 27 c=='*' || c=='{'
9170: 29 29 20 3f 20 22 20 22 20 3a 20 22 22 2c 0a 20 )) ? " " : "",.
9180: 20 20 20 20 20 20 20 20 20 70 46 69 72 73 74 2d pFirst-
9190: 3e 6e 54 65 78 74 2c 20 70 46 69 72 73 74 2d 3e >nText, pFirst->
91a0: 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 zText);.
91b0: 6e 65 65 64 53 70 61 63 65 20 3d 20 70 46 69 72 needSpace = pFir
91c0: 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 2c st->zText[0]==',
91d0: 27 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b ';. break
91e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 72 ;. }. pFir
91f0: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 4e 65 st = pFirst->pNe
9200: 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 xt;. }.}.#endif
9210: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 ../*.** Convert
9220: 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f a sequence of to
9230: 6b 65 6e 73 20 69 6e 74 6f 20 61 20 73 74 72 69 kens into a stri
9240: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 ng and return a
9250: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 pointer.** to th
9260: 61 74 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63 at string. Spac
9270: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 74 e to hold the st
9280: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 ring is obtained
9290: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a from malloc().*
92a0: 2a 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 * and must be fr
92b0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 eed by the calli
92c0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a ng function..**.
92d0: 2a 2a 20 43 65 72 74 61 69 6e 20 6b 65 79 77 6f ** Certain keywo
92e0: 72 64 73 20 28 45 58 50 4f 52 54 2c 20 50 52 49 rds (EXPORT, PRI
92f0: 56 41 54 45 2c 20 50 55 42 4c 49 43 2c 20 50 52 VATE, PUBLIC, PR
9300: 4f 54 45 43 54 45 44 29 20 61 72 65 20 61 6c 77 OTECTED) are alw
9310: 61 79 73 0a 2a 2a 20 73 6b 69 70 70 65 64 2e 0a ays.** skipped..
9320: 2a 2a 0a 2a 2a 20 49 66 20 70 53 6b 69 70 21 3d **.** If pSkip!=
9330: 30 20 74 68 65 6e 20 73 6b 69 70 20 6f 76 65 72 0 then skip over
9340: 20 6e 53 6b 69 70 20 74 6f 6b 65 6e 73 20 62 65 nSkip tokens be
9350: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 70 53 6b ginning with pSk
9360: 69 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 54 65 ip..**.** If zTe
9370: 72 6d 21 3d 30 20 74 68 65 6e 20 61 70 70 65 6e rm!=0 then appen
9380: 64 20 74 68 65 20 74 65 78 74 20 74 6f 20 74 68 d the text to th
9390: 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 e end..*/.static
93a0: 20 63 68 61 72 20 2a 54 6f 6b 65 6e 73 54 6f 53 char *TokensToS
93b0: 74 72 69 6e 67 28 0a 20 20 54 6f 6b 65 6e 20 2a tring(. Token *
93c0: 70 46 69 72 73 74 2c 20 20 20 20 2f 2a 20 46 69 pFirst, /* Fi
93d0: 72 73 74 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 rst token in the
93e0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 54 6f 6b string */. Tok
93f0: 65 6e 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f en *pLast, /
9400: 2a 20 4c 61 73 74 20 74 6f 6b 65 6e 20 69 6e 20 * Last token in
9410: 74 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 the string */.
9420: 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 char *zTerm,
9430: 20 20 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 74 /* Terminate t
9440: 68 65 20 73 74 72 69 6e 67 20 77 69 74 68 20 74 he string with t
9450: 68 69 73 20 74 65 78 74 20 69 66 20 6e 6f 74 20 his text if not
9460: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 NULL */. Token
9470: 2a 70 53 6b 69 70 2c 20 20 20 20 20 2f 2a 20 53 *pSkip, /* S
9480: 6b 69 70 20 74 68 69 73 20 74 6f 6b 65 6e 20 69 kip this token i
9490: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 f not NULL */.
94a0: 69 6e 74 20 6e 53 6b 69 70 20 20 20 20 20 20 20 int nSkip
94b0: 20 20 2f 2a 20 53 6b 69 70 20 61 20 74 6f 74 61 /* Skip a tota
94c0: 6c 20 6f 66 20 74 68 69 73 20 6d 61 6e 79 20 74 l of this many t
94d0: 6f 6b 65 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 okens */.){. ch
94e0: 61 72 20 2a 7a 52 65 74 75 72 6e 3b 0a 20 20 53 ar *zReturn;. S
94f0: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 tring str;. int
9500: 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30 3b 0a needSpace = 0;.
9510: 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 69 int c;. int i
9520: 53 6b 69 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 Skip = 0;. int
9530: 73 6b 69 70 4f 6e 65 20 3d 20 30 3b 0a 0a 20 20 skipOne = 0;..
9540: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 StringInit(&str)
9550: 3b 0a 20 20 70 4c 61 73 74 20 3d 20 70 4c 61 73 ;. pLast = pLas
9560: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 77 68 69 6c t->pNext;. whil
9570: 65 28 20 70 46 69 72 73 74 21 3d 70 4c 61 73 74 e( pFirst!=pLast
9580: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 72 ){. if( pFir
9590: 73 74 3d 3d 70 53 6b 69 70 20 29 7b 20 69 53 6b st==pSkip ){ iSk
95a0: 69 70 20 3d 20 6e 53 6b 69 70 3b 20 7d 0a 20 20 ip = nSkip; }.
95b0: 20 20 69 66 28 20 69 53 6b 69 70 3e 30 20 29 7b if( iSkip>0 ){
95c0: 20 0a 20 20 20 20 20 20 69 53 6b 69 70 2d 2d 3b . iSkip--;
95d0: 0a 20 20 20 20 20 20 70 46 69 72 73 74 3d 70 46 . pFirst=pF
95e0: 69 72 73 74 2d 3e 70 4e 65 78 74 3b 20 0a 20 20 irst->pNext; .
95f0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 continue;.
9600: 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 }. switch(
9610: 70 46 69 72 73 74 2d 3e 65 54 79 70 65 20 29 7b pFirst->eType ){
9620: 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 50 . case TT_P
9630: 72 65 70 72 6f 63 65 73 73 6f 72 3a 0a 20 20 20 reprocessor:.
9640: 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e StringAppen
9650: 64 28 26 73 74 72 2c 22 5c 6e 22 2c 31 29 3b 0a d(&str,"\n",1);.
9660: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 41 70 StringAp
9670: 70 65 6e 64 28 26 73 74 72 2c 70 46 69 72 73 74 pend(&str,pFirst
9680: 2d 3e 7a 54 65 78 74 2c 70 46 69 72 73 74 2d 3e ->zText,pFirst->
9690: 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 nText);.
96a0: 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 StringAppend(&st
96b0: 72 2c 22 5c 6e 22 2c 31 29 3b 0a 20 20 20 20 20 r,"\n",1);.
96c0: 20 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30 needSpace = 0
96d0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
96e0: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f .. case TT_
96f0: 49 64 3a 20 0a 20 20 20 20 20 20 20 20 73 77 69 Id: . swi
9700: 74 63 68 28 20 70 46 69 72 73 74 2d 3e 7a 54 65 tch( pFirst->zTe
9710: 78 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 xt[0] ){.
9720: 20 20 20 63 61 73 65 20 27 45 27 3a 20 20 20 20 case 'E':
9730: 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 .
9740: 20 69 66 28 20 70 46 69 72 73 74 2d 3e 6e 54 65 if( pFirst->nTe
9750: 78 74 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d 70 xt==6 && strncmp
9760: 28 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 (pFirst->zText,"
9770: 45 58 50 4f 52 54 22 2c 36 29 3d 3d 30 20 29 7b EXPORT",6)==0 ){
9780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 . s
9790: 6b 69 70 4f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 kipOne = 1;.
97a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
97b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
97c0: 20 20 20 20 20 20 20 63 61 73 65 20 27 50 27 3a case 'P':
97d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69 . swi
97e0: 74 63 68 28 20 70 46 69 72 73 74 2d 3e 6e 54 65 tch( pFirst->nTe
97f0: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 xt ){.
9800: 20 20 20 20 63 61 73 65 20 36 3a 20 20 73 6b 69 case 6: ski
9810: 70 4f 6e 65 20 3d 20 21 73 74 72 6e 63 6d 70 28 pOne = !strncmp(
9820: 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 50 pFirst->zText,"P
9830: 55 42 4c 49 43 22 2c 20 36 29 3b 20 20 20 20 62 UBLIC", 6); b
9840: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 reak;.
9850: 20 20 20 20 63 61 73 65 20 37 3a 20 20 73 6b 69 case 7: ski
9860: 70 4f 6e 65 20 3d 20 21 73 74 72 6e 63 6d 70 28 pOne = !strncmp(
9870: 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 50 pFirst->zText,"P
9880: 52 49 56 41 54 45 22 2c 37 29 3b 20 20 20 20 62 RIVATE",7); b
9890: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 reak;.
98a0: 20 20 20 20 63 61 73 65 20 39 3a 20 20 73 6b 69 case 9: ski
98b0: 70 4f 6e 65 20 3d 20 21 73 74 72 6e 63 6d 70 28 pOne = !strncmp(
98c0: 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 50 pFirst->zText,"P
98d0: 52 4f 54 45 43 54 45 44 22 2c 39 29 3b 20 20 62 ROTECTED",9); b
98e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 reak;.
98f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 default: bre
9900: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ak;.
9910: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 }. br
9920: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64 eak;. d
9930: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 efault:.
9940: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
9950: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 }. if(
9960: 20 73 6b 69 70 4f 6e 65 20 29 7b 0a 20 20 20 20 skipOne ){.
9970: 20 20 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 pFirst = p
9980: 46 69 72 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 First->pNext;.
9990: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 continue
99a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
99b0: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 /* Fall thru
99c0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 to the next cas
99d0: 65 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20 e */. case
99e0: 54 54 5f 4e 75 6d 62 65 72 3a 0a 20 20 20 20 20 TT_Number:.
99f0: 20 20 20 69 66 28 20 6e 65 65 64 53 70 61 63 65 if( needSpace
9a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 74 ){. St
9a10: 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c ringAppend(&str,
9a20: 22 20 22 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 " ",1);.
9a30: 7d 0a 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 }. String
9a40: 41 70 70 65 6e 64 28 26 73 74 72 2c 70 46 69 72 Append(&str,pFir
9a50: 73 74 2d 3e 7a 54 65 78 74 2c 70 46 69 72 73 74 st->zText,pFirst
9a60: 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20 ->nText);.
9a70: 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20 31 3b needSpace = 1;
9a80: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a . break;.
9a90: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a . default:.
9aa0: 20 20 20 20 20 20 20 20 63 20 3d 20 70 46 69 72 c = pFir
9ab0: 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 3b 0a 20 20 st->zText[0];.
9ac0: 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 53 70 if( needSp
9ad0: 61 63 65 20 26 26 20 28 63 3d 3d 27 2a 27 20 7c ace && (c=='*' |
9ae0: 7c 20 63 3d 3d 27 7b 27 29 20 29 7b 0a 20 20 20 | c=='{') ){.
9af0: 20 20 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 StringApp
9b00: 65 6e 64 28 26 73 74 72 2c 22 20 22 2c 31 29 3b end(&str," ",1);
9b10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
9b20: 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 StringAppend(
9b30: 26 73 74 72 2c 70 46 69 72 73 74 2d 3e 7a 54 65 &str,pFirst->zTe
9b40: 78 74 2c 70 46 69 72 73 74 2d 3e 6e 54 65 78 74 xt,pFirst->nText
9b50: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 );. /* ne
9b60: 65 64 53 70 61 63 65 20 3d 20 70 46 69 72 73 74 edSpace = pFirst
9b70: 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 2c 27 3b ->zText[0]==',';
9b80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 65 65 64 */. need
9b90: 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 Space = 0;.
9ba0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
9bb0: 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 46 69 pFirst = pFi
9bc0: 72 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a rst->pNext;. }.
9bd0: 20 20 69 66 28 20 7a 54 65 72 6d 20 26 26 20 2a if( zTerm && *
9be0: 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 53 74 72 zTerm ){. Str
9bf0: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 7a ingAppend(&str,z
9c00: 54 65 72 6d 2c 73 74 72 6c 65 6e 28 7a 54 65 72 Term,strlen(zTer
9c10: 6d 29 29 3b 0a 20 20 7d 0a 20 20 7a 52 65 74 75 m));. }. zRetu
9c20: 72 6e 20 3d 20 53 74 72 44 75 70 28 53 74 72 69 rn = StrDup(Stri
9c30: 6e 67 47 65 74 28 26 73 74 72 29 2c 30 29 3b 0a ngGet(&str),0);.
9c40: 20 20 53 74 72 69 6e 67 52 65 73 65 74 28 26 73 StringReset(&s
9c50: 74 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52 tr);. return zR
9c60: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 eturn;.}../*.**
9c70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 This routine is
9c80: 63 61 6c 6c 65 64 20 77 68 65 6e 20 77 65 20 73 called when we s
9c90: 65 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 ee one of the ke
9ca0: 79 77 6f 72 64 73 20 22 73 74 72 75 63 74 22 2c ywords "struct",
9cb0: 0a 2a 2a 20 22 65 6e 75 6d 22 2c 20 22 75 6e 69 .** "enum", "uni
9cc0: 6f 6e 22 20 6f 72 20 22 63 6c 61 73 73 22 2e 20 on" or "class".
9cd0: 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 74 This might be t
9ce0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 he beginning of
9cf0: 61 0a 2a 2a 20 74 79 70 65 20 64 65 63 6c 61 72 a.** type declar
9d00: 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 ation. This rou
9d10: 74 69 6e 65 20 77 69 6c 6c 20 70 72 6f 63 65 73 tine will proces
9d20: 73 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f s the declaratio
9d30: 6e 20 61 6e 64 0a 2a 2a 20 72 65 6d 6f 76 65 20 n and.** remove
9d40: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 the declaration
9d50: 74 6f 6b 65 6e 73 20 66 72 6f 6d 20 74 68 65 20 tokens from the
9d60: 69 6e 70 75 74 20 73 74 72 65 61 6d 2e 0a 2a 2a input stream..**
9d70: 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 .** If this is a
9d80: 20 74 79 70 65 20 64 65 63 6c 61 72 61 74 69 6f type declaratio
9d90: 6e 20 74 68 61 74 20 69 73 20 69 6d 6d 65 64 69 n that is immedi
9da0: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 65 64 20 62 ately followed b
9db0: 79 20 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e y a.** semicolon
9dc0: 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 (in other words
9dd0: 20 69 74 20 69 73 6e 27 74 20 61 6c 73 6f 20 61 it isn't also a
9de0: 20 76 61 72 69 61 62 6c 65 20 64 65 66 69 6e 69 variable defini
9df0: 74 69 6f 6e 29 0a 2a 2a 20 74 68 65 6e 20 73 65 tion).** then se
9e00: 74 20 2a 70 52 65 73 65 74 20 74 6f 20 27 3b 27 t *pReset to ';'
9e10: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 6c 65 61 . Otherwise lea
9e20: 76 65 20 2a 70 52 65 73 65 74 20 61 74 20 30 2e ve *pReset at 0.
9e30: 20 20 54 68 65 0a 2a 2a 20 2a 70 52 65 73 65 74 The.** *pReset
9e40: 20 66 6c 61 67 20 63 61 75 73 65 73 20 74 68 65 flag causes the
9e50: 20 70 61 72 73 65 72 20 74 6f 20 73 6b 69 70 20 parser to skip
9e60: 61 68 65 61 64 20 74 6f 20 74 68 65 20 6e 65 78 ahead to the nex
9e70: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 74 68 61 74 20 t token.** that
9e80: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20 begins with the
9e90: 76 61 6c 75 65 20 70 6c 61 63 65 64 20 69 6e 20 value placed in
9ea0: 74 68 65 20 2a 70 52 65 73 65 74 20 66 6c 61 67 the *pReset flag
9eb0: 2c 20 69 66 20 74 68 61 74 0a 2a 2a 20 76 61 6c , if that.** val
9ec0: 75 65 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 ue is different
9ed0: 66 72 6f 6d 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 from 0..*/.stati
9ee0: 63 20 69 6e 74 20 50 72 6f 63 65 73 73 54 79 70 c int ProcessTyp
9ef0: 65 44 65 63 6c 28 54 6f 6b 65 6e 20 2a 70 4c 69 eDecl(Token *pLi
9f00: 73 74 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 st, int flags, i
9f10: 6e 74 20 2a 70 52 65 73 65 74 29 7b 0a 20 20 54 nt *pReset){. T
9f20: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 2a 70 45 oken *pName, *pE
9f30: 6e 64 3b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63 nd;. Decl *pDec
9f40: 6c 3b 0a 20 20 53 74 72 69 6e 67 20 73 74 72 3b l;. String str;
9f50: 0a 20 20 69 6e 74 20 6e 65 65 64 5f 74 6f 5f 63 . int need_to_c
9f60: 6f 6c 6c 61 70 73 65 20 3d 20 31 3b 0a 20 20 69 ollapse = 1;. i
9f70: 6e 74 20 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 nt type = 0;..
9f80: 2a 70 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 69 *pReset = 0;. i
9f90: 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 f( pList==0 || p
9fa0: 4c 69 73 74 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c List->pNext==0 |
9fb0: 7c 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 2d 3e | pList->pNext->
9fc0: 65 54 79 70 65 21 3d 54 54 5f 49 64 20 29 7b 0a eType!=TT_Id ){.
9fd0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
9fe0: 7d 0a 20 20 70 4e 61 6d 65 20 3d 20 70 4c 69 73 }. pName = pLis
9ff0: 74 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 t->pNext;.. /*
a000: 43 61 74 63 68 20 74 68 65 20 63 61 73 65 20 6f Catch the case o
a010: 66 20 22 73 74 72 75 63 74 20 46 6f 6f 3b 22 20 f "struct Foo;"
a020: 61 6e 64 20 73 6b 69 70 20 69 74 2e 20 2a 2f 0a and skip it. */.
a030: 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 70 4e 65 if( pName->pNe
a040: 78 74 20 26 26 20 70 4e 61 6d 65 2d 3e 70 4e 65 xt && pName->pNe
a050: 78 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 3b xt->zText[0]==';
a060: 27 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 65 74 ' ){. *pReset
a070: 20 3d 20 27 3b 27 3b 0a 20 20 20 20 72 65 74 75 = ';';. retu
a080: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 rn 0;. }.. for
a090: 28 70 45 6e 64 3d 70 4e 61 6d 65 2d 3e 70 4e 65 (pEnd=pName->pNe
a0a0: 78 74 3b 20 70 45 6e 64 20 26 26 20 70 45 6e 64 xt; pEnd && pEnd
a0b0: 2d 3e 65 54 79 70 65 21 3d 54 54 5f 42 72 61 63 ->eType!=TT_Brac
a0c0: 65 73 3b 20 70 45 6e 64 3d 70 45 6e 64 2d 3e 70 es; pEnd=pEnd->p
a0d0: 4e 65 78 74 29 7b 0a 20 20 20 20 73 77 69 74 63 Next){. switc
a0e0: 68 28 20 70 45 6e 64 2d 3e 7a 54 65 78 74 5b 30 h( pEnd->zText[0
a0f0: 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 ] ){. case
a100: 27 28 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 '(':. case
a110: 27 2a 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 '*':. case
a120: 27 5b 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 '[':. case
a130: 27 3d 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 '=':. case
a140: 27 3b 27 3a 0a 20 20 20 20 20 20 20 20 72 65 74 ';':. ret
a150: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d urn 0;. }. }
a160: 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20 29 . if( pEnd==0 )
a170: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a {. return 0;.
a180: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 }.. /*. ** A
a190: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 t this point, we
a1a0: 20 6b 6e 6f 77 20 77 65 20 68 61 76 65 20 61 20 know we have a
a1b0: 74 79 70 65 20 64 65 63 6c 61 72 61 74 69 6f 6e type declaration
a1c0: 20 74 68 61 74 20 69 73 20 62 6f 75 6e 64 65 64 that is bounded
a1d0: 0a 20 20 2a 2a 20 62 79 20 70 4c 69 73 74 20 61 . ** by pList a
a1e0: 6e 64 20 70 45 6e 64 20 61 6e 64 20 68 61 73 20 nd pEnd and has
a1f0: 74 68 65 20 6e 61 6d 65 20 70 4e 61 6d 65 2e 0a the name pName..
a200: 20 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 */.. /*. **
a210: 49 66 20 74 68 65 20 62 72 61 63 65 73 20 61 72 If the braces ar
a220: 65 20 66 6f 6c 6c 6f 77 65 64 20 69 6d 6d 65 64 e followed immed
a230: 61 74 65 6c 79 20 62 79 20 61 20 73 65 6d 69 63 ately by a semic
a240: 6f 6c 6f 6e 2c 20 74 68 65 6e 20 77 65 20 61 72 olon, then we ar
a250: 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 61 e. ** dealing a
a260: 20 74 79 70 65 20 64 65 63 6c 61 72 61 74 69 6f type declaratio
a270: 6e 20 6f 6e 6c 79 2e 20 20 54 68 65 72 65 20 69 n only. There i
a280: 73 20 6e 6f 74 20 76 61 72 69 61 62 6c 65 20 64 s not variable d
a290: 65 66 69 6e 69 74 69 6f 6e 0a 20 20 2a 2a 20 66 efinition. ** f
a2a0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 79 70 ollowing the typ
a2b0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 20 e declaration.
a2c0: 53 6f 20 72 65 73 65 74 2e 2e 2e 0a 20 20 2a 2f So reset.... */
a2d0: 0a 20 20 69 66 28 20 70 45 6e 64 2d 3e 70 4e 65 . if( pEnd->pNe
a2e0: 78 74 3d 3d 30 20 7c 7c 20 70 45 6e 64 2d 3e 70 xt==0 || pEnd->p
a2f0: 4e 65 78 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d Next->zText[0]==
a300: 27 3b 27 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 ';' ){. *pRes
a310: 65 74 20 3d 20 27 3b 27 3b 0a 20 20 20 20 6e 65 et = ';';. ne
a320: 65 64 5f 74 6f 5f 63 6f 6c 6c 61 70 73 65 20 3d ed_to_collapse =
a330: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 0;. }else{.
a340: 20 6e 65 65 64 5f 74 6f 5f 63 6f 6c 6c 61 70 73 need_to_collaps
a350: 65 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 e = 1;. }.. if
a360: 28 20 70 72 6f 74 6f 5f 73 74 61 74 69 63 3d 3d ( proto_static==
a370: 30 20 26 26 20 28 66 6c 61 67 73 20 26 20 28 50 0 && (flags & (P
a380: 53 5f 4c 6f 63 61 6c 7c 50 53 5f 45 78 70 6f 72 S_Local|PS_Expor
a390: 74 7c 50 53 5f 49 6e 74 65 72 66 61 63 65 29 29 t|PS_Interface))
a3a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 67 ==0 ){. /* Ig
a3b0: 6e 6f 72 65 20 74 68 65 73 65 20 6f 62 6a 65 63 nore these objec
a3c0: 74 73 20 75 6e 6c 65 73 73 20 74 68 65 79 20 61 ts unless they a
a3d0: 72 65 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 re explicitly de
a3e0: 63 6c 61 72 65 64 20 61 73 20 69 6e 74 65 72 66 clared as interf
a3f0: 61 63 65 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 75 ace,. ** or u
a400: 6e 6c 65 73 73 20 74 68 65 20 22 2d 6c 6f 63 61 nless the "-loca
a410: 6c 22 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 l" command line
a420: 6f 70 74 69 6f 6e 20 77 61 73 20 73 70 65 63 69 option was speci
a430: 66 69 65 64 2e 20 2a 2f 0a 20 20 20 20 2a 70 52 fied. */. *pR
a440: 65 73 65 74 20 3d 20 27 3b 27 3b 0a 20 20 20 20 eset = ';';.
a450: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 23 return 0;. }..#
a460: 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 69 66 ifdef DEBUG. if
a470: 28 20 64 65 62 75 67 4d 61 73 6b 20 26 20 50 41 ( debugMask & PA
a480: 52 53 45 52 20 29 7b 0a 20 20 20 20 70 72 69 6e RSER ){. prin
a490: 74 66 28 22 2a 2a 2a 2a 20 46 6f 75 6e 64 20 74 tf("**** Found t
a4a0: 79 70 65 3a 20 25 2e 2a 73 20 25 2e 2a 73 2e 2e ype: %.*s %.*s..
a4b0: 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 70 4c 69 73 .\n",. pLis
a4c0: 74 2d 3e 6e 54 65 78 74 2c 20 70 4c 69 73 74 2d t->nText, pList-
a4d0: 3e 7a 54 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 6e >zText, pName->n
a4e0: 54 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 7a 54 65 Text, pName->zTe
a4f0: 78 74 29 3b 0a 20 20 20 20 50 72 69 6e 74 54 6f xt);. PrintTo
a500: 6b 65 6e 73 28 70 4c 69 73 74 2c 70 45 6e 64 29 kens(pList,pEnd)
a510: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 3b 5c ;. printf(";\
a520: 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a n");. }.#endif.
a530: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 72 65 61 74 . /*. ** Creat
a540: 65 20 61 20 6e 65 77 20 44 65 63 6c 20 6f 62 6a e a new Decl obj
a550: 65 63 74 20 66 6f 72 20 74 68 69 73 20 64 65 66 ect for this def
a560: 69 6e 69 74 69 6f 6e 2e 20 20 41 63 74 75 61 6c inition. Actual
a570: 6c 79 2c 20 69 66 20 74 68 69 73 0a 20 20 2a 2a ly, if this. **
a580: 20 69 73 20 61 20 43 2b 2b 20 63 6c 61 73 73 20 is a C++ class
a590: 64 65 66 69 6e 69 74 69 6f 6e 2c 20 74 68 65 6e definition, then
a5a0: 20 74 68 65 20 44 65 63 6c 20 6f 62 6a 65 63 74 the Decl object
a5b0: 20 6d 69 67 68 74 20 61 6c 72 65 61 64 79 20 65 might already e
a5c0: 78 69 73 74 2c 0a 20 20 2a 2a 20 73 6f 20 63 68 xist,. ** so ch
a5d0: 65 63 6b 20 66 69 72 73 74 20 66 6f 72 20 74 68 eck first for th
a5e0: 61 74 20 63 61 73 65 20 62 65 66 6f 72 65 20 63 at case before c
a5f0: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e reating a new on
a600: 65 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 e.. */. switch
a610: 28 20 2a 70 4c 69 73 74 2d 3e 7a 54 65 78 74 20 ( *pList->zText
a620: 29 7b 0a 20 20 20 20 63 61 73 65 20 27 63 27 3a ){. case 'c':
a630: 20 20 74 79 70 65 20 3d 20 54 59 5f 43 6c 61 73 type = TY_Clas
a640: 73 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b s; break;
a650: 0a 20 20 20 20 63 61 73 65 20 27 73 27 3a 20 20 . case 's':
a660: 74 79 70 65 20 3d 20 54 59 5f 53 74 72 75 63 74 type = TY_Struct
a670: 75 72 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 ure; break;.
a680: 20 20 20 63 61 73 65 20 27 65 27 3a 20 20 74 79 case 'e': ty
a690: 70 65 20 3d 20 54 59 5f 45 6e 75 6d 65 72 61 74 pe = TY_Enumerat
a6a0: 69 6f 6e 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 ion; break;.
a6b0: 20 63 61 73 65 20 27 75 27 3a 20 20 74 79 70 65 case 'u': type
a6c0: 20 3d 20 54 59 5f 55 6e 69 6f 6e 3b 20 20 20 20 = TY_Union;
a6d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 break;. d
a6e0: 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 43 61 6e efault: /* Can
a6f0: 27 74 20 48 61 70 70 65 6e 20 2a 2f 20 20 20 20 't Happen */
a700: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 break;. }. i
a710: 66 28 20 74 79 70 65 21 3d 54 59 5f 43 6c 61 73 f( type!=TY_Clas
a720: 73 20 29 7b 0a 20 20 20 20 70 44 65 63 6c 20 3d s ){. pDecl =
a730: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 0;. }else{.
a740: 20 70 44 65 63 6c 20 3d 20 46 69 6e 64 44 65 63 pDecl = FindDec
a750: 6c 28 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 20 l(pName->zText,
a760: 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 29 3b 0a 20 pName->nText);.
a770: 20 20 20 69 66 28 20 70 44 65 63 6c 20 26 26 20 if( pDecl &&
a780: 28 70 44 65 63 6c 2d 3e 66 6c 61 67 73 20 26 20 (pDecl->flags &
a790: 74 79 70 65 29 21 3d 74 79 70 65 20 29 20 70 44 type)!=type ) pD
a7a0: 65 63 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 ecl = 0;. }. i
a7b0: 66 28 20 70 44 65 63 6c 3d 3d 30 20 29 7b 0a 20 f( pDecl==0 ){.
a7c0: 20 20 20 70 44 65 63 6c 20 3d 20 43 72 65 61 74 pDecl = Creat
a7d0: 65 44 65 63 6c 28 70 4e 61 6d 65 2d 3e 7a 54 65 eDecl(pName->zTe
a7e0: 78 74 2c 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 29 xt,pName->nText)
a7f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 66 6c 61 ;. }. if( (fla
a800: 67 73 20 26 20 50 53 5f 53 74 61 74 69 63 29 20 gs & PS_Static)
a810: 7c 7c 20 21 28 66 6c 61 67 73 20 26 20 28 50 53 || !(flags & (PS
a820: 5f 49 6e 74 65 72 66 61 63 65 7c 50 53 5f 45 78 _Interface|PS_Ex
a830: 70 6f 72 74 29 29 20 29 7b 0a 20 20 20 20 44 65 port)) ){. De
a840: 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 clSetProperty(pD
a850: 65 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29 3b 0a 20 ecl,DP_Local);.
a860: 20 7d 0a 20 20 44 65 63 6c 53 65 74 50 72 6f 70 }. DeclSetProp
a870: 65 72 74 79 28 70 44 65 63 6c 2c 74 79 70 65 29 erty(pDecl,type)
a880: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6f 62 6a 65 ;.. /* The obje
a890: 63 74 20 68 61 73 20 61 20 66 75 6c 6c 20 64 65 ct has a full de
a8a0: 63 6c 61 72 61 74 69 6f 6e 20 6f 6e 6c 79 20 69 claration only i
a8b0: 66 20 69 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 f it is containe
a8c0: 64 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 22 23 d within. ** "#
a8d0: 69 66 20 49 4e 54 45 52 46 41 43 45 2e 2e 2e 23 if INTERFACE...#
a8e0: 65 6e 64 69 66 22 20 6f 72 20 22 23 69 66 20 45 endif" or "#if E
a8f0: 58 50 4f 52 54 5f 49 4e 54 45 52 46 41 43 45 2e XPORT_INTERFACE.
a900: 2e 2e 23 65 6e 64 69 66 22 20 6f 72 0a 20 20 2a ..#endif" or. *
a910: 2a 20 22 23 69 66 20 4c 4f 43 41 4c 5f 49 4e 54 * "#if LOCAL_INT
a920: 45 52 46 41 43 45 2e 2e 2e 23 65 6e 64 69 66 22 ERFACE...#endif"
a930: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 77 65 . Otherwise, we
a940: 20 6f 6e 6c 79 20 67 69 76 65 20 69 74 20 61 0a only give it a.
a950: 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 64 65 63 ** forward dec
a960: 6c 61 72 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 laration.. */.
a970: 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 50 53 if( flags & (PS
a980: 5f 4c 6f 63 61 6c 20 7c 20 50 53 5f 45 78 70 6f _Local | PS_Expo
a990: 72 74 20 7c 20 50 53 5f 49 6e 74 65 72 66 61 63 rt | PS_Interfac
a9a0: 65 29 20 20 29 7b 0a 20 20 20 20 70 44 65 63 6c e) ){. pDecl
a9b0: 2d 3e 7a 44 65 63 6c 20 3d 20 54 6f 6b 65 6e 73 ->zDecl = Tokens
a9c0: 54 6f 53 74 72 69 6e 67 28 70 4c 69 73 74 2c 70 ToString(pList,p
a9d0: 45 6e 64 2c 22 3b 5c 6e 22 2c 30 2c 30 29 3b 0a End,";\n",0,0);.
a9e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 44 65 }else{. pDe
a9f0: 63 6c 2d 3e 7a 44 65 63 6c 20 3d 20 30 3b 0a 20 cl->zDecl = 0;.
aa00: 20 7d 0a 20 20 70 44 65 63 6c 2d 3e 70 43 6f 6d }. pDecl->pCom
aa10: 6d 65 6e 74 20 3d 20 70 4c 69 73 74 2d 3e 70 43 ment = pList->pC
aa20: 6f 6d 6d 65 6e 74 3b 0a 20 20 53 74 72 69 6e 67 omment;. String
aa30: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 53 74 Init(&str);. St
aa40: 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c ringAppend(&str,
aa50: 22 74 79 70 65 64 65 66 20 22 2c 30 29 3b 0a 20 "typedef ",0);.
aa60: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 StringAppend(&s
aa70: 74 72 2c 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c tr,pList->zText,
aa80: 70 4c 69 73 74 2d 3e 6e 54 65 78 74 29 3b 0a 20 pList->nText);.
aa90: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 StringAppend(&s
aaa0: 74 72 2c 22 20 22 2c 30 29 3b 0a 20 20 53 74 72 tr," ",0);. Str
aab0: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 70 ingAppend(&str,p
aac0: 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 70 4e 61 6d Name->zText,pNam
aad0: 65 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 53 74 72 e->nText);. Str
aae0: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 22 ingAppend(&str,"
aaf0: 20 22 2c 30 29 3b 0a 20 20 53 74 72 69 6e 67 41 ",0);. StringA
ab00: 70 70 65 6e 64 28 26 73 74 72 2c 70 4e 61 6d 65 ppend(&str,pName
ab10: 2d 3e 7a 54 65 78 74 2c 70 4e 61 6d 65 2d 3e 6e ->zText,pName->n
ab20: 54 65 78 74 29 3b 0a 20 20 53 74 72 69 6e 67 41 Text);. StringA
ab30: 70 70 65 6e 64 28 26 73 74 72 2c 22 3b 5c 6e 22 ppend(&str,";\n"
ab40: 2c 32 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a 46 ,2);. pDecl->zF
ab50: 77 64 20 3d 20 53 74 72 44 75 70 28 53 74 72 69 wd = StrDup(Stri
ab60: 6e 67 47 65 74 28 26 73 74 72 29 2c 30 29 3b 0a ngGet(&str),0);.
ab70: 20 20 53 74 72 69 6e 67 52 65 73 65 74 28 26 73 StringReset(&s
ab80: 74 72 29 3b 0a 20 20 53 74 72 69 6e 67 49 6e 69 tr);. StringIni
ab90: 74 28 26 73 74 72 29 3b 0a 20 20 53 74 72 69 6e t(&str);. Strin
aba0: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 70 4c 69 gAppend(&str,pLi
abb0: 73 74 2d 3e 7a 54 65 78 74 2c 70 4c 69 73 74 2d st->zText,pList-
abc0: 3e 6e 54 65 78 74 29 3b 0a 20 20 53 74 72 69 6e >nText);. Strin
abd0: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 22 20 22 gAppend(&str," "
abe0: 2c 30 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70 ,0);. StringApp
abf0: 65 6e 64 28 26 73 74 72 2c 70 4e 61 6d 65 2d 3e end(&str,pName->
ac00: 7a 54 65 78 74 2c 70 4e 61 6d 65 2d 3e 6e 54 65 zText,pName->nTe
ac10: 78 74 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70 xt);. StringApp
ac20: 65 6e 64 28 26 73 74 72 2c 22 3b 5c 6e 22 2c 32 end(&str,";\n",2
ac30: 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a 46 77 64 );. pDecl->zFwd
ac40: 43 70 70 20 3d 20 53 74 72 44 75 70 28 53 74 72 Cpp = StrDup(Str
ac50: 69 6e 67 47 65 74 28 26 73 74 72 29 2c 30 29 3b ingGet(&str),0);
ac60: 0a 20 20 53 74 72 69 6e 67 52 65 73 65 74 28 26 . StringReset(&
ac70: 73 74 72 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 str);. if( flag
ac80: 73 20 26 20 50 53 5f 45 78 70 6f 72 74 20 29 7b s & PS_Export ){
ac90: 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 . DeclSetProp
aca0: 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 78 erty(pDecl,DP_Ex
acb0: 70 6f 72 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 port);. }else i
acc0: 66 28 20 66 6c 61 67 73 20 26 20 50 53 5f 4c 6f f( flags & PS_Lo
acd0: 63 61 6c 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 cal ){. DeclS
ace0: 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c etProperty(pDecl
acf0: 2c 44 50 5f 4c 6f 63 61 6c 29 3b 0a 20 20 7d 0a ,DP_Local);. }.
ad00: 0a 20 20 2f 2a 20 48 65 72 65 27 73 20 73 6f 6d . /* Here's som
ad10: 65 74 68 69 6e 67 20 77 65 69 72 64 2e 20 20 41 ething weird. A
ad20: 4e 53 49 2d 43 20 64 6f 65 73 6e 27 74 20 61 6c NSI-C doesn't al
ad30: 6c 6f 77 20 61 20 66 6f 72 77 61 72 64 20 64 65 low a forward de
ad40: 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f claration. ** o
ad50: 66 20 61 6e 20 65 6e 75 6d 65 72 61 74 69 6f 6e f an enumeration
ad60: 2e 20 20 53 6f 20 77 65 20 68 61 76 65 20 74 6f . So we have to
ad70: 20 62 75 69 6c 64 20 74 68 65 20 74 79 70 65 64 build the typed
ad80: 65 66 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a ef into the. **
ad90: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a definition.. *
ada0: 2f 0a 20 20 69 66 28 20 70 44 65 63 6c 2d 3e 7a /. if( pDecl->z
adb0: 44 65 63 6c 20 26 26 20 44 65 63 6c 48 61 73 50 Decl && DeclHasP
adc0: 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 20 54 roperty(pDecl, T
add0: 59 5f 45 6e 75 6d 65 72 61 74 69 6f 6e 29 20 29 Y_Enumeration) )
ade0: 7b 0a 20 20 20 20 53 74 72 69 6e 67 49 6e 69 74 {. StringInit
adf0: 28 26 73 74 72 29 3b 0a 20 20 20 20 53 74 72 69 (&str);. Stri
ae00: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 70 44 ngAppend(&str,pD
ae10: 65 63 6c 2d 3e 7a 44 65 63 6c 2c 30 29 3b 0a 20 ecl->zDecl,0);.
ae20: 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 StringAppend(
ae30: 26 73 74 72 2c 70 44 65 63 6c 2d 3e 7a 46 77 64 &str,pDecl->zFwd
ae40: 2c 30 29 3b 0a 20 20 20 20 53 61 66 65 46 72 65 ,0);. SafeFre
ae50: 65 28 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 29 3b e(pDecl->zDecl);
ae60: 0a 20 20 20 20 53 61 66 65 46 72 65 65 28 70 44 . SafeFree(pD
ae70: 65 63 6c 2d 3e 7a 46 77 64 29 3b 0a 20 20 20 20 ecl->zFwd);.
ae80: 70 44 65 63 6c 2d 3e 7a 46 77 64 20 3d 20 30 3b pDecl->zFwd = 0;
ae90: 0a 20 20 20 20 70 44 65 63 6c 2d 3e 7a 44 65 63 . pDecl->zDec
aea0: 6c 20 3d 20 53 74 72 44 75 70 28 53 74 72 69 6e l = StrDup(Strin
aeb0: 67 47 65 74 28 26 73 74 72 29 2c 30 29 3b 0a 20 gGet(&str),0);.
aec0: 20 20 20 53 74 72 69 6e 67 52 65 73 65 74 28 26 StringReset(&
aed0: 73 74 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 str);. }.. if(
aee0: 20 70 4e 61 6d 65 2d 3e 70 4e 65 78 74 2d 3e 7a pName->pNext->z
aef0: 54 65 78 74 5b 30 5d 3d 3d 27 3a 27 20 29 7b 0a Text[0]==':' ){.
af00: 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65 DeclSetPrope
af10: 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 43 70 6c rty(pDecl,DP_Cpl
af20: 75 73 70 6c 75 73 29 3b 0a 20 20 7d 0a 20 20 69 usplus);. }. i
af30: 66 28 20 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 3d f( pName->nText=
af40: 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4e =5 && strncmp(pN
af50: 61 6d 65 2d 3e 7a 54 65 78 74 2c 22 63 6c 61 73 ame->zText,"clas
af60: 73 22 2c 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 s",5)==0 ){.
af70: 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 DeclSetProperty(
af80: 70 44 65 63 6c 2c 44 50 5f 43 70 6c 75 73 70 6c pDecl,DP_Cpluspl
af90: 75 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 us);. }.. /*.
afa0: 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 62 ** Remove all b
afb0: 75 74 20 70 4c 69 73 74 20 61 6e 64 20 70 4e 61 ut pList and pNa
afc0: 6d 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 me from the inpu
afd0: 74 20 73 74 72 65 61 6d 2e 0a 20 20 2a 2f 0a 20 t stream.. */.
afe0: 20 69 66 28 20 6e 65 65 64 5f 74 6f 5f 63 6f 6c if( need_to_col
aff0: 6c 61 70 73 65 20 29 7b 0a 20 20 20 20 77 68 69 lapse ){. whi
b000: 6c 65 28 20 70 45 6e 64 21 3d 70 4e 61 6d 65 20 le( pEnd!=pName
b010: 29 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a ){. Token *
b020: 70 50 72 65 76 20 3d 20 70 45 6e 64 2d 3e 70 50 pPrev = pEnd->pP
b030: 72 65 76 3b 0a 20 20 20 20 20 20 70 50 72 65 76 rev;. pPrev
b040: 2d 3e 70 4e 65 78 74 20 3d 20 70 45 6e 64 2d 3e ->pNext = pEnd->
b050: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 45 6e pNext;. pEn
b060: 64 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 d->pNext->pPrev
b070: 3d 20 70 50 72 65 76 3b 0a 20 20 20 20 20 20 53 = pPrev;. S
b080: 61 66 65 46 72 65 65 28 70 45 6e 64 29 3b 0a 20 afeFree(pEnd);.
b090: 20 20 20 20 20 70 45 6e 64 20 3d 20 70 50 72 65 pEnd = pPre
b0a0: 76 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 v;. }. }. r
b0b0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn 0;.}../*.*
b0c0: 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f * Given a list o
b0d0: 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 f tokens that de
b0e0: 63 6c 61 72 65 20 73 6f 6d 65 74 68 69 6e 67 20 clare something
b0f0: 28 61 20 66 75 6e 63 74 69 6f 6e 2c 20 70 72 6f (a function, pro
b100: 63 65 64 75 72 65 2c 0a 2a 2a 20 76 61 72 69 61 cedure,.** varia
b110: 62 6c 65 20 6f 72 20 74 79 70 65 64 65 66 29 20 ble or typedef)
b120: 66 69 6e 64 20 74 68 65 20 74 6f 6b 65 6e 20 77 find the token w
b130: 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 hich contains th
b140: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a e name of the.**
b150: 20 74 68 69 6e 67 20 62 65 69 6e 67 20 64 65 63 thing being dec
b160: 6c 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 67 lared..**.** Alg
b170: 6f 72 69 74 68 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 orithm:.**.**
b180: 54 68 65 20 6e 61 6d 65 20 69 73 3a 0a 2a 2a 0a The name is:.**.
b190: 2a 2a 20 20 20 20 20 31 2e 20 20 54 68 65 20 66 ** 1. The f
b1a0: 69 72 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 irst identifier
b1b0: 74 68 61 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64 that is followed
b1c0: 20 62 79 20 61 20 22 5b 22 2c 20 6f 72 0a 2a 2a by a "[", or.**
b1d0: 0a 2a 2a 20 20 20 20 20 32 2e 20 20 54 68 65 20 .** 2. The
b1e0: 66 69 72 73 74 20 69 64 65 6e 74 69 66 69 65 72 first identifier
b1f0: 20 74 68 61 74 20 69 73 20 66 6f 6c 6c 6f 77 65 that is followe
b200: 64 20 62 79 20 61 20 22 28 22 20 77 68 65 72 65 d by a "(" where
b210: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 the.**
b220: 22 28 22 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 "(" is followed
b230: 62 79 20 61 6e 6f 74 68 65 72 20 69 64 65 6e 74 by another ident
b240: 69 66 69 65 72 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 ifier, or.**.**
b250: 20 20 20 20 33 2e 20 20 54 68 65 20 66 69 72 73 3. The firs
b260: 74 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f 6c t identifier fol
b270: 6c 6f 77 65 64 20 62 79 20 22 3a 3a 22 2c 20 6f lowed by "::", o
b280: 72 0a 2a 2a 0a 2a 2a 20 20 20 20 20 34 2e 20 20 r.**.** 4.
b290: 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 If none of the a
b2a0: 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 6c bove, then the l
b2b0: 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 2e 0a ast identifier..
b2c0: 2a 2a 0a 2a 2a 20 20 20 49 6e 20 61 6c 6c 20 6f **.** In all o
b2d0: 66 20 74 68 65 20 61 62 6f 76 65 2c 20 63 65 72 f the above, cer
b2e0: 74 61 69 6e 20 72 65 73 65 72 76 65 64 20 77 6f tain reserved wo
b2f0: 72 64 73 20 28 6c 69 6b 65 20 22 63 68 61 72 22 rds (like "char"
b300: 29 20 61 72 65 0a 2a 2a 20 20 20 6e 6f 74 20 63 ) are.** not c
b310: 6f 6e 73 69 64 65 72 65 64 20 69 64 65 6e 74 69 onsidered identi
b320: 66 69 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 fiers..*/.static
b330: 20 54 6f 6b 65 6e 20 2a 46 69 6e 64 44 65 63 6c Token *FindDecl
b340: 4e 61 6d 65 28 54 6f 6b 65 6e 20 2a 70 46 69 72 Name(Token *pFir
b350: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 st, Token *pLast
b360: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d ){. Token *pNam
b370: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a e = 0;. Token *
b380: 70 3b 0a 20 20 69 6e 74 20 63 3b 0a 0a 20 20 69 p;. int c;.. i
b390: 66 28 20 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 f( pFirst==0 ||
b3a0: 70 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 pLast==0 ){.
b3b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 return 0;. }.
b3c0: 70 4c 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70 pLast = pLast->p
b3d0: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 46 Next;. for(p=pF
b3e0: 69 72 73 74 3b 20 70 20 26 26 20 70 21 3d 70 4c irst; p && p!=pL
b3f0: 61 73 74 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 ast; p=p->pNext)
b400: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 54 79 {. if( p->eTy
b410: 70 65 3d 3d 54 54 5f 49 64 20 29 7b 0a 20 20 20 pe==TT_Id ){.
b420: 20 20 20 73 74 61 74 69 63 20 49 64 65 6e 74 54 static IdentT
b430: 61 62 6c 65 20 73 52 65 73 65 72 76 65 64 3b 0a able sReserved;.
b440: 20 20 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 static int
b450: 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 isInit = 0;.
b460: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a static char *
b470: 61 57 6f 72 64 73 5b 5d 20 3d 20 7b 20 22 63 68 aWords[] = { "ch
b480: 61 72 22 2c 20 22 63 6c 61 73 73 22 2c 20 0a 20 ar", "class", .
b490: 20 20 20 20 20 20 22 63 6f 6e 73 74 22 2c 20 22 "const", "
b4a0: 64 6f 75 62 6c 65 22 2c 20 22 65 6e 75 6d 22 2c double", "enum",
b4b0: 20 22 65 78 74 65 72 6e 22 2c 20 22 45 58 50 4f "extern", "EXPO
b4c0: 52 54 22 2c 20 22 45 54 5f 50 52 4f 43 22 2c 20 RT", "ET_PROC",
b4d0: 0a 20 20 20 20 20 20 20 22 66 6c 6f 61 74 22 2c . "float",
b4e0: 20 22 69 6e 74 22 2c 20 22 6c 6f 6e 67 22 2c 0a "int", "long",.
b4f0: 20 20 20 20 20 20 20 22 50 52 49 56 41 54 45 22 "PRIVATE"
b500: 2c 20 22 50 52 4f 54 45 43 54 45 44 22 2c 20 22 , "PROTECTED", "
b510: 50 55 42 4c 49 43 22 2c 0a 20 20 20 20 20 20 20 PUBLIC",.
b520: 22 72 65 67 69 73 74 65 72 22 2c 20 22 73 74 61 "register", "sta
b530: 74 69 63 22 2c 20 22 73 74 72 75 63 74 22 2c 20 tic", "struct",
b540: 22 73 69 7a 65 6f 66 22 2c 20 22 73 69 67 6e 65 "sizeof", "signe
b550: 64 22 2c 20 22 74 79 70 65 64 65 66 22 2c 20 0a d", "typedef", .
b560: 20 20 20 20 20 20 20 22 75 6e 69 6f 6e 22 2c 20 "union",
b570: 22 76 6f 6c 61 74 69 6c 65 22 2c 20 22 76 69 72 "volatile", "vir
b580: 74 75 61 6c 22 2c 20 22 76 6f 69 64 22 2c 20 7d tual", "void", }
b590: 3b 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 21 ;. . if( !
b5a0: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 isInit ){.
b5b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 int i;.
b5c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 for(i=0; i<size
b5d0: 6f 66 28 61 57 6f 72 64 73 29 2f 73 69 7a 65 6f of(aWords)/sizeo
b5e0: 66 28 61 57 6f 72 64 73 5b 30 5d 29 3b 20 69 2b f(aWords[0]); i+
b5f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 64 +){. Id
b600: 65 6e 74 54 61 62 6c 65 49 6e 73 65 72 74 28 26 entTableInsert(&
b610: 73 52 65 73 65 72 76 65 64 2c 61 57 6f 72 64 73 sReserved,aWords
b620: 5b 69 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 [i],0);.
b630: 7d 0a 20 20 20 20 20 20 20 20 69 73 49 6e 69 74 }. isInit
b640: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 = 1;. }.
b650: 20 20 20 20 69 66 28 20 21 49 64 65 6e 74 54 61 if( !IdentTa
b660: 62 6c 65 54 65 73 74 28 26 73 52 65 73 65 72 76 bleTest(&sReserv
b670: 65 64 2c 70 2d 3e 7a 54 65 78 74 2c 70 2d 3e 6e ed,p->zText,p->n
b680: 54 65 78 74 29 20 29 7b 0a 20 20 20 20 20 20 20 Text) ){.
b690: 20 70 4e 61 6d 65 20 3d 20 70 3b 0a 20 20 20 20 pName = p;.
b6a0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 }. }else if
b6b0: 28 20 70 3d 3d 70 46 69 72 73 74 20 29 7b 0a 20 ( p==pFirst ){.
b6c0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 continue;.
b6d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d }else if( (c=
b6e0: 70 2d 3e 7a 54 65 78 74 5b 30 5d 29 3d 3d 27 5b p->zText[0])=='[
b6f0: 27 20 26 26 20 70 4e 61 6d 65 20 29 7b 0a 20 20 ' && pName ){.
b700: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
b710: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 28 27 20 else if( c=='('
b720: 26 26 20 70 2d 3e 70 4e 65 78 74 20 26 26 20 70 && p->pNext && p
b730: 2d 3e 70 4e 65 78 74 2d 3e 65 54 79 70 65 3d 3d ->pNext->eType==
b740: 54 54 5f 49 64 20 26 26 20 70 4e 61 6d 65 20 29 TT_Id && pName )
b750: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 {. break;.
b760: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d }else if( c==
b770: 27 3a 27 20 26 26 20 70 2d 3e 7a 54 65 78 74 5b ':' && p->zText[
b780: 31 5d 3d 3d 27 3a 27 20 26 26 20 70 4e 61 6d 65 1]==':' && pName
b790: 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b ){. break;
b7a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 . }. }. ret
b7b0: 75 72 6e 20 70 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a urn pName;.}../*
b7c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
b7d0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 is called when
b7e0: 77 65 20 73 65 65 20 61 20 6d 65 74 68 6f 64 20 we see a method
b7f0: 66 6f 72 20 61 20 63 6c 61 73 73 20 74 68 61 74 for a class that
b800: 20 62 65 67 69 6e 73 0a 2a 2a 20 77 69 74 68 20 begins.** with
b810: 74 68 65 20 50 55 42 4c 49 43 2c 20 50 52 49 56 the PUBLIC, PRIV
b820: 41 54 45 2c 20 6f 72 20 50 52 4f 54 45 43 54 45 ATE, or PROTECTE
b830: 44 20 6b 65 79 77 6f 72 64 73 2e 20 20 53 75 63 D keywords. Suc
b840: 68 20 6d 65 74 68 6f 64 73 20 61 72 65 0a 2a 2a h methods are.**
b850: 20 61 64 64 65 64 20 74 6f 20 74 68 65 69 72 20 added to their
b860: 63 6c 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e class definition
b870: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 s..*/.static int
b880: 20 50 72 6f 63 65 73 73 4d 65 74 68 6f 64 44 65 ProcessMethodDe
b890: 66 28 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c f(Token *pFirst,
b8a0: 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 2c 20 69 Token *pLast, i
b8b0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 54 6f 6b nt flags){. Tok
b8c0: 65 6e 20 2a 70 43 6f 64 65 3b 0a 20 20 54 6f 6b en *pCode;. Tok
b8d0: 65 6e 20 2a 70 43 6c 61 73 73 3b 0a 20 20 63 68 en *pClass;. ch
b8e0: 61 72 20 2a 7a 44 65 63 6c 3b 0a 20 20 44 65 63 ar *zDecl;. Dec
b8f0: 6c 20 2a 70 44 65 63 6c 3b 0a 20 20 53 74 72 69 l *pDecl;. Stri
b900: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 74 79 ng str;. int ty
b910: 70 65 3b 0a 0a 20 20 70 43 6f 64 65 20 3d 20 70 pe;.. pCode = p
b920: 4c 61 73 74 3b 0a 20 20 70 4c 61 73 74 20 3d 20 Last;. pLast =
b930: 70 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 pLast->pPrev;.
b940: 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 7a while( pFirst->z
b950: 54 65 78 74 5b 30 5d 3d 3d 27 50 27 20 29 7b 0a Text[0]=='P' ){.
b960: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 0a int rc = 1;.
b970: 20 20 20 20 73 77 69 74 63 68 28 20 70 46 69 72 switch( pFir
b980: 73 74 2d 3e 6e 54 65 78 74 20 29 7b 0a 20 20 20 st->nText ){.
b990: 20 20 20 63 61 73 65 20 36 3a 20 20 72 63 20 3d case 6: rc =
b9a0: 20 73 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d strncmp(pFirst-
b9b0: 3e 7a 54 65 78 74 2c 22 50 55 42 4c 49 43 22 2c >zText,"PUBLIC",
b9c0: 36 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 6); break;.
b9d0: 20 63 61 73 65 20 37 3a 20 20 72 63 20 3d 20 73 case 7: rc = s
b9e0: 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e 7a trncmp(pFirst->z
b9f0: 54 65 78 74 2c 22 50 52 49 56 41 54 45 22 2c 37 Text,"PRIVATE",7
ba00: 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 ); break;.
ba10: 63 61 73 65 20 39 3a 20 20 72 63 20 3d 20 73 74 case 9: rc = st
ba20: 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e 7a 54 rncmp(pFirst->zT
ba30: 65 78 74 2c 22 50 52 4f 54 45 43 54 45 44 22 2c ext,"PROTECTED",
ba40: 39 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 9); break;.
ba50: 20 64 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b default: break
ba60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
ba70: 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 rc ) break;.
ba80: 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d pFirst = pFirst-
ba90: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 >pNext;. }. pC
baa0: 6c 61 73 73 20 3d 20 46 69 6e 64 44 65 63 6c 4e lass = FindDeclN
bab0: 61 6d 65 28 70 46 69 72 73 74 2c 70 4c 61 73 74 ame(pFirst,pLast
bac0: 29 3b 0a 20 20 69 66 28 20 70 43 6c 61 73 73 3d );. if( pClass=
bad0: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 =0 ){. fprint
bae0: 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a f(stderr,"%s:%d:
baf0: 20 55 6e 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 Unable to find
bb00: 74 68 65 20 63 6c 61 73 73 20 6e 61 6d 65 20 66 the class name f
bb10: 6f 72 20 74 68 69 73 20 6d 65 74 68 6f 64 5c 6e or this method\n
bb20: 22 2c 0a 20 20 20 20 20 20 20 7a 46 69 6c 65 6e ",. zFilen
bb30: 61 6d 65 2c 20 70 46 69 72 73 74 2d 3e 6e 4c 69 ame, pFirst->nLi
bb40: 6e 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 ne);. return
bb50: 31 3b 0a 20 20 7d 0a 20 20 70 44 65 63 6c 20 3d 1;. }. pDecl =
bb60: 20 46 69 6e 64 44 65 63 6c 28 70 43 6c 61 73 73 FindDecl(pClass
bb70: 2d 3e 7a 54 65 78 74 2c 20 70 43 6c 61 73 73 2d ->zText, pClass-
bb80: 3e 6e 54 65 78 74 29 3b 0a 20 20 69 66 28 20 70 >nText);. if( p
bb90: 44 65 63 6c 3d 3d 30 20 7c 7c 20 28 70 44 65 63 Decl==0 || (pDec
bba0: 6c 2d 3e 66 6c 61 67 73 20 26 20 54 59 5f 43 6c l->flags & TY_Cl
bbb0: 61 73 73 29 21 3d 54 59 5f 43 6c 61 73 73 20 29 ass)!=TY_Class )
bbc0: 7b 0a 20 20 20 20 70 44 65 63 6c 20 3d 20 43 72 {. pDecl = Cr
bbd0: 65 61 74 65 44 65 63 6c 28 70 43 6c 61 73 73 2d eateDecl(pClass-
bbe0: 3e 7a 54 65 78 74 2c 20 70 43 6c 61 73 73 2d 3e >zText, pClass->
bbf0: 6e 54 65 78 74 29 3b 0a 20 20 20 20 44 65 63 6c nText);. Decl
bc00: 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63 SetProperty(pDec
bc10: 6c 2c 20 54 59 5f 43 6c 61 73 73 29 3b 0a 20 20 l, TY_Class);.
bc20: 7d 0a 20 20 53 74 72 69 6e 67 49 6e 69 74 28 26 }. StringInit(&
bc30: 73 74 72 29 3b 0a 20 20 69 66 28 20 70 44 65 63 str);. if( pDec
bc40: 6c 2d 3e 7a 45 78 74 72 61 20 29 7b 0a 20 20 20 l->zExtra ){.
bc50: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 StringAppend(&s
bc60: 74 72 2c 20 70 44 65 63 6c 2d 3e 7a 45 78 74 72 tr, pDecl->zExtr
bc70: 61 2c 20 30 29 3b 0a 20 20 20 20 53 61 66 65 46 a, 0);. SafeF
bc80: 72 65 65 28 70 44 65 63 6c 2d 3e 7a 45 78 74 72 ree(pDecl->zExtr
bc90: 61 29 3b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 7a a);. pDecl->z
bca0: 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 Extra = 0;. }.
bcb0: 20 74 79 70 65 20 3d 20 66 6c 61 67 73 20 26 20 type = flags &
bcc0: 50 53 5f 50 50 50 3b 0a 20 20 69 66 28 20 70 44 PS_PPP;. if( pD
bcd0: 65 63 6c 2d 3e 65 78 74 72 61 54 79 70 65 21 3d ecl->extraType!=
bce0: 74 79 70 65 20 29 7b 0a 20 20 20 20 69 66 28 20 type ){. if(
bcf0: 74 79 70 65 20 26 20 50 53 5f 50 75 62 6c 69 63 type & PS_Public
bd00: 20 29 7b 0a 20 20 20 20 20 20 53 74 72 69 6e 67 ){. String
bd10: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22 70 75 Append(&str, "pu
bd20: 62 6c 69 63 3a 5c 6e 22 2c 20 30 29 3b 0a 20 20 blic:\n", 0);.
bd30: 20 20 20 20 70 44 65 63 6c 2d 3e 65 78 74 72 61 pDecl->extra
bd40: 54 79 70 65 20 3d 20 50 53 5f 50 75 62 6c 69 63 Type = PS_Public
bd50: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 ;. }else if(
bd60: 74 79 70 65 20 26 20 50 53 5f 50 72 6f 74 65 63 type & PS_Protec
bd70: 74 65 64 20 29 7b 0a 20 20 20 20 20 20 53 74 72 ted ){. Str
bd80: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 ingAppend(&str,
bd90: 22 70 72 6f 74 65 63 74 65 64 3a 5c 6e 22 2c 20 "protected:\n",
bda0: 30 29 3b 0a 20 20 20 20 20 20 70 44 65 63 6c 2d 0);. pDecl-
bdb0: 3e 65 78 74 72 61 54 79 70 65 20 3d 20 50 53 5f >extraType = PS_
bdc0: 50 72 6f 74 65 63 74 65 64 3b 0a 20 20 20 20 7d Protected;. }
bdd0: 65 6c 73 65 20 69 66 28 20 74 79 70 65 20 26 20 else if( type &
bde0: 50 53 5f 50 72 69 76 61 74 65 20 29 7b 0a 20 20 PS_Private ){.
bdf0: 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 StringAppend
be00: 28 26 73 74 72 2c 20 22 70 72 69 76 61 74 65 3a (&str, "private:
be10: 5c 6e 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 \n", 0);. p
be20: 44 65 63 6c 2d 3e 65 78 74 72 61 54 79 70 65 20 Decl->extraType
be30: 3d 20 50 53 5f 50 72 69 76 61 74 65 3b 0a 20 20 = PS_Private;.
be40: 20 20 7d 0a 20 20 7d 0a 20 20 53 74 72 69 6e 67 }. }. String
be50: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22 20 20 Append(&str, "
be60: 22 2c 20 30 29 3b 0a 20 20 7a 44 65 63 6c 20 3d ", 0);. zDecl =
be70: 20 54 6f 6b 65 6e 73 54 6f 53 74 72 69 6e 67 28 TokensToString(
be80: 70 46 69 72 73 74 2c 20 70 4c 61 73 74 2c 20 22 pFirst, pLast, "
be90: 3b 5c 6e 22 2c 20 70 43 6c 61 73 73 2c 20 32 29 ;\n", pClass, 2)
bea0: 3b 0a 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 ;. StringAppend
beb0: 28 26 73 74 72 2c 20 7a 44 65 63 6c 2c 20 30 29 (&str, zDecl, 0)
bec0: 3b 0a 20 20 53 61 66 65 46 72 65 65 28 7a 44 65 ;. SafeFree(zDe
bed0: 63 6c 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a 45 cl);. pDecl->zE
bee0: 78 74 72 61 20 3d 20 53 74 72 44 75 70 28 53 74 xtra = StrDup(St
bef0: 72 69 6e 67 47 65 74 28 26 73 74 72 29 2c 20 30 ringGet(&str), 0
bf00: 29 3b 0a 20 20 53 74 72 69 6e 67 52 65 73 65 74 );. StringReset
bf10: 28 26 73 74 72 29 3b 0a 20 20 72 65 74 75 72 6e (&str);. return
bf20: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 0;.}../*.** Thi
bf30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c s routine is cal
bf40: 6c 65 64 20 77 68 65 6e 20 77 65 20 73 65 65 20 led when we see
bf50: 61 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 70 72 a function or pr
bf60: 6f 63 65 64 75 72 65 20 64 65 66 69 6e 69 74 69 ocedure definiti
bf70: 6f 6e 2e 0a 2a 2a 20 57 65 20 6d 61 6b 65 20 61 on..** We make a
bf80: 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 n entry in the d
bf90: 65 63 6c 61 72 61 74 69 6f 6e 20 74 61 62 6c 65 eclaration table
bfa0: 20 74 68 61 74 20 69 73 20 61 20 70 72 6f 74 6f that is a proto
bfb0: 74 79 70 65 20 66 6f 72 20 74 68 69 73 0a 2a 2a type for this.**
bfc0: 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 70 72 6f function or pro
bfd0: 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 cedure..*/.stati
bfe0: 63 20 69 6e 74 20 50 72 6f 63 65 73 73 50 72 6f c int ProcessPro
bff0: 63 65 64 75 72 65 44 65 66 28 54 6f 6b 65 6e 20 cedureDef(Token
c000: 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a *pFirst, Token *
c010: 70 4c 61 73 74 2c 20 69 6e 74 20 66 6c 61 67 73 pLast, int flags
c020: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d ){. Token *pNam
c030: 65 3b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63 6c e;. Decl *pDecl
c040: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 64 65 ;. Token *pCode
c050: 3b 0a 0a 20 20 69 66 28 20 70 46 69 72 73 74 3d ;.. if( pFirst=
c060: 3d 30 20 7c 7c 20 70 4c 61 73 74 3d 3d 30 20 29 =0 || pLast==0 )
c070: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a {. return 0;.
c080: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 }. if( flags
c090: 26 20 50 53 5f 4d 65 74 68 6f 64 20 29 7b 0a 20 & PS_Method ){.
c0a0: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 if( flags & P
c0b0: 53 5f 50 50 50 20 29 7b 0a 20 20 20 20 20 20 72 S_PPP ){. r
c0c0: 65 74 75 72 6e 20 50 72 6f 63 65 73 73 4d 65 74 eturn ProcessMet
c0d0: 68 6f 64 44 65 66 28 70 46 69 72 73 74 2c 20 70 hodDef(pFirst, p
c0e0: 4c 61 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 Last, flags);.
c0f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 }else{. r
c100: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 eturn 0;. }.
c110: 20 7d 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20 }. if( (flags
c120: 26 20 50 53 5f 53 74 61 74 69 63 29 21 3d 30 20 & PS_Static)!=0
c130: 26 26 20 21 70 72 6f 74 6f 5f 73 74 61 74 69 63 && !proto_static
c140: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){. return 0
c150: 3b 0a 20 20 7d 0a 20 20 70 43 6f 64 65 20 3d 20 ;. }. pCode =
c160: 70 4c 61 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 pLast;. while(
c170: 70 4c 61 73 74 20 26 26 20 70 4c 61 73 74 21 3d pLast && pLast!=
c180: 70 46 69 72 73 74 20 26 26 20 70 4c 61 73 74 2d pFirst && pLast-
c190: 3e 7a 54 65 78 74 5b 30 5d 21 3d 27 29 27 20 29 >zText[0]!=')' )
c1a0: 7b 0a 20 20 20 20 70 4c 61 73 74 20 3d 20 70 4c {. pLast = pL
c1b0: 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a ast->pPrev;. }.
c1c0: 20 20 69 66 28 20 70 4c 61 73 74 3d 3d 30 20 7c if( pLast==0 |
c1d0: 7c 20 70 4c 61 73 74 3d 3d 70 46 69 72 73 74 20 | pLast==pFirst
c1e0: 7c 7c 20 70 46 69 72 73 74 2d 3e 70 4e 65 78 74 || pFirst->pNext
c1f0: 3d 3d 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 66 ==pLast ){. f
c200: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 printf(stderr,"%
c210: 73 3a 25 64 3a 20 55 6e 72 65 63 6f 67 6e 69 7a s:%d: Unrecogniz
c220: 65 64 20 73 79 6e 74 61 78 2e 5c 6e 22 2c 20 0a ed syntax.\n", .
c230: 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c zFilename,
c240: 20 70 46 69 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b pFirst->nLine);
c250: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 . return 1;.
c260: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 }. if( flags &
c270: 20 28 50 53 5f 49 6e 74 65 72 66 61 63 65 7c 50 (PS_Interface|P
c280: 53 5f 45 78 70 6f 72 74 7c 50 53 5f 4c 6f 63 61 S_Export|PS_Loca
c290: 6c 29 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 l) ){. fprint
c2a0: 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a f(stderr,"%s:%d:
c2b0: 20 4d 69 73 73 69 6e 67 20 5c 22 69 6e 6c 69 6e Missing \"inlin
c2c0: 65 5c 22 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 e\" on function
c2d0: 6f 72 20 70 72 6f 63 65 64 75 72 65 2e 5c 6e 22 or procedure.\n"
c2e0: 2c 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d ,. zFilenam
c2f0: 65 2c 20 70 46 69 72 73 74 2d 3e 6e 4c 69 6e 65 e, pFirst->nLine
c300: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b );. return 1;
c310: 0a 20 20 7d 0a 20 20 70 4e 61 6d 65 20 3d 20 46 . }. pName = F
c320: 69 6e 64 44 65 63 6c 4e 61 6d 65 28 70 46 69 72 indDeclName(pFir
c330: 73 74 2c 70 4c 61 73 74 29 3b 0a 20 20 69 66 28 st,pLast);. if(
c340: 20 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 pName==0 ){.
c350: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c fprintf(stderr,
c360: 22 25 73 3a 25 64 3a 20 4d 61 6c 66 6f 72 6d 65 "%s:%d: Malforme
c370: 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 70 72 d function or pr
c380: 6f 63 65 64 75 72 65 20 64 65 66 69 6e 69 74 69 ocedure definiti
c390: 6f 6e 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 46 on.\n",. zF
c3a0: 69 6c 65 6e 61 6d 65 2c 20 70 46 69 72 73 74 2d ilename, pFirst-
c3b0: 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 72 65 74 >nLine);. ret
c3c0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a urn 1;. }.. /*
c3d0: 0a 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f . ** At this po
c3e0: 69 6e 74 20 77 65 27 76 65 20 69 73 6f 6c 61 74 int we've isolat
c3f0: 65 64 20 61 20 70 72 6f 63 65 64 75 72 65 20 64 ed a procedure d
c400: 65 63 6c 61 72 61 74 69 6f 6e 20 62 65 74 77 65 eclaration betwe
c410: 65 6e 20 70 46 69 72 73 74 0a 20 20 2a 2a 20 61 en pFirst. ** a
c420: 6e 64 20 70 4c 61 73 74 20 77 69 74 68 20 74 68 nd pLast with th
c430: 65 20 6e 61 6d 65 20 70 4e 61 6d 65 2e 0a 20 20 e name pName..
c440: 2a 2f 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a */.#ifdef DEBUG.
c450: 20 20 69 66 28 20 64 65 62 75 67 4d 61 73 6b 20 if( debugMask
c460: 26 20 50 41 52 53 45 52 20 29 7b 0a 20 20 20 20 & PARSER ){.
c470: 70 72 69 6e 74 66 28 22 2a 2a 2a 2a 20 46 6f 75 printf("**** Fou
c480: 6e 64 20 72 6f 75 74 69 6e 65 3a 20 25 2e 2a 73 nd routine: %.*s
c490: 20 6f 6e 20 6c 69 6e 65 20 25 64 2e 2e 2e 5c 6e on line %d...\n
c4a0: 22 2c 20 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 2c ", pName->nText,
c4b0: 0a 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a . pName->z
c4c0: 54 65 78 74 2c 20 70 46 69 72 73 74 2d 3e 6e 4c Text, pFirst->nL
c4d0: 69 6e 65 29 3b 0a 20 20 20 20 50 72 69 6e 74 54 ine);. PrintT
c4e0: 6f 6b 65 6e 73 28 70 46 69 72 73 74 2c 70 4c 61 okens(pFirst,pLa
c4f0: 73 74 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 st);. printf(
c500: 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 ";\n");. }.#end
c510: 69 66 0a 20 20 70 44 65 63 6c 20 3d 20 43 72 65 if. pDecl = Cre
c520: 61 74 65 44 65 63 6c 28 70 4e 61 6d 65 2d 3e 7a ateDecl(pName->z
c530: 54 65 78 74 2c 70 4e 61 6d 65 2d 3e 6e 54 65 78 Text,pName->nTex
c540: 74 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 70 43 6f t);. pDecl->pCo
c550: 6d 6d 65 6e 74 20 3d 20 70 46 69 72 73 74 2d 3e mment = pFirst->
c560: 70 43 6f 6d 6d 65 6e 74 3b 0a 20 20 69 66 28 20 pComment;. if(
c570: 70 43 6f 64 65 20 26 26 20 70 43 6f 64 65 2d 3e pCode && pCode->
c580: 65 54 79 70 65 3d 3d 54 54 5f 42 72 61 63 65 73 eType==TT_Braces
c590: 20 29 7b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 74 ){. pDecl->t
c5a0: 6f 6b 65 6e 43 6f 64 65 20 3d 20 2a 70 43 6f 64 okenCode = *pCod
c5b0: 65 3b 0a 20 20 7d 0a 20 20 44 65 63 6c 53 65 74 e;. }. DeclSet
c5c0: 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 54 Property(pDecl,T
c5d0: 59 5f 53 75 62 72 6f 75 74 69 6e 65 29 3b 0a 20 Y_Subroutine);.
c5e0: 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 20 3d 20 pDecl->zDecl =
c5f0: 54 6f 6b 65 6e 73 54 6f 53 74 72 69 6e 67 28 70 TokensToString(p
c600: 46 69 72 73 74 2c 70 4c 61 73 74 2c 22 3b 5c 6e First,pLast,";\n
c610: 22 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 28 66 ",0,0);. if( (f
c620: 6c 61 67 73 20 26 20 28 50 53 5f 53 74 61 74 69 lags & (PS_Stati
c630: 63 7c 50 53 5f 4c 6f 63 61 6c 32 29 29 21 3d 30 c|PS_Local2))!=0
c640: 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 ){. DeclSetP
c650: 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 roperty(pDecl,DP
c660: 5f 4c 6f 63 61 6c 29 3b 0a 20 20 7d 65 6c 73 65 _Local);. }else
c670: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 50 if( (flags & (P
c680: 53 5f 45 78 70 6f 72 74 32 29 29 21 3d 30 20 29 S_Export2))!=0 )
c690: 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f {. DeclSetPro
c6a0: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 perty(pDecl,DP_E
c6b0: 78 70 6f 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 xport);. }.. i
c6c0: 66 28 20 66 6c 61 67 73 20 26 20 44 50 5f 43 70 f( flags & DP_Cp
c6d0: 6c 75 73 70 6c 75 73 20 29 7b 0a 20 20 20 20 44 lusplus ){. D
c6e0: 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 eclSetProperty(p
c6f0: 44 65 63 6c 2c 44 50 5f 43 70 6c 75 73 70 6c 75 Decl,DP_Cplusplu
c700: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 s);. }else{.
c710: 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 DeclSetProperty
c720: 28 70 44 65 63 6c 2c 44 50 5f 45 78 74 65 72 6e (pDecl,DP_Extern
c730: 43 52 65 71 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 CReqd);. }.. r
c740: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn 0;.}../*.*
c750: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 * This routine i
c760: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 s called wheneve
c770: 72 20 77 65 20 73 65 65 20 74 68 65 20 22 69 6e r we see the "in
c780: 6c 69 6e 65 22 20 6b 65 79 77 6f 72 64 2e 20 20 line" keyword.
c790: 57 65 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 65 We.** need to se
c7a0: 65 6b 2d 6f 75 74 20 74 68 65 20 69 6e 6c 69 6e ek-out the inlin
c7b0: 65 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 70 72 e function or pr
c7c0: 6f 63 65 64 75 72 65 20 61 6e 64 20 6d 61 6b 65 ocedure and make
c7d0: 20 61 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f a.** declaratio
c7e0: 6e 20 6f 75 74 20 6f 66 20 74 68 65 20 65 6e 74 n out of the ent
c7f0: 69 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a ire definition..
c800: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 50 72 */.static int Pr
c810: 6f 63 65 73 73 49 6e 6c 69 6e 65 50 72 6f 63 28 ocessInlineProc(
c820: 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 69 Token *pFirst, i
c830: 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 2a 70 nt flags, int *p
c840: 52 65 73 65 74 29 7b 0a 20 20 54 6f 6b 65 6e 20 Reset){. Token
c850: 2a 70 4e 61 6d 65 3b 0a 20 20 54 6f 6b 65 6e 20 *pName;. Token
c860: 2a 70 45 6e 64 3b 0a 20 20 44 65 63 6c 20 2a 70 *pEnd;. Decl *p
c870: 44 65 63 6c 3b 0a 0a 20 20 66 6f 72 28 70 45 6e Decl;.. for(pEn
c880: 64 3d 70 46 69 72 73 74 3b 20 70 45 6e 64 3b 20 d=pFirst; pEnd;
c890: 70 45 6e 64 20 3d 20 70 45 6e 64 2d 3e 70 4e 65 pEnd = pEnd->pNe
c8a0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 45 6e xt){. if( pEn
c8b0: 64 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 7b 27 d->zText[0]=='{'
c8c0: 20 7c 7c 20 70 45 6e 64 2d 3e 7a 54 65 78 74 5b || pEnd->zText[
c8d0: 30 5d 3d 3d 27 3b 27 20 29 7b 0a 20 20 20 20 20 0]==';' ){.
c8e0: 20 2a 70 52 65 73 65 74 20 3d 20 70 45 6e 64 2d *pReset = pEnd-
c8f0: 3e 7a 54 65 78 74 5b 30 5d 3b 0a 20 20 20 20 20 >zText[0];.
c900: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
c910: 7d 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20 }. if( pEnd==0
c920: 29 7b 0a 20 20 20 20 2a 70 52 65 73 65 74 20 3d ){. *pReset =
c930: 20 27 3b 27 3b 0a 20 20 20 20 66 70 72 69 6e 74 ';';. fprint
c940: 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a f(stderr,"%s:%d:
c950: 20 69 6e 63 6f 6d 70 6c 65 74 65 20 69 6e 6c 69 incomplete inli
c960: 6e 65 20 70 72 6f 63 65 64 75 72 65 20 64 65 66 ne procedure def
c970: 69 6e 69 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20 inition\n",.
c980: 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 zFilename, pFi
c990: 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 rst->nLine);.
c9a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 return 1;. }.
c9b0: 20 70 4e 61 6d 65 20 3d 20 46 69 6e 64 44 65 63 pName = FindDec
c9c0: 6c 4e 61 6d 65 28 70 46 69 72 73 74 2c 70 45 6e lName(pFirst,pEn
c9d0: 64 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d d);. if( pName=
c9e0: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 =0 ){. fprint
c9f0: 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a f(stderr,"%s:%d:
ca00: 20 6d 61 6c 66 6f 72 6d 65 64 20 69 6e 6c 69 6e malformed inlin
ca10: 65 20 70 72 6f 63 65 64 75 72 65 20 64 65 66 69 e procedure defi
ca20: 6e 69 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20 20 nition\n",.
ca30: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 72 zFilename, pFir
ca40: 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 st->nLine);.
ca50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 23 return 1;. }..#
ca60: 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 69 66 ifdef DEBUG. if
ca70: 28 20 64 65 62 75 67 4d 61 73 6b 20 26 20 50 41 ( debugMask & PA
ca80: 52 53 45 52 20 29 7b 0a 20 20 20 20 70 72 69 6e RSER ){. prin
ca90: 74 66 28 22 2a 2a 2a 2a 20 46 6f 75 6e 64 20 69 tf("**** Found i
caa0: 6e 6c 69 6e 65 20 72 6f 75 74 69 6e 65 3a 20 25 nline routine: %
cab0: 2e 2a 73 20 6f 6e 20 6c 69 6e 65 20 25 64 2e 2e .*s on line %d..
cac0: 2e 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 4e .\n", . pN
cad0: 61 6d 65 2d 3e 6e 54 65 78 74 2c 20 70 4e 61 6d ame->nText, pNam
cae0: 65 2d 3e 7a 54 65 78 74 2c 20 70 46 69 72 73 74 e->zText, pFirst
caf0: 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 50 72 ->nLine);. Pr
cb00: 69 6e 74 54 6f 6b 65 6e 73 28 70 46 69 72 73 74 intTokens(pFirst
cb10: 2c 70 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e ,pEnd);. prin
cb20: 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 tf("\n");. }.#e
cb30: 6e 64 69 66 0a 20 20 70 44 65 63 6c 20 3d 20 43 ndif. pDecl = C
cb40: 72 65 61 74 65 44 65 63 6c 28 70 4e 61 6d 65 2d reateDecl(pName-
cb50: 3e 7a 54 65 78 74 2c 70 4e 61 6d 65 2d 3e 6e 54 >zText,pName->nT
cb60: 65 78 74 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 70 ext);. pDecl->p
cb70: 43 6f 6d 6d 65 6e 74 20 3d 20 70 46 69 72 73 74 Comment = pFirst
cb80: 2d 3e 70 43 6f 6d 6d 65 6e 74 3b 0a 20 20 44 65 ->pComment;. De
cb90: 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 clSetProperty(pD
cba0: 65 63 6c 2c 54 59 5f 53 75 62 72 6f 75 74 69 6e ecl,TY_Subroutin
cbb0: 65 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a 44 65 e);. pDecl->zDe
cbc0: 63 6c 20 3d 20 54 6f 6b 65 6e 73 54 6f 53 74 72 cl = TokensToStr
cbd0: 69 6e 67 28 70 46 69 72 73 74 2c 70 45 6e 64 2c ing(pFirst,pEnd,
cbe0: 22 3b 5c 6e 22 2c 30 2c 30 29 3b 0a 20 20 69 66 ";\n",0,0);. if
cbf0: 28 20 28 66 6c 61 67 73 20 26 20 28 50 53 5f 53 ( (flags & (PS_S
cc00: 74 61 74 69 63 7c 50 53 5f 4c 6f 63 61 6c 7c 50 tatic|PS_Local|P
cc10: 53 5f 4c 6f 63 61 6c 32 29 29 20 29 7b 0a 20 20 S_Local2)) ){.
cc20: 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 DeclSetPropert
cc30: 79 28 70 44 65 63 6c 2c 44 50 5f 4c 6f 63 61 6c y(pDecl,DP_Local
cc40: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 );. }else if( f
cc50: 6c 61 67 73 20 26 20 28 50 53 5f 45 78 70 6f 72 lags & (PS_Expor
cc60: 74 7c 50 53 5f 45 78 70 6f 72 74 32 29 20 29 7b t|PS_Export2) ){
cc70: 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 . DeclSetProp
cc80: 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 78 erty(pDecl,DP_Ex
cc90: 70 6f 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 port);. }.. if
cca0: 28 20 66 6c 61 67 73 20 26 20 44 50 5f 43 70 6c ( flags & DP_Cpl
ccb0: 75 73 70 6c 75 73 20 29 7b 0a 20 20 20 20 44 65 usplus ){. De
ccc0: 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 clSetProperty(pD
ccd0: 65 63 6c 2c 44 50 5f 43 70 6c 75 73 70 6c 75 73 ecl,DP_Cplusplus
cce0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
ccf0: 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 DeclSetProperty(
cd00: 70 44 65 63 6c 2c 44 50 5f 45 78 74 65 72 6e 43 pDecl,DP_ExternC
cd10: 52 65 71 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 Reqd);. }.. re
cd20: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a turn 0;.}../*.**
cd30: 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 Determine if th
cd40: 65 20 74 6f 6b 65 6e 73 20 62 65 74 77 65 65 6e e tokens between
cd50: 20 70 46 69 72 73 74 20 61 6e 64 20 70 45 6e 64 pFirst and pEnd
cd60: 20 66 6f 72 6d 20 61 20 76 61 72 69 61 62 6c 65 form a variable
cd70: 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f .** definition o
cd80: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f r a function pro
cd90: 74 6f 74 79 70 65 2e 20 20 52 65 74 75 72 6e 20 totype. Return
cda0: 54 52 55 45 20 69 66 20 77 65 20 61 72 65 20 64 TRUE if we are d
cdb0: 65 61 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20 61 ealing.** with a
cdc0: 20 76 61 72 69 61 62 6c 65 20 64 65 66 69 6e 74 variable defint
cdd0: 69 6f 6e 20 61 6e 64 20 46 41 4c 53 45 20 66 6f ion and FALSE fo
cde0: 72 20 61 20 70 72 6f 74 6f 74 79 70 65 2e 0a 2a r a prototype..*
cdf0: 2a 0a 2a 2a 20 70 45 6e 64 20 69 73 20 74 68 65 *.** pEnd is the
ce00: 20 74 6f 6b 65 6e 20 74 68 61 74 20 65 6e 64 73 token that ends
ce10: 20 74 68 65 20 6f 62 6a 65 63 74 2e 20 20 49 74 the object. It
ce20: 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 61 can be either a
ce30: 20 27 3b 27 20 6f 72 0a 2a 2a 20 61 20 27 3d 27 ';' or.** a '='
ce40: 2e 20 20 49 66 20 69 74 20 69 73 20 27 3d 27 2c . If it is '=',
ce50: 20 74 68 65 6e 20 61 73 73 75 6d 65 20 77 65 20 then assume we
ce60: 68 61 76 65 20 61 20 76 61 72 69 61 62 6c 65 20 have a variable
ce70: 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a definition..**.*
ce80: 2a 20 49 66 20 70 45 6e 64 20 69 73 20 27 3b 27 * If pEnd is ';'
ce90: 2c 20 74 68 65 6e 20 74 68 65 20 64 65 74 65 72 , then the deter
cea0: 6d 69 6e 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 mination is more
ceb0: 20 64 69 66 66 69 63 75 6c 74 2e 20 20 57 65 20 difficult. We
cec0: 68 61 76 65 0a 2a 2a 20 74 6f 20 73 65 61 72 63 have.** to searc
ced0: 68 20 66 6f 72 20 61 6e 20 6f 63 63 75 72 61 6e h for an occuran
cee0: 63 65 20 6f 66 20 61 6e 20 49 44 20 66 6f 6c 6c ce of an ID foll
cef0: 6f 77 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 owed immediately
cf00: 20 62 79 20 27 28 27 2e 0a 2a 2a 20 49 66 20 66 by '('..** If f
cf10: 6f 75 6e 64 2c 20 77 65 20 68 61 76 65 20 61 20 ound, we have a
cf20: 70 72 6f 74 6f 74 79 70 65 2e 20 20 4f 74 68 65 prototype. Othe
cf30: 72 77 69 73 65 20 77 65 20 61 72 65 20 64 65 61 rwise we are dea
cf40: 6c 69 6e 67 20 77 69 74 68 20 61 0a 2a 2a 20 76 ling with a.** v
cf50: 61 72 69 61 62 6c 65 20 64 65 66 69 6e 69 74 69 ariable definiti
cf60: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e on..*/.static in
cf70: 74 20 69 73 56 61 72 69 61 62 6c 65 44 65 66 28 t isVariableDef(
cf80: 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 Token *pFirst, T
cf90: 6f 6b 65 6e 20 2a 70 45 6e 64 29 7b 0a 20 20 69 oken *pEnd){. i
cfa0: 66 28 20 70 45 6e 64 20 26 26 20 70 45 6e 64 2d f( pEnd && pEnd-
cfb0: 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 3d 27 20 26 >zText[0]=='=' &
cfc0: 26 20 0a 20 20 20 20 28 70 45 6e 64 2d 3e 70 50 & . (pEnd->pP
cfd0: 72 65 76 2d 3e 6e 54 65 78 74 21 3d 38 20 7c 7c rev->nText!=8 ||
cfe0: 20 73 74 72 6e 63 6d 70 28 70 45 6e 64 2d 3e 70 strncmp(pEnd->p
cff0: 50 72 65 76 2d 3e 7a 54 65 78 74 2c 22 6f 70 65 Prev->zText,"ope
d000: 72 61 74 6f 72 22 2c 38 29 21 3d 30 29 0a 20 20 rator",8)!=0).
d010: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b ){. return 1;
d020: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 46 . }. while( pF
d030: 69 72 73 74 20 26 26 20 70 46 69 72 73 74 21 3d irst && pFirst!=
d040: 70 45 6e 64 20 26 26 20 70 46 69 72 73 74 2d 3e pEnd && pFirst->
d050: 70 4e 65 78 74 20 26 26 20 70 46 69 72 73 74 2d pNext && pFirst-
d060: 3e 70 4e 65 78 74 21 3d 70 45 6e 64 20 29 7b 0a >pNext!=pEnd ){.
d070: 20 20 20 20 69 66 28 20 70 46 69 72 73 74 2d 3e if( pFirst->
d080: 65 54 79 70 65 3d 3d 54 54 5f 49 64 20 26 26 20 eType==TT_Id &&
d090: 70 46 69 72 73 74 2d 3e 70 4e 65 78 74 2d 3e 7a pFirst->pNext->z
d0a0: 54 65 78 74 5b 30 5d 3d 3d 27 28 27 20 29 7b 0a Text[0]=='(' ){.
d0b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a return 0;.
d0c0: 20 20 20 20 7d 0a 20 20 20 20 70 46 69 72 73 74 }. pFirst
d0d0: 20 3d 20 70 46 69 72 73 74 2d 3e 70 4e 65 78 74 = pFirst->pNext
d0e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 ;. }. return 1
d0f0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 ;.}.../*.** This
d100: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c routine is call
d110: 65 64 20 77 68 65 6e 65 76 65 72 20 77 65 20 65 ed whenever we e
d120: 6e 63 6f 75 6e 74 65 72 20 61 20 22 3b 22 20 6f ncounter a ";" o
d130: 72 20 22 3d 22 2e 20 20 54 68 65 20 73 74 75 66 r "=". The stuf
d140: 66 0a 2a 2a 20 62 65 74 77 65 65 6e 20 70 46 69 f.** between pFi
d150: 72 73 74 20 61 6e 64 20 70 4c 61 73 74 20 63 6f rst and pLast co
d160: 6e 73 74 69 74 75 74 65 73 20 65 69 74 68 65 72 nstitutes either
d170: 20 61 20 74 79 70 65 64 65 66 20 6f 72 20 61 20 a typedef or a
d180: 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 global.** variab
d190: 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 le definition.
d1a0: 44 6f 20 74 68 65 20 72 69 67 68 74 20 74 68 69 Do the right thi
d1b0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e ng..*/.static in
d1c0: 74 20 50 72 6f 63 65 73 73 44 65 63 6c 28 54 6f t ProcessDecl(To
d1d0: 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b ken *pFirst, Tok
d1e0: 65 6e 20 2a 70 45 6e 64 2c 20 69 6e 74 20 66 6c en *pEnd, int fl
d1f0: 61 67 73 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 ags){. Token *p
d200: 4e 61 6d 65 3b 0a 20 20 44 65 63 6c 20 2a 70 44 Name;. Decl *pD
d210: 65 63 6c 3b 0a 20 20 69 6e 74 20 69 73 4c 6f 63 ecl;. int isLoc
d220: 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 al = 0;. int is
d230: 56 61 72 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 Var;. int nErr
d240: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 46 69 72 = 0;.. if( pFir
d250: 73 74 3d 3d 30 20 7c 7c 20 70 45 6e 64 3d 3d 30 st==0 || pEnd==0
d260: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){. return 0
d270: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 ;. }. if( flag
d280: 73 20 26 20 50 53 5f 54 79 70 65 64 65 66 20 29 s & PS_Typedef )
d290: 7b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 {. if( (flags
d2a0: 20 26 20 28 50 53 5f 45 78 70 6f 72 74 32 7c 50 & (PS_Export2|P
d2b0: 53 5f 4c 6f 63 61 6c 32 29 29 21 3d 30 20 29 7b S_Local2))!=0 ){
d2c0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 . fprintf(s
d2d0: 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 5c 22 tderr,"%s:%d: \"
d2e0: 45 58 50 4f 52 54 5c 22 20 6f 72 20 5c 22 4c 4f EXPORT\" or \"LO
d2f0: 43 41 4c 5c 22 20 69 67 6e 6f 72 65 64 20 62 65 CAL\" ignored be
d300: 66 6f 72 65 20 74 79 70 65 64 65 66 2e 5c 6e 22 fore typedef.\n"
d310: 2c 0a 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e ,. zFilen
d320: 61 6d 65 2c 20 70 46 69 72 73 74 2d 3e 6e 4c 69 ame, pFirst->nLi
d330: 6e 65 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b ne);. nErr+
d340: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 +;. }. if(
d350: 20 28 66 6c 61 67 73 20 26 20 28 50 53 5f 49 6e (flags & (PS_In
d360: 74 65 72 66 61 63 65 7c 50 53 5f 45 78 70 6f 72 terface|PS_Expor
d370: 74 7c 50 53 5f 4c 6f 63 61 6c 7c 44 50 5f 43 70 t|PS_Local|DP_Cp
d380: 6c 75 73 70 6c 75 73 29 29 3d 3d 30 20 29 7b 0a lusplus))==0 ){.
d390: 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 69 /* It is i
d3a0: 6c 6c 65 67 61 6c 20 74 6f 20 64 75 70 6c 69 63 llegal to duplic
d3b0: 61 74 65 20 61 20 74 79 70 65 64 65 66 20 69 6e ate a typedef in
d3c0: 20 43 20 28 62 75 74 20 4f 4b 20 69 6e 20 43 2b C (but OK in C+
d3d0: 2b 29 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 +).. ** So
d3e0: 64 6f 6e 27 74 20 72 65 63 6f 72 64 20 74 79 70 don't record typ
d3f0: 65 64 65 66 73 20 74 68 61 74 20 61 72 65 6e 27 edefs that aren'
d400: 74 20 77 69 74 68 69 6e 20 61 20 43 2b 2b 20 66 t within a C++ f
d410: 69 6c 65 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 ile or. **
d420: 77 69 74 68 69 6e 20 23 69 66 20 49 4e 54 45 52 within #if INTER
d430: 46 41 43 45 2e 2e 23 65 6e 64 69 66 20 2a 2f 0a FACE..#endif */.
d440: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 return nEr
d450: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 r;. }. if(
d460: 20 28 66 6c 61 67 73 20 26 20 28 50 53 5f 49 6e (flags & (PS_In
d470: 74 65 72 66 61 63 65 7c 50 53 5f 45 78 70 6f 72 terface|PS_Expor
d480: 74 7c 50 53 5f 4c 6f 63 61 6c 29 29 3d 3d 30 20 t|PS_Local))==0
d490: 26 26 20 70 72 6f 74 6f 5f 73 74 61 74 69 63 3d && proto_static=
d4a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 =0 ){. /* I
d4b0: 67 6e 6f 72 65 20 74 79 70 65 64 65 66 73 20 74 gnore typedefs t
d4c0: 68 61 74 20 61 72 65 20 6e 6f 74 20 77 69 74 68 hat are not with
d4d0: 20 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 2e "#if INTERFACE.
d4e0: 2e 23 65 6e 64 69 66 22 20 75 6e 6c 65 73 73 0a .#endif" unless.
d4f0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 22 2d 6c ** the "-l
d500: 6f 63 61 6c 22 20 63 6f 6d 6d 61 6e 64 20 6c 69 ocal" command li
d510: 6e 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 ne option is use
d520: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 d. */. retu
d530: 72 6e 20 6e 45 72 72 3b 0a 20 20 20 20 7d 0a 20 rn nErr;. }.
d540: 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 if( (flags &
d550: 28 50 53 5f 49 6e 74 65 72 66 61 63 65 7c 50 53 (PS_Interface|PS
d560: 5f 45 78 70 6f 72 74 29 29 3d 3d 30 20 29 7b 0a _Export))==0 ){.
d570: 20 20 20 20 20 20 2f 2a 20 74 79 70 65 64 65 66 /* typedef
d580: 73 20 61 72 65 20 61 6c 77 61 79 73 20 6c 6f 63 s are always loc
d590: 61 6c 2c 20 75 6e 6c 65 73 73 20 77 69 74 68 69 al, unless withi
d5a0: 6e 20 23 69 66 20 49 4e 54 45 52 46 41 43 45 2e n #if INTERFACE.
d5b0: 2e 23 65 6e 64 69 66 20 2a 2f 0a 20 20 20 20 20 .#endif */.
d5c0: 20 69 73 4c 6f 63 61 6c 20 3d 20 31 3b 0a 20 20 isLocal = 1;.
d5d0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 }. }else if(
d5e0: 66 6c 61 67 73 20 26 20 28 50 53 5f 53 74 61 74 flags & (PS_Stat
d5f0: 69 63 7c 50 53 5f 4c 6f 63 61 6c 32 29 20 29 7b ic|PS_Local2) ){
d600: 0a 20 20 20 20 69 66 28 20 70 72 6f 74 6f 5f 73 . if( proto_s
d610: 74 61 74 69 63 3d 3d 30 20 26 26 20 28 66 6c 61 tatic==0 && (fla
d620: 67 73 20 26 20 50 53 5f 4c 6f 63 61 6c 32 29 3d gs & PS_Local2)=
d630: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 =0 ){. /* D
d640: 6f 6e 27 74 20 72 65 63 6f 72 64 20 73 74 61 74 on't record stat
d650: 69 63 20 76 61 72 69 61 62 6c 65 73 20 75 6e 6c ic variables unl
d660: 65 73 73 20 74 68 65 20 22 2d 6c 6f 63 61 6c 22 ess the "-local"
d670: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 20 20 command line.
d680: 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 77 61 ** option wa
d690: 73 20 73 70 65 63 69 66 69 65 64 20 6f 72 20 74 s specified or t
d6a0: 68 65 20 22 4c 4f 43 41 4c 22 20 6b 65 79 77 6f he "LOCAL" keywo
d6b0: 72 64 20 69 73 20 75 73 65 64 2e 20 2a 2f 0a 20 rd is used. */.
d6c0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 return nErr
d6d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c ;. }. whil
d6e0: 65 28 20 70 46 69 72 73 74 21 3d 30 20 26 26 20 e( pFirst!=0 &&
d6f0: 70 46 69 72 73 74 2d 3e 70 4e 65 78 74 21 3d 70 pFirst->pNext!=p
d700: 45 6e 64 20 26 26 0a 20 20 20 20 20 20 20 28 28 End &&. ((
d710: 70 46 69 72 73 74 2d 3e 6e 54 65 78 74 3d 3d 36 pFirst->nText==6
d720: 20 26 26 20 73 74 72 6e 63 6d 70 28 70 46 69 72 && strncmp(pFir
d730: 73 74 2d 3e 7a 54 65 78 74 2c 22 73 74 61 74 69 st->zText,"stati
d740: 63 22 2c 36 29 3d 3d 30 29 0a 20 20 20 20 20 20 c",6)==0).
d750: 20 20 7c 7c 20 28 70 46 69 72 73 74 2d 3e 6e 54 || (pFirst->nT
d760: 65 78 74 3d 3d 35 20 26 26 20 73 74 72 6e 63 6d ext==5 && strncm
d770: 70 28 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c p(pFirst->zText,
d780: 22 4c 4f 43 41 4c 22 2c 36 29 3d 3d 30 29 29 0a "LOCAL",6)==0)).
d790: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 ){. /*
d7a0: 4c 6f 73 65 20 74 68 65 20 69 6e 69 74 69 61 6c Lose the initial
d7b0: 20 22 73 74 61 74 69 63 22 20 6f 72 20 6c 6f 63 "static" or loc
d7c0: 61 6c 20 66 72 6f 6d 20 6c 6f 63 61 6c 20 76 61 al from local va
d7d0: 72 69 61 62 6c 65 73 2e 20 0a 20 20 20 20 20 20 riables. .
d7e0: 2a 2a 20 57 65 27 6c 6c 20 70 72 65 70 65 6e 64 ** We'll prepend
d7f0: 20 22 65 78 74 65 72 6e 22 20 6c 61 74 65 72 2e "extern" later.
d800: 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 72 73 74 */. pFirst
d810: 20 3d 20 70 46 69 72 73 74 2d 3e 70 4e 65 78 74 = pFirst->pNext
d820: 3b 0a 20 20 20 20 20 20 69 73 4c 6f 63 61 6c 20 ;. isLocal
d830: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 = 1;. }. i
d840: 66 28 20 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 f( pFirst==0 ||
d850: 21 69 73 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 !isLocal ){.
d860: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 return nErr;.
d870: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 }. }else if(
d880: 20 66 6c 61 67 73 20 26 20 50 53 5f 4d 65 74 68 flags & PS_Meth
d890: 6f 64 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 65 74 od ){. /* Met
d8a0: 68 6f 64 73 20 61 72 65 20 64 65 63 6c 61 72 65 hods are declare
d8b0: 64 20 62 79 20 74 68 65 69 72 20 63 6c 61 73 73 d by their class
d8c0: 2e 20 20 44 6f 6e 27 74 20 64 65 63 6c 61 72 65 . Don't declare
d8d0: 20 73 65 70 61 72 61 74 65 6c 79 2e 20 2a 2f 0a separately. */.
d8e0: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b return nErr;
d8f0: 0a 20 20 7d 0a 20 20 69 73 56 61 72 20 3d 20 20 . }. isVar =
d900: 28 66 6c 61 67 73 20 26 20 28 50 53 5f 54 79 70 (flags & (PS_Typ
d910: 65 64 65 66 7c 50 53 5f 4d 65 74 68 6f 64 29 29 edef|PS_Method))
d920: 3d 3d 30 20 26 26 20 69 73 56 61 72 69 61 62 6c ==0 && isVariabl
d930: 65 44 65 66 28 70 46 69 72 73 74 2c 70 45 6e 64 eDef(pFirst,pEnd
d940: 29 3b 0a 20 20 69 66 28 20 69 73 56 61 72 20 26 );. if( isVar &
d950: 26 20 28 66 6c 61 67 73 20 26 20 28 50 53 5f 49 & (flags & (PS_I
d960: 6e 74 65 72 66 61 63 65 7c 50 53 5f 45 78 70 6f nterface|PS_Expo
d970: 72 74 7c 50 53 5f 4c 6f 63 61 6c 29 29 21 3d 30 rt|PS_Local))!=0
d980: 20 0a 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 . && (flags &
d990: 50 53 5f 45 78 74 65 72 6e 29 3d 3d 30 20 29 7b PS_Extern)==0 ){
d9a0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 . fprintf(std
d9b0: 65 72 72 2c 22 25 73 3a 25 64 3a 20 43 61 6e 27 err,"%s:%d: Can'
d9c0: 74 20 64 65 66 69 6e 65 20 61 20 76 61 72 69 61 t define a varia
d9d0: 62 6c 65 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 ble in this cont
d9e0: 65 78 74 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 46 ext\n",. zF
d9f0: 69 6c 65 6e 61 6d 65 2c 20 70 46 69 72 73 74 2d ilename, pFirst-
da00: 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 6e 45 72 >nLine);. nEr
da10: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 4e 61 6d 65 r++;. }. pName
da20: 20 3d 20 46 69 6e 64 44 65 63 6c 4e 61 6d 65 28 = FindDeclName(
da30: 70 46 69 72 73 74 2c 70 45 6e 64 2d 3e 70 50 72 pFirst,pEnd->pPr
da40: 65 76 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 ev);. if( pName
da50: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e ==0 ){. fprin
da60: 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 tf(stderr,"%s:%d
da70: 3a 20 43 61 6e 27 74 20 66 69 6e 64 20 61 20 6e : Can't find a n
da80: 61 6d 65 20 66 6f 72 20 74 68 65 20 6f 62 6a 65 ame for the obje
da90: 63 74 20 64 65 63 6c 61 72 65 64 20 68 65 72 65 ct declared here
daa0: 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 46 69 6c .\n",. zFil
dab0: 65 6e 61 6d 65 2c 20 70 46 69 72 73 74 2d 3e 6e ename, pFirst->n
dac0: 4c 69 6e 65 29 3b 0a 20 20 20 20 72 65 74 75 72 Line);. retur
dad0: 6e 20 6e 45 72 72 2b 31 3b 0a 20 20 7d 0a 0a 23 n nErr+1;. }..#
dae0: 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 69 66 ifdef DEBUG. if
daf0: 28 20 64 65 62 75 67 4d 61 73 6b 20 26 20 50 41 ( debugMask & PA
db00: 52 53 45 52 20 29 7b 0a 20 20 20 20 69 66 28 20 RSER ){. if(
db10: 66 6c 61 67 73 20 26 20 50 53 5f 54 79 70 65 64 flags & PS_Typed
db20: 65 66 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e ef ){. prin
db30: 74 66 28 22 2a 2a 2a 2a 20 46 6f 75 6e 64 20 74 tf("**** Found t
db40: 79 70 65 64 65 66 20 25 2e 2a 73 20 61 74 20 6c ypedef %.*s at l
db50: 69 6e 65 20 25 64 2e 2e 2e 5c 6e 22 2c 0a 20 20 ine %d...\n",.
db60: 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 6e 54 65 pName->nTe
db70: 78 74 2c 20 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 xt, pName->zText
db80: 2c 20 70 4e 61 6d 65 2d 3e 6e 4c 69 6e 65 29 3b , pName->nLine);
db90: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 . }else if( i
dba0: 73 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 72 sVar ){. pr
dbb0: 69 6e 74 66 28 22 2a 2a 2a 2a 20 46 6f 75 6e 64 intf("**** Found
dbc0: 20 76 61 72 69 61 62 6c 65 20 25 2e 2a 73 20 61 variable %.*s a
dbd0: 74 20 6c 69 6e 65 20 25 64 2e 2e 2e 5c 6e 22 2c t line %d...\n",
dbe0: 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e . pName->
dbf0: 6e 54 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 7a 54 nText, pName->zT
dc00: 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 6e 4c 69 6e ext, pName->nLin
dc10: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 e);. }else{.
dc20: 20 20 20 20 20 70 72 69 6e 74 66 28 22 2a 2a 2a printf("***
dc30: 2a 20 46 6f 75 6e 64 20 70 72 6f 74 6f 74 79 70 * Found prototyp
dc40: 65 20 25 2e 2a 73 20 61 74 20 6c 69 6e 65 20 25 e %.*s at line %
dc50: 64 2e 2e 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 d...\n",.
dc60: 20 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 2c 20 70 pName->nText, p
dc70: 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 20 70 4e 61 Name->zText, pNa
dc80: 6d 65 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 me->nLine);.
dc90: 7d 0a 20 20 20 20 50 72 69 6e 74 54 6f 6b 65 6e }. PrintToken
dca0: 73 28 70 46 69 72 73 74 2c 70 45 6e 64 2d 3e 70 s(pFirst,pEnd->p
dcb0: 50 72 65 76 29 3b 0a 20 20 20 20 70 72 69 6e 74 Prev);. print
dcc0: 66 28 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 f(";\n");. }.#e
dcd0: 6e 64 69 66 0a 0a 20 20 70 44 65 63 6c 20 3d 20 ndif.. pDecl =
dce0: 43 72 65 61 74 65 44 65 63 6c 28 70 4e 61 6d 65 CreateDecl(pName
dcf0: 2d 3e 7a 54 65 78 74 2c 70 4e 61 6d 65 2d 3e 6e ->zText,pName->n
dd00: 54 65 78 74 29 3b 0a 20 20 69 66 28 20 28 66 6c Text);. if( (fl
dd10: 61 67 73 20 26 20 50 53 5f 54 79 70 65 64 65 66 ags & PS_Typedef
dd20: 29 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 ) ){. DeclSet
dd30: 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 20 Property(pDecl,
dd40: 54 59 5f 54 79 70 65 64 65 66 29 3b 0a 20 20 7d TY_Typedef);. }
dd50: 65 6c 73 65 20 69 66 28 20 69 73 56 61 72 20 29 else if( isVar )
dd60: 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f {. DeclSetPro
dd70: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 perty(pDecl,DP_E
dd80: 78 74 65 72 6e 52 65 71 64 20 7c 20 54 59 5f 56 xternReqd | TY_V
dd90: 61 72 69 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 ariable);. if
dda0: 28 20 21 28 66 6c 61 67 73 20 26 20 44 50 5f 43 ( !(flags & DP_C
ddb0: 70 6c 75 73 70 6c 75 73 29 20 29 7b 0a 20 20 20 plusplus) ){.
ddc0: 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72 DeclSetProper
ddd0: 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 78 74 65 ty(pDecl,DP_Exte
dde0: 72 6e 43 52 65 71 64 29 3b 0a 20 20 20 20 7d 0a rnCReqd);. }.
ddf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 44 65 63 }else{. Dec
de00: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 lSetProperty(pDe
de10: 63 6c 2c 20 54 59 5f 53 75 62 72 6f 75 74 69 6e cl, TY_Subroutin
de20: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 28 66 6c e);. if( !(fl
de30: 61 67 73 20 26 20 44 50 5f 43 70 6c 75 73 70 6c ags & DP_Cpluspl
de40: 75 73 29 20 29 7b 0a 20 20 20 20 20 20 44 65 63 us) ){. Dec
de50: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 lSetProperty(pDe
de60: 63 6c 2c 44 50 5f 45 78 74 65 72 6e 43 52 65 71 cl,DP_ExternCReq
de70: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 d);. }. }.
de80: 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20 pDecl->pComment
de90: 3d 20 70 46 69 72 73 74 2d 3e 70 43 6f 6d 6d 65 = pFirst->pComme
dea0: 6e 74 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a 44 65 nt;. pDecl->zDe
deb0: 63 6c 20 3d 20 54 6f 6b 65 6e 73 54 6f 53 74 72 cl = TokensToStr
dec0: 69 6e 67 28 70 46 69 72 73 74 2c 70 45 6e 64 2d ing(pFirst,pEnd-
ded0: 3e 70 50 72 65 76 2c 22 3b 5c 6e 22 2c 30 2c 30 >pPrev,";\n",0,0
dee0: 29 3b 0a 20 20 69 66 28 20 69 73 4c 6f 63 61 6c );. if( isLocal
def0: 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 28 50 53 || (flags & (PS
df00: 5f 4c 6f 63 61 6c 7c 50 53 5f 4c 6f 63 61 6c 32 _Local|PS_Local2
df10: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 44 65 63 ))!=0 ){. Dec
df20: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 lSetProperty(pDe
df30: 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29 3b 0a 20 20 cl,DP_Local);.
df40: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 }else if( flags
df50: 26 20 28 50 53 5f 45 78 70 6f 72 74 7c 50 53 5f & (PS_Export|PS_
df60: 45 78 70 6f 72 74 32 29 20 29 7b 0a 20 20 20 20 Export2) ){.
df70: 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 DeclSetProperty(
df80: 70 44 65 63 6c 2c 44 50 5f 45 78 70 6f 72 74 29 pDecl,DP_Export)
df90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 ;. }. if( flag
dfa0: 73 20 26 20 44 50 5f 43 70 6c 75 73 70 6c 75 73 s & DP_Cplusplus
dfb0: 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 ){. DeclSetP
dfc0: 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 roperty(pDecl,DP
dfd0: 5f 43 70 6c 75 73 70 6c 75 73 29 3b 0a 20 20 7d _Cplusplus);. }
dfe0: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a . return nErr;.
dff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 6e }../*.** Push an
e000: 20 69 66 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 6e if condition on
e010: 74 6f 20 74 68 65 20 69 66 20 73 74 61 63 6b 0a to the if stack.
e020: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 50 */.static void P
e030: 75 73 68 49 66 4d 61 63 72 6f 28 0a 20 20 63 6f ushIfMacro(. co
e040: 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 66 69 nst char *zPrefi
e050: 78 2c 20 20 20 20 20 20 2f 2a 20 41 20 70 72 65 x, /* A pre
e060: 66 69 78 2c 20 6c 69 6b 65 20 22 64 65 66 69 6e fix, like "defin
e070: 65 22 20 6f 72 20 22 21 22 20 2a 2f 0a 20 20 63 e" or "!" */. c
e080: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 onst char *zText
e090: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 , /* The
e0a0: 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 condition */. i
e0b0: 6e 74 20 6e 54 65 78 74 2c 20 20 20 20 20 20 20 nt nText,
e0c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
e0d0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 er of characters
e0e0: 20 69 6e 20 7a 54 65 78 74 20 2a 2f 0a 20 20 69 in zText */. i
e0f0: 6e 74 20 6e 4c 69 6e 65 2c 20 20 20 20 20 20 20 nt nLine,
e100: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 /* Line
e110: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 number where th
e120: 69 73 20 6d 61 63 72 6f 20 6f 63 63 75 72 73 20 is macro occurs
e130: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 */. int flags
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
e150: 2a 20 45 69 74 68 65 72 20 30 2c 20 50 53 5f 49 * Either 0, PS_I
e160: 6e 74 65 72 66 61 63 65 2c 20 50 53 5f 45 78 70 nterface, PS_Exp
e170: 6f 72 74 20 6f 72 20 50 53 5f 4c 6f 63 61 6c 20 ort or PS_Local
e180: 2a 2f 0a 29 7b 0a 20 20 49 66 6d 61 63 72 6f 20 */.){. Ifmacro
e190: 2a 70 49 66 3b 0a 20 20 69 6e 74 20 6e 42 79 74 *pIf;. int nByt
e1a0: 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 e;.. nByte = si
e1b0: 7a 65 6f 66 28 49 66 6d 61 63 72 6f 29 3b 0a 20 zeof(Ifmacro);.
e1c0: 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 if( zText ){.
e1d0: 20 20 69 66 28 20 7a 50 72 65 66 69 78 20 29 7b if( zPrefix ){
e1e0: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 . nByte +=
e1f0: 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78 29 20 strlen(zPrefix)
e200: 2b 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e + 2;. }. n
e210: 42 79 74 65 20 2b 3d 20 6e 54 65 78 74 20 2b 20 Byte += nText +
e220: 31 3b 0a 20 20 7d 0a 20 20 70 49 66 20 3d 20 53 1;. }. pIf = S
e230: 61 66 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 afeMalloc( nByte
e240: 20 29 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 20 );. if( zText
e250: 29 7b 0a 20 20 20 20 70 49 66 2d 3e 7a 43 6f 6e ){. pIf->zCon
e260: 64 69 74 69 6f 6e 20 3d 20 28 63 68 61 72 2a 29 dition = (char*)
e270: 26 70 49 66 5b 31 5d 3b 0a 20 20 20 20 69 66 28 &pIf[1];. if(
e280: 20 7a 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 zPrefix ){.
e290: 20 20 73 70 72 69 6e 74 66 28 70 49 66 2d 3e 7a sprintf(pIf->z
e2a0: 43 6f 6e 64 69 74 69 6f 6e 2c 22 25 73 28 25 2e Condition,"%s(%.
e2b0: 2a 73 29 22 2c 7a 50 72 65 66 69 78 2c 6e 54 65 *s)",zPrefix,nTe
e2c0: 78 74 2c 7a 54 65 78 74 29 3b 0a 20 20 20 20 7d xt,zText);. }
e2d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 70 72 69 else{. spri
e2e0: 6e 74 66 28 70 49 66 2d 3e 7a 43 6f 6e 64 69 74 ntf(pIf->zCondit
e2f0: 69 6f 6e 2c 22 25 2e 2a 73 22 2c 6e 54 65 78 74 ion,"%.*s",nText
e300: 2c 7a 54 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 ,zText);. }.
e310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 66 2d }else{. pIf-
e320: 3e 7a 43 6f 6e 64 69 74 69 6f 6e 20 3d 20 30 3b >zCondition = 0;
e330: 0a 20 20 7d 0a 20 20 70 49 66 2d 3e 6e 4c 69 6e . }. pIf->nLin
e340: 65 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 70 49 66 e = nLine;. pIf
e350: 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b ->flags = flags;
e360: 0a 20 20 70 49 66 2d 3e 70 4e 65 78 74 20 3d 20 . pIf->pNext =
e370: 69 66 53 74 61 63 6b 3b 0a 20 20 69 66 53 74 61 ifStack;. ifSta
e380: 63 6b 20 3d 20 70 49 66 3b 0a 7d 0a 0a 2f 2a 0a ck = pIf;.}../*.
e390: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
e3a0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e is called to han
e3b0: 64 6c 65 20 61 6c 6c 20 70 72 65 70 72 6f 63 65 dle all preproce
e3c0: 73 73 6f 72 20 64 69 72 65 63 74 69 76 65 73 2e ssor directives.
e3d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 .**.** This rout
e3e0: 69 6e 65 20 77 69 6c 6c 20 72 65 63 6f 6d 70 75 ine will recompu
e3f0: 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 te the value of
e400: 2a 70 50 72 65 73 65 74 46 6c 61 67 73 20 74 6f *pPresetFlags to
e410: 20 62 65 20 74 68 65 0a 2a 2a 20 6c 6f 67 69 63 be the.** logic
e420: 61 6c 20 6f 72 20 6f 66 20 61 6c 6c 20 66 6c 61 al or of all fla
e430: 67 73 20 6f 6e 20 61 6c 6c 20 6e 65 73 74 65 64 gs on all nested
e440: 20 23 69 66 73 2e 20 20 54 68 65 20 23 69 66 73 #ifs. The #ifs
e450: 20 74 68 61 74 20 73 65 74 20 66 6c 61 67 73 0a that set flags.
e460: 2a 2a 20 61 72 65 20 61 73 20 66 6f 6c 6c 6f 77 ** are as follow
e470: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 s:.**.**
e480: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 20 20 20 20 conditional
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c fl
e4a0: 61 67 20 73 65 74 0a 2a 2a 20 20 20 20 20 20 20 ag set.**
e4b0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
e4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 2d --------- -
e4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e4e0: 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 20 20 23 69 ---.** #i
e4f0: 66 20 49 4e 54 45 52 46 41 43 45 20 20 20 20 20 f INTERFACE
e500: 20 20 20 20 20 20 20 20 20 20 20 20 50 53 5f 49 PS_I
e510: 6e 74 65 72 66 61 63 65 0a 2a 2a 20 20 20 20 20 nterface.**
e520: 20 20 20 23 69 66 20 45 58 50 4f 52 54 5f 49 4e #if EXPORT_IN
e530: 54 45 52 46 41 43 45 20 20 20 20 20 20 20 20 20 TERFACE
e540: 20 50 53 5f 45 78 70 6f 72 74 0a 2a 2a 20 20 20 PS_Export.**
e550: 20 20 20 20 20 23 69 66 20 4c 4f 43 41 4c 5f 49 #if LOCAL_I
e560: 4e 54 45 52 46 41 43 45 20 20 20 20 20 20 20 20 NTERFACE
e570: 20 20 20 50 53 5f 4c 6f 63 61 6c 0a 2a 2a 0a 2a PS_Local.**.*
e580: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 * For example, i
e590: 66 20 61 66 74 65 72 20 70 72 6f 63 65 73 73 69 f after processi
e5a0: 6e 67 20 74 68 65 20 70 72 65 70 72 6f 63 65 73 ng the preproces
e5b0: 73 6f 72 20 74 6f 6b 65 6e 20 67 69 76 65 6e 0a sor token given.
e5c0: 2a 2a 20 62 79 20 70 54 6f 6b 65 6e 20 74 68 65 ** by pToken the
e5d0: 72 65 20 69 73 20 61 6e 20 22 23 69 66 20 49 4e re is an "#if IN
e5e0: 54 45 52 46 41 43 45 22 20 6f 6e 20 74 68 65 20 TERFACE" on the
e5f0: 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 2a 2a 20 preprocessor.**
e600: 73 74 61 63 6b 2c 20 74 68 65 6e 20 2a 70 50 72 stack, then *pPr
e610: 65 73 65 74 46 6c 61 67 73 20 77 69 6c 6c 20 62 esetFlags will b
e620: 65 20 73 65 74 20 74 6f 20 50 53 5f 49 6e 74 65 e set to PS_Inte
e630: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 rface..*/.static
e640: 20 69 6e 74 20 50 61 72 73 65 50 72 65 70 72 6f int ParsePrepro
e650: 63 65 73 73 6f 72 28 54 6f 6b 65 6e 20 2a 70 54 cessor(Token *pT
e660: 6f 6b 65 6e 2c 20 69 6e 74 20 66 6c 61 67 73 2c oken, int flags,
e670: 20 69 6e 74 20 2a 70 50 72 65 73 65 74 46 6c 61 int *pPresetFla
e680: 67 73 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 gs){. const cha
e690: 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 6e 74 20 6e r *zCmd;. int n
e6a0: 43 6d 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 Cmd;. const cha
e6b0: 72 20 2a 7a 41 72 67 3b 0a 20 20 69 6e 74 20 6e r *zArg;. int n
e6c0: 41 72 67 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 Arg;. int nErr
e6d0: 3d 20 30 3b 0a 20 20 49 66 6d 61 63 72 6f 20 2a = 0;. Ifmacro *
e6e0: 70 49 66 3b 0a 0a 20 20 7a 43 6d 64 20 3d 20 26 pIf;.. zCmd = &
e6f0: 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 5b 31 5d pToken->zText[1]
e700: 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 ;. while( isspa
e710: 63 65 28 2a 7a 43 6d 64 29 20 26 26 20 2a 7a 43 ce(*zCmd) && *zC
e720: 6d 64 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 md!='\n' ){.
e730: 7a 43 6d 64 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 zCmd++;. }. if
e740: 28 20 21 69 73 61 6c 70 68 61 28 2a 7a 43 6d 64 ( !isalpha(*zCmd
e750: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 ) ){. return
e760: 30 3b 0a 20 20 7d 0a 20 20 6e 43 6d 64 20 3d 20 0;. }. nCmd =
e770: 31 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 61 6c 1;. while( isal
e780: 70 68 61 28 7a 43 6d 64 5b 6e 43 6d 64 5d 29 20 pha(zCmd[nCmd])
e790: 29 7b 0a 20 20 20 20 6e 43 6d 64 2b 2b 3b 0a 20 ){. nCmd++;.
e7a0: 20 7d 0a 0a 20 20 69 66 28 20 6e 43 6d 64 3d 3d }.. if( nCmd==
e7b0: 35 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 43 6d 5 && strncmp(zCm
e7c0: 64 2c 22 65 6e 64 69 66 22 2c 35 29 3d 3d 30 20 d,"endif",5)==0
e7d0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a ){. /*. **
e7e0: 20 50 6f 70 20 74 68 65 20 69 66 20 73 74 61 63 Pop the if stac
e7f0: 6b 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 k . */. pI
e800: 66 20 3d 20 69 66 53 74 61 63 6b 3b 0a 20 20 20 f = ifStack;.
e810: 20 69 66 28 20 70 49 66 3d 3d 30 20 29 7b 0a 20 if( pIf==0 ){.
e820: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 fprintf(std
e830: 65 72 72 2c 22 25 73 3a 25 64 3a 20 65 78 74 72 err,"%s:%d: extr
e840: 61 20 27 23 65 6e 64 69 66 27 2e 5c 6e 22 2c 7a a '#endif'.\n",z
e850: 46 69 6c 65 6e 61 6d 65 2c 70 54 6f 6b 65 6e 2d Filename,pToken-
e860: 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 72 >nLine);. r
e870: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 eturn 1;. }.
e880: 20 20 20 69 66 53 74 61 63 6b 20 3d 20 70 49 66 ifStack = pIf
e890: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 53 61 66 ->pNext;. Saf
e8a0: 65 46 72 65 65 28 70 49 66 29 3b 0a 20 20 7d 65 eFree(pIf);. }e
e8b0: 6c 73 65 20 69 66 28 20 6e 43 6d 64 3d 3d 36 20 lse if( nCmd==6
e8c0: 26 26 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c && strncmp(zCmd,
e8d0: 22 64 65 66 69 6e 65 22 2c 36 29 3d 3d 30 20 29 "define",6)==0 )
e8e0: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 {. /*. **
e8f0: 52 65 63 6f 72 64 20 61 20 23 64 65 66 69 6e 65 Record a #define
e900: 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 50 53 if we are in PS
e910: 5f 49 6e 74 65 72 66 61 63 65 20 6f 72 20 50 53 _Interface or PS
e920: 5f 45 78 70 6f 72 74 20 0a 20 20 20 20 2a 2f 0a _Export . */.
e930: 20 20 20 20 44 65 63 6c 20 2a 70 44 65 63 6c 3b Decl *pDecl;
e940: 0a 20 20 20 20 69 66 28 20 21 28 66 6c 61 67 73 . if( !(flags
e950: 20 26 20 28 50 53 5f 4c 6f 63 61 6c 7c 50 53 5f & (PS_Local|PS_
e960: 49 6e 74 65 72 66 61 63 65 7c 50 53 5f 45 78 70 Interface|PS_Exp
e970: 6f 72 74 29 29 20 29 7b 20 72 65 74 75 72 6e 20 ort)) ){ return
e980: 30 3b 20 7d 0a 20 20 20 20 7a 41 72 67 20 3d 20 0; }. zArg =
e990: 26 7a 43 6d 64 5b 36 5d 3b 0a 20 20 20 20 77 68 &zCmd[6];. wh
e9a0: 69 6c 65 28 20 2a 7a 41 72 67 20 26 26 20 69 73 ile( *zArg && is
e9b0: 73 70 61 63 65 28 2a 7a 41 72 67 29 20 26 26 20 space(*zArg) &&
e9c0: 2a 7a 41 72 67 21 3d 27 5c 6e 27 20 29 7b 0a 20 *zArg!='\n' ){.
e9d0: 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 zArg++;.
e9e0: 20 7d 0a 20 20 20 20 69 66 28 20 2a 7a 41 72 67 }. if( *zArg
e9f0: 3d 3d 30 20 7c 7c 20 2a 7a 41 72 67 3d 3d 27 5c ==0 || *zArg=='\
ea00: 6e 27 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 n' ){ return 0;
ea10: 7d 0a 20 20 20 20 66 6f 72 28 6e 41 72 67 3d 30 }. for(nArg=0
ea20: 3b 20 49 53 41 4c 4e 55 4d 28 7a 41 72 67 5b 6e ; ISALNUM(zArg[n
ea30: 41 72 67 5d 29 3b 20 6e 41 72 67 2b 2b 29 7b 7d Arg]); nArg++){}
ea40: 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 . if( nArg==0
ea50: 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a ){ return 0; }.
ea60: 20 20 20 20 70 44 65 63 6c 20 3d 20 43 72 65 61 pDecl = Crea
ea70: 74 65 44 65 63 6c 28 7a 41 72 67 2c 6e 41 72 67 teDecl(zArg,nArg
ea80: 29 3b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 70 43 );. pDecl->pC
ea90: 6f 6d 6d 65 6e 74 20 3d 20 70 54 6f 6b 65 6e 2d omment = pToken-
eaa0: 3e 70 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 44 >pComment;. D
eab0: 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 eclSetProperty(p
eac0: 44 65 63 6c 2c 54 59 5f 4d 61 63 72 6f 29 3b 0a Decl,TY_Macro);.
ead0: 20 20 20 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c pDecl->zDecl
eae0: 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 70 = SafeMalloc( p
eaf0: 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 2b 20 32 Token->nText + 2
eb00: 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 );. sprintf(
eb10: 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 2c 22 25 2e pDecl->zDecl,"%.
eb20: 2a 73 5c 6e 22 2c 70 54 6f 6b 65 6e 2d 3e 6e 54 *s\n",pToken->nT
eb30: 65 78 74 2c 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 ext,pToken->zTex
eb40: 74 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 t);. if( flag
eb50: 73 20 26 20 50 53 5f 45 78 70 6f 72 74 20 29 7b s & PS_Export ){
eb60: 0a 20 20 20 20 20 20 44 65 63 6c 53 65 74 50 72 . DeclSetPr
eb70: 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f operty(pDecl,DP_
eb80: 45 78 70 6f 72 74 29 3b 0a 20 20 20 20 7d 65 6c Export);. }el
eb90: 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 se if( flags & P
eba0: 53 5f 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 S_Local ){.
ebb0: 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 DeclSetProperty
ebc0: 28 70 44 65 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29 (pDecl,DP_Local)
ebd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 ;. }. }else
ebe0: 69 66 28 20 6e 43 6d 64 3d 3d 37 20 26 26 20 73 if( nCmd==7 && s
ebf0: 74 72 6e 63 6d 70 28 7a 43 6d 64 2c 22 69 6e 63 trncmp(zCmd,"inc
ec00: 6c 75 64 65 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 lude",7)==0 ){.
ec10: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 63 /*. ** Rec
ec20: 6f 72 64 20 61 6e 20 23 69 6e 63 6c 75 64 65 20 ord an #include
ec30: 69 66 20 77 65 20 61 72 65 20 69 6e 20 50 53 5f if we are in PS_
ec40: 49 6e 74 65 72 66 61 63 65 20 6f 72 20 50 53 5f Interface or PS_
ec50: 45 78 70 6f 72 74 20 0a 20 20 20 20 2a 2f 0a 20 Export . */.
ec60: 20 20 20 49 6e 63 6c 75 64 65 20 2a 70 49 6e 63 Include *pInc
ec70: 6c 75 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a lude;. char *
ec80: 7a 49 66 3b 0a 0a 20 20 20 20 69 66 28 20 21 28 zIf;.. if( !(
ec90: 66 6c 61 67 73 20 26 20 28 50 53 5f 49 6e 74 65 flags & (PS_Inte
eca0: 72 66 61 63 65 7c 50 53 5f 45 78 70 6f 72 74 29 rface|PS_Export)
ecb0: 29 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d ) ){ return 0; }
ecc0: 0a 20 20 20 20 7a 41 72 67 20 3d 20 26 7a 43 6d . zArg = &zCm
ecd0: 64 5b 37 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 d[7];. while(
ece0: 20 2a 7a 41 72 67 20 26 26 20 69 73 73 70 61 63 *zArg && isspac
ecf0: 65 28 2a 7a 41 72 67 29 20 29 7b 20 7a 41 72 67 e(*zArg) ){ zArg
ed00: 2b 2b 3b 20 7d 0a 20 20 20 20 66 6f 72 28 6e 41 ++; }. for(nA
ed10: 72 67 3d 30 3b 20 21 69 73 73 70 61 63 65 28 7a rg=0; !isspace(z
ed20: 41 72 67 5b 6e 41 72 67 5d 29 3b 20 6e 41 72 67 Arg[nArg]); nArg
ed30: 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 28 7a ++){}. if( (z
ed40: 41 72 67 5b 30 5d 3d 3d 27 22 27 20 26 26 20 7a Arg[0]=='"' && z
ed50: 41 72 67 5b 6e 41 72 67 2d 31 5d 21 3d 27 22 27 Arg[nArg-1]!='"'
ed60: 29 0a 20 20 20 20 20 20 7c 7c 28 7a 41 72 67 5b ). ||(zArg[
ed70: 30 5d 3d 3d 27 3c 27 20 26 26 20 7a 41 72 67 5b 0]=='<' && zArg[
ed80: 6e 41 72 67 2d 31 5d 21 3d 27 3e 27 29 0a 20 20 nArg-1]!='>').
ed90: 20 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e ){. fprin
eda0: 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 tf(stderr,"%s:%d
edb0: 3a 20 6d 61 6c 66 6f 72 6d 65 64 20 23 69 6e 63 : malformed #inc
edc0: 6c 75 64 65 20 73 74 61 74 65 6d 65 6e 74 2e 5c lude statement.\
edd0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 7a 46 69 6c n",. zFil
ede0: 65 6e 61 6d 65 2c 70 54 6f 6b 65 6e 2d 3e 6e 4c ename,pToken->nL
edf0: 69 6e 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 ine);. retu
ee00: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rn 1;. }.
ee10: 7a 49 66 20 3d 20 47 65 74 49 66 53 74 72 69 6e zIf = GetIfStrin
ee20: 67 28 29 3b 0a 20 20 20 20 69 66 28 20 7a 49 66 g();. if( zIf
ee30: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 63 6c 75 ){. pInclu
ee40: 64 65 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 de = SafeMalloc(
ee50: 20 73 69 7a 65 6f 66 28 49 6e 63 6c 75 64 65 29 sizeof(Include)
ee60: 20 2b 20 6e 41 72 67 2a 32 20 2b 20 73 74 72 6c + nArg*2 + strl
ee70: 65 6e 28 7a 49 66 29 20 2b 20 31 30 20 29 3b 0a en(zIf) + 10 );.
ee80: 20 20 20 20 20 20 70 49 6e 63 6c 75 64 65 2d 3e pInclude->
ee90: 7a 46 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 26 zFile = (char*)&
eea0: 70 49 6e 63 6c 75 64 65 5b 31 5d 3b 0a 20 20 20 pInclude[1];.
eeb0: 20 20 20 70 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61 pInclude->zLa
eec0: 62 65 6c 20 3d 20 26 70 49 6e 63 6c 75 64 65 2d bel = &pInclude-
eed0: 3e 7a 46 69 6c 65 5b 6e 41 72 67 2b 31 5d 3b 0a >zFile[nArg+1];.
eee0: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 70 49 sprintf(pI
eef0: 6e 63 6c 75 64 65 2d 3e 7a 46 69 6c 65 2c 22 25 nclude->zFile,"%
ef00: 2e 2a 73 22 2c 6e 41 72 67 2c 7a 41 72 67 29 3b .*s",nArg,zArg);
ef10: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 70 . sprintf(p
ef20: 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61 62 65 6c 2c Include->zLabel,
ef30: 22 25 2e 2a 73 3a 25 73 22 2c 6e 41 72 67 2c 7a "%.*s:%s",nArg,z
ef40: 41 72 67 2c 7a 49 66 29 3b 0a 20 20 20 20 20 20 Arg,zIf);.
ef50: 70 49 6e 63 6c 75 64 65 2d 3e 7a 49 66 20 3d 20 pInclude->zIf =
ef60: 26 70 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61 62 65 &pInclude->zLabe
ef70: 6c 5b 6e 41 72 67 2b 31 5d 3b 0a 20 20 20 20 20 l[nArg+1];.
ef80: 20 53 61 66 65 46 72 65 65 28 7a 49 66 29 3b 0a SafeFree(zIf);.
ef90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
efa0: 20 70 49 6e 63 6c 75 64 65 20 3d 20 53 61 66 65 pInclude = Safe
efb0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 Malloc( sizeof(I
efc0: 6e 63 6c 75 64 65 29 20 2b 20 6e 41 72 67 20 2b nclude) + nArg +
efd0: 20 31 20 29 3b 0a 20 20 20 20 20 20 70 49 6e 63 1 );. pInc
efe0: 6c 75 64 65 2d 3e 7a 46 69 6c 65 20 3d 20 28 63 lude->zFile = (c
eff0: 68 61 72 2a 29 26 70 49 6e 63 6c 75 64 65 5b 31 har*)&pInclude[1
f000: 5d 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 ];. sprintf
f010: 28 70 49 6e 63 6c 75 64 65 2d 3e 7a 46 69 6c 65 (pInclude->zFile
f020: 2c 22 25 2e 2a 73 22 2c 6e 41 72 67 2c 7a 41 72 ,"%.*s",nArg,zAr
f030: 67 29 3b 0a 20 20 20 20 20 20 70 49 6e 63 6c 75 g);. pInclu
f040: 64 65 2d 3e 7a 49 66 20 3d 20 30 3b 0a 20 20 20 de->zIf = 0;.
f050: 20 20 20 70 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61 pInclude->zLa
f060: 62 65 6c 20 3d 20 70 49 6e 63 6c 75 64 65 2d 3e bel = pInclude->
f070: 7a 46 69 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 zFile;. }.
f080: 20 70 49 6e 63 6c 75 64 65 2d 3e 70 4e 65 78 74 pInclude->pNext
f090: 20 3d 20 69 6e 63 6c 75 64 65 4c 69 73 74 3b 0a = includeList;.
f0a0: 20 20 20 20 69 6e 63 6c 75 64 65 4c 69 73 74 20 includeList
f0b0: 3d 20 70 49 6e 63 6c 75 64 65 3b 0a 20 20 7d 65 = pInclude;. }e
f0c0: 6c 73 65 20 69 66 28 20 6e 43 6d 64 3d 3d 32 20 lse if( nCmd==2
f0d0: 26 26 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c && strncmp(zCmd,
f0e0: 22 69 66 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 "if",2)==0 ){.
f0f0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 75 73 68 /*. ** Push
f100: 20 61 6e 20 23 69 66 2e 20 20 57 61 74 63 68 20 an #if. Watch
f110: 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 for the special
f120: 63 61 73 65 73 20 6f 66 20 49 4e 54 45 52 46 41 cases of INTERFA
f130: 43 45 0a 20 20 20 20 2a 2a 20 61 6e 64 20 45 58 CE. ** and EX
f140: 50 4f 52 54 5f 49 4e 54 45 52 46 41 43 45 20 61 PORT_INTERFACE a
f150: 6e 64 20 4c 4f 43 41 4c 5f 49 4e 54 45 52 46 41 nd LOCAL_INTERFA
f160: 43 45 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 41 CE. */. zA
f170: 72 67 20 3d 20 26 7a 43 6d 64 5b 32 5d 3b 0a 20 rg = &zCmd[2];.
f180: 20 20 20 77 68 69 6c 65 28 20 2a 7a 41 72 67 20 while( *zArg
f190: 26 26 20 69 73 73 70 61 63 65 28 2a 7a 41 72 67 && isspace(*zArg
f1a0: 29 20 26 26 20 2a 7a 41 72 67 21 3d 27 5c 6e 27 ) && *zArg!='\n'
f1b0: 20 29 7b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b ){. zArg++
f1c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
f1d0: 2a 7a 41 72 67 3d 3d 30 20 7c 7c 20 2a 7a 41 72 *zArg==0 || *zAr
f1e0: 67 3d 3d 27 5c 6e 27 20 29 7b 20 72 65 74 75 72 g=='\n' ){ retur
f1f0: 6e 20 30 3b 20 7d 0a 20 20 20 20 6e 41 72 67 20 n 0; }. nArg
f200: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 = pToken->nText
f210: 2b 20 28 69 6e 74 29 70 54 6f 6b 65 6e 2d 3e 7a + (int)pToken->z
f220: 54 65 78 74 20 2d 20 28 69 6e 74 29 7a 41 72 67 Text - (int)zArg
f230: 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d ;. if( nArg==
f240: 39 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 41 72 9 && strncmp(zAr
f250: 67 2c 22 49 4e 54 45 52 46 41 43 45 22 2c 39 29 g,"INTERFACE",9)
f260: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 50 75 73 ==0 ){. Pus
f270: 68 49 66 4d 61 63 72 6f 28 30 2c 30 2c 30 2c 70 hIfMacro(0,0,0,p
f280: 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 50 53 5f Token->nLine,PS_
f290: 49 6e 74 65 72 66 61 63 65 29 3b 0a 20 20 20 20 Interface);.
f2a0: 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d }else if( nArg==
f2b0: 31 36 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 41 16 && strncmp(zA
f2c0: 72 67 2c 22 45 58 50 4f 52 54 5f 49 4e 54 45 52 rg,"EXPORT_INTER
f2d0: 46 41 43 45 22 2c 31 36 29 3d 3d 30 20 29 7b 0a FACE",16)==0 ){.
f2e0: 20 20 20 20 20 20 50 75 73 68 49 66 4d 61 63 72 PushIfMacr
f2f0: 6f 28 30 2c 30 2c 30 2c 70 54 6f 6b 65 6e 2d 3e o(0,0,0,pToken->
f300: 6e 4c 69 6e 65 2c 50 53 5f 45 78 70 6f 72 74 29 nLine,PS_Export)
f310: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 ;. }else if(
f320: 6e 41 72 67 3d 3d 31 35 20 26 26 20 73 74 72 6e nArg==15 && strn
f330: 63 6d 70 28 7a 41 72 67 2c 22 4c 4f 43 41 4c 5f cmp(zArg,"LOCAL_
f340: 49 4e 54 45 52 46 41 43 45 22 2c 31 35 29 3d 3d INTERFACE",15)==
f350: 30 20 29 7b 0a 20 20 20 20 20 20 50 75 73 68 49 0 ){. PushI
f360: 66 4d 61 63 72 6f 28 30 2c 30 2c 30 2c 70 54 6f fMacro(0,0,0,pTo
f370: 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 50 53 5f 4c 6f ken->nLine,PS_Lo
f380: 63 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b cal);. }else{
f390: 0a 20 20 20 20 20 20 50 75 73 68 49 66 4d 61 63 . PushIfMac
f3a0: 72 6f 28 30 2c 7a 41 72 67 2c 6e 41 72 67 2c 70 ro(0,zArg,nArg,p
f3b0: 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 30 29 3b Token->nLine,0);
f3c0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 . }. }else i
f3d0: 66 28 20 6e 43 6d 64 3d 3d 35 20 26 26 20 73 74 f( nCmd==5 && st
f3e0: 72 6e 63 6d 70 28 7a 43 6d 64 2c 22 69 66 64 65 rncmp(zCmd,"ifde
f3f0: 66 22 2c 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 f",5)==0 ){.
f400: 2f 2a 20 0a 20 20 20 20 2a 2a 20 50 75 73 68 20 /* . ** Push
f410: 61 6e 20 23 69 66 64 65 66 2e 0a 20 20 20 20 2a an #ifdef.. *
f420: 2f 0a 20 20 20 20 7a 41 72 67 20 3d 20 26 7a 43 /. zArg = &zC
f430: 6d 64 5b 35 5d 3b 0a 20 20 20 20 77 68 69 6c 65 md[5];. while
f440: 28 20 2a 7a 41 72 67 20 26 26 20 69 73 73 70 61 ( *zArg && isspa
f450: 63 65 28 2a 7a 41 72 67 29 20 26 26 20 2a 7a 41 ce(*zArg) && *zA
f460: 72 67 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 rg!='\n' ){.
f470: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a zArg++;. }.
f480: 20 20 20 20 69 66 28 20 2a 7a 41 72 67 3d 3d 30 if( *zArg==0
f490: 20 7c 7c 20 2a 7a 41 72 67 3d 3d 27 5c 6e 27 20 || *zArg=='\n'
f4a0: 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a 20 ){ return 0; }.
f4b0: 20 20 20 6e 41 72 67 20 3d 20 70 54 6f 6b 65 6e nArg = pToken
f4c0: 2d 3e 6e 54 65 78 74 20 2b 20 28 69 6e 74 29 70 ->nText + (int)p
f4d0: 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 20 2d 20 28 Token->zText - (
f4e0: 69 6e 74 29 7a 41 72 67 3b 0a 20 20 20 20 50 75 int)zArg;. Pu
f4f0: 73 68 49 66 4d 61 63 72 6f 28 22 64 65 66 69 6e shIfMacro("defin
f500: 65 64 22 2c 7a 41 72 67 2c 6e 41 72 67 2c 70 54 ed",zArg,nArg,pT
f510: 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 30 29 3b 0a oken->nLine,0);.
f520: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 6d 64 }else if( nCmd
f530: 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d 70 28 7a ==6 && strncmp(z
f540: 43 6d 64 2c 22 69 66 6e 64 65 66 22 2c 36 29 3d Cmd,"ifndef",6)=
f550: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 =0 ){. /*.
f560: 20 2a 2a 20 50 75 73 68 20 61 6e 20 23 69 66 6e ** Push an #ifn
f570: 64 65 66 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 def.. */.
f580: 7a 41 72 67 20 3d 20 26 7a 43 6d 64 5b 36 5d 3b zArg = &zCmd[6];
f590: 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 41 72 . while( *zAr
f5a0: 67 20 26 26 20 69 73 73 70 61 63 65 28 2a 7a 41 g && isspace(*zA
f5b0: 72 67 29 20 26 26 20 2a 7a 41 72 67 21 3d 27 5c rg) && *zArg!='\
f5c0: 6e 27 20 29 7b 0a 20 20 20 20 20 20 7a 41 72 67 n' ){. zArg
f5d0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 ++;. }. if
f5e0: 28 20 2a 7a 41 72 67 3d 3d 30 20 7c 7c 20 2a 7a ( *zArg==0 || *z
f5f0: 41 72 67 3d 3d 27 5c 6e 27 20 29 7b 20 72 65 74 Arg=='\n' ){ ret
f600: 75 72 6e 20 30 3b 20 7d 0a 20 20 20 20 6e 41 72 urn 0; }. nAr
f610: 67 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 g = pToken->nTex
f620: 74 20 2b 20 28 69 6e 74 29 70 54 6f 6b 65 6e 2d t + (int)pToken-
f630: 3e 7a 54 65 78 74 20 2d 20 28 69 6e 74 29 7a 41 >zText - (int)zA
f640: 72 67 3b 0a 20 20 20 20 50 75 73 68 49 66 4d 61 rg;. PushIfMa
f650: 63 72 6f 28 22 21 64 65 66 69 6e 65 64 22 2c 7a cro("!defined",z
f660: 41 72 67 2c 6e 41 72 67 2c 70 54 6f 6b 65 6e 2d Arg,nArg,pToken-
f670: 3e 6e 4c 69 6e 65 2c 30 29 3b 0a 20 20 7d 65 6c >nLine,0);. }el
f680: 73 65 20 69 66 28 20 6e 43 6d 64 3d 3d 34 20 26 se if( nCmd==4 &
f690: 26 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c 22 & strncmp(zCmd,"
f6a0: 65 6c 73 65 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 else",4)==0 ){.
f6b0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 6e 76 /*. ** Inv
f6c0: 65 72 74 20 74 68 65 20 23 69 66 20 6f 6e 20 74 ert the #if on t
f6d0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 he top of the st
f6e0: 61 63 6b 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 ack . */.
f6f0: 69 66 28 20 69 66 53 74 61 63 6b 3d 3d 30 20 29 if( ifStack==0 )
f700: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 {. fprintf(
f710: 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 27 stderr,"%s:%d: '
f720: 23 65 6c 73 65 27 20 77 69 74 68 6f 75 74 20 61 #else' without a
f730: 6e 20 27 23 69 66 27 5c 6e 22 2c 7a 46 69 6c 65 n '#if'\n",zFile
f740: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 70 name,. p
f750: 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 Token->nLine);.
f760: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 return 1;.
f770: 20 20 20 7d 0a 20 20 20 20 70 49 66 20 3d 20 69 }. pIf = i
f780: 66 53 74 61 63 6b 3b 0a 20 20 20 20 69 66 28 20 fStack;. if(
f790: 70 49 66 2d 3e 7a 43 6f 6e 64 69 74 69 6f 6e 20 pIf->zCondition
f7a0: 29 7b 0a 20 20 20 20 20 20 69 66 53 74 61 63 6b ){. ifStack
f7b0: 20 3d 20 69 66 53 74 61 63 6b 2d 3e 70 4e 65 78 = ifStack->pNex
f7c0: 74 3b 0a 20 20 20 20 20 20 50 75 73 68 49 66 4d t;. PushIfM
f7d0: 61 63 72 6f 28 22 21 22 2c 70 49 66 2d 3e 7a 43 acro("!",pIf->zC
f7e0: 6f 6e 64 69 74 69 6f 6e 2c 73 74 72 6c 65 6e 28 ondition,strlen(
f7f0: 70 49 66 2d 3e 7a 43 6f 6e 64 69 74 69 6f 6e 29 pIf->zCondition)
f800: 2c 70 49 66 2d 3e 6e 4c 69 6e 65 2c 30 29 3b 0a ,pIf->nLine,0);.
f810: 20 20 20 20 20 20 53 61 66 65 46 72 65 65 28 70 SafeFree(p
f820: 49 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a If);. }else{.
f830: 20 20 20 20 20 20 70 49 66 2d 3e 66 6c 61 67 73 pIf->flags
f840: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 = 0;. }. }e
f850: 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 lse{. /*.
f860: 2a 2a 20 54 68 69 73 20 64 69 72 65 63 74 69 76 ** This directiv
f870: 65 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 e can be safely
f880: 69 67 6e 6f 72 65 64 20 0a 20 20 20 20 2a 2f 0a ignored . */.
f890: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
f8a0: 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 52 65 }.. /* . ** Re
f8b0: 63 6f 6d 70 75 74 65 20 74 68 65 20 70 72 65 73 compute the pres
f8c0: 65 74 20 66 6c 61 67 73 20 0a 20 20 2a 2f 0a 20 et flags . */.
f8d0: 20 2a 70 50 72 65 73 65 74 46 6c 61 67 73 20 3d *pPresetFlags =
f8e0: 20 30 3b 0a 20 20 66 6f 72 28 70 49 66 20 3d 20 0;. for(pIf =
f8f0: 69 66 53 74 61 63 6b 3b 20 70 49 66 3b 20 70 49 ifStack; pIf; pI
f900: 66 3d 70 49 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 f=pIf->pNext){.
f910: 20 20 20 2a 70 50 72 65 73 65 74 46 6c 61 67 73 *pPresetFlags
f920: 20 7c 3d 20 70 49 66 2d 3e 66 6c 61 67 73 3b 0a |= pIf->flags;.
f930: 20 20 7d 0a 20 20 20 20 0a 20 20 72 65 74 75 72 }. . retur
f940: 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a n nErr;.}../*.**
f950: 20 50 61 72 73 65 20 61 6e 20 65 6e 74 69 72 65 Parse an entire
f960: 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 file. Return t
f970: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 he number of err
f980: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 ors..**.** pList
f990: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 6f is a list of to
f9a0: 6b 65 6e 73 20 69 6e 20 74 68 65 20 66 69 6c 65 kens in the file
f9b0: 2e 20 20 57 68 69 74 65 73 70 61 63 65 20 74 6f . Whitespace to
f9c0: 6b 65 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a kens have been.*
f9d0: 2a 20 65 6c 69 6d 69 6e 61 74 65 64 2c 20 61 6e * eliminated, an
f9e0: 64 20 74 65 78 74 20 77 69 74 68 20 7b 2e 2e 2e d text with {...
f9f0: 7d 20 68 61 73 20 62 65 65 6e 20 63 6f 6c 6c 61 } has been colla
fa00: 70 73 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 psed into a.** s
fa10: 69 6e 67 6c 65 20 54 54 5f 42 72 61 63 65 20 74 ingle TT_Brace t
fa20: 6f 6b 65 6e 2e 0a 2a 2a 20 0a 2a 2a 20 69 6e 69 oken..** .** ini
fa30: 74 46 6c 61 67 73 20 61 72 65 20 61 20 73 65 74 tFlags are a set
fa40: 20 6f 66 20 70 61 72 73 65 20 66 6c 61 67 73 20 of parse flags
fa50: 74 68 61 74 20 73 68 6f 75 6c 64 20 61 6c 77 61 that should alwa
fa60: 79 73 20 62 65 20 73 65 74 20 66 6f 72 20 74 68 ys be set for th
fa70: 69 73 0a 2a 2a 20 66 69 6c 65 2e 20 20 46 6f 72 is.** file. For
fa80: 20 2e 63 20 66 69 6c 65 73 20 74 68 69 73 20 69 .c files this i
fa90: 73 20 6e 6f 72 6d 61 6c 6c 79 20 30 2e 20 20 46 s normally 0. F
faa0: 6f 72 20 2e 68 20 66 69 6c 65 73 20 69 74 20 69 or .h files it i
fab0: 73 20 50 53 5f 49 6e 74 65 72 66 61 63 65 2e 0a s PS_Interface..
fac0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 50 61 */.static int Pa
fad0: 72 73 65 46 69 6c 65 28 54 6f 6b 65 6e 20 2a 70 rseFile(Token *p
fae0: 4c 69 73 74 2c 20 69 6e 74 20 69 6e 69 74 46 6c List, int initFl
faf0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 ags){. int nErr
fb00: 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 = 0;. Token *p
fb10: 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 Start = 0;. int
fb20: 20 66 6c 61 67 73 20 3d 20 69 6e 69 74 46 6c 61 flags = initFla
fb30: 67 73 3b 0a 20 20 69 6e 74 20 70 72 65 73 65 74 gs;. int preset
fb40: 46 6c 61 67 73 20 3d 20 69 6e 69 74 46 6c 61 67 Flags = initFlag
fb50: 73 3b 0a 20 20 69 6e 74 20 72 65 73 65 74 46 6c s;. int resetFl
fb60: 61 67 20 3d 20 30 3b 0a 0a 20 20 69 6e 63 6c 75 ag = 0;.. inclu
fb70: 64 65 4c 69 73 74 20 3d 20 30 3b 0a 20 20 77 68 deList = 0;. wh
fb80: 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 ile( pList ){.
fb90: 20 20 73 77 69 74 63 68 28 20 70 4c 69 73 74 2d switch( pList-
fba0: 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 >eType ){. ca
fbb0: 73 65 20 54 54 5f 45 4f 46 3a 0a 20 20 20 20 20 se TT_EOF:.
fbc0: 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 6c 6f 6f goto end_of_loo
fbd0: 70 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 54 5f p;.. case TT_
fbe0: 50 72 65 70 72 6f 63 65 73 73 6f 72 3a 0a 20 20 Preprocessor:.
fbf0: 20 20 20 20 6e 45 72 72 20 2b 3d 20 50 61 72 73 nErr += Pars
fc00: 65 50 72 65 70 72 6f 63 65 73 73 6f 72 28 70 4c ePreprocessor(pL
fc10: 69 73 74 2c 66 6c 61 67 73 2c 26 70 72 65 73 65 ist,flags,&prese
fc20: 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 70 tFlags);. p
fc30: 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 Start = 0;.
fc40: 20 70 72 65 73 65 74 46 6c 61 67 73 20 7c 3d 20 presetFlags |=
fc50: 69 6e 69 74 46 6c 61 67 73 3b 0a 20 20 20 20 20 initFlags;.
fc60: 20 66 6c 61 67 73 20 3d 20 70 72 65 73 65 74 46 flags = presetF
fc70: 6c 61 67 73 3b 0a 20 20 20 20 20 20 62 72 65 61 lags;. brea
fc80: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 54 5f k;.. case TT_
fc90: 4f 74 68 65 72 3a 0a 20 20 20 20 20 20 73 77 69 Other:. swi
fca0: 74 63 68 28 20 70 4c 69 73 74 2d 3e 7a 54 65 78 tch( pList->zTex
fcb0: 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 t[0] ){. ca
fcc0: 73 65 20 27 3b 27 3a 0a 20 20 20 20 20 20 20 20 se ';':.
fcd0: 6e 45 72 72 20 2b 3d 20 50 72 6f 63 65 73 73 44 nErr += ProcessD
fce0: 65 63 6c 28 70 53 74 61 72 74 2c 70 4c 69 73 74 ecl(pStart,pList
fcf0: 2c 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 ,flags);.
fd00: 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 pStart = 0;.
fd10: 20 20 20 20 20 66 6c 61 67 73 20 3d 20 70 72 65 flags = pre
fd20: 73 65 74 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 setFlags;.
fd30: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 break;..
fd40: 63 61 73 65 20 27 3d 27 3a 0a 20 20 20 20 20 20 case '=':.
fd50: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 50 72 if( pList->pPr
fd60: 65 76 2d 3e 6e 54 65 78 74 3d 3d 38 20 0a 20 20 ev->nText==8 .
fd70: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 74 72 && str
fd80: 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 70 50 72 65 ncmp(pList->pPre
fd90: 76 2d 3e 7a 54 65 78 74 2c 22 6f 70 65 72 61 74 v->zText,"operat
fda0: 6f 72 22 2c 38 29 3d 3d 30 20 29 7b 0a 20 20 20 or",8)==0 ){.
fdb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
fdc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
fdd0: 6e 45 72 72 20 2b 3d 20 50 72 6f 63 65 73 73 44 nErr += ProcessD
fde0: 65 63 6c 28 70 53 74 61 72 74 2c 70 4c 69 73 74 ecl(pStart,pList
fdf0: 2c 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 ,flags);.
fe00: 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 pStart = 0;.
fe10: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4c 69 73 while( pLis
fe20: 74 20 26 26 20 70 4c 69 73 74 2d 3e 7a 54 65 78 t && pList->zTex
fe30: 74 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 t[0]!=';' ){.
fe40: 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 pList = p
fe50: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 List->pNext;.
fe60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 }. i
fe70: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f f( pList==0 ) go
fe80: 74 6f 20 65 6e 64 5f 6f 66 5f 6c 6f 6f 70 3b 0a to end_of_loop;.
fe90: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 flags =
fea0: 70 72 65 73 65 74 46 6c 61 67 73 3b 0a 20 20 20 presetFlags;.
feb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 break;..
fec0: 20 20 20 63 61 73 65 20 27 3a 27 3a 0a 20 20 20 case ':':.
fed0: 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e if( pList->
fee0: 7a 54 65 78 74 5b 31 5d 3d 3d 27 3a 27 20 29 7b zText[1]==':' ){
fef0: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 . flags
ff00: 20 7c 3d 20 50 53 5f 4d 65 74 68 6f 64 3b 0a 20 |= PS_Method;.
ff10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
ff20: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 break;.. d
ff30: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 efault:.
ff40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 break;. }.
ff50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 break;..
ff60: 20 63 61 73 65 20 54 54 5f 42 72 61 63 65 73 3a case TT_Braces:
ff70: 0a 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 50 . nErr += P
ff80: 72 6f 63 65 73 73 50 72 6f 63 65 64 75 72 65 44 rocessProcedureD
ff90: 65 66 28 70 53 74 61 72 74 2c 70 4c 69 73 74 2c ef(pStart,pList,
ffa0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 70 53 flags);. pS
ffb0: 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 tart = 0;.
ffc0: 66 6c 61 67 73 20 3d 20 70 72 65 73 65 74 46 6c flags = presetFl
ffd0: 61 67 73 3b 0a 20 20 20 20 20 20 62 72 65 61 6b ags;. break
ffe0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 54 5f 49 ;.. case TT_I
fff0: 64 3a 0a 20 20 20 20 20 20 20 69 66 28 20 70 53 d:. if( pS
10000 74 61 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 tart==0 ){.
10010 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 4c pStart = pL
10020 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 ist;. f
10030 6c 61 67 73 20 3d 20 70 72 65 73 65 74 46 6c 61 lags = presetFla
10040 67 73 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 gs;. }.
10050 20 20 20 20 72 65 73 65 74 46 6c 61 67 20 3d 20 resetFlag =
10060 30 3b 0a 20 20 20 20 20 20 20 73 77 69 74 63 68 0;. switch
10070 28 20 70 4c 69 73 74 2d 3e 7a 54 65 78 74 5b 30 ( pList->zText[0
10080 5d 20 29 7b 0a 20 20 20 20 20 20 20 63 61 73 65 ] ){. case
10090 20 27 63 27 3a 0a 20 20 20 20 20 20 20 20 20 69 'c':. i
100a0 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d f( pList->nText=
100b0 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c =5 && strncmp(pL
100c0 69 73 74 2d 3e 7a 54 65 78 74 2c 22 63 6c 61 73 ist->zText,"clas
100d0 73 22 2c 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 s",5)==0 ){.
100e0 20 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 50 nErr += P
100f0 72 6f 63 65 73 73 54 79 70 65 44 65 63 6c 28 70 rocessTypeDecl(p
10100 4c 69 73 74 2c 66 6c 61 67 73 2c 26 72 65 73 65 List,flags,&rese
10110 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 20 20 tFlag);.
10120 20 7d 0a 20 20 20 20 20 20 20 20 20 62 72 65 61 }. brea
10130 6b 3b 0a 0a 20 20 20 20 20 20 20 63 61 73 65 20 k;.. case
10140 27 45 27 3a 0a 20 20 20 20 20 20 20 20 20 69 66 'E':. if
10150 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d ( pList->nText==
10160 36 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 6 && strncmp(pLi
10170 73 74 2d 3e 7a 54 65 78 74 2c 22 45 58 50 4f 52 st->zText,"EXPOR
10180 54 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 T",6)==0 ){.
10190 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 flags |=
101a0 50 53 5f 45 78 70 6f 72 74 32 3b 0a 20 20 20 20 PS_Export2;.
101b0 20 20 20 20 20 20 20 2f 2a 20 70 53 74 61 72 74 /* pStart
101c0 20 3d 20 30 3b 20 2a 2f 0a 20 20 20 20 20 20 20 = 0; */.
101d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 62 72 65 }. bre
101e0 61 6b 3b 0a 0a 20 20 20 20 20 20 20 63 61 73 65 ak;.. case
101f0 20 27 65 27 3a 0a 20 20 20 20 20 20 20 20 20 69 'e':. i
10200 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d f( pList->nText=
10210 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c =4 && strncmp(pL
10220 69 73 74 2d 3e 7a 54 65 78 74 2c 22 65 6e 75 6d ist->zText,"enum
10230 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 ",4)==0 ){.
10240 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d if( pList-
10250 3e 70 4e 65 78 74 20 26 26 20 70 4c 69 73 74 2d >pNext && pList-
10260 3e 70 4e 65 78 74 2d 3e 65 54 79 70 65 3d 3d 54 >pNext->eType==T
10270 54 5f 42 72 61 63 65 73 20 29 7b 0a 20 20 20 20 T_Braces ){.
10280 20 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d pList =
10290 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 pList->pNext;.
102a0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b }else{
102b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 . nE
102c0 72 72 20 2b 3d 20 50 72 6f 63 65 73 73 54 79 70 rr += ProcessTyp
102d0 65 44 65 63 6c 28 70 4c 69 73 74 2c 66 6c 61 67 eDecl(pList,flag
102e0 73 2c 26 72 65 73 65 74 46 6c 61 67 29 3b 0a 20 s,&resetFlag);.
102f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
10300 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 }else if( p
10310 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 36 20 26 List->nText==6 &
10320 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d & strncmp(pList-
10330 3e 7a 54 65 78 74 2c 22 65 78 74 65 72 6e 22 2c >zText,"extern",
10340 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 6)==0 ){.
10350 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 pList = pLis
10360 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 t->pNext;.
10370 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 26 if( pList &
10380 26 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d & pList->nText==
10390 33 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 3 && strncmp(pLi
103a0 73 74 2d 3e 7a 54 65 78 74 2c 22 5c 22 43 5c 22 st->zText,"\"C\"
103b0 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 ",3)==0 ){.
103c0 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 pList =
103d0 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 pList->pNext;.
103e0 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 flags
103f0 20 26 3d 20 7e 44 50 5f 43 70 6c 75 73 70 6c 75 &= ~DP_Cplusplu
10400 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 65 s;. }e
10410 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 lse{.
10420 20 20 66 6c 61 67 73 20 7c 3d 20 50 53 5f 45 78 flags |= PS_Ex
10430 74 65 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 tern;.
10440 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 }. pS
10450 74 61 72 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 tart = pList;.
10460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
10470 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 break;..
10480 20 63 61 73 65 20 27 69 27 3a 0a 20 20 20 20 20 case 'i':.
10490 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e if( pList->n
104a0 54 65 78 74 3d 3d 36 20 26 26 20 73 74 72 6e 63 Text==6 && strnc
104b0 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c mp(pList->zText,
104c0 22 69 6e 6c 69 6e 65 22 2c 36 29 3d 3d 30 20 29 "inline",6)==0 )
104d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 6e 45 72 {. nEr
104e0 72 20 2b 3d 20 50 72 6f 63 65 73 73 49 6e 6c 69 r += ProcessInli
104f0 6e 65 50 72 6f 63 28 70 4c 69 73 74 2c 66 6c 61 neProc(pList,fla
10500 67 73 2c 26 72 65 73 65 74 46 6c 61 67 29 3b 0a gs,&resetFlag);.
10510 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
10520 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 break;..
10530 20 20 20 63 61 73 65 20 27 4c 27 3a 0a 20 20 20 case 'L':.
10540 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d if( pList-
10550 3e 6e 54 65 78 74 3d 3d 35 20 26 26 20 73 74 72 >nText==5 && str
10560 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78 ncmp(pList->zTex
10570 74 2c 22 4c 4f 43 41 4c 22 2c 35 29 3d 3d 30 20 t,"LOCAL",5)==0
10580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 66 6c ){. fl
10590 61 67 73 20 7c 3d 20 50 53 5f 4c 6f 63 61 6c 32 ags |= PS_Local2
105a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 ;. pSt
105b0 61 72 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 art = pList;.
105c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
105d0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 break;..
105e0 63 61 73 65 20 27 50 27 3a 0a 20 20 20 20 20 20 case 'P':.
105f0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 54 if( pList->nT
10600 65 78 74 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d ext==6 && strncm
10610 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 20 p(pList->zText,
10620 22 50 55 42 4c 49 43 22 2c 36 29 3d 3d 30 20 29 "PUBLIC",6)==0 )
10630 7b 0a 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 {. fla
10640 67 73 20 7c 3d 20 50 53 5f 50 75 62 6c 69 63 3b gs |= PS_Public;
10650 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 61 . pSta
10660 72 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 rt = pList;.
10670 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 }else if( p
10680 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 37 20 26 List->nText==7 &
10690 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d & strncmp(pList-
106a0 3e 7a 54 65 78 74 2c 20 22 50 52 49 56 41 54 45 >zText, "PRIVATE
106b0 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 ",7)==0 ){.
106c0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 50 flags |= P
106d0 53 5f 50 72 69 76 61 74 65 3b 0a 20 20 20 20 20 S_Private;.
106e0 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 pStart = p
106f0 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 7d List;. }
10700 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e else if( pList->
10710 6e 54 65 78 74 3d 3d 39 20 26 26 20 73 74 72 6e nText==9 && strn
10720 63 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74 cmp(pList->zText
10730 2c 22 50 52 4f 54 45 43 54 45 44 22 2c 39 29 3d ,"PROTECTED",9)=
10740 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 =0 ){.
10750 20 66 6c 61 67 73 20 7c 3d 20 50 53 5f 50 72 6f flags |= PS_Pro
10760 74 65 63 74 65 64 3b 0a 20 20 20 20 20 20 20 20 tected;.
10770 20 20 20 70 53 74 61 72 74 20 3d 20 70 4c 69 73 pStart = pLis
10780 74 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20 20 t;. }.
10790 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 break;..
107a0 20 20 20 20 20 20 63 61 73 65 20 27 73 27 3a 0a case 's':.
107b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 69 if( pLi
107c0 73 74 2d 3e 6e 54 65 78 74 3d 3d 36 20 26 26 20 st->nText==6 &&
107d0 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 7a strncmp(pList->z
107e0 54 65 78 74 2c 22 73 74 72 75 63 74 22 2c 36 29 Text,"struct",6)
107f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ==0 ){.
10800 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 4e 65 if( pList->pNe
10810 78 74 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 xt && pList->pNe
10820 78 74 2d 3e 65 54 79 70 65 3d 3d 54 54 5f 42 72 xt->eType==TT_Br
10830 61 63 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 aces ){.
10840 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 pList = pLi
10850 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 st->pNext;.
10860 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
10870 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 20 2b nErr +
10880 3d 20 50 72 6f 63 65 73 73 54 79 70 65 44 65 63 = ProcessTypeDec
10890 6c 28 70 4c 69 73 74 2c 66 6c 61 67 73 2c 26 72 l(pList,flags,&r
108a0 65 73 65 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 esetFlag);.
108b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
108c0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 }else if( pList
108d0 2d 3e 6e 54 65 78 74 3d 3d 36 20 26 26 20 73 74 ->nText==6 && st
108e0 72 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65 rncmp(pList->zTe
108f0 78 74 2c 22 73 74 61 74 69 63 22 2c 36 29 3d 3d xt,"static",6)==
10900 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 0 ){.
10910 66 6c 61 67 73 20 7c 3d 20 50 53 5f 53 74 61 74 flags |= PS_Stat
10920 69 63 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20 ic;. }.
10930 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a break;..
10940 20 20 20 20 20 20 20 63 61 73 65 20 27 74 27 3a case 't':
10950 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c . if( pL
10960 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 37 20 26 26 ist->nText==7 &&
10970 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d 3e strncmp(pList->
10980 7a 54 65 78 74 2c 22 74 79 70 65 64 65 66 22 2c zText,"typedef",
10990 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 7)==0 ){.
109a0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 50 53 5f flags |= PS_
109b0 54 79 70 65 64 65 66 3b 0a 20 20 20 20 20 20 20 Typedef;.
109c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 62 72 65 }. bre
109d0 61 6b 3b 0a 0a 20 20 20 20 20 20 20 63 61 73 65 ak;.. case
109e0 20 27 75 27 3a 0a 20 20 20 20 20 20 20 20 20 69 'u':. i
109f0 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d f( pList->nText=
10a00 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c =5 && strncmp(pL
10a10 69 73 74 2d 3e 7a 54 65 78 74 2c 22 75 6e 69 6f ist->zText,"unio
10a20 6e 22 2c 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 n",5)==0 ){.
10a30 20 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 if( pList
10a40 2d 3e 70 4e 65 78 74 20 26 26 20 70 4c 69 73 74 ->pNext && pList
10a50 2d 3e 70 4e 65 78 74 2d 3e 65 54 79 70 65 3d 3d ->pNext->eType==
10a60 54 54 5f 42 72 61 63 65 73 20 29 7b 0a 20 20 20 TT_Braces ){.
10a70 20 20 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 pList
10a80 3d 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a = pList->pNext;.
10a90 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 }else
10aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e {. n
10ab0 45 72 72 20 2b 3d 20 50 72 6f 63 65 73 73 54 79 Err += ProcessTy
10ac0 70 65 44 65 63 6c 28 70 4c 69 73 74 2c 66 6c 61 peDecl(pList,fla
10ad0 67 73 2c 26 72 65 73 65 74 46 6c 61 67 29 3b 0a gs,&resetFlag);.
10ae0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }.
10af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
10b00 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 break;..
10b10 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 default:.
10b20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 break;.
10b30 7d 0a 20 20 20 20 20 20 20 69 66 28 20 72 65 73 }. if( res
10b40 65 74 46 6c 61 67 21 3d 30 20 29 7b 0a 20 20 20 etFlag!=0 ){.
10b50 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4c 69 while( pLi
10b60 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 7a 54 65 st && pList->zTe
10b70 78 74 5b 30 5d 21 3d 72 65 73 65 74 46 6c 61 67 xt[0]!=resetFlag
10b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70 ){. p
10b90 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 4e List = pList->pN
10ba0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a ext;. }.
10bb0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 69 if( pLi
10bc0 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 st==0 ) goto end
10bd0 5f 6f 66 5f 6c 6f 6f 70 3b 0a 20 20 20 20 20 20 _of_loop;.
10be0 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 pStart = 0;.
10bf0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 flags =
10c00 70 72 65 73 65 74 46 6c 61 67 73 3b 0a 20 20 20 presetFlags;.
10c10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 62 72 65 }. bre
10c20 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 54 ak;.. case TT
10c30 5f 53 74 72 69 6e 67 3a 0a 20 20 20 20 63 61 73 _String:. cas
10c40 65 20 54 54 5f 4e 75 6d 62 65 72 3a 0a 20 20 20 e TT_Number:.
10c50 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 break;..
10c60 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 default:.
10c70 70 53 74 61 72 74 20 3d 20 70 4c 69 73 74 3b 0a pStart = pList;.
10c80 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 70 flags = p
10c90 72 65 73 65 74 46 6c 61 67 73 3b 0a 20 20 20 20 resetFlags;.
10ca0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
10cb0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 pList = pLis
10cc0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 t->pNext;. }.
10cd0 65 6e 64 5f 6f 66 5f 6c 6f 6f 70 3a 0a 0a 20 20 end_of_loop:..
10ce0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 /* Verify that a
10cf0 6c 6c 20 23 69 66 73 20 68 61 76 65 20 61 20 6d ll #ifs have a m
10d00 61 74 63 68 69 6e 67 20 22 23 65 6e 64 69 66 22 atching "#endif"
10d10 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 66 53 */. while( ifS
10d20 74 61 63 6b 20 29 7b 0a 20 20 20 20 49 66 6d 61 tack ){. Ifma
10d30 63 72 6f 20 2a 70 49 66 20 3d 20 69 66 53 74 61 cro *pIf = ifSta
10d40 63 6b 3b 0a 20 20 20 20 69 66 53 74 61 63 6b 20 ck;. ifStack
10d50 3d 20 70 49 66 2d 3e 70 4e 65 78 74 3b 0a 20 20 = pIf->pNext;.
10d60 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 fprintf(stderr
10d70 2c 22 25 73 3a 25 64 3a 20 54 68 69 73 20 27 23 ,"%s:%d: This '#
10d80 69 66 27 20 68 61 73 20 6e 6f 20 27 23 65 6e 64 if' has no '#end
10d90 69 66 27 5c 6e 22 2c 7a 46 69 6c 65 6e 61 6d 65 if'\n",zFilename
10da0 2c 0a 20 20 20 20 20 20 70 49 66 2d 3e 6e 4c 69 ,. pIf->nLi
10db0 6e 65 29 3b 0a 20 20 20 20 53 61 66 65 46 72 65 ne);. SafeFre
10dc0 65 28 70 49 66 29 3b 0a 20 20 7d 0a 0a 20 20 72 e(pIf);. }.. r
10dd0 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f eturn nErr;.}../
10de0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 67 69 76 65 *.** If the give
10df0 6e 20 44 65 63 6c 20 6f 62 6a 65 63 74 20 68 61 n Decl object ha
10e00 73 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 7a 45 78 s a non-null zEx
10e10 74 72 61 20 66 69 65 6c 64 2c 20 74 68 65 6e 20 tra field, then
10e20 74 68 65 20 74 65 78 74 0a 2a 2a 20 6f 66 20 74 the text.** of t
10e30 68 61 74 20 7a 45 78 74 72 61 20 66 69 65 6c 64 hat zExtra field
10e40 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 73 needs to be ins
10e50 65 72 74 65 64 20 69 6e 20 74 68 65 20 6d 69 64 erted in the mid
10e60 64 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20 7a 44 dle of the.** zD
10e70 65 63 6c 20 66 69 65 6c 64 20 62 65 66 6f 72 65 ecl field before
10e80 20 74 68 65 20 6c 61 73 74 20 22 7d 22 20 69 6e the last "}" in
10e90 20 74 68 65 20 7a 44 65 63 6c 2e 20 20 54 68 69 the zDecl. Thi
10ea0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 s routine does t
10eb0 68 61 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 7a hat..** If the z
10ec0 45 78 74 72 61 20 69 73 20 4e 55 4c 4c 2c 20 74 Extra is NULL, t
10ed0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 his routine is a
10ee0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 7a 45 no-op..**.** zE
10ef0 78 74 72 61 20 68 6f 6c 64 73 20 65 78 74 72 61 xtra holds extra
10f00 20 6d 65 74 68 6f 64 20 64 65 63 6c 61 72 61 74 method declarat
10f10 69 6f 6e 73 20 66 6f 72 20 63 6c 61 73 73 65 73 ions for classes
10f20 2e 20 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 . The declarati
10f30 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74 6f 20 62 ons.** have to b
10f40 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 e inserted into
10f50 74 68 65 20 63 6c 61 73 73 20 64 65 66 69 6e 69 the class defini
10f60 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 tion..*/.static
10f70 76 6f 69 64 20 49 6e 73 65 72 74 45 78 74 72 61 void InsertExtra
10f80 44 65 63 6c 28 44 65 63 6c 20 2a 70 44 65 63 6c Decl(Decl *pDecl
10f90 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 74 ){. int i;. St
10fa0 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 69 66 28 ring str;.. if(
10fb0 20 70 44 65 63 6c 3d 3d 30 20 7c 7c 20 70 44 65 pDecl==0 || pDe
10fc0 63 6c 2d 3e 7a 45 78 74 72 61 3d 3d 30 20 7c 7c cl->zExtra==0 ||
10fd0 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 3d 3d 30 pDecl->zDecl==0
10fe0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d ) return;. i =
10ff0 20 73 74 72 6c 65 6e 28 70 44 65 63 6c 2d 3e 7a strlen(pDecl->z
11000 44 65 63 6c 29 20 2d 20 31 3b 0a 20 20 77 68 69 Decl) - 1;. whi
11010 6c 65 28 20 69 3e 30 20 26 26 20 70 44 65 63 6c le( i>0 && pDecl
11020 2d 3e 7a 44 65 63 6c 5b 69 5d 21 3d 27 7d 27 20 ->zDecl[i]!='}'
11030 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 53 74 72 69 ){ i--; }. Stri
11040 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 ngInit(&str);.
11050 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 StringAppend(&st
11060 72 2c 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 2c r, pDecl->zDecl,
11070 20 69 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70 i);. StringApp
11080 65 6e 64 28 26 73 74 72 2c 20 70 44 65 63 6c 2d end(&str, pDecl-
11090 3e 7a 45 78 74 72 61 2c 20 30 29 3b 0a 20 20 53 >zExtra, 0);. S
110a0 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 tringAppend(&str
110b0 2c 20 26 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 5b , &pDecl->zDecl[
110c0 69 5d 2c 20 30 29 3b 0a 20 20 53 61 66 65 46 72 i], 0);. SafeFr
110d0 65 65 28 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 29 ee(pDecl->zDecl)
110e0 3b 0a 20 20 53 61 66 65 46 72 65 65 28 70 44 65 ;. SafeFree(pDe
110f0 63 6c 2d 3e 7a 45 78 74 72 61 29 3b 0a 20 20 70 cl->zExtra);. p
11100 44 65 63 6c 2d 3e 7a 44 65 63 6c 20 3d 20 53 74 Decl->zDecl = St
11110 72 44 75 70 28 53 74 72 69 6e 67 47 65 74 28 26 rDup(StringGet(&
11120 73 74 72 29 2c 20 30 29 3b 0a 20 20 53 74 72 69 str), 0);. Stri
11130 6e 67 52 65 73 65 74 28 26 73 74 72 29 3b 0a 20 ngReset(&str);.
11140 20 70 44 65 63 6c 2d 3e 7a 45 78 74 72 61 20 3d pDecl->zExtra =
11150 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 0;.}../*.** Res
11160 65 74 20 74 68 65 20 44 50 5f 46 6f 72 77 61 72 et the DP_Forwar
11170 64 20 61 6e 64 20 44 50 5f 44 65 63 6c 61 72 65 d and DP_Declare
11180 64 20 66 6c 61 67 73 20 6f 6e 20 61 6c 6c 20 44 d flags on all D
11190 65 63 6c 20 73 74 72 75 63 74 75 72 65 73 2e 0a ecl structures..
111a0 2a 2a 20 53 65 74 20 62 6f 74 68 20 66 6c 61 67 ** Set both flag
111b0 73 20 66 6f 72 20 61 6e 79 74 68 69 6e 67 20 74 s for anything t
111c0 68 61 74 20 69 73 20 74 61 67 67 65 64 20 61 73 hat is tagged as
111d0 20 6c 6f 63 61 6c 20 61 6e 64 20 69 73 6e 27 74 local and isn't
111e0 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 .** in the file
111f0 20 7a 46 69 6c 65 6e 61 6d 65 20 73 6f 20 74 68 zFilename so th
11200 61 74 20 69 74 20 77 6f 6e 27 74 20 62 65 20 70 at it won't be p
11210 72 69 6e 74 69 6e 67 20 69 6e 20 6f 74 68 65 72 rinting in other
11220 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 files..*/.stati
11230 63 20 76 6f 69 64 20 52 65 73 65 74 44 65 63 6c c void ResetDecl
11240 46 6c 61 67 73 28 63 68 61 72 20 2a 7a 46 69 6c Flags(char *zFil
11250 65 6e 61 6d 65 29 7b 0a 20 20 44 65 63 6c 20 2a ename){. Decl *
11260 70 44 65 63 6c 3b 0a 0a 20 20 66 6f 72 28 70 44 pDecl;.. for(pD
11270 65 63 6c 20 3d 20 70 44 65 63 6c 46 69 72 73 74 ecl = pDeclFirst
11280 3b 20 70 44 65 63 6c 3b 20 70 44 65 63 6c 20 3d ; pDecl; pDecl =
11290 20 70 44 65 63 6c 2d 3e 70 4e 65 78 74 29 7b 0a pDecl->pNext){.
112a0 20 20 20 20 44 65 63 6c 43 6c 65 61 72 50 72 6f DeclClearPro
112b0 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 46 perty(pDecl,DP_F
112c0 6f 72 77 61 72 64 7c 44 50 5f 44 65 63 6c 61 72 orward|DP_Declar
112d0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 44 65 63 ed);. if( Dec
112e0 6c 48 61 73 50 72 6f 70 65 72 74 79 28 70 44 65 lHasProperty(pDe
112f0 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29 20 26 26 20 cl,DP_Local) &&
11300 70 44 65 63 6c 2d 3e 7a 46 69 6c 65 21 3d 7a 46 pDecl->zFile!=zF
11310 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 ilename ){.
11320 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 DeclSetProperty
11330 28 70 44 65 63 6c 2c 44 50 5f 46 6f 72 77 61 72 (pDecl,DP_Forwar
11340 64 7c 44 50 5f 44 65 63 6c 61 72 65 64 29 3b 0a d|DP_Declared);.
11350 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a }. }.}../*.
11360 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 ** Forward decla
11370 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 63 ration of the Sc
11380 61 6e 54 65 78 74 28 29 20 66 75 6e 63 74 69 6f anText() functio
11390 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 n..*/.static voi
113a0 64 20 53 63 61 6e 54 65 78 74 28 63 6f 6e 73 74 d ScanText(const
113b0 20 63 68 61 72 2a 2c 20 47 65 6e 53 74 61 74 65 char*, GenState
113c0 20 2a 70 53 74 61 74 65 29 3b 0a 0a 2f 2a 0a 2a *pState);../*.*
113d0 2a 20 54 68 65 20 6f 75 74 70 75 74 20 69 6e 20 * The output in
113e0 70 53 74 72 20 69 73 20 63 75 72 72 65 6e 74 6c pStr is currentl
113f0 79 20 77 69 74 68 69 6e 20 61 6e 20 23 69 66 20 y within an #if
11400 43 4f 4e 54 45 58 54 20 77 68 65 72 65 20 63 6f CONTEXT where co
11410 6e 74 65 78 74 0a 2a 2a 20 69 73 20 65 71 75 61 ntext.** is equa
11420 6c 20 74 6f 20 2a 70 7a 49 66 2e 20 20 28 2a 70 l to *pzIf. (*p
11430 7a 49 66 20 6d 69 67 68 74 20 62 65 20 4e 55 4c zIf might be NUL
11440 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 L to indicate th
11450 61 74 20 77 65 20 61 72 65 0a 2a 2a 20 6e 6f 74 at we are.** not
11460 20 77 69 74 68 69 6e 20 61 6e 79 20 23 69 66 20 within any #if
11470 61 74 20 74 68 65 20 6d 6f 6d 65 6e 74 2e 29 20 at the moment.)
11480 20 57 65 20 61 72 65 20 67 65 74 74 69 6e 67 20 We are getting
11490 72 65 61 64 79 20 74 6f 20 6f 75 74 70 75 74 0a ready to output.
114a0 2a 2a 20 73 6f 6d 65 20 74 65 78 74 20 74 68 61 ** some text tha
114b0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 69 t needs to be wi
114c0 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 thin the context
114d0 20 6f 66 20 22 23 69 66 20 4e 45 57 22 20 77 68 of "#if NEW" wh
114e0 65 72 65 0a 2a 2a 20 4e 45 57 20 69 73 20 7a 49 ere.** NEW is zI
114f0 66 2e 20 20 4d 61 6b 65 20 61 6e 20 61 70 70 72 f. Make an appr
11500 6f 70 72 69 61 74 65 20 63 68 61 6e 67 65 20 74 opriate change t
11510 6f 20 74 68 65 20 63 6f 6e 74 65 78 74 2e 0a 2a o the context..*
11520 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 68 /.static void Ch
11530 61 6e 67 65 49 66 43 6f 6e 74 65 78 74 28 0a 20 angeIfContext(.
11540 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 66 const char *zIf
11550 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 , /* The d
11560 65 73 69 72 65 64 20 23 69 66 20 63 6f 6e 74 65 esired #if conte
11570 78 74 20 2a 2f 0a 20 20 47 65 6e 53 74 61 74 65 xt */. GenState
11580 20 2a 70 53 74 61 74 65 20 20 20 20 20 20 20 2f *pState /
11590 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 20 * Current state
115a0 6f 66 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 of the code gene
115b0 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 rator */.){. if
115c0 28 20 7a 49 66 3d 3d 30 20 29 7b 0a 20 20 20 20 ( zIf==0 ){.
115d0 69 66 28 20 70 53 74 61 74 65 2d 3e 7a 49 66 3d if( pState->zIf=
115e0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 =0 ) return;.
115f0 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53 StringAppend(pS
11600 74 61 74 65 2d 3e 70 53 74 72 2c 22 23 65 6e 64 tate->pStr,"#end
11610 69 66 5c 6e 22 2c 30 29 3b 0a 20 20 20 20 70 53 if\n",0);. pS
11620 74 61 74 65 2d 3e 7a 49 66 20 3d 20 30 3b 0a 20 tate->zIf = 0;.
11630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 }else{. if(
11640 70 53 74 61 74 65 2d 3e 7a 49 66 20 29 7b 0a 20 pState->zIf ){.
11650 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 if( strcmp(
11660 7a 49 66 2c 70 53 74 61 74 65 2d 3e 7a 49 66 29 zIf,pState->zIf)
11670 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 ==0 ) return;.
11680 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 StringAppend
11690 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c 22 23 (pState->pStr,"#
116a0 65 6e 64 69 66 5c 6e 22 2c 30 29 3b 0a 20 20 20 endif\n",0);.
116b0 20 20 20 70 53 74 61 74 65 2d 3e 7a 49 66 20 3d pState->zIf =
116c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 63 0;. }. Sc
116d0 61 6e 54 65 78 74 28 7a 49 66 2c 20 70 53 74 61 anText(zIf, pSta
116e0 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 te);. if( pSt
116f0 61 74 65 2d 3e 7a 49 66 21 3d 30 20 29 7b 0a 20 ate->zIf!=0 ){.
11700 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e StringAppen
11710 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c 22 d(pState->pStr,"
11720 23 65 6e 64 69 66 5c 6e 22 2c 30 29 3b 0a 20 20 #endif\n",0);.
11730 20 20 7d 0a 20 20 20 20 53 74 72 69 6e 67 41 70 }. StringAp
11740 70 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74 pend(pState->pSt
11750 72 2c 22 23 69 66 20 22 2c 30 29 3b 0a 20 20 20 r,"#if ",0);.
11760 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53 StringAppend(pS
11770 74 61 74 65 2d 3e 70 53 74 72 2c 7a 49 66 2c 30 tate->pStr,zIf,0
11780 29 3b 0a 20 20 20 20 53 74 72 69 6e 67 41 70 70 );. StringApp
11790 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 end(pState->pStr
117a0 2c 22 5c 6e 22 2c 30 29 3b 0a 20 20 20 20 70 53 ,"\n",0);. pS
117b0 74 61 74 65 2d 3e 7a 49 66 20 3d 20 7a 49 66 3b tate->zIf = zIf;
117c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 . }.}../*.** Ad
117d0 64 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67 20 d to the string
117e0 70 53 74 72 20 61 20 23 69 6e 63 6c 75 64 65 20 pStr a #include
117f0 6f 66 20 65 76 65 72 79 20 66 69 6c 65 20 6f 6e of every file on
11800 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 the list of.**
11810 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20 70 49 include files pI
11820 6e 63 6c 75 64 65 2e 20 20 54 68 65 20 74 61 62 nclude. The tab
11830 6c 65 20 70 54 61 62 6c 65 20 63 6f 6e 74 61 69 le pTable contai
11840 6e 73 20 61 6c 6c 20 66 69 6c 65 73 20 74 68 61 ns all files tha
11850 74 0a 2a 2a 20 68 61 76 65 20 61 6c 72 65 61 64 t.** have alread
11860 79 20 62 65 65 6e 20 23 69 6e 63 6c 75 64 65 64 y been #included
11870 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 at least once.
11880 20 44 6f 6e 27 74 20 61 64 64 20 61 6e 79 0a 2a Don't add any.*
11890 2a 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 55 * duplicates. U
118a0 70 64 61 74 65 20 70 54 61 62 6c 65 20 77 69 74 pdate pTable wit
118b0 68 20 65 76 65 72 79 20 6e 65 77 20 23 69 6e 63 h every new #inc
118c0 6c 75 64 65 20 74 68 61 74 20 69 73 20 61 64 64 lude that is add
118d0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f ed..*/.static vo
118e0 69 64 20 41 64 64 49 6e 63 6c 75 64 65 73 28 0a id AddIncludes(.
118f0 20 20 49 6e 63 6c 75 64 65 20 2a 70 49 6e 63 6c Include *pIncl
11900 75 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 ude, /* Wr
11910 69 74 65 20 65 76 65 72 79 20 23 69 6e 63 6c 75 ite every #inclu
11920 64 65 20 6f 6e 20 74 68 69 73 20 6c 69 73 74 20 de on this list
11930 2a 2f 0a 20 20 47 65 6e 53 74 61 74 65 20 2a 70 */. GenState *p
11940 53 74 61 74 65 20 20 20 20 20 20 20 20 20 2f 2a State /*
11950 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f Current state o
11960 66 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 f the code gener
11970 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 ator */.){. if(
11980 20 70 49 6e 63 6c 75 64 65 20 29 7b 0a 20 20 20 pInclude ){.
11990 20 69 66 28 20 70 49 6e 63 6c 75 64 65 2d 3e 70 if( pInclude->p
119a0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 41 64 Next ){. Ad
119b0 64 49 6e 63 6c 75 64 65 73 28 70 49 6e 63 6c 75 dIncludes(pInclu
119c0 64 65 2d 3e 70 4e 65 78 74 2c 70 53 74 61 74 65 de->pNext,pState
119d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 );. }. if(
119e0 20 49 64 65 6e 74 54 61 62 6c 65 49 6e 73 65 72 IdentTableInser
119f0 74 28 70 53 74 61 74 65 2d 3e 70 54 61 62 6c 65 t(pState->pTable
11a00 2c 70 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61 62 65 ,pInclude->zLabe
11a10 6c 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 43 68 l,0) ){. Ch
11a20 61 6e 67 65 49 66 43 6f 6e 74 65 78 74 28 70 49 angeIfContext(pI
11a30 6e 63 6c 75 64 65 2d 3e 7a 49 66 2c 70 53 74 61 nclude->zIf,pSta
11a40 74 65 29 3b 0a 20 20 20 20 20 20 53 74 72 69 6e te);. Strin
11a50 67 41 70 70 65 6e 64 28 70 53 74 61 74 65 2d 3e gAppend(pState->
11a60 70 53 74 72 2c 22 23 69 6e 63 6c 75 64 65 20 22 pStr,"#include "
11a70 2c 30 29 3b 0a 20 20 20 20 20 20 53 74 72 69 6e ,0);. Strin
11a80 67 41 70 70 65 6e 64 28 70 53 74 61 74 65 2d 3e gAppend(pState->
11a90 70 53 74 72 2c 70 49 6e 63 6c 75 64 65 2d 3e 7a pStr,pInclude->z
11aa0 46 69 6c 65 2c 30 29 3b 0a 20 20 20 20 20 20 53 File,0);. S
11ab0 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61 tringAppend(pSta
11ac0 74 65 2d 3e 70 53 74 72 2c 22 5c 6e 22 2c 31 29 te->pStr,"\n",1)
11ad0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f ;. }. }.}../
11ae0 2a 0a 2a 2a 20 41 64 64 20 74 6f 20 74 68 65 20 *.** Add to the
11af0 73 74 72 69 6e 67 20 70 53 74 72 20 61 20 64 65 string pStr a de
11b00 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20 74 68 claration for th
11b10 65 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 e object describ
11b20 65 64 0a 2a 2a 20 69 6e 20 70 44 65 63 6c 2e 0a ed.** in pDecl..
11b30 2a 2a 0a 2a 2a 20 49 66 20 70 44 65 63 6c 20 68 **.** If pDecl h
11b40 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 as already been
11b50 64 65 63 6c 61 72 65 64 20 69 6e 20 74 68 69 73 declared in this
11b60 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 file, detect th
11b70 61 74 0a 2a 2a 20 66 61 63 74 20 61 6e 64 20 61 at.** fact and a
11b80 62 6f 72 74 20 65 61 72 6c 79 2e 20 20 44 6f 20 bort early. Do
11b90 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 20 61 20 not duplicate a
11ba0 64 65 63 6c 61 72 61 74 69 6f 6e 2e 0a 2a 2a 0a declaration..**.
11bb0 2a 2a 20 49 66 20 74 68 65 20 6e 65 65 64 46 75 ** If the needFu
11bc0 6c 6c 44 65 63 6c 20 66 6c 61 67 20 69 73 20 66 llDecl flag is f
11bd0 61 6c 73 65 20 61 6e 64 20 74 68 69 73 20 6f 62 alse and this ob
11be0 6a 65 63 74 20 68 61 73 20 61 20 66 6f 72 77 61 ject has a forwa
11bf0 72 64 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f rd.** declaratio
11c00 6e 2c 20 74 68 65 6e 20 73 75 70 70 6c 79 20 74 n, then supply t
11c10 68 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 he forward decla
11c20 72 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 41 20 ration only. A
11c30 6c 61 74 65 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f later.** call to
11c40 20 43 6f 6d 70 6c 65 74 65 46 6f 72 77 61 72 64 CompleteForward
11c50 44 65 63 6c 61 72 61 74 69 6f 6e 73 28 29 20 77 Declarations() w
11c60 69 6c 6c 20 66 69 6e 69 73 68 20 74 68 65 20 64 ill finish the d
11c70 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 66 6f eclaration.** fo
11c80 72 20 75 73 2e 20 20 42 75 74 20 69 66 20 6e 65 r us. But if ne
11c90 65 64 46 75 6c 6c 44 65 63 6c 20 69 73 20 74 72 edFullDecl is tr
11ca0 75 65 2c 20 77 65 20 6d 75 73 74 20 73 75 70 70 ue, we must supp
11cb0 6c 79 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 64 ly the full.** d
11cc0 65 63 6c 61 72 61 74 69 6f 6e 20 6e 6f 77 2e 20 eclaration now.
11cd0 20 53 6f 6d 65 20 6f 62 6a 65 63 74 73 20 64 6f Some objects do
11ce0 20 6e 6f 74 20 68 61 76 65 20 61 20 66 6f 72 77 not have a forw
11cf0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e ard declaration.
11d00 0a 2a 2a 20 46 6f 72 20 74 68 6f 73 65 20 6f 62 .** For those ob
11d10 6a 65 63 74 73 2c 20 77 65 20 6d 75 73 74 20 70 jects, we must p
11d20 72 69 6e 74 20 74 68 65 20 66 75 6c 6c 20 64 65 rint the full de
11d30 63 6c 61 72 61 74 69 6f 6e 20 6e 6f 77 2e 0a 2a claration now..*
11d40 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 69 74 20 *.** Because it
11d50 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64 75 is illegal to du
11d60 70 6c 69 63 61 74 65 20 61 20 74 79 70 65 64 65 plicate a typede
11d70 66 20 69 6e 20 43 2c 20 63 61 72 65 20 69 73 20 f in C, care is
11d80 74 61 6b 65 6e 0a 2a 2a 20 74 6f 20 69 6e 73 75 taken.** to insu
11d90 72 65 20 74 68 61 74 20 74 79 70 65 64 65 66 73 re that typedefs
11da0 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 69 64 for the same id
11db0 65 6e 74 69 66 69 65 72 20 61 72 65 20 6f 6e 6c entifier are onl
11dc0 79 20 69 73 73 75 65 64 20 6f 6e 63 65 2e 0a 2a y issued once..*
11dd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 65 /.static void De
11de0 63 6c 61 72 65 4f 62 6a 65 63 74 28 0a 20 20 44 clareObject(. D
11df0 65 63 6c 20 2a 70 44 65 63 6c 2c 20 20 20 20 20 ecl *pDecl,
11e00 20 20 20 2f 2a 20 54 68 65 20 74 68 69 6e 67 20 /* The thing
11e10 74 6f 20 62 65 20 64 65 63 6c 61 72 65 64 20 2a to be declared *
11e20 2f 0a 20 20 47 65 6e 53 74 61 74 65 20 2a 70 53 /. GenState *pS
11e30 74 61 74 65 2c 20 20 20 2f 2a 20 43 75 72 72 65 tate, /* Curre
11e40 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 nt state of the
11e50 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 2a code generator *
11e60 2f 0a 20 20 69 6e 74 20 6e 65 65 64 46 75 6c 6c /. int needFull
11e70 44 65 63 6c 20 20 20 20 2f 2a 20 4d 75 73 74 20 Decl /* Must
11e80 68 61 76 65 20 74 68 65 20 66 75 6c 6c 20 64 65 have the full de
11e90 63 6c 61 72 61 74 69 6f 6e 2e 20 20 41 20 66 6f claration. A fo
11ea0 72 77 61 72 64 0a 20 20 20 20 20 20 20 20 20 20 rward.
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 64 * d
11ec0 65 63 6c 61 72 61 74 69 6f 6e 20 69 73 6e 27 74 eclaration isn't
11ed0 20 65 6e 6f 75 67 68 20 2a 2f 0a 29 7b 0a 20 20 enough */.){.
11ee0 44 65 63 6c 20 2a 70 3b 20 20 20 20 20 20 20 20 Decl *p;
11ef0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 62 /* The ob
11f00 6a 65 63 74 20 74 6f 20 62 65 20 64 65 63 6c 61 ject to be decla
11f10 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 red */. int fla
11f20 67 3b 0a 20 20 69 6e 74 20 69 73 43 70 70 3b 20 g;. int isCpp;
11f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
11f40 72 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e rue if generatin
11f50 67 20 43 2b 2b 20 2a 2f 0a 20 20 69 6e 74 20 64 g C++ */. int d
11f60 6f 6e 65 54 79 70 65 64 65 66 20 3d 20 30 3b 20 oneTypedef = 0;
11f70 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 /* True if a t
11f80 79 70 65 64 65 66 20 68 61 73 20 62 65 65 6e 20 ypedef has been
11f90 64 6f 6e 65 20 66 6f 72 20 74 68 69 73 20 6f 62 done for this ob
11fa0 6a 65 63 74 20 2a 2f 0a 0a 20 20 2f 2a 20 70 72 ject */.. /* pr
11fb0 69 6e 74 66 28 22 42 45 47 49 4e 20 25 73 20 6f intf("BEGIN %s o
11fc0 66 20 25 73 5c 6e 22 2c 6e 65 65 64 46 75 6c 6c f %s\n",needFull
11fd0 44 65 63 6c 3f 22 46 55 4c 4c 22 3a 22 50 52 4f Decl?"FULL":"PRO
11fe0 54 4f 54 59 50 45 22 2c 70 44 65 63 6c 2d 3e 7a TOTYPE",pDecl->z
11ff0 4e 61 6d 65 29 3b 2a 2f 0a 20 20 2f 2a 20 0a 20 Name);*/. /* .
12000 20 2a 2a 20 46 6f 72 20 61 6e 79 20 6f 62 6a 65 ** For any obje
12010 63 74 20 74 68 61 74 20 68 61 73 20 61 20 66 6f ct that has a fo
12020 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f rward declaratio
12030 6e 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 n, go ahead and
12040 64 6f 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 77 do the. ** forw
12050 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 ard declaration
12060 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 73 first.. */. is
12070 43 70 70 20 3d 20 28 70 53 74 61 74 65 2d 3e 66 Cpp = (pState->f
12080 6c 61 67 73 20 26 20 44 50 5f 43 70 6c 75 73 70 lags & DP_Cplusp
12090 6c 75 73 29 20 21 3d 20 30 3b 0a 20 20 66 6f 72 lus) != 0;. for
120a0 28 70 3d 70 44 65 63 6c 3b 20 70 3b 20 70 3d 70 (p=pDecl; p; p=p
120b0 2d 3e 70 53 61 6d 65 4e 61 6d 65 29 7b 0a 20 20 ->pSameName){.
120c0 20 20 69 66 28 20 70 2d 3e 7a 46 77 64 20 29 7b if( p->zFwd ){
120d0 0a 20 20 20 20 20 20 69 66 28 20 21 44 65 63 6c . if( !Decl
120e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 44 50 HasProperty(p,DP
120f0 5f 46 6f 72 77 61 72 64 29 20 29 7b 0a 20 20 20 _Forward) ){.
12100 20 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 DeclSetProp
12110 65 72 74 79 28 70 2c 44 50 5f 46 6f 72 77 61 72 erty(p,DP_Forwar
12120 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 d);. if(
12130 73 74 72 6e 63 6d 70 28 70 2d 3e 7a 46 77 64 2c strncmp(p->zFwd,
12140 22 74 79 70 65 64 65 66 22 2c 37 29 3d 3d 30 20 "typedef",7)==0
12150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 ){. if(
12160 20 64 6f 6e 65 54 79 70 65 64 65 66 20 29 20 63 doneTypedef ) c
12170 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 ontinue;.
12180 20 20 20 64 6f 6e 65 54 79 70 65 64 65 66 20 3d doneTypedef =
12190 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 1;. }.
121a0 20 20 20 20 20 20 43 68 61 6e 67 65 49 66 43 6f ChangeIfCo
121b0 6e 74 65 78 74 28 70 2d 3e 7a 49 66 2c 70 53 74 ntext(p->zIf,pSt
121c0 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20 53 74 ate);. St
121d0 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61 74 ringAppend(pStat
121e0 65 2d 3e 70 53 74 72 2c 69 73 43 70 70 20 3f 20 e->pStr,isCpp ?
121f0 70 2d 3e 7a 46 77 64 43 70 70 20 3a 20 70 2d 3e p->zFwdCpp : p->
12200 7a 46 77 64 2c 30 29 3b 0a 20 20 20 20 20 20 7d zFwd,0);. }
12210 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a . }. }.. /*
12220 0a 20 20 2a 2a 20 45 61 72 6c 79 20 6f 75 74 20 . ** Early out
12230 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 if everything is
12240 20 61 6c 72 65 61 64 79 20 73 75 69 74 61 62 6c already suitabl
12250 79 20 64 65 63 6c 61 72 65 64 2e 0a 20 20 2a 2a y declared.. **
12260 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20 . ** This is a
12270 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 73 very important s
12280 74 65 70 20 62 65 63 61 75 73 65 20 69 74 20 70 tep because it p
12290 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 0a revents us from.
122a0 20 20 2a 2a 20 65 78 65 63 75 74 69 6e 67 20 74 ** executing t
122b0 68 65 20 63 6f 64 65 20 74 68 65 20 66 6f 6c 6c he code the foll
122c0 6f 77 73 20 69 6e 20 61 20 72 65 63 75 72 73 69 ows in a recursi
122d0 76 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a ve call to this.
122e0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 69 ** function wi
122f0 74 68 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 th the same valu
12300 65 20 66 6f 72 20 70 44 65 63 6c 2e 0a 20 20 2a e for pDecl.. *
12310 2f 0a 20 20 66 6c 61 67 20 3d 20 6e 65 65 64 46 /. flag = needF
12320 75 6c 6c 44 65 63 6c 20 3f 20 44 50 5f 44 65 63 ullDecl ? DP_Dec
12330 6c 61 72 65 64 7c 44 50 5f 46 6f 72 77 61 72 64 lared|DP_Forward
12340 20 3a 20 44 50 5f 46 6f 72 77 61 72 64 3b 0a 20 : DP_Forward;.
12350 20 66 6f 72 28 70 3d 70 44 65 63 6c 3b 20 70 3b for(p=pDecl; p;
12360 20 70 3d 70 2d 3e 70 53 61 6d 65 4e 61 6d 65 29 p=p->pSameName)
12370 7b 0a 20 20 20 20 69 66 28 20 21 44 65 63 6c 48 {. if( !DeclH
12380 61 73 50 72 6f 70 65 72 74 79 28 70 2c 66 6c 61 asProperty(p,fla
12390 67 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a g) ) break;. }.
123a0 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 if( p==0 ){.
123b0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 return;. }..
123c0 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 73 75 /*. ** Make su
123d0 72 65 20 77 65 20 68 61 76 65 20 61 6c 6c 20 6e re we have all n
123e0 65 63 65 73 73 61 72 79 20 23 69 6e 63 6c 75 64 ecessary #includ
123f0 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 3d es. */. for(p=
12400 70 44 65 63 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 pDecl; p; p=p->p
12410 53 61 6d 65 4e 61 6d 65 29 7b 0a 20 20 20 20 41 SameName){. A
12420 64 64 49 6e 63 6c 75 64 65 73 28 70 2d 3e 70 49 ddIncludes(p->pI
12430 6e 63 6c 75 64 65 2c 70 53 74 61 74 65 29 3b 0a nclude,pState);.
12440 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 47 }.. /*. ** G
12450 6f 20 61 68 65 61 64 20 61 6e 20 6d 61 72 6b 20 o ahead an mark
12460 65 76 65 72 79 74 68 69 6e 67 20 61 73 20 62 65 everything as be
12470 69 6e 67 20 64 65 63 6c 61 72 65 64 2c 20 74 6f ing declared, to
12480 20 70 72 65 76 65 6e 74 20 61 6e 0a 20 20 2a 2a prevent an. **
12490 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 20 74 infinite loop t
124a0 68 72 75 20 74 68 65 20 53 63 61 6e 54 65 78 74 hru the ScanText
124b0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 74 () function. At
124c0 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 0a the same time,.
124d0 20 20 2a 2a 20 77 65 20 64 65 63 69 64 65 20 77 ** we decide w
124e0 68 69 63 68 20 6f 62 6a 65 63 74 73 20 6e 65 65 hich objects nee
124f0 64 20 61 20 66 75 6c 6c 20 64 65 63 6c 61 72 61 d a full declara
12500 74 69 6f 6e 20 61 6e 64 20 6d 61 72 6b 20 74 68 tion and mark th
12510 65 6d 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 em. ** with the
12520 20 44 50 5f 46 6c 61 67 20 62 69 74 2e 20 20 57 DP_Flag bit. W
12530 65 20 61 72 65 20 6f 6e 6c 79 20 61 62 6c 65 20 e are only able
12540 74 6f 20 75 73 65 20 44 50 5f 46 6c 61 67 20 69 to use DP_Flag i
12550 6e 20 74 68 69 73 0a 20 20 2a 2a 20 77 61 79 20 n this. ** way
12560 62 65 63 61 75 73 65 20 77 65 20 6b 6e 6f 77 20 because we know
12570 77 65 27 6c 6c 20 6e 65 76 65 72 20 65 78 65 63 we'll never exec
12580 75 74 65 20 74 68 69 73 20 66 61 72 20 69 6e 74 ute this far int
12590 6f 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 o this. ** func
125a0 74 69 6f 6e 20 6f 6e 20 61 20 72 65 63 75 72 73 tion on a recurs
125b0 69 76 65 20 63 61 6c 6c 20 77 69 74 68 20 74 68 ive call with th
125c0 65 20 73 61 6d 65 20 70 44 65 63 6c 2e 20 20 48 e same pDecl. H
125d0 65 6e 63 65 2c 20 72 65 63 75 72 73 69 76 65 0a ence, recursive.
125e0 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 ** calls to th
125f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 28 74 68 72 is function (thr
12600 6f 75 67 68 20 53 63 61 6e 54 65 78 74 28 29 29 ough ScanText())
12610 20 63 61 6e 20 6e 65 76 65 72 20 63 68 61 6e 67 can never chang
12620 65 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 e the. ** value
12630 20 6f 66 20 44 50 5f 46 6c 61 67 20 6f 75 74 20 of DP_Flag out
12640 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 from under us..
12650 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 44 65 63 */. for(p=pDec
12660 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 61 6d 65 l; p; p=p->pSame
12670 4e 61 6d 65 29 7b 0a 20 20 20 20 69 66 28 20 21 Name){. if( !
12680 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28 DeclHasProperty(
12690 70 2c 44 50 5f 44 65 63 6c 61 72 65 64 29 20 0a p,DP_Declared) .
126a0 20 20 20 20 20 26 26 20 28 70 2d 3e 7a 46 77 64 && (p->zFwd
126b0 3d 3d 30 20 7c 7c 20 6e 65 65 64 46 75 6c 6c 44 ==0 || needFullD
126c0 65 63 6c 29 20 0a 20 20 20 20 20 26 26 20 70 2d ecl) . && p-
126d0 3e 7a 44 65 63 6c 21 3d 30 0a 20 20 20 20 29 7b >zDecl!=0. ){
126e0 0a 20 20 20 20 20 20 44 65 63 6c 53 65 74 50 72 . DeclSetPr
126f0 6f 70 65 72 74 79 28 70 2c 44 50 5f 46 6f 72 77 operty(p,DP_Forw
12700 61 72 64 7c 44 50 5f 44 65 63 6c 61 72 65 64 7c ard|DP_Declared|
12710 44 50 5f 46 6c 61 67 29 3b 0a 20 20 20 20 7d 65 DP_Flag);. }e
12720 6c 73 65 7b 0a 20 20 20 20 20 20 44 65 63 6c 43 lse{. DeclC
12730 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 44 learProperty(p,D
12740 50 5f 46 6c 61 67 29 3b 0a 20 20 20 20 7d 0a 20 P_Flag);. }.
12750 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 61 }.. /*. ** Ca
12760 6c 6c 20 53 63 61 6e 54 65 78 74 28 29 20 72 65 ll ScanText() re
12770 63 75 73 69 76 65 6c 79 20 28 74 68 69 73 20 72 cusively (this r
12780 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 outine is called
12790 20 66 72 6f 6d 20 53 63 61 6e 54 65 78 74 28 29 from ScanText()
127a0 29 0a 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 ). ** to includ
127b0 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 72 e declarations r
127c0 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 65 20 equired to come
127d0 62 65 66 6f 72 65 20 74 68 65 73 65 20 64 65 63 before these dec
127e0 6c 61 72 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a larations.. */.
127f0 20 20 66 6f 72 28 70 3d 70 44 65 63 6c 3b 20 70 for(p=pDecl; p
12800 3b 20 70 3d 70 2d 3e 70 53 61 6d 65 4e 61 6d 65 ; p=p->pSameName
12810 29 7b 0a 20 20 20 20 69 66 28 20 44 65 63 6c 48 ){. if( DeclH
12820 61 73 50 72 6f 70 65 72 74 79 28 70 2c 44 50 5f asProperty(p,DP_
12830 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20 69 Flag) ){. i
12840 66 28 20 70 2d 3e 7a 44 65 63 6c 5b 30 5d 3d 3d f( p->zDecl[0]==
12850 27 23 27 20 29 7b 0a 20 20 20 20 20 20 20 20 53 '#' ){. S
12860 63 61 6e 54 65 78 74 28 26 70 2d 3e 7a 44 65 63 canText(&p->zDec
12870 6c 5b 31 5d 2c 70 53 74 61 74 65 29 3b 0a 20 20 l[1],pState);.
12880 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
12890 20 20 20 49 6e 73 65 72 74 45 78 74 72 61 44 65 InsertExtraDe
128a0 63 6c 28 70 29 3b 0a 20 20 20 20 20 20 20 20 53 cl(p);. S
128b0 63 61 6e 54 65 78 74 28 70 2d 3e 7a 44 65 63 6c canText(p->zDecl
128c0 2c 70 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20 ,pState);.
128d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f }. }. }.. /
128e0 2a 0a 20 20 2a 2a 20 4f 75 74 70 75 74 20 74 68 *. ** Output th
128f0 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 20 e declarations.
12900 20 44 6f 20 74 68 69 73 20 69 6e 20 74 77 6f 20 Do this in two
12910 70 61 73 73 65 73 2e 20 20 46 69 72 73 74 0a 20 passes. First.
12920 20 2a 2a 20 6f 75 74 70 75 74 20 65 76 65 72 79 ** output every
12930 74 68 69 6e 67 20 74 68 61 74 20 69 73 6e 27 74 thing that isn't
12940 20 61 20 74 79 70 65 64 65 66 2e 20 20 54 68 65 a typedef. The
12950 6e 20 67 6f 20 62 61 63 6b 20 61 6e 64 0a 20 20 n go back and.
12960 2a 2a 20 67 65 74 20 74 68 65 20 74 79 70 65 64 ** get the typed
12970 65 66 73 20 62 79 20 74 68 65 20 73 61 6d 65 20 efs by the same
12980 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 name.. */. for
12990 28 70 3d 70 44 65 63 6c 3b 20 70 3b 20 70 3d 70 (p=pDecl; p; p=p
129a0 2d 3e 70 53 61 6d 65 4e 61 6d 65 29 7b 0a 20 20 ->pSameName){.
129b0 20 20 69 66 28 20 44 65 63 6c 48 61 73 50 72 6f if( DeclHasPro
129c0 70 65 72 74 79 28 70 2c 44 50 5f 46 6c 61 67 29 perty(p,DP_Flag)
129d0 20 26 26 20 21 44 65 63 6c 48 61 73 50 72 6f 70 && !DeclHasProp
129e0 65 72 74 79 28 70 2c 54 59 5f 54 79 70 65 64 65 erty(p,TY_Typede
129f0 66 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 f) ){. if(
12a00 44 65 63 6c 48 61 73 41 6e 79 50 72 6f 70 65 72 DeclHasAnyProper
12a10 74 79 28 70 2c 54 59 5f 45 6e 75 6d 65 72 61 74 ty(p,TY_Enumerat
12a20 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 ion) ){.
12a30 69 66 28 20 64 6f 6e 65 54 79 70 65 64 65 66 20 if( doneTypedef
12a40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 ) continue;.
12a50 20 20 20 20 64 6f 6e 65 54 79 70 65 64 65 66 20 doneTypedef
12a60 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 = 1;. }.
12a70 20 20 20 43 68 61 6e 67 65 49 66 43 6f 6e 74 65 ChangeIfConte
12a80 78 74 28 70 2d 3e 7a 49 66 2c 70 53 74 61 74 65 xt(p->zIf,pState
12a90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 );. if( !is
12aa0 43 70 70 20 26 26 20 44 65 63 6c 48 61 73 41 6e Cpp && DeclHasAn
12ab0 79 50 72 6f 70 65 72 74 79 28 70 2c 44 50 5f 45 yProperty(p,DP_E
12ac0 78 74 65 72 6e 52 65 71 64 29 20 29 7b 0a 20 20 xternReqd) ){.
12ad0 20 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 StringAppe
12ae0 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c nd(pState->pStr,
12af0 22 65 78 74 65 72 6e 20 22 2c 30 29 3b 0a 20 20 "extern ",0);.
12b00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 }else if( is
12b10 43 70 70 20 26 26 20 44 65 63 6c 48 61 73 50 72 Cpp && DeclHasPr
12b20 6f 70 65 72 74 79 28 70 2c 44 50 5f 43 70 6c 75 operty(p,DP_Cplu
12b30 73 70 6c 75 73 7c 44 50 5f 45 78 74 65 72 6e 52 splus|DP_ExternR
12b40 65 71 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 eqd) ){.
12b50 53 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 StringAppend(pSt
12b60 61 74 65 2d 3e 70 53 74 72 2c 22 65 78 74 65 72 ate->pStr,"exter
12b70 6e 20 22 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 n ",0);. }e
12b80 6c 73 65 20 69 66 28 20 69 73 43 70 70 20 26 26 lse if( isCpp &&
12b90 20 44 65 63 6c 48 61 73 41 6e 79 50 72 6f 70 65 DeclHasAnyPrope
12ba0 72 74 79 28 70 2c 44 50 5f 45 78 74 65 72 6e 43 rty(p,DP_ExternC
12bb0 52 65 71 64 7c 44 50 5f 45 78 74 65 72 6e 52 65 Reqd|DP_ExternRe
12bc0 71 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 53 qd) ){. S
12bd0 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61 tringAppend(pSta
12be0 74 65 2d 3e 70 53 74 72 2c 22 65 78 74 65 72 6e te->pStr,"extern
12bf0 20 5c 22 43 5c 22 20 22 2c 30 29 3b 0a 20 20 20 \"C\" ",0);.
12c00 20 20 20 7d 0a 20 20 20 20 20 20 49 6e 73 65 72 }. Inser
12c10 74 45 78 74 72 61 44 65 63 6c 28 70 29 3b 0a 20 tExtraDecl(p);.
12c20 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e StringAppen
12c30 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c 70 d(pState->pStr,p
12c40 2d 3e 7a 44 65 63 6c 2c 30 29 3b 0a 20 20 20 20 ->zDecl,0);.
12c50 20 20 69 66 28 20 21 69 73 43 70 70 20 26 26 20 if( !isCpp &&
12c60 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28 DeclHasProperty(
12c70 70 2c 44 50 5f 43 70 6c 75 73 70 6c 75 73 29 20 p,DP_Cplusplus)
12c80 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e ){. fprin
12c90 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 tf(stderr,.
12ca0 20 20 20 20 20 22 25 73 3a 20 43 20 63 6f 64 65 "%s: C code
12cb0 20 6f 75 67 68 74 20 6e 6f 74 20 72 65 66 65 72 ought not refer
12cc0 65 6e 63 65 20 74 68 65 20 43 2b 2b 20 6f 62 6a ence the C++ obj
12cd0 65 63 74 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 ect \"%s\"\n",.
12ce0 20 20 20 20 20 20 20 20 20 70 53 74 61 74 65 2d pState-
12cf0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 2d 3e 7a >zFilename, p->z
12d00 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 Name);. p
12d10 53 74 61 74 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 State->nErr++;.
12d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 44 65 63 }. Dec
12d30 6c 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 lClearProperty(p
12d40 2c 44 50 5f 46 6c 61 67 29 3b 0a 20 20 20 20 7d ,DP_Flag);. }
12d50 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d 70 44 65 . }. for(p=pDe
12d60 63 6c 3b 20 70 20 26 26 20 21 64 6f 6e 65 54 79 cl; p && !doneTy
12d70 70 65 64 65 66 3b 20 70 3d 70 2d 3e 70 53 61 6d pedef; p=p->pSam
12d80 65 4e 61 6d 65 29 7b 0a 20 20 20 20 69 66 28 20 eName){. if(
12d90 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28 DeclHasProperty(
12da0 70 2c 44 50 5f 46 6c 61 67 29 20 29 7b 0a 20 20 p,DP_Flag) ){.
12db0 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20 /* This has
12dc0 74 6f 20 62 65 20 61 20 74 79 70 65 64 65 66 20 to be a typedef
12dd0 2a 2f 0a 20 20 20 20 20 20 64 6f 6e 65 54 79 70 */. doneTyp
12de0 65 64 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 edef = 1;.
12df0 43 68 61 6e 67 65 49 66 43 6f 6e 74 65 78 74 28 ChangeIfContext(
12e00 70 2d 3e 7a 49 66 2c 70 53 74 61 74 65 29 3b 0a p->zIf,pState);.
12e10 20 20 20 20 20 20 49 6e 73 65 72 74 45 78 74 72 InsertExtr
12e20 61 44 65 63 6c 28 70 29 3b 0a 20 20 20 20 20 20 aDecl(p);.
12e30 53 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 StringAppend(pSt
12e40 61 74 65 2d 3e 70 53 74 72 2c 70 2d 3e 7a 44 65 ate->pStr,p->zDe
12e50 63 6c 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d cl,0);. }. }
12e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 .}../*.** This r
12e70 6f 75 74 69 6e 65 20 73 63 61 6e 73 20 74 68 65 outine scans the
12e80 20 69 6e 70 75 74 20 74 65 78 74 20 67 69 76 65 input text give
12e90 6e 2c 20 61 6e 64 20 61 70 70 65 6e 64 73 20 74 n, and appends t
12ea0 6f 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 o the.** string
12eb0 69 6e 20 70 53 74 61 74 65 2d 3e 70 53 74 72 20 in pState->pStr
12ec0 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 79 20 the text of any
12ed0 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 74 68 61 declarations tha
12ee0 74 20 6d 75 73 74 0a 2a 2a 20 6f 63 63 75 72 20 t must.** occur
12ef0 62 65 66 6f 72 65 20 74 68 65 20 74 65 78 74 20 before the text
12f00 69 6e 20 7a 54 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 in zText..**.**
12f10 49 66 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 If an identifier
12f20 20 69 6e 20 7a 54 65 78 74 20 69 73 20 69 6d 6d in zText is imm
12f30 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 65 ediately followe
12f40 64 20 62 79 20 27 2a 27 2c 20 74 68 65 6e 0a 2a d by '*', then.*
12f50 2a 20 6f 6e 6c 79 20 66 6f 72 77 61 72 64 20 64 * only forward d
12f60 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 72 65 20 eclarations are
12f70 6e 65 65 64 65 64 20 66 6f 72 20 74 68 61 74 20 needed for that
12f80 69 64 65 6e 74 69 66 69 65 72 2e 20 20 49 66 20 identifier. If
12f90 74 68 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 the.** identifie
12fa0 72 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 6f r name is not fo
12fb0 6c 6c 6f 77 65 64 20 69 6d 6d 65 64 69 61 74 65 llowed immediate
12fc0 6c 79 20 62 79 20 27 2a 27 2c 20 77 65 20 6d 75 ly by '*', we mu
12fd0 73 74 20 73 75 70 70 6c 79 0a 2a 2a 20 61 20 66 st supply.** a f
12fe0 75 6c 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e ull declaration.
12ff0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
13000 53 63 61 6e 54 65 78 74 28 0a 20 20 63 6f 6e 73 ScanText(. cons
13010 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 20 t char *zText,
13020 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 74 /* The input t
13030 65 78 74 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 ext to be scanne
13040 64 20 2a 2f 0a 20 20 47 65 6e 53 74 61 74 65 20 d */. GenState
13050 2a 70 53 74 61 74 65 20 20 20 20 20 20 2f 2a 20 *pState /*
13060 43 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 Current state of
13070 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 the code genera
13080 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 tor */.){. int
13090 6e 65 78 74 56 61 6c 69 64 20 3d 20 30 3b 20 20 nextValid = 0;
130a0 20 20 2f 2a 20 54 72 75 65 20 69 73 20 73 4e 65 /* True is sNe
130b0 78 74 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 xt contains vali
130c0 64 20 64 61 74 61 20 2a 2f 0a 20 20 49 6e 53 74 d data */. InSt
130d0 72 65 61 6d 20 73 49 6e 3b 20 20 20 20 20 20 20 ream sIn;
130e0 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 74 /* The input t
130f0 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 73 ext */. Token s
13100 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20 2f Token; /
13110 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 6f * The current to
13120 6b 65 6e 20 62 65 69 6e 67 20 65 78 61 6d 69 6e ken being examin
13130 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 73 4e ed */. Token sN
13140 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a ext; /*
13150 20 54 68 65 20 6e 65 78 74 20 6e 6f 6e 2d 73 70 The next non-sp
13160 61 63 65 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 ace token */..
13170 2f 2a 20 70 72 69 6e 74 66 28 22 42 45 47 49 4e /* printf("BEGIN
13180 20 53 43 41 4e 20 54 45 58 54 20 6f 6e 20 25 73 SCAN TEXT on %s
13190 5c 6e 22 2c 20 7a 54 65 78 74 29 3b 20 2a 2f 0a \n", zText); */.
131a0 0a 20 20 73 49 6e 2e 7a 20 3d 20 7a 54 65 78 74 . sIn.z = zText
131b0 3b 0a 20 20 73 49 6e 2e 69 20 3d 20 30 3b 0a 20 ;. sIn.i = 0;.
131c0 20 73 49 6e 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a sIn.nLine = 1;.
131d0 20 20 77 68 69 6c 65 28 20 73 49 6e 2e 7a 5b 73 while( sIn.z[s
131e0 49 6e 2e 69 5d 21 3d 30 20 29 7b 0a 20 20 20 20 In.i]!=0 ){.
131f0 69 66 28 20 6e 65 78 74 56 61 6c 69 64 20 29 7b if( nextValid ){
13200 0a 20 20 20 20 20 20 73 54 6f 6b 65 6e 20 3d 20 . sToken =
13210 73 4e 65 78 74 3b 0a 20 20 20 20 20 20 6e 65 78 sNext;. nex
13220 74 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 tValid = 0;.
13230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 47 65 74 }else{. Get
13240 4e 6f 6e 73 70 61 63 65 54 6f 6b 65 6e 28 26 73 NonspaceToken(&s
13250 49 6e 2c 26 73 54 6f 6b 65 6e 29 3b 0a 20 20 20 In,&sToken);.
13260 20 7d 0a 20 20 20 20 69 66 28 20 73 54 6f 6b 65 }. if( sToke
13270 6e 2e 65 54 79 70 65 3d 3d 54 54 5f 49 64 20 29 n.eType==TT_Id )
13280 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 65 64 {. int need
13290 46 75 6c 6c 44 65 63 6c 3b 20 20 20 2f 2a 20 54 FullDecl; /* T
132a0 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 rue if we need t
132b0 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 66 75 o provide the fu
132c0 6c 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 2c 0a ll declaration,.
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
132e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 ** not
132f0 20 6a 75 73 74 20 74 68 65 20 66 6f 72 77 61 72 just the forwar
13300 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f d declaration */
13310 0a 20 20 20 20 20 20 44 65 63 6c 20 2a 70 44 65 . Decl *pDe
13320 63 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 cl; /* Th
13330 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 68 61 e declaration ha
13340 76 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 69 6e ving the name in
13350 20 73 54 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 sToken */..
13360 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 53 65 /*. ** Se
13370 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 e if there is a
13380 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 20 74 declaration in t
13390 68 65 20 64 61 74 61 62 61 73 65 20 77 69 74 68 he database with
133a0 20 74 68 65 20 6e 61 6d 65 20 67 69 76 65 6e 0a the name given.
133b0 20 20 20 20 20 20 2a 2a 20 62 79 20 73 54 6f 6b ** by sTok
133c0 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 en.. */.
133d0 20 20 20 70 44 65 63 6c 20 3d 20 46 69 6e 64 44 pDecl = FindD
133e0 65 63 6c 28 73 54 6f 6b 65 6e 2e 7a 54 65 78 74 ecl(sToken.zText
133f0 2c 73 54 6f 6b 65 6e 2e 6e 54 65 78 74 29 3b 0a ,sToken.nText);.
13400 20 20 20 20 20 20 69 66 28 20 70 44 65 63 6c 3d if( pDecl=
13410 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a =0 ) continue;..
13420 20 20 20 20 20 20 2f 2a 20 0a 20 20 20 20 20 20 /* .
13430 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 ** If we get thi
13440 73 20 66 61 72 2c 20 77 65 27 76 65 20 66 6f 75 s far, we've fou
13450 6e 64 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 nd an identifier
13460 20 74 68 61 74 20 68 61 73 20 61 20 0a 20 20 20 that has a .
13470 20 20 20 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f ** declaratio
13480 6e 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 n in the databas
13490 65 2e 20 20 4e 6f 77 20 73 65 65 20 69 66 20 77 e. Now see if w
134a0 65 20 74 68 65 20 66 75 6c 6c 20 64 65 63 6c 61 e the full decla
134b0 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 ration. **
134c0 6f 72 20 6a 75 73 74 20 61 20 66 6f 72 77 61 72 or just a forwar
134d0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 0a 20 d declaration..
134e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 47 65 */. Ge
134f0 74 4e 6f 6e 73 70 61 63 65 54 6f 6b 65 6e 28 26 tNonspaceToken(&
13500 73 49 6e 2c 26 73 4e 65 78 74 29 3b 0a 20 20 20 sIn,&sNext);.
13510 20 20 20 69 66 28 20 73 4e 65 78 74 2e 7a 54 65 if( sNext.zTe
13520 78 74 5b 30 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 xt[0]=='*' ){.
13530 20 20 20 20 20 20 6e 65 65 64 46 75 6c 6c 44 65 needFullDe
13540 63 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 cl = 0;. }e
13550 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 65 lse{. nee
13560 64 46 75 6c 6c 44 65 63 6c 20 3d 20 31 3b 0a 20 dFullDecl = 1;.
13570 20 20 20 20 20 20 20 6e 65 78 74 56 61 6c 69 64 nextValid
13580 20 3d 20 73 4e 65 78 74 2e 65 54 79 70 65 3d 3d = sNext.eType==
13590 54 54 5f 49 64 3b 0a 20 20 20 20 20 20 7d 0a 0a TT_Id;. }..
135a0 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a /*. *
135b0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 6e * Generate the n
135c0 65 65 64 65 64 20 64 65 63 6c 61 72 61 74 69 6f eeded declaratio
135d0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 n.. */.
135e0 20 20 44 65 63 6c 61 72 65 4f 62 6a 65 63 74 28 DeclareObject(
135f0 70 44 65 63 6c 2c 70 53 74 61 74 65 2c 6e 65 65 pDecl,pState,nee
13600 64 46 75 6c 6c 44 65 63 6c 29 3b 0a 20 20 20 20 dFullDecl);.
13610 7d 65 6c 73 65 20 69 66 28 20 73 54 6f 6b 65 6e }else if( sToken
13620 2e 65 54 79 70 65 3d 3d 54 54 5f 50 72 65 70 72 .eType==TT_Prepr
13630 6f 63 65 73 73 6f 72 20 29 7b 0a 20 20 20 20 20 ocessor ){.
13640 20 73 49 6e 2e 69 20 2d 3d 20 73 54 6f 6b 65 6e sIn.i -= sToken
13650 2e 6e 54 65 78 74 20 2d 20 31 3b 0a 20 20 20 20 .nText - 1;.
13660 7d 0a 20 20 7d 0a 20 20 2f 2a 20 70 72 69 6e 74 }. }. /* print
13670 66 28 22 45 4e 44 20 53 43 41 4e 54 45 58 54 5c f("END SCANTEXT\
13680 6e 22 29 3b 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a n"); */.}../*.**
13690 20 50 72 6f 76 69 64 65 20 61 20 66 75 6c 6c 20 Provide a full
136a0 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 6f 20 61 declaration to a
136b0 6e 79 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20 ny object which
136c0 73 6f 20 66 61 72 20 68 61 73 20 68 61 64 20 6f so far has had o
136d0 6e 6c 79 0a 2a 2a 20 61 20 66 6f 77 61 72 64 20 nly.** a foward
136e0 64 65 63 6c 61 72 61 74 69 6f 6e 2e 0a 2a 2f 0a declaration..*/.
136f0 73 74 61 74 69 63 20 76 6f 69 64 20 43 6f 6d 70 static void Comp
13700 6c 65 74 65 46 6f 72 77 61 72 64 44 65 63 6c 61 leteForwardDecla
13710 72 61 74 69 6f 6e 73 28 47 65 6e 53 74 61 74 65 rations(GenState
13720 20 2a 70 53 74 61 74 65 29 7b 0a 20 20 44 65 63 *pState){. Dec
13730 6c 20 2a 70 44 65 63 6c 3b 0a 20 20 69 6e 74 20 l *pDecl;. int
13740 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20 64 6f 7b progress;.. do{
13750 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 . progress =
13760 30 3b 0a 20 20 20 20 66 6f 72 28 70 44 65 63 6c 0;. for(pDecl
13770 3d 70 44 65 63 6c 46 69 72 73 74 3b 20 70 44 65 =pDeclFirst; pDe
13780 63 6c 3b 20 70 44 65 63 6c 3d 70 44 65 63 6c 2d cl; pDecl=pDecl-
13790 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 >pNext){. i
137a0 66 28 20 44 65 63 6c 48 61 73 50 72 6f 70 65 72 f( DeclHasProper
137b0 74 79 28 70 44 65 63 6c 2c 44 50 5f 46 6f 72 77 ty(pDecl,DP_Forw
137c0 61 72 64 29 20 0a 20 20 20 20 20 20 20 26 26 20 ard) . &&
137d0 21 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 !DeclHasProperty
137e0 28 70 44 65 63 6c 2c 44 50 5f 44 65 63 6c 61 72 (pDecl,DP_Declar
137f0 65 64 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 ed) . ){.
13800 20 20 20 20 20 20 44 65 63 6c 61 72 65 4f 62 6a DeclareObj
13810 65 63 74 28 70 44 65 63 6c 2c 70 53 74 61 74 65 ect(pDecl,pState
13820 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 70 72 6f ,1);. pro
13830 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 gress = 1;.
13840 20 20 20 61 73 73 65 72 74 28 20 44 65 63 6c 48 assert( DeclH
13850 61 73 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c asProperty(pDecl
13860 2c 44 50 5f 44 65 63 6c 61 72 65 64 29 20 29 3b ,DP_Declared) );
13870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
13880 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 }while( progres
13890 73 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 s );.}../*.** Ge
138a0 6e 65 72 61 74 65 20 61 6e 20 69 6e 63 6c 75 64 nerate an includ
138b0 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 67 e file for the g
138c0 69 76 65 6e 20 73 6f 75 72 63 65 20 66 69 6c 65 iven source file
138d0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 . Return the nu
138e0 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 mber.** of error
138f0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a s encountered..*
13900 2a 0a 2a 2a 20 69 66 20 6e 6f 6c 6f 63 61 6c 5f *.** if nolocal_
13910 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 flag is true, th
13920 65 6e 20 77 65 20 64 6f 20 6e 6f 74 20 67 65 6e en we do not gen
13930 65 72 61 74 65 20 64 65 63 6c 61 72 61 74 69 6f erate declaratio
13940 6e 73 20 66 6f 72 0a 2a 2a 20 6f 62 6a 65 63 74 ns for.** object
13950 65 64 20 6d 61 72 6b 65 64 20 44 50 5f 4c 6f 63 ed marked DP_Loc
13960 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e al..*/.static in
13970 74 20 4d 61 6b 65 48 65 61 64 65 72 28 49 6e 46 t MakeHeader(InF
13980 69 6c 65 20 2a 70 46 69 6c 65 2c 20 46 49 4c 45 ile *pFile, FILE
13990 20 2a 72 65 70 6f 72 74 2c 20 69 6e 74 20 6e 6f *report, int no
139a0 6c 6f 63 61 6c 5f 66 6c 61 67 29 7b 0a 20 20 69 local_flag){. i
139b0 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 47 nt nErr = 0;. G
139c0 65 6e 53 74 61 74 65 20 73 53 74 61 74 65 3b 0a enState sState;.
139d0 20 20 53 74 72 69 6e 67 20 6f 75 74 53 74 72 3b String outStr;
139e0 0a 20 20 49 64 65 6e 74 54 61 62 6c 65 20 69 6e . IdentTable in
139f0 63 6c 75 64 65 54 61 62 6c 65 3b 0a 20 20 49 64 cludeTable;. Id
13a00 65 6e 74 20 2a 70 49 64 3b 0a 20 20 63 68 61 72 ent *pId;. char
13a10 20 2a 7a 4e 65 77 56 65 72 73 69 6f 6e 3b 0a 20 *zNewVersion;.
13a20 20 63 68 61 72 20 2a 7a 4f 6c 64 56 65 72 73 69 char *zOldVersi
13a30 6f 6e 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 on;.. if( pFile
13a40 2d 3e 7a 48 64 72 3d 3d 30 20 7c 7c 20 2a 70 46 ->zHdr==0 || *pF
13a50 69 6c 65 2d 3e 7a 48 64 72 3d 3d 30 20 29 20 72 ile->zHdr==0 ) r
13a60 65 74 75 72 6e 20 30 3b 0a 20 20 73 53 74 61 74 eturn 0;. sStat
13a70 65 2e 70 53 74 72 20 3d 20 26 6f 75 74 53 74 72 e.pStr = &outStr
13a80 3b 0a 20 20 53 74 72 69 6e 67 49 6e 69 74 28 26 ;. StringInit(&
13a90 6f 75 74 53 74 72 29 3b 0a 20 20 53 74 72 69 6e outStr);. Strin
13aa0 67 41 70 70 65 6e 64 28 26 6f 75 74 53 74 72 2c gAppend(&outStr,
13ab0 7a 54 6f 70 4c 69 6e 65 2c 6e 54 6f 70 4c 69 6e zTopLine,nTopLin
13ac0 65 29 3b 0a 20 20 73 53 74 61 74 65 2e 70 54 61 e);. sState.pTa
13ad0 62 6c 65 20 3d 20 26 69 6e 63 6c 75 64 65 54 61 ble = &includeTa
13ae0 62 6c 65 3b 0a 20 20 6d 65 6d 73 65 74 28 26 69 ble;. memset(&i
13af0 6e 63 6c 75 64 65 54 61 62 6c 65 2c 30 2c 73 69 ncludeTable,0,si
13b00 7a 65 6f 66 28 69 6e 63 6c 75 64 65 54 61 62 6c zeof(includeTabl
13b10 65 29 29 3b 0a 20 20 73 53 74 61 74 65 2e 7a 49 e));. sState.zI
13b20 66 20 3d 20 30 3b 0a 20 20 73 53 74 61 74 65 2e f = 0;. sState.
13b30 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73 53 74 61 nErr = 0;. sSta
13b40 74 65 2e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 70 te.zFilename = p
13b50 46 69 6c 65 2d 3e 7a 53 72 63 3b 0a 20 20 73 53 File->zSrc;. sS
13b60 74 61 74 65 2e 66 6c 61 67 73 20 3d 20 70 46 69 tate.flags = pFi
13b70 6c 65 2d 3e 66 6c 61 67 73 20 26 20 44 50 5f 43 le->flags & DP_C
13b80 70 6c 75 73 70 6c 75 73 3b 0a 20 20 52 65 73 65 plusplus;. Rese
13b90 74 44 65 63 6c 46 6c 61 67 73 28 6e 6f 6c 6f 63 tDeclFlags(noloc
13ba0 61 6c 5f 66 6c 61 67 20 3f 20 22 6e 6f 22 20 3a al_flag ? "no" :
13bb0 20 70 46 69 6c 65 2d 3e 7a 53 72 63 29 3b 0a 20 pFile->zSrc);.
13bc0 20 66 6f 72 28 70 49 64 20 3d 20 70 46 69 6c 65 for(pId = pFile
13bd0 2d 3e 69 64 54 61 62 6c 65 2e 70 4c 69 73 74 3b ->idTable.pList;
13be0 20 70 49 64 3b 20 70 49 64 3d 70 49 64 2d 3e 70 pId; pId=pId->p
13bf0 4e 65 78 74 29 7b 0a 20 20 20 20 44 65 63 6c 20 Next){. Decl
13c00 2a 70 44 65 63 6c 20 3d 20 46 69 6e 64 44 65 63 *pDecl = FindDec
13c10 6c 28 70 49 64 2d 3e 7a 4e 61 6d 65 2c 30 29 3b l(pId->zName,0);
13c20 0a 20 20 20 20 69 66 28 20 70 44 65 63 6c 20 29 . if( pDecl )
13c30 7b 0a 20 20 20 20 20 20 44 65 63 6c 61 72 65 4f {. DeclareO
13c40 62 6a 65 63 74 28 70 44 65 63 6c 2c 26 73 53 74 bject(pDecl,&sSt
13c50 61 74 65 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 ate,1);. }.
13c60 7d 0a 20 20 43 6f 6d 70 6c 65 74 65 46 6f 72 77 }. CompleteForw
13c70 61 72 64 44 65 63 6c 61 72 61 74 69 6f 6e 73 28 ardDeclarations(
13c80 26 73 53 74 61 74 65 29 3b 0a 20 20 43 68 61 6e &sState);. Chan
13c90 67 65 49 66 43 6f 6e 74 65 78 74 28 30 2c 26 73 geIfContext(0,&s
13ca0 53 74 61 74 65 29 3b 0a 20 20 6e 45 72 72 20 2b State);. nErr +
13cb0 3d 20 73 53 74 61 74 65 2e 6e 45 72 72 3b 0a 20 = sState.nErr;.
13cc0 20 7a 4f 6c 64 56 65 72 73 69 6f 6e 20 3d 20 52 zOldVersion = R
13cd0 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 7a eadFile(pFile->z
13ce0 48 64 72 29 3b 0a 20 20 7a 4e 65 77 56 65 72 73 Hdr);. zNewVers
13cf0 69 6f 6e 20 3d 20 53 74 72 69 6e 67 47 65 74 28 ion = StringGet(
13d00 26 6f 75 74 53 74 72 29 3b 0a 20 20 69 66 28 20 &outStr);. if(
13d10 72 65 70 6f 72 74 20 29 20 66 70 72 69 6e 74 66 report ) fprintf
13d20 28 72 65 70 6f 72 74 2c 22 25 73 3a 20 22 2c 70 (report,"%s: ",p
13d30 46 69 6c 65 2d 3e 7a 48 64 72 29 3b 0a 20 20 69 File->zHdr);. i
13d40 66 28 20 7a 4f 6c 64 56 65 72 73 69 6f 6e 3d 3d f( zOldVersion==
13d50 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 70 0 ){. if( rep
13d60 6f 72 74 20 29 20 66 70 72 69 6e 74 66 28 72 65 ort ) fprintf(re
13d70 70 6f 72 74 2c 22 75 70 64 61 74 65 64 5c 6e 22 port,"updated\n"
13d80 29 3b 0a 20 20 20 20 69 66 28 20 57 72 69 74 65 );. if( Write
13d90 46 69 6c 65 28 70 46 69 6c 65 2d 3e 7a 48 64 72 File(pFile->zHdr
13da0 2c 7a 4e 65 77 56 65 72 73 69 6f 6e 29 20 29 7b ,zNewVersion) ){
13db0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 . fprintf(s
13dc0 74 64 65 72 72 2c 22 25 73 3a 20 43 61 6e 27 74 tderr,"%s: Can't
13dd0 20 77 72 69 74 65 20 74 6f 20 66 69 6c 65 5c 6e write to file\n
13de0 22 2c 70 46 69 6c 65 2d 3e 7a 48 64 72 29 3b 0a ",pFile->zHdr);.
13df0 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 nErr++;.
13e00 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 }. }else if(
13e10 73 74 72 6e 63 6d 70 28 7a 4f 6c 64 56 65 72 73 strncmp(zOldVers
13e20 69 6f 6e 2c 7a 54 6f 70 4c 69 6e 65 2c 6e 54 6f ion,zTopLine,nTo
13e30 70 4c 69 6e 65 29 21 3d 30 20 29 7b 0a 20 20 20 pLine)!=0 ){.
13e40 20 69 66 28 20 72 65 70 6f 72 74 20 29 20 66 70 if( report ) fp
13e50 72 69 6e 74 66 28 72 65 70 6f 72 74 2c 22 65 72 rintf(report,"er
13e60 72 6f 72 21 5c 6e 22 29 3b 0a 20 20 20 20 66 70 ror!\n");. fp
13e70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 rintf(stderr,.
13e80 20 20 20 20 20 22 25 73 3a 20 43 61 6e 27 74 20 "%s: Can't
13e90 6f 76 65 72 77 72 69 74 65 20 74 68 69 73 20 66 overwrite this f
13ea0 69 6c 65 20 62 65 63 61 75 73 65 20 69 74 20 77 ile because it w
13eb0 61 73 6e 27 74 20 70 72 65 76 69 6f 75 73 6c 79 asn't previously
13ec0 5c 6e 22 0a 20 20 20 20 20 20 20 22 25 2a 73 20 \n". "%*s
13ed0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 27 6d generated by 'm
13ee0 61 6b 65 68 65 61 64 65 72 73 27 2e 5c 6e 22 2c akeheaders'.\n",
13ef0 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 7a . pFile->z
13f00 48 64 72 2c 20 73 74 72 6c 65 6e 28 70 46 69 6c Hdr, strlen(pFil
13f10 65 2d 3e 7a 48 64 72 29 2c 20 22 22 29 3b 0a 20 e->zHdr), "");.
13f20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 65 6c nErr++;. }el
13f30 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f se if( strcmp(zO
13f40 6c 64 56 65 72 73 69 6f 6e 2c 7a 4e 65 77 56 65 ldVersion,zNewVe
13f50 72 73 69 6f 6e 29 21 3d 30 20 29 7b 0a 20 20 20 rsion)!=0 ){.
13f60 20 69 66 28 20 72 65 70 6f 72 74 20 29 20 66 70 if( report ) fp
13f70 72 69 6e 74 66 28 72 65 70 6f 72 74 2c 22 75 70 rintf(report,"up
13f80 64 61 74 65 64 5c 6e 22 29 3b 0a 20 20 20 20 69 dated\n");. i
13f90 66 28 20 57 72 69 74 65 46 69 6c 65 28 70 46 69 f( WriteFile(pFi
13fa0 6c 65 2d 3e 7a 48 64 72 2c 7a 4e 65 77 56 65 72 le->zHdr,zNewVer
13fb0 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 66 sion) ){. f
13fc0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 printf(stderr,"%
13fd0 73 3a 20 43 61 6e 27 74 20 77 72 69 74 65 20 74 s: Can't write t
13fe0 6f 20 66 69 6c 65 5c 6e 22 2c 70 46 69 6c 65 2d o file\n",pFile-
13ff0 3e 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 6e 45 >zHdr);. nE
14000 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 rr++;. }. }e
14010 6c 73 65 20 69 66 28 20 72 65 70 6f 72 74 20 29 lse if( report )
14020 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 72 65 {. fprintf(re
14030 70 6f 72 74 2c 22 75 6e 63 68 61 6e 67 65 64 5c port,"unchanged\
14040 6e 22 29 3b 0a 20 20 7d 0a 20 20 53 61 66 65 46 n");. }. SafeF
14050 72 65 65 28 7a 4f 6c 64 56 65 72 73 69 6f 6e 29 ree(zOldVersion)
14060 3b 20 0a 20 20 49 64 65 6e 74 54 61 62 6c 65 52 ; . IdentTableR
14070 65 73 65 74 28 26 69 6e 63 6c 75 64 65 54 61 62 eset(&includeTab
14080 6c 65 29 3b 0a 20 20 53 74 72 69 6e 67 52 65 73 le);. StringRes
14090 65 74 28 26 6f 75 74 53 74 72 29 3b 0a 20 20 72 et(&outStr);. r
140a0 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f eturn nErr;.}../
140b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 *.** Generate a
140c0 67 6c 6f 62 61 6c 20 68 65 61 64 65 72 20 66 69 global header fi
140d0 6c 65 20 2d 2d 20 61 20 68 65 61 64 65 72 20 66 le -- a header f
140e0 69 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e ile that contain
140f0 73 20 61 6c 6c 0a 2a 2a 20 64 65 63 6c 61 72 61 s all.** declara
14100 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 20 66 tions. If the f
14110 6f 72 45 78 70 6f 72 74 20 66 6c 61 67 20 69 73 orExport flag is
14120 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 true, then only
14130 20 74 68 6f 73 65 0a 2a 2a 20 6f 62 6a 65 63 74 those.** object
14140 73 20 74 68 61 74 20 61 72 65 20 65 78 70 6f 72 s that are expor
14150 74 65 64 20 61 72 65 20 69 6e 63 6c 75 64 65 64 ted are included
14160 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 66 in the header f
14170 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ile..*/.static i
14180 6e 74 20 4d 61 6b 65 47 6c 6f 62 61 6c 48 65 61 nt MakeGlobalHea
14190 64 65 72 28 69 6e 74 20 66 6f 72 45 78 70 6f 72 der(int forExpor
141a0 74 29 7b 0a 20 20 47 65 6e 53 74 61 74 65 20 73 t){. GenState s
141b0 53 74 61 74 65 3b 0a 20 20 53 74 72 69 6e 67 20 State;. String
141c0 6f 75 74 53 74 72 3b 0a 20 20 49 64 65 6e 74 54 outStr;. IdentT
141d0 61 62 6c 65 20 69 6e 63 6c 75 64 65 54 61 62 6c able includeTabl
141e0 65 3b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63 6c e;. Decl *pDecl
141f0 3b 0a 0a 20 20 73 53 74 61 74 65 2e 70 53 74 72 ;.. sState.pStr
14200 20 3d 20 26 6f 75 74 53 74 72 3b 0a 20 20 53 74 = &outStr;. St
14210 72 69 6e 67 49 6e 69 74 28 26 6f 75 74 53 74 72 ringInit(&outStr
14220 29 3b 0a 20 20 2f 2a 20 53 74 72 69 6e 67 41 70 );. /* StringAp
14230 70 65 6e 64 28 26 6f 75 74 53 74 72 2c 7a 54 6f pend(&outStr,zTo
14240 70 4c 69 6e 65 2c 6e 54 6f 70 4c 69 6e 65 29 3b pLine,nTopLine);
14250 20 2a 2f 0a 20 20 73 53 74 61 74 65 2e 70 54 61 */. sState.pTa
14260 62 6c 65 20 3d 20 26 69 6e 63 6c 75 64 65 54 61 ble = &includeTa
14270 62 6c 65 3b 0a 20 20 6d 65 6d 73 65 74 28 26 69 ble;. memset(&i
14280 6e 63 6c 75 64 65 54 61 62 6c 65 2c 30 2c 73 69 ncludeTable,0,si
14290 7a 65 6f 66 28 69 6e 63 6c 75 64 65 54 61 62 6c zeof(includeTabl
142a0 65 29 29 3b 0a 20 20 73 53 74 61 74 65 2e 7a 49 e));. sState.zI
142b0 66 20 3d 20 30 3b 0a 20 20 73 53 74 61 74 65 2e f = 0;. sState.
142c0 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73 53 74 61 nErr = 0;. sSta
142d0 74 65 2e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 te.zFilename = "
142e0 28 61 6c 6c 29 22 3b 0a 20 20 73 53 74 61 74 65 (all)";. sState
142f0 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 52 65 .flags = 0;. Re
14300 73 65 74 44 65 63 6c 46 6c 61 67 73 28 30 29 3b setDeclFlags(0);
14310 0a 20 20 66 6f 72 28 70 44 65 63 6c 3d 70 44 65 . for(pDecl=pDe
14320 63 6c 46 69 72 73 74 3b 20 70 44 65 63 6c 3b 20 clFirst; pDecl;
14330 70 44 65 63 6c 3d 70 44 65 63 6c 2d 3e 70 4e 65 pDecl=pDecl->pNe
14340 78 74 29 7b 0a 20 20 20 20 69 66 28 20 66 6f 72 xt){. if( for
14350 45 78 70 6f 72 74 3d 3d 30 20 7c 7c 20 44 65 63 Export==0 || Dec
14360 6c 48 61 73 50 72 6f 70 65 72 74 79 28 70 44 65 lHasProperty(pDe
14370 63 6c 2c 44 50 5f 45 78 70 6f 72 74 29 20 29 7b cl,DP_Export) ){
14380 0a 20 20 20 20 20 20 44 65 63 6c 61 72 65 4f 62 . DeclareOb
14390 6a 65 63 74 28 70 44 65 63 6c 2c 26 73 53 74 61 ject(pDecl,&sSta
143a0 74 65 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d te,1);. }. }
143b0 0a 20 20 43 68 61 6e 67 65 49 66 43 6f 6e 74 65 . ChangeIfConte
143c0 78 74 28 30 2c 26 73 53 74 61 74 65 29 3b 0a 20 xt(0,&sState);.
143d0 20 70 72 69 6e 74 66 28 22 25 73 22 2c 53 74 72 printf("%s",Str
143e0 69 6e 67 47 65 74 28 26 6f 75 74 53 74 72 29 29 ingGet(&outStr))
143f0 3b 0a 20 20 49 64 65 6e 74 54 61 62 6c 65 52 65 ;. IdentTableRe
14400 73 65 74 28 26 69 6e 63 6c 75 64 65 54 61 62 6c set(&includeTabl
14410 65 29 3b 0a 20 20 53 74 72 69 6e 67 52 65 73 65 e);. StringRese
14420 74 28 26 6f 75 74 53 74 72 29 3b 0a 20 20 72 65 t(&outStr);. re
14430 74 75 72 6e 20 30 3b 20 20 0a 7d 0a 0a 23 69 66 turn 0; .}..#if
14440 64 65 66 20 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 def DEBUG./*.**
14450 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 Return the numbe
14460 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 r of characters
14470 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 in the given str
14480 69 6e 67 20 70 72 69 6f 72 20 74 6f 20 74 68 65 ing prior to the
14490 0a 2a 2a 20 66 69 72 73 74 20 6e 65 77 6c 69 6e .** first newlin
144a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 e..*/.static int
144b0 20 43 6c 69 70 54 72 61 69 6c 69 6e 67 4e 65 77 ClipTrailingNew
144c0 6c 69 6e 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 line(char *z){.
144d0 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 int n = strlen(
144e0 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 z);. while( n>0
144f0 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 5c 6e && (z[n-1]=='\n
14500 27 20 7c 7c 20 7a 5b 6e 2d 31 5d 3d 3d 27 5c 72 ' || z[n-1]=='\r
14510 27 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 ') ){ n--; }. r
14520 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn n;.}../*.*
14530 2a 20 44 75 6d 70 20 74 68 65 20 65 6e 74 69 72 * Dump the entir
14540 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c 69 e declaration li
14550 73 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 st for debugging
14560 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 purposes.*/.sta
14570 74 69 63 20 76 6f 69 64 20 44 75 6d 70 44 65 63 tic void DumpDec
14580 6c 4c 69 73 74 28 76 6f 69 64 29 7b 0a 20 20 44 lList(void){. D
14590 65 63 6c 20 2a 70 44 65 63 6c 3b 0a 0a 20 20 66 ecl *pDecl;.. f
145a0 6f 72 28 70 44 65 63 6c 20 3d 20 70 44 65 63 6c or(pDecl = pDecl
145b0 46 69 72 73 74 3b 20 70 44 65 63 6c 3b 20 70 44 First; pDecl; pD
145c0 65 63 6c 3d 70 44 65 63 6c 2d 3e 70 4e 65 78 74 ecl=pDecl->pNext
145d0 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2a ){. printf("*
145e0 2a 2a 2a 20 25 73 20 66 72 6f 6d 20 66 69 6c 65 *** %s from file
145f0 20 25 73 20 2a 2a 2a 2a 5c 6e 22 2c 70 44 65 63 %s ****\n",pDec
14600 6c 2d 3e 7a 4e 61 6d 65 2c 70 44 65 63 6c 2d 3e l->zName,pDecl->
14610 7a 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 zFile);. if(
14620 70 44 65 63 6c 2d 3e 7a 49 66 20 29 7b 0a 20 20 pDecl->zIf ){.
14630 20 20 20 20 70 72 69 6e 74 66 28 22 49 66 3a 20 printf("If:
14640 5b 25 2e 2a 73 5d 5c 6e 22 2c 43 6c 69 70 54 72 [%.*s]\n",ClipTr
14650 61 69 6c 69 6e 67 4e 65 77 6c 69 6e 65 28 70 44 ailingNewline(pD
14660 65 63 6c 2d 3e 7a 49 66 29 2c 70 44 65 63 6c 2d ecl->zIf),pDecl-
14670 3e 7a 49 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 >zIf);. }.
14680 20 69 66 28 20 70 44 65 63 6c 2d 3e 7a 46 77 64 if( pDecl->zFwd
14690 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 ){. printf
146a0 28 22 44 65 63 6c 3a 20 5b 25 2e 2a 73 5d 5c 6e ("Decl: [%.*s]\n
146b0 22 2c 43 6c 69 70 54 72 61 69 6c 69 6e 67 4e 65 ",ClipTrailingNe
146c0 77 6c 69 6e 65 28 70 44 65 63 6c 2d 3e 7a 46 77 wline(pDecl->zFw
146d0 64 29 2c 70 44 65 63 6c 2d 3e 7a 46 77 64 29 3b d),pDecl->zFwd);
146e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 . }. if( p
146f0 44 65 63 6c 2d 3e 7a 44 65 63 6c 20 29 7b 0a 20 Decl->zDecl ){.
14700 20 20 20 20 20 49 6e 73 65 72 74 45 78 74 72 61 InsertExtra
14710 44 65 63 6c 28 70 44 65 63 6c 29 3b 0a 20 20 20 Decl(pDecl);.
14720 20 20 20 70 72 69 6e 74 66 28 22 44 65 66 3a 20 printf("Def:
14730 5b 25 2e 2a 73 5d 5c 6e 22 2c 43 6c 69 70 54 72 [%.*s]\n",ClipTr
14740 61 69 6c 69 6e 67 4e 65 77 6c 69 6e 65 28 70 44 ailingNewline(pD
14750 65 63 6c 2d 3e 7a 44 65 63 6c 29 2c 70 44 65 63 ecl->zDecl),pDec
14760 6c 2d 3e 7a 44 65 63 6c 29 3b 0a 20 20 20 20 7d l->zDecl);. }
14770 0a 20 20 20 20 69 66 28 20 70 44 65 63 6c 2d 3e . if( pDecl->
14780 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 73 flags ){. s
14790 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 tatic struct {.
147a0 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b int mask;
147b0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 64 . char *d
147c0 65 73 63 3b 0a 20 20 20 20 20 20 7d 20 66 6c 61 esc;. } fla
147d0 67 53 65 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 gSet[] = {.
147e0 20 20 20 7b 20 54 59 5f 43 6c 61 73 73 2c 20 20 { TY_Class,
147f0 20 20 20 20 20 22 63 6c 61 73 73 22 20 7d 2c 0a "class" },.
14800 20 20 20 20 20 20 20 20 7b 20 54 59 5f 45 6e 75 { TY_Enu
14810 6d 65 72 61 74 69 6f 6e 2c 20 22 65 6e 75 6d 22 meration, "enum"
14820 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 54 59 },. { TY
14830 5f 53 74 72 75 63 74 75 72 65 2c 20 20 20 22 73 _Structure, "s
14840 74 72 75 63 74 22 20 7d 2c 0a 20 20 20 20 20 20 truct" },.
14850 20 20 7b 20 54 59 5f 55 6e 69 6f 6e 2c 20 20 20 { TY_Union,
14860 20 20 20 20 22 75 6e 69 6f 6e 22 20 7d 2c 0a 20 "union" },.
14870 20 20 20 20 20 20 20 7b 20 54 59 5f 56 61 72 69 { TY_Vari
14880 61 62 6c 65 2c 20 20 20 20 22 76 61 72 69 61 62 able, "variab
14890 6c 65 22 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b le" },. {
148a0 20 54 59 5f 53 75 62 72 6f 75 74 69 6e 65 2c 20 TY_Subroutine,
148b0 20 22 66 75 6e 63 74 69 6f 6e 22 20 7d 2c 0a 20 "function" },.
148c0 20 20 20 20 20 20 20 7b 20 54 59 5f 54 79 70 65 { TY_Type
148d0 64 65 66 2c 20 20 20 20 20 22 74 79 70 65 64 65 def, "typede
148e0 66 22 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 f" },. {
148f0 54 59 5f 4d 61 63 72 6f 2c 20 20 20 20 20 20 20 TY_Macro,
14900 22 6d 61 63 72 6f 22 20 7d 2c 0a 20 20 20 20 20 "macro" },.
14910 20 20 20 7b 20 44 50 5f 45 78 70 6f 72 74 2c 20 { DP_Export,
14920 20 20 20 20 20 22 65 78 70 6f 72 74 22 20 7d 2c "export" },
14930 0a 20 20 20 20 20 20 20 20 7b 20 44 50 5f 4c 6f . { DP_Lo
14940 63 61 6c 2c 20 20 20 20 20 20 20 22 6c 6f 63 61 cal, "loca
14950 6c 22 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 l" },. {
14960 44 50 5f 43 70 6c 75 73 70 6c 75 73 2c 20 20 20 DP_Cplusplus,
14970 22 43 2b 2b 22 20 7d 2c 0a 20 20 20 20 20 20 7d "C++" },. }
14980 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 ;. int i;.
14990 20 20 20 20 20 70 72 69 6e 74 66 28 22 66 6c 61 printf("fla
149a0 67 73 3a 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 gs:");. for
149b0 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 66 (i=0; i<sizeof(f
149c0 6c 61 67 53 65 74 29 2f 73 69 7a 65 6f 66 28 66 lagSet)/sizeof(f
149d0 6c 61 67 53 65 74 5b 30 5d 29 3b 20 69 2b 2b 29 lagSet[0]); i++)
149e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c {. if( fl
149f0 61 67 53 65 74 5b 69 5d 2e 6d 61 73 6b 20 26 20 agSet[i].mask &
14a00 70 44 65 63 6c 2d 3e 66 6c 61 67 73 20 29 7b 0a pDecl->flags ){.
14a10 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 printf
14a20 28 22 20 25 73 22 2c 20 66 6c 61 67 53 65 74 5b (" %s", flagSet[
14a30 69 5d 2e 64 65 73 63 29 3b 0a 20 20 20 20 20 20 i].desc);.
14a40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
14a50 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a printf("\n");.
14a60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 }. if( pD
14a70 65 63 6c 2d 3e 70 49 6e 63 6c 75 64 65 20 29 7b ecl->pInclude ){
14a80 0a 20 20 20 20 20 20 49 6e 63 6c 75 64 65 20 2a . Include *
14a90 70 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 p;. printf(
14aa0 22 69 6e 63 6c 75 64 65 73 3a 22 29 3b 0a 20 20 "includes:");.
14ab0 20 20 20 20 66 6f 72 28 70 3d 70 44 65 63 6c 2d for(p=pDecl-
14ac0 3e 70 49 6e 63 6c 75 64 65 3b 20 70 3b 20 70 3d >pInclude; p; p=
14ad0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 p->pNext){.
14ae0 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c printf(" %s",
14af0 70 2d 3e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 p->zFile);.
14b00 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 }. printf(
14b10 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d "\n");. }. }
14b20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a .}.#endif../*.**
14b30 20 57 68 65 6e 20 74 68 65 20 22 2d 64 6f 63 22 When the "-doc"
14b40 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 command-line op
14b50 74 69 6f 6e 20 69 73 20 75 73 65 64 2c 20 74 68 tion is used, th
14b60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 is routine is ca
14b70 6c 6c 65 64 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 lled.** to print
14b80 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 all of the data
14b90 62 61 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e base information
14ba0 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 to standard out
14bb0 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 put..*/.static v
14bc0 6f 69 64 20 44 6f 63 75 6d 65 6e 74 61 74 69 6f oid Documentatio
14bd0 6e 44 75 6d 70 28 76 6f 69 64 29 7b 0a 20 20 44 nDump(void){. D
14be0 65 63 6c 20 2a 70 44 65 63 6c 3b 0a 20 20 73 74 ecl *pDecl;. st
14bf0 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 atic struct {.
14c00 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 20 20 int mask;.
14c10 63 68 61 72 20 66 6c 61 67 3b 0a 20 20 7d 20 66 char flag;. } f
14c20 6c 61 67 53 65 74 5b 5d 20 3d 20 7b 0a 20 20 20 lagSet[] = {.
14c30 20 7b 20 54 59 5f 43 6c 61 73 73 2c 20 20 20 20 { TY_Class,
14c40 20 20 20 27 63 27 20 7d 2c 0a 20 20 20 20 7b 20 'c' },. {
14c50 54 59 5f 45 6e 75 6d 65 72 61 74 69 6f 6e 2c 20 TY_Enumeration,
14c60 27 65 27 20 7d 2c 0a 20 20 20 20 7b 20 54 59 5f 'e' },. { TY_
14c70 53 74 72 75 63 74 75 72 65 2c 20 20 20 27 73 27 Structure, 's'
14c80 20 7d 2c 0a 20 20 20 20 7b 20 54 59 5f 55 6e 69 },. { TY_Uni
14c90 6f 6e 2c 20 20 20 20 20 20 20 27 75 27 20 7d 2c on, 'u' },
14ca0 0a 20 20 20 20 7b 20 54 59 5f 56 61 72 69 61 62 . { TY_Variab
14cb0 6c 65 2c 20 20 20 20 27 76 27 20 7d 2c 0a 20 20 le, 'v' },.
14cc0 20 20 7b 20 54 59 5f 53 75 62 72 6f 75 74 69 6e { TY_Subroutin
14cd0 65 2c 20 20 27 66 27 20 7d 2c 0a 20 20 20 20 7b e, 'f' },. {
14ce0 20 54 59 5f 54 79 70 65 64 65 66 2c 20 20 20 20 TY_Typedef,
14cf0 20 27 74 27 20 7d 2c 0a 20 20 20 20 7b 20 54 59 't' },. { TY
14d00 5f 4d 61 63 72 6f 2c 20 20 20 20 20 20 20 27 6d _Macro, 'm
14d10 27 20 7d 2c 0a 20 20 20 20 7b 20 44 50 5f 45 78 ' },. { DP_Ex
14d20 70 6f 72 74 2c 20 20 20 20 20 20 27 78 27 20 7d port, 'x' }
14d30 2c 0a 20 20 20 20 7b 20 44 50 5f 4c 6f 63 61 6c ,. { DP_Local
14d40 2c 20 20 20 20 20 20 20 27 6c 27 20 7d 2c 0a 20 , 'l' },.
14d50 20 20 20 7b 20 44 50 5f 43 70 6c 75 73 70 6c 75 { DP_Cplusplu
14d60 73 2c 20 20 20 27 2b 27 20 7d 2c 0a 20 20 7d 3b s, '+' },. };
14d70 0a 0a 20 20 66 6f 72 28 70 44 65 63 6c 20 3d 20 .. for(pDecl =
14d80 70 44 65 63 6c 46 69 72 73 74 3b 20 70 44 65 63 pDeclFirst; pDec
14d90 6c 3b 20 70 44 65 63 6c 3d 70 44 65 63 6c 2d 3e l; pDecl=pDecl->
14da0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 pNext){. int
14db0 69 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 61 62 65 i;. int nLabe
14dc0 6c 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 l = 0;. char
14dd0 2a 7a 44 65 63 6c 3b 0a 20 20 20 20 63 68 61 72 *zDecl;. char
14de0 20 7a 4c 61 62 65 6c 5b 35 30 5d 3b 0a 20 20 20 zLabel[50];.
14df0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 for(i=0; i<size
14e00 6f 66 28 66 6c 61 67 53 65 74 29 2f 73 69 7a 65 of(flagSet)/size
14e10 6f 66 28 66 6c 61 67 53 65 74 5b 30 5d 29 3b 20 of(flagSet[0]);
14e20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 i++){. if(
14e30 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28 DeclHasProperty(
14e40 70 44 65 63 6c 2c 66 6c 61 67 53 65 74 5b 69 5d pDecl,flagSet[i]
14e50 2e 6d 61 73 6b 29 20 29 7b 0a 20 20 20 20 20 20 .mask) ){.
14e60 20 20 7a 4c 61 62 65 6c 5b 6e 4c 61 62 65 6c 2b zLabel[nLabel+
14e70 2b 5d 20 3d 20 66 6c 61 67 53 65 74 5b 69 5d 2e +] = flagSet[i].
14e80 66 6c 61 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 flag;. }.
14e90 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 61 62 }. if( nLab
14ea0 65 6c 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 el==0 ) continue
14eb0 3b 0a 20 20 20 20 7a 4c 61 62 65 6c 5b 6e 4c 61 ;. zLabel[nLa
14ec0 62 65 6c 5d 20 3d 20 30 3b 0a 20 20 20 20 49 6e bel] = 0;. In
14ed0 73 65 72 74 45 78 74 72 61 44 65 63 6c 28 70 44 sertExtraDecl(pD
14ee0 65 63 6c 29 3b 0a 20 20 20 20 7a 44 65 63 6c 20 ecl);. zDecl
14ef0 3d 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 3b 0a = pDecl->zDecl;.
14f00 20 20 20 20 69 66 28 20 7a 44 65 63 6c 3d 3d 30 if( zDecl==0
14f10 20 29 20 7a 44 65 63 6c 20 3d 20 70 44 65 63 6c ) zDecl = pDecl
14f20 2d 3e 7a 46 77 64 3b 0a 20 20 20 20 70 72 69 6e ->zFwd;. prin
14f30 74 66 28 22 25 73 20 25 73 20 25 73 20 25 64 20 tf("%s %s %s %d
14f40 25 64 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e %d %d %d %d %d\n
14f50 22 2c 0a 20 20 20 20 20 20 20 70 44 65 63 6c 2d ",. pDecl-
14f60 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 7a >zName,. z
14f70 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 70 44 Label,. pD
14f80 65 63 6c 2d 3e 7a 46 69 6c 65 2c 0a 20 20 20 20 ecl->zFile,.
14f90 20 20 20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65 pDecl->pComme
14fa0 6e 74 20 3f 20 28 69 6e 74 29 70 44 65 63 6c 2d nt ? (int)pDecl-
14fb0 3e 70 43 6f 6d 6d 65 6e 74 2f 73 69 7a 65 6f 66 >pComment/sizeof
14fc0 28 54 6f 6b 65 6e 29 20 3a 20 30 2c 0a 20 20 20 (Token) : 0,.
14fd0 20 20 20 20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d pDecl->pComm
14fe0 65 6e 74 20 3f 20 70 44 65 63 6c 2d 3e 70 43 6f ent ? pDecl->pCo
14ff0 6d 6d 65 6e 74 2d 3e 6e 54 65 78 74 2b 31 20 3a mment->nText+1 :
15000 20 30 2c 0a 20 20 20 20 20 20 20 70 44 65 63 6c 0,. pDecl
15010 2d 3e 7a 49 66 20 3f 20 73 74 72 6c 65 6e 28 70 ->zIf ? strlen(p
15020 44 65 63 6c 2d 3e 7a 49 66 29 2b 31 20 3a 20 30 Decl->zIf)+1 : 0
15030 2c 0a 20 20 20 20 20 20 20 7a 44 65 63 6c 20 3f ,. zDecl ?
15040 20 73 74 72 6c 65 6e 28 7a 44 65 63 6c 29 20 3a strlen(zDecl) :
15050 20 30 2c 0a 20 20 20 20 20 20 20 70 44 65 63 6c 0,. pDecl
15060 2d 3e 70 43 6f 6d 6d 65 6e 74 20 3f 20 70 44 65 ->pComment ? pDe
15070 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 2d 3e 6e 4c cl->pComment->nL
15080 69 6e 65 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 ine : 0,.
15090 70 44 65 63 6c 2d 3e 74 6f 6b 65 6e 43 6f 64 65 pDecl->tokenCode
150a0 2e 6e 54 65 78 74 20 3f 20 70 44 65 63 6c 2d 3e .nText ? pDecl->
150b0 74 6f 6b 65 6e 43 6f 64 65 2e 6e 54 65 78 74 2b tokenCode.nText+
150c0 31 20 3a 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 1 : 0. );.
150d0 20 69 66 28 20 70 44 65 63 6c 2d 3e 70 43 6f 6d if( pDecl->pCom
150e0 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 72 ment ){. pr
150f0 69 6e 74 66 28 22 25 2e 2a 73 5c 6e 22 2c 70 44 intf("%.*s\n",pD
15100 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 2d 3e 6e ecl->pComment->n
15110 54 65 78 74 2c 20 70 44 65 63 6c 2d 3e 70 43 6f Text, pDecl->pCo
15120 6d 6d 65 6e 74 2d 3e 7a 54 65 78 74 29 3b 0a 20 mment->zText);.
15130 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 65 }. if( pDe
15140 63 6c 2d 3e 7a 49 66 20 29 7b 0a 20 20 20 20 20 cl->zIf ){.
15150 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 70 printf("%s\n",p
15160 44 65 63 6c 2d 3e 7a 49 66 29 3b 0a 20 20 20 20 Decl->zIf);.
15170 7d 0a 20 20 20 20 69 66 28 20 7a 44 65 63 6c 20 }. if( zDecl
15180 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 ){. printf(
15190 22 25 73 22 2c 7a 44 65 63 6c 29 3b 0a 20 20 20 "%s",zDecl);.
151a0 20 7d 0a 20 20 20 20 69 66 28 20 70 44 65 63 6c }. if( pDecl
151b0 2d 3e 74 6f 6b 65 6e 43 6f 64 65 2e 6e 54 65 78 ->tokenCode.nTex
151c0 74 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 t ){. print
151d0 66 28 22 25 2e 2a 73 5c 6e 22 2c 70 44 65 63 6c f("%.*s\n",pDecl
151e0 2d 3e 74 6f 6b 65 6e 43 6f 64 65 2e 6e 54 65 78 ->tokenCode.nTex
151f0 74 2c 20 70 44 65 63 6c 2d 3e 74 6f 6b 65 6e 43 t, pDecl->tokenC
15200 6f 64 65 2e 7a 54 65 78 74 29 3b 0a 20 20 20 20 ode.zText);.
15210 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 }. }.}../*.** G
15220 69 76 65 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 iven the complet
15230 65 20 74 65 78 74 20 6f 66 20 61 6e 20 69 6e 70 e text of an inp
15240 75 74 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f ut file, this ro
15250 75 74 69 6e 65 20 70 72 69 6e 74 73 20 61 0a 2a utine prints a.*
15260 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 * documentation
15270 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 68 record for the h
15280 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 74 eader comment at
15290 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f the beginning o
152a0 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 28 69 f the.** file (i
152b0 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 f the file has a
152c0 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 2e header comment.
152d0 29 0a 2a 2f 0a 76 6f 69 64 20 50 72 69 6e 74 4d ).*/.void PrintM
152e0 6f 64 75 6c 65 52 65 63 6f 72 64 28 63 6f 6e 73 oduleRecord(cons
152f0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 63 t char *zFile, c
15300 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 onst char *zFile
15310 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a name){. int i;.
15320 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 static int add
15330 72 20 3d 20 35 3b 0a 20 20 77 68 69 6c 65 28 20 r = 5;. while(
15340 69 73 73 70 61 63 65 28 2a 7a 46 69 6c 65 29 20 isspace(*zFile)
15350 29 7b 20 7a 46 69 6c 65 2b 2b 3b 20 7d 0a 20 20 ){ zFile++; }.
15360 69 66 28 20 2a 7a 46 69 6c 65 21 3d 27 2f 27 20 if( *zFile!='/'
15370 7c 7c 20 7a 46 69 6c 65 5b 31 5d 21 3d 27 2a 27 || zFile[1]!='*'
15380 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 ) return;. for
15390 28 69 3d 32 3b 20 7a 46 69 6c 65 5b 69 5d 20 26 (i=2; zFile[i] &
153a0 26 20 28 7a 46 69 6c 65 5b 69 2d 31 5d 21 3d 27 & (zFile[i-1]!='
153b0 2f 27 20 7c 7c 20 7a 46 69 6c 65 5b 69 2d 32 5d /' || zFile[i-2]
153c0 21 3d 27 2a 27 29 3b 20 69 2b 2b 29 7b 7d 0a 20 !='*'); i++){}.
153d0 20 69 66 28 20 7a 46 69 6c 65 5b 69 5d 3d 3d 30 if( zFile[i]==0
153e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 72 69 ) return;. pri
153f0 6e 74 66 28 22 25 73 20 4d 20 25 73 20 25 64 20 ntf("%s M %s %d
15400 25 64 20 30 20 30 20 30 20 30 5c 6e 25 2e 2a 73 %d 0 0 0 0\n%.*s
15410 5c 6e 22 2c 0a 20 20 20 20 7a 46 69 6c 65 6e 61 \n",. zFilena
15420 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 61 me, zFilename, a
15430 64 64 72 2c 20 69 2b 31 2c 20 69 2c 20 7a 46 69 ddr, i+1, i, zFi
15440 6c 65 29 3b 0a 20 20 61 64 64 72 20 2b 3d 20 34 le);. addr += 4
15450 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 ;.}.../*.** Give
15460 6e 20 61 6e 20 69 6e 70 75 74 20 61 72 67 75 6d n an input argum
15470 65 6e 74 20 74 6f 20 74 68 65 20 70 72 6f 67 72 ent to the progr
15480 61 6d 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20 am, construct a
15490 6e 65 77 20 49 6e 46 69 6c 65 0a 2a 2a 20 6f 62 new InFile.** ob
154a0 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ject..*/.static
154b0 49 6e 46 69 6c 65 20 2a 43 72 65 61 74 65 49 6e InFile *CreateIn
154c0 46 69 6c 65 28 63 68 61 72 20 2a 7a 41 72 67 2c File(char *zArg,
154d0 20 69 6e 74 20 2a 70 6e 45 72 72 29 7b 0a 20 20 int *pnErr){.
154e0 69 6e 74 20 6e 53 72 63 3b 0a 20 20 63 68 61 72 int nSrc;. char
154f0 20 2a 7a 53 72 63 3b 0a 20 20 49 6e 46 69 6c 65 *zSrc;. InFile
15500 20 2a 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 69 *pFile;. int i
15510 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 65 ;.. /* . ** Ge
15520 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 t the name of th
15530 65 20 69 6e 70 75 74 20 66 69 6c 65 20 74 6f 20 e input file to
15540 62 65 20 73 63 61 6e 6e 65 64 0a 20 20 2a 2f 0a be scanned. */.
15550 20 20 7a 53 72 63 20 3d 20 7a 41 72 67 3b 0a 20 zSrc = zArg;.
15560 20 66 6f 72 28 6e 53 72 63 3d 30 3b 20 7a 53 72 for(nSrc=0; zSr
15570 63 5b 6e 53 72 63 5d 20 26 26 20 7a 41 72 67 5b c[nSrc] && zArg[
15580 6e 53 72 63 5d 21 3d 27 3a 27 3b 20 6e 53 72 63 nSrc]!=':'; nSrc
15590 2b 2b 29 7b 7d 0a 20 20 70 46 69 6c 65 20 3d 20 ++){}. pFile =
155a0 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 SafeMalloc( size
155b0 6f 66 28 49 6e 46 69 6c 65 29 20 29 3b 0a 20 20 of(InFile) );.
155c0 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 30 2c 73 memset(pFile,0,s
155d0 69 7a 65 6f 66 28 49 6e 46 69 6c 65 29 29 3b 0a izeof(InFile));.
155e0 20 20 70 46 69 6c 65 2d 3e 7a 53 72 63 20 3d 20 pFile->zSrc =
155f0 53 74 72 44 75 70 28 7a 53 72 63 2c 6e 53 72 63 StrDup(zSrc,nSrc
15600 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 );.. /* Figure
15610 6f 75 74 20 69 66 20 77 65 20 61 72 65 20 64 65 out if we are de
15620 61 6c 69 6e 67 20 77 69 74 68 20 43 20 6f 72 20 aling with C or
15630 43 2b 2b 20 63 6f 64 65 2e 20 20 41 73 73 75 6d C++ code. Assum
15640 65 20 61 6e 79 0a 20 20 2a 2a 20 66 69 6c 65 20 e any. ** file
15650 77 69 74 68 20 22 2e 63 22 20 6f 72 20 22 2e 68 with ".c" or ".h
15660 22 20 69 73 20 43 20 63 6f 64 65 20 61 6e 64 20 " is C code and
15670 61 6c 6c 20 65 6c 73 65 20 69 73 20 43 2b 2b 2e all else is C++.
15680 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 53 72 63 . */. if( nSrc
15690 3e 32 20 26 26 20 7a 53 72 63 5b 6e 53 72 63 2d >2 && zSrc[nSrc-
156a0 32 5d 3d 3d 27 2e 27 20 26 26 20 28 7a 53 72 63 2]=='.' && (zSrc
156b0 5b 6e 53 72 63 2d 31 5d 3d 3d 27 63 27 20 7c 7c [nSrc-1]=='c' ||
156c0 20 7a 53 72 63 5b 6e 53 72 63 2d 31 5d 3d 3d 27 zSrc[nSrc-1]=='
156d0 68 27 29 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d h')){. pFile-
156e0 3e 66 6c 61 67 73 20 26 3d 20 7e 44 50 5f 43 70 >flags &= ~DP_Cp
156f0 6c 75 73 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 lusplus;. }else
15700 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 66 6c 61 {. pFile->fla
15710 67 73 20 7c 3d 20 44 50 5f 43 70 6c 75 73 70 6c gs |= DP_Cpluspl
15720 75 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 us;. }.. /*.
15730 2a 2a 20 49 66 20 61 20 73 65 70 61 72 61 74 65 ** If a separate
15740 20 68 65 61 64 65 72 20 66 69 6c 65 20 69 73 20 header file is
15750 73 70 65 63 69 66 69 65 64 2c 20 75 73 65 20 69 specified, use i
15760 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53 72 t. */. if( zSr
15770 63 5b 6e 53 72 63 5d 3d 3d 27 3a 27 20 29 7b 0a c[nSrc]==':' ){.
15780 20 20 20 20 69 6e 74 20 6e 48 64 72 3b 0a 20 20 int nHdr;.
15790 20 20 63 68 61 72 20 2a 7a 48 64 72 3b 0a 20 20 char *zHdr;.
157a0 20 20 7a 48 64 72 20 3d 20 26 7a 53 72 63 5b 6e zHdr = &zSrc[n
157b0 53 72 63 2b 31 5d 3b 0a 20 20 20 20 66 6f 72 28 Src+1];. for(
157c0 6e 48 64 72 3d 30 3b 20 7a 48 64 72 5b 6e 48 64 nHdr=0; zHdr[nHd
157d0 72 5d 20 26 26 20 7a 48 64 72 5b 6e 48 64 72 5d r] && zHdr[nHdr]
157e0 21 3d 27 3a 27 3b 20 6e 48 64 72 2b 2b 29 7b 7d !=':'; nHdr++){}
157f0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 48 64 72 . pFile->zHdr
15800 20 3d 20 53 74 72 44 75 70 28 7a 48 64 72 2c 6e = StrDup(zHdr,n
15810 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 Hdr);. }.. /*
15820 4c 6f 6f 6b 20 66 6f 72 20 61 6e 79 20 27 63 27 Look for any 'c'
15830 20 6f 72 20 27 43 27 20 69 6e 20 74 68 65 20 73 or 'C' in the s
15840 75 66 66 69 78 20 6f 66 20 74 68 65 20 66 69 6c uffix of the fil
15850 65 20 6e 61 6d 65 20 61 6e 64 20 63 68 61 6e 67 e name and chang
15860 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61 72 e. ** that char
15870 61 63 74 65 72 20 74 6f 20 27 68 27 20 6f 72 20 acter to 'h' or
15880 27 48 27 20 72 65 73 70 65 63 74 69 76 65 6c 79 'H' respectively
15890 2e 20 20 49 66 20 6e 6f 20 27 63 27 20 6f 72 20 . If no 'c' or
158a0 27 43 27 20 69 73 20 66 6f 75 6e 64 2c 0a 20 20 'C' is found,.
158b0 2a 2a 20 74 68 65 6e 20 61 73 73 75 6d 65 20 77 ** then assume w
158c0 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 e are dealing wi
158d0 74 68 20 61 20 68 65 61 64 65 72 2e 0a 20 20 2a th a header.. *
158e0 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e /. else{. in
158f0 74 20 66 6f 75 6e 64 43 20 3d 20 30 3b 0a 20 20 t foundC = 0;.
15900 20 20 70 46 69 6c 65 2d 3e 7a 48 64 72 20 3d 20 pFile->zHdr =
15910 53 74 72 44 75 70 28 7a 53 72 63 2c 6e 53 72 63 StrDup(zSrc,nSrc
15920 29 3b 0a 20 20 20 20 66 6f 72 28 69 20 3d 20 6e );. for(i = n
15930 53 72 63 2d 31 3b 20 69 3e 30 20 26 26 20 70 46 Src-1; i>0 && pF
15940 69 6c 65 2d 3e 7a 48 64 72 5b 69 5d 21 3d 27 2e ile->zHdr[i]!='.
15950 27 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 '; i--){. i
15960 66 28 20 70 46 69 6c 65 2d 3e 7a 48 64 72 5b 69 f( pFile->zHdr[i
15970 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20 20 20 ]=='c' ){.
15980 20 20 66 6f 75 6e 64 43 20 3d 20 31 3b 0a 20 20 foundC = 1;.
15990 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 7a 48 64 pFile->zHd
159a0 72 5b 69 5d 20 3d 20 27 68 27 3b 0a 20 20 20 20 r[i] = 'h';.
159b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 46 69 6c }else if( pFil
159c0 65 2d 3e 7a 48 64 72 5b 69 5d 3d 3d 27 43 27 20 e->zHdr[i]=='C'
159d0 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 75 6e 64 ){. found
159e0 43 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 C = 1;. p
159f0 46 69 6c 65 2d 3e 7a 48 64 72 5b 69 5d 20 3d 20 File->zHdr[i] =
15a00 27 48 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 'H';. }.
15a10 20 7d 0a 20 20 20 20 69 66 28 20 21 66 6f 75 6e }. if( !foun
15a20 64 43 20 29 7b 0a 20 20 20 20 20 20 53 61 66 65 dC ){. Safe
15a30 46 72 65 65 28 70 46 69 6c 65 2d 3e 7a 48 64 72 Free(pFile->zHdr
15a40 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e );. pFile->
15a50 7a 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a zHdr = 0;. }.
15a60 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 }.. /*. ** I
15a70 66 20 70 46 69 6c 65 2d 3e 7a 53 72 63 20 63 6f f pFile->zSrc co
15a80 6e 74 61 69 6e 73 20 6e 6f 20 27 63 27 20 6f 72 ntains no 'c' or
15a90 20 27 43 27 20 69 6e 20 69 74 73 20 65 78 74 65 'C' in its exte
15aa0 6e 73 69 6f 6e 2c 20 69 74 0a 20 20 2a 2a 20 6d nsion, it. ** m
15ab0 75 73 74 20 62 65 20 61 20 68 65 61 64 65 72 20 ust be a header
15ac0 66 69 6c 65 2e 20 20 20 49 6e 20 74 68 61 74 20 file. In that
15ad0 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f case, we need to
15ae0 20 73 65 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 set the . ** P
15af0 53 5f 49 6e 74 65 72 66 61 63 65 20 66 6c 61 67 S_Interface flag
15b00 2e 0a 20 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e .. */. pFile->
15b10 66 6c 61 67 73 20 7c 3d 20 50 53 5f 49 6e 74 65 flags |= PS_Inte
15b20 72 66 61 63 65 3b 0a 20 20 66 6f 72 28 69 3d 6e rface;. for(i=n
15b30 53 72 63 2d 31 3b 20 69 3e 30 20 26 26 20 7a 53 Src-1; i>0 && zS
15b40 72 63 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 rc[i]!='.'; i--)
15b50 7b 0a 20 20 20 20 69 66 28 20 7a 53 72 63 5b 69 {. if( zSrc[i
15b60 5d 3d 3d 27 63 27 20 7c 7c 20 7a 53 72 63 5b 69 ]=='c' || zSrc[i
15b70 5d 3d 3d 27 43 27 20 29 7b 0a 20 20 20 20 20 20 ]=='C' ){.
15b80 70 46 69 6c 65 2d 3e 66 6c 61 67 73 20 26 3d 20 pFile->flags &=
15b90 7e 50 53 5f 49 6e 74 65 72 66 61 63 65 3b 0a 20 ~PS_Interface;.
15ba0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
15bb0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 }. }.. /* Done
15bc0 21 20 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e ! . */. return
15bd0 20 70 46 69 6c 65 3b 0a 7d 0a 0a 2f 2a 20 4d 53 pFile;.}../* MS
15be0 2d 57 69 6e 64 6f 77 73 20 61 6e 64 20 4d 53 2d -Windows and MS-
15bf0 44 4f 53 20 62 6f 74 68 20 68 61 76 65 20 74 68 DOS both have th
15c00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 72 69 e following seri
15c10 6f 75 73 20 4f 53 20 62 75 67 3a 20 20 74 68 65 ous OS bug: the
15c20 0a 2a 2a 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 .** length of a
15c30 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 69 73 20 command line is
15c40 73 65 76 65 72 65 6c 79 20 72 65 73 74 72 69 63 severely restric
15c50 74 65 64 2e 20 20 42 75 74 20 74 68 69 73 20 70 ted. But this p
15c60 72 6f 67 72 61 6d 0a 2a 2a 20 6f 63 63 61 73 69 rogram.** occasi
15c70 6f 6e 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 onally requires
15c80 6c 6f 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e long command lin
15c90 65 73 2e 20 20 48 65 6e 63 65 20 74 68 65 20 66 es. Hence the f
15ca0 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 77 6f 72 6b ollowing.** work
15cb0 20 61 72 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 around..**.** I
15cc0 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 f the parameters
15cd0 20 22 2d 66 20 46 49 4c 45 4e 41 4d 45 22 20 61 "-f FILENAME" a
15ce0 70 70 65 61 72 20 61 6e 79 77 68 65 72 65 20 6f ppear anywhere o
15cf0 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 n the command li
15d00 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 ne,.** then the
15d10 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 73 63 named file is sc
15d20 61 6e 6e 65 64 20 66 6f 72 20 61 64 64 69 74 69 anned for additi
15d30 6f 6e 61 6c 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e onal command lin
15d40 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 e arguments..**
15d50 54 68 65 73 65 20 61 72 67 75 6d 65 6e 74 73 20 These arguments
15d60 61 72 65 20 73 75 62 73 74 69 74 75 74 65 64 20 are substituted
15d70 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 in place of the
15d80 22 46 49 4c 45 4e 41 4d 45 22 20 61 72 67 75 6d "FILENAME" argum
15d90 65 6e 74 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 ent.** in the or
15da0 69 67 69 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 iginal argument
15db0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 list..**.** This
15dc0 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 first parameter
15dd0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 to this routine
15de0 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 is the index of
15df0 20 74 68 65 20 22 2d 66 22 0a 2a 2a 20 70 61 72 the "-f".** par
15e00 61 6d 65 74 65 72 20 69 6e 20 74 68 65 20 61 72 ameter in the ar
15e10 67 76 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65 gv[] array. The
15e20 20 61 72 67 63 20 61 6e 64 20 61 72 67 76 20 61 argc and argv a
15e30 72 65 20 70 61 73 73 65 64 20 62 79 0a 2a 2a 20 re passed by.**
15e40 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20 pointer so that
15e50 74 68 65 79 20 63 61 6e 20 62 65 20 63 68 61 6e they can be chan
15e60 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 69 ged..**.** Parsi
15e70 6e 67 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 ng of the parame
15e80 74 65 72 73 20 69 6e 20 74 68 65 20 66 69 6c 65 ters in the file
15e90 20 69 73 20 76 65 72 79 20 73 69 6d 70 6c 65 2e is very simple.
15ea0 20 20 50 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 Parameters.**
15eb0 63 61 6e 20 62 65 20 73 65 70 61 72 61 74 65 64 can be separated
15ec0 20 62 79 20 61 6e 79 20 61 6d 6f 75 6e 74 20 6f by any amount o
15ed0 66 20 77 68 69 74 65 2d 73 70 61 63 65 20 28 69 f white-space (i
15ee0 6e 63 6c 75 64 69 6e 67 20 6e 65 77 6c 69 6e 65 ncluding newline
15ef0 73 0a 2a 2a 20 61 6e 64 20 63 61 72 72 69 61 67 s.** and carriag
15f00 65 20 72 65 74 75 72 6e 73 2e 29 20 20 54 68 65 e returns.) The
15f10 72 65 20 61 72 65 20 6e 6f 77 20 71 75 6f 74 69 re are now quoti
15f20 6e 67 20 63 68 61 72 61 63 74 65 72 73 20 6f 66 ng characters of
15f30 20 61 6e 79 0a 2a 2a 20 6b 69 6e 64 2e 20 20 54 any.** kind. T
15f40 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 74 he length of a t
15f50 6f 6b 65 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 oken is limited
15f60 74 6f 20 61 62 6f 75 74 20 31 30 30 30 20 63 68 to about 1000 ch
15f70 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 aracters..*/.sta
15f80 74 69 63 20 76 6f 69 64 20 41 64 64 50 61 72 61 tic void AddPara
15f90 6d 65 74 65 72 73 28 69 6e 74 20 69 6e 64 65 78 meters(int index
15fa0 2c 20 69 6e 74 20 2a 70 41 72 67 63 2c 20 63 68 , int *pArgc, ch
15fb0 61 72 20 2a 2a 2a 70 41 72 67 76 29 7b 0a 20 20 ar ***pArgv){.
15fc0 69 6e 74 20 61 72 67 63 20 3d 20 2a 70 41 72 67 int argc = *pArg
15fd0 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f c; /* The o
15fe0 72 69 67 69 6e 61 6c 20 61 72 67 63 20 76 61 6c riginal argc val
15ff0 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 ue */. char **a
16000 72 67 76 20 3d 20 2a 70 41 72 67 76 3b 20 20 20 rgv = *pArgv;
16010 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 /* The original
16020 61 72 67 76 20 76 61 6c 75 65 20 2a 2f 0a 20 20 argv value */.
16030 69 6e 74 20 6e 65 77 41 72 67 63 3b 20 20 20 20 int newArgc;
16040 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 /* Value
16050 20 66 6f 72 20 61 72 67 63 20 61 66 74 65 72 20 for argc after
16060 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 61 72 inserting new ar
16070 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 guments */. cha
16080 72 20 2a 2a 7a 4e 65 77 20 3d 20 30 3b 20 20 20 r **zNew = 0;
16090 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 /* The new
160a0 61 72 67 76 20 61 66 74 65 72 20 74 68 69 73 20 argv after this
160b0 72 6f 75 74 69 6e 65 20 69 73 20 64 6f 6e 65 20 routine is done
160c0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 */. char *zFile
160d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
160e0 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 Name of the inpu
160f0 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 t file */. int
16100 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 nNew = 0;
16110 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
16120 20 6e 65 77 20 65 6e 74 72 69 65 73 20 69 6e 20 new entries in
16130 74 68 65 20 61 72 67 76 5b 5d 20 66 69 6c 65 20 the argv[] file
16140 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 */. int nAlloc
16150 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 = 0; /*
16160 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 Space allocated
16170 66 6f 72 20 7a 4e 65 77 5b 5d 20 2a 2f 0a 20 20 for zNew[] */.
16180 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 int i;
16190 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 /* Loop
161a0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 counter */. int
161b0 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 n;
161c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
161d0 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 f characters in
161e0 61 20 6e 65 77 20 61 72 67 75 6d 65 6e 74 20 2a a new argument *
161f0 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 /. int c;
16200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
16210 65 78 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 ext character of
16220 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 input */. int
16230 73 74 61 72 74 4f 66 4c 69 6e 65 20 3d 20 31 3b startOfLine = 1;
16240 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 /* True if w
16250 65 20 61 72 65 20 77 68 65 72 65 20 27 23 27 20 e are where '#'
16260 63 61 6e 20 73 74 61 72 74 20 61 20 63 6f 6d 6d can start a comm
16270 65 6e 74 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 ent */. FILE *i
16280 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n;
16290 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69 /* The input fi
162a0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 7a 42 75 le */. char zBu
162b0 66 5b 31 30 30 30 5d 3b 20 20 20 20 20 20 20 20 f[1000];
162c0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 61 72 67 75 /* A single argu
162d0 6d 65 6e 74 20 69 73 20 61 63 63 75 6d 75 6c 61 ment is accumula
162e0 74 65 64 20 68 65 72 65 20 2a 2f 0a 0a 20 20 69 ted here */.. i
162f0 66 28 20 69 6e 64 65 78 2b 31 3d 3d 61 72 67 63 f( index+1==argc
16300 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 46 69 ) return;. zFi
16310 6c 65 20 3d 20 61 72 67 76 5b 69 6e 64 65 78 2b le = argv[index+
16320 31 5d 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 1];. in = fopen
16330 28 7a 46 69 6c 65 2c 22 72 22 29 3b 0a 20 20 69 (zFile,"r");. i
16340 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 f( in==0 ){.
16350 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 fprintf(stderr,"
16360 43 61 6e 27 74 20 6f 70 65 6e 20 69 6e 70 75 74 Can't open input
16370 20 66 69 6c 65 20 5c 22 25 73 5c 22 5c 6e 22 2c file \"%s\"\n",
16380 7a 46 69 6c 65 29 3b 0a 20 20 20 20 65 78 69 74 zFile);. exit
16390 28 31 29 3b 0a 20 20 7d 0a 20 20 63 20 3d 20 27 (1);. }. c = '
163a0 20 27 3b 0a 20 20 77 68 69 6c 65 28 20 63 21 3d ';. while( c!=
163b0 45 4f 46 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 EOF ){. while
163c0 28 20 63 21 3d 45 4f 46 20 26 26 20 69 73 73 70 ( c!=EOF && issp
163d0 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20 ace(c) ){.
163e0 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 if( c=='\n' ){.
163f0 20 20 20 20 20 20 20 73 74 61 72 74 4f 66 4c 69 startOfLi
16400 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a ne = 1;. }.
16410 20 20 20 20 20 20 63 20 3d 20 67 65 74 63 28 69 c = getc(i
16420 6e 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 73 n); . if( s
16430 74 61 72 74 4f 66 4c 69 6e 65 20 26 26 20 63 3d tartOfLine && c=
16440 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 20 20 ='#' ){.
16450 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 while( c!=EOF &&
16460 20 63 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 c!='\n' ){.
16470 20 20 20 20 20 20 63 20 3d 20 67 65 74 63 28 69 c = getc(i
16480 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 n);. }.
16490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 }. }.
164a0 6e 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 n = 0;. while
164b0 28 20 63 21 3d 45 4f 46 20 26 26 20 21 69 73 73 ( c!=EOF && !iss
164c0 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 pace(c) ){.
164d0 20 69 66 28 20 6e 3c 73 69 7a 65 6f 66 28 7a 42 if( n<sizeof(zB
164e0 75 66 29 2d 31 20 29 7b 20 7a 42 75 66 5b 6e 2b uf)-1 ){ zBuf[n+
164f0 2b 5d 20 3d 20 63 3b 20 7d 0a 20 20 20 20 20 20 +] = c; }.
16500 73 74 61 72 74 4f 66 4c 69 6e 65 20 3d 20 30 3b startOfLine = 0;
16510 0a 20 20 20 20 20 20 63 20 3d 20 67 65 74 63 28 . c = getc(
16520 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a in);. }. z
16530 42 75 66 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 Buf[n] = 0;.
16540 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 if( n>0 ){.
16550 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 nNew++;. i
16560 66 28 20 6e 4e 65 77 20 2b 20 61 72 67 63 20 3e f( nNew + argc >
16570 20 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 nAlloc ){.
16580 20 20 20 69 66 28 20 6e 41 6c 6c 6f 63 3d 3d 30 if( nAlloc==0
16590 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 41 ){. nA
165a0 6c 6c 6f 63 20 3d 20 31 30 30 20 2b 20 61 72 67 lloc = 100 + arg
165b0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4e 65 c;. zNe
165c0 77 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 w = malloc( size
165d0 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 41 6c 6c of(char*) * nAll
165e0 6f 63 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 oc );. }e
165f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e lse{. n
16600 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 Alloc *= 2;.
16610 20 20 20 20 20 20 7a 4e 65 77 20 3d 20 72 65 61 zNew = rea
16620 6c 6c 6f 63 28 20 7a 4e 65 77 2c 20 73 69 7a 65 lloc( zNew, size
16630 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 41 6c 6c of(char*) * nAll
16640 6f 63 20 29 3b 20 20 0a 20 20 20 20 20 20 20 20 oc ); .
16650 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }. }.
16660 69 66 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 if( zNew ){.
16670 20 20 20 20 69 6e 74 20 6a 20 3d 20 6e 4e 65 77 int j = nNew
16680 20 2b 20 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 + index;.
16690 20 20 7a 4e 65 77 5b 6a 5d 20 3d 20 6d 61 6c 6c zNew[j] = mall
166a0 6f 63 28 20 6e 20 2b 20 31 20 29 3b 0a 20 20 20 oc( n + 1 );.
166b0 20 20 20 20 20 69 66 28 20 7a 4e 65 77 5b 6a 5d if( zNew[j]
166c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 ){. st
166d0 72 63 70 79 28 20 7a 4e 65 77 5b 6a 5d 2c 20 7a rcpy( zNew[j], z
166e0 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20 20 7d Buf );. }
166f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
16700 20 7d 0a 20 20 6e 65 77 41 72 67 63 20 3d 20 61 }. newArgc = a
16710 72 67 63 20 2b 20 6e 4e 65 77 20 2d 20 31 3b 0a rgc + nNew - 1;.
16720 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 69 6e for(i=0; i<=in
16730 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a dex; i++){. z
16740 4e 65 77 5b 69 5d 20 3d 20 61 72 67 76 5b 69 5d New[i] = argv[i]
16750 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6e 4e ;. }. for(i=nN
16760 65 77 20 2b 20 69 6e 64 65 78 20 2b 20 31 3b 20 ew + index + 1;
16770 69 3c 6e 65 77 41 72 67 63 3b 20 69 2b 2b 29 7b i<newArgc; i++){
16780 0a 20 20 20 20 7a 4e 65 77 5b 69 5d 20 3d 20 61 . zNew[i] = a
16790 72 67 76 5b 69 20 2b 20 31 20 2d 20 6e 4e 65 77 rgv[i + 1 - nNew
167a0 5d 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77 5b 6e 65 ];. }. zNew[ne
167b0 77 41 72 67 63 5d 20 3d 20 30 3b 0a 20 20 2a 70 wArgc] = 0;. *p
167c0 41 72 67 63 20 3d 20 6e 65 77 41 72 67 63 3b 0a Argc = newArgc;.
167d0 20 20 2a 70 41 72 67 76 20 3d 20 7a 4e 65 77 3b *pArgv = zNew;
167e0 0a 7d 0a 0a 23 69 66 64 65 66 20 4e 4f 54 5f 55 .}..#ifdef NOT_U
167f0 53 45 44 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e SED./*.** Return
16800 20 74 68 65 20 74 69 6d 65 20 74 68 61 74 20 74 the time that t
16810 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 77 61 he given file wa
16820 73 20 6c 61 73 74 20 6d 6f 64 69 66 69 65 64 2e s last modified.
16830 20 20 49 66 20 77 65 20 63 61 6e 27 74 0a 2a 2a If we can't.**
16840 20 6c 6f 63 61 74 65 20 74 68 65 20 66 69 6c 65 locate the file
16850 20 28 62 65 63 61 75 73 65 2c 20 66 6f 72 20 65 (because, for e
16860 78 61 6d 70 6c 65 2c 20 69 74 20 64 6f 65 73 6e xample, it doesn
16870 27 74 20 65 78 69 73 74 29 2c 20 74 68 65 6e 0a 't exist), then.
16880 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a ** return 0..*/.
16890 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 static unsigned
168a0 69 6e 74 20 4d 6f 64 54 69 6d 65 28 63 6f 6e 73 int ModTime(cons
168b0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d t char *zFilenam
168c0 65 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 e){. unsigned i
168d0 6e 74 20 6d 54 69 6d 65 20 3d 20 30 3b 0a 20 20 nt mTime = 0;.
168e0 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 struct stat sSta
168f0 74 3b 0a 20 20 69 66 28 20 73 74 61 74 28 7a 46 t;. if( stat(zF
16900 69 6c 65 6e 61 6d 65 2c 26 73 53 74 61 74 29 3d ilename,&sStat)=
16910 3d 30 20 29 7b 0a 20 20 20 20 6d 54 69 6d 65 20 =0 ){. mTime
16920 3d 20 73 53 74 61 74 2e 73 74 5f 6d 74 69 6d 65 = sStat.st_mtime
16930 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d ;. }. return m
16940 54 69 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a Time;.}.#endif..
16950 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 75 73 /*.** Print a us
16960 61 67 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 age comment for
16970 74 68 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f this program..*/
16980 0a 73 74 61 74 69 63 20 76 6f 69 64 20 55 73 61 .static void Usa
16990 67 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 ge(const char *a
169a0 72 67 76 30 2c 20 63 6f 6e 73 74 20 63 68 61 72 rgv0, const char
169b0 20 2a 61 72 67 76 4e 29 7b 0a 20 20 66 70 72 69 *argvN){. fpri
169c0 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 ntf(stderr,"%s:
169d0 49 6c 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74 Illegal argument
169e0 20 5c 22 25 73 5c 22 5c 6e 22 2c 61 72 67 76 30 \"%s\"\n",argv0
169f0 2c 61 72 67 76 4e 29 3b 0a 20 20 66 70 72 69 6e ,argvN);. fprin
16a00 74 66 28 73 74 64 65 72 72 2c 22 55 73 61 67 65 tf(stderr,"Usage
16a10 3a 20 25 73 20 5b 6f 70 74 69 6f 6e 73 5d 20 66 : %s [options] f
16a20 69 6c 65 6e 61 6d 65 2e 2e 2e 5c 6e 22 0a 20 20 ilename...\n".
16a30 20 20 22 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 20 "Options:\n".
16a40 20 20 20 22 20 20 2d 68 20 20 20 20 20 20 20 20 " -h
16a50 20 20 47 65 6e 65 72 61 74 65 20 61 20 73 69 6e Generate a sin
16a60 67 6c 65 20 2e 68 20 74 6f 20 73 74 61 6e 64 61 gle .h to standa
16a70 72 64 20 6f 75 74 70 75 74 2e 5c 6e 22 0a 20 20 rd output.\n".
16a80 20 20 22 20 20 2d 48 20 20 20 20 20 20 20 20 20 " -H
16a90 20 4c 69 6b 65 20 2d 68 2c 20 62 75 74 20 6f 6e Like -h, but on
16aa0 6c 79 20 6f 75 74 70 75 74 20 45 58 50 4f 52 54 ly output EXPORT
16ab0 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 5c 6e declarations.\n
16ac0 22 0a 20 20 20 20 22 20 20 2d 76 20 20 20 20 20 ". " -v
16ad0 20 20 20 20 20 28 76 65 72 62 6f 73 65 29 20 57 (verbose) W
16ae0 72 69 74 65 20 73 74 61 74 75 73 20 69 6e 66 6f rite status info
16af0 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 73 rmation to the s
16b00 63 72 65 65 6e 2e 5c 6e 22 0a 20 20 20 20 22 20 creen.\n". "
16b10 20 2d 64 6f 63 20 20 20 20 20 20 20 20 47 65 6e -doc Gen
16b20 65 72 61 74 65 20 6e 6f 20 68 65 61 64 65 72 20 erate no header
16b30 66 69 6c 65 73 2e 20 20 49 6e 73 74 65 61 64 2c files. Instead,
16b40 20 6f 75 74 70 75 74 20 69 6e 66 6f 72 6d 61 74 output informat
16b50 69 6f 6e 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 ion\n". "
16b60 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 63 that c
16b70 61 6e 20 62 65 20 75 73 65 64 20 62 79 20 61 6e an be used by an
16b80 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 67 72 automatic progr
16b90 61 6d 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e am documentation
16ba0 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 \n". "
16bb0 20 20 20 20 20 20 20 61 6e 64 20 63 72 6f 73 73 and cross
16bc0 2d 72 65 66 65 72 65 6e 63 65 20 67 65 6e 65 72 -reference gener
16bd0 61 74 6f 72 2e 5c 6e 22 0a 20 20 20 20 22 20 20 ator.\n". "
16be0 2d 6c 6f 63 61 6c 20 20 20 20 20 20 47 65 6e 65 -local Gene
16bf0 72 61 74 65 20 70 72 6f 74 6f 74 79 70 65 73 20 rate prototypes
16c00 66 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20 66 for \"static\" f
16c10 75 6e 63 74 69 6f 6e 73 20 61 6e 64 5c 6e 22 0a unctions and\n".
16c20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20 "
16c30 20 20 20 70 72 6f 63 65 64 75 72 65 73 2e 5c 6e procedures.\n
16c40 22 0a 20 20 20 20 22 20 20 2d 66 20 46 49 4c 45 ". " -f FILE
16c50 20 20 20 20 20 52 65 61 64 20 61 64 64 69 74 69 Read additi
16c60 6f 6e 61 6c 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e onal command-lin
16c70 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d e arguments from
16c80 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 5c the file named\
16c90 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 n". "
16ca0 20 20 20 20 20 20 5c 22 46 49 4c 45 5c 22 2e 5c \"FILE\".\
16cb0 6e 22 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a n".#ifdef DEBUG.
16cc0 20 20 20 20 22 20 20 2d 21 20 4d 41 53 4b 20 20 " -! MASK
16cd0 20 20 20 53 65 74 20 74 68 65 20 64 65 62 75 67 Set the debug
16ce0 67 69 6e 67 20 6d 61 73 6b 20 74 6f 20 74 68 65 ging mask to the
16cf0 20 6e 75 6d 62 65 72 20 5c 22 4d 41 53 4b 5c 22 number \"MASK\"
16d00 2e 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 .\n".#endif.
16d10 22 20 20 2d 2d 20 20 20 20 20 20 20 20 20 20 54 " -- T
16d20 72 65 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 reat all subsequ
16d30 65 6e 74 20 63 6f 6d 6d 65 6e 74 2d 6c 69 6e 65 ent comment-line
16d40 20 70 61 72 61 6d 65 74 65 72 73 20 61 73 20 66 parameters as f
16d50 69 6c 65 6e 61 6d 65 73 2c 5c 6e 22 0a 20 20 20 ilenames,\n".
16d60 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 "
16d70 65 76 65 6e 20 69 66 20 74 68 65 79 20 62 65 67 even if they beg
16d80 69 6e 20 77 69 74 68 20 5c 22 2d 5c 22 2e 5c 6e in with \"-\".\n
16d90 22 2c 0a 20 20 20 20 61 72 67 76 30 0a 20 20 29 ",. argv0. )
16da0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 ;.}../*.** The f
16db0 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 20 63 6f ollowing text co
16dc0 6e 74 61 69 6e 73 20 61 20 66 65 77 20 73 69 6d ntains a few sim
16dd0 70 6c 65 20 23 64 65 66 69 6e 65 73 20 74 68 61 ple #defines tha
16de0 74 20 77 65 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 t we want.** to
16df0 62 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 be available to
16e00 65 76 65 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73 every file..*/.s
16e10 74 61 74 69 63 20 63 68 61 72 20 7a 49 6e 69 74 tatic char zInit
16e20 5b 5d 20 3d 20 0a 20 20 22 23 64 65 66 69 6e 65 [] = . "#define
16e30 20 49 4e 54 45 52 46 41 43 45 20 30 5c 6e 22 0a INTERFACE 0\n".
16e40 20 20 22 23 64 65 66 69 6e 65 20 45 58 50 4f 52 "#define EXPOR
16e50 54 5f 49 4e 54 45 52 46 41 43 45 20 30 5c 6e 22 T_INTERFACE 0\n"
16e60 0a 20 20 22 23 64 65 66 69 6e 65 20 4c 4f 43 41 . "#define LOCA
16e70 4c 5f 49 4e 54 45 52 46 41 43 45 20 30 5c 6e 22 L_INTERFACE 0\n"
16e80 0a 20 20 22 23 64 65 66 69 6e 65 20 45 58 50 4f . "#define EXPO
16e90 52 54 5c 6e 22 0a 20 20 22 23 64 65 66 69 6e 65 RT\n". "#define
16ea0 20 4c 4f 43 41 4c 20 73 74 61 74 69 63 5c 6e 22 LOCAL static\n"
16eb0 0a 20 20 22 23 64 65 66 69 6e 65 20 50 55 42 4c . "#define PUBL
16ec0 49 43 5c 6e 22 0a 20 20 22 23 64 65 66 69 6e 65 IC\n". "#define
16ed0 20 50 52 49 56 41 54 45 5c 6e 22 0a 20 20 22 23 PRIVATE\n". "#
16ee0 64 65 66 69 6e 65 20 50 52 4f 54 45 43 54 45 44 define PROTECTED
16ef0 5c 6e 22 0a 3b 0a 0a 23 69 66 20 54 45 53 54 3d \n".;..#if TEST=
16f00 3d 30 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 =0.int main(int
16f10 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 argc, char **arg
16f20 76 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 v){. int i;
16f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c /* L
16f40 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 oop counter */.
16f50 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 int nErr = 0;
16f60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
16f70 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 of errors encou
16f80 6e 74 65 72 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 ntered */. Toke
16f90 6e 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 n *pList;
16fa0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 69 6e 70 /* List of inp
16fb0 75 74 20 74 6f 6b 65 6e 73 20 66 6f 72 20 6f 6e ut tokens for on
16fc0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 49 6e 46 69 e file */. InFi
16fd0 6c 65 20 2a 70 46 69 6c 65 4c 69 73 74 20 3d 20 le *pFileList =
16fe0 30 3b 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 0;/* List of all
16ff0 20 69 6e 70 75 74 20 66 69 6c 65 73 20 2a 2f 0a input files */.
17000 20 20 49 6e 46 69 6c 65 20 2a 70 54 61 69 6c 20 InFile *pTail
17010 3d 20 30 3b 20 20 20 20 2f 2a 20 4c 61 73 74 20 = 0; /* Last
17020 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 file on the list
17030 20 2a 2f 0a 20 20 49 6e 46 69 6c 65 20 2a 70 46 */. InFile *pF
17040 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 66 ile; /* f
17050 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 or looping over
17060 74 68 65 20 66 69 6c 65 20 6c 69 73 74 20 2a 2f the file list */
17070 0a 20 20 69 6e 74 20 68 5f 66 6c 61 67 20 3d 20 . int h_flag =
17080 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 0; /* True
17090 20 69 66 20 2d 68 20 69 73 20 70 72 65 73 65 6e if -h is presen
170a0 74 2e 20 20 4f 75 74 70 75 74 20 75 6e 69 66 69 t. Output unifi
170b0 65 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 ed header */. i
170c0 6e 74 20 48 5f 66 6c 61 67 20 3d 20 30 3b 20 20 nt H_flag = 0;
170d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 /* True if
170e0 2d 48 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20 -H is present.
170f0 4f 75 74 70 75 74 20 45 58 50 4f 52 54 20 68 65 Output EXPORT he
17100 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 76 5f ader */. int v_
17110 66 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 flag = 0;
17120 2f 2a 20 56 65 72 62 6f 73 65 20 2a 2f 0a 20 20 /* Verbose */.
17130 69 6e 74 20 6e 6f 4d 6f 72 65 46 6c 61 67 73 3b int noMoreFlags;
17140 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 /* True if
17150 20 2d 2d 20 68 61 73 20 62 65 65 6e 20 73 65 65 -- has been see
17160 6e 2e 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 72 65 n. */. FILE *re
17170 70 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a port; /*
17180 20 53 65 6e 64 20 70 72 6f 67 72 65 73 73 20 72 Send progress r
17190 65 70 6f 72 74 73 20 74 6f 20 74 68 69 73 2c 20 eports to this,
171a0 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 0a if not NULL */..
171b0 20 20 6e 6f 4d 6f 72 65 46 6c 61 67 73 20 3d 20 noMoreFlags =
171c0 30 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 0;. for(i=1; i<
171d0 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 argc; i++){.
171e0 69 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d if( argv[i][0]==
171f0 27 2d 27 20 26 26 20 21 6e 6f 4d 6f 72 65 46 6c '-' && !noMoreFl
17200 61 67 73 20 29 7b 0a 20 20 20 20 20 20 73 77 69 ags ){. swi
17210 74 63 68 28 20 61 72 67 76 5b 69 5d 5b 31 5d 20 tch( argv[i][1]
17220 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 ){. case
17230 27 68 27 3a 20 20 20 68 5f 66 6c 61 67 20 3d 20 'h': h_flag =
17240 31 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 1; break;.
17250 20 20 20 20 63 61 73 65 20 27 48 27 3a 20 20 20 case 'H':
17260 48 5f 66 6c 61 67 20 3d 20 31 3b 20 20 20 62 72 H_flag = 1; br
17270 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 eak;. cas
17280 65 20 27 76 27 3a 20 20 20 76 5f 66 6c 61 67 20 e 'v': v_flag
17290 3d 20 31 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 = 1; break;.
172a0 20 20 20 20 20 20 63 61 73 65 20 27 64 27 3a 20 case 'd':
172b0 20 20 64 6f 63 5f 66 6c 61 67 20 3d 20 31 3b 20 doc_flag = 1;
172c0 70 72 6f 74 6f 5f 73 74 61 74 69 63 20 3d 20 31 proto_static = 1
172d0 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 ; break;.
172e0 20 63 61 73 65 20 27 6c 27 3a 20 20 20 70 72 6f case 'l': pro
172f0 74 6f 5f 73 74 61 74 69 63 20 3d 20 31 3b 20 62 to_static = 1; b
17300 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 reak;. ca
17310 73 65 20 27 66 27 3a 20 20 20 41 64 64 50 61 72 se 'f': AddPar
17320 61 6d 65 74 65 72 73 28 69 2c 20 26 61 72 67 63 ameters(i, &argc
17330 2c 20 26 61 72 67 76 29 3b 20 62 72 65 61 6b 3b , &argv); break;
17340 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 2d . case '-
17350 27 3a 20 20 20 6e 6f 4d 6f 72 65 46 6c 61 67 73 ': noMoreFlags
17360 20 3d 20 31 3b 20 20 20 62 72 65 61 6b 3b 0a 23 = 1; break;.#
17370 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 20 20 ifdef DEBUG.
17380 20 20 20 20 63 61 73 65 20 27 21 27 3a 20 20 20 case '!':
17390 69 2b 2b 3b 20 20 64 65 62 75 67 4d 61 73 6b 20 i++; debugMask
173a0 3d 20 73 74 72 74 6f 6c 28 61 72 67 76 5b 69 5d = strtol(argv[i]
173b0 2c 30 2c 30 29 3b 20 62 72 65 61 6b 3b 0a 23 65 ,0,0); break;.#e
173c0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 65 66 ndif. def
173d0 61 75 6c 74 3a 20 20 20 20 55 73 61 67 65 28 61 ault: Usage(a
173e0 72 67 76 5b 30 5d 2c 61 72 67 76 5b 69 5d 29 3b rgv[0],argv[i]);
173f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 return 1;.
17400 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 }. }else{.
17410 20 20 20 20 70 46 69 6c 65 20 3d 20 43 72 65 61 pFile = Crea
17420 74 65 49 6e 46 69 6c 65 28 61 72 67 76 5b 69 5d teInFile(argv[i]
17430 2c 26 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 69 ,&nErr);. i
17440 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 f( pFile ){.
17450 20 20 20 20 69 66 28 20 70 46 69 6c 65 4c 69 73 if( pFileLis
17460 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 t ){. p
17470 54 61 69 6c 2d 3e 70 4e 65 78 74 20 3d 20 70 46 Tail->pNext = pF
17480 69 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 ile;. p
17490 54 61 69 6c 20 3d 20 70 46 69 6c 65 3b 0a 20 20 Tail = pFile;.
174a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
174b0 20 20 20 20 20 20 20 70 46 69 6c 65 4c 69 73 74 pFileList
174c0 20 3d 20 70 54 61 69 6c 20 3d 20 70 46 69 6c 65 = pTail = pFile
174d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
174e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 }. }. }.
174f0 69 66 28 20 68 5f 66 6c 61 67 20 26 26 20 48 5f if( h_flag && H_
17500 66 6c 61 67 20 29 7b 0a 20 20 20 20 68 5f 66 6c flag ){. h_fl
17510 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 ag = 0;. }. if
17520 28 20 76 5f 66 6c 61 67 20 29 7b 0a 20 20 20 20 ( v_flag ){.
17530 72 65 70 6f 72 74 20 3d 20 28 68 5f 66 6c 61 67 report = (h_flag
17540 20 7c 7c 20 48 5f 66 6c 61 67 29 20 3f 20 73 74 || H_flag) ? st
17550 64 65 72 72 20 3a 20 73 74 64 6f 75 74 3b 0a 20 derr : stdout;.
17560 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 70 6f }else{. repo
17570 72 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 rt = 0;. }. if
17580 28 20 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 ( nErr>0 ){.
17590 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20 7d return nErr;. }
175a0 0a 20 20 66 6f 72 28 70 46 69 6c 65 3d 70 46 69 . for(pFile=pFi
175b0 6c 65 4c 69 73 74 3b 20 70 46 69 6c 65 3b 20 70 leList; pFile; p
175c0 46 69 6c 65 3d 70 46 69 6c 65 2d 3e 70 4e 65 78 File=pFile->pNex
175d0 74 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 t){. char *zF
175e0 69 6c 65 3b 0a 0a 20 20 20 20 7a 46 69 6c 65 6e ile;.. zFilen
175f0 61 6d 65 20 3d 20 70 46 69 6c 65 2d 3e 7a 53 72 ame = pFile->zSr
17600 63 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 c;. if( zFile
17610 6e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e name==0 ) contin
17620 75 65 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 ue;. zFile =
17630 52 65 61 64 46 69 6c 65 28 7a 46 69 6c 65 6e 61 ReadFile(zFilena
17640 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 me);. if( zFi
17650 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 le==0 ){. f
17660 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 printf(stderr,"C
17670 61 6e 27 74 20 72 65 61 64 20 69 6e 70 75 74 20 an't read input
17680 66 69 6c 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 7a file \"%s\"\n",z
17690 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 Filename);.
176a0 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 63 nErr++;. c
176b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 ontinue;. }.
176c0 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a if( strncmp(z
176d0 46 69 6c 65 2c 7a 54 6f 70 4c 69 6e 65 2c 6e 54 File,zTopLine,nT
176e0 6f 70 4c 69 6e 65 29 3d 3d 30 20 29 7b 0a 20 20 opLine)==0 ){.
176f0 20 20 20 20 70 46 69 6c 65 2d 3e 7a 53 72 63 20 pFile->zSrc
17700 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a = 0;. }else{.
17710 20 20 20 20 20 20 69 66 28 20 72 65 70 6f 72 74 if( report
17720 20 29 20 66 70 72 69 6e 74 66 28 72 65 70 6f 72 ) fprintf(repor
17730 74 2c 22 52 65 61 64 69 6e 67 20 25 73 2e 2e 2e t,"Reading %s...
17740 5c 6e 22 2c 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a \n",zFilename);.
17750 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 54 6f pList = To
17760 6b 65 6e 69 7a 65 46 69 6c 65 28 7a 46 69 6c 65 kenizeFile(zFile
17770 2c 26 70 46 69 6c 65 2d 3e 69 64 54 61 62 6c 65 ,&pFile->idTable
17780 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 );. if( pLi
17790 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 st ){. nE
177a0 72 72 20 2b 3d 20 50 61 72 73 65 46 69 6c 65 28 rr += ParseFile(
177b0 70 4c 69 73 74 2c 70 46 69 6c 65 2d 3e 66 6c 61 pList,pFile->fla
177c0 67 73 29 3b 0a 20 20 20 20 20 20 20 20 46 72 65 gs);. Fre
177d0 65 54 6f 6b 65 6e 4c 69 73 74 28 70 4c 69 73 74 eTokenList(pList
177e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 );. }else i
177f0 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 f( zFile[0]==0 )
17800 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 {. fprint
17810 66 28 73 74 64 65 72 72 2c 22 49 6e 70 75 74 20 f(stderr,"Input
17820 66 69 6c 65 20 5c 22 25 73 5c 22 20 69 73 20 65 file \"%s\" is e
17830 6d 70 74 79 2e 5c 6e 22 2c 20 7a 46 69 6c 65 6e mpty.\n", zFilen
17840 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 ame);. nE
17850 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 rr++;. }els
17860 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e e{. fprin
17870 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 tf(stderr,"Error
17880 73 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 s while processi
17890 6e 67 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 ng \"%s\"\n", zF
178a0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 ilename);.
178b0 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 nErr++;.
178c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 }. }. if(
178d0 21 64 6f 63 5f 66 6c 61 67 20 29 20 53 61 66 65 !doc_flag ) Safe
178e0 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 Free(zFile);.
178f0 20 69 66 28 20 64 6f 63 5f 66 6c 61 67 20 29 20 if( doc_flag )
17900 50 72 69 6e 74 4d 6f 64 75 6c 65 52 65 63 6f 72 PrintModuleRecor
17910 64 28 7a 46 69 6c 65 2c 7a 46 69 6c 65 6e 61 6d d(zFile,zFilenam
17920 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 45 e);. }. if( nE
17930 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 rr>0 ){. retu
17940 72 6e 20 6e 45 72 72 3b 0a 20 20 7d 0a 23 69 66 rn nErr;. }.#if
17950 64 65 66 20 44 45 42 55 47 0a 20 20 69 66 28 20 def DEBUG. if(
17960 64 65 62 75 67 4d 61 73 6b 20 26 20 44 45 43 4c debugMask & DECL
17970 5f 44 55 4d 50 20 29 7b 0a 20 20 20 20 44 75 6d _DUMP ){. Dum
17980 70 44 65 63 6c 4c 69 73 74 28 29 3b 0a 20 20 20 pDeclList();.
17990 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20 return nErr;.
179a0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 64 }.#endif. if( d
179b0 6f 63 5f 66 6c 61 67 20 29 7b 0a 20 20 20 20 44 oc_flag ){. D
179c0 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 44 75 6d 70 ocumentationDump
179d0 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e ();. return n
179e0 45 72 72 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 Err;. }. zFile
179f0 6e 61 6d 65 20 3d 20 22 2d 2d 69 6e 74 65 72 6e name = "--intern
17a00 61 6c 2d 2d 22 3b 0a 20 20 70 4c 69 73 74 20 3d al--";. pList =
17a10 20 54 6f 6b 65 6e 69 7a 65 46 69 6c 65 28 7a 49 TokenizeFile(zI
17a20 6e 69 74 2c 30 29 3b 0a 20 20 69 66 28 20 70 4c nit,0);. if( pL
17a30 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 ist==0 ){. re
17a40 74 75 72 6e 20 6e 45 72 72 2b 31 3b 0a 20 20 7d turn nErr+1;. }
17a50 0a 20 20 50 61 72 73 65 46 69 6c 65 28 70 4c 69 . ParseFile(pLi
17a60 73 74 2c 50 53 5f 49 6e 74 65 72 66 61 63 65 29 st,PS_Interface)
17a70 3b 0a 20 20 46 72 65 65 54 6f 6b 65 6e 4c 69 73 ;. FreeTokenLis
17a80 74 28 70 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 t(pList);. if(
17a90 68 5f 66 6c 61 67 20 7c 7c 20 48 5f 66 6c 61 67 h_flag || H_flag
17aa0 20 29 7b 0a 20 20 20 20 6e 45 72 72 20 2b 3d 20 ){. nErr +=
17ab0 4d 61 6b 65 47 6c 6f 62 61 6c 48 65 61 64 65 72 MakeGlobalHeader
17ac0 28 48 5f 66 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 (H_flag);. }els
17ad0 65 7b 0a 20 20 20 20 66 6f 72 28 70 46 69 6c 65 e{. for(pFile
17ae0 3d 70 46 69 6c 65 4c 69 73 74 3b 20 70 46 69 6c =pFileList; pFil
17af0 65 3b 20 70 46 69 6c 65 3d 70 46 69 6c 65 2d 3e e; pFile=pFile->
17b00 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 pNext){. if
17b10 28 20 70 46 69 6c 65 2d 3e 7a 53 72 63 3d 3d 30 ( pFile->zSrc==0
17b20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 ) continue;.
17b30 20 20 20 6e 45 72 72 20 2b 3d 20 4d 61 6b 65 48 nErr += MakeH
17b40 65 61 64 65 72 28 70 46 69 6c 65 2c 72 65 70 6f eader(pFile,repo
17b50 72 74 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d rt,0);. }. }
17b60 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a . return nErr;.
17b70 7d 0a 23 65 6e 64 69 66 0a }.#endif.