Artifact ed76b2c22bbe64950d229d720cd6e1f83bb918b22f46c01115339575ef6b3520:

  • File src/codecheck1.c — part of check-in [4f2c9841] at 2017-12-05 01:05:25 on branch main.js — Anti-robot defenses are now CSP-safe. (user: drh size: 15053) [more...]

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 2a 70 54 79  rn i;.  }.  *pTy
0fa0: 70 65 20 3d 20 54 4b 5f 4f 54 48 45 52 3b 0a 20  pe = TK_OTHER;. 
0fb0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
0fc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
0fd0: 65 78 74 20 6e 6f 6e 2d 77 68 69 74 65 73 70 61  ext non-whitespa
0fe0: 63 65 20 74 6f 6b 65 6e 0a 2a 2f 0a 63 6f 6e 73  ce token.*/.cons
0ff0: 74 20 63 68 61 72 20 2a 6e 65 78 74 5f 6e 6f 6e  t char *next_non
1000: 5f 77 68 69 74 65 73 70 61 63 65 28 63 6f 6e 73  _whitespace(cons
1010: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t char *z, int *
1020: 70 4c 65 6e 2c 20 69 6e 74 20 2a 70 54 79 70 65  pLen, int *pType
1030: 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  ){.  int len;.  
1040: 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 69 6e 74  int eType;.  int
1050: 20 6c 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65   ln = 0;.  while
1060: 28 20 28 6c 65 6e 20 3d 20 74 6f 6b 65 6e 5f 6c  ( (len = token_l
1070: 65 6e 67 74 68 28 7a 2c 20 26 65 54 79 70 65 2c  ength(z, &eType,
1080: 20 26 6c 6e 29 29 3e 30 20 26 26 20 65 54 79 70   &ln))>0 && eTyp
1090: 65 3d 3d 54 4b 5f 53 50 41 43 45 20 29 7b 0a 20  e==TK_SPACE ){. 
10a0: 20 20 20 7a 20 2b 3d 20 6c 65 6e 3b 0a 20 20 7d     z += len;.  }
10b0: 0a 20 20 2a 70 4c 65 6e 20 3d 20 6c 65 6e 3b 0a  .  *pLen = len;.
10c0: 20 20 2a 70 54 79 70 65 20 3d 20 65 54 79 70 65    *pType = eType
10d0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
10e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 69 6e  ./*.** Return in
10f0: 64 65 78 20 69 6e 74 6f 20 7a 5b 5d 20 66 6f 72  dex into z[] for
1100: 20 74 68 65 20 66 69 72 73 74 20 62 61 6c 61 6e   the first balan
1110: 63 65 64 20 54 4b 5f 4f 54 48 45 52 20 74 6f 6b  ced TK_OTHER tok
1120: 65 6e 20 77 69 74 68 0a 2a 2a 20 76 61 6c 75 65  en with.** value
1130: 20 63 56 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74   cValue..*/.stat
1140: 69 63 20 69 6e 74 20 64 69 73 74 61 6e 63 65 5f  ic int distance_
1150: 74 6f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  to(const char *z
1160: 2c 20 63 68 61 72 20 63 56 61 6c 29 7b 0a 20 20  , char cVal){.  
1170: 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64  int len;.  int d
1180: 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65  ist = 0;.  int e
1190: 54 79 70 65 3b 0a 20 20 69 6e 74 20 6e 4e 65 73  Type;.  int nNes
11a0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 6e 20  t = 0;.  int ln 
11b0: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b  = 0;.  while( z[
11c0: 30 5d 20 26 26 20 28 6c 65 6e 20 3d 20 74 6f 6b  0] && (len = tok
11d0: 65 6e 5f 6c 65 6e 67 74 68 28 7a 2c 20 26 65 54  en_length(z, &eT
11e0: 79 70 65 2c 20 26 6c 6e 29 29 3e 30 20 29 7b 0a  ype, &ln))>0 ){.
11f0: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 54      if( eType==T
1200: 4b 5f 4f 54 48 45 52 20 29 7b 0a 20 20 20 20 20  K_OTHER ){.     
1210: 20 69 66 28 20 7a 5b 30 5d 3d 3d 63 56 61 6c 20   if( z[0]==cVal 
1220: 26 26 20 6e 4e 65 73 74 3d 3d 30 20 29 7b 0a 20  && nNest==0 ){. 
1230: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1240: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
1250: 30 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20  0]=='(' ){.     
1260: 20 20 20 6e 4e 65 73 74 2b 2b 3b 0a 20 20 20 20     nNest++;.    
1270: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d    }else if( z[0]
1280: 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20  ==')' ){.       
1290: 20 6e 4e 65 73 74 2d 2d 3b 0a 20 20 20 20 20 20   nNest--;.      
12a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 69 73 74  }.    }.    dist
12b0: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 7a 20 2b   += len;.    z +
12c0: 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  = len;.  }.  ret
12d0: 75 72 6e 20 64 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dist;.}../*.
12e0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
12f0: 72 73 74 20 6e 6f 6e 2d 77 68 69 74 65 73 70 61  rst non-whitespa
1300: 63 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  ce characters in
1310: 20 7a 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 63   z[].*/.static c
1320: 6f 6e 73 74 20 63 68 61 72 20 2a 73 6b 69 70 5f  onst char *skip_
1330: 73 70 61 63 65 28 63 6f 6e 73 74 20 63 68 61 72  space(const char
1340: 20 2a 7a 29 7b 0a 20 20 77 68 69 6c 65 28 20 69   *z){.  while( i
1350: 73 73 70 61 63 65 28 7a 5b 30 5d 29 20 29 7b 20  sspace(z[0]) ){ 
1360: 7a 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20  z++; }.  return 
1370: 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  z;.}../*.** Retu
1380: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
1390: 6e 70 75 74 20 69 73 20 61 20 73 74 72 69 6e 67  nput is a string
13a0: 20 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a 73 74 61   literal..*/.sta
13b0: 74 69 63 20 69 6e 74 20 69 73 5f 73 74 72 69 6e  tic int is_strin
13c0: 67 5f 6c 69 74 28 63 6f 6e 73 74 20 63 68 61 72  g_lit(const char
13d0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 75 31 2c   *z){.  int nu1,
13e0: 20 6e 75 32 3b 0a 20 20 7a 20 3d 20 6e 65 78 74   nu2;.  z = next
13f0: 5f 6e 6f 6e 5f 77 68 69 74 65 73 70 61 63 65 28  _non_whitespace(
1400: 7a 2c 20 26 6e 75 31 2c 20 26 6e 75 32 29 3b 0a  z, &nu1, &nu2);.
1410: 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 3d 3d 27    return z[0]=='
1420: 22 27 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  "';.}../*.** Ret
1430: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
1440: 69 6e 70 75 74 20 69 73 20 61 6e 20 65 78 70 72  input is an expr
1450: 65 73 73 69 6f 6e 20 6f 66 20 73 74 72 69 6e 67  ession of string
1460: 20 6c 69 74 65 72 61 6c 73 3a 0a 2a 2a 0a 2a 2a   literals:.**.**
1470: 20 20 20 20 20 20 45 58 50 52 20 3f 20 22 2e 2e        EXPR ? "..
1480: 2e 22 20 3a 20 22 2e 2e 2e 22 0a 2a 2f 0a 73 74  ." : "...".*/.st
1490: 61 74 69 63 20 69 6e 74 20 69 73 5f 73 74 72 69  atic int is_stri
14a0: 6e 67 5f 65 78 70 72 28 63 6f 6e 73 74 20 63 68  ng_expr(const ch
14b0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6c 65  ar *z){.  int le
14c0: 6e 20 3d 20 30 2c 20 65 54 79 70 65 3b 0a 20 20  n = 0, eType;.  
14d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
14e0: 67 20 3d 20 7a 3b 0a 20 20 6c 65 6e 20 3d 20 64  g = z;.  len = d
14f0: 69 73 74 61 6e 63 65 5f 74 6f 28 7a 2c 20 27 3f  istance_to(z, '?
1500: 27 29 3b 0a 20 20 69 66 28 20 7a 5b 6c 65 6e 5d  ');.  if( z[len]
1510: 3d 3d 30 20 26 26 20 73 6b 69 70 5f 73 70 61 63  ==0 && skip_spac
1520: 65 28 7a 29 5b 30 5d 3d 3d 27 28 27 20 29 7b 0a  e(z)[0]=='(' ){.
1530: 20 20 20 20 7a 20 3d 20 73 6b 69 70 5f 73 70 61      z = skip_spa
1540: 63 65 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20 6c  ce(z) + 1;.    l
1550: 65 6e 20 3d 20 64 69 73 74 61 6e 63 65 5f 74 6f  en = distance_to
1560: 28 7a 2c 20 27 3f 27 29 3b 0a 20 20 7d 0a 20 20  (z, '?');.  }.  
1570: 7a 20 2b 3d 20 6c 65 6e 3b 0a 20 20 69 66 28 20  z += len;.  if( 
1580: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  z[0]=='?' ){.   
1590: 20 7a 2b 2b 3b 0a 20 20 20 20 7a 20 3d 20 6e 65   z++;.    z = ne
15a0: 78 74 5f 6e 6f 6e 5f 77 68 69 74 65 73 70 61 63  xt_non_whitespac
15b0: 65 28 7a 2c 20 26 6c 65 6e 2c 20 26 65 54 79 70  e(z, &len, &eTyp
15c0: 65 29 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70  e);.    if( eTyp
15d0: 65 3d 3d 54 4b 5f 53 54 52 20 29 7b 0a 20 20 20  e==TK_STR ){.   
15e0: 20 20 20 7a 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20     z += len;.   
15f0: 20 20 20 7a 20 3d 20 6e 65 78 74 5f 6e 6f 6e 5f     z = next_non_
1600: 77 68 69 74 65 73 70 61 63 65 28 7a 2c 20 26 6c  whitespace(z, &l
1610: 65 6e 2c 20 26 65 54 79 70 65 29 3b 0a 20 20 20  en, &eType);.   
1620: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 54 4b     if( eType==TK
1630: 5f 4f 54 48 45 52 20 26 26 20 7a 5b 30 5d 3d 3d  _OTHER && z[0]==
1640: 27 3a 27 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ':' ){.        z
1650: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20   += len;.       
1660: 20 7a 20 3d 20 6e 65 78 74 5f 6e 6f 6e 5f 77 68   z = next_non_wh
1670: 69 74 65 73 70 61 63 65 28 7a 2c 20 26 6c 65 6e  itespace(z, &len
1680: 2c 20 26 65 54 79 70 65 29 3b 0a 20 20 20 20 20  , &eType);.     
1690: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 54 4b     if( eType==TK
16a0: 5f 53 54 52 20 29 7b 0a 20 20 20 20 20 20 20 20  _STR ){.        
16b0: 20 20 7a 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20    z += len;.    
16c0: 20 20 20 20 20 20 7a 20 3d 20 6e 65 78 74 5f 6e        z = next_n
16d0: 6f 6e 5f 77 68 69 74 65 73 70 61 63 65 28 7a 2c  on_whitespace(z,
16e0: 20 26 6c 65 6e 2c 20 26 65 54 79 70 65 29 3b 0a   &len, &eType);.
16f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 54            if( eT
1700: 79 70 65 3d 3d 54 4b 5f 45 4f 46 20 29 20 72 65  ype==TK_EOF ) re
1710: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
1720: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 54 4b 5f    if( eType==TK_
1730: 4f 54 48 45 52 20 26 26 20 7a 5b 30 5d 3d 3d 27  OTHER && z[0]=='
1740: 29 27 20 26 26 20 73 6b 69 70 5f 73 70 61 63 65  )' && skip_space
1750: 28 7a 4f 72 69 67 29 5b 30 5d 3d 3d 27 28 27 20  (zOrig)[0]=='(' 
1760: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
1770: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20   += len;.       
1780: 20 20 20 20 20 7a 20 3d 20 6e 65 78 74 5f 6e 6f       z = next_no
1790: 6e 5f 77 68 69 74 65 73 70 61 63 65 28 7a 2c 20  n_whitespace(z, 
17a0: 26 6c 65 6e 2c 20 26 65 54 79 70 65 29 3b 0a 20  &len, &eType);. 
17b0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65             if( e
17c0: 54 79 70 65 3d 3d 54 4b 5f 45 4f 46 20 29 20 72  Type==TK_EOF ) r
17d0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
17e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
17f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1800: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1810: 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20  /*.** A list of 
1820: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72  functions that r
1830: 65 74 75 72 6e 20 73 74 72 69 6e 67 73 20 74 68  eturn strings th
1840: 61 74 20 61 72 65 20 73 61 66 65 20 74 6f 20 69  at are safe to i
1850: 6e 73 65 72 74 20 69 6e 74 6f 0a 2a 2a 20 53 51  nsert into.** SQ
1860: 4c 20 75 73 69 6e 67 20 25 73 2e 0a 2a 2f 0a 73  L using %s..*/.s
1870: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1880: 20 2a 61 7a 53 61 66 65 46 75 6e 63 5b 5d 20 3d   *azSafeFunc[] =
1890: 20 7b 0a 20 20 22 66 69 6c 65 6e 61 6d 65 5f 63   {.  "filename_c
18a0: 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20 20 22 6c 65  ollation",.  "le
18b0: 61 66 5f 69 73 5f 63 6c 6f 73 65 64 5f 73 71 6c  af_is_closed_sql
18c0: 22 2c 0a 20 20 22 74 69 6d 65 6c 69 6e 65 5f 71  ",.  "timeline_q
18d0: 75 65 72 79 5f 66 6f 72 5f 77 77 77 22 2c 0a 20  uery_for_www",. 
18e0: 20 22 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72 79   "timeline_query
18f0: 5f 66 6f 72 5f 74 74 79 22 2c 0a 20 20 22 62 6c  _for_tty",.  "bl
1900: 6f 62 5f 73 71 6c 5f 74 65 78 74 22 2c 0a 20 20  ob_sql_text",.  
1910: 22 67 6c 6f 62 5f 65 78 70 72 22 2c 0a 20 20 22  "glob_expr",.  "
1920: 66 6f 73 73 69 6c 5f 61 6c 6c 5f 72 65 73 65 72  fossil_all_reser
1930: 76 65 64 5f 6e 61 6d 65 73 22 2c 0a 20 20 22 63  ved_names",.  "c
1940: 6f 6e 66 69 67 75 72 65 5f 69 6e 6f 70 5f 72 68  onfigure_inop_rh
1950: 73 22 2c 0a 20 20 22 64 62 5f 73 65 74 74 69 6e  s",.  "db_settin
1960: 67 5f 69 6e 6f 70 5f 72 68 73 22 2c 0a 7d 3b 0a  g_inop_rhs",.};.
1970: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1980: 75 65 20 69 66 20 74 68 65 20 69 6e 70 75 74 20  ue if the input 
1990: 69 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  is an argument t
19a0: 68 61 74 20 69 73 20 73 61 66 65 20 74 6f 20 75  hat is safe to u
19b0: 73 65 20 77 69 74 68 20 25 73 0a 2a 2a 20 77 68  se with %s.** wh
19c0: 69 6c 65 20 62 75 69 6c 64 69 6e 67 20 61 6e 20  ile building an 
19d0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
19e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 5f  /.static int is_
19f0: 73 5f 73 61 66 65 28 63 6f 6e 73 74 20 63 68 61  s_safe(const cha
1a00: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  r *z){.  int len
1a10: 2c 20 65 54 79 70 65 3b 0a 20 20 69 6e 74 20 69  , eType;.  int i
1a20: 3b 0a 0a 20 20 2f 2a 20 41 20 73 74 72 69 6e 67  ;..  /* A string
1a30: 20 6c 69 74 65 72 61 6c 20 69 73 20 73 61 66 65   literal is safe
1a40: 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 25 73   for use with %s
1a50: 20 2a 2f 0a 20 20 69 66 28 20 69 73 5f 73 74 72   */.  if( is_str
1a60: 69 6e 67 5f 6c 69 74 28 7a 29 20 29 20 72 65 74  ing_lit(z) ) ret
1a70: 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 43 65 72  urn 1;..  /* Cer
1a80: 74 61 69 6e 20 66 75 6e 63 74 69 6f 6e 73 20 61  tain functions a
1a90: 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
1aa0: 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   return a string
1ab0: 20 74 68 61 74 20 69 73 20 73 61 66 65 0a 20 20   that is safe.  
1ac0: 2a 2a 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  ** for use with 
1ad0: 25 73 20 2a 2f 0a 20 20 7a 20 3d 20 6e 65 78 74  %s */.  z = next
1ae0: 5f 6e 6f 6e 5f 77 68 69 74 65 73 70 61 63 65 28  _non_whitespace(
1af0: 7a 2c 20 26 6c 65 6e 2c 20 26 65 54 79 70 65 29  z, &len, &eType)
1b00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
1b10: 69 7a 65 6f 66 28 61 7a 53 61 66 65 46 75 6e 63  izeof(azSafeFunc
1b20: 29 2f 73 69 7a 65 6f 66 28 61 7a 53 61 66 65 46  )/sizeof(azSafeF
1b30: 75 6e 63 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  unc[0]); i++){. 
1b40: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 54 4b     if( eType==TK
1b50: 5f 49 44 0a 20 20 20 20 20 26 26 20 73 74 72 6e  _ID.     && strn
1b60: 63 6d 70 28 7a 2c 20 61 7a 53 61 66 65 46 75 6e  cmp(z, azSafeFun
1b70: 63 5b 69 5d 2c 20 6c 65 6e 29 3d 3d 30 0a 20 20  c[i], len)==0.  
1b80: 20 20 20 26 26 20 73 74 72 6c 65 6e 28 61 7a 53     && strlen(azS
1b90: 61 66 65 46 75 6e 63 5b 69 5d 29 3d 3d 6c 65 6e  afeFunc[i])==len
1ba0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1bb0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1bc0: 7d 0a 0a 20 20 2f 2a 20 45 78 70 72 65 73 73 69  }..  /* Expressi
1bd0: 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
1be0: 20 20 45 58 50 52 20 3f 20 22 2e 2e 2e 22 20 3a    EXPR ? "..." :
1bf0: 20 22 2e 2e 2e 2e 22 20 63 61 6e 20 63 6f 75 6e   "...." can coun
1c00: 74 20 61 73 0a 20 20 2a 2a 20 61 20 73 74 72 69  t as.  ** a stri
1c10: 6e 67 20 6c 69 74 65 72 61 6c 2e 20 2a 2f 0a 20  ng literal. */. 
1c20: 20 69 66 28 20 69 73 5f 73 74 72 69 6e 67 5f 65   if( is_string_e
1c30: 78 70 72 28 7a 29 20 29 20 72 65 74 75 72 6e 20  xpr(z) ) return 
1c40: 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  1;..  /* If the 
1c50: 22 73 61 66 65 2d 66 6f 72 2d 25 73 22 20 63 6f  "safe-for-%s" co
1c60: 6d 6d 65 6e 74 20 61 70 70 65 61 72 73 20 69 6e  mment appears in
1c70: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 74   the argument, t
1c80: 68 65 6e 0a 20 20 2a 2a 20 6c 65 74 20 69 74 20  hen.  ** let it 
1c90: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 66 28  through */.  if(
1ca0: 20 73 74 72 73 74 72 28 7a 2c 20 22 2f 2a 73 61   strstr(z, "/*sa
1cb0: 66 65 2d 66 6f 72 2d 25 73 2a 2f 22 29 21 3d 30  fe-for-%s*/")!=0
1cc0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20   ) return 1;..  
1cd0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1ce0: 2a 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6c  ** Processing fl
1cf0: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ags.*/.#define F
1d00: 4d 54 5f 4e 4f 5f 53 20 20 20 30 78 30 30 30 30  MT_NO_S   0x0000
1d10: 31 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  1     /* Do not 
1d20: 61 6c 6c 6f 77 20 25 73 20 73 75 62 73 74 69 74  allow %s substit
1d30: 75 74 69 6f 6e 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  utions */../*.**
1d40: 20 41 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 72   A list of inter
1d50: 6e 61 6c 20 46 6f 73 73 69 6c 20 69 6e 74 65 72  nal Fossil inter
1d60: 66 61 63 65 73 20 74 68 61 74 20 74 61 6b 65 20  faces that take 
1d70: 61 20 70 72 69 6e 74 66 2d 73 74 79 6c 65 20 66  a printf-style f
1d80: 6f 72 6d 61 74 0a 2a 2a 20 73 74 72 69 6e 67 2e  ormat.** string.
1d90: 0a 2a 2f 0a 73 74 72 75 63 74 20 7b 0a 20 20 63  .*/.struct {.  c
1da0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 4e 61 6d  onst char *zFNam
1db0: 65 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e;    /* Name of
1dc0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
1dd0: 0a 20 20 69 6e 74 20 69 46 6d 74 41 72 67 3b 20  .  int iFmtArg; 
1de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1df0: 65 78 20 6f 66 20 66 6f 72 6d 61 74 20 61 72 67  ex of format arg
1e00: 75 6d 65 6e 74 2e 20 20 4c 65 66 74 6d 6f 73 74  ument.  Leftmost
1e10: 20 69 73 20 31 2e 20 2a 2f 0a 20 20 75 6e 73 69   is 1. */.  unsi
1e20: 67 6e 65 64 20 66 6d 74 46 6c 61 67 73 3b 20 20  gned fmtFlags;  
1e30: 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67     /* Processing
1e40: 20 66 6c 61 67 73 20 2a 2f 0a 7d 20 61 46 6d 74   flags */.} aFmt
1e50: 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  Func[] = {.  { "
1e60: 61 64 6d 69 6e 5f 6c 6f 67 22 2c 20 20 20 20 20  admin_log",     
1e70: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 20 7d            1, 0 }
1e80: 2c 0a 20 20 7b 20 22 62 6c 6f 62 5f 61 70 70 65  ,.  { "blob_appe
1e90: 6e 64 5f 73 71 6c 22 2c 20 20 20 20 20 20 20 20  nd_sql",        
1ea0: 20 32 2c 20 46 4d 54 5f 4e 4f 5f 53 20 7d 2c 0a   2, FMT_NO_S },.
1eb0: 20 20 7b 20 22 62 6c 6f 62 5f 61 70 70 65 6e 64    { "blob_append
1ec0: 66 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 32  f",            2
1ed0: 2c 20 30 20 7d 2c 0a 20 20 7b 20 22 63 67 69 5f  , 0 },.  { "cgi_
1ee0: 70 61 6e 69 63 22 2c 20 20 20 20 20 20 20 20 20  panic",         
1ef0: 20 20 20 20 20 20 31 2c 20 30 20 7d 2c 0a 20 20        1, 0 },.  
1f00: 7b 20 22 63 67 69 5f 72 65 64 69 72 65 63 74 66  { "cgi_redirectf
1f10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ",           1, 
1f20: 30 20 7d 2c 0a 20 20 7b 20 22 63 68 72 65 66 22  0 },.  { "chref"
1f30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f40: 20 20 20 20 32 2c 20 30 20 7d 2c 0a 20 20 7b 20      2, 0 },.  { 
1f50: 22 64 62 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20  "db_blob",      
1f60: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 46 4d             2, FM
1f70: 54 5f 4e 4f 5f 53 20 7d 2c 0a 20 20 7b 20 22 64  T_NO_S },.  { "d
1f80: 62 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  b_double",      
1f90: 20 20 20 20 20 20 20 20 20 32 2c 20 46 4d 54 5f           2, FMT_
1fa0: 4e 4f 5f 53 20 7d 2c 0a 20 20 7b 20 22 64 62 5f  NO_S },.  { "db_
1fb0: 65 72 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  err",           
1fc0: 20 20 20 20 20 20 20 31 2c 20 30 20 7d 2c 0a 20         1, 0 },. 
1fd0: 20 7b 20 22 64 62 5f 65 78 69 73 74 73 22 2c 20   { "db_exists", 
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
1ff0: 20 46 4d 54 5f 4e 4f 5f 53 20 7d 2c 0a 20 20 7b   FMT_NO_S },.  {
2000: 20 22 64 62 5f 69 6e 74 22 2c 20 20 20 20 20 20   "db_int",      
2010: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 46              2, F
2020: 4d 54 5f 4e 4f 5f 53 20 7d 2c 0a 20 20 7b 20 22  MT_NO_S },.  { "
2030: 64 62 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20  db_int64",      
2040: 20 20 20 20 20 20 20 20 20 20 32 2c 20 46 4d 54            2, FMT
2050: 5f 4e 4f 5f 53 20 7d 2c 0a 20 20 7b 20 22 64 62  _NO_S },.  { "db
2060: 5f 6d 75 6c 74 69 5f 65 78 65 63 22 2c 20 20 20  _multi_exec",   
2070: 20 20 20 20 20 20 20 20 31 2c 20 46 4d 54 5f 4e          1, FMT_N
2080: 4f 5f 53 20 7d 2c 0a 20 20 7b 20 22 64 62 5f 6f  O_S },.  { "db_o
2090: 70 74 69 6f 6e 61 6c 5f 73 71 6c 22 2c 20 20 20  ptional_sql",   
20a0: 20 20 20 20 20 20 32 2c 20 46 4d 54 5f 4e 4f 5f        2, FMT_NO_
20b0: 53 20 7d 2c 0a 20 20 7b 20 22 64 62 5f 70 72 65  S },.  { "db_pre
20c0: 70 61 72 65 22 2c 20 20 20 20 20 20 20 20 20 20  pare",          
20d0: 20 20 20 20 32 2c 20 46 4d 54 5f 4e 4f 5f 53 20      2, FMT_NO_S 
20e0: 7d 2c 0a 20 20 7b 20 22 64 62 5f 70 72 65 70 61  },.  { "db_prepa
20f0: 72 65 5f 69 67 6e 6f 72 65 5f 65 72 72 6f 72 22  re_ignore_error"
2100: 2c 20 32 2c 20 46 4d 54 5f 4e 4f 5f 53 20 7d 2c  , 2, FMT_NO_S },
2110: 0a 20 20 7b 20 22 64 62 5f 73 74 61 74 69 63 5f  .  { "db_static_
2120: 70 72 65 70 61 72 65 22 2c 20 20 20 20 20 20 20  prepare",       
2130: 32 2c 20 46 4d 54 5f 4e 4f 5f 53 20 7d 2c 0a 20  2, FMT_NO_S },. 
2140: 20 7b 20 22 64 62 5f 74 65 78 74 22 2c 20 20 20   { "db_text",   
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c                2,
2160: 20 46 4d 54 5f 4e 4f 5f 53 20 7d 2c 0a 20 20 7b   FMT_NO_S },.  {
2170: 20 22 66 6f 72 6d 5f 62 65 67 69 6e 22 2c 20 20   "form_begin",  
2180: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30              2, 0
2190: 20 7d 2c 0a 20 20 7b 20 22 66 6f 73 73 69 6c 5f   },.  { "fossil_
21a0: 65 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20  error",         
21b0: 20 20 20 32 2c 20 30 20 7d 2c 0a 20 20 7b 20 22     2, 0 },.  { "
21c0: 66 6f 73 73 69 6c 5f 65 72 72 6f 72 6c 6f 67 22  fossil_errorlog"
21d0: 2c 20 20 20 20 20 20 20 20 20 31 2c 20 30 20 7d  ,         1, 0 }
21e0: 2c 0a 20 20 7b 20 22 66 6f 73 73 69 6c 5f 66 61  ,.  { "fossil_fa
21f0: 74 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  tal",           
2200: 20 31 2c 20 30 20 7d 2c 0a 20 20 7b 20 22 66 6f   1, 0 },.  { "fo
2210: 73 73 69 6c 5f 66 61 74 61 6c 5f 72 65 63 75 72  ssil_fatal_recur
2220: 73 69 76 65 22 2c 20 20 31 2c 20 30 20 7d 2c 0a  sive",  1, 0 },.
2230: 20 20 7b 20 22 66 6f 73 73 69 6c 5f 70 61 6e 69    { "fossil_pani
2240: 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 31  c",            1
2250: 2c 20 30 20 7d 2c 0a 20 20 7b 20 22 66 6f 73 73  , 0 },.  { "foss
2260: 69 6c 5f 70 72 69 6e 74 22 2c 20 20 20 20 20 20  il_print",      
2270: 20 20 20 20 20 20 31 2c 20 30 20 7d 2c 0a 20 20        1, 0 },.  
2280: 7b 20 22 66 6f 73 73 69 6c 5f 74 72 61 63 65 22  { "fossil_trace"
2290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ,            1, 
22a0: 30 20 7d 2c 0a 20 20 7b 20 22 66 6f 73 73 69 6c  0 },.  { "fossil
22b0: 5f 77 61 72 6e 69 6e 67 22 2c 20 20 20 20 20 20  _warning",      
22c0: 20 20 20 20 31 2c 20 30 20 7d 2c 0a 20 20 7b 20      1, 0 },.  { 
22d0: 22 68 72 65 66 22 2c 20 20 20 20 20 20 20 20 20  "href",         
22e0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 20             1, 0 
22f0: 7d 2c 0a 20 20 7b 20 22 6a 73 6f 6e 5f 6e 65 77  },.  { "json_new
2300: 5f 73 74 72 69 6e 67 5f 66 22 2c 20 20 20 20 20  _string_f",     
2310: 20 20 31 2c 20 30 20 7d 2c 0a 20 20 7b 20 22 6d    1, 0 },.  { "m
2320: 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20  printf",        
2330: 20 20 20 20 20 20 20 20 20 31 2c 20 30 20 7d 2c           1, 0 },
2340: 0a 20 20 7b 20 22 73 6f 63 6b 65 74 5f 73 65 74  .  { "socket_set
2350: 5f 65 72 72 6d 73 67 22 2c 20 20 20 20 20 20 20  _errmsg",       
2360: 31 2c 20 30 20 7d 2c 0a 20 20 7b 20 22 73 73 6c  1, 0 },.  { "ssl
2370: 5f 73 65 74 5f 65 72 72 6d 73 67 22 2c 20 20 20  _set_errmsg",   
2380: 20 20 20 20 20 20 20 31 2c 20 30 20 7d 2c 0a 20         1, 0 },. 
2390: 20 7b 20 22 73 74 79 6c 65 5f 68 65 61 64 65 72   { "style_header
23a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c  ",            1,
23b0: 20 30 20 7d 2c 0a 20 20 7b 20 22 73 74 79 6c 65   0 },.  { "style
23c0: 5f 73 65 74 5f 63 75 72 72 65 6e 74 5f 70 61 67  _set_current_pag
23d0: 65 22 2c 20 20 31 2c 20 30 20 7d 2c 0a 20 20 7b  e",  1, 0 },.  {
23e0: 20 22 77 65 62 70 61 67 65 5f 65 72 72 6f 72 22   "webpage_error"
23f0: 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30  ,           1, 0
2400: 20 7d 2c 0a 20 20 7b 20 22 78 68 72 65 66 22 2c   },.  { "xhref",
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 20 32 2c 20 30 20 7d 2c 0a 7d 3b 0a 0a 2f     2, 0 },.};../
2430: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
2440: 66 20 74 68 65 20 69 6e 64 65 6e 74 69 66 69 65  f the indentifie
2450: 72 20 7a 49 64 65 6e 74 20 6f 66 20 6c 65 6e 67  r zIdent of leng
2460: 74 68 20 6e 49 6e 64 65 6e 74 20 69 73 20 61 20  th nIndent is a 
2470: 46 6f 73 73 69 6c 0a 2a 2a 20 69 6e 74 65 72 6e  Fossil.** intern
2480: 61 6c 20 69 6e 74 65 72 66 61 63 65 20 74 68 61  al interface tha
2490: 74 20 75 73 65 73 20 61 20 70 72 69 6e 74 66 2d  t uses a printf-
24a0: 73 74 79 6c 65 20 61 72 67 75 6d 65 6e 74 2e 20  style argument. 
24b0: 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20   Return zero if 
24c0: 6e 6f 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  not..** Return t
24d0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
24e0: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 69 66  format string if
24f0: 20 74 72 75 65 20 77 69 74 68 20 74 68 65 20 6c   true with the l
2500: 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 61 72 67 75  eft-most.** argu
2510: 6d 65 6e 74 20 68 61 76 69 6e 67 20 61 6e 20 69  ment having an i
2520: 6e 64 65 78 20 6f 66 20 31 2e 0a 2a 2f 0a 73 74  ndex of 1..*/.st
2530: 61 74 69 63 20 69 6e 74 20 69 73 46 6f 72 6d 61  atic int isForma
2540: 74 46 75 6e 63 28 63 6f 6e 73 74 20 63 68 61 72  tFunc(const char
2550: 20 2a 7a 49 64 65 6e 74 2c 20 69 6e 74 20 6e 49   *zIdent, int nI
2560: 64 65 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 2a  dent, unsigned *
2570: 70 46 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 75  pFlags){.  int u
2580: 70 72 2c 20 6c 77 72 3b 0a 20 20 6c 77 72 20 3d  pr, lwr;.  lwr =
2590: 20 30 3b 0a 20 20 75 70 72 20 3d 20 73 69 7a 65   0;.  upr = size
25a0: 6f 66 28 61 46 6d 74 46 75 6e 63 29 2f 73 69 7a  of(aFmtFunc)/siz
25b0: 65 6f 66 28 61 46 6d 74 46 75 6e 63 5b 30 5d 29  eof(aFmtFunc[0])
25c0: 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c   - 1;.  while( l
25d0: 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 75  wr<=upr ){.    u
25e0: 6e 73 69 67 6e 65 64 20 78 20 3d 20 28 6c 77 72  nsigned x = (lwr
25f0: 20 2b 20 75 70 72 29 2f 32 3b 0a 20 20 20 20 69   + upr)/2;.    i
2600: 6e 74 20 63 20 3d 20 73 74 72 6e 63 6d 70 28 7a  nt c = strncmp(z
2610: 49 64 65 6e 74 2c 20 61 46 6d 74 46 75 6e 63 5b  Ident, aFmtFunc[
2620: 78 5d 2e 7a 46 4e 61 6d 65 2c 20 6e 49 64 65 6e  x].zFName, nIden
2630: 74 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30  t);.    if( c==0
2640: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 46   ){.      if( aF
2650: 6d 74 46 75 6e 63 5b 78 5d 2e 7a 46 4e 61 6d 65  mtFunc[x].zFName
2660: 5b 6e 49 64 65 6e 74 5d 3d 3d 30 20 29 7b 0a 20  [nIdent]==0 ){. 
2670: 20 20 20 20 20 20 20 2a 70 46 6c 61 67 73 20 3d         *pFlags =
2680: 20 61 46 6d 74 46 75 6e 63 5b 78 5d 2e 66 6d 74   aFmtFunc[x].fmt
2690: 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 72  Flags;.        r
26a0: 65 74 75 72 6e 20 61 46 6d 74 46 75 6e 63 5b 78  eturn aFmtFunc[x
26b0: 5d 2e 69 46 6d 74 41 72 67 3b 0a 20 20 20 20 20  ].iFmtArg;.     
26c0: 20 7d 0a 20 20 20 20 20 20 63 20 3d 20 2d 31 3b   }.      c = -1;
26d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
26e0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 70 72 20  <0 ){.      upr 
26f0: 3d 20 78 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c  = x - 1;.    }el
2700: 73 65 7b 0a 20 20 20 20 20 20 6c 77 72 20 3d 20  se{.      lwr = 
2710: 78 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  x + 1;.    }.  }
2720: 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 30 3b 0a  .  *pFlags = 0;.
2730: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2740: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2750: 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  expected number 
2760: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  of arguments for
2770: 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   the format stri
2780: 6e 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 31  ng..** Return -1
2790: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 63 61   if the value ca
27a0: 6e 6e 6f 74 20 62 65 20 63 6f 6d 70 75 74 65 64  nnot be computed
27b0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  ..**.** For each
27c0: 20 61 72 67 75 6d 65 6e 74 20 6c 65 73 73 20 74   argument less t
27d0: 68 61 6e 20 6e 54 79 70 65 2c 20 73 74 6f 72 65  han nType, store
27e0: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
27f0: 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 66 6f 72  character.** for
2800: 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69   that argument i
2810: 6e 20 63 54 79 70 65 5b 69 5d 2e 0a 2a 2f 0a 73  n cType[i]..*/.s
2820: 74 61 74 69 63 20 69 6e 74 20 66 6f 72 6d 61 74  tatic int format
2830: 41 72 67 43 6f 75 6e 74 28 63 6f 6e 73 74 20 63  ArgCount(const c
2840: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 54 79 70  har *z, int nTyp
2850: 65 2c 20 63 68 61 72 20 2a 63 54 79 70 65 29 7b  e, char *cType){
2860: 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b  .  int nArg = 0;
2870: 0a 20 20 69 6e 74 20 69 2c 20 6b 3b 0a 20 20 69  .  int i, k;.  i
2880: 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 65 54  nt len;.  int eT
2890: 79 70 65 3b 0a 20 20 69 6e 74 20 6c 6e 20 3d 20  ype;.  int ln = 
28a0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d  0;.  while( z[0]
28b0: 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 74 6f   ){.    len = to
28c0: 6b 65 6e 5f 6c 65 6e 67 74 68 28 7a 2c 20 26 65  ken_length(z, &e
28d0: 54 79 70 65 2c 20 26 6c 6e 29 3b 0a 20 20 20 20  Type, &ln);.    
28e0: 69 66 28 20 65 54 79 70 65 3d 3d 54 4b 5f 53 54  if( eType==TK_ST
28f0: 52 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  R ){.      for(i
2900: 3d 31 3b 20 69 3c 6c 65 6e 2d 31 3b 20 69 2b 2b  =1; i<len-1; i++
2910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
2920: 5b 69 5d 21 3d 27 25 27 20 29 20 63 6f 6e 74 69  [i]!='%' ) conti
2930: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
2940: 20 7a 5b 69 2b 31 5d 3d 3d 27 25 27 20 29 7b 20   z[i+1]=='%' ){ 
2950: 69 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  i++; continue; }
2960: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 69  .        for(k=i
2970: 2b 31 3b 20 6b 3c 6c 65 6e 20 26 26 20 21 69 73  +1; k<len && !is
2980: 61 6c 70 68 61 28 7a 5b 6b 5d 29 3b 20 6b 2b 2b  alpha(z[k]); k++
2990: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
29a0: 20 7a 5b 6b 5d 3d 3d 27 2a 27 20 7c 7c 20 7a 5b   z[k]=='*' || z[
29b0: 6b 5d 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20  k]=='#' ){.     
29c0: 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c         if( nArg<
29d0: 6e 54 79 70 65 20 29 20 63 54 79 70 65 5b 6e 41  nType ) cType[nA
29e0: 72 67 5d 20 3d 20 7a 5b 6b 5d 3b 0a 20 20 20 20  rg] = z[k];.    
29f0: 20 20 20 20 20 20 20 20 6e 41 72 67 2b 2b 3b 0a          nArg++;.
2a00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2a20: 28 20 7a 5b 6b 5d 21 3d 27 52 27 20 29 7b 0a 20  ( z[k]!='R' ){. 
2a30: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72           if( nAr
2a40: 67 3c 6e 54 79 70 65 20 29 20 63 54 79 70 65 5b  g<nType ) cType[
2a50: 6e 41 72 67 5d 20 3d 20 7a 5b 6b 5d 3b 0a 20 20  nArg] = z[k];.  
2a60: 20 20 20 20 20 20 20 20 6e 41 72 67 2b 2b 3b 0a          nArg++;.
2a70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d  }.    }.    z +=
2a90: 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75   len;.  }.  retu
2aa0: 72 6e 20 6e 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nArg;.}../*.*
2ab0: 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 63  * The function c
2ac0: 61 6c 6c 20 74 68 61 74 20 62 65 67 69 6e 73 20  all that begins 
2ad0: 61 74 20 7a 46 43 61 6c 6c 5b 30 5d 20 28 77 68  at zFCall[0] (wh
2ae0: 69 63 68 20 69 73 20 6f 6e 20 6c 69 6e 65 20 6c  ich is on line l
2af0: 6e 46 43 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  nFCall of the.**
2b00: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 29 20   original file) 
2b10: 69 73 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  is a function th
2b20: 61 74 20 75 73 65 73 20 61 20 70 72 69 6e 74 66  at uses a printf
2b30: 2d 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74  -style format st
2b40: 72 69 6e 67 0a 2a 2a 20 6f 6e 20 61 72 67 75 6d  ring.** on argum
2b50: 65 6e 74 20 6e 75 6d 62 65 72 20 66 6d 74 41 72  ent number fmtAr
2b60: 67 2e 20 20 49 74 20 68 61 73 20 70 72 6f 63 65  g.  It has proce
2b70: 73 73 69 6e 67 73 20 66 6c 61 67 73 20 66 6d 74  ssings flags fmt
2b80: 46 6c 61 67 73 2e 20 20 44 6f 0a 2a 2a 20 63 6f  Flags.  Do.** co
2b90: 6d 70 69 6c 65 2d 74 69 6d 65 20 63 68 65 63 6b  mpile-time check
2ba0: 69 6e 67 20 6f 6e 20 74 68 69 73 20 66 75 6e 63  ing on this func
2bb0: 74 69 6f 6e 2c 20 6f 75 74 70 75 74 20 61 6e 79  tion, output any
2bc0: 20 65 72 72 6f 72 73 2c 20 61 6e 64 20 72 65 74   errors, and ret
2bd0: 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
2be0: 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  r of errors..*/.
2bf0: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
2c00: 46 6f 72 6d 61 74 46 75 6e 63 28 0a 20 20 63 6f  FormatFunc(.  co
2c10: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2c20: 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ame, /* Name of 
2c30: 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 70  the file being p
2c40: 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f  rocessed */.  co
2c50: 6e 73 74 20 63 68 61 72 20 2a 7a 46 43 61 6c 6c  nst char *zFCall
2c60: 2c 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ,    /* Pointer 
2c70: 74 6f 20 73 74 61 72 74 20 6f 66 20 66 75 6e 63  to start of func
2c80: 74 69 6f 6e 20 63 61 6c 6c 20 2a 2f 0a 20 20 69  tion call */.  i
2c90: 6e 74 20 6c 6e 46 43 61 6c 6c 2c 20 20 20 20 20  nt lnFCall,     
2ca0: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
2cb0: 6d 62 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20  mber that holds 
2cc0: 7a 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 66 6d  z[0] */.  int fm
2cd0: 74 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  tArg,           
2ce0: 20 2f 2a 20 46 6f 72 6d 61 74 20 73 74 72 69 6e   /* Format strin
2cf0: 67 20 73 68 6f 75 6c 64 20 62 65 20 74 68 69 73  g should be this
2d00: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 69   argument */.  i
2d10: 6e 74 20 66 6d 74 46 6c 61 67 73 20 20 20 20 20  nt fmtFlags     
2d20: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
2d30: 72 6f 63 65 73 73 69 6e 67 20 66 6c 61 67 73 20  rocessing flags 
2d40: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 73 7a 46 4e  */.){.  int szFN
2d50: 61 6d 65 3b 0a 20 20 69 6e 74 20 65 54 6f 6b 65  ame;.  int eToke
2d60: 6e 3b 0a 20 20 69 6e 74 20 6c 6e 20 3d 20 6c 6e  n;.  int ln = ln
2d70: 46 43 61 6c 6c 3b 0a 20 20 69 6e 74 20 6c 65 6e  FCall;.  int len
2d80: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2d90: 7a 53 74 61 72 74 3b 0a 20 20 63 68 61 72 20 2a  zStart;.  char *
2da0: 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70 79  z;.  char *zCopy
2db0: 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30  ;.  int nArg = 0
2dc0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2dd0: 2a 61 7a 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e  *azArg = 0;.  in
2de0: 74 20 69 2c 20 6b 3b 0a 20 20 69 6e 74 20 6e 45  t i, k;.  int nE
2df0: 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  rr = 0;.  char *
2e00: 61 63 54 79 70 65 3b 0a 0a 20 20 73 7a 46 4e 61  acType;..  szFNa
2e10: 6d 65 20 3d 20 74 6f 6b 65 6e 5f 6c 65 6e 67 74  me = token_lengt
2e20: 68 28 7a 46 43 61 6c 6c 2c 20 26 65 54 6f 6b 65  h(zFCall, &eToke
2e30: 6e 2c 20 26 6c 6e 29 3b 0a 20 20 7a 53 74 61 72  n, &ln);.  zStar
2e40: 74 20 3d 20 6e 65 78 74 5f 6e 6f 6e 5f 77 68 69  t = next_non_whi
2e50: 74 65 73 70 61 63 65 28 7a 46 43 61 6c 6c 2b 73  tespace(zFCall+s
2e60: 7a 46 4e 61 6d 65 2c 20 26 6c 65 6e 2c 20 26 65  zFName, &len, &e
2e70: 54 6f 6b 65 6e 29 3b 0a 20 20 61 73 73 65 72 74  Token);.  assert
2e80: 28 20 7a 53 74 61 72 74 5b 30 5d 3d 3d 27 28 27  ( zStart[0]=='('
2e90: 20 26 26 20 6c 65 6e 3d 3d 31 20 29 3b 0a 20 20   && len==1 );.  
2ea0: 6c 65 6e 20 3d 20 64 69 73 74 61 6e 63 65 5f 74  len = distance_t
2eb0: 6f 28 7a 53 74 61 72 74 2b 31 2c 20 27 29 27 29  o(zStart+1, ')')
2ec0: 3b 0a 20 20 7a 43 6f 70 79 20 3d 20 73 61 66 65  ;.  zCopy = safe
2ed0: 5f 6d 61 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  _malloc( len + 1
2ee0: 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 43 6f   );.  memcpy(zCo
2ef0: 70 79 2c 20 7a 53 74 61 72 74 2b 31 2c 20 6c 65  py, zStart+1, le
2f00: 6e 29 3b 0a 20 20 7a 43 6f 70 79 5b 6c 65 6e 5d  n);.  zCopy[len]
2f10: 20 3d 20 30 3b 0a 20 20 61 7a 41 72 67 20 3d 20   = 0;.  azArg = 
2f20: 30 3b 0a 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20  0;.  nArg = 0;. 
2f30: 20 7a 20 3d 20 7a 43 6f 70 79 3b 0a 20 20 77 68   z = zCopy;.  wh
2f40: 69 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20  ile( z[0] ){.   
2f50: 20 6c 65 6e 20 3d 20 64 69 73 74 61 6e 63 65 5f   len = distance_
2f60: 74 6f 28 7a 2c 20 27 2c 27 29 3b 0a 20 20 20 20  to(z, ',');.    
2f70: 61 7a 41 72 67 20 3d 20 73 61 66 65 5f 72 65 61  azArg = safe_rea
2f80: 6c 6c 6f 63 28 28 63 68 61 72 2a 29 61 7a 41 72  lloc((char*)azAr
2f90: 67 2c 20 28 73 69 7a 65 6f 66 28 61 7a 41 72 67  g, (sizeof(azArg
2fa0: 5b 30 5d 29 2b 31 29 2a 28 6e 41 72 67 2b 31 29  [0])+1)*(nArg+1)
2fb0: 29 3b 0a 20 20 20 20 61 7a 41 72 67 5b 6e 41 72  );.    azArg[nAr
2fc0: 67 2b 2b 5d 20 3d 20 73 6b 69 70 5f 73 70 61 63  g++] = skip_spac
2fd0: 65 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b  e(z);.    if( z[
2fe0: 6c 65 6e 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  len]==0 ) break;
2ff0: 0a 20 20 20 20 7a 5b 6c 65 6e 5d 20 3d 20 30 3b  .    z[len] = 0;
3000: 0a 20 20 20 20 66 6f 72 28 69 3d 6c 65 6e 2d 31  .    for(i=len-1
3010: 3b 20 69 3e 30 20 26 26 20 69 73 73 70 61 63 65  ; i>0 && isspace
3020: 28 7a 5b 69 5d 29 3b 20 69 2d 2d 29 7b 20 7a 5b  (z[i]); i--){ z[
3030: 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 20 20 7a 20  i] = 0; }.    z 
3040: 2b 3d 20 6c 65 6e 20 2b 20 31 3b 0a 20 20 7d 0a  += len + 1;.  }.
3050: 20 20 61 63 54 79 70 65 20 3d 20 28 63 68 61 72    acType = (char
3060: 2a 29 26 61 7a 41 72 67 5b 6e 41 72 67 5d 3b 0a  *)&azArg[nArg];.
3070: 20 20 69 66 28 20 66 6d 74 41 72 67 3e 6e 41 72    if( fmtArg>nAr
3080: 67 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  g ){.    printf(
3090: 22 25 73 3a 25 64 3a 20 74 6f 6f 20 66 65 77 20  "%s:%d: too few 
30a0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 25 2e 2a  arguments to %.*
30b0: 73 28 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s()\n",.        
30c0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6c 6e     zFilename, ln
30d0: 46 43 61 6c 6c 2c 20 73 7a 46 4e 61 6d 65 2c 20  FCall, szFName, 
30e0: 7a 46 43 61 6c 6c 29 3b 0a 20 20 20 20 6e 45 72  zFCall);.    nEr
30f0: 72 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r++;.  }else{.  
3100: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
3110: 6d 74 20 3d 20 61 7a 41 72 67 5b 66 6d 74 41 72  mt = azArg[fmtAr
3120: 67 2d 31 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20  g-1];.    const 
3130: 63 68 61 72 20 2a 7a 4f 76 65 72 72 69 64 65 20  char *zOverride 
3140: 3d 20 73 74 72 73 74 72 28 7a 46 6d 74 2c 20 22  = strstr(zFmt, "
3150: 2f 2a 77 6f 72 6b 73 2d 6c 69 6b 65 3a 22 29 3b  /*works-like:");
3160: 0a 20 20 20 20 69 66 28 20 7a 4f 76 65 72 72 69  .    if( zOverri
3170: 64 65 20 29 20 7a 46 6d 74 20 3d 20 7a 4f 76 65  de ) zFmt = zOve
3180: 72 72 69 64 65 20 2b 20 73 69 7a 65 6f 66 28 22  rride + sizeof("
3190: 2f 2a 77 6f 72 6b 73 2d 6c 69 6b 65 3a 22 29 2d  /*works-like:")-
31a0: 31 3b 0a 20 20 20 20 69 66 28 20 21 69 73 5f 73  1;.    if( !is_s
31b0: 74 72 69 6e 67 5f 6c 69 74 28 7a 46 6d 74 29 20  tring_lit(zFmt) 
31c0: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
31d0: 22 25 73 3a 25 64 3a 20 25 2e 2a 73 28 29 20 68  "%s:%d: %.*s() h
31e0: 61 73 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20  as non-constant 
31f0: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 5c 6e 22  format string\n"
3200: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  ,.             z
3210: 46 69 6c 65 6e 61 6d 65 2c 20 6c 6e 46 43 61 6c  Filename, lnFCal
3220: 6c 2c 20 73 7a 46 4e 61 6d 65 2c 20 7a 46 43 61  l, szFName, zFCa
3230: 6c 6c 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  ll);.      nErr+
3240: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
3250: 20 28 6b 20 3d 20 66 6f 72 6d 61 74 41 72 67 43   (k = formatArgC
3260: 6f 75 6e 74 28 7a 46 6d 74 2c 20 6e 41 72 67 2c  ount(zFmt, nArg,
3270: 20 61 63 54 79 70 65 29 29 3e 3d 30 0a 20 20 20   acType))>=0.   
3280: 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 41 72            && nAr
3290: 67 21 3d 66 6d 74 41 72 67 2b 6b 20 29 7b 0a 20  g!=fmtArg+k ){. 
32a0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 3a       printf("%s:
32b0: 25 64 3a 20 74 6f 6f 20 25 73 20 61 72 67 75 6d  %d: too %s argum
32c0: 65 6e 74 73 20 74 6f 20 25 2e 2a 73 28 29 20 22  ents to %.*s() "
32d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  .             "-
32e0: 20 67 6f 74 20 25 64 20 61 6e 64 20 65 78 70 65   got %d and expe
32f0: 63 74 65 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  cted %d\n",.    
3300: 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
3310: 6d 65 2c 20 6c 6e 46 43 61 6c 6c 2c 20 28 6e 41  me, lnFCall, (nA
3320: 72 67 3c 66 6d 74 41 72 67 2b 6b 20 3f 20 22 66  rg<fmtArg+k ? "f
3330: 65 77 22 20 3a 20 22 6d 61 6e 79 22 29 2c 0a 20  ew" : "many"),. 
3340: 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 46 4e              szFN
3350: 61 6d 65 2c 20 7a 46 43 61 6c 6c 2c 20 6e 41 72  ame, zFCall, nAr
3360: 67 2c 20 66 6d 74 41 72 67 2b 6b 29 3b 0a 20 20  g, fmtArg+k);.  
3370: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
3380: 7d 65 6c 73 65 20 69 66 28 20 66 6d 74 46 6c 61  }else if( fmtFla
3390: 67 73 20 26 20 46 4d 54 5f 4e 4f 5f 53 20 29 7b  gs & FMT_NO_S ){
33a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
33b0: 69 3c 6e 41 72 67 20 26 26 20 69 3c 6b 3b 20 69  i<nArg && i<k; i
33c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
33d0: 20 28 61 63 54 79 70 65 5b 69 5d 3d 3d 27 73 27   (acType[i]=='s'
33e0: 20 7c 7c 20 61 63 54 79 70 65 5b 69 5d 3d 3d 27   || acType[i]=='
33f0: 7a 27 20 7c 7c 20 61 63 54 79 70 65 5b 69 5d 3d  z' || acType[i]=
3400: 3d 27 62 27 29 0a 20 20 20 20 20 20 20 20 20 26  ='b').         &
3410: 26 20 21 69 73 5f 73 5f 73 61 66 65 28 61 7a 41  & !is_s_safe(azA
3420: 72 67 5b 66 6d 74 41 72 67 2b 69 5d 29 0a 20 20  rg[fmtArg+i]).  
3430: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
3440: 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 3a 25      printf("%s:%
3450: 64 3a 20 41 72 67 75 6d 65 6e 74 20 25 64 20 74  d: Argument %d t
3460: 6f 20 25 2e 2a 73 28 29 20 6e 6f 74 20 73 61 66  o %.*s() not saf
3470: 65 20 66 6f 72 20 53 51 4c 5c 6e 22 2c 0a 20 20  e for SQL\n",.  
3480: 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
3490: 6e 61 6d 65 2c 20 6c 6e 46 43 61 6c 6c 2c 20 69  name, lnFCall, i
34a0: 2b 66 6d 74 41 72 67 2c 20 73 7a 46 4e 61 6d 65  +fmtArg, szFName
34b0: 2c 20 7a 46 43 61 6c 6c 29 3b 0a 20 20 20 20 20  , zFCall);.     
34c0: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
34d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
34f0: 6e 45 72 72 20 29 7b 0a 20 20 20 20 66 6f 72 28  nErr ){.    for(
3500: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
3510: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
3520: 22 20 20 20 61 72 67 5b 25 64 5d 3a 20 25 73 5c  "   arg[%d]: %s\
3530: 6e 22 2c 20 69 2c 20 61 7a 41 72 67 5b 69 5d 29  n", i, azArg[i])
3540: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66  ;.    }.  }..  f
3550: 72 65 65 28 28 63 68 61 72 2a 29 61 7a 41 72 67  ree((char*)azArg
3560: 29 3b 0a 20 20 66 72 65 65 28 7a 43 6f 70 79 29  );.  free(zCopy)
3570: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  ;.  return nErr;
3580: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  .}.../*.** Do a 
3590: 64 65 73 69 67 6e 2d 72 75 6c 65 20 63 68 65 63  design-rule chec
35a0: 6b 20 6f 66 20 66 6f 72 6d 61 74 20 73 74 72 69  k of format stri
35b0: 6e 67 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ngs for the file
35c0: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20   named zName.** 
35d0: 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 7a 43 6f  with content zCo
35e0: 6e 74 65 6e 74 2e 20 20 57 72 69 74 65 20 65 72  ntent.  Write er
35f0: 72 6f 72 73 20 6f 6e 20 73 74 61 6e 64 61 72 64  rors on standard
3600: 20 6f 75 74 70 75 74 2e 20 20 52 65 74 75 72 6e   output.  Return
3610: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
3620: 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61  f errors..*/.sta
3630: 74 69 63 20 69 6e 74 20 73 63 61 6e 5f 66 69 6c  tic int scan_fil
3640: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  e(const char *zN
3650: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
3660: 2a 7a 43 6f 6e 74 65 6e 74 29 7b 0a 20 20 63 6f  *zContent){.  co
3670: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
3680: 6e 74 20 6c 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  nt ln = 0;.  int
3690: 20 73 7a 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20   szToken;.  int 
36a0: 65 54 6f 6b 65 6e 3b 0a 20 20 63 6f 6e 73 74 20  eToken;.  const 
36b0: 63 68 61 72 20 2a 7a 50 72 65 76 20 3d 20 30 3b  char *zPrev = 0;
36c0: 0a 20 20 69 6e 74 20 65 50 72 65 76 20 3d 20 30  .  int ePrev = 0
36d0: 3b 0a 20 20 69 6e 74 20 73 7a 50 72 65 76 20 3d  ;.  int szPrev =
36e0: 20 30 3b 0a 20 20 69 6e 74 20 6c 6e 50 72 65 76   0;.  int lnPrev
36f0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 43 75 72   = 0;.  int nCur
3700: 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 78 3b  ly = 0;.  int x;
3710: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 6d 74 46  .  unsigned fmtF
3720: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lags = 0;.  int 
3730: 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28  nErr = 0;..  if(
3740: 20 7a 43 6f 6e 74 65 6e 74 3d 3d 30 20 29 7b 0a   zContent==0 ){.
3750: 20 20 20 20 70 72 69 6e 74 66 28 22 63 61 6e 6e      printf("cann
3760: 6f 74 20 72 65 61 64 20 66 69 6c 65 3a 20 25 73  ot read file: %s
3770: 5c 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  \n", zName);.   
3780: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
3790: 20 66 6f 72 28 7a 3d 7a 43 6f 6e 74 65 6e 74 3b   for(z=zContent;
37a0: 20 7a 5b 30 5d 3b 20 7a 20 2b 3d 20 73 7a 54 6f   z[0]; z += szTo
37b0: 6b 65 6e 29 7b 0a 20 20 20 20 73 7a 54 6f 6b 65  ken){.    szToke
37c0: 6e 20 3d 20 74 6f 6b 65 6e 5f 6c 65 6e 67 74 68  n = token_length
37d0: 28 7a 2c 20 26 65 54 6f 6b 65 6e 2c 20 26 6c 6e  (z, &eToken, &ln
37e0: 29 3b 0a 20 20 20 20 69 66 28 20 65 54 6f 6b 65  );.    if( eToke
37f0: 6e 3d 3d 54 4b 5f 53 50 41 43 45 20 29 20 63 6f  n==TK_SPACE ) co
3800: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
3810: 65 54 6f 6b 65 6e 3d 3d 54 4b 5f 4f 54 48 45 52  eToken==TK_OTHER
3820: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b   ){.      if( z[
3830: 30 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20  0]=='{' ){.     
3840: 20 20 20 6e 43 75 72 6c 79 2b 2b 3b 0a 20 20 20     nCurly++;.   
3850: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30     }else if( z[0
3860: 5d 3d 3d 27 7d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='}' ){.      
3870: 20 20 6e 43 75 72 6c 79 2d 2d 3b 0a 20 20 20 20    nCurly--;.    
3880: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 75 72    }else if( nCur
3890: 6c 79 3e 30 20 26 26 20 7a 5b 30 5d 3d 3d 27 28  ly>0 && z[0]=='(
38a0: 27 20 26 26 20 65 50 72 65 76 3d 3d 54 4b 5f 49  ' && ePrev==TK_I
38b0: 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  D.            &&
38c0: 20 28 78 20 3d 20 69 73 46 6f 72 6d 61 74 46 75   (x = isFormatFu
38d0: 6e 63 28 7a 50 72 65 76 2c 73 7a 50 72 65 76 2c  nc(zPrev,szPrev,
38e0: 26 66 6d 74 46 6c 61 67 73 29 29 3e 30 20 29 7b  &fmtFlags))>0 ){
38f0: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 2b 3d  .        nErr +=
3900: 20 63 68 65 63 6b 46 6f 72 6d 61 74 46 75 6e 63   checkFormatFunc
3910: 28 7a 4e 61 6d 65 2c 20 7a 50 72 65 76 2c 20 6c  (zName, zPrev, l
3920: 6e 50 72 65 76 2c 20 78 2c 20 66 6d 74 46 6c 61  nPrev, x, fmtFla
3930: 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gs);.      }.   
3940: 20 7d 0a 20 20 20 20 7a 50 72 65 76 20 3d 20 7a   }.    zPrev = z
3950: 3b 0a 20 20 20 20 65 50 72 65 76 20 3d 20 65 54  ;.    ePrev = eT
3960: 6f 6b 65 6e 3b 0a 20 20 20 20 73 7a 50 72 65 76  oken;.    szPrev
3970: 20 3d 20 73 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20   = szToken;.    
3980: 6c 6e 50 72 65 76 20 3d 20 6c 6e 3b 0a 20 20 7d  lnPrev = ln;.  }
3990: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a  .  return nErr;.
39a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 66  }../*.** Check f
39b0: 6f 72 20 66 6f 72 6d 61 74 2d 73 74 72 69 6e 67  or format-string
39c0: 20 64 65 73 69 67 6e 20 72 75 6c 65 20 76 69 6f   design rule vio
39d0: 6c 61 74 69 6f 6e 73 20 6f 6e 20 61 6c 6c 20 66  lations on all f
39e0: 69 6c 65 73 20 6c 69 73 74 65 64 0a 2a 2a 20 6f  iles listed.** o
39f0: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69  n the command-li
3a00: 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28  ne..*/.int main(
3a10: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
3a20: 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 69 3b  *argv){.  int i;
3a30: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
3a40: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72  .  for(i=1; i<ar
3a50: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  gc; i++){.    ch
3a60: 61 72 20 2a 7a 46 69 6c 65 20 3d 20 72 65 61 64  ar *zFile = read
3a70: 5f 66 69 6c 65 28 61 72 67 76 5b 69 5d 29 3b 0a  _file(argv[i]);.
3a80: 20 20 20 20 6e 45 72 72 20 2b 3d 20 73 63 61 6e      nErr += scan
3a90: 5f 66 69 6c 65 28 61 72 67 76 5b 69 5d 2c 20 7a  _file(argv[i], z
3aa0: 46 69 6c 65 29 3b 0a 20 20 20 20 66 72 65 65 28  File);.    free(
3ab0: 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65  zFile);.  }.  re
3ac0: 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a           turn nErr;.}.