/ Hex Artifact Content
Login

Artifact c1ed122d6d8c288c7f21922ad64bba206ac51646:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 43 20 70 72 6f  /*.** This C pro
0010: 67 72 61 6d 20 65 78 74 72 61 63 74 73 20 61 6c  gram extracts al
0020: 6c 20 22 77 6f 72 64 73 22 20 66 72 6f 6d 20 61  l "words" from a
0030: 6e 20 69 6e 70 75 74 20 64 6f 63 75 6d 65 6e 74  n input document
0040: 20 61 6e 64 20 61 64 64 73 20 74 68 65 6d 0a 2a   and adds them.*
0050: 2a 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64  * to an SQLite d
0060: 61 74 61 62 61 73 65 2e 20 20 41 20 22 77 6f 72  atabase.  A "wor
0070: 64 22 20 69 73 20 61 6e 79 20 63 6f 6e 74 69 67  d" is any contig
0080: 75 6f 75 73 20 73 65 71 75 65 6e 63 65 20 6f 66  uous sequence of
0090: 20 61 6c 70 68 61 62 65 74 69 63 0a 2a 2a 20 63   alphabetic.** c
00a0: 68 61 72 61 63 74 65 72 73 2e 20 20 41 6c 6c 20  haracters.  All 
00b0: 64 69 67 69 74 73 2c 20 70 75 6e 63 74 75 61 74  digits, punctuat
00c0: 69 6f 6e 2c 20 61 6e 64 20 77 68 69 74 65 73 70  ion, and whitesp
00d0: 61 63 65 20 63 68 61 72 61 63 74 65 72 73 20 61  ace characters a
00e0: 72 65 20 0a 2a 2a 20 77 6f 72 64 20 73 65 70 61  re .** word sepa
00f0: 72 61 74 6f 72 73 2e 20 20 54 68 65 20 64 61 74  rators.  The dat
0100: 61 62 61 73 65 20 73 74 6f 72 65 73 20 61 20 73  abase stores a s
0110: 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 6f 72 20  ingle entry for 
0120: 65 61 63 68 20 64 69 73 74 69 6e 63 74 0a 2a 2a  each distinct.**
0130: 20 77 6f 72 64 20 74 6f 67 65 74 68 65 72 20 77   word together w
0140: 69 74 68 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  ith a count of t
0150: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 63 63  he number of occ
0160: 75 72 72 65 6e 63 65 73 20 6f 66 20 74 68 61 74  urrences of that
0170: 20 77 6f 72 64 2e 0a 2a 2a 20 41 20 66 72 65 73   word..** A fres
0180: 68 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  h database is cr
0190: 65 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61  eated automatica
01a0: 6c 6c 79 20 6f 6e 20 65 61 63 68 20 72 75 6e 2e  lly on each run.
01b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 77 6f 72 64 63  .**.**     wordc
01c0: 6f 75 6e 74 20 44 41 54 41 42 41 53 45 20 49 4e  ount DATABASE IN
01d0: 50 55 54 46 49 4c 45 0a 2a 2a 0a 2a 2a 20 54 68  PUTFILE.**.** Th
01e0: 65 20 49 4e 50 55 54 46 49 4c 45 20 6e 61 6d 65  e INPUTFILE name
01f0: 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2c   can be omitted,
0200: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 69   in which case i
0210: 6e 70 75 74 20 69 74 20 74 61 6b 65 6e 20 66 72  nput it taken fr
0220: 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  om.** standard i
0230: 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 70 74 69  nput..**.** Opti
0240: 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2d 2d  on:.**.**     --
0250: 77 69 74 68 6f 75 74 2d 72 6f 77 69 64 20 20 20  without-rowid   
0260: 20 20 20 55 73 65 20 61 20 57 49 54 48 4f 55 54     Use a WITHOUT
0270: 20 52 4f 57 49 44 20 74 61 62 6c 65 20 74 6f 20   ROWID table to 
0280: 73 74 6f 72 65 20 74 68 65 20 77 6f 72 64 73 2e  store the words.
0290: 0a 2a 2a 20 20 20 20 20 2d 2d 69 6e 73 65 72 74  .**     --insert
02a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65               Use
02b0: 20 49 4e 53 45 52 54 20 6d 6f 64 65 20 28 74 68   INSERT mode (th
02c0: 65 20 64 65 66 61 75 6c 74 29 0a 2a 2a 20 20 20  e default).**   
02d0: 20 20 2d 2d 72 65 70 6c 61 63 65 20 20 20 20 20    --replace     
02e0: 20 20 20 20 20 20 20 55 73 65 20 52 45 50 4c 41         Use REPLA
02f0: 43 45 20 6d 6f 64 65 0a 2a 2a 20 20 20 20 20 2d  CE mode.**     -
0300: 2d 73 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  -select         
0310: 20 20 20 20 55 73 65 20 53 45 4c 45 43 54 20 6d      Use SELECT m
0320: 6f 64 65 0a 2a 2a 20 20 20 20 20 2d 2d 75 70 64  ode.**     --upd
0330: 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ate             
0340: 55 73 65 20 55 50 44 41 54 45 20 6d 6f 64 65 0a  Use UPDATE mode.
0350: 2a 2a 20 20 20 20 20 2d 2d 6e 6f 63 61 73 65 20  **     --nocase 
0360: 20 20 20 20 20 20 20 20 20 20 20 20 41 64 64 20              Add 
0370: 74 68 65 20 4e 4f 43 41 53 45 20 63 6f 6c 6c 61  the NOCASE colla
0380: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
0390: 20 74 68 65 20 77 6f 72 64 73 2e 0a 2a 2a 20 20   the words..**  
03a0: 20 20 20 2d 2d 74 72 61 63 65 20 20 20 20 20 20     --trace      
03b0: 20 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20 73          Enable s
03c0: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 20 6f  qlite3_trace() o
03d0: 75 74 70 75 74 2e 0a 2a 2a 20 20 20 20 20 2d 2d  utput..**     --
03e0: 73 75 6d 6d 61 72 79 20 20 20 20 20 20 20 20 20  summary         
03f0: 20 20 20 53 68 6f 77 20 73 75 6d 6d 61 72 79 20     Show summary 
0400: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74  information on t
0410: 68 65 20 63 6f 6c 6c 65 63 74 65 64 20 64 61 74  he collected dat
0420: 61 2e 0a 2a 2a 20 20 20 20 20 2d 2d 73 74 61 74  a..**     --stat
0430: 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  s              S
0440: 68 6f 77 20 73 71 6c 69 74 65 33 5f 73 74 61 74  how sqlite3_stat
0450: 75 73 28 29 20 72 65 73 75 6c 74 73 20 61 74 20  us() results at 
0460: 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 4d  the end..**.** M
0470: 6f 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 49 6e 73 65  odes:.**.** Inse
0480: 72 74 20 6d 6f 64 65 20 6d 65 61 6e 73 3a 0a 2a  rt mode means:.*
0490: 2a 20 20 20 20 28 31 29 20 49 4e 53 45 52 54 20  *    (1) INSERT 
04a0: 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 77  OR IGNORE INTO w
04b0: 6f 72 64 63 6f 75 6e 74 20 56 41 4c 55 45 53 28  ordcount VALUES(
04c0: 24 6e 65 77 2c 31 29 0a 2a 2a 20 20 20 20 28 32  $new,1).**    (2
04d0: 29 20 55 50 44 41 54 45 20 77 6f 72 64 63 6f 75  ) UPDATE wordcou
04e0: 6e 74 20 53 45 54 20 63 6e 74 3d 63 6e 74 2b 31  nt SET cnt=cnt+1
04f0: 20 57 48 45 52 45 20 77 6f 72 64 3d 24 6e 65 77   WHERE word=$new
0500: 20 2d 2d 20 69 66 20 28 31 29 20 69 73 20 61 20   -- if (1) is a 
0510: 6e 6f 6f 70 0a 2a 2a 0a 2a 2a 20 55 70 64 61 74  noop.**.** Updat
0520: 65 20 6d 6f 64 65 20 6d 65 61 6e 73 3a 0a 2a 2a  e mode means:.**
0530: 20 20 20 20 28 31 29 20 49 4e 53 45 52 54 20 4f      (1) INSERT O
0540: 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 77 6f  R IGNORE INTO wo
0550: 72 64 63 6f 75 6e 74 20 56 41 4c 55 45 53 28 24  rdcount VALUES($
0560: 6e 65 77 2c 30 29 0a 2a 2a 20 20 20 20 28 32 29  new,0).**    (2)
0570: 20 55 50 44 41 54 45 20 77 6f 72 64 63 6f 75 6e   UPDATE wordcoun
0580: 74 20 53 45 54 20 63 6e 74 3d 63 6e 74 2b 31 20  t SET cnt=cnt+1 
0590: 57 48 45 52 45 20 77 6f 72 64 3d 24 6e 65 77 0a  WHERE word=$new.
05a0: 2a 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 6d 6f  **.** Replace mo
05b0: 64 65 20 6d 65 61 6e 73 3a 0a 2a 2a 20 20 20 20  de means:.**    
05c0: 28 31 29 20 52 45 50 4c 41 43 45 20 49 4e 54 4f  (1) REPLACE INTO
05d0: 20 77 6f 72 64 63 6f 75 6e 74 0a 2a 2a 20 20 20   wordcount.**   
05e0: 20 20 20 20 20 56 41 4c 55 45 53 28 24 6e 65 77       VALUES($new
05f0: 2c 69 66 6e 75 6c 6c 28 28 53 45 4c 45 43 54 20  ,ifnull((SELECT 
0600: 63 6e 74 20 46 52 4f 4d 20 77 6f 72 64 63 6f 75  cnt FROM wordcou
0610: 6e 74 20 57 48 45 52 45 20 77 6f 72 64 3d 24 6e  nt WHERE word=$n
0620: 65 77 29 2c 30 29 2b 31 29 3b 0a 2a 2a 0a 2a 2a  ew),0)+1);.**.**
0630: 20 53 65 6c 65 63 74 20 6d 6f 64 65 20 6d 6f 64   Select mode mod
0640: 65 73 3a 0a 2a 2a 20 20 20 20 28 31 29 20 53 45  es:.**    (1) SE
0650: 4c 45 43 54 20 31 20 46 52 4f 4d 20 77 6f 72 64  LECT 1 FROM word
0660: 63 6f 75 6e 74 20 57 48 45 52 45 20 77 6f 72 64  count WHERE word
0670: 3d 24 6e 65 77 77 6f 72 64 0a 2a 2a 20 20 20 20  =$newword.**    
0680: 28 32 29 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  (2) INSERT INTO 
0690: 77 6f 72 64 63 6f 75 6e 74 20 56 41 4c 55 45 53  wordcount VALUES
06a0: 28 24 6e 65 77 2c 31 29 20 2d 2d 20 69 66 20 28  ($new,1) -- if (
06b0: 31 29 20 72 65 74 75 72 6e 73 20 6e 6f 74 68 69  1) returns nothi
06c0: 6e 67 0a 2a 2a 20 20 20 20 28 33 29 20 55 50 44  ng.**    (3) UPD
06d0: 41 54 45 20 77 6f 72 64 63 6f 75 6e 74 20 53 45  ATE wordcount SE
06e0: 54 20 63 6e 74 3d 63 6e 74 2b 31 20 57 48 45 52  T cnt=cnt+1 WHER
06f0: 45 20 77 6f 72 64 3d 24 6e 65 77 20 20 2d 2d 69  E word=$new  --i
0700: 66 20 28 31 29 20 72 65 74 75 72 6e 20 54 52 55  f (1) return TRU
0710: 45 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  E.**.***********
0720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0760: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  ***.**.** Compil
0770: 65 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  e as follows:.**
0780: 0a 2a 2a 20 20 20 20 67 63 63 20 2d 49 2e 20 77  .**    gcc -I. w
0790: 6f 72 64 63 6f 75 6e 74 2e 63 20 73 71 6c 69 74  ordcount.c sqlit
07a0: 65 33 2e 63 20 2d 6c 64 6c 20 2d 6c 70 74 68 72  e3.c -ldl -lpthr
07b0: 65 61 64 73 0a 2a 2a 0a 2a 2a 20 4f 72 3a 0a 2a  eads.**.** Or:.*
07c0: 2a 0a 2a 2a 20 20 20 20 67 63 63 20 2d 49 2e 20  *.**    gcc -I. 
07d0: 2d 44 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  -DSQLITE_THREADS
07e0: 41 46 45 3d 30 20 2d 44 53 51 4c 49 54 45 5f 4f  AFE=0 -DSQLITE_O
07f0: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
0800: 4f 4e 20 5c 0a 2a 2a 20 20 20 20 20 20 20 20 77  ON \.**        w
0810: 6f 72 64 63 6f 75 6e 74 2e 63 20 73 71 6c 69 74  ordcount.c sqlit
0820: 65 33 2e 63 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  e3.c.*/.#include
0830: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c   <stdio.h>.#incl
0840: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
0850: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0860: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  >.#include <stdl
0870: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
0880: 73 74 64 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75  stdarg.h>.#inclu
0890: 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 0a  de "sqlite3.h"..
08a0: 2f 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f  /* Print an erro
08b0: 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 65 78  r message and ex
08c0: 69 74 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  it */.static voi
08d0: 64 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 63 6f  d fatal_error(co
08e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 2c 20  nst char *zMsg, 
08f0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
0900: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
0910: 70 2c 20 7a 4d 73 67 29 3b 0a 20 20 76 66 70 72  p, zMsg);.  vfpr
0920: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 7a 4d 73  intf(stderr, zMs
0930: 67 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  g, ap);.  va_end
0940: 28 61 70 29 3b 0a 20 20 65 78 69 74 28 31 29 3b  (ap);.  exit(1);
0950: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 73 71 6c 69 74  .}../* The sqlit
0960: 65 33 5f 74 72 61 63 65 28 29 20 63 61 6c 6c 62  e3_trace() callb
0970: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ack function */.
0980: 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 63  static void trac
0990: 65 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  eCallback(void *
09a0: 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63  NotUsed, const c
09b0: 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 70 72  har *zSql){.  pr
09c0: 69 6e 74 66 28 22 25 73 3b 5c 6e 22 2c 20 7a 53  intf("%s;\n", zS
09d0: 71 6c 29 3b 0a 7d 0a 0a 2f 2a 20 41 6e 20 73 71  ql);.}../* An sq
09e0: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
09f0: 6c 62 61 63 6b 20 74 68 61 74 20 70 72 69 6e 74  lback that print
0a00: 73 20 72 65 73 75 6c 74 73 20 6f 6e 20 73 74 61  s results on sta
0a10: 6e 64 61 72 64 20 6f 75 74 70 75 74 2c 0a 2a 2a  ndard output,.**
0a20: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 73 65 70   each column sep
0a30: 61 72 61 74 65 64 20 62 79 20 61 20 73 69 6e 67  arated by a sing
0a40: 6c 65 20 73 70 61 63 65 2e 20 2a 2f 0a 73 74 61  le space. */.sta
0a50: 74 69 63 20 69 6e 74 20 70 72 69 6e 74 52 65 73  tic int printRes
0a60: 75 6c 74 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65  ult(void *NotUse
0a70: 64 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61  d, int nArg, cha
0a80: 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20  r **azArg, char 
0a90: 2a 2a 61 7a 4e 6d 29 7b 0a 20 20 69 6e 74 20 69  **azNm){.  int i
0aa0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
0ab0: 7a 46 6f 72 6d 61 74 20 3d 20 22 25 73 22 3b 0a  zFormat = "%s";.
0ac0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
0ad0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 72 69  g; i++){.    pri
0ae0: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 7a 41  ntf(zFormat, azA
0af0: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7a 46 6f 72  rg[i]);.    zFor
0b00: 6d 61 74 20 3d 20 22 20 25 73 22 3b 0a 20 20 7d  mat = " %s";.  }
0b10: 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b  .  printf("\n");
0b20: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
0b30: 0a 2f 2a 20 44 65 66 69 6e 65 20 6f 70 65 72 61  ./* Define opera
0b40: 74 69 6e 67 20 6d 6f 64 65 73 20 2a 2f 0a 23 64  ting modes */.#d
0b50: 65 66 69 6e 65 20 4d 4f 44 45 5f 49 4e 53 45 52  efine MODE_INSER
0b60: 54 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20  T     0.#define 
0b70: 4d 4f 44 45 5f 52 45 50 4c 41 43 45 20 20 20 20  MODE_REPLACE    
0b80: 31 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 53  1.#define MODE_S
0b90: 45 4c 45 43 54 20 20 20 20 20 32 0a 23 64 65 66  ELECT     2.#def
0ba0: 69 6e 65 20 4d 4f 44 45 5f 55 50 44 41 54 45 20  ine MODE_UPDATE 
0bb0: 20 20 20 20 33 0a 0a 69 6e 74 20 6d 61 69 6e 28      3..int main(
0bc0: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
0bd0: 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20  *argv){.  const 
0be0: 63 68 61 72 20 2a 7a 46 69 6c 65 54 6f 52 65 61  char *zFileToRea
0bf0: 64 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 70 75 74  d = 0;  /* Input
0c00: 20 66 69 6c 65 2e 20 20 4e 55 4c 4c 20 66 6f 72   file.  NULL for
0c10: 20 73 74 64 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73   stdin */.  cons
0c20: 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
0c30: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d  = 0;      /* Nam
0c40: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
0c50: 65 20 66 69 6c 65 20 74 6f 20 63 72 65 61 74 65  e file to create
0c60: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 57 69 74   */.  int useWit
0c70: 68 6f 75 74 52 6f 77 69 64 20 3d 20 30 3b 20 20  houtRowid = 0;  
0c80: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0c90: 2d 2d 77 69 74 68 6f 75 74 2d 72 6f 77 69 64 20  --without-rowid 
0ca0: 2a 2f 0a 20 20 69 6e 74 20 69 4d 6f 64 65 20 3d  */.  int iMode =
0cb0: 20 4d 4f 44 45 5f 49 4e 53 45 52 54 3b 20 20 20   MODE_INSERT;   
0cc0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 4d 4f 44     /* One of MOD
0cd0: 45 5f 78 78 78 78 78 20 2a 2f 0a 20 20 69 6e 74  E_xxxxx */.  int
0ce0: 20 75 73 65 4e 6f 63 61 73 65 20 3d 20 30 3b 20   useNocase = 0; 
0cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
0d00: 75 65 20 66 6f 72 20 2d 2d 6e 6f 63 61 73 65 20  ue for --nocase 
0d10: 2a 2f 0a 20 20 69 6e 74 20 64 6f 54 72 61 63 65  */.  int doTrace
0d20: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
0d30: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 2d     /* True for -
0d40: 2d 74 72 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20  -trace */.  int 
0d50: 73 68 6f 77 53 74 61 74 73 20 3d 20 30 3b 20 20  showStats = 0;  
0d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
0d70: 65 20 66 6f 72 20 2d 2d 73 74 61 74 73 20 2a 2f  e for --stats */
0d80: 0a 20 20 69 6e 74 20 73 68 6f 77 53 75 6d 6d 61  .  int showSumma
0d90: 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
0da0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 2d 2d 73   /* True for --s
0db0: 75 6d 6d 61 72 79 20 2a 2f 0a 20 20 69 6e 74 20  ummary */.  int 
0dc0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
0dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
0de0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
0df0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0e10: 20 54 68 65 20 53 51 4c 69 74 65 20 64 61 74 61   The SQLite data
0e20: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
0e30: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  */.  char *zSql;
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e50: 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 65     /* Constructe
0e60: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  d SQL statement 
0e70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
0e80: 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 20  t *pInsert = 0; 
0e90: 20 20 20 2f 2a 20 54 68 65 20 49 4e 53 45 52 54     /* The INSERT
0ea0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
0eb0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 55  sqlite3_stmt *pU
0ec0: 70 64 61 74 65 20 3d 20 30 3b 20 20 20 20 2f 2a  pdate = 0;    /*
0ed0: 20 54 68 65 20 55 50 44 41 54 45 20 73 74 61 74   The UPDATE stat
0ee0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ement */.  sqlit
0ef0: 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74  e3_stmt *pSelect
0f00: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68 65 20   = 0;    /* The 
0f10: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
0f20: 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20   */.  FILE *in; 
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f40: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20      /* The open 
0f50: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
0f60: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f80: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
0f90: 6d 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 74 65  m an SQLite inte
0fa0: 72 66 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69  rface */.  int i
0fb0: 43 75 72 2c 20 69 48 69 77 74 72 3b 20 20 20 20  Cur, iHiwtr;    
0fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
0fd0: 69 73 74 69 63 73 20 76 61 6c 75 65 73 2c 20 63  istics values, c
0fe0: 75 72 72 65 6e 74 20 61 6e 64 20 22 68 69 67 68  urrent and "high
0ff0: 77 61 74 65 72 22 20 2a 2f 0a 20 20 63 68 61 72  water" */.  char
1000: 20 7a 49 6e 70 75 74 5b 32 30 30 30 5d 3b 20 20   zInput[2000];  
1010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
1020: 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e  ingle line of in
1030: 70 75 74 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 6f  put */..  /* Pro
1040: 63 65 73 73 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  cess command-lin
1050: 65 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  e arguments */. 
1060: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63   for(i=1; i<argc
1070: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
1080: 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76  t char *z = argv
1090: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  [i];.    if( z[0
10a0: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
10b0: 64 6f 7b 20 7a 2b 2b 3b 20 7d 77 68 69 6c 65 28  do{ z++; }while(
10c0: 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 3b 0a 20 20   z[0]=='-' );.  
10d0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
10e0: 2c 22 77 69 74 68 6f 75 74 2d 72 6f 77 69 64 22  ,"without-rowid"
10f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1100: 75 73 65 57 69 74 68 6f 75 74 52 6f 77 69 64 20  useWithoutRowid 
1110: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
1120: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 72   if( strcmp(z,"r
1130: 65 70 6c 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20  eplace")==0 ){. 
1140: 20 20 20 20 20 20 20 69 4d 6f 64 65 20 3d 20 4d         iMode = M
1150: 4f 44 45 5f 52 45 50 4c 41 43 45 3b 0a 20 20 20  ODE_REPLACE;.   
1160: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1170: 63 6d 70 28 7a 2c 22 73 65 6c 65 63 74 22 29 3d  cmp(z,"select")=
1180: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4d  =0 ){.        iM
1190: 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 45 4c 45 43  ode = MODE_SELEC
11a0: 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  T;.      }else i
11b0: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 69 6e 73  f( strcmp(z,"ins
11c0: 65 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ert")==0 ){.    
11d0: 20 20 20 20 69 4d 6f 64 65 20 3d 20 4d 4f 44 45      iMode = MODE
11e0: 5f 49 4e 53 45 52 54 3b 0a 20 20 20 20 20 20 7d  _INSERT;.      }
11f0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1200: 7a 2c 22 75 70 64 61 74 65 22 29 3d 3d 30 20 29  z,"update")==0 )
1210: 7b 0a 20 20 20 20 20 20 20 20 69 4d 6f 64 65 20  {.        iMode 
1220: 3d 20 4d 4f 44 45 5f 55 50 44 41 54 45 3b 0a 20  = MODE_UPDATE;. 
1230: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1240: 74 72 63 6d 70 28 7a 2c 22 6e 6f 63 61 73 65 22  trcmp(z,"nocase"
1250: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1260: 75 73 65 4e 6f 63 61 73 65 20 3d 20 31 3b 0a 20  useNocase = 1;. 
1270: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1280: 74 72 63 6d 70 28 7a 2c 22 74 72 61 63 65 22 29  trcmp(z,"trace")
1290: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==0 ){.        d
12a0: 6f 54 72 61 63 65 20 3d 20 31 3b 0a 20 20 20 20  oTrace = 1;.    
12b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
12c0: 6d 70 28 7a 2c 22 73 74 61 74 73 22 29 3d 3d 30  mp(z,"stats")==0
12d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 68 6f 77   ){.        show
12e0: 53 74 61 74 73 20 3d 20 31 3b 0a 20 20 20 20 20  Stats = 1;.     
12f0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1300: 70 28 7a 2c 22 73 75 6d 6d 61 72 79 22 29 3d 3d  p(z,"summary")==
1310: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 68 6f  0 ){.        sho
1320: 77 53 75 6d 6d 61 72 79 20 3d 20 31 3b 0a 20 20  wSummary = 1;.  
1330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1340: 20 20 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22     fatal_error("
1350: 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  unknown option: 
1360: 25 73 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29 3b  %s\n", argv[i]);
1370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1380: 73 65 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d  se if( zDbName==
1390: 30 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 4e 61  0 ){.      zDbNa
13a0: 6d 65 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20  me = argv[i];.  
13b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 46 69 6c    }else if( zFil
13c0: 65 54 6f 52 65 61 64 3d 3d 30 20 29 7b 0a 20 20  eToRead==0 ){.  
13d0: 20 20 20 20 7a 46 69 6c 65 54 6f 52 65 61 64 20      zFileToRead 
13e0: 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 7d  = argv[i];.    }
13f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 61 74 61  else{.      fata
1400: 6c 5f 65 72 72 6f 72 28 22 73 75 72 70 6c 75 73  l_error("surplus
1410: 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c 6e 22   argument: %s\n"
1420: 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  , argv[i]);.    
1430: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 44 62 4e  }.  }.  if( zDbN
1440: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 61  ame==0 ){.    fa
1450: 74 61 6c 5f 65 72 72 6f 72 28 22 55 73 61 67 65  tal_error("Usage
1460: 3a 20 25 73 20 5b 2d 2d 6f 70 74 69 6f 6e 73 5d  : %s [--options]
1470: 20 44 41 54 41 42 41 53 45 20 5b 49 4e 50 55 54   DATABASE [INPUT
1480: 46 49 4c 45 5d 5c 6e 22 2c 20 61 72 67 76 5b 30  FILE]\n", argv[0
1490: 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  ]);.  }..  /* Op
14a0: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
14b0: 61 6e 64 20 74 68 65 20 69 6e 70 75 74 20 66 69  and the input fi
14c0: 6c 65 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  le */.  if( sqli
14d0: 74 65 33 5f 6f 70 65 6e 28 7a 44 62 4e 61 6d 65  te3_open(zDbName
14e0: 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 66 61  , &db) ){.    fa
14f0: 74 61 6c 5f 65 72 72 6f 72 28 22 43 61 6e 6e 6f  tal_error("Canno
1500: 74 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  t open database 
1510: 66 69 6c 65 3a 20 25 73 5c 6e 22 2c 20 7a 44 62  file: %s\n", zDb
1520: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Name);.  }.  if(
1530: 20 7a 46 69 6c 65 54 6f 52 65 61 64 20 29 7b 0a   zFileToRead ){.
1540: 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a      in = fopen(z
1550: 46 69 6c 65 54 6f 52 65 61 64 2c 20 22 72 62 22  FileToRead, "rb"
1560: 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  );.    if( in==0
1570: 20 29 7b 0a 20 20 20 20 20 20 66 61 74 61 6c 5f   ){.      fatal_
1580: 65 72 72 6f 72 28 22 43 6f 75 6c 64 20 6e 6f 74  error("Could not
1590: 20 6f 70 65 6e 20 69 6e 70 75 74 20 66 69 6c 65   open input file
15a0: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
15b0: 65 54 6f 52 65 61 64 29 3b 0a 20 20 20 20 7d 0a  eToRead);.    }.
15c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 20    }else{.    in 
15d0: 3d 20 73 74 64 69 6e 3b 0a 20 20 7d 0a 0a 20 20  = stdin;.  }..  
15e0: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
15f0: 20 22 77 6f 72 64 63 6f 75 6e 74 22 20 74 61 62   "wordcount" tab
1600: 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f  le into which to
1610: 20 70 75 74 20 74 68 65 20 77 6f 72 64 73 20 2a   put the words *
1620: 2f 0a 20 20 69 66 28 20 64 6f 54 72 61 63 65 20  /.  if( doTrace 
1630: 29 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28  ) sqlite3_trace(
1640: 64 62 2c 20 74 72 61 63 65 43 61 6c 6c 62 61 63  db, traceCallbac
1650: 6b 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c  k, 0);.  if( sql
1660: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 42  ite3_exec(db, "B
1670: 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 2c  EGIN IMMEDIATE",
1680: 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20   0, 0, 0) ){.   
1690: 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 43 6f   fatal_error("Co
16a0: 75 6c 64 20 6e 6f 74 20 73 74 61 72 74 20 61 20  uld not start a 
16b0: 74 72 61 6e 73 61 63 74 69 6f 6e 5c 6e 22 29 3b  transaction\n");
16c0: 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71  .  }.  zSql = sq
16d0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
16e0: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
16f0: 45 20 77 6f 72 64 63 6f 75 6e 74 28 5c 6e 22 0a  E wordcount(\n".
1700: 20 20 20 20 20 22 20 20 77 6f 72 64 20 54 45 58       "  word TEX
1710: 54 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f  T PRIMARY KEY CO
1720: 4c 4c 41 54 45 20 25 73 2c 5c 6e 22 0a 20 20 20  LLATE %s,\n".   
1730: 20 20 22 20 20 63 6e 74 20 49 4e 54 45 47 45 52    "  cnt INTEGER
1740: 5c 6e 22 0a 20 20 20 20 20 22 29 25 73 22 2c 0a  \n".     ")%s",.
1750: 20 20 20 20 20 75 73 65 4e 6f 63 61 73 65 20 3f       useNocase ?
1760: 20 22 6e 6f 63 61 73 65 22 20 3a 20 22 62 69 6e   "nocase" : "bin
1770: 61 72 79 22 2c 0a 20 20 20 20 20 75 73 65 57 69  ary",.     useWi
1780: 74 68 6f 75 74 52 6f 77 69 64 20 3f 20 22 20 57  thoutRowid ? " W
1790: 49 54 48 4f 55 54 20 52 4f 57 49 44 22 20 3a 20  ITHOUT ROWID" : 
17a0: 22 22 0a 20 20 29 3b 0a 20 20 69 66 28 20 7a 53  "".  );.  if( zS
17b0: 71 6c 3d 3d 30 20 29 20 66 61 74 61 6c 5f 65 72  ql==0 ) fatal_er
17c0: 72 6f 72 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror("out of memo
17d0: 72 79 5c 6e 22 29 3b 0a 20 20 72 63 20 3d 20 73  ry\n");.  rc = s
17e0: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
17f0: 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  zSql, 0, 0, 0);.
1800: 20 20 69 66 28 20 72 63 20 29 20 66 61 74 61 6c    if( rc ) fatal
1810: 5f 65 72 72 6f 72 28 22 43 6f 75 6c 64 20 6e 6f  _error("Could no
1820: 74 20 63 72 65 61 74 65 20 74 68 65 20 77 6f 72  t create the wor
1830: 64 63 6f 75 6e 74 20 74 61 62 6c 65 3a 20 25 73  dcount table: %s
1840: 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .\n",.          
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1860: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
1870: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1880: 28 7a 53 71 6c 29 3b 0a 0a 20 20 2f 2a 20 50 72  (zSql);..  /* Pr
1890: 65 70 61 72 65 20 53 51 4c 20 73 74 61 74 65 6d  epare SQL statem
18a0: 65 6e 74 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ents that will b
18b0: 65 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66  e needed */.  if
18c0: 28 20 69 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 53 45  ( iMode==MODE_SE
18d0: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  LECT ){.    rc =
18e0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
18f0: 5f 76 32 28 64 62 2c 0a 20 20 20 20 20 20 20 20  _v2(db,.        
1900: 20 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d    "SELECT 1 FROM
1910: 20 77 6f 72 64 63 6f 75 6e 74 20 57 48 45 52 45   wordcount WHERE
1920: 20 77 6f 72 64 3d 3f 31 22 2c 0a 20 20 20 20 20   word=?1",.     
1930: 20 20 20 20 20 2d 31 2c 20 26 70 53 65 6c 65 63       -1, &pSelec
1940: 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
1950: 63 20 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28  c ) fatal_error(
1960: 22 43 6f 75 6c 64 20 6e 6f 74 20 70 72 65 70 61  "Could not prepa
1970: 72 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  re the SELECT st
1980: 61 74 65 6d 65 6e 74 3a 20 25 73 5c 6e 22 2c 0a  atement: %s\n",.
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19b0: 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
19c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
19d0: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 0a 20  prepare_v2(db,. 
19e0: 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54           "INSERT
19f0: 20 49 4e 54 4f 20 77 6f 72 64 63 6f 75 6e 74 28   INTO wordcount(
1a00: 77 6f 72 64 2c 63 6e 74 29 20 56 41 4c 55 45 53  word,cnt) VALUES
1a10: 28 3f 31 2c 31 29 22 2c 0a 20 20 20 20 20 20 20  (?1,1)",.       
1a20: 20 20 20 2d 31 2c 20 26 70 49 6e 73 65 72 74 2c     -1, &pInsert,
1a30: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
1a40: 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 43  ) fatal_error("C
1a50: 6f 75 6c 64 20 6e 6f 74 20 70 72 65 70 61 72 65  ould not prepare
1a60: 20 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74   the INSERT stat
1a70: 65 6d 65 6e 74 3a 20 25 73 5c 6e 22 2c 0a 20 20  ement: %s\n",.  
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1aa0: 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
1ab0: 20 20 69 66 28 20 69 4d 6f 64 65 3d 3d 4d 4f 44    if( iMode==MOD
1ac0: 45 5f 53 45 4c 45 43 54 20 7c 7c 20 69 4d 6f 64  E_SELECT || iMod
1ad0: 65 3d 3d 4d 4f 44 45 5f 55 50 44 41 54 45 20 7c  e==MODE_UPDATE |
1ae0: 7c 20 69 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 49 4e  | iMode==MODE_IN
1af0: 53 45 52 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  SERT ){.    rc =
1b00: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1b10: 5f 76 32 28 64 62 2c 0a 20 20 20 20 20 20 20 20  _v2(db,.        
1b20: 20 20 22 55 50 44 41 54 45 20 77 6f 72 64 63 6f    "UPDATE wordco
1b30: 75 6e 74 20 53 45 54 20 63 6e 74 3d 63 6e 74 2b  unt SET cnt=cnt+
1b40: 31 20 57 48 45 52 45 20 77 6f 72 64 3d 3f 31 22  1 WHERE word=?1"
1b50: 2c 0a 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20  ,.          -1, 
1b60: 26 70 55 70 64 61 74 65 2c 20 30 29 3b 0a 20 20  &pUpdate, 0);.  
1b70: 20 20 69 66 28 20 72 63 20 29 20 66 61 74 61 6c    if( rc ) fatal
1b80: 5f 65 72 72 6f 72 28 22 43 6f 75 6c 64 20 6e 6f  _error("Could no
1b90: 74 20 70 72 65 70 61 72 65 20 74 68 65 20 55 50  t prepare the UP
1ba0: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 3a 20  DATE statement: 
1bb0: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
1be0: 62 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  b));.  }.  if( i
1bf0: 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 49 4e 53 45 52  Mode==MODE_INSER
1c00: 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  T ){.    rc = sq
1c10: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1c20: 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22  (db,.          "
1c30: 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45  INSERT OR IGNORE
1c40: 20 49 4e 54 4f 20 77 6f 72 64 63 6f 75 6e 74 28   INTO wordcount(
1c50: 77 6f 72 64 2c 63 6e 74 29 20 56 41 4c 55 45 53  word,cnt) VALUES
1c60: 28 3f 31 2c 31 29 22 2c 0a 20 20 20 20 20 20 20  (?1,1)",.       
1c70: 20 20 20 2d 31 2c 20 26 70 49 6e 73 65 72 74 2c     -1, &pInsert,
1c80: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
1c90: 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 43  ) fatal_error("C
1ca0: 6f 75 6c 64 20 6e 6f 74 20 70 72 65 70 61 72 65  ould not prepare
1cb0: 20 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74   the INSERT stat
1cc0: 65 6d 65 6e 74 3a 20 25 73 5c 6e 22 2c 0a 20 20  ement: %s\n",.  
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1cf0: 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
1d00: 20 20 69 66 28 20 69 4d 6f 64 65 3d 3d 4d 4f 44    if( iMode==MOD
1d10: 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20  E_UPDATE ){.    
1d20: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1d30: 70 61 72 65 5f 76 32 28 64 62 2c 0a 20 20 20 20  pare_v2(db,.    
1d40: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52        "INSERT OR
1d50: 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 77 6f 72   IGNORE INTO wor
1d60: 64 63 6f 75 6e 74 28 77 6f 72 64 2c 63 6e 74 29  dcount(word,cnt)
1d70: 20 56 41 4c 55 45 53 28 3f 31 2c 30 29 22 2c 0a   VALUES(?1,0)",.
1d80: 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70            -1, &p
1d90: 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20 20 20 20  Insert, 0);.    
1da0: 69 66 28 20 72 63 20 29 20 66 61 74 61 6c 5f 65  if( rc ) fatal_e
1db0: 72 72 6f 72 28 22 43 6f 75 6c 64 20 6e 6f 74 20  rror("Could not 
1dc0: 70 72 65 70 61 72 65 20 74 68 65 20 49 4e 53 45  prepare the INSE
1dd0: 52 54 20 73 74 61 74 65 6d 65 6e 74 3a 20 25 73  RT statement: %s
1de0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1e00: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
1e10: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 4d 6f  );.  }.  if( iMo
1e20: 64 65 3d 3d 4d 4f 44 45 5f 52 45 50 4c 41 43 45  de==MODE_REPLACE
1e30: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1e40: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1e50: 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22 52  db,.          "R
1e60: 45 50 4c 41 43 45 20 49 4e 54 4f 20 77 6f 72 64  EPLACE INTO word
1e70: 63 6f 75 6e 74 28 77 6f 72 64 2c 63 6e 74 29 22  count(word,cnt)"
1e80: 0a 20 20 20 20 20 20 20 20 20 20 22 56 41 4c 55  .          "VALU
1e90: 45 53 28 3f 31 2c 63 6f 61 6c 65 73 63 65 28 28  ES(?1,coalesce((
1ea0: 53 45 4c 45 43 54 20 63 6e 74 20 46 52 4f 4d 20  SELECT cnt FROM 
1eb0: 77 6f 72 64 63 6f 75 6e 74 20 57 48 45 52 45 20  wordcount WHERE 
1ec0: 77 6f 72 64 3d 3f 31 29 2c 30 29 2b 31 29 22 2c  word=?1),0)+1)",
1ed0: 0a 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26  .          -1, &
1ee0: 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20 20 20  pInsert, 0);.   
1ef0: 20 69 66 28 20 72 63 20 29 20 66 61 74 61 6c 5f   if( rc ) fatal_
1f00: 65 72 72 6f 72 28 22 43 6f 75 6c 64 20 6e 6f 74  error("Could not
1f10: 20 70 72 65 70 61 72 65 20 74 68 65 20 52 45 50   prepare the REP
1f20: 4c 41 43 45 20 73 74 61 74 65 6d 65 6e 74 3a 20  LACE statement: 
1f30: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1f60: 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  db));.  }..  /* 
1f70: 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75  Process the inpu
1f80: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 77 68 69 6c  t file */.  whil
1f90: 65 28 20 66 67 65 74 73 28 7a 49 6e 70 75 74 2c  e( fgets(zInput,
1fa0: 20 73 69 7a 65 6f 66 28 7a 49 6e 70 75 74 29 2c   sizeof(zInput),
1fb0: 20 69 6e 29 20 29 7b 0a 20 20 20 20 66 6f 72 28   in) ){.    for(
1fc0: 69 3d 30 3b 20 7a 49 6e 70 75 74 5b 69 5d 3b 20  i=0; zInput[i]; 
1fd0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1fe0: 21 69 73 61 6c 70 68 61 28 7a 49 6e 70 75 74 5b  !isalpha(zInput[
1ff0: 69 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  i]) ) continue;.
2000: 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b        for(j=i+1;
2010: 20 69 73 61 6c 70 68 61 28 7a 49 6e 70 75 74 5b   isalpha(zInput[
2020: 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 0a 20 20 20  j]); j++){}..   
2030: 20 20 20 2f 2a 20 46 6f 75 6e 64 20 61 20 6e 65     /* Found a ne
2040: 77 20 77 6f 72 64 20 61 74 20 7a 49 6e 70 75 74  w word at zInput
2050: 5b 69 5d 20 74 68 61 74 20 69 73 20 6a 2d 69 20  [i] that is j-i 
2060: 62 79 74 65 73 20 6c 6f 6e 67 2e 20 0a 20 20 20  bytes long. .   
2070: 20 20 20 2a 2a 20 50 72 6f 63 65 73 73 20 69 74     ** Process it
2080: 20 69 6e 74 6f 20 74 68 65 20 77 6f 72 64 63 6f   into the wordco
2090: 75 6e 74 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  unt table.  */. 
20a0: 20 20 20 20 20 69 66 28 20 69 4d 6f 64 65 3d 3d       if( iMode==
20b0: 4d 4f 44 45 5f 53 45 4c 45 43 54 20 29 7b 0a 20  MODE_SELECT ){. 
20c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
20d0: 69 6e 64 5f 74 65 78 74 28 70 53 65 6c 65 63 74  ind_text(pSelect
20e0: 2c 20 31 2c 20 7a 49 6e 70 75 74 2b 69 2c 20 6a  , 1, zInput+i, j
20f0: 2d 69 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -i, SQLITE_STATI
2100: 43 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  C);.        rc =
2110: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
2120: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
2130: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
2140: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
2150: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  if( rc==SQLITE_R
2160: 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OW ){.          
2170: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
2180: 74 28 70 55 70 64 61 74 65 2c 20 31 2c 20 7a 49  t(pUpdate, 1, zI
2190: 6e 70 75 74 2b 69 2c 20 6a 2d 69 2c 20 53 51 4c  nput+i, j-i, SQL
21a0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
21b0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
21c0: 65 33 5f 73 74 65 70 28 70 55 70 64 61 74 65 29  e3_step(pUpdate)
21d0: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  !=SQLITE_DONE ){
21e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 61 74  .            fat
21f0: 61 6c 5f 65 72 72 6f 72 28 22 55 50 44 41 54 45  al_error("UPDATE
2200: 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20   failed: %s\n", 
2210: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
2220: 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  b));.          }
2230: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2240: 65 33 5f 72 65 73 65 74 28 70 55 70 64 61 74 65  e3_reset(pUpdate
2250: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2260: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2270: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
2280: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
2290: 65 78 74 28 70 49 6e 73 65 72 74 2c 20 31 2c 20  ext(pInsert, 1, 
22a0: 7a 49 6e 70 75 74 2b 69 2c 20 6a 2d 69 2c 20 53  zInput+i, j-i, S
22b0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
22c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
22d0: 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65 72  ite3_step(pInser
22e0: 74 29 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  t)!=SQLITE_DONE 
22f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
2300: 61 74 61 6c 5f 65 72 72 6f 72 28 22 49 6e 73 65  atal_error("Inse
2310: 72 74 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22  rt failed: %s\n"
2320: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
2330: 28 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20  (db));.         
2340: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
2350: 69 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65  ite3_reset(pInse
2360: 72 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  rt);.        }el
2370: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 61  se{.          fa
2380: 74 61 6c 5f 65 72 72 6f 72 28 22 53 45 4c 45 43  tal_error("SELEC
2390: 54 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c  T failed: %s\n",
23a0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
23b0: 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  db));.        }.
23c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
23e0: 64 5f 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20  d_text(pInsert, 
23f0: 31 2c 20 7a 49 6e 70 75 74 2b 69 2c 20 6a 2d 69  1, zInput+i, j-i
2400: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
2410: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
2420: 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65  lite3_step(pInse
2430: 72 74 29 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  rt)!=SQLITE_DONE
2440: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 61   ){.          fa
2450: 74 61 6c 5f 65 72 72 6f 72 28 22 49 4e 53 45 52  tal_error("INSER
2460: 54 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c  T failed: %s\n",
2470: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2480: 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  db));.        }.
2490: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
24a0: 72 65 73 65 74 28 70 49 6e 73 65 72 74 29 3b 0a  reset(pInsert);.
24b0: 20 20 20 20 20 20 20 20 69 66 28 20 69 4d 6f 64          if( iMod
24c0: 65 3d 3d 4d 4f 44 45 5f 55 50 44 41 54 45 0a 20  e==MODE_UPDATE. 
24d0: 20 20 20 20 20 20 20 20 7c 7c 20 28 69 4d 6f 64          || (iMod
24e0: 65 3d 3d 4d 4f 44 45 5f 49 4e 53 45 52 54 20 26  e==MODE_INSERT &
24f0: 26 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  & sqlite3_change
2500: 73 28 64 62 29 3d 3d 30 29 0a 20 20 20 20 20 20  s(db)==0).      
2510: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73    ){.          s
2520: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
2530: 28 70 55 70 64 61 74 65 2c 20 31 2c 20 7a 49 6e  (pUpdate, 1, zIn
2540: 70 75 74 2b 69 2c 20 6a 2d 69 2c 20 53 51 4c 49  put+i, j-i, SQLI
2550: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
2560: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2570: 33 5f 73 74 65 70 28 70 55 70 64 61 74 65 29 21  3_step(pUpdate)!
2580: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
2590: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 74 61              fata
25a0: 6c 5f 65 72 72 6f 72 28 22 55 50 44 41 54 45 20  l_error("UPDATE 
25b0: 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73  failed: %s\n", s
25c0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
25d0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ));.          }.
25e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25f0: 33 5f 72 65 73 65 74 28 70 55 70 64 61 74 65 29  3_reset(pUpdate)
2600: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2610: 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 6a 2d    }.      i = j-
2620: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  1;.    }.  }.  s
2630: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2640: 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
2650: 30 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 54  0);.  if( zFileT
2660: 6f 52 65 61 64 20 29 20 66 63 6c 6f 73 65 28 69  oRead ) fclose(i
2670: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  n);.  sqlite3_fi
2680: 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b  nalize(pInsert);
2690: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
26a0: 69 7a 65 28 70 55 70 64 61 74 65 29 3b 0a 20 20  ize(pUpdate);.  
26b0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
26c0: 28 70 53 65 6c 65 63 74 29 3b 0a 0a 20 20 69 66  (pSelect);..  if
26d0: 28 20 73 68 6f 77 53 75 6d 6d 61 72 79 20 29 7b  ( showSummary ){
26e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
26f0: 63 28 64 62 2c 20 0a 20 20 20 20 20 20 22 53 45  c(db, .      "SE
2700: 4c 45 43 54 20 27 2d 2d 20 63 6f 75 6e 74 28 2a  LECT '-- count(*
2710: 29 3a 20 20 27 2c 20 63 6f 75 6e 74 28 2a 29 20  ):  ', count(*) 
2720: 46 52 4f 4d 20 77 6f 72 64 63 6f 75 6e 74 3b 5c  FROM wordcount;\
2730: 6e 22 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  n".      "SELECT
2740: 20 27 2d 2d 20 73 75 6d 28 63 6e 74 29 3a 20 20   '-- sum(cnt):  
2750: 27 2c 20 73 75 6d 28 63 6e 74 29 20 46 52 4f 4d  ', sum(cnt) FROM
2760: 20 77 6f 72 64 63 6f 75 6e 74 3b 5c 6e 22 0a 20   wordcount;\n". 
2770: 20 20 20 20 20 22 53 45 4c 45 43 54 20 27 2d 2d       "SELECT '--
2780: 20 61 76 67 28 63 6e 74 29 3a 20 20 27 2c 20 61   avg(cnt):  ', a
2790: 76 67 28 63 6e 74 29 20 46 52 4f 4d 20 77 6f 72  vg(cnt) FROM wor
27a0: 64 63 6f 75 6e 74 3b 5c 6e 22 0a 20 20 20 20 20  dcount;\n".     
27b0: 20 22 53 45 4c 45 43 54 20 27 2d 2d 20 73 75 6d   "SELECT '-- sum
27c0: 28 63 6e 74 3d 31 29 3a 27 2c 20 73 75 6d 28 63  (cnt=1):', sum(c
27d0: 6e 74 3d 31 29 20 46 52 4f 4d 20 77 6f 72 64 63  nt=1) FROM wordc
27e0: 6f 75 6e 74 3b 5c 6e 22 0a 20 20 20 20 20 20 22  ount;\n".      "
27f0: 53 45 4c 45 43 54 20 27 2d 2d 20 74 6f 70 20 31  SELECT '-- top 1
2800: 30 3a 20 20 20 20 27 2c 20 67 72 6f 75 70 5f 63  0:    ', group_c
2810: 6f 6e 63 61 74 28 77 6f 72 64 2c 20 27 2c 20 27  oncat(word, ', '
2820: 29 20 46 52 4f 4d 20 22 0a 20 20 20 20 20 20 20  ) FROM ".       
2830: 20 20 22 28 53 45 4c 45 43 54 20 77 6f 72 64 20    "(SELECT word 
2840: 46 52 4f 4d 20 77 6f 72 64 63 6f 75 6e 74 20 4f  FROM wordcount O
2850: 52 44 45 52 20 42 59 20 63 6e 74 20 44 45 53 43  RDER BY cnt DESC
2860: 20 4c 49 4d 49 54 20 31 30 29 3b 5c 6e 22 2c 0a   LIMIT 10);\n",.
2870: 20 20 20 20 20 20 70 72 69 6e 74 52 65 73 75 6c        printResul
2880: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  t, 0, 0);.  }.. 
2890: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
28a0: 6e 65 63 74 69 6f 6e 20 73 74 61 74 69 73 74 69  nection statisti
28b0: 63 73 20 70 72 69 6e 74 65 64 20 61 66 74 65 72  cs printed after
28c0: 20 62 6f 74 68 20 70 72 65 70 61 72 65 64 20 73   both prepared s
28d0: 74 61 74 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 68  tatements.  ** h
28e0: 61 76 65 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  ave been finaliz
28f0: 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 68 6f 77  ed */.  if( show
2900: 53 74 61 74 73 20 29 7b 0a 20 20 20 20 73 71 6c  Stats ){.    sql
2910: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
2920: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
2930: 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45  US_LOOKASIDE_USE
2940: 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
2950: 72 2c 20 30 29 3b 0a 20 20 20 20 70 72 69 6e 74  r, 0);.    print
2960: 66 28 22 2d 2d 20 4c 6f 6f 6b 61 73 69 64 65 20  f("-- Lookaside 
2970: 53 6c 6f 74 73 20 55 73 65 64 3a 20 20 20 20 20  Slots Used:     
2980: 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e     %d (max %d)\n
2990: 22 2c 20 69 43 75 72 2c 69 48 69 77 74 72 29 3b  ", iCur,iHiwtr);
29a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
29b0: 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
29c0: 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41  E_DBSTATUS_LOOKA
29d0: 53 49 44 45 5f 48 49 54 2c 20 26 69 43 75 72 2c  SIDE_HIT, &iCur,
29e0: 20 26 69 48 69 77 74 72 2c 20 30 29 3b 0a 20 20   &iHiwtr, 0);.  
29f0: 20 20 70 72 69 6e 74 66 28 22 2d 2d 20 53 75 63    printf("-- Suc
2a00: 63 65 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64  cessful lookasid
2a10: 65 73 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c  es:       %d\n",
2a20: 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 73 71   iHiwtr);.    sq
2a30: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
2a40: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
2a50: 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49  TUS_LOOKASIDE_MI
2a60: 53 53 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 26  SS_SIZE, &iCur,&
2a70: 69 48 69 77 74 72 2c 30 29 3b 0a 20 20 20 20 70  iHiwtr,0);.    p
2a80: 72 69 6e 74 66 28 22 2d 2d 20 4c 6f 6f 6b 61 73  rintf("-- Lookas
2a90: 69 64 65 20 73 69 7a 65 20 66 61 75 6c 74 73 3a  ide size faults:
2aa0: 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 48         %d\n", iH
2ab0: 69 77 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iwtr);.    sqlit
2ac0: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
2ad0: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
2ae0: 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f  _LOOKASIDE_MISS_
2af0: 46 55 4c 4c 2c 20 26 69 43 75 72 2c 26 69 48 69  FULL, &iCur,&iHi
2b00: 77 74 72 2c 30 29 3b 0a 20 20 20 20 70 72 69 6e  wtr,0);.    prin
2b10: 74 66 28 22 2d 2d 20 4c 6f 6f 6b 61 73 69 64 65  tf("-- Lookaside
2b20: 20 4f 4f 4d 20 66 61 75 6c 74 73 3a 20 20 20 20   OOM faults:    
2b30: 20 20 20 20 25 64 5c 6e 22 2c 20 69 48 69 77 74      %d\n", iHiwt
2b40: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
2b50: 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
2b60: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
2b70: 43 48 45 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  CHE_USED, &iCur,
2b80: 20 26 69 48 69 77 74 72 2c 20 30 29 3b 0a 20 20   &iHiwtr, 0);.  
2b90: 20 20 70 72 69 6e 74 66 28 22 2d 2d 20 50 61 67    printf("-- Pag
2ba0: 65 72 20 48 65 61 70 20 55 73 61 67 65 3a 20 20  er Heap Usage:  
2bb0: 20 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74            %d byt
2bc0: 65 73 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  es\n", iCur);.  
2bd0: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
2be0: 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
2bf0: 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49  BSTATUS_CACHE_HI
2c00: 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  T, &iCur, &iHiwt
2c10: 72 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e 74  r, 1);.    print
2c20: 66 28 22 2d 2d 20 50 61 67 65 20 63 61 63 68 65  f("-- Page cache
2c30: 20 68 69 74 73 3a 20 20 20 20 20 20 20 20 20 20   hits:          
2c40: 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
2c50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
2c60: 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
2c70: 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
2c80: 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c 20 26 69  _MISS, &iCur, &i
2c90: 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 70  Hiwtr, 1);.    p
2ca0: 72 69 6e 74 66 28 22 2d 2d 20 50 61 67 65 20 63  rintf("-- Page c
2cb0: 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20 20  ache misses:    
2cc0: 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
2cd0: 75 72 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65  ur); .    sqlite
2ce0: 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
2cf0: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
2d00: 43 41 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43  CACHE_WRITE, &iC
2d10: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b  ur, &iHiwtr, 1);
2d20: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 20  .    printf("-- 
2d30: 50 61 67 65 20 63 61 63 68 65 20 77 72 69 74 65  Page cache write
2d40: 73 3a 20 20 20 20 20 20 20 20 20 20 20 25 64 5c  s:           %d\
2d50: 6e 22 2c 20 69 43 75 72 29 3b 20 0a 20 20 20 20  n", iCur); .    
2d60: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
2d70: 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
2d80: 54 41 54 55 53 5f 53 43 48 45 4d 41 5f 55 53 45  TATUS_SCHEMA_USE
2d90: 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
2da0: 72 2c 20 30 29 3b 0a 20 20 20 20 70 72 69 6e 74  r, 0);.    print
2db0: 66 28 22 2d 2d 20 53 63 68 65 6d 61 20 48 65 61  f("-- Schema Hea
2dc0: 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20  p Usage:        
2dd0: 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 20     %d bytes\n", 
2de0: 69 43 75 72 29 3b 20 0a 20 20 20 20 73 71 6c 69  iCur); .    sqli
2df0: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
2e00: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
2e10: 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20 26 69 43  S_STMT_USED, &iC
2e20: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 30 29 3b  ur, &iHiwtr, 0);
2e30: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 20  .    printf("-- 
2e40: 53 74 61 74 65 6d 65 6e 74 20 48 65 61 70 20 55  Statement Heap U
2e50: 73 61 67 65 3a 20 20 20 20 20 20 20 20 25 64 20  sage:        %d 
2e60: 62 79 74 65 73 5c 6e 22 2c 20 69 43 75 72 29 3b  bytes\n", iCur);
2e70: 20 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33   .  }..  sqlite3
2e80: 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 0a 20 20 2f  _close(db);..  /
2e90: 2a 20 47 6c 6f 62 61 6c 20 6d 65 6d 6f 72 79 20  * Global memory 
2ea0: 75 73 61 67 65 20 73 74 61 74 69 73 74 69 63 73  usage statistics
2eb0: 20 70 72 69 6e 74 65 64 20 61 66 74 65 72 20 74   printed after t
2ec0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
2ed0: 65 63 74 69 6f 6e 0a 20 20 2a 2a 20 68 61 73 20  ection.  ** has 
2ee0: 63 6c 6f 73 65 64 2e 20 20 4d 65 6d 6f 72 79 20  closed.  Memory 
2ef0: 75 73 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20  usage should be 
2f00: 7a 65 72 6f 20 61 74 20 74 68 69 73 20 70 6f 69  zero at this poi
2f10: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 73 68 6f  nt. */.  if( sho
2f20: 77 53 74 61 74 73 20 29 7b 0a 20 20 20 20 73 71  wStats ){.    sq
2f30: 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c  lite3_status(SQL
2f40: 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52  ITE_STATUS_MEMOR
2f50: 59 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26  Y_USED, &iCur, &
2f60: 69 48 69 77 74 72 2c 20 30 29 3b 0a 20 20 20 20  iHiwtr, 0);.    
2f70: 70 72 69 6e 74 66 28 22 2d 2d 20 4d 65 6d 6f 72  printf("-- Memor
2f80: 79 20 55 73 65 64 20 28 62 79 74 65 73 29 3a 20  y Used (bytes): 
2f90: 20 20 20 20 20 20 20 20 25 64 20 28 6d 61 78 20          %d (max 
2fa0: 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c 69 48 69  %d)\n", iCur,iHi
2fb0: 77 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  wtr);.    sqlite
2fc0: 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f  3_status(SQLITE_
2fd0: 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f  STATUS_MALLOC_CO
2fe0: 55 4e 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69  UNT, &iCur, &iHi
2ff0: 77 74 72 2c 20 30 29 3b 0a 20 20 20 20 70 72 69  wtr, 0);.    pri
3000: 6e 74 66 28 22 2d 2d 20 4f 75 74 73 74 61 6e 64  ntf("-- Outstand
3010: 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a  ing Allocations:
3020: 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29       %d (max %d)
3030: 5c 6e 22 2c 20 69 43 75 72 2c 69 48 69 77 74 72  \n", iCur,iHiwtr
3040: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
3050: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
3060: 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56  TUS_PAGECACHE_OV
3070: 45 52 46 4c 4f 57 2c 20 26 69 43 75 72 2c 20 26  ERFLOW, &iCur, &
3080: 69 48 69 77 74 72 2c 20 30 29 3b 0a 20 20 20 20  iHiwtr, 0);.    
3090: 70 72 69 6e 74 66 28 22 2d 2d 20 50 63 61 63 68  printf("-- Pcach
30a0: 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73  e Overflow Bytes
30b0: 3a 20 20 20 20 20 20 20 25 64 20 28 6d 61 78 20  :       %d (max 
30c0: 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c 69 48 69  %d)\n", iCur,iHi
30d0: 77 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  wtr);.    sqlite
30e0: 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f  3_status(SQLITE_
30f0: 53 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f 4f  STATUS_SCRATCH_O
3100: 56 45 52 46 4c 4f 57 2c 20 26 69 43 75 72 2c 20  VERFLOW, &iCur, 
3110: 26 69 48 69 77 74 72 2c 20 30 29 3b 0a 20 20 20  &iHiwtr, 0);.   
3120: 20 70 72 69 6e 74 66 28 22 2d 2d 20 53 63 72 61   printf("-- Scra
3130: 74 63 68 20 4f 76 65 72 66 6c 6f 77 20 42 79 74  tch Overflow Byt
3140: 65 73 3a 20 20 20 20 20 20 25 64 20 28 6d 61 78  es:      %d (max
3150: 20 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c 69 48   %d)\n", iCur,iH
3160: 69 77 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iwtr);.    sqlit
3170: 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45  e3_status(SQLITE
3180: 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53  _STATUS_MALLOC_S
3190: 49 5a 45 2c 20 26 69 43 75 72 2c 20 26 69 48 69  IZE, &iCur, &iHi
31a0: 77 74 72 2c 20 30 29 3b 0a 20 20 20 20 70 72 69  wtr, 0);.    pri
31b0: 6e 74 66 28 22 2d 2d 20 4c 61 72 67 65 73 74 20  ntf("-- Largest 
31c0: 41 6c 6c 6f 63 61 74 69 6f 6e 3a 20 20 20 20 20  Allocation:     
31d0: 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22       %d bytes\n"
31e0: 2c 69 48 69 77 74 72 29 3b 0a 20 20 20 20 73 71  ,iHiwtr);.    sq
31f0: 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c  lite3_status(SQL
3200: 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
3210: 41 43 48 45 5f 53 49 5a 45 2c 20 26 69 43 75 72  ACHE_SIZE, &iCur
3220: 2c 20 26 69 48 69 77 74 72 2c 20 30 29 3b 0a 20  , &iHiwtr, 0);. 
3230: 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 20 4c 61     printf("-- La
3240: 72 67 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c  rgest Pcache All
3250: 6f 63 61 74 69 6f 6e 3a 20 20 20 25 64 20 62 79  ocation:   %d by
3260: 74 65 73 5c 6e 22 2c 69 48 69 77 74 72 29 3b 0a  tes\n",iHiwtr);.
3270: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74      sqlite3_stat
3280: 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  us(SQLITE_STATUS
3290: 5f 53 43 52 41 54 43 48 5f 53 49 5a 45 2c 20 26  _SCRATCH_SIZE, &
32a0: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 30  iCur, &iHiwtr, 0
32b0: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d  );.    printf("-
32c0: 2d 20 4c 61 72 67 65 73 74 20 53 63 72 61 74 63  - Largest Scratc
32d0: 68 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 20 20 25  h Allocation:  %
32e0: 64 20 62 79 74 65 73 5c 6e 22 2c 20 69 48 69 77  d bytes\n", iHiw
32f0: 74 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  tr);.  }.  retur
3300: 6e 20 30 3b 0a 7d 0a                             n 0;.}.