Fossil

Hex Artifact Content
Login

Artifact 4b4bbebe7285545db72ee94406086a3ddbf1839367df76e7672025428465d43c:


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 2c 20 77   generate SQL, w
05a0: 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 75 73  arn about the us
05b0: 65 20 6f 66 20 25 73 0a 2a 2a 20 20 20 20 20 20  e of %s.**      
05c0: 20 77 68 69 63 68 20 6d 69 67 68 74 20 61 6c 6c   which might all
05d0: 6f 77 20 53 51 4c 20 69 6e 6a 65 63 74 69 6f 6e  ow SQL injection
05e0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73  ..*/.#include <s
05f0: 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  tdio.h>.#include
0600: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0610: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
0620: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0630: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  h>.#include <ass
0640: 65 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ert.h>../*.** Ma
0650: 6c 6c 6f 63 2c 20 61 62 6f 72 74 69 6e 67 20 69  lloc, aborting i
0660: 66 20 69 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 76  f it fails..*/.v
0670: 6f 69 64 20 2a 73 61 66 65 5f 6d 61 6c 6c 6f 63  oid *safe_malloc
0680: 28 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76  (int nByte){.  v
0690: 6f 69 64 20 2a 78 20 3d 20 6d 61 6c 6c 6f 63 28  oid *x = malloc(
06a0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 78 3d  nByte);.  if( x=
06b0: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
06c0: 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65  f(stderr, "faile
06d0: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 25 64  d to allocate %d
06e0: 20 62 79 74 65 73 5c 6e 22 2c 20 6e 42 79 74 65   bytes\n", nByte
06f0: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
0700: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a    }.  return x;.
0710: 7d 0a 76 6f 69 64 20 2a 73 61 66 65 5f 72 65 61  }.void *safe_rea
0720: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 4f 6c 64 2c  lloc(void *pOld,
0730: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76   int nByte){.  v
0740: 6f 69 64 20 2a 78 20 3d 20 72 65 61 6c 6c 6f 63  oid *x = realloc
0750: 28 70 4f 6c 64 2c 20 6e 42 79 74 65 29 3b 0a 20  (pOld, nByte);. 
0760: 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20   if( x==0 ){.   
0770: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
0780: 20 22 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f   "failed to allo
0790: 63 61 74 65 20 25 64 20 62 79 74 65 73 5c 6e 22  cate %d bytes\n"
07a0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 65 78  , nByte);.    ex
07b0: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  it(1);.  }.  ret
07c0: 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn x;.}../*.** 
07d0: 52 65 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Read the entire 
07e0: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 66  content of the f
07f0: 69 6c 65 20 6e 61 6d 65 64 20 7a 46 69 6c 65 6e  ile named zFilen
0800: 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ame into memory 
0810: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
0820: 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 20 41 64 64   malloc().   Add
0830: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
0840: 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a  or to the end..*
0850: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
0860: 65 72 20 74 6f 20 74 68 61 74 20 6d 65 6d 6f 72  er to that memor
0870: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  y..*/.static cha
0880: 72 20 2a 72 65 61 64 5f 66 69 6c 65 28 63 6f 6e  r *read_file(con
0890: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
08a0: 6d 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  me){.  FILE *in;
08b0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  .  char *z;.  in
08c0: 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 67  t nByte;.  int g
08d0: 6f 74 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e  ot;.  in = fopen
08e0: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 72 62 22  (zFilename, "rb"
08f0: 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  );.  if( in==0 )
0900: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
0910: 20 20 7d 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20    }.  fseek(in, 
0920: 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20  0, SEEK_END);.  
0930: 6e 42 79 74 65 20 3d 20 66 74 65 6c 6c 28 69 6e  nByte = ftell(in
0940: 29 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30  );.  fseek(in, 0
0950: 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 7a  , SEEK_SET);.  z
0960: 20 3d 20 73 61 66 65 5f 6d 61 6c 6c 6f 63 28 20   = safe_malloc( 
0970: 6e 42 79 74 65 2b 31 20 29 3b 0a 20 20 67 6f 74  nByte+1 );.  got
0980: 20 3d 20 66 72 65 61 64 28 7a 2c 20 31 2c 20 6e   = fread(z, 1, n
0990: 42 79 74 65 2c 20 69 6e 29 3b 0a 20 20 7a 5b 67  Byte, in);.  z[g
09a0: 6f 74 5d 20 3d 20 30 3b 0a 20 20 66 63 6c 6f 73  ot] = 0;.  fclos
09b0: 65 28 69 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(in);.  return 
09c0: 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  z;.}../*.** When
09d0: 20 70 61 72 73 69 6e 67 20 74 68 65 20 69 6e 70   parsing the inp
09e0: 75 74 20 66 69 6c 65 2c 20 74 68 65 20 66 6f 6c  ut file, the fol
09f0: 6c 6f 77 69 6e 67 20 74 6f 6b 65 6e 20 74 79 70  lowing token typ
0a00: 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65  es are recognize
0a10: 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4b  d..*/.#define TK
0a20: 5f 53 50 41 43 45 20 20 20 20 20 20 31 20 20 20  _SPACE      1   
0a30: 20 20 20 2f 2a 20 57 68 69 74 65 73 70 61 63 65     /* Whitespace
0a40: 20 6f 72 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a   or comments */.
0a50: 23 64 65 66 69 6e 65 20 54 4b 5f 49 44 20 20 20  #define TK_ID   
0a60: 20 20 20 20 20 20 32 20 20 20 20 20 20 2f 2a 20        2      /* 
0a70: 41 6e 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f  An identifier */
0a80: 0a 23 64 65 66 69 6e 65 20 54 4b 5f 53 54 52 20  .#define TK_STR 
0a90: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 2f 2a         3      /*
0aa0: 20 41 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61   A string litera
0ab0: 6c 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74  l in double-quot
0ac0: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4b  es */.#define TK
0ad0: 5f 4f 54 48 45 52 20 20 20 20 20 20 34 20 20 20  _OTHER      4   
0ae0: 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20     /* Any other 
0af0: 74 6f 6b 65 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  token */.#define
0b00: 20 54 4b 5f 45 4f 46 20 20 20 20 20 20 20 39 39   TK_EOF       99
0b10: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
0b20: 66 69 6c 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  file */../*.** D
0b30: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6c 65 6e  etermine the len
0b40: 67 74 68 20 61 6e 64 20 74 79 70 65 20 6f 66 20  gth and type of 
0b50: 74 68 65 20 74 6f 6b 65 6e 20 62 65 67 69 6e 6e  the token beginn
0b60: 69 6e 67 20 61 74 20 7a 5b 30 5d 0a 2a 2f 0a 73  ing at z[0].*/.s
0b70: 74 61 74 69 63 20 69 6e 74 20 74 6f 6b 65 6e 5f  tatic int token_
0b80: 6c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  length(const cha
0b90: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 54 79 70 65  r *z, int *pType
0ba0: 2c 20 69 6e 74 20 2a 70 4c 4e 29 7b 0a 20 20 69  , int *pLN){.  i
0bb0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d  nt i;.  if( z[0]
0bc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 54 79 70  ==0 ){.    *pTyp
0bd0: 65 20 3d 20 54 4b 5f 45 4f 46 3b 0a 20 20 20 20  e = TK_EOF;.    
0be0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
0bf0: 69 66 28 20 7a 5b 30 5d 3d 3d 27 22 27 20 7c 7c  if( z[0]=='"' ||
0c00: 20 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20   z[0]=='\'' ){. 
0c10: 20 20 20 66 6f 72 28 69 3d 31 3b 20 7a 5b 69 5d     for(i=1; z[i]
0c20: 20 26 26 20 7a 5b 69 5d 21 3d 7a 5b 30 5d 3b 20   && z[i]!=z[0]; 
0c30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
0c40: 7a 5b 69 5d 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b  z[i]=='\\' && z[
0c50: 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  i+1]!=0 ){.     
0c60: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
0c70: 5c 6e 27 20 29 20 28 2a 70 4c 4e 29 2b 2b 3b 0a  \n' ) (*pLN)++;.
0c80: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
0c90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
0ca0: 66 28 20 7a 5b 69 5d 21 3d 30 20 29 20 69 2b 2b  f( z[i]!=0 ) i++
0cb0: 3b 0a 20 20 20 20 2a 70 54 79 70 65 20 3d 20 7a  ;.    *pType = z
0cc0: 5b 30 5d 3d 3d 27 22 27 20 3f 20 54 4b 5f 53 54  [0]=='"' ? TK_ST
0cd0: 52 20 3a 20 54 4b 5f 4f 54 48 45 52 3b 0a 20 20  R : TK_OTHER;.  
0ce0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a    return i;.  }.
0cf0: 20 20 69 66 28 20 69 73 61 6c 6e 75 6d 28 7a 5b    if( isalnum(z[
0d00: 30 5d 29 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 5f 27  0]) || z[0]=='_'
0d10: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
0d20: 20 69 73 61 6c 6e 75 6d 28 7a 5b 69 5d 29 20 7c   isalnum(z[i]) |
0d30: 7c 20 7a 5b 69 5d 3d 3d 27 5f 27 3b 20 69 2b 2b  | z[i]=='_'; i++
0d40: 29 7b 7d 0a 20 20 20 20 2a 70 54 79 70 65 20 3d  ){}.    *pType =
0d50: 20 69 73 61 6c 70 68 61 28 7a 5b 30 5d 29 20 7c   isalpha(z[0]) |
0d60: 7c 20 7a 5b 30 5d 3d 3d 27 5f 27 20 3f 20 54 4b  | z[0]=='_' ? TK
0d70: 5f 49 44 20 3a 20 54 4b 5f 4f 54 48 45 52 3b 0a  _ID : TK_OTHER;.
0d80: 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20      return i;.  
0d90: 7d 0a 20 20 69 66 28 20 69 73 73 70 61 63 65 28  }.  if( isspace(
0da0: 7a 5b 30 5d 29 20 29 7b 0a 20 20 20 20 69 66 28  z[0]) ){.    if(
0db0: 20 7a 5b 30 5d 3d 3d 27 5c 6e 27 20 29 20 28 2a   z[0]=='\n' ) (*
0dc0: 70 4c 4e 29 2b 2b 3b 0a 20 20 20 20 66 6f 72 28  pLN)++;.    for(
0dd0: 69 3d 31 3b 20 69 73 73 70 61 63 65 28 7a 5b 69  i=1; isspace(z[i
0de0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
0df0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29  if( z[i]=='\n' )
0e00: 20 28 2a 70 4c 4e 29 2b 2b 3b 0a 20 20 20 20 7d   (*pLN)++;.    }
0e10: 0a 20 20 20 20 2a 70 54 79 70 65 20 3d 20 54 4b  .    *pType = TK
0e20: 5f 53 50 41 43 45 3b 0a 20 20 20 20 72 65 74 75  _SPACE;.    retu
0e30: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn i;.  }.  if( 
0e40: 7a 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 7a 5b 31  z[0]=='/' && z[1
0e50: 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 66 6f  ]=='*' ){.    fo
0e60: 72 28 69 3d 32 3b 20 7a 5b 69 5d 20 26 26 20 28  r(i=2; z[i] && (
0e70: 7a 5b 69 5d 21 3d 27 2a 27 20 7c 7c 20 7a 5b 69  z[i]!='*' || z[i
0e80: 2b 31 5d 21 3d 27 2f 27 29 3b 20 69 2b 2b 29 7b  +1]!='/'); i++){
0e90: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  .      if( z[i]=
0ea0: 3d 27 5c 6e 27 20 29 20 28 2a 70 4c 4e 29 2b 2b  ='\n' ) (*pLN)++
0eb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
0ec0: 7a 5b 69 5d 20 29 20 69 20 2b 3d 20 32 3b 0a 20  z[i] ) i += 2;. 
0ed0: 20 20 20 2a 70 54 79 70 65 20 3d 20 54 4b 5f 53     *pType = TK_S
0ee0: 50 41 43 45 3b 0a 20 20 20 20 72 65 74 75 72 6e  PACE;.    return
0ef0: 20 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 5b   i;.  }.  if( z[
0f00: 30 5d 3d 3d 27 2f 27 20 26 26 20 7a 5b 31 5d 3d  0]=='/' && z[1]=
0f10: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 66 6f 72 28  ='/' ){.    for(
0f20: 69 3d 32 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b 69  i=2; z[i] && z[i
0f30: 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a  ]!='\n'; i++){}.
0f40: 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 7b 0a      if( z[i] ){.
0f50: 20 20 20 20 20 20 28 2a 70 4c 4e 29 2b 2b 3b 0a        (*pLN)++;.
0f60: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
0f70: 0a 20 20 20 20 2a 70 54 79 70 65 20 3d 20 54 4b  .    *pType = TK
0f80: 5f 53 50 41 43 45 3b 0a 20 20 20 20 72 65 74 75  _SPACE;.    retu
0f90: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn i;.  }.  if( 
0fa0: 7a 5b 30 5d 3d 3d 27 5c 5c 27 20 26 26 20 28 7a  z[0]=='\\' && (z
0fb0: 5b 31 5d 3d 3d 27 5c 6e 27 20 7c 7c 20 28 7a 5b  [1]=='\n' || (z[
0fc0: 31 5d 3d 3d 27 5c 72 27 20 26 26 20 7a 5b 32 5d  1]=='\r' && z[2]
0fd0: 3d 3d 27 5c 6e 27 29 29 20 29 7b 0a 20 20 20 20  =='\n')) ){.    
0fe0: 2a 70 54 79 70 65 20 3d 20 54 4b 5f 53 50 41 43  *pType = TK_SPAC
0ff0: 45 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  E;.    return 1;
1000: 0a 20 20 7d 0a 20 20 2a 70 54 79 70 65 20 3d 20  .  }.  *pType = 
1010: 54 4b 5f 4f 54 48 45 52 3b 0a 20 20 72 65 74 75  TK_OTHER;.  retu
1020: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 1;.}../*.** R
1030: 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 6e  eturn the next n
1040: 6f 6e 2d 77 68 69 74 65 73 70 61 63 65 20 74 6f  on-whitespace to
1050: 6b 65 6e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ken.*/.const cha
1060: 72 20 2a 6e 65 78 74 5f 6e 6f 6e 5f 77 68 69 74  r *next_non_whit
1070: 65 73 70 61 63 65 28 63 6f 6e 73 74 20 63 68 61  espace(const cha
1080: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 4c 65 6e 2c  r *z, int *pLen,
1090: 20 69 6e 74 20 2a 70 54 79 70 65 29 7b 0a 20 20   int *pType){.  
10a0: 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 65  int len;.  int e
10b0: 54 79 70 65 3b 0a 20 20 69 6e 74 20 6c 6e 20 3d  Type;.  int ln =
10c0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 28 6c 65   0;.  while( (le
10d0: 6e 20 3d 20 74 6f 6b 65 6e 5f 6c 65 6e 67 74 68  n = token_length
10e0: 28 7a 2c 20 26 65 54 79 70 65 2c 20 26 6c 6e 29  (z, &eType, &ln)
10f0: 29 3e 30 20 26 26 20 65 54 79 70 65 3d 3d 54 4b  )>0 && eType==TK
1100: 5f 53 50 41 43 45 20 29 7b 0a 20 20 20 20 7a 20  _SPACE ){.    z 
1110: 2b 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 2a 70  += len;.  }.  *p
1120: 4c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 2a 70 54  Len = len;.  *pT
1130: 79 70 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 72  ype = eType;.  r
1140: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
1150: 2a 20 52 65 74 75 72 6e 20 69 6e 64 65 78 20 69  * Return index i
1160: 6e 74 6f 20 7a 5b 5d 20 66 6f 72 20 74 68 65 20  nto z[] for the 
1170: 66 69 72 73 74 20 62 61 6c 61 6e 63 65 64 20 54  first balanced T
1180: 4b 5f 4f 54 48 45 52 20 74 6f 6b 65 6e 20 77 69  K_OTHER token wi
1190: 74 68 0a 2a 2a 20 76 61 6c 75 65 20 63 56 61 6c  th.** value cVal
11a0: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
11b0: 74 20 64 69 73 74 61 6e 63 65 5f 74 6f 28 63 6f  t distance_to(co
11c0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 63 68 61  nst char *z, cha
11d0: 72 20 63 56 61 6c 29 7b 0a 20 20 69 6e 74 20 6c  r cVal){.  int l
11e0: 65 6e 3b 0a 20 20 69 6e 74 20 64 69 73 74 20 3d  en;.  int dist =
11f0: 20 30 3b 0a 20 20 69 6e 74 20 65 54 79 70 65 3b   0;.  int eType;
1200: 0a 20 20 69 6e 74 20 6e 4e 65 73 74 20 3d 20 30  .  int nNest = 0
1210: 3b 0a 20 20 69 6e 74 20 6c 6e 20 3d 20 30 3b 0a  ;.  int ln = 0;.
1220: 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26    while( z[0] &&
1230: 20 28 6c 65 6e 20 3d 20 74 6f 6b 65 6e 5f 6c 65   (len = token_le
1240: 6e 67 74 68 28 7a 2c 20 26 65 54 79 70 65 2c 20  ngth(z, &eType, 
1250: 26 6c 6e 29 29 3e 30 20 29 7b 0a 20 20 20 20 69  &ln))>0 ){.    i
1260: 66 28 20 65 54 79 70 65 3d 3d 54 4b 5f 4f 54 48  f( eType==TK_OTH
1270: 45 52 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ER ){.      if( 
1280: 7a 5b 30 5d 3d 3d 63 56 61 6c 20 26 26 20 6e 4e  z[0]==cVal && nN
1290: 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  est==0 ){.      
12a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
12b0: 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  else if( z[0]=='
12c0: 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e  (' ){.        nN
12d0: 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  est++;.      }el
12e0: 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 29 27  se if( z[0]==')'
12f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 65 73   ){.        nNes
1300: 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t--;.      }.   
1310: 20 7d 0a 20 20 20 20 64 69 73 74 20 2b 3d 20 6c   }.    dist += l
1320: 65 6e 3b 0a 20 20 20 20 7a 20 2b 3d 20 6c 65 6e  en;.    z += len
1330: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
1340: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ist;.}../*.** Re
1350: 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 6e  turn the first n
1360: 6f 6e 2d 77 68 69 74 65 73 70 61 63 65 20 63 68  on-whitespace ch
1370: 61 72 61 63 74 65 72 73 20 69 6e 20 7a 5b 5d 0a  aracters in z[].
1380: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
1390: 63 68 61 72 20 2a 73 6b 69 70 5f 73 70 61 63 65  char *skip_space
13a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
13b0: 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63  .  while( isspac
13c0: 65 28 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20  e(z[0]) ){ z++; 
13d0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
13e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
13f0: 75 65 20 69 66 20 74 68 65 20 69 6e 70 75 74 20  ue if the input 
1400: 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65  is a string lite
1410: 72 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ral..*/.static i
1420: 6e 74 20 69 73 5f 73 74 72 69 6e 67 5f 6c 69 74  nt is_string_lit
1430: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
1440: 0a 20 20 69 6e 74 20 6e 75 31 2c 20 6e 75 32 3b  .  int nu1, nu2;
1450: 0a 20 20 7a 20 3d 20 6e 65 78 74 5f 6e 6f 6e 5f  .  z = next_non_
1460: 77 68 69 74 65 73 70 61 63 65 28 7a 2c 20 26 6e  whitespace(z, &n
1470: 75 31 2c 20 26 6e 75 32 29 3b 0a 20 20 69 66 28  u1, &nu2);.  if(
1480: 20 73 74 72 63 6d 70 28 7a 2c 20 22 4e 55 4c 4c   strcmp(z, "NULL
1490: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
14a0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 3d  ;.  return z[0]=
14b0: 3d 27 22 27 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ='"';.}../*.** R
14c0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
14d0: 65 20 69 6e 70 75 74 20 69 73 20 61 6e 20 65 78  e input is an ex
14e0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 73 74 72 69  pression of stri
14f0: 6e 67 20 6c 69 74 65 72 61 6c 73 3a 0a 2a 2a 0a  ng literals:.**.
1500: 2a 2a 20 20 20 20 20 20 45 58 50 52 20 3f 20 22  **      EXPR ? "
1510: 2e 2e 2e 22 20 3a 20 22 2e 2e 2e 22 0a 2a 2f 0a  ..." : "...".*/.
1520: 73 74 61 74 69 63 20 69 6e 74 20 69 73 5f 73 74  static int is_st
1530: 72 69 6e 67 5f 65 78 70 72 28 63 6f 6e 73 74 20  ring_expr(const 
1540: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
1550: 6c 65 6e 20 3d 20 30 2c 20 65 54 79 70 65 3b 0a  len = 0, eType;.
1560: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
1570: 72 69 67 20 3d 20 7a 3b 0a 20 20 6c 65 6e 20 3d  rig = z;.  len =
1580: 20 64 69 73 74 61 6e 63 65 5f 74 6f 28 7a 2c 20   distance_to(z, 
1590: 27 3f 27 29 3b 0a 20 20 69 66 28 20 7a 5b 6c 65  '?');.  if( z[le
15a0: 6e 5d 3d 3d 30 20 26 26 20 73 6b 69 70 5f 73 70  n]==0 && skip_sp
15b0: 61 63 65 28 7a 29 5b 30 5d 3d 3d 27 28 27 20 29  ace(z)[0]=='(' )
15c0: 7b 0a 20 20 20 20 7a 20 3d 20 73 6b 69 70 5f 73  {.    z = skip_s
15d0: 70 61 63 65 28 7a 29 20 2b 20 31 3b 0a 20 20 20  pace(z) + 1;.   
15e0: 20 6c 65 6e 20 3d 20 64 69 73 74 61 6e 63 65 5f   len = distance_
15f0: 74 6f 28 7a 2c 20 27 3f 27 29 3b 0a 20 20 7d 0a  to(z, '?');.  }.
1600: 20 20 7a 20 2b 3d 20 6c 65 6e 3b 0a 20 20 69 66    z += len;.  if
1610: 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20  ( z[0]=='?' ){. 
1620: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7a 20 3d 20     z++;.    z = 
1630: 6e 65 78 74 5f 6e 6f 6e 5f 77 68 69 74 65 73 70  next_non_whitesp
1640: 61 63 65 28 7a 2c 20 26 6c 65 6e 2c 20 26 65 54  ace(z, &len, &eT
1650: 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 65 54  ype);.    if( eT
1660: 79 70 65 3d 3d 54 4b 5f 53 54 52 20 29 7b 0a 20  ype==TK_STR ){. 
1670: 20 20 20 20 20 7a 20 2b 3d 20 6c 65 6e 3b 0a 20       z += len;. 
1680: 20 20 20 20 20 7a 20 3d 20 6e 65 78 74 5f 6e 6f       z = next_no
1690: 6e 5f 77 68 69 74 65 73 70 61 63 65 28 7a 2c 20  n_whitespace(z, 
16a0: 26 6c 65 6e 2c 20 26 65 54 79 70 65 29 3b 0a 20  &len, &eType);. 
16b0: 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
16c0: 54 4b 5f 4f 54 48 45 52 20 26 26 20 7a 5b 30 5d  TK_OTHER && z[0]
16d0: 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 20 20 20  ==':' ){.       
16e0: 20 7a 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20   z += len;.     
16f0: 20 20 20 7a 20 3d 20 6e 65 78 74 5f 6e 6f 6e 5f     z = next_non_
1700: 77 68 69 74 65 73 70 61 63 65 28 7a 2c 20 26 6c  whitespace(z, &l
1710: 65 6e 2c 20 26 65 54 79 70 65 29 3b 0a 20 20 20  en, &eType);.   
1720: 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
1730: 54 4b 5f 53 54 52 20 29 7b 0a 20 20 20 20 20 20  TK_STR ){.      
1740: 20 20 20 20 7a 20 2b 3d 20 6c 65 6e 3b 0a 20 20      z += len;.  
1750: 20 20 20 20 20 20 20 20 7a 20 3d 20 6e 65 78 74          z = next
1760: 5f 6e 6f 6e 5f 77 68 69 74 65 73 70 61 63 65 28  _non_whitespace(
1770: 7a 2c 20 26 6c 65 6e 2c 20 26 65 54 79 70 65 29  z, &len, &eType)
1780: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1790: 65 54 79 70 65 3d 3d 54 4b 5f 45 4f 46 20 29 20  eType==TK_EOF ) 
17a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
17b0: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 54      if( eType==T
17c0: 4b 5f 4f 54 48 45 52 20 26 26 20 7a 5b 30 5d 3d  K_OTHER && z[0]=
17d0: 3d 27 29 27 20 26 26 20 73 6b 69 70 5f 73 70 61  =')' && skip_spa
17e0: 63 65 28 7a 4f 72 69 67 29 5b 30 5d 3d 3d 27 28  ce(zOrig)[0]=='(
17f0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
1800: 20 7a 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20   z += len;.     
1810: 20 20 20 20 20 20 20 7a 20 3d 20 6e 65 78 74 5f         z = next_
1820: 6e 6f 6e 5f 77 68 69 74 65 73 70 61 63 65 28 7a  non_whitespace(z
1830: 2c 20 26 6c 65 6e 2c 20 26 65 54 79 70 65 29 3b  , &len, &eType);
1840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1850: 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4f 46 20 29   eType==TK_EOF )
1860: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1870: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1890: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
18a0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 20 6f  ../*.** A list o
18b0: 66 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  f functions that
18c0: 20 72 65 74 75 72 6e 20 73 74 72 69 6e 67 73 20   return strings 
18d0: 74 68 61 74 20 61 72 65 20 73 61 66 65 20 74 6f  that are safe to
18e0: 20 69 6e 73 65 72 74 20 69 6e 74 6f 0a 2a 2a 20   insert into.** 
18f0: 53 51 4c 20 75 73 69 6e 67 20 25 73 2e 0a 2a 2f  SQL using %s..*/
1900: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1910: 61 72 20 2a 61 7a 53 61 66 65 46 75 6e 63 5b 5d  ar *azSafeFunc[]
1920: 20 3d 20 7b 0a 20 20 22 66 69 6c 65 6e 61 6d 65   = {.  "filename
1930: 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20 20 22  _collation",.  "
1940: 6c 65 61 66 5f 69 73 5f 63 6c 6f 73 65 64 5f 73  leaf_is_closed_s
1950: 71 6c 22 2c 0a 20 20 22 74 69 6d 65 6c 69 6e 65  ql",.  "timeline
1960: 5f 71 75 65 72 79 5f 66 6f 72 5f 77 77 77 22 2c  _query_for_www",
1970: 0a 20 20 22 74 69 6d 65 6c 69 6e 65 5f 71 75 65  .  "timeline_que
1980: 72 79 5f 66 6f 72 5f 74 74 79 22 2c 0a 20 20 22  ry_for_tty",.  "
1990: 62 6c 6f 62 5f 73 71 6c 5f 74 65 78 74 22 2c 0a  blob_sql_text",.
19a0: 20 20 22 67 6c 6f 62 5f 65 78 70 72 22 2c 0a 20    "glob_expr",. 
19b0: 20 22 66 6f 73 73 69 6c 5f 61 6c 6c 5f 72 65 73   "fossil_all_res
19c0: 65 72 76 65 64 5f 6e 61 6d 65 73 22 2c 0a 20 20  erved_names",.  
19d0: 22 63 6f 6e 66 69 67 75 72 65 5f 69 6e 6f 70 5f  "configure_inop_
19e0: 72 68 73 22 2c 0a 20 20 22 64 62 5f 73 65 74 74  rhs",.  "db_sett
19f0: 69 6e 67 5f 69 6e 6f 70 5f 72 68 73 22 2c 0a 7d  ing_inop_rhs",.}
1a00: 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ;../*.** Return 
1a10: 74 72 75 65 20 69 66 20 74 68 65 20 69 6e 70 75  true if the inpu
1a20: 74 20 69 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  t is an argument
1a30: 20 74 68 61 74 20 69 73 20 73 61 66 65 20 74 6f   that is safe to
1a40: 20 75 73 65 20 77 69 74 68 20 25 73 0a 2a 2a 20   use with %s.** 
1a50: 77 68 69 6c 65 20 62 75 69 6c 64 69 6e 67 20 61  while building a
1a60: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  n SQL statement.
1a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1a80: 73 5f 73 5f 73 61 66 65 28 63 6f 6e 73 74 20 63  s_s_safe(const c
1a90: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6c  har *z){.  int l
1aa0: 65 6e 2c 20 65 54 79 70 65 3b 0a 20 20 69 6e 74  en, eType;.  int
1ab0: 20 69 3b 0a 0a 20 20 2f 2a 20 41 20 73 74 72 69   i;..  /* A stri
1ac0: 6e 67 20 6c 69 74 65 72 61 6c 20 69 73 20 73 61  ng literal is sa
1ad0: 66 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  fe for use with 
1ae0: 25 73 20 2a 2f 0a 20 20 69 66 28 20 69 73 5f 73  %s */.  if( is_s
1af0: 74 72 69 6e 67 5f 6c 69 74 28 7a 29 20 29 20 72  tring_lit(z) ) r
1b00: 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 43  eturn 1;..  /* C
1b10: 65 72 74 61 69 6e 20 66 75 6e 63 74 69 6f 6e 73  ertain functions
1b20: 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
1b30: 74 6f 20 72 65 74 75 72 6e 20 61 20 73 74 72 69  to return a stri
1b40: 6e 67 20 74 68 61 74 20 69 73 20 73 61 66 65 0a  ng that is safe.
1b50: 20 20 2a 2a 20 66 6f 72 20 75 73 65 20 77 69 74    ** for use wit
1b60: 68 20 25 73 20 2a 2f 0a 20 20 7a 20 3d 20 6e 65  h %s */.  z = ne
1b70: 78 74 5f 6e 6f 6e 5f 77 68 69 74 65 73 70 61 63  xt_non_whitespac
1b80: 65 28 7a 2c 20 26 6c 65 6e 2c 20 26 65 54 79 70  e(z, &len, &eTyp
1b90: 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
1ba0: 3c 73 69 7a 65 6f 66 28 61 7a 53 61 66 65 46 75  <sizeof(azSafeFu
1bb0: 6e 63 29 2f 73 69 7a 65 6f 66 28 61 7a 53 61 66  nc)/sizeof(azSaf
1bc0: 65 46 75 6e 63 5b 30 5d 29 3b 20 69 2b 2b 29 7b  eFunc[0]); i++){
1bd0: 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1be0: 54 4b 5f 49 44 0a 20 20 20 20 20 26 26 20 73 74  TK_ID.     && st
1bf0: 72 6e 63 6d 70 28 7a 2c 20 61 7a 53 61 66 65 46  rncmp(z, azSafeF
1c00: 75 6e 63 5b 69 5d 2c 20 6c 65 6e 29 3d 3d 30 0a  unc[i], len)==0.
1c10: 20 20 20 20 20 26 26 20 73 74 72 6c 65 6e 28 61       && strlen(a
1c20: 7a 53 61 66 65 46 75 6e 63 5b 69 5d 29 3d 3d 6c  zSafeFunc[i])==l
1c30: 65 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  en.    ){.      
1c40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1c50: 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 70 72 65 73    }..  /* Expres
1c60: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
1c70: 6d 3a 20 20 45 58 50 52 20 3f 20 22 2e 2e 2e 22  m:  EXPR ? "..."
1c80: 20 3a 20 22 2e 2e 2e 2e 22 20 63 61 6e 20 63 6f   : "...." can co
1c90: 75 6e 74 20 61 73 0a 20 20 2a 2a 20 61 20 73 74  unt as.  ** a st
1ca0: 72 69 6e 67 20 6c 69 74 65 72 61 6c 2e 20 2a 2f  ring literal. */
1cb0: 0a 20 20 69 66 28 20 69 73 5f 73 74 72 69 6e 67  .  if( is_string
1cc0: 5f 65 78 70 72 28 7a 29 20 29 20 72 65 74 75 72  _expr(z) ) retur
1cd0: 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  n 1;..  /* If th
1ce0: 65 20 22 73 61 66 65 2d 66 6f 72 2d 25 73 22 20  e "safe-for-%s" 
1cf0: 63 6f 6d 6d 65 6e 74 20 61 70 70 65 61 72 73 20  comment appears 
1d00: 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  in the argument,
1d10: 20 74 68 65 6e 0a 20 20 2a 2a 20 6c 65 74 20 69   then.  ** let i
1d20: 74 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69  t through */.  i
1d30: 66 28 20 73 74 72 73 74 72 28 7a 2c 20 22 2f 2a  f( strstr(z, "/*
1d40: 73 61 66 65 2d 66 6f 72 2d 25 73 2a 2f 22 29 21  safe-for-%s*/")!
1d50: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  =0 ) return 1;..
1d60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1d70: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 69 6e 67 20  *.** Processing 
1d80: 66 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  flags.*/.#define
1d90: 20 46 4d 54 5f 4e 4f 5f 53 20 20 20 30 78 30 30   FMT_NO_S   0x00
1da0: 30 30 31 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  001     /* Do no
1db0: 74 20 61 6c 6c 6f 77 20 25 73 20 73 75 62 73 74  t allow %s subst
1dc0: 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 0a 2f 2a 0a  itutions */../*.
1dd0: 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20 69 6e 74  ** A list of int
1de0: 65 72 6e 61 6c 20 46 6f 73 73 69 6c 20 69 6e 74  ernal Fossil int
1df0: 65 72 66 61 63 65 73 20 74 68 61 74 20 74 61 6b  erfaces that tak
1e00: 65 20 61 20 70 72 69 6e 74 66 2d 73 74 79 6c 65  e a printf-style
1e10: 20 66 6f 72 6d 61 74 0a 2a 2a 20 73 74 72 69 6e   format.** strin
1e20: 67 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 7b 0a 20  g..*/.struct {. 
1e30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 4e   const char *zFN
1e40: 61 6d 65 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ame;    /* Name 
1e50: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
1e60: 2a 2f 0a 20 20 69 6e 74 20 69 46 6d 74 41 72 67  */.  int iFmtArg
1e70: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
1e80: 6e 64 65 78 20 6f 66 20 66 6f 72 6d 61 74 20 61  ndex of format a
1e90: 72 67 75 6d 65 6e 74 2e 20 20 4c 65 66 74 6d 6f  rgument.  Leftmo
1ea0: 73 74 20 69 73 20 31 2e 20 2a 2f 0a 20 20 75 6e  st is 1. */.  un
1eb0: 73 69 67 6e 65 64 20 66 6d 74 46 6c 61 67 73 3b  signed fmtFlags;
1ec0: 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69       /* Processi
1ed0: 6e 67 20 66 6c 61 67 73 20 2a 2f 0a 7d 20 61 46  ng flags */.} aF
1ee0: 6d 74 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20 7b  mtFunc[] = {.  {
1ef0: 20 22 61 64 6d 69 6e 5f 6c 6f 67 22 2c 20 20 20   "admin_log",   
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
1f10: 20 7d 2c 0a 20 20 7b 20 22 62 6c 6f 62 5f 61 70   },.  { "blob_ap
1f20: 70 65 6e 64 5f 73 71 6c 22 2c 20 20 20 20 20 20  pend_sql",      
1f30: 20 20 20 32 2c 20 46 4d 54 5f 4e 4f 5f 53 20 7d     2, FMT_NO_S }
1f40: 2c 0a 20 20 7b 20 22 62 6c 6f 62 5f 61 70 70 65  ,.  { "blob_appe
1f50: 6e 64 66 22 2c 20 20 20 20 20 20 20 20 20 20 20  ndf",           
1f60: 20 32 2c 20 30 20 7d 2c 0a 20 20 7b 20 22 63 67   2, 0 },.  { "cg
1f70: 69 5f 64 65 62 75 67 22 2c 20 20 20 20 20 20 20  i_debug",       
1f80: 20 20 20 20 20 20 20 20 31 2c 20 30 20 7d 2c 0a          1, 0 },.
1f90: 20 20 7b 20 22 63 67 69 5f 70 61 6e 69 63 22 2c    { "cgi_panic",
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
1fb0: 2c 20 30 20 7d 2c 0a 20 20 7b 20 22 63 67 69 5f  , 0 },.  { "cgi_
1fc0: 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20  printf",        
1fd0: 20 20 20 20 20 20 31 2c 20 30 20 7d 2c 0a 20 20        1, 0 },.  
1fe0: 7b 20 22 63 67 69 5f 72 65 64 69 72 65 63 74 66  { "cgi_redirectf
1ff0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ",           1, 
2000: 30 20 7d 2c 0a 20 20 7b 20 22 63 68 72 65 66 22  0 },.  { "chref"
2010: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2020: 20 20 20 20 32 2c 20 30 20 7d 2c 0a 20 20 7b 20      2, 0 },.  { 
2030: 22 64 62 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20  "db_blob",      
2040: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 46 4d             2, FM
2050: 54 5f 4e 4f 5f 53 20 7d 2c 0a 20 20 7b 20 22 64  T_NO_S },.  { "d
2060: 62 5f 64 65 62 75 67 22 2c 20 20 20 20 20 20 20  b_debug",       
2070: 20 20 20 20 20 20 20 20 20 31 2c 20 46 4d 54 5f           1, FMT_
2080: 4e 4f 5f 53 20 7d 2c 0a 20 20 7b 20 22 64 62 5f  NO_S },.  { "db_
2090: 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20  double",        
20a0: 20 20 20 20 20 20 20 32 2c 20 46 4d 54 5f 4e 4f         2, FMT_NO
20b0: 5f 53 20 7d 2c 0a 20 20 7b 20 22 64 62 5f 65 72  _S },.  { "db_er
20c0: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
20d0: 20 20 20 20 20 31 2c 20 30 20 7d 2c 0a 20 20 7b       1, 0 },.  {
20e0: 20 22 64 62 5f 65 78 69 73 74 73 22 2c 20 20 20   "db_exists",   
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 46              1, F
2100: 4d 54 5f 4e 4f 5f 53 20 7d 2c 0a 20 20 7b 20 22  MT_NO_S },.  { "
2110: 64 62 5f 67 65 74 5f 6d 70 72 69 6e 74 66 22 2c  db_get_mprintf",
2120: 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 20 7d            2, 0 }
2130: 2c 0a 20 20 7b 20 22 64 62 5f 69 6e 74 22 2c 20  ,.  { "db_int", 
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 32 2c 20 46 4d 54 5f 4e 4f 5f 53 20 7d 2c 0a   2, FMT_NO_S },.
2160: 20 20 7b 20 22 64 62 5f 69 6e 74 36 34 22 2c 20    { "db_int64", 
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
2180: 2c 20 46 4d 54 5f 4e 4f 5f 53 20 7d 2c 0a 20 20  , FMT_NO_S },.  
2190: 7b 20 22 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63  { "db_multi_exec
21a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ",           1, 
21b0: 46 4d 54 5f 4e 4f 5f 53 20 7d 2c 0a 20 20 7b 20  FMT_NO_S },.  { 
21c0: 22 64 62 5f 6f 70 74 69 6f 6e 61 6c 5f 73 71 6c  "db_optional_sql
21d0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 46 4d  ",         2, FM
21e0: 54 5f 4e 4f 5f 53 20 7d 2c 0a 20 20 7b 20 22 64  T_NO_S },.  { "d
21f0: 62 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20 20  b_prepare",     
2200: 20 20 20 20 20 20 20 20 20 32 2c 20 46 4d 54 5f           2, FMT_
2210: 4e 4f 5f 53 20 7d 2c 0a 20 20 7b 20 22 64 62 5f  NO_S },.  { "db_
2220: 70 72 65 70 61 72 65 5f 69 67 6e 6f 72 65 5f 65  prepare_ignore_e
2230: 72 72 6f 72 22 2c 20 32 2c 20 46 4d 54 5f 4e 4f  rror", 2, FMT_NO
2240: 5f 53 20 7d 2c 0a 20 20 7b 20 22 64 62 5f 73 65  _S },.  { "db_se
2250: 74 5f 6d 70 72 69 6e 74 66 22 2c 20 20 20 20 20  t_mprintf",     
2260: 20 20 20 20 20 33 2c 20 30 20 7d 2c 0a 20 20 7b       3, 0 },.  {
2270: 20 22 64 62 5f 73 74 61 74 69 63 5f 70 72 65 70   "db_static_prep
2280: 61 72 65 22 2c 20 20 20 20 20 20 20 32 2c 20 46  are",       2, F
2290: 4d 54 5f 4e 4f 5f 53 20 7d 2c 0a 20 20 7b 20 22  MT_NO_S },.  { "
22a0: 64 62 5f 74 65 78 74 22 2c 20 20 20 20 20 20 20  db_text",       
22b0: 20 20 20 20 20 20 20 20 20 20 32 2c 20 46 4d 54            2, FMT
22c0: 5f 4e 4f 5f 53 20 7d 2c 0a 20 20 7b 20 22 64 62  _NO_S },.  { "db
22d0: 5f 75 6e 73 65 74 5f 6d 70 72 69 6e 74 66 22 2c  _unset_mprintf",
22e0: 20 20 20 20 20 20 20 20 32 2c 20 30 20 7d 2c 0a          2, 0 },.
22f0: 20 20 7b 20 22 66 6f 72 6d 5f 62 65 67 69 6e 22    { "form_begin"
2300: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  ,              2
2310: 2c 20 30 20 7d 2c 0a 20 20 7b 20 22 66 6f 73 73  , 0 },.  { "foss
2320: 69 6c 5f 65 72 72 6f 72 22 2c 20 20 20 20 20 20  il_error",      
2330: 20 20 20 20 20 20 32 2c 20 30 20 7d 2c 0a 20 20        2, 0 },.  
2340: 7b 20 22 66 6f 73 73 69 6c 5f 65 72 72 6f 72 6c  { "fossil_errorl
2350: 6f 67 22 2c 20 20 20 20 20 20 20 20 20 31 2c 20  og",         1, 
2360: 30 20 7d 2c 0a 20 20 7b 20 22 66 6f 73 73 69 6c  0 },.  { "fossil
2370: 5f 66 61 74 61 6c 22 2c 20 20 20 20 20 20 20 20  _fatal",        
2380: 20 20 20 20 31 2c 20 30 20 7d 2c 0a 20 20 7b 20      1, 0 },.  { 
2390: 22 66 6f 73 73 69 6c 5f 66 61 74 61 6c 5f 72 65  "fossil_fatal_re
23a0: 63 75 72 73 69 76 65 22 2c 20 20 31 2c 20 30 20  cursive",  1, 0 
23b0: 7d 2c 0a 20 20 7b 20 22 66 6f 73 73 69 6c 5f 70  },.  { "fossil_p
23c0: 61 6e 69 63 22 2c 20 20 20 20 20 20 20 20 20 20  anic",          
23d0: 20 20 31 2c 20 30 20 7d 2c 0a 20 20 7b 20 22 66    1, 0 },.  { "f
23e0: 6f 73 73 69 6c 5f 70 72 69 6e 74 22 2c 20 20 20  ossil_print",   
23f0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 20 7d 2c           1, 0 },
2400: 0a 20 20 7b 20 22 66 6f 73 73 69 6c 5f 74 72 61  .  { "fossil_tra
2410: 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ce",            
2420: 31 2c 20 30 20 7d 2c 0a 20 20 7b 20 22 66 6f 73  1, 0 },.  { "fos
2430: 73 69 6c 5f 77 61 72 6e 69 6e 67 22 2c 20 20 20  sil_warning",   
2440: 20 20 20 20 20 20 20 31 2c 20 30 20 7d 2c 0a 20         1, 0 },. 
2450: 20 7b 20 22 68 72 65 66 22 2c 20 20 20 20 20 20   { "href",      
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
2470: 20 30 20 7d 2c 0a 20 20 7b 20 22 6a 73 6f 6e 5f   0 },.  { "json_
2480: 6e 65 77 5f 73 74 72 69 6e 67 5f 66 22 2c 20 20  new_string_f",  
2490: 20 20 20 20 20 31 2c 20 30 20 7d 2c 0a 20 20 7b       1, 0 },.  {
24a0: 20 22 6a 73 6f 6e 5f 73 65 74 5f 65 72 72 22 2c   "json_set_err",
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30              2, 0
24c0: 20 7d 2c 0a 20 20 7b 20 22 6a 73 6f 6e 5f 77 61   },.  { "json_wa
24d0: 72 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rn",            
24e0: 20 20 20 32 2c 20 30 20 7d 2c 0a 20 20 7b 20 22     2, 0 },.  { "
24f0: 6d 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20  mprintf",       
2500: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 20 7d            1, 0 }
2510: 2c 0a 20 20 7b 20 22 73 6f 63 6b 65 74 5f 73 65  ,.  { "socket_se
2520: 74 5f 65 72 72 6d 73 67 22 2c 20 20 20 20 20 20  t_errmsg",      
2530: 20 31 2c 20 30 20 7d 2c 0a 20 20 7b 20 22 73 73   1, 0 },.  { "ss
2540: 6c 5f 73 65 74 5f 65 72 72 6d 73 67 22 2c 20 20  l_set_errmsg",  
2550: 20 20 20 20 20 20 20 20 31 2c 20 30 20 7d 2c 0a          1, 0 },.
2560: 20 20 7b 20 22 73 74 79 6c 65 5f 68 65 61 64 65    { "style_heade
2570: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 31  r",            1
2580: 2c 20 30 20 7d 2c 0a 20 20 7b 20 22 73 74 79 6c  , 0 },.  { "styl
2590: 65 5f 73 65 74 5f 63 75 72 72 65 6e 74 5f 70 61  e_set_current_pa
25a0: 67 65 22 2c 20 20 31 2c 20 30 20 7d 2c 0a 20 20  ge",  1, 0 },.  
25b0: 7b 20 22 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75  { "style_submenu
25c0: 5f 65 6c 65 6d 65 6e 74 22 2c 20 20 20 32 2c 20  _element",   2, 
25d0: 30 20 7d 2c 0a 20 20 7b 20 22 73 74 79 6c 65 5f  0 },.  { "style_
25e0: 73 75 62 6d 65 6e 75 5f 73 71 6c 22 2c 20 20 20  submenu_sql",   
25f0: 20 20 20 20 33 2c 20 30 20 7d 2c 0a 20 20 7b 20      3, 0 },.  { 
2600: 22 77 65 62 70 61 67 65 5f 65 72 72 6f 72 22 2c  "webpage_error",
2610: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 20             1, 0 
2620: 7d 2c 0a 20 20 7b 20 22 78 68 72 65 66 22 2c 20  },.  { "xhref", 
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 32 2c 20 30 20 7d 2c 0a 7d 3b 0a 0a 2f 2a    2, 0 },.};../*
2650: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66  .** Determine if
2660: 20 74 68 65 20 69 6e 64 65 6e 74 69 66 69 65 72   the indentifier
2670: 20 7a 49 64 65 6e 74 20 6f 66 20 6c 65 6e 67 74   zIdent of lengt
2680: 68 20 6e 49 6e 64 65 6e 74 20 69 73 20 61 20 46  h nIndent is a F
2690: 6f 73 73 69 6c 0a 2a 2a 20 69 6e 74 65 72 6e 61  ossil.** interna
26a0: 6c 20 69 6e 74 65 72 66 61 63 65 20 74 68 61 74  l interface that
26b0: 20 75 73 65 73 20 61 20 70 72 69 6e 74 66 2d 73   uses a printf-s
26c0: 74 79 6c 65 20 61 72 67 75 6d 65 6e 74 2e 20 20  tyle argument.  
26d0: 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 6e  Return zero if n
26e0: 6f 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ot..** Return th
26f0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66  e index of the f
2700: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 69 66 20  ormat string if 
2710: 74 72 75 65 20 77 69 74 68 20 74 68 65 20 6c 65  true with the le
2720: 66 74 2d 6d 6f 73 74 0a 2a 2a 20 61 72 67 75 6d  ft-most.** argum
2730: 65 6e 74 20 68 61 76 69 6e 67 20 61 6e 20 69 6e  ent having an in
2740: 64 65 78 20 6f 66 20 31 2e 0a 2a 2f 0a 73 74 61  dex of 1..*/.sta
2750: 74 69 63 20 69 6e 74 20 69 73 46 6f 72 6d 61 74  tic int isFormat
2760: 46 75 6e 63 28 63 6f 6e 73 74 20 63 68 61 72 20  Func(const char 
2770: 2a 7a 49 64 65 6e 74 2c 20 69 6e 74 20 6e 49 64  *zIdent, int nId
2780: 65 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 2a 70  ent, unsigned *p
2790: 46 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 75 70  Flags){.  int up
27a0: 72 2c 20 6c 77 72 3b 0a 20 20 6c 77 72 20 3d 20  r, lwr;.  lwr = 
27b0: 30 3b 0a 20 20 75 70 72 20 3d 20 73 69 7a 65 6f  0;.  upr = sizeo
27c0: 66 28 61 46 6d 74 46 75 6e 63 29 2f 73 69 7a 65  f(aFmtFunc)/size
27d0: 6f 66 28 61 46 6d 74 46 75 6e 63 5b 30 5d 29 20  of(aFmtFunc[0]) 
27e0: 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  - 1;.  while( lw
27f0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 75 6e  r<=upr ){.    un
2800: 73 69 67 6e 65 64 20 78 20 3d 20 28 6c 77 72 20  signed x = (lwr 
2810: 2b 20 75 70 72 29 2f 32 3b 0a 20 20 20 20 69 6e  + upr)/2;.    in
2820: 74 20 63 20 3d 20 73 74 72 6e 63 6d 70 28 7a 49  t c = strncmp(zI
2830: 64 65 6e 74 2c 20 61 46 6d 74 46 75 6e 63 5b 78  dent, aFmtFunc[x
2840: 5d 2e 7a 46 4e 61 6d 65 2c 20 6e 49 64 65 6e 74  ].zFName, nIdent
2850: 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20  );.    if( c==0 
2860: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 46 6d  ){.      if( aFm
2870: 74 46 75 6e 63 5b 78 5d 2e 7a 46 4e 61 6d 65 5b  tFunc[x].zFName[
2880: 6e 49 64 65 6e 74 5d 3d 3d 30 20 29 7b 0a 20 20  nIdent]==0 ){.  
2890: 20 20 20 20 20 20 2a 70 46 6c 61 67 73 20 3d 20        *pFlags = 
28a0: 61 46 6d 74 46 75 6e 63 5b 78 5d 2e 66 6d 74 46  aFmtFunc[x].fmtF
28b0: 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 72 65  lags;.        re
28c0: 74 75 72 6e 20 61 46 6d 74 46 75 6e 63 5b 78 5d  turn aFmtFunc[x]
28d0: 2e 69 46 6d 74 41 72 67 3b 0a 20 20 20 20 20 20  .iFmtArg;.      
28e0: 7d 0a 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a  }.      c = -1;.
28f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3c      }.    if( c<
2900: 30 20 29 7b 0a 20 20 20 20 20 20 75 70 72 20 3d  0 ){.      upr =
2910: 20 78 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73   x - 1;.    }els
2920: 65 7b 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 78  e{.      lwr = x
2930: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2940: 20 20 2a 70 46 6c 61 67 73 20 3d 20 30 3b 0a 20    *pFlags = 0;. 
2950: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2960: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65  .** Return the e
2970: 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f  xpected number o
2980: 66 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  f arguments for 
2990: 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  the format strin
29a0: 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 31 20  g..** Return -1 
29b0: 69 66 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e  if the value can
29c0: 6e 6f 74 20 62 65 20 63 6f 6d 70 75 74 65 64 2e  not be computed.
29d0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
29e0: 61 72 67 75 6d 65 6e 74 20 6c 65 73 73 20 74 68  argument less th
29f0: 61 6e 20 6e 54 79 70 65 2c 20 73 74 6f 72 65 20  an nType, store 
2a00: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 63  the conversion c
2a10: 68 61 72 61 63 74 65 72 0a 2a 2a 20 66 6f 72 20  haracter.** for 
2a20: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 6e  that argument in
2a30: 20 63 54 79 70 65 5b 69 5d 2e 0a 2a 2f 0a 73 74   cType[i]..*/.st
2a40: 61 74 69 63 20 69 6e 74 20 66 6f 72 6d 61 74 41  atic int formatA
2a50: 72 67 43 6f 75 6e 74 28 63 6f 6e 73 74 20 63 68  rgCount(const ch
2a60: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 54 79 70 65  ar *z, int nType
2a70: 2c 20 63 68 61 72 20 2a 63 54 79 70 65 29 7b 0a  , char *cType){.
2a80: 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a    int nArg = 0;.
2a90: 20 20 69 6e 74 20 69 2c 20 6b 3b 0a 20 20 69 6e    int i, k;.  in
2aa0: 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 65 54 79  t len;.  int eTy
2ab0: 70 65 3b 0a 20 20 69 6e 74 20 6c 6e 20 3d 20 30  pe;.  int ln = 0
2ac0: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20  ;.  while( z[0] 
2ad0: 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 74 6f 6b  ){.    len = tok
2ae0: 65 6e 5f 6c 65 6e 67 74 68 28 7a 2c 20 26 65 54  en_length(z, &eT
2af0: 79 70 65 2c 20 26 6c 6e 29 3b 0a 20 20 20 20 69  ype, &ln);.    i
2b00: 66 28 20 65 54 79 70 65 3d 3d 54 4b 5f 53 54 52  f( eType==TK_STR
2b10: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
2b20: 31 3b 20 69 3c 6c 65 6e 2d 31 3b 20 69 2b 2b 29  1; i<len-1; i++)
2b30: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
2b40: 69 5d 21 3d 27 25 27 20 29 20 63 6f 6e 74 69 6e  i]!='%' ) contin
2b50: 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
2b60: 7a 5b 69 2b 31 5d 3d 3d 27 25 27 20 29 7b 20 69  z[i+1]=='%' ){ i
2b70: 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a  ++; continue; }.
2b80: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 69 2b          for(k=i+
2b90: 31 3b 20 6b 3c 6c 65 6e 20 26 26 20 21 69 73 61  1; k<len && !isa
2ba0: 6c 70 68 61 28 7a 5b 6b 5d 29 3b 20 6b 2b 2b 29  lpha(z[k]); k++)
2bb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2bc0: 7a 5b 6b 5d 3d 3d 27 2a 27 20 7c 7c 20 7a 5b 6b  z[k]=='*' || z[k
2bd0: 5d 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  ]=='#' ){.      
2be0: 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 6e        if( nArg<n
2bf0: 54 79 70 65 20 29 20 63 54 79 70 65 5b 6e 41 72  Type ) cType[nAr
2c00: 67 5d 20 3d 20 7a 5b 6b 5d 3b 0a 20 20 20 20 20  g] = z[k];.     
2c10: 20 20 20 20 20 20 20 6e 41 72 67 2b 2b 3b 0a 20         nArg++;. 
2c20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2c40: 20 7a 5b 6b 5d 21 3d 27 52 27 20 29 7b 0a 20 20   z[k]!='R' ){.  
2c50: 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67          if( nArg
2c60: 3c 6e 54 79 70 65 20 29 20 63 54 79 70 65 5b 6e  <nType ) cType[n
2c70: 41 72 67 5d 20 3d 20 7a 5b 6b 5d 3b 0a 20 20 20  Arg] = z[k];.   
2c80: 20 20 20 20 20 20 20 6e 41 72 67 2b 2b 3b 0a 20         nArg++;. 
2c90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20  .    }.    z += 
2cb0: 6c 65 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  len;.  }.  retur
2cc0: 6e 20 6e 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nArg;.}../*.**
2cd0: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61   The function ca
2ce0: 6c 6c 20 74 68 61 74 20 62 65 67 69 6e 73 20 61  ll that begins a
2cf0: 74 20 7a 46 43 61 6c 6c 5b 30 5d 20 28 77 68 69  t zFCall[0] (whi
2d00: 63 68 20 69 73 20 6f 6e 20 6c 69 6e 65 20 6c 6e  ch is on line ln
2d10: 46 43 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  FCall of the.** 
2d20: 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 29 20 69  original file) i
2d30: 73 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  s a function tha
2d40: 74 20 75 73 65 73 20 61 20 70 72 69 6e 74 66 2d  t uses a printf-
2d50: 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74 72  style format str
2d60: 69 6e 67 0a 2a 2a 20 6f 6e 20 61 72 67 75 6d 65  ing.** on argume
2d70: 6e 74 20 6e 75 6d 62 65 72 20 66 6d 74 41 72 67  nt number fmtArg
2d80: 2e 20 20 49 74 20 68 61 73 20 70 72 6f 63 65 73  .  It has proces
2d90: 73 69 6e 67 73 20 66 6c 61 67 73 20 66 6d 74 46  sings flags fmtF
2da0: 6c 61 67 73 2e 20 20 44 6f 0a 2a 2a 20 63 6f 6d  lags.  Do.** com
2db0: 70 69 6c 65 2d 74 69 6d 65 20 63 68 65 63 6b 69  pile-time checki
2dc0: 6e 67 20 6f 6e 20 74 68 69 73 20 66 75 6e 63 74  ng on this funct
2dd0: 69 6f 6e 2c 20 6f 75 74 70 75 74 20 61 6e 79 20  ion, output any 
2de0: 65 72 72 6f 72 73 2c 20 61 6e 64 20 72 65 74 75  errors, and retu
2df0: 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
2e00: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73   of errors..*/.s
2e10: 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46  tatic int checkF
2e20: 6f 72 6d 61 74 46 75 6e 63 28 0a 20 20 63 6f 6e  ormatFunc(.  con
2e30: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2e40: 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  me, /* Name of t
2e50: 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 70 72  he file being pr
2e60: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ocessed */.  con
2e70: 73 74 20 63 68 61 72 20 2a 7a 46 43 61 6c 6c 2c  st char *zFCall,
2e80: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2e90: 6f 20 73 74 61 72 74 20 6f 66 20 66 75 6e 63 74  o start of funct
2ea0: 69 6f 6e 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e  ion call */.  in
2eb0: 74 20 6c 6e 46 43 61 6c 6c 2c 20 20 20 20 20 20  t lnFCall,      
2ec0: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
2ed0: 62 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 7a  ber that holds z
2ee0: 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 66 6d 74  [0] */.  int fmt
2ef0: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
2f00: 2f 2a 20 46 6f 72 6d 61 74 20 73 74 72 69 6e 67  /* Format string
2f10: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 69 73 20   should be this 
2f20: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  argument */.  in
2f30: 74 20 66 6d 74 46 6c 61 67 73 20 20 20 20 20 20  t fmtFlags      
2f40: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72       /* Extra pr
2f50: 6f 63 65 73 73 69 6e 67 20 66 6c 61 67 73 20 2a  ocessing flags *
2f60: 2f 0a 29 7b 0a 20 20 69 6e 74 20 73 7a 46 4e 61  /.){.  int szFNa
2f70: 6d 65 3b 0a 20 20 69 6e 74 20 65 54 6f 6b 65 6e  me;.  int eToken
2f80: 3b 0a 20 20 69 6e 74 20 6c 6e 20 3d 20 6c 6e 46  ;.  int ln = lnF
2f90: 43 61 6c 6c 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  Call;.  int len;
2fa0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2fb0: 53 74 61 72 74 3b 0a 20 20 63 68 61 72 20 2a 7a  Start;.  char *z
2fc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 3b  ;.  char *zCopy;
2fd0: 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b  .  int nArg = 0;
2fe0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
2ff0: 61 7a 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74  azArg = 0;.  int
3000: 20 69 2c 20 6b 3b 0a 20 20 69 6e 74 20 6e 45 72   i, k;.  int nEr
3010: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61  r = 0;.  char *a
3020: 63 54 79 70 65 3b 0a 0a 20 20 73 7a 46 4e 61 6d  cType;..  szFNam
3030: 65 20 3d 20 74 6f 6b 65 6e 5f 6c 65 6e 67 74 68  e = token_length
3040: 28 7a 46 43 61 6c 6c 2c 20 26 65 54 6f 6b 65 6e  (zFCall, &eToken
3050: 2c 20 26 6c 6e 29 3b 0a 20 20 7a 53 74 61 72 74  , &ln);.  zStart
3060: 20 3d 20 6e 65 78 74 5f 6e 6f 6e 5f 77 68 69 74   = next_non_whit
3070: 65 73 70 61 63 65 28 7a 46 43 61 6c 6c 2b 73 7a  espace(zFCall+sz
3080: 46 4e 61 6d 65 2c 20 26 6c 65 6e 2c 20 26 65 54  FName, &len, &eT
3090: 6f 6b 65 6e 29 3b 0a 20 20 61 73 73 65 72 74 28  oken);.  assert(
30a0: 20 7a 53 74 61 72 74 5b 30 5d 3d 3d 27 28 27 20   zStart[0]=='(' 
30b0: 26 26 20 6c 65 6e 3d 3d 31 20 29 3b 0a 20 20 6c  && len==1 );.  l
30c0: 65 6e 20 3d 20 64 69 73 74 61 6e 63 65 5f 74 6f  en = distance_to
30d0: 28 7a 53 74 61 72 74 2b 31 2c 20 27 29 27 29 3b  (zStart+1, ')');
30e0: 0a 20 20 7a 43 6f 70 79 20 3d 20 73 61 66 65 5f  .  zCopy = safe_
30f0: 6d 61 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  malloc( len + 1 
3100: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70  );.  memcpy(zCop
3110: 79 2c 20 7a 53 74 61 72 74 2b 31 2c 20 6c 65 6e  y, zStart+1, len
3120: 29 3b 0a 20 20 7a 43 6f 70 79 5b 6c 65 6e 5d 20  );.  zCopy[len] 
3130: 3d 20 30 3b 0a 20 20 61 7a 41 72 67 20 3d 20 30  = 0;.  azArg = 0
3140: 3b 0a 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20  ;.  nArg = 0;.  
3150: 7a 20 3d 20 7a 43 6f 70 79 3b 0a 20 20 77 68 69  z = zCopy;.  whi
3160: 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  le( z[0] ){.    
3170: 6c 65 6e 20 3d 20 64 69 73 74 61 6e 63 65 5f 74  len = distance_t
3180: 6f 28 7a 2c 20 27 2c 27 29 3b 0a 20 20 20 20 61  o(z, ',');.    a
3190: 7a 41 72 67 20 3d 20 73 61 66 65 5f 72 65 61 6c  zArg = safe_real
31a0: 6c 6f 63 28 28 63 68 61 72 2a 29 61 7a 41 72 67  loc((char*)azArg
31b0: 2c 20 28 73 69 7a 65 6f 66 28 61 7a 41 72 67 5b  , (sizeof(azArg[
31c0: 30 5d 29 2b 31 29 2a 28 6e 41 72 67 2b 31 29 29  0])+1)*(nArg+1))
31d0: 3b 0a 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67  ;.    azArg[nArg
31e0: 2b 2b 5d 20 3d 20 73 6b 69 70 5f 73 70 61 63 65  ++] = skip_space
31f0: 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b 6c  (z);.    if( z[l
3200: 65 6e 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  en]==0 ) break;.
3210: 20 20 20 20 7a 5b 6c 65 6e 5d 20 3d 20 30 3b 0a      z[len] = 0;.
3220: 20 20 20 20 66 6f 72 28 69 3d 6c 65 6e 2d 31 3b      for(i=len-1;
3230: 20 69 3e 30 20 26 26 20 69 73 73 70 61 63 65 28   i>0 && isspace(
3240: 7a 5b 69 5d 29 3b 20 69 2d 2d 29 7b 20 7a 5b 69  z[i]); i--){ z[i
3250: 5d 20 3d 20 30 3b 20 7d 0a 20 20 20 20 7a 20 2b  ] = 0; }.    z +
3260: 3d 20 6c 65 6e 20 2b 20 31 3b 0a 20 20 7d 0a 20  = len + 1;.  }. 
3270: 20 61 63 54 79 70 65 20 3d 20 28 63 68 61 72 2a   acType = (char*
3280: 29 26 61 7a 41 72 67 5b 6e 41 72 67 5d 3b 0a 20  )&azArg[nArg];. 
3290: 20 69 66 28 20 66 6d 74 41 72 67 3e 6e 41 72 67   if( fmtArg>nArg
32a0: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
32b0: 25 73 3a 25 64 3a 20 74 6f 6f 20 66 65 77 20 61  %s:%d: too few a
32c0: 72 67 75 6d 65 6e 74 73 20 74 6f 20 25 2e 2a 73  rguments to %.*s
32d0: 28 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ()\n",.         
32e0: 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6c 6e 46    zFilename, lnF
32f0: 43 61 6c 6c 2c 20 73 7a 46 4e 61 6d 65 2c 20 7a  Call, szFName, z
3300: 46 43 61 6c 6c 29 3b 0a 20 20 20 20 6e 45 72 72  FCall);.    nErr
3310: 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
3320: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
3330: 74 20 3d 20 61 7a 41 72 67 5b 66 6d 74 41 72 67  t = azArg[fmtArg
3340: 2d 31 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  -1];.    const c
3350: 68 61 72 20 2a 7a 4f 76 65 72 72 69 64 65 20 3d  har *zOverride =
3360: 20 73 74 72 73 74 72 28 7a 46 6d 74 2c 20 22 2f   strstr(zFmt, "/
3370: 2a 77 6f 72 6b 73 2d 6c 69 6b 65 3a 22 29 3b 0a  *works-like:");.
3380: 20 20 20 20 69 66 28 20 7a 4f 76 65 72 72 69 64      if( zOverrid
3390: 65 20 29 20 7a 46 6d 74 20 3d 20 7a 4f 76 65 72  e ) zFmt = zOver
33a0: 72 69 64 65 20 2b 20 73 69 7a 65 6f 66 28 22 2f  ride + sizeof("/
33b0: 2a 77 6f 72 6b 73 2d 6c 69 6b 65 3a 22 29 2d 31  *works-like:")-1
33c0: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 5f 73 74  ;.    if( !is_st
33d0: 72 69 6e 67 5f 6c 69 74 28 7a 46 6d 74 29 20 29  ring_lit(zFmt) )
33e0: 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  {.      printf("
33f0: 25 73 3a 25 64 3a 20 25 2e 2a 73 28 29 20 68 61  %s:%d: %.*s() ha
3400: 73 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 66  s non-constant f
3410: 6f 72 6d 61 74 20 6f 6e 20 61 72 67 5b 25 64 5d  ormat on arg[%d]
3420: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
3430: 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6c 6e 46    zFilename, lnF
3440: 43 61 6c 6c 2c 20 73 7a 46 4e 61 6d 65 2c 20 7a  Call, szFName, z
3450: 46 43 61 6c 6c 2c 20 66 6d 74 41 72 67 2d 31 29  FCall, fmtArg-1)
3460: 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
3470: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6b      }else if( (k
3480: 20 3d 20 66 6f 72 6d 61 74 41 72 67 43 6f 75 6e   = formatArgCoun
3490: 74 28 7a 46 6d 74 2c 20 6e 41 72 67 2c 20 61 63  t(zFmt, nArg, ac
34a0: 54 79 70 65 29 29 3e 3d 30 0a 20 20 20 20 20 20  Type))>=0.      
34b0: 20 20 20 20 20 20 20 26 26 20 6e 41 72 67 21 3d         && nArg!=
34c0: 66 6d 74 41 72 67 2b 6b 20 29 7b 0a 20 20 20 20  fmtArg+k ){.    
34d0: 20 20 70 72 69 6e 74 66 28 22 25 73 3a 25 64 3a    printf("%s:%d:
34e0: 20 74 6f 6f 20 25 73 20 61 72 67 75 6d 65 6e 74   too %s argument
34f0: 73 20 74 6f 20 25 2e 2a 73 28 29 20 22 0a 20 20  s to %.*s() ".  
3500: 20 20 20 20 20 20 20 20 20 20 20 22 2d 20 67 6f             "- go
3510: 74 20 25 64 20 61 6e 64 20 65 78 70 65 63 74 65  t %d and expecte
3520: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %d\n",.       
3530: 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c        zFilename,
3540: 20 6c 6e 46 43 61 6c 6c 2c 20 28 6e 41 72 67 3c   lnFCall, (nArg<
3550: 66 6d 74 41 72 67 2b 6b 20 3f 20 22 66 65 77 22  fmtArg+k ? "few"
3560: 20 3a 20 22 6d 61 6e 79 22 29 2c 0a 20 20 20 20   : "many"),.    
3570: 20 20 20 20 20 20 20 20 20 73 7a 46 4e 61 6d 65           szFName
3580: 2c 20 7a 46 43 61 6c 6c 2c 20 6e 41 72 67 2c 20  , zFCall, nArg, 
3590: 66 6d 74 41 72 67 2b 6b 29 3b 0a 20 20 20 20 20  fmtArg+k);.     
35a0: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 65 6c   nErr++;.    }el
35b0: 73 65 20 69 66 28 20 66 6d 74 46 6c 61 67 73 20  se if( fmtFlags 
35c0: 26 20 46 4d 54 5f 4e 4f 5f 53 20 29 7b 0a 20 20  & FMT_NO_S ){.  
35d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
35e0: 41 72 67 20 26 26 20 69 3c 6b 3b 20 69 2b 2b 29  Arg && i<k; i++)
35f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61  {.        if( (a
3600: 63 54 79 70 65 5b 69 5d 3d 3d 27 73 27 20 7c 7c  cType[i]=='s' ||
3610: 20 61 63 54 79 70 65 5b 69 5d 3d 3d 27 7a 27 20   acType[i]=='z' 
3620: 7c 7c 20 61 63 54 79 70 65 5b 69 5d 3d 3d 27 62  || acType[i]=='b
3630: 27 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 21  ').         && !
3640: 69 73 5f 73 5f 73 61 66 65 28 61 7a 41 72 67 5b  is_s_safe(azArg[
3650: 66 6d 74 41 72 67 2b 69 5d 29 0a 20 20 20 20 20  fmtArg+i]).     
3660: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
3670: 20 70 72 69 6e 74 66 28 22 25 73 3a 25 64 3a 20   printf("%s:%d: 
3680: 41 72 67 75 6d 65 6e 74 20 25 64 20 74 6f 20 25  Argument %d to %
3690: 2e 2a 73 28 29 20 6e 6f 74 20 73 61 66 65 20 66  .*s() not safe f
36a0: 6f 72 20 53 51 4c 5c 6e 22 2c 0a 20 20 20 20 20  or SQL\n",.     
36b0: 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
36c0: 65 2c 20 6c 6e 46 43 61 6c 6c 2c 20 69 2b 66 6d  e, lnFCall, i+fm
36d0: 74 41 72 67 2c 20 73 7a 46 4e 61 6d 65 2c 20 7a  tArg, szFName, z
36e0: 46 43 61 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  FCall);.        
36f0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
3700: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3710: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 45 72   }.  }.  if( nEr
3720: 72 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  r ){.    for(i=0
3730: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
3740: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 20        printf("  
3750: 20 61 72 67 5b 25 64 5d 3a 20 25 73 5c 6e 22 2c   arg[%d]: %s\n",
3760: 20 69 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20   i, azArg[i]);. 
3770: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 72 65 65     }.  }..  free
3780: 28 28 63 68 61 72 2a 29 61 7a 41 72 67 29 3b 0a  ((char*)azArg);.
3790: 20 20 66 72 65 65 28 7a 43 6f 70 79 29 3b 0a 20    free(zCopy);. 
37a0: 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a   return nErr;.}.
37b0: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 73  ../*.** Do a des
37c0: 69 67 6e 2d 72 75 6c 65 20 63 68 65 63 6b 20 6f  ign-rule check o
37d0: 66 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 73  f format strings
37e0: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 6e 61   for the file na
37f0: 6d 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20 77 69 74  med zName.** wit
3800: 68 20 63 6f 6e 74 65 6e 74 20 7a 43 6f 6e 74 65  h content zConte
3810: 6e 74 2e 20 20 57 72 69 74 65 20 65 72 72 6f 72  nt.  Write error
3820: 73 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f 75  s on standard ou
3830: 74 70 75 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  tput.  Return.**
3840: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
3850: 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrors..*/.static
3860: 20 69 6e 74 20 73 63 61 6e 5f 66 69 6c 65 28 63   int scan_file(c
3870: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
3880: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  , const char *zC
3890: 6f 6e 74 65 6e 74 29 7b 0a 20 20 63 6f 6e 73 74  ontent){.  const
38a0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
38b0: 6c 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 7a  ln = 0;.  int sz
38c0: 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 65 54 6f  Token;.  int eTo
38d0: 6b 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ken;.  const cha
38e0: 72 20 2a 7a 50 72 65 76 20 3d 20 30 3b 0a 20 20  r *zPrev = 0;.  
38f0: 69 6e 74 20 65 50 72 65 76 20 3d 20 30 3b 0a 20  int ePrev = 0;. 
3900: 20 69 6e 74 20 73 7a 50 72 65 76 20 3d 20 30 3b   int szPrev = 0;
3910: 0a 20 20 69 6e 74 20 6c 6e 50 72 65 76 20 3d 20  .  int lnPrev = 
3920: 30 3b 0a 20 20 69 6e 74 20 6e 43 75 72 6c 79 20  0;.  int nCurly 
3930: 3d 20 30 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20  = 0;.  int x;.  
3940: 75 6e 73 69 67 6e 65 64 20 66 6d 74 46 6c 61 67  unsigned fmtFlag
3950: 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 45 72  s = 0;.  int nEr
3960: 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 7a 43  r = 0;..  if( zC
3970: 6f 6e 74 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  ontent==0 ){.   
3980: 20 70 72 69 6e 74 66 28 22 63 61 6e 6e 6f 74 20   printf("cannot 
3990: 72 65 61 64 20 66 69 6c 65 3a 20 25 73 5c 6e 22  read file: %s\n"
39a0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
39b0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 66 6f  turn 1;.  }.  fo
39c0: 72 28 7a 3d 7a 43 6f 6e 74 65 6e 74 3b 20 7a 5b  r(z=zContent; z[
39d0: 30 5d 3b 20 7a 20 2b 3d 20 73 7a 54 6f 6b 65 6e  0]; z += szToken
39e0: 29 7b 0a 20 20 20 20 73 7a 54 6f 6b 65 6e 20 3d  ){.    szToken =
39f0: 20 74 6f 6b 65 6e 5f 6c 65 6e 67 74 68 28 7a 2c   token_length(z,
3a00: 20 26 65 54 6f 6b 65 6e 2c 20 26 6c 6e 29 3b 0a   &eToken, &ln);.
3a10: 20 20 20 20 69 66 28 20 65 54 6f 6b 65 6e 3d 3d      if( eToken==
3a20: 54 4b 5f 53 50 41 43 45 20 29 20 63 6f 6e 74 69  TK_SPACE ) conti
3a30: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 65 54 6f  nue;.    if( eTo
3a40: 6b 65 6e 3d 3d 54 4b 5f 4f 54 48 45 52 20 29 7b  ken==TK_OTHER ){
3a50: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  .      if( z[0]=
3a60: 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='{' ){.        
3a70: 6e 43 75 72 6c 79 2b 2b 3b 0a 20 20 20 20 20 20  nCurly++;.      
3a80: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d  }else if( z[0]==
3a90: 27 7d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  '}' ){.        n
3aa0: 43 75 72 6c 79 2d 2d 3b 0a 20 20 20 20 20 20 7d  Curly--;.      }
3ab0: 65 6c 73 65 20 69 66 28 20 6e 43 75 72 6c 79 3e  else if( nCurly>
3ac0: 30 20 26 26 20 7a 5b 30 5d 3d 3d 27 28 27 20 26  0 && z[0]=='(' &
3ad0: 26 20 65 50 72 65 76 3d 3d 54 4b 5f 49 44 0a 20  & ePrev==TK_ID. 
3ae0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 78             && (x
3af0: 20 3d 20 69 73 46 6f 72 6d 61 74 46 75 6e 63 28   = isFormatFunc(
3b00: 7a 50 72 65 76 2c 73 7a 50 72 65 76 2c 26 66 6d  zPrev,szPrev,&fm
3b10: 74 46 6c 61 67 73 29 29 3e 30 20 29 7b 0a 20 20  tFlags))>0 ){.  
3b20: 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 63 68        nErr += ch
3b30: 65 63 6b 46 6f 72 6d 61 74 46 75 6e 63 28 7a 4e  eckFormatFunc(zN
3b40: 61 6d 65 2c 20 7a 50 72 65 76 2c 20 6c 6e 50 72  ame, zPrev, lnPr
3b50: 65 76 2c 20 78 2c 20 66 6d 74 46 6c 61 67 73 29  ev, x, fmtFlags)
3b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3b70: 20 20 20 20 7a 50 72 65 76 20 3d 20 7a 3b 0a 20      zPrev = z;. 
3b80: 20 20 20 65 50 72 65 76 20 3d 20 65 54 6f 6b 65     ePrev = eToke
3b90: 6e 3b 0a 20 20 20 20 73 7a 50 72 65 76 20 3d 20  n;.    szPrev = 
3ba0: 73 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 6c 6e 50  szToken;.    lnP
3bb0: 72 65 76 20 3d 20 6c 6e 3b 0a 20 20 7d 0a 20 20  rev = ln;.  }.  
3bc0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a  return nErr;.}..
3bd0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 66 6f 72 20  /*.** Check for 
3be0: 66 6f 72 6d 61 74 2d 73 74 72 69 6e 67 20 64 65  format-string de
3bf0: 73 69 67 6e 20 72 75 6c 65 20 76 69 6f 6c 61 74  sign rule violat
3c00: 69 6f 6e 73 20 6f 6e 20 61 6c 6c 20 66 69 6c 65  ions on all file
3c10: 73 20 6c 69 73 74 65 64 0a 2a 2a 20 6f 6e 20 74  s listed.** on t
3c20: 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2e  he command-line.
3c30: 0a 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74  .*/.int main(int
3c40: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
3c50: 67 76 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gv){.  int i;.  
3c60: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20  int nErr = 0;.  
3c70: 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b  for(i=1; i<argc;
3c80: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
3c90: 2a 7a 46 69 6c 65 20 3d 20 72 65 61 64 5f 66 69  *zFile = read_fi
3ca0: 6c 65 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  le(argv[i]);.   
3cb0: 20 6e 45 72 72 20 2b 3d 20 73 63 61 6e 5f 66 69   nErr += scan_fi
3cc0: 6c 65 28 61 72 67 76 5b 69 5d 2c 20 7a 46 69 6c  le(argv[i], zFil
3cd0: 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 69  e);.    free(zFi
3ce0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  le);.  }.  retur
3cf0: 6e 20 6e 45 72 72 3b 0a 7d 0a                    n nErr;.}.