0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20 /*.** Copyright
0010: 28 63 29 20 32 30 31 34 20 44 2e 20 52 69 63 68 (c) 2014 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54 ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20 te it and/or.**
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20 modify it under
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 the terms of the
0090: 20 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20 Simplified BSD
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32 known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22 -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63 or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 ense".).**.** Th
00f0: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 is program is di
0100: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 stributed in the
0110: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 hope that it wi
0120: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a ll be useful,.**
0130: 20 62 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 but without any
0140: 20 77 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f warranty; witho
0150: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c ut even the impl
0160: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a ied warranty of.
0170: 2a 2a 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 ** merchantabili
0180: 74 79 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f ty or fitness fo
0190: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 r a particular p
01a0: 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 urpose..**.** Au
01b0: 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 thor contact inf
01c0: 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 ormation:.** d
01d0: 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 rh@hwaci.com.**
01e0: 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 http://www.hwa
01f0: 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a ci.com/drh/.**.*
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a **************.*
0250: 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 *.** This progra
0260: 6d 20 72 65 61 64 73 20 46 6f 73 73 69 6c 20 73 m reads Fossil s
0270: 6f 75 72 63 65 20 63 6f 64 65 20 66 69 6c 65 73 ource code files
0280: 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 76 65 and tries to ve
0290: 72 69 66 79 20 74 68 61 74 0a 2a 2a 20 70 72 69 rify that.** pri
02a0: 6e 74 66 2d 73 74 79 6c 65 20 66 6f 72 6d 61 74 ntf-style format
02b0: 20 73 74 72 69 6e 67 73 20 61 72 65 20 63 6f 72 strings are cor
02c0: 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 rect..**.** This
02d0: 20 70 72 6f 67 72 61 6d 20 69 6d 70 6c 65 6d 65 program impleme
02e0: 6e 74 73 20 61 20 63 6f 6d 70 69 6c 65 2d 74 69 nts a compile-ti
02f0: 6d 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 73 74 me validation st
0300: 65 70 20 6f 6e 20 74 68 65 20 46 6f 73 73 69 6c ep on the Fossil
0310: 0a 2a 2a 20 73 6f 75 72 63 65 20 63 6f 64 65 2e .** source code.
0320: 20 20 52 75 6e 6e 69 6e 67 20 74 68 69 73 20 70 Running this p
0330: 72 6f 67 72 61 6d 20 69 73 20 65 6e 74 69 72 65 rogram is entire
0340: 6c 79 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 ly optional. It
0350: 73 20 72 6f 6c 65 20 69 73 0a 2a 2a 20 73 69 6d s role is.** sim
0360: 69 6c 61 72 20 74 6f 20 74 68 65 20 2d 57 61 6c ilar to the -Wal
0370: 6c 20 63 6f 6d 70 69 6c 65 72 20 73 77 69 74 63 l compiler switc
0380: 68 20 6f 6e 20 67 63 63 2c 20 6f 72 20 74 68 65 h on gcc, or the
0390: 20 73 63 61 6e 2d 62 75 69 6c 64 20 75 74 69 6c scan-build util
03a0: 69 74 79 0a 2a 2a 20 6f 66 20 63 6c 61 6e 67 2c ity.** of clang,
03b0: 20 6f 72 20 6f 74 68 65 72 20 73 74 61 74 69 63 or other static
03c0: 20 61 6e 61 6c 79 7a 65 72 73 2e 20 20 54 68 65 analyzers. The
03d0: 20 70 75 72 70 6f 73 65 20 69 73 20 74 6f 20 74 purpose is to t
03e0: 72 79 20 74 6f 20 69 64 65 6e 74 69 66 79 0a 2a ry to identify.*
03f0: 2a 20 70 72 6f 62 6c 65 6d 73 20 69 6e 20 74 68 * problems in th
0400: 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 61 74 e source code at
0410: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 compile-time.
0420: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 The difference i
0430: 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 73 s that this.** s
0440: 74 61 74 69 63 20 63 68 65 63 6b 65 72 20 69 73 tatic checker is
0450: 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20 64 65 specifically de
0460: 73 69 67 6e 65 64 20 66 6f 72 20 74 68 65 20 70 signed for the p
0470: 61 72 74 69 63 75 6c 61 72 20 70 72 69 6e 74 66 articular printf
0480: 20 66 6f 72 6d 61 74 74 65 72 0a 2a 2a 20 69 6d formatter.** im
0490: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 plementation use
04a0: 64 20 62 79 20 46 6f 73 73 69 6c 2e 0a 2a 2a 0a d by Fossil..**.
04b0: 2a 2a 20 43 68 65 63 6b 73 20 69 6e 63 6c 75 64 ** Checks includ
04c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 56 e:.**.** * V
04d0: 65 72 69 66 79 20 74 68 61 74 20 76 61 72 61 72 erify that varar
04e0: 67 20 66 6f 72 6d 61 74 74 69 6e 67 20 72 6f 75 g formatting rou
04f0: 74 69 6e 65 73 20 6c 69 6b 65 20 62 6c 6f 62 5f tines like blob_
0500: 70 72 69 6e 74 66 28 29 20 6f 72 0a 2a 2a 20 20 printf() or.**
0510: 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 db_multi_ex
0520: 65 63 28 29 20 68 61 76 65 20 74 68 65 20 63 6f ec() have the co
0530: 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 rrect number of
0540: 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68 arguments for th
0550: 65 69 72 0a 2a 2a 20 20 20 20 20 20 20 66 6f 72 eir.** for
0560: 6d 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a mat string..**.*
0570: 2a 20 20 20 20 2a 20 20 46 6f 72 20 72 6f 75 74 * * For rout
0580: 69 6e 65 73 20 64 65 73 69 67 6e 65 64 20 74 6f ines designed to
0590: 20 67 65 6e 65 72 61 74 65 20 53 51 4c 20 6f 72 generate SQL or
05a0: 20 48 54 4d 4c 20 6f 72 20 61 20 55 52 4c 20 6f HTML or a URL o
05b0: 72 20 4a 53 4f 4e 2c 0a 2a 2a 20 20 20 20 20 20 r JSON,.**
05c0: 20 64 65 74 65 63 74 20 61 6e 64 20 77 61 72 6e detect and warn
05d0: 20 61 62 6f 75 74 20 70 6f 73 73 69 62 6c 65 20 about possible
05e0: 69 6e 6a 65 63 74 69 6f 6e 20 61 74 74 61 63 6b injection attack
05f0: 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c s..*/.#include <
0600: 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 stdio.h>.#includ
0610: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e e <stdlib.h>.#in
0620: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a clude <ctype.h>.
0630: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 #include <string
0640: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 .h>.#include <as
0650: 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 44 sert.h>../*.** D
0660: 65 62 75 67 67 69 6e 67 20 73 77 69 74 63 68 0a ebugging switch.
0670: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 56 */.static int eV
0680: 65 72 62 6f 73 65 20 3d 20 30 3b 0a 0a 2f 2a 0a erbose = 0;../*.
0690: 2a 2a 20 4d 61 6c 6c 6f 63 2c 20 61 62 6f 72 74 ** Malloc, abort
06a0: 69 6e 67 20 69 66 20 69 74 20 66 61 69 6c 73 2e ing if it fails.
06b0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 61 66 65 5f 6d .*/.void *safe_m
06c0: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 29 alloc(int nByte)
06d0: 7b 0a 20 20 76 6f 69 64 20 2a 78 20 3d 20 6d 61 {. void *x = ma
06e0: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69 lloc(nByte);. i
06f0: 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 66 f( x==0 ){. f
0700: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 printf(stderr, "
0710: 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 failed to alloca
0720: 74 65 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 20 te %d bytes\n",
0730: 6e 42 79 74 65 29 3b 0a 20 20 20 20 65 78 69 74 nByte);. exit
0740: 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 (1);. }. retur
0750: 6e 20 78 3b 0a 7d 0a 76 6f 69 64 20 2a 73 61 66 n x;.}.void *saf
0760: 65 5f 72 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a e_realloc(void *
0770: 70 4f 6c 64 2c 20 69 6e 74 20 6e 42 79 74 65 29 pOld, int nByte)
0780: 7b 0a 20 20 76 6f 69 64 20 2a 78 20 3d 20 72 65 {. void *x = re
0790: 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 42 79 74 alloc(pOld, nByt
07a0: 65 29 3b 0a 20 20 69 66 28 20 78 3d 3d 30 20 29 e);. if( x==0 )
07b0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 {. fprintf(st
07c0: 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f derr, "failed to
07d0: 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 62 79 74 allocate %d byt
07e0: 65 73 5c 6e 22 2c 20 6e 42 79 74 65 29 3b 0a 20 es\n", nByte);.
07f0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a exit(1);. }.
0800: 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f return x;.}../
0810: 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 65 6e *.** Read the en
0820: 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 tire content of
0830: 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 7a the file named z
0840: 46 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 6d 65 Filename into me
0850: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a mory obtained.**
0860: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 from malloc().
0870: 20 20 41 64 64 20 61 20 7a 65 72 6f 2d 74 65 72 Add a zero-ter
0880: 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65 20 65 minator to the e
0890: 6e 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 nd..** Return a
08a0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 pointer to that
08b0: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 memory..*/.stati
08c0: 63 20 63 68 61 72 20 2a 72 65 61 64 5f 66 69 6c c char *read_fil
08d0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 e(const char *zF
08e0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 46 49 4c 45 ilename){. FILE
08f0: 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 3b *in;. char *z;
0900: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 . int nByte;.
0910: 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 20 3d 20 int got;. in =
0920: 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c fopen(zFilename,
0930: 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e "rb");. if( in
0940: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 ==0 ){. retur
0950: 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b n 0;. }. fseek
0960: 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 (in, 0, SEEK_END
0970: 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 66 74 65 );. nByte = fte
0980: 6c 6c 28 69 6e 29 3b 0a 20 20 66 73 65 65 6b 28 ll(in);. fseek(
0990: 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 in, 0, SEEK_SET)
09a0: 3b 0a 20 20 7a 20 3d 20 73 61 66 65 5f 6d 61 6c ;. z = safe_mal
09b0: 6c 6f 63 28 20 6e 42 79 74 65 2b 31 20 29 3b 0a loc( nByte+1 );.
09c0: 20 20 67 6f 74 20 3d 20 66 72 65 61 64 28 7a 2c got = fread(z,
09d0: 20 31 2c 20 6e 42 79 74 65 2c 20 69 6e 29 3b 0a 1, nByte, in);.
09e0: 20 20 7a 5b 67 6f 74 5d 20 3d 20 30 3b 0a 20 20 z[got] = 0;.
09f0: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 72 65 fclose(in);. re
0a00: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a turn z;.}../*.**
0a10: 20 57 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 When parsing th
0a20: 65 20 69 6e 70 75 74 20 66 69 6c 65 2c 20 74 68 e input file, th
0a30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f 6b 65 e following toke
0a40: 6e 20 74 79 70 65 73 20 61 72 65 20 72 65 63 6f n types are reco
0a50: 67 6e 69 7a 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 gnized..*/.#defi
0a60: 6e 65 20 54 4b 5f 53 50 41 43 45 20 20 20 20 20 ne TK_SPACE
0a70: 20 31 20 20 20 20 20 20 2f 2a 20 57 68 69 74 65 1 /* White
0a80: 73 70 61 63 65 20 6f 72 20 63 6f 6d 6d 65 6e 74 space or comment
0a90: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4b 5f s */.#define TK_
0aa0: 49 44 20 20 20 20 20 20 20 20 20 32 20 20 20 20 ID 2
0ab0: 20 20 2f 2a 20 41 6e 20 69 64 65 6e 74 69 66 69 /* An identifi
0ac0: 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4b er */.#define TK
0ad0: 5f 53 54 52 20 20 20 20 20 20 20 20 33 20 20 20 _STR 3
0ae0: 20 20 20 2f 2a 20 41 20 73 74 72 69 6e 67 20 6c /* A string l
0af0: 69 74 65 72 61 6c 20 69 6e 20 64 6f 75 62 6c 65 iteral in double
0b00: 2d 71 75 6f 74 65 73 20 2a 2f 0a 23 64 65 66 69 -quotes */.#defi
0b10: 6e 65 20 54 4b 5f 4f 54 48 45 52 20 20 20 20 20 ne TK_OTHER
0b20: 20 34 20 20 20 20 20 20 2f 2a 20 41 6e 79 20 6f 4 /* Any o
0b30: 74 68 65 72 20 74 6f 6b 65 6e 20 2a 2f 0a 23 64 ther token */.#d
0b40: 65 66 69 6e 65 20 54 4b 5f 45 4f 46 20 20 20 20 efine TK_EOF
0b50: 20 20 20 39 39 20 20 20 20 20 20 2f 2a 20 45 6e 99 /* En
0b60: 64 20 6f 66 20 66 69 6c 65 20 2a 2f 0a 0a 2f 2a d of file */../*
0b70: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 .** Determine th
0b80: 65 20 6c 65 6e 67 74 68 20 61 6e 64 20 74 79 70 e length and typ
0b90: 65 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 62 e of the token b
0ba0: 65 67 69 6e 6e 69 6e 67 20 61 74 20 7a 5b 30 5d eginning at z[0]
0bb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 .*/.static int t
0bc0: 6f 6b 65 6e 5f 6c 65 6e 67 74 68 28 63 6f 6e 73 oken_length(cons
0bd0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a t char *z, int *
0be0: 70 54 79 70 65 2c 20 69 6e 74 20 2a 70 4c 4e 29 pType, int *pLN)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 {. int i;. if(
0c00: 20 7a 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 z[0]==0 ){.
0c10: 2a 70 54 79 70 65 20 3d 20 54 4b 5f 45 4f 46 3b *pType = TK_EOF;
0c20: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 . return 0;.
0c30: 20 7d 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 }. if( z[0]=='
0c40: 22 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 5c 27 27 "' || z[0]=='\''
0c50: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b ){. for(i=1;
0c60: 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 7a z[i] && z[i]!=z
0c70: 5b 30 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 [0]; i++){.
0c80: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 5c 27 20 if( z[i]=='\\'
0c90: 26 26 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a && z[i+1]!=0 ){.
0ca0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b if( z[i+
0cb0: 31 5d 3d 3d 27 5c 6e 27 20 29 20 28 2a 70 4c 4e 1]=='\n' ) (*pLN
0cc0: 29 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b )++;. i++
0cd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
0ce0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d 30 20 if( z[i]!=0
0cf0: 29 20 69 2b 2b 3b 0a 20 20 20 20 2a 70 54 79 70 ) i++;. *pTyp
0d00: 65 20 3d 20 7a 5b 30 5d 3d 3d 27 22 27 20 3f 20 e = z[0]=='"' ?
0d10: 54 4b 5f 53 54 52 20 3a 20 54 4b 5f 4f 54 48 45 TK_STR : TK_OTHE
0d20: 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3b R;. return i;
0d30: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 61 6c 6e . }. if( isaln
0d40: 75 6d 28 7a 5b 30 5d 29 20 7c 7c 20 7a 5b 30 5d um(z[0]) || z[0]
0d50: 3d 3d 27 5f 27 20 29 7b 0a 20 20 20 20 66 6f 72 =='_' ){. for
0d60: 28 69 3d 31 3b 20 69 73 61 6c 6e 75 6d 28 7a 5b (i=1; isalnum(z[
0d70: 69 5d 29 20 7c 7c 20 7a 5b 69 5d 3d 3d 27 5f 27 i]) || z[i]=='_'
0d80: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 2a 70 54 ; i++){}. *pT
0d90: 79 70 65 20 3d 20 69 73 61 6c 70 68 61 28 7a 5b ype = isalpha(z[
0da0: 30 5d 29 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 5f 27 0]) || z[0]=='_'
0db0: 20 3f 20 54 4b 5f 49 44 20 3a 20 54 4b 5f 4f 54 ? TK_ID : TK_OT
0dc0: 48 45 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 HER;. return
0dd0: 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 73 i;. }. if( iss
0de0: 70 61 63 65 28 7a 5b 30 5d 29 20 29 7b 0a 20 20 pace(z[0]) ){.
0df0: 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 5c 6e 27 if( z[0]=='\n'
0e00: 20 29 20 28 2a 70 4c 4e 29 2b 2b 3b 0a 20 20 20 ) (*pLN)++;.
0e10: 20 66 6f 72 28 69 3d 31 3b 20 69 73 73 70 61 63 for(i=1; isspac
0e20: 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 e(z[i]); i++){.
0e30: 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 if( z[i]=='
0e40: 5c 6e 27 20 29 20 28 2a 70 4c 4e 29 2b 2b 3b 0a \n' ) (*pLN)++;.
0e50: 20 20 20 20 7d 0a 20 20 20 20 2a 70 54 79 70 65 }. *pType
0e60: 20 3d 20 54 4b 5f 53 50 41 43 45 3b 0a 20 20 20 = TK_SPACE;.
0e70: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 return i;. }.
0e80: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26 if( z[0]=='/' &
0e90: 26 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 & z[1]=='*' ){.
0ea0: 20 20 20 66 6f 72 28 69 3d 32 3b 20 7a 5b 69 5d for(i=2; z[i]
0eb0: 20 26 26 20 28 7a 5b 69 5d 21 3d 27 2a 27 20 7c && (z[i]!='*' |
0ec0: 7c 20 7a 5b 69 2b 31 5d 21 3d 27 2f 27 29 3b 20 | z[i+1]!='/');
0ed0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 i++){. if(
0ee0: 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 28 2a 70 z[i]=='\n' ) (*p
0ef0: 4c 4e 29 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 LN)++;. }.
0f00: 20 69 66 28 20 7a 5b 69 5d 20 29 20 69 20 2b 3d if( z[i] ) i +=
0f10: 20 32 3b 0a 20 20 20 20 2a 70 54 79 70 65 20 3d 2;. *pType =
0f20: 20 54 4b 5f 53 50 41 43 45 3b 0a 20 20 20 20 72 TK_SPACE;. r
0f30: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69 eturn i;. }. i
0f40: 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 f( z[0]=='/' &&
0f50: 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 z[1]=='/' ){.
0f60: 20 66 6f 72 28 69 3d 32 3b 20 7a 5b 69 5d 20 26 for(i=2; z[i] &
0f70: 26 20 7a 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b & z[i]!='\n'; i+
0f80: 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 +){}. if( z[i
0f90: 5d 20 29 7b 0a 20 20 20 20 20 20 28 2a 70 4c 4e ] ){. (*pLN
0fa0: 29 2b 2b 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a )++;. i++;.
0fb0: 20 20 20 20 7d 0a 20 20 20 20 2a 70 54 79 70 65 }. *pType
0fc0: 20 3d 20 54 4b 5f 53 50 41 43 45 3b 0a 20 20 20 = TK_SPACE;.
0fd0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 return i;. }.
0fe0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 5c 5c 27 20 if( z[0]=='\\'
0ff0: 26 26 20 28 7a 5b 31 5d 3d 3d 27 5c 6e 27 20 7c && (z[1]=='\n' |
1000: 7c 20 28 7a 5b 31 5d 3d 3d 27 5c 72 27 20 26 26 | (z[1]=='\r' &&
1010: 20 7a 5b 32 5d 3d 3d 27 5c 6e 27 29 29 20 29 7b z[2]=='\n')) ){
1020: 0a 20 20 20 20 2a 70 54 79 70 65 20 3d 20 54 4b . *pType = TK
1030: 5f 53 50 41 43 45 3b 0a 20 20 20 20 72 65 74 75 _SPACE;. retu
1040: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 2a 70 54 79 rn 1;. }. *pTy
1050: 70 65 20 3d 20 54 4b 5f 4f 54 48 45 52 3b 0a 20 pe = TK_OTHER;.
1060: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a return 1;.}../*
1070: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e .** Return the n
1080: 65 78 74 20 6e 6f 6e 2d 77 68 69 74 65 73 70 61 ext non-whitespa
1090: 63 65 20 74 6f 6b 65 6e 0a 2a 2f 0a 63 6f 6e 73 ce token.*/.cons
10a0: 74 20 63 68 61 72 20 2a 6e 65 78 74 5f 6e 6f 6e t char *next_non
10b0: 5f 77 68 69 74 65 73 70 61 63 65 28 63 6f 6e 73 _whitespace(cons
10c0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a t char *z, int *
10d0: 70 4c 65 6e 2c 20 69 6e 74 20 2a 70 54 79 70 65 pLen, int *pType
10e0: 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 ){. int len;.
10f0: 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 69 6e 74 int eType;. int
1100: 20 6c 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 ln = 0;. while
1110: 28 20 28 6c 65 6e 20 3d 20 74 6f 6b 65 6e 5f 6c ( (len = token_l
1120: 65 6e 67 74 68 28 7a 2c 20 26 65 54 79 70 65 2c ength(z, &eType,
1130: 20 26 6c 6e 29 29 3e 30 20 26 26 20 65 54 79 70 &ln))>0 && eTyp
1140: 65 3d 3d 54 4b 5f 53 50 41 43 45 20 29 7b 0a 20 e==TK_SPACE ){.
1150: 20 20 20 7a 20 2b 3d 20 6c 65 6e 3b 0a 20 20 7d z += len;. }
1160: 0a 20 20 2a 70 4c 65 6e 20 3d 20 6c 65 6e 3b 0a . *pLen = len;.
1170: 20 20 2a 70 54 79 70 65 20 3d 20 65 54 79 70 65 *pType = eType
1180: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a ;. return z;.}.
1190: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 69 6e ./*.** Return in
11a0: 64 65 78 20 69 6e 74 6f 20 7a 5b 5d 20 66 6f 72 dex into z[] for
11b0: 20 74 68 65 20 66 69 72 73 74 20 62 61 6c 61 6e the first balan
11c0: 63 65 64 20 54 4b 5f 4f 54 48 45 52 20 74 6f 6b ced TK_OTHER tok
11d0: 65 6e 20 77 69 74 68 0a 2a 2a 20 76 61 6c 75 65 en with.** value
11e0: 20 63 56 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 cValue..*/.stat
11f0: 69 63 20 69 6e 74 20 64 69 73 74 61 6e 63 65 5f ic int distance_
1200: 74 6f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a to(const char *z
1210: 2c 20 63 68 61 72 20 63 56 61 6c 29 7b 0a 20 20 , char cVal){.
1220: 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 int len;. int d
1230: 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65 ist = 0;. int e
1240: 54 79 70 65 3b 0a 20 20 69 6e 74 20 6e 4e 65 73 Type;. int nNes
1250: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 6e 20 t = 0;. int ln
1260: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b = 0;. while( z[
1270: 30 5d 20 26 26 20 28 6c 65 6e 20 3d 20 74 6f 6b 0] && (len = tok
1280: 65 6e 5f 6c 65 6e 67 74 68 28 7a 2c 20 26 65 54 en_length(z, &eT
1290: 79 70 65 2c 20 26 6c 6e 29 29 3e 30 20 29 7b 0a ype, &ln))>0 ){.
12a0: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 54 if( eType==T
12b0: 4b 5f 4f 54 48 45 52 20 29 7b 0a 20 20 20 20 20 K_OTHER ){.
12c0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 63 56 61 6c 20 if( z[0]==cVal
12d0: 26 26 20 6e 4e 65 73 74 3d 3d 30 20 29 7b 0a 20 && nNest==0 ){.
12e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
12f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b }else if( z[
1300: 30 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 0]=='(' ){.
1310: 20 20 20 6e 4e 65 73 74 2b 2b 3b 0a 20 20 20 20 nNest++;.
1320: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d }else if( z[0]
1330: 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 ==')' ){.
1340: 20 6e 4e 65 73 74 2d 2d 3b 0a 20 20 20 20 20 20 nNest--;.
1350: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 69 73 74 }. }. dist
1360: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 7a 20 2b += len;. z +
1370: 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 = len;. }. ret
1380: 75 72 6e 20 64 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a urn dist;.}../*.
1390: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 ** Return the fi
13a0: 72 73 74 20 6e 6f 6e 2d 77 68 69 74 65 73 70 61 rst non-whitespa
13b0: 63 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e ce characters in
13c0: 20 7a 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 63 z[].*/.static c
13d0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 6b 69 70 5f onst char *skip_
13e0: 73 70 61 63 65 28 63 6f 6e 73 74 20 63 68 61 72 space(const char
13f0: 20 2a 7a 29 7b 0a 20 20 77 68 69 6c 65 28 20 69 *z){. while( i
1400: 73 73 70 61 63 65 28 7a 5b 30 5d 29 20 29 7b 20 sspace(z[0]) ){
1410: 7a 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 z++; }. return
1420: 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f z;.}../*.** Remo
1430: 76 65 20 65 78 63 65 73 73 20 77 68 69 74 65 73 ve excess whites
1440: 70 61 63 65 20 61 6e 64 20 6e 65 73 74 65 64 20 pace and nested
1450: 22 28 29 22 20 66 72 6f 6d 20 73 74 72 69 6e 67 "()" from string
1460: 20 7a 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 z..*/.static ch
1470: 61 72 20 2a 73 69 6d 70 6c 69 66 79 5f 65 78 70 ar *simplify_exp
1480: 72 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e r(char *z){. in
1490: 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 t n = (int)strle
14a0: 6e 28 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e n(z);. while( n
14b0: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 >0 ){. if( is
14c0: 73 70 61 63 65 28 7a 5b 30 5d 29 20 29 7b 0a 20 space(z[0]) ){.
14d0: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 z++;.
14e0: 6e 2d 2d 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 n--;. conti
14f0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 nue;. }. i
1500: 66 28 20 7a 5b 30 5d 3d 3d 27 28 27 20 26 26 20 f( z[0]=='(' &&
1510: 7a 5b 6e 2d 31 5d 3d 3d 27 29 27 20 29 7b 0a 20 z[n-1]==')' ){.
1520: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 z++;.
1530: 6e 20 2d 3d 20 32 3b 0a 20 20 20 20 20 20 63 6f n -= 2;. co
1540: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 ntinue;. }.
1550: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 7a break;. }. z
1560: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 [n] = 0;. retur
1570: 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 n z;.}../*.** Re
1580: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 turn true if the
1590: 20 69 6e 70 75 74 20 69 73 20 61 20 73 74 72 69 input is a stri
15a0: 6e 67 20 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a 73 ng literal..*/.s
15b0: 74 61 74 69 63 20 69 6e 74 20 69 73 5f 73 74 72 tatic int is_str
15c0: 69 6e 67 5f 6c 69 74 28 63 6f 6e 73 74 20 63 68 ing_lit(const ch
15d0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 75 ar *z){. int nu
15e0: 31 2c 20 6e 75 32 3b 0a 20 20 7a 20 3d 20 6e 65 1, nu2;. z = ne
15f0: 78 74 5f 6e 6f 6e 5f 77 68 69 74 65 73 70 61 63 xt_non_whitespac
1600: 65 28 7a 2c 20 26 6e 75 31 2c 20 26 6e 75 32 29 e(z, &nu1, &nu2)
1610: 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a ;. if( strcmp(z
1620: 2c 20 22 4e 55 4c 4c 22 29 3d 3d 30 20 29 20 72 , "NULL")==0 ) r
1630: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 eturn 1;. retur
1640: 6e 20 7a 5b 30 5d 3d 3d 27 22 27 3b 0a 7d 0a 0a n z[0]=='"';.}..
1650: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 /*.** Return tru
1660: 65 20 69 66 20 74 68 65 20 69 6e 70 75 74 20 69 e if the input i
1670: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 s an expression
1680: 6f 66 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 of string litera
1690: 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 ls:.**.** E
16a0: 58 50 52 20 3f 20 22 2e 2e 2e 22 20 3a 20 22 2e XPR ? "..." : ".
16b0: 2e 2e 22 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e ..".*/.static in
16c0: 74 20 69 73 5f 73 74 72 69 6e 67 5f 65 78 70 72 t is_string_expr
16d0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b (const char *z){
16e0: 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30 2c 20 . int len = 0,
16f0: 65 54 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 eType;. const c
1700: 68 61 72 20 2a 7a 4f 72 69 67 20 3d 20 7a 3b 0a har *zOrig = z;.
1710: 20 20 6c 65 6e 20 3d 20 64 69 73 74 61 6e 63 65 len = distance
1720: 5f 74 6f 28 7a 2c 20 27 3f 27 29 3b 0a 20 20 69 _to(z, '?');. i
1730: 66 28 20 7a 5b 6c 65 6e 5d 3d 3d 30 20 26 26 20 f( z[len]==0 &&
1740: 73 6b 69 70 5f 73 70 61 63 65 28 7a 29 5b 30 5d skip_space(z)[0]
1750: 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 7a 20 3d =='(' ){. z =
1760: 20 73 6b 69 70 5f 73 70 61 63 65 28 7a 29 20 2b skip_space(z) +
1770: 20 31 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 64 69 1;. len = di
1780: 73 74 61 6e 63 65 5f 74 6f 28 7a 2c 20 27 3f 27 stance_to(z, '?'
1790: 29 3b 0a 20 20 7d 0a 20 20 7a 20 2b 3d 20 6c 65 );. }. z += le
17a0: 6e 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 n;. if( z[0]=='
17b0: 3f 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 ?' ){. z++;.
17c0: 20 20 20 7a 20 3d 20 6e 65 78 74 5f 6e 6f 6e 5f z = next_non_
17d0: 77 68 69 74 65 73 70 61 63 65 28 7a 2c 20 26 6c whitespace(z, &l
17e0: 65 6e 2c 20 26 65 54 79 70 65 29 3b 0a 20 20 20 en, &eType);.
17f0: 20 69 66 28 20 65 54 79 70 65 3d 3d 54 4b 5f 53 if( eType==TK_S
1800: 54 52 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d TR ){. z +=
1810: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 len;. z =
1820: 6e 65 78 74 5f 6e 6f 6e 5f 77 68 69 74 65 73 70 next_non_whitesp
1830: 61 63 65 28 7a 2c 20 26 6c 65 6e 2c 20 26 65 54 ace(z, &len, &eT
1840: 79 70 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 ype);. if(
1850: 65 54 79 70 65 3d 3d 54 4b 5f 4f 54 48 45 52 20 eType==TK_OTHER
1860: 26 26 20 7a 5b 30 5d 3d 3d 27 3a 27 20 29 7b 0a && z[0]==':' ){.
1870: 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 6c 65 6e z += len
1880: 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 6e 65 ;. z = ne
1890: 78 74 5f 6e 6f 6e 5f 77 68 69 74 65 73 70 61 63 xt_non_whitespac
18a0: 65 28 7a 2c 20 26 6c 65 6e 2c 20 26 65 54 79 70 e(z, &len, &eTyp
18b0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 e);. if(
18c0: 65 54 79 70 65 3d 3d 54 4b 5f 53 54 52 20 29 7b eType==TK_STR ){
18d0: 0a 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 . z +=
18e0: 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7a len;. z
18f0: 20 3d 20 6e 65 78 74 5f 6e 6f 6e 5f 77 68 69 74 = next_non_whit
1900: 65 73 70 61 63 65 28 7a 2c 20 26 6c 65 6e 2c 20 espace(z, &len,
1910: 26 65 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 &eType);.
1920: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 54 4b if( eType==TK
1930: 5f 45 4f 46 20 29 20 72 65 74 75 72 6e 20 31 3b _EOF ) return 1;
1940: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 . if( e
1950: 54 79 70 65 3d 3d 54 4b 5f 4f 54 48 45 52 20 26 Type==TK_OTHER &
1960: 26 20 7a 5b 30 5d 3d 3d 27 29 27 20 26 26 20 73 & z[0]==')' && s
1970: 6b 69 70 5f 73 70 61 63 65 28 7a 4f 72 69 67 29 kip_space(zOrig)
1980: 5b 30 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 [0]=='(' ){.
1990: 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 6c 65 6e z += len
19a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 ;. z
19b0: 3d 20 6e 65 78 74 5f 6e 6f 6e 5f 77 68 69 74 65 = next_non_white
19c0: 73 70 61 63 65 28 7a 2c 20 26 6c 65 6e 2c 20 26 space(z, &len, &
19d0: 65 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 eType);.
19e0: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 54 if( eType==T
19f0: 4b 5f 45 4f 46 20 29 20 72 65 74 75 72 6e 20 31 K_EOF ) return 1
1a00: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 ;. }.
1a10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a }. }.
1a20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 }. }. retu
1a30: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 rn 0;.}../*.** A
1a40: 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f list of functio
1a50: 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 73 ns that return s
1a60: 74 72 69 6e 67 73 20 74 68 61 74 20 61 72 65 20 trings that are
1a70: 73 61 66 65 20 74 6f 20 69 6e 73 65 72 74 20 69 safe to insert i
1a80: 6e 74 6f 0a 2a 2a 20 53 51 4c 20 75 73 69 6e 67 nto.** SQL using
1a90: 20 25 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 %s..*/.static c
1aa0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 61 66 onst char *azSaf
1ab0: 65 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20 22 66 eFunc[] = {. "f
1ac0: 69 6c 65 6e 61 6d 65 5f 63 6f 6c 6c 61 74 69 6f ilename_collatio
1ad0: 6e 22 2c 0a 20 20 22 6c 65 61 66 5f 69 73 5f 63 n",. "leaf_is_c
1ae0: 6c 6f 73 65 64 5f 73 71 6c 22 2c 0a 20 20 22 74 losed_sql",. "t
1af0: 69 6d 65 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f imeline_query_fo
1b00: 72 5f 77 77 77 22 2c 0a 20 20 22 74 69 6d 65 6c r_www",. "timel
1b10: 69 6e 65 5f 71 75 65 72 79 5f 66 6f 72 5f 74 74 ine_query_for_tt
1b20: 79 22 2c 0a 20 20 22 62 6c 6f 62 5f 73 71 6c 5f y",. "blob_sql_
1b30: 74 65 78 74 22 2c 0a 20 20 22 67 6c 6f 62 5f 65 text",. "glob_e
1b40: 78 70 72 22 2c 0a 20 20 22 66 6f 73 73 69 6c 5f xpr",. "fossil_
1b50: 61 6c 6c 5f 72 65 73 65 72 76 65 64 5f 6e 61 6d all_reserved_nam
1b60: 65 73 22 2c 0a 20 20 22 63 6f 6e 66 69 67 75 72 es",. "configur
1b70: 65 5f 69 6e 6f 70 5f 72 68 73 22 2c 0a 20 20 22 e_inop_rhs",. "
1b80: 64 62 5f 73 65 74 74 69 6e 67 5f 69 6e 6f 70 5f db_setting_inop_
1b90: 72 68 73 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 rhs",.};../*.**
1ba0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 Return true if t
1bb0: 68 65 20 69 6e 70 75 74 20 69 73 20 61 6e 20 61 he input is an a
1bc0: 72 67 75 6d 65 6e 74 20 74 68 61 74 20 69 73 20 rgument that is
1bd0: 73 61 66 65 20 74 6f 20 75 73 65 20 77 69 74 68 safe to use with
1be0: 20 25 73 0a 2a 2a 20 77 68 69 6c 65 20 62 75 69 %s.** while bui
1bf0: 6c 64 69 6e 67 20 61 6e 20 53 51 4c 20 73 74 61 lding an SQL sta
1c00: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 tement..*/.stati
1c10: 63 20 69 6e 74 20 69 73 5f 73 71 6c 5f 73 61 66 c int is_sql_saf
1c20: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 e(const char *z)
1c30: 7b 0a 20 20 69 6e 74 20 6c 65 6e 2c 20 65 54 79 {. int len, eTy
1c40: 70 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 pe;. int i;..
1c50: 2f 2a 20 41 20 73 74 72 69 6e 67 20 6c 69 74 65 /* A string lite
1c60: 72 61 6c 20 69 73 20 73 61 66 65 20 66 6f 72 20 ral is safe for
1c70: 75 73 65 20 77 69 74 68 20 25 73 20 2a 2f 0a 20 use with %s */.
1c80: 20 69 66 28 20 69 73 5f 73 74 72 69 6e 67 5f 6c if( is_string_l
1c90: 69 74 28 7a 29 20 29 20 72 65 74 75 72 6e 20 31 it(z) ) return 1
1ca0: 3b 0a 0a 20 20 2f 2a 20 43 65 72 74 61 69 6e 20 ;.. /* Certain
1cb0: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 67 75 functions are gu
1cc0: 61 72 61 6e 74 65 65 64 20 74 6f 20 72 65 74 75 aranteed to retu
1cd0: 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 rn a string that
1ce0: 20 69 73 20 73 61 66 65 0a 20 20 2a 2a 20 66 6f is safe. ** fo
1cf0: 72 20 75 73 65 20 77 69 74 68 20 25 73 20 2a 2f r use with %s */
1d00: 0a 20 20 7a 20 3d 20 6e 65 78 74 5f 6e 6f 6e 5f . z = next_non_
1d10: 77 68 69 74 65 73 70 61 63 65 28 7a 2c 20 26 6c whitespace(z, &l
1d20: 65 6e 2c 20 26 65 54 79 70 65 29 3b 0a 20 20 66 en, &eType);. f
1d30: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 or(i=0; i<sizeof
1d40: 28 61 7a 53 61 66 65 46 75 6e 63 29 2f 73 69 7a (azSafeFunc)/siz
1d50: 65 6f 66 28 61 7a 53 61 66 65 46 75 6e 63 5b 30 eof(azSafeFunc[0
1d60: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 ]); i++){. if
1d70: 28 20 65 54 79 70 65 3d 3d 54 4b 5f 49 44 0a 20 ( eType==TK_ID.
1d80: 20 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28 7a && strncmp(z
1d90: 2c 20 61 7a 53 61 66 65 46 75 6e 63 5b 69 5d 2c , azSafeFunc[i],
1da0: 20 6c 65 6e 29 3d 3d 30 0a 20 20 20 20 20 26 26 len)==0. &&
1db0: 20 73 74 72 6c 65 6e 28 61 7a 53 61 66 65 46 75 strlen(azSafeFu
1dc0: 6e 63 5b 69 5d 29 3d 3d 6c 65 6e 0a 20 20 20 20 nc[i])==len.
1dd0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 ){. return
1de0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 1;. }. }..
1df0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f /* Expressions o
1e00: 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 45 58 50 f the form: EXP
1e10: 52 20 3f 20 22 2e 2e 2e 22 20 3a 20 22 2e 2e 2e R ? "..." : "...
1e20: 2e 22 20 63 61 6e 20 63 6f 75 6e 74 20 61 73 0a ." can count as.
1e30: 20 20 2a 2a 20 61 20 73 74 72 69 6e 67 20 6c 69 ** a string li
1e40: 74 65 72 61 6c 2e 20 2a 2f 0a 20 20 69 66 28 20 teral. */. if(
1e50: 69 73 5f 73 74 72 69 6e 67 5f 65 78 70 72 28 7a is_string_expr(z
1e60: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 ) ) return 1;..
1e70: 20 2f 2a 20 49 66 20 74 68 65 20 22 73 61 66 65 /* If the "safe
1e80: 2d 66 6f 72 2d 25 73 22 20 63 6f 6d 6d 65 6e 74 -for-%s" comment
1e90: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 appears in the
1ea0: 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 0a 20 argument, then.
1eb0: 20 2a 2a 20 6c 65 74 20 69 74 20 74 68 72 6f 75 ** let it throu
1ec0: 67 68 20 2a 2f 0a 20 20 69 66 28 20 73 74 72 73 gh */. if( strs
1ed0: 74 72 28 7a 2c 20 22 2f 2a 73 61 66 65 2d 66 6f tr(z, "/*safe-fo
1ee0: 72 2d 25 73 2a 2f 22 29 21 3d 30 20 29 20 72 65 r-%s*/")!=0 ) re
1ef0: 74 75 72 6e 20 31 3b 0a 0a 20 20 72 65 74 75 72 turn 1;.. retur
1f00: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 n 0;.}../*.** Re
1f10: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 turn true if the
1f20: 20 69 6e 70 75 74 20 69 73 20 61 6e 20 61 72 67 input is an arg
1f30: 75 6d 65 6e 74 20 74 68 61 74 20 69 73 20 6e 65 ument that is ne
1f40: 76 65 72 20 73 61 66 65 20 66 6f 72 20 75 73 65 ver safe for use
1f50: 0a 2a 2a 20 77 69 74 68 20 25 73 2e 0a 2a 2f 0a .** with %s..*/.
1f60: 73 74 61 74 69 63 20 69 6e 74 20 6e 65 76 65 72 static int never
1f70: 5f 73 61 66 65 28 63 6f 6e 73 74 20 63 68 61 72 _safe(const char
1f80: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 74 72 73 *z){. if( strs
1f90: 74 72 28 7a 2c 22 2f 2a 73 61 66 65 2d 66 6f 72 tr(z,"/*safe-for
1fa0: 2d 25 73 2a 2f 22 29 21 3d 30 20 29 20 72 65 74 -%s*/")!=0 ) ret
1fb0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 5b 30 urn 0;. if( z[0
1fc0: 5d 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 69 66 ]=='P' ){. if
1fd0: 28 20 73 74 72 6e 63 6d 70 28 7a 2c 22 50 49 46 ( strncmp(z,"PIF
1fe0: 28 22 2c 34 29 3d 3d 30 20 29 20 72 65 74 75 72 (",4)==0 ) retur
1ff0: 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 74 72 n 0;. if( str
2000: 6e 63 6d 70 28 7a 2c 22 50 43 4b 28 22 2c 34 29 ncmp(z,"PCK(",4)
2010: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a ==0 ) return 0;.
2020: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 return 1;.
2030: 7d 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 }. if( strncmp(
2040: 7a 2c 22 63 67 69 5f 70 61 72 61 6d 22 2c 39 29 z,"cgi_param",9)
2050: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a ==0 ) return 1;.
2060: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f return 0;.}../
2070: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 *.** Processing
2080: 66 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 flags.*/.#define
2090: 20 46 4d 54 5f 53 51 4c 20 20 20 30 78 30 30 30 FMT_SQL 0x000
20a0: 30 31 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 01 /* Genera
20b0: 74 6f 72 20 66 6f 72 20 53 51 4c 20 74 65 78 74 tor for SQL text
20c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4d 54 5f */.#define FMT_
20d0: 48 54 4d 4c 20 20 30 78 30 30 30 30 32 20 20 20 HTML 0x00002
20e0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 6f 72 20 66 /* Generator f
20f0: 6f 72 20 48 54 4d 4c 20 74 65 78 74 20 2a 2f 0a or HTML text */.
2100: 23 64 65 66 69 6e 65 20 46 4d 54 5f 55 52 4c 20 #define FMT_URL
2110: 20 20 30 78 30 30 30 30 34 20 20 20 20 20 2f 2a 0x00004 /*
2120: 20 47 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 55 Generator for U
2130: 52 4c 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 RLs */.#define F
2140: 4d 54 5f 4a 53 4f 4e 20 20 30 78 30 30 30 30 38 MT_JSON 0x00008
2150: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 6f /* Generato
2160: 72 20 66 6f 72 20 4a 53 4f 4e 20 2a 2f 0a 23 64 r for JSON */.#d
2170: 65 66 69 6e 65 20 46 4d 54 5f 53 41 46 45 20 20 efine FMT_SAFE
2180: 30 78 30 30 30 31 30 20 20 20 20 20 2f 2a 20 47 0x00010 /* G
2190: 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 68 75 6d enerator for hum
21a0: 61 6e 2d 72 65 61 64 61 62 6c 65 20 74 65 78 74 an-readable text
21b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4d 54 5f */.#define FMT_
21c0: 4c 49 54 20 20 20 30 78 30 30 30 32 30 20 20 20 LIT 0x00020
21d0: 20 20 2f 2a 20 4a 75 73 74 20 76 65 72 69 66 79 /* Just verify
21e0: 20 74 68 61 74 20 61 20 73 74 72 69 6e 67 20 6c that a string l
21f0: 69 74 65 72 61 6c 20 2a 2f 0a 23 64 65 66 69 6e iteral */.#defin
2200: 65 20 46 4d 54 5f 50 58 20 20 20 20 30 78 30 30 e FMT_PX 0x00
2210: 30 34 30 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 040 /* Must
2220: 68 61 76 65 20 61 20 6c 69 74 65 72 61 6c 20 70 have a literal p
2230: 72 65 66 69 78 20 69 6e 20 66 6f 72 6d 61 74 20 refix in format
2240: 73 74 72 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a string */../*.**
2250: 20 41 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 72 A list of inter
2260: 6e 61 6c 20 46 6f 73 73 69 6c 20 69 6e 74 65 72 nal Fossil inter
2270: 66 61 63 65 73 20 74 68 61 74 20 74 61 6b 65 20 faces that take
2280: 61 20 70 72 69 6e 74 66 2d 73 74 79 6c 65 20 66 a printf-style f
2290: 6f 72 6d 61 74 0a 2a 2a 20 73 74 72 69 6e 67 2e ormat.** string.
22a0: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 6d 74 46 75 .*/.struct FmtFu
22b0: 6e 63 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 nc {. const cha
22c0: 72 20 2a 7a 46 4e 61 6d 65 3b 20 20 20 20 2f 2a r *zFName; /*
22d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e Name of the fun
22e0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 ction */. int i
22f0: 46 6d 74 41 72 67 3b 20 20 20 20 20 20 20 20 20 FmtArg;
2300: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 6f /* Index of fo
2310: 72 6d 61 74 20 61 72 67 75 6d 65 6e 74 2e 20 20 rmat argument.
2320: 4c 65 66 74 6d 6f 73 74 20 69 73 20 31 2e 20 2a Leftmost is 1. *
2330: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 6d 74 /. unsigned fmt
2340: 46 6c 61 67 73 3b 20 20 20 20 20 2f 2a 20 50 72 Flags; /* Pr
2350: 6f 63 65 73 73 69 6e 67 20 66 6c 61 67 73 20 2a ocessing flags *
2360: 2f 0a 7d 20 61 46 6d 74 46 75 6e 63 5b 5d 20 3d /.} aFmtFunc[] =
2370: 20 7b 0a 20 20 7b 20 22 61 64 6d 69 6e 5f 6c 6f {. { "admin_lo
2380: 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 g",
2390: 20 20 20 20 20 31 2c 20 46 4d 54 5f 53 41 46 45 1, FMT_SAFE
23a0: 20 7d 2c 0a 20 20 7b 20 22 61 6a 61 78 5f 72 6f },. { "ajax_ro
23b0: 75 74 65 5f 65 72 72 6f 72 22 2c 20 20 20 20 20 ute_error",
23c0: 20 20 20 20 20 20 32 2c 20 46 4d 54 5f 53 41 46 2, FMT_SAF
23d0: 45 20 7d 2c 0a 20 20 7b 20 22 61 75 64 69 74 5f E },. { "audit_
23e0: 61 70 70 65 6e 64 22 2c 20 20 20 20 20 20 20 20 append",
23f0: 20 20 20 20 20 20 20 33 2c 20 46 4d 54 5f 53 41 3, FMT_SA
2400: 46 45 20 7d 2c 0a 20 20 7b 20 22 62 61 63 6b 6f FE },. { "backo
2410: 66 66 69 63 65 54 72 61 63 65 22 2c 20 20 20 20 fficeTrace",
2420: 20 20 20 20 20 20 20 20 31 2c 20 46 4d 54 5f 53 1, FMT_S
2430: 41 46 45 20 7d 2c 0a 20 20 7b 20 22 62 61 63 6b AFE },. { "back
2440: 6f 66 66 69 63 65 5f 6c 6f 67 22 2c 20 20 20 20 office_log",
2450: 20 20 20 20 20 20 20 20 20 31 2c 20 46 4d 54 5f 1, FMT_
2460: 53 41 46 45 20 7d 2c 0a 20 20 7b 20 22 62 6c 6f SAFE },. { "blo
2470: 62 5f 61 70 70 65 6e 64 5f 73 71 6c 22 2c 20 20 b_append_sql",
2480: 20 20 20 20 20 20 20 20 20 20 32 2c 20 46 4d 54 2, FMT
2490: 5f 53 51 4c 20 7d 2c 0a 20 20 7b 20 22 62 6c 6f _SQL },. { "blo
24a0: 62 5f 61 70 70 65 6e 64 66 22 2c 20 20 20 20 20 b_appendf",
24b0: 20 20 20 20 20 20 20 20 20 20 32 2c 20 46 4d 54 2, FMT
24c0: 5f 53 41 46 45 20 7d 2c 0a 20 20 7b 20 22 63 67 _SAFE },. { "cg
24d0: 69 5f 64 65 62 75 67 22 2c 20 20 20 20 20 20 20 i_debug",
24e0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 46 4d 1, FM
24f0: 54 5f 53 41 46 45 20 7d 2c 0a 20 20 7b 20 22 63 T_SAFE },. { "c
2500: 67 69 5f 70 61 6e 69 63 22 2c 20 20 20 20 20 20 gi_panic",
2510: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 46 1, F
2520: 4d 54 5f 53 41 46 45 20 7d 2c 0a 20 20 7b 20 22 MT_SAFE },. { "
2530: 63 67 69 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 cgi_printf",
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 1,
2550: 46 4d 54 5f 48 54 4d 4c 20 7d 2c 0a 20 20 7b 20 FMT_HTML },. {
2560: 22 63 67 69 5f 70 72 69 6e 74 66 5f 68 65 61 64 "cgi_printf_head
2570: 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c er", 1,
2580: 20 46 4d 54 5f 48 54 4d 4c 20 7d 2c 0a 20 20 7b FMT_HTML },. {
2590: 20 22 63 67 69 5f 72 65 64 69 72 65 63 74 66 22 "cgi_redirectf"
25a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 , 1
25b0: 2c 20 46 4d 54 5f 55 52 4c 20 7d 2c 0a 20 20 7b , FMT_URL },. {
25c0: 20 22 63 68 72 65 66 22 2c 20 20 20 20 20 20 20 "chref",
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2
25e0: 2c 20 46 4d 54 5f 55 52 4c 20 7d 2c 0a 20 20 7b , FMT_URL },. {
25f0: 20 22 43 58 22 2c 20 20 20 20 20 20 20 20 20 20 "CX",
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 1
2610: 2c 20 46 4d 54 5f 48 54 4d 4c 20 7d 2c 0a 20 20 , FMT_HTML },.
2620: 7b 20 22 64 62 5f 62 6c 6f 62 22 2c 20 20 20 20 { "db_blob",
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2640: 32 2c 20 46 4d 54 5f 53 51 4c 20 7d 2c 0a 20 20 2, FMT_SQL },.
2650: 7b 20 22 64 62 5f 64 65 62 75 67 22 2c 20 20 20 { "db_debug",
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2670: 31 2c 20 46 4d 54 5f 53 51 4c 20 7d 2c 0a 20 20 1, FMT_SQL },.
2680: 7b 20 22 64 62 5f 64 6f 75 62 6c 65 22 2c 20 20 { "db_double",
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
26a0: 32 2c 20 46 4d 54 5f 53 51 4c 20 7d 2c 0a 20 20 2, FMT_SQL },.
26b0: 7b 20 22 64 62 5f 65 72 72 22 2c 20 20 20 20 20 { "db_err",
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
26d0: 31 2c 20 46 4d 54 5f 53 41 46 45 20 7d 2c 0a 20 1, FMT_SAFE },.
26e0: 20 7b 20 22 64 62 5f 65 78 69 73 74 73 22 2c 20 { "db_exists",
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2700: 20 31 2c 20 46 4d 54 5f 53 51 4c 20 7d 2c 0a 20 1, FMT_SQL },.
2710: 20 7b 20 22 64 62 5f 67 65 74 5f 6d 70 72 69 6e { "db_get_mprin
2720: 74 66 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 tf",
2730: 20 32 2c 20 46 4d 54 5f 53 41 46 45 20 7d 2c 0a 2, FMT_SAFE },.
2740: 20 20 7b 20 22 64 62 5f 69 6e 74 22 2c 20 20 20 { "db_int",
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2760: 20 20 32 2c 20 46 4d 54 5f 53 51 4c 20 7d 2c 0a 2, FMT_SQL },.
2770: 20 20 7b 20 22 64 62 5f 69 6e 74 36 34 22 2c 20 { "db_int64",
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2790: 20 20 32 2c 20 46 4d 54 5f 53 51 4c 20 7d 2c 0a 2, FMT_SQL },.
27a0: 20 20 7b 20 22 64 62 5f 6c 73 65 74 22 2c 20 20 { "db_lset",
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27c0: 20 20 31 2c 20 46 4d 54 5f 4c 49 54 20 7d 2c 0a 1, FMT_LIT },.
27d0: 20 20 7b 20 22 64 62 5f 6c 73 65 74 5f 69 6e 74 { "db_lset_int
27e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ",
27f0: 20 20 31 2c 20 46 4d 54 5f 4c 49 54 20 7d 2c 0a 1, FMT_LIT },.
2800: 20 20 7b 20 22 64 62 5f 6d 75 6c 74 69 5f 65 78 { "db_multi_ex
2810: 65 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 ec",
2820: 20 20 31 2c 20 46 4d 54 5f 53 51 4c 20 7d 2c 0a 1, FMT_SQL },.
2830: 20 20 7b 20 22 64 62 5f 6f 70 74 69 6f 6e 61 6c { "db_optional
2840: 5f 73 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20 _sql",
2850: 20 20 32 2c 20 46 4d 54 5f 53 51 4c 20 7d 2c 0a 2, FMT_SQL },.
2860: 20 20 7b 20 22 64 62 5f 70 72 65 70 61 72 65 22 { "db_prepare"
2870: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
2880: 20 20 32 2c 20 46 4d 54 5f 53 51 4c 20 7d 2c 0a 2, FMT_SQL },.
2890: 20 20 7b 20 22 64 62 5f 70 72 65 70 61 72 65 5f { "db_prepare_
28a0: 69 67 6e 6f 72 65 5f 65 72 72 6f 72 22 2c 20 20 ignore_error",
28b0: 20 20 32 2c 20 46 4d 54 5f 53 51 4c 20 7d 2c 0a 2, FMT_SQL },.
28c0: 20 20 7b 20 22 64 62 5f 73 65 74 22 2c 20 20 20 { "db_set",
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28e0: 20 20 31 2c 20 46 4d 54 5f 4c 49 54 20 7d 2c 0a 1, FMT_LIT },.
28f0: 20 20 7b 20 22 64 62 5f 73 65 74 5f 69 6e 74 22 { "db_set_int"
2900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
2910: 20 20 31 2c 20 46 4d 54 5f 4c 49 54 20 7d 2c 0a 1, FMT_LIT },.
2920: 20 20 7b 20 22 64 62 5f 73 65 74 5f 6d 70 72 69 { "db_set_mpri
2930: 6e 74 66 22 2c 20 20 20 20 20 20 20 20 20 20 20 ntf",
2940: 20 20 33 2c 20 46 4d 54 5f 50 58 20 7d 2c 0a 20 3, FMT_PX },.
2950: 20 7b 20 22 64 62 5f 73 74 61 74 69 63 5f 70 72 { "db_static_pr
2960: 65 70 61 72 65 22 2c 20 20 20 20 20 20 20 20 20 epare",
2970: 20 32 2c 20 46 4d 54 5f 53 51 4c 20 7d 2c 0a 20 2, FMT_SQL },.
2980: 20 7b 20 22 64 62 5f 74 65 78 74 22 2c 20 20 20 { "db_text",
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
29a0: 20 32 2c 20 46 4d 54 5f 53 51 4c 20 7d 2c 0a 20 2, FMT_SQL },.
29b0: 20 7b 20 22 64 62 5f 75 6e 73 65 74 22 2c 20 20 { "db_unset",
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
29d0: 20 31 2c 20 46 4d 54 5f 4c 49 54 20 7d 2c 0a 20 1, FMT_LIT },.
29e0: 20 7b 20 22 64 62 5f 75 6e 73 65 74 5f 6d 70 72 { "db_unset_mpr
29f0: 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20 20 20 intf",
2a00: 20 32 2c 20 46 4d 54 5f 50 58 20 7d 2c 0a 20 20 2, FMT_PX },.
2a10: 7b 20 22 65 6d 61 69 6c 65 72 45 72 72 6f 72 22 { "emailerError"
2a20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
2a30: 32 2c 20 46 4d 54 5f 53 41 46 45 20 7d 2c 0a 20 2, FMT_SAFE },.
2a40: 20 7b 20 22 65 6e 74 72 79 5f 61 74 74 72 69 62 { "entry_attrib
2a50: 75 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 ute",
2a60: 20 34 2c 20 46 4d 54 5f 4c 49 54 20 7d 2c 0a 20 4, FMT_LIT },.
2a70: 20 7b 20 22 66 69 6c 65 65 64 69 74 5f 61 6a 61 { "fileedit_aja
2a80: 78 5f 65 72 72 6f 72 22 2c 20 20 20 20 20 20 20 x_error",
2a90: 20 32 2c 20 46 4d 54 5f 53 41 46 45 20 7d 2c 0a 2, FMT_SAFE },.
2aa0: 20 20 7b 20 22 66 6f 72 6d 5f 62 65 67 69 6e 22 { "form_begin"
2ab0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
2ac0: 20 20 32 2c 20 46 4d 54 5f 55 52 4c 20 7d 2c 0a 2, FMT_URL },.
2ad0: 20 20 7b 20 22 66 6f 73 73 69 6c 5f 65 72 72 6f { "fossil_erro
2ae0: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 r",
2af0: 20 20 32 2c 20 46 4d 54 5f 53 41 46 45 20 7d 2c 2, FMT_SAFE },
2b00: 0a 20 20 7b 20 22 66 6f 73 73 69 6c 5f 65 72 72 . { "fossil_err
2b10: 6f 72 6c 6f 67 22 2c 20 20 20 20 20 20 20 20 20 orlog",
2b20: 20 20 20 31 2c 20 46 4d 54 5f 53 41 46 45 20 7d 1, FMT_SAFE }
2b30: 2c 0a 20 20 7b 20 22 66 6f 73 73 69 6c 5f 66 61 ,. { "fossil_fa
2b40: 74 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 tal",
2b50: 20 20 20 20 31 2c 20 46 4d 54 5f 53 41 46 45 20 1, FMT_SAFE
2b60: 7d 2c 0a 20 20 7b 20 22 66 6f 73 73 69 6c 5f 66 },. { "fossil_f
2b70: 61 74 61 6c 5f 72 65 63 75 72 73 69 76 65 22 2c atal_recursive",
2b80: 20 20 20 20 20 31 2c 20 46 4d 54 5f 53 41 46 45 1, FMT_SAFE
2b90: 20 7d 2c 0a 20 20 7b 20 22 66 6f 73 73 69 6c 5f },. { "fossil_
2ba0: 70 61 6e 69 63 22 2c 20 20 20 20 20 20 20 20 20 panic",
2bb0: 20 20 20 20 20 20 31 2c 20 46 4d 54 5f 53 41 46 1, FMT_SAF
2bc0: 45 20 7d 2c 0a 20 20 7b 20 22 66 6f 73 73 69 6c E },. { "fossil
2bd0: 5f 70 72 69 6e 74 22 2c 20 20 20 20 20 20 20 20 _print",
2be0: 20 20 20 20 20 20 20 31 2c 20 46 4d 54 5f 53 41 1, FMT_SA
2bf0: 46 45 20 7d 2c 0a 20 20 7b 20 22 66 6f 73 73 69 FE },. { "fossi
2c00: 6c 5f 74 72 61 63 65 22 2c 20 20 20 20 20 20 20 l_trace",
2c10: 20 20 20 20 20 20 20 20 31 2c 20 46 4d 54 5f 53 1, FMT_S
2c20: 41 46 45 20 7d 2c 0a 20 20 7b 20 22 66 6f 73 73 AFE },. { "foss
2c30: 69 6c 5f 77 61 72 6e 69 6e 67 22 2c 20 20 20 20 il_warning",
2c40: 20 20 20 20 20 20 20 20 20 31 2c 20 46 4d 54 5f 1, FMT_
2c50: 53 41 46 45 20 7d 2c 0a 20 20 7b 20 22 67 69 74 SAFE },. { "git
2c60: 6d 69 72 72 6f 72 5f 6d 65 73 73 61 67 65 22 2c mirror_message",
2c70: 20 20 20 20 20 20 20 20 20 20 32 2c 20 46 4d 54 2, FMT
2c80: 5f 53 41 46 45 20 7d 2c 0a 20 20 7b 20 22 68 72 _SAFE },. { "hr
2c90: 65 66 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 ef",
2ca0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 46 4d 1, FM
2cb0: 54 5f 55 52 4c 20 7d 2c 0a 20 20 7b 20 22 6a 73 T_URL },. { "js
2cc0: 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e 67 5f 66 22 on_new_string_f"
2cd0: 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20 46 4d , 1, FM
2ce0: 54 5f 53 41 46 45 20 7d 2c 0a 20 20 7b 20 22 6a T_SAFE },. { "j
2cf0: 73 6f 6e 5f 73 65 74 5f 65 72 72 22 2c 20 20 20 son_set_err",
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 46 2, F
2d10: 4d 54 5f 53 41 46 45 20 7d 2c 0a 20 20 7b 20 22 MT_SAFE },. { "
2d20: 6a 73 6f 6e 5f 77 61 72 6e 22 2c 20 20 20 20 20 json_warn",
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 2,
2d40: 46 4d 54 5f 53 41 46 45 20 7d 2c 0a 20 20 7b 20 FMT_SAFE },. {
2d50: 22 6d 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 "mprintf",
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 1,
2d70: 20 46 4d 54 5f 53 41 46 45 20 7d 2c 0a 20 20 7b FMT_SAFE },. {
2d80: 20 22 6d 75 6c 74 69 70 6c 65 5f 63 68 6f 69 63 "multiple_choic
2d90: 65 5f 61 74 74 72 69 62 75 74 65 22 2c 20 20 33 e_attribute", 3
2da0: 2c 20 46 4d 54 5f 4c 49 54 20 7d 2c 0a 20 20 7b , FMT_LIT },. {
2db0: 20 22 6f 6e 6f 66 66 5f 61 74 74 72 69 62 75 74 "onoff_attribut
2dc0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 33 e", 3
2dd0: 2c 20 46 4d 54 5f 4c 49 54 20 7d 2c 0a 20 20 7b , FMT_LIT },. {
2de0: 20 22 70 6f 70 33 5f 70 72 69 6e 74 22 2c 20 20 "pop3_print",
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2
2e00: 2c 20 46 4d 54 5f 53 41 46 45 20 7d 2c 0a 20 20 , FMT_SAFE },.
2e10: 7b 20 22 73 6d 74 70 5f 73 65 6e 64 5f 6c 69 6e { "smtp_send_lin
2e20: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 e",
2e30: 32 2c 20 46 4d 54 5f 53 41 46 45 20 7d 2c 0a 20 2, FMT_SAFE },.
2e40: 20 7b 20 22 73 6d 74 70 5f 73 65 72 76 65 72 5f { "smtp_server_
2e50: 73 65 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20 send",
2e60: 20 32 2c 20 46 4d 54 5f 53 41 46 45 20 7d 2c 0a 2, FMT_SAFE },.
2e70: 20 20 7b 20 22 73 6f 63 6b 65 74 5f 73 65 74 5f { "socket_set_
2e80: 65 72 72 6d 73 67 22 2c 20 20 20 20 20 20 20 20 errmsg",
2e90: 20 20 31 2c 20 46 4d 54 5f 53 41 46 45 20 7d 2c 1, FMT_SAFE },
2ea0: 0a 20 20 7b 20 22 73 73 6c 5f 73 65 74 5f 65 72 . { "ssl_set_er
2eb0: 72 6d 73 67 22 2c 20 20 20 20 20 20 20 20 20 20 rmsg",
2ec0: 20 20 20 31 2c 20 46 4d 54 5f 53 41 46 45 20 7d 1, FMT_SAFE }
2ed0: 2c 0a 20 20 7b 20 22 73 74 79 6c 65 5f 63 6f 70 ,. { "style_cop
2ee0: 79 5f 62 75 74 74 6f 6e 22 2c 20 20 20 20 20 20 y_button",
2ef0: 20 20 20 20 35 2c 20 46 4d 54 5f 53 41 46 45 20 5, FMT_SAFE
2f00: 7d 2c 0a 20 20 7b 20 22 73 74 79 6c 65 5f 68 65 },. { "style_he
2f10: 61 64 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 ader",
2f20: 20 20 20 20 20 31 2c 20 46 4d 54 5f 48 54 4d 4c 1, FMT_HTML
2f30: 20 7d 2c 0a 20 20 7b 20 22 73 74 79 6c 65 5f 73 },. { "style_s
2f40: 65 74 5f 63 75 72 72 65 6e 74 5f 70 61 67 65 22 et_current_page"
2f50: 2c 20 20 20 20 20 31 2c 20 46 4d 54 5f 55 52 4c , 1, FMT_URL
2f60: 20 7d 2c 0a 20 20 7b 20 22 73 74 79 6c 65 5f 73 },. { "style_s
2f70: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 22 2c ubmenu_element",
2f80: 20 20 20 20 20 20 32 2c 20 46 4d 54 5f 55 52 4c 2, FMT_URL
2f90: 20 7d 2c 0a 20 20 7b 20 22 73 74 79 6c 65 5f 73 },. { "style_s
2fa0: 75 62 6d 65 6e 75 5f 73 71 6c 22 2c 20 20 20 20 ubmenu_sql",
2fb0: 20 20 20 20 20 20 33 2c 20 46 4d 54 5f 53 51 4c 3, FMT_SQL
2fc0: 20 7d 2c 0a 20 20 7b 20 22 74 65 78 74 61 72 65 },. { "textare
2fd0: 61 5f 61 74 74 72 69 62 75 74 65 22 2c 20 20 20 a_attribute",
2fe0: 20 20 20 20 20 20 35 2c 20 46 4d 54 5f 4c 49 54 5, FMT_LIT
2ff0: 20 7d 2c 0a 20 20 7b 20 22 74 6b 74 73 65 74 75 },. { "tktsetu
3000: 70 5f 67 65 6e 65 72 69 63 22 2c 20 20 20 20 20 p_generic",
3010: 20 20 20 20 20 20 31 2c 20 46 4d 54 5f 4c 49 54 1, FMT_LIT
3020: 20 7d 2c 0a 20 20 7b 20 22 77 65 62 70 61 67 65 },. { "webpage
3030: 5f 65 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 _error",
3040: 20 20 20 20 20 20 31 2c 20 46 4d 54 5f 53 41 46 1, FMT_SAF
3050: 45 20 7d 2c 0a 20 20 7b 20 22 77 65 62 70 61 67 E },. { "webpag
3060: 65 5f 6e 6f 74 66 6f 75 6e 64 5f 65 72 72 6f 72 e_notfound_error
3070: 22 2c 20 20 20 20 20 31 2c 20 46 4d 54 5f 53 41 ", 1, FMT_SA
3080: 46 45 20 7d 2c 0a 20 20 7b 20 22 78 66 65 72 73 FE },. { "xfers
3090: 65 74 75 70 5f 67 65 6e 65 72 69 63 22 2c 20 20 etup_generic",
30a0: 20 20 20 20 20 20 20 20 31 2c 20 46 4d 54 5f 4c 1, FMT_L
30b0: 49 54 20 7d 2c 0a 20 20 7b 20 22 78 68 72 65 66 IT },. { "xhref
30c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ",
30d0: 20 20 20 20 20 20 20 20 32 2c 20 46 4d 54 5f 55 2, FMT_U
30e0: 52 4c 20 7d 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 RL },.};../*.**
30f0: 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 Comparison funct
3100: 69 6f 6e 20 66 6f 72 20 74 77 6f 20 46 6d 74 46 ion for two FmtF
3110: 75 6e 63 20 65 6e 74 72 69 65 73 0a 2a 2f 0a 73 unc entries.*/.s
3120: 74 61 74 69 63 20 69 6e 74 20 66 6d 74 66 75 6e tatic int fmtfun
3130: 63 5f 63 6d 70 28 63 6f 6e 73 74 20 76 6f 69 64 c_cmp(const void
3140: 20 2a 70 41 41 2c 20 63 6f 6e 73 74 20 76 6f 69 *pAA, const voi
3150: 64 20 2a 70 42 42 29 7b 0a 20 20 63 6f 6e 73 74 d *pBB){. const
3160: 20 73 74 72 75 63 74 20 46 6d 74 46 75 6e 63 20 struct FmtFunc
3170: 2a 70 41 20 3d 20 28 63 6f 6e 73 74 20 73 74 72 *pA = (const str
3180: 75 63 74 20 46 6d 74 46 75 6e 63 2a 29 70 41 41 uct FmtFunc*)pAA
3190: 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 ;. const struct
31a0: 20 46 6d 74 46 75 6e 63 20 2a 70 42 20 3d 20 28 FmtFunc *pB = (
31b0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 46 6d 74 const struct Fmt
31c0: 46 75 6e 63 2a 29 70 42 42 3b 0a 20 20 72 65 74 Func*)pBB;. ret
31d0: 75 72 6e 20 73 74 72 63 6d 70 28 70 41 2d 3e 7a urn strcmp(pA->z
31e0: 46 4e 61 6d 65 2c 20 70 42 2d 3e 7a 46 4e 61 6d FName, pB->zFNam
31f0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 e);.}../*.** Det
3200: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 69 6e ermine if the in
3210: 64 65 6e 74 69 66 69 65 72 20 7a 49 64 65 6e 74 dentifier zIdent
3220: 20 6f 66 20 6c 65 6e 67 74 68 20 6e 49 6e 64 65 of length nInde
3230: 6e 74 20 69 73 20 61 20 46 6f 73 73 69 6c 0a 2a nt is a Fossil.*
3240: 2a 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 65 72 * internal inter
3250: 66 61 63 65 20 74 68 61 74 20 75 73 65 73 20 61 face that uses a
3260: 20 70 72 69 6e 74 66 2d 73 74 79 6c 65 20 61 72 printf-style ar
3270: 67 75 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 gument. Return
3280: 7a 65 72 6f 20 69 66 20 6e 6f 74 2e 0a 2a 2a 20 zero if not..**
3290: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 Return the index
32a0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 61 74 20 73 of the format s
32b0: 74 72 69 6e 67 20 69 66 20 74 72 75 65 20 77 69 tring if true wi
32c0: 74 68 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 th the left-most
32d0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 68 61 76 .** argument hav
32e0: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 ing an index of
32f0: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 1..*/.static int
3300: 20 69 73 46 6f 72 6d 61 74 46 75 6e 63 28 63 6f isFormatFunc(co
3310: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 nst char *zIdent
3320: 2c 20 69 6e 74 20 6e 49 64 65 6e 74 2c 20 75 6e , int nIdent, un
3330: 73 69 67 6e 65 64 20 2a 70 46 6c 61 67 73 29 7b signed *pFlags){
3340: 0a 20 20 69 6e 74 20 75 70 72 2c 20 6c 77 72 3b . int upr, lwr;
3350: 0a 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 75 70 . lwr = 0;. up
3360: 72 20 3d 20 73 69 7a 65 6f 66 28 61 46 6d 74 46 r = sizeof(aFmtF
3370: 75 6e 63 29 2f 73 69 7a 65 6f 66 28 61 46 6d 74 unc)/sizeof(aFmt
3380: 46 75 6e 63 5b 30 5d 29 20 2d 20 31 3b 0a 20 20 Func[0]) - 1;.
3390: 77 68 69 6c 65 28 20 6c 77 72 3c 3d 75 70 72 20 while( lwr<=upr
33a0: 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 ){. unsigned
33b0: 78 20 3d 20 28 6c 77 72 20 2b 20 75 70 72 29 2f x = (lwr + upr)/
33c0: 32 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 73 2;. int c = s
33d0: 74 72 6e 63 6d 70 28 7a 49 64 65 6e 74 2c 20 61 trncmp(zIdent, a
33e0: 46 6d 74 46 75 6e 63 5b 78 5d 2e 7a 46 4e 61 6d FmtFunc[x].zFNam
33f0: 65 2c 20 6e 49 64 65 6e 74 29 3b 0a 20 20 20 20 e, nIdent);.
3400: 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 if( c==0 ){.
3410: 20 20 69 66 28 20 61 46 6d 74 46 75 6e 63 5b 78 if( aFmtFunc[x
3420: 5d 2e 7a 46 4e 61 6d 65 5b 6e 49 64 65 6e 74 5d ].zFName[nIdent]
3430: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a ==0 ){. *
3440: 70 46 6c 61 67 73 20 3d 20 61 46 6d 74 46 75 6e pFlags = aFmtFun
3450: 63 5b 78 5d 2e 66 6d 74 46 6c 61 67 73 3b 0a 20 c[x].fmtFlags;.
3460: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 46 return aF
3470: 6d 74 46 75 6e 63 5b 78 5d 2e 69 46 6d 74 41 72 mtFunc[x].iFmtAr
3480: 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 g;. }.
3490: 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 c = -1;. }.
34a0: 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 if( c<0 ){.
34b0: 20 20 20 20 75 70 72 20 3d 20 78 20 2d 20 31 3b upr = x - 1;
34c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
34d0: 20 20 6c 77 72 20 3d 20 78 20 2b 20 31 3b 0a 20 lwr = x + 1;.
34e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 }. }. *pFla
34f0: 67 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e gs = 0;. return
3500: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 0;.}../*.** Ret
3510: 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 urn the expected
3520: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d number of argum
3530: 65 6e 74 73 20 66 6f 72 20 74 68 65 20 66 6f 72 ents for the for
3540: 6d 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 52 mat string..** R
3550: 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 eturn -1 if the
3560: 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 value cannot be
3570: 63 6f 6d 70 75 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 computed..**.**
3580: 46 6f 72 20 65 61 63 68 20 61 72 67 75 6d 65 6e For each argumen
3590: 74 20 6c 65 73 73 20 74 68 61 6e 20 6e 54 79 70 t less than nTyp
35a0: 65 2c 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6e e, store the con
35b0: 76 65 72 73 69 6f 6e 20 63 68 61 72 61 63 74 65 version characte
35c0: 72 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 61 72 r.** for that ar
35d0: 67 75 6d 65 6e 74 20 69 6e 20 63 54 79 70 65 5b gument in cType[
35e0: 69 5d 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 i]..**.** Store
35f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e the number of in
3600: 69 74 69 61 6c 20 6c 69 74 65 72 61 6c 20 63 68 itial literal ch
3610: 61 72 61 63 74 65 72 73 20 6f 66 20 74 68 65 20 aracters of the
3620: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 0a 2a 2a format string.**
3630: 20 69 6e 20 2a 70 49 6e 69 74 2e 0a 2a 2f 0a 73 in *pInit..*/.s
3640: 74 61 74 69 63 20 69 6e 74 20 66 6f 72 6d 61 74 tatic int format
3650: 41 72 67 43 6f 75 6e 74 28 63 6f 6e 73 74 20 63 ArgCount(const c
3660: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 54 79 70 har *z, int nTyp
3670: 65 2c 20 63 68 61 72 20 2a 63 54 79 70 65 2c 20 e, char *cType,
3680: 69 6e 74 20 2a 70 49 6e 69 74 29 7b 0a 20 20 69 int *pInit){. i
3690: 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 nt nArg = 0;. i
36a0: 6e 74 20 69 2c 20 6b 3b 0a 20 20 69 6e 74 20 6c nt i, k;. int l
36b0: 65 6e 3b 0a 20 20 69 6e 74 20 65 54 79 70 65 3b en;. int eType;
36c0: 0a 20 20 69 6e 74 20 6c 6e 20 3d 20 30 3b 0a 20 . int ln = 0;.
36d0: 20 2a 70 49 6e 69 74 20 3d 20 30 3b 0a 20 20 77 *pInit = 0;. w
36e0: 68 69 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 hile( z[0] ){.
36f0: 20 20 6c 65 6e 20 3d 20 74 6f 6b 65 6e 5f 6c 65 len = token_le
3700: 6e 67 74 68 28 7a 2c 20 26 65 54 79 70 65 2c 20 ngth(z, &eType,
3710: 26 6c 6e 29 3b 0a 20 20 20 20 69 66 28 20 65 54 &ln);. if( eT
3720: 79 70 65 3d 3d 54 4b 5f 53 54 52 20 29 7b 0a 20 ype==TK_STR ){.
3730: 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c for(i=1; i<
3740: 6c 65 6e 2d 31 20 26 26 20 69 73 61 6c 70 68 61 len-1 && isalpha
3750: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 (z[i]); i++){}.
3760: 20 20 20 20 20 2a 70 49 6e 69 74 20 3d 20 69 2d *pInit = i-
3770: 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 1;. for(i=1
3780: 3b 20 69 3c 6c 65 6e 2d 31 3b 20 69 2b 2b 29 7b ; i<len-1; i++){
3790: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 . if( z[i
37a0: 5d 21 3d 27 25 27 20 29 20 63 6f 6e 74 69 6e 75 ]!='%' ) continu
37b0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a e;. if( z
37c0: 5b 69 2b 31 5d 3d 3d 27 25 27 20 29 7b 20 69 2b [i+1]=='%' ){ i+
37d0: 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 +; continue; }.
37e0: 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 69 2b 31 for(k=i+1
37f0: 3b 20 6b 3c 6c 65 6e 20 26 26 20 21 69 73 61 6c ; k<len && !isal
3800: 70 68 61 28 7a 5b 6b 5d 29 3b 20 6b 2b 2b 29 7b pha(z[k]); k++){
3810: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a . if( z
3820: 5b 6b 5d 3d 3d 27 2a 27 20 7c 7c 20 7a 5b 6b 5d [k]=='*' || z[k]
3830: 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 20 =='#' ){.
3840: 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 6e 54 if( nArg<nT
3850: 79 70 65 20 29 20 63 54 79 70 65 5b 6e 41 72 67 ype ) cType[nArg
3860: 5d 20 3d 20 7a 5b 6b 5d 3b 0a 20 20 20 20 20 20 ] = z[k];.
3870: 20 20 20 20 20 20 6e 41 72 67 2b 2b 3b 0a 20 20 nArg++;.
3880: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
3890: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 }. if(
38a0: 7a 5b 6b 5d 21 3d 27 52 27 20 29 7b 0a 20 20 20 z[k]!='R' ){.
38b0: 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c if( nArg<
38c0: 6e 54 79 70 65 20 29 20 63 54 79 70 65 5b 6e 41 nType ) cType[nA
38d0: 72 67 5d 20 3d 20 7a 5b 6b 5d 3b 0a 20 20 20 20 rg] = z[k];.
38e0: 20 20 20 20 20 20 6e 41 72 67 2b 2b 3b 0a 20 20 nArg++;.
38f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a }. }.
3900: 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 6c }. z += l
3910: 65 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e en;. }. return
3920: 20 6e 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 nArg;.}../*.**
3930: 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c The function cal
3940: 6c 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 74 l that begins at
3950: 20 7a 46 43 61 6c 6c 5b 30 5d 20 28 77 68 69 63 zFCall[0] (whic
3960: 68 20 69 73 20 6f 6e 20 6c 69 6e 65 20 6c 6e 46 h is on line lnF
3970: 43 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 6f Call of the.** o
3980: 72 69 67 69 6e 61 6c 20 66 69 6c 65 29 20 69 73 riginal file) is
3990: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 a function that
39a0: 20 75 73 65 73 20 61 20 70 72 69 6e 74 66 2d 73 uses a printf-s
39b0: 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74 72 69 tyle format stri
39c0: 6e 67 0a 2a 2a 20 6f 6e 20 61 72 67 75 6d 65 6e ng.** on argumen
39d0: 74 20 6e 75 6d 62 65 72 20 66 6d 74 41 72 67 2e t number fmtArg.
39e0: 20 20 49 74 20 68 61 73 20 70 72 6f 63 65 73 73 It has process
39f0: 69 6e 67 73 20 66 6c 61 67 73 20 66 6d 74 46 6c ings flags fmtFl
3a00: 61 67 73 2e 20 20 44 6f 0a 2a 2a 20 63 6f 6d 70 ags. Do.** comp
3a10: 69 6c 65 2d 74 69 6d 65 20 63 68 65 63 6b 69 6e ile-time checkin
3a20: 67 20 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69 g on this functi
3a30: 6f 6e 2c 20 6f 75 74 70 75 74 20 61 6e 79 20 65 on, output any e
3a40: 72 72 6f 72 73 2c 20 61 6e 64 20 72 65 74 75 72 rrors, and retur
3a50: 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 n.** the number
3a60: 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 of errors..*/.st
3a70: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f atic int checkFo
3a80: 72 6d 61 74 46 75 6e 63 28 0a 20 20 63 6f 6e 73 rmatFunc(. cons
3a90: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d t char *zFilenam
3aa0: 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 e, /* Name of th
3ab0: 65 20 66 69 6c 65 20 62 65 69 6e 67 20 70 72 6f e file being pro
3ac0: 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 cessed */. cons
3ad0: 74 20 63 68 61 72 20 2a 7a 46 43 61 6c 6c 2c 20 t char *zFCall,
3ae0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f /* Pointer to
3af0: 20 73 74 61 72 74 20 6f 66 20 66 75 6e 63 74 69 start of functi
3b00: 6f 6e 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 on call */. int
3b10: 20 6c 6e 46 43 61 6c 6c 2c 20 20 20 20 20 20 20 lnFCall,
3b20: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 /* Line numb
3b30: 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 7a 5b er that holds z[
3b40: 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 66 6d 74 41 0] */. int fmtA
3b50: 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f rg, /
3b60: 2a 20 46 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 * Format string
3b70: 73 68 6f 75 6c 64 20 62 65 20 74 68 69 73 20 61 should be this a
3b80: 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 rgument */. int
3b90: 20 66 6d 74 46 6c 61 67 73 20 20 20 20 20 20 20 fmtFlags
3ba0: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 6f /* Extra pro
3bb0: 63 65 73 73 69 6e 67 20 66 6c 61 67 73 20 2a 2f cessing flags */
3bc0: 0a 29 7b 0a 20 20 69 6e 74 20 73 7a 46 4e 61 6d .){. int szFNam
3bd0: 65 3b 0a 20 20 69 6e 74 20 65 54 6f 6b 65 6e 3b e;. int eToken;
3be0: 0a 20 20 69 6e 74 20 6c 6e 20 3d 20 6c 6e 46 43 . int ln = lnFC
3bf0: 61 6c 6c 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a all;. int len;.
3c00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 const char *zS
3c10: 74 61 72 74 3b 0a 20 20 63 68 61 72 20 2a 7a 3b tart;. char *z;
3c20: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 3b 0a . char *zCopy;.
3c30: 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a int nArg = 0;.
3c40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 const char **a
3c50: 7a 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 zArg = 0;. int
3c60: 69 2c 20 6b 3b 0a 20 20 69 6e 74 20 6e 45 72 72 i, k;. int nErr
3c70: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 63 = 0;. char *ac
3c80: 54 79 70 65 3b 0a 20 20 69 6e 74 20 6e 49 6e 69 Type;. int nIni
3c90: 74 20 3d 20 30 3b 0a 0a 20 20 73 7a 46 4e 61 6d t = 0;.. szFNam
3ca0: 65 20 3d 20 74 6f 6b 65 6e 5f 6c 65 6e 67 74 68 e = token_length
3cb0: 28 7a 46 43 61 6c 6c 2c 20 26 65 54 6f 6b 65 6e (zFCall, &eToken
3cc0: 2c 20 26 6c 6e 29 3b 0a 20 20 7a 53 74 61 72 74 , &ln);. zStart
3cd0: 20 3d 20 6e 65 78 74 5f 6e 6f 6e 5f 77 68 69 74 = next_non_whit
3ce0: 65 73 70 61 63 65 28 7a 46 43 61 6c 6c 2b 73 7a espace(zFCall+sz
3cf0: 46 4e 61 6d 65 2c 20 26 6c 65 6e 2c 20 26 65 54 FName, &len, &eT
3d00: 6f 6b 65 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 oken);. assert(
3d10: 20 7a 53 74 61 72 74 5b 30 5d 3d 3d 27 28 27 20 zStart[0]=='('
3d20: 26 26 20 6c 65 6e 3d 3d 31 20 29 3b 0a 20 20 6c && len==1 );. l
3d30: 65 6e 20 3d 20 64 69 73 74 61 6e 63 65 5f 74 6f en = distance_to
3d40: 28 7a 53 74 61 72 74 2b 31 2c 20 27 29 27 29 3b (zStart+1, ')');
3d50: 0a 20 20 7a 43 6f 70 79 20 3d 20 73 61 66 65 5f . zCopy = safe_
3d60: 6d 61 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 malloc( len + 1
3d70: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 );. memcpy(zCop
3d80: 79 2c 20 7a 53 74 61 72 74 2b 31 2c 20 6c 65 6e y, zStart+1, len
3d90: 29 3b 0a 20 20 7a 43 6f 70 79 5b 6c 65 6e 5d 20 );. zCopy[len]
3da0: 3d 20 30 3b 0a 20 20 61 7a 41 72 67 20 3d 20 30 = 0;. azArg = 0
3db0: 3b 0a 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 ;. nArg = 0;.
3dc0: 7a 20 3d 20 7a 43 6f 70 79 3b 0a 20 20 77 68 69 z = zCopy;. whi
3dd0: 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 le( z[0] ){.
3de0: 63 68 61 72 20 63 45 6e 64 3b 0a 20 20 20 20 6c char cEnd;. l
3df0: 65 6e 20 3d 20 64 69 73 74 61 6e 63 65 5f 74 6f en = distance_to
3e00: 28 7a 2c 20 27 2c 27 29 3b 0a 20 20 20 20 63 45 (z, ',');. cE
3e10: 6e 64 20 3d 20 7a 5b 6c 65 6e 5d 3b 0a 20 20 20 nd = z[len];.
3e20: 20 7a 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 z[len] = 0;.
3e30: 20 61 7a 41 72 67 20 3d 20 73 61 66 65 5f 72 65 azArg = safe_re
3e40: 61 6c 6c 6f 63 28 28 63 68 61 72 2a 29 61 7a 41 alloc((char*)azA
3e50: 72 67 2c 20 28 73 69 7a 65 6f 66 28 61 7a 41 72 rg, (sizeof(azAr
3e60: 67 5b 30 5d 29 2b 31 29 2a 28 6e 41 72 67 2b 31 g[0])+1)*(nArg+1
3e70: 29 29 3b 0a 20 20 20 20 61 7a 41 72 67 5b 6e 41 ));. azArg[nA
3e80: 72 67 2b 2b 5d 20 3d 20 73 69 6d 70 6c 69 66 79 rg++] = simplify
3e90: 5f 65 78 70 72 28 7a 29 3b 0a 20 20 20 20 69 66 _expr(z);. if
3ea0: 28 20 63 45 6e 64 3d 3d 30 20 29 20 62 72 65 61 ( cEnd==0 ) brea
3eb0: 6b 3b 0a 20 20 20 20 7a 20 2b 3d 20 6c 65 6e 20 k;. z += len
3ec0: 2b 20 31 3b 0a 20 20 7d 0a 20 20 61 63 54 79 70 + 1;. }. acTyp
3ed0: 65 20 3d 20 28 63 68 61 72 2a 29 26 61 7a 41 72 e = (char*)&azAr
3ee0: 67 5b 6e 41 72 67 5d 3b 0a 20 20 69 66 28 20 66 g[nArg];. if( f
3ef0: 6d 74 41 72 67 3e 6e 41 72 67 20 29 7b 0a 20 20 mtArg>nArg ){.
3f00: 20 20 70 72 69 6e 74 66 28 22 25 73 3a 25 64 3a printf("%s:%d:
3f10: 20 74 6f 6f 20 66 65 77 20 61 72 67 75 6d 65 6e too few argumen
3f20: 74 73 20 74 6f 20 25 2e 2a 73 28 29 5c 6e 22 2c ts to %.*s()\n",
3f30: 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c . zFil
3f40: 65 6e 61 6d 65 2c 20 6c 6e 46 43 61 6c 6c 2c 20 ename, lnFCall,
3f50: 73 7a 46 4e 61 6d 65 2c 20 7a 46 43 61 6c 6c 29 szFName, zFCall)
3f60: 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 ;. nErr++;.
3f70: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 }else{. const
3f80: 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 61 7a char *zFmt = az
3f90: 41 72 67 5b 66 6d 74 41 72 67 2d 31 5d 3b 0a 20 Arg[fmtArg-1];.
3fa0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a const char *z
3fb0: 4f 76 65 72 72 69 64 65 20 3d 20 73 74 72 73 74 Override = strst
3fc0: 72 28 7a 46 6d 74 2c 20 22 2f 2a 77 6f 72 6b 73 r(zFmt, "/*works
3fd0: 2d 6c 69 6b 65 3a 22 29 3b 0a 20 20 20 20 69 66 -like:");. if
3fe0: 28 20 7a 4f 76 65 72 72 69 64 65 20 29 20 7a 46 ( zOverride ) zF
3ff0: 6d 74 20 3d 20 7a 4f 76 65 72 72 69 64 65 20 2b mt = zOverride +
4000: 20 73 69 7a 65 6f 66 28 22 2f 2a 77 6f 72 6b 73 sizeof("/*works
4010: 2d 6c 69 6b 65 3a 22 29 2d 31 3b 0a 20 20 20 20 -like:")-1;.
4020: 69 66 28 20 66 6d 74 46 6c 61 67 73 20 26 20 46 if( fmtFlags & F
4030: 4d 54 5f 4c 49 54 20 29 7b 0a 20 20 20 20 20 20 MT_LIT ){.
4040: 69 66 28 20 21 69 73 5f 73 74 72 69 6e 67 5f 6c if( !is_string_l
4050: 69 74 28 7a 46 6d 74 29 20 29 7b 0a 20 20 20 20 it(zFmt) ){.
4060: 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 3a 25 printf("%s:%
4070: 64 3a 20 61 72 67 75 6d 65 6e 74 20 25 64 20 74 d: argument %d t
4080: 6f 20 25 2e 2a 73 28 29 20 73 68 6f 75 6c 64 20 o %.*s() should
4090: 62 65 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 be a string lite
40a0: 72 61 6c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 ral\n",.
40b0: 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 zFilename
40c0: 2c 20 6c 6e 46 43 61 6c 6c 2c 20 66 6d 74 41 72 , lnFCall, fmtAr
40d0: 67 2c 20 73 7a 46 4e 61 6d 65 2c 20 7a 46 43 61 g, szFName, zFCa
40e0: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 ll);. nEr
40f0: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 r++;. }.
4100: 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 5f 73 }else if( !is_s
4110: 74 72 69 6e 67 5f 6c 69 74 28 7a 46 6d 74 29 20 tring_lit(zFmt)
4120: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 ){. printf(
4130: 22 25 73 3a 25 64 3a 20 25 2e 2a 73 28 29 20 68 "%s:%d: %.*s() h
4140: 61 73 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 as non-constant
4150: 66 6f 72 6d 61 74 20 6f 6e 20 61 72 67 5b 25 64 format on arg[%d
4160: 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 ]\n",.
4170: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6c 6e zFilename, ln
4180: 46 43 61 6c 6c 2c 20 73 7a 46 4e 61 6d 65 2c 20 FCall, szFName,
4190: 7a 46 43 61 6c 6c 2c 20 66 6d 74 41 72 67 2d 31 zFCall, fmtArg-1
41a0: 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b );. nErr++;
41b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 . }else if( (
41c0: 6b 20 3d 20 66 6f 72 6d 61 74 41 72 67 43 6f 75 k = formatArgCou
41d0: 6e 74 28 7a 46 6d 74 2c 20 6e 41 72 67 2c 20 61 nt(zFmt, nArg, a
41e0: 63 54 79 70 65 2c 20 26 6e 49 6e 69 74 29 29 3e cType, &nInit))>
41f0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 =0.
4200: 26 26 20 6e 41 72 67 21 3d 66 6d 74 41 72 67 2b && nArg!=fmtArg+
4210: 6b 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 k ){. print
4220: 66 28 22 25 73 3a 25 64 3a 20 74 6f 6f 20 25 73 f("%s:%d: too %s
4230: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 25 2e arguments to %.
4240: 2a 73 28 29 20 22 0a 20 20 20 20 20 20 20 20 20 *s() ".
4250: 20 20 20 20 22 2d 20 67 6f 74 20 25 64 20 61 6e "- got %d an
4260: 64 20 65 78 70 65 63 74 65 64 20 25 64 5c 6e 22 d expected %d\n"
4270: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a ,. z
4280: 46 69 6c 65 6e 61 6d 65 2c 20 6c 6e 46 43 61 6c Filename, lnFCal
4290: 6c 2c 20 28 6e 41 72 67 3c 66 6d 74 41 72 67 2b l, (nArg<fmtArg+
42a0: 6b 20 3f 20 22 66 65 77 22 20 3a 20 22 6d 61 6e k ? "few" : "man
42b0: 79 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 y"),.
42c0: 20 20 73 7a 46 4e 61 6d 65 2c 20 7a 46 43 61 6c szFName, zFCal
42d0: 6c 2c 20 6e 41 72 67 2c 20 66 6d 74 41 72 67 2b l, nArg, fmtArg+
42e0: 6b 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b k);. nErr++
42f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 ;. }else if(
4300: 28 66 6d 74 46 6c 61 67 73 20 26 20 46 4d 54 5f (fmtFlags & FMT_
4310: 50 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 PX)!=0 ){.
4320: 69 66 28 20 6e 49 6e 69 74 3d 3d 30 20 29 7b 0a if( nInit==0 ){.
4330: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 printf("
4340: 25 73 3a 25 64 3a 20 66 6f 72 6d 61 74 20 73 74 %s:%d: format st
4350: 72 69 6e 67 20 6f 6e 20 25 2e 2a 73 28 29 20 73 ring on %.*s() s
4360: 68 6f 75 6c 64 20 68 61 76 65 22 0a 20 20 20 20 hould have".
4370: 20 20 20 20 20 20 20 20 20 20 20 22 20 61 6e 20 " an
4380: 41 53 43 49 49 20 63 68 61 72 61 63 74 65 72 20 ASCII character
4390: 70 72 65 66 69 78 5c 6e 22 2c 0a 20 20 20 20 20 prefix\n",.
43a0: 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 zFilename,
43b0: 6c 6e 46 43 61 6c 6c 2c 20 73 7a 46 4e 61 6d 65 lnFCall, szFName
43c0: 2c 20 7a 46 43 61 6c 6c 29 3b 0a 20 20 20 20 20 , zFCall);.
43d0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 nErr++;.
43e0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 }. }else if(
43f0: 20 28 66 6d 74 46 6c 61 67 73 20 26 20 46 4d 54 (fmtFlags & FMT
4400: 5f 53 41 46 45 29 3d 3d 30 20 29 7b 0a 20 20 20 _SAFE)==0 ){.
4410: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 for(i=0; i<nA
4420: 72 67 20 26 26 20 69 3c 6b 3b 20 69 2b 2b 29 7b rg && i<k; i++){
4430: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61 63 . if( (ac
4440: 54 79 70 65 5b 69 5d 3d 3d 27 73 27 20 7c 7c 20 Type[i]=='s' ||
4450: 61 63 54 79 70 65 5b 69 5d 3d 3d 27 7a 27 20 7c acType[i]=='z' |
4460: 7c 20 61 63 54 79 70 65 5b 69 5d 3d 3d 27 62 27 | acType[i]=='b'
4470: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 ) ){. c
4480: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 72 onst char *zExpr
4490: 20 3d 20 61 7a 41 72 67 5b 66 6d 74 41 72 67 2b = azArg[fmtArg+
44a0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 i];. if
44b0: 28 20 6e 65 76 65 72 5f 73 61 66 65 28 7a 45 78 ( never_safe(zEx
44c0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 pr) ){.
44d0: 20 20 20 70 72 69 6e 74 66 28 22 25 73 3a 25 64 printf("%s:%d
44e0: 3a 20 41 72 67 75 6d 65 6e 74 20 25 64 20 74 6f : Argument %d to
44f0: 20 25 2e 2a 73 28 29 20 69 73 20 6e 6f 74 20 73 %.*s() is not s
4500: 61 66 65 20 66 6f 72 22 0a 20 20 20 20 20 20 20 afe for".
4510: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61 20 " a
4520: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 5c query parameter\
4530: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 n",.
4540: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6c 6e zFilename, ln
4550: 46 43 61 6c 6c 2c 20 69 2b 66 6d 74 41 72 67 2c FCall, i+fmtArg,
4560: 20 73 7a 46 4e 61 6d 65 2c 20 7a 46 43 61 6c 6c szFName, zFCall
4570: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 );.
4580: 6e 45 72 72 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 nErr++;. .
4590: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
45a0: 28 66 6d 74 46 6c 61 67 73 20 26 20 46 4d 54 5f (fmtFlags & FMT_
45b0: 53 51 4c 29 21 3d 30 20 26 26 20 21 69 73 5f 73 SQL)!=0 && !is_s
45c0: 71 6c 5f 73 61 66 65 28 7a 45 78 70 72 29 20 29 ql_safe(zExpr) )
45d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 {. pr
45e0: 69 6e 74 66 28 22 25 73 3a 25 64 3a 20 41 72 67 intf("%s:%d: Arg
45f0: 75 6d 65 6e 74 20 25 64 20 74 6f 20 25 2e 2a 73 ument %d to %.*s
4600: 28 29 20 6e 6f 74 20 73 61 66 65 20 66 6f 72 20 () not safe for
4610: 53 51 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 SQL\n",.
4620: 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 zFilename
4630: 2c 20 6c 6e 46 43 61 6c 6c 2c 20 69 2b 66 6d 74 , lnFCall, i+fmt
4640: 41 72 67 2c 20 73 7a 46 4e 61 6d 65 2c 20 7a 46 Arg, szFName, zF
4650: 43 61 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 Call);.
4660: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 nErr++;.
4670: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
4680: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a }. }. }.
4690: 20 20 7d 0a 20 20 69 66 28 20 6e 45 72 72 20 29 }. if( nErr )
46a0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 {. for(i=0; i
46b0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 <nArg; i++){.
46c0: 20 20 20 70 72 69 6e 74 66 28 22 20 20 20 61 72 printf(" ar
46d0: 67 5b 25 64 5d 3a 20 25 73 5c 6e 22 2c 20 69 2c g[%d]: %s\n", i,
46e0: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 azArg[i]);.
46f0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 56 }. }else if( eV
4700: 65 72 62 6f 73 65 3e 31 20 29 7b 0a 20 20 20 20 erbose>1 ){.
4710: 70 72 69 6e 74 66 28 22 25 73 3a 25 64 3a 20 25 printf("%s:%d: %
4720: 2e 2a 73 28 29 20 6f 6b 20 66 6f 72 20 25 64 20 .*s() ok for %d
4730: 61 72 67 75 6d 65 6e 74 73 5c 6e 22 2c 0a 20 20 arguments\n",.
4740: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6c zFilename, l
4750: 6e 46 43 61 6c 6c 2c 20 73 7a 46 4e 61 6d 65 2c nFCall, szFName,
4760: 20 7a 46 43 61 6c 6c 2c 20 6e 41 72 67 29 3b 0a zFCall, nArg);.
4770: 20 20 7d 0a 20 20 66 72 65 65 28 28 63 68 61 72 }. free((char
4780: 2a 29 61 7a 41 72 67 29 3b 0a 20 20 66 72 65 65 *)azArg);. free
4790: 28 7a 43 6f 70 79 29 3b 0a 20 20 72 65 74 75 72 (zCopy);. retur
47a0: 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a n nErr;.}.../*.*
47b0: 2a 20 44 6f 20 61 20 64 65 73 69 67 6e 2d 72 75 * Do a design-ru
47c0: 6c 65 20 63 68 65 63 6b 20 6f 66 20 66 6f 72 6d le check of form
47d0: 61 74 20 73 74 72 69 6e 67 73 20 66 6f 72 20 74 at strings for t
47e0: 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 7a 4e he file named zN
47f0: 61 6d 65 0a 2a 2a 20 77 69 74 68 20 63 6f 6e 74 ame.** with cont
4800: 65 6e 74 20 7a 43 6f 6e 74 65 6e 74 2e 20 20 57 ent zContent. W
4810: 72 69 74 65 20 65 72 72 6f 72 73 20 6f 6e 20 73 rite errors on s
4820: 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 20 tandard output.
4830: 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e Return.** the n
4840: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e umber of errors.
4850: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 .*/.static int s
4860: 63 61 6e 5f 66 69 6c 65 28 63 6f 6e 73 74 20 63 can_file(const c
4870: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 har *zName, cons
4880: 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 t char *zContent
4890: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 ){. const char
48a0: 2a 7a 3b 0a 20 20 69 6e 74 20 6c 6e 20 3d 20 30 *z;. int ln = 0
48b0: 3b 0a 20 20 69 6e 74 20 73 7a 54 6f 6b 65 6e 3b ;. int szToken;
48c0: 0a 20 20 69 6e 74 20 65 54 6f 6b 65 6e 3b 0a 20 . int eToken;.
48d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 const char *zPr
48e0: 65 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65 50 ev = 0;. int eP
48f0: 72 65 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 rev = 0;. int s
4900: 7a 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 6e 74 zPrev = 0;. int
4910: 20 6c 6e 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 lnPrev = 0;. i
4920: 6e 74 20 6e 43 75 72 6c 79 20 3d 20 30 3b 0a 20 nt nCurly = 0;.
4930: 20 69 6e 74 20 78 3b 0a 20 20 75 6e 73 69 67 6e int x;. unsign
4940: 65 64 20 66 6d 74 46 6c 61 67 73 20 3d 20 30 3b ed fmtFlags = 0;
4950: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b . int nErr = 0;
4960: 0a 0a 20 20 69 66 28 20 7a 43 6f 6e 74 65 6e 74 .. if( zContent
4970: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 ==0 ){. print
4980: 66 28 22 63 61 6e 6e 6f 74 20 72 65 61 64 20 66 f("cannot read f
4990: 69 6c 65 3a 20 25 73 5c 6e 22 2c 20 7a 4e 61 6d ile: %s\n", zNam
49a0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 e);. return 1
49b0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 7a 3d 7a 43 ;. }. for(z=zC
49c0: 6f 6e 74 65 6e 74 3b 20 7a 5b 30 5d 3b 20 7a 20 ontent; z[0]; z
49d0: 2b 3d 20 73 7a 54 6f 6b 65 6e 29 7b 0a 20 20 20 += szToken){.
49e0: 20 73 7a 54 6f 6b 65 6e 20 3d 20 74 6f 6b 65 6e szToken = token
49f0: 5f 6c 65 6e 67 74 68 28 7a 2c 20 26 65 54 6f 6b _length(z, &eTok
4a00: 65 6e 2c 20 26 6c 6e 29 3b 0a 20 20 20 20 69 66 en, &ln);. if
4a10: 28 20 65 54 6f 6b 65 6e 3d 3d 54 4b 5f 53 50 41 ( eToken==TK_SPA
4a20: 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 CE ) continue;.
4a30: 20 20 20 69 66 28 20 65 54 6f 6b 65 6e 3d 3d 54 if( eToken==T
4a40: 4b 5f 4f 54 48 45 52 20 29 7b 0a 20 20 20 20 20 K_OTHER ){.
4a50: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 7b 27 20 29 if( z[0]=='{' )
4a60: 7b 0a 20 20 20 20 20 20 20 20 6e 43 75 72 6c 79 {. nCurly
4a70: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 ++;. }else
4a80: 69 66 28 20 7a 5b 30 5d 3d 3d 27 7d 27 20 29 7b if( z[0]=='}' ){
4a90: 0a 20 20 20 20 20 20 20 20 6e 43 75 72 6c 79 2d . nCurly-
4aa0: 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 -;. }else i
4ab0: 66 28 20 6e 43 75 72 6c 79 3e 30 20 26 26 20 7a f( nCurly>0 && z
4ac0: 5b 30 5d 3d 3d 27 28 27 20 26 26 20 65 50 72 65 [0]=='(' && ePre
4ad0: 76 3d 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 v==TK_ID.
4ae0: 20 20 20 20 20 26 26 20 28 78 20 3d 20 69 73 46 && (x = isF
4af0: 6f 72 6d 61 74 46 75 6e 63 28 7a 50 72 65 76 2c ormatFunc(zPrev,
4b00: 73 7a 50 72 65 76 2c 26 66 6d 74 46 6c 61 67 73 szPrev,&fmtFlags
4b10: 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 ))>0 ){.
4b20: 6e 45 72 72 20 2b 3d 20 63 68 65 63 6b 46 6f 72 nErr += checkFor
4b30: 6d 61 74 46 75 6e 63 28 7a 4e 61 6d 65 2c 20 7a matFunc(zName, z
4b40: 50 72 65 76 2c 20 6c 6e 50 72 65 76 2c 20 78 2c Prev, lnPrev, x,
4b50: 20 66 6d 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 fmtFlags);.
4b60: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 }. }. zP
4b70: 72 65 76 20 3d 20 7a 3b 0a 20 20 20 20 65 50 72 rev = z;. ePr
4b80: 65 76 20 3d 20 65 54 6f 6b 65 6e 3b 0a 20 20 20 ev = eToken;.
4b90: 20 73 7a 50 72 65 76 20 3d 20 73 7a 54 6f 6b 65 szPrev = szToke
4ba0: 6e 3b 0a 20 20 20 20 6c 6e 50 72 65 76 20 3d 20 n;. lnPrev =
4bb0: 6c 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e ln;. }. return
4bc0: 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 nErr;.}../*.**
4bd0: 43 68 65 63 6b 20 66 6f 72 20 66 6f 72 6d 61 74 Check for format
4be0: 2d 73 74 72 69 6e 67 20 64 65 73 69 67 6e 20 72 -string design r
4bf0: 75 6c 65 20 76 69 6f 6c 61 74 69 6f 6e 73 20 6f ule violations o
4c00: 6e 20 61 6c 6c 20 66 69 6c 65 73 20 6c 69 73 74 n all files list
4c10: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f 6d ed.** on the com
4c20: 6d 61 6e 64 2d 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a mand-line..**.**
4c30: 20 54 68 65 20 65 56 65 72 62 6f 73 65 20 67 6c The eVerbose gl
4c40: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 obal variable is
4c50: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 incremented wit
4c60: 68 20 65 61 63 68 20 22 2d 76 22 20 61 72 67 75 h each "-v" argu
4c70: 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 6d 61 69 ment..*/.int mai
4c80: 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 n(int argc, char
4c90: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 **argv){. int
4ca0: 69 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 i;. int nErr =
4cb0: 30 3b 0a 20 20 71 73 6f 72 74 28 61 46 6d 74 46 0;. qsort(aFmtF
4cc0: 75 6e 63 2c 20 73 69 7a 65 6f 66 28 61 46 6d 74 unc, sizeof(aFmt
4cd0: 46 75 6e 63 29 2f 73 69 7a 65 6f 66 28 61 46 6d Func)/sizeof(aFm
4ce0: 74 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 tFunc[0]),.
4cf0: 20 20 20 73 69 7a 65 6f 66 28 61 46 6d 74 46 75 sizeof(aFmtFu
4d00: 6e 63 5b 30 5d 29 2c 20 66 6d 74 66 75 6e 63 5f nc[0]), fmtfunc_
4d10: 63 6d 70 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b cmp);. for(i=1;
4d20: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 i<argc; i++){.
4d30: 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a char *zFile;.
4d40: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 if( strcmp(a
4d50: 72 67 76 5b 69 5d 2c 22 2d 76 22 29 3d 3d 30 20 rgv[i],"-v")==0
4d60: 29 7b 0a 20 20 20 20 20 20 65 56 65 72 62 6f 73 ){. eVerbos
4d70: 65 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 e++;. conti
4d80: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 nue;. }. i
4d90: 66 28 20 65 56 65 72 62 6f 73 65 3e 30 20 29 20 f( eVerbose>0 )
4da0: 70 72 69 6e 74 66 28 22 50 72 6f 63 65 73 73 69 printf("Processi
4db0: 6e 67 20 25 73 2e 2e 2e 5c 6e 22 2c 20 61 72 67 ng %s...\n", arg
4dc0: 76 5b 69 5d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 v[i]);. zFile
4dd0: 20 3d 20 72 65 61 64 5f 66 69 6c 65 28 61 72 67 = read_file(arg
4de0: 76 5b 69 5d 29 3b 0a 20 20 20 20 6e 45 72 72 20 v[i]);. nErr
4df0: 2b 3d 20 73 63 61 6e 5f 66 69 6c 65 28 61 72 67 += scan_file(arg
4e00: 76 5b 69 5d 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 v[i], zFile);.
4e10: 20 20 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 free(zFile);.
4e20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 }. return nErr
4e30: 3b 0a 7d 0a ;.}.