0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 /*.** This progr
0010: 61 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 am is free softw
0020: 61 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 are; you can red
0030: 69 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 istribute it and
0040: 2f 6f 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74 /or.** modify it
0050: 20 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 under the terms
0060: 20 6f 66 20 74 68 65 20 53 69 6d 70 6c 69 66 69 of the Simplifi
0070: 65 64 20 42 53 44 20 4c 69 63 65 6e 73 65 20 28 ed BSD License (
0080: 61 6c 73 6f 0a 2a 2a 20 6b 6e 6f 77 6e 20 61 73 also.** known as
0090: 20 74 68 65 20 22 32 2d 43 6c 61 75 73 65 20 4c the "2-Clause L
00a0: 69 63 65 6e 73 65 22 20 6f 72 20 22 46 72 65 65 icense" or "Free
00b0: 42 53 44 20 4c 69 63 65 6e 73 65 22 2e 29 0a 2a BSD License".).*
00c0: 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20 31 *.** Copyright 1
00d0: 39 39 33 20 44 2e 20 52 69 63 68 61 72 64 20 48 993 D. Richard H
00e0: 69 70 70 2e 20 41 6c 6c 20 72 69 67 68 74 73 20 ipp. All rights
00f0: 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 reserved..**.**
0100: 52 65 64 69 73 74 72 69 62 75 74 69 6f 6e 20 61 Redistribution a
0110: 6e 64 20 75 73 65 20 69 6e 20 73 6f 75 72 63 65 nd use in source
0120: 20 61 6e 64 20 62 69 6e 61 72 79 20 66 6f 72 6d and binary form
0130: 73 2c 20 77 69 74 68 20 6f 72 0a 2a 2a 20 77 69 s, with or.** wi
0140: 74 68 6f 75 74 20 6d 6f 64 69 66 69 63 61 74 69 thout modificati
0150: 6f 6e 2c 20 61 72 65 20 70 65 72 6d 69 74 74 65 on, are permitte
0160: 64 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 d provided that
0170: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a the following.**
0180: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 conditions are
0190: 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 met:.**.** 1.
01a0: 52 65 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 Redistributions
01b0: 6f 66 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6d of source code m
01c0: 75 73 74 20 72 65 74 61 69 6e 20 74 68 65 20 61 ust retain the a
01d0: 62 6f 76 65 20 63 6f 70 79 72 69 67 68 74 0a 2a bove copyright.*
01e0: 2a 20 20 20 20 20 20 6e 6f 74 69 63 65 2c 20 74 * notice, t
01f0: 68 69 73 20 6c 69 73 74 20 6f 66 20 63 6f 6e 64 his list of cond
0200: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 66 itions and the f
0210: 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63 6c 61 69 ollowing disclai
0220: 6d 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 mer..**.** 2.
0230: 52 65 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 Redistributions
0240: 69 6e 20 62 69 6e 61 72 79 20 66 6f 72 6d 20 6d in binary form m
0250: 75 73 74 20 72 65 70 72 6f 64 75 63 65 20 74 68 ust reproduce th
0260: 65 20 61 62 6f 76 65 20 63 6f 70 79 72 69 67 68 e above copyrigh
0270: 74 0a 2a 2a 20 20 20 20 20 20 6e 6f 74 69 63 65 t.** notice
0280: 2c 20 74 68 69 73 20 6c 69 73 74 20 6f 66 20 63 , this list of c
0290: 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 onditions and th
02a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63 e following disc
02b0: 6c 61 69 6d 65 72 20 69 6e 0a 2a 2a 20 20 20 20 laimer in.**
02c0: 20 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 the documentat
02d0: 69 6f 6e 20 61 6e 64 2f 6f 72 20 6f 74 68 65 72 ion and/or other
02e0: 20 6d 61 74 65 72 69 61 6c 73 20 70 72 6f 76 69 materials provi
02f0: 64 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 ded with the.**
0300: 20 20 20 20 20 64 69 73 74 72 69 62 75 74 69 6f distributio
0310: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 6f n..**.** This so
0320: 66 74 77 61 72 65 20 69 73 20 70 72 6f 76 69 64 ftware is provid
0330: 65 64 20 22 61 73 20 69 73 22 20 61 6e 64 20 61 ed "as is" and a
0340: 6e 79 20 65 78 70 72 65 73 73 20 6f 72 20 69 6d ny express or im
0350: 70 6c 69 65 64 20 77 61 72 72 61 6e 74 69 65 73 plied warranties
0360: 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 2c 20 ,.** including,
0370: 62 75 74 20 6e 6f 74 20 6c 69 6d 69 74 65 64 20 but not limited
0380: 74 6f 2c 20 74 68 65 20 69 6d 70 6c 69 65 64 20 to, the implied
0390: 77 61 72 72 61 6e 74 69 65 73 20 6f 66 20 6d 65 warranties of me
03a0: 72 63 68 61 6e 74 61 62 69 6c 69 74 79 0a 2a 2a rchantability.**
03b0: 20 61 6e 64 20 66 69 74 6e 65 73 73 20 66 6f 72 and fitness for
03c0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 a particular pu
03d0: 72 70 6f 73 65 20 61 72 65 20 64 69 73 63 6c 61 rpose are discla
03e0: 69 6d 65 64 2e 20 20 49 6e 20 6e 6f 20 65 76 65 imed. In no eve
03f0: 6e 74 20 73 68 61 6c 6c 0a 2a 2a 20 74 68 65 20 nt shall.** the
0400: 61 75 74 68 6f 72 20 6f 72 20 63 6f 6e 74 72 69 author or contri
0410: 62 75 74 6f 72 73 20 62 65 20 6c 69 61 62 6c 65 butors be liable
0420: 20 66 6f 72 20 61 6e 79 20 64 69 72 65 63 74 2c for any direct,
0430: 20 69 6e 64 69 72 65 63 74 2c 20 69 6e 63 69 64 indirect, incid
0440: 65 6e 74 61 6c 2c 0a 2a 2a 20 73 70 65 63 69 61 ental,.** specia
0450: 6c 2c 20 65 78 65 6d 70 6c 61 72 79 2c 20 6f 72 l, exemplary, or
0460: 20 63 6f 6e 73 65 71 75 65 6e 74 69 61 6c 20 64 consequential d
0470: 61 6d 61 67 65 73 20 28 69 6e 63 6c 75 64 69 6e amages (includin
0480: 67 2c 20 62 75 74 20 6e 6f 74 20 6c 69 6d 69 74 g, but not limit
0490: 65 64 0a 2a 2a 20 74 6f 2c 20 70 72 6f 63 75 72 ed.** to, procur
04a0: 65 6d 65 6e 74 20 6f 66 20 73 75 62 73 74 69 74 ement of substit
04b0: 75 74 65 20 67 6f 6f 64 73 20 6f 72 20 73 65 72 ute goods or ser
04c0: 76 69 63 65 73 3b 20 6c 6f 73 73 20 6f 66 20 75 vices; loss of u
04d0: 73 65 2c 20 64 61 74 61 20 6f 72 0a 2a 2a 20 70 se, data or.** p
04e0: 72 6f 66 69 74 73 3b 20 6f 72 20 62 75 73 69 6e rofits; or busin
04f0: 65 73 73 20 69 6e 74 65 72 72 75 70 74 69 6f 6e ess interruption
0500: 29 20 68 6f 77 65 76 65 72 20 63 61 75 73 65 64 ) however caused
0510: 20 61 6e 64 20 6f 6e 20 61 6e 79 20 74 68 65 6f and on any theo
0520: 72 79 20 6f 66 0a 2a 2a 20 6c 69 61 62 69 6c 69 ry of.** liabili
0530: 74 79 2c 20 77 68 65 74 68 65 72 20 69 6e 20 63 ty, whether in c
0540: 6f 6e 74 72 61 63 74 2c 20 73 74 72 69 63 74 20 ontract, strict
0550: 6c 69 61 62 69 6c 69 74 79 2c 20 6f 72 20 74 6f liability, or to
0560: 72 74 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a rt (including.**
0570: 20 6e 65 67 6c 69 67 65 6e 63 65 20 6f 72 20 6f negligence or o
0580: 74 68 65 72 77 69 73 65 29 20 61 72 69 73 69 6e therwise) arisin
0590: 67 20 69 6e 20 61 6e 79 20 77 61 79 20 6f 75 74 g in any way out
05a0: 20 6f 66 20 74 68 65 20 75 73 65 20 6f 66 20 74 of the use of t
05b0: 68 69 73 0a 2a 2a 20 73 6f 66 74 77 61 72 65 2c his.** software,
05c0: 20 65 76 65 6e 20 69 66 20 61 64 76 69 73 65 64 even if advised
05d0: 20 6f 66 20 74 68 65 20 70 6f 73 73 69 62 69 6c of the possibil
05e0: 69 74 79 20 6f 66 20 73 75 63 68 20 64 61 6d 61 ity of such dama
05f0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 ge..**.** This p
0600: 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74 72 69 rogram is distri
0610: 62 75 74 65 64 20 69 6e 20 74 68 65 20 68 6f 70 buted in the hop
0620: 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 e that it will b
0630: 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62 75 74 e useful,.** but
0640: 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77 61 72 without any war
0650: 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74 20 65 ranty; without e
0660: 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65 64 20 ven the implied
0670: 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a 20 6d warranty of.** m
0680: 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79 20 6f erchantability o
0690: 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20 61 20 r fitness for a
06a0: 70 61 72 74 69 63 75 6c 61 72 20 70 75 72 70 6f particular purpo
06b0: 73 65 2e 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 se..** appropria
06c0: 74 65 20 68 65 61 64 65 72 20 66 69 6c 65 73 2e te header files.
06d0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 .*/.#include <st
06e0: 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 dio.h>.#include
06f0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c <stdlib.h>.#incl
0700: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 ude <ctype.h>.#i
0710: 6e 63 6c 75 64 65 20 3c 6d 65 6d 6f 72 79 2e 68 nclude <memory.h
0720: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f >.#include <sys/
0730: 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 stat.h>.#include
0740: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 <assert.h>.#inc
0750: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a lude <string.h>.
0760: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 20 5f 5f .#if defined( __
0770: 4d 49 4e 47 57 33 32 5f 5f 29 20 7c 7c 20 20 64 MINGW32__) || d
0780: 65 66 69 6e 65 64 28 5f 5f 44 4d 43 5f 5f 29 20 efined(__DMC__)
0790: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f || defined(_MSC_
07a0: 56 45 52 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 VER) || defined(
07b0: 5f 5f 50 4f 43 43 5f 5f 29 0a 23 20 20 69 66 6e __POCC__).# ifn
07c0: 64 65 66 20 57 49 4e 33 32 0a 23 20 20 20 20 64 def WIN32.# d
07d0: 65 66 69 6e 65 20 57 49 4e 33 32 0a 23 20 20 65 efine WIN32.# e
07e0: 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 69 6e 63 ndif.#else.# inc
07f0: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a lude <unistd.h>.
0800: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 #endif../*.** Ma
0810: 63 72 6f 73 20 66 6f 72 20 64 65 62 75 67 67 69 cros for debuggi
0820: 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 44 45 ng..*/.#ifdef DE
0830: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 64 BUG.static int d
0840: 65 62 75 67 4d 61 73 6b 20 3d 20 30 3b 0a 23 20 ebugMask = 0;.#
0850: 64 65 66 69 6e 65 20 64 65 62 75 67 30 28 46 2c define debug0(F,
0860: 4d 29 20 20 20 20 20 20 20 69 66 28 20 28 46 29 M) if( (F)
0870: 26 64 65 62 75 67 4d 61 73 6b 20 29 7b 20 66 70 &debugMask ){ fp
0880: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 4d 29 3b rintf(stderr,M);
0890: 20 7d 0a 23 20 64 65 66 69 6e 65 20 64 65 62 75 }.# define debu
08a0: 67 31 28 46 2c 4d 2c 41 29 20 20 20 20 20 69 66 g1(F,M,A) if
08b0: 28 20 28 46 29 26 64 65 62 75 67 4d 61 73 6b 20 ( (F)&debugMask
08c0: 29 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 ){ fprintf(stder
08d0: 72 2c 4d 2c 41 29 3b 20 7d 0a 23 20 64 65 66 69 r,M,A); }.# defi
08e0: 6e 65 20 64 65 62 75 67 32 28 46 2c 4d 2c 41 2c ne debug2(F,M,A,
08f0: 42 29 20 20 20 69 66 28 20 28 46 29 26 64 65 62 B) if( (F)&deb
0900: 75 67 4d 61 73 6b 20 29 7b 20 66 70 72 69 6e 74 ugMask ){ fprint
0910: 66 28 73 74 64 65 72 72 2c 4d 2c 41 2c 42 29 3b f(stderr,M,A,B);
0920: 20 7d 0a 23 20 64 65 66 69 6e 65 20 64 65 62 75 }.# define debu
0930: 67 33 28 46 2c 4d 2c 41 2c 42 2c 43 29 20 69 66 g3(F,M,A,B,C) if
0940: 28 20 28 46 29 26 64 65 62 75 67 4d 61 73 6b 20 ( (F)&debugMask
0950: 29 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 ){ fprintf(stder
0960: 72 2c 4d 2c 41 2c 42 2c 43 29 3b 20 7d 0a 23 20 r,M,A,B,C); }.#
0970: 64 65 66 69 6e 65 20 50 41 52 53 45 52 20 20 20 define PARSER
0980: 20 20 20 30 78 30 30 30 30 30 30 30 31 0a 23 20 0x00000001.#
0990: 64 65 66 69 6e 65 20 44 45 43 4c 5f 44 55 4d 50 define DECL_DUMP
09a0: 20 20 20 30 78 30 30 30 30 30 30 30 32 0a 23 20 0x00000002.#
09b0: 64 65 66 69 6e 65 20 54 4f 4b 45 4e 49 5a 45 52 define TOKENIZER
09c0: 20 20 20 30 78 30 30 30 30 30 30 30 34 0a 23 65 0x00000004.#e
09d0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 65 62 lse.# define deb
09e0: 75 67 30 28 46 6c 61 67 73 2c 20 46 6f 72 6d 61 ug0(Flags, Forma
09f0: 74 29 0a 23 20 64 65 66 69 6e 65 20 64 65 62 75 t).# define debu
0a00: 67 31 28 46 6c 61 67 73 2c 20 46 6f 72 6d 61 74 g1(Flags, Format
0a10: 2c 20 41 29 0a 23 20 64 65 66 69 6e 65 20 64 65 , A).# define de
0a20: 62 75 67 32 28 46 6c 61 67 73 2c 20 46 6f 72 6d bug2(Flags, Form
0a30: 61 74 2c 20 41 2c 20 42 29 0a 23 20 64 65 66 69 at, A, B).# defi
0a40: 6e 65 20 64 65 62 75 67 33 28 46 6c 61 67 73 2c ne debug3(Flags,
0a50: 20 46 6f 72 6d 61 74 2c 20 41 2c 20 42 2c 20 43 Format, A, B, C
0a60: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 ).#endif../*.**
0a70: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 The following ma
0a80: 63 72 6f 73 20 61 72 65 20 70 75 72 65 6c 79 20 cros are purely
0a90: 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 for the purpose
0aa0: 6f 66 20 74 65 73 74 69 6e 67 20 74 68 69 73 0a of testing this.
0ab0: 2a 2a 20 70 72 6f 67 72 61 6d 20 6f 6e 20 69 74 ** program on it
0ac0: 73 65 6c 66 2e 20 20 54 68 65 79 20 64 6f 6e 27 self. They don'
0ad0: 74 20 72 65 61 6c 6c 79 20 63 6f 6e 74 72 69 62 t really contrib
0ae0: 75 74 65 20 74 6f 20 74 68 65 20 63 6f 64 65 2e ute to the code.
0af0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4e 54 45 .*/.#define INTE
0b00: 52 46 41 43 45 20 31 0a 23 64 65 66 69 6e 65 20 RFACE 1.#define
0b10: 45 58 50 4f 52 54 5f 49 4e 54 45 52 46 41 43 45 EXPORT_INTERFACE
0b20: 20 31 0a 23 64 65 66 69 6e 65 20 45 58 50 4f 52 1.#define EXPOR
0b30: 54 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 74 6f T../*.** Each to
0b40: 6b 65 6e 20 69 6e 20 61 20 73 6f 75 72 63 65 20 ken in a source
0b50: 66 69 6c 65 20 69 73 20 72 65 70 72 65 73 65 6e file is represen
0b60: 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e ted by an instan
0b70: 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c ce of.** the fol
0b80: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 lowing structure
0b90: 2e 20 20 54 6f 6b 65 6e 73 20 61 72 65 20 63 6f . Tokens are co
0ba0: 6c 6c 65 63 74 65 64 20 6f 6e 74 6f 20 61 20 6c llected onto a l
0bb0: 69 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 ist..*/.typedef
0bc0: 73 74 72 75 63 74 20 54 6f 6b 65 6e 20 54 6f 6b struct Token Tok
0bd0: 65 6e 3b 0a 73 74 72 75 63 74 20 54 6f 6b 65 6e en;.struct Token
0be0: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 {. const char
0bf0: 2a 7a 54 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 *zText; /*
0c00: 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 The text of the
0c10: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e token */. int n
0c20: 54 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 Text;
0c30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
0c40: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 characters in th
0c50: 65 20 74 6f 6b 65 6e 27 73 20 74 65 78 74 20 2a e token's text *
0c60: 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 /. int eType;
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
0c80: 68 65 20 74 79 70 65 20 6f 66 20 74 68 69 73 20 he type of this
0c90: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e token */. int n
0ca0: 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 Line;
0cb0: 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e /* The line n
0cc0: 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20 74 umber on which t
0cd0: 68 65 20 74 6f 6b 65 6e 20 73 74 61 72 74 73 20 he token starts
0ce0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6d */. Token *pCom
0cf0: 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 ment; /*
0d00: 4d 6f 73 74 20 72 65 63 65 6e 74 20 62 6c 6f 63 Most recent bloc
0d10: 6b 20 63 6f 6d 6d 65 6e 74 20 62 65 66 6f 72 65 k comment before
0d20: 20 74 68 69 73 20 74 6f 6b 65 6e 20 2a 2f 0a 20 this token */.
0d30: 20 54 6f 6b 65 6e 20 2a 70 4e 65 78 74 3b 20 20 Token *pNext;
0d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 /* Next
0d50: 20 74 6f 6b 65 6e 20 6f 6e 20 74 68 65 20 6c 69 token on the li
0d60: 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 st */. Token *p
0d70: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 Prev;
0d80: 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 6f 6b 65 /* Previous toke
0d90: 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f n on the list */
0da0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e .};../*.** Durin
0db0: 67 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 2c 20 g tokenization,
0dc0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 information abou
0dd0: 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 t the state of t
0de0: 68 65 20 69 6e 70 75 74 0a 2a 2a 20 73 74 72 65 he input.** stre
0df0: 61 6d 20 69 73 20 68 65 6c 64 20 69 6e 20 61 6e am is held in an
0e00: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 instance of the
0e10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 following struc
0e20: 74 75 72 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 ture.*/.typedef
0e30: 73 74 72 75 63 74 20 49 6e 53 74 72 65 61 6d 20 struct InStream
0e40: 49 6e 53 74 72 65 61 6d 3b 0a 73 74 72 75 63 74 InStream;.struct
0e50: 20 49 6e 53 74 72 65 61 6d 20 7b 0a 20 20 63 6f InStream {. co
0e60: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 nst char *z;
0e70: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 /* Complet
0e80: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 69 6e e text of the in
0e90: 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 put */. int i;
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0eb0: 20 2f 2a 20 4e 65 78 74 20 63 68 61 72 61 63 74 /* Next charact
0ec0: 65 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 er to read from
0ed0: 74 68 65 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69 the input */. i
0ee0: 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20 nt nLine;
0ef0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 /* The li
0f00: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 68 ne number for ch
0f10: 61 72 61 63 74 65 72 20 7a 5b 69 5d 20 2a 2f 0a aracter z[i] */.
0f20: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 64 };../*.** Each d
0f30: 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 20 74 68 eclaration in th
0f40: 65 20 43 20 6f 72 20 43 2b 2b 20 73 6f 75 72 63 e C or C++ sourc
0f50: 65 20 66 69 6c 65 73 20 69 73 20 70 61 72 73 65 e files is parse
0f60: 64 20 6f 75 74 20 61 6e 64 20 73 74 6f 72 65 64 d out and stored
0f70: 20 61 73 0a 2a 2a 20 61 6e 20 69 6e 73 74 61 6e as.** an instan
0f80: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 ce of the follow
0f90: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a ing structure..*
0fa0: 2a 0a 2a 2a 20 41 20 22 66 6f 72 77 61 72 64 20 *.** A "forward
0fb0: 64 65 63 6c 61 72 61 74 69 6f 6e 22 20 69 73 20 declaration" is
0fc0: 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 68 a declaration th
0fd0: 61 74 20 61 6e 20 6f 62 6a 65 63 74 20 65 78 69 at an object exi
0fe0: 73 74 73 20 74 68 61 74 0a 2a 2a 20 64 6f 65 73 sts that.** does
0ff0: 6e 27 74 20 74 65 6c 6c 20 61 62 6f 75 74 20 74 n't tell about t
1000: 68 65 20 6f 62 6a 65 63 74 73 20 73 74 72 75 63 he objects struc
1010: 74 75 72 65 2e 20 20 41 20 74 79 70 69 63 61 6c ture. A typical
1020: 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 forward declara
1030: 74 69 6f 6e 0a 2a 2a 20 69 73 3a 0a 2a 2a 0a 2a tion.** is:.**.*
1040: 2a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 * struc
1050: 74 20 58 79 7a 7a 79 3b 0a 2a 2a 0a 2a 2a 20 4e t Xyzzy;.**.** N
1060: 6f 74 20 65 76 65 72 79 20 6f 62 6a 65 63 74 20 ot every object
1070: 68 61 73 20 61 20 66 6f 72 77 61 72 64 20 64 65 has a forward de
1080: 63 6c 61 72 61 74 69 6f 6e 2e 20 20 49 66 20 69 claration. If i
1090: 74 20 64 6f 65 73 2c 20 74 68 6f 75 67 68 74 2c t does, thought,
10a0: 20 74 68 65 0a 2a 2a 20 66 6f 72 77 61 72 64 20 the.** forward
10b0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 77 69 6c 6c declaration will
10c0: 20 62 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e be contained in
10d0: 20 74 68 65 20 7a 46 77 64 20 66 69 65 6c 64 20 the zFwd field
10e0: 66 6f 72 20 43 20 61 6e 64 0a 2a 2a 20 74 68 65 for C and.** the
10f0: 20 7a 46 77 64 43 70 70 20 66 6f 72 20 43 2b 2b zFwdCpp for C++
1100: 2e 20 20 54 68 65 20 7a 44 65 63 6c 20 66 69 65 . The zDecl fie
1110: 6c 64 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 ld contains the
1120: 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20 64 65 63 6c complete.** decl
1130: 61 72 61 74 69 6f 6e 20 74 65 78 74 2e 0a 2a 2f aration text..*/
1140: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
1150: 44 65 63 6c 20 44 65 63 6c 3b 0a 73 74 72 75 63 Decl Decl;.struc
1160: 74 20 44 65 63 6c 20 7b 0a 20 20 63 68 61 72 20 t Decl {. char
1170: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a *zName; /*
1180: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a Name of the obj
1190: 65 63 74 20 62 65 69 6e 67 20 64 65 63 6c 61 72 ect being declar
11a0: 65 64 2e 20 20 54 68 65 20 61 70 70 65 61 72 61 ed. The appeara
11b0: 6e 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 nce.
11c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 ** of t
11d0: 68 69 73 20 6e 61 6d 65 20 69 73 20 61 20 73 6f his name is a so
11e0: 75 72 63 65 20 66 69 6c 65 20 74 72 69 67 67 65 urce file trigge
11f0: 72 73 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 rs the declarati
1200: 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 on.
1210: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 ** to be
1220: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 68 65 added to the he
1230: 61 64 65 72 20 66 6f 72 20 74 68 61 74 20 66 69 ader for that fi
1240: 6c 65 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 le. */. const c
1250: 68 61 72 20 2a 7a 46 69 6c 65 3b 20 2f 2a 20 46 har *zFile; /* F
1260: 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 65 ile from which e
1270: 78 74 72 61 63 74 65 64 2e 20 20 2a 2f 0a 20 20 xtracted. */.
1280: 63 68 61 72 20 2a 7a 49 66 3b 20 20 20 20 20 20 char *zIf;
1290: 20 20 20 2f 2a 20 53 75 72 72 6f 75 6e 64 20 74 /* Surround t
12a0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 77 he declaration w
12b0: 69 74 68 20 74 68 69 73 20 23 69 66 20 2a 2f 0a ith this #if */.
12c0: 20 20 63 68 61 72 20 2a 7a 46 77 64 3b 20 20 20 char *zFwd;
12d0: 20 20 20 20 20 2f 2a 20 41 20 66 6f 72 77 61 72 /* A forwar
12e0: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 20 d declaration.
12f0: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 NULL if there is
1300: 20 6e 6f 6e 65 2e 20 2a 2f 0a 20 20 63 68 61 72 none. */. char
1310: 20 2a 7a 46 77 64 43 70 70 3b 20 20 20 20 20 2f *zFwdCpp; /
1320: 2a 20 55 73 65 20 74 68 69 73 20 66 6f 72 77 61 * Use this forwa
1330: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 66 rd declaration f
1340: 6f 72 20 43 2b 2b 2e 20 2a 2f 0a 20 20 63 68 61 or C++. */. cha
1350: 72 20 2a 7a 44 65 63 6c 3b 20 20 20 20 20 20 20 r *zDecl;
1360: 2f 2a 20 41 20 66 75 6c 6c 20 64 65 63 6c 61 72 /* A full declar
1370: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 6f 62 ation of this ob
1380: 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a ject */. char *
1390: 7a 45 78 74 72 61 3b 20 20 20 20 20 20 2f 2a 20 zExtra; /*
13a0: 45 78 74 72 61 20 64 65 63 6c 61 72 61 74 69 6f Extra declaratio
13b0: 6e 20 74 65 78 74 20 69 6e 73 65 72 74 65 64 20 n text inserted
13c0: 69 6e 74 6f 20 63 6c 61 73 73 20 6f 62 6a 65 63 into class objec
13d0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 78 74 72 ts */. int extr
13e0: 61 54 79 70 65 3b 20 20 20 20 20 2f 2a 20 4c 61 aType; /* La
13f0: 73 74 20 70 75 62 6c 69 63 3a 2c 20 70 72 6f 74 st public:, prot
1400: 65 63 74 65 64 3a 20 6f 72 20 70 72 69 76 61 74 ected: or privat
1410: 65 3a 20 69 6e 20 7a 45 78 74 72 61 44 65 63 6c e: in zExtraDecl
1420: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 49 6e 63 */. struct Inc
1430: 6c 75 64 65 20 2a 70 49 6e 63 6c 75 64 65 3b 20 lude *pInclude;
1440: 20 20 2f 2a 20 23 69 6e 63 6c 75 64 65 73 20 74 /* #includes t
1450: 68 61 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 hat come before
1460: 74 68 69 73 20 64 65 63 6c 61 72 61 74 69 6f 6e this declaration
1470: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b */. int flags;
1480: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 /* See
1490: 74 68 65 20 22 50 72 6f 70 65 72 74 69 65 73 22 the "Properties"
14a0: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 54 6f 6b 65 below */. Toke
14b0: 6e 20 2a 70 43 6f 6d 6d 65 6e 74 3b 20 20 20 2f n *pComment; /
14c0: 2a 20 41 20 62 6c 6f 63 6b 20 63 6f 6d 6d 65 6e * A block commen
14d0: 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 t associated wit
14e0: 68 20 74 68 69 73 20 64 65 63 6c 61 72 61 74 69 h this declarati
14f0: 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 74 6f on */. Token to
1500: 6b 65 6e 43 6f 64 65 3b 20 20 20 2f 2a 20 49 6d kenCode; /* Im
1510: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 plementation of
1520: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 70 72 functions and pr
1530: 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 44 65 ocedures */. De
1540: 63 6c 20 2a 70 53 61 6d 65 4e 61 6d 65 3b 20 20 cl *pSameName;
1550: 20 2f 2a 20 4e 65 78 74 20 64 65 63 6c 61 72 61 /* Next declara
1560: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73 61 tion with the sa
1570: 6d 65 20 22 7a 4e 61 6d 65 22 20 2a 2f 0a 20 20 me "zName" */.
1580: 44 65 63 6c 20 2a 70 53 61 6d 65 48 61 73 68 3b Decl *pSameHash;
1590: 20 20 20 2f 2a 20 4e 65 78 74 20 64 65 63 6c 61 /* Next decla
15a0: 72 61 74 69 6f 6e 20 77 69 74 68 20 73 61 6d 65 ration with same
15b0: 20 68 61 73 68 20 62 75 74 20 64 69 66 66 65 72 hash but differ
15c0: 65 6e 74 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 44 ent zName */. D
15d0: 65 63 6c 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 ecl *pNext;
15e0: 20 20 2f 2a 20 4e 65 78 74 20 64 65 63 6c 61 72 /* Next declar
15f0: 61 74 69 6f 6e 20 77 69 74 68 20 61 20 64 69 66 ation with a dif
1600: 66 65 72 65 6e 74 20 6e 61 6d 65 20 2a 2f 0a 7d ferent name */.}
1610: 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 65 72 74 ;../*.** Propert
1620: 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 ies associated w
1630: 69 74 68 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 ith declarations
1640: 2e 0a 2a 2a 0a 2a 2a 20 44 50 5f 46 6f 72 77 61 ..**.** DP_Forwa
1650: 72 64 20 61 6e 64 20 44 50 5f 44 65 63 6c 61 72 rd and DP_Declar
1660: 65 64 20 61 72 65 20 75 73 65 64 20 64 75 72 69 ed are used duri
1670: 6e 67 20 74 68 65 20 67 65 6e 65 72 61 74 69 6f ng the generatio
1680: 6e 20 6f 66 20 61 20 73 69 6e 67 6c 65 0a 2a 2a n of a single.**
1690: 20 68 65 61 64 65 72 20 66 69 6c 65 20 69 6e 20 header file in
16a0: 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e 74 order to prevent
16b0: 20 64 75 70 6c 69 63 61 74 65 20 64 65 63 6c 61 duplicate decla
16c0: 72 61 74 69 6f 6e 73 20 61 6e 64 20 64 65 66 69 rations and defi
16d0: 6e 69 74 69 6f 6e 73 2e 0a 2a 2a 20 44 50 5f 46 nitions..** DP_F
16e0: 6f 72 77 61 72 64 20 69 73 20 73 65 74 20 61 66 orward is set af
16f0: 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 68 ter the object h
1700: 61 73 20 62 65 65 6e 20 67 69 76 65 6e 20 61 20 as been given a
1710: 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 forward declarat
1720: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 44 50 5f 44 65 ion.** and DP_De
1730: 63 6c 61 72 65 64 20 69 73 20 73 65 74 20 61 66 clared is set af
1740: 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 67 ter the object g
1750: 65 74 73 20 61 20 66 75 6c 6c 20 64 65 63 6c 61 ets a full decla
1760: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 20 28 45 78 61 rations..** (Exa
1770: 6d 70 6c 65 3a 20 20 41 20 66 6f 72 77 61 72 64 mple: A forward
1780: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 73 20 declaration is
1790: 22 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 "typedef struct
17a0: 41 62 63 20 41 62 63 3b 22 20 61 6e 64 20 74 68 Abc Abc;" and th
17b0: 65 0a 2a 2a 20 66 75 6c 6c 20 64 65 63 6c 61 72 e.** full declar
17c0: 61 74 69 6f 6e 20 69 73 20 22 73 74 72 75 63 74 ation is "struct
17d0: 20 41 62 63 20 7b 20 69 6e 74 20 61 3b 20 66 6c Abc { int a; fl
17e0: 6f 61 74 20 62 3b 20 7d 3b 22 2e 29 0a 2a 2a 0a oat b; };".).**.
17f0: 2a 2a 20 54 68 65 20 44 50 5f 45 78 70 6f 72 74 ** The DP_Export
1800: 20 61 6e 64 20 44 50 5f 4c 6f 63 61 6c 20 66 6c and DP_Local fl
1810: 61 67 73 20 61 72 65 20 6d 6f 72 65 20 70 65 72 ags are more per
1820: 6d 61 6e 65 6e 74 2e 20 20 54 68 65 79 20 6d 61 manent. They ma
1830: 72 6b 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 74 68 rk objects.** th
1840: 61 74 20 68 61 76 65 20 45 58 50 4f 52 54 20 73 at have EXPORT s
1850: 63 6f 70 65 20 61 6e 64 20 4c 4f 43 41 4c 20 73 cope and LOCAL s
1860: 63 6f 70 65 20 72 65 73 70 65 63 74 69 76 65 6c cope respectivel
1870: 79 2e 20 20 49 66 20 62 6f 74 68 20 6f 66 20 74 y. If both of t
1880: 68 65 73 65 0a 2a 2a 20 6d 61 72 6b 73 20 61 72 hese.** marks ar
1890: 65 20 6d 69 73 73 69 6e 67 2c 20 74 68 65 6e 20 e missing, then
18a0: 74 68 65 20 6f 62 6a 65 63 74 20 68 61 73 20 6c the object has l
18b0: 69 62 72 61 72 79 20 73 63 6f 70 65 2e 20 20 54 ibrary scope. T
18c0: 68 65 20 6d 65 61 6e 69 6e 67 73 20 6f 66 0a 2a he meanings of.*
18d0: 2a 20 74 68 65 20 73 63 6f 70 65 73 20 61 72 65 * the scopes are
18e0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a as follows:.**.
18f0: 2a 2a 20 20 20 20 4c 4f 43 41 4c 20 73 63 6f 70 ** LOCAL scop
1900: 65 20 20 20 20 20 20 20 20 20 54 68 65 20 6f 62 e The ob
1910: 6a 65 63 74 20 69 73 20 6f 6e 6c 79 20 75 73 61 ject is only usa
1920: 62 6c 65 20 77 69 74 68 69 6e 20 74 68 65 20 66 ble within the f
1930: 69 6c 65 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 ile in.**
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1950: 20 77 68 69 63 68 20 69 74 20 69 73 20 64 65 63 which it is dec
1960: 6c 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 lared..**.**
1970: 6c 69 62 72 61 72 79 20 73 63 6f 70 65 20 20 20 library scope
1980: 20 20 20 20 54 68 65 20 6f 62 6a 65 63 74 20 69 The object i
1990: 73 20 76 69 73 69 62 6c 65 20 61 6e 64 20 75 73 s visible and us
19a0: 61 62 6c 65 20 77 69 74 68 69 6e 20 6f 74 68 65 able within othe
19b0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 r.**
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 file
19d0: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 s in the same pr
19e0: 6f 6a 65 63 74 2e 20 20 42 79 20 69 66 20 74 68 oject. By if th
19f0: 65 20 70 72 6f 6a 65 63 74 20 69 73 0a 2a 2a 20 e project is.**
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a10: 20 20 20 20 20 20 20 61 20 6c 69 62 72 61 72 79 a library
1a20: 2c 20 74 68 65 6e 20 74 68 65 20 6f 62 6a 65 63 , then the objec
1a30: 74 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 t is not visible
1a40: 20 74 6f 20 75 73 65 72 73 0a 2a 2a 20 20 20 20 to users.**
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a60: 20 20 20 20 6f 66 20 74 68 65 20 6c 69 62 72 61 of the libra
1a70: 72 79 2e 20 20 28 69 2e 65 2e 20 74 68 65 20 6f ry. (i.e. the o
1a80: 62 6a 65 63 74 20 64 6f 65 73 20 6e 6f 74 20 61 bject does not a
1a90: 70 70 65 61 72 0a 2a 2a 20 20 20 20 20 20 20 20 ppear.**
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ab0: 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 77 68 in the output wh
1ac0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 2d 48 20 en using the -H
1ad0: 6f 70 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 20 option.).**.**
1ae0: 20 20 45 58 50 4f 52 54 20 73 63 6f 70 65 20 20 EXPORT scope
1af0: 20 20 20 20 20 20 54 68 65 20 6f 62 6a 65 63 74 The object
1b00: 20 69 73 20 76 69 73 69 62 6c 65 20 61 6e 64 20 is visible and
1b10: 75 73 61 62 6c 65 20 65 76 65 72 79 77 68 65 72 usable everywher
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 44 50 5f e..**.** The DP_
1b30: 46 6c 61 67 20 69 73 20 61 20 74 65 6d 70 6f 72 Flag is a tempor
1b40: 61 72 79 20 75 73 65 20 66 6c 61 67 20 74 68 61 ary use flag tha
1b50: 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 t is used during
1b60: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 6f 0a 2a processing to.*
1b70: 2a 20 70 72 65 76 65 6e 74 20 61 6e 20 69 6e 66 * prevent an inf
1b80: 69 6e 69 74 65 20 6c 6f 6f 70 2e 20 20 49 74 27 inite loop. It'
1b90: 73 20 75 73 65 20 69 73 20 6c 6f 63 61 6c 69 7a s use is localiz
1ba0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 44 50 ed..**.** The DP
1bb0: 5f 43 70 6c 75 73 70 6c 75 73 2c 20 44 50 5f 45 _Cplusplus, DP_E
1bc0: 78 74 65 72 6e 43 52 65 71 64 20 61 6e 64 20 44 xternCReqd and D
1bd0: 50 5f 45 78 74 65 72 6e 52 65 71 64 20 66 6c 61 P_ExternReqd fla
1be0: 67 73 20 61 72 65 20 70 65 72 6d 61 6e 65 6e 74 gs are permanent
1bf0: 0a 2a 2a 20 61 6e 64 20 61 72 65 20 75 73 65 64 .** and are used
1c00: 20 74 6f 20 73 70 65 63 69 66 79 20 77 68 61 74 to specify what
1c10: 20 74 79 70 65 20 6f 66 20 64 65 63 6c 61 72 61 type of declara
1c20: 74 69 6f 6e 20 74 68 65 20 6f 62 6a 65 63 74 20 tion the object
1c30: 72 65 71 75 69 72 65 73 2e 0a 2a 2f 0a 23 64 65 requires..*/.#de
1c40: 66 69 6e 65 20 44 50 5f 46 6f 72 77 61 72 64 20 fine DP_Forward
1c50: 20 20 20 20 20 30 78 30 30 31 20 20 20 2f 2a 20 0x001 /*
1c60: 48 61 73 20 61 20 66 6f 72 77 61 72 64 20 64 65 Has a forward de
1c70: 63 6c 61 72 61 74 69 6f 6e 20 69 6e 20 74 68 69 claration in thi
1c80: 73 20 66 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e s file */.#defin
1c90: 65 20 44 50 5f 44 65 63 6c 61 72 65 64 20 20 20 e DP_Declared
1ca0: 20 20 30 78 30 30 32 20 20 20 2f 2a 20 48 61 73 0x002 /* Has
1cb0: 20 61 20 66 75 6c 6c 20 64 65 63 6c 61 72 61 74 a full declarat
1cc0: 69 6f 6e 20 69 6e 20 74 68 69 73 20 66 69 6c 65 ion in this file
1cd0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 50 5f 45 */.#define DP_E
1ce0: 78 70 6f 72 74 20 20 20 20 20 20 20 30 78 30 30 xport 0x00
1cf0: 34 20 20 20 2f 2a 20 45 78 70 6f 72 74 20 74 68 4 /* Export th
1d00: 69 73 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a is declaration *
1d10: 2f 0a 23 64 65 66 69 6e 65 20 44 50 5f 4c 6f 63 /.#define DP_Loc
1d20: 61 6c 20 20 20 20 20 20 20 20 30 78 30 30 38 20 al 0x008
1d30: 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 69 6e 20 /* Declare in
1d40: 69 74 73 20 68 6f 6d 65 20 66 69 6c 65 20 6f 6e its home file on
1d50: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 50 ly */.#define DP
1d60: 5f 46 6c 61 67 20 20 20 20 20 20 20 20 20 30 78 _Flag 0x
1d70: 30 31 30 20 20 20 2f 2a 20 55 73 65 20 74 6f 20 010 /* Use to
1d80: 6d 61 72 6b 20 61 20 73 75 62 73 65 74 20 6f 66 mark a subset of
1d90: 20 61 20 44 65 63 6c 20 6c 69 73 74 0a 20 20 20 a Decl list.
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 **
1dc0: 66 6f 72 20 73 70 65 63 69 61 6c 20 70 72 6f 63 for special proc
1dd0: 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e essing */.#defin
1de0: 65 20 44 50 5f 43 70 6c 75 73 70 6c 75 73 20 20 e DP_Cplusplus
1df0: 20 20 30 78 30 32 30 20 20 20 2f 2a 20 48 61 73 0x020 /* Has
1e00: 20 43 2b 2b 20 6c 69 6e 6b 61 67 65 20 61 6e 64 C++ linkage and
1e10: 20 63 61 6e 6e 6f 74 20 61 70 70 65 61 72 20 69 cannot appear i
1e20: 6e 20 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 n a.
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e40: 20 20 20 20 2a 2a 20 43 20 68 65 61 64 65 72 20 ** C header
1e50: 66 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 file */.#define
1e60: 44 50 5f 45 78 74 65 72 6e 43 52 65 71 64 20 20 DP_ExternCReqd
1e70: 30 78 30 34 30 20 20 20 2f 2a 20 50 72 65 70 65 0x040 /* Prepe
1e80: 6e 64 20 27 65 78 74 65 72 6e 20 22 43 22 27 20 nd 'extern "C"'
1e90: 69 6e 20 61 20 43 2b 2b 20 68 65 61 64 65 72 2e in a C++ header.
1ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ec0: 20 2a 2a 20 50 72 65 70 65 6e 64 20 6e 6f 74 68 ** Prepend noth
1ed0: 69 6e 67 20 69 6e 20 61 20 43 20 68 65 61 64 65 ing in a C heade
1ee0: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 50 5f r */.#define DP_
1ef0: 45 78 74 65 72 6e 52 65 71 64 20 20 20 30 78 30 ExternReqd 0x0
1f00: 38 30 20 20 20 2f 2a 20 50 72 65 70 65 6e 64 20 80 /* Prepend
1f10: 27 65 78 74 65 72 6e 20 22 43 22 27 20 69 6e 20 'extern "C"' in
1f20: 61 20 43 2b 2b 20 68 65 61 64 65 72 20 69 66 0a a C++ header if.
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f50: 2a 2a 20 44 50 5f 43 70 6c 75 73 70 6c 75 73 20 ** DP_Cplusplus
1f60: 69 73 20 6e 6f 74 20 61 6c 73 6f 20 73 65 74 2e is not also set.
1f70: 20 49 66 20 44 50 5f 43 70 6c 75 73 70 6c 75 73 If DP_Cplusplus
1f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fa0: 20 2a 2a 20 69 73 20 73 65 74 20 6f 72 20 74 68 ** is set or th
1fb0: 69 73 20 69 73 20 61 20 43 20 68 65 61 64 65 72 is is a C header
1fc0: 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20 then.
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fe0: 20 20 20 20 20 20 2a 2a 20 70 72 65 70 65 6e 64 ** prepend
1ff0: 20 27 65 78 74 65 72 6e 27 20 2a 2f 0a 0a 2f 2a 'extern' */../*
2000: 0a 2a 2a 20 43 6f 6e 76 65 6e 69 65 6e 63 65 20 .** Convenience
2010: 6d 61 63 72 6f 73 20 66 6f 72 20 64 65 61 6c 69 macros for deali
2020: 6e 67 20 77 69 74 68 20 64 65 63 6c 61 72 61 74 ng with declarat
2030: 69 6f 6e 20 70 72 6f 70 65 72 74 69 65 73 0a 2a ion properties.*
2040: 2f 0a 23 64 65 66 69 6e 65 20 44 65 63 6c 48 61 /.#define DeclHa
2050: 73 50 72 6f 70 65 72 74 79 28 44 2c 50 29 20 20 sProperty(D,P)
2060: 20 20 28 28 28 44 29 2d 3e 66 6c 61 67 73 26 28 (((D)->flags&(
2070: 50 29 29 3d 3d 28 50 29 29 0a 23 64 65 66 69 6e P))==(P)).#defin
2080: 65 20 44 65 63 6c 48 61 73 41 6e 79 50 72 6f 70 e DeclHasAnyProp
2090: 65 72 74 79 28 44 2c 50 29 20 28 28 28 44 29 2d erty(D,P) (((D)-
20a0: 3e 66 6c 61 67 73 26 28 50 29 29 21 3d 30 29 0a >flags&(P))!=0).
20b0: 23 64 65 66 69 6e 65 20 44 65 63 6c 53 65 74 50 #define DeclSetP
20c0: 72 6f 70 65 72 74 79 28 44 2c 50 29 20 20 20 20 roperty(D,P)
20d0: 28 44 29 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 50 (D)->flags |= (P
20e0: 29 0a 23 64 65 66 69 6e 65 20 44 65 63 6c 43 6c ).#define DeclCl
20f0: 65 61 72 50 72 6f 70 65 72 74 79 28 44 2c 50 29 earProperty(D,P)
2100: 20 20 28 44 29 2d 3e 66 6c 61 67 73 20 26 3d 20 (D)->flags &=
2110: 7e 28 50 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 ~(P)../*.** Thes
2120: 65 20 61 72 65 20 73 74 61 74 65 20 70 72 6f 70 e are state prop
2130: 65 72 74 69 65 73 20 6f 66 20 74 68 65 20 70 61 erties of the pa
2140: 72 73 65 72 2e 20 20 45 61 63 68 20 6f 66 20 74 rser. Each of t
2150: 68 65 20 76 61 6c 75 65 73 20 69 73 0a 2a 2a 20 he values is.**
2160: 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20 74 68 distinct from th
2170: 65 20 44 50 5f 20 76 61 6c 75 65 73 20 61 62 6f e DP_ values abo
2180: 76 65 20 73 6f 20 74 68 61 74 20 62 6f 74 68 20 ve so that both
2190: 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 0a 2a can be used in.*
21a0: 2a 20 74 68 65 20 73 61 6d 65 20 22 66 6c 61 67 * the same "flag
21b0: 73 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 s" field..**.**
21c0: 42 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 Be careful not t
21d0: 6f 20 63 6f 6e 66 75 73 65 20 50 53 5f 45 78 70 o confuse PS_Exp
21e0: 6f 72 74 20 77 69 74 68 20 44 50 5f 45 78 70 6f ort with DP_Expo
21f0: 72 74 20 6f 72 0a 2a 2a 20 50 53 5f 4c 6f 63 61 rt or.** PS_Loca
2200: 6c 20 77 69 74 68 20 44 50 5f 4c 6f 63 61 6c 2e l with DP_Local.
2210: 20 20 54 68 65 69 72 20 6e 61 6d 65 73 20 61 72 Their names ar
2220: 65 20 73 69 6d 69 6c 61 72 2c 20 62 75 74 20 74 e similar, but t
2230: 68 65 20 6d 65 61 6e 69 6e 67 73 0a 2a 2a 20 6f he meanings.** o
2240: 66 20 74 68 65 73 65 20 66 6c 61 67 73 20 61 72 f these flags ar
2250: 65 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 e very different
2260: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f ..*/.#define PS_
2270: 45 78 74 65 72 6e 20 20 20 20 20 20 20 20 30 78 Extern 0x
2280: 30 30 30 38 30 30 20 20 20 20 2f 2a 20 22 65 78 000800 /* "ex
2290: 74 65 72 6e 22 20 68 61 73 20 62 65 65 6e 20 73 tern" has been s
22a0: 65 65 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 een */.#define P
22b0: 53 5f 45 78 70 6f 72 74 20 20 20 20 20 20 20 20 S_Export
22c0: 30 78 30 30 31 30 30 30 20 20 20 20 2f 2a 20 49 0x001000 /* I
22d0: 66 20 62 65 74 77 65 65 6e 20 22 23 69 66 20 45 f between "#if E
22e0: 58 50 4f 52 54 5f 49 4e 54 45 52 46 41 43 45 22 XPORT_INTERFACE"
22f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2310: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 22 23 65 ** and "#e
2320: 6e 64 69 66 22 20 2a 2f 0a 23 64 65 66 69 6e 65 ndif" */.#define
2330: 20 50 53 5f 45 78 70 6f 72 74 32 20 20 20 20 20 PS_Export2
2340: 20 20 30 78 30 30 32 30 30 30 20 20 20 20 2f 2a 0x002000 /*
2350: 20 49 66 20 22 45 58 50 4f 52 54 22 20 73 65 65 If "EXPORT" see
2360: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f n */.#define PS_
2370: 54 79 70 65 64 65 66 20 20 20 20 20 20 20 30 78 Typedef 0x
2380: 30 30 34 30 30 30 20 20 20 20 2f 2a 20 49 66 20 004000 /* If
2390: 22 74 79 70 65 64 65 66 22 20 68 61 73 20 62 65 "typedef" has be
23a0: 65 6e 20 73 65 65 6e 20 2a 2f 0a 23 64 65 66 69 en seen */.#defi
23b0: 6e 65 20 50 53 5f 53 74 61 74 69 63 20 20 20 20 ne PS_Static
23c0: 20 20 20 20 30 78 30 30 38 30 30 30 20 20 20 20 0x008000
23d0: 2f 2a 20 49 66 20 22 73 74 61 74 69 63 22 20 68 /* If "static" h
23e0: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 2a 2f 0a as been seen */.
23f0: 23 64 65 66 69 6e 65 20 50 53 5f 49 6e 74 65 72 #define PS_Inter
2400: 66 61 63 65 20 20 20 20 20 30 78 30 31 30 30 30 face 0x01000
2410: 30 20 20 20 20 2f 2a 20 49 66 20 77 69 74 68 69 0 /* If withi
2420: 6e 20 23 69 66 20 49 4e 54 45 52 46 41 43 45 2e n #if INTERFACE.
2430: 2e 23 65 6e 64 69 66 20 2a 2f 0a 23 64 65 66 69 .#endif */.#defi
2440: 6e 65 20 50 53 5f 4d 65 74 68 6f 64 20 20 20 20 ne PS_Method
2450: 20 20 20 20 30 78 30 32 30 30 30 30 20 20 20 20 0x020000
2460: 2f 2a 20 49 66 20 22 3a 3a 22 20 74 6f 6b 65 6e /* If "::" token
2470: 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 2a has been seen *
2480: 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 4c 6f 63 /.#define PS_Loc
2490: 61 6c 20 20 20 20 20 20 20 20 20 30 78 30 34 30 al 0x040
24a0: 30 30 30 20 20 20 20 2f 2a 20 49 66 20 77 69 74 000 /* If wit
24b0: 68 69 6e 20 23 69 66 20 4c 4f 43 41 4c 5f 49 4e hin #if LOCAL_IN
24c0: 54 45 52 46 41 43 45 2e 2e 23 65 6e 64 69 66 20 TERFACE..#endif
24d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 53 5f 4c 6f */.#define PS_Lo
24e0: 63 61 6c 32 20 20 20 20 20 20 20 20 30 78 30 38 cal2 0x08
24f0: 30 30 30 30 20 20 20 20 2f 2a 20 49 66 20 22 4c 0000 /* If "L
2500: 4f 43 41 4c 22 20 73 65 65 6e 2e 20 2a 2f 0a 23 OCAL" seen. */.#
2510: 64 65 66 69 6e 65 20 50 53 5f 50 75 62 6c 69 63 define PS_Public
2520: 20 20 20 20 20 20 20 20 30 78 31 30 30 30 30 30 0x100000
2530: 20 20 20 20 2f 2a 20 49 66 20 22 50 55 42 4c 49 /* If "PUBLI
2540: 43 22 20 73 65 65 6e 2e 20 2a 2f 0a 23 64 65 66 C" seen. */.#def
2550: 69 6e 65 20 50 53 5f 50 72 6f 74 65 63 74 65 64 ine PS_Protected
2560: 20 20 20 20 20 30 78 32 30 30 30 30 30 20 20 20 0x200000
2570: 20 2f 2a 20 49 66 20 22 50 52 4f 54 45 43 54 45 /* If "PROTECTE
2580: 44 22 20 73 65 65 6e 2e 20 2a 2f 0a 23 64 65 66 D" seen. */.#def
2590: 69 6e 65 20 50 53 5f 50 72 69 76 61 74 65 20 20 ine PS_Private
25a0: 20 20 20 20 20 30 78 34 30 30 30 30 30 20 20 20 0x400000
25b0: 20 2f 2a 20 49 66 20 22 50 52 49 56 41 54 45 22 /* If "PRIVATE"
25c0: 20 73 65 65 6e 2e 20 2a 2f 0a 23 64 65 66 69 6e seen. */.#defin
25d0: 65 20 50 53 5f 50 50 50 20 20 20 20 20 20 20 20 e PS_PPP
25e0: 20 20 20 30 78 37 30 30 30 30 30 20 20 20 20 2f 0x700000 /
25f0: 2a 20 49 66 20 61 6e 79 20 6f 66 20 50 55 42 4c * If any of PUBL
2600: 49 43 2c 20 50 52 49 56 41 54 45 2c 20 50 52 4f IC, PRIVATE, PRO
2610: 54 45 43 54 45 44 20 2a 2f 0a 0a 2f 2a 0a 2a 2a TECTED */../*.**
2620: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 The following s
2630: 65 74 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 et of flags are
2640: 4f 52 65 64 20 69 6e 74 6f 20 74 68 65 20 22 66 ORed into the "f
2650: 6c 61 67 73 22 20 66 69 65 6c 64 20 6f 66 0a 2a lags" field of.*
2660: 2a 20 61 20 44 65 63 6c 20 69 6e 20 6f 72 64 65 * a Decl in orde
2670: 72 20 74 6f 20 69 64 65 6e 74 69 66 79 20 77 68 r to identify wh
2680: 61 74 20 74 79 70 65 20 6f 66 20 6f 62 6a 65 63 at type of objec
2690: 74 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 64 65 t is being.** de
26a0: 63 6c 61 72 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 clared..*/.#defi
26b0: 6e 65 20 54 59 5f 43 6c 61 73 73 20 20 20 20 20 ne TY_Class
26c0: 20 20 20 20 30 78 30 30 31 30 30 30 30 30 0a 23 0x00100000.#
26d0: 64 65 66 69 6e 65 20 54 59 5f 53 75 62 72 6f 75 define TY_Subrou
26e0: 74 69 6e 65 20 20 20 20 30 78 30 30 32 30 30 30 tine 0x002000
26f0: 30 30 0a 23 64 65 66 69 6e 65 20 54 59 5f 4d 61 00.#define TY_Ma
2700: 63 72 6f 20 20 20 20 20 20 20 20 20 30 78 30 30 cro 0x00
2710: 34 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 54 400000.#define T
2720: 59 5f 54 79 70 65 64 65 66 20 20 20 20 20 20 20 Y_Typedef
2730: 30 78 30 30 38 30 30 30 30 30 0a 23 64 65 66 69 0x00800000.#defi
2740: 6e 65 20 54 59 5f 56 61 72 69 61 62 6c 65 20 20 ne TY_Variable
2750: 20 20 20 20 30 78 30 31 30 30 30 30 30 30 0a 23 0x01000000.#
2760: 64 65 66 69 6e 65 20 54 59 5f 53 74 72 75 63 74 define TY_Struct
2770: 75 72 65 20 20 20 20 20 30 78 30 32 30 30 30 30 ure 0x020000
2780: 30 30 0a 23 64 65 66 69 6e 65 20 54 59 5f 55 6e 00.#define TY_Un
2790: 69 6f 6e 20 20 20 20 20 20 20 20 20 30 78 30 34 ion 0x04
27a0: 30 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 54 000000.#define T
27b0: 59 5f 45 6e 75 6d 65 72 61 74 69 6f 6e 20 20 20 Y_Enumeration
27c0: 30 78 30 38 30 30 30 30 30 30 0a 23 64 65 66 69 0x08000000.#defi
27d0: 6e 65 20 54 59 5f 44 65 66 75 6e 63 74 20 20 20 ne TY_Defunct
27e0: 20 20 20 20 30 78 31 30 30 30 30 30 30 30 20 20 0x10000000
27f0: 2f 2a 20 55 73 65 64 20 74 6f 20 65 72 61 73 65 /* Used to erase
2800: 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a a declaration *
2810: 2f 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 6e 65 /../*.** Each ne
2820: 73 74 65 64 20 23 69 66 20 28 6f 72 20 23 69 66 sted #if (or #if
2830: 64 65 66 20 6f 72 20 23 69 66 6e 64 65 66 29 20 def or #ifndef)
2840: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 is stored in a s
2850: 74 61 63 6b 20 6f 66 0a 2a 2a 20 69 6e 73 74 61 tack of.** insta
2860: 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c nces of the foll
2870: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e owing structure.
2880: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 .*/.typedef stru
2890: 63 74 20 49 66 6d 61 63 72 6f 20 49 66 6d 61 63 ct Ifmacro Ifmac
28a0: 72 6f 3b 0a 73 74 72 75 63 74 20 49 66 6d 61 63 ro;.struct Ifmac
28b0: 72 6f 20 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 ro {. int nLine
28c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e ; /* Lin
28d0: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 e number where t
28e0: 68 69 73 20 6d 61 63 72 6f 20 6f 63 63 75 72 73 his macro occurs
28f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e */. char *zCon
2900: 64 69 74 69 6f 6e 3b 20 20 2f 2a 20 54 65 78 74 dition; /* Text
2910: 20 6f 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f of the conditio
2920: 6e 20 66 6f 72 20 74 68 69 73 20 6d 61 63 72 6f n for this macro
2930: 20 2a 2f 0a 20 20 49 66 6d 61 63 72 6f 20 2a 70 */. Ifmacro *p
2940: 4e 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74 Next; /* Next
2950: 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 73 74 61 down in the sta
2960: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 ck */. int flag
2970: 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 s; /* Ca
2980: 6e 20 68 6f 6c 64 20 50 53 5f 45 78 70 6f 72 74 n hold PS_Export
2990: 2c 20 50 53 5f 49 6e 74 65 72 66 61 63 65 20 6f , PS_Interface o
29a0: 72 20 50 53 5f 4c 6f 63 61 6c 20 66 6c 61 67 73 r PS_Local flags
29b0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 57 68 */.};../*.** Wh
29c0: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 66 69 6c en parsing a fil
29d0: 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 65 e, we need to ke
29e0: 65 70 20 74 72 61 63 6b 20 6f 66 20 77 68 61 74 ep track of what
29f0: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 68 61 76 other files hav
2a00: 65 0a 2a 2a 20 62 65 20 23 69 6e 63 6c 75 64 65 e.** be #include
2a10: 2d 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 23 -ed. For each #
2a20: 69 6e 63 6c 75 64 65 20 66 6f 75 6e 64 2c 20 77 include found, w
2a30: 65 20 63 72 65 61 74 65 20 61 6e 20 69 6e 73 74 e create an inst
2a40: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66 ance of.** the f
2a50: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 ollowing structu
2a60: 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 re..*/.typedef s
2a70: 74 72 75 63 74 20 49 6e 63 6c 75 64 65 20 49 6e truct Include In
2a80: 63 6c 75 64 65 3b 0a 73 74 72 75 63 74 20 49 6e clude;.struct In
2a90: 63 6c 75 64 65 20 7b 0a 20 20 63 68 61 72 20 2a clude {. char *
2aa0: 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 zFile; /*
2ab0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 66 69 6c 65 The name of file
2ac0: 20 69 6e 63 6c 75 64 65 2e 20 20 49 6e 63 6c 75 include. Inclu
2ad0: 64 65 73 20 22 22 20 6f 72 20 3c 3e 20 2a 2f 0a des "" or <> */.
2ae0: 20 20 63 68 61 72 20 2a 7a 49 66 3b 20 20 20 20 char *zIf;
2af0: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e /* If not N
2b00: 55 4c 4c 2c 20 23 69 6e 63 6c 75 64 65 20 73 68 ULL, #include sh
2b10: 6f 75 6c 64 20 62 65 20 65 6e 63 6c 6f 73 65 64 ould be enclosed
2b20: 20 69 6e 20 23 69 66 20 2a 2f 0a 20 20 63 68 61 in #if */. cha
2b30: 72 20 2a 7a 4c 61 62 65 6c 3b 20 20 20 20 20 20 r *zLabel;
2b40: 2f 2a 20 41 20 75 6e 69 71 75 65 20 6c 61 62 65 /* A unique labe
2b50: 6c 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 69 l used to test i
2b60: 66 20 74 68 69 73 20 23 69 6e 63 6c 75 64 65 20 f this #include
2b70: 68 61 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 has.
2b80: 20 20 20 20 20 20 20 20 20 20 2a 20 61 70 70 65 * appe
2b90: 61 72 65 64 20 61 6c 72 65 61 64 79 20 69 6e 20 ared already in
2ba0: 61 20 66 69 6c 65 20 6f 72 20 6e 6f 74 20 2a 2f a file or not */
2bb0: 0a 20 20 49 6e 63 6c 75 64 65 20 2a 70 4e 65 78 . Include *pNex
2bc0: 74 3b 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 t; /* Previou
2bd0: 73 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 2c 20 s include file,
2be0: 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 20 or NULL if this
2bf0: 69 73 20 74 68 65 20 66 69 72 73 74 20 2a 2f 0a is the first */.
2c00: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 64 65 6e 74 69 };../*.** Identi
2c10: 66 69 65 72 73 20 66 6f 75 6e 64 20 69 6e 20 61 fiers found in a
2c20: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 74 68 61 source file tha
2c30: 74 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 t might be used
2c40: 6c 61 74 65 72 20 74 6f 20 70 72 6f 76 6f 6b 65 later to provoke
2c50: 0a 2a 2a 20 74 68 65 20 63 6f 70 79 69 6e 67 20 .** the copying
2c60: 6f 66 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e of a declaration
2c70: 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 73 into the corres
2c80: 70 6f 6e 64 69 6e 67 20 68 65 61 64 65 72 20 66 ponding header f
2c90: 69 6c 65 20 61 72 65 0a 2a 2a 20 73 74 6f 72 65 ile are.** store
2ca0: 64 20 69 6e 20 61 20 68 61 73 68 20 74 61 62 6c d in a hash tabl
2cb0: 65 20 61 73 20 69 6e 73 74 61 6e 63 65 73 20 6f e as instances o
2cc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 f the following
2cd0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 structure..*/.ty
2ce0: 70 65 64 65 66 20 73 74 72 75 63 74 20 49 64 65 pedef struct Ide
2cf0: 6e 74 20 49 64 65 6e 74 3b 0a 73 74 72 75 63 74 nt Ident;.struct
2d00: 20 49 64 65 6e 74 20 7b 0a 20 20 63 68 61 72 20 Ident {. char
2d10: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 2f *zName; /
2d20: 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 * The text of th
2d30: 69 73 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f is identifier */
2d40: 0a 20 20 49 64 65 6e 74 20 2a 70 43 6f 6c 6c 69 . Ident *pColli
2d50: 64 65 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 de; /* Next i
2d60: 64 65 6e 74 69 66 69 65 72 20 77 69 74 68 20 74 dentifier with t
2d70: 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a he same hash */.
2d80: 20 20 49 64 65 6e 74 20 2a 70 4e 65 78 74 3b 20 Ident *pNext;
2d90: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 64 /* Next id
2da0: 65 6e 74 69 66 69 65 72 20 69 6e 20 61 20 6c 69 entifier in a li
2db0: 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a st of them all *
2dc0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 6f /.};../*.** A co
2dd0: 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 6f 66 20 mplete table of
2de0: 69 64 65 6e 74 69 66 69 65 72 73 20 69 73 20 73 identifiers is s
2df0: 74 6f 72 65 64 20 69 6e 20 61 6e 20 69 6e 73 74 tored in an inst
2e00: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e ance of.** the n
2e10: 65 78 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a ext structure..*
2e20: 2f 0a 23 64 65 66 69 6e 65 20 49 44 45 4e 54 5f /.#define IDENT_
2e30: 48 41 53 48 5f 53 49 5a 45 20 32 32 33 37 0a 74 HASH_SIZE 2237.t
2e40: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49 64 ypedef struct Id
2e50: 65 6e 74 54 61 62 6c 65 20 49 64 65 6e 74 54 61 entTable IdentTa
2e60: 62 6c 65 3b 0a 73 74 72 75 63 74 20 49 64 65 6e ble;.struct Iden
2e70: 74 54 61 62 6c 65 20 7b 0a 20 20 49 64 65 6e 74 tTable {. Ident
2e80: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 *pList;
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
2ea0: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 69 64 65 6e List of all iden
2eb0: 74 69 66 69 65 72 73 20 69 6e 20 74 68 69 73 20 tifiers in this
2ec0: 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64 65 6e 74 table */. Ident
2ed0: 20 2a 61 70 54 61 62 6c 65 5b 49 44 45 4e 54 5f *apTable[IDENT_
2ee0: 48 41 53 48 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20 HASH_SIZE]; /*
2ef0: 54 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a The hash table *
2f00: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 /.};../*.** The
2f10: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 following struct
2f20: 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e ure holds all in
2f30: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 formation for a
2f40: 73 69 6e 67 6c 65 0a 2a 2a 20 73 6f 75 72 63 65 single.** source
2f50: 20 66 69 6c 65 20 6e 61 6d 65 64 20 6f 6e 20 74 file named on t
2f60: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 he command line
2f70: 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 2e of this program.
2f80: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 .*/.typedef stru
2f90: 63 74 20 49 6e 46 69 6c 65 20 49 6e 46 69 6c 65 ct InFile InFile
2fa0: 3b 0a 73 74 72 75 63 74 20 49 6e 46 69 6c 65 20 ;.struct InFile
2fb0: 7b 0a 20 20 63 68 61 72 20 2a 7a 53 72 63 3b 20 {. char *zSrc;
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
2fd0: 4e 61 6d 65 20 6f 66 20 69 6e 70 75 74 20 66 69 Name of input fi
2fe0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 le */. char *zH
2ff0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 dr;
3000: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 /* Name of the
3010: 67 65 6e 65 72 61 74 65 64 20 2e 68 20 66 69 6c generated .h fil
3020: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 70 75 74 e for this input
3030: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 **
3050: 57 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 Will be NULL if
3060: 69 6e 70 75 74 20 69 73 20 74 6f 20 62 65 20 73 input is to be s
3070: 63 61 6e 6e 65 64 20 6f 6e 6c 79 20 2a 2f 0a 20 canned only */.
3080: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 int flags;
3090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 /* One
30a0: 20 6f 72 20 6d 6f 72 65 20 44 50 5f 2c 20 50 53 or more DP_, PS
30b0: 5f 20 61 6e 64 2f 6f 72 20 54 59 5f 20 66 6c 61 _ and/or TY_ fla
30c0: 67 73 20 2a 2f 0a 20 20 49 6e 46 69 6c 65 20 2a gs */. InFile *
30d0: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 pNext;
30e0: 20 2f 2a 20 4e 65 78 74 20 69 6e 70 75 74 20 66 /* Next input f
30f0: 69 6c 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 ile in the list
3100: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 of them all */.
3110: 20 49 64 65 6e 74 54 61 62 6c 65 20 69 64 54 61 IdentTable idTa
3120: 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20 41 6c 6c ble; /* All
3130: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 identifiers in
3140: 74 68 69 73 20 69 6e 70 75 74 20 66 69 6c 65 20 this input file
3150: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 */.};../*.** An
3160: 75 6e 62 6f 75 6e 64 65 64 20 73 74 72 69 6e 67 unbounded string
3170: 20 69 73 20 61 62 6c 65 20 74 6f 20 67 72 6f 77 is able to grow
3180: 20 77 69 74 68 6f 75 74 20 6c 69 6d 69 74 2e 20 without limit.
3190: 20 57 65 20 75 73 65 20 74 68 65 73 65 0a 2a 2a We use these.**
31a0: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 6c 61 to construct la
31b0: 72 67 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 rge in-memory st
31c0: 72 69 6e 67 73 20 66 72 6f 6d 20 6c 6f 74 73 20 rings from lots
31d0: 6f 66 20 73 6d 61 6c 6c 65 72 20 63 6f 6d 70 6f of smaller compo
31e0: 6e 65 6e 74 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 nents..*/.typede
31f0: 66 20 73 74 72 75 63 74 20 53 74 72 69 6e 67 20 f struct String
3200: 53 74 72 69 6e 67 3b 0a 73 74 72 75 63 74 20 53 String;.struct S
3210: 74 72 69 6e 67 20 7b 0a 20 20 69 6e 74 20 6e 41 tring {. int nA
3220: 6c 6c 6f 63 3b 20 20 20 20 20 20 2f 2a 20 4e 75 lloc; /* Nu
3230: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c mber of bytes al
3240: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 located */. int
3250: 20 6e 55 73 65 64 3b 20 20 20 20 20 20 20 2f 2a nUsed; /*
3260: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 Number of bytes
3270: 20 75 73 65 64 20 28 6e 6f 74 20 63 6f 75 6e 74 used (not count
3280: 69 6e 67 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 ing null termina
3290: 74 6f 72 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a tor) */. char *
32a0: 7a 54 65 78 74 3b 20 20 20 20 20 2f 2a 20 54 65 zText; /* Te
32b0: 78 74 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 xt of the string
32c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 */.};../*.** Th
32d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 e following stru
32e0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 cture contains a
32f0: 20 6c 6f 74 20 6f 66 20 73 74 61 74 65 20 69 6e lot of state in
3300: 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 0a 2a formation used.*
3310: 2a 20 77 68 69 6c 65 20 67 65 6e 65 72 61 74 69 * while generati
3320: 6e 67 20 61 20 2e 68 20 66 69 6c 65 2e 20 20 57 ng a .h file. W
3330: 65 20 70 75 74 20 74 68 65 20 69 6e 66 6f 72 6d e put the inform
3340: 61 74 69 6f 6e 20 69 6e 20 74 68 69 73 20 73 74 ation in this st
3350: 72 75 63 74 75 72 65 0a 2a 2a 20 61 6e 64 20 70 ructure.** and p
3360: 61 73 73 20 61 72 6f 75 6e 64 20 61 20 70 6f 69 ass around a poi
3370: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73 74 72 nter to this str
3380: 75 63 74 75 72 65 2c 20 72 61 74 68 65 72 20 74 ucture, rather t
3390: 68 61 6e 20 70 61 73 73 20 61 72 6f 75 6e 64 0a han pass around.
33a0: 2a 2a 20 61 6c 6c 20 6f 66 20 74 68 65 20 69 6e ** all of the in
33b0: 66 6f 72 6d 61 74 69 6f 6e 20 73 65 70 61 72 61 formation separa
33c0: 74 65 6c 79 2e 20 20 54 68 69 73 20 68 65 6c 70 tely. This help
33d0: 73 20 72 65 64 75 63 65 20 74 68 65 20 6e 75 6d s reduce the num
33e0: 62 65 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 ber of.** argume
33f0: 6e 74 73 20 74 6f 20 67 65 6e 65 72 61 74 6f 72 nts to generator
3400: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 functions..*/.t
3410: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 47 65 ypedef struct Ge
3420: 6e 53 74 61 74 65 20 47 65 6e 53 74 61 74 65 3b nState GenState;
3430: 0a 73 74 72 75 63 74 20 47 65 6e 53 74 61 74 65 .struct GenState
3440: 20 7b 0a 20 20 53 74 72 69 6e 67 20 2a 70 53 74 {. String *pSt
3450: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 r; /* W
3460: 72 69 74 65 20 6f 75 74 70 75 74 20 74 6f 20 74 rite output to t
3470: 68 69 73 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 his string */.
3480: 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 54 61 62 IdentTable *pTab
3490: 6c 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c le; /* A tabl
34a0: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 7a 4c e holding the zL
34b0: 61 62 65 6c 20 6f 66 20 65 76 65 72 79 20 23 69 abel of every #i
34c0: 6e 63 6c 75 64 65 20 74 68 61 74 0a 20 20 20 20 nclude that.
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
34e0: 20 20 20 20 20 20 2a 20 68 61 73 20 61 6c 72 65 * has alre
34f0: 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 ady been generat
3500: 65 64 2e 20 20 55 73 65 64 20 74 6f 20 61 76 6f ed. Used to avo
3510: 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 id.
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 67 * g
3530: 65 6e 65 72 61 74 69 6e 67 20 64 75 70 6c 69 63 enerating duplic
3540: 61 74 65 20 23 69 6e 63 6c 75 64 65 73 2e 20 2a ate #includes. *
3550: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a /. const char *
3560: 7a 49 66 3b 20 20 20 20 20 20 20 2f 2a 20 49 66 zIf; /* If
3570: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 not NULL, then
3580: 77 65 20 61 72 65 20 77 69 74 68 69 6e 20 61 20 we are within a
3590: 23 69 66 20 77 69 74 68 0a 20 20 20 20 20 20 20 #if with.
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
35b0: 20 20 20 2a 20 74 68 69 73 20 61 72 67 75 6d 65 * this argume
35c0: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 nt. */. int nEr
35d0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r;
35e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 /* Number of err
35f0: 6f 72 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 ors */. const c
3600: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 har *zFilename;
3610: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 /* Name of the s
3620: 6f 75 72 63 65 20 66 69 6c 65 20 62 65 69 6e 67 ource file being
3630: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e scanned */. in
3640: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 t flags;
3650: 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 /* Various
3660: 66 6c 61 67 73 20 28 44 50 5f 20 61 6e 64 20 50 flags (DP_ and P
3670: 53 5f 20 66 6c 61 67 73 20 61 62 6f 76 65 29 20 S_ flags above)
3680: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 */.};../*.** The
3690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 20 following text
36a0: 6c 69 6e 65 20 61 70 70 65 61 72 73 20 61 74 20 line appears at
36b0: 74 68 65 20 74 6f 70 20 6f 66 20 65 76 65 72 79 the top of every
36c0: 20 66 69 6c 65 20 67 65 6e 65 72 61 74 65 64 0a file generated.
36d0: 2a 2a 20 62 79 20 74 68 69 73 20 70 72 6f 67 72 ** by this progr
36e0: 61 6d 2e 20 20 42 79 20 72 65 63 6f 67 6e 69 7a am. By recogniz
36f0: 69 6e 67 20 74 68 69 73 20 6c 69 6e 65 2c 20 74 ing this line, t
3700: 68 65 20 70 72 6f 67 72 61 6d 20 63 61 6e 20 62 he program can b
3710: 65 20 73 75 72 65 0a 2a 2a 20 6e 65 76 65 72 20 e sure.** never
3720: 74 6f 20 72 65 61 64 20 61 20 66 69 6c 65 20 74 to read a file t
3730: 68 61 74 20 69 74 20 67 65 6e 65 72 61 74 65 64 hat it generated
3740: 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 54 itself..**.** T
3750: 68 65 20 22 23 75 6e 64 65 66 20 49 4e 54 45 52 he "#undef INTER
3760: 46 41 43 45 22 20 70 61 72 74 20 69 73 20 61 20 FACE" part is a
3770: 68 61 63 6b 20 74 6f 20 77 6f 72 6b 20 61 72 6f hack to work aro
3780: 75 6e 64 20 61 20 6e 61 6d 65 20 63 6f 6c 6c 69 und a name colli
3790: 73 69 6f 6e 0a 2a 2a 20 69 6e 20 4d 53 56 43 20 sion.** in MSVC
37a0: 32 30 30 38 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 2008..*/.const c
37b0: 68 61 72 20 7a 54 6f 70 4c 69 6e 65 5b 5d 20 3d har zTopLine[] =
37c0: 0a 20 20 22 2f 2a 20 5c 61 54 68 69 73 20 66 69 . "/* \aThis fi
37d0: 6c 65 20 77 61 73 20 61 75 74 6f 6d 61 74 69 63 le was automatic
37e0: 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 2e 20 ally generated.
37f0: 20 44 6f 20 6e 6f 74 20 65 64 69 74 21 20 2a 2f Do not edit! */
3800: 5c 6e 22 0a 20 20 22 23 75 6e 64 65 66 20 49 4e \n". "#undef IN
3810: 54 45 52 46 41 43 45 5c 6e 22 3b 0a 23 64 65 66 TERFACE\n";.#def
3820: 69 6e 65 20 6e 54 6f 70 4c 69 6e 65 20 28 73 69 ine nTopLine (si
3830: 7a 65 6f 66 28 7a 54 6f 70 4c 69 6e 65 29 2d 31 zeof(zTopLine)-1
3840: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d )../*.** The nam
3850: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 e of the file cu
3860: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 rrently being pa
3870: 72 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 rsed..*/.static
3880: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c const char *zFil
3890: 65 6e 61 6d 65 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 ename;../*.** Th
38a0: 65 20 73 74 61 63 6b 20 6f 66 20 23 69 66 20 6d e stack of #if m
38b0: 61 63 72 6f 73 20 66 6f 72 20 74 68 65 20 66 69 acros for the fi
38c0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 le currently bei
38d0: 6e 67 20 70 61 72 73 65 64 2e 0a 2a 2f 0a 73 74 ng parsed..*/.st
38e0: 61 74 69 63 20 49 66 6d 61 63 72 6f 20 2a 69 66 atic Ifmacro *if
38f0: 53 74 61 63 6b 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a Stack = 0;../*.*
3900: 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 * A list of all
3910: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 files that have
3920: 62 65 65 6e 20 23 69 6e 63 6c 75 64 65 64 20 73 been #included s
3930: 6f 20 66 61 72 20 69 6e 20 61 20 66 69 6c 65 20 o far in a file
3940: 62 65 69 6e 67 0a 2a 2a 20 70 61 72 73 65 64 2e being.** parsed.
3950: 0a 2a 2f 0a 73 74 61 74 69 63 20 49 6e 63 6c 75 .*/.static Inclu
3960: 64 65 20 2a 69 6e 63 6c 75 64 65 4c 69 73 74 20 de *includeList
3970: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 = 0;../*.** The
3980: 6c 61 73 74 20 62 6c 6f 63 6b 20 63 6f 6d 6d 65 last block comme
3990: 6e 74 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74 nt seen..*/.stat
39a0: 69 63 20 54 6f 6b 65 6e 20 2a 62 6c 6f 63 6b 43 ic Token *blockC
39b0: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a omment = 0;../*.
39c0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 ** The following
39d0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 66 20 flag is set if
39e0: 74 68 65 20 2d 64 6f 63 20 66 6c 61 67 20 61 70 the -doc flag ap
39f0: 70 65 61 72 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 pears on the.**
3a00: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 0a 2a 2f command line..*/
3a10: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 63 5f .static int doc_
3a20: 66 6c 61 67 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a flag = 0;../*.**
3a30: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e If the followin
3a40: 67 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 g flag is set, t
3a50: 68 65 6e 20 6d 61 6b 65 68 65 61 64 65 72 73 20 hen makeheaders
3a60: 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a will attempt to.
3a70: 2a 2a 20 67 65 6e 65 72 61 74 65 20 70 72 6f 74 ** generate prot
3a80: 6f 74 79 70 65 73 20 66 6f 72 20 73 74 61 74 69 otypes for stati
3a90: 63 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 c functions and
3aa0: 70 72 6f 63 65 64 75 72 65 73 2e 0a 2a 2f 0a 73 procedures..*/.s
3ab0: 74 61 74 69 63 20 69 6e 74 20 70 72 6f 74 6f 5f tatic int proto_
3ac0: 73 74 61 74 69 63 20 3d 20 30 3b 0a 0a 2f 2a 0a static = 0;../*.
3ad0: 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c ** A list of all
3ae0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 20 20 declarations.
3af0: 54 68 65 20 6c 69 73 74 20 69 73 20 68 65 6c 64 The list is held
3b00: 20 74 6f 67 65 74 68 65 72 20 75 73 69 6e 67 20 together using
3b10: 74 68 65 0a 2a 2a 20 70 4e 65 78 74 20 66 69 65 the.** pNext fie
3b20: 6c 64 20 6f 66 20 74 68 65 20 44 65 63 6c 20 73 ld of the Decl s
3b30: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 tructure..*/.sta
3b40: 74 69 63 20 44 65 63 6c 20 2a 70 44 65 63 6c 46 tic Decl *pDeclF
3b50: 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 irst; /* Firs
3b60: 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f t on the list */
3b70: 0a 73 74 61 74 69 63 20 44 65 63 6c 20 2a 70 44 .static Decl *pD
3b80: 65 63 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 eclLast; /*
3b90: 4c 61 73 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 Last on the list
3ba0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 68 61 73 */../*.** A has
3bb0: 68 20 74 61 62 6c 65 20 6f 66 20 61 6c 6c 20 64 h table of all d
3bc0: 65 63 6c 61 72 61 74 69 6f 6e 73 0a 2a 2f 0a 23 eclarations.*/.#
3bd0: 64 65 66 69 6e 65 20 44 45 43 4c 5f 48 41 53 48 define DECL_HASH
3be0: 5f 53 49 5a 45 20 33 33 37 31 0a 73 74 61 74 69 _SIZE 3371.stati
3bf0: 63 20 44 65 63 6c 20 2a 61 70 54 61 62 6c 65 5b c Decl *apTable[
3c00: 44 45 43 4c 5f 48 41 53 48 5f 53 49 5a 45 5d 3b DECL_HASH_SIZE];
3c10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 45 53 54 ../*.** The TEST
3c20: 20 6d 61 63 72 6f 20 6d 75 73 74 20 62 65 20 64 macro must be d
3c30: 65 66 69 6e 65 64 20 74 6f 20 73 6f 6d 65 74 68 efined to someth
3c40: 69 6e 67 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 ing. Make sure
3c50: 74 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 63 this is the.** c
3c60: 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 ase..*/.#ifndef
3c70: 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54 45 TEST.# define TE
3c80: 53 54 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 ST 0.#endif..#if
3c90: 64 65 66 20 4e 4f 54 5f 55 53 45 44 0a 2f 2a 0a def NOT_USED./*.
3ca0: 2a 2a 20 57 65 20 64 6f 20 6f 75 72 20 6f 77 6e ** We do our own
3cb0: 20 61 73 73 65 72 74 69 6f 6e 20 6d 61 63 72 6f assertion macro
3cc0: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 so that we can
3cd0: 68 61 76 65 20 6d 6f 72 65 20 63 6f 6e 74 72 6f have more contro
3ce0: 6c 0a 2a 2a 20 6f 76 65 72 20 64 65 62 75 67 67 l.** over debugg
3cf0: 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 ing..*/.#define
3d00: 41 73 73 65 72 74 28 58 29 20 20 20 20 69 66 28 Assert(X) if(
3d10: 21 28 58 29 29 7b 20 43 61 6e 74 48 61 70 70 65 !(X)){ CantHappe
3d20: 6e 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 7d 0a 23 n(__LINE__); }.#
3d30: 64 65 66 69 6e 65 20 43 41 4e 54 5f 48 41 50 50 define CANT_HAPP
3d40: 45 4e 20 20 43 61 6e 74 48 61 70 70 65 6e 28 5f EN CantHappen(_
3d50: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 _LINE__).static
3d60: 76 6f 69 64 20 43 61 6e 74 48 61 70 70 65 6e 28 void CantHappen(
3d70: 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 66 70 int iLine){. fp
3d80: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 41 73 rintf(stderr,"As
3d90: 73 65 72 74 69 6f 6e 20 66 61 69 6c 65 64 20 6f sertion failed o
3da0: 6e 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 69 4c 69 n line %d\n",iLi
3db0: 6e 65 29 3b 0a 20 20 2a 28 63 68 61 72 2a 29 31 ne);. *(char*)1
3dc0: 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 63 65 20 = 0; /* Force
3dd0: 61 20 63 6f 72 65 2d 64 75 6d 70 20 2a 2f 0a 7d a core-dump */.}
3de0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d .#endif../*.** M
3df0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e emory allocation
3e00: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 functions that
3e10: 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 6e are guaranteed n
3e20: 65 76 65 72 20 74 6f 20 72 65 74 75 72 6e 20 4e ever to return N
3e30: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 ULL..*/.static v
3e40: 6f 69 64 20 2a 53 61 66 65 4d 61 6c 6c 6f 63 28 oid *SafeMalloc(
3e50: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f int nByte){. vo
3e60: 69 64 20 2a 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 id *p = malloc(
3e70: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 nByte );. if( p
3e80: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e ==0 ){. fprin
3e90: 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f tf(stderr,"Out o
3ea0: 66 20 6d 65 6d 6f 72 79 2e 20 20 43 61 6e 27 74 f memory. Can't
3eb0: 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 62 79 74 allocate %d byt
3ec0: 65 73 2e 5c 6e 22 2c 6e 42 79 74 65 29 3b 0a 20 es.\n",nByte);.
3ed0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a exit(1);. }.
3ee0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 73 74 return p;.}.st
3ef0: 61 74 69 63 20 76 6f 69 64 20 53 61 66 65 46 72 atic void SafeFr
3f00: 65 65 28 76 6f 69 64 20 2a 70 4f 6c 64 29 7b 0a ee(void *pOld){.
3f10: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 if( pOld ){.
3f20: 20 20 66 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20 free(pOld);.
3f30: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 }.}.static void
3f40: 2a 53 61 66 65 52 65 61 6c 6c 6f 63 28 76 6f 69 *SafeRealloc(voi
3f50: 64 20 2a 70 4f 6c 64 2c 20 69 6e 74 20 6e 42 79 d *pOld, int nBy
3f60: 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a te){. void *p;.
3f70: 20 20 69 66 28 20 70 4f 6c 64 3d 3d 30 20 29 7b if( pOld==0 ){
3f80: 0a 20 20 20 20 70 20 3d 20 53 61 66 65 4d 61 6c . p = SafeMal
3f90: 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 7d 65 loc(nByte);. }e
3fa0: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 72 65 61 lse{. p = rea
3fb0: 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 42 79 74 65 lloc(pOld, nByte
3fc0: 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 );. if( p==0
3fd0: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 ){. fprintf
3fe0: 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 (stderr,.
3ff0: 20 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e "Out of memory.
4000: 20 20 43 61 6e 27 74 20 65 6e 6c 61 72 67 65 20 Can't enlarge
4010: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 74 6f an allocation to
4020: 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 6e 42 79 %d bytes\n",nBy
4030: 74 65 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 te);. exit(
4040: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 1);. }. }.
4050: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 73 74 61 74 return p;.}.stat
4060: 69 63 20 63 68 61 72 20 2a 53 74 72 44 75 70 28 ic char *StrDup(
4070: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 const char *zSrc
4080: 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 , int nByte){.
4090: 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20 69 char *zDest;. i
40a0: 66 28 20 6e 42 79 74 65 3c 3d 30 20 29 7b 0a 20 f( nByte<=0 ){.
40b0: 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 nByte = strle
40c0: 6e 28 7a 53 72 63 29 3b 0a 20 20 7d 0a 20 20 7a n(zSrc);. }. z
40d0: 44 65 73 74 20 3d 20 53 61 66 65 4d 61 6c 6c 6f Dest = SafeMallo
40e0: 63 28 20 6e 42 79 74 65 20 2b 20 31 20 29 3b 0a c( nByte + 1 );.
40f0: 20 20 73 74 72 6e 63 70 79 28 7a 44 65 73 74 2c strncpy(zDest,
4100: 7a 53 72 63 2c 6e 42 79 74 65 29 3b 0a 20 20 7a zSrc,nByte);. z
4110: 44 65 73 74 5b 6e 42 79 74 65 5d 20 3d 20 30 3b Dest[nByte] = 0;
4120: 0a 20 20 72 65 74 75 72 6e 20 7a 44 65 73 74 3b . return zDest;
4130: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e .}../*.** Return
4140: 20 54 52 55 45 20 69 66 20 74 68 65 20 63 68 61 TRUE if the cha
4150: 72 61 63 74 65 72 20 58 20 63 61 6e 20 62 65 20 racter X can be
4160: 70 61 72 74 20 6f 66 20 61 6e 20 69 64 65 6e 74 part of an ident
4170: 69 66 69 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 ifier.*/.#define
4180: 20 49 53 41 4c 4e 55 4d 28 58 29 20 20 28 28 58 ISALNUM(X) ((X
4190: 29 3d 3d 27 5f 27 20 7c 7c 20 69 73 61 6c 6e 75 )=='_' || isalnu
41a0: 6d 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 m(X))../*.** Rou
41b0: 74 69 6e 65 73 20 66 6f 72 20 64 65 61 6c 69 6e tines for dealin
41c0: 67 20 77 69 74 68 20 75 6e 62 6f 75 6e 64 65 64 g with unbounded
41d0: 20 73 74 72 69 6e 67 73 2e 0a 2a 2f 0a 73 74 61 strings..*/.sta
41e0: 74 69 63 20 76 6f 69 64 20 53 74 72 69 6e 67 49 tic void StringI
41f0: 6e 69 74 28 53 74 72 69 6e 67 20 2a 70 53 74 72 nit(String *pStr
4200: 29 7b 0a 20 20 70 53 74 72 2d 3e 6e 41 6c 6c 6f ){. pStr->nAllo
4210: 63 20 3d 20 30 3b 0a 20 20 70 53 74 72 2d 3e 6e c = 0;. pStr->n
4220: 55 73 65 64 20 3d 20 30 3b 0a 20 20 70 53 74 72 Used = 0;. pStr
4230: 2d 3e 7a 54 65 78 74 20 3d 20 30 3b 0a 7d 0a 73 ->zText = 0;.}.s
4240: 74 61 74 69 63 20 76 6f 69 64 20 53 74 72 69 6e tatic void Strin
4250: 67 52 65 73 65 74 28 53 74 72 69 6e 67 20 2a 70 gReset(String *p
4260: 53 74 72 29 7b 0a 20 20 53 61 66 65 46 72 65 65 Str){. SafeFree
4270: 28 70 53 74 72 2d 3e 7a 54 65 78 74 29 3b 0a 20 (pStr->zText);.
4280: 20 53 74 72 69 6e 67 49 6e 69 74 28 70 53 74 72 StringInit(pStr
4290: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 );.}.static void
42a0: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 53 74 StringAppend(St
42b0: 72 69 6e 67 20 2a 70 53 74 72 2c 20 63 6f 6e 73 ring *pStr, cons
42c0: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 t char *zText, i
42d0: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 nt nByte){. if(
42e0: 20 6e 42 79 74 65 3c 3d 30 20 29 7b 0a 20 20 20 nByte<=0 ){.
42f0: 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 28 nByte = strlen(
4300: 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69 66 zText);. }. if
4310: 28 20 70 53 74 72 2d 3e 6e 55 73 65 64 20 2b 20 ( pStr->nUsed +
4320: 6e 42 79 74 65 20 3e 3d 20 70 53 74 72 2d 3e 6e nByte >= pStr->n
4330: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 66 28 Alloc ){. if(
4340: 20 70 53 74 72 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 pStr->nAlloc==0
4350: 20 29 7b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e ){. pStr->
4360: 6e 41 6c 6c 6f 63 20 3d 20 6e 42 79 74 65 20 2b nAlloc = nByte +
4370: 20 31 30 30 3b 0a 20 20 20 20 20 20 70 53 74 72 100;. pStr
4380: 2d 3e 7a 54 65 78 74 20 3d 20 53 61 66 65 4d 61 ->zText = SafeMa
4390: 6c 6c 6f 63 28 20 70 53 74 72 2d 3e 6e 41 6c 6c lloc( pStr->nAll
43a0: 6f 63 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b oc );. }else{
43b0: 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 6e 41 6c . pStr->nAl
43c0: 6c 6f 63 20 3d 20 70 53 74 72 2d 3e 6e 41 6c 6c loc = pStr->nAll
43d0: 6f 63 2a 32 20 2b 20 6e 42 79 74 65 3b 0a 20 20 oc*2 + nByte;.
43e0: 20 20 20 20 70 53 74 72 2d 3e 7a 54 65 78 74 20 pStr->zText
43f0: 3d 20 53 61 66 65 52 65 61 6c 6c 6f 63 28 70 53 = SafeRealloc(pS
4400: 74 72 2d 3e 7a 54 65 78 74 2c 20 70 53 74 72 2d tr->zText, pStr-
4410: 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 0a >nAlloc);. }.
4420: 20 20 7d 0a 20 20 73 74 72 6e 63 70 79 28 26 70 }. strncpy(&p
4430: 53 74 72 2d 3e 7a 54 65 78 74 5b 70 53 74 72 2d Str->zText[pStr-
4440: 3e 6e 55 73 65 64 5d 2c 7a 54 65 78 74 2c 6e 42 >nUsed],zText,nB
4450: 79 74 65 29 3b 0a 20 20 70 53 74 72 2d 3e 6e 55 yte);. pStr->nU
4460: 73 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 sed += nByte;.
4470: 70 53 74 72 2d 3e 7a 54 65 78 74 5b 70 53 74 72 pStr->zText[pStr
4480: 2d 3e 6e 55 73 65 64 5d 20 3d 20 30 3b 0a 7d 0a ->nUsed] = 0;.}.
4490: 23 64 65 66 69 6e 65 20 53 74 72 69 6e 67 47 65 #define StringGe
44a0: 74 28 53 29 20 28 28 53 29 2d 3e 7a 54 65 78 74 t(S) ((S)->zText
44b0: 3f 28 53 29 2d 3e 7a 54 65 78 74 3a 22 22 29 0a ?(S)->zText:"").
44c0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 ./*.** Compute a
44d0: 20 68 61 73 68 20 6f 6e 20 61 20 73 74 72 69 6e hash on a strin
44e0: 67 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 g. The number r
44f0: 65 74 75 72 6e 65 64 20 69 73 20 61 20 6e 6f 6e eturned is a non
4500: 2d 6e 65 67 61 74 69 76 65 0a 2a 2a 20 76 61 6c -negative.** val
4510: 75 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 ue between 0 and
4520: 20 32 2a 2a 33 31 20 2d 20 31 0a 2a 2f 0a 73 74 2**31 - 1.*/.st
4530: 61 74 69 63 20 69 6e 74 20 48 61 73 68 28 63 6f atic int Hash(co
4540: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 nst char *z, int
4550: 20 6e 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30 n){. int h = 0
4560: 3b 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b 0a ;. if( n<=0 ){.
4570: 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a n = strlen(z
4580: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 );. }. while(
4590: 6e 2d 2d 20 29 7b 0a 20 20 20 20 68 20 3d 20 68 n-- ){. h = h
45a0: 20 5e 20 28 68 3c 3c 35 29 20 5e 20 2a 7a 2b 2b ^ (h<<5) ^ *z++
45b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 ;. }. return h
45c0: 20 26 20 30 78 37 66 66 66 66 66 66 66 3b 0a 7d & 0x7fffffff;.}
45d0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e ../*.** Given an
45e0: 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 identifier name
45f0: 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 20 , try to find a
4600: 64 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20 declaration for
4610: 74 68 61 74 0a 2a 2a 20 69 64 65 6e 74 69 66 69 that.** identifi
4620: 65 72 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 er in the hash t
4630: 61 62 6c 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c able. If found,
4640: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 return a pointe
4650: 72 20 74 6f 0a 2a 2a 20 74 68 65 20 44 65 63 6c r to.** the Decl
4660: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 structure. If
4670: 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 not found, retur
4680: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 44 n 0..*/.static D
4690: 65 63 6c 20 2a 46 69 6e 64 44 65 63 6c 28 63 6f ecl *FindDecl(co
46a0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c nst char *zName,
46b0: 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 69 6e 74 int len){. int
46c0: 20 68 3b 0a 20 20 44 65 63 6c 20 2a 70 3b 0a 0a h;. Decl *p;..
46d0: 20 20 69 66 28 20 6c 65 6e 3c 3d 30 20 29 7b 0a if( len<=0 ){.
46e0: 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e len = strlen
46f0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 68 (zName);. }. h
4700: 20 3d 20 48 61 73 68 28 7a 4e 61 6d 65 2c 6c 65 = Hash(zName,le
4710: 6e 29 20 25 20 44 45 43 4c 5f 48 41 53 48 5f 53 n) % DECL_HASH_S
4720: 49 5a 45 3b 0a 20 20 70 20 3d 20 61 70 54 61 62 IZE;. p = apTab
4730: 6c 65 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 le[h];. while(
4740: 70 20 26 26 20 28 73 74 72 6e 63 6d 70 28 70 2d p && (strncmp(p-
4750: 3e 7a 4e 61 6d 65 2c 7a 4e 61 6d 65 2c 6c 65 6e >zName,zName,len
4760: 29 21 3d 30 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 )!=0 || p->zName
4770: 5b 6c 65 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20 [len]!=0) ){.
4780: 20 70 20 3d 20 70 2d 3e 70 53 61 6d 65 48 61 73 p = p->pSameHas
4790: 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 h;. }. return
47a0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 74 p;.}../*.** Inst
47b0: 61 6c 6c 20 74 68 65 20 67 69 76 65 6e 20 64 65 all the given de
47c0: 63 6c 61 72 61 74 69 6f 6e 20 62 6f 74 68 20 69 claration both i
47d0: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 n the hash table
47e0: 20 61 6e 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c and on.** the l
47f0: 69 73 74 20 6f 66 20 61 6c 6c 20 64 65 63 6c 61 ist of all decla
4800: 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 rations..*/.stat
4810: 69 63 20 76 6f 69 64 20 49 6e 73 74 61 6c 6c 44 ic void InstallD
4820: 65 63 6c 28 44 65 63 6c 20 2a 70 44 65 63 6c 29 ecl(Decl *pDecl)
4830: 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 44 65 63 {. int h;. Dec
4840: 6c 20 2a 70 4f 74 68 65 72 3b 0a 0a 20 20 68 20 l *pOther;.. h
4850: 3d 20 48 61 73 68 28 70 44 65 63 6c 2d 3e 7a 4e = Hash(pDecl->zN
4860: 61 6d 65 2c 30 29 20 25 20 44 45 43 4c 5f 48 41 ame,0) % DECL_HA
4870: 53 48 5f 53 49 5a 45 3b 0a 20 20 70 4f 74 68 65 SH_SIZE;. pOthe
4880: 72 20 3d 20 61 70 54 61 62 6c 65 5b 68 5d 3b 0a r = apTable[h];.
4890: 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 20 while( pOther
48a0: 26 26 20 73 74 72 63 6d 70 28 70 44 65 63 6c 2d && strcmp(pDecl-
48b0: 3e 7a 4e 61 6d 65 2c 70 4f 74 68 65 72 2d 3e 7a >zName,pOther->z
48c0: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 Name)!=0 ){.
48d0: 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d pOther = pOther-
48e0: 3e 70 53 61 6d 65 48 61 73 68 3b 0a 20 20 7d 0a >pSameHash;. }.
48f0: 20 20 69 66 28 20 70 4f 74 68 65 72 20 29 7b 0a if( pOther ){.
4900: 20 20 20 20 70 44 65 63 6c 2d 3e 70 53 61 6d 65 pDecl->pSame
4910: 4e 61 6d 65 20 3d 20 70 4f 74 68 65 72 2d 3e 70 Name = pOther->p
4920: 53 61 6d 65 4e 61 6d 65 3b 0a 20 20 20 20 70 4f SameName;. pO
4930: 74 68 65 72 2d 3e 70 53 61 6d 65 4e 61 6d 65 20 ther->pSameName
4940: 3d 20 70 44 65 63 6c 3b 0a 20 20 7d 65 6c 73 65 = pDecl;. }else
4950: 7b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 70 53 61 {. pDecl->pSa
4960: 6d 65 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 meName = 0;.
4970: 70 44 65 63 6c 2d 3e 70 53 61 6d 65 48 61 73 68 pDecl->pSameHash
4980: 20 3d 20 61 70 54 61 62 6c 65 5b 68 5d 3b 0a 20 = apTable[h];.
4990: 20 20 20 61 70 54 61 62 6c 65 5b 68 5d 20 3d 20 apTable[h] =
49a0: 70 44 65 63 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 pDecl;. }. pDe
49b0: 63 6c 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 cl->pNext = 0;.
49c0: 20 69 66 28 20 70 44 65 63 6c 46 69 72 73 74 3d if( pDeclFirst=
49d0: 3d 30 20 29 7b 0a 20 20 20 20 70 44 65 63 6c 46 =0 ){. pDeclF
49e0: 69 72 73 74 20 3d 20 70 44 65 63 6c 4c 61 73 74 irst = pDeclLast
49f0: 20 3d 20 70 44 65 63 6c 3b 0a 20 20 7d 65 6c 73 = pDecl;. }els
4a00: 65 7b 0a 20 20 20 20 70 44 65 63 6c 4c 61 73 74 e{. pDeclLast
4a10: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 65 63 6c 3b ->pNext = pDecl;
4a20: 0a 20 20 20 20 70 44 65 63 6c 4c 61 73 74 20 3d . pDeclLast =
4a30: 20 70 44 65 63 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f pDecl;. }.}../
4a40: 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 *.** Look at the
4a50: 20 63 75 72 72 65 6e 74 20 69 66 53 74 61 63 6b current ifStack
4a60: 2e 20 20 49 66 20 61 6e 79 74 68 69 6e 67 20 64 . If anything d
4a70: 65 63 6c 61 72 65 64 20 61 74 20 74 68 65 20 63 eclared at the c
4a80: 75 72 72 65 6e 74 0a 2a 2a 20 70 6f 73 69 74 69 urrent.** positi
4a90: 6f 6e 20 6d 75 73 74 20 62 65 20 73 75 72 72 6f on must be surro
4aa0: 75 6e 64 65 64 20 77 69 74 68 0a 2a 2a 0a 2a 2a unded with.**.**
4ab0: 20 20 20 20 20 20 23 69 66 20 20 20 53 54 55 46 #if STUF
4ac0: 46 0a 2a 2a 20 20 20 20 20 20 23 65 6e 64 69 66 F.** #endif
4ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 69 73 .**.** Then this
4ae0: 20 72 6f 75 74 69 6e 65 20 63 6f 6d 70 75 74 65 routine compute
4af0: 73 20 53 54 55 46 46 20 61 6e 64 20 72 65 74 75 s STUFF and retu
4b00: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f rns a pointer to
4b10: 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 it. Memory.**
4b20: 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 to hold the valu
4b30: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 6f 62 e returned is ob
4b40: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c tained from mall
4b50: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 oc()..*/.static
4b60: 63 68 61 72 20 2a 47 65 74 49 66 53 74 72 69 6e char *GetIfStrin
4b70: 67 28 76 6f 69 64 29 7b 0a 20 20 49 66 6d 61 63 g(void){. Ifmac
4b80: 72 6f 20 2a 70 49 66 3b 0a 20 20 63 68 61 72 20 ro *pIf;. char
4b90: 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 *zResult = 0;.
4ba0: 69 6e 74 20 68 61 73 49 66 20 3d 20 30 3b 0a 20 int hasIf = 0;.
4bb0: 20 53 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 String str;..
4bc0: 66 6f 72 28 70 49 66 20 3d 20 69 66 53 74 61 63 for(pIf = ifStac
4bd0: 6b 3b 20 70 49 66 3b 20 70 49 66 3d 70 49 66 2d k; pIf; pIf=pIf-
4be0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 >pNext){. if(
4bf0: 20 70 49 66 2d 3e 7a 43 6f 6e 64 69 74 69 6f 6e pIf->zCondition
4c00: 3d 3d 30 20 7c 7c 20 2a 70 49 66 2d 3e 7a 43 6f ==0 || *pIf->zCo
4c10: 6e 64 69 74 69 6f 6e 3d 3d 30 20 29 20 63 6f 6e ndition==0 ) con
4c20: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 tinue;. if( !
4c30: 68 61 73 49 66 20 29 7b 0a 20 20 20 20 20 20 68 hasIf ){. h
4c40: 61 73 49 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 asIf = 1;.
4c50: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 StringInit(&str)
4c60: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
4c70: 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 StringAppend(
4c80: 26 73 74 72 2c 22 20 26 26 20 22 2c 34 29 3b 0a &str," && ",4);.
4c90: 20 20 20 20 7d 0a 20 20 20 20 53 74 72 69 6e 67 }. String
4ca0: 41 70 70 65 6e 64 28 26 73 74 72 2c 70 49 66 2d Append(&str,pIf-
4cb0: 3e 7a 43 6f 6e 64 69 74 69 6f 6e 2c 30 29 3b 0a >zCondition,0);.
4cc0: 20 20 7d 0a 20 20 69 66 28 20 68 61 73 49 66 20 }. if( hasIf
4cd0: 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d ){. zResult =
4ce0: 20 53 74 72 44 75 70 28 53 74 72 69 6e 67 47 65 StrDup(StringGe
4cf0: 74 28 26 73 74 72 29 2c 30 29 3b 0a 20 20 20 20 t(&str),0);.
4d00: 53 74 72 69 6e 67 52 65 73 65 74 28 26 73 74 72 StringReset(&str
4d10: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
4d20: 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 7d zResult = 0;. }
4d30: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73 75 6c . return zResul
4d40: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 t;.}../*.** Crea
4d50: 74 65 20 61 20 6e 65 77 20 64 65 63 6c 61 72 61 te a new declara
4d60: 74 69 6f 6e 20 61 6e 64 20 70 75 74 20 69 74 20 tion and put it
4d70: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c in the hash tabl
4d80: 65 2e 20 20 41 6c 73 6f 0a 2a 2a 20 72 65 74 75 e. Also.** retu
4d90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 rn a pointer to
4da0: 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 it so that we ca
4db0: 6e 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 7a 46 n fill in the zF
4dc0: 77 64 20 61 6e 64 20 7a 44 65 63 6c 0a 2a 2a 20 wd and zDecl.**
4dd0: 66 69 65 6c 64 73 2c 20 61 6e 64 20 73 6f 20 66 fields, and so f
4de0: 6f 72 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 orth..*/.static
4df0: 44 65 63 6c 20 2a 43 72 65 61 74 65 44 65 63 6c Decl *CreateDecl
4e00: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a (. const char *
4e10: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 zName, /*
4e20: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a 65 Name of the obje
4e30: 63 74 20 62 65 69 6e 67 20 64 65 63 6c 61 72 65 ct being declare
4e40: 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d d. */. int nNam
4e50: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e
4e60: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 /* Length of th
4e70: 65 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 44 e name */.){. D
4e80: 65 63 6c 20 2a 70 44 65 63 6c 3b 0a 0a 20 20 70 ecl *pDecl;.. p
4e90: 44 65 63 6c 20 3d 20 53 61 66 65 4d 61 6c 6c 6f Decl = SafeMallo
4ea0: 63 28 20 73 69 7a 65 6f 66 28 44 65 63 6c 29 20 c( sizeof(Decl)
4eb0: 2b 20 6e 4e 61 6d 65 20 2b 20 31 29 3b 0a 20 20 + nName + 1);.
4ec0: 6d 65 6d 73 65 74 28 70 44 65 63 6c 2c 30 2c 73 memset(pDecl,0,s
4ed0: 69 7a 65 6f 66 28 44 65 63 6c 29 29 3b 0a 20 20 izeof(Decl));.
4ee0: 70 44 65 63 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 28 pDecl->zName = (
4ef0: 63 68 61 72 2a 29 26 70 44 65 63 6c 5b 31 5d 3b char*)&pDecl[1];
4f00: 0a 20 20 73 70 72 69 6e 74 66 28 70 44 65 63 6c . sprintf(pDecl
4f10: 2d 3e 7a 4e 61 6d 65 2c 22 25 2e 2a 73 22 2c 6e ->zName,"%.*s",n
4f20: 4e 61 6d 65 2c 7a 4e 61 6d 65 29 3b 0a 20 20 70 Name,zName);. p
4f30: 44 65 63 6c 2d 3e 7a 46 69 6c 65 20 3d 20 7a 46 Decl->zFile = zF
4f40: 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 44 65 63 6c ilename;. pDecl
4f50: 2d 3e 70 49 6e 63 6c 75 64 65 20 3d 20 69 6e 63 ->pInclude = inc
4f60: 6c 75 64 65 4c 69 73 74 3b 0a 20 20 70 44 65 63 ludeList;. pDec
4f70: 6c 2d 3e 7a 49 66 20 3d 20 47 65 74 49 66 53 74 l->zIf = GetIfSt
4f80: 72 69 6e 67 28 29 3b 0a 20 20 49 6e 73 74 61 6c ring();. Instal
4f90: 6c 44 65 63 6c 28 70 44 65 63 6c 29 3b 0a 20 20 lDecl(pDecl);.
4fa0: 72 65 74 75 72 6e 20 70 44 65 63 6c 3b 0a 7d 0a return pDecl;.}.
4fb0: 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 ./*.** Insert a
4fc0: 6e 65 77 20 69 64 65 6e 74 69 66 69 65 72 20 69 new identifier i
4fd0: 6e 74 6f 20 61 6e 20 74 61 62 6c 65 20 6f 66 20 nto an table of
4fe0: 69 64 65 6e 74 69 66 69 65 72 73 2e 20 20 52 65 identifiers. Re
4ff0: 74 75 72 6e 20 54 52 55 45 20 69 66 0a 2a 2a 20 turn TRUE if.**
5000: 61 20 6e 65 77 20 69 64 65 6e 74 69 66 69 65 72 a new identifier
5010: 20 77 61 73 20 69 6e 73 65 72 74 65 64 20 61 6e was inserted an
5020: 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 d return FALSE i
5030: 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 f the identifier
5040: 20 77 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 was.** already
5050: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f in the table..*/
5060: 0a 73 74 61 74 69 63 20 69 6e 74 20 49 64 65 6e .static int Iden
5070: 74 54 61 62 6c 65 49 6e 73 65 72 74 28 0a 20 20 tTableInsert(.
5080: 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 54 61 62 IdentTable *pTab
5090: 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 le, /* The
50a0: 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 table into whic
50b0: 68 20 77 65 20 77 69 6c 6c 20 69 6e 73 65 72 74 h we will insert
50c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
50d0: 20 2a 7a 49 64 2c 20 20 20 20 20 20 20 20 20 20 *zId,
50e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 /* Name of the i
50f0: 64 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a 20 20 dentifiers */.
5100: 69 6e 74 20 6e 49 64 20 20 20 20 20 20 20 20 20 int nId
5110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e /* Len
5120: 67 74 68 20 6f 66 20 74 68 65 20 69 64 65 6e 74 gth of the ident
5130: 69 66 69 65 72 20 6e 61 6d 65 20 2a 2f 0a 29 7b ifier name */.){
5140: 0a 20 20 69 6e 74 20 68 3b 0a 20 20 49 64 65 6e . int h;. Iden
5150: 74 20 2a 70 49 64 3b 0a 0a 20 20 69 66 28 20 6e t *pId;.. if( n
5160: 49 64 3c 3d 30 20 29 7b 0a 20 20 20 20 6e 49 64 Id<=0 ){. nId
5170: 20 3d 20 73 74 72 6c 65 6e 28 7a 49 64 29 3b 0a = strlen(zId);.
5180: 20 20 7d 0a 20 20 68 20 3d 20 48 61 73 68 28 7a }. h = Hash(z
5190: 49 64 2c 6e 49 64 29 20 25 20 49 44 45 4e 54 5f Id,nId) % IDENT_
51a0: 48 41 53 48 5f 53 49 5a 45 3b 0a 20 20 66 6f 72 HASH_SIZE;. for
51b0: 28 70 49 64 20 3d 20 70 54 61 62 6c 65 2d 3e 61 (pId = pTable->a
51c0: 70 54 61 62 6c 65 5b 68 5d 3b 20 70 49 64 3b 20 pTable[h]; pId;
51d0: 70 49 64 3d 70 49 64 2d 3e 70 43 6f 6c 6c 69 64 pId=pId->pCollid
51e0: 65 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e e){. if( strn
51f0: 63 6d 70 28 7a 49 64 2c 70 49 64 2d 3e 7a 4e 61 cmp(zId,pId->zNa
5200: 6d 65 2c 6e 49 64 29 3d 3d 30 20 26 26 20 70 49 me,nId)==0 && pI
5210: 64 2d 3e 7a 4e 61 6d 65 5b 6e 49 64 5d 3d 3d 30 d->zName[nId]==0
5220: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 ){. /* pri
5230: 6e 74 66 28 22 41 6c 72 65 61 64 79 20 69 6e 20 ntf("Already in
5240: 74 61 62 6c 65 3a 20 25 2e 2a 73 5c 6e 22 2c 6e table: %.*s\n",n
5250: 49 64 2c 7a 49 64 29 3b 20 2a 2f 0a 20 20 20 20 Id,zId); */.
5260: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 return 0;.
5270: 7d 0a 20 20 7d 0a 20 20 70 49 64 20 3d 20 53 61 }. }. pId = Sa
5280: 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 feMalloc( sizeof
5290: 28 49 64 65 6e 74 29 20 2b 20 6e 49 64 20 2b 20 (Ident) + nId +
52a0: 31 20 29 3b 0a 20 20 70 49 64 2d 3e 7a 4e 61 6d 1 );. pId->zNam
52b0: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 64 5b e = (char*)&pId[
52c0: 31 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 70 49 1];. sprintf(pI
52d0: 64 2d 3e 7a 4e 61 6d 65 2c 22 25 2e 2a 73 22 2c d->zName,"%.*s",
52e0: 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 70 49 64 2d nId,zId);. pId-
52f0: 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 6c 65 2d >pNext = pTable-
5300: 3e 70 4c 69 73 74 3b 0a 20 20 70 54 61 62 6c 65 >pList;. pTable
5310: 2d 3e 70 4c 69 73 74 20 3d 20 70 49 64 3b 0a 20 ->pList = pId;.
5320: 20 70 49 64 2d 3e 70 43 6f 6c 6c 69 64 65 20 3d pId->pCollide =
5330: 20 70 54 61 62 6c 65 2d 3e 61 70 54 61 62 6c 65 pTable->apTable
5340: 5b 68 5d 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 [h];. pTable->a
5350: 70 54 61 62 6c 65 5b 68 5d 20 3d 20 70 49 64 3b pTable[h] = pId;
5360: 0a 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 41 64 . /* printf("Ad
5370: 64 20 74 6f 20 74 61 62 6c 65 3a 20 25 2e 2a 73 d to table: %.*s
5380: 5c 6e 22 2c 6e 49 64 2c 7a 49 64 29 3b 20 2a 2f \n",nId,zId); */
5390: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a . return 1;.}..
53a0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 /*.** Check to s
53b0: 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 ee if the given
53c0: 76 61 6c 75 65 20 69 73 20 69 6e 20 74 68 65 20 value is in the
53d0: 67 69 76 65 6e 20 49 64 65 6e 74 54 61 62 6c 65 given IdentTable
53e0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 . Return.** tru
53f0: 65 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 66 e if it is and f
5400: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 6e 6f alse if it is no
5410: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 t..*/.static int
5420: 20 49 64 65 6e 74 54 61 62 6c 65 54 65 73 74 28 IdentTableTest(
5430: 0a 20 20 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 . IdentTable *p
5440: 54 61 62 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 Table, /*
5450: 54 68 65 20 74 61 62 6c 65 20 69 6e 20 77 68 69 The table in whi
5460: 63 68 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a ch to search */.
5470: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 const char *zI
5480: 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e d, /* N
5490: 61 6d 65 20 6f 66 20 74 68 65 20 69 64 65 6e 74 ame of the ident
54a0: 69 66 69 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 ifiers */. int
54b0: 6e 49 64 20 20 20 20 20 20 20 20 20 20 20 20 20 nId
54c0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 /* Length
54d0: 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 of the identifie
54e0: 72 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 r name */.){. i
54f0: 6e 74 20 68 3b 0a 20 20 49 64 65 6e 74 20 2a 70 nt h;. Ident *p
5500: 49 64 3b 0a 0a 20 20 69 66 28 20 6e 49 64 3c 3d Id;.. if( nId<=
5510: 30 20 29 7b 0a 20 20 20 20 6e 49 64 20 3d 20 73 0 ){. nId = s
5520: 74 72 6c 65 6e 28 7a 49 64 29 3b 0a 20 20 7d 0a trlen(zId);. }.
5530: 20 20 68 20 3d 20 48 61 73 68 28 7a 49 64 2c 6e h = Hash(zId,n
5540: 49 64 29 20 25 20 49 44 45 4e 54 5f 48 41 53 48 Id) % IDENT_HASH
5550: 5f 53 49 5a 45 3b 0a 20 20 66 6f 72 28 70 49 64 _SIZE;. for(pId
5560: 20 3d 20 70 54 61 62 6c 65 2d 3e 61 70 54 61 62 = pTable->apTab
5570: 6c 65 5b 68 5d 3b 20 70 49 64 3b 20 70 49 64 3d le[h]; pId; pId=
5580: 70 49 64 2d 3e 70 43 6f 6c 6c 69 64 65 29 7b 0a pId->pCollide){.
5590: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 if( strncmp(
55a0: 7a 49 64 2c 70 49 64 2d 3e 7a 4e 61 6d 65 2c 6e zId,pId->zName,n
55b0: 49 64 29 3d 3d 30 20 26 26 20 70 49 64 2d 3e 7a Id)==0 && pId->z
55c0: 4e 61 6d 65 5b 6e 49 64 5d 3d 3d 30 20 29 7b 0a Name[nId]==0 ){.
55d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a return 1;.
55e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 }. }. retu
55f0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 rn 0;.}../*.** R
5600: 65 6d 6f 76 65 20 65 76 65 72 79 20 69 64 65 6e emove every iden
5610: 74 69 66 69 65 72 20 66 72 6f 6d 20 74 68 65 20 tifier from the
5620: 67 69 76 65 6e 20 74 61 62 6c 65 2e 20 20 20 52 given table. R
5630: 65 73 65 74 20 74 68 65 20 74 61 62 6c 65 20 74 eset the table t
5640: 6f 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69 61 6c o.** its initial
5650: 20 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 state..*/.stati
5660: 63 20 76 6f 69 64 20 49 64 65 6e 74 54 61 62 6c c void IdentTabl
5670: 65 52 65 73 65 74 28 49 64 65 6e 74 54 61 62 6c eReset(IdentTabl
5680: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 64 e *pTable){. Id
5690: 65 6e 74 20 2a 70 49 64 2c 20 2a 70 4e 65 78 74 ent *pId, *pNext
56a0: 3b 0a 0a 20 20 66 6f 72 28 70 49 64 20 3d 20 70 ;.. for(pId = p
56b0: 54 61 62 6c 65 2d 3e 70 4c 69 73 74 3b 20 70 49 Table->pList; pI
56c0: 64 3b 20 70 49 64 20 3d 20 70 4e 65 78 74 29 7b d; pId = pNext){
56d0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 64 . pNext = pId
56e0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 53 61 66 ->pNext;. Saf
56f0: 65 46 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a eFree(pId);. }.
5700: 20 20 6d 65 6d 73 65 74 28 70 54 61 62 6c 65 2c memset(pTable,
5710: 30 2c 73 69 7a 65 6f 66 28 49 64 65 6e 74 54 61 0,sizeof(IdentTa
5720: 62 6c 65 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 ble));.}..#ifdef
5730: 20 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 DEBUG./*.** Pri
5740: 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 nt the name of e
5750: 76 65 72 79 20 69 64 65 6e 74 69 66 69 65 72 20 very identifier
5760: 69 6e 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 in the given tab
5770: 6c 65 2c 20 6f 6e 65 20 70 65 72 20 6c 69 6e 65 le, one per line
5780: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
5790: 49 64 65 6e 74 54 61 62 6c 65 50 72 69 6e 74 28 IdentTablePrint(
57a0: 49 64 65 6e 74 54 61 62 6c 65 20 2a 70 54 61 62 IdentTable *pTab
57b0: 6c 65 2c 20 46 49 4c 45 20 2a 70 4f 75 74 29 7b le, FILE *pOut){
57c0: 0a 20 20 49 64 65 6e 74 20 2a 70 49 64 3b 0a 0a . Ident *pId;..
57d0: 20 20 66 6f 72 28 70 49 64 20 3d 20 70 54 61 62 for(pId = pTab
57e0: 6c 65 2d 3e 70 4c 69 73 74 3b 20 70 49 64 3b 20 le->pList; pId;
57f0: 70 49 64 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 pId = pId->pNext
5800: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 ){. fprintf(p
5810: 4f 75 74 2c 22 25 73 5c 6e 22 2c 70 49 64 2d 3e Out,"%s\n",pId->
5820: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 zName);. }.}.#e
5830: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 ndif../*.** Read
5840: 20 61 6e 20 65 6e 74 69 72 65 20 66 69 6c 65 20 an entire file
5850: 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 20 52 65 into memory. Re
5860: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 turn a pointer t
5870: 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a o the memory..**
5880: 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 .** The memory i
5890: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 s obtained from
58a0: 53 61 66 65 4d 61 6c 6c 6f 63 20 61 6e 64 20 6d SafeMalloc and m
58b0: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 ust be freed by
58c0: 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 the.** calling f
58d0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 unction..**.** I
58e0: 66 20 74 68 65 20 72 65 61 64 20 66 61 69 6c 73 f the read fails
58f0: 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c for any reason,
5900: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 0 is returned..
5910: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a */.static char *
5920: 52 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20 63 ReadFile(const c
5930: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b har *zFilename){
5940: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 . struct stat s
5950: 53 74 61 74 3b 0a 20 20 46 49 4c 45 20 2a 70 49 Stat;. FILE *pI
5960: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b n;. char *zBuf;
5970: 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 . int n;.. if(
5980: 20 73 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65 2c stat(zFilename,
5990: 26 73 53 74 61 74 29 21 3d 30 0a 23 69 66 6e 64 &sStat)!=0.#ifnd
59a0: 65 66 20 57 49 4e 33 32 0a 20 20 20 20 7c 7c 20 ef WIN32. ||
59b0: 21 53 5f 49 53 52 45 47 28 73 53 74 61 74 2e 73 !S_ISREG(sStat.s
59c0: 74 5f 6d 6f 64 65 29 0a 23 65 6e 64 69 66 0a 20 t_mode).#endif.
59d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){. return 0
59e0: 3b 0a 20 20 7d 0a 20 20 70 49 6e 20 3d 20 66 6f ;. }. pIn = fo
59f0: 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 72 pen(zFilename,"r
5a00: 22 29 3b 0a 20 20 69 66 28 20 70 49 6e 3d 3d 30 ");. if( pIn==0
5a10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){. return 0
5a20: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 20 3d 20 53 ;. }. zBuf = S
5a30: 61 66 65 4d 61 6c 6c 6f 63 28 20 73 53 74 61 74 afeMalloc( sStat
5a40: 2e 73 74 5f 73 69 7a 65 20 2b 20 31 20 29 3b 0a .st_size + 1 );.
5a50: 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 n = fread(zBuf
5a60: 2c 31 2c 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 ,1,sStat.st_size
5a70: 2c 70 49 6e 29 3b 0a 20 20 7a 42 75 66 5b 6e 5d ,pIn);. zBuf[n]
5a80: 20 3d 20 30 3b 0a 20 20 66 63 6c 6f 73 65 28 70 = 0;. fclose(p
5a90: 49 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 In);. return zB
5aa0: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 uf;.}../*.** Wri
5ab0: 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 te the contents
5ac0: 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e 74 6f of a string into
5ad0: 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e a file. Return
5ae0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a the number of.*
5af0: 2a 20 65 72 72 6f 72 73 0a 2a 2f 0a 73 74 61 74 * errors.*/.stat
5b00: 69 63 20 69 6e 74 20 57 72 69 74 65 46 69 6c 65 ic int WriteFile
5b10: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 (const char *zFi
5b20: 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 lename, const ch
5b30: 61 72 20 2a 7a 4f 75 74 70 75 74 29 7b 0a 20 20 ar *zOutput){.
5b40: 46 49 4c 45 20 2a 70 4f 75 74 3b 0a 20 20 70 4f FILE *pOut;. pO
5b50: 75 74 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 ut = fopen(zFile
5b60: 6e 61 6d 65 2c 22 77 22 29 3b 0a 20 20 69 66 28 name,"w");. if(
5b70: 20 70 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 pOut==0 ){.
5b80: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 return 1;. }.
5b90: 66 77 72 69 74 65 28 7a 4f 75 74 70 75 74 2c 31 fwrite(zOutput,1
5ba0: 2c 73 74 72 6c 65 6e 28 7a 4f 75 74 70 75 74 29 ,strlen(zOutput)
5bb0: 2c 70 4f 75 74 29 3b 0a 20 20 66 63 6c 6f 73 65 ,pOut);. fclose
5bc0: 28 70 4f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e (pOut);. return
5bd0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6a 0;.}../*.** Maj
5be0: 6f 72 20 74 6f 6b 65 6e 20 74 79 70 65 73 0a 2a or token types.*
5bf0: 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 53 70 61 /.#define TT_Spa
5c00: 63 65 20 20 20 20 20 20 20 20 20 20 20 31 20 20 ce 1
5c10: 20 2f 2a 20 43 6f 6e 74 69 67 75 6f 75 73 20 77 /* Contiguous w
5c20: 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 23 64 hite space */.#d
5c30: 65 66 69 6e 65 20 54 54 5f 49 64 20 20 20 20 20 efine TT_Id
5c40: 20 20 20 20 20 20 20 20 20 32 20 20 20 2f 2a 20 2 /*
5c50: 41 6e 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f An identifier */
5c60: 0a 23 64 65 66 69 6e 65 20 54 54 5f 50 72 65 70 .#define TT_Prep
5c70: 72 6f 63 65 73 73 6f 72 20 20 20 20 33 20 20 20 rocessor 3
5c80: 2f 2a 20 41 6e 79 20 43 20 70 72 65 70 72 6f 63 /* Any C preproc
5c90: 65 73 73 6f 72 20 64 69 72 65 63 74 69 76 65 20 essor directive
5ca0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 43 6f */.#define TT_Co
5cb0: 6d 6d 65 6e 74 20 20 20 20 20 20 20 20 20 34 20 mment 4
5cc0: 20 20 2f 2a 20 45 69 74 68 65 72 20 43 20 6f 72 /* Either C or
5cd0: 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 C++ style comme
5ce0: 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 54 nt */.#define TT
5cf0: 5f 4e 75 6d 62 65 72 20 20 20 20 20 20 20 20 20 _Number
5d00: 20 35 20 20 20 2f 2a 20 41 6e 79 20 6e 75 6d 65 5 /* Any nume
5d10: 72 69 63 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a ric constant */.
5d20: 23 64 65 66 69 6e 65 20 54 54 5f 53 74 72 69 6e #define TT_Strin
5d30: 67 20 20 20 20 20 20 20 20 20 20 36 20 20 20 2f g 6 /
5d40: 2a 20 53 74 72 69 6e 67 20 6f 72 20 63 68 61 72 * String or char
5d50: 61 63 74 65 72 20 63 6f 6e 73 74 61 6e 74 73 2e acter constants.
5d60: 20 22 2e 2e 22 20 6f 72 20 27 2e 27 20 2a 2f 0a ".." or '.' */.
5d70: 23 64 65 66 69 6e 65 20 54 54 5f 42 72 61 63 65 #define TT_Brace
5d80: 73 20 20 20 20 20 20 20 20 20 20 37 20 20 20 2f s 7 /
5d90: 2a 20 41 6c 6c 20 74 65 78 74 20 62 65 74 77 65 * All text betwe
5da0: 65 6e 20 7b 20 61 6e 64 20 61 20 6d 61 74 63 68 en { and a match
5db0: 69 6e 67 20 7d 20 2a 2f 0a 23 64 65 66 69 6e 65 ing } */.#define
5dc0: 20 54 54 5f 45 4f 46 20 20 20 20 20 20 20 20 20 TT_EOF
5dd0: 20 20 20 20 38 20 20 20 2f 2a 20 45 6e 64 20 6f 8 /* End o
5de0: 66 20 66 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e f file */.#defin
5df0: 65 20 54 54 5f 45 72 72 6f 72 20 20 20 20 20 20 e TT_Error
5e00: 20 20 20 20 20 39 20 20 20 2f 2a 20 41 6e 20 65 9 /* An e
5e10: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a rror condition *
5e20: 2f 0a 23 64 65 66 69 6e 65 20 54 54 5f 42 6c 6f /.#define TT_Blo
5e30: 63 6b 43 6f 6d 6d 65 6e 74 20 20 20 20 31 30 20 ckComment 10
5e40: 20 2f 2a 20 41 20 43 2d 53 74 79 6c 65 20 63 6f /* A C-Style co
5e50: 6d 6d 65 6e 74 20 61 74 20 74 68 65 20 6c 65 66 mment at the lef
5e60: 74 20 6d 61 72 67 69 6e 20 74 68 61 74 0a 20 20 t margin that.
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 *
5e90: 73 70 61 6e 73 20 6d 75 6c 74 69 70 6c 65 20 6c spans multiple l
5ea0: 69 6e 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 ines */.#define
5eb0: 54 54 5f 4f 74 68 65 72 20 20 20 20 20 20 20 20 TT_Other
5ec0: 20 20 20 30 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 0 /* None o
5ed0: 66 20 74 68 65 20 61 62 6f 76 65 20 2a 2f 0a 0a f the above */..
5ee0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 73 69 6e 67 /*.** Get a sing
5ef0: 6c 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 74 6f 6b le low-level tok
5f00: 65 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 en from the inpu
5f10: 74 20 66 69 6c 65 2e 20 20 55 70 64 61 74 65 20 t file. Update
5f20: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 70 6f 69 6e the.** file poin
5f30: 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 ter so that it p
5f40: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 oints to the fir
5f50: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 79 st character bey
5f60: 6f 6e 64 20 74 68 65 0a 2a 2a 20 74 6f 6b 65 6e ond the.** token
5f70: 2e 0a 2a 2a 0a 2a 2a 20 41 20 22 6c 6f 77 2d 6c ..**.** A "low-l
5f80: 65 76 65 6c 20 74 6f 6b 65 6e 22 20 69 73 20 61 evel token" is a
5f90: 6e 79 20 74 6f 6b 65 6e 20 65 78 63 65 70 74 20 ny token except
5fa0: 54 54 5f 42 72 61 63 65 73 2e 20 20 41 20 54 54 TT_Braces. A TT
5fb0: 5f 42 72 61 63 65 73 20 74 6f 6b 65 6e 0a 2a 2a _Braces token.**
5fc0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 6d 61 6e consists of man
5fd0: 79 20 73 6d 61 6c 6c 65 72 20 74 6f 6b 65 6e 73 y smaller tokens
5fe0: 20 61 6e 64 20 69 73 20 61 73 73 65 6d 62 6c 65 and is assemble
5ff0: 64 20 62 79 20 61 20 72 6f 75 74 69 6e 65 20 74 d by a routine t
6000: 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 hat.** calls thi
6010: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 s one..**.** The
6020: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e function return
6030: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 s the number of
6040: 65 72 72 6f 72 73 2e 20 20 41 6e 20 65 72 72 6f errors. An erro
6050: 72 20 69 73 20 61 6e 0a 2a 2a 20 75 6e 74 65 72 r is an.** unter
6060: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 6f minated string o
6070: 72 20 63 68 61 72 61 63 74 65 72 20 6c 69 74 65 r character lite
6080: 72 61 6c 20 6f 72 20 61 6e 20 75 6e 74 65 72 6d ral or an unterm
6090: 69 6e 61 74 65 64 0a 2a 2a 20 63 6f 6d 6d 65 6e inated.** commen
60a0: 74 2e 0a 2a 2a 0a 2a 2a 20 50 72 6f 66 69 6c 69 t..**.** Profili
60b0: 6e 67 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 ng shows that th
60c0: 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 73 75 is routine consu
60d0: 6d 65 73 20 61 62 6f 75 74 20 68 61 6c 66 20 74 mes about half t
60e0: 68 65 0a 2a 2a 20 43 50 55 20 74 69 6d 65 20 6f he.** CPU time o
60f0: 6e 20 61 20 74 79 70 69 63 61 6c 20 72 75 6e 20 n a typical run
6100: 6f 66 20 6d 61 6b 65 68 65 61 64 65 72 73 2e 0a of makeheaders..
6110: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 47 65 */.static int Ge
6120: 74 54 6f 6b 65 6e 28 49 6e 53 74 72 65 61 6d 20 tToken(InStream
6130: 2a 70 49 6e 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f *pIn, Token *pTo
6140: 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 ken){. int i;.
6150: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a const char *z;.
6160: 20 20 69 6e 74 20 63 53 74 61 72 74 3b 0a 20 20 int cStart;.
6170: 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 73 74 61 int c;. int sta
6180: 72 74 4c 69 6e 65 3b 20 20 20 2f 2a 20 4c 69 6e rtLine; /* Lin
6190: 65 20 6f 6e 20 77 68 69 63 68 20 61 20 73 74 72 e on which a str
61a0: 75 63 74 75 72 65 20 62 65 67 69 6e 73 20 2a 2f ucture begins */
61b0: 0a 20 20 69 6e 74 20 6e 6c 69 73 63 20 3d 20 30 . int nlisc = 0
61c0: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 ; /* True if t
61d0: 68 65 72 65 20 69 73 20 61 20 6e 65 77 2d 6c 69 here is a new-li
61e0: 6e 65 20 69 6e 20 61 20 22 2e 2e 22 20 6f 72 20 ne in a ".." or
61f0: 27 2e 2e 27 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 '..' */. int nE
6200: 72 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 rr = 0; /* Nu
6210: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 mber of errors s
6220: 65 65 6e 20 2a 2f 0a 0a 20 20 7a 20 3d 20 70 49 een */.. z = pI
6230: 6e 2d 3e 7a 3b 0a 20 20 69 20 3d 20 70 49 6e 2d n->z;. i = pIn-
6240: 3e 69 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 6e 4c >i;. pToken->nL
6250: 69 6e 65 20 3d 20 70 49 6e 2d 3e 6e 4c 69 6e 65 ine = pIn->nLine
6260: 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 ;. pToken->zTex
6270: 74 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20 73 77 69 t = &z[i];. swi
6280: 74 63 68 28 20 7a 5b 69 5d 20 29 7b 0a 20 20 20 tch( z[i] ){.
6290: 20 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20 70 case 0:. p
62a0: 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 Token->eType = T
62b0: 54 5f 45 4f 46 3b 0a 20 20 20 20 20 20 70 54 6f T_EOF;. pTo
62c0: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 30 3b 0a ken->nText = 0;.
62d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 break;..
62e0: 20 20 63 61 73 65 20 27 23 27 3a 0a 20 20 20 20 case '#':.
62f0: 20 20 69 66 28 20 69 3d 3d 30 20 7c 7c 20 7a 5b if( i==0 || z[
6300: 69 2d 31 5d 3d 3d 27 5c 6e 27 20 7c 7c 20 28 69 i-1]=='\n' || (i
6310: 3e 31 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27 5c >1 && z[i-1]=='\
6320: 72 27 20 26 26 20 7a 5b 69 2d 32 5d 3d 3d 27 5c r' && z[i-2]=='\
6330: 6e 27 29 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a n')){. /*
6340: 20 57 65 20 66 6f 75 6e 64 20 61 20 70 72 65 70 We found a prep
6350: 72 6f 63 65 73 73 6f 72 20 73 74 61 74 65 6d 65 rocessor stateme
6360: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 nt */. pT
6370: 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 oken->eType = TT
6380: 5f 50 72 65 70 72 6f 63 65 73 73 6f 72 3b 0a 20 _Preprocessor;.
6390: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 i++;.
63a0: 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 21 while( z[i]!
63b0: 3d 30 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 6e 27 =0 && z[i]!='\n'
63c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 ){. if
63d0: 28 20 7a 5b 69 5d 3d 3d 27 5c 5c 27 20 29 7b 0a ( z[i]=='\\' ){.
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b i++;
63f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 . if(
6400: 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 70 49 z[i]=='\n' ) pI
6410: 6e 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 n->nLine++;.
6420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
6430: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d i++;. }
6440: 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d . pToken-
6450: 3e 6e 54 65 78 74 20 3d 20 69 20 2d 20 70 49 6e >nText = i - pIn
6460: 2d 3e 69 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 ->i;. }else
6470: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 73 {. /* Jus
6480: 74 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f t an operator */
6490: 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d . pToken-
64a0: 3e 65 54 79 70 65 20 3d 20 54 54 5f 4f 74 68 65 >eType = TT_Othe
64b0: 72 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 r;. pToke
64c0: 6e 2d 3e 6e 54 65 78 74 20 3d 20 31 3b 0a 20 20 n->nText = 1;.
64d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 }. brea
64e0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 27 20 27 k;.. case ' '
64f0: 3a 0a 20 20 20 20 63 61 73 65 20 27 5c 74 27 3a :. case '\t':
6500: 0a 20 20 20 20 63 61 73 65 20 27 5c 72 27 3a 0a . case '\r':.
6510: 20 20 20 20 63 61 73 65 20 27 5c 66 27 3a 0a 20 case '\f':.
6520: 20 20 20 63 61 73 65 20 27 5c 6e 27 3a 0a 20 20 case '\n':.
6530: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 while( isspa
6540: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 ce(z[i]) ){.
6550: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c if( z[i]=='\
6560: 6e 27 20 29 20 70 49 6e 2d 3e 6e 4c 69 6e 65 2b n' ) pIn->nLine+
6570: 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a +;. i++;.
6580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 }. pT
6590: 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 oken->eType = TT
65a0: 5f 53 70 61 63 65 3b 0a 20 20 20 20 20 20 70 54 _Space;. pT
65b0: 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 69 20 oken->nText = i
65c0: 2d 20 70 49 6e 2d 3e 69 3b 0a 20 20 20 20 20 20 - pIn->i;.
65d0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 break;.. case
65e0: 20 27 5c 5c 27 3a 0a 20 20 20 20 20 20 70 54 6f '\\':. pTo
65f0: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 32 3b 0a ken->nText = 2;.
6600: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 pToken->eT
6610: 79 70 65 20 3d 20 54 54 5f 4f 74 68 65 72 3b 0a ype = TT_Other;.
6620: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d if( z[i+1]
6630: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 =='\n' ){.
6640: 20 20 70 49 6e 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a pIn->nLine++;.
6650: 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e pToken->
6660: 65 54 79 70 65 20 3d 20 54 54 5f 53 70 61 63 65 eType = TT_Space
6670: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 ;. }else if
6680: 28 20 7a 5b 69 2b 31 5d 3d 3d 30 20 29 7b 0a 20 ( z[i+1]==0 ){.
6690: 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e pToken->n
66a0: 54 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 Text = 1;.
66b0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a }. break;..
66c0: 20 20 20 20 63 61 73 65 20 27 5c 27 27 3a 0a 20 case '\'':.
66d0: 20 20 20 63 61 73 65 20 27 5c 22 27 3a 0a 20 20 case '\"':.
66e0: 20 20 20 20 63 53 74 61 72 74 20 3d 20 7a 5b 69 cStart = z[i
66f0: 5d 3b 0a 20 20 20 20 20 20 73 74 61 72 74 4c 69 ];. startLi
6700: 6e 65 20 3d 20 70 49 6e 2d 3e 6e 4c 69 6e 65 3b ne = pIn->nLine;
6710: 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 . do{.
6720: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 i++;.
6730: 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 c = z[i];.
6740: 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b if( c=='\n' ){
6750: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 . if( !
6760: 6e 6c 69 73 63 20 29 7b 0a 20 20 20 20 20 20 20 nlisc ){.
6770: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 fprintf(std
6780: 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 err,.
6790: 20 20 20 22 25 73 3a 25 64 3a 20 28 77 61 72 6e "%s:%d: (warn
67a0: 69 6e 67 29 20 4e 65 77 6c 69 6e 65 20 69 6e 20 ing) Newline in
67b0: 73 74 72 69 6e 67 20 6f 72 20 63 68 61 72 61 63 string or charac
67c0: 74 65 72 20 6c 69 74 65 72 61 6c 2e 5c 6e 22 2c ter literal.\n",
67d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a . z
67e0: 46 69 6c 65 6e 61 6d 65 2c 20 70 49 6e 2d 3e 6e Filename, pIn->n
67f0: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 Line);.
6800: 20 20 20 6e 6c 69 73 63 20 3d 20 31 3b 0a 20 20 nlisc = 1;.
6810: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
6820: 20 20 20 20 70 49 6e 2d 3e 6e 4c 69 6e 65 2b 2b pIn->nLine++
6830: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
6840: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 if( c=='\\'
6850: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b ){. i++
6860: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 ;. c =
6870: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 z[i];.
6880: 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 if( c=='\n' ){.
6890: 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e pIn->
68a0: 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20 nLine++;.
68b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c }. }el
68c0: 73 65 20 69 66 28 20 63 3d 3d 63 53 74 61 72 74 se if( c==cStart
68d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b ){. i+
68e0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d +;. c =
68f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 0;. }els
6900: 65 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 e if( c==0 ){.
6910: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 fprintf(
6920: 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 stderr, "%s:%d:
6930: 55 6e 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 Unterminated str
6940: 69 6e 67 20 6f 72 20 63 68 61 72 61 63 74 65 72 ing or character
6950: 20 6c 69 74 65 72 61 6c 2e 5c 6e 22 2c 0a 20 20 literal.\n",.
6960: 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 zFile
6970: 6e 61 6d 65 2c 20 73 74 61 72 74 4c 69 6e 65 29 name, startLine)
6980: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 ;. nErr
6990: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 ++;. }.
69a0: 20 20 20 20 7d 77 68 69 6c 65 28 20 63 20 29 3b }while( c );
69b0: 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 . pToken->e
69c0: 54 79 70 65 20 3d 20 54 54 5f 53 74 72 69 6e 67 Type = TT_String
69d0: 3b 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e ;. pToken->
69e0: 6e 54 65 78 74 20 3d 20 69 20 2d 20 70 49 6e 2d nText = i - pIn-
69f0: 3e 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b >i;. break;
6a00: 0a 0a 20 20 20 20 63 61 73 65 20 27 2f 27 3a 0a .. case '/':.
6a10: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d if( z[i+1]
6a20: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 =='/' ){.
6a30: 20 2f 2a 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f /* C++ style co
6a40: 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 mment */.
6a50: 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20 26 26 20 while( z[i] &&
6a60: 7a 5b 69 5d 21 3d 27 5c 6e 27 20 29 7b 20 69 2b z[i]!='\n' ){ i+
6a70: 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 70 54 6f +; }. pTo
6a80: 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f ken->eType = TT_
6a90: 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 Comment;.
6aa0: 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d pToken->nText =
6ab0: 20 69 20 2d 20 70 49 6e 2d 3e 69 3b 0a 20 20 20 i - pIn->i;.
6ac0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 }else if( z[i
6ad0: 2b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 +1]=='*' ){.
6ae0: 20 20 20 20 2f 2a 20 43 20 73 74 79 6c 65 20 63 /* C style c
6af0: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 omment */.
6b00: 20 20 69 6e 74 20 69 73 42 6c 6f 63 6b 43 6f 6d int isBlockCom
6b10: 6d 65 6e 74 20 3d 20 69 3d 3d 30 20 7c 7c 20 7a ment = i==0 || z
6b20: 5b 69 2d 31 5d 3d 3d 27 5c 6e 27 3b 0a 20 20 20 [i-1]=='\n';.
6b30: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 i += 2;.
6b40: 20 20 20 20 20 73 74 61 72 74 4c 69 6e 65 20 3d startLine =
6b50: 20 70 49 6e 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20 pIn->nLine;.
6b60: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d while( z[i]
6b70: 20 26 26 20 28 7a 5b 69 5d 21 3d 27 2a 27 20 7c && (z[i]!='*' |
6b80: 7c 20 7a 5b 69 2b 31 5d 21 3d 27 2f 27 29 20 29 | z[i+1]!='/') )
6b90: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 {. if(
6ba0: 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 z[i]=='\n' ){.
6bb0: 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 6e pIn->n
6bc0: 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 Line++;.
6bd0: 20 20 20 20 69 66 28 20 69 73 42 6c 6f 63 6b 43 if( isBlockC
6be0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 omment ){.
6bf0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b if( z[i+
6c00: 31 5d 3d 3d 27 2a 27 20 7c 7c 20 7a 5b 69 2b 32 1]=='*' || z[i+2
6c10: 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 ]=='*' ){.
6c20: 20 20 20 20 20 20 20 20 20 20 20 69 73 42 6c 6f isBlo
6c30: 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20 32 3b 0a 20 ckComment = 2;.
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c }el
6c50: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 se{.
6c60: 20 20 20 20 20 69 73 42 6c 6f 63 6b 43 6f 6d 6d isBlockComm
6c70: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 ent = 0;.
6c80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
6c90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
6ca0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b }. i++
6cb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
6cc0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 7b 0a if( z[i] ){.
6cd0: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 i += 2
6ce0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b ;. }else{
6cf0: 0a 20 20 20 20 20 20 20 20 20 20 69 73 42 6c 6f . isBlo
6d00: 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 ckComment = 0;.
6d10: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 fprintf
6d20: 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 (stderr,"%s:%d:
6d30: 55 6e 74 65 72 6d 69 6e 61 74 65 64 20 63 6f 6d Unterminated com
6d40: 6d 65 6e 74 5c 6e 22 2c 0a 20 20 20 20 20 20 20 ment\n",.
6d50: 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 zFilename,
6d60: 73 74 61 72 74 4c 69 6e 65 29 3b 0a 20 20 20 20 startLine);.
6d70: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 nErr++;.
6d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
6d90: 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 pToken->eType =
6da0: 69 73 42 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 3d 3d isBlockComment==
6db0: 32 20 3f 20 54 54 5f 42 6c 6f 63 6b 43 6f 6d 6d 2 ? TT_BlockComm
6dc0: 65 6e 74 20 3a 20 54 54 5f 43 6f 6d 6d 65 6e 74 ent : TT_Comment
6dd0: 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 6e ;. pToken
6de0: 2d 3e 6e 54 65 78 74 20 3d 20 69 20 2d 20 70 49 ->nText = i - pI
6df0: 6e 2d 3e 69 3b 0a 20 20 20 20 20 20 7d 65 6c 73 n->i;. }els
6e00: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 e{. /* A
6e10: 64 69 76 69 64 65 20 6f 70 65 72 61 74 6f 72 20 divide operator
6e20: 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 */. pToke
6e30: 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f 4f 74 n->eType = TT_Ot
6e40: 68 65 72 3b 0a 20 20 20 20 20 20 20 20 70 54 6f her;. pTo
6e50: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 31 20 2b ken->nText = 1 +
6e60: 20 28 7a 5b 69 2b 31 5d 3d 3d 27 2b 27 29 3b 0a (z[i+1]=='+');.
6e70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 }. br
6e80: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 27 eak;.. case '
6e90: 30 27 3a 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 0':. if( z[
6ea0: 69 2b 31 5d 3d 3d 27 78 27 20 7c 7c 20 7a 5b 69 i+1]=='x' || z[i
6eb0: 2b 31 5d 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 +1]=='X' ){.
6ec0: 20 20 20 20 2f 2a 20 41 20 68 65 78 20 63 6f 6e /* A hex con
6ed0: 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 stant */.
6ee0: 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 i += 2;.
6ef0: 20 77 68 69 6c 65 28 20 69 73 78 64 69 67 69 74 while( isxdigit
6f00: 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d (z[i]) ){ i++; }
6f10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
6f20: 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 63 74 61 /* An octa
6f30: 6c 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 l constant */.
6f40: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 while( isd
6f50: 69 67 69 74 28 7a 5b 69 5d 29 20 29 7b 20 69 2b igit(z[i]) ){ i+
6f60: 2b 3b 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 +; }. }.
6f70: 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 pToken->eType
6f80: 20 3d 20 54 54 5f 4e 75 6d 62 65 72 3b 0a 20 20 = TT_Number;.
6f90: 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 pToken->nTex
6fa0: 74 20 3d 20 69 20 2d 20 70 49 6e 2d 3e 69 3b 0a t = i - pIn->i;.
6fb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 break;..
6fc0: 20 20 63 61 73 65 20 27 31 27 3a 20 63 61 73 65 case '1': case
6fd0: 20 27 32 27 3a 20 63 61 73 65 20 27 33 27 3a 20 '2': case '3':
6fe0: 63 61 73 65 20 27 34 27 3a 0a 20 20 20 20 63 61 case '4':. ca
6ff0: 73 65 20 27 35 27 3a 20 63 61 73 65 20 27 36 27 se '5': case '6'
7000: 3a 20 63 61 73 65 20 27 37 27 3a 20 63 61 73 65 : case '7': case
7010: 20 27 38 27 3a 20 63 61 73 65 20 27 39 27 3a 0a '8': case '9':.
7020: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 while( isd
7030: 69 67 69 74 28 7a 5b 69 5d 29 20 29 7b 20 69 2b igit(z[i]) ){ i+
7040: 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 +; }. if( (
7050: 63 3d 7a 5b 69 5d 29 3d 3d 27 2e 27 20 29 7b 0a c=z[i])=='.' ){.
7060: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 i++;.
7070: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 while( is
7080: 64 69 67 69 74 28 7a 5b 69 5d 29 20 29 7b 20 69 digit(z[i]) ){ i
7090: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 63 ++; }. c
70a0: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 = z[i];.
70b0: 20 20 69 66 28 20 63 3d 3d 27 65 27 20 7c 7c 20 if( c=='e' ||
70c0: 63 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 20 20 c=='E' ){.
70d0: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 i++;.
70e0: 20 20 20 20 20 69 66 28 20 28 28 63 3d 7a 5b 69 if( ((c=z[i
70f0: 5d 29 3d 3d 27 2b 27 20 7c 7c 20 63 3d 3d 27 2d ])=='+' || c=='-
7100: 27 29 20 26 26 20 69 73 64 69 67 69 74 28 7a 5b ') && isdigit(z[
7110: 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a i+1]) ){ i++; }.
7120: 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 while
7130: 28 20 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 20 ( isdigit(z[i])
7140: 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 ){ i++; }.
7150: 20 20 20 20 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 c = z[i];.
7160: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
7170: 20 20 20 69 66 28 20 63 3d 3d 27 66 27 20 7c 7c if( c=='f' ||
7180: 20 63 3d 3d 27 46 27 20 7c 7c 20 63 3d 3d 27 6c c=='F' || c=='l
7190: 27 20 7c 7c 20 63 3d 3d 27 4c 27 20 29 7b 20 69 ' || c=='L' ){ i
71a0: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 ++; }. }els
71b0: 65 20 69 66 28 20 63 3d 3d 27 65 27 20 7c 7c 20 e if( c=='e' ||
71c0: 63 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 20 20 c=='E' ){.
71d0: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 i++;.
71e0: 20 69 66 28 20 28 28 63 3d 7a 5b 69 5d 29 3d 3d if( ((c=z[i])==
71f0: 27 2b 27 20 7c 7c 20 63 3d 3d 27 2d 27 29 20 26 '+' || c=='-') &
7200: 26 20 69 73 64 69 67 69 74 28 7a 5b 69 2b 31 5d & isdigit(z[i+1]
7210: 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 ) ){ i++; }.
7220: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69 while( isdi
7230: 67 69 74 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b git(z[i]) ){ i++
7240: 3b 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 ; }. }else
7250: 69 66 28 20 63 3d 3d 27 4c 27 20 7c 7c 20 63 3d if( c=='L' || c=
7260: 3d 27 6c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 ='l' ){.
7270: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 63 i++;. c
7280: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 = z[i];.
7290: 20 20 69 66 28 20 63 3d 3d 27 75 27 20 7c 7c 20 if( c=='u' ||
72a0: 63 3d 3d 27 55 27 20 29 7b 20 69 2b 2b 3b 20 7d c=='U' ){ i++; }
72b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 . }else if(
72c0: 20 63 3d 3d 27 75 27 20 7c 7c 20 63 3d 3d 27 55 c=='u' || c=='U
72d0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 69 2b ' ){. i+
72e0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 63 20 3d 20 +;. c =
72f0: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 69 z[i];. i
7300: 66 28 20 63 3d 3d 27 6c 27 20 7c 7c 20 63 3d 3d f( c=='l' || c==
7310: 27 4c 27 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 'L' ){ i++; }.
7320: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 6f 6b }. pTok
7330: 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f 4e en->eType = TT_N
7340: 75 6d 62 65 72 3b 0a 20 20 20 20 20 20 70 54 6f umber;. pTo
7350: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 69 20 2d ken->nText = i -
7360: 20 70 49 6e 2d 3e 69 3b 0a 20 20 20 20 20 20 62 pIn->i;. b
7370: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 reak;.. case
7380: 27 61 27 3a 20 63 61 73 65 20 27 62 27 3a 20 63 'a': case 'b': c
7390: 61 73 65 20 27 63 27 3a 20 63 61 73 65 20 27 64 ase 'c': case 'd
73a0: 27 3a 20 63 61 73 65 20 27 65 27 3a 20 63 61 73 ': case 'e': cas
73b0: 65 20 27 66 27 3a 20 63 61 73 65 20 27 67 27 3a e 'f': case 'g':
73c0: 0a 20 20 20 20 63 61 73 65 20 27 68 27 3a 20 63 . case 'h': c
73d0: 61 73 65 20 27 69 27 3a 20 63 61 73 65 20 27 6a ase 'i': case 'j
73e0: 27 3a 20 63 61 73 65 20 27 6b 27 3a 20 63 61 73 ': case 'k': cas
73f0: 65 20 27 6c 27 3a 20 63 61 73 65 20 27 6d 27 3a e 'l': case 'm':
7400: 20 63 61 73 65 20 27 6e 27 3a 0a 20 20 20 20 63 case 'n':. c
7410: 61 73 65 20 27 6f 27 3a 20 63 61 73 65 20 27 70 ase 'o': case 'p
7420: 27 3a 20 63 61 73 65 20 27 71 27 3a 20 63 61 73 ': case 'q': cas
7430: 65 20 27 72 27 3a 20 63 61 73 65 20 27 73 27 3a e 'r': case 's':
7440: 20 63 61 73 65 20 27 74 27 3a 20 63 61 73 65 20 case 't': case
7450: 27 75 27 3a 0a 20 20 20 20 63 61 73 65 20 27 76 'u':. case 'v
7460: 27 3a 20 63 61 73 65 20 27 77 27 3a 20 63 61 73 ': case 'w': cas
7470: 65 20 27 78 27 3a 20 63 61 73 65 20 27 79 27 3a e 'x': case 'y':
7480: 20 63 61 73 65 20 27 7a 27 3a 20 63 61 73 65 20 case 'z': case
7490: 27 41 27 3a 20 63 61 73 65 20 27 42 27 3a 0a 20 'A': case 'B':.
74a0: 20 20 20 63 61 73 65 20 27 43 27 3a 20 63 61 73 case 'C': cas
74b0: 65 20 27 44 27 3a 20 63 61 73 65 20 27 45 27 3a e 'D': case 'E':
74c0: 20 63 61 73 65 20 27 46 27 3a 20 63 61 73 65 20 case 'F': case
74d0: 27 47 27 3a 20 63 61 73 65 20 27 48 27 3a 20 63 'G': case 'H': c
74e0: 61 73 65 20 27 49 27 3a 0a 20 20 20 20 63 61 73 ase 'I':. cas
74f0: 65 20 27 4a 27 3a 20 63 61 73 65 20 27 4b 27 3a e 'J': case 'K':
7500: 20 63 61 73 65 20 27 4c 27 3a 20 63 61 73 65 20 case 'L': case
7510: 27 4d 27 3a 20 63 61 73 65 20 27 4e 27 3a 20 63 'M': case 'N': c
7520: 61 73 65 20 27 4f 27 3a 20 63 61 73 65 20 27 50 ase 'O': case 'P
7530: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 51 27 3a ':. case 'Q':
7540: 20 63 61 73 65 20 27 52 27 3a 20 63 61 73 65 20 case 'R': case
7550: 27 53 27 3a 20 63 61 73 65 20 27 54 27 3a 20 63 'S': case 'T': c
7560: 61 73 65 20 27 55 27 3a 20 63 61 73 65 20 27 56 ase 'U': case 'V
7570: 27 3a 20 63 61 73 65 20 27 57 27 3a 0a 20 20 20 ': case 'W':.
7580: 20 63 61 73 65 20 27 58 27 3a 20 63 61 73 65 20 case 'X': case
7590: 27 59 27 3a 20 63 61 73 65 20 27 5a 27 3a 20 63 'Y': case 'Z': c
75a0: 61 73 65 20 27 5f 27 3a 0a 20 20 20 20 20 20 77 ase '_':. w
75b0: 68 69 6c 65 28 20 69 73 61 6c 6e 75 6d 28 7a 5b hile( isalnum(z[
75c0: 69 5d 29 20 7c 7c 20 7a 5b 69 5d 3d 3d 27 5f 27 i]) || z[i]=='_'
75d0: 20 29 7b 20 69 2b 2b 3b 20 7d 3b 0a 20 20 20 20 ){ i++; };.
75e0: 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 pToken->eType
75f0: 3d 20 54 54 5f 49 64 3b 0a 20 20 20 20 20 20 70 = TT_Id;. p
7600: 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 69 Token->nText = i
7610: 20 2d 20 70 49 6e 2d 3e 69 3b 0a 20 20 20 20 20 - pIn->i;.
7620: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 break;.. cas
7630: 65 20 27 3a 27 3a 0a 20 20 20 20 20 20 70 54 6f e ':':. pTo
7640: 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f ken->eType = TT_
7650: 4f 74 68 65 72 3b 0a 20 20 20 20 20 20 70 54 6f Other;. pTo
7660: 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 31 20 2b ken->nText = 1 +
7670: 20 28 7a 5b 69 2b 31 5d 3d 3d 27 3a 27 29 3b 0a (z[i+1]==':');.
7680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 break;..
7690: 20 20 63 61 73 65 20 27 3d 27 3a 0a 20 20 20 20 case '=':.
76a0: 63 61 73 65 20 27 3c 27 3a 0a 20 20 20 20 63 61 case '<':. ca
76b0: 73 65 20 27 3e 27 3a 0a 20 20 20 20 63 61 73 65 se '>':. case
76c0: 20 27 2b 27 3a 0a 20 20 20 20 63 61 73 65 20 27 '+':. case '
76d0: 2d 27 3a 0a 20 20 20 20 63 61 73 65 20 27 2a 27 -':. case '*'
76e0: 3a 0a 20 20 20 20 63 61 73 65 20 27 25 27 3a 0a :. case '%':.
76f0: 20 20 20 20 63 61 73 65 20 27 5e 27 3a 0a 20 20 case '^':.
7700: 20 20 63 61 73 65 20 27 26 27 3a 0a 20 20 20 20 case '&':.
7710: 63 61 73 65 20 27 7c 27 3a 0a 20 20 20 20 20 20 case '|':.
7720: 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 3d 20 pToken->eType =
7730: 54 54 5f 4f 74 68 65 72 3b 0a 20 20 20 20 20 20 TT_Other;.
7740: 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 3d 20 pToken->nText =
7750: 31 20 2b 20 28 7a 5b 69 2b 31 5d 3d 3d 27 3d 27 1 + (z[i+1]=='='
7760: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a );. break;.
7770: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 . default:.
7780: 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 pToken->eTyp
7790: 65 20 3d 20 54 54 5f 4f 74 68 65 72 3b 0a 20 20 e = TT_Other;.
77a0: 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 pToken->nTex
77b0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 t = 1;. bre
77c0: 61 6b 3b 0a 20 20 7d 0a 20 20 70 49 6e 2d 3e 69 ak;. }. pIn->i
77d0: 20 2b 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 += pToken->nTex
77e0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 t;. return nErr
77f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 ;.}../*.** This
7800: 72 6f 75 74 69 6e 65 20 72 65 63 6f 76 65 72 73 routine recovers
7810: 20 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 20 the next token
7820: 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 66 from the input f
7830: 69 6c 65 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 ile which is.**
7840: 6e 6f 74 20 61 20 73 70 61 63 65 20 6f 72 20 61 not a space or a
7850: 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 61 6e 79 20 comment or any
7860: 74 65 78 74 20 62 65 74 77 65 65 6e 20 61 6e 20 text between an
7870: 22 23 69 66 20 30 22 20 61 6e 64 20 22 23 65 6e "#if 0" and "#en
7880: 64 69 66 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 dif"..**.** This
7890: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 routine returns
78a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 the number of e
78b0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 rrors encountere
78c0: 64 2e 20 20 41 6e 20 65 72 72 6f 72 0a 2a 2a 20 d. An error.**
78d0: 69 73 20 61 6e 20 75 6e 74 65 72 6d 69 6e 61 74 is an unterminat
78e0: 65 64 20 74 6f 6b 65 6e 20 6f 72 20 75 6e 6d 61 ed token or unma
78f0: 74 63 68 65 64 20 22 23 69 66 20 30 22 2e 0a 2a tched "#if 0"..*
7900: 2a 0a 2a 2a 20 50 72 6f 66 69 6c 69 6e 67 20 73 *.** Profiling s
7910: 68 6f 77 73 20 74 68 61 74 20 74 68 69 73 20 72 hows that this r
7920: 6f 75 74 69 6e 65 20 75 73 65 73 20 61 62 6f 75 outine uses abou
7930: 74 20 61 20 71 75 61 72 74 65 72 20 6f 66 20 74 t a quarter of t
7940: 68 65 0a 2a 2a 20 43 50 55 20 74 69 6d 65 20 69 he.** CPU time i
7950: 6e 20 61 20 74 79 70 69 63 61 6c 20 72 75 6e 2e n a typical run.
7960: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 47 .*/.static int G
7970: 65 74 4e 6f 6e 73 70 61 63 65 54 6f 6b 65 6e 28 etNonspaceToken(
7980: 49 6e 53 74 72 65 61 6d 20 2a 70 49 6e 2c 20 54 InStream *pIn, T
7990: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 oken *pToken){.
79a0: 20 69 6e 74 20 6e 49 66 20 3d 20 30 3b 0a 20 20 int nIf = 0;.
79b0: 69 6e 74 20 69 6e 5a 65 72 6f 20 3d 20 30 3b 0a int inZero = 0;.
79c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b const char *z;
79d0: 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20 . int value;.
79e0: 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 3b 0a 20 int startLine;.
79f0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a int nErr = 0;..
7a00: 20 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 49 startLine = pI
7a10: 6e 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 77 68 69 6c n->nLine;. whil
7a20: 65 28 20 31 20 29 7b 0a 20 20 20 20 6e 45 72 72 e( 1 ){. nErr
7a30: 20 2b 3d 20 47 65 74 54 6f 6b 65 6e 28 70 49 6e += GetToken(pIn
7a40: 2c 70 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 2f 2a ,pToken);. /*
7a50: 20 70 72 69 6e 74 66 28 22 25 30 34 64 3a 20 54 printf("%04d: T
7a60: 79 70 65 3d 25 64 20 6e 49 66 3d 25 64 20 5b 25 ype=%d nIf=%d [%
7a70: 2e 2a 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 .*s]\n",.
7a80: 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 70 54 pToken->nLine,pT
7a90: 6f 6b 65 6e 2d 3e 65 54 79 70 65 2c 6e 49 66 2c oken->eType,nIf,
7aa0: 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 2c 0a 20 pToken->nText,.
7ab0: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 pToken->eT
7ac0: 79 70 65 21 3d 54 54 5f 53 70 61 63 65 20 3f 20 ype!=TT_Space ?
7ad0: 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 20 3a 20 pToken->zText :
7ae0: 22 3c 73 70 61 63 65 3e 22 29 3b 20 2a 2f 0a 20 "<space>"); */.
7af0: 20 20 20 70 54 6f 6b 65 6e 2d 3e 70 43 6f 6d 6d pToken->pComm
7b00: 65 6e 74 20 3d 20 62 6c 6f 63 6b 43 6f 6d 6d 65 ent = blockComme
7b10: 6e 74 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 nt;. switch(
7b20: 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 65 20 29 7b pToken->eType ){
7b30: 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 43 . case TT_C
7b40: 6f 6d 6d 65 6e 74 3a 20 20 20 20 20 20 20 20 20 omment:
7b50: 20 2f 2a 30 31 32 33 34 35 36 37 38 39 20 31 32 /*0123456789 12
7b60: 33 34 35 36 37 38 20 2a 2f 0a 20 20 20 20 20 20 345678 */.
7b70: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 70 54 6f if( strncmp(pTo
7b80: 6b 65 6e 2d 3e 7a 54 65 78 74 2c 20 22 2f 2a 4d ken->zText, "/*M
7b90: 41 4b 45 48 45 41 44 45 52 53 2d 53 54 4f 50 22 AKEHEADERS-STOP"
7ba0: 2c 20 31 38 29 3d 3d 30 20 29 20 72 65 74 75 72 , 18)==0 ) retur
7bb0: 6e 20 6e 45 72 72 3b 0a 20 20 20 20 20 20 20 62 n nErr;. b
7bc0: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 reak;.. cas
7bd0: 65 20 54 54 5f 53 70 61 63 65 3a 0a 20 20 20 20 e TT_Space:.
7be0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 break;..
7bf0: 20 20 63 61 73 65 20 54 54 5f 42 6c 6f 63 6b 43 case TT_BlockC
7c00: 6f 6d 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20 omment:.
7c10: 69 66 28 20 64 6f 63 5f 66 6c 61 67 20 29 7b 0a if( doc_flag ){.
7c20: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 63 6b 43 blockC
7c30: 6f 6d 6d 65 6e 74 20 3d 20 53 61 66 65 4d 61 6c omment = SafeMal
7c40: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 6f 6b 65 loc( sizeof(Toke
7c50: 6e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 n) );.
7c60: 2a 62 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20 *blockComment =
7c70: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 *pToken;.
7c80: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b }. break
7c90: 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 ;.. case TT
7ca0: 5f 45 4f 46 3a 0a 20 20 20 20 20 20 20 20 69 66 _EOF:. if
7cb0: 28 20 6e 49 66 20 29 7b 0a 20 20 20 20 20 20 20 ( nIf ){.
7cc0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 fprintf(stder
7cd0: 72 2c 22 25 73 3a 25 64 3a 20 55 6e 74 65 72 6d r,"%s:%d: Unterm
7ce0: 69 6e 61 74 65 64 20 5c 22 23 69 66 5c 22 5c 6e inated \"#if\"\n
7cf0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ",.
7d00: 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 74 61 72 74 zFilename, start
7d10: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 Line);.
7d20: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 nErr++;.
7d30: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 }. retur
7d40: 6e 20 6e 45 72 72 3b 0a 0a 20 20 20 20 20 20 63 n nErr;.. c
7d50: 61 73 65 20 54 54 5f 50 72 65 70 72 6f 63 65 73 ase TT_Preproces
7d60: 73 6f 72 3a 0a 20 20 20 20 20 20 20 20 7a 20 3d sor:. z =
7d70: 20 26 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 5b &pToken->zText[
7d80: 31 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 1];. whil
7d90: 65 28 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a e( *z==' ' || *z
7da0: 3d 3d 27 5c 74 27 20 29 20 7a 2b 2b 3b 0a 20 20 =='\t' ) z++;.
7db0: 20 20 20 20 20 20 69 66 28 20 73 73 63 61 6e 66 if( sscanf
7dc0: 28 7a 2c 22 69 66 20 25 64 22 2c 26 76 61 6c 75 (z,"if %d",&valu
7dd0: 65 29 3d 3d 31 20 26 26 20 76 61 6c 75 65 3d 3d e)==1 && value==
7de0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 0 ){. n
7df0: 49 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 If++;.
7e00: 69 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 inZero = 1;.
7e10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 6e }else if( in
7e20: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 Zero ){.
7e30: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c if( strncmp(z,
7e40: 22 69 66 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 "if",2)==0 ){.
7e50: 20 20 20 20 20 20 20 20 20 20 6e 49 66 2b 2b 3b nIf++;
7e60: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 . }else
7e70: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c 22 if( strncmp(z,"
7e80: 65 6e 64 69 66 22 2c 35 29 3d 3d 30 20 29 7b 0a endif",5)==0 ){.
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 6e 49 66 2d nIf-
7ea0: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 -;. i
7eb0: 66 28 20 6e 49 66 3d 3d 30 20 29 20 69 6e 5a 65 f( nIf==0 ) inZe
7ec0: 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 ro = 0;.
7ed0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 }. }els
7ee0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 e{. ret
7ef0: 75 72 6e 20 6e 45 72 72 3b 0a 20 20 20 20 20 20 urn nErr;.
7f00: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 }. brea
7f10: 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c k;.. defaul
7f20: 74 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 t:. if( !
7f30: 69 6e 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 inZero ){.
7f40: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b return nErr;
7f50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
7f60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
7f70: 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41 }. /* NOT REA
7f80: 43 48 45 44 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a CHED */.}../*.**
7f90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f This routine lo
7fa0: 6f 6b 73 20 66 6f 72 20 69 64 65 6e 74 69 66 69 oks for identifi
7fb0: 65 72 73 20 28 73 74 72 69 6e 67 73 20 6f 66 20 ers (strings of
7fc0: 63 6f 6e 74 69 67 75 6f 75 73 20 61 6c 70 68 61 contiguous alpha
7fd0: 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 numeric.** chara
7fe0: 63 74 65 72 73 29 20 77 69 74 68 69 6e 20 61 20 cters) within a
7ff0: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 64 69 72 preprocessor dir
8000: 65 63 74 69 76 65 20 61 6e 64 20 61 64 64 73 20 ective and adds
8010: 65 76 65 72 79 20 73 75 63 68 20 73 74 72 69 6e every such strin
8020: 67 0a 2a 2a 20 66 6f 75 6e 64 20 74 6f 20 74 68 g.** found to th
8030: 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 e given identifi
8040: 65 72 20 74 61 62 6c 65 0a 2a 2f 0a 73 74 61 74 er table.*/.stat
8050: 69 63 20 76 6f 69 64 20 46 69 6e 64 49 64 65 6e ic void FindIden
8060: 74 69 66 69 65 72 73 49 6e 4d 61 63 72 6f 28 54 tifiersInMacro(T
8070: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 49 64 oken *pToken, Id
8080: 65 6e 74 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 entTable *pTable
8090: 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 54 6f 6b 65 ){. Token sToke
80a0: 6e 3b 0a 20 20 49 6e 53 74 72 65 61 6d 20 73 49 n;. InStream sI
80b0: 6e 3b 0a 20 20 69 6e 74 20 67 6f 20 3d 20 31 3b n;. int go = 1;
80c0: 0a 0a 20 20 73 49 6e 2e 7a 20 3d 20 70 54 6f 6b .. sIn.z = pTok
80d0: 65 6e 2d 3e 7a 54 65 78 74 3b 0a 20 20 73 49 6e en->zText;. sIn
80e0: 2e 69 20 3d 20 31 3b 0a 20 20 73 49 6e 2e 6e 4c .i = 1;. sIn.nL
80f0: 69 6e 65 20 3d 20 31 3b 0a 20 20 77 68 69 6c 65 ine = 1;. while
8100: 28 20 67 6f 20 26 26 20 73 49 6e 2e 69 20 3c 20 ( go && sIn.i <
8110: 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 29 7b pToken->nText ){
8120: 0a 20 20 20 20 47 65 74 54 6f 6b 65 6e 28 26 73 . GetToken(&s
8130: 49 6e 2c 26 73 54 6f 6b 65 6e 29 3b 0a 20 20 20 In,&sToken);.
8140: 20 73 77 69 74 63 68 28 20 73 54 6f 6b 65 6e 2e switch( sToken.
8150: 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 eType ){. c
8160: 61 73 65 20 54 54 5f 49 64 3a 0a 20 20 20 20 20 ase TT_Id:.
8170: 20 20 20 49 64 65 6e 74 54 61 62 6c 65 49 6e 73 IdentTableIns
8180: 65 72 74 28 70 54 61 62 6c 65 2c 73 54 6f 6b 65 ert(pTable,sToke
8190: 6e 2e 7a 54 65 78 74 2c 73 54 6f 6b 65 6e 2e 6e n.zText,sToken.n
81a0: 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 62 Text);. b
81b0: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 reak;.. cas
81c0: 65 20 54 54 5f 45 4f 46 3a 0a 20 20 20 20 20 20 e TT_EOF:.
81d0: 20 20 67 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 go = 0;.
81e0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 break;..
81f0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 default:.
8200: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
8210: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 }.}../*.** This
8220: 72 6f 75 74 69 6e 65 20 67 65 74 73 20 74 68 65 routine gets the
8230: 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 20 20 45 76 next token. Ev
8240: 65 72 79 74 68 69 6e 67 20 63 6f 6e 74 61 69 6e erything contain
8250: 65 64 20 77 69 74 68 69 6e 0a 2a 2a 20 7b 2e 2e ed within.** {..
8260: 2e 7d 20 69 73 20 63 6f 6c 6c 61 70 73 65 64 20 .} is collapsed
8270: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 54 54 into a single TT
8280: 5f 42 72 61 63 65 73 20 74 6f 6b 65 6e 2e 20 20 _Braces token.
8290: 57 68 69 74 65 73 70 61 63 65 20 69 73 0a 2a 2a Whitespace is.**
82a0: 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 omitted..**.**
82b0: 49 66 20 70 54 61 62 6c 65 20 69 73 20 6e 6f 74 If pTable is not
82c0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e 73 65 NULL, then inse
82d0: 72 74 20 65 76 65 72 79 20 69 64 65 6e 74 69 66 rt every identif
82e0: 69 65 72 20 73 65 65 6e 20 69 6e 74 6f 20 74 68 ier seen into th
82f0: 65 0a 2a 2a 20 49 64 65 6e 74 54 61 62 6c 65 2e e.** IdentTable.
8300: 20 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 This includes
8310: 61 6e 79 20 69 64 65 6e 74 69 66 69 65 72 73 20 any identifiers
8320: 73 65 65 6e 20 69 6e 73 69 64 65 20 6f 66 20 7b seen inside of {
8330: 2e 2e 2e 7d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 ...}..**.** The
8340: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 number of errors
8350: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 73 20 encountered is
8360: 72 65 74 75 72 6e 65 64 2e 20 20 41 6e 20 65 72 returned. An er
8370: 72 6f 72 20 69 73 20 61 6e 0a 2a 2a 20 75 6e 74 ror is an.** unt
8380: 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 2e erminated token.
8390: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 47 .*/.static int G
83a0: 65 74 42 69 67 54 6f 6b 65 6e 28 49 6e 53 74 72 etBigToken(InStr
83b0: 65 61 6d 20 2a 70 49 6e 2c 20 54 6f 6b 65 6e 20 eam *pIn, Token
83c0: 2a 70 54 6f 6b 65 6e 2c 20 49 64 65 6e 74 54 61 *pToken, IdentTa
83d0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 ble *pTable){.
83e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 const char *zSta
83f0: 72 74 3b 0a 20 20 69 6e 74 20 69 53 74 61 72 74 rt;. int iStart
8400: 3b 0a 20 20 69 6e 74 20 6e 42 72 61 63 65 3b 0a ;. int nBrace;.
8410: 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e int c;. int n
8420: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 45 72 72 Line;. int nErr
8430: 3b 0a 0a 20 20 6e 45 72 72 20 3d 20 47 65 74 4e ;.. nErr = GetN
8440: 6f 6e 73 70 61 63 65 54 6f 6b 65 6e 28 70 49 6e onspaceToken(pIn
8450: 2c 70 54 6f 6b 65 6e 29 3b 0a 20 20 73 77 69 74 ,pToken);. swit
8460: 63 68 28 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 70 ch( pToken->eTyp
8470: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 54 e ){. case TT
8480: 5f 49 64 3a 0a 20 20 20 20 20 20 69 66 28 20 70 _Id:. if( p
8490: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 Table!=0 ){.
84a0: 20 20 20 20 49 64 65 6e 74 54 61 62 6c 65 49 6e IdentTableIn
84b0: 73 65 72 74 28 70 54 61 62 6c 65 2c 70 54 6f 6b sert(pTable,pTok
84c0: 65 6e 2d 3e 7a 54 65 78 74 2c 70 54 6f 6b 65 6e en->zText,pToken
84d0: 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20 ->nText);.
84e0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e }. return n
84f0: 45 72 72 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 Err;.. case T
8500: 54 5f 50 72 65 70 72 6f 63 65 73 73 6f 72 3a 0a T_Preprocessor:.
8510: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 if( pTable
8520: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 46 !=0 ){. F
8530: 69 6e 64 49 64 65 6e 74 69 66 69 65 72 73 49 6e indIdentifiersIn
8540: 4d 61 63 72 6f 28 70 54 6f 6b 65 6e 2c 70 54 61 Macro(pToken,pTa
8550: 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 ble);. }.
8560: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b return nErr;
8570: 0a 0a 20 20 20 20 63 61 73 65 20 54 54 5f 4f 74 .. case TT_Ot
8580: 68 65 72 3a 0a 20 20 20 20 20 20 69 66 28 20 70 her:. if( p
8590: 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 5b 30 5d 3d Token->zText[0]=
85a0: 3d 27 7b 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 ='{' ) break;.
85b0: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b return nErr;
85c0: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 .. default:.
85d0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 return nErr
85e0: 3b 0a 20 20 7d 0a 0a 20 20 69 53 74 61 72 74 20 ;. }.. iStart
85f0: 3d 20 70 49 6e 2d 3e 69 3b 0a 20 20 7a 53 74 61 = pIn->i;. zSta
8600: 72 74 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 54 65 rt = pToken->zTe
8610: 78 74 3b 0a 20 20 6e 4c 69 6e 65 20 3d 20 70 54 xt;. nLine = pT
8620: 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 6e oken->nLine;. n
8630: 42 72 61 63 65 20 3d 20 31 3b 0a 20 20 77 68 69 Brace = 1;. whi
8640: 6c 65 28 20 6e 42 72 61 63 65 20 29 7b 0a 20 20 le( nBrace ){.
8650: 20 20 6e 45 72 72 20 2b 3d 20 47 65 74 4e 6f 6e nErr += GetNon
8660: 73 70 61 63 65 54 6f 6b 65 6e 28 70 49 6e 2c 70 spaceToken(pIn,p
8670: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 2f 2a 20 70 Token);. /* p
8680: 72 69 6e 74 66 28 22 25 30 34 64 3a 20 6e 42 72 rintf("%04d: nBr
8690: 61 63 65 3d 25 64 20 5b 25 2e 2a 73 5d 5c 6e 22 ace=%d [%.*s]\n"
86a0: 2c 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 6e ,pToken->nLine,n
86b0: 42 72 61 63 65 2c 0a 20 20 20 20 20 20 20 70 54 Brace,. pT
86c0: 6f 6b 65 6e 2d 3e 6e 54 65 78 74 2c 70 54 6f 6b oken->nText,pTok
86d0: 65 6e 2d 3e 7a 54 65 78 74 29 3b 20 2a 2f 0a 20 en->zText); */.
86e0: 20 20 20 73 77 69 74 63 68 28 20 70 54 6f 6b 65 switch( pToke
86f0: 6e 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 n->eType ){.
8700: 20 20 63 61 73 65 20 54 54 5f 45 4f 46 3a 0a 20 case TT_EOF:.
8710: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 fprintf(s
8720: 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 55 6e tderr,"%s:%d: Un
8730: 74 65 72 6d 69 6e 61 74 65 64 20 5c 22 7b 5c 22 terminated \"{\"
8740: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 \n",.
8750: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 4c 69 6e 65 zFilename, nLine
8760: 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b );. nErr+
8770: 2b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65 +;. pToke
8780: 6e 2d 3e 65 54 79 70 65 20 3d 20 54 54 5f 45 72 n->eType = TT_Er
8790: 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 72 65 74 ror;. ret
87a0: 75 72 6e 20 6e 45 72 72 3b 0a 0a 20 20 20 20 20 urn nErr;..
87b0: 20 63 61 73 65 20 54 54 5f 49 64 3a 0a 20 20 20 case TT_Id:.
87c0: 20 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 if( pTable
87d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 64 65 ){. Ide
87e0: 6e 74 54 61 62 6c 65 49 6e 73 65 72 74 28 70 54 ntTableInsert(pT
87f0: 61 62 6c 65 2c 70 54 6f 6b 65 6e 2d 3e 7a 54 65 able,pToken->zTe
8800: 78 74 2c 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 xt,pToken->nText
8810: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 );. }.
8820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 break;..
8830: 20 20 20 63 61 73 65 20 54 54 5f 50 72 65 70 72 case TT_Prepr
8840: 6f 63 65 73 73 6f 72 3a 0a 20 20 20 20 20 20 20 ocessor:.
8850: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 if( pTable!=0 )
8860: 7b 0a 20 20 20 20 20 20 20 20 20 20 46 69 6e 64 {. Find
8870: 49 64 65 6e 74 69 66 69 65 72 73 49 6e 4d 61 63 IdentifiersInMac
8880: 72 6f 28 70 54 6f 6b 65 6e 2c 70 54 61 62 6c 65 ro(pToken,pTable
8890: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 );. }.
88a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 break;..
88b0: 20 20 20 63 61 73 65 20 54 54 5f 4f 74 68 65 72 case TT_Other
88c0: 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63 :. if( (c
88d0: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 = pToken->zText
88e0: 5b 30 5d 29 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 [0])=='{' ){.
88f0: 20 20 20 20 20 20 20 6e 42 72 61 63 65 2b 2b 3b nBrace++;
8900: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 . }else i
8910: 66 28 20 63 3d 3d 27 7d 27 20 29 7b 0a 20 20 20 f( c=='}' ){.
8920: 20 20 20 20 20 20 20 6e 42 72 61 63 65 2d 2d 3b nBrace--;
8930: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
8940: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 break;..
8950: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 default:.
8960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 break;. }.
8970: 20 7d 0a 20 20 70 54 6f 6b 65 6e 2d 3e 65 54 79 }. pToken->eTy
8980: 70 65 20 3d 20 54 54 5f 42 72 61 63 65 73 3b 0a pe = TT_Braces;.
8990: 20 20 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 pToken->nText
89a0: 3d 20 31 20 2b 20 70 49 6e 2d 3e 69 20 2d 20 69 = 1 + pIn->i - i
89b0: 53 74 61 72 74 3b 0a 20 20 70 54 6f 6b 65 6e 2d Start;. pToken-
89c0: 3e 7a 54 65 78 74 20 3d 20 7a 53 74 61 72 74 3b >zText = zStart;
89d0: 0a 20 20 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 . pToken->nLine
89e0: 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 72 65 74 75 = nLine;. retu
89f0: 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a rn nErr;.}../*.*
8a00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66 * This routine f
8a10: 72 65 65 73 20 75 70 20 61 20 6c 69 73 74 20 6f rees up a list o
8a20: 66 20 54 6f 6b 65 6e 73 2e 20 20 54 68 65 20 70 f Tokens. The p
8a30: 43 6f 6d 6d 65 6e 74 20 74 6f 6b 65 6e 73 20 61 Comment tokens a
8a40: 72 65 0a 2a 2a 20 6e 6f 74 20 63 6c 65 61 72 65 re.** not cleare
8a50: 64 20 62 79 20 74 68 69 73 2e 20 20 53 6f 20 77 d by this. So w
8a60: 65 20 6c 65 61 6b 20 61 20 6c 69 74 74 6c 65 20 e leak a little
8a70: 6d 65 6d 6f 72 79 20 77 68 65 6e 20 75 73 69 6e memory when usin
8a80: 67 20 74 68 65 20 2d 64 6f 63 0a 2a 2a 20 6f 70 g the -doc.** op
8a90: 74 69 6f 6e 2e 20 20 53 6f 20 77 68 61 74 2e 0a tion. So what..
8aa0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 46 */.static void F
8ab0: 72 65 65 54 6f 6b 65 6e 4c 69 73 74 28 54 6f 6b reeTokenList(Tok
8ac0: 65 6e 20 2a 70 4c 69 73 74 29 7b 0a 20 20 54 6f en *pList){. To
8ad0: 6b 65 6e 20 2a 70 4e 65 78 74 3b 0a 20 20 77 68 ken *pNext;. wh
8ae0: 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 ile( pList ){.
8af0: 20 20 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d pNext = pList-
8b00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 53 61 66 65 >pNext;. Safe
8b10: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 Free(pList);.
8b20: 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a pList = pNext;.
8b30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b }.}../*.** Tok
8b40: 65 6e 69 7a 65 20 61 6e 20 65 6e 74 69 72 65 20 enize an entire
8b50: 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 61 20 file. Return a
8b60: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c pointer to the l
8b70: 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73 2e 0a 2a ist of tokens..*
8b80: 2a 0a 2a 2a 20 53 70 61 63 65 20 66 6f 72 20 65 *.** Space for e
8b90: 61 63 68 20 74 6f 6b 65 6e 20 69 73 20 6f 62 74 ach token is obt
8ba0: 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 73 65 70 ained from a sep
8bb0: 61 72 61 74 65 20 6d 61 6c 6c 6f 63 28 29 20 63 arate malloc() c
8bc0: 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c all. The.** cal
8bd0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 ling function is
8be0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 responsible for
8bf0: 20 66 72 65 65 69 6e 67 20 74 68 69 73 20 73 70 freeing this sp
8c00: 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 ace..**.** If pT
8c10: 61 62 6c 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c able is not NULL
8c20: 2c 20 74 68 65 6e 20 66 69 6c 6c 20 74 68 65 20 , then fill the
8c30: 74 61 62 6c 65 20 77 69 74 68 20 61 6c 6c 20 69 table with all i
8c40: 64 65 6e 74 69 66 69 65 72 73 20 73 65 65 6e 20 dentifiers seen
8c50: 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 70 75 74 20 in.** the input
8c60: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 file..*/.static
8c70: 54 6f 6b 65 6e 20 2a 54 6f 6b 65 6e 69 7a 65 46 Token *TokenizeF
8c80: 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a ile(const char *
8c90: 7a 46 69 6c 65 2c 20 49 64 65 6e 74 54 61 62 6c zFile, IdentTabl
8ca0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e e *pTable){. In
8cb0: 53 74 72 65 61 6d 20 73 49 6e 3b 0a 20 20 54 6f Stream sIn;. To
8cc0: 6b 65 6e 20 2a 70 46 69 72 73 74 20 3d 20 30 2c ken *pFirst = 0,
8cd0: 20 2a 70 4c 61 73 74 20 3d 20 30 2c 20 2a 70 4e *pLast = 0, *pN
8ce0: 65 77 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d ew;. int nErr =
8cf0: 20 30 3b 0a 0a 20 20 73 49 6e 2e 7a 20 3d 20 7a 0;.. sIn.z = z
8d00: 46 69 6c 65 3b 0a 20 20 73 49 6e 2e 69 20 3d 20 File;. sIn.i =
8d10: 30 3b 0a 20 20 73 49 6e 2e 6e 4c 69 6e 65 20 3d 0;. sIn.nLine =
8d20: 20 31 3b 0a 20 20 62 6c 6f 63 6b 43 6f 6d 6d 65 1;. blockComme
8d30: 6e 74 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 nt = 0;.. while
8d40: 28 20 73 49 6e 2e 7a 5b 73 49 6e 2e 69 5d 21 3d ( sIn.z[sIn.i]!=
8d50: 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 0 ){. pNew =
8d60: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 SafeMalloc( size
8d70: 6f 66 28 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 of(Token) );.
8d80: 20 6e 45 72 72 20 2b 3d 20 47 65 74 42 69 67 54 nErr += GetBigT
8d90: 6f 6b 65 6e 28 26 73 49 6e 2c 70 4e 65 77 2c 70 oken(&sIn,pNew,p
8da0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 64 65 62 75 Table);. debu
8db0: 67 33 28 54 4f 4b 45 4e 49 5a 45 52 2c 20 22 54 g3(TOKENIZER, "T
8dc0: 6f 6b 65 6e 20 6f 6e 20 6c 69 6e 65 20 25 64 3a oken on line %d:
8dd0: 20 5b 25 2e 2a 73 5d 5c 6e 22 2c 0a 20 20 20 20 [%.*s]\n",.
8de0: 20 20 20 70 4e 65 77 2d 3e 6e 4c 69 6e 65 2c 20 pNew->nLine,
8df0: 70 4e 65 77 2d 3e 6e 54 65 78 74 3c 35 30 20 3f pNew->nText<50 ?
8e00: 20 70 4e 65 77 2d 3e 6e 54 65 78 74 20 3a 20 35 pNew->nText : 5
8e10: 30 2c 20 70 4e 65 77 2d 3e 7a 54 65 78 74 29 3b 0, pNew->zText);
8e20: 0a 20 20 20 20 69 66 28 20 70 46 69 72 73 74 3d . if( pFirst=
8e30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 72 =0 ){. pFir
8e40: 73 74 20 3d 20 70 4c 61 73 74 20 3d 20 70 4e 65 st = pLast = pNe
8e50: 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 w;. pNew->p
8e60: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 Prev = 0;. }e
8e70: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 61 73 74 lse{. pLast
8e80: 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a ->pNext = pNew;.
8e90: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 65 pNew->pPre
8ea0: 76 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 20 v = pLast;.
8eb0: 20 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 20 pLast = pNew;.
8ec0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4e 65 }. if( pNe
8ed0: 77 2d 3e 65 54 79 70 65 3d 3d 54 54 5f 45 4f 46 w->eType==TT_EOF
8ee0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 ) break;. }.
8ef0: 69 66 28 20 70 4c 61 73 74 20 29 20 70 4c 61 73 if( pLast ) pLas
8f00: 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 t->pNext = 0;.
8f10: 62 6c 6f 63 6b 43 6f 6d 6d 65 6e 74 20 3d 20 30 blockComment = 0
8f20: 3b 0a 20 20 69 66 28 20 6e 45 72 72 20 29 7b 0a ;. if( nErr ){.
8f30: 20 20 20 20 46 72 65 65 54 6f 6b 65 6e 4c 69 73 FreeTokenLis
8f40: 74 28 70 46 69 72 73 74 29 3b 0a 20 20 20 20 70 t(pFirst);. p
8f50: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a First = 0;. }..
8f60: 20 20 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b return pFirst;
8f70: 0a 7d 0a 0a 23 69 66 20 54 45 53 54 3d 3d 31 0a .}..#if TEST==1.
8f80: 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6f /*.** Use the fo
8f90: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 llowing routine
8fa0: 74 6f 20 74 65 73 74 20 6f 72 20 64 65 62 75 67 to test or debug
8fb0: 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a the tokenizer..
8fc0: 2a 2f 0a 76 6f 69 64 20 6d 61 69 6e 28 69 6e 74 */.void main(int
8fd0: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 argc, char **ar
8fe0: 67 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 gv){. char *zFi
8ff0: 6c 65 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4c 69 le;. Token *pLi
9000: 73 74 2c 20 2a 70 3b 0a 20 20 49 64 65 6e 74 54 st, *p;. IdentT
9010: 61 62 6c 65 20 73 54 61 62 6c 65 3b 0a 0a 20 20 able sTable;..
9020: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 if( argc!=2 ){.
9030: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 fprintf(stder
9040: 72 2c 22 55 73 61 67 65 3a 20 25 73 20 66 69 6c r,"Usage: %s fil
9050: 65 6e 61 6d 65 5c 6e 22 2c 2a 61 72 67 76 29 3b ename\n",*argv);
9060: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 . exit(1);.
9070: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 73 54 61 62 }. memset(&sTab
9080: 6c 65 2c 30 2c 73 69 7a 65 6f 66 28 73 54 61 62 le,0,sizeof(sTab
9090: 6c 65 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 le));. zFile =
90a0: 52 65 61 64 46 69 6c 65 28 61 72 67 76 5b 31 5d ReadFile(argv[1]
90b0: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d );. if( zFile==
90c0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 0 ){. fprintf
90d0: 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 72 (stderr,"Can't r
90e0: 65 61 64 20 66 69 6c 65 20 5c 22 25 73 5c 22 5c ead file \"%s\"\
90f0: 6e 22 2c 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 n",argv[1]);.
9100: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 exit(1);. }.
9110: 70 4c 69 73 74 20 3d 20 54 6f 6b 65 6e 69 7a 65 pList = Tokenize
9120: 46 69 6c 65 28 7a 46 69 6c 65 2c 26 73 54 61 62 File(zFile,&sTab
9130: 6c 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 le);. for(p=pLi
9140: 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 st; p; p=p->pNex
9150: 74 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 t){. int j;.
9160: 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 54 switch( p->eT
9170: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 ype ){. cas
9180: 65 20 54 54 5f 53 70 61 63 65 3a 0a 20 20 20 20 e TT_Space:.
9190: 20 20 20 20 70 72 69 6e 74 66 28 22 25 34 64 3a printf("%4d:
91a0: 20 53 70 61 63 65 5c 6e 22 2c 70 2d 3e 6e 4c 69 Space\n",p->nLi
91b0: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 ne);. bre
91c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 54 ak;. case T
91d0: 54 5f 49 64 3a 0a 20 20 20 20 20 20 20 20 70 72 T_Id:. pr
91e0: 69 6e 74 66 28 22 25 34 64 3a 20 49 64 20 20 20 intf("%4d: Id
91f0: 20 20 20 20 20 20 20 20 25 2e 2a 73 5c 6e 22 2c %.*s\n",
9200: 70 2d 3e 6e 4c 69 6e 65 2c 70 2d 3e 6e 54 65 78 p->nLine,p->nTex
9210: 74 2c 70 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 t,p->zText);.
9220: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
9230: 20 20 63 61 73 65 20 54 54 5f 50 72 65 70 72 6f case TT_Prepro
9240: 63 65 73 73 6f 72 3a 0a 20 20 20 20 20 20 20 20 cessor:.
9250: 70 72 69 6e 74 66 28 22 25 34 64 3a 20 50 72 65 printf("%4d: Pre
9260: 70 72 6f 63 65 73 73 6f 72 20 25 2e 2a 73 5c 6e processor %.*s\n
9270: 22 2c 70 2d 3e 6e 4c 69 6e 65 2c 70 2d 3e 6e 54 ",p->nLine,p->nT
9280: 65 78 74 2c 70 2d 3e 7a 54 65 78 74 29 3b 0a 20 ext,p->zText);.
9290: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
92a0: 20 20 20 20 63 61 73 65 20 54 54 5f 43 6f 6d 6d case TT_Comm
92b0: 65 6e 74 3a 0a 20 20 20 20 20 20 20 20 70 72 69 ent:. pri
92c0: 6e 74 66 28 22 25 34 64 3a 20 43 6f 6d 6d 65 6e ntf("%4d: Commen
92d0: 74 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 29 3b 0a t\n",p->nLine);.
92e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
92f0: 20 20 20 20 20 63 61 73 65 20 54 54 5f 42 6c 6f case TT_Blo
9300: 63 6b 43 6f 6d 6d 65 6e 74 3a 0a 20 20 20 20 20 ckComment:.
9310: 20 20 20 70 72 69 6e 74 66 28 22 25 34 64 3a 20 printf("%4d:
9320: 42 6c 6f 63 6b 20 43 6f 6d 6d 65 6e 74 5c 6e 22 Block Comment\n"
9330: 2c 70 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 ,p->nLine);.
9340: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
9350: 20 63 61 73 65 20 54 54 5f 4e 75 6d 62 65 72 3a case TT_Number:
9360: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 . printf(
9370: 22 25 34 64 3a 20 4e 75 6d 62 65 72 20 20 20 20 "%4d: Number
9380: 20 20 20 25 2e 2a 73 5c 6e 22 2c 70 2d 3e 6e 4c %.*s\n",p->nL
9390: 69 6e 65 2c 70 2d 3e 6e 54 65 78 74 2c 70 2d 3e ine,p->nText,p->
93a0: 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 zText);.
93b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 break;. cas
93c0: 65 20 54 54 5f 53 74 72 69 6e 67 3a 0a 20 20 20 e TT_String:.
93d0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 34 64 printf("%4d
93e0: 3a 20 53 74 72 69 6e 67 20 20 20 20 20 20 20 25 : String %
93f0: 2e 2a 73 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 2c .*s\n",p->nLine,
9400: 70 2d 3e 6e 54 65 78 74 2c 70 2d 3e 7a 54 65 78 p->nText,p->zTex
9410: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 t);. brea
9420: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 k;. case TT
9430: 5f 4f 74 68 65 72 3a 0a 20 20 20 20 20 20 20 20 _Other:.
9440: 70 72 69 6e 74 66 28 22 25 34 64 3a 20 4f 74 68 printf("%4d: Oth
9450: 65 72 20 20 20 20 20 20 20 20 25 2e 2a 73 5c 6e er %.*s\n
9460: 22 2c 70 2d 3e 6e 4c 69 6e 65 2c 70 2d 3e 6e 54 ",p->nLine,p->nT
9470: 65 78 74 2c 70 2d 3e 7a 54 65 78 74 29 3b 0a 20 ext,p->zText);.
9480: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
9490: 20 20 20 20 63 61 73 65 20 54 54 5f 42 72 61 63 case TT_Brac
94a0: 65 73 3a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 es:. for(
94b0: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 54 65 78 74 20 j=0; j<p->nText
94c0: 26 26 20 6a 3c 33 30 20 26 26 20 70 2d 3e 7a 54 && j<30 && p->zT
94d0: 65 78 74 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b ext[j]!='\n'; j+
94e0: 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 70 72 69 +){}. pri
94f0: 6e 74 66 28 22 25 34 64 3a 20 42 72 61 63 65 73 ntf("%4d: Braces
9500: 20 20 20 20 20 20 20 25 2e 2a 73 2e 2e 2e 7d 5c %.*s...}\
9510: 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 2c 6a 2c 70 2d n",p->nLine,j,p-
9520: 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 >zText);.
9530: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 break;. ca
9540: 73 65 20 54 54 5f 45 4f 46 3a 0a 20 20 20 20 20 se TT_EOF:.
9550: 20 20 20 70 72 69 6e 74 66 28 22 25 34 64 3a 20 printf("%4d:
9560: 45 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 70 End of file\n",p
9570: 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 ->nLine);.
9580: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 break;. d
9590: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 efault:.
95a0: 70 72 69 6e 74 66 28 22 25 34 64 3a 20 74 79 70 printf("%4d: typ
95b0: 65 20 25 64 5c 6e 22 2c 70 2d 3e 6e 4c 69 6e 65 e %d\n",p->nLine
95c0: 2c 70 2d 3e 65 54 79 70 65 29 3b 0a 20 20 20 20 ,p->eType);.
95d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
95e0: 0a 20 20 7d 0a 20 20 46 72 65 65 54 6f 6b 65 6e . }. FreeToken
95f0: 4c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 53 List(pList);. S
9600: 61 66 65 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a afeFree(zFile);.
9610: 20 20 49 64 65 6e 74 54 61 62 6c 65 50 72 69 6e IdentTablePrin
9620: 74 28 26 73 54 61 62 6c 65 2c 73 74 64 6f 75 74 t(&sTable,stdout
9630: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 );.}.#endif..#if
9640: 64 65 66 20 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 def DEBUG./*.**
9650: 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 For debugging pu
9660: 72 70 6f 73 65 73 2c 20 77 72 69 74 65 20 6f 75 rposes, write ou
9670: 74 20 61 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65 t a list of toke
9680: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f ns..*/.static vo
9690: 69 64 20 50 72 69 6e 74 54 6f 6b 65 6e 73 28 54 id PrintTokens(T
96a0: 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f oken *pFirst, To
96b0: 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 69 ken *pLast){. i
96c0: 6e 74 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30 nt needSpace = 0
96d0: 3b 0a 20 20 69 6e 74 20 63 3b 0a 0a 20 20 70 4c ;. int c;.. pL
96e0: 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70 4e 65 ast = pLast->pNe
96f0: 78 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 46 69 xt;. while( pFi
9700: 72 73 74 21 3d 70 4c 61 73 74 20 29 7b 0a 20 20 rst!=pLast ){.
9710: 20 20 73 77 69 74 63 68 28 20 70 46 69 72 73 74 switch( pFirst
9720: 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 ->eType ){.
9730: 20 63 61 73 65 20 54 54 5f 50 72 65 70 72 6f 63 case TT_Preproc
9740: 65 73 73 6f 72 3a 0a 20 20 20 20 20 20 20 20 70 essor:. p
9750: 72 69 6e 74 66 28 22 5c 6e 25 2e 2a 73 5c 6e 22 rintf("\n%.*s\n"
9760: 2c 70 46 69 72 73 74 2d 3e 6e 54 65 78 74 2c 70 ,pFirst->nText,p
9770: 46 69 72 73 74 2d 3e 7a 54 65 78 74 29 3b 0a 20 First->zText);.
9780: 20 20 20 20 20 20 20 6e 65 65 64 53 70 61 63 65 needSpace
9790: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 = 0;. br
97a0: 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 eak;.. case
97b0: 20 54 54 5f 49 64 3a 0a 20 20 20 20 20 20 63 61 TT_Id:. ca
97c0: 73 65 20 54 54 5f 4e 75 6d 62 65 72 3a 0a 20 20 se TT_Number:.
97d0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 printf("%s
97e0: 25 2e 2a 73 22 2c 20 6e 65 65 64 53 70 61 63 65 %.*s", needSpace
97f0: 20 3f 20 22 20 22 20 3a 20 22 22 2c 20 70 46 69 ? " " : "", pFi
9800: 72 73 74 2d 3e 6e 54 65 78 74 2c 20 70 46 69 72 rst->nText, pFir
9810: 73 74 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20 st->zText);.
9820: 20 20 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20 needSpace =
9830: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 1;. break
9840: 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 ;.. default
9850: 3a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 70 46 :. c = pF
9860: 69 72 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 3b 0a irst->zText[0];.
9870: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 printf("
9880: 25 73 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 %s%.*s",.
9890: 20 20 20 28 6e 65 65 64 53 70 61 63 65 20 26 26 (needSpace &&
98a0: 20 28 63 3d 3d 27 2a 27 20 7c 7c 20 63 3d 3d 27 (c=='*' || c=='
98b0: 7b 27 29 29 20 3f 20 22 20 22 20 3a 20 22 22 2c {')) ? " " : "",
98c0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 72 73 . pFirs
98d0: 74 2d 3e 6e 54 65 78 74 2c 20 70 46 69 72 73 74 t->nText, pFirst
98e0: 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 ->zText);.
98f0: 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20 70 46 needSpace = pF
9900: 69 72 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d irst->zText[0]==
9910: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 62 72 65 ',';. bre
9920: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 ak;. }. pF
9930: 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 irst = pFirst->p
9940: 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 Next;. }.}.#end
9950: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 if../*.** Conver
9960: 74 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 t a sequence of
9970: 74 6f 6b 65 6e 73 20 69 6e 74 6f 20 61 20 73 74 tokens into a st
9980: 72 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 ring and return
9990: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 a pointer.** to
99a0: 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20 53 70 that string. Sp
99b0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 ace to hold the
99c0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e string is obtain
99d0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 ed from malloc()
99e0: 0a 2a 2a 20 61 6e 64 20 6d 75 73 74 20 62 65 20 .** and must be
99f0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c freed by the cal
9a00: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a ling function..*
9a10: 2a 0a 2a 2a 20 43 65 72 74 61 69 6e 20 6b 65 79 *.** Certain key
9a20: 77 6f 72 64 73 20 28 45 58 50 4f 52 54 2c 20 50 words (EXPORT, P
9a30: 52 49 56 41 54 45 2c 20 50 55 42 4c 49 43 2c 20 RIVATE, PUBLIC,
9a40: 50 52 4f 54 45 43 54 45 44 29 20 61 72 65 20 61 PROTECTED) are a
9a50: 6c 77 61 79 73 0a 2a 2a 20 73 6b 69 70 70 65 64 lways.** skipped
9a60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 6b 69 70 ..**.** If pSkip
9a70: 21 3d 30 20 74 68 65 6e 20 73 6b 69 70 20 6f 76 !=0 then skip ov
9a80: 65 72 20 6e 53 6b 69 70 20 74 6f 6b 65 6e 73 20 er nSkip tokens
9a90: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 70 beginning with p
9aa0: 53 6b 69 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a Skip..**.** If z
9ab0: 54 65 72 6d 21 3d 30 20 74 68 65 6e 20 61 70 70 Term!=0 then app
9ac0: 65 6e 64 20 74 68 65 20 74 65 78 74 20 74 6f 20 end the text to
9ad0: 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 the end..*/.stat
9ae0: 69 63 20 63 68 61 72 20 2a 54 6f 6b 65 6e 73 54 ic char *TokensT
9af0: 6f 53 74 72 69 6e 67 28 0a 20 20 54 6f 6b 65 6e oString(. Token
9b00: 20 2a 70 46 69 72 73 74 2c 20 20 20 20 2f 2a 20 *pFirst, /*
9b10: 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 6e 20 74 First token in t
9b20: 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 54 he string */. T
9b30: 6f 6b 65 6e 20 2a 70 4c 61 73 74 2c 20 20 20 20 oken *pLast,
9b40: 20 2f 2a 20 4c 61 73 74 20 74 6f 6b 65 6e 20 69 /* Last token i
9b50: 6e 20 74 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a n the string */.
9b60: 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 char *zTerm,
9b70: 20 20 20 20 2f 2a 20 54 65 72 6d 69 6e 61 74 65 /* Terminate
9b80: 20 74 68 65 20 73 74 72 69 6e 67 20 77 69 74 68 the string with
9b90: 20 74 68 69 73 20 74 65 78 74 20 69 66 20 6e 6f this text if no
9ba0: 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 t NULL */. Toke
9bb0: 6e 20 2a 70 53 6b 69 70 2c 20 20 20 20 20 2f 2a n *pSkip, /*
9bc0: 20 53 6b 69 70 20 74 68 69 73 20 74 6f 6b 65 6e Skip this token
9bd0: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a if not NULL */.
9be0: 20 20 69 6e 74 20 6e 53 6b 69 70 20 20 20 20 20 int nSkip
9bf0: 20 20 20 20 2f 2a 20 53 6b 69 70 20 61 20 74 6f /* Skip a to
9c00: 74 61 6c 20 6f 66 20 74 68 69 73 20 6d 61 6e 79 tal of this many
9c10: 20 74 6f 6b 65 6e 73 20 2a 2f 0a 29 7b 0a 20 20 tokens */.){.
9c20: 63 68 61 72 20 2a 7a 52 65 74 75 72 6e 3b 0a 20 char *zReturn;.
9c30: 20 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 String str;. i
9c40: 6e 74 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30 nt needSpace = 0
9c50: 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 ;. int c;. int
9c60: 20 69 53 6b 69 70 20 3d 20 30 3b 0a 20 20 69 6e iSkip = 0;. in
9c70: 74 20 73 6b 69 70 4f 6e 65 20 3d 20 30 3b 0a 0a t skipOne = 0;..
9c80: 20 20 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 StringInit(&st
9c90: 72 29 3b 0a 20 20 70 4c 61 73 74 20 3d 20 70 4c r);. pLast = pL
9ca0: 61 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 77 68 ast->pNext;. wh
9cb0: 69 6c 65 28 20 70 46 69 72 73 74 21 3d 70 4c 61 ile( pFirst!=pLa
9cc0: 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 st ){. if( pF
9cd0: 69 72 73 74 3d 3d 70 53 6b 69 70 20 29 7b 20 69 irst==pSkip ){ i
9ce0: 53 6b 69 70 20 3d 20 6e 53 6b 69 70 3b 20 7d 0a Skip = nSkip; }.
9cf0: 20 20 20 20 69 66 28 20 69 53 6b 69 70 3e 30 20 if( iSkip>0
9d00: 29 7b 0a 20 20 20 20 20 20 69 53 6b 69 70 2d 2d ){. iSkip--
9d10: 3b 0a 20 20 20 20 20 20 70 46 69 72 73 74 3d 70 ;. pFirst=p
9d20: 46 69 72 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 First->pNext;.
9d30: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 continue;.
9d40: 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 }. switch(
9d50: 70 46 69 72 73 74 2d 3e 65 54 79 70 65 20 29 7b pFirst->eType ){
9d60: 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f 50 . case TT_P
9d70: 72 65 70 72 6f 63 65 73 73 6f 72 3a 0a 20 20 20 reprocessor:.
9d80: 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e StringAppen
9d90: 64 28 26 73 74 72 2c 22 5c 6e 22 2c 31 29 3b 0a d(&str,"\n",1);.
9da0: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 41 70 StringAp
9db0: 70 65 6e 64 28 26 73 74 72 2c 70 46 69 72 73 74 pend(&str,pFirst
9dc0: 2d 3e 7a 54 65 78 74 2c 70 46 69 72 73 74 2d 3e ->zText,pFirst->
9dd0: 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 nText);.
9de0: 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 StringAppend(&st
9df0: 72 2c 22 5c 6e 22 2c 31 29 3b 0a 20 20 20 20 20 r,"\n",1);.
9e00: 20 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30 needSpace = 0
9e10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
9e20: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 54 54 5f .. case TT_
9e30: 49 64 3a 0a 20 20 20 20 20 20 20 20 73 77 69 74 Id:. swit
9e40: 63 68 28 20 70 46 69 72 73 74 2d 3e 7a 54 65 78 ch( pFirst->zTex
9e50: 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 t[0] ){.
9e60: 20 20 63 61 73 65 20 27 45 27 3a 0a 20 20 20 20 case 'E':.
9e70: 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 72 if( pFir
9e80: 73 74 2d 3e 6e 54 65 78 74 3d 3d 36 20 26 26 20 st->nText==6 &&
9e90: 73 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e strncmp(pFirst->
9ea0: 7a 54 65 78 74 2c 22 45 58 50 4f 52 54 22 2c 36 zText,"EXPORT",6
9eb0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 )==0 ){.
9ec0: 20 20 20 20 20 20 73 6b 69 70 4f 6e 65 20 3d 20 skipOne =
9ed0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 1;. }
9ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 . bre
9ef0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 ak;. ca
9f00: 73 65 20 27 50 27 3a 0a 20 20 20 20 20 20 20 20 se 'P':.
9f10: 20 20 20 20 73 77 69 74 63 68 28 20 70 46 69 72 switch( pFir
9f20: 73 74 2d 3e 6e 54 65 78 74 20 29 7b 0a 20 20 20 st->nText ){.
9f30: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 case
9f40: 36 3a 20 20 73 6b 69 70 4f 6e 65 20 3d 20 21 73 6: skipOne = !s
9f50: 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e 7a trncmp(pFirst->z
9f60: 54 65 78 74 2c 22 50 55 42 4c 49 43 22 2c 20 36 Text,"PUBLIC", 6
9f70: 29 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 ); break;.
9f80: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 case
9f90: 37 3a 20 20 73 6b 69 70 4f 6e 65 20 3d 20 21 73 7: skipOne = !s
9fa0: 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e 7a trncmp(pFirst->z
9fb0: 54 65 78 74 2c 22 50 52 49 56 41 54 45 22 2c 37 Text,"PRIVATE",7
9fc0: 29 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 ); break;.
9fd0: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 case
9fe0: 39 3a 20 20 73 6b 69 70 4f 6e 65 20 3d 20 21 73 9: skipOne = !s
9ff0: 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e 7a trncmp(pFirst->z
a000: 54 65 78 74 2c 22 50 52 4f 54 45 43 54 45 44 22 Text,"PROTECTED"
a010: 2c 39 29 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 ,9); break;.
a020: 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 defau
a030: 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 lt: break;.
a040: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
a050: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
a060: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 default:.
a070: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b break
a080: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
a090: 20 20 20 20 69 66 28 20 73 6b 69 70 4f 6e 65 20 if( skipOne
a0a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 ){. pFi
a0b0: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 4e rst = pFirst->pN
a0c0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 ext;. c
a0d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 ontinue;.
a0e0: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 }. /* Fa
a0f0: 6c 6c 20 74 68 72 75 20 74 6f 20 74 68 65 20 6e ll thru to the n
a100: 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 ext case */.
a110: 20 20 63 61 73 65 20 54 54 5f 4e 75 6d 62 65 72 case TT_Number
a120: 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 :. if( ne
a130: 65 64 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 edSpace ){.
a140: 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e StringAppen
a150: 64 28 26 73 74 72 2c 22 20 22 2c 31 29 3b 0a 20 d(&str," ",1);.
a160: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
a170: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 StringAppend(&s
a180: 74 72 2c 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 tr,pFirst->zText
a190: 2c 70 46 69 72 73 74 2d 3e 6e 54 65 78 74 29 3b ,pFirst->nText);
a1a0: 0a 20 20 20 20 20 20 20 20 6e 65 65 64 53 70 61 . needSpa
a1b0: 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 ce = 1;.
a1c0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 break;.. de
a1d0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 63 fault:. c
a1e0: 20 3d 20 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 = pFirst->zText
a1f0: 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 [0];. if(
a200: 20 6e 65 65 64 53 70 61 63 65 20 26 26 20 28 63 needSpace && (c
a210: 3d 3d 27 2a 27 20 7c 7c 20 63 3d 3d 27 7b 27 29 =='*' || c=='{')
a220: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 74 ){. St
a230: 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c ringAppend(&str,
a240: 22 20 22 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 " ",1);.
a250: 7d 0a 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 }. String
a260: 41 70 70 65 6e 64 28 26 73 74 72 2c 70 46 69 72 Append(&str,pFir
a270: 73 74 2d 3e 7a 54 65 78 74 2c 70 46 69 72 73 74 st->zText,pFirst
a280: 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20 ->nText);.
a290: 20 20 2f 2a 20 6e 65 65 64 53 70 61 63 65 20 3d /* needSpace =
a2a0: 20 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 5b 30 pFirst->zText[0
a2b0: 5d 3d 3d 27 2c 27 3b 20 2a 2f 0a 20 20 20 20 20 ]==','; */.
a2c0: 20 20 20 6e 65 65 64 53 70 61 63 65 20 3d 20 30 needSpace = 0
a2d0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
a2e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 72 73 . }. pFirs
a2f0: 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 4e 65 78 t = pFirst->pNex
a300: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 65 t;. }. if( zTe
a310: 72 6d 20 26 26 20 2a 7a 54 65 72 6d 20 29 7b 0a rm && *zTerm ){.
a320: 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 StringAppend
a330: 28 26 73 74 72 2c 7a 54 65 72 6d 2c 73 74 72 6c (&str,zTerm,strl
a340: 65 6e 28 7a 54 65 72 6d 29 29 3b 0a 20 20 7d 0a en(zTerm));. }.
a350: 20 20 7a 52 65 74 75 72 6e 20 3d 20 53 74 72 44 zReturn = StrD
a360: 75 70 28 53 74 72 69 6e 67 47 65 74 28 26 73 74 up(StringGet(&st
a370: 72 29 2c 30 29 3b 0a 20 20 53 74 72 69 6e 67 52 r),0);. StringR
a380: 65 73 65 74 28 26 73 74 72 29 3b 0a 20 20 72 65 eset(&str);. re
a390: 74 75 72 6e 20 7a 52 65 74 75 72 6e 3b 0a 7d 0a turn zReturn;.}.
a3a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 ./*.** This rout
a3b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 ine is called wh
a3c0: 65 6e 20 77 65 20 73 65 65 20 6f 6e 65 20 6f 66 en we see one of
a3d0: 20 74 68 65 20 6b 65 79 77 6f 72 64 73 20 22 73 the keywords "s
a3e0: 74 72 75 63 74 22 2c 0a 2a 2a 20 22 65 6e 75 6d truct",.** "enum
a3f0: 22 2c 20 22 75 6e 69 6f 6e 22 20 6f 72 20 22 63 ", "union" or "c
a400: 6c 61 73 73 22 2e 20 20 54 68 69 73 20 6d 69 67 lass". This mig
a410: 68 74 20 62 65 20 74 68 65 20 62 65 67 69 6e 6e ht be the beginn
a420: 69 6e 67 20 6f 66 20 61 0a 2a 2a 20 74 79 70 65 ing of a.** type
a430: 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 20 54 declaration. T
a440: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c his routine will
a450: 20 70 72 6f 63 65 73 73 20 74 68 65 20 64 65 63 process the dec
a460: 6c 61 72 61 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 laration and.**
a470: 72 65 6d 6f 76 65 20 74 68 65 20 64 65 63 6c 61 remove the decla
a480: 72 61 74 69 6f 6e 20 74 6f 6b 65 6e 73 20 66 72 ration tokens fr
a490: 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 om the input str
a4a0: 65 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 eam..**.** If th
a4b0: 69 73 20 69 73 20 61 20 74 79 70 65 20 64 65 63 is is a type dec
a4c0: 6c 61 72 61 74 69 6f 6e 20 74 68 61 74 20 69 73 laration that is
a4d0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c immediately fol
a4e0: 6c 6f 77 65 64 20 62 79 20 61 0a 2a 2a 20 73 65 lowed by a.** se
a4f0: 6d 69 63 6f 6c 6f 6e 20 28 69 6e 20 6f 74 68 65 micolon (in othe
a500: 72 20 77 6f 72 64 73 20 69 74 20 69 73 6e 27 74 r words it isn't
a510: 20 61 6c 73 6f 20 61 20 76 61 72 69 61 62 6c 65 also a variable
a520: 20 64 65 66 69 6e 69 74 69 6f 6e 29 0a 2a 2a 20 definition).**
a530: 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 65 74 then set *pReset
a540: 20 74 6f 20 27 3b 27 2e 20 20 4f 74 68 65 72 77 to ';'. Otherw
a550: 69 73 65 20 6c 65 61 76 65 20 2a 70 52 65 73 65 ise leave *pRese
a560: 74 20 61 74 20 30 2e 20 20 54 68 65 0a 2a 2a 20 t at 0. The.**
a570: 2a 70 52 65 73 65 74 20 66 6c 61 67 20 63 61 75 *pReset flag cau
a580: 73 65 73 20 74 68 65 20 70 61 72 73 65 72 20 74 ses the parser t
a590: 6f 20 73 6b 69 70 20 61 68 65 61 64 20 74 6f 20 o skip ahead to
a5a0: 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 0a 2a the next token.*
a5b0: 2a 20 74 68 61 74 20 62 65 67 69 6e 73 20 77 69 * that begins wi
a5c0: 74 68 20 74 68 65 20 76 61 6c 75 65 20 70 6c 61 th the value pla
a5d0: 63 65 64 20 69 6e 20 74 68 65 20 2a 70 52 65 73 ced in the *pRes
a5e0: 65 74 20 66 6c 61 67 2c 20 69 66 20 74 68 61 74 et flag, if that
a5f0: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 64 69 66 .** value is dif
a600: 66 65 72 65 6e 74 20 66 72 6f 6d 20 30 2e 0a 2a ferent from 0..*
a610: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 50 72 6f /.static int Pro
a620: 63 65 73 73 54 79 70 65 44 65 63 6c 28 54 6f 6b cessTypeDecl(Tok
a630: 65 6e 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 66 en *pList, int f
a640: 6c 61 67 73 2c 20 69 6e 74 20 2a 70 52 65 73 65 lags, int *pRese
a650: 74 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 t){. Token *pNa
a660: 6d 65 2c 20 2a 70 45 6e 64 3b 0a 20 20 44 65 63 me, *pEnd;. Dec
a670: 6c 20 2a 70 44 65 63 6c 3b 0a 20 20 53 74 72 69 l *pDecl;. Stri
a680: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 6e 65 ng str;. int ne
a690: 65 64 5f 74 6f 5f 63 6f 6c 6c 61 70 73 65 20 3d ed_to_collapse =
a6a0: 20 31 3b 0a 20 20 69 6e 74 20 74 79 70 65 20 3d 1;. int type =
a6b0: 20 30 3b 0a 0a 20 20 2a 70 52 65 73 65 74 20 3d 0;.. *pReset =
a6c0: 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 0;. if( pList=
a6d0: 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 4e 65 =0 || pList->pNe
a6e0: 78 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e xt==0 || pList->
a6f0: 70 4e 65 78 74 2d 3e 65 54 79 70 65 21 3d 54 54 pNext->eType!=TT
a700: 5f 49 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 _Id ){. retur
a710: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 61 6d 65 n 0;. }. pName
a720: 20 3d 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b = pList->pNext;
a730: 0a 0a 20 20 2f 2a 20 43 61 74 63 68 20 74 68 65 .. /* Catch the
a740: 20 63 61 73 65 20 6f 66 20 22 73 74 72 75 63 74 case of "struct
a750: 20 46 6f 6f 3b 22 20 61 6e 64 20 73 6b 69 70 20 Foo;" and skip
a760: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 it. */. if( pNa
a770: 6d 65 2d 3e 70 4e 65 78 74 20 26 26 20 70 4e 61 me->pNext && pNa
a780: 6d 65 2d 3e 70 4e 65 78 74 2d 3e 7a 54 65 78 74 me->pNext->zText
a790: 5b 30 5d 3d 3d 27 3b 27 20 29 7b 0a 20 20 20 20 [0]==';' ){.
a7a0: 2a 70 52 65 73 65 74 20 3d 20 27 3b 27 3b 0a 20 *pReset = ';';.
a7b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d return 0;. }
a7c0: 0a 0a 20 20 66 6f 72 28 70 45 6e 64 3d 70 4e 61 .. for(pEnd=pNa
a7d0: 6d 65 2d 3e 70 4e 65 78 74 3b 20 70 45 6e 64 20 me->pNext; pEnd
a7e0: 26 26 20 70 45 6e 64 2d 3e 65 54 79 70 65 21 3d && pEnd->eType!=
a7f0: 54 54 5f 42 72 61 63 65 73 3b 20 70 45 6e 64 3d TT_Braces; pEnd=
a800: 70 45 6e 64 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 pEnd->pNext){.
a810: 20 20 73 77 69 74 63 68 28 20 70 45 6e 64 2d 3e switch( pEnd->
a820: 7a 54 65 78 74 5b 30 5d 20 29 7b 0a 20 20 20 20 zText[0] ){.
a830: 20 20 63 61 73 65 20 27 28 27 3a 0a 20 20 20 20 case '(':.
a840: 20 20 63 61 73 65 20 27 2a 27 3a 0a 20 20 20 20 case '*':.
a850: 20 20 63 61 73 65 20 27 5b 27 3a 0a 20 20 20 20 case '[':.
a860: 20 20 63 61 73 65 20 27 3d 27 3a 0a 20 20 20 20 case '=':.
a870: 20 20 63 61 73 65 20 27 3b 27 3a 0a 20 20 20 20 case ';':.
a880: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
a890: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 }. }. if( pE
a8a0: 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 nd==0 ){. ret
a8b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a urn 0;. }.. /*
a8c0: 0a 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f . ** At this po
a8d0: 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 77 65 20 int, we know we
a8e0: 68 61 76 65 20 61 20 74 79 70 65 20 64 65 63 6c have a type decl
a8f0: 61 72 61 74 69 6f 6e 20 74 68 61 74 20 69 73 20 aration that is
a900: 62 6f 75 6e 64 65 64 0a 20 20 2a 2a 20 62 79 20 bounded. ** by
a910: 70 4c 69 73 74 20 61 6e 64 20 70 45 6e 64 20 61 pList and pEnd a
a920: 6e 64 20 68 61 73 20 74 68 65 20 6e 61 6d 65 20 nd has the name
a930: 70 4e 61 6d 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f pName.. */.. /
a940: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 62 72 *. ** If the br
a950: 61 63 65 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 aces are followe
a960: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 79 d immediately by
a970: 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 2c 20 74 68 a semicolon, th
a980: 65 6e 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 en we are. ** d
a990: 65 61 6c 69 6e 67 20 61 20 74 79 70 65 20 64 65 ealing a type de
a9a0: 63 6c 61 72 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 claration only.
a9b0: 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20 76 61 There is not va
a9c0: 72 69 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f riable definitio
a9d0: 6e 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 n. ** following
a9e0: 20 74 68 65 20 74 79 70 65 20 64 65 63 6c 61 72 the type declar
a9f0: 61 74 69 6f 6e 2e 20 20 53 6f 20 72 65 73 65 74 ation. So reset
aa00: 2e 2e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 .... */. if( p
aa10: 45 6e 64 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c End->pNext==0 ||
aa20: 20 70 45 6e 64 2d 3e 70 4e 65 78 74 2d 3e 7a 54 pEnd->pNext->zT
aa30: 65 78 74 5b 30 5d 3d 3d 27 3b 27 20 29 7b 0a 20 ext[0]==';' ){.
aa40: 20 20 20 2a 70 52 65 73 65 74 20 3d 20 27 3b 27 *pReset = ';'
aa50: 3b 0a 20 20 20 20 6e 65 65 64 5f 74 6f 5f 63 6f ;. need_to_co
aa60: 6c 6c 61 70 73 65 20 3d 20 30 3b 0a 20 20 7d 65 llapse = 0;. }e
aa70: 6c 73 65 7b 0a 20 20 20 20 6e 65 65 64 5f 74 6f lse{. need_to
aa80: 5f 63 6f 6c 6c 61 70 73 65 20 3d 20 31 3b 0a 20 _collapse = 1;.
aa90: 20 7d 0a 0a 20 20 69 66 28 20 70 72 6f 74 6f 5f }.. if( proto_
aaa0: 73 74 61 74 69 63 3d 3d 30 20 26 26 20 28 66 6c static==0 && (fl
aab0: 61 67 73 20 26 20 28 50 53 5f 4c 6f 63 61 6c 7c ags & (PS_Local|
aac0: 50 53 5f 45 78 70 6f 72 74 7c 50 53 5f 49 6e 74 PS_Export|PS_Int
aad0: 65 72 66 61 63 65 29 29 3d 3d 30 20 29 7b 0a 20 erface))==0 ){.
aae0: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 /* Ignore the
aaf0: 73 65 20 6f 62 6a 65 63 74 73 20 75 6e 6c 65 73 se objects unles
ab00: 73 20 74 68 65 79 20 61 72 65 20 65 78 70 6c 69 s they are expli
ab10: 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 61 citly declared a
ab20: 73 20 69 6e 74 65 72 66 61 63 65 2c 0a 20 20 20 s interface,.
ab30: 20 2a 2a 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 ** or unless th
ab40: 65 20 22 2d 6c 6f 63 61 6c 22 20 63 6f 6d 6d 61 e "-local" comma
ab50: 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 77 nd line option w
ab60: 61 73 20 73 70 65 63 69 66 69 65 64 2e 20 2a 2f as specified. */
ab70: 0a 20 20 20 20 2a 70 52 65 73 65 74 20 3d 20 27 . *pReset = '
ab80: 3b 27 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ;';. return 0
ab90: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 44 45 ;. }..#ifdef DE
aba0: 42 55 47 0a 20 20 69 66 28 20 64 65 62 75 67 4d BUG. if( debugM
abb0: 61 73 6b 20 26 20 50 41 52 53 45 52 20 29 7b 0a ask & PARSER ){.
abc0: 20 20 20 20 70 72 69 6e 74 66 28 22 2a 2a 2a 2a printf("****
abd0: 20 46 6f 75 6e 64 20 74 79 70 65 3a 20 25 2e 2a Found type: %.*
abe0: 73 20 25 2e 2a 73 2e 2e 2e 5c 6e 22 2c 0a 20 20 s %.*s...\n",.
abf0: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 pList->nText
ac00: 2c 20 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 20 , pList->zText,
ac10: 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 2c 20 70 4e pName->nText, pN
ac20: 61 6d 65 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20 ame->zText);.
ac30: 20 50 72 69 6e 74 54 6f 6b 65 6e 73 28 70 4c 69 PrintTokens(pLi
ac40: 73 74 2c 70 45 6e 64 29 3b 0a 20 20 20 20 70 72 st,pEnd);. pr
ac50: 69 6e 74 66 28 22 3b 5c 6e 22 29 3b 0a 20 20 7d intf(";\n");. }
ac60: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 .#endif.. /*.
ac70: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 ** Create a new
ac80: 44 65 63 6c 20 6f 62 6a 65 63 74 20 66 6f 72 20 Decl object for
ac90: 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e this definition.
aca0: 20 20 41 63 74 75 61 6c 6c 79 2c 20 69 66 20 74 Actually, if t
acb0: 68 69 73 0a 20 20 2a 2a 20 69 73 20 61 20 43 2b his. ** is a C+
acc0: 2b 20 63 6c 61 73 73 20 64 65 66 69 6e 69 74 69 + class definiti
acd0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 44 65 63 on, then the Dec
ace0: 6c 20 6f 62 6a 65 63 74 20 6d 69 67 68 74 20 61 l object might a
acf0: 6c 72 65 61 64 79 20 65 78 69 73 74 2c 0a 20 20 lready exist,.
ad00: 2a 2a 20 73 6f 20 63 68 65 63 6b 20 66 69 72 73 ** so check firs
ad10: 74 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 t for that case
ad20: 62 65 66 6f 72 65 20 63 72 65 61 74 69 6e 67 20 before creating
ad30: 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a a new one.. */.
ad40: 20 20 73 77 69 74 63 68 28 20 2a 70 4c 69 73 74 switch( *pList
ad50: 2d 3e 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 63 ->zText ){. c
ad60: 61 73 65 20 27 63 27 3a 20 20 74 79 70 65 20 3d ase 'c': type =
ad70: 20 54 59 5f 43 6c 61 73 73 3b 20 20 20 20 20 20 TY_Class;
ad80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 break;. cas
ad90: 65 20 27 73 27 3a 20 20 74 79 70 65 20 3d 20 54 e 's': type = T
ada0: 59 5f 53 74 72 75 63 74 75 72 65 3b 20 20 20 20 Y_Structure;
adb0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
adc0: 27 65 27 3a 20 20 74 79 70 65 20 3d 20 54 59 5f 'e': type = TY_
add0: 45 6e 75 6d 65 72 61 74 69 6f 6e 3b 20 20 62 72 Enumeration; br
ade0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 75 eak;. case 'u
adf0: 27 3a 20 20 74 79 70 65 20 3d 20 54 59 5f 55 6e ': type = TY_Un
ae00: 69 6f 6e 3b 20 20 20 20 20 20 20 20 62 72 65 61 ion; brea
ae10: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 k;. default:
ae20: 20 20 2f 2a 20 43 61 6e 27 74 20 48 61 70 70 65 /* Can't Happe
ae30: 6e 20 2a 2f 20 20 20 20 20 20 62 72 65 61 6b 3b n */ break;
ae40: 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 21 . }. if( type!
ae50: 3d 54 59 5f 43 6c 61 73 73 20 29 7b 0a 20 20 20 =TY_Class ){.
ae60: 20 70 44 65 63 6c 20 3d 20 30 3b 0a 20 20 7d 65 pDecl = 0;. }e
ae70: 6c 73 65 7b 0a 20 20 20 20 70 44 65 63 6c 20 3d lse{. pDecl =
ae80: 20 46 69 6e 64 44 65 63 6c 28 70 4e 61 6d 65 2d FindDecl(pName-
ae90: 3e 7a 54 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 6e >zText, pName->n
aea0: 54 65 78 74 29 3b 0a 20 20 20 20 69 66 28 20 70 Text);. if( p
aeb0: 44 65 63 6c 20 26 26 20 28 70 44 65 63 6c 2d 3e Decl && (pDecl->
aec0: 66 6c 61 67 73 20 26 20 74 79 70 65 29 21 3d 74 flags & type)!=t
aed0: 79 70 65 20 29 20 70 44 65 63 6c 20 3d 20 30 3b ype ) pDecl = 0;
aee0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 63 6c . }. if( pDecl
aef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 65 63 6c ==0 ){. pDecl
af00: 20 3d 20 43 72 65 61 74 65 44 65 63 6c 28 70 4e = CreateDecl(pN
af10: 61 6d 65 2d 3e 7a 54 65 78 74 2c 70 4e 61 6d 65 ame->zText,pName
af20: 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 ->nText);. }.
af30: 69 66 28 20 28 66 6c 61 67 73 20 26 20 50 53 5f if( (flags & PS_
af40: 53 74 61 74 69 63 29 20 7c 7c 20 21 28 66 6c 61 Static) || !(fla
af50: 67 73 20 26 20 28 50 53 5f 49 6e 74 65 72 66 61 gs & (PS_Interfa
af60: 63 65 7c 50 53 5f 45 78 70 6f 72 74 29 29 20 29 ce|PS_Export)) )
af70: 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f {. DeclSetPro
af80: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 4c perty(pDecl,DP_L
af90: 6f 63 61 6c 29 3b 0a 20 20 7d 0a 20 20 44 65 63 ocal);. }. Dec
afa0: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 lSetProperty(pDe
afb0: 63 6c 2c 74 79 70 65 29 3b 0a 0a 20 20 2f 2a 20 cl,type);.. /*
afc0: 54 68 65 20 6f 62 6a 65 63 74 20 68 61 73 20 61 The object has a
afd0: 20 66 75 6c 6c 20 64 65 63 6c 61 72 61 74 69 6f full declaratio
afe0: 6e 20 6f 6e 6c 79 20 69 66 20 69 74 20 69 73 20 n only if it is
aff0: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e contained within
b000: 0a 20 20 2a 2a 20 22 23 69 66 20 49 4e 54 45 52 . ** "#if INTER
b010: 46 41 43 45 2e 2e 2e 23 65 6e 64 69 66 22 20 6f FACE...#endif" o
b020: 72 20 22 23 69 66 20 45 58 50 4f 52 54 5f 49 4e r "#if EXPORT_IN
b030: 54 45 52 46 41 43 45 2e 2e 2e 23 65 6e 64 69 66 TERFACE...#endif
b040: 22 20 6f 72 0a 20 20 2a 2a 20 22 23 69 66 20 4c " or. ** "#if L
b050: 4f 43 41 4c 5f 49 4e 54 45 52 46 41 43 45 2e 2e OCAL_INTERFACE..
b060: 2e 23 65 6e 64 69 66 22 2e 20 20 4f 74 68 65 72 .#endif". Other
b070: 77 69 73 65 2c 20 77 65 20 6f 6e 6c 79 20 67 69 wise, we only gi
b080: 76 65 20 69 74 20 61 0a 20 20 2a 2a 20 66 6f 72 ve it a. ** for
b090: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e ward declaration
b0a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 6c 61 .. */. if( fla
b0b0: 67 73 20 26 20 28 50 53 5f 4c 6f 63 61 6c 20 7c gs & (PS_Local |
b0c0: 20 50 53 5f 45 78 70 6f 72 74 20 7c 20 50 53 5f PS_Export | PS_
b0d0: 49 6e 74 65 72 66 61 63 65 29 20 20 29 7b 0a 20 Interface) ){.
b0e0: 20 20 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 20 pDecl->zDecl
b0f0: 3d 20 54 6f 6b 65 6e 73 54 6f 53 74 72 69 6e 67 = TokensToString
b100: 28 70 4c 69 73 74 2c 70 45 6e 64 2c 22 3b 5c 6e (pList,pEnd,";\n
b110: 22 2c 30 2c 30 29 3b 0a 20 20 7d 65 6c 73 65 7b ",0,0);. }else{
b120: 0a 20 20 20 20 70 44 65 63 6c 2d 3e 7a 44 65 63 . pDecl->zDec
b130: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 44 65 l = 0;. }. pDe
b140: 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20 3d 20 70 cl->pComment = p
b150: 4c 69 73 74 2d 3e 70 43 6f 6d 6d 65 6e 74 3b 0a List->pComment;.
b160: 20 20 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 StringInit(&st
b170: 72 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70 65 r);. StringAppe
b180: 6e 64 28 26 73 74 72 2c 22 74 79 70 65 64 65 66 nd(&str,"typedef
b190: 20 22 2c 30 29 3b 0a 20 20 53 74 72 69 6e 67 41 ",0);. StringA
b1a0: 70 70 65 6e 64 28 26 73 74 72 2c 70 4c 69 73 74 ppend(&str,pList
b1b0: 2d 3e 7a 54 65 78 74 2c 70 4c 69 73 74 2d 3e 6e ->zText,pList->n
b1c0: 54 65 78 74 29 3b 0a 20 20 53 74 72 69 6e 67 41 Text);. StringA
b1d0: 70 70 65 6e 64 28 26 73 74 72 2c 22 20 22 2c 30 ppend(&str," ",0
b1e0: 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70 65 6e );. StringAppen
b1f0: 64 28 26 73 74 72 2c 70 4e 61 6d 65 2d 3e 7a 54 d(&str,pName->zT
b200: 65 78 74 2c 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 ext,pName->nText
b210: 29 3b 0a 20 20 53 74 72 69 6e 67 41 70 70 65 6e );. StringAppen
b220: 64 28 26 73 74 72 2c 22 20 22 2c 30 29 3b 0a 20 d(&str," ",0);.
b230: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 StringAppend(&s
b240: 74 72 2c 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c tr,pName->zText,
b250: 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 29 3b 0a 20 pName->nText);.
b260: 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 StringAppend(&s
b270: 74 72 2c 22 3b 5c 6e 22 2c 32 29 3b 0a 20 20 70 tr,";\n",2);. p
b280: 44 65 63 6c 2d 3e 7a 46 77 64 20 3d 20 53 74 72 Decl->zFwd = Str
b290: 44 75 70 28 53 74 72 69 6e 67 47 65 74 28 26 73 Dup(StringGet(&s
b2a0: 74 72 29 2c 30 29 3b 0a 20 20 53 74 72 69 6e 67 tr),0);. String
b2b0: 52 65 73 65 74 28 26 73 74 72 29 3b 0a 20 20 53 Reset(&str);. S
b2c0: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b tringInit(&str);
b2d0: 0a 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 . StringAppend(
b2e0: 26 73 74 72 2c 70 4c 69 73 74 2d 3e 7a 54 65 78 &str,pList->zTex
b2f0: 74 2c 70 4c 69 73 74 2d 3e 6e 54 65 78 74 29 3b t,pList->nText);
b300: 0a 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 . StringAppend(
b310: 26 73 74 72 2c 22 20 22 2c 30 29 3b 0a 20 20 53 &str," ",0);. S
b320: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 tringAppend(&str
b330: 2c 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 70 4e ,pName->zText,pN
b340: 61 6d 65 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 53 ame->nText);. S
b350: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 tringAppend(&str
b360: 2c 22 3b 5c 6e 22 2c 32 29 3b 0a 20 20 70 44 65 ,";\n",2);. pDe
b370: 63 6c 2d 3e 7a 46 77 64 43 70 70 20 3d 20 53 74 cl->zFwdCpp = St
b380: 72 44 75 70 28 53 74 72 69 6e 67 47 65 74 28 26 rDup(StringGet(&
b390: 73 74 72 29 2c 30 29 3b 0a 20 20 53 74 72 69 6e str),0);. Strin
b3a0: 67 52 65 73 65 74 28 26 73 74 72 29 3b 0a 20 20 gReset(&str);.
b3b0: 69 66 28 20 66 6c 61 67 73 20 26 20 50 53 5f 45 if( flags & PS_E
b3c0: 78 70 6f 72 74 20 29 7b 0a 20 20 20 20 44 65 63 xport ){. Dec
b3d0: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 lSetProperty(pDe
b3e0: 63 6c 2c 44 50 5f 45 78 70 6f 72 74 29 3b 0a 20 cl,DP_Export);.
b3f0: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 }else if( flags
b400: 20 26 20 50 53 5f 4c 6f 63 61 6c 20 29 7b 0a 20 & PS_Local ){.
b410: 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72 DeclSetProper
b420: 74 79 28 70 44 65 63 6c 2c 44 50 5f 4c 6f 63 61 ty(pDecl,DP_Loca
b430: 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 48 65 l);. }.. /* He
b440: 72 65 27 73 20 73 6f 6d 65 74 68 69 6e 67 20 77 re's something w
b450: 65 69 72 64 2e 20 20 41 4e 53 49 2d 43 20 64 6f eird. ANSI-C do
b460: 65 73 6e 27 74 20 61 6c 6c 6f 77 20 61 20 66 6f esn't allow a fo
b470: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f rward declaratio
b480: 6e 0a 20 20 2a 2a 20 6f 66 20 61 6e 20 65 6e 75 n. ** of an enu
b490: 6d 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 77 65 meration. So we
b4a0: 20 68 61 76 65 20 74 6f 20 62 75 69 6c 64 20 74 have to build t
b4b0: 68 65 20 74 79 70 65 64 65 66 20 69 6e 74 6f 20 he typedef into
b4c0: 74 68 65 0a 20 20 2a 2a 20 64 65 66 69 6e 69 74 the. ** definit
b4d0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 ion.. */. if(
b4e0: 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 20 26 26 20 pDecl->zDecl &&
b4f0: 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28 DeclHasProperty(
b500: 70 44 65 63 6c 2c 20 54 59 5f 45 6e 75 6d 65 72 pDecl, TY_Enumer
b510: 61 74 69 6f 6e 29 20 29 7b 0a 20 20 20 20 53 74 ation) ){. St
b520: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a ringInit(&str);.
b530: 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 StringAppend
b540: 28 26 73 74 72 2c 70 44 65 63 6c 2d 3e 7a 44 65 (&str,pDecl->zDe
b550: 63 6c 2c 30 29 3b 0a 20 20 20 20 53 74 72 69 6e cl,0);. Strin
b560: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 70 44 65 gAppend(&str,pDe
b570: 63 6c 2d 3e 7a 46 77 64 2c 30 29 3b 0a 20 20 20 cl->zFwd,0);.
b580: 20 53 61 66 65 46 72 65 65 28 70 44 65 63 6c 2d SafeFree(pDecl-
b590: 3e 7a 44 65 63 6c 29 3b 0a 20 20 20 20 53 61 66 >zDecl);. Saf
b5a0: 65 46 72 65 65 28 70 44 65 63 6c 2d 3e 7a 46 77 eFree(pDecl->zFw
b5b0: 64 29 3b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 7a d);. pDecl->z
b5c0: 46 77 64 20 3d 20 30 3b 0a 20 20 20 20 70 44 65 Fwd = 0;. pDe
b5d0: 63 6c 2d 3e 7a 44 65 63 6c 20 3d 20 53 74 72 44 cl->zDecl = StrD
b5e0: 75 70 28 53 74 72 69 6e 67 47 65 74 28 26 73 74 up(StringGet(&st
b5f0: 72 29 2c 30 29 3b 0a 20 20 20 20 53 74 72 69 6e r),0);. Strin
b600: 67 52 65 73 65 74 28 26 73 74 72 29 3b 0a 20 20 gReset(&str);.
b610: 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e }.. if( pName->
b620: 70 4e 65 78 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d pNext->zText[0]=
b630: 3d 27 3a 27 20 29 7b 0a 20 20 20 20 44 65 63 6c =':' ){. Decl
b640: 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63 SetProperty(pDec
b650: 6c 2c 44 50 5f 43 70 6c 75 73 70 6c 75 73 29 3b l,DP_Cplusplus);
b660: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 61 6d 65 . }. if( pName
b670: 2d 3e 6e 54 65 78 74 3d 3d 35 20 26 26 20 73 74 ->nText==5 && st
b680: 72 6e 63 6d 70 28 70 4e 61 6d 65 2d 3e 7a 54 65 rncmp(pName->zTe
b690: 78 74 2c 22 63 6c 61 73 73 22 2c 35 29 3d 3d 30 xt,"class",5)==0
b6a0: 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 ){. DeclSetP
b6b0: 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 roperty(pDecl,DP
b6c0: 5f 43 70 6c 75 73 70 6c 75 73 29 3b 0a 20 20 7d _Cplusplus);. }
b6d0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 6d 6f .. /*. ** Remo
b6e0: 76 65 20 61 6c 6c 20 62 75 74 20 70 4c 69 73 74 ve all but pList
b6f0: 20 61 6e 64 20 70 4e 61 6d 65 20 66 72 6f 6d 20 and pName from
b700: 74 68 65 20 69 6e 70 75 74 20 73 74 72 65 61 6d the input stream
b710: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 .. */. if( nee
b720: 64 5f 74 6f 5f 63 6f 6c 6c 61 70 73 65 20 29 7b d_to_collapse ){
b730: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 45 6e 64 . while( pEnd
b740: 21 3d 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 !=pName ){.
b750: 20 54 6f 6b 65 6e 20 2a 70 50 72 65 76 20 3d 20 Token *pPrev =
b760: 70 45 6e 64 2d 3e 70 50 72 65 76 3b 0a 20 20 20 pEnd->pPrev;.
b770: 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 pPrev->pNext
b780: 3d 20 70 45 6e 64 2d 3e 70 4e 65 78 74 3b 0a 20 = pEnd->pNext;.
b790: 20 20 20 20 20 70 45 6e 64 2d 3e 70 4e 65 78 74 pEnd->pNext
b7a0: 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 76 3b ->pPrev = pPrev;
b7b0: 0a 20 20 20 20 20 20 53 61 66 65 46 72 65 65 28 . SafeFree(
b7c0: 70 45 6e 64 29 3b 0a 20 20 20 20 20 20 70 45 6e pEnd);. pEn
b7d0: 64 20 3d 20 70 50 72 65 76 3b 0a 20 20 20 20 7d d = pPrev;. }
b7e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b . }. return 0;
b7f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 .}../*.** Given
b800: 61 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73 a list of tokens
b810: 20 74 68 61 74 20 64 65 63 6c 61 72 65 20 73 6f that declare so
b820: 6d 65 74 68 69 6e 67 20 28 61 20 66 75 6e 63 74 mething (a funct
b830: 69 6f 6e 2c 20 70 72 6f 63 65 64 75 72 65 2c 0a ion, procedure,.
b840: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6f 72 20 74 ** variable or t
b850: 79 70 65 64 65 66 29 20 66 69 6e 64 20 74 68 65 ypedef) find the
b860: 20 74 6f 6b 65 6e 20 77 68 69 63 68 20 63 6f 6e token which con
b870: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f tains the name o
b880: 66 20 74 68 65 0a 2a 2a 20 74 68 69 6e 67 20 62 f the.** thing b
b890: 65 69 6e 67 20 64 65 63 6c 61 72 65 64 2e 0a 2a eing declared..*
b8a0: 2a 0a 2a 2a 20 41 6c 67 6f 72 69 74 68 6d 3a 0a *.** Algorithm:.
b8b0: 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 6e 61 6d 65 **.** The name
b8c0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 31 is:.**.** 1
b8d0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 64 65 . The first ide
b8e0: 6e 74 69 66 69 65 72 20 74 68 61 74 20 69 73 20 ntifier that is
b8f0: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 22 5b followed by a "[
b900: 22 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 20 ", or.**.**
b910: 32 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 64 2. The first id
b920: 65 6e 74 69 66 69 65 72 20 74 68 61 74 20 69 73 entifier that is
b930: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 22 followed by a "
b940: 28 22 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 (" where the.**
b950: 20 20 20 20 20 20 20 20 22 28 22 20 69 73 20 66 "(" is f
b960: 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 6f 74 68 ollowed by anoth
b970: 65 72 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f er identifier, o
b980: 72 0a 2a 2a 0a 2a 2a 20 20 20 20 20 33 2e 20 20 r.**.** 3.
b990: 54 68 65 20 66 69 72 73 74 20 69 64 65 6e 74 69 The first identi
b9a0: 66 69 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 fier followed by
b9b0: 20 22 3a 3a 22 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 "::", or.**.**
b9c0: 20 20 20 20 34 2e 20 20 49 66 20 6e 6f 6e 65 20 4. If none
b9d0: 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 of the above, th
b9e0: 65 6e 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e en the last iden
b9f0: 74 69 66 69 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 tifier..**.**
ba00: 49 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 In all of the ab
ba10: 6f 76 65 2c 20 63 65 72 74 61 69 6e 20 72 65 73 ove, certain res
ba20: 65 72 76 65 64 20 77 6f 72 64 73 20 28 6c 69 6b erved words (lik
ba30: 65 20 22 63 68 61 72 22 29 20 61 72 65 0a 2a 2a e "char") are.**
ba40: 20 20 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 not considere
ba50: 64 20 69 64 65 6e 74 69 66 69 65 72 73 2e 0a 2a d identifiers..*
ba60: 2f 0a 73 74 61 74 69 63 20 54 6f 6b 65 6e 20 2a /.static Token *
ba70: 46 69 6e 64 44 65 63 6c 4e 61 6d 65 28 54 6f 6b FindDeclName(Tok
ba80: 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 en *pFirst, Toke
ba90: 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 6f 6b n *pLast){. Tok
baa0: 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 en *pName = 0;.
bab0: 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 69 6e 74 Token *p;. int
bac0: 20 63 3b 0a 0a 20 20 69 66 28 20 70 46 69 72 73 c;.. if( pFirs
bad0: 74 3d 3d 30 20 7c 7c 20 70 4c 61 73 74 3d 3d 30 t==0 || pLast==0
bae0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){. return 0
baf0: 3b 0a 20 20 7d 0a 20 20 70 4c 61 73 74 20 3d 20 ;. }. pLast =
bb00: 70 4c 61 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 pLast->pNext;.
bb10: 66 6f 72 28 70 3d 70 46 69 72 73 74 3b 20 70 20 for(p=pFirst; p
bb20: 26 26 20 70 21 3d 70 4c 61 73 74 3b 20 70 3d 70 && p!=pLast; p=p
bb30: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 ->pNext){. if
bb40: 28 20 70 2d 3e 65 54 79 70 65 3d 3d 54 54 5f 49 ( p->eType==TT_I
bb50: 64 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 d ){. stati
bb60: 63 20 49 64 65 6e 74 54 61 62 6c 65 20 73 52 65 c IdentTable sRe
bb70: 73 65 72 76 65 64 3b 0a 20 20 20 20 20 20 73 74 served;. st
bb80: 61 74 69 63 20 69 6e 74 20 69 73 49 6e 69 74 20 atic int isInit
bb90: 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 74 69 = 0;. stati
bba0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 57 c const char *aW
bbb0: 6f 72 64 73 5b 5d 20 3d 20 7b 20 22 63 68 61 72 ords[] = { "char
bbc0: 22 2c 20 22 63 6c 61 73 73 22 2c 0a 20 20 20 20 ", "class",.
bbd0: 20 20 20 22 63 6f 6e 73 74 22 2c 20 22 64 6f 75 "const", "dou
bbe0: 62 6c 65 22 2c 20 22 65 6e 75 6d 22 2c 20 22 65 ble", "enum", "e
bbf0: 78 74 65 72 6e 22 2c 20 22 45 58 50 4f 52 54 22 xtern", "EXPORT"
bc00: 2c 20 22 45 54 5f 50 52 4f 43 22 2c 0a 20 20 20 , "ET_PROC",.
bc10: 20 20 20 20 22 66 6c 6f 61 74 22 2c 20 22 69 6e "float", "in
bc20: 74 22 2c 20 22 6c 6f 6e 67 22 2c 0a 20 20 20 20 t", "long",.
bc30: 20 20 20 22 50 52 49 56 41 54 45 22 2c 20 22 50 "PRIVATE", "P
bc40: 52 4f 54 45 43 54 45 44 22 2c 20 22 50 55 42 4c ROTECTED", "PUBL
bc50: 49 43 22 2c 0a 20 20 20 20 20 20 20 22 72 65 67 IC",. "reg
bc60: 69 73 74 65 72 22 2c 20 22 73 74 61 74 69 63 22 ister", "static"
bc70: 2c 20 22 73 74 72 75 63 74 22 2c 20 22 73 69 7a , "struct", "siz
bc80: 65 6f 66 22 2c 20 22 73 69 67 6e 65 64 22 2c 20 eof", "signed",
bc90: 22 74 79 70 65 64 65 66 22 2c 0a 20 20 20 20 20 "typedef",.
bca0: 20 20 22 75 6e 69 6f 6e 22 2c 20 22 76 6f 6c 61 "union", "vola
bcb0: 74 69 6c 65 22 2c 20 22 76 69 72 74 75 61 6c 22 tile", "virtual"
bcc0: 2c 20 22 76 6f 69 64 22 2c 20 7d 3b 0a 0a 20 20 , "void", };..
bcd0: 20 20 20 20 69 66 28 20 21 69 73 49 6e 69 74 20 if( !isInit
bce0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 ){. int i
bcf0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d ;. for(i=
bd00: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 57 6f 72 0; i<sizeof(aWor
bd10: 64 73 29 2f 73 69 7a 65 6f 66 28 61 57 6f 72 64 ds)/sizeof(aWord
bd20: 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 s[0]); i++){.
bd30: 20 20 20 20 20 20 20 49 64 65 6e 74 54 61 62 6c IdentTabl
bd40: 65 49 6e 73 65 72 74 28 26 73 52 65 73 65 72 76 eInsert(&sReserv
bd50: 65 64 2c 61 57 6f 72 64 73 5b 69 5d 2c 30 29 3b ed,aWords[i],0);
bd60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
bd70: 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 isInit = 1;.
bd80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 }. if(
bd90: 20 21 49 64 65 6e 74 54 61 62 6c 65 54 65 73 74 !IdentTableTest
bda0: 28 26 73 52 65 73 65 72 76 65 64 2c 70 2d 3e 7a (&sReserved,p->z
bdb0: 54 65 78 74 2c 70 2d 3e 6e 54 65 78 74 29 20 29 Text,p->nText) )
bdc0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 {. pName
bdd0: 3d 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 = p;. }.
bde0: 20 7d 65 6c 73 65 20 69 66 28 20 70 3d 3d 70 46 }else if( p==pF
bdf0: 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 63 6f irst ){. co
be00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 ntinue;. }els
be10: 65 20 69 66 28 20 28 63 3d 70 2d 3e 7a 54 65 78 e if( (c=p->zTex
be20: 74 5b 30 5d 29 3d 3d 27 5b 27 20 26 26 20 70 4e t[0])=='[' && pN
be30: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 62 72 65 ame ){. bre
be40: 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 ak;. }else if
be50: 28 20 63 3d 3d 27 28 27 20 26 26 20 70 2d 3e 70 ( c=='(' && p->p
be60: 4e 65 78 74 20 26 26 20 70 2d 3e 70 4e 65 78 74 Next && p->pNext
be70: 2d 3e 65 54 79 70 65 3d 3d 54 54 5f 49 64 20 26 ->eType==TT_Id &
be80: 26 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 & pName ){.
be90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 break;. }els
bea0: 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20 e if( c==':' &&
beb0: 70 2d 3e 7a 54 65 78 74 5b 31 5d 3d 3d 27 3a 27 p->zText[1]==':'
bec0: 20 26 26 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 && pName ){.
bed0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
bee0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 61 }. return pNa
bef0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 me;.}../*.** Thi
bf00: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c s routine is cal
bf10: 6c 65 64 20 77 68 65 6e 20 77 65 20 73 65 65 20 led when we see
bf20: 61 20 6d 65 74 68 6f 64 20 66 6f 72 20 61 20 63 a method for a c
bf30: 6c 61 73 73 20 74 68 61 74 20 62 65 67 69 6e 73 lass that begins
bf40: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 50 55 42 .** with the PUB
bf50: 4c 49 43 2c 20 50 52 49 56 41 54 45 2c 20 6f 72 LIC, PRIVATE, or
bf60: 20 50 52 4f 54 45 43 54 45 44 20 6b 65 79 77 6f PROTECTED keywo
bf70: 72 64 73 2e 20 20 53 75 63 68 20 6d 65 74 68 6f rds. Such metho
bf80: 64 73 20 61 72 65 0a 2a 2a 20 61 64 64 65 64 20 ds are.** added
bf90: 74 6f 20 74 68 65 69 72 20 63 6c 61 73 73 20 64 to their class d
bfa0: 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 efinitions..*/.s
bfb0: 74 61 74 69 63 20 69 6e 74 20 50 72 6f 63 65 73 tatic int Proces
bfc0: 73 4d 65 74 68 6f 64 44 65 66 28 54 6f 6b 65 6e sMethodDef(Token
bfd0: 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20 *pFirst, Token
bfe0: 2a 70 4c 61 73 74 2c 20 69 6e 74 20 66 6c 61 67 *pLast, int flag
bff0: 73 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6c s){. Token *pCl
c000: 61 73 73 3b 0a 20 20 63 68 61 72 20 2a 7a 44 65 ass;. char *zDe
c010: 63 6c 3b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63 cl;. Decl *pDec
c020: 6c 3b 0a 20 20 53 74 72 69 6e 67 20 73 74 72 3b l;. String str;
c030: 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 0a 20 20 . int type;..
c040: 70 4c 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70 pLast = pLast->p
c050: 50 72 65 76 3b 0a 20 20 77 68 69 6c 65 28 20 70 Prev;. while( p
c060: 46 69 72 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d First->zText[0]=
c070: 3d 27 50 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 ='P' ){. int
c080: 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 77 69 74 rc = 1;. swit
c090: 63 68 28 20 70 46 69 72 73 74 2d 3e 6e 54 65 78 ch( pFirst->nTex
c0a0: 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 t ){. case
c0b0: 36 3a 20 20 72 63 20 3d 20 73 74 72 6e 63 6d 70 6: rc = strncmp
c0c0: 28 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 (pFirst->zText,"
c0d0: 50 55 42 4c 49 43 22 2c 36 29 3b 20 62 72 65 61 PUBLIC",6); brea
c0e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 37 3a k;. case 7:
c0f0: 20 20 72 63 20 3d 20 73 74 72 6e 63 6d 70 28 70 rc = strncmp(p
c100: 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 50 52 First->zText,"PR
c110: 49 56 41 54 45 22 2c 37 29 3b 20 62 72 65 61 6b IVATE",7); break
c120: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 39 3a 20 ;. case 9:
c130: 20 72 63 20 3d 20 73 74 72 6e 63 6d 70 28 70 46 rc = strncmp(pF
c140: 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 50 52 4f irst->zText,"PRO
c150: 54 45 43 54 45 44 22 2c 39 29 3b 20 62 72 65 61 TECTED",9); brea
c160: 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 k;. default
c170: 3a 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a : break;. }.
c180: 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 if( rc ) bre
c190: 61 6b 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d ak;. pFirst =
c1a0: 20 70 46 69 72 73 74 2d 3e 70 4e 65 78 74 3b 0a pFirst->pNext;.
c1b0: 20 20 7d 0a 20 20 70 43 6c 61 73 73 20 3d 20 46 }. pClass = F
c1c0: 69 6e 64 44 65 63 6c 4e 61 6d 65 28 70 46 69 72 indDeclName(pFir
c1d0: 73 74 2c 70 4c 61 73 74 29 3b 0a 20 20 69 66 28 st,pLast);. if(
c1e0: 20 70 43 6c 61 73 73 3d 3d 30 20 29 7b 0a 20 20 pClass==0 ){.
c1f0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 fprintf(stderr
c200: 2c 22 25 73 3a 25 64 3a 20 55 6e 61 62 6c 65 20 ,"%s:%d: Unable
c210: 74 6f 20 66 69 6e 64 20 74 68 65 20 63 6c 61 73 to find the clas
c220: 73 20 6e 61 6d 65 20 66 6f 72 20 74 68 69 73 20 s name for this
c230: 6d 65 74 68 6f 64 5c 6e 22 2c 0a 20 20 20 20 20 method\n",.
c240: 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 zFilename, pFi
c250: 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 rst->nLine);.
c260: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 return 1;. }.
c270: 20 70 44 65 63 6c 20 3d 20 46 69 6e 64 44 65 63 pDecl = FindDec
c280: 6c 28 70 43 6c 61 73 73 2d 3e 7a 54 65 78 74 2c l(pClass->zText,
c290: 20 70 43 6c 61 73 73 2d 3e 6e 54 65 78 74 29 3b pClass->nText);
c2a0: 0a 20 20 69 66 28 20 70 44 65 63 6c 3d 3d 30 20 . if( pDecl==0
c2b0: 7c 7c 20 28 70 44 65 63 6c 2d 3e 66 6c 61 67 73 || (pDecl->flags
c2c0: 20 26 20 54 59 5f 43 6c 61 73 73 29 21 3d 54 59 & TY_Class)!=TY
c2d0: 5f 43 6c 61 73 73 20 29 7b 0a 20 20 20 20 70 44 _Class ){. pD
c2e0: 65 63 6c 20 3d 20 43 72 65 61 74 65 44 65 63 6c ecl = CreateDecl
c2f0: 28 70 43 6c 61 73 73 2d 3e 7a 54 65 78 74 2c 20 (pClass->zText,
c300: 70 43 6c 61 73 73 2d 3e 6e 54 65 78 74 29 3b 0a pClass->nText);.
c310: 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65 DeclSetPrope
c320: 72 74 79 28 70 44 65 63 6c 2c 20 54 59 5f 43 6c rty(pDecl, TY_Cl
c330: 61 73 73 29 3b 0a 20 20 7d 0a 20 20 53 74 72 69 ass);. }. Stri
c340: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 ngInit(&str);.
c350: 69 66 28 20 70 44 65 63 6c 2d 3e 7a 45 78 74 72 if( pDecl->zExtr
c360: 61 20 29 7b 0a 20 20 20 20 53 74 72 69 6e 67 41 a ){. StringA
c370: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 65 63 ppend(&str, pDec
c380: 6c 2d 3e 7a 45 78 74 72 61 2c 20 30 29 3b 0a 20 l->zExtra, 0);.
c390: 20 20 20 53 61 66 65 46 72 65 65 28 70 44 65 63 SafeFree(pDec
c3a0: 6c 2d 3e 7a 45 78 74 72 61 29 3b 0a 20 20 20 20 l->zExtra);.
c3b0: 70 44 65 63 6c 2d 3e 7a 45 78 74 72 61 20 3d 20 pDecl->zExtra =
c3c0: 30 3b 0a 20 20 7d 0a 20 20 74 79 70 65 20 3d 20 0;. }. type =
c3d0: 66 6c 61 67 73 20 26 20 50 53 5f 50 50 50 3b 0a flags & PS_PPP;.
c3e0: 20 20 69 66 28 20 70 44 65 63 6c 2d 3e 65 78 74 if( pDecl->ext
c3f0: 72 61 54 79 70 65 21 3d 74 79 70 65 20 29 7b 0a raType!=type ){.
c400: 20 20 20 20 69 66 28 20 74 79 70 65 20 26 20 50 if( type & P
c410: 53 5f 50 75 62 6c 69 63 20 29 7b 0a 20 20 20 20 S_Public ){.
c420: 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 StringAppend(&
c430: 73 74 72 2c 20 22 70 75 62 6c 69 63 3a 5c 6e 22 str, "public:\n"
c440: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 44 65 63 , 0);. pDec
c450: 6c 2d 3e 65 78 74 72 61 54 79 70 65 20 3d 20 50 l->extraType = P
c460: 53 5f 50 75 62 6c 69 63 3b 0a 20 20 20 20 7d 65 S_Public;. }e
c470: 6c 73 65 20 69 66 28 20 74 79 70 65 20 26 20 50 lse if( type & P
c480: 53 5f 50 72 6f 74 65 63 74 65 64 20 29 7b 0a 20 S_Protected ){.
c490: 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e StringAppen
c4a0: 64 28 26 73 74 72 2c 20 22 70 72 6f 74 65 63 74 d(&str, "protect
c4b0: 65 64 3a 5c 6e 22 2c 20 30 29 3b 0a 20 20 20 20 ed:\n", 0);.
c4c0: 20 20 70 44 65 63 6c 2d 3e 65 78 74 72 61 54 79 pDecl->extraTy
c4d0: 70 65 20 3d 20 50 53 5f 50 72 6f 74 65 63 74 65 pe = PS_Protecte
c4e0: 64 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 d;. }else if(
c4f0: 20 74 79 70 65 20 26 20 50 53 5f 50 72 69 76 61 type & PS_Priva
c500: 74 65 20 29 7b 0a 20 20 20 20 20 20 53 74 72 69 te ){. Stri
c510: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22 ngAppend(&str, "
c520: 70 72 69 76 61 74 65 3a 5c 6e 22 2c 20 30 29 3b private:\n", 0);
c530: 0a 20 20 20 20 20 20 70 44 65 63 6c 2d 3e 65 78 . pDecl->ex
c540: 74 72 61 54 79 70 65 20 3d 20 50 53 5f 50 72 69 traType = PS_Pri
c550: 76 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a vate;. }. }.
c560: 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 StringAppend(&
c570: 73 74 72 2c 20 22 20 20 22 2c 20 30 29 3b 0a 20 str, " ", 0);.
c580: 20 7a 44 65 63 6c 20 3d 20 54 6f 6b 65 6e 73 54 zDecl = TokensT
c590: 6f 53 74 72 69 6e 67 28 70 46 69 72 73 74 2c 20 oString(pFirst,
c5a0: 70 4c 61 73 74 2c 20 22 3b 5c 6e 22 2c 20 70 43 pLast, ";\n", pC
c5b0: 6c 61 73 73 2c 20 32 29 3b 0a 20 20 53 74 72 69 lass, 2);. Stri
c5c0: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 7a ngAppend(&str, z
c5d0: 44 65 63 6c 2c 20 30 29 3b 0a 20 20 53 61 66 65 Decl, 0);. Safe
c5e0: 46 72 65 65 28 7a 44 65 63 6c 29 3b 0a 20 20 70 Free(zDecl);. p
c5f0: 44 65 63 6c 2d 3e 7a 45 78 74 72 61 20 3d 20 53 Decl->zExtra = S
c600: 74 72 44 75 70 28 53 74 72 69 6e 67 47 65 74 28 trDup(StringGet(
c610: 26 73 74 72 29 2c 20 30 29 3b 0a 20 20 53 74 72 &str), 0);. Str
c620: 69 6e 67 52 65 73 65 74 28 26 73 74 72 29 3b 0a ingReset(&str);.
c630: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f return 0;.}../
c640: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e *.** This routin
c650: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e e is called when
c660: 20 77 65 20 73 65 65 20 61 20 66 75 6e 63 74 69 we see a functi
c670: 6f 6e 20 6f 72 20 70 72 6f 63 65 64 75 72 65 20 on or procedure
c680: 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2a 20 57 definition..** W
c690: 65 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 e make an entry
c6a0: 69 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 in the declarati
c6b0: 6f 6e 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 on table that is
c6c0: 20 61 20 70 72 6f 74 6f 74 79 70 65 20 66 6f 72 a prototype for
c6d0: 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f this.** functio
c6e0: 6e 20 6f 72 20 70 72 6f 63 65 64 75 72 65 2e 0a n or procedure..
c6f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 50 72 */.static int Pr
c700: 6f 63 65 73 73 50 72 6f 63 65 64 75 72 65 44 65 ocessProcedureDe
c710: 66 28 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c f(Token *pFirst,
c720: 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 2c 20 69 Token *pLast, i
c730: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 54 6f 6b nt flags){. Tok
c740: 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 44 65 63 en *pName;. Dec
c750: 6c 20 2a 70 44 65 63 6c 3b 0a 20 20 54 6f 6b 65 l *pDecl;. Toke
c760: 6e 20 2a 70 43 6f 64 65 3b 0a 0a 20 20 69 66 28 n *pCode;.. if(
c770: 20 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 70 4c pFirst==0 || pL
c780: 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 ast==0 ){. re
c790: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 turn 0;. }. if
c7a0: 28 20 66 6c 61 67 73 20 26 20 50 53 5f 4d 65 74 ( flags & PS_Met
c7b0: 68 6f 64 20 29 7b 0a 20 20 20 20 69 66 28 20 66 hod ){. if( f
c7c0: 6c 61 67 73 20 26 20 50 53 5f 50 50 50 20 29 7b lags & PS_PPP ){
c7d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 50 72 . return Pr
c7e0: 6f 63 65 73 73 4d 65 74 68 6f 64 44 65 66 28 70 ocessMethodDef(p
c7f0: 46 69 72 73 74 2c 20 70 4c 61 73 74 2c 20 66 6c First, pLast, fl
c800: 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b ags);. }else{
c810: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b . return 0;
c820: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 . }. }. if(
c830: 20 28 66 6c 61 67 73 20 26 20 50 53 5f 53 74 61 (flags & PS_Sta
c840: 74 69 63 29 21 3d 30 20 26 26 20 21 70 72 6f 74 tic)!=0 && !prot
c850: 6f 5f 73 74 61 74 69 63 20 29 7b 0a 20 20 20 20 o_static ){.
c860: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 return 0;. }.
c870: 70 43 6f 64 65 20 3d 20 70 4c 61 73 74 3b 0a 20 pCode = pLast;.
c880: 20 77 68 69 6c 65 28 20 70 4c 61 73 74 20 26 26 while( pLast &&
c890: 20 70 4c 61 73 74 21 3d 70 46 69 72 73 74 20 26 pLast!=pFirst &
c8a0: 26 20 70 4c 61 73 74 2d 3e 7a 54 65 78 74 5b 30 & pLast->zText[0
c8b0: 5d 21 3d 27 29 27 20 29 7b 0a 20 20 20 20 70 4c ]!=')' ){. pL
c8c0: 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70 50 72 ast = pLast->pPr
c8d0: 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c ev;. }. if( pL
c8e0: 61 73 74 3d 3d 30 20 7c 7c 20 70 4c 61 73 74 3d ast==0 || pLast=
c8f0: 3d 70 46 69 72 73 74 20 7c 7c 20 70 46 69 72 73 =pFirst || pFirs
c900: 74 2d 3e 70 4e 65 78 74 3d 3d 70 4c 61 73 74 20 t->pNext==pLast
c910: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 ){. fprintf(s
c920: 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 55 6e tderr,"%s:%d: Un
c930: 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 6e 74 61 recognized synta
c940: 78 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 46 69 x.\n",. zFi
c950: 6c 65 6e 61 6d 65 2c 20 70 46 69 72 73 74 2d 3e lename, pFirst->
c960: 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 72 65 74 75 nLine);. retu
c970: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 rn 1;. }. if(
c980: 66 6c 61 67 73 20 26 20 28 50 53 5f 49 6e 74 65 flags & (PS_Inte
c990: 72 66 61 63 65 7c 50 53 5f 45 78 70 6f 72 74 7c rface|PS_Export|
c9a0: 50 53 5f 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 PS_Local) ){.
c9b0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c fprintf(stderr,
c9c0: 22 25 73 3a 25 64 3a 20 4d 69 73 73 69 6e 67 20 "%s:%d: Missing
c9d0: 5c 22 69 6e 6c 69 6e 65 5c 22 20 6f 6e 20 66 75 \"inline\" on fu
c9e0: 6e 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 64 nction or proced
c9f0: 75 72 65 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a ure.\n",. z
ca00: 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 72 73 74 Filename, pFirst
ca10: 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 72 65 ->nLine);. re
ca20: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 4e turn 1;. }. pN
ca30: 61 6d 65 20 3d 20 46 69 6e 64 44 65 63 6c 4e 61 ame = FindDeclNa
ca40: 6d 65 28 70 46 69 72 73 74 2c 70 4c 61 73 74 29 me(pFirst,pLast)
ca50: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 ;. if( pName==0
ca60: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 ){. fprintf(
ca70: 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 4d stderr,"%s:%d: M
ca80: 61 6c 66 6f 72 6d 65 64 20 66 75 6e 63 74 69 6f alformed functio
ca90: 6e 20 6f 72 20 70 72 6f 63 65 64 75 72 65 20 64 n or procedure d
caa0: 65 66 69 6e 69 74 69 6f 6e 2e 5c 6e 22 2c 0a 20 efinition.\n",.
cab0: 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 zFilename,
cac0: 70 46 69 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a pFirst->nLine);.
cad0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 return 1;.
cae0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 74 20 }.. /*. ** At
caf0: 74 68 69 73 20 70 6f 69 6e 74 20 77 65 27 76 65 this point we've
cb00: 20 69 73 6f 6c 61 74 65 64 20 61 20 70 72 6f 63 isolated a proc
cb10: 65 64 75 72 65 20 64 65 63 6c 61 72 61 74 69 6f edure declaratio
cb20: 6e 20 62 65 74 77 65 65 6e 20 70 46 69 72 73 74 n between pFirst
cb30: 0a 20 20 2a 2a 20 61 6e 64 20 70 4c 61 73 74 20 . ** and pLast
cb40: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 70 4e with the name pN
cb50: 61 6d 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 ame.. */.#ifdef
cb60: 20 44 45 42 55 47 0a 20 20 69 66 28 20 64 65 62 DEBUG. if( deb
cb70: 75 67 4d 61 73 6b 20 26 20 50 41 52 53 45 52 20 ugMask & PARSER
cb80: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2a ){. printf("*
cb90: 2a 2a 2a 20 46 6f 75 6e 64 20 72 6f 75 74 69 6e *** Found routin
cba0: 65 3a 20 25 2e 2a 73 20 6f 6e 20 6c 69 6e 65 20 e: %.*s on line
cbb0: 25 64 2e 2e 2e 5c 6e 22 2c 20 70 4e 61 6d 65 2d %d...\n", pName-
cbc0: 3e 6e 54 65 78 74 2c 0a 20 20 20 20 20 20 20 70 >nText,. p
cbd0: 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 20 70 46 69 Name->zText, pFi
cbe0: 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 rst->nLine);.
cbf0: 20 50 72 69 6e 74 54 6f 6b 65 6e 73 28 70 46 69 PrintTokens(pFi
cc00: 72 73 74 2c 70 4c 61 73 74 29 3b 0a 20 20 20 20 rst,pLast);.
cc10: 70 72 69 6e 74 66 28 22 3b 5c 6e 22 29 3b 0a 20 printf(";\n");.
cc20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 44 65 63 }.#endif. pDec
cc30: 6c 20 3d 20 43 72 65 61 74 65 44 65 63 6c 28 70 l = CreateDecl(p
cc40: 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 70 4e 61 6d Name->zText,pNam
cc50: 65 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 70 44 65 e->nText);. pDe
cc60: 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20 3d 20 70 cl->pComment = p
cc70: 46 69 72 73 74 2d 3e 70 43 6f 6d 6d 65 6e 74 3b First->pComment;
cc80: 0a 20 20 69 66 28 20 70 43 6f 64 65 20 26 26 20 . if( pCode &&
cc90: 70 43 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 54 54 pCode->eType==TT
cca0: 5f 42 72 61 63 65 73 20 29 7b 0a 20 20 20 20 70 _Braces ){. p
ccb0: 44 65 63 6c 2d 3e 74 6f 6b 65 6e 43 6f 64 65 20 Decl->tokenCode
ccc0: 3d 20 2a 70 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 = *pCode;. }.
ccd0: 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 DeclSetProperty(
cce0: 70 44 65 63 6c 2c 54 59 5f 53 75 62 72 6f 75 74 pDecl,TY_Subrout
ccf0: 69 6e 65 29 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a ine);. pDecl->z
cd00: 44 65 63 6c 20 3d 20 54 6f 6b 65 6e 73 54 6f 53 Decl = TokensToS
cd10: 74 72 69 6e 67 28 70 46 69 72 73 74 2c 70 4c 61 tring(pFirst,pLa
cd20: 73 74 2c 22 3b 5c 6e 22 2c 30 2c 30 29 3b 0a 20 st,";\n",0,0);.
cd30: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 50 if( (flags & (P
cd40: 53 5f 53 74 61 74 69 63 7c 50 53 5f 4c 6f 63 61 S_Static|PS_Loca
cd50: 6c 32 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 44 l2))!=0 ){. D
cd60: 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 eclSetProperty(p
cd70: 44 65 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29 3b 0a Decl,DP_Local);.
cd80: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 }else if( (fla
cd90: 67 73 20 26 20 28 50 53 5f 45 78 70 6f 72 74 32 gs & (PS_Export2
cda0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 44 65 63 ))!=0 ){. Dec
cdb0: 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 lSetProperty(pDe
cdc0: 63 6c 2c 44 50 5f 45 78 70 6f 72 74 29 3b 0a 20 cl,DP_Export);.
cdd0: 20 7d 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20 }.. if( flags
cde0: 26 20 44 50 5f 43 70 6c 75 73 70 6c 75 73 20 29 & DP_Cplusplus )
cdf0: 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f {. DeclSetPro
ce00: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 43 perty(pDecl,DP_C
ce10: 70 6c 75 73 70 6c 75 73 29 3b 0a 20 20 7d 65 6c plusplus);. }el
ce20: 73 65 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 se{. DeclSetP
ce30: 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 roperty(pDecl,DP
ce40: 5f 45 78 74 65 72 6e 43 52 65 71 64 29 3b 0a 20 _ExternCReqd);.
ce50: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a }.. return 0;.
ce60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f }../*.** This ro
ce70: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 utine is called
ce80: 77 68 65 6e 65 76 65 72 20 77 65 20 73 65 65 20 whenever we see
ce90: 74 68 65 20 22 69 6e 6c 69 6e 65 22 20 6b 65 79 the "inline" key
cea0: 77 6f 72 64 2e 20 20 57 65 0a 2a 2a 20 6e 65 65 word. We.** nee
ceb0: 64 20 74 6f 20 73 65 65 6b 2d 6f 75 74 20 74 68 d to seek-out th
cec0: 65 20 69 6e 6c 69 6e 65 20 66 75 6e 63 74 69 6f e inline functio
ced0: 6e 20 6f 72 20 70 72 6f 63 65 64 75 72 65 20 61 n or procedure a
cee0: 6e 64 20 6d 61 6b 65 20 61 0a 2a 2a 20 64 65 63 nd make a.** dec
cef0: 6c 61 72 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 laration out of
cf00: 74 68 65 20 65 6e 74 69 72 65 20 64 65 66 69 6e the entire defin
cf10: 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 ition..*/.static
cf20: 20 69 6e 74 20 50 72 6f 63 65 73 73 49 6e 6c 69 int ProcessInli
cf30: 6e 65 50 72 6f 63 28 54 6f 6b 65 6e 20 2a 70 46 neProc(Token *pF
cf40: 69 72 73 74 2c 20 69 6e 74 20 66 6c 61 67 73 2c irst, int flags,
cf50: 20 69 6e 74 20 2a 70 52 65 73 65 74 29 7b 0a 20 int *pReset){.
cf60: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 Token *pName;.
cf70: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 3b 0a 20 20 Token *pEnd;.
cf80: 44 65 63 6c 20 2a 70 44 65 63 6c 3b 0a 0a 20 20 Decl *pDecl;..
cf90: 66 6f 72 28 70 45 6e 64 3d 70 46 69 72 73 74 3b for(pEnd=pFirst;
cfa0: 20 70 45 6e 64 3b 20 70 45 6e 64 20 3d 20 70 45 pEnd; pEnd = pE
cfb0: 6e 64 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 nd->pNext){.
cfc0: 69 66 28 20 70 45 6e 64 2d 3e 7a 54 65 78 74 5b if( pEnd->zText[
cfd0: 30 5d 3d 3d 27 7b 27 20 7c 7c 20 70 45 6e 64 2d 0]=='{' || pEnd-
cfe0: 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 3b 27 20 29 >zText[0]==';' )
cff0: 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 65 74 20 {. *pReset
d000: 3d 20 70 45 6e 64 2d 3e 7a 54 65 78 74 5b 30 5d = pEnd->zText[0]
d010: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ;. break;.
d020: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 }. }. if( p
d030: 45 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 End==0 ){. *p
d040: 52 65 73 65 74 20 3d 20 27 3b 27 3b 0a 20 20 20 Reset = ';';.
d050: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c fprintf(stderr,
d060: 22 25 73 3a 25 64 3a 20 69 6e 63 6f 6d 70 6c 65 "%s:%d: incomple
d070: 74 65 20 69 6e 6c 69 6e 65 20 70 72 6f 63 65 64 te inline proced
d080: 75 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 5c 6e ure definition\n
d090: 22 2c 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 ",. zFilena
d0a0: 6d 65 2c 20 70 46 69 72 73 74 2d 3e 6e 4c 69 6e me, pFirst->nLin
d0b0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 e);. return 1
d0c0: 3b 0a 20 20 7d 0a 20 20 70 4e 61 6d 65 20 3d 20 ;. }. pName =
d0d0: 46 69 6e 64 44 65 63 6c 4e 61 6d 65 28 70 46 69 FindDeclName(pFi
d0e0: 72 73 74 2c 70 45 6e 64 29 3b 0a 20 20 69 66 28 rst,pEnd);. if(
d0f0: 20 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 pName==0 ){.
d100: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c fprintf(stderr,
d110: 22 25 73 3a 25 64 3a 20 6d 61 6c 66 6f 72 6d 65 "%s:%d: malforme
d120: 64 20 69 6e 6c 69 6e 65 20 70 72 6f 63 65 64 75 d inline procedu
d130: 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 5c 6e 22 re definition\n"
d140: 2c 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d ,. zFilenam
d150: 65 2c 20 70 46 69 72 73 74 2d 3e 6e 4c 69 6e 65 e, pFirst->nLine
d160: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b );. return 1;
d170: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 44 45 42 . }..#ifdef DEB
d180: 55 47 0a 20 20 69 66 28 20 64 65 62 75 67 4d 61 UG. if( debugMa
d190: 73 6b 20 26 20 50 41 52 53 45 52 20 29 7b 0a 20 sk & PARSER ){.
d1a0: 20 20 20 70 72 69 6e 74 66 28 22 2a 2a 2a 2a 20 printf("****
d1b0: 46 6f 75 6e 64 20 69 6e 6c 69 6e 65 20 72 6f 75 Found inline rou
d1c0: 74 69 6e 65 3a 20 25 2e 2a 73 20 6f 6e 20 6c 69 tine: %.*s on li
d1d0: 6e 65 20 25 64 2e 2e 2e 5c 6e 22 2c 0a 20 20 20 ne %d...\n",.
d1e0: 20 20 20 20 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 pName->nText
d1f0: 2c 20 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 20 , pName->zText,
d200: 70 46 69 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a pFirst->nLine);.
d210: 20 20 20 20 50 72 69 6e 74 54 6f 6b 65 6e 73 28 PrintTokens(
d220: 70 46 69 72 73 74 2c 70 45 6e 64 29 3b 0a 20 20 pFirst,pEnd);.
d230: 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a printf("\n");.
d240: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 44 65 }.#endif. pDe
d250: 63 6c 20 3d 20 43 72 65 61 74 65 44 65 63 6c 28 cl = CreateDecl(
d260: 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 70 4e 61 pName->zText,pNa
d270: 6d 65 2d 3e 6e 54 65 78 74 29 3b 0a 20 20 70 44 me->nText);. pD
d280: 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20 3d 20 ecl->pComment =
d290: 70 46 69 72 73 74 2d 3e 70 43 6f 6d 6d 65 6e 74 pFirst->pComment
d2a0: 3b 0a 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65 ;. DeclSetPrope
d2b0: 72 74 79 28 70 44 65 63 6c 2c 54 59 5f 53 75 62 rty(pDecl,TY_Sub
d2c0: 72 6f 75 74 69 6e 65 29 3b 0a 20 20 70 44 65 63 routine);. pDec
d2d0: 6c 2d 3e 7a 44 65 63 6c 20 3d 20 54 6f 6b 65 6e l->zDecl = Token
d2e0: 73 54 6f 53 74 72 69 6e 67 28 70 46 69 72 73 74 sToString(pFirst
d2f0: 2c 70 45 6e 64 2c 22 3b 5c 6e 22 2c 30 2c 30 29 ,pEnd,";\n",0,0)
d300: 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 ;. if( (flags &
d310: 20 28 50 53 5f 53 74 61 74 69 63 7c 50 53 5f 4c (PS_Static|PS_L
d320: 6f 63 61 6c 7c 50 53 5f 4c 6f 63 61 6c 32 29 29 ocal|PS_Local2))
d330: 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 ){. DeclSetP
d340: 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 roperty(pDecl,DP
d350: 5f 4c 6f 63 61 6c 29 3b 0a 20 20 7d 65 6c 73 65 _Local);. }else
d360: 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 50 53 if( flags & (PS
d370: 5f 45 78 70 6f 72 74 7c 50 53 5f 45 78 70 6f 72 _Export|PS_Expor
d380: 74 32 29 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 t2) ){. DeclS
d390: 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c etProperty(pDecl
d3a0: 2c 44 50 5f 45 78 70 6f 72 74 29 3b 0a 20 20 7d ,DP_Export);. }
d3b0: 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 .. if( flags &
d3c0: 44 50 5f 43 70 6c 75 73 70 6c 75 73 20 29 7b 0a DP_Cplusplus ){.
d3d0: 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65 DeclSetPrope
d3e0: 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 43 70 6c rty(pDecl,DP_Cpl
d3f0: 75 73 70 6c 75 73 29 3b 0a 20 20 7d 65 6c 73 65 usplus);. }else
d400: 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f {. DeclSetPro
d410: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 perty(pDecl,DP_E
d420: 78 74 65 72 6e 43 52 65 71 64 29 3b 0a 20 20 7d xternCReqd);. }
d430: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a .. return 0;.}.
d440: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 ./*.** Determine
d450: 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 73 20 62 if the tokens b
d460: 65 74 77 65 65 6e 20 70 46 69 72 73 74 20 61 6e etween pFirst an
d470: 64 20 70 45 6e 64 20 66 6f 72 6d 20 61 20 76 61 d pEnd form a va
d480: 72 69 61 62 6c 65 0a 2a 2a 20 64 65 66 69 6e 69 riable.** defini
d490: 74 69 6f 6e 20 6f 72 20 61 20 66 75 6e 63 74 69 tion or a functi
d4a0: 6f 6e 20 70 72 6f 74 6f 74 79 70 65 2e 20 20 52 on prototype. R
d4b0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 77 65 eturn TRUE if we
d4c0: 20 61 72 65 20 64 65 61 6c 69 6e 67 0a 2a 2a 20 are dealing.**
d4d0: 77 69 74 68 20 61 20 76 61 72 69 61 62 6c 65 20 with a variable
d4e0: 64 65 66 69 6e 74 69 6f 6e 20 61 6e 64 20 46 41 defintion and FA
d4f0: 4c 53 45 20 66 6f 72 20 61 20 70 72 6f 74 6f 74 LSE for a protot
d500: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 70 45 6e 64 20 ype..**.** pEnd
d510: 69 73 20 74 68 65 20 74 6f 6b 65 6e 20 74 68 61 is the token tha
d520: 74 20 65 6e 64 73 20 74 68 65 20 6f 62 6a 65 63 t ends the objec
d530: 74 2e 20 20 49 74 20 63 61 6e 20 62 65 20 65 69 t. It can be ei
d540: 74 68 65 72 20 61 20 27 3b 27 20 6f 72 0a 2a 2a ther a ';' or.**
d550: 20 61 20 27 3d 27 2e 20 20 49 66 20 69 74 20 69 a '='. If it i
d560: 73 20 27 3d 27 2c 20 74 68 65 6e 20 61 73 73 75 s '=', then assu
d570: 6d 65 20 77 65 20 68 61 76 65 20 61 20 76 61 72 me we have a var
d580: 69 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e iable definition
d590: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 6e 64 20 ..**.** If pEnd
d5a0: 69 73 20 27 3b 27 2c 20 74 68 65 6e 20 74 68 65 is ';', then the
d5b0: 20 64 65 74 65 72 6d 69 6e 61 74 69 6f 6e 20 69 determination i
d5c0: 73 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 s more difficult
d5d0: 2e 20 20 57 65 20 68 61 76 65 0a 2a 2a 20 74 6f . We have.** to
d5e0: 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 6f search for an o
d5f0: 63 63 75 72 72 65 6e 63 65 20 6f 66 20 61 6e 20 ccurrence of an
d600: 49 44 20 66 6f 6c 6c 6f 77 65 64 20 69 6d 6d 65 ID followed imme
d610: 64 69 61 74 65 6c 79 20 62 79 20 27 28 27 2e 0a diately by '('..
d620: 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 77 65 20 ** If found, we
d630: 68 61 76 65 20 61 20 70 72 6f 74 6f 74 79 70 65 have a prototype
d640: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 77 65 20 . Otherwise we
d650: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 are dealing with
d660: 20 61 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 64 a.** variable d
d670: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 efinition..*/.st
d680: 61 74 69 63 20 69 6e 74 20 69 73 56 61 72 69 61 atic int isVaria
d690: 62 6c 65 44 65 66 28 54 6f 6b 65 6e 20 2a 70 46 bleDef(Token *pF
d6a0: 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e irst, Token *pEn
d6b0: 64 29 7b 0a 20 20 69 66 28 20 70 45 6e 64 20 26 d){. if( pEnd &
d6c0: 26 20 70 45 6e 64 2d 3e 7a 54 65 78 74 5b 30 5d & pEnd->zText[0]
d6d0: 3d 3d 27 3d 27 20 26 26 0a 20 20 20 20 28 70 45 =='=' &&. (pE
d6e0: 6e 64 2d 3e 70 50 72 65 76 2d 3e 6e 54 65 78 74 nd->pPrev->nText
d6f0: 21 3d 38 20 7c 7c 20 73 74 72 6e 63 6d 70 28 70 !=8 || strncmp(p
d700: 45 6e 64 2d 3e 70 50 72 65 76 2d 3e 7a 54 65 78 End->pPrev->zTex
d710: 74 2c 22 6f 70 65 72 61 74 6f 72 22 2c 38 29 21 t,"operator",8)!
d720: 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 =0). ){. ret
d730: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 77 68 69 urn 1;. }. whi
d740: 6c 65 28 20 70 46 69 72 73 74 20 26 26 20 70 46 le( pFirst && pF
d750: 69 72 73 74 21 3d 70 45 6e 64 20 26 26 20 70 46 irst!=pEnd && pF
d760: 69 72 73 74 2d 3e 70 4e 65 78 74 20 26 26 20 70 irst->pNext && p
d770: 46 69 72 73 74 2d 3e 70 4e 65 78 74 21 3d 70 45 First->pNext!=pE
d780: 6e 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 nd ){. if( pF
d790: 69 72 73 74 2d 3e 65 54 79 70 65 3d 3d 54 54 5f irst->eType==TT_
d7a0: 49 64 20 26 26 20 70 46 69 72 73 74 2d 3e 70 4e Id && pFirst->pN
d7b0: 65 78 74 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 ext->zText[0]=='
d7c0: 28 27 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 (' ){. retu
d7d0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rn 0;. }.
d7e0: 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d pFirst = pFirst-
d7f0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 >pNext;. }. re
d800: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a turn 1;.}.../*.*
d810: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 * This routine i
d820: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 s called wheneve
d830: 72 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 r we encounter a
d840: 20 22 3b 22 20 6f 72 20 22 3d 22 2e 20 20 54 68 ";" or "=". Th
d850: 65 20 73 74 75 66 66 0a 2a 2a 20 62 65 74 77 65 e stuff.** betwe
d860: 65 6e 20 70 46 69 72 73 74 20 61 6e 64 20 70 4c en pFirst and pL
d870: 61 73 74 20 63 6f 6e 73 74 69 74 75 74 65 73 20 ast constitutes
d880: 65 69 74 68 65 72 20 61 20 74 79 70 65 64 65 66 either a typedef
d890: 20 6f 72 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 or a global.**
d8a0: 76 61 72 69 61 62 6c 65 20 64 65 66 69 6e 69 74 variable definit
d8b0: 69 6f 6e 2e 20 20 44 6f 20 74 68 65 20 72 69 67 ion. Do the rig
d8c0: 68 74 20 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 ht thing..*/.sta
d8d0: 74 69 63 20 69 6e 74 20 50 72 6f 63 65 73 73 44 tic int ProcessD
d8e0: 65 63 6c 28 54 6f 6b 65 6e 20 2a 70 46 69 72 73 ecl(Token *pFirs
d8f0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 t, Token *pEnd,
d900: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 54 6f int flags){. To
d910: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 44 65 ken *pName;. De
d920: 63 6c 20 2a 70 44 65 63 6c 3b 0a 20 20 69 6e 74 cl *pDecl;. int
d930: 20 69 73 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 isLocal = 0;.
d940: 69 6e 74 20 69 73 56 61 72 3b 0a 20 20 69 6e 74 int isVar;. int
d950: 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66 nErr = 0;.. if
d960: 28 20 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 70 ( pFirst==0 || p
d970: 45 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 End==0 ){. re
d980: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 turn 0;. }. if
d990: 28 20 66 6c 61 67 73 20 26 20 50 53 5f 54 79 70 ( flags & PS_Typ
d9a0: 65 64 65 66 20 29 7b 0a 20 20 20 20 69 66 28 20 edef ){. if(
d9b0: 28 66 6c 61 67 73 20 26 20 28 50 53 5f 45 78 70 (flags & (PS_Exp
d9c0: 6f 72 74 32 7c 50 53 5f 4c 6f 63 61 6c 32 29 29 ort2|PS_Local2))
d9d0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 !=0 ){. fpr
d9e0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a intf(stderr,"%s:
d9f0: 25 64 3a 20 5c 22 45 58 50 4f 52 54 5c 22 20 6f %d: \"EXPORT\" o
da00: 72 20 5c 22 4c 4f 43 41 4c 5c 22 20 69 67 6e 6f r \"LOCAL\" igno
da10: 72 65 64 20 62 65 66 6f 72 65 20 74 79 70 65 64 red before typed
da20: 65 66 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 ef.\n",.
da30: 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 72 73 zFilename, pFirs
da40: 74 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 t->nLine);.
da50: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 nErr++;. }.
da60: 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 if( (flags &
da70: 28 50 53 5f 49 6e 74 65 72 66 61 63 65 7c 50 53 (PS_Interface|PS
da80: 5f 45 78 70 6f 72 74 7c 50 53 5f 4c 6f 63 61 6c _Export|PS_Local
da90: 7c 44 50 5f 43 70 6c 75 73 70 6c 75 73 29 29 3d |DP_Cplusplus))=
daa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 =0 ){. /* I
dab0: 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 t is illegal to
dac0: 64 75 70 6c 69 63 61 74 65 20 61 20 74 79 70 65 duplicate a type
dad0: 64 65 66 20 69 6e 20 43 20 28 62 75 74 20 4f 4b def in C (but OK
dae0: 20 69 6e 20 43 2b 2b 29 2e 0a 20 20 20 20 20 20 in C++)..
daf0: 2a 2a 20 53 6f 20 64 6f 6e 27 74 20 72 65 63 6f ** So don't reco
db00: 72 64 20 74 79 70 65 64 65 66 73 20 74 68 61 74 rd typedefs that
db10: 20 61 72 65 6e 27 74 20 77 69 74 68 69 6e 20 61 aren't within a
db20: 20 43 2b 2b 20 66 69 6c 65 20 6f 72 0a 20 20 20 C++ file or.
db30: 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 23 69 66 ** within #if
db40: 20 49 4e 54 45 52 46 41 43 45 2e 2e 23 65 6e 64 INTERFACE..#end
db50: 69 66 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 if */. retu
db60: 72 6e 20 6e 45 72 72 3b 0a 20 20 20 20 7d 0a 20 rn nErr;. }.
db70: 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 if( (flags &
db80: 28 50 53 5f 49 6e 74 65 72 66 61 63 65 7c 50 53 (PS_Interface|PS
db90: 5f 45 78 70 6f 72 74 7c 50 53 5f 4c 6f 63 61 6c _Export|PS_Local
dba0: 29 29 3d 3d 30 20 26 26 20 70 72 6f 74 6f 5f 73 ))==0 && proto_s
dbb0: 74 61 74 69 63 3d 3d 30 20 29 7b 0a 20 20 20 20 tatic==0 ){.
dbc0: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 79 70 65 /* Ignore type
dbd0: 64 65 66 73 20 74 68 61 74 20 61 72 65 20 6e 6f defs that are no
dbe0: 74 20 77 69 74 68 20 22 23 69 66 20 49 4e 54 45 t with "#if INTE
dbf0: 52 46 41 43 45 2e 2e 23 65 6e 64 69 66 22 20 75 RFACE..#endif" u
dc00: 6e 6c 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 74 nless. ** t
dc10: 68 65 20 22 2d 6c 6f 63 61 6c 22 20 63 6f 6d 6d he "-local" comm
dc20: 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 and line option
dc30: 69 73 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 is used. */.
dc40: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 return nErr;.
dc50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c }. if( (fl
dc60: 61 67 73 20 26 20 28 50 53 5f 49 6e 74 65 72 66 ags & (PS_Interf
dc70: 61 63 65 7c 50 53 5f 45 78 70 6f 72 74 29 29 3d ace|PS_Export))=
dc80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 =0 ){. /* t
dc90: 79 70 65 64 65 66 73 20 61 72 65 20 61 6c 77 61 ypedefs are alwa
dca0: 79 73 20 6c 6f 63 61 6c 2c 20 75 6e 6c 65 73 73 ys local, unless
dcb0: 20 77 69 74 68 69 6e 20 23 69 66 20 49 4e 54 45 within #if INTE
dcc0: 52 46 41 43 45 2e 2e 23 65 6e 64 69 66 20 2a 2f RFACE..#endif */
dcd0: 0a 20 20 20 20 20 20 69 73 4c 6f 63 61 6c 20 3d . isLocal =
dce0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 1;. }. }els
dcf0: 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 50 e if( flags & (P
dd00: 53 5f 53 74 61 74 69 63 7c 50 53 5f 4c 6f 63 61 S_Static|PS_Loca
dd10: 6c 32 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 l2) ){. if( p
dd20: 72 6f 74 6f 5f 73 74 61 74 69 63 3d 3d 30 20 26 roto_static==0 &
dd30: 26 20 28 66 6c 61 67 73 20 26 20 50 53 5f 4c 6f & (flags & PS_Lo
dd40: 63 61 6c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 cal2)==0 ){.
dd50: 20 20 2f 2a 20 44 6f 6e 27 74 20 72 65 63 6f 72 /* Don't recor
dd60: 64 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c d static variabl
dd70: 65 73 20 75 6e 6c 65 73 73 20 74 68 65 20 22 2d es unless the "-
dd80: 6c 6f 63 61 6c 22 20 63 6f 6d 6d 61 6e 64 20 6c local" command l
dd90: 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 6f 70 74 ine. ** opt
dda0: 69 6f 6e 20 77 61 73 20 73 70 65 63 69 66 69 65 ion was specifie
ddb0: 64 20 6f 72 20 74 68 65 20 22 4c 4f 43 41 4c 22 d or the "LOCAL"
ddc0: 20 6b 65 79 77 6f 72 64 20 69 73 20 75 73 65 64 keyword is used
ddd0: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 . */. retur
dde0: 6e 20 6e 45 72 72 3b 0a 20 20 20 20 7d 0a 20 20 n nErr;. }.
ddf0: 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 21 while( pFirst!
de00: 3d 30 20 26 26 20 70 46 69 72 73 74 2d 3e 70 4e =0 && pFirst->pN
de10: 65 78 74 21 3d 70 45 6e 64 20 26 26 0a 20 20 20 ext!=pEnd &&.
de20: 20 20 20 20 28 28 70 46 69 72 73 74 2d 3e 6e 54 ((pFirst->nT
de30: 65 78 74 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d ext==6 && strncm
de40: 70 28 70 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c p(pFirst->zText,
de50: 22 73 74 61 74 69 63 22 2c 36 29 3d 3d 30 29 0a "static",6)==0).
de60: 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46 69 72 || (pFir
de70: 73 74 2d 3e 6e 54 65 78 74 3d 3d 35 20 26 26 20 st->nText==5 &&
de80: 73 74 72 6e 63 6d 70 28 70 46 69 72 73 74 2d 3e strncmp(pFirst->
de90: 7a 54 65 78 74 2c 22 4c 4f 43 41 4c 22 2c 36 29 zText,"LOCAL",6)
dea0: 3d 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 ==0)). ){.
deb0: 20 20 20 2f 2a 20 4c 6f 73 65 20 74 68 65 20 69 /* Lose the i
dec0: 6e 69 74 69 61 6c 20 22 73 74 61 74 69 63 22 20 nitial "static"
ded0: 6f 72 20 6c 6f 63 61 6c 20 66 72 6f 6d 20 6c 6f or local from lo
dee0: 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 cal variables..
def0: 20 20 20 20 20 2a 2a 20 57 65 27 6c 6c 20 70 72 ** We'll pr
df00: 65 70 65 6e 64 20 22 65 78 74 65 72 6e 22 20 6c epend "extern" l
df10: 61 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 ater. */. p
df20: 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e First = pFirst->
df30: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 73 4c pNext;. isL
df40: 6f 63 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a ocal = 1;. }.
df50: 20 20 20 20 69 66 28 20 70 46 69 72 73 74 3d 3d if( pFirst==
df60: 30 20 7c 7c 20 21 69 73 4c 6f 63 61 6c 20 29 7b 0 || !isLocal ){
df70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45 . return nE
df80: 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 rr;. }. }els
df90: 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 53 e if( flags & PS
dfa0: 5f 4d 65 74 68 6f 64 20 29 7b 0a 20 20 20 20 2f _Method ){. /
dfb0: 2a 20 4d 65 74 68 6f 64 73 20 61 72 65 20 64 65 * Methods are de
dfc0: 63 6c 61 72 65 64 20 62 79 20 74 68 65 69 72 20 clared by their
dfd0: 63 6c 61 73 73 2e 20 20 44 6f 6e 27 74 20 64 65 class. Don't de
dfe0: 63 6c 61 72 65 20 73 65 70 61 72 61 74 65 6c 79 clare separately
dff0: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 . */. return
e000: 6e 45 72 72 3b 0a 20 20 7d 0a 20 20 69 73 56 61 nErr;. }. isVa
e010: 72 20 3d 20 20 28 66 6c 61 67 73 20 26 20 28 50 r = (flags & (P
e020: 53 5f 54 79 70 65 64 65 66 7c 50 53 5f 4d 65 74 S_Typedef|PS_Met
e030: 68 6f 64 29 29 3d 3d 30 20 26 26 20 69 73 56 61 hod))==0 && isVa
e040: 72 69 61 62 6c 65 44 65 66 28 70 46 69 72 73 74 riableDef(pFirst
e050: 2c 70 45 6e 64 29 3b 0a 20 20 69 66 28 20 69 73 ,pEnd);. if( is
e060: 56 61 72 20 26 26 20 28 66 6c 61 67 73 20 26 20 Var && (flags &
e070: 28 50 53 5f 49 6e 74 65 72 66 61 63 65 7c 50 53 (PS_Interface|PS
e080: 5f 45 78 70 6f 72 74 7c 50 53 5f 4c 6f 63 61 6c _Export|PS_Local
e090: 29 29 21 3d 30 0a 20 20 26 26 20 28 66 6c 61 67 ))!=0. && (flag
e0a0: 73 20 26 20 50 53 5f 45 78 74 65 72 6e 29 3d 3d s & PS_Extern)==
e0b0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 0 ){. fprintf
e0c0: 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 (stderr,"%s:%d:
e0d0: 43 61 6e 27 74 20 64 65 66 69 6e 65 20 61 20 76 Can't define a v
e0e0: 61 72 69 61 62 6c 65 20 69 6e 20 74 68 69 73 20 ariable in this
e0f0: 63 6f 6e 74 65 78 74 5c 6e 22 2c 0a 20 20 20 20 context\n",.
e100: 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 zFilename, pFi
e110: 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 rst->nLine);.
e120: 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 nErr++;. }. p
e130: 4e 61 6d 65 20 3d 20 46 69 6e 64 44 65 63 6c 4e Name = FindDeclN
e140: 61 6d 65 28 70 46 69 72 73 74 2c 70 45 6e 64 2d ame(pFirst,pEnd-
e150: 3e 70 50 72 65 76 29 3b 0a 20 20 69 66 28 20 70 >pPrev);. if( p
e160: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 Name==0 ){. i
e170: 66 28 20 70 46 69 72 73 74 2d 3e 6e 54 65 78 74 f( pFirst->nText
e180: 3d 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28 70 ==4 && strncmp(p
e190: 46 69 72 73 74 2d 3e 7a 54 65 78 74 2c 22 65 6e First->zText,"en
e1a0: 75 6d 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20 um",4)==0 ){.
e1b0: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 63 6f 6d /* Ignore com
e1c0: 70 6c 65 74 65 6c 79 20 61 6e 6f 6e 79 6d 6f 75 pletely anonymou
e1d0: 73 20 65 6e 75 6d 73 2e 20 20 53 65 65 20 64 6f s enums. See do
e1e0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 73 65 63 74 cumentation sect
e1f0: 69 6f 6e 20 33 2e 38 2e 31 2e 20 2a 2f 0a 20 20 ion 3.8.1. */.
e200: 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b return nErr;
e210: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
e220: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 fprintf(stderr
e230: 2c 22 25 73 3a 25 64 3a 20 43 61 6e 27 74 20 66 ,"%s:%d: Can't f
e240: 69 6e 64 20 61 20 6e 61 6d 65 20 66 6f 72 20 74 ind a name for t
e250: 68 65 20 6f 62 6a 65 63 74 20 64 65 63 6c 61 72 he object declar
e260: 65 64 20 68 65 72 65 2e 5c 6e 22 2c 0a 20 20 20 ed here.\n",.
e270: 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 zFilename,
e280: 70 46 69 72 73 74 2d 3e 6e 4c 69 6e 65 29 3b 0a pFirst->nLine);.
e290: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 return nEr
e2a0: 72 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a r+1;. }. }..
e2b0: 23 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 69 #ifdef DEBUG. i
e2c0: 66 28 20 64 65 62 75 67 4d 61 73 6b 20 26 20 50 f( debugMask & P
e2d0: 41 52 53 45 52 20 29 7b 0a 20 20 20 20 69 66 28 ARSER ){. if(
e2e0: 20 66 6c 61 67 73 20 26 20 50 53 5f 54 79 70 65 flags & PS_Type
e2f0: 64 65 66 20 29 7b 0a 20 20 20 20 20 20 70 72 69 def ){. pri
e300: 6e 74 66 28 22 2a 2a 2a 2a 20 46 6f 75 6e 64 20 ntf("**** Found
e310: 74 79 70 65 64 65 66 20 25 2e 2a 73 20 61 74 20 typedef %.*s at
e320: 6c 69 6e 65 20 25 64 2e 2e 2e 5c 6e 22 2c 0a 20 line %d...\n",.
e330: 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 6e 54 pName->nT
e340: 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 7a 54 65 78 ext, pName->zTex
e350: 74 2c 20 70 4e 61 6d 65 2d 3e 6e 4c 69 6e 65 29 t, pName->nLine)
e360: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 ;. }else if(
e370: 69 73 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 isVar ){. p
e380: 72 69 6e 74 66 28 22 2a 2a 2a 2a 20 46 6f 75 6e rintf("**** Foun
e390: 64 20 76 61 72 69 61 62 6c 65 20 25 2e 2a 73 20 d variable %.*s
e3a0: 61 74 20 6c 69 6e 65 20 25 64 2e 2e 2e 5c 6e 22 at line %d...\n"
e3b0: 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d ,. pName-
e3c0: 3e 6e 54 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 7a >nText, pName->z
e3d0: 54 65 78 74 2c 20 70 4e 61 6d 65 2d 3e 6e 4c 69 Text, pName->nLi
e3e0: 6e 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a ne);. }else{.
e3f0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 2a 2a printf("**
e400: 2a 2a 20 46 6f 75 6e 64 20 70 72 6f 74 6f 74 79 ** Found prototy
e410: 70 65 20 25 2e 2a 73 20 61 74 20 6c 69 6e 65 20 pe %.*s at line
e420: 25 64 2e 2e 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 %d...\n",.
e430: 20 20 70 4e 61 6d 65 2d 3e 6e 54 65 78 74 2c 20 pName->nText,
e440: 70 4e 61 6d 65 2d 3e 7a 54 65 78 74 2c 20 70 4e pName->zText, pN
e450: 61 6d 65 2d 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 ame->nLine);.
e460: 20 7d 0a 20 20 20 20 50 72 69 6e 74 54 6f 6b 65 }. PrintToke
e470: 6e 73 28 70 46 69 72 73 74 2c 70 45 6e 64 2d 3e ns(pFirst,pEnd->
e480: 70 50 72 65 76 29 3b 0a 20 20 20 20 70 72 69 6e pPrev);. prin
e490: 74 66 28 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 23 tf(";\n");. }.#
e4a0: 65 6e 64 69 66 0a 0a 20 20 70 44 65 63 6c 20 3d endif.. pDecl =
e4b0: 20 43 72 65 61 74 65 44 65 63 6c 28 70 4e 61 6d CreateDecl(pNam
e4c0: 65 2d 3e 7a 54 65 78 74 2c 70 4e 61 6d 65 2d 3e e->zText,pName->
e4d0: 6e 54 65 78 74 29 3b 0a 20 20 69 66 28 20 28 66 nText);. if( (f
e4e0: 6c 61 67 73 20 26 20 50 53 5f 54 79 70 65 64 65 lags & PS_Typede
e4f0: 66 29 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 f) ){. DeclSe
e500: 74 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c tProperty(pDecl,
e510: 20 54 59 5f 54 79 70 65 64 65 66 29 3b 0a 20 20 TY_Typedef);.
e520: 7d 65 6c 73 65 20 69 66 28 20 69 73 56 61 72 20 }else if( isVar
e530: 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 50 72 ){. DeclSetPr
e540: 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f operty(pDecl,DP_
e550: 45 78 74 65 72 6e 52 65 71 64 20 7c 20 54 59 5f ExternReqd | TY_
e560: 56 61 72 69 61 62 6c 65 29 3b 0a 20 20 20 20 69 Variable);. i
e570: 66 28 20 21 28 66 6c 61 67 73 20 26 20 44 50 5f f( !(flags & DP_
e580: 43 70 6c 75 73 70 6c 75 73 29 20 29 7b 0a 20 20 Cplusplus) ){.
e590: 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f 70 65 DeclSetPrope
e5a0: 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 78 74 rty(pDecl,DP_Ext
e5b0: 65 72 6e 43 52 65 71 64 29 3b 0a 20 20 20 20 7d ernCReqd);. }
e5c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 44 65 . }else{. De
e5d0: 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 clSetProperty(pD
e5e0: 65 63 6c 2c 20 54 59 5f 53 75 62 72 6f 75 74 69 ecl, TY_Subrouti
e5f0: 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 21 28 66 ne);. if( !(f
e600: 6c 61 67 73 20 26 20 44 50 5f 43 70 6c 75 73 70 lags & DP_Cplusp
e610: 6c 75 73 29 20 29 7b 0a 20 20 20 20 20 20 44 65 lus) ){. De
e620: 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 clSetProperty(pD
e630: 65 63 6c 2c 44 50 5f 45 78 74 65 72 6e 43 52 65 ecl,DP_ExternCRe
e640: 71 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 qd);. }. }.
e650: 20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 pDecl->pComment
e660: 20 3d 20 70 46 69 72 73 74 2d 3e 70 43 6f 6d 6d = pFirst->pComm
e670: 65 6e 74 3b 0a 20 20 70 44 65 63 6c 2d 3e 7a 44 ent;. pDecl->zD
e680: 65 63 6c 20 3d 20 54 6f 6b 65 6e 73 54 6f 53 74 ecl = TokensToSt
e690: 72 69 6e 67 28 70 46 69 72 73 74 2c 70 45 6e 64 ring(pFirst,pEnd
e6a0: 2d 3e 70 50 72 65 76 2c 22 3b 5c 6e 22 2c 30 2c ->pPrev,";\n",0,
e6b0: 30 29 3b 0a 20 20 69 66 28 20 69 73 4c 6f 63 61 0);. if( isLoca
e6c0: 6c 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 28 50 l || (flags & (P
e6d0: 53 5f 4c 6f 63 61 6c 7c 50 53 5f 4c 6f 63 61 6c S_Local|PS_Local
e6e0: 32 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 44 65 2))!=0 ){. De
e6f0: 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 clSetProperty(pD
e700: 65 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29 3b 0a 20 ecl,DP_Local);.
e710: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 }else if( flags
e720: 20 26 20 28 50 53 5f 45 78 70 6f 72 74 7c 50 53 & (PS_Export|PS
e730: 5f 45 78 70 6f 72 74 32 29 20 29 7b 0a 20 20 20 _Export2) ){.
e740: 20 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 DeclSetProperty
e750: 28 70 44 65 63 6c 2c 44 50 5f 45 78 70 6f 72 74 (pDecl,DP_Export
e760: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 );. }. if( fla
e770: 67 73 20 26 20 44 50 5f 43 70 6c 75 73 70 6c 75 gs & DP_Cplusplu
e780: 73 20 29 7b 0a 20 20 20 20 44 65 63 6c 53 65 74 s ){. DeclSet
e790: 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 Property(pDecl,D
e7a0: 50 5f 43 70 6c 75 73 70 6c 75 73 29 3b 0a 20 20 P_Cplusplus);.
e7b0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b }. return nErr;
e7c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 .}../*.** Push a
e7d0: 6e 20 69 66 20 63 6f 6e 64 69 74 69 6f 6e 20 6f n if condition o
e7e0: 6e 74 6f 20 74 68 65 20 69 66 20 73 74 61 63 6b nto the if stack
e7f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
e800: 50 75 73 68 49 66 4d 61 63 72 6f 28 0a 20 20 63 PushIfMacro(. c
e810: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 66 onst char *zPref
e820: 69 78 2c 20 20 20 20 20 20 2f 2a 20 41 20 70 72 ix, /* A pr
e830: 65 66 69 78 2c 20 6c 69 6b 65 20 22 64 65 66 69 efix, like "defi
e840: 6e 65 22 20 6f 72 20 22 21 22 20 2a 2f 0a 20 20 ne" or "!" */.
e850: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 const char *zTex
e860: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 t, /* The
e870: 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 condition */.
e880: 69 6e 74 20 6e 54 65 78 74 2c 20 20 20 20 20 20 int nText,
e890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
e8a0: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 ber of character
e8b0: 73 20 69 6e 20 7a 54 65 78 74 20 2a 2f 0a 20 20 s in zText */.
e8c0: 69 6e 74 20 6e 4c 69 6e 65 2c 20 20 20 20 20 20 int nLine,
e8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e /* Lin
e8e0: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 e number where t
e8f0: 68 69 73 20 6d 61 63 72 6f 20 6f 63 63 75 72 73 his macro occurs
e900: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 */. int flags
e910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e920: 2f 2a 20 45 69 74 68 65 72 20 30 2c 20 50 53 5f /* Either 0, PS_
e930: 49 6e 74 65 72 66 61 63 65 2c 20 50 53 5f 45 78 Interface, PS_Ex
e940: 70 6f 72 74 20 6f 72 20 50 53 5f 4c 6f 63 61 6c port or PS_Local
e950: 20 2a 2f 0a 29 7b 0a 20 20 49 66 6d 61 63 72 6f */.){. Ifmacro
e960: 20 2a 70 49 66 3b 0a 20 20 69 6e 74 20 6e 42 79 *pIf;. int nBy
e970: 74 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 te;.. nByte = s
e980: 69 7a 65 6f 66 28 49 66 6d 61 63 72 6f 29 3b 0a izeof(Ifmacro);.
e990: 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 if( zText ){.
e9a0: 20 20 20 69 66 28 20 7a 50 72 65 66 69 78 20 29 if( zPrefix )
e9b0: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d {. nByte +=
e9c0: 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78 29 strlen(zPrefix)
e9d0: 20 2b 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 + 2;. }.
e9e0: 6e 42 79 74 65 20 2b 3d 20 6e 54 65 78 74 20 2b nByte += nText +
e9f0: 20 31 3b 0a 20 20 7d 0a 20 20 70 49 66 20 3d 20 1;. }. pIf =
ea00: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 SafeMalloc( nByt
ea10: 65 20 29 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 e );. if( zText
ea20: 20 29 7b 0a 20 20 20 20 70 49 66 2d 3e 7a 43 6f ){. pIf->zCo
ea30: 6e 64 69 74 69 6f 6e 20 3d 20 28 63 68 61 72 2a ndition = (char*
ea40: 29 26 70 49 66 5b 31 5d 3b 0a 20 20 20 20 69 66 )&pIf[1];. if
ea50: 28 20 7a 50 72 65 66 69 78 20 29 7b 0a 20 20 20 ( zPrefix ){.
ea60: 20 20 20 73 70 72 69 6e 74 66 28 70 49 66 2d 3e sprintf(pIf->
ea70: 7a 43 6f 6e 64 69 74 69 6f 6e 2c 22 25 73 28 25 zCondition,"%s(%
ea80: 2e 2a 73 29 22 2c 7a 50 72 65 66 69 78 2c 6e 54 .*s)",zPrefix,nT
ea90: 65 78 74 2c 7a 54 65 78 74 29 3b 0a 20 20 20 20 ext,zText);.
eaa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 70 72 }else{. spr
eab0: 69 6e 74 66 28 70 49 66 2d 3e 7a 43 6f 6e 64 69 intf(pIf->zCondi
eac0: 74 69 6f 6e 2c 22 25 2e 2a 73 22 2c 6e 54 65 78 tion,"%.*s",nTex
ead0: 74 2c 7a 54 65 78 74 29 3b 0a 20 20 20 20 7d 0a t,zText);. }.
eae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 66 }else{. pIf
eaf0: 2d 3e 7a 43 6f 6e 64 69 74 69 6f 6e 20 3d 20 30 ->zCondition = 0
eb00: 3b 0a 20 20 7d 0a 20 20 70 49 66 2d 3e 6e 4c 69 ;. }. pIf->nLi
eb10: 6e 65 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 70 49 ne = nLine;. pI
eb20: 66 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 f->flags = flags
eb30: 3b 0a 20 20 70 49 66 2d 3e 70 4e 65 78 74 20 3d ;. pIf->pNext =
eb40: 20 69 66 53 74 61 63 6b 3b 0a 20 20 69 66 53 74 ifStack;. ifSt
eb50: 61 63 6b 20 3d 20 70 49 66 3b 0a 7d 0a 0a 2f 2a ack = pIf;.}../*
eb60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
eb70: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 is called to ha
eb80: 6e 64 6c 65 20 61 6c 6c 20 70 72 65 70 72 6f 63 ndle all preproc
eb90: 65 73 73 6f 72 20 64 69 72 65 63 74 69 76 65 73 essor directives
eba0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 ..**.** This rou
ebb0: 74 69 6e 65 20 77 69 6c 6c 20 72 65 63 6f 6d 70 tine will recomp
ebc0: 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 ute the value of
ebd0: 20 2a 70 50 72 65 73 65 74 46 6c 61 67 73 20 74 *pPresetFlags t
ebe0: 6f 20 62 65 20 74 68 65 0a 2a 2a 20 6c 6f 67 69 o be the.** logi
ebf0: 63 61 6c 20 6f 72 20 6f 66 20 61 6c 6c 20 66 6c cal or of all fl
ec00: 61 67 73 20 6f 6e 20 61 6c 6c 20 6e 65 73 74 65 ags on all neste
ec10: 64 20 23 69 66 73 2e 20 20 54 68 65 20 23 69 66 d #ifs. The #if
ec20: 73 20 74 68 61 74 20 73 65 74 20 66 6c 61 67 73 s that set flags
ec30: 0a 2a 2a 20 61 72 65 20 61 73 20 66 6f 6c 6c 6f .** are as follo
ec40: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 ws:.**.**
ec50: 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 20 20 20 conditional
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 f
ec70: 6c 61 67 20 73 65 74 0a 2a 2a 20 20 20 20 20 20 lag set.**
ec80: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------
ec90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 ----------
eca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ecb0: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 20 20 23 ----.** #
ecc0: 69 66 20 49 4e 54 45 52 46 41 43 45 20 20 20 20 if INTERFACE
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 53 5f PS_
ece0: 49 6e 74 65 72 66 61 63 65 0a 2a 2a 20 20 20 20 Interface.**
ecf0: 20 20 20 20 23 69 66 20 45 58 50 4f 52 54 5f 49 #if EXPORT_I
ed00: 4e 54 45 52 46 41 43 45 20 20 20 20 20 20 20 20 NTERFACE
ed10: 20 20 50 53 5f 45 78 70 6f 72 74 0a 2a 2a 20 20 PS_Export.**
ed20: 20 20 20 20 20 20 23 69 66 20 4c 4f 43 41 4c 5f #if LOCAL_
ed30: 49 4e 54 45 52 46 41 43 45 20 20 20 20 20 20 20 INTERFACE
ed40: 20 20 20 20 50 53 5f 4c 6f 63 61 6c 0a 2a 2a 0a PS_Local.**.
ed50: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 ** For example,
ed60: 69 66 20 61 66 74 65 72 20 70 72 6f 63 65 73 73 if after process
ed70: 69 6e 67 20 74 68 65 20 70 72 65 70 72 6f 63 65 ing the preproce
ed80: 73 73 6f 72 20 74 6f 6b 65 6e 20 67 69 76 65 6e ssor token given
ed90: 0a 2a 2a 20 62 79 20 70 54 6f 6b 65 6e 20 74 68 .** by pToken th
eda0: 65 72 65 20 69 73 20 61 6e 20 22 23 69 66 20 49 ere is an "#if I
edb0: 4e 54 45 52 46 41 43 45 22 20 6f 6e 20 74 68 65 NTERFACE" on the
edc0: 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 2a 2a preprocessor.**
edd0: 20 73 74 61 63 6b 2c 20 74 68 65 6e 20 2a 70 50 stack, then *pP
ede0: 72 65 73 65 74 46 6c 61 67 73 20 77 69 6c 6c 20 resetFlags will
edf0: 62 65 20 73 65 74 20 74 6f 20 50 53 5f 49 6e 74 be set to PS_Int
ee00: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 erface..*/.stati
ee10: 63 20 69 6e 74 20 50 61 72 73 65 50 72 65 70 72 c int ParsePrepr
ee20: 6f 63 65 73 73 6f 72 28 54 6f 6b 65 6e 20 2a 70 ocessor(Token *p
ee30: 54 6f 6b 65 6e 2c 20 69 6e 74 20 66 6c 61 67 73 Token, int flags
ee40: 2c 20 69 6e 74 20 2a 70 50 72 65 73 65 74 46 6c , int *pPresetFl
ee50: 61 67 73 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 ags){. const ch
ee60: 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 6e 74 20 ar *zCmd;. int
ee70: 6e 43 6d 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 nCmd;. const ch
ee80: 61 72 20 2a 7a 41 72 67 3b 0a 20 20 69 6e 74 20 ar *zArg;. int
ee90: 6e 41 72 67 3b 0a 20 20 69 6e 74 20 6e 45 72 72 nArg;. int nErr
eea0: 20 3d 20 30 3b 0a 20 20 49 66 6d 61 63 72 6f 20 = 0;. Ifmacro
eeb0: 2a 70 49 66 3b 0a 0a 20 20 7a 43 6d 64 20 3d 20 *pIf;.. zCmd =
eec0: 26 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 5b 31 &pToken->zText[1
eed0: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 ];. while( issp
eee0: 61 63 65 28 2a 7a 43 6d 64 29 20 26 26 20 2a 7a ace(*zCmd) && *z
eef0: 43 6d 64 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 Cmd!='\n' ){.
ef00: 20 7a 43 6d 64 2b 2b 3b 0a 20 20 7d 0a 20 20 69 zCmd++;. }. i
ef10: 66 28 20 21 69 73 61 6c 70 68 61 28 2a 7a 43 6d f( !isalpha(*zCm
ef20: 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e d) ){. return
ef30: 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 6d 64 20 3d 0;. }. nCmd =
ef40: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 61 1;. while( isa
ef50: 6c 70 68 61 28 7a 43 6d 64 5b 6e 43 6d 64 5d 29 lpha(zCmd[nCmd])
ef60: 20 29 7b 0a 20 20 20 20 6e 43 6d 64 2b 2b 3b 0a ){. nCmd++;.
ef70: 20 20 7d 0a 0a 20 20 69 66 28 20 6e 43 6d 64 3d }.. if( nCmd=
ef80: 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 43 =5 && strncmp(zC
ef90: 6d 64 2c 22 65 6e 64 69 66 22 2c 35 29 3d 3d 30 md,"endif",5)==0
efa0: 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a ){. /*. *
efb0: 2a 20 50 6f 70 20 74 68 65 20 69 66 20 73 74 61 * Pop the if sta
efc0: 63 6b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 ck. */. pI
efd0: 66 20 3d 20 69 66 53 74 61 63 6b 3b 0a 20 20 20 f = ifStack;.
efe0: 20 69 66 28 20 70 49 66 3d 3d 30 20 29 7b 0a 20 if( pIf==0 ){.
eff0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 fprintf(std
f000: 65 72 72 2c 22 25 73 3a 25 64 3a 20 65 78 74 72 err,"%s:%d: extr
f010: 61 20 27 23 65 6e 64 69 66 27 2e 5c 6e 22 2c 7a a '#endif'.\n",z
f020: 46 69 6c 65 6e 61 6d 65 2c 70 54 6f 6b 65 6e 2d Filename,pToken-
f030: 3e 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 72 >nLine);. r
f040: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 eturn 1;. }.
f050: 20 20 20 69 66 53 74 61 63 6b 20 3d 20 70 49 66 ifStack = pIf
f060: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 53 61 66 ->pNext;. Saf
f070: 65 46 72 65 65 28 70 49 66 29 3b 0a 20 20 7d 65 eFree(pIf);. }e
f080: 6c 73 65 20 69 66 28 20 6e 43 6d 64 3d 3d 36 20 lse if( nCmd==6
f090: 26 26 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c && strncmp(zCmd,
f0a0: 22 64 65 66 69 6e 65 22 2c 36 29 3d 3d 30 20 29 "define",6)==0 )
f0b0: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 {. /*. **
f0c0: 52 65 63 6f 72 64 20 61 20 23 64 65 66 69 6e 65 Record a #define
f0d0: 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 50 53 if we are in PS
f0e0: 5f 49 6e 74 65 72 66 61 63 65 20 6f 72 20 50 53 _Interface or PS
f0f0: 5f 45 78 70 6f 72 74 0a 20 20 20 20 2a 2f 0a 20 _Export. */.
f100: 20 20 20 44 65 63 6c 20 2a 70 44 65 63 6c 3b 0a Decl *pDecl;.
f110: 20 20 20 20 69 66 28 20 21 28 66 6c 61 67 73 20 if( !(flags
f120: 26 20 28 50 53 5f 4c 6f 63 61 6c 7c 50 53 5f 49 & (PS_Local|PS_I
f130: 6e 74 65 72 66 61 63 65 7c 50 53 5f 45 78 70 6f nterface|PS_Expo
f140: 72 74 29 29 20 29 7b 20 72 65 74 75 72 6e 20 30 rt)) ){ return 0
f150: 3b 20 7d 0a 20 20 20 20 7a 41 72 67 20 3d 20 26 ; }. zArg = &
f160: 7a 43 6d 64 5b 36 5d 3b 0a 20 20 20 20 77 68 69 zCmd[6];. whi
f170: 6c 65 28 20 2a 7a 41 72 67 20 26 26 20 69 73 73 le( *zArg && iss
f180: 70 61 63 65 28 2a 7a 41 72 67 29 20 26 26 20 2a pace(*zArg) && *
f190: 7a 41 72 67 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 zArg!='\n' ){.
f1a0: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 zArg++;.
f1b0: 7d 0a 20 20 20 20 69 66 28 20 2a 7a 41 72 67 3d }. if( *zArg=
f1c0: 3d 30 20 7c 7c 20 2a 7a 41 72 67 3d 3d 27 5c 6e =0 || *zArg=='\n
f1d0: 27 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d ' ){ return 0; }
f1e0: 0a 20 20 20 20 66 6f 72 28 6e 41 72 67 3d 30 3b . for(nArg=0;
f1f0: 20 49 53 41 4c 4e 55 4d 28 7a 41 72 67 5b 6e 41 ISALNUM(zArg[nA
f200: 72 67 5d 29 3b 20 6e 41 72 67 2b 2b 29 7b 7d 0a rg]); nArg++){}.
f210: 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 if( nArg==0
f220: 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a 20 ){ return 0; }.
f230: 20 20 20 70 44 65 63 6c 20 3d 20 43 72 65 61 74 pDecl = Creat
f240: 65 44 65 63 6c 28 7a 41 72 67 2c 6e 41 72 67 29 eDecl(zArg,nArg)
f250: 3b 0a 20 20 20 20 70 44 65 63 6c 2d 3e 70 43 6f ;. pDecl->pCo
f260: 6d 6d 65 6e 74 20 3d 20 70 54 6f 6b 65 6e 2d 3e mment = pToken->
f270: 70 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 44 65 pComment;. De
f280: 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 clSetProperty(pD
f290: 65 63 6c 2c 54 59 5f 4d 61 63 72 6f 29 3b 0a 20 ecl,TY_Macro);.
f2a0: 20 20 20 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 20 pDecl->zDecl
f2b0: 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 70 54 = SafeMalloc( pT
f2c0: 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 2b 20 32 20 oken->nText + 2
f2d0: 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70 );. sprintf(p
f2e0: 44 65 63 6c 2d 3e 7a 44 65 63 6c 2c 22 25 2e 2a Decl->zDecl,"%.*
f2f0: 73 5c 6e 22 2c 70 54 6f 6b 65 6e 2d 3e 6e 54 65 s\n",pToken->nTe
f300: 78 74 2c 70 54 6f 6b 65 6e 2d 3e 7a 54 65 78 74 xt,pToken->zText
f310: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 );. if( flags
f320: 20 26 20 50 53 5f 45 78 70 6f 72 74 20 29 7b 0a & PS_Export ){.
f330: 20 20 20 20 20 20 44 65 63 6c 53 65 74 50 72 6f DeclSetPro
f340: 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 perty(pDecl,DP_E
f350: 78 70 6f 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 xport);. }els
f360: 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 53 e if( flags & PS
f370: 5f 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 _Local ){.
f380: 44 65 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 DeclSetProperty(
f390: 70 44 65 63 6c 2c 44 50 5f 4c 6f 63 61 6c 29 3b pDecl,DP_Local);
f3a0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 . }. }else i
f3b0: 66 28 20 6e 43 6d 64 3d 3d 37 20 26 26 20 73 74 f( nCmd==7 && st
f3c0: 72 6e 63 6d 70 28 7a 43 6d 64 2c 22 69 6e 63 6c rncmp(zCmd,"incl
f3d0: 75 64 65 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 ude",7)==0 ){.
f3e0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 63 6f /*. ** Reco
f3f0: 72 64 20 61 6e 20 23 69 6e 63 6c 75 64 65 20 69 rd an #include i
f400: 66 20 77 65 20 61 72 65 20 69 6e 20 50 53 5f 49 f we are in PS_I
f410: 6e 74 65 72 66 61 63 65 20 6f 72 20 50 53 5f 45 nterface or PS_E
f420: 78 70 6f 72 74 0a 20 20 20 20 2a 2f 0a 20 20 20 xport. */.
f430: 20 49 6e 63 6c 75 64 65 20 2a 70 49 6e 63 6c 75 Include *pInclu
f440: 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 de;. char *zI
f450: 66 3b 0a 0a 20 20 20 20 69 66 28 20 21 28 66 6c f;.. if( !(fl
f460: 61 67 73 20 26 20 28 50 53 5f 49 6e 74 65 72 66 ags & (PS_Interf
f470: 61 63 65 7c 50 53 5f 45 78 70 6f 72 74 29 29 20 ace|PS_Export))
f480: 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a 20 ){ return 0; }.
f490: 20 20 20 7a 41 72 67 20 3d 20 26 7a 43 6d 64 5b zArg = &zCmd[
f4a0: 37 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7];. while( *
f4b0: 7a 41 72 67 20 26 26 20 69 73 73 70 61 63 65 28 zArg && isspace(
f4c0: 2a 7a 41 72 67 29 20 29 7b 20 7a 41 72 67 2b 2b *zArg) ){ zArg++
f4d0: 3b 20 7d 0a 20 20 20 20 66 6f 72 28 6e 41 72 67 ; }. for(nArg
f4e0: 3d 30 3b 20 21 69 73 73 70 61 63 65 28 7a 41 72 =0; !isspace(zAr
f4f0: 67 5b 6e 41 72 67 5d 29 3b 20 6e 41 72 67 2b 2b g[nArg]); nArg++
f500: 29 7b 7d 0a 20 20 20 20 69 66 28 20 28 7a 41 72 ){}. if( (zAr
f510: 67 5b 30 5d 3d 3d 27 22 27 20 26 26 20 7a 41 72 g[0]=='"' && zAr
f520: 67 5b 6e 41 72 67 2d 31 5d 21 3d 27 22 27 29 0a g[nArg-1]!='"').
f530: 20 20 20 20 20 20 7c 7c 28 7a 41 72 67 5b 30 5d ||(zArg[0]
f540: 3d 3d 27 3c 27 20 26 26 20 7a 41 72 67 5b 6e 41 =='<' && zArg[nA
f550: 72 67 2d 31 5d 21 3d 27 3e 27 29 0a 20 20 20 20 rg-1]!='>').
f560: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 ){. fprintf
f570: 28 73 74 64 65 72 72 2c 22 25 73 3a 25 64 3a 20 (stderr,"%s:%d:
f580: 6d 61 6c 66 6f 72 6d 65 64 20 23 69 6e 63 6c 75 malformed #inclu
f590: 64 65 20 73 74 61 74 65 6d 65 6e 74 2e 5c 6e 22 de statement.\n"
f5a0: 2c 0a 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e ,. zFilen
f5b0: 61 6d 65 2c 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e ame,pToken->nLin
f5c0: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e e);. return
f5d0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 1;. }. zI
f5e0: 66 20 3d 20 47 65 74 49 66 53 74 72 69 6e 67 28 f = GetIfString(
f5f0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 49 66 20 29 );. if( zIf )
f600: 7b 0a 20 20 20 20 20 20 70 49 6e 63 6c 75 64 65 {. pInclude
f610: 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 = SafeMalloc( s
f620: 69 7a 65 6f 66 28 49 6e 63 6c 75 64 65 29 20 2b izeof(Include) +
f630: 20 6e 41 72 67 2a 32 20 2b 20 73 74 72 6c 65 6e nArg*2 + strlen
f640: 28 7a 49 66 29 20 2b 20 31 30 20 29 3b 0a 20 20 (zIf) + 10 );.
f650: 20 20 20 20 70 49 6e 63 6c 75 64 65 2d 3e 7a 46 pInclude->zF
f660: 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 ile = (char*)&pI
f670: 6e 63 6c 75 64 65 5b 31 5d 3b 0a 20 20 20 20 20 nclude[1];.
f680: 20 70 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61 62 65 pInclude->zLabe
f690: 6c 20 3d 20 26 70 49 6e 63 6c 75 64 65 2d 3e 7a l = &pInclude->z
f6a0: 46 69 6c 65 5b 6e 41 72 67 2b 31 5d 3b 0a 20 20 File[nArg+1];.
f6b0: 20 20 20 20 73 70 72 69 6e 74 66 28 70 49 6e 63 sprintf(pInc
f6c0: 6c 75 64 65 2d 3e 7a 46 69 6c 65 2c 22 25 2e 2a lude->zFile,"%.*
f6d0: 73 22 2c 6e 41 72 67 2c 7a 41 72 67 29 3b 0a 20 s",nArg,zArg);.
f6e0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 70 49 6e sprintf(pIn
f6f0: 63 6c 75 64 65 2d 3e 7a 4c 61 62 65 6c 2c 22 25 clude->zLabel,"%
f700: 2e 2a 73 3a 25 73 22 2c 6e 41 72 67 2c 7a 41 72 .*s:%s",nArg,zAr
f710: 67 2c 7a 49 66 29 3b 0a 20 20 20 20 20 20 70 49 g,zIf);. pI
f720: 6e 63 6c 75 64 65 2d 3e 7a 49 66 20 3d 20 26 70 nclude->zIf = &p
f730: 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61 62 65 6c 5b Include->zLabel[
f740: 6e 41 72 67 2b 31 5d 3b 0a 20 20 20 20 20 20 53 nArg+1];. S
f750: 61 66 65 46 72 65 65 28 7a 49 66 29 3b 0a 20 20 afeFree(zIf);.
f760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 }else{. p
f770: 49 6e 63 6c 75 64 65 20 3d 20 53 61 66 65 4d 61 Include = SafeMa
f780: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 63 lloc( sizeof(Inc
f790: 6c 75 64 65 29 20 2b 20 6e 41 72 67 20 2b 20 31 lude) + nArg + 1
f7a0: 20 29 3b 0a 20 20 20 20 20 20 70 49 6e 63 6c 75 );. pInclu
f7b0: 64 65 2d 3e 7a 46 69 6c 65 20 3d 20 28 63 68 61 de->zFile = (cha
f7c0: 72 2a 29 26 70 49 6e 63 6c 75 64 65 5b 31 5d 3b r*)&pInclude[1];
f7d0: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 70 . sprintf(p
f7e0: 49 6e 63 6c 75 64 65 2d 3e 7a 46 69 6c 65 2c 22 Include->zFile,"
f7f0: 25 2e 2a 73 22 2c 6e 41 72 67 2c 7a 41 72 67 29 %.*s",nArg,zArg)
f800: 3b 0a 20 20 20 20 20 20 70 49 6e 63 6c 75 64 65 ;. pInclude
f810: 2d 3e 7a 49 66 20 3d 20 30 3b 0a 20 20 20 20 20 ->zIf = 0;.
f820: 20 70 49 6e 63 6c 75 64 65 2d 3e 7a 4c 61 62 65 pInclude->zLabe
f830: 6c 20 3d 20 70 49 6e 63 6c 75 64 65 2d 3e 7a 46 l = pInclude->zF
f840: 69 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 ile;. }. p
f850: 49 6e 63 6c 75 64 65 2d 3e 70 4e 65 78 74 20 3d Include->pNext =
f860: 20 69 6e 63 6c 75 64 65 4c 69 73 74 3b 0a 20 20 includeList;.
f870: 20 20 69 6e 63 6c 75 64 65 4c 69 73 74 20 3d 20 includeList =
f880: 70 49 6e 63 6c 75 64 65 3b 0a 20 20 7d 65 6c 73 pInclude;. }els
f890: 65 20 69 66 28 20 6e 43 6d 64 3d 3d 32 20 26 26 e if( nCmd==2 &&
f8a0: 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c 22 69 strncmp(zCmd,"i
f8b0: 66 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 f",2)==0 ){.
f8c0: 2f 2a 0a 20 20 20 20 2a 2a 20 50 75 73 68 20 61 /*. ** Push a
f8d0: 6e 20 23 69 66 2e 20 20 57 61 74 63 68 20 66 6f n #if. Watch fo
f8e0: 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 r the special ca
f8f0: 73 65 73 20 6f 66 20 49 4e 54 45 52 46 41 43 45 ses of INTERFACE
f900: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 45 58 50 4f . ** and EXPO
f910: 52 54 5f 49 4e 54 45 52 46 41 43 45 20 61 6e 64 RT_INTERFACE and
f920: 20 4c 4f 43 41 4c 5f 49 4e 54 45 52 46 41 43 45 LOCAL_INTERFACE
f930: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 41 72 67 . */. zArg
f940: 20 3d 20 26 7a 43 6d 64 5b 32 5d 3b 0a 20 20 20 = &zCmd[2];.
f950: 20 77 68 69 6c 65 28 20 2a 7a 41 72 67 20 26 26 while( *zArg &&
f960: 20 69 73 73 70 61 63 65 28 2a 7a 41 72 67 29 20 isspace(*zArg)
f970: 26 26 20 2a 7a 41 72 67 21 3d 27 5c 6e 27 20 29 && *zArg!='\n' )
f980: 7b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a {. zArg++;.
f990: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 7a }. if( *z
f9a0: 41 72 67 3d 3d 30 20 7c 7c 20 2a 7a 41 72 67 3d Arg==0 || *zArg=
f9b0: 3d 27 5c 6e 27 20 29 7b 20 72 65 74 75 72 6e 20 ='\n' ){ return
f9c0: 30 3b 20 7d 0a 20 20 20 20 6e 41 72 67 20 3d 20 0; }. nArg =
f9d0: 70 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 2b 20 pToken->nText +
f9e0: 28 69 6e 74 29 28 70 54 6f 6b 65 6e 2d 3e 7a 54 (int)(pToken->zT
f9f0: 65 78 74 20 2d 20 7a 41 72 67 29 3b 0a 20 20 20 ext - zArg);.
fa00: 20 69 66 28 20 6e 41 72 67 3d 3d 39 20 26 26 20 if( nArg==9 &&
fa10: 73 74 72 6e 63 6d 70 28 7a 41 72 67 2c 22 49 4e strncmp(zArg,"IN
fa20: 54 45 52 46 41 43 45 22 2c 39 29 3d 3d 30 20 29 TERFACE",9)==0 )
fa30: 7b 0a 20 20 20 20 20 20 50 75 73 68 49 66 4d 61 {. PushIfMa
fa40: 63 72 6f 28 30 2c 30 2c 30 2c 70 54 6f 6b 65 6e cro(0,0,0,pToken
fa50: 2d 3e 6e 4c 69 6e 65 2c 50 53 5f 49 6e 74 65 72 ->nLine,PS_Inter
fa60: 66 61 63 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 face);. }else
fa70: 20 69 66 28 20 6e 41 72 67 3d 3d 31 36 20 26 26 if( nArg==16 &&
fa80: 20 73 74 72 6e 63 6d 70 28 7a 41 72 67 2c 22 45 strncmp(zArg,"E
fa90: 58 50 4f 52 54 5f 49 4e 54 45 52 46 41 43 45 22 XPORT_INTERFACE"
faa0: 2c 31 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 ,16)==0 ){.
fab0: 20 50 75 73 68 49 66 4d 61 63 72 6f 28 30 2c 30 PushIfMacro(0,0
fac0: 2c 30 2c 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 ,0,pToken->nLine
fad0: 2c 50 53 5f 45 78 70 6f 72 74 29 3b 0a 20 20 20 ,PS_Export);.
fae0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d }else if( nArg=
faf0: 3d 31 35 20 26 26 20 73 74 72 6e 63 6d 70 28 7a =15 && strncmp(z
fb00: 41 72 67 2c 22 4c 4f 43 41 4c 5f 49 4e 54 45 52 Arg,"LOCAL_INTER
fb10: 46 41 43 45 22 2c 31 35 29 3d 3d 30 20 29 7b 0a FACE",15)==0 ){.
fb20: 20 20 20 20 20 20 50 75 73 68 49 66 4d 61 63 72 PushIfMacr
fb30: 6f 28 30 2c 30 2c 30 2c 70 54 6f 6b 65 6e 2d 3e o(0,0,0,pToken->
fb40: 6e 4c 69 6e 65 2c 50 53 5f 4c 6f 63 61 6c 29 3b nLine,PS_Local);
fb50: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e . }else if( n
fb60: 41 72 67 3d 3d 31 35 20 26 26 20 73 74 72 6e 63 Arg==15 && strnc
fb70: 6d 70 28 7a 41 72 67 2c 22 4d 41 4b 45 48 45 41 mp(zArg,"MAKEHEA
fb80: 44 45 52 53 5f 53 54 4f 50 4c 4f 43 41 4c 5f 49 DERS_STOPLOCAL_I
fb90: 4e 54 45 52 46 41 43 45 22 2c 31 35 29 3d 3d 30 NTERFACE",15)==0
fba0: 20 29 7b 0a 20 20 20 20 20 20 50 75 73 68 49 66 ){. PushIf
fbb0: 4d 61 63 72 6f 28 30 2c 30 2c 30 2c 70 54 6f 6b Macro(0,0,0,pTok
fbc0: 65 6e 2d 3e 6e 4c 69 6e 65 2c 50 53 5f 4c 6f 63 en->nLine,PS_Loc
fbd0: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a al);. }else{.
fbe0: 20 20 20 20 20 20 50 75 73 68 49 66 4d 61 63 72 PushIfMacr
fbf0: 6f 28 30 2c 7a 41 72 67 2c 6e 41 72 67 2c 70 54 o(0,zArg,nArg,pT
fc00: 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 30 29 3b 0a oken->nLine,0);.
fc10: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 }. }else if
fc20: 28 20 6e 43 6d 64 3d 3d 35 20 26 26 20 73 74 72 ( nCmd==5 && str
fc30: 6e 63 6d 70 28 7a 43 6d 64 2c 22 69 66 64 65 66 ncmp(zCmd,"ifdef
fc40: 22 2c 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f ",5)==0 ){. /
fc50: 2a 0a 20 20 20 20 2a 2a 20 50 75 73 68 20 61 6e *. ** Push an
fc60: 20 23 69 66 64 65 66 2e 0a 20 20 20 20 2a 2f 0a #ifdef.. */.
fc70: 20 20 20 20 7a 41 72 67 20 3d 20 26 7a 43 6d 64 zArg = &zCmd
fc80: 5b 35 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 [5];. while(
fc90: 2a 7a 41 72 67 20 26 26 20 69 73 73 70 61 63 65 *zArg && isspace
fca0: 28 2a 7a 41 72 67 29 20 26 26 20 2a 7a 41 72 67 (*zArg) && *zArg
fcb0: 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 !='\n' ){.
fcc0: 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 zArg++;. }.
fcd0: 20 20 69 66 28 20 2a 7a 41 72 67 3d 3d 30 20 7c if( *zArg==0 |
fce0: 7c 20 2a 7a 41 72 67 3d 3d 27 5c 6e 27 20 29 7b | *zArg=='\n' ){
fcf0: 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a 20 20 20 return 0; }.
fd00: 20 6e 41 72 67 20 3d 20 70 54 6f 6b 65 6e 2d 3e nArg = pToken->
fd10: 6e 54 65 78 74 20 2b 20 28 69 6e 74 29 28 70 54 nText + (int)(pT
fd20: 6f 6b 65 6e 2d 3e 7a 54 65 78 74 20 2d 20 7a 41 oken->zText - zA
fd30: 72 67 29 3b 0a 20 20 20 20 50 75 73 68 49 66 4d rg);. PushIfM
fd40: 61 63 72 6f 28 22 64 65 66 69 6e 65 64 22 2c 7a acro("defined",z
fd50: 41 72 67 2c 6e 41 72 67 2c 70 54 6f 6b 65 6e 2d Arg,nArg,pToken-
fd60: 3e 6e 4c 69 6e 65 2c 30 29 3b 0a 20 20 7d 65 6c >nLine,0);. }el
fd70: 73 65 20 69 66 28 20 6e 43 6d 64 3d 3d 36 20 26 se if( nCmd==6 &
fd80: 26 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c 22 & strncmp(zCmd,"
fd90: 69 66 6e 64 65 66 22 2c 36 29 3d 3d 30 20 29 7b ifndef",6)==0 ){
fda0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 . /*. ** P
fdb0: 75 73 68 20 61 6e 20 23 69 66 6e 64 65 66 2e 0a ush an #ifndef..
fdc0: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 41 72 67 20 */. zArg
fdd0: 3d 20 26 7a 43 6d 64 5b 36 5d 3b 0a 20 20 20 20 = &zCmd[6];.
fde0: 77 68 69 6c 65 28 20 2a 7a 41 72 67 20 26 26 20 while( *zArg &&
fdf0: 69 73 73 70 61 63 65 28 2a 7a 41 72 67 29 20 26 isspace(*zArg) &
fe00: 26 20 2a 7a 41 72 67 21 3d 27 5c 6e 27 20 29 7b & *zArg!='\n' ){
fe10: 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 . zArg++;.
fe20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 7a 41 }. if( *zA
fe30: 72 67 3d 3d 30 20 7c 7c 20 2a 7a 41 72 67 3d 3d rg==0 || *zArg==
fe40: 27 5c 6e 27 20 29 7b 20 72 65 74 75 72 6e 20 30 '\n' ){ return 0
fe50: 3b 20 7d 0a 20 20 20 20 6e 41 72 67 20 3d 20 70 ; }. nArg = p
fe60: 54 6f 6b 65 6e 2d 3e 6e 54 65 78 74 20 2b 20 28 Token->nText + (
fe70: 69 6e 74 29 28 70 54 6f 6b 65 6e 2d 3e 7a 54 65 int)(pToken->zTe
fe80: 78 74 20 2d 20 7a 41 72 67 29 3b 0a 20 20 20 20 xt - zArg);.
fe90: 50 75 73 68 49 66 4d 61 63 72 6f 28 22 21 64 65 PushIfMacro("!de
fea0: 66 69 6e 65 64 22 2c 7a 41 72 67 2c 6e 41 72 67 fined",zArg,nArg
feb0: 2c 70 54 6f 6b 65 6e 2d 3e 6e 4c 69 6e 65 2c 30 ,pToken->nLine,0
fec0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e );. }else if( n
fed0: 43 6d 64 3d 3d 34 20 26 26 20 73 74 72 6e 63 6d Cmd==4 && strncm
fee0: 70 28 7a 43 6d 64 2c 22 65 6c 73 65 22 2c 34 29 p(zCmd,"else",4)
fef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 ==0 ){. /*.
ff00: 20 20 2a 2a 20 49 6e 76 65 72 74 20 74 68 65 20 ** Invert the
ff10: 23 69 66 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f #if on the top o
ff20: 66 20 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20 f the stack.
ff30: 2a 2f 0a 20 20 20 20 69 66 28 20 69 66 53 74 61 */. if( ifSta
ff40: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 ck==0 ){. f
ff50: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 printf(stderr,"%
ff60: 73 3a 25 64 3a 20 27 23 65 6c 73 65 27 20 77 69 s:%d: '#else' wi
ff70: 74 68 6f 75 74 20 61 6e 20 27 23 69 66 27 5c 6e thout an '#if'\n
ff80: 22 2c 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 ",zFilename,.
ff90: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 6e 4c pToken->nL
ffa0: 69 6e 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 ine);. retu
ffb0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rn 1;. }.
ffc0: 70 49 66 20 3d 20 69 66 53 74 61 63 6b 3b 0a 20 pIf = ifStack;.
ffd0: 20 20 20 69 66 28 20 70 49 66 2d 3e 7a 43 6f 6e if( pIf->zCon
ffe0: 64 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 dition ){.
fff0: 69 66 53 74 61 63 6b 20 3d 20 69 66 53 74 61 63 ifStack = ifStac
10000 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 k->pNext;.
10010 50 75 73 68 49 66 4d 61 63 72 6f 28 22 21 22 2c PushIfMacro("!",
10020 70 49 66 2d 3e 7a 43 6f 6e 64 69 74 69 6f 6e 2c pIf->zCondition,
10030 73 74 72 6c 65 6e 28 70 49 66 2d 3e 7a 43 6f 6e strlen(pIf->zCon
10040 64 69 74 69 6f 6e 29 2c 70 49 66 2d 3e 6e 4c 69 dition),pIf->nLi
10050 6e 65 2c 30 29 3b 0a 20 20 20 20 20 20 53 61 66 ne,0);. Saf
10060 65 46 72 65 65 28 70 49 66 29 3b 0a 20 20 20 20 eFree(pIf);.
10070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 66 }else{. pIf
10080 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 ->flags = 0;.
10090 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }. }else{.
100a0 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 64 /*. ** This d
100b0 69 72 65 63 74 69 76 65 20 63 61 6e 20 62 65 20 irective can be
100c0 73 61 66 65 6c 79 20 69 67 6e 6f 72 65 64 0a 20 safely ignored.
100d0 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e */. return
100e0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 0;. }.. /*.
100f0 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 74 68 65 ** Recompute the
10100 20 70 72 65 73 65 74 20 66 6c 61 67 73 0a 20 20 preset flags.
10110 2a 2f 0a 20 20 2a 70 50 72 65 73 65 74 46 6c 61 */. *pPresetFla
10120 67 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 49 gs = 0;. for(pI
10130 66 20 3d 20 69 66 53 74 61 63 6b 3b 20 70 49 66 f = ifStack; pIf
10140 3b 20 70 49 66 3d 70 49 66 2d 3e 70 4e 65 78 74 ; pIf=pIf->pNext
10150 29 7b 0a 20 20 20 20 2a 70 50 72 65 73 65 74 46 ){. *pPresetF
10160 6c 61 67 73 20 7c 3d 20 70 49 66 2d 3e 66 6c 61 lags |= pIf->fla
10170 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 gs;. }.. retur
10180 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a n nErr;.}../*.**
10190 20 50 61 72 73 65 20 61 6e 20 65 6e 74 69 72 65 Parse an entire
101a0 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 file. Return t
101b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 he number of err
101c0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 ors..**.** pList
101d0 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 6f is a list of to
101e0 6b 65 6e 73 20 69 6e 20 74 68 65 20 66 69 6c 65 kens in the file
101f0 2e 20 20 57 68 69 74 65 73 70 61 63 65 20 74 6f . Whitespace to
10200 6b 65 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a kens have been.*
10210 2a 20 65 6c 69 6d 69 6e 61 74 65 64 2c 20 61 6e * eliminated, an
10220 64 20 74 65 78 74 20 77 69 74 68 20 7b 2e 2e 2e d text with {...
10230 7d 20 68 61 73 20 62 65 65 6e 20 63 6f 6c 6c 61 } has been colla
10240 70 73 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 psed into a.** s
10250 69 6e 67 6c 65 20 54 54 5f 42 72 61 63 65 20 74 ingle TT_Brace t
10260 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 69 74 oken..**.** init
10270 46 6c 61 67 73 20 61 72 65 20 61 20 73 65 74 20 Flags are a set
10280 6f 66 20 70 61 72 73 65 20 66 6c 61 67 73 20 74 of parse flags t
10290 68 61 74 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 hat should alway
102a0 73 20 62 65 20 73 65 74 20 66 6f 72 20 74 68 69 s be set for thi
102b0 73 0a 2a 2a 20 66 69 6c 65 2e 20 20 46 6f 72 20 s.** file. For
102c0 2e 63 20 66 69 6c 65 73 20 74 68 69 73 20 69 73 .c files this is
102d0 20 6e 6f 72 6d 61 6c 6c 79 20 30 2e 20 20 46 6f normally 0. Fo
102e0 72 20 2e 68 20 66 69 6c 65 73 20 69 74 20 69 73 r .h files it is
102f0 20 50 53 5f 49 6e 74 65 72 66 61 63 65 2e 0a 2a PS_Interface..*
10300 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 50 61 72 /.static int Par
10310 73 65 46 69 6c 65 28 54 6f 6b 65 6e 20 2a 70 4c seFile(Token *pL
10320 69 73 74 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 ist, int initFla
10330 67 73 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 gs){. int nErr
10340 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 = 0;. Token *pS
10350 74 61 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 tart = 0;. int
10360 66 6c 61 67 73 20 3d 20 69 6e 69 74 46 6c 61 67 flags = initFlag
10370 73 3b 0a 20 20 69 6e 74 20 70 72 65 73 65 74 46 s;. int presetF
10380 6c 61 67 73 20 3d 20 69 6e 69 74 46 6c 61 67 73 lags = initFlags
10390 3b 0a 20 20 69 6e 74 20 72 65 73 65 74 46 6c 61 ;. int resetFla
103a0 67 20 3d 20 30 3b 0a 0a 20 20 69 6e 63 6c 75 64 g = 0;.. includ
103b0 65 4c 69 73 74 20 3d 20 30 3b 0a 20 20 77 68 69 eList = 0;. whi
103c0 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 le( pList ){.
103d0 20 73 77 69 74 63 68 28 20 70 4c 69 73 74 2d 3e switch( pList->
103e0 65 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 eType ){. cas
103f0 65 20 54 54 5f 45 4f 46 3a 0a 20 20 20 20 20 20 e TT_EOF:.
10400 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 6c 6f 6f 70 goto end_of_loop
10410 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 54 5f 50 ;.. case TT_P
10420 72 65 70 72 6f 63 65 73 73 6f 72 3a 0a 20 20 20 reprocessor:.
10430 20 20 20 6e 45 72 72 20 2b 3d 20 50 61 72 73 65 nErr += Parse
10440 50 72 65 70 72 6f 63 65 73 73 6f 72 28 70 4c 69 Preprocessor(pLi
10450 73 74 2c 66 6c 61 67 73 2c 26 70 72 65 73 65 74 st,flags,&preset
10460 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 70 53 Flags);. pS
10470 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 tart = 0;.
10480 70 72 65 73 65 74 46 6c 61 67 73 20 7c 3d 20 69 presetFlags |= i
10490 6e 69 74 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 nitFlags;.
104a0 66 6c 61 67 73 20 3d 20 70 72 65 73 65 74 46 6c flags = presetFl
104b0 61 67 73 3b 0a 20 20 20 20 20 20 62 72 65 61 6b ags;. break
104c0 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 54 5f 4f ;.. case TT_O
104d0 74 68 65 72 3a 0a 20 20 20 20 20 20 73 77 69 74 ther:. swit
104e0 63 68 28 20 70 4c 69 73 74 2d 3e 7a 54 65 78 74 ch( pList->zText
104f0 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73 [0] ){. cas
10500 65 20 27 3b 27 3a 0a 20 20 20 20 20 20 20 20 6e e ';':. n
10510 45 72 72 20 2b 3d 20 50 72 6f 63 65 73 73 44 65 Err += ProcessDe
10520 63 6c 28 70 53 74 61 72 74 2c 70 4c 69 73 74 2c cl(pStart,pList,
10530 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 flags);.
10540 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 pStart = 0;.
10550 20 20 20 20 66 6c 61 67 73 20 3d 20 70 72 65 73 flags = pres
10560 65 74 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 etFlags;.
10570 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 break;.. c
10580 61 73 65 20 27 3d 27 3a 0a 20 20 20 20 20 20 20 ase '=':.
10590 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 50 72 65 if( pList->pPre
105a0 76 2d 3e 6e 54 65 78 74 3d 3d 38 0a 20 20 20 20 v->nText==8.
105b0 20 20 20 20 20 20 20 20 26 26 20 73 74 72 6e 63 && strnc
105c0 6d 70 28 70 4c 69 73 74 2d 3e 70 50 72 65 76 2d mp(pList->pPrev-
105d0 3e 7a 54 65 78 74 2c 22 6f 70 65 72 61 74 6f 72 >zText,"operator
105e0 22 2c 38 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 ",8)==0 ){.
105f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
10600 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 45 }. nE
10610 72 72 20 2b 3d 20 50 72 6f 63 65 73 73 44 65 63 rr += ProcessDec
10620 6c 28 70 53 74 61 72 74 2c 70 4c 69 73 74 2c 66 l(pStart,pList,f
10630 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 70 lags);. p
10640 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 Start = 0;.
10650 20 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 while( pList
10660 26 26 20 70 4c 69 73 74 2d 3e 7a 54 65 78 74 5b && pList->zText[
10670 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 20 0]!=';' ){.
10680 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 pList = pLi
10690 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 st->pNext;.
106a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 }. if(
106b0 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f pList==0 ) goto
106c0 20 65 6e 64 5f 6f 66 5f 6c 6f 6f 70 3b 0a 20 20 end_of_loop;.
106d0 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 70 72 flags = pr
106e0 65 73 65 74 46 6c 61 67 73 3b 0a 20 20 20 20 20 esetFlags;.
106f0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 break;..
10700 20 63 61 73 65 20 27 3a 27 3a 0a 20 20 20 20 20 case ':':.
10710 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 7a 54 if( pList->zT
10720 65 78 74 5b 31 5d 3d 3d 27 3a 27 20 29 7b 0a 20 ext[1]==':' ){.
10730 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c flags |
10740 3d 20 50 53 5f 4d 65 74 68 6f 64 3b 0a 20 20 20 = PS_Method;.
10750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 }. b
10760 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 reak;.. def
10770 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 62 72 ault:. br
10780 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 eak;. }.
10790 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 break;.. c
107a0 61 73 65 20 54 54 5f 42 72 61 63 65 73 3a 0a 20 ase TT_Braces:.
107b0 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 50 72 6f nErr += Pro
107c0 63 65 73 73 50 72 6f 63 65 64 75 72 65 44 65 66 cessProcedureDef
107d0 28 70 53 74 61 72 74 2c 70 4c 69 73 74 2c 66 6c (pStart,pList,fl
107e0 61 67 73 29 3b 0a 20 20 20 20 20 20 70 53 74 61 ags);. pSta
107f0 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6c rt = 0;. fl
10800 61 67 73 20 3d 20 70 72 65 73 65 74 46 6c 61 67 ags = presetFlag
10810 73 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a s;. break;.
10820 0a 20 20 20 20 63 61 73 65 20 54 54 5f 49 64 3a . case TT_Id:
10830 0a 20 20 20 20 20 20 20 69 66 28 20 70 53 74 61 . if( pSta
10840 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 rt==0 ){.
10850 20 20 20 70 53 74 61 72 74 20 3d 20 70 4c 69 73 pStart = pLis
10860 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 t;. fla
10870 67 73 20 3d 20 70 72 65 73 65 74 46 6c 61 67 73 gs = presetFlags
10880 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 ;. }.
10890 20 20 72 65 73 65 74 46 6c 61 67 20 3d 20 30 3b resetFlag = 0;
108a0 0a 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 . switch(
108b0 70 4c 69 73 74 2d 3e 7a 54 65 78 74 5b 30 5d 20 pList->zText[0]
108c0 29 7b 0a 20 20 20 20 20 20 20 63 61 73 65 20 27 ){. case '
108d0 63 27 3a 0a 20 20 20 20 20 20 20 20 20 69 66 28 c':. if(
108e0 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 35 pList->nText==5
108f0 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 && strncmp(pLis
10900 74 2d 3e 7a 54 65 78 74 2c 22 63 6c 61 73 73 22 t->zText,"class"
10910 2c 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 ,5)==0 ){.
10920 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 50 72 6f nErr += Pro
10930 63 65 73 73 54 79 70 65 44 65 63 6c 28 70 4c 69 cessTypeDecl(pLi
10940 73 74 2c 66 6c 61 67 73 2c 26 72 65 73 65 74 46 st,flags,&resetF
10950 6c 61 67 29 3b 0a 20 20 20 20 20 20 20 20 20 7d lag);. }
10960 0a 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b . break;
10970 0a 0a 20 20 20 20 20 20 20 63 61 73 65 20 27 45 .. case 'E
10980 27 3a 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 ':. if(
10990 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 36 20 pList->nText==6
109a0 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 && strncmp(pList
109b0 2d 3e 7a 54 65 78 74 2c 22 45 58 50 4f 52 54 22 ->zText,"EXPORT"
109c0 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 ,6)==0 ){.
109d0 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 50 53 flags |= PS
109e0 5f 45 78 70 6f 72 74 32 3b 0a 20 20 20 20 20 20 _Export2;.
109f0 20 20 20 20 20 2f 2a 20 70 53 74 61 72 74 20 3d /* pStart =
10a00 20 30 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 0; */.
10a10 7d 0a 20 20 20 20 20 20 20 20 20 62 72 65 61 6b }. break
10a20 3b 0a 0a 20 20 20 20 20 20 20 63 61 73 65 20 27 ;.. case '
10a30 65 27 3a 0a 20 20 20 20 20 20 20 20 20 69 66 28 e':. if(
10a40 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 34 pList->nText==4
10a50 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 && strncmp(pLis
10a60 74 2d 3e 7a 54 65 78 74 2c 22 65 6e 75 6d 22 2c t->zText,"enum",
10a70 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 4)==0 ){.
10a80 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 if( pList->p
10a90 4e 65 78 74 20 26 26 20 70 4c 69 73 74 2d 3e 70 Next && pList->p
10aa0 4e 65 78 74 2d 3e 65 54 79 70 65 3d 3d 54 54 5f Next->eType==TT_
10ab0 42 72 61 63 65 73 20 29 7b 0a 20 20 20 20 20 20 Braces ){.
10ac0 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 pList = p
10ad0 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 List->pNext;.
10ae0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 }else{.
10af0 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 nErr
10b00 20 2b 3d 20 50 72 6f 63 65 73 73 54 79 70 65 44 += ProcessTypeD
10b10 65 63 6c 28 70 4c 69 73 74 2c 66 6c 61 67 73 2c ecl(pList,flags,
10b20 26 72 65 73 65 74 46 6c 61 67 29 3b 0a 20 20 20 &resetFlag);.
10b30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
10b40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 }else if( pLi
10b50 73 74 2d 3e 6e 54 65 78 74 3d 3d 36 20 26 26 20 st->nText==6 &&
10b60 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 7a strncmp(pList->z
10b70 54 65 78 74 2c 22 65 78 74 65 72 6e 22 2c 36 29 Text,"extern",6)
10b80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ==0 ){.
10b90 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d pList = pList-
10ba0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 >pNext;.
10bb0 20 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 if( pList &&
10bc0 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 33 20 pList->nText==3
10bd0 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 && strncmp(pList
10be0 2d 3e 7a 54 65 78 74 2c 22 5c 22 43 5c 22 22 2c ->zText,"\"C\"",
10bf0 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 3)==0 ){.
10c00 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c pList = pL
10c10 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 ist->pNext;.
10c20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 flags &
10c30 3d 20 7e 44 50 5f 43 70 6c 75 73 70 6c 75 73 3b = ~DP_Cplusplus;
10c40 0a 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 . }els
10c50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 e{.
10c60 66 6c 61 67 73 20 7c 3d 20 50 53 5f 45 78 74 65 flags |= PS_Exte
10c70 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d rn;. }
10c80 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 61 . pSta
10c90 72 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 rt = pList;.
10ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
10cb0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 63 break;.. c
10cc0 61 73 65 20 27 69 27 3a 0a 20 20 20 20 20 20 20 ase 'i':.
10cd0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65 if( pList->nTe
10ce0 78 74 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d 70 xt==6 && strncmp
10cf0 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 22 69 (pList->zText,"i
10d00 6e 6c 69 6e 65 22 2c 36 29 3d 3d 30 0a 20 20 20 nline",6)==0.
10d10 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 && (flags
10d20 20 26 20 50 53 5f 53 74 61 74 69 63 29 3d 3d 30 & PS_Static)==0
10d30 0a 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 . ){.
10d40 20 20 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 nErr +=
10d50 50 72 6f 63 65 73 73 49 6e 6c 69 6e 65 50 72 6f ProcessInlinePro
10d60 63 28 70 4c 69 73 74 2c 66 6c 61 67 73 2c 26 72 c(pList,flags,&r
10d70 65 73 65 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 esetFlag);.
10d80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 62 }. b
10d90 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 63 61 reak;.. ca
10da0 73 65 20 27 4c 27 3a 0a 20 20 20 20 20 20 20 20 se 'L':.
10db0 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 if( pList->nTex
10dc0 74 3d 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 t==5 && strncmp(
10dd0 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 22 4c 4f pList->zText,"LO
10de0 43 41 4c 22 2c 35 29 3d 3d 30 20 29 7b 0a 20 20 CAL",5)==0 ){.
10df0 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c flags |
10e00 3d 20 50 53 5f 4c 6f 63 61 6c 32 3b 0a 20 20 20 = PS_Local2;.
10e10 20 20 20 20 20 20 20 20 70 53 74 61 72 74 20 3d pStart =
10e20 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 pList;.
10e30 20 7d 0a 20 20 20 20 20 20 20 20 20 62 72 65 61 }. brea
10e40 6b 3b 0a 0a 20 20 20 20 20 20 20 63 61 73 65 20 k;.. case
10e50 27 50 27 3a 0a 20 20 20 20 20 20 20 20 20 69 66 'P':. if
10e60 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 3d 3d ( pList->nText==
10e70 36 20 26 26 20 73 74 72 6e 63 6d 70 28 70 4c 69 6 && strncmp(pLi
10e80 73 74 2d 3e 7a 54 65 78 74 2c 20 22 50 55 42 4c st->zText, "PUBL
10e90 49 43 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 IC",6)==0 ){.
10ea0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d flags |=
10eb0 20 50 53 5f 50 75 62 6c 69 63 3b 0a 20 20 20 20 PS_Public;.
10ec0 20 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 pStart =
10ed0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 pList;.
10ee0 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d }else if( pList-
10ef0 3e 6e 54 65 78 74 3d 3d 37 20 26 26 20 73 74 72 >nText==7 && str
10f00 6e 63 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78 ncmp(pList->zTex
10f10 74 2c 20 22 50 52 49 56 41 54 45 22 2c 37 29 3d t, "PRIVATE",7)=
10f20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 =0 ){.
10f30 20 66 6c 61 67 73 20 7c 3d 20 50 53 5f 50 72 69 flags |= PS_Pri
10f40 76 61 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 vate;.
10f50 20 70 53 74 61 72 74 20 3d 20 70 4c 69 73 74 3b pStart = pList;
10f60 0a 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 . }else
10f70 69 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65 78 74 if( pList->nText
10f80 3d 3d 39 20 26 26 20 73 74 72 6e 63 6d 70 28 70 ==9 && strncmp(p
10f90 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 22 50 52 4f List->zText,"PRO
10fa0 54 45 43 54 45 44 22 2c 39 29 3d 3d 30 20 29 7b TECTED",9)==0 ){
10fb0 0a 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 . flag
10fc0 73 20 7c 3d 20 50 53 5f 50 72 6f 74 65 63 74 65 s |= PS_Protecte
10fd0 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 d;. pS
10fe0 74 61 72 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 tart = pList;.
10ff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
11000 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 break;..
11010 20 63 61 73 65 20 27 73 27 3a 0a 20 20 20 20 20 case 's':.
11020 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e if( pList->n
11030 54 65 78 74 3d 3d 36 20 26 26 20 73 74 72 6e 63 Text==6 && strnc
11040 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c mp(pList->zText,
11050 22 73 74 72 75 63 74 22 2c 36 29 3d 3d 30 20 29 "struct",6)==0 )
11060 7b 0a 20 20 20 20 20 20 20 20 20 20 20 69 66 28 {. if(
11070 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 26 26 pList->pNext &&
11080 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 2d 3e 65 pList->pNext->e
11090 54 79 70 65 3d 3d 54 54 5f 42 72 61 63 65 73 20 Type==TT_Braces
110a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ){.
110b0 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 pList = pList->p
110c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 Next;.
110d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
110e0 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 50 72 6f nErr += Pro
110f0 63 65 73 73 54 79 70 65 44 65 63 6c 28 70 4c 69 cessTypeDecl(pLi
11100 73 74 2c 66 6c 61 67 73 2c 26 72 65 73 65 74 46 st,flags,&resetF
11110 6c 61 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 lag);.
11120 20 7d 0a 20 20 20 20 20 20 20 20 20 7d 65 6c 73 }. }els
11130 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 54 65 e if( pList->nTe
11140 78 74 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d 70 xt==6 && strncmp
11150 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74 2c 22 73 (pList->zText,"s
11160 74 61 74 69 63 22 2c 36 29 3d 3d 30 20 29 7b 0a tatic",6)==0 ){.
11170 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 flags
11180 20 7c 3d 20 50 53 5f 53 74 61 74 69 63 3b 0a 20 |= PS_Static;.
11190 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
111a0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 break;..
111b0 20 20 63 61 73 65 20 27 74 27 3a 0a 20 20 20 20 case 't':.
111c0 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e if( pList->
111d0 6e 54 65 78 74 3d 3d 37 20 26 26 20 73 74 72 6e nText==7 && strn
111e0 63 6d 70 28 70 4c 69 73 74 2d 3e 7a 54 65 78 74 cmp(pList->zText
111f0 2c 22 74 79 70 65 64 65 66 22 2c 37 29 3d 3d 30 ,"typedef",7)==0
11200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 66 ){. f
11210 6c 61 67 73 20 7c 3d 20 50 53 5f 54 79 70 65 64 lags |= PS_Typed
11220 65 66 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20 ef;. }.
11230 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a break;..
11240 20 20 20 20 20 20 20 63 61 73 65 20 27 75 27 3a case 'u':
11250 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c . if( pL
11260 69 73 74 2d 3e 6e 54 65 78 74 3d 3d 35 20 26 26 ist->nText==5 &&
11270 20 73 74 72 6e 63 6d 70 28 70 4c 69 73 74 2d 3e strncmp(pList->
11280 7a 54 65 78 74 2c 22 75 6e 69 6f 6e 22 2c 35 29 zText,"union",5)
11290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ==0 ){.
112a0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 4e 65 if( pList->pNe
112b0 78 74 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 xt && pList->pNe
112c0 78 74 2d 3e 65 54 79 70 65 3d 3d 54 54 5f 42 72 xt->eType==TT_Br
112d0 61 63 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 aces ){.
112e0 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 pList = pLi
112f0 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 st->pNext;.
11300 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
11310 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 20 2b nErr +
11320 3d 20 50 72 6f 63 65 73 73 54 79 70 65 44 65 63 = ProcessTypeDec
11330 6c 28 70 4c 69 73 74 2c 66 6c 61 67 73 2c 26 72 l(pList,flags,&r
11340 65 73 65 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 esetFlag);.
11350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
11360 20 7d 0a 20 20 20 20 20 20 20 20 20 62 72 65 61 }. brea
11370 6b 3b 0a 0a 20 20 20 20 20 20 20 64 65 66 61 75 k;.. defau
11380 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 62 72 65 lt:. bre
11390 61 6b 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 ak;. }.
113a0 20 20 20 20 69 66 28 20 72 65 73 65 74 46 6c 61 if( resetFla
113b0 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 g!=0 ){.
113c0 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 while( pList &&
113d0 20 70 4c 69 73 74 2d 3e 7a 54 65 78 74 5b 30 5d pList->zText[0]
113e0 21 3d 72 65 73 65 74 46 6c 61 67 20 29 7b 0a 20 !=resetFlag ){.
113f0 20 20 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 pList
11400 3d 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a = pList->pNext;.
11410 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
11420 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 if( pList==0
11430 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 6c ) goto end_of_l
11440 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 70 53 oop;. pS
11450 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 tart = 0;.
11460 20 20 20 66 6c 61 67 73 20 3d 20 70 72 65 73 65 flags = prese
11470 74 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 7d tFlags;. }
11480 0a 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a . break;..
11490 20 20 20 20 63 61 73 65 20 54 54 5f 53 74 72 69 case TT_Stri
114a0 6e 67 3a 0a 20 20 20 20 63 61 73 65 20 54 54 5f ng:. case TT_
114b0 4e 75 6d 62 65 72 3a 0a 20 20 20 20 20 20 20 62 Number:. b
114c0 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 reak;.. defau
114d0 6c 74 3a 0a 20 20 20 20 20 20 20 70 53 74 61 72 lt:. pStar
114e0 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 t = pList;.
114f0 20 20 66 6c 61 67 73 20 3d 20 70 72 65 73 65 74 flags = preset
11500 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 62 72 Flags;. br
11510 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 eak;. }. p
11520 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 4e List = pList->pN
11530 65 78 74 3b 0a 20 20 7d 0a 20 20 65 6e 64 5f 6f ext;. }. end_o
11540 66 5f 6c 6f 6f 70 3a 0a 0a 20 20 2f 2a 20 56 65 f_loop:.. /* Ve
11550 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 23 69 rify that all #i
11560 66 73 20 68 61 76 65 20 61 20 6d 61 74 63 68 69 fs have a matchi
11570 6e 67 20 22 23 65 6e 64 69 66 22 20 2a 2f 0a 20 ng "#endif" */.
11580 20 77 68 69 6c 65 28 20 69 66 53 74 61 63 6b 20 while( ifStack
11590 29 7b 0a 20 20 20 20 49 66 6d 61 63 72 6f 20 2a ){. Ifmacro *
115a0 70 49 66 20 3d 20 69 66 53 74 61 63 6b 3b 0a 20 pIf = ifStack;.
115b0 20 20 20 69 66 53 74 61 63 6b 20 3d 20 70 49 66 ifStack = pIf
115c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 66 70 72 ->pNext;. fpr
115d0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a intf(stderr,"%s:
115e0 25 64 3a 20 54 68 69 73 20 27 23 69 66 27 20 68 %d: This '#if' h
115f0 61 73 20 6e 6f 20 27 23 65 6e 64 69 66 27 5c 6e as no '#endif'\n
11600 22 2c 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 ",zFilename,.
11610 20 20 20 70 49 66 2d 3e 6e 4c 69 6e 65 29 3b 0a pIf->nLine);.
11620 20 20 20 20 53 61 66 65 46 72 65 65 28 70 49 66 SafeFree(pIf
11630 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e );. }.. return
11640 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 nErr;.}../*.**
11650 49 66 20 74 68 65 20 67 69 76 65 6e 20 44 65 63 If the given Dec
11660 6c 20 6f 62 6a 65 63 74 20 68 61 73 20 61 20 6e l object has a n
11670 6f 6e 2d 6e 75 6c 6c 20 7a 45 78 74 72 61 20 66 on-null zExtra f
11680 69 65 6c 64 2c 20 74 68 65 6e 20 74 68 65 20 74 ield, then the t
11690 65 78 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 7a ext.** of that z
116a0 45 78 74 72 61 20 66 69 65 6c 64 20 6e 65 65 64 Extra field need
116b0 73 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 s to be inserted
116c0 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f in the middle o
116d0 66 20 74 68 65 0a 2a 2a 20 7a 44 65 63 6c 20 66 f the.** zDecl f
116e0 69 65 6c 64 20 62 65 66 6f 72 65 20 74 68 65 20 ield before the
116f0 6c 61 73 74 20 22 7d 22 20 69 6e 20 74 68 65 20 last "}" in the
11700 7a 44 65 63 6c 2e 20 20 54 68 69 73 20 72 6f 75 zDecl. This rou
11710 74 69 6e 65 20 64 6f 65 73 20 74 68 61 74 2e 0a tine does that..
11720 2a 2a 20 49 66 20 74 68 65 20 7a 45 78 74 72 61 ** If the zExtra
11730 20 69 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72 is NULL, this r
11740 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f outine is a no-o
11750 70 2e 0a 2a 2a 0a 2a 2a 20 7a 45 78 74 72 61 20 p..**.** zExtra
11760 68 6f 6c 64 73 20 65 78 74 72 61 20 6d 65 74 68 holds extra meth
11770 6f 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 od declarations
11780 66 6f 72 20 63 6c 61 73 73 65 73 2e 20 20 54 68 for classes. Th
11790 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 2a e declarations.*
117a0 2a 20 68 61 76 65 20 74 6f 20 62 65 20 69 6e 73 * have to be ins
117b0 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 63 erted into the c
117c0 6c 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e lass definition.
117d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
117e0 49 6e 73 65 72 74 45 78 74 72 61 44 65 63 6c 28 InsertExtraDecl(
117f0 44 65 63 6c 20 2a 70 44 65 63 6c 29 7b 0a 20 20 Decl *pDecl){.
11800 69 6e 74 20 69 3b 0a 20 20 53 74 72 69 6e 67 20 int i;. String
11810 73 74 72 3b 0a 0a 20 20 69 66 28 20 70 44 65 63 str;.. if( pDec
11820 6c 3d 3d 30 20 7c 7c 20 70 44 65 63 6c 2d 3e 7a l==0 || pDecl->z
11830 45 78 74 72 61 3d 3d 30 20 7c 7c 20 70 44 65 63 Extra==0 || pDec
11840 6c 2d 3e 7a 44 65 63 6c 3d 3d 30 20 29 20 72 65 l->zDecl==0 ) re
11850 74 75 72 6e 3b 0a 20 20 69 20 3d 20 73 74 72 6c turn;. i = strl
11860 65 6e 28 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 29 en(pDecl->zDecl)
11870 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 69 - 1;. while( i
11880 3e 30 20 26 26 20 70 44 65 63 6c 2d 3e 7a 44 65 >0 && pDecl->zDe
11890 63 6c 5b 69 5d 21 3d 27 7d 27 20 29 7b 20 69 2d cl[i]!='}' ){ i-
118a0 2d 3b 20 7d 0a 20 20 53 74 72 69 6e 67 49 6e 69 -; }. StringIni
118b0 74 28 26 73 74 72 29 3b 0a 20 20 53 74 72 69 6e t(&str);. Strin
118c0 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 gAppend(&str, pD
118d0 65 63 6c 2d 3e 7a 44 65 63 6c 2c 20 69 29 3b 0a ecl->zDecl, i);.
118e0 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 StringAppend(&
118f0 73 74 72 2c 20 70 44 65 63 6c 2d 3e 7a 45 78 74 str, pDecl->zExt
11900 72 61 2c 20 30 29 3b 0a 20 20 53 74 72 69 6e 67 ra, 0);. String
11910 41 70 70 65 6e 64 28 26 73 74 72 2c 20 26 70 44 Append(&str, &pD
11920 65 63 6c 2d 3e 7a 44 65 63 6c 5b 69 5d 2c 20 30 ecl->zDecl[i], 0
11930 29 3b 0a 20 20 53 61 66 65 46 72 65 65 28 70 44 );. SafeFree(pD
11940 65 63 6c 2d 3e 7a 44 65 63 6c 29 3b 0a 20 20 53 ecl->zDecl);. S
11950 61 66 65 46 72 65 65 28 70 44 65 63 6c 2d 3e 7a afeFree(pDecl->z
11960 45 78 74 72 61 29 3b 0a 20 20 70 44 65 63 6c 2d Extra);. pDecl-
11970 3e 7a 44 65 63 6c 20 3d 20 53 74 72 44 75 70 28 >zDecl = StrDup(
11980 53 74 72 69 6e 67 47 65 74 28 26 73 74 72 29 2c StringGet(&str),
11990 20 30 29 3b 0a 20 20 53 74 72 69 6e 67 52 65 73 0);. StringRes
119a0 65 74 28 26 73 74 72 29 3b 0a 20 20 70 44 65 63 et(&str);. pDec
119b0 6c 2d 3e 7a 45 78 74 72 61 20 3d 20 30 3b 0a 7d l->zExtra = 0;.}
119c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 ../*.** Reset th
119d0 65 20 44 50 5f 46 6f 72 77 61 72 64 20 61 6e 64 e DP_Forward and
119e0 20 44 50 5f 44 65 63 6c 61 72 65 64 20 66 6c 61 DP_Declared fla
119f0 67 73 20 6f 6e 20 61 6c 6c 20 44 65 63 6c 20 73 gs on all Decl s
11a00 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20 53 65 tructures..** Se
11a10 74 20 62 6f 74 68 20 66 6c 61 67 73 20 66 6f 72 t both flags for
11a20 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 anything that i
11a30 73 20 74 61 67 67 65 64 20 61 73 20 6c 6f 63 61 s tagged as loca
11a40 6c 20 61 6e 64 20 69 73 6e 27 74 0a 2a 2a 20 69 l and isn't.** i
11a50 6e 20 74 68 65 20 66 69 6c 65 20 7a 46 69 6c 65 n the file zFile
11a60 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 name so that it
11a70 77 6f 6e 27 74 20 62 65 20 70 72 69 6e 74 69 6e won't be printin
11a80 67 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 g in other files
11a90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 ..*/.static void
11aa0 20 52 65 73 65 74 44 65 63 6c 46 6c 61 67 73 28 ResetDeclFlags(
11ab0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 char *zFilename)
11ac0 7b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63 6c 3b {. Decl *pDecl;
11ad0 0a 0a 20 20 66 6f 72 28 70 44 65 63 6c 20 3d 20 .. for(pDecl =
11ae0 70 44 65 63 6c 46 69 72 73 74 3b 20 70 44 65 63 pDeclFirst; pDec
11af0 6c 3b 20 70 44 65 63 6c 20 3d 20 70 44 65 63 6c l; pDecl = pDecl
11b00 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 44 65 ->pNext){. De
11b10 63 6c 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 clClearProperty(
11b20 70 44 65 63 6c 2c 44 50 5f 46 6f 72 77 61 72 64 pDecl,DP_Forward
11b30 7c 44 50 5f 44 65 63 6c 61 72 65 64 29 3b 0a 20 |DP_Declared);.
11b40 20 20 20 69 66 28 20 44 65 63 6c 48 61 73 50 72 if( DeclHasPr
11b50 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f operty(pDecl,DP_
11b60 4c 6f 63 61 6c 29 20 26 26 20 70 44 65 63 6c 2d Local) && pDecl-
11b70 3e 7a 46 69 6c 65 21 3d 7a 46 69 6c 65 6e 61 6d >zFile!=zFilenam
11b80 65 20 29 7b 0a 20 20 20 20 20 20 44 65 63 6c 53 e ){. DeclS
11b90 65 74 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c etProperty(pDecl
11ba0 2c 44 50 5f 46 6f 72 77 61 72 64 7c 44 50 5f 44 ,DP_Forward|DP_D
11bb0 65 63 6c 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a eclared);. }.
11bc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 }.}../*.** For
11bd0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e ward declaration
11be0 20 6f 66 20 74 68 65 20 53 63 61 6e 54 65 78 74 of the ScanText
11bf0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a () function..*/.
11c00 73 74 61 74 69 63 20 76 6f 69 64 20 53 63 61 6e static void Scan
11c10 54 65 78 74 28 63 6f 6e 73 74 20 63 68 61 72 2a Text(const char*
11c20 2c 20 47 65 6e 53 74 61 74 65 20 2a 70 53 74 61 , GenState *pSta
11c30 74 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 te);../*.** The
11c40 6f 75 74 70 75 74 20 69 6e 20 70 53 74 72 20 69 output in pStr i
11c50 73 20 63 75 72 72 65 6e 74 6c 79 20 77 69 74 68 s currently with
11c60 69 6e 20 61 6e 20 23 69 66 20 43 4f 4e 54 45 58 in an #if CONTEX
11c70 54 20 77 68 65 72 65 20 63 6f 6e 74 65 78 74 0a T where context.
11c80 2a 2a 20 69 73 20 65 71 75 61 6c 20 74 6f 20 2a ** is equal to *
11c90 70 7a 49 66 2e 20 20 28 2a 70 7a 49 66 20 6d 69 pzIf. (*pzIf mi
11ca0 67 68 74 20 62 65 20 4e 55 4c 4c 20 74 6f 20 69 ght be NULL to i
11cb0 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65 20 ndicate that we
11cc0 61 72 65 0a 2a 2a 20 6e 6f 74 20 77 69 74 68 69 are.** not withi
11cd0 6e 20 61 6e 79 20 23 69 66 20 61 74 20 74 68 65 n any #if at the
11ce0 20 6d 6f 6d 65 6e 74 2e 29 20 20 57 65 20 61 72 moment.) We ar
11cf0 65 20 67 65 74 74 69 6e 67 20 72 65 61 64 79 20 e getting ready
11d00 74 6f 20 6f 75 74 70 75 74 0a 2a 2a 20 73 6f 6d to output.** som
11d10 65 20 74 65 78 74 20 74 68 61 74 20 6e 65 65 64 e text that need
11d20 73 20 74 6f 20 62 65 20 77 69 74 68 69 6e 20 74 s to be within t
11d30 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 22 23 he context of "#
11d40 69 66 20 4e 45 57 22 20 77 68 65 72 65 0a 2a 2a if NEW" where.**
11d50 20 4e 45 57 20 69 73 20 7a 49 66 2e 20 20 4d 61 NEW is zIf. Ma
11d60 6b 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 ke an appropriat
11d70 65 20 63 68 61 6e 67 65 20 74 6f 20 74 68 65 20 e change to the
11d80 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 context..*/.stat
11d90 69 63 20 76 6f 69 64 20 43 68 61 6e 67 65 49 66 ic void ChangeIf
11da0 43 6f 6e 74 65 78 74 28 0a 20 20 63 6f 6e 73 74 Context(. const
11db0 20 63 68 61 72 20 2a 7a 49 66 2c 20 20 20 20 20 char *zIf,
11dc0 20 20 2f 2a 20 54 68 65 20 64 65 73 69 72 65 64 /* The desired
11dd0 20 23 69 66 20 63 6f 6e 74 65 78 74 20 2a 2f 0a #if context */.
11de0 20 20 47 65 6e 53 74 61 74 65 20 2a 70 53 74 61 GenState *pSta
11df0 74 65 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 te /* Curr
11e00 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 ent state of the
11e10 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 code generator
11e20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 7a 49 66 3d */.){. if( zIf=
11e30 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 =0 ){. if( pS
11e40 74 61 74 65 2d 3e 7a 49 66 3d 3d 30 20 29 20 72 tate->zIf==0 ) r
11e50 65 74 75 72 6e 3b 0a 20 20 20 20 53 74 72 69 6e eturn;. Strin
11e60 67 41 70 70 65 6e 64 28 70 53 74 61 74 65 2d 3e gAppend(pState->
11e70 70 53 74 72 2c 22 23 65 6e 64 69 66 5c 6e 22 2c pStr,"#endif\n",
11e80 30 29 3b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e 0);. pState->
11e90 7a 49 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 zIf = 0;. }else
11ea0 7b 0a 20 20 20 20 69 66 28 20 70 53 74 61 74 65 {. if( pState
11eb0 2d 3e 7a 49 66 20 29 7b 0a 20 20 20 20 20 20 69 ->zIf ){. i
11ec0 66 28 20 73 74 72 63 6d 70 28 7a 49 66 2c 70 53 f( strcmp(zIf,pS
11ed0 74 61 74 65 2d 3e 7a 49 66 29 3d 3d 30 20 29 20 tate->zIf)==0 )
11ee0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 53 74 return;. St
11ef0 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61 74 ringAppend(pStat
11f00 65 2d 3e 70 53 74 72 2c 22 23 65 6e 64 69 66 5c e->pStr,"#endif\
11f10 6e 22 2c 30 29 3b 0a 20 20 20 20 20 20 70 53 74 n",0);. pSt
11f20 61 74 65 2d 3e 7a 49 66 20 3d 20 30 3b 0a 20 20 ate->zIf = 0;.
11f30 20 20 7d 0a 20 20 20 20 53 63 61 6e 54 65 78 74 }. ScanText
11f40 28 7a 49 66 2c 20 70 53 74 61 74 65 29 3b 0a 20 (zIf, pState);.
11f50 20 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 7a if( pState->z
11f60 49 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 If!=0 ){. S
11f70 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61 tringAppend(pSta
11f80 74 65 2d 3e 70 53 74 72 2c 22 23 65 6e 64 69 66 te->pStr,"#endif
11f90 5c 6e 22 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20 \n",0);. }.
11fa0 20 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 70 StringAppend(p
11fb0 53 74 61 74 65 2d 3e 70 53 74 72 2c 22 23 69 66 State->pStr,"#if
11fc0 20 22 2c 30 29 3b 0a 20 20 20 20 53 74 72 69 6e ",0);. Strin
11fd0 67 41 70 70 65 6e 64 28 70 53 74 61 74 65 2d 3e gAppend(pState->
11fe0 70 53 74 72 2c 7a 49 66 2c 30 29 3b 0a 20 20 20 pStr,zIf,0);.
11ff0 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 70 53 StringAppend(pS
12000 74 61 74 65 2d 3e 70 53 74 72 2c 22 5c 6e 22 2c tate->pStr,"\n",
12010 30 29 3b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e 0);. pState->
12020 7a 49 66 20 3d 20 7a 49 66 3b 0a 20 20 7d 0a 7d zIf = zIf;. }.}
12030 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 6f 20 74 ../*.** Add to t
12040 68 65 20 73 74 72 69 6e 67 20 70 53 74 72 20 61 he string pStr a
12050 20 23 69 6e 63 6c 75 64 65 20 6f 66 20 65 76 65 #include of eve
12060 72 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c ry file on the l
12070 69 73 74 20 6f 66 0a 2a 2a 20 69 6e 63 6c 75 64 ist of.** includ
12080 65 20 66 69 6c 65 73 20 70 49 6e 63 6c 75 64 65 e files pInclude
12090 2e 20 20 54 68 65 20 74 61 62 6c 65 20 70 54 61 . The table pTa
120a0 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c ble contains all
120b0 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 68 files that.** h
120c0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e ave already been
120d0 20 23 69 6e 63 6c 75 64 65 64 20 61 74 20 6c 65 #included at le
120e0 61 73 74 20 6f 6e 63 65 2e 20 20 44 6f 6e 27 74 ast once. Don't
120f0 20 61 64 64 20 61 6e 79 0a 2a 2a 20 64 75 70 6c add any.** dupl
12100 69 63 61 74 65 73 2e 20 20 55 70 64 61 74 65 20 icates. Update
12110 70 54 61 62 6c 65 20 77 69 74 68 20 65 76 65 72 pTable with ever
12120 79 20 6e 65 77 20 23 69 6e 63 6c 75 64 65 20 74 y new #include t
12130 68 61 74 20 69 73 20 61 64 64 65 64 2e 0a 2a 2f hat is added..*/
12140 0a 73 74 61 74 69 63 20 76 6f 69 64 20 41 64 64 .static void Add
12150 49 6e 63 6c 75 64 65 73 28 0a 20 20 49 6e 63 6c Includes(. Incl
12160 75 64 65 20 2a 70 49 6e 63 6c 75 64 65 2c 20 20 ude *pInclude,
12170 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 65 76 /* Write ev
12180 65 72 79 20 23 69 6e 63 6c 75 64 65 20 6f 6e 20 ery #include on
12190 74 68 69 73 20 6c 69 73 74 20 2a 2f 0a 20 20 47 this list */. G
121a0 65 6e 53 74 61 74 65 20 2a 70 53 74 61 74 65 20 enState *pState
121b0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 /* Curre
121c0 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 nt state of the
121d0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 2a code generator *
121e0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 49 6e 63 6c /.){. if( pIncl
121f0 75 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 ude ){. if( p
12200 49 6e 63 6c 75 64 65 2d 3e 70 4e 65 78 74 20 29 Include->pNext )
12210 7b 0a 20 20 20 20 20 20 41 64 64 49 6e 63 6c 75 {. AddInclu
12220 64 65 73 28 70 49 6e 63 6c 75 64 65 2d 3e 70 4e des(pInclude->pN
12230 65 78 74 2c 70 53 74 61 74 65 29 3b 0a 20 20 20 ext,pState);.
12240 20 7d 0a 20 20 20 20 69 66 28 20 49 64 65 6e 74 }. if( Ident
12250 54 61 62 6c 65 49 6e 73 65 72 74 28 70 53 74 61 TableInsert(pSta
12260 74 65 2d 3e 70 54 61 62 6c 65 2c 70 49 6e 63 6c te->pTable,pIncl
12270 75 64 65 2d 3e 7a 4c 61 62 65 6c 2c 30 29 20 29 ude->zLabel,0) )
12280 7b 0a 20 20 20 20 20 20 43 68 61 6e 67 65 49 66 {. ChangeIf
12290 43 6f 6e 74 65 78 74 28 70 49 6e 63 6c 75 64 65 Context(pInclude
122a0 2d 3e 7a 49 66 2c 70 53 74 61 74 65 29 3b 0a 20 ->zIf,pState);.
122b0 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e StringAppen
122c0 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c 22 d(pState->pStr,"
122d0 23 69 6e 63 6c 75 64 65 20 22 2c 30 29 3b 0a 20 #include ",0);.
122e0 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 65 6e StringAppen
122f0 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 2c 70 d(pState->pStr,p
12300 49 6e 63 6c 75 64 65 2d 3e 7a 46 69 6c 65 2c 30 Include->zFile,0
12310 29 3b 0a 20 20 20 20 20 20 53 74 72 69 6e 67 41 );. StringA
12320 70 70 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 ppend(pState->pS
12330 74 72 2c 22 5c 6e 22 2c 31 29 3b 0a 20 20 20 20 tr,"\n",1);.
12340 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 }. }.}../*.** A
12350 64 64 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67 dd to the string
12360 20 70 53 74 72 20 61 20 64 65 63 6c 61 72 61 74 pStr a declarat
12370 69 6f 6e 20 66 6f 72 20 74 68 65 20 6f 62 6a 65 ion for the obje
12380 63 74 20 64 65 73 63 72 69 62 65 64 0a 2a 2a 20 ct described.**
12390 69 6e 20 70 44 65 63 6c 2e 0a 2a 2a 0a 2a 2a 20 in pDecl..**.**
123a0 49 66 20 70 44 65 63 6c 20 68 61 73 20 61 6c 72 If pDecl has alr
123b0 65 61 64 79 20 62 65 65 6e 20 64 65 63 6c 61 72 eady been declar
123c0 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2c ed in this file,
123d0 20 64 65 74 65 63 74 20 74 68 61 74 0a 2a 2a 20 detect that.**
123e0 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 20 65 fact and abort e
123f0 61 72 6c 79 2e 20 20 44 6f 20 6e 6f 74 20 64 75 arly. Do not du
12400 70 6c 69 63 61 74 65 20 61 20 64 65 63 6c 61 72 plicate a declar
12410 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 ation..**.** If
12420 74 68 65 20 6e 65 65 64 46 75 6c 6c 44 65 63 6c the needFullDecl
12430 20 66 6c 61 67 20 69 73 20 66 61 6c 73 65 20 61 flag is false a
12440 6e 64 20 74 68 69 73 20 6f 62 6a 65 63 74 20 68 nd this object h
12450 61 73 20 61 20 66 6f 72 77 61 72 64 0a 2a 2a 20 as a forward.**
12460 64 65 63 6c 61 72 61 74 69 6f 6e 2c 20 74 68 65 declaration, the
12470 6e 20 73 75 70 70 6c 79 20 74 68 65 20 66 6f 72 n supply the for
12480 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e ward declaration
12490 20 6f 6e 6c 79 2e 20 20 41 20 6c 61 74 65 72 0a only. A later.
124a0 2a 2a 20 63 61 6c 6c 20 74 6f 20 43 6f 6d 70 6c ** call to Compl
124b0 65 74 65 46 6f 72 77 61 72 64 44 65 63 6c 61 72 eteForwardDeclar
124c0 61 74 69 6f 6e 73 28 29 20 77 69 6c 6c 20 66 69 ations() will fi
124d0 6e 69 73 68 20 74 68 65 20 64 65 63 6c 61 72 61 nish the declara
124e0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 75 73 2e 20 tion.** for us.
124f0 20 42 75 74 20 69 66 20 6e 65 65 64 46 75 6c 6c But if needFull
12500 44 65 63 6c 20 69 73 20 74 72 75 65 2c 20 77 65 Decl is true, we
12510 20 6d 75 73 74 20 73 75 70 70 6c 79 20 74 68 65 must supply the
12520 20 66 75 6c 6c 0a 2a 2a 20 64 65 63 6c 61 72 61 full.** declara
12530 74 69 6f 6e 20 6e 6f 77 2e 20 20 53 6f 6d 65 20 tion now. Some
12540 6f 62 6a 65 63 74 73 20 64 6f 20 6e 6f 74 20 68 objects do not h
12550 61 76 65 20 61 20 66 6f 72 77 61 72 64 20 64 65 ave a forward de
12560 63 6c 61 72 61 74 69 6f 6e 2e 0a 2a 2a 20 46 6f claration..** Fo
12570 72 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c r those objects,
12580 20 77 65 20 6d 75 73 74 20 70 72 69 6e 74 20 74 we must print t
12590 68 65 20 66 75 6c 6c 20 64 65 63 6c 61 72 61 74 he full declarat
125a0 69 6f 6e 20 6e 6f 77 2e 0a 2a 2a 0a 2a 2a 20 42 ion now..**.** B
125b0 65 63 61 75 73 65 20 69 74 20 69 73 20 69 6c 6c ecause it is ill
125c0 65 67 61 6c 20 74 6f 20 64 75 70 6c 69 63 61 74 egal to duplicat
125d0 65 20 61 20 74 79 70 65 64 65 66 20 69 6e 20 43 e a typedef in C
125e0 2c 20 63 61 72 65 20 69 73 20 74 61 6b 65 6e 0a , care is taken.
125f0 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 74 68 61 ** to insure tha
12600 74 20 74 79 70 65 64 65 66 73 20 66 6f 72 20 74 t typedefs for t
12610 68 65 20 73 61 6d 65 20 69 64 65 6e 74 69 66 69 he same identifi
12620 65 72 20 61 72 65 20 6f 6e 6c 79 20 69 73 73 75 er are only issu
12630 65 64 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 ed once..*/.stat
12640 69 63 20 76 6f 69 64 20 44 65 63 6c 61 72 65 4f ic void DeclareO
12650 62 6a 65 63 74 28 0a 20 20 44 65 63 6c 20 2a 70 bject(. Decl *p
12660 44 65 63 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 Decl, /*
12670 54 68 65 20 74 68 69 6e 67 20 74 6f 20 62 65 20 The thing to be
12680 64 65 63 6c 61 72 65 64 20 2a 2f 0a 20 20 47 65 declared */. Ge
12690 6e 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 nState *pState,
126a0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61 /* Current sta
126b0 74 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20 67 te of the code g
126c0 65 6e 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e enerator */. in
126d0 74 20 6e 65 65 64 46 75 6c 6c 44 65 63 6c 20 20 t needFullDecl
126e0 20 20 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 74 /* Must have t
126f0 68 65 20 66 75 6c 6c 20 64 65 63 6c 61 72 61 74 he full declarat
12700 69 6f 6e 2e 20 20 41 20 66 6f 72 77 61 72 64 0a ion. A forward.
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12720 20 20 20 20 20 20 20 2a 20 64 65 63 6c 61 72 61 * declara
12730 74 69 6f 6e 20 69 73 6e 27 74 20 65 6e 6f 75 67 tion isn't enoug
12740 68 20 2a 2f 0a 29 7b 0a 20 20 44 65 63 6c 20 2a h */.){. Decl *
12750 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p;
12760 20 2f 2a 20 54 68 65 20 6f 62 6a 65 63 74 20 74 /* The object t
12770 6f 20 62 65 20 64 65 63 6c 61 72 65 64 20 2a 2f o be declared */
12780 0a 20 20 69 6e 74 20 66 6c 61 67 3b 0a 20 20 69 . int flag;. i
12790 6e 74 20 69 73 43 70 70 3b 20 20 20 20 20 20 20 nt isCpp;
127a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 /* True if
127b0 20 67 65 6e 65 72 61 74 69 6e 67 20 43 2b 2b 20 generating C++
127c0 2a 2f 0a 20 20 69 6e 74 20 64 6f 6e 65 54 79 70 */. int doneTyp
127d0 65 64 65 66 20 3d 20 30 3b 20 20 20 2f 2a 20 54 edef = 0; /* T
127e0 72 75 65 20 69 66 20 61 20 74 79 70 65 64 65 66 rue if a typedef
127f0 20 68 61 73 20 62 65 65 6e 20 64 6f 6e 65 20 66 has been done f
12800 6f 72 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a or this object *
12810 2f 0a 0a 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 /.. /* printf("
12820 42 45 47 49 4e 20 25 73 20 6f 66 20 25 73 5c 6e BEGIN %s of %s\n
12830 22 2c 6e 65 65 64 46 75 6c 6c 44 65 63 6c 3f 22 ",needFullDecl?"
12840 46 55 4c 4c 22 3a 22 50 52 4f 54 4f 54 59 50 45 FULL":"PROTOTYPE
12850 22 2c 70 44 65 63 6c 2d 3e 7a 4e 61 6d 65 29 3b ",pDecl->zName);
12860 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 */. /*. ** For
12870 20 61 6e 79 20 6f 62 6a 65 63 74 20 74 68 61 74 any object that
12880 20 68 61 73 20 61 20 66 6f 72 77 61 72 64 20 64 has a forward d
12890 65 63 6c 61 72 61 74 69 6f 6e 2c 20 67 6f 20 61 eclaration, go a
128a0 68 65 61 64 20 61 6e 64 20 64 6f 20 74 68 65 0a head and do the.
128b0 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 64 65 63 ** forward dec
128c0 6c 61 72 61 74 69 6f 6e 20 66 69 72 73 74 2e 0a laration first..
128d0 20 20 2a 2f 0a 20 20 69 73 43 70 70 20 3d 20 28 */. isCpp = (
128e0 70 53 74 61 74 65 2d 3e 66 6c 61 67 73 20 26 20 pState->flags &
128f0 44 50 5f 43 70 6c 75 73 70 6c 75 73 29 20 21 3d DP_Cplusplus) !=
12900 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44 65 63 0;. for(p=pDec
12910 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 61 6d 65 l; p; p=p->pSame
12920 4e 61 6d 65 29 7b 0a 20 20 20 20 69 66 28 20 70 Name){. if( p
12930 2d 3e 7a 46 77 64 20 29 7b 0a 20 20 20 20 20 20 ->zFwd ){.
12940 69 66 28 20 21 44 65 63 6c 48 61 73 50 72 6f 70 if( !DeclHasProp
12950 65 72 74 79 28 70 2c 44 50 5f 46 6f 72 77 61 72 erty(p,DP_Forwar
12960 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 44 65 d) ){. De
12970 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c clSetProperty(p,
12980 44 50 5f 46 6f 72 77 61 72 64 29 3b 0a 20 20 20 DP_Forward);.
12990 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 if( strncmp
129a0 28 70 2d 3e 7a 46 77 64 2c 22 74 79 70 65 64 65 (p->zFwd,"typede
129b0 66 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 f",7)==0 ){.
129c0 20 20 20 20 20 20 69 66 28 20 64 6f 6e 65 54 79 if( doneTy
129d0 70 65 64 65 66 20 29 20 63 6f 6e 74 69 6e 75 65 pedef ) continue
129e0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 6e 65 ;. done
129f0 54 79 70 65 64 65 66 20 3d 20 31 3b 0a 20 20 20 Typedef = 1;.
12a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 43 }. C
12a10 68 61 6e 67 65 49 66 43 6f 6e 74 65 78 74 28 70 hangeIfContext(p
12a20 2d 3e 7a 49 66 2c 70 53 74 61 74 65 29 3b 0a 20 ->zIf,pState);.
12a30 20 20 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 StringApp
12a40 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 end(pState->pStr
12a50 2c 69 73 43 70 70 20 3f 20 70 2d 3e 7a 46 77 64 ,isCpp ? p->zFwd
12a60 43 70 70 20 3a 20 70 2d 3e 7a 46 77 64 2c 30 29 Cpp : p->zFwd,0)
12a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
12a80 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 }.. /*. ** E
12a90 61 72 6c 79 20 6f 75 74 20 69 66 20 65 76 65 72 arly out if ever
12aa0 79 74 68 69 6e 67 20 69 73 20 61 6c 72 65 61 64 ything is alread
12ab0 79 20 73 75 69 74 61 62 6c 79 20 64 65 63 6c 61 y suitably decla
12ac0 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 red.. **. ** T
12ad0 68 69 73 20 69 73 20 61 20 76 65 72 79 20 69 6d his is a very im
12ae0 70 6f 72 74 61 6e 74 20 73 74 65 70 20 62 65 63 portant step bec
12af0 61 75 73 65 20 69 74 20 70 72 65 76 65 6e 74 73 ause it prevents
12b00 20 75 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 78 us from. ** ex
12b10 65 63 75 74 69 6e 67 20 74 68 65 20 63 6f 64 65 ecuting the code
12b20 20 74 68 65 20 66 6f 6c 6c 6f 77 73 20 69 6e 20 the follows in
12b30 61 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c a recursive call
12b40 20 74 6f 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 to this. ** fu
12b50 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 nction with the
12b60 73 61 6d 65 20 76 61 6c 75 65 20 66 6f 72 20 70 same value for p
12b70 44 65 63 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 Decl.. */. fla
12b80 67 20 3d 20 6e 65 65 64 46 75 6c 6c 44 65 63 6c g = needFullDecl
12b90 20 3f 20 44 50 5f 44 65 63 6c 61 72 65 64 7c 44 ? DP_Declared|D
12ba0 50 5f 46 6f 72 77 61 72 64 20 3a 20 44 50 5f 46 P_Forward : DP_F
12bb0 6f 72 77 61 72 64 3b 0a 20 20 66 6f 72 28 70 3d orward;. for(p=
12bc0 70 44 65 63 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 pDecl; p; p=p->p
12bd0 53 61 6d 65 4e 61 6d 65 29 7b 0a 20 20 20 20 69 SameName){. i
12be0 66 28 20 21 44 65 63 6c 48 61 73 50 72 6f 70 65 f( !DeclHasPrope
12bf0 72 74 79 28 70 2c 66 6c 61 67 29 20 29 20 62 72 rty(p,flag) ) br
12c00 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 eak;. }. if( p
12c10 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 ==0 ){. retur
12c20 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a n;. }.. /*. *
12c30 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 * Make sure we h
12c40 61 76 65 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 ave all necessar
12c50 79 20 23 69 6e 63 6c 75 64 65 73 0a 20 20 2a 2f y #includes. */
12c60 0a 20 20 66 6f 72 28 70 3d 70 44 65 63 6c 3b 20 . for(p=pDecl;
12c70 70 3b 20 70 3d 70 2d 3e 70 53 61 6d 65 4e 61 6d p; p=p->pSameNam
12c80 65 29 7b 0a 20 20 20 20 41 64 64 49 6e 63 6c 75 e){. AddInclu
12c90 64 65 73 28 70 2d 3e 70 49 6e 63 6c 75 64 65 2c des(p->pInclude,
12ca0 70 53 74 61 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 pState);. }..
12cb0 2f 2a 0a 20 20 2a 2a 20 47 6f 20 61 68 65 61 64 /*. ** Go ahead
12cc0 20 61 6e 20 6d 61 72 6b 20 65 76 65 72 79 74 68 an mark everyth
12cd0 69 6e 67 20 61 73 20 62 65 69 6e 67 20 64 65 63 ing as being dec
12ce0 6c 61 72 65 64 2c 20 74 6f 20 70 72 65 76 65 6e lared, to preven
12cf0 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 66 69 6e 69 t an. ** infini
12d00 74 65 20 6c 6f 6f 70 20 74 68 72 75 20 74 68 65 te loop thru the
12d10 20 53 63 61 6e 54 65 78 74 28 29 20 66 75 6e 63 ScanText() func
12d20 74 69 6f 6e 2e 20 20 41 74 20 74 68 65 20 73 61 tion. At the sa
12d30 6d 65 20 74 69 6d 65 2c 0a 20 20 2a 2a 20 77 65 me time,. ** we
12d40 20 64 65 63 69 64 65 20 77 68 69 63 68 20 6f 62 decide which ob
12d50 6a 65 63 74 73 20 6e 65 65 64 20 61 20 66 75 6c jects need a ful
12d60 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61 6e l declaration an
12d70 64 20 6d 61 72 6b 20 74 68 65 6d 0a 20 20 2a 2a d mark them. **
12d80 20 77 69 74 68 20 74 68 65 20 44 50 5f 46 6c 61 with the DP_Fla
12d90 67 20 62 69 74 2e 20 20 57 65 20 61 72 65 20 6f g bit. We are o
12da0 6e 6c 79 20 61 62 6c 65 20 74 6f 20 75 73 65 20 nly able to use
12db0 44 50 5f 46 6c 61 67 20 69 6e 20 74 68 69 73 0a DP_Flag in this.
12dc0 20 20 2a 2a 20 77 61 79 20 62 65 63 61 75 73 65 ** way because
12dd0 20 77 65 20 6b 6e 6f 77 20 77 65 27 6c 6c 20 6e we know we'll n
12de0 65 76 65 72 20 65 78 65 63 75 74 65 20 74 68 69 ever execute thi
12df0 73 20 66 61 72 20 69 6e 74 6f 20 74 68 69 73 0a s far into this.
12e00 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e ** function on
12e10 20 61 20 72 65 63 75 72 73 69 76 65 20 63 61 6c a recursive cal
12e20 6c 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 l with the same
12e30 70 44 65 63 6c 2e 20 20 48 65 6e 63 65 2c 20 72 pDecl. Hence, r
12e40 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 63 61 ecursive. ** ca
12e50 6c 6c 73 20 74 6f 20 74 68 69 73 20 66 75 6e 63 lls to this func
12e60 74 69 6f 6e 20 28 74 68 72 6f 75 67 68 20 53 63 tion (through Sc
12e70 61 6e 54 65 78 74 28 29 29 20 63 61 6e 20 6e 65 anText()) can ne
12e80 76 65 72 20 63 68 61 6e 67 65 20 74 68 65 0a 20 ver change the.
12e90 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 44 50 5f ** value of DP_
12ea0 46 6c 61 67 20 6f 75 74 20 66 72 6f 6d 20 75 6e Flag out from un
12eb0 64 65 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 66 der us.. */. f
12ec0 6f 72 28 70 3d 70 44 65 63 6c 3b 20 70 3b 20 70 or(p=pDecl; p; p
12ed0 3d 70 2d 3e 70 53 61 6d 65 4e 61 6d 65 29 7b 0a =p->pSameName){.
12ee0 20 20 20 20 69 66 28 20 21 44 65 63 6c 48 61 73 if( !DeclHas
12ef0 50 72 6f 70 65 72 74 79 28 70 2c 44 50 5f 44 65 Property(p,DP_De
12f00 63 6c 61 72 65 64 29 0a 20 20 20 20 20 26 26 20 clared). &&
12f10 28 70 2d 3e 7a 46 77 64 3d 3d 30 20 7c 7c 20 6e (p->zFwd==0 || n
12f20 65 65 64 46 75 6c 6c 44 65 63 6c 29 0a 20 20 20 eedFullDecl).
12f30 20 20 26 26 20 70 2d 3e 7a 44 65 63 6c 21 3d 30 && p->zDecl!=0
12f40 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 44 65 . ){. De
12f50 63 6c 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c clSetProperty(p,
12f60 44 50 5f 46 6f 72 77 61 72 64 7c 44 50 5f 44 65 DP_Forward|DP_De
12f70 63 6c 61 72 65 64 7c 44 50 5f 46 6c 61 67 29 3b clared|DP_Flag);
12f80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
12f90 20 20 44 65 63 6c 43 6c 65 61 72 50 72 6f 70 65 DeclClearPrope
12fa0 72 74 79 28 70 2c 44 50 5f 46 6c 61 67 29 3b 0a rty(p,DP_Flag);.
12fb0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a }. }.. /*.
12fc0 20 20 2a 2a 20 43 61 6c 6c 20 53 63 61 6e 54 65 ** Call ScanTe
12fd0 78 74 28 29 20 72 65 63 75 72 73 69 76 65 6c 79 xt() recursively
12fe0 20 28 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 (this routine i
12ff0 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 53 63 s called from Sc
13000 61 6e 54 65 78 74 28 29 29 0a 20 20 2a 2a 20 74 anText()). ** t
13010 6f 20 69 6e 63 6c 75 64 65 20 64 65 63 6c 61 72 o include declar
13020 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 ations required
13030 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 to come before t
13040 68 65 73 65 20 64 65 63 6c 61 72 61 74 69 6f 6e hese declaration
13050 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 3d s.. */. for(p=
13060 70 44 65 63 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 pDecl; p; p=p->p
13070 53 61 6d 65 4e 61 6d 65 29 7b 0a 20 20 20 20 69 SameName){. i
13080 66 28 20 44 65 63 6c 48 61 73 50 72 6f 70 65 72 f( DeclHasProper
13090 74 79 28 70 2c 44 50 5f 46 6c 61 67 29 20 29 7b ty(p,DP_Flag) ){
130a0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 44 . if( p->zD
130b0 65 63 6c 5b 30 5d 3d 3d 27 23 27 20 29 7b 0a 20 ecl[0]=='#' ){.
130c0 20 20 20 20 20 20 20 53 63 61 6e 54 65 78 74 28 ScanText(
130d0 26 70 2d 3e 7a 44 65 63 6c 5b 31 5d 2c 70 53 74 &p->zDecl[1],pSt
130e0 61 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 ate);. }els
130f0 65 7b 0a 20 20 20 20 20 20 20 20 49 6e 73 65 72 e{. Inser
13100 74 45 78 74 72 61 44 65 63 6c 28 70 29 3b 0a 20 tExtraDecl(p);.
13110 20 20 20 20 20 20 20 53 63 61 6e 54 65 78 74 28 ScanText(
13120 70 2d 3e 7a 44 65 63 6c 2c 70 53 74 61 74 65 29 p->zDecl,pState)
13130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
13140 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4f }.. /*. ** O
13150 75 74 70 75 74 20 74 68 65 20 64 65 63 6c 61 72 utput the declar
13160 61 74 69 6f 6e 73 2e 20 20 44 6f 20 74 68 69 73 ations. Do this
13170 20 69 6e 20 74 77 6f 20 70 61 73 73 65 73 2e 20 in two passes.
13180 20 46 69 72 73 74 0a 20 20 2a 2a 20 6f 75 74 70 First. ** outp
13190 75 74 20 65 76 65 72 79 74 68 69 6e 67 20 74 68 ut everything th
131a0 61 74 20 69 73 6e 27 74 20 61 20 74 79 70 65 64 at isn't a typed
131b0 65 66 2e 20 20 54 68 65 6e 20 67 6f 20 62 61 63 ef. Then go bac
131c0 6b 20 61 6e 64 0a 20 20 2a 2a 20 67 65 74 20 74 k and. ** get t
131d0 68 65 20 74 79 70 65 64 65 66 73 20 62 79 20 74 he typedefs by t
131e0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 0a 20 20 he same name..
131f0 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 44 65 63 6c */. for(p=pDecl
13200 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 61 6d 65 4e ; p; p=p->pSameN
13210 61 6d 65 29 7b 0a 20 20 20 20 69 66 28 20 44 65 ame){. if( De
13220 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c clHasProperty(p,
13230 44 50 5f 46 6c 61 67 29 20 26 26 20 21 44 65 63 DP_Flag) && !Dec
13240 6c 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 54 lHasProperty(p,T
13250 59 5f 54 79 70 65 64 65 66 29 20 29 7b 0a 20 20 Y_Typedef) ){.
13260 20 20 20 20 69 66 28 20 44 65 63 6c 48 61 73 41 if( DeclHasA
13270 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 54 59 5f nyProperty(p,TY_
13280 45 6e 75 6d 65 72 61 74 69 6f 6e 29 20 29 7b 0a Enumeration) ){.
13290 20 20 20 20 20 20 20 20 69 66 28 20 64 6f 6e 65 if( done
132a0 54 79 70 65 64 65 66 20 29 20 63 6f 6e 74 69 6e Typedef ) contin
132b0 75 65 3b 0a 20 20 20 20 20 20 20 20 64 6f 6e 65 ue;. done
132c0 54 79 70 65 64 65 66 20 3d 20 31 3b 0a 20 20 20 Typedef = 1;.
132d0 20 20 20 7d 0a 20 20 20 20 20 20 43 68 61 6e 67 }. Chang
132e0 65 49 66 43 6f 6e 74 65 78 74 28 70 2d 3e 7a 49 eIfContext(p->zI
132f0 66 2c 70 53 74 61 74 65 29 3b 0a 20 20 20 20 20 f,pState);.
13300 20 69 66 28 20 21 69 73 43 70 70 20 26 26 20 44 if( !isCpp && D
13310 65 63 6c 48 61 73 41 6e 79 50 72 6f 70 65 72 74 eclHasAnyPropert
13320 79 28 70 2c 44 50 5f 45 78 74 65 72 6e 52 65 71 y(p,DP_ExternReq
13330 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 53 74 d) ){. St
13340 72 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61 74 ringAppend(pStat
13350 65 2d 3e 70 53 74 72 2c 22 65 78 74 65 72 6e 20 e->pStr,"extern
13360 22 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 ",0);. }els
13370 65 20 69 66 28 20 69 73 43 70 70 20 26 26 20 44 e if( isCpp && D
13380 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28 70 eclHasProperty(p
13390 2c 44 50 5f 43 70 6c 75 73 70 6c 75 73 7c 44 50 ,DP_Cplusplus|DP
133a0 5f 45 78 74 65 72 6e 52 65 71 64 29 20 29 7b 0a _ExternReqd) ){.
133b0 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 41 70 StringAp
133c0 70 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74 pend(pState->pSt
133d0 72 2c 22 65 78 74 65 72 6e 20 22 2c 30 29 3b 0a r,"extern ",0);.
133e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
133f0 69 73 43 70 70 20 26 26 20 44 65 63 6c 48 61 73 isCpp && DeclHas
13400 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 44 50 AnyProperty(p,DP
13410 5f 45 78 74 65 72 6e 43 52 65 71 64 7c 44 50 5f _ExternCReqd|DP_
13420 45 78 74 65 72 6e 52 65 71 64 29 20 29 7b 0a 20 ExternReqd) ){.
13430 20 20 20 20 20 20 20 53 74 72 69 6e 67 41 70 70 StringApp
13440 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74 72 end(pState->pStr
13450 2c 22 65 78 74 65 72 6e 20 5c 22 43 5c 22 20 22 ,"extern \"C\" "
13460 2c 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 ,0);. }.
13470 20 20 20 49 6e 73 65 72 74 45 78 74 72 61 44 65 InsertExtraDe
13480 63 6c 28 70 29 3b 0a 20 20 20 20 20 20 53 74 72 cl(p);. Str
13490 69 6e 67 41 70 70 65 6e 64 28 70 53 74 61 74 65 ingAppend(pState
134a0 2d 3e 70 53 74 72 2c 70 2d 3e 7a 44 65 63 6c 2c ->pStr,p->zDecl,
134b0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69 0);. if( !i
134c0 73 43 70 70 20 26 26 20 44 65 63 6c 48 61 73 50 sCpp && DeclHasP
134d0 72 6f 70 65 72 74 79 28 70 2c 44 50 5f 43 70 6c roperty(p,DP_Cpl
134e0 75 73 70 6c 75 73 29 20 29 7b 0a 20 20 20 20 20 usplus) ){.
134f0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 fprintf(stder
13500 72 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 73 r,. "%s
13510 3a 20 43 20 63 6f 64 65 20 6f 75 67 68 74 20 6e : C code ought n
13520 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 ot reference the
13530 20 43 2b 2b 20 6f 62 6a 65 63 74 20 5c 22 25 73 C++ object \"%s
13540 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 \"\n",.
13550 20 70 53 74 61 74 65 2d 3e 7a 46 69 6c 65 6e 61 pState->zFilena
13560 6d 65 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 me, p->zName);.
13570 20 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 6e pState->n
13580 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 Err++;. }.
13590 20 20 20 20 20 44 65 63 6c 43 6c 65 61 72 50 72 DeclClearPr
135a0 6f 70 65 72 74 79 28 70 2c 44 50 5f 46 6c 61 67 operty(p,DP_Flag
135b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 );. }. }. f
135c0 6f 72 28 70 3d 70 44 65 63 6c 3b 20 70 20 26 26 or(p=pDecl; p &&
135d0 20 21 64 6f 6e 65 54 79 70 65 64 65 66 3b 20 70 !doneTypedef; p
135e0 3d 70 2d 3e 70 53 61 6d 65 4e 61 6d 65 29 7b 0a =p->pSameName){.
135f0 20 20 20 20 69 66 28 20 44 65 63 6c 48 61 73 50 if( DeclHasP
13600 72 6f 70 65 72 74 79 28 70 2c 44 50 5f 46 6c 61 roperty(p,DP_Fla
13610 67 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 g) ){. /* T
13620 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 his has to be a
13630 74 79 70 65 64 65 66 20 2a 2f 0a 20 20 20 20 20 typedef */.
13640 20 64 6f 6e 65 54 79 70 65 64 65 66 20 3d 20 31 doneTypedef = 1
13650 3b 0a 20 20 20 20 20 20 43 68 61 6e 67 65 49 66 ;. ChangeIf
13660 43 6f 6e 74 65 78 74 28 70 2d 3e 7a 49 66 2c 70 Context(p->zIf,p
13670 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20 49 6e State);. In
13680 73 65 72 74 45 78 74 72 61 44 65 63 6c 28 70 29 sertExtraDecl(p)
13690 3b 0a 20 20 20 20 20 20 53 74 72 69 6e 67 41 70 ;. StringAp
136a0 70 65 6e 64 28 70 53 74 61 74 65 2d 3e 70 53 74 pend(pState->pSt
136b0 72 2c 70 2d 3e 7a 44 65 63 6c 2c 30 29 3b 0a 20 r,p->zDecl,0);.
136c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a }. }.}../*.*
136d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 * This routine s
136e0 63 61 6e 73 20 74 68 65 20 69 6e 70 75 74 20 74 cans the input t
136f0 65 78 74 20 67 69 76 65 6e 2c 20 61 6e 64 20 61 ext given, and a
13700 70 70 65 6e 64 73 20 74 6f 20 74 68 65 0a 2a 2a ppends to the.**
13710 20 73 74 72 69 6e 67 20 69 6e 20 70 53 74 61 74 string in pStat
13720 65 2d 3e 70 53 74 72 20 74 68 65 20 74 65 78 74 e->pStr the text
13730 20 6f 66 20 61 6e 79 20 64 65 63 6c 61 72 61 74 of any declarat
13740 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 0a 2a ions that must.*
13750 2a 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 * occur before t
13760 68 65 20 74 65 78 74 20 69 6e 20 7a 54 65 78 74 he text in zText
13770 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 64 ..**.** If an id
13780 65 6e 74 69 66 69 65 72 20 69 6e 20 7a 54 65 78 entifier in zTex
13790 74 20 69 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 t is immediately
137a0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 27 2a 27 followed by '*'
137b0 2c 20 74 68 65 6e 0a 2a 2a 20 6f 6e 6c 79 20 66 , then.** only f
137c0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 orward declarati
137d0 6f 6e 73 20 61 72 65 20 6e 65 65 64 65 64 20 66 ons are needed f
137e0 6f 72 20 74 68 61 74 20 69 64 65 6e 74 69 66 69 or that identifi
137f0 65 72 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 69 er. If the.** i
13800 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 20 69 dentifier name i
13810 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 65 64 20 69 s not followed i
13820 6d 6d 65 64 69 61 74 65 6c 79 20 62 79 20 27 2a mmediately by '*
13830 27 2c 20 77 65 20 6d 75 73 74 20 73 75 70 70 6c ', we must suppl
13840 79 0a 2a 2a 20 61 20 66 75 6c 6c 20 64 65 63 6c y.** a full decl
13850 61 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 aration..*/.stat
13860 69 63 20 76 6f 69 64 20 53 63 61 6e 54 65 78 74 ic void ScanText
13870 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a (. const char *
13880 7a 54 65 78 74 2c 20 20 20 20 2f 2a 20 54 68 65 zText, /* The
13890 20 69 6e 70 75 74 20 74 65 78 74 20 74 6f 20 62 input text to b
138a0 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 47 e scanned */. G
138b0 65 6e 53 74 61 74 65 20 2a 70 53 74 61 74 65 20 enState *pState
138c0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 /* Current
138d0 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 6f 64 state of the cod
138e0 65 20 67 65 6e 65 72 61 74 6f 72 20 2a 2f 0a 29 e generator */.)
138f0 7b 0a 20 20 69 6e 74 20 6e 65 78 74 56 61 6c 69 {. int nextVali
13900 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 72 75 d = 0; /* Tru
13910 65 20 69 73 20 73 4e 65 78 74 20 63 6f 6e 74 61 e is sNext conta
13920 69 6e 73 20 76 61 6c 69 64 20 64 61 74 61 20 2a ins valid data *
13930 2f 0a 20 20 49 6e 53 74 72 65 61 6d 20 73 49 6e /. InStream sIn
13940 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 ; /* The
13950 20 69 6e 70 75 74 20 74 65 78 74 20 2a 2f 0a 20 input text */.
13960 20 54 6f 6b 65 6e 20 73 54 6f 6b 65 6e 3b 20 20 Token sToken;
13970 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 /* The cu
13980 72 72 65 6e 74 20 74 6f 6b 65 6e 20 62 65 69 6e rrent token bein
13990 67 20 65 78 61 6d 69 6e 65 64 20 2a 2f 0a 20 20 g examined */.
139a0 54 6f 6b 65 6e 20 73 4e 65 78 74 3b 20 20 20 20 Token sNext;
139b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 /* The nex
139c0 74 20 6e 6f 6e 2d 73 70 61 63 65 20 74 6f 6b 65 t non-space toke
139d0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 70 72 69 6e 74 n */.. /* print
139e0 66 28 22 42 45 47 49 4e 20 53 43 41 4e 20 54 45 f("BEGIN SCAN TE
139f0 58 54 20 6f 6e 20 25 73 5c 6e 22 2c 20 7a 54 65 XT on %s\n", zTe
13a00 78 74 29 3b 20 2a 2f 0a 0a 20 20 73 49 6e 2e 7a xt); */.. sIn.z
13a10 20 3d 20 7a 54 65 78 74 3b 0a 20 20 73 49 6e 2e = zText;. sIn.
13a20 69 20 3d 20 30 3b 0a 20 20 73 49 6e 2e 6e 4c 69 i = 0;. sIn.nLi
13a30 6e 65 20 3d 20 31 3b 0a 20 20 77 68 69 6c 65 28 ne = 1;. while(
13a40 20 73 49 6e 2e 7a 5b 73 49 6e 2e 69 5d 21 3d 30 sIn.z[sIn.i]!=0
13a50 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 ){. if( next
13a60 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 73 Valid ){. s
13a70 54 6f 6b 65 6e 20 3d 20 73 4e 65 78 74 3b 0a 20 Token = sNext;.
13a80 20 20 20 20 20 6e 65 78 74 56 61 6c 69 64 20 3d nextValid =
13a90 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 0;. }else{.
13aa0 20 20 20 20 20 47 65 74 4e 6f 6e 73 70 61 63 65 GetNonspace
13ab0 54 6f 6b 65 6e 28 26 73 49 6e 2c 26 73 54 6f 6b Token(&sIn,&sTok
13ac0 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 en);. }. i
13ad0 66 28 20 73 54 6f 6b 65 6e 2e 65 54 79 70 65 3d f( sToken.eType=
13ae0 3d 54 54 5f 49 64 20 29 7b 0a 20 20 20 20 20 20 =TT_Id ){.
13af0 69 6e 74 20 6e 65 65 64 46 75 6c 6c 44 65 63 6c int needFullDecl
13b00 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 ; /* True if w
13b10 65 20 6e 65 65 64 20 74 6f 20 70 72 6f 76 69 64 e need to provid
13b20 65 20 74 68 65 20 66 75 6c 6c 20 64 65 63 6c 61 e the full decla
13b30 72 61 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 ration,.
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13b50 20 20 2a 2a 20 6e 6f 74 20 6a 75 73 74 20 74 68 ** not just th
13b60 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 e forward declar
13b70 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 44 ation */. D
13b80 65 63 6c 20 2a 70 44 65 63 6c 3b 20 20 20 20 20 ecl *pDecl;
13b90 20 20 20 2f 2a 20 54 68 65 20 64 65 63 6c 61 72 /* The declar
13ba0 61 74 69 6f 6e 20 68 61 76 69 6e 67 20 74 68 65 ation having the
13bb0 20 6e 61 6d 65 20 69 6e 20 73 54 6f 6b 65 6e 20 name in sToken
13bc0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 */.. /*.
13bd0 20 20 20 2a 2a 20 53 65 65 20 69 66 20 74 68 65 ** See if the
13be0 72 65 20 69 73 20 61 20 64 65 63 6c 61 72 61 74 re is a declarat
13bf0 69 6f 6e 20 69 6e 20 74 68 65 20 64 61 74 61 62 ion in the datab
13c00 61 73 65 20 77 69 74 68 20 74 68 65 20 6e 61 6d ase with the nam
13c10 65 20 67 69 76 65 6e 0a 20 20 20 20 20 20 2a 2a e given. **
13c20 20 62 79 20 73 54 6f 6b 65 6e 2e 0a 20 20 20 20 by sToken..
13c30 20 20 2a 2f 0a 20 20 20 20 20 20 70 44 65 63 6c */. pDecl
13c40 20 3d 20 46 69 6e 64 44 65 63 6c 28 73 54 6f 6b = FindDecl(sTok
13c50 65 6e 2e 7a 54 65 78 74 2c 73 54 6f 6b 65 6e 2e en.zText,sToken.
13c60 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 nText);. if
13c70 28 20 70 44 65 63 6c 3d 3d 30 20 29 20 63 6f 6e ( pDecl==0 ) con
13c80 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a tinue;.. /*
13c90 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20 . ** If we
13ca0 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 77 65 get this far, we
13cb0 27 76 65 20 66 6f 75 6e 64 20 61 6e 20 69 64 65 've found an ide
13cc0 6e 74 69 66 69 65 72 20 74 68 61 74 20 68 61 73 ntifier that has
13cd0 20 61 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c a. ** decl
13ce0 61 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 64 aration in the d
13cf0 61 74 61 62 61 73 65 2e 20 20 4e 6f 77 20 73 65 atabase. Now se
13d00 65 20 69 66 20 77 65 20 74 68 65 20 66 75 6c 6c e if we the full
13d10 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 20 20 20 declaration.
13d20 20 20 20 2a 2a 20 6f 72 20 6a 75 73 74 20 61 20 ** or just a
13d30 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 forward declarat
13d40 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 ion.. */.
13d50 20 20 20 20 47 65 74 4e 6f 6e 73 70 61 63 65 54 GetNonspaceT
13d60 6f 6b 65 6e 28 26 73 49 6e 2c 26 73 4e 65 78 74 oken(&sIn,&sNext
13d70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 4e 65 );. if( sNe
13d80 78 74 2e 7a 54 65 78 74 5b 30 5d 3d 3d 27 2a 27 xt.zText[0]=='*'
13d90 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 ){. need
13da0 46 75 6c 6c 44 65 63 6c 20 3d 20 30 3b 0a 20 20 FullDecl = 0;.
13db0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
13dc0 20 20 20 6e 65 65 64 46 75 6c 6c 44 65 63 6c 20 needFullDecl
13dd0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 = 1;. nex
13de0 74 56 61 6c 69 64 20 3d 20 73 4e 65 78 74 2e 65 tValid = sNext.e
13df0 54 79 70 65 3d 3d 54 54 5f 49 64 3b 0a 20 20 20 Type==TT_Id;.
13e00 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 0a 20 }.. /*.
13e10 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 ** Generate
13e20 20 74 68 65 20 6e 65 65 64 65 64 20 64 65 63 6c the needed decl
13e30 61 72 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a aration.. *
13e40 2f 0a 20 20 20 20 20 20 44 65 63 6c 61 72 65 4f /. DeclareO
13e50 62 6a 65 63 74 28 70 44 65 63 6c 2c 70 53 74 61 bject(pDecl,pSta
13e60 74 65 2c 6e 65 65 64 46 75 6c 6c 44 65 63 6c 29 te,needFullDecl)
13e70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 ;. }else if(
13e80 73 54 6f 6b 65 6e 2e 65 54 79 70 65 3d 3d 54 54 sToken.eType==TT
13e90 5f 50 72 65 70 72 6f 63 65 73 73 6f 72 20 29 7b _Preprocessor ){
13ea0 0a 20 20 20 20 20 20 73 49 6e 2e 69 20 2d 3d 20 . sIn.i -=
13eb0 73 54 6f 6b 65 6e 2e 6e 54 65 78 74 20 2d 20 31 sToken.nText - 1
13ec0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a ;. }. }. /*
13ed0 20 70 72 69 6e 74 66 28 22 45 4e 44 20 53 43 41 printf("END SCA
13ee0 4e 54 45 58 54 5c 6e 22 29 3b 20 2a 2f 0a 7d 0a NTEXT\n"); */.}.
13ef0 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 ./*.** Provide a
13f00 20 66 75 6c 6c 20 64 65 63 6c 61 72 61 74 69 6f full declaratio
13f10 6e 20 74 6f 20 61 6e 79 20 6f 62 6a 65 63 74 20 n to any object
13f20 77 68 69 63 68 20 73 6f 20 66 61 72 20 68 61 73 which so far has
13f30 20 68 61 64 20 6f 6e 6c 79 0a 2a 2a 20 61 20 66 had only.** a f
13f40 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 orward declarati
13f50 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f on..*/.static vo
13f60 69 64 20 43 6f 6d 70 6c 65 74 65 46 6f 72 77 61 id CompleteForwa
13f70 72 64 44 65 63 6c 61 72 61 74 69 6f 6e 73 28 47 rdDeclarations(G
13f80 65 6e 53 74 61 74 65 20 2a 70 53 74 61 74 65 29 enState *pState)
13f90 7b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63 6c 3b {. Decl *pDecl;
13fa0 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b . int progress;
13fb0 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 .. do{. prog
13fc0 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f ress = 0;. fo
13fd0 72 28 70 44 65 63 6c 3d 70 44 65 63 6c 46 69 72 r(pDecl=pDeclFir
13fe0 73 74 3b 20 70 44 65 63 6c 3b 20 70 44 65 63 6c st; pDecl; pDecl
13ff0 3d 70 44 65 63 6c 2d 3e 70 4e 65 78 74 29 7b 0a =pDecl->pNext){.
14000 20 20 20 20 20 20 69 66 28 20 44 65 63 6c 48 61 if( DeclHa
14010 73 50 72 6f 70 65 72 74 79 28 70 44 65 63 6c 2c sProperty(pDecl,
14020 44 50 5f 46 6f 72 77 61 72 64 29 0a 20 20 20 20 DP_Forward).
14030 20 20 20 26 26 20 21 44 65 63 6c 48 61 73 50 72 && !DeclHasPr
14040 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f operty(pDecl,DP_
14050 44 65 63 6c 61 72 65 64 29 0a 20 20 20 20 20 20 Declared).
14060 29 7b 0a 20 20 20 20 20 20 20 20 44 65 63 6c 61 ){. Decla
14070 72 65 4f 62 6a 65 63 74 28 70 44 65 63 6c 2c 70 reObject(pDecl,p
14080 53 74 61 74 65 2c 31 29 3b 0a 20 20 20 20 20 20 State,1);.
14090 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a progress = 1;.
140a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 assert(
140b0 44 65 63 6c 48 61 73 50 72 6f 70 65 72 74 79 28 DeclHasProperty(
140c0 70 44 65 63 6c 2c 44 50 5f 44 65 63 6c 61 72 65 pDecl,DP_Declare
140d0 64 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 d) );. }.
140e0 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 }. }while( pr
140f0 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a 2f 2a 0a ogress );.}../*.
14100 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 ** Generate an i
14110 6e 63 6c 75 64 65 20 66 69 6c 65 20 66 6f 72 20 nclude file for
14120 74 68 65 20 67 69 76 65 6e 20 73 6f 75 72 63 65 the given source
14130 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 file. Return t
14140 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 he number.** of
14150 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 errors encounter
14160 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6e 6f 6c ed..**.** if nol
14170 6f 63 61 6c 5f 66 6c 61 67 20 69 73 20 74 72 75 ocal_flag is tru
14180 65 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 6e 6f e, then we do no
14190 74 20 67 65 6e 65 72 61 74 65 20 64 65 63 6c 61 t generate decla
141a0 72 61 74 69 6f 6e 73 20 66 6f 72 0a 2a 2a 20 6f rations for.** o
141b0 62 6a 65 63 74 65 64 20 6d 61 72 6b 65 64 20 44 bjected marked D
141c0 50 5f 4c 6f 63 61 6c 2e 0a 2a 2f 0a 73 74 61 74 P_Local..*/.stat
141d0 69 63 20 69 6e 74 20 4d 61 6b 65 48 65 61 64 65 ic int MakeHeade
141e0 72 28 49 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c r(InFile *pFile,
141f0 20 46 49 4c 45 20 2a 72 65 70 6f 72 74 2c 20 69 FILE *report, i
14200 6e 74 20 6e 6f 6c 6f 63 61 6c 5f 66 6c 61 67 29 nt nolocal_flag)
14210 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 {. int nErr = 0
14220 3b 0a 20 20 47 65 6e 53 74 61 74 65 20 73 53 74 ;. GenState sSt
14230 61 74 65 3b 0a 20 20 53 74 72 69 6e 67 20 6f 75 ate;. String ou
14240 74 53 74 72 3b 0a 20 20 49 64 65 6e 74 54 61 62 tStr;. IdentTab
14250 6c 65 20 69 6e 63 6c 75 64 65 54 61 62 6c 65 3b le includeTable;
14260 0a 20 20 49 64 65 6e 74 20 2a 70 49 64 3b 0a 20 . Ident *pId;.
14270 20 63 68 61 72 20 2a 7a 4e 65 77 56 65 72 73 69 char *zNewVersi
14280 6f 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 6c 64 on;. char *zOld
14290 56 65 72 73 69 6f 6e 3b 0a 0a 20 20 69 66 28 20 Version;.. if(
142a0 70 46 69 6c 65 2d 3e 7a 48 64 72 3d 3d 30 20 7c pFile->zHdr==0 |
142b0 7c 20 2a 70 46 69 6c 65 2d 3e 7a 48 64 72 3d 3d | *pFile->zHdr==
142c0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 0 ) return 0;.
142d0 73 53 74 61 74 65 2e 70 53 74 72 20 3d 20 26 6f sState.pStr = &o
142e0 75 74 53 74 72 3b 0a 20 20 53 74 72 69 6e 67 49 utStr;. StringI
142f0 6e 69 74 28 26 6f 75 74 53 74 72 29 3b 0a 20 20 nit(&outStr);.
14300 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 6f 75 StringAppend(&ou
14310 74 53 74 72 2c 7a 54 6f 70 4c 69 6e 65 2c 6e 54 tStr,zTopLine,nT
14320 6f 70 4c 69 6e 65 29 3b 0a 20 20 73 53 74 61 74 opLine);. sStat
14330 65 2e 70 54 61 62 6c 65 20 3d 20 26 69 6e 63 6c e.pTable = &incl
14340 75 64 65 54 61 62 6c 65 3b 0a 20 20 6d 65 6d 73 udeTable;. mems
14350 65 74 28 26 69 6e 63 6c 75 64 65 54 61 62 6c 65 et(&includeTable
14360 2c 30 2c 73 69 7a 65 6f 66 28 69 6e 63 6c 75 64 ,0,sizeof(includ
14370 65 54 61 62 6c 65 29 29 3b 0a 20 20 73 53 74 61 eTable));. sSta
14380 74 65 2e 7a 49 66 20 3d 20 30 3b 0a 20 20 73 53 te.zIf = 0;. sS
14390 74 61 74 65 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 tate.nErr = 0;.
143a0 20 73 53 74 61 74 65 2e 7a 46 69 6c 65 6e 61 6d sState.zFilenam
143b0 65 20 3d 20 70 46 69 6c 65 2d 3e 7a 53 72 63 3b e = pFile->zSrc;
143c0 0a 20 20 73 53 74 61 74 65 2e 66 6c 61 67 73 20 . sState.flags
143d0 3d 20 70 46 69 6c 65 2d 3e 66 6c 61 67 73 20 26 = pFile->flags &
143e0 20 44 50 5f 43 70 6c 75 73 70 6c 75 73 3b 0a 20 DP_Cplusplus;.
143f0 20 52 65 73 65 74 44 65 63 6c 46 6c 61 67 73 28 ResetDeclFlags(
14400 6e 6f 6c 6f 63 61 6c 5f 66 6c 61 67 20 3f 20 22 nolocal_flag ? "
14410 6e 6f 22 20 3a 20 70 46 69 6c 65 2d 3e 7a 53 72 no" : pFile->zSr
14420 63 29 3b 0a 20 20 66 6f 72 28 70 49 64 20 3d 20 c);. for(pId =
14430 70 46 69 6c 65 2d 3e 69 64 54 61 62 6c 65 2e 70 pFile->idTable.p
14440 4c 69 73 74 3b 20 70 49 64 3b 20 70 49 64 3d 70 List; pId; pId=p
14450 49 64 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 Id->pNext){.
14460 44 65 63 6c 20 2a 70 44 65 63 6c 20 3d 20 46 69 Decl *pDecl = Fi
14470 6e 64 44 65 63 6c 28 70 49 64 2d 3e 7a 4e 61 6d ndDecl(pId->zNam
14480 65 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 70 44 e,0);. if( pD
14490 65 63 6c 20 29 7b 0a 20 20 20 20 20 20 44 65 63 ecl ){. Dec
144a0 6c 61 72 65 4f 62 6a 65 63 74 28 70 44 65 63 6c lareObject(pDecl
144b0 2c 26 73 53 74 61 74 65 2c 31 29 3b 0a 20 20 20 ,&sState,1);.
144c0 20 7d 0a 20 20 7d 0a 20 20 43 6f 6d 70 6c 65 74 }. }. Complet
144d0 65 46 6f 72 77 61 72 64 44 65 63 6c 61 72 61 74 eForwardDeclarat
144e0 69 6f 6e 73 28 26 73 53 74 61 74 65 29 3b 0a 20 ions(&sState);.
144f0 20 43 68 61 6e 67 65 49 66 43 6f 6e 74 65 78 74 ChangeIfContext
14500 28 30 2c 26 73 53 74 61 74 65 29 3b 0a 20 20 6e (0,&sState);. n
14510 45 72 72 20 2b 3d 20 73 53 74 61 74 65 2e 6e 45 Err += sState.nE
14520 72 72 3b 0a 20 20 7a 4f 6c 64 56 65 72 73 69 6f rr;. zOldVersio
14530 6e 20 3d 20 52 65 61 64 46 69 6c 65 28 70 46 69 n = ReadFile(pFi
14540 6c 65 2d 3e 7a 48 64 72 29 3b 0a 20 20 7a 4e 65 le->zHdr);. zNe
14550 77 56 65 72 73 69 6f 6e 20 3d 20 53 74 72 69 6e wVersion = Strin
14560 67 47 65 74 28 26 6f 75 74 53 74 72 29 3b 0a 20 gGet(&outStr);.
14570 20 69 66 28 20 72 65 70 6f 72 74 20 29 20 66 70 if( report ) fp
14580 72 69 6e 74 66 28 72 65 70 6f 72 74 2c 22 25 73 rintf(report,"%s
14590 3a 20 22 2c 70 46 69 6c 65 2d 3e 7a 48 64 72 29 : ",pFile->zHdr)
145a0 3b 0a 20 20 69 66 28 20 7a 4f 6c 64 56 65 72 73 ;. if( zOldVers
145b0 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 ion==0 ){. if
145c0 28 20 72 65 70 6f 72 74 20 29 20 66 70 72 69 6e ( report ) fprin
145d0 74 66 28 72 65 70 6f 72 74 2c 22 75 70 64 61 74 tf(report,"updat
145e0 65 64 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 ed\n");. if(
145f0 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d WriteFile(pFile-
14600 3e 7a 48 64 72 2c 7a 4e 65 77 56 65 72 73 69 6f >zHdr,zNewVersio
14610 6e 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 n) ){. fpri
14620 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 ntf(stderr,"%s:
14630 43 61 6e 27 74 20 77 72 69 74 65 20 74 6f 20 66 Can't write to f
14640 69 6c 65 5c 6e 22 2c 70 46 69 6c 65 2d 3e 7a 48 ile\n",pFile->zH
14650 64 72 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b dr);. nErr+
14660 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 +;. }. }else
14670 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4f 6c if( strncmp(zOl
14680 64 56 65 72 73 69 6f 6e 2c 7a 54 6f 70 4c 69 6e dVersion,zTopLin
14690 65 2c 6e 54 6f 70 4c 69 6e 65 29 21 3d 30 20 29 e,nTopLine)!=0 )
146a0 7b 0a 20 20 20 20 69 66 28 20 72 65 70 6f 72 74 {. if( report
146b0 20 29 20 66 70 72 69 6e 74 66 28 72 65 70 6f 72 ) fprintf(repor
146c0 74 2c 22 65 72 72 6f 72 21 5c 6e 22 29 3b 0a 20 t,"error!\n");.
146d0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 fprintf(stder
146e0 72 2c 0a 20 20 20 20 20 20 20 22 25 73 3a 20 43 r,. "%s: C
146f0 61 6e 27 74 20 6f 76 65 72 77 72 69 74 65 20 74 an't overwrite t
14700 68 69 73 20 66 69 6c 65 20 62 65 63 61 75 73 65 his file because
14710 20 69 74 20 77 61 73 6e 27 74 20 70 72 65 76 69 it wasn't previ
14720 6f 75 73 6c 79 5c 6e 22 0a 20 20 20 20 20 20 20 ously\n".
14730 22 25 2a 73 20 20 67 65 6e 65 72 61 74 65 64 20 "%*s generated
14740 62 79 20 27 6d 61 6b 65 68 65 61 64 65 72 73 27 by 'makeheaders'
14750 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 46 69 .\n",. pFi
14760 6c 65 2d 3e 7a 48 64 72 2c 20 28 69 6e 74 29 73 le->zHdr, (int)s
14770 74 72 6c 65 6e 28 70 46 69 6c 65 2d 3e 7a 48 64 trlen(pFile->zHd
14780 72 29 2c 20 22 22 29 3b 0a 20 20 20 20 6e 45 72 r), "");. nEr
14790 72 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 r++;. }else if(
147a0 20 73 74 72 63 6d 70 28 7a 4f 6c 64 56 65 72 73 strcmp(zOldVers
147b0 69 6f 6e 2c 7a 4e 65 77 56 65 72 73 69 6f 6e 29 ion,zNewVersion)
147c0 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 !=0 ){. if( r
147d0 65 70 6f 72 74 20 29 20 66 70 72 69 6e 74 66 28 eport ) fprintf(
147e0 72 65 70 6f 72 74 2c 22 75 70 64 61 74 65 64 5c report,"updated\
147f0 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 57 72 69 n");. if( Wri
14800 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 7a 48 teFile(pFile->zH
14810 64 72 2c 7a 4e 65 77 56 65 72 73 69 6f 6e 29 20 dr,zNewVersion)
14820 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 ){. fprintf
14830 28 73 74 64 65 72 72 2c 22 25 73 3a 20 43 61 6e (stderr,"%s: Can
14840 27 74 20 77 72 69 74 65 20 74 6f 20 66 69 6c 65 't write to file
14850 5c 6e 22 2c 70 46 69 6c 65 2d 3e 7a 48 64 72 29 \n",pFile->zHdr)
14860 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a ;. nErr++;.
14870 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 }. }else if
14880 28 20 72 65 70 6f 72 74 20 29 7b 0a 20 20 20 20 ( report ){.
14890 66 70 72 69 6e 74 66 28 72 65 70 6f 72 74 2c 22 fprintf(report,"
148a0 75 6e 63 68 61 6e 67 65 64 5c 6e 22 29 3b 0a 20 unchanged\n");.
148b0 20 7d 0a 20 20 53 61 66 65 46 72 65 65 28 7a 4f }. SafeFree(zO
148c0 6c 64 56 65 72 73 69 6f 6e 29 3b 0a 20 20 49 64 ldVersion);. Id
148d0 65 6e 74 54 61 62 6c 65 52 65 73 65 74 28 26 69 entTableReset(&i
148e0 6e 63 6c 75 64 65 54 61 62 6c 65 29 3b 0a 20 20 ncludeTable);.
148f0 53 74 72 69 6e 67 52 65 73 65 74 28 26 6f 75 74 StringReset(&out
14900 53 74 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e Str);. return n
14910 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 Err;.}../*.** Ge
14920 6e 65 72 61 74 65 20 61 20 67 6c 6f 62 61 6c 20 nerate a global
14930 68 65 61 64 65 72 20 66 69 6c 65 20 2d 2d 20 61 header file -- a
14940 20 68 65 61 64 65 72 20 66 69 6c 65 20 74 68 61 header file tha
14950 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a t contains all.*
14960 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 20 * declarations.
14970 20 49 66 20 74 68 65 20 66 6f 72 45 78 70 6f 72 If the forExpor
14980 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 t flag is true,
14990 74 68 65 6e 20 6f 6e 6c 79 20 74 68 6f 73 65 0a then only those.
149a0 2a 2a 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 ** objects that
149b0 61 72 65 20 65 78 70 6f 72 74 65 64 20 61 72 65 are exported are
149c0 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 included in the
149d0 20 68 65 61 64 65 72 20 66 69 6c 65 2e 0a 2a 2f header file..*/
149e0 0a 73 74 61 74 69 63 20 69 6e 74 20 4d 61 6b 65 .static int Make
149f0 47 6c 6f 62 61 6c 48 65 61 64 65 72 28 69 6e 74 GlobalHeader(int
14a00 20 66 6f 72 45 78 70 6f 72 74 29 7b 0a 20 20 47 forExport){. G
14a10 65 6e 53 74 61 74 65 20 73 53 74 61 74 65 3b 0a enState sState;.
14a20 20 20 53 74 72 69 6e 67 20 6f 75 74 53 74 72 3b String outStr;
14a30 0a 20 20 49 64 65 6e 74 54 61 62 6c 65 20 69 6e . IdentTable in
14a40 63 6c 75 64 65 54 61 62 6c 65 3b 0a 20 20 44 65 cludeTable;. De
14a50 63 6c 20 2a 70 44 65 63 6c 3b 0a 0a 20 20 73 53 cl *pDecl;.. sS
14a60 74 61 74 65 2e 70 53 74 72 20 3d 20 26 6f 75 74 tate.pStr = &out
14a70 53 74 72 3b 0a 20 20 53 74 72 69 6e 67 49 6e 69 Str;. StringIni
14a80 74 28 26 6f 75 74 53 74 72 29 3b 0a 20 20 2f 2a t(&outStr);. /*
14a90 20 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 6f StringAppend(&o
14aa0 75 74 53 74 72 2c 7a 54 6f 70 4c 69 6e 65 2c 6e utStr,zTopLine,n
14ab0 54 6f 70 4c 69 6e 65 29 3b 20 2a 2f 0a 20 20 73 TopLine); */. s
14ac0 53 74 61 74 65 2e 70 54 61 62 6c 65 20 3d 20 26 State.pTable = &
14ad0 69 6e 63 6c 75 64 65 54 61 62 6c 65 3b 0a 20 20 includeTable;.
14ae0 6d 65 6d 73 65 74 28 26 69 6e 63 6c 75 64 65 54 memset(&includeT
14af0 61 62 6c 65 2c 30 2c 73 69 7a 65 6f 66 28 69 6e able,0,sizeof(in
14b00 63 6c 75 64 65 54 61 62 6c 65 29 29 3b 0a 20 20 cludeTable));.
14b10 73 53 74 61 74 65 2e 7a 49 66 20 3d 20 30 3b 0a sState.zIf = 0;.
14b20 20 20 73 53 74 61 74 65 2e 6e 45 72 72 20 3d 20 sState.nErr =
14b30 30 3b 0a 20 20 73 53 74 61 74 65 2e 7a 46 69 6c 0;. sState.zFil
14b40 65 6e 61 6d 65 20 3d 20 22 28 61 6c 6c 29 22 3b ename = "(all)";
14b50 0a 20 20 73 53 74 61 74 65 2e 66 6c 61 67 73 20 . sState.flags
14b60 3d 20 30 3b 0a 20 20 52 65 73 65 74 44 65 63 6c = 0;. ResetDecl
14b70 46 6c 61 67 73 28 30 29 3b 0a 20 20 66 6f 72 28 Flags(0);. for(
14b80 70 44 65 63 6c 3d 70 44 65 63 6c 46 69 72 73 74 pDecl=pDeclFirst
14b90 3b 20 70 44 65 63 6c 3b 20 70 44 65 63 6c 3d 70 ; pDecl; pDecl=p
14ba0 44 65 63 6c 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 Decl->pNext){.
14bb0 20 20 69 66 28 20 66 6f 72 45 78 70 6f 72 74 3d if( forExport=
14bc0 3d 30 20 7c 7c 20 44 65 63 6c 48 61 73 50 72 6f =0 || DeclHasPro
14bd0 70 65 72 74 79 28 70 44 65 63 6c 2c 44 50 5f 45 perty(pDecl,DP_E
14be0 78 70 6f 72 74 29 20 29 7b 0a 20 20 20 20 20 20 xport) ){.
14bf0 44 65 63 6c 61 72 65 4f 62 6a 65 63 74 28 70 44 DeclareObject(pD
14c00 65 63 6c 2c 26 73 53 74 61 74 65 2c 31 29 3b 0a ecl,&sState,1);.
14c10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 68 61 6e }. }. Chan
14c20 67 65 49 66 43 6f 6e 74 65 78 74 28 30 2c 26 73 geIfContext(0,&s
14c30 53 74 61 74 65 29 3b 0a 20 20 70 72 69 6e 74 66 State);. printf
14c40 28 22 25 73 22 2c 53 74 72 69 6e 67 47 65 74 28 ("%s",StringGet(
14c50 26 6f 75 74 53 74 72 29 29 3b 0a 20 20 49 64 65 &outStr));. Ide
14c60 6e 74 54 61 62 6c 65 52 65 73 65 74 28 26 69 6e ntTableReset(&in
14c70 63 6c 75 64 65 54 61 62 6c 65 29 3b 0a 20 20 53 cludeTable);. S
14c80 74 72 69 6e 67 52 65 73 65 74 28 26 6f 75 74 53 tringReset(&outS
14c90 74 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b tr);. return 0;
14ca0 0a 7d 0a 0a 23 69 66 64 65 66 20 44 45 42 55 47 .}..#ifdef DEBUG
14cb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 ./*.** Return th
14cc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 e number of char
14cd0 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 67 69 acters in the gi
14ce0 76 65 6e 20 73 74 72 69 6e 67 20 70 72 69 6f 72 ven string prior
14cf0 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 to the.** first
14d00 20 6e 65 77 6c 69 6e 65 2e 0a 2a 2f 0a 73 74 61 newline..*/.sta
14d10 74 69 63 20 69 6e 74 20 43 6c 69 70 54 72 61 69 tic int ClipTrai
14d20 6c 69 6e 67 4e 65 77 6c 69 6e 65 28 63 68 61 72 lingNewline(char
14d30 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 *z){. int n =
14d40 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 77 68 69 strlen(z);. whi
14d50 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d le( n>0 && (z[n-
14d60 31 5d 3d 3d 27 5c 6e 27 20 7c 7c 20 7a 5b 6e 2d 1]=='\n' || z[n-
14d70 31 5d 3d 3d 27 5c 72 27 29 20 29 7b 20 6e 2d 2d 1]=='\r') ){ n--
14d80 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a ; }. return n;.
14d90 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 6d 70 20 74 68 }../*.** Dump th
14da0 65 20 65 6e 74 69 72 65 20 64 65 63 6c 61 72 61 e entire declara
14db0 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 64 65 tion list for de
14dc0 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73 bugging purposes
14dd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
14de0 44 75 6d 70 44 65 63 6c 4c 69 73 74 28 76 6f 69 DumpDeclList(voi
14df0 64 29 7b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63 d){. Decl *pDec
14e00 6c 3b 0a 0a 20 20 66 6f 72 28 70 44 65 63 6c 20 l;.. for(pDecl
14e10 3d 20 70 44 65 63 6c 46 69 72 73 74 3b 20 70 44 = pDeclFirst; pD
14e20 65 63 6c 3b 20 70 44 65 63 6c 3d 70 44 65 63 6c ecl; pDecl=pDecl
14e30 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 72 ->pNext){. pr
14e40 69 6e 74 66 28 22 2a 2a 2a 2a 20 25 73 20 66 72 intf("**** %s fr
14e50 6f 6d 20 66 69 6c 65 20 25 73 20 2a 2a 2a 2a 5c om file %s ****\
14e60 6e 22 2c 70 44 65 63 6c 2d 3e 7a 4e 61 6d 65 2c n",pDecl->zName,
14e70 70 44 65 63 6c 2d 3e 7a 46 69 6c 65 29 3b 0a 20 pDecl->zFile);.
14e80 20 20 20 69 66 28 20 70 44 65 63 6c 2d 3e 7a 49 if( pDecl->zI
14e90 66 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 f ){. print
14ea0 66 28 22 49 66 3a 20 5b 25 2e 2a 73 5d 5c 6e 22 f("If: [%.*s]\n"
14eb0 2c 43 6c 69 70 54 72 61 69 6c 69 6e 67 4e 65 77 ,ClipTrailingNew
14ec0 6c 69 6e 65 28 70 44 65 63 6c 2d 3e 7a 49 66 29 line(pDecl->zIf)
14ed0 2c 70 44 65 63 6c 2d 3e 7a 49 66 29 3b 0a 20 20 ,pDecl->zIf);.
14ee0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 65 63 }. if( pDec
14ef0 6c 2d 3e 7a 46 77 64 20 29 7b 0a 20 20 20 20 20 l->zFwd ){.
14f00 20 70 72 69 6e 74 66 28 22 44 65 63 6c 3a 20 5b printf("Decl: [
14f10 25 2e 2a 73 5d 5c 6e 22 2c 43 6c 69 70 54 72 61 %.*s]\n",ClipTra
14f20 69 6c 69 6e 67 4e 65 77 6c 69 6e 65 28 70 44 65 ilingNewline(pDe
14f30 63 6c 2d 3e 7a 46 77 64 29 2c 70 44 65 63 6c 2d cl->zFwd),pDecl-
14f40 3e 7a 46 77 64 29 3b 0a 20 20 20 20 7d 0a 20 20 >zFwd);. }.
14f50 20 20 69 66 28 20 70 44 65 63 6c 2d 3e 7a 44 65 if( pDecl->zDe
14f60 63 6c 20 29 7b 0a 20 20 20 20 20 20 49 6e 73 65 cl ){. Inse
14f70 72 74 45 78 74 72 61 44 65 63 6c 28 70 44 65 63 rtExtraDecl(pDec
14f80 6c 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 l);. printf
14f90 28 22 44 65 66 3a 20 5b 25 2e 2a 73 5d 5c 6e 22 ("Def: [%.*s]\n"
14fa0 2c 43 6c 69 70 54 72 61 69 6c 69 6e 67 4e 65 77 ,ClipTrailingNew
14fb0 6c 69 6e 65 28 70 44 65 63 6c 2d 3e 7a 44 65 63 line(pDecl->zDec
14fc0 6c 29 2c 70 44 65 63 6c 2d 3e 7a 44 65 63 6c 29 l),pDecl->zDecl)
14fd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
14fe0 70 44 65 63 6c 2d 3e 66 6c 61 67 73 20 29 7b 0a pDecl->flags ){.
14ff0 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 static str
15000 75 63 74 20 7b 0a 20 20 20 20 20 20 20 20 69 6e uct {. in
15010 74 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 t mask;.
15020 63 68 61 72 20 2a 64 65 73 63 3b 0a 20 20 20 20 char *desc;.
15030 20 20 7d 20 66 6c 61 67 53 65 74 5b 5d 20 3d 20 } flagSet[] =
15040 7b 0a 20 20 20 20 20 20 20 20 7b 20 54 59 5f 43 {. { TY_C
15050 6c 61 73 73 2c 20 20 20 20 20 20 20 22 63 6c 61 lass, "cla
15060 73 73 22 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b ss" },. {
15070 20 54 59 5f 45 6e 75 6d 65 72 61 74 69 6f 6e 2c TY_Enumeration,
15080 20 22 65 6e 75 6d 22 20 7d 2c 0a 20 20 20 20 20 "enum" },.
15090 20 20 20 7b 20 54 59 5f 53 74 72 75 63 74 75 72 { TY_Structur
150a0 65 2c 20 20 20 22 73 74 72 75 63 74 22 20 7d 2c e, "struct" },
150b0 0a 20 20 20 20 20 20 20 20 7b 20 54 59 5f 55 6e . { TY_Un
150c0 69 6f 6e 2c 20 20 20 20 20 20 20 22 75 6e 69 6f ion, "unio
150d0 6e 22 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 n" },. {
150e0 54 59 5f 56 61 72 69 61 62 6c 65 2c 20 20 20 20 TY_Variable,
150f0 22 76 61 72 69 61 62 6c 65 22 20 7d 2c 0a 20 20 "variable" },.
15100 20 20 20 20 20 20 7b 20 54 59 5f 53 75 62 72 6f { TY_Subro
15110 75 74 69 6e 65 2c 20 20 22 66 75 6e 63 74 69 6f utine, "functio
15120 6e 22 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 n" },. {
15130 54 59 5f 54 79 70 65 64 65 66 2c 20 20 20 20 20 TY_Typedef,
15140 22 74 79 70 65 64 65 66 22 20 7d 2c 0a 20 20 20 "typedef" },.
15150 20 20 20 20 20 7b 20 54 59 5f 4d 61 63 72 6f 2c { TY_Macro,
15160 20 20 20 20 20 20 20 22 6d 61 63 72 6f 22 20 7d "macro" }
15170 2c 0a 20 20 20 20 20 20 20 20 7b 20 44 50 5f 45 ,. { DP_E
15180 78 70 6f 72 74 2c 20 20 20 20 20 20 22 65 78 70 xport, "exp
15190 6f 72 74 22 20 7d 2c 0a 20 20 20 20 20 20 20 20 ort" },.
151a0 7b 20 44 50 5f 4c 6f 63 61 6c 2c 20 20 20 20 20 { DP_Local,
151b0 20 20 22 6c 6f 63 61 6c 22 20 7d 2c 0a 20 20 20 "local" },.
151c0 20 20 20 20 20 7b 20 44 50 5f 43 70 6c 75 73 70 { DP_Cplusp
151d0 6c 75 73 2c 20 20 20 22 43 2b 2b 22 20 7d 2c 0a lus, "C++" },.
151e0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 };. i
151f0 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 72 69 6e nt i;. prin
15200 74 66 28 22 66 6c 61 67 73 3a 22 29 3b 0a 20 20 tf("flags:");.
15210 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 for(i=0; i<s
15220 69 7a 65 6f 66 28 66 6c 61 67 53 65 74 29 2f 73 izeof(flagSet)/s
15230 69 7a 65 6f 66 28 66 6c 61 67 53 65 74 5b 30 5d izeof(flagSet[0]
15240 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 ); i++){.
15250 20 69 66 28 20 66 6c 61 67 53 65 74 5b 69 5d 2e if( flagSet[i].
15260 6d 61 73 6b 20 26 20 70 44 65 63 6c 2d 3e 66 6c mask & pDecl->fl
15270 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ags ){.
15280 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c 20 66 printf(" %s", f
15290 6c 61 67 53 65 74 5b 69 5d 2e 64 65 73 63 29 3b lagSet[i].desc);
152a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
152b0 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 }. printf(
152c0 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 "\n");. }.
152d0 20 69 66 28 20 70 44 65 63 6c 2d 3e 70 49 6e 63 if( pDecl->pInc
152e0 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 49 6e lude ){. In
152f0 63 6c 75 64 65 20 2a 70 3b 0a 20 20 20 20 20 20 clude *p;.
15300 70 72 69 6e 74 66 28 22 69 6e 63 6c 75 64 65 73 printf("includes
15310 3a 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 :");. for(p
15320 3d 70 44 65 63 6c 2d 3e 70 49 6e 63 6c 75 64 65 =pDecl->pInclude
15330 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 ; p; p=p->pNext)
15340 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 {. printf
15350 28 22 20 25 73 22 2c 70 2d 3e 7a 46 69 6c 65 29 (" %s",p->zFile)
15360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
15370 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 printf("\n");.
15380 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 }. }.}.#endif
15390 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 ../*.** When the
153a0 20 22 2d 64 6f 63 22 20 63 6f 6d 6d 61 6e 64 2d "-doc" command-
153b0 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 line option is u
153c0 73 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e sed, this routin
153d0 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 74 e is called.** t
153e0 6f 20 70 72 69 6e 74 20 61 6c 6c 20 6f 66 20 74 o print all of t
153f0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 66 6f he database info
15400 72 6d 61 74 69 6f 6e 20 74 6f 20 73 74 61 6e 64 rmation to stand
15410 61 72 64 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 ard output..*/.s
15420 74 61 74 69 63 20 76 6f 69 64 20 44 6f 63 75 6d tatic void Docum
15430 65 6e 74 61 74 69 6f 6e 44 75 6d 70 28 76 6f 69 entationDump(voi
15440 64 29 7b 0a 20 20 44 65 63 6c 20 2a 70 44 65 63 d){. Decl *pDec
15450 6c 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 l;. static stru
15460 63 74 20 7b 0a 20 20 20 20 69 6e 74 20 6d 61 73 ct {. int mas
15470 6b 3b 0a 20 20 20 20 63 68 61 72 20 66 6c 61 67 k;. char flag
15480 3b 0a 20 20 7d 20 66 6c 61 67 53 65 74 5b 5d 20 ;. } flagSet[]
15490 3d 20 7b 0a 20 20 20 20 7b 20 54 59 5f 43 6c 61 = {. { TY_Cla
154a0 73 73 2c 20 20 20 20 20 20 20 27 63 27 20 7d 2c ss, 'c' },
154b0 0a 20 20 20 20 7b 20 54 59 5f 45 6e 75 6d 65 72 . { TY_Enumer
154c0 61 74 69 6f 6e 2c 20 27 65 27 20 7d 2c 0a 20 20 ation, 'e' },.
154d0 20 20 7b 20 54 59 5f 53 74 72 75 63 74 75 72 65 { TY_Structure
154e0 2c 20 20 20 27 73 27 20 7d 2c 0a 20 20 20 20 7b , 's' },. {
154f0 20 54 59 5f 55 6e 69 6f 6e 2c 20 20 20 20 20 20 TY_Union,
15500 20 27 75 27 20 7d 2c 0a 20 20 20 20 7b 20 54 59 'u' },. { TY
15510 5f 56 61 72 69 61 62 6c 65 2c 20 20 20 20 27 76 _Variable, 'v
15520 27 20 7d 2c 0a 20 20 20 20 7b 20 54 59 5f 53 75 ' },. { TY_Su
15530 62 72 6f 75 74 69 6e 65 2c 20 20 27 66 27 20 7d broutine, 'f' }
15540 2c 0a 20 20 20 20 7b 20 54 59 5f 54 79 70 65 64 ,. { TY_Typed
15550 65 66 2c 20 20 20 20 20 27 74 27 20 7d 2c 0a 20 ef, 't' },.
15560 20 20 20 7b 20 54 59 5f 4d 61 63 72 6f 2c 20 20 { TY_Macro,
15570 20 20 20 20 20 27 6d 27 20 7d 2c 0a 20 20 20 20 'm' },.
15580 7b 20 44 50 5f 45 78 70 6f 72 74 2c 20 20 20 20 { DP_Export,
15590 20 20 27 78 27 20 7d 2c 0a 20 20 20 20 7b 20 44 'x' },. { D
155a0 50 5f 4c 6f 63 61 6c 2c 20 20 20 20 20 20 20 27 P_Local, '
155b0 6c 27 20 7d 2c 0a 20 20 20 20 7b 20 44 50 5f 43 l' },. { DP_C
155c0 70 6c 75 73 70 6c 75 73 2c 20 20 20 27 2b 27 20 plusplus, '+'
155d0 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 66 6f 72 28 70 },. };.. for(p
155e0 44 65 63 6c 20 3d 20 70 44 65 63 6c 46 69 72 73 Decl = pDeclFirs
155f0 74 3b 20 70 44 65 63 6c 3b 20 70 44 65 63 6c 3d t; pDecl; pDecl=
15600 70 44 65 63 6c 2d 3e 70 4e 65 78 74 29 7b 0a 20 pDecl->pNext){.
15610 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e int i;. in
15620 74 20 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 t nLabel = 0;.
15630 20 20 63 68 61 72 20 2a 7a 44 65 63 6c 3b 0a 20 char *zDecl;.
15640 20 20 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 35 char zLabel[5
15650 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 0];. for(i=0;
15660 20 69 3c 73 69 7a 65 6f 66 28 66 6c 61 67 53 65 i<sizeof(flagSe
15670 74 29 2f 73 69 7a 65 6f 66 28 66 6c 61 67 53 65 t)/sizeof(flagSe
15680 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 t[0]); i++){.
15690 20 20 20 69 66 28 20 44 65 63 6c 48 61 73 50 72 if( DeclHasPr
156a0 6f 70 65 72 74 79 28 70 44 65 63 6c 2c 66 6c 61 operty(pDecl,fla
156b0 67 53 65 74 5b 69 5d 2e 6d 61 73 6b 29 20 29 7b gSet[i].mask) ){
156c0 0a 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c 5b . zLabel[
156d0 6e 4c 61 62 65 6c 2b 2b 5d 20 3d 20 66 6c 61 67 nLabel++] = flag
156e0 53 65 74 5b 69 5d 2e 66 6c 61 67 3b 0a 20 20 20 Set[i].flag;.
156f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 }. }. i
15700 66 28 20 6e 4c 61 62 65 6c 3d 3d 30 20 29 20 63 f( nLabel==0 ) c
15710 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 4c 61 ontinue;. zLa
15720 62 65 6c 5b 6e 4c 61 62 65 6c 5d 20 3d 20 30 3b bel[nLabel] = 0;
15730 0a 20 20 20 20 49 6e 73 65 72 74 45 78 74 72 61 . InsertExtra
15740 44 65 63 6c 28 70 44 65 63 6c 29 3b 0a 20 20 20 Decl(pDecl);.
15750 20 7a 44 65 63 6c 20 3d 20 70 44 65 63 6c 2d 3e zDecl = pDecl->
15760 7a 44 65 63 6c 3b 0a 20 20 20 20 69 66 28 20 7a zDecl;. if( z
15770 44 65 63 6c 3d 3d 30 20 29 20 7a 44 65 63 6c 20 Decl==0 ) zDecl
15780 3d 20 70 44 65 63 6c 2d 3e 7a 46 77 64 3b 0a 20 = pDecl->zFwd;.
15790 20 20 20 70 72 69 6e 74 66 28 22 25 73 20 25 73 printf("%s %s
157a0 20 25 73 20 25 70 20 25 64 20 25 64 20 25 64 20 %s %p %d %d %d
157b0 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 %d %d\n",.
157c0 20 70 44 65 63 6c 2d 3e 7a 4e 61 6d 65 2c 0a 20 pDecl->zName,.
157d0 20 20 20 20 20 20 7a 4c 61 62 65 6c 2c 0a 20 20 zLabel,.
157e0 20 20 20 20 20 70 44 65 63 6c 2d 3e 7a 46 69 6c pDecl->zFil
157f0 65 2c 0a 20 20 20 20 20 20 20 70 44 65 63 6c 2d e,. pDecl-
15800 3e 70 43 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20 20 >pComment,.
15810 20 20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e pDecl->pCommen
15820 74 20 3f 20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d t ? pDecl->pComm
15830 65 6e 74 2d 3e 6e 54 65 78 74 2b 31 20 3a 20 30 ent->nText+1 : 0
15840 2c 0a 20 20 20 20 20 20 20 70 44 65 63 6c 2d 3e ,. pDecl->
15850 7a 49 66 20 3f 20 28 69 6e 74 29 73 74 72 6c 65 zIf ? (int)strle
15860 6e 28 70 44 65 63 6c 2d 3e 7a 49 66 29 2b 31 20 n(pDecl->zIf)+1
15870 3a 20 30 2c 0a 20 20 20 20 20 20 20 7a 44 65 63 : 0,. zDec
15880 6c 20 3f 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 l ? (int)strlen(
15890 7a 44 65 63 6c 29 20 3a 20 30 2c 0a 20 20 20 20 zDecl) : 0,.
158a0 20 20 20 70 44 65 63 6c 2d 3e 70 43 6f 6d 6d 65 pDecl->pComme
158b0 6e 74 20 3f 20 70 44 65 63 6c 2d 3e 70 43 6f 6d nt ? pDecl->pCom
158c0 6d 65 6e 74 2d 3e 6e 4c 69 6e 65 20 3a 20 30 2c ment->nLine : 0,
158d0 0a 20 20 20 20 20 20 20 70 44 65 63 6c 2d 3e 74 . pDecl->t
158e0 6f 6b 65 6e 43 6f 64 65 2e 6e 54 65 78 74 20 3f okenCode.nText ?
158f0 20 70 44 65 63 6c 2d 3e 74 6f 6b 65 6e 43 6f 64 pDecl->tokenCod
15900 65 2e 6e 54 65 78 74 2b 31 20 3a 20 30 0a 20 20 e.nText+1 : 0.
15910 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 44 65 );. if( pDe
15920 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 20 29 7b 0a cl->pComment ){.
15930 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 2e printf("%.
15940 2a 73 5c 6e 22 2c 70 44 65 63 6c 2d 3e 70 43 6f *s\n",pDecl->pCo
15950 6d 6d 65 6e 74 2d 3e 6e 54 65 78 74 2c 20 70 44 mment->nText, pD
15960 65 63 6c 2d 3e 70 43 6f 6d 6d 65 6e 74 2d 3e 7a ecl->pComment->z
15970 54 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 Text);. }.
15980 20 69 66 28 20 70 44 65 63 6c 2d 3e 7a 49 66 20 if( pDecl->zIf
15990 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 ){. printf(
159a0 22 25 73 5c 6e 22 2c 70 44 65 63 6c 2d 3e 7a 49 "%s\n",pDecl->zI
159b0 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 f);. }. if
159c0 28 20 7a 44 65 63 6c 20 29 7b 0a 20 20 20 20 20 ( zDecl ){.
159d0 20 70 72 69 6e 74 66 28 22 25 73 22 2c 7a 44 65 printf("%s",zDe
159e0 63 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 cl);. }. i
159f0 66 28 20 70 44 65 63 6c 2d 3e 74 6f 6b 65 6e 43 f( pDecl->tokenC
15a00 6f 64 65 2e 6e 54 65 78 74 20 29 7b 0a 20 20 20 ode.nText ){.
15a10 20 20 20 70 72 69 6e 74 66 28 22 25 2e 2a 73 5c printf("%.*s\
15a20 6e 22 2c 70 44 65 63 6c 2d 3e 74 6f 6b 65 6e 43 n",pDecl->tokenC
15a30 6f 64 65 2e 6e 54 65 78 74 2c 20 70 44 65 63 6c ode.nText, pDecl
15a40 2d 3e 74 6f 6b 65 6e 43 6f 64 65 2e 7a 54 65 78 ->tokenCode.zTex
15a50 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a t);. }. }.}.
15a60 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 ./*.** Given the
15a70 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f complete text o
15a80 66 20 61 6e 20 69 6e 70 75 74 20 66 69 6c 65 2c f an input file,
15a90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 this routine pr
15aa0 69 6e 74 73 20 61 0a 2a 2a 20 64 6f 63 75 6d 65 ints a.** docume
15ab0 6e 74 61 74 69 6f 6e 20 72 65 63 6f 72 64 20 66 ntation record f
15ac0 6f 72 20 74 68 65 20 68 65 61 64 65 72 20 63 6f or the header co
15ad0 6d 6d 65 6e 74 20 61 74 20 74 68 65 20 62 65 67 mment at the beg
15ae0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 0a 2a 2a inning of the.**
15af0 20 66 69 6c 65 20 28 69 66 20 74 68 65 20 66 69 file (if the fi
15b00 6c 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20 le has a header
15b10 63 6f 6d 6d 65 6e 74 2e 29 0a 2a 2f 0a 76 6f 69 comment.).*/.voi
15b20 64 20 50 72 69 6e 74 4d 6f 64 75 6c 65 52 65 63 d PrintModuleRec
15b30 6f 72 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a ord(const char *
15b40 7a 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 zFile, const cha
15b50 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 r *zFilename){.
15b60 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63 int i;. static
15b70 20 69 6e 74 20 61 64 64 72 20 3d 20 35 3b 0a 20 int addr = 5;.
15b80 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 while( isspace(
15b90 2a 7a 46 69 6c 65 29 20 29 7b 20 7a 46 69 6c 65 *zFile) ){ zFile
15ba0 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 46 69 ++; }. if( *zFi
15bb0 6c 65 21 3d 27 2f 27 20 7c 7c 20 7a 46 69 6c 65 le!='/' || zFile
15bc0 5b 31 5d 21 3d 27 2a 27 20 29 20 72 65 74 75 72 [1]!='*' ) retur
15bd0 6e 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20 7a 46 n;. for(i=2; zF
15be0 69 6c 65 5b 69 5d 20 26 26 20 28 7a 46 69 6c 65 ile[i] && (zFile
15bf0 5b 69 2d 31 5d 21 3d 27 2f 27 20 7c 7c 20 7a 46 [i-1]!='/' || zF
15c00 69 6c 65 5b 69 2d 32 5d 21 3d 27 2a 27 29 3b 20 ile[i-2]!='*');
15c10 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 46 69 i++){}. if( zFi
15c20 6c 65 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72 le[i]==0 ) retur
15c30 6e 3b 0a 20 20 70 72 69 6e 74 66 28 22 25 73 20 n;. printf("%s
15c40 4d 20 25 73 20 25 64 20 25 64 20 30 20 30 20 30 M %s %d %d 0 0 0
15c50 20 30 5c 6e 25 2e 2a 73 5c 6e 22 2c 0a 20 20 20 0\n%.*s\n",.
15c60 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 69 6c zFilename, zFil
15c70 65 6e 61 6d 65 2c 20 61 64 64 72 2c 20 69 2b 31 ename, addr, i+1
15c80 2c 20 69 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 61 , i, zFile);. a
15c90 64 64 72 20 2b 3d 20 34 3b 0a 7d 0a 0a 0a 2f 2a ddr += 4;.}.../*
15ca0 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 69 6e 70 .** Given an inp
15cb0 75 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 ut argument to t
15cc0 68 65 20 70 72 6f 67 72 61 6d 2c 20 63 6f 6e 73 he program, cons
15cd0 74 72 75 63 74 20 61 20 6e 65 77 20 49 6e 46 69 truct a new InFi
15ce0 6c 65 0a 2a 2a 20 6f 62 6a 65 63 74 2e 0a 2a 2f le.** object..*/
15cf0 0a 73 74 61 74 69 63 20 49 6e 46 69 6c 65 20 2a .static InFile *
15d00 43 72 65 61 74 65 49 6e 46 69 6c 65 28 63 68 61 CreateInFile(cha
15d10 72 20 2a 7a 41 72 67 2c 20 69 6e 74 20 2a 70 6e r *zArg, int *pn
15d20 45 72 72 29 7b 0a 20 20 69 6e 74 20 6e 53 72 63 Err){. int nSrc
15d30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 72 63 3b 0a ;. char *zSrc;.
15d40 20 20 49 6e 46 69 6c 65 20 2a 70 46 69 6c 65 3b InFile *pFile;
15d50 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 0a . int i;.. /*.
15d60 20 20 2a 2a 20 47 65 74 20 74 68 65 20 6e 61 6d ** Get the nam
15d70 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 e of the input f
15d80 69 6c 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 ile to be scanne
15d90 64 2e 20 20 54 68 65 20 69 6e 70 75 74 20 66 69 d. The input fi
15da0 6c 65 20 69 73 0a 20 20 2a 2a 20 65 76 65 72 79 le is. ** every
15db0 74 68 69 6e 67 20 62 65 66 6f 72 65 20 74 68 65 thing before the
15dc0 20 66 69 72 73 74 20 27 3a 27 20 6f 72 20 74 68 first ':' or th
15dd0 65 20 77 68 6f 6c 65 20 66 69 6c 65 20 69 66 20 e whole file if
15de0 6e 6f 20 27 3a 27 20 69 73 20 73 65 65 6e 2e 0a no ':' is seen..
15df0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 **. ** Except
15e00 2c 20 6f 6e 20 77 69 6e 64 6f 77 73 2c 20 69 67 , on windows, ig
15e10 6e 6f 72 65 20 61 6e 79 20 27 3a 27 20 74 68 61 nore any ':' tha
15e20 74 20 6f 63 63 75 72 73 20 61 73 20 74 68 65 20 t occurs as the
15e30 73 65 63 6f 6e 64 20 63 68 61 72 61 63 74 65 72 second character
15e40 0a 20 20 2a 2a 20 73 69 6e 63 65 20 69 74 20 6d . ** since it m
15e50 69 67 68 74 20 62 65 20 70 61 72 74 20 6f 66 20 ight be part of
15e60 74 68 65 20 64 72 69 76 65 20 73 70 65 63 69 66 the drive specif
15e70 69 65 72 2e 20 20 53 6f 20 72 65 61 6c 6c 79 2c ier. So really,
15e80 20 74 68 65 20 22 3a 27 20 68 61 73 0a 20 20 2a the ":' has. *
15e90 2a 20 74 6f 20 62 65 20 74 68 65 20 33 72 64 20 * to be the 3rd
15ea0 6f 72 20 6c 61 74 65 72 20 63 68 61 72 61 63 74 or later charact
15eb0 65 72 20 69 6e 20 74 68 65 20 6e 61 6d 65 2e 20 er in the name.
15ec0 20 54 68 69 73 20 70 72 65 63 6c 75 64 65 73 20 This precludes
15ed0 31 2d 63 68 61 72 61 63 74 65 72 0a 20 20 2a 2a 1-character. **
15ee0 20 66 69 6c 65 20 6e 61 6d 65 73 2c 20 77 68 69 file names, whi
15ef0 63 68 20 72 65 61 6c 6c 79 20 73 68 6f 75 6c 64 ch really should
15f00 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 not be a proble
15f10 6d 2e 0a 20 20 2a 2f 0a 20 20 7a 53 72 63 20 3d m.. */. zSrc =
15f20 20 7a 41 72 67 3b 0a 20 20 66 6f 72 28 6e 53 72 zArg;. for(nSr
15f30 63 3d 32 3b 20 7a 53 72 63 5b 6e 53 72 63 5d 20 c=2; zSrc[nSrc]
15f40 26 26 20 7a 41 72 67 5b 6e 53 72 63 5d 21 3d 27 && zArg[nSrc]!='
15f50 3a 27 3b 20 6e 53 72 63 2b 2b 29 7b 7d 0a 20 20 :'; nSrc++){}.
15f60 70 46 69 6c 65 20 3d 20 53 61 66 65 4d 61 6c 6c pFile = SafeMall
15f70 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 46 69 6c oc( sizeof(InFil
15f80 65 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 e) );. memset(p
15f90 46 69 6c 65 2c 30 2c 73 69 7a 65 6f 66 28 49 6e File,0,sizeof(In
15fa0 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d File));. pFile-
15fb0 3e 7a 53 72 63 20 3d 20 53 74 72 44 75 70 28 7a >zSrc = StrDup(z
15fc0 53 72 63 2c 6e 53 72 63 29 3b 0a 0a 20 20 2f 2a Src,nSrc);.. /*
15fd0 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20 77 Figure out if w
15fe0 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 e are dealing wi
15ff0 74 68 20 43 20 6f 72 20 43 2b 2b 20 63 6f 64 65 th C or C++ code
16000 2e 20 20 41 73 73 75 6d 65 20 61 6e 79 0a 20 20 . Assume any.
16010 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 22 2e 63 ** file with ".c
16020 22 20 6f 72 20 22 2e 68 22 20 69 73 20 43 20 63 " or ".h" is C c
16030 6f 64 65 20 61 6e 64 20 61 6c 6c 20 65 6c 73 65 ode and all else
16040 20 69 73 20 43 2b 2b 2e 0a 20 20 2a 2f 0a 20 20 is C++.. */.
16050 69 66 28 20 6e 53 72 63 3e 32 20 26 26 20 7a 53 if( nSrc>2 && zS
16060 72 63 5b 6e 53 72 63 2d 32 5d 3d 3d 27 2e 27 20 rc[nSrc-2]=='.'
16070 26 26 20 28 7a 53 72 63 5b 6e 53 72 63 2d 31 5d && (zSrc[nSrc-1]
16080 3d 3d 27 63 27 20 7c 7c 20 7a 53 72 63 5b 6e 53 =='c' || zSrc[nS
16090 72 63 2d 31 5d 3d 3d 27 68 27 29 29 7b 0a 20 20 rc-1]=='h')){.
160a0 20 20 70 46 69 6c 65 2d 3e 66 6c 61 67 73 20 26 pFile->flags &
160b0 3d 20 7e 44 50 5f 43 70 6c 75 73 70 6c 75 73 3b = ~DP_Cplusplus;
160c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 . }else{. pF
160d0 69 6c 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 50 ile->flags |= DP
160e0 5f 43 70 6c 75 73 70 6c 75 73 3b 0a 20 20 7d 0a _Cplusplus;. }.
160f0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 61 20 . /*. ** If a
16100 73 65 70 61 72 61 74 65 20 68 65 61 64 65 72 20 separate header
16110 66 69 6c 65 20 69 73 20 73 70 65 63 69 66 69 65 file is specifie
16120 64 2c 20 75 73 65 20 69 74 0a 20 20 2a 2f 0a 20 d, use it. */.
16130 20 69 66 28 20 7a 53 72 63 5b 6e 53 72 63 5d 3d if( zSrc[nSrc]=
16140 3d 27 3a 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 =':' ){. int
16150 6e 48 64 72 3b 0a 20 20 20 20 63 68 61 72 20 2a nHdr;. char *
16160 7a 48 64 72 3b 0a 20 20 20 20 7a 48 64 72 20 3d zHdr;. zHdr =
16170 20 26 7a 53 72 63 5b 6e 53 72 63 2b 31 5d 3b 0a &zSrc[nSrc+1];.
16180 20 20 20 20 66 6f 72 28 6e 48 64 72 3d 30 3b 20 for(nHdr=0;
16190 7a 48 64 72 5b 6e 48 64 72 5d 3b 20 6e 48 64 72 zHdr[nHdr]; nHdr
161a0 2b 2b 29 7b 7d 0a 20 20 20 20 70 46 69 6c 65 2d ++){}. pFile-
161b0 3e 7a 48 64 72 20 3d 20 53 74 72 44 75 70 28 7a >zHdr = StrDup(z
161c0 48 64 72 2c 6e 48 64 72 29 3b 0a 20 20 7d 0a 0a Hdr,nHdr);. }..
161d0 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e /* Look for an
161e0 79 20 27 63 27 20 6f 72 20 27 43 27 20 69 6e 20 y 'c' or 'C' in
161f0 74 68 65 20 73 75 66 66 69 78 20 6f 66 20 74 68 the suffix of th
16200 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 e file name and
16210 63 68 61 6e 67 65 0a 20 20 2a 2a 20 74 68 61 74 change. ** that
16220 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 27 68 character to 'h
16230 27 20 6f 72 20 27 48 27 20 72 65 73 70 65 63 74 ' or 'H' respect
16240 69 76 65 6c 79 2e 20 20 49 66 20 6e 6f 20 27 63 ively. If no 'c
16250 27 20 6f 72 20 27 43 27 20 69 73 20 66 6f 75 6e ' or 'C' is foun
16260 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 61 73 73 d,. ** then ass
16270 75 6d 65 20 77 65 20 61 72 65 20 64 65 61 6c 69 ume we are deali
16280 6e 67 20 77 69 74 68 20 61 20 68 65 61 64 65 72 ng with a header
16290 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 .. */. else{.
162a0 20 20 20 69 6e 74 20 66 6f 75 6e 64 43 20 3d 20 int foundC =
162b0 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 48 0;. pFile->zH
162c0 64 72 20 3d 20 53 74 72 44 75 70 28 7a 53 72 63 dr = StrDup(zSrc
162d0 2c 6e 53 72 63 29 3b 0a 20 20 20 20 66 6f 72 28 ,nSrc);. for(
162e0 69 20 3d 20 6e 53 72 63 2d 31 3b 20 69 3e 30 20 i = nSrc-1; i>0
162f0 26 26 20 70 46 69 6c 65 2d 3e 7a 48 64 72 5b 69 && pFile->zHdr[i
16300 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b 0a 20 20 ]!='.'; i--){.
16310 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a if( pFile->z
16320 48 64 72 5b 69 5d 3d 3d 27 63 27 20 29 7b 0a 20 Hdr[i]=='c' ){.
16330 20 20 20 20 20 20 20 66 6f 75 6e 64 43 20 3d 20 foundC =
16340 31 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 1;. pFile
16350 2d 3e 7a 48 64 72 5b 69 5d 20 3d 20 27 68 27 3b ->zHdr[i] = 'h';
16360 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 . }else if(
16370 20 70 46 69 6c 65 2d 3e 7a 48 64 72 5b 69 5d 3d pFile->zHdr[i]=
16380 3d 27 43 27 20 29 7b 0a 20 20 20 20 20 20 20 20 ='C' ){.
16390 66 6f 75 6e 64 43 20 3d 20 31 3b 0a 20 20 20 20 foundC = 1;.
163a0 20 20 20 20 70 46 69 6c 65 2d 3e 7a 48 64 72 5b pFile->zHdr[
163b0 69 5d 20 3d 20 27 48 27 3b 0a 20 20 20 20 20 20 i] = 'H';.
163c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 }. }. if(
163d0 21 66 6f 75 6e 64 43 20 29 7b 0a 20 20 20 20 20 !foundC ){.
163e0 20 53 61 66 65 46 72 65 65 28 70 46 69 6c 65 2d SafeFree(pFile-
163f0 3e 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 70 46 >zHdr);. pF
16400 69 6c 65 2d 3e 7a 48 64 72 20 3d 20 30 3b 0a 20 ile->zHdr = 0;.
16410 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 }. }.. /*.
16420 20 2a 2a 20 49 66 20 70 46 69 6c 65 2d 3e 7a 53 ** If pFile->zS
16430 72 63 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 27 rc contains no '
16440 63 27 20 6f 72 20 27 43 27 20 69 6e 20 69 74 73 c' or 'C' in its
16450 20 65 78 74 65 6e 73 69 6f 6e 2c 20 69 74 0a 20 extension, it.
16460 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 20 68 65 ** must be a he
16470 61 64 65 72 20 66 69 6c 65 2e 20 20 20 49 6e 20 ader file. In
16480 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 6e 65 that case, we ne
16490 65 64 20 74 6f 20 73 65 74 20 74 68 65 0a 20 20 ed to set the.
164a0 2a 2a 20 50 53 5f 49 6e 74 65 72 66 61 63 65 20 ** PS_Interface
164b0 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 70 46 69 flag.. */. pFi
164c0 6c 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 53 5f le->flags |= PS_
164d0 49 6e 74 65 72 66 61 63 65 3b 0a 20 20 66 6f 72 Interface;. for
164e0 28 69 3d 6e 53 72 63 2d 31 3b 20 69 3e 30 20 26 (i=nSrc-1; i>0 &
164f0 26 20 7a 53 72 63 5b 69 5d 21 3d 27 2e 27 3b 20 & zSrc[i]!='.';
16500 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 i--){. if( zS
16510 72 63 5b 69 5d 3d 3d 27 63 27 20 7c 7c 20 7a 53 rc[i]=='c' || zS
16520 72 63 5b 69 5d 3d 3d 27 43 27 20 29 7b 0a 20 20 rc[i]=='C' ){.
16530 20 20 20 20 70 46 69 6c 65 2d 3e 66 6c 61 67 73 pFile->flags
16540 20 26 3d 20 7e 50 53 5f 49 6e 74 65 72 66 61 63 &= ~PS_Interfac
16550 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a e;. break;.
16560 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 }. }.. /*
16570 44 6f 6e 65 21 0a 20 20 2a 2f 0a 20 20 72 65 74 Done!. */. ret
16580 75 72 6e 20 70 46 69 6c 65 3b 0a 7d 0a 0a 2f 2a urn pFile;.}../*
16590 20 4d 53 2d 57 69 6e 64 6f 77 73 20 61 6e 64 20 MS-Windows and
165a0 4d 53 2d 44 4f 53 20 62 6f 74 68 20 68 61 76 65 MS-DOS both have
165b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 the following s
165c0 65 72 69 6f 75 73 20 4f 53 20 62 75 67 3a 20 20 erious OS bug:
165d0 74 68 65 0a 2a 2a 20 6c 65 6e 67 74 68 20 6f 66 the.** length of
165e0 20 61 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 a command line
165f0 69 73 20 73 65 76 65 72 65 6c 79 20 72 65 73 74 is severely rest
16600 72 69 63 74 65 64 2e 20 20 42 75 74 20 74 68 69 ricted. But thi
16610 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 63 63 s program.** occ
16620 61 73 69 6f 6e 61 6c 6c 79 20 72 65 71 75 69 72 asionally requir
16630 65 73 20 6c 6f 6e 67 20 63 6f 6d 6d 61 6e 64 20 es long command
16640 6c 69 6e 65 73 2e 20 20 48 65 6e 63 65 20 74 68 lines. Hence th
16650 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 77 e following.** w
16660 6f 72 6b 20 61 72 6f 75 6e 64 2e 0a 2a 2a 0a 2a ork around..**.*
16670 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 * If the paramet
16680 65 72 73 20 22 2d 66 20 46 49 4c 45 4e 41 4d 45 ers "-f FILENAME
16690 22 20 61 70 70 65 61 72 20 61 6e 79 77 68 65 72 " appear anywher
166a0 65 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 e on the command
166b0 20 6c 69 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 line,.** then t
166c0 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 he named file is
166d0 20 73 63 61 6e 6e 65 64 20 66 6f 72 20 61 64 64 scanned for add
166e0 69 74 69 6f 6e 61 6c 20 63 6f 6d 6d 61 6e 64 20 itional command
166f0 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a line arguments..
16700 2a 2a 20 54 68 65 73 65 20 61 72 67 75 6d 65 6e ** These argumen
16710 74 73 20 61 72 65 20 73 75 62 73 74 69 74 75 74 ts are substitut
16720 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 ed in place of t
16730 68 65 20 22 46 49 4c 45 4e 41 4d 45 22 20 61 72 he "FILENAME" ar
16740 67 75 6d 65 6e 74 0a 2a 2a 20 69 6e 20 74 68 65 gument.** in the
16750 20 6f 72 69 67 69 6e 61 6c 20 61 72 67 75 6d 65 original argume
16760 6e 74 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 nt list..**.** T
16770 68 69 73 20 66 69 72 73 74 20 70 61 72 61 6d 65 his first parame
16780 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 ter to this rout
16790 69 6e 65 20 69 73 20 74 68 65 20 69 6e 64 65 78 ine is the index
167a0 20 6f 66 20 74 68 65 20 22 2d 66 22 0a 2a 2a 20 of the "-f".**
167b0 70 61 72 61 6d 65 74 65 72 20 69 6e 20 74 68 65 parameter in the
167c0 20 61 72 67 76 5b 5d 20 61 72 72 61 79 2e 20 20 argv[] array.
167d0 54 68 65 20 61 72 67 63 20 61 6e 64 20 61 72 67 The argc and arg
167e0 76 20 61 72 65 20 70 61 73 73 65 64 20 62 79 0a v are passed by.
167f0 2a 2a 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 ** pointer so th
16800 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 63 at they can be c
16810 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 hanged..**.** Pa
16820 72 73 69 6e 67 20 6f 66 20 74 68 65 20 70 61 72 rsing of the par
16830 61 6d 65 74 65 72 73 20 69 6e 20 74 68 65 20 66 ameters in the f
16840 69 6c 65 20 69 73 20 76 65 72 79 20 73 69 6d 70 ile is very simp
16850 6c 65 2e 20 20 50 61 72 61 6d 65 74 65 72 73 0a le. Parameters.
16860 2a 2a 20 63 61 6e 20 62 65 20 73 65 70 61 72 61 ** can be separa
16870 74 65 64 20 62 79 20 61 6e 79 20 61 6d 6f 75 6e ted by any amoun
16880 74 20 6f 66 20 77 68 69 74 65 2d 73 70 61 63 65 t of white-space
16890 20 28 69 6e 63 6c 75 64 69 6e 67 20 6e 65 77 6c (including newl
168a0 69 6e 65 73 0a 2a 2a 20 61 6e 64 20 63 61 72 72 ines.** and carr
168b0 69 61 67 65 20 72 65 74 75 72 6e 73 2e 29 20 20 iage returns.)
168c0 54 68 65 72 65 20 61 72 65 20 6e 6f 77 20 71 75 There are now qu
168d0 6f 74 69 6e 67 20 63 68 61 72 61 63 74 65 72 73 oting characters
168e0 20 6f 66 20 61 6e 79 0a 2a 2a 20 6b 69 6e 64 2e of any.** kind.
168f0 20 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 The length of
16900 61 20 74 6f 6b 65 6e 20 69 73 20 6c 69 6d 69 74 a token is limit
16910 65 64 20 74 6f 20 61 62 6f 75 74 20 31 30 30 30 ed to about 1000
16920 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a characters..*/.
16930 73 74 61 74 69 63 20 76 6f 69 64 20 41 64 64 50 static void AddP
16940 61 72 61 6d 65 74 65 72 73 28 69 6e 74 20 69 6e arameters(int in
16950 64 65 78 2c 20 69 6e 74 20 2a 70 41 72 67 63 2c dex, int *pArgc,
16960 20 63 68 61 72 20 2a 2a 2a 70 41 72 67 76 29 7b char ***pArgv){
16970 0a 20 20 69 6e 74 20 61 72 67 63 20 3d 20 2a 70 . int argc = *p
16980 41 72 67 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 Argc; /* Th
16990 65 20 6f 72 69 67 69 6e 61 6c 20 61 72 67 63 20 e original argc
169a0 76 61 6c 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 value */. char
169b0 2a 2a 61 72 67 76 20 3d 20 2a 70 41 72 67 76 3b **argv = *pArgv;
169c0 20 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e /* The origin
169d0 61 6c 20 61 72 67 76 20 76 61 6c 75 65 20 2a 2f al argv value */
169e0 0a 20 20 69 6e 74 20 6e 65 77 41 72 67 63 3b 20 . int newArgc;
169f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 /* Va
16a00 6c 75 65 20 66 6f 72 20 61 72 67 63 20 61 66 74 lue for argc aft
16a10 65 72 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 er inserting new
16a20 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 arguments */.
16a30 63 68 61 72 20 2a 2a 7a 4e 65 77 20 3d 20 30 3b char **zNew = 0;
16a40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e /* The n
16a50 65 77 20 61 72 67 76 20 61 66 74 65 72 20 74 68 ew argv after th
16a60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 6f is routine is do
16a70 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 ne */. char *zF
16a80 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 ile;
16a90 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 /* Name of the i
16aa0 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69 nput file */. i
16ab0 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 nt nNew = 0;
16ac0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
16ad0 20 6f 66 20 6e 65 77 20 65 6e 74 72 69 65 73 20 of new entries
16ae0 69 6e 20 74 68 65 20 61 72 67 76 5b 5d 20 66 69 in the argv[] fi
16af0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c le */. int nAll
16b00 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 oc = 0;
16b10 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 /* Space allocat
16b20 65 64 20 66 6f 72 20 7a 4e 65 77 5b 5d 20 2a 2f ed for zNew[] */
16b30 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 . int i;
16b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f /* Lo
16b50 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 op counter */.
16b60 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 int n;
16b70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
16b80 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 r of characters
16b90 69 6e 20 61 20 6e 65 77 20 61 72 67 75 6d 65 6e in a new argumen
16ba0 74 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 t */. int c;
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
16bc0 2a 20 4e 65 78 74 20 63 68 61 72 61 63 74 65 72 * Next character
16bd0 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69 of input */. i
16be0 6e 74 20 73 74 61 72 74 4f 66 4c 69 6e 65 20 3d nt startOfLine =
16bf0 20 31 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 1; /* True i
16c00 66 20 77 65 20 61 72 65 20 77 68 65 72 65 20 27 f we are where '
16c10 23 27 20 63 61 6e 20 73 74 61 72 74 20 61 20 63 #' can start a c
16c20 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 46 49 4c 45 omment */. FILE
16c30 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 *in;
16c40 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 /* The input
16c50 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 file */. char
16c60 7a 42 75 66 5b 31 30 30 30 5d 3b 20 20 20 20 20 zBuf[1000];
16c70 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 61 /* A single a
16c80 72 67 75 6d 65 6e 74 20 69 73 20 61 63 63 75 6d rgument is accum
16c90 75 6c 61 74 65 64 20 68 65 72 65 20 2a 2f 0a 0a ulated here */..
16ca0 20 20 69 66 28 20 69 6e 64 65 78 2b 31 3d 3d 61 if( index+1==a
16cb0 72 67 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 rgc ) return;.
16cc0 7a 46 69 6c 65 20 3d 20 61 72 67 76 5b 69 6e 64 zFile = argv[ind
16cd0 65 78 2b 31 5d 3b 0a 20 20 69 6e 20 3d 20 66 6f ex+1];. in = fo
16ce0 70 65 6e 28 7a 46 69 6c 65 2c 22 72 22 29 3b 0a pen(zFile,"r");.
16cf0 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 if( in==0 ){.
16d00 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 fprintf(stder
16d10 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 69 6e r,"Can't open in
16d20 70 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 5c put file \"%s\"\
16d30 6e 22 2c 7a 46 69 6c 65 29 3b 0a 20 20 20 20 65 n",zFile);. e
16d40 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 63 20 xit(1);. }. c
16d50 3d 20 27 20 27 3b 0a 20 20 77 68 69 6c 65 28 20 = ' ';. while(
16d60 63 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20 77 68 c!=EOF ){. wh
16d70 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 69 ile( c!=EOF && i
16d80 73 73 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 sspace(c) ){.
16d90 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 if( c=='\n' )
16da0 7b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 4f {. startO
16db0 66 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 fLine = 1;.
16dc0 20 7d 0a 20 20 20 20 20 20 63 20 3d 20 67 65 74 }. c = get
16dd0 63 28 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 c(in);. if(
16de0 20 73 74 61 72 74 4f 66 4c 69 6e 65 20 26 26 20 startOfLine &&
16df0 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 c=='#' ){.
16e00 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 while( c!=EOF
16e10 26 26 20 63 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 && c!='\n' ){.
16e20 20 20 20 20 20 20 20 20 63 20 3d 20 67 65 74 63 c = getc
16e30 28 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a (in);. }.
16e40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
16e50 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 n = 0;. whi
16e60 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 21 69 le( c!=EOF && !i
16e70 73 73 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 sspace(c) ){.
16e80 20 20 20 69 66 28 20 6e 3c 73 69 7a 65 6f 66 28 if( n<sizeof(
16e90 7a 42 75 66 29 2d 31 20 29 7b 20 7a 42 75 66 5b zBuf)-1 ){ zBuf[
16ea0 6e 2b 2b 5d 20 3d 20 63 3b 20 7d 0a 20 20 20 20 n++] = c; }.
16eb0 20 20 73 74 61 72 74 4f 66 4c 69 6e 65 20 3d 20 startOfLine =
16ec0 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 67 65 74 0;. c = get
16ed0 63 28 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 c(in);. }.
16ee0 20 7a 42 75 66 5b 6e 5d 20 3d 20 30 3b 0a 20 20 zBuf[n] = 0;.
16ef0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 if( n>0 ){.
16f00 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 nNew++;.
16f10 20 69 66 28 20 6e 4e 65 77 20 2b 20 61 72 67 63 if( nNew + argc
16f20 20 3e 20 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 > nAlloc ){.
16f30 20 20 20 20 20 69 66 28 20 6e 41 6c 6c 6f 63 3d if( nAlloc=
16f40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 =0 ){.
16f50 6e 41 6c 6c 6f 63 20 3d 20 31 30 30 20 2b 20 61 nAlloc = 100 + a
16f60 72 67 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7a rgc;. z
16f70 4e 65 77 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 New = malloc( si
16f80 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 41 zeof(char*) * nA
16f90 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 20 20 20 20 lloc );.
16fa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 }else{.
16fb0 20 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 nAlloc *= 2;.
16fc0 20 20 20 20 20 20 20 20 7a 4e 65 77 20 3d 20 72 zNew = r
16fd0 65 61 6c 6c 6f 63 28 20 7a 4e 65 77 2c 20 73 69 ealloc( zNew, si
16fe0 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 41 zeof(char*) * nA
16ff0 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 20 20 20 20 lloc );.
17000 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }. }.
17010 69 66 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 if( zNew ){.
17020 20 20 20 20 69 6e 74 20 6a 20 3d 20 6e 4e 65 77 int j = nNew
17030 20 2b 20 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 + index;.
17040 20 20 7a 4e 65 77 5b 6a 5d 20 3d 20 6d 61 6c 6c zNew[j] = mall
17050 6f 63 28 20 6e 20 2b 20 31 20 29 3b 0a 20 20 20 oc( n + 1 );.
17060 20 20 20 20 20 69 66 28 20 7a 4e 65 77 5b 6a 5d if( zNew[j]
17070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 ){. st
17080 72 63 70 79 28 20 7a 4e 65 77 5b 6a 5d 2c 20 7a rcpy( zNew[j], z
17090 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20 20 7d Buf );. }
170a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
170b0 20 7d 0a 20 20 6e 65 77 41 72 67 63 20 3d 20 61 }. newArgc = a
170c0 72 67 63 20 2b 20 6e 4e 65 77 20 2d 20 31 3b 0a rgc + nNew - 1;.
170d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 69 6e for(i=0; i<=in
170e0 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a dex; i++){. z
170f0 4e 65 77 5b 69 5d 20 3d 20 61 72 67 76 5b 69 5d New[i] = argv[i]
17100 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6e 4e ;. }. for(i=nN
17110 65 77 20 2b 20 69 6e 64 65 78 20 2b 20 31 3b 20 ew + index + 1;
17120 69 3c 6e 65 77 41 72 67 63 3b 20 69 2b 2b 29 7b i<newArgc; i++){
17130 0a 20 20 20 20 7a 4e 65 77 5b 69 5d 20 3d 20 61 . zNew[i] = a
17140 72 67 76 5b 69 20 2b 20 31 20 2d 20 6e 4e 65 77 rgv[i + 1 - nNew
17150 5d 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77 5b 6e 65 ];. }. zNew[ne
17160 77 41 72 67 63 5d 20 3d 20 30 3b 0a 20 20 2a 70 wArgc] = 0;. *p
17170 41 72 67 63 20 3d 20 6e 65 77 41 72 67 63 3b 0a Argc = newArgc;.
17180 20 20 2a 70 41 72 67 76 20 3d 20 7a 4e 65 77 3b *pArgv = zNew;
17190 0a 7d 0a 0a 23 69 66 64 65 66 20 4e 4f 54 5f 55 .}..#ifdef NOT_U
171a0 53 45 44 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e SED./*.** Return
171b0 20 74 68 65 20 74 69 6d 65 20 74 68 61 74 20 74 the time that t
171c0 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 77 61 he given file wa
171d0 73 20 6c 61 73 74 20 6d 6f 64 69 66 69 65 64 2e s last modified.
171e0 20 20 49 66 20 77 65 20 63 61 6e 27 74 0a 2a 2a If we can't.**
171f0 20 6c 6f 63 61 74 65 20 74 68 65 20 66 69 6c 65 locate the file
17200 20 28 62 65 63 61 75 73 65 2c 20 66 6f 72 20 65 (because, for e
17210 78 61 6d 70 6c 65 2c 20 69 74 20 64 6f 65 73 6e xample, it doesn
17220 27 74 20 65 78 69 73 74 29 2c 20 74 68 65 6e 0a 't exist), then.
17230 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a ** return 0..*/.
17240 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 static unsigned
17250 69 6e 74 20 4d 6f 64 54 69 6d 65 28 63 6f 6e 73 int ModTime(cons
17260 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d t char *zFilenam
17270 65 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 e){. unsigned i
17280 6e 74 20 6d 54 69 6d 65 20 3d 20 30 3b 0a 20 20 nt mTime = 0;.
17290 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 struct stat sSta
172a0 74 3b 0a 20 20 69 66 28 20 73 74 61 74 28 7a 46 t;. if( stat(zF
172b0 69 6c 65 6e 61 6d 65 2c 26 73 53 74 61 74 29 3d ilename,&sStat)=
172c0 3d 30 20 29 7b 0a 20 20 20 20 6d 54 69 6d 65 20 =0 ){. mTime
172d0 3d 20 73 53 74 61 74 2e 73 74 5f 6d 74 69 6d 65 = sStat.st_mtime
172e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d ;. }. return m
172f0 54 69 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a Time;.}.#endif..
17300 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 75 73 /*.** Print a us
17310 61 67 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 age comment for
17320 74 68 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f this program..*/
17330 0a 73 74 61 74 69 63 20 76 6f 69 64 20 55 73 61 .static void Usa
17340 67 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 ge(const char *a
17350 72 67 76 30 2c 20 63 6f 6e 73 74 20 63 68 61 72 rgv0, const char
17360 20 2a 61 72 67 76 4e 29 7b 0a 20 20 66 70 72 69 *argvN){. fpri
17370 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 ntf(stderr,"%s:
17380 49 6c 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74 Illegal argument
17390 20 5c 22 25 73 5c 22 5c 6e 22 2c 61 72 67 76 30 \"%s\"\n",argv0
173a0 2c 61 72 67 76 4e 29 3b 0a 20 20 66 70 72 69 6e ,argvN);. fprin
173b0 74 66 28 73 74 64 65 72 72 2c 22 55 73 61 67 65 tf(stderr,"Usage
173c0 3a 20 25 73 20 5b 6f 70 74 69 6f 6e 73 5d 20 66 : %s [options] f
173d0 69 6c 65 6e 61 6d 65 2e 2e 2e 5c 6e 22 0a 20 20 ilename...\n".
173e0 20 20 22 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 20 "Options:\n".
173f0 20 20 20 22 20 20 2d 68 20 20 20 20 20 20 20 20 " -h
17400 20 20 47 65 6e 65 72 61 74 65 20 61 20 73 69 6e Generate a sin
17410 67 6c 65 20 2e 68 20 74 6f 20 73 74 61 6e 64 61 gle .h to standa
17420 72 64 20 6f 75 74 70 75 74 2e 5c 6e 22 0a 20 20 rd output.\n".
17430 20 20 22 20 20 2d 48 20 20 20 20 20 20 20 20 20 " -H
17440 20 4c 69 6b 65 20 2d 68 2c 20 62 75 74 20 6f 6e Like -h, but on
17450 6c 79 20 6f 75 74 70 75 74 20 45 58 50 4f 52 54 ly output EXPORT
17460 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 5c 6e declarations.\n
17470 22 0a 20 20 20 20 22 20 20 2d 76 20 20 20 20 20 ". " -v
17480 20 20 20 20 20 28 76 65 72 62 6f 73 65 29 20 57 (verbose) W
17490 72 69 74 65 20 73 74 61 74 75 73 20 69 6e 66 6f rite status info
174a0 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 73 rmation to the s
174b0 63 72 65 65 6e 2e 5c 6e 22 0a 20 20 20 20 22 20 creen.\n". "
174c0 20 2d 64 6f 63 20 20 20 20 20 20 20 20 47 65 6e -doc Gen
174d0 65 72 61 74 65 20 6e 6f 20 68 65 61 64 65 72 20 erate no header
174e0 66 69 6c 65 73 2e 20 20 49 6e 73 74 65 61 64 2c files. Instead,
174f0 20 6f 75 74 70 75 74 20 69 6e 66 6f 72 6d 61 74 output informat
17500 69 6f 6e 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 ion\n". "
17510 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 63 that c
17520 61 6e 20 62 65 20 75 73 65 64 20 62 79 20 61 6e an be used by an
17530 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 67 72 automatic progr
17540 61 6d 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e am documentation
17550 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 \n". "
17560 20 20 20 20 20 20 20 61 6e 64 20 63 72 6f 73 73 and cross
17570 2d 72 65 66 65 72 65 6e 63 65 20 67 65 6e 65 72 -reference gener
17580 61 74 6f 72 2e 5c 6e 22 0a 20 20 20 20 22 20 20 ator.\n". "
17590 2d 6c 6f 63 61 6c 20 20 20 20 20 20 47 65 6e 65 -local Gene
175a0 72 61 74 65 20 70 72 6f 74 6f 74 79 70 65 73 20 rate prototypes
175b0 66 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20 66 for \"static\" f
175c0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 5c 6e 22 0a unctions and\n".
175d0 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20 "
175e0 20 20 20 70 72 6f 63 65 64 75 72 65 73 2e 5c 6e procedures.\n
175f0 22 0a 20 20 20 20 22 20 20 2d 66 20 46 49 4c 45 ". " -f FILE
17600 20 20 20 20 20 52 65 61 64 20 61 64 64 69 74 69 Read additi
17610 6f 6e 61 6c 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e onal command-lin
17620 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d e arguments from
17630 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 5c the file named\
17640 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 n". "
17650 20 20 20 20 20 20 5c 22 46 49 4c 45 5c 22 2e 5c \"FILE\".\
17660 6e 22 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a n".#ifdef DEBUG.
17670 20 20 20 20 22 20 20 2d 21 20 4d 41 53 4b 20 20 " -! MASK
17680 20 20 20 53 65 74 20 74 68 65 20 64 65 62 75 67 Set the debug
17690 67 69 6e 67 20 6d 61 73 6b 20 74 6f 20 74 68 65 ging mask to the
176a0 20 6e 75 6d 62 65 72 20 5c 22 4d 41 53 4b 5c 22 number \"MASK\"
176b0 2e 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 .\n".#endif.
176c0 22 20 20 2d 2d 20 20 20 20 20 20 20 20 20 20 54 " -- T
176d0 72 65 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 reat all subsequ
176e0 65 6e 74 20 63 6f 6d 6d 65 6e 74 2d 6c 69 6e 65 ent comment-line
176f0 20 70 61 72 61 6d 65 74 65 72 73 20 61 73 20 66 parameters as f
17700 69 6c 65 6e 61 6d 65 73 2c 5c 6e 22 0a 20 20 20 ilenames,\n".
17710 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 "
17720 65 76 65 6e 20 69 66 20 74 68 65 79 20 62 65 67 even if they beg
17730 69 6e 20 77 69 74 68 20 5c 22 2d 5c 22 2e 5c 6e in with \"-\".\n
17740 22 2c 0a 20 20 20 20 61 72 67 76 30 0a 20 20 29 ",. argv0. )
17750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 ;.}../*.** The f
17760 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 20 63 6f ollowing text co
17770 6e 74 61 69 6e 73 20 61 20 66 65 77 20 73 69 6d ntains a few sim
17780 70 6c 65 20 23 64 65 66 69 6e 65 73 20 74 68 61 ple #defines tha
17790 74 20 77 65 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 t we want.** to
177a0 62 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 be available to
177b0 65 76 65 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73 every file..*/.s
177c0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
177d0 20 7a 49 6e 69 74 5b 5d 20 3d 0a 20 20 22 23 64 zInit[] =. "#d
177e0 65 66 69 6e 65 20 49 4e 54 45 52 46 41 43 45 20 efine INTERFACE
177f0 30 5c 6e 22 0a 20 20 22 23 64 65 66 69 6e 65 20 0\n". "#define
17800 45 58 50 4f 52 54 5f 49 4e 54 45 52 46 41 43 45 EXPORT_INTERFACE
17810 20 30 5c 6e 22 0a 20 20 22 23 64 65 66 69 6e 65 0\n". "#define
17820 20 4c 4f 43 41 4c 5f 49 4e 54 45 52 46 41 43 45 LOCAL_INTERFACE
17830 20 30 5c 6e 22 0a 20 20 22 23 64 65 66 69 6e 65 0\n". "#define
17840 20 45 58 50 4f 52 54 5c 6e 22 0a 20 20 22 23 64 EXPORT\n". "#d
17850 65 66 69 6e 65 20 4c 4f 43 41 4c 20 73 74 61 74 efine LOCAL stat
17860 69 63 5c 6e 22 0a 20 20 22 23 64 65 66 69 6e 65 ic\n". "#define
17870 20 50 55 42 4c 49 43 5c 6e 22 0a 20 20 22 23 64 PUBLIC\n". "#d
17880 65 66 69 6e 65 20 50 52 49 56 41 54 45 5c 6e 22 efine PRIVATE\n"
17890 0a 20 20 22 23 64 65 66 69 6e 65 20 50 52 4f 54 . "#define PROT
178a0 45 43 54 45 44 5c 6e 22 0a 3b 0a 0a 23 69 66 20 ECTED\n".;..#if
178b0 54 45 53 54 3d 3d 30 0a 69 6e 74 20 6d 61 69 6e TEST==0.int main
178c0 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 (int argc, char
178d0 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 69 **argv){. int i
178e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
178f0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 /* Loop counter
17900 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d */. int nErr =
17910 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 0; /* N
17920 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 umber of errors
17930 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 encountered */.
17940 20 54 6f 6b 65 6e 20 2a 70 4c 69 73 74 3b 20 20 Token *pList;
17950 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f /* List o
17960 66 20 69 6e 70 75 74 20 74 6f 6b 65 6e 73 20 66 f input tokens f
17970 6f 72 20 6f 6e 65 20 66 69 6c 65 20 2a 2f 0a 20 or one file */.
17980 20 49 6e 46 69 6c 65 20 2a 70 46 69 6c 65 4c 69 InFile *pFileLi
17990 73 74 20 3d 20 30 3b 2f 2a 20 4c 69 73 74 20 6f st = 0;/* List o
179a0 66 20 61 6c 6c 20 69 6e 70 75 74 20 66 69 6c 65 f all input file
179b0 73 20 2a 2f 0a 20 20 49 6e 46 69 6c 65 20 2a 70 s */. InFile *p
179c0 54 61 69 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 Tail = 0; /*
179d0 4c 61 73 74 20 66 69 6c 65 20 6f 6e 20 74 68 65 Last file on the
179e0 20 6c 69 73 74 20 2a 2f 0a 20 20 49 6e 46 69 6c list */. InFil
179f0 65 20 2a 70 46 69 6c 65 3b 20 20 20 20 20 20 20 e *pFile;
17a00 20 2f 2a 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 /* for looping
17a10 6f 76 65 72 20 74 68 65 20 66 69 6c 65 20 6c 69 over the file li
17a20 73 74 20 2a 2f 0a 20 20 69 6e 74 20 68 5f 66 6c st */. int h_fl
17a30 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a ag = 0; /*
17a40 20 54 72 75 65 20 69 66 20 2d 68 20 69 73 20 70 True if -h is p
17a50 72 65 73 65 6e 74 2e 20 20 4f 75 74 70 75 74 20 resent. Output
17a60 75 6e 69 66 69 65 64 20 68 65 61 64 65 72 20 2a unified header *
17a70 2f 0a 20 20 69 6e 74 20 48 5f 66 6c 61 67 20 3d /. int H_flag =
17a80 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 0; /* Tru
17a90 65 20 69 66 20 2d 48 20 69 73 20 70 72 65 73 65 e if -H is prese
17aa0 6e 74 2e 20 20 4f 75 74 70 75 74 20 45 58 50 4f nt. Output EXPO
17ab0 52 54 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 RT header */. i
17ac0 6e 74 20 76 5f 66 6c 61 67 20 3d 20 30 3b 20 20 nt v_flag = 0;
17ad0 20 20 20 20 20 2f 2a 20 56 65 72 62 6f 73 65 20 /* Verbose
17ae0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4d 6f 72 65 46 */. int noMoreF
17af0 6c 61 67 73 3b 20 20 20 20 20 20 2f 2a 20 54 72 lags; /* Tr
17b00 75 65 20 69 66 20 2d 2d 20 68 61 73 20 62 65 65 ue if -- has bee
17b10 6e 20 73 65 65 6e 2e 20 2a 2f 0a 20 20 46 49 4c n seen. */. FIL
17b20 45 20 2a 72 65 70 6f 72 74 3b 20 20 20 20 20 20 E *report;
17b30 20 20 20 2f 2a 20 53 65 6e 64 20 70 72 6f 67 72 /* Send progr
17b40 65 73 73 20 72 65 70 6f 72 74 73 20 74 6f 20 74 ess reports to t
17b50 68 69 73 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c his, if not NULL
17b60 20 2a 2f 0a 0a 20 20 6e 6f 4d 6f 72 65 46 6c 61 */.. noMoreFla
17b70 67 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d gs = 0;. for(i=
17b80 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 1; i<argc; i++){
17b90 0a 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d . if( argv[i]
17ba0 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 21 6e 6f 4d [0]=='-' && !noM
17bb0 6f 72 65 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 oreFlags ){.
17bc0 20 20 73 77 69 74 63 68 28 20 61 72 67 76 5b 69 switch( argv[i
17bd0 5d 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 ][1] ){.
17be0 63 61 73 65 20 27 68 27 3a 20 20 20 68 5f 66 6c case 'h': h_fl
17bf0 61 67 20 3d 20 31 3b 20 20 20 62 72 65 61 6b 3b ag = 1; break;
17c00 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 48 . case 'H
17c10 27 3a 20 20 20 48 5f 66 6c 61 67 20 3d 20 31 3b ': H_flag = 1;
17c20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
17c30 20 20 63 61 73 65 20 27 76 27 3a 20 20 20 76 5f case 'v': v_
17c40 66 6c 61 67 20 3d 20 31 3b 20 20 20 62 72 65 61 flag = 1; brea
17c50 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 k;. case
17c60 27 64 27 3a 20 20 20 64 6f 63 5f 66 6c 61 67 20 'd': doc_flag
17c70 3d 20 31 3b 20 70 72 6f 74 6f 5f 73 74 61 74 69 = 1; proto_stati
17c80 63 20 3d 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 c = 1; break;.
17c90 20 20 20 20 20 20 63 61 73 65 20 27 6c 27 3a 20 case 'l':
17ca0 20 20 70 72 6f 74 6f 5f 73 74 61 74 69 63 20 3d proto_static =
17cb0 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 1; break;.
17cc0 20 20 20 63 61 73 65 20 27 66 27 3a 20 20 20 41 case 'f': A
17cd0 64 64 50 61 72 61 6d 65 74 65 72 73 28 69 2c 20 ddParameters(i,
17ce0 26 61 72 67 63 2c 20 26 61 72 67 76 29 3b 20 62 &argc, &argv); b
17cf0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 reak;. ca
17d00 73 65 20 27 2d 27 3a 20 20 20 6e 6f 4d 6f 72 65 se '-': noMore
17d10 46 6c 61 67 73 20 3d 20 31 3b 20 20 20 62 72 65 Flags = 1; bre
17d20 61 6b 3b 0a 23 69 66 64 65 66 20 44 45 42 55 47 ak;.#ifdef DEBUG
17d30 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 21 . case '!
17d40 27 3a 20 20 20 69 2b 2b 3b 20 20 64 65 62 75 67 ': i++; debug
17d50 4d 61 73 6b 20 3d 20 73 74 72 74 6f 6c 28 61 72 Mask = strtol(ar
17d60 67 76 5b 69 5d 2c 30 2c 30 29 3b 20 62 72 65 61 gv[i],0,0); brea
17d70 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 k;.#endif.
17d80 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 55 73 default: Us
17d90 61 67 65 28 61 72 67 76 5b 30 5d 2c 61 72 67 76 age(argv[0],argv
17da0 5b 69 5d 29 3b 20 72 65 74 75 72 6e 20 31 3b 0a [i]); return 1;.
17db0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 }. }els
17dc0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 20 3d e{. pFile =
17dd0 20 43 72 65 61 74 65 49 6e 46 69 6c 65 28 61 72 CreateInFile(ar
17de0 67 76 5b 69 5d 2c 26 6e 45 72 72 29 3b 0a 20 20 gv[i],&nErr);.
17df0 20 20 20 20 69 66 28 20 70 46 69 6c 65 20 29 7b if( pFile ){
17e00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 . if( pFi
17e10 6c 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 leList ){.
17e20 20 20 20 20 70 54 61 69 6c 2d 3e 70 4e 65 78 74 pTail->pNext
17e30 20 3d 20 70 46 69 6c 65 3b 0a 20 20 20 20 20 20 = pFile;.
17e40 20 20 20 20 70 54 61 69 6c 20 3d 20 70 46 69 6c pTail = pFil
17e50 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 e;. }else
17e60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c {. pFil
17e70 65 4c 69 73 74 20 3d 20 70 54 61 69 6c 20 3d 20 eList = pTail =
17e80 70 46 69 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d pFile;. }
17e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
17ea0 20 7d 0a 20 20 69 66 28 20 68 5f 66 6c 61 67 20 }. if( h_flag
17eb0 26 26 20 48 5f 66 6c 61 67 20 29 7b 0a 20 20 20 && H_flag ){.
17ec0 20 68 5f 66 6c 61 67 20 3d 20 30 3b 0a 20 20 7d h_flag = 0;. }
17ed0 0a 20 20 69 66 28 20 76 5f 66 6c 61 67 20 29 7b . if( v_flag ){
17ee0 0a 20 20 20 20 72 65 70 6f 72 74 20 3d 20 28 68 . report = (h
17ef0 5f 66 6c 61 67 20 7c 7c 20 48 5f 66 6c 61 67 29 _flag || H_flag)
17f00 20 3f 20 73 74 64 65 72 72 20 3a 20 73 74 64 6f ? stderr : stdo
17f10 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ut;. }else{.
17f20 20 72 65 70 6f 72 74 20 3d 20 30 3b 0a 20 20 7d report = 0;. }
17f30 0a 20 20 69 66 28 20 6e 45 72 72 3e 30 20 29 7b . if( nErr>0 ){
17f40 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 . return nErr
17f50 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 69 6c ;. }. for(pFil
17f60 65 3d 70 46 69 6c 65 4c 69 73 74 3b 20 70 46 69 e=pFileList; pFi
17f70 6c 65 3b 20 70 46 69 6c 65 3d 70 46 69 6c 65 2d le; pFile=pFile-
17f80 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 68 61 >pNext){. cha
17f90 72 20 2a 7a 46 69 6c 65 3b 0a 0a 20 20 20 20 7a r *zFile;.. z
17fa0 46 69 6c 65 6e 61 6d 65 20 3d 20 70 46 69 6c 65 Filename = pFile
17fb0 2d 3e 7a 53 72 63 3b 0a 20 20 20 20 69 66 28 20 ->zSrc;. if(
17fc0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 63 zFilename==0 ) c
17fd0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 46 69 ontinue;. zFi
17fe0 6c 65 20 3d 20 52 65 61 64 46 69 6c 65 28 7a 46 le = ReadFile(zF
17ff0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 ilename);. if
18000 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 ( zFile==0 ){.
18010 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 fprintf(stde
18020 72 72 2c 22 43 61 6e 27 74 20 72 65 61 64 20 69 rr,"Can't read i
18030 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 nput file \"%s\"
18040 5c 6e 22 2c 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a \n",zFilename);.
18050 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 nErr++;.
18060 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 continue;.
18070 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 6e }. if( strn
18080 63 6d 70 28 7a 46 69 6c 65 2c 7a 54 6f 70 4c 69 cmp(zFile,zTopLi
18090 6e 65 2c 6e 54 6f 70 4c 69 6e 65 29 3d 3d 30 20 ne,nTopLine)==0
180a0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e ){. pFile->
180b0 7a 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 zSrc = 0;. }e
180c0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 72 lse{. if( r
180d0 65 70 6f 72 74 20 29 20 66 70 72 69 6e 74 66 28 eport ) fprintf(
180e0 72 65 70 6f 72 74 2c 22 52 65 61 64 69 6e 67 20 report,"Reading
180f0 25 73 2e 2e 2e 5c 6e 22 2c 7a 46 69 6c 65 6e 61 %s...\n",zFilena
18100 6d 65 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 me);. pList
18110 20 3d 20 54 6f 6b 65 6e 69 7a 65 46 69 6c 65 28 = TokenizeFile(
18120 7a 46 69 6c 65 2c 26 70 46 69 6c 65 2d 3e 69 64 zFile,&pFile->id
18130 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 Table);. if
18140 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 ( pList ){.
18150 20 20 20 6e 45 72 72 20 2b 3d 20 50 61 72 73 65 nErr += Parse
18160 46 69 6c 65 28 70 4c 69 73 74 2c 70 46 69 6c 65 File(pList,pFile
18170 2d 3e 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 ->flags);.
18180 20 20 46 72 65 65 54 6f 6b 65 6e 4c 69 73 74 28 FreeTokenList(
18190 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 pList);. }e
181a0 6c 73 65 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d lse if( zFile[0]
181b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 ==0 ){. f
181c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 49 printf(stderr,"I
181d0 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 nput file \"%s\"
181e0 20 69 73 20 65 6d 70 74 79 2e 5c 6e 22 2c 20 7a is empty.\n", z
181f0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 Filename);.
18200 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 nErr++;.
18210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
18220 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 fprintf(stderr,"
18230 45 72 72 6f 72 73 20 77 68 69 6c 65 20 70 72 6f Errors while pro
18240 63 65 73 73 69 6e 67 20 5c 22 25 73 5c 22 5c 6e cessing \"%s\"\n
18250 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 ", zFilename);.
18260 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 nErr++;.
18270 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 }. }.
18280 20 69 66 28 20 21 64 6f 63 5f 66 6c 61 67 20 29 if( !doc_flag )
18290 20 53 61 66 65 46 72 65 65 28 7a 46 69 6c 65 29 SafeFree(zFile)
182a0 3b 0a 20 20 20 20 69 66 28 20 64 6f 63 5f 66 6c ;. if( doc_fl
182b0 61 67 20 29 20 50 72 69 6e 74 4d 6f 64 75 6c 65 ag ) PrintModule
182c0 52 65 63 6f 72 64 28 7a 46 69 6c 65 2c 7a 46 69 Record(zFile,zFi
182d0 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 lename);. }. i
182e0 66 28 20 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 f( nErr>0 ){.
182f0 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20 return nErr;.
18300 7d 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a 20 }.#ifdef DEBUG.
18310 20 69 66 28 20 64 65 62 75 67 4d 61 73 6b 20 26 if( debugMask &
18320 20 44 45 43 4c 5f 44 55 4d 50 20 29 7b 0a 20 20 DECL_DUMP ){.
18330 20 20 44 75 6d 70 44 65 63 6c 4c 69 73 74 28 29 DumpDeclList()
18340 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 ;. return nEr
18350 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 r;. }.#endif.
18360 69 66 28 20 64 6f 63 5f 66 6c 61 67 20 29 7b 0a if( doc_flag ){.
18370 20 20 20 20 44 6f 63 75 6d 65 6e 74 61 74 69 6f Documentatio
18380 6e 44 75 6d 70 28 29 3b 0a 20 20 20 20 72 65 74 nDump();. ret
18390 75 72 6e 20 6e 45 72 72 3b 0a 20 20 7d 0a 20 20 urn nErr;. }.
183a0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 2d 2d 69 zFilename = "--i
183b0 6e 74 65 72 6e 61 6c 2d 2d 22 3b 0a 20 20 70 4c nternal--";. pL
183c0 69 73 74 20 3d 20 54 6f 6b 65 6e 69 7a 65 46 69 ist = TokenizeFi
183d0 6c 65 28 7a 49 6e 69 74 2c 30 29 3b 0a 20 20 69 le(zInit,0);. i
183e0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 f( pList==0 ){.
183f0 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 2b 31 return nErr+1
18400 3b 0a 20 20 7d 0a 20 20 50 61 72 73 65 46 69 6c ;. }. ParseFil
18410 65 28 70 4c 69 73 74 2c 50 53 5f 49 6e 74 65 72 e(pList,PS_Inter
18420 66 61 63 65 29 3b 0a 20 20 46 72 65 65 54 6f 6b face);. FreeTok
18430 65 6e 4c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 enList(pList);.
18440 20 69 66 28 20 68 5f 66 6c 61 67 20 7c 7c 20 48 if( h_flag || H
18450 5f 66 6c 61 67 20 29 7b 0a 20 20 20 20 6e 45 72 _flag ){. nEr
18460 72 20 2b 3d 20 4d 61 6b 65 47 6c 6f 62 61 6c 48 r += MakeGlobalH
18470 65 61 64 65 72 28 48 5f 66 6c 61 67 29 3b 0a 20 eader(H_flag);.
18480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 }else{. for(
18490 70 46 69 6c 65 3d 70 46 69 6c 65 4c 69 73 74 3b pFile=pFileList;
184a0 20 70 46 69 6c 65 3b 20 70 46 69 6c 65 3d 70 46 pFile; pFile=pF
184b0 69 6c 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 ile->pNext){.
184c0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 53 if( pFile->zS
184d0 72 63 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 rc==0 ) continue
184e0 3b 0a 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 ;. nErr +=
184f0 4d 61 6b 65 48 65 61 64 65 72 28 70 46 69 6c 65 MakeHeader(pFile
18500 2c 72 65 70 6f 72 74 2c 30 29 3b 0a 20 20 20 20 ,report,0);.
18510 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e }. }. return n
18520 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a Err;.}.#endif.