Fossil

Hex Artifact Content
Login

Artifact ea4254b5c4c17757056c67ebe5fae2404356892b:


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 30 36 20 44 2e 20 52 69 63 68  (c) 2006 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 0a 2a 2a 20 54 68 69 73  ense".)..** This
00f0: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74   program is dist
0100: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68  ributed in the h
0110: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c  ope that it will
0120: 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62   be useful,.** b
0130: 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77  ut without any w
0140: 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74  arranty; without
0150: 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65   even the implie
0160: 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a  d warranty of.**
0170: 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79   merchantability
0180: 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20   or fitness for 
0190: 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 72  a particular pur
01a0: 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 74 68  pose..**.** Auth
01b0: 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72  or contact infor
01c0: 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 72 68  mation:.**   drh
01d0: 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 20 20  @hwaci.com.**   
01e0: 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 63 69  http://www.hwaci
01f0: 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a  .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 0a 2a 2a 0a  ************.**.
0250: 2a 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20  ** Routines for 
0260: 65 6e 63 6f 64 69 6e 67 20 61 6e 64 20 64 65 63  encoding and dec
0270: 6f 64 69 6e 67 20 74 65 78 74 2e 0a 2a 2f 0a 23  oding text..*/.#
0280: 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e  include "config.
0290: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 65 6e 63  h".#include "enc
02a0: 6f 64 65 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ode.h"../*.** Ma
02b0: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ke the given str
02c0: 69 6e 67 20 73 61 66 65 20 66 6f 72 20 48 54 4d  ing safe for HTM
02d0: 4c 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 20  L by converting 
02e0: 65 76 65 72 79 20 22 3c 22 20 69 6e 74 6f 20 22  every "<" into "
02f0: 26 6c 74 3b 22 2c 0a 2a 2a 20 65 76 65 72 79 20  &lt;",.** every 
0300: 22 3e 22 20 69 6e 74 6f 20 22 26 67 74 3b 22 20  ">" into "&gt;" 
0310: 61 6e 64 20 65 76 65 72 79 20 22 26 22 20 69 6e  and every "&" in
0320: 74 6f 20 22 26 61 6d 70 3b 22 2e 20 20 52 65 74  to "&amp;".  Ret
0330: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
0340: 20 74 6f 20 61 20 6e 65 77 20 73 74 72 69 6e 67   to a new string
0350: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
0360: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
0370: 65 20 61 6c 73 6f 20 65 6e 63 6f 64 65 20 22 20  e also encode " 
0380: 61 73 20 26 71 75 6f 74 3b 20 61 6e 64 20 27 20  as &quot; and ' 
0390: 61 73 20 26 23 33 39 3b 20 73 6f 20 74 68 65 79  as &#39; so they
03a0: 20 63 61 6e 20 61 70 70 65 61 72 20 61 73 20 61   can appear as a
03b0: 6e 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 74 6f  n argument.** to
03c0: 20 6d 61 72 6b 75 70 2e 0a 2a 2f 0a 63 68 61 72   markup..*/.char
03d0: 20 2a 68 74 6d 6c 69 7a 65 28 63 6f 6e 73 74 20   *htmlize(const 
03e0: 63 68 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e  char *zIn, int n
03f0: 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  ){.  int c;.  in
0400: 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  t i = 0;.  int c
0410: 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  ount = 0;.  char
0420: 20 2a 7a 4f 75 74 3b 0a 0a 20 20 69 66 28 20 6e   *zOut;..  if( n
0430: 3c 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28  <0 ) n = strlen(
0440: 7a 49 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20 69  zIn);.  while( i
0450: 3c 6e 20 26 26 20 28 63 20 3d 20 7a 49 6e 5b 69  <n && (c = zIn[i
0460: 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 77 69  ])!=0 ){.    swi
0470: 74 63 68 28 20 63 20 29 7b 0a 20 20 20 20 20 20  tch( c ){.      
0480: 63 61 73 65 20 27 3c 27 3a 20 20 20 63 6f 75 6e  case '<':   coun
0490: 74 20 2b 3d 20 34 3b 20 20 20 20 20 20 20 62 72  t += 4;       br
04a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
04b0: 27 3e 27 3a 20 20 20 63 6f 75 6e 74 20 2b 3d 20  '>':   count += 
04c0: 34 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  4;       break;.
04d0: 20 20 20 20 20 20 63 61 73 65 20 27 26 27 3a 20        case '&': 
04e0: 20 20 63 6f 75 6e 74 20 2b 3d 20 35 3b 20 20 20    count += 5;   
04f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
0500: 20 63 61 73 65 20 27 22 27 3a 20 20 20 63 6f 75   case '"':   cou
0510: 6e 74 20 2b 3d 20 36 3b 20 20 20 20 20 20 20 62  nt += 6;       b
0520: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
0530: 20 27 5c 27 27 3a 20 20 63 6f 75 6e 74 20 2b 3d   '\'':  count +=
0540: 20 35 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b   5;       break;
0550: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
0560: 20 20 20 63 6f 75 6e 74 2b 2b 3b 20 20 20 20 20     count++;     
0570: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0580: 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20  }.    i++;.  }. 
0590: 20 69 20 3d 20 30 3b 0a 20 20 7a 4f 75 74 20 3d   i = 0;.  zOut =
05a0: 20 66 6f 73 73 69 6c 5f 6d 61 6c 6c 6f 63 28 20   fossil_malloc( 
05b0: 63 6f 75 6e 74 2b 31 20 29 3b 0a 20 20 77 68 69  count+1 );.  whi
05c0: 6c 65 28 20 6e 2d 2d 3e 30 20 26 26 20 28 63 20  le( n-->0 && (c 
05d0: 3d 20 2a 7a 49 6e 29 21 3d 30 20 29 7b 0a 20 20  = *zIn)!=0 ){.  
05e0: 20 20 73 77 69 74 63 68 28 20 63 20 29 7b 0a 20    switch( c ){. 
05f0: 20 20 20 20 20 63 61 73 65 20 27 3c 27 3a 0a 20       case '<':. 
0600: 20 20 20 20 20 20 20 7a 4f 75 74 5b 69 2b 2b 5d         zOut[i++]
0610: 20 3d 20 27 26 27 3b 0a 20 20 20 20 20 20 20 20   = '&';.        
0620: 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27 6c 27 3b  zOut[i++] = 'l';
0630: 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 69 2b  .        zOut[i+
0640: 2b 5d 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20  +] = 't';.      
0650: 20 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27 3b    zOut[i++] = ';
0660: 27 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ';.        break
0670: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 3e 27  ;.      case '>'
0680: 3a 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 69  :.        zOut[i
0690: 2b 2b 5d 20 3d 20 27 26 27 3b 0a 20 20 20 20 20  ++] = '&';.     
06a0: 20 20 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27     zOut[i++] = '
06b0: 67 27 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74  g';.        zOut
06c0: 5b 69 2b 2b 5d 20 3d 20 27 74 27 3b 0a 20 20 20  [i++] = 't';.   
06d0: 20 20 20 20 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d       zOut[i++] =
06e0: 20 27 3b 27 3b 0a 20 20 20 20 20 20 20 20 62 72   ';';.        br
06f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
0700: 27 26 27 3a 0a 20 20 20 20 20 20 20 20 7a 4f 75  '&':.        zOu
0710: 74 5b 69 2b 2b 5d 20 3d 20 27 26 27 3b 0a 20 20  t[i++] = '&';.  
0720: 20 20 20 20 20 20 7a 4f 75 74 5b 69 2b 2b 5d 20        zOut[i++] 
0730: 3d 20 27 61 27 3b 0a 20 20 20 20 20 20 20 20 7a  = 'a';.        z
0740: 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27 6d 27 3b 0a  Out[i++] = 'm';.
0750: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 69 2b 2b          zOut[i++
0760: 5d 20 3d 20 27 70 27 3b 0a 20 20 20 20 20 20 20  ] = 'p';.       
0770: 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27 3b 27   zOut[i++] = ';'
0780: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
0790: 0a 20 20 20 20 20 20 63 61 73 65 20 27 22 27 3a  .      case '"':
07a0: 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 69 2b  .        zOut[i+
07b0: 2b 5d 20 3d 20 27 26 27 3b 0a 20 20 20 20 20 20  +] = '&';.      
07c0: 20 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27 71    zOut[i++] = 'q
07d0: 27 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b  ';.        zOut[
07e0: 69 2b 2b 5d 20 3d 20 27 75 27 3b 0a 20 20 20 20  i++] = 'u';.    
07f0: 20 20 20 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20      zOut[i++] = 
0800: 27 6f 27 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75  'o';.        zOu
0810: 74 5b 69 2b 2b 5d 20 3d 20 27 74 27 3b 0a 20 20  t[i++] = 't';.  
0820: 20 20 20 20 20 20 7a 4f 75 74 5b 69 2b 2b 5d 20        zOut[i++] 
0830: 3d 20 27 3b 27 3b 0a 20 20 20 20 20 20 20 20 62  = ';';.        b
0840: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
0850: 20 27 5c 27 27 3a 0a 20 20 20 20 20 20 20 20 7a   '\'':.        z
0860: 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27 26 27 3b 0a  Out[i++] = '&';.
0870: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 69 2b 2b          zOut[i++
0880: 5d 20 3d 20 27 23 27 3b 0a 20 20 20 20 20 20 20  ] = '#';.       
0890: 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27 33 27   zOut[i++] = '3'
08a0: 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 69  ;.        zOut[i
08b0: 2b 2b 5d 20 3d 20 27 39 27 3b 0a 20 20 20 20 20  ++] = '9';.     
08c0: 20 20 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27     zOut[i++] = '
08d0: 3b 27 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ;';.        brea
08e0: 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  k;.      default
08f0: 3a 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 69  :.        zOut[i
0900: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  ++] = c;.       
0910: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0920: 20 20 7a 49 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 7a    zIn++;.  }.  z
0930: 4f 75 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65  Out[i] = 0;.  re
0940: 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a  turn zOut;.}../*
0950: 0a 2a 2a 20 41 70 70 65 6e 64 20 48 54 4d 4c 2d  .** Append HTML-
0960: 65 73 63 61 70 65 64 20 74 65 78 74 20 74 6f 20  escaped text to 
0970: 61 20 42 6c 6f 62 2e 0a 2a 2f 0a 76 6f 69 64 20  a Blob..*/.void 
0980: 68 74 6d 6c 69 7a 65 5f 74 6f 5f 62 6c 6f 62 28  htmlize_to_blob(
0990: 42 6c 6f 62 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Blob *p, const c
09a0: 68 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 29  har *zIn, int n)
09b0: 7b 0a 20 20 69 6e 74 20 63 2c 20 69 2c 20 6a 3b  {.  int c, i, j;
09c0: 0a 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d  .  if( n<0 ) n =
09d0: 20 73 74 72 6c 65 6e 28 7a 49 6e 29 3b 0a 20 20   strlen(zIn);.  
09e0: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
09f0: 69 2b 2b 29 7b 0a 20 20 20 20 63 20 3d 20 7a 49  i++){.    c = zI
0a00: 6e 5b 69 5d 3b 0a 20 20 20 20 73 77 69 74 63 68  n[i];.    switch
0a10: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ( c ){.      cas
0a20: 65 20 27 3c 27 3a 0a 20 20 20 20 20 20 20 20 69  e '<':.        i
0a30: 66 28 20 6a 3c 69 20 29 20 62 6c 6f 62 5f 61 70  f( j<i ) blob_ap
0a40: 70 65 6e 64 28 70 2c 20 7a 49 6e 2b 6a 2c 20 69  pend(p, zIn+j, i
0a50: 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f  -j);.        blo
0a60: 62 5f 61 70 70 65 6e 64 28 70 2c 20 22 26 6c 74  b_append(p, "&lt
0a70: 3b 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ;", 4);.        
0a80: 6a 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20  j = i+1;.       
0a90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
0aa0: 73 65 20 27 3e 27 3a 0a 20 20 20 20 20 20 20 20  se '>':.        
0ab0: 69 66 28 20 6a 3c 69 20 29 20 62 6c 6f 62 5f 61  if( j<i ) blob_a
0ac0: 70 70 65 6e 64 28 70 2c 20 7a 49 6e 2b 6a 2c 20  ppend(p, zIn+j, 
0ad0: 69 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 62 6c  i-j);.        bl
0ae0: 6f 62 5f 61 70 70 65 6e 64 28 70 2c 20 22 26 67  ob_append(p, "&g
0af0: 74 3b 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  t;", 4);.       
0b00: 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20   j = i+1;.      
0b10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
0b20: 61 73 65 20 27 26 27 3a 0a 20 20 20 20 20 20 20  ase '&':.       
0b30: 20 69 66 28 20 6a 3c 69 20 29 20 62 6c 6f 62 5f   if( j<i ) blob_
0b40: 61 70 70 65 6e 64 28 70 2c 20 7a 49 6e 2b 6a 2c  append(p, zIn+j,
0b50: 20 69 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 62   i-j);.        b
0b60: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2c 20 22 26  lob_append(p, "&
0b70: 61 6d 70 3b 22 2c 20 35 29 3b 0a 20 20 20 20 20  amp;", 5);.     
0b80: 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 20 20     j = i+1;.    
0b90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
0ba0: 20 63 61 73 65 20 27 22 27 3a 0a 20 20 20 20 20   case '"':.     
0bb0: 20 20 20 69 66 28 20 6a 3c 69 20 29 20 62 6c 6f     if( j<i ) blo
0bc0: 62 5f 61 70 70 65 6e 64 28 70 2c 20 7a 49 6e 2b  b_append(p, zIn+
0bd0: 6a 2c 20 69 2d 6a 29 3b 0a 20 20 20 20 20 20 20  j, i-j);.       
0be0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2c 20   blob_append(p, 
0bf0: 22 26 71 75 6f 74 3b 22 2c 20 36 29 3b 0a 20 20  "&quot;", 6);.  
0c00: 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20        j = i+1;. 
0c10: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0c20: 20 20 20 20 63 61 73 65 20 27 5c 27 27 3a 0a 20      case '\'':. 
0c30: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 69 20 29         if( j<i )
0c40: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2c 20   blob_append(p, 
0c50: 7a 49 6e 2b 6a 2c 20 69 2d 6a 29 3b 0a 20 20 20  zIn+j, i-j);.   
0c60: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
0c70: 28 70 2c 20 22 26 23 33 39 3b 22 2c 20 35 29 3b  (p, "&#39;", 5);
0c80: 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 69 2b 31  .        j = i+1
0c90: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
0ca0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
0cb0: 20 6a 3c 69 20 29 20 62 6c 6f 62 5f 61 70 70 65   j<i ) blob_appe
0cc0: 6e 64 28 70 2c 20 7a 49 6e 2b 6a 2c 20 69 2d 6a  nd(p, zIn+j, i-j
0cd0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 6e 63  );.}.../*.** Enc
0ce0: 6f 64 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72  ode a string for
0cf0: 20 48 54 54 50 2e 20 20 54 68 69 73 20 6d 65 61   HTTP.  This mea
0d00: 6e 73 20 63 6f 6e 76 65 72 74 69 6e 67 20 6c 6f  ns converting lo
0d10: 74 73 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74  ts of.** charact
0d20: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 22 25 48  ers into the "%H
0d30: 48 22 20 77 68 65 72 65 20 48 20 69 73 20 61 20  H" where H is a 
0d40: 68 65 78 20 64 69 67 69 74 2e 20 20 49 74 20 61  hex digit.  It a
0d50: 6c 73 6f 0a 2a 2a 20 6d 65 61 6e 73 20 63 6f 6e  lso.** means con
0d60: 76 65 72 74 69 6e 67 20 73 70 61 63 65 73 20 74  verting spaces t
0d70: 6f 20 22 2b 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  o "+"..**.** Thi
0d80: 73 20 69 73 20 74 68 65 20 6f 70 70 6f 73 69 74  s is the opposit
0d90: 65 20 6f 66 20 44 65 48 74 74 70 69 7a 65 53 74  e of DeHttpizeSt
0da0: 72 69 6e 67 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73  ring below..*/.s
0db0: 74 61 74 69 63 20 63 68 61 72 20 2a 45 6e 63 6f  tatic char *Enco
0dc0: 64 65 48 74 74 70 28 63 6f 6e 73 74 20 63 68 61  deHttp(const cha
0dd0: 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 2c 20 69  r *zIn, int n, i
0de0: 6e 74 20 65 6e 63 6f 64 65 53 6c 61 73 68 29 7b  nt encodeSlash){
0df0: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20  .  int c;.  int 
0e00: 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6f 75  i = 0;.  int cou
0e10: 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  nt = 0;.  char *
0e20: 7a 4f 75 74 3b 0a 23 20 64 65 66 69 6e 65 20 49  zOut;.# define I
0e30: 73 53 61 66 65 43 68 61 72 28 58 29 20 20 5c 0a  sSafeChar(X)  \.
0e40: 20 20 20 20 20 28 66 6f 73 73 69 6c 5f 69 73 61       (fossil_isa
0e50: 6c 6e 75 6d 28 58 29 20 7c 7c 20 28 58 29 3d 3d  lnum(X) || (X)==
0e60: 27 2e 27 20 7c 7c 20 28 58 29 3d 3d 27 24 27 20  '.' || (X)=='$' 
0e70: 5c 0a 20 20 20 20 20 20 7c 7c 20 28 58 29 3d 3d  \.      || (X)==
0e80: 27 7e 27 20 7c 7c 20 28 58 29 3d 3d 27 2d 27 20  '~' || (X)=='-' 
0e90: 7c 7c 20 28 58 29 3d 3d 27 5f 27 20 5c 0a 20 20  || (X)=='_' \.  
0ea0: 20 20 20 20 7c 7c 20 28 21 65 6e 63 6f 64 65 53      || (!encodeS
0eb0: 6c 61 73 68 20 26 26 20 28 28 58 29 3d 3d 27 2f  lash && ((X)=='/
0ec0: 27 20 7c 7c 20 28 58 29 3d 3d 27 3a 27 29 29 29  ' || (X)==':')))
0ed0: 0a 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29  ..  if( zIn==0 )
0ee0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
0ef0: 20 6e 3c 30 20 29 20 6e 20 3d 20 73 74 72 6c 65   n<0 ) n = strle
0f00: 6e 28 7a 49 6e 29 3b 0a 20 20 77 68 69 6c 65 28  n(zIn);.  while(
0f10: 20 69 3c 6e 20 26 26 20 28 63 20 3d 20 7a 49 6e   i<n && (c = zIn
0f20: 5b 69 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  [i])!=0 ){.    i
0f30: 66 28 20 49 73 53 61 66 65 43 68 61 72 28 63 29  f( IsSafeChar(c)
0f40: 20 7c 7c 20 63 3d 3d 27 20 27 20 29 7b 0a 20 20   || c==' ' ){.  
0f50: 20 20 20 20 63 6f 75 6e 74 2b 2b 3b 0a 20 20 20      count++;.   
0f60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
0f70: 75 6e 74 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a  unt += 3;.    }.
0f80: 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69      i++;.  }.  i
0f90: 20 3d 20 30 3b 0a 20 20 7a 4f 75 74 20 3d 20 66   = 0;.  zOut = f
0fa0: 6f 73 73 69 6c 5f 6d 61 6c 6c 6f 63 28 20 63 6f  ossil_malloc( co
0fb0: 75 6e 74 2b 31 20 29 3b 0a 20 20 77 68 69 6c 65  unt+1 );.  while
0fc0: 28 20 6e 2d 2d 3e 30 20 26 26 20 28 63 20 3d 20  ( n-->0 && (c = 
0fd0: 2a 7a 49 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  *zIn)!=0 ){.    
0fe0: 69 66 28 20 49 73 53 61 66 65 43 68 61 72 28 63  if( IsSafeChar(c
0ff0: 29 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b  ) ){.      zOut[
1000: 69 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 65  i++] = c;.    }e
1010: 6c 73 65 20 69 66 28 20 63 3d 3d 27 20 27 20 29  lse if( c==' ' )
1020: 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 69 2b 2b  {.      zOut[i++
1030: 5d 20 3d 20 27 2b 27 3b 0a 20 20 20 20 7d 65 6c  ] = '+';.    }el
1040: 73 65 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 69  se{.      zOut[i
1050: 2b 2b 5d 20 3d 20 27 25 27 3b 0a 20 20 20 20 20  ++] = '%';.     
1060: 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 22 30 31   zOut[i++] = "01
1070: 32 33 34 35 36 37 38 39 41 42 43 44 45 46 22 5b  23456789ABCDEF"[
1080: 28 63 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20  (c>>4)&0xf];.   
1090: 20 20 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 22     zOut[i++] = "
10a0: 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46  0123456789ABCDEF
10b0: 22 5b 63 26 30 78 66 5d 3b 0a 20 20 20 20 7d 0a  "[c&0xf];.    }.
10c0: 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 7d 0a 20      zIn++;.  }. 
10d0: 20 7a 4f 75 74 5b 69 5d 20 3d 20 30 3b 0a 23 75   zOut[i] = 0;.#u
10e0: 6e 64 65 66 20 49 73 53 61 66 65 43 68 61 72 0a  ndef IsSafeChar.
10f0: 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d    return zOut;.}
1100: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
1110: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
1120: 20 69 6e 74 6f 20 61 20 66 6f 72 6d 20 74 68 61   into a form tha
1130: 74 20 69 73 20 73 75 69 74 61 62 6c 65 20 66 6f  t is suitable fo
1140: 72 20 75 73 65 20 61 73 0a 2a 2a 20 61 20 74 6f  r use as.** a to
1150: 6b 65 6e 20 69 6e 20 74 68 65 20 48 54 54 50 20  ken in the HTTP 
1160: 70 72 6f 74 6f 63 6f 6c 2e 20 20 53 70 61 63 65  protocol.  Space
1170: 73 20 61 72 65 20 65 6e 63 6f 64 65 64 20 61 73  s are encoded as
1180: 20 27 2b 27 20 61 6e 64 20 73 70 65 63 69 61 6c   '+' and special
1190: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 61  .** characters a
11a0: 72 65 20 65 6e 63 6f 64 65 64 20 61 73 20 22 25  re encoded as "%
11b0: 48 48 22 20 77 68 65 72 65 20 48 48 20 69 73 20  HH" where HH is 
11c0: 61 20 74 77 6f 2d 64 69 67 69 74 20 68 65 78 61  a two-digit hexa
11d0: 64 65 63 69 6d 61 6c 0a 2a 2a 20 72 65 70 72 65  decimal.** repre
11e0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
11f0: 20 63 68 61 72 61 63 74 65 72 2e 20 20 54 68 65   character.  The
1200: 20 22 2f 22 20 63 68 61 72 61 63 74 65 72 20 69   "/" character i
1210: 73 20 65 6e 63 6f 64 65 64 0a 2a 2a 20 61 73 20  s encoded.** as 
1220: 22 25 32 46 22 2e 0a 2a 2f 0a 63 68 61 72 20 2a  "%2F"..*/.char *
1230: 68 74 74 70 69 7a 65 28 63 6f 6e 73 74 20 63 68  httpize(const ch
1240: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
1250: 20 72 65 74 75 72 6e 20 45 6e 63 6f 64 65 48 74   return EncodeHt
1260: 74 70 28 7a 2c 20 6e 2c 20 31 29 3b 0a 7d 0a 0a  tp(z, n, 1);.}..
1270: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68  /*.** Convert th
1280: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 69  e input string i
1290: 6e 74 6f 20 61 20 66 6f 72 6d 20 74 68 61 74 20  nto a form that 
12a0: 69 73 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  is suitable for 
12b0: 75 73 65 20 61 73 0a 2a 2a 20 61 20 74 6f 6b 65  use as.** a toke
12c0: 6e 20 69 6e 20 74 68 65 20 48 54 54 50 20 70 72  n in the HTTP pr
12d0: 6f 74 6f 63 6f 6c 2e 20 20 53 70 61 63 65 73 20  otocol.  Spaces 
12e0: 61 72 65 20 65 6e 63 6f 64 65 64 20 61 73 20 27  are encoded as '
12f0: 2b 27 20 61 6e 64 20 73 70 65 63 69 61 6c 0a 2a  +' and special.*
1300: 2a 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65  * characters are
1310: 20 65 6e 63 6f 64 65 64 20 61 73 20 22 25 48 48   encoded as "%HH
1320: 22 20 77 68 65 72 65 20 48 48 20 69 73 20 61 20  " where HH is a 
1330: 74 77 6f 2d 64 69 67 69 74 20 68 65 78 69 64 65  two-digit hexide
1340: 63 69 6d 61 6c 0a 2a 2a 20 72 65 70 72 65 73 65  cimal.** represe
1350: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ntation of the c
1360: 68 61 72 61 63 74 65 72 2e 20 20 54 68 65 20 22  haracter.  The "
1370: 2f 22 20 63 68 61 72 61 63 74 65 72 20 69 73 20  /" character is 
1380: 6e 6f 74 20 65 6e 63 6f 64 65 64 0a 2a 2a 20 62  not encoded.** b
1390: 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
13a0: 2a 2f 0a 63 68 61 72 20 2a 75 72 6c 69 7a 65 28  */.char *urlize(
13b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
13c0: 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  nt n){.  return 
13d0: 45 6e 63 6f 64 65 48 74 74 70 28 7a 2c 20 6e 2c  EncodeHttp(z, n,
13e0: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
13f0: 6e 76 65 72 74 20 61 20 73 69 6e 67 6c 65 20 48  nvert a single H
1400: 45 58 20 64 69 67 69 74 20 74 6f 20 61 6e 20 69  EX digit to an i
1410: 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63  nteger.*/.static
1420: 20 69 6e 74 20 41 73 63 69 69 54 6f 48 65 78 28   int AsciiToHex(
1430: 69 6e 74 20 63 29 7b 0a 20 20 69 66 28 20 63 3e  int c){.  if( c>
1440: 3d 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29  ='a' && c<='f' )
1450: 7b 0a 20 20 20 20 63 20 2b 3d 20 31 30 20 2d 20  {.    c += 10 - 
1460: 27 61 27 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  'a';.  }else if(
1470: 20 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 46   c>='A' && c<='F
1480: 27 20 29 7b 0a 20 20 20 20 63 20 2b 3d 20 31 30  ' ){.    c += 10
1490: 20 2d 20 27 41 27 3b 0a 20 20 7d 65 6c 73 65 20   - 'A';.  }else 
14a0: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
14b0: 3d 27 39 27 20 29 7b 0a 20 20 20 20 63 20 2d 3d  ='9' ){.    c -=
14c0: 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   '0';.  }else{. 
14d0: 20 20 20 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20     c = 0;.  }.  
14e0: 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a  return c;.}../*.
14f0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 48 54  ** Remove the HT
1500: 54 50 20 65 6e 63 6f 64 69 6e 67 73 20 66 72 6f  TP encodings fro
1510: 6d 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65  m a string.  The
1520: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 64   conversion is d
1530: 6f 6e 65 0a 2a 2a 20 69 6e 2d 70 6c 61 63 65 2e  one.** in-place.
1540: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e    Return the len
1550: 67 74 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e  gth of the strin
1560: 67 20 61 66 74 65 72 20 63 6f 6e 76 65 72 73 69  g after conversi
1570: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 64 65 68 74 74  on..*/.int dehtt
1580: 70 69 7a 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20  pize(char *z){. 
1590: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 2f 2a   int i, j;..  /*
15a0: 20 54 72 65 61 74 20 61 20 6e 75 6c 6c 20 70 6f   Treat a null po
15b0: 69 6e 74 65 72 20 61 73 20 61 20 7a 65 72 6f 2d  inter as a zero-
15c0: 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2e 20 2a  length string. *
15d0: 2f 0a 20 20 69 66 28 20 21 7a 20 29 20 72 65 74  /.  if( !z ) ret
15e0: 75 72 6e 20 30 3b 0a 0a 20 20 69 20 3d 20 6a 20  urn 0;..  i = j 
15f0: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b  = 0;.  while( z[
1600: 69 5d 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  i] ){.    switch
1610: 28 20 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  ( z[i] ){.      
1620: 63 61 73 65 20 27 25 27 3a 0a 20 20 20 20 20 20  case '%':.      
1630: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 20 26 26 20    if( z[i+1] && 
1640: 7a 5b 69 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20  z[i+2] ){.      
1650: 20 20 20 20 7a 5b 6a 5d 20 3d 20 41 73 63 69 69      z[j] = Ascii
1660: 54 6f 48 65 78 28 7a 5b 69 2b 31 5d 29 20 3c 3c  ToHex(z[i+1]) <<
1670: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   4;.          z[
1680: 6a 5d 20 7c 3d 20 41 73 63 69 69 54 6f 48 65 78  j] |= AsciiToHex
1690: 28 7a 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20  (z[i+2]);.      
16a0: 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20      i += 2;.    
16b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
16c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
16d0: 27 2b 27 3a 0a 20 20 20 20 20 20 20 20 7a 5b 6a  '+':.        z[j
16e0: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
16f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65   break;.      de
1700: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 7a  fault:.        z
1710: 5b 6a 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  [j] = z[i];.    
1720: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1730: 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 6a 2b  .    i++;.    j+
1740: 2b 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20  +;.  }.  z[j] = 
1750: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d  0;.  return j;.}
1760: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 66 6f 73  ../*.** The "fos
1770: 73 69 6c 69 7a 65 22 20 65 6e 63 6f 64 69 6e 67  silize" encoding
1780: 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65 20   is used in the 
1790: 68 65 61 64 65 72 73 20 6f 66 20 72 65 63 6f 72  headers of recor
17a0: 64 73 0a 2a 2a 20 28 61 6b 61 20 22 63 6f 6e 74  ds.** (aka "cont
17b0: 65 6e 74 20 66 69 6c 65 73 22 29 20 74 6f 20 65  ent files") to e
17c0: 73 63 61 70 65 20 73 70 65 63 69 61 6c 20 63 68  scape special ch
17d0: 61 72 61 63 74 65 72 73 2e 20 20 54 68 65 0a 2a  aracters.  The.*
17e0: 2a 20 66 6f 73 73 69 6c 69 7a 65 20 65 6e 63 6f  * fossilize enco
17f0: 64 69 6e 67 20 70 61 73 73 65 73 20 6d 6f 73 74  ding passes most
1800: 20 63 68 61 72 61 63 74 65 72 73 20 74 68 72 6f   characters thro
1810: 75 67 68 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ugh unchanged..*
1820: 2a 20 54 68 65 20 63 68 61 6e 67 65 73 20 61 72  * The changes ar
1830: 65 20 74 68 65 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  e these:.**.**  
1840: 20 20 20 20 20 20 73 70 61 63 65 20 20 20 20 2d        space    -
1850: 3e 20 20 20 5c 73 0a 2a 2a 20 20 20 20 20 20 20  >   \s.**       
1860: 20 74 61 62 20 20 20 20 20 20 2d 3e 20 20 20 5c   tab      ->   \
1870: 74 0a 2a 2a 20 20 20 20 20 20 20 20 6e 65 77 6c  t.**        newl
1880: 69 6e 65 20 20 2d 3e 20 20 20 5c 6e 0a 2a 2a 20  ine  ->   \n.** 
1890: 20 20 20 20 20 20 20 63 72 20 20 20 20 20 20 20         cr       
18a0: 2d 3e 20 20 20 5c 72 0a 2a 2a 20 20 20 20 20 20  ->   \r.**      
18b0: 20 20 66 6f 72 6d 66 65 65 64 20 2d 3e 20 20 20    formfeed ->   
18c0: 5c 66 0a 2a 2a 20 20 20 20 20 20 20 20 76 74 61  \f.**        vta
18d0: 62 20 20 20 20 20 2d 3e 20 20 20 5c 76 0a 2a 2a  b     ->   \v.**
18e0: 20 20 20 20 20 20 20 20 6e 75 6c 20 20 20 20 20          nul     
18f0: 20 2d 3e 20 20 20 5c 30 0a 2a 2a 20 20 20 20 20   ->   \0.**     
1900: 20 20 20 5c 20 20 20 20 20 20 20 20 2d 3e 20 20     \        ->  
1910: 20 5c 5c 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f   \\.**.** The fo
1920: 73 73 69 6c 69 7a 65 28 29 20 72 6f 75 74 69 6e  ssilize() routin
1930: 65 20 64 6f 65 73 20 61 6e 20 65 6e 63 6f 64 69  e does an encodi
1940: 6e 67 20 6f 66 20 69 74 73 20 69 6e 70 75 74 20  ng of its input 
1950: 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  and.** returns a
1960: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1970: 65 6e 63 6f 64 69 6e 67 20 69 6e 20 73 70 61 63  encoding in spac
1980: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
1990: 2a 2a 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 63 68  ** malloc..*/.ch
19a0: 61 72 20 2a 66 6f 73 73 69 6c 69 7a 65 28 63 6f  ar *fossilize(co
19b0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 69  nst char *zIn, i
19c0: 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e  nt nIn){.  int n
19d0: 2c 20 69 2c 20 6a 2c 20 63 3b 0a 20 20 63 68 61  , i, j, c;.  cha
19e0: 72 20 2a 7a 4f 75 74 3b 0a 20 20 69 66 28 20 6e  r *zOut;.  if( n
19f0: 49 6e 3c 30 20 29 20 6e 49 6e 20 3d 20 73 74 72  In<0 ) nIn = str
1a00: 6c 65 6e 28 7a 49 6e 29 3b 0a 20 20 66 6f 72 28  len(zIn);.  for(
1a10: 69 3d 6e 3d 30 3b 20 69 3c 6e 49 6e 3b 20 69 2b  i=n=0; i<nIn; i+
1a20: 2b 29 7b 0a 20 20 20 20 63 20 3d 20 7a 49 6e 5b  +){.    c = zIn[
1a30: 69 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30  i];.    if( c==0
1a40: 20 7c 7c 20 63 3d 3d 27 20 27 20 7c 7c 20 63 3d   || c==' ' || c=
1a50: 3d 27 5c 6e 27 20 7c 7c 20 63 3d 3d 27 5c 74 27  ='\n' || c=='\t'
1a60: 20 7c 7c 20 63 3d 3d 27 5c 72 27 20 7c 7c 20 63   || c=='\r' || c
1a70: 3d 3d 27 5c 66 27 20 7c 7c 20 63 3d 3d 27 5c 76  =='\f' || c=='\v
1a80: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  '.             |
1a90: 7c 20 63 3d 3d 27 5c 5c 27 20 29 20 6e 2b 2b 3b  | c=='\\' ) n++;
1aa0: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 6e 49 6e 3b  .  }.  n += nIn;
1ab0: 0a 20 20 7a 4f 75 74 20 3d 20 66 6f 73 73 69 6c  .  zOut = fossil
1ac0: 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a  _malloc( n+1 );.
1ad0: 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20    if( zOut ){.  
1ae0: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
1af0: 49 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  In; i++){.      
1b00: 69 6e 74 20 63 20 3d 20 7a 49 6e 5b 69 5d 3b 0a  int c = zIn[i];.
1b10: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
1b20: 7b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a  {.        zOut[j
1b30: 2b 2b 5d 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20  ++] = '\\';.    
1b40: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
1b50: 27 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  '0';.      }else
1b60: 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a   if( c=='\\' ){.
1b70: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b          zOut[j++
1b80: 5d 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20  ] = '\\';.      
1b90: 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 27 5c    zOut[j++] = '\
1ba0: 5c 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  \';.      }else 
1bb0: 69 66 28 20 66 6f 73 73 69 6c 5f 69 73 73 70 61  if( fossil_isspa
1bc0: 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20  ce(c) ){.       
1bd0: 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 27 5c 5c   zOut[j++] = '\\
1be0: 27 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  ';.        switc
1bf0: 68 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  h( c ){.        
1c00: 20 20 63 61 73 65 20 27 5c 6e 27 3a 20 20 63 20    case '\n':  c 
1c10: 3d 20 27 6e 27 3b 20 62 72 65 61 6b 3b 0a 20 20  = 'n'; break;.  
1c20: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 20 27          case ' '
1c30: 3a 20 20 20 63 20 3d 20 27 73 27 3b 20 62 72 65  :   c = 's'; bre
1c40: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61  ak;.          ca
1c50: 73 65 20 27 5c 74 27 3a 20 20 63 20 3d 20 27 74  se '\t':  c = 't
1c60: 27 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  '; break;.      
1c70: 20 20 20 20 63 61 73 65 20 27 5c 72 27 3a 20 20      case '\r':  
1c80: 63 20 3d 20 27 72 27 3b 20 62 72 65 61 6b 3b 0a  c = 'r'; break;.
1c90: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 27            case '
1ca0: 5c 76 27 3a 20 20 63 20 3d 20 27 76 27 3b 20 62  \v':  c = 'v'; b
1cb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1cc0: 63 61 73 65 20 27 5c 66 27 3a 20 20 63 20 3d 20  case '\f':  c = 
1cd0: 27 66 27 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  'f'; break;.    
1ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f      }.        zO
1cf0: 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  ut[j++] = c;.   
1d00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d10: 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b    zOut[j++] = c;
1d20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d30: 20 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a     zOut[j] = 0;.
1d40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75    }.  return zOu
1d50: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  t;.}../*.** Deco
1d60: 64 65 20 61 20 66 6f 73 73 69 6c 69 7a 65 64 20  de a fossilized 
1d70: 73 74 72 69 6e 67 20 69 6e 2d 70 6c 61 63 65 2e  string in-place.
1d80: 0a 2a 2f 0a 76 6f 69 64 20 64 65 66 6f 73 73 69  .*/.void defossi
1d90: 6c 69 7a 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20  lize(char *z){. 
1da0: 20 69 6e 74 20 69 2c 20 6a 2c 20 63 3b 0a 20 20   int i, j, c;.  
1db0: 66 6f 72 28 69 3d 30 3b 20 28 63 3d 7a 5b 69 5d  for(i=0; (c=z[i]
1dc0: 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 5c 27 3b  )!=0 && c!='\\';
1dd0: 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d   i++){}.  if( c=
1de0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1df0: 6f 72 28 6a 3d 69 3b 20 28 63 3d 7a 5b 69 5d 29  or(j=i; (c=z[i])
1e00: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  !=0; i++){.    i
1e10: 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b  f( c=='\\' && z[
1e20: 69 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 69 2b  i+1] ){.      i+
1e30: 2b 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  +;.      switch(
1e40: 20 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20   z[i] ){.       
1e50: 20 63 61 73 65 20 27 6e 27 3a 20 20 63 20 3d 20   case 'n':  c = 
1e60: 27 5c 6e 27 3b 20 20 62 72 65 61 6b 3b 0a 20 20  '\n';  break;.  
1e70: 20 20 20 20 20 20 63 61 73 65 20 27 73 27 3a 20        case 's': 
1e80: 20 63 20 3d 20 27 20 27 3b 20 20 20 62 72 65 61   c = ' ';   brea
1e90: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1ea0: 27 74 27 3a 20 20 63 20 3d 20 27 5c 74 27 3b 20  't':  c = '\t'; 
1eb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1ec0: 63 61 73 65 20 27 72 27 3a 20 20 63 20 3d 20 27  case 'r':  c = '
1ed0: 5c 72 27 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  \r';  break;.   
1ee0: 20 20 20 20 20 63 61 73 65 20 27 76 27 3a 20 20       case 'v':  
1ef0: 63 20 3d 20 27 5c 76 27 3b 20 20 62 72 65 61 6b  c = '\v';  break
1f00: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  ;.        case '
1f10: 66 27 3a 20 20 63 20 3d 20 27 5c 66 27 3b 20 20  f':  c = '\f';  
1f20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
1f30: 61 73 65 20 27 30 27 3a 20 20 63 20 3d 20 30 3b  ase '0':  c = 0;
1f40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f50: 20 20 20 20 63 61 73 65 20 27 5c 5c 27 3a 20 63      case '\\': c
1f60: 20 3d 20 27 5c 5c 27 3b 20 20 62 72 65 61 6b 3b   = '\\';  break;
1f70: 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
1f80: 3a 20 20 20 63 20 3d 20 7a 5b 69 5d 3b 20 20 62  :   c = z[i];  b
1f90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1fa0: 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d    }.    z[j++] =
1fb0: 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 5b   c;.  }.  if( z[
1fc0: 6a 5d 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d  j] ) z[j] = 0;.}
1fd0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 2a 70 7a  .../*.** The *pz
1fe0: 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73   variable points
1ff0: 20 74 6f 20 61 20 55 54 46 38 20 73 74 72 69 6e   to a UTF8 strin
2000: 67 2e 20 20 52 65 61 64 20 74 68 65 20 6e 65 78  g.  Read the nex
2010: 74 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f  t character.** o
2020: 66 66 20 6f 66 20 74 68 61 74 20 73 74 72 69 6e  ff of that strin
2030: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73  g and return its
2040: 20 63 6f 64 65 70 6f 69 6e 74 20 76 61 6c 75 65   codepoint value
2050: 2e 20 20 41 64 76 61 6e 63 65 20 2a 70 7a 20 74  .  Advance *pz t
2060: 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 63 68  o the.** next ch
2070: 61 72 61 63 74 65 72 0a 2a 2f 0a 75 33 32 20 66  aracter.*/.u32 f
2080: 6f 73 73 69 6c 5f 75 74 66 38 5f 72 65 61 64 28  ossil_utf8_read(
2090: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
20a0: 64 20 63 68 61 72 20 2a 2a 70 7a 20 20 20 20 2f  d char **pz    /
20b0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 72  * Pointer to str
20c0: 69 6e 67 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ing from which t
20d0: 6f 20 72 65 61 64 20 63 68 61 72 20 2a 2f 0a 29  o read char */.)
20e0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
20f0: 20 63 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54   c;..  /*.  ** T
2100: 68 69 73 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65  his lookup table
2110: 20 69 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70   is used to help
2120: 20 64 65 63 6f 64 65 20 74 68 65 20 66 69 72 73   decode the firs
2130: 74 20 62 79 74 65 20 6f 66 0a 20 20 2a 2a 20 61  t byte of.  ** a
2140: 20 6d 75 6c 74 69 2d 62 79 74 65 20 55 54 46 38   multi-byte UTF8
2150: 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20 2a 2f   character..  */
2160: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2170: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 74  unsigned char ut
2180: 66 38 54 72 61 6e 73 31 5b 5d 20 3d 20 7b 0a 20  f8Trans1[] = {. 
2190: 20 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30     0x00, 0x01, 0
21a0: 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30 34 2c  x02, 0x03, 0x04,
21b0: 20 30 78 30 35 2c 20 30 78 30 36 2c 20 30 78 30   0x05, 0x06, 0x0
21c0: 37 2c 0a 20 20 20 20 30 78 30 38 2c 20 30 78 30  7,.    0x08, 0x0
21d0: 39 2c 20 30 78 30 61 2c 20 30 78 30 62 2c 20 30  9, 0x0a, 0x0b, 0
21e0: 78 30 63 2c 20 30 78 30 64 2c 20 30 78 30 65 2c  x0c, 0x0d, 0x0e,
21f0: 20 30 78 30 66 2c 0a 20 20 20 20 30 78 31 30 2c   0x0f,.    0x10,
2200: 20 30 78 31 31 2c 20 30 78 31 32 2c 20 30 78 31   0x11, 0x12, 0x1
2210: 33 2c 20 30 78 31 34 2c 20 30 78 31 35 2c 20 30  3, 0x14, 0x15, 0
2220: 78 31 36 2c 20 30 78 31 37 2c 0a 20 20 20 20 30  x16, 0x17,.    0
2230: 78 31 38 2c 20 30 78 31 39 2c 20 30 78 31 61 2c  x18, 0x19, 0x1a,
2240: 20 30 78 31 62 2c 20 30 78 31 63 2c 20 30 78 31   0x1b, 0x1c, 0x1
2250: 64 2c 20 30 78 31 65 2c 20 30 78 31 66 2c 0a 20  d, 0x1e, 0x1f,. 
2260: 20 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30     0x00, 0x01, 0
2270: 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30 34 2c  x02, 0x03, 0x04,
2280: 20 30 78 30 35 2c 20 30 78 30 36 2c 20 30 78 30   0x05, 0x06, 0x0
2290: 37 2c 0a 20 20 20 20 30 78 30 38 2c 20 30 78 30  7,.    0x08, 0x0
22a0: 39 2c 20 30 78 30 61 2c 20 30 78 30 62 2c 20 30  9, 0x0a, 0x0b, 0
22b0: 78 30 63 2c 20 30 78 30 64 2c 20 30 78 30 65 2c  x0c, 0x0d, 0x0e,
22c0: 20 30 78 30 66 2c 0a 20 20 20 20 30 78 30 30 2c   0x0f,.    0x00,
22d0: 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30   0x01, 0x02, 0x0
22e0: 33 2c 20 30 78 30 34 2c 20 30 78 30 35 2c 20 30  3, 0x04, 0x05, 0
22f0: 78 30 36 2c 20 30 78 30 37 2c 0a 20 20 20 20 30  x06, 0x07,.    0
2300: 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c  x00, 0x01, 0x02,
2310: 20 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30   0x03, 0x00, 0x0
2320: 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 0a 20  1, 0x00, 0x00,. 
2330: 20 7d 3b 0a 0a 20 20 63 20 3d 20 2a 28 28 2a 70   };..  c = *((*p
2340: 7a 29 2b 2b 29 3b 0a 20 20 69 66 28 20 63 3e 3d  z)++);.  if( c>=
2350: 30 78 63 30 20 29 7b 0a 20 20 20 20 63 20 3d 20  0xc0 ){.    c = 
2360: 75 74 66 38 54 72 61 6e 73 31 5b 63 2d 30 78 63  utf8Trans1[c-0xc
2370: 30 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  0];.    while( (
2380: 2a 28 2a 70 7a 29 20 26 20 30 78 63 30 29 3d 3d  *(*pz) & 0xc0)==
2390: 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 63 20  0x80 ){.      c 
23a0: 3d 20 28 63 3c 3c 36 29 20 2b 20 28 30 78 33 66  = (c<<6) + (0x3f
23b0: 20 26 20 2a 28 28 2a 70 7a 29 2b 2b 29 29 3b 0a   & *((*pz)++));.
23c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3c      }.    if( c<
23d0: 30 78 38 30 0a 20 20 20 20 20 20 20 20 7c 7c 20  0x80.        || 
23e0: 28 63 26 30 78 46 46 46 46 46 38 30 30 29 3d 3d  (c&0xFFFFF800)==
23f0: 30 78 44 38 30 30 0a 20 20 20 20 20 20 20 20 7c  0xD800.        |
2400: 7c 20 28 63 26 30 78 46 46 46 46 46 46 46 45 29  | (c&0xFFFFFFFE)
2410: 3d 3d 30 78 46 46 46 45 20 29 7b 20 20 63 20 3d  ==0xFFFE ){  c =
2420: 20 30 78 46 46 46 44 3b 20 7d 0a 20 20 7d 0a 20   0xFFFD; }.  }. 
2430: 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a   return c;.}../*
2440: 0a 2a 2a 20 45 6e 63 6f 64 65 20 61 20 55 54 46  .** Encode a UTF
2450: 38 20 73 74 72 69 6e 67 20 66 6f 72 20 4a 53 4f  8 string for JSO
2460: 4e 2e 20 20 41 6c 6c 20 73 70 65 63 69 61 6c 20  N.  All special 
2470: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 65  characters are e
2480: 73 63 61 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  scaped..*/.void 
2490: 62 6c 6f 62 5f 61 70 70 65 6e 64 5f 6a 73 6f 6e  blob_append_json
24a0: 5f 73 74 72 69 6e 67 28 42 6c 6f 62 20 2a 70 42  _string(Blob *pB
24b0: 6c 6f 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  lob, const char 
24c0: 2a 7a 53 74 72 29 7b 0a 20 20 63 6f 6e 73 74 20  *zStr){.  const 
24d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
24e0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a  ;.  char *zOut;.
24f0: 20 20 75 33 32 20 63 3b 0a 20 20 69 6e 74 20 6e    u32 c;.  int n
2500: 2c 20 69 2c 20 6a 3b 0a 20 20 7a 20 3d 20 28 63  , i, j;.  z = (c
2510: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2520: 61 72 2a 29 7a 53 74 72 3b 0a 20 20 6e 20 3d 20  ar*)zStr;.  n = 
2530: 30 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  0;.  while( (c =
2540: 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f 72 65 61   fossil_utf8_rea
2550: 64 28 26 7a 29 29 21 3d 30 20 29 7b 0a 20 20 20  d(&z))!=0 ){.   
2560: 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 7c 7c 20   if( c=='\\' || 
2570: 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  c=='"' ){.      
2580: 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  n += 2;.    }els
2590: 65 20 69 66 28 20 63 3c 27 20 27 20 7c 7c 20 63  e if( c<' ' || c
25a0: 3e 3d 30 78 37 66 20 29 7b 0a 20 20 20 20 20 20  >=0x7f ){.      
25b0: 69 66 28 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20 63  if( c=='\n' || c
25c0: 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20  =='\r' ){.      
25d0: 20 20 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    n += 2;.      
25e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
25f0: 20 2b 3d 20 36 3b 0a 20 20 20 20 20 20 7d 0a 20   += 6;.      }. 
2600: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2610: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
2620: 20 69 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28 70   i = blob_size(p
2630: 42 6c 6f 62 29 3b 0a 20 20 62 6c 6f 62 5f 72 65  Blob);.  blob_re
2640: 73 69 7a 65 28 70 42 6c 6f 62 2c 20 69 2b 6e 29  size(pBlob, i+n)
2650: 3b 0a 20 20 7a 4f 75 74 20 3d 20 62 6c 6f 62 5f  ;.  zOut = blob_
2660: 62 75 66 66 65 72 28 70 42 6c 6f 62 29 3b 0a 20  buffer(pBlob);. 
2670: 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69   z = (const unsi
2680: 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 74 72 3b  gned char*)zStr;
2690: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 66  .  while( (c = f
26a0: 6f 73 73 69 6c 5f 75 74 66 38 5f 72 65 61 64 28  ossil_utf8_read(
26b0: 26 7a 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  &z))!=0 ){.    i
26c0: 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  f( c=='\\' ){.  
26d0: 20 20 20 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20      zOut[i++] = 
26e0: 27 5c 5c 27 3b 0a 20 20 20 20 20 20 7a 4f 75 74  '\\';.      zOut
26f0: 5b 69 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d  [i++] = c;.    }
2700: 65 6c 73 65 20 69 66 28 20 63 3c 27 20 27 20 7c  else if( c<' ' |
2710: 7c 20 63 3e 3d 30 78 37 66 20 29 7b 0a 20 20 20  | c>=0x7f ){.   
2720: 20 20 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27     zOut[i++] = '
2730: 5c 5c 27 3b 0a 20 20 20 20 20 20 69 66 28 20 63  \\';.      if( c
2740: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
2750: 20 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27 6e    zOut[i++] = 'n
2760: 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
2770: 66 28 20 63 3d 3d 27 5c 72 27 20 29 7b 0a 20 20  f( c=='\r' ){.  
2780: 20 20 20 20 20 20 7a 4f 75 74 5b 69 2b 2b 5d 20        zOut[i++] 
2790: 3d 20 27 72 27 3b 0a 20 20 20 20 20 20 7d 65 6c  = 'r';.      }el
27a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74  se{.        zOut
27b0: 5b 69 2b 2b 5d 20 3d 20 27 75 27 3b 0a 20 20 20  [i++] = 'u';.   
27c0: 20 20 20 20 20 66 6f 72 28 6a 3d 33 3b 20 6a 3e       for(j=3; j>
27d0: 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
27e0: 20 20 20 20 7a 4f 75 74 5b 69 2b 6a 5d 20 3d 20      zOut[i+j] = 
27f0: 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
2800: 66 22 5b 63 26 30 78 66 5d 3b 0a 20 20 20 20 20  f"[c&0xf];.     
2810: 20 20 20 20 20 63 20 3e 3e 3d 20 34 3b 0a 20 20       c >>= 4;.  
2820: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2830: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 7d 0a  i += 4;.      }.
2840: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2850: 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 63 3b 0a   zOut[i++] = c;.
2860: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4f 75 74      }.  }.  zOut
2870: 5b 69 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  [i] = 0;.}../*.*
2880: 2a 20 54 68 65 20 63 68 61 72 61 63 74 65 72 73  * The characters
2890: 20 75 73 65 64 20 66 6f 72 20 48 54 54 50 20 62   used for HTTP b
28a0: 61 73 65 36 34 20 65 6e 63 6f 64 69 6e 67 2e 0a  ase64 encoding..
28b0: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
28c0: 65 64 20 63 68 61 72 20 7a 42 61 73 65 5b 5d 20  ed char zBase[] 
28d0: 3d 0a 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b  =.  "ABCDEFGHIJK
28e0: 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 61  LMNOPQRSTUVWXYZa
28f0: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
2900: 72 73 74 75 76 77 78 79 7a 30 31 32 33 34 35 36  rstuvwxyz0123456
2910: 37 38 39 2b 2f 22 3b 0a 0a 2f 2a 0a 2a 2a 20 45  789+/";../*.** E
2920: 6e 63 6f 64 65 20 61 20 73 74 72 69 6e 67 20 75  ncode a string u
2930: 73 69 6e 67 20 61 20 62 61 73 65 2d 36 34 20 65  sing a base-64 e
2940: 6e 63 6f 64 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  ncoding..** The 
2950: 65 6e 63 6f 64 69 6e 67 20 63 61 6e 20 62 65 20  encoding can be 
2960: 72 65 76 65 72 73 65 64 20 75 73 69 6e 67 20 74  reversed using t
2970: 68 65 20 3c 62 3e 64 65 63 6f 64 65 36 34 3c 2f  he <b>decode64</
2980: 62 3e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  b> function..**.
2990: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
29a0: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6d 65   the result come
29b0: 73 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e  s from malloc().
29c0: 0a 2a 2f 0a 63 68 61 72 20 2a 65 6e 63 6f 64 65  .*/.char *encode
29d0: 36 34 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  64(const char *z
29e0: 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
29f0: 7b 0a 20 20 63 68 61 72 20 2a 7a 36 34 3b 0a 20  {.  char *z64;. 
2a00: 20 69 6e 74 20 69 2c 20 6e 3b 0a 0a 20 20 69 66   int i, n;..  if
2a10: 28 20 6e 44 61 74 61 3c 3d 30 20 29 7b 0a 20 20  ( nData<=0 ){.  
2a20: 20 20 6e 44 61 74 61 20 3d 20 73 74 72 6c 65 6e    nData = strlen
2a30: 28 7a 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 7a  (zData);.  }.  z
2a40: 36 34 20 3d 20 66 6f 73 73 69 6c 5f 6d 61 6c 6c  64 = fossil_mall
2a50: 6f 63 28 20 28 6e 44 61 74 61 2a 34 29 2f 33 20  oc( (nData*4)/3 
2a60: 2b 20 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 6e  + 8 );.  for(i=n
2a70: 3d 30 3b 20 69 2b 32 3c 6e 44 61 74 61 3b 20 69  =0; i+2<nData; i
2a80: 2b 3d 33 29 7b 0a 20 20 20 20 7a 36 34 5b 6e 2b  +=3){.    z64[n+
2a90: 2b 5d 20 3d 20 7a 42 61 73 65 5b 20 28 7a 44 61  +] = zBase[ (zDa
2aa0: 74 61 5b 69 5d 3e 3e 32 29 20 26 20 30 78 33 66  ta[i]>>2) & 0x3f
2ab0: 20 5d 3b 0a 20 20 20 20 7a 36 34 5b 6e 2b 2b 5d   ];.    z64[n++]
2ac0: 20 3d 20 7a 42 61 73 65 5b 20 28 28 7a 44 61 74   = zBase[ ((zDat
2ad0: 61 5b 69 5d 3c 3c 34 29 20 26 20 30 78 33 30 29  a[i]<<4) & 0x30)
2ae0: 20 7c 20 28 28 7a 44 61 74 61 5b 69 2b 31 5d 3e   | ((zData[i+1]>
2af0: 3e 34 29 20 26 20 30 78 30 66 29 20 5d 3b 0a 20  >4) & 0x0f) ];. 
2b00: 20 20 20 7a 36 34 5b 6e 2b 2b 5d 20 3d 20 7a 42     z64[n++] = zB
2b10: 61 73 65 5b 20 28 28 7a 44 61 74 61 5b 69 2b 31  ase[ ((zData[i+1
2b20: 5d 3c 3c 32 29 20 26 20 30 78 33 63 29 20 7c 20  ]<<2) & 0x3c) | 
2b30: 28 28 7a 44 61 74 61 5b 69 2b 32 5d 3e 3e 36 29  ((zData[i+2]>>6)
2b40: 20 26 20 30 78 30 33 29 20 5d 3b 0a 20 20 20 20   & 0x03) ];.    
2b50: 7a 36 34 5b 6e 2b 2b 5d 20 3d 20 7a 42 61 73 65  z64[n++] = zBase
2b60: 5b 20 7a 44 61 74 61 5b 69 2b 32 5d 20 26 20 30  [ zData[i+2] & 0
2b70: 78 33 66 20 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  x3f ];.  }.  if(
2b80: 20 69 2b 31 3c 6e 44 61 74 61 20 29 7b 0a 20 20   i+1<nData ){.  
2b90: 20 20 7a 36 34 5b 6e 2b 2b 5d 20 3d 20 7a 42 61    z64[n++] = zBa
2ba0: 73 65 5b 20 28 7a 44 61 74 61 5b 69 5d 3e 3e 32  se[ (zData[i]>>2
2bb0: 29 20 26 20 30 78 33 66 20 5d 3b 0a 20 20 20 20  ) & 0x3f ];.    
2bc0: 7a 36 34 5b 6e 2b 2b 5d 20 3d 20 7a 42 61 73 65  z64[n++] = zBase
2bd0: 5b 20 28 28 7a 44 61 74 61 5b 69 5d 3c 3c 34 29  [ ((zData[i]<<4)
2be0: 20 26 20 30 78 33 30 29 20 7c 20 28 28 7a 44 61   & 0x30) | ((zDa
2bf0: 74 61 5b 69 2b 31 5d 3e 3e 34 29 20 26 20 30 78  ta[i+1]>>4) & 0x
2c00: 30 66 29 20 5d 3b 0a 20 20 20 20 7a 36 34 5b 6e  0f) ];.    z64[n
2c10: 2b 2b 5d 20 3d 20 7a 42 61 73 65 5b 20 28 28 7a  ++] = zBase[ ((z
2c20: 44 61 74 61 5b 69 2b 31 5d 3c 3c 32 29 20 26 20  Data[i+1]<<2) & 
2c30: 30 78 33 63 29 20 5d 3b 0a 20 20 20 20 7a 36 34  0x3c) ];.    z64
2c40: 5b 6e 2b 2b 5d 20 3d 20 27 3d 27 3b 0a 20 20 7d  [n++] = '=';.  }
2c50: 65 6c 73 65 20 69 66 28 20 69 3c 6e 44 61 74 61  else if( i<nData
2c60: 20 29 7b 0a 20 20 20 20 7a 36 34 5b 6e 2b 2b 5d   ){.    z64[n++]
2c70: 20 3d 20 7a 42 61 73 65 5b 20 28 7a 44 61 74 61   = zBase[ (zData
2c80: 5b 69 5d 3e 3e 32 29 20 26 20 30 78 33 66 20 5d  [i]>>2) & 0x3f ]
2c90: 3b 0a 20 20 20 20 7a 36 34 5b 6e 2b 2b 5d 20 3d  ;.    z64[n++] =
2ca0: 20 7a 42 61 73 65 5b 20 28 28 7a 44 61 74 61 5b   zBase[ ((zData[
2cb0: 69 5d 3c 3c 34 29 20 26 20 30 78 33 30 29 20 5d  i]<<4) & 0x30) ]
2cc0: 3b 0a 20 20 20 20 7a 36 34 5b 6e 2b 2b 5d 20 3d  ;.    z64[n++] =
2cd0: 20 27 3d 27 3b 0a 20 20 20 20 7a 36 34 5b 6e 2b   '=';.    z64[n+
2ce0: 2b 5d 20 3d 20 27 3d 27 3b 0a 20 20 7d 0a 20 20  +] = '=';.  }.  
2cf0: 7a 36 34 5b 6e 5d 20 3d 20 30 3b 0a 20 20 72 65  z64[n] = 0;.  re
2d00: 74 75 72 6e 20 7a 36 34 3b 0a 7d 0a 0a 2f 2a 0a  turn z64;.}../*.
2d10: 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74  ** COMMAND: test
2d20: 2d 65 6e 63 6f 64 65 36 34 0a 2a 2a 0a 2a 2a 20  -encode64.**.** 
2d30: 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 74  Usage: %fossil t
2d40: 65 73 74 2d 65 6e 63 6f 64 65 36 34 20 53 54 52  est-encode64 STR
2d50: 49 4e 47 0a 2a 2f 0a 76 6f 69 64 20 74 65 73 74  ING.*/.void test
2d60: 5f 65 6e 63 6f 64 65 36 34 5f 63 6d 64 28 76 6f  _encode64_cmd(vo
2d70: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  id){.  char *z;.
2d80: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2d90: 3d 32 3b 20 69 3c 67 2e 61 72 67 63 3b 20 69 2b  =2; i<g.argc; i+
2da0: 2b 29 7b 0a 20 20 20 20 7a 20 3d 20 65 6e 63 6f  +){.    z = enco
2db0: 64 65 36 34 28 67 2e 61 72 67 76 5b 69 5d 2c 20  de64(g.argv[i], 
2dc0: 2d 31 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  -1);.    fossil_
2dd0: 70 72 69 6e 74 28 22 25 73 5c 6e 22 2c 20 7a 29  print("%s\n", z)
2de0: 3b 0a 20 20 20 20 66 72 65 65 28 7a 29 3b 0a 20  ;.    free(z);. 
2df0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   }.}.../*.** Thi
2e00: 73 20 66 75 6e 63 74 69 6f 6e 20 74 72 65 61 74  s function treat
2e10: 73 20 69 74 73 20 69 6e 70 75 74 20 61 73 20 61  s its input as a
2e20: 20 62 61 73 65 2d 36 34 20 73 74 72 69 6e 67 20   base-64 string 
2e30: 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 0a  and returns the.
2e40: 2a 2a 20 64 65 63 6f 64 65 64 20 76 61 6c 75 65  ** decoded value
2e50: 20 6f 66 20 74 68 61 74 20 73 74 72 69 6e 67 2e   of that string.
2e60: 20 20 43 68 61 72 61 63 74 65 72 73 20 6f 66 20    Characters of 
2e70: 69 6e 70 75 74 20 74 68 61 74 20 61 72 65 20 6e  input that are n
2e80: 6f 74 0a 2a 2a 20 76 61 6c 69 64 20 62 61 73 65  ot.** valid base
2e90: 2d 36 34 20 63 68 61 72 61 63 74 65 72 73 20 28  -64 characters (
2ea0: 73 75 63 68 20 61 73 20 73 70 61 63 65 73 20 61  such as spaces a
2eb0: 6e 64 20 6e 65 77 6c 69 6e 65 73 29 20 61 72 65  nd newlines) are
2ec0: 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
2ed0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
2ee0: 65 20 64 65 63 6f 64 65 64 20 73 74 72 69 6e 67  e decoded string
2ef0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
2f00: 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a  m malloc()..**.*
2f10: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2f20: 62 79 74 65 73 20 64 65 63 6f 64 65 64 20 69 73  bytes decoded is
2f30: 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 6e   returned in *pn
2f40: 42 79 74 65 0a 2a 2f 0a 63 68 61 72 20 2a 64 65  Byte.*/.char *de
2f50: 63 6f 64 65 36 34 28 63 6f 6e 73 74 20 63 68 61  code64(const cha
2f60: 72 20 2a 7a 36 34 2c 20 69 6e 74 20 2a 70 6e 42  r *z64, int *pnB
2f70: 79 74 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  yte){.  char *zD
2f80: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 36 34 3b 0a  ata;.  int n64;.
2f90: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
2fa0: 74 20 61 2c 20 62 2c 20 63 2c 20 64 3b 0a 20 20  t a, b, c, d;.  
2fb0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 49 6e 69  static int isIni
2fc0: 74 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  t = 0;.  static 
2fd0: 69 6e 74 20 74 72 61 6e 73 5b 31 32 38 5d 3b 0a  int trans[128];.
2fe0: 0a 20 20 69 66 28 20 21 69 73 49 6e 69 74 20 29  .  if( !isInit )
2ff0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
3000: 3c 31 32 38 3b 20 69 2b 2b 29 7b 20 74 72 61 6e  <128; i++){ tran
3010: 73 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 20 20  s[i] = 0; }.    
3020: 66 6f 72 28 69 3d 30 3b 20 7a 42 61 73 65 5b 69  for(i=0; zBase[i
3030: 5d 3b 20 69 2b 2b 29 7b 20 74 72 61 6e 73 5b 7a  ]; i++){ trans[z
3040: 42 61 73 65 5b 69 5d 20 26 20 30 78 37 66 5d 20  Base[i] & 0x7f] 
3050: 3d 20 69 3b 20 7d 0a 20 20 20 20 69 73 49 6e 69  = i; }.    isIni
3060: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e 36 34  t = 1;.  }.  n64
3070: 20 3d 20 73 74 72 6c 65 6e 28 7a 36 34 29 3b 0a   = strlen(z64);.
3080: 20 20 77 68 69 6c 65 28 20 6e 36 34 3e 30 20 26    while( n64>0 &
3090: 26 20 7a 36 34 5b 6e 36 34 2d 31 5d 3d 3d 27 3d  & z64[n64-1]=='=
30a0: 27 20 29 20 6e 36 34 2d 2d 3b 0a 20 20 7a 44 61  ' ) n64--;.  zDa
30b0: 74 61 20 3d 20 66 6f 73 73 69 6c 5f 6d 61 6c 6c  ta = fossil_mall
30c0: 6f 63 28 20 28 6e 36 34 2a 33 29 2f 34 20 2b 20  oc( (n64*3)/4 + 
30d0: 34 20 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  4 );.  for(i=j=0
30e0: 3b 20 69 2b 33 3c 6e 36 34 3b 20 69 2b 3d 34 29  ; i+3<n64; i+=4)
30f0: 7b 0a 20 20 20 20 61 20 3d 20 74 72 61 6e 73 5b  {.    a = trans[
3100: 7a 36 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a  z64[i] & 0x7f];.
3110: 20 20 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36      b = trans[z6
3120: 34 5b 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a  4[i+1] & 0x7f];.
3130: 20 20 20 20 63 20 3d 20 74 72 61 6e 73 5b 7a 36      c = trans[z6
3140: 34 5b 69 2b 32 5d 20 26 20 30 78 37 66 5d 3b 0a  4[i+2] & 0x7f];.
3150: 20 20 20 20 64 20 3d 20 74 72 61 6e 73 5b 7a 36      d = trans[z6
3160: 34 5b 69 2b 33 5d 20 26 20 30 78 37 66 5d 3b 0a  4[i+3] & 0x7f];.
3170: 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d      zData[j++] =
3180: 20 28 28 61 3c 3c 32 29 20 26 20 30 78 66 63 29   ((a<<2) & 0xfc)
3190: 20 7c 20 28 28 62 3e 3e 34 29 20 26 20 30 78 30   | ((b>>4) & 0x0
31a0: 33 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b  3);.    zData[j+
31b0: 2b 5d 20 3d 20 28 28 62 3c 3c 34 29 20 26 20 30  +] = ((b<<4) & 0
31c0: 78 66 30 29 20 7c 20 28 28 63 3e 3e 32 29 20 26  xf0) | ((c>>2) &
31d0: 20 30 78 30 66 29 3b 0a 20 20 20 20 7a 44 61 74   0x0f);.    zDat
31e0: 61 5b 6a 2b 2b 5d 20 3d 20 28 28 63 3c 3c 36 29  a[j++] = ((c<<6)
31f0: 20 26 20 30 78 63 30 29 20 7c 20 28 64 20 26 20   & 0xc0) | (d & 
3200: 30 78 33 66 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0x3f);.  }.  if(
3210: 20 69 2b 32 3c 6e 36 34 20 29 7b 0a 20 20 20 20   i+2<n64 ){.    
3220: 61 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d  a = trans[z64[i]
3230: 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 62 20   & 0x7f];.    b 
3240: 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d  = trans[z64[i+1]
3250: 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 63 20   & 0x7f];.    c 
3260: 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d  = trans[z64[i+2]
3270: 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44   & 0x7f];.    zD
3280: 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c  ata[j++] = ((a<<
3290: 32 29 20 26 20 30 78 66 63 29 20 7c 20 28 28 62  2) & 0xfc) | ((b
32a0: 3e 3e 34 29 20 26 20 30 78 30 33 29 3b 0a 20 20  >>4) & 0x03);.  
32b0: 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28    zData[j++] = (
32c0: 28 62 3c 3c 34 29 20 26 20 30 78 66 30 29 20 7c  (b<<4) & 0xf0) |
32d0: 20 28 28 63 3e 3e 32 29 20 26 20 30 78 30 66 29   ((c>>2) & 0x0f)
32e0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b  ;.  }else if( i+
32f0: 31 3c 6e 36 34 20 29 7b 0a 20 20 20 20 61 20 3d  1<n64 ){.    a =
3300: 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20   trans[z64[i] & 
3310: 30 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74  0x7f];.    b = t
3320: 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20  rans[z64[i+1] & 
3330: 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61  0x7f];.    zData
3340: 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20  [j++] = ((a<<2) 
3350: 26 20 30 78 66 63 29 20 7c 20 28 28 62 3e 3e 34  & 0xfc) | ((b>>4
3360: 29 20 26 20 30 78 30 33 29 3b 0a 20 20 7d 0a 20  ) & 0x03);.  }. 
3370: 20 7a 44 61 74 61 5b 6a 5d 20 3d 20 30 3b 0a 20   zData[j] = 0;. 
3380: 20 2a 70 6e 42 79 74 65 20 3d 20 6a 3b 0a 20 20   *pnByte = j;.  
3390: 72 65 74 75 72 6e 20 7a 44 61 74 61 3b 0a 7d 0a  return zData;.}.
33a0: 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20  ./*.** COMMAND: 
33b0: 74 65 73 74 2d 64 65 63 6f 64 65 36 34 0a 2a 2a  test-decode64.**
33c0: 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73  .** Usage: %foss
33d0: 69 6c 20 74 65 73 74 2d 64 65 63 6f 64 65 36 34  il test-decode64
33e0: 20 53 54 52 49 4e 47 0a 2a 2f 0a 76 6f 69 64 20   STRING.*/.void 
33f0: 74 65 73 74 5f 64 65 63 6f 64 65 36 34 5f 63 6d  test_decode64_cm
3400: 64 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20  d(void){.  char 
3410: 2a 7a 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  *z;.  int i, n;.
3420: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 67 2e 61    for(i=2; i<g.a
3430: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  rgc; i++){.    z
3440: 20 3d 20 64 65 63 6f 64 65 36 34 28 67 2e 61 72   = decode64(g.ar
3450: 67 76 5b 69 5d 2c 20 26 6e 29 3b 0a 20 20 20 20  gv[i], &n);.    
3460: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 25 64  fossil_print("%d
3470: 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20 7a 29 3b 0a  : %s\n", n, z);.
3480: 20 20 20 20 66 72 65 65 28 7a 29 3b 0a 20 20 7d      free(z);.  }
3490: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 61  .}../*.** The ba
34a0: 73 65 2d 31 36 20 65 6e 63 6f 64 69 6e 67 20 75  se-16 encoding u
34b0: 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sing the followi
34c0: 6e 67 20 63 68 61 72 61 63 74 65 72 73 3a 0a 2a  ng characters:.*
34d0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 30 31 32  *.**         012
34e0: 33 34 35 36 37 38 39 61 62 63 64 65 66 0a 2a 2a  3456789abcdef.**
34f0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  .*/../*.** The a
3500: 72 72 61 79 20 75 73 65 64 20 66 6f 72 20 65 6e  rray used for en
3510: 63 6f 64 69 6e 67 0a 2a 2f 20 20 20 20 20 20 20  coding.*/       
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 20 20 20 20 2f 2a 20 31 32 33 34 35 36 37 38 39      /* 123456789
3540: 20 31 32 33 34 35 20 20 2a 2f 0a 73 74 61 74 69   12345  */.stati
3550: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 45 6e  c const char zEn
3560: 63 6f 64 65 5b 5d 20 3d 20 22 30 31 32 33 34 35  code[] = "012345
3570: 36 37 38 39 61 62 63 64 65 66 22 3b 0a 0a 2f 2a  6789abcdef";../*
3580: 0a 2a 2a 20 45 6e 63 6f 64 65 20 61 20 4e 2d 64  .** Encode a N-d
3590: 69 67 69 74 20 62 61 73 65 2d 32 35 36 20 69 6e  igit base-256 in
35a0: 20 62 61 73 65 2d 31 36 2e 20 20 52 65 74 75 72   base-16.  Retur
35b0: 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n zero on succes
35c0: 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72  s.** and non-zer
35d0: 6f 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  o if there is an
35e0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 65   error..*/.int e
35f0: 6e 63 6f 64 65 31 36 28 63 6f 6e 73 74 20 75 6e  ncode16(const un
3600: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 49 6e  signed char *pIn
3610: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
3620: 2a 7a 4f 75 74 2c 20 69 6e 74 20 4e 29 7b 0a 20  *zOut, int N){. 
3630: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
3640: 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<N; i++){.  
3650: 20 20 2a 28 7a 4f 75 74 2b 2b 29 20 3d 20 7a 45    *(zOut++) = zE
3660: 6e 63 6f 64 65 5b 70 49 6e 5b 69 5d 3e 3e 34 5d  ncode[pIn[i]>>4]
3670: 3b 0a 20 20 20 20 2a 28 7a 4f 75 74 2b 2b 29 20  ;.    *(zOut++) 
3680: 3d 20 7a 45 6e 63 6f 64 65 5b 70 49 6e 5b 69 5d  = zEncode[pIn[i]
3690: 26 30 78 66 5d 3b 0a 20 20 7d 0a 20 20 2a 7a 4f  &0xf];.  }.  *zO
36a0: 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ut = 0;.  return
36b0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20   0;.}../*.** An 
36c0: 61 72 72 61 79 20 66 6f 72 20 74 72 61 6e 73 6c  array for transl
36d0: 61 74 69 6e 67 20 73 69 6e 67 6c 65 20 62 61 73  ating single bas
36e0: 65 2d 31 36 20 63 68 61 72 61 63 74 65 72 73 20  e-16 characters 
36f0: 69 6e 74 6f 20 61 20 76 61 6c 75 65 2e 0a 2a 2a  into a value..**
3700: 20 44 69 73 61 6c 6c 6f 77 65 64 20 69 6e 70 75   Disallowed inpu
3710: 74 20 63 68 61 72 61 63 74 65 72 73 20 68 61 76  t characters hav
3720: 65 20 61 20 76 61 6c 75 65 20 6f 66 20 36 34 2e  e a value of 64.
3730: 20 20 55 70 70 65 72 20 61 6e 64 20 6c 6f 77 65    Upper and lowe
3740: 72 0a 2a 2a 20 63 61 73 65 20 69 73 20 74 68 65  r.** case is the
3750: 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   same..*/.static
3760: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 44 65 63   const char zDec
3770: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 36 34 2c 20  ode[] = {.  64, 
3780: 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20  64, 64, 64, 64, 
3790: 36 34 2c 20 36 34 2c 20 36 34 2c 20 20 36 34 2c  64, 64, 64,  64,
37a0: 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c   64, 64, 64, 64,
37b0: 20 36 34 2c 20 36 34 2c 20 36 34 2c 0a 20 20 36   64, 64, 64,.  6
37c0: 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36  4, 64, 64, 64, 6
37d0: 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 20  4, 64, 64, 64,  
37e0: 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20  64, 64, 64, 64, 
37f0: 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 0a  64, 64, 64, 64,.
3800: 20 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34    64, 64, 64, 64
3810: 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34  , 64, 64, 64, 64
3820: 2c 20 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36  ,  64, 64, 64, 6
3830: 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36  4, 64, 64, 64, 6
3840: 34 2c 0a 20 20 20 30 2c 20 20 31 2c 20 20 32 2c  4,.   0,  1,  2,
3850: 20 20 33 2c 20 20 34 2c 20 20 35 2c 20 20 36 2c    3,  4,  5,  6,
3860: 20 20 37 2c 20 20 20 38 2c 20 20 39 2c 20 36 34    7,   8,  9, 64
3870: 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34  , 64, 64, 64, 64
3880: 2c 20 36 34 2c 0a 20 20 36 34 2c 20 31 30 2c 20  , 64,.  64, 10, 
3890: 31 31 2c 20 31 32 2c 20 31 33 2c 20 31 34 2c 20  11, 12, 13, 14, 
38a0: 31 35 2c 20 36 34 2c 20 20 36 34 2c 20 36 34 2c  15, 64,  64, 64,
38b0: 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c   64, 64, 64, 64,
38c0: 20 36 34 2c 20 36 34 2c 0a 20 20 36 34 2c 20 36   64, 64,.  64, 6
38d0: 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36  4, 64, 64, 64, 6
38e0: 34 2c 20 36 34 2c 20 36 34 2c 20 20 36 34 2c 20  4, 64, 64,  64, 
38f0: 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20  64, 64, 64, 64, 
3900: 36 34 2c 20 36 34 2c 20 36 34 2c 0a 20 20 36 34  64, 64, 64,.  64
3910: 2c 20 31 30 2c 20 31 31 2c 20 31 32 2c 20 31 33  , 10, 11, 12, 13
3920: 2c 20 31 34 2c 20 31 35 2c 20 36 34 2c 20 20 36  , 14, 15, 64,  6
3930: 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36  4, 64, 64, 64, 6
3940: 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 0a 20  4, 64, 64, 64,. 
3950: 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c   64, 64, 64, 64,
3960: 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c   64, 64, 64, 64,
3970: 20 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34    64, 64, 64, 64
3980: 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34  , 64, 64, 64, 64
3990: 2c 0a 20 20 36 34 2c 20 36 34 2c 20 36 34 2c 20  ,.  64, 64, 64, 
39a0: 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20  64, 64, 64, 64, 
39b0: 36 34 2c 20 20 36 34 2c 20 36 34 2c 20 36 34 2c  64,  64, 64, 64,
39c0: 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c   64, 64, 64, 64,
39d0: 20 36 34 2c 0a 20 20 36 34 2c 20 36 34 2c 20 36   64,.  64, 64, 6
39e0: 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36  4, 64, 64, 64, 6
39f0: 34 2c 20 36 34 2c 20 20 36 34 2c 20 36 34 2c 20  4, 64,  64, 64, 
3a00: 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20  64, 64, 64, 64, 
3a10: 36 34 2c 20 36 34 2c 0a 20 20 36 34 2c 20 36 34  64, 64,.  64, 64
3a20: 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34  , 64, 64, 64, 64
3a30: 2c 20 36 34 2c 20 36 34 2c 20 20 36 34 2c 20 36  , 64, 64,  64, 6
3a40: 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36  4, 64, 64, 64, 6
3a50: 34 2c 20 36 34 2c 20 36 34 2c 0a 20 20 36 34 2c  4, 64, 64,.  64,
3a60: 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c   64, 64, 64, 64,
3a70: 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 20 36 34   64, 64, 64,  64
3a80: 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34  , 64, 64, 64, 64
3a90: 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 0a 20 20  , 64, 64, 64,.  
3aa0: 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20  64, 64, 64, 64, 
3ab0: 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20  64, 64, 64, 64, 
3ac0: 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c   64, 64, 64, 64,
3ad0: 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c   64, 64, 64, 64,
3ae0: 0a 20 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36  .  64, 64, 64, 6
3af0: 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36  4, 64, 64, 64, 6
3b00: 34 2c 20 20 36 34 2c 20 36 34 2c 20 36 34 2c 20  4,  64, 64, 64, 
3b10: 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20  64, 64, 64, 64, 
3b20: 36 34 2c 0a 20 20 36 34 2c 20 36 34 2c 20 36 34  64,.  64, 64, 64
3b30: 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34  , 64, 64, 64, 64
3b40: 2c 20 36 34 2c 20 20 36 34 2c 20 36 34 2c 20 36  , 64,  64, 64, 6
3b50: 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36  4, 64, 64, 64, 6
3b60: 34 2c 20 36 34 2c 0a 20 20 36 34 2c 20 36 34 2c  4, 64,.  64, 64,
3b70: 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c   64, 64, 64, 64,
3b80: 20 36 34 2c 20 36 34 2c 20 20 36 34 2c 20 36 34   64, 64,  64, 64
3b90: 2c 20 36 34 2c 20 36 34 2c 20 36 34 2c 20 36 34  , 64, 64, 64, 64
3ba0: 2c 20 36 34 2c 20 36 34 2c 0a 7d 3b 0a 0a 2f 2a  , 64, 64,.};../*
3bb0: 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 4e 2d 63  .** Decode a N-c
3bc0: 68 61 72 61 63 74 65 72 20 62 61 73 65 2d 31 36  haracter base-16
3bd0: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 61 73   number into bas
3be0: 65 2d 32 35 36 2e 20 20 4e 20 6d 75 73 74 20 62  e-256.  N must b
3bf0: 65 20 61 0a 2a 2a 20 6d 75 6c 74 69 70 6c 65 20  e a.** multiple 
3c00: 6f 66 20 32 2e 20 20 54 68 65 20 6f 75 74 70 75  of 2.  The outpu
3c10: 74 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  t buffer must be
3c20: 20 61 74 20 6c 65 61 73 74 20 4e 2f 32 20 63 68   at least N/2 ch
3c30: 61 72 61 63 74 65 72 73 0a 2a 2a 20 69 6e 20 6c  aracters.** in l
3c40: 65 6e 67 74 68 0a 2a 2f 0a 69 6e 74 20 64 65 63  ength.*/.int dec
3c50: 6f 64 65 31 36 28 63 6f 6e 73 74 20 75 6e 73 69  ode16(const unsi
3c60: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 2c 20  gned char *zIn, 
3c70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
3c80: 4f 75 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  Out, int N){.  i
3c90: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20 28  nt i, j;.  if( (
3ca0: 4e 26 31 29 21 3d 30 20 29 20 72 65 74 75 72 6e  N&1)!=0 ) return
3cb0: 20 31 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b   1;.  for(i=j=0;
3cc0: 20 69 3c 4e 3b 20 69 20 2b 3d 20 32 2c 20 6a 2b   i<N; i += 2, j+
3cd0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 76 31 2c 20  +){.    int v1, 
3ce0: 76 32 2c 20 61 3b 0a 20 20 20 20 61 20 3d 20 7a  v2, a;.    a = z
3cf0: 49 6e 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28  In[i];.    if( (
3d00: 61 20 26 20 30 78 38 30 29 21 3d 30 20 7c 7c 20  a & 0x80)!=0 || 
3d10: 28 76 31 20 3d 20 7a 44 65 63 6f 64 65 5b 61 5d  (v1 = zDecode[a]
3d20: 29 3d 3d 36 34 20 29 20 72 65 74 75 72 6e 20 31  )==64 ) return 1
3d30: 3b 0a 20 20 20 20 61 20 3d 20 7a 49 6e 5b 69 2b  ;.    a = zIn[i+
3d40: 31 5d 3b 0a 20 20 20 20 69 66 28 20 28 61 20 26  1];.    if( (a &
3d50: 20 30 78 38 30 29 21 3d 30 20 7c 7c 20 28 76 32   0x80)!=0 || (v2
3d60: 20 3d 20 7a 44 65 63 6f 64 65 5b 61 5d 29 3d 3d   = zDecode[a])==
3d70: 36 34 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  64 ) return 1;. 
3d80: 20 20 20 70 4f 75 74 5b 6a 5d 20 3d 20 28 76 31     pOut[j] = (v1
3d90: 3c 3c 34 29 20 2b 20 76 32 3b 0a 20 20 7d 0a 20  <<4) + v2;.  }. 
3da0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
3db0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
3dc0: 20 69 66 20 74 68 65 20 69 6e 70 75 74 20 73 74   if the input st
3dd0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  ring contains on
3de0: 6c 79 20 76 61 6c 69 64 20 62 61 73 65 2d 31 36  ly valid base-16
3df0: 20 64 69 67 69 74 73 2e 0a 2a 2a 20 49 66 20 61   digits..** If a
3e00: 6e 79 20 69 6e 76 61 6c 69 64 20 63 68 61 72 61  ny invalid chara
3e10: 63 74 65 72 73 20 61 70 70 65 61 72 20 69 6e 20  cters appear in 
3e20: 74 68 65 20 73 74 72 69 6e 67 2c 20 72 65 74 75  the string, retu
3e30: 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74  rn false..*/.int
3e40: 20 76 61 6c 69 64 61 74 65 31 36 28 63 6f 6e 73   validate16(cons
3e50: 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 69 6e 74  t char *zIn, int
3e60: 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   nIn){.  int i;.
3e70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e    for(i=0; i<nIn
3e80: 3b 20 69 2b 2b 2c 20 7a 49 6e 2b 2b 29 7b 0a 20  ; i++, zIn++){. 
3e90: 20 20 20 69 66 28 20 7a 44 65 63 6f 64 65 5b 7a     if( zDecode[z
3ea0: 49 6e 5b 30 5d 26 30 78 66 66 5d 3e 36 33 20 29  In[0]&0xff]>63 )
3eb0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 7a  {.      return z
3ec0: 49 6e 5b 30 5d 3d 3d 30 3b 0a 20 20 20 20 7d 0a  In[0]==0;.    }.
3ed0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
3ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  }../*.** The inp
3ef0: 75 74 20 73 74 72 69 6e 67 20 69 73 20 61 20 62  ut string is a b
3f00: 61 73 65 31 36 20 76 61 6c 75 65 2e 20 20 43 6f  ase16 value.  Co
3f10: 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20 69 74  nvert it into it
3f20: 73 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 66  s canonical.** f
3f30: 6f 72 6d 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  orm.  This means
3f40: 20 74 68 61 74 20 64 69 67 69 74 73 20 61 72 65   that digits are
3f50: 20 61 6c 6c 20 6c 6f 77 65 72 20 63 61 73 65 20   all lower case 
3f60: 61 6e 64 20 74 68 61 74 20 63 6f 6e 76 65 72 73  and that convers
3f70: 69 6f 6e 73 0a 2a 2a 20 6c 69 6b 65 20 22 6c 22  ions.** like "l"
3f80: 2d 3e 22 31 22 20 61 6e 64 20 22 4f 22 2d 3e 22  ->"1" and "O"->"
3f90: 30 22 20 6f 63 63 75 72 2e 0a 2a 2f 0a 76 6f 69  0" occur..*/.voi
3fa0: 64 20 63 61 6e 6f 6e 69 63 61 6c 31 36 28 63 68  d canonical16(ch
3fb0: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
3fc0: 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 6e 2d   while( *z && n-
3fd0: 2d 20 29 7b 0a 20 20 20 20 2a 7a 20 3d 20 7a 45  - ){.    *z = zE
3fe0: 6e 63 6f 64 65 5b 7a 44 65 63 6f 64 65 5b 28 2a  ncode[zDecode[(*
3ff0: 7a 29 26 30 78 37 66 5d 26 30 78 31 66 5d 3b 0a  z)&0x7f]&0x1f];.
4000: 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a      z++;.  }.}..
4010: 2f 2a 20 52 61 6e 64 6f 6d 6e 65 73 73 20 75 73  /* Randomness us
4020: 65 64 20 66 6f 72 20 58 4f 52 2d 69 6e 67 20 62  ed for XOR-ing b
4030: 79 20 74 68 65 20 6f 62 73 63 75 72 65 28 29 20  y the obscure() 
4040: 61 6e 64 20 75 6e 6f 62 73 63 75 72 65 28 29 20  and unobscure() 
4050: 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 73 74 61 74  routines */.stat
4060: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
4070: 64 20 63 68 61 72 20 61 4f 62 73 63 75 72 65 72  d char aObscurer
4080: 5b 31 36 5d 20 3d 20 7b 0a 20 20 20 20 30 78 61  [16] = {.    0xa
4090: 37 2c 20 30 78 32 31 2c 20 30 78 33 31 2c 20 30  7, 0x21, 0x31, 0
40a0: 78 65 33 2c 20 30 78 32 61 2c 20 30 78 35 30 2c  xe3, 0x2a, 0x50,
40b0: 20 30 78 32 63 2c 20 30 78 38 36 2c 0a 20 20 20   0x2c, 0x86,.   
40c0: 20 30 78 34 63 2c 20 30 78 61 34 2c 20 30 78 35   0x4c, 0xa4, 0x5
40d0: 32 2c 20 30 78 32 35 2c 20 30 78 66 66 2c 20 30  2, 0x25, 0xff, 0
40e0: 78 34 39 2c 20 30 78 33 35 2c 20 30 78 38 35 0a  x49, 0x35, 0x85.
40f0: 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 73 63 75  };.../*.** Obscu
4100: 72 65 20 70 6c 61 69 6e 20 74 65 78 74 20 73 6f  re plain text so
4110: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
4120: 65 61 73 69 6c 79 20 72 65 61 64 61 62 6c 65 2e  easily readable.
4130: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
4140: 73 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  sed for storing 
4150: 73 65 6e 73 69 74 69 76 65 20 69 6e 66 6f 72 6d  sensitive inform
4160: 61 74 69 6f 6e 20 28 73 75 63 68 20 61 73 20 70  ation (such as p
4170: 61 73 73 77 6f 72 64 73 29 20 69 6e 20 61 0a 2a  asswords) in a.*
4180: 2a 20 77 61 79 20 74 68 61 74 20 70 72 65 76 65  * way that preve
4190: 6e 74 73 20 74 68 65 69 72 20 65 78 70 6f 73 75  nts their exposu
41a0: 72 65 20 74 68 72 6f 75 67 68 20 69 64 6c 65 20  re through idle 
41b0: 62 72 6f 77 73 69 6e 67 2e 20 20 54 68 69 73 20  browsing.  This 
41c0: 69 73 20 6e 6f 74 0a 2a 2a 20 65 6e 63 72 79 70  is not.** encryp
41d0: 74 69 6f 6e 2e 20 20 41 6e 79 62 6f 64 79 20 77  tion.  Anybody w
41e0: 68 6f 20 72 65 61 6c 6c 79 20 77 61 6e 74 73 20  ho really wants 
41f0: 74 68 65 20 70 61 73 73 77 6f 72 64 20 63 61 6e  the password can
4200: 20 73 74 69 6c 6c 20 67 65 74 20 69 74 2e 0a 2a   still get it..*
4210: 2a 0a 2a 2a 20 54 68 65 20 74 65 78 74 20 69 73  *.** The text is
4220: 20 58 4f 52 2d 65 64 20 77 69 74 68 20 61 20 72   XOR-ed with a r
4230: 65 70 65 61 74 69 6e 67 20 70 61 74 74 65 72 6e  epeating pattern
4240: 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   then converted 
4250: 74 6f 20 68 65 78 2e 0a 2a 2a 20 53 70 61 63 65  to hex..** Space
4260: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
4270: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
4280: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
4290: 6c 6c 6f 63 20 61 6e 64 20 73 68 6f 75 6c 64 0a  lloc and should.
42a0: 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20 74  ** be freed by t
42b0: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 63 68  he caller..*/.ch
42c0: 61 72 20 2a 6f 62 73 63 75 72 65 28 63 6f 6e 73  ar *obscure(cons
42d0: 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20  t char *zIn){.  
42e0: 69 6e 74 20 6e 2c 20 69 3b 0a 20 20 75 6e 73 69  int n, i;.  unsi
42f0: 67 6e 65 64 20 63 68 61 72 20 73 61 6c 74 3b 0a  gned char salt;.
4300: 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20    char *zOut;.. 
4310: 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65   if( zIn==0 ) re
4320: 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 73 74  turn 0;.  n = st
4330: 72 6c 65 6e 28 7a 49 6e 29 3b 0a 20 20 7a 4f 75  rlen(zIn);.  zOu
4340: 74 20 3d 20 66 6f 73 73 69 6c 5f 6d 61 6c 6c 6f  t = fossil_mallo
4350: 63 28 20 6e 2a 32 2b 33 20 29 3b 0a 20 20 73 71  c( n*2+3 );.  sq
4360: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
4370: 28 31 2c 20 26 73 61 6c 74 29 3b 0a 20 20 7a 4f  (1, &salt);.  zO
4380: 75 74 5b 6e 2b 31 5d 20 3d 20 28 63 68 61 72 29  ut[n+1] = (char)
4390: 73 61 6c 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  salt;.  for(i=0;
43a0: 20 69 3c 6e 3b 20 69 2b 2b 29 20 7a 4f 75 74 5b   i<n; i++) zOut[
43b0: 69 2b 6e 2b 32 5d 20 3d 20 7a 49 6e 5b 69 5d 5e  i+n+2] = zIn[i]^
43c0: 61 4f 62 73 63 75 72 65 72 5b 69 26 30 78 30 66  aObscurer[i&0x0f
43d0: 5d 5e 73 61 6c 74 3b 0a 20 20 65 6e 63 6f 64 65  ]^salt;.  encode
43e0: 31 36 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  16((unsigned cha
43f0: 72 2a 29 26 7a 4f 75 74 5b 6e 2b 31 5d 2c 20 28  r*)&zOut[n+1], (
4400: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
4410: 4f 75 74 2c 20 6e 2b 31 29 3b 0a 20 20 72 65 74  Out, n+1);.  ret
4420: 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a  urn zOut;.}../*.
4430: 2a 2a 20 55 6e 64 6f 20 74 68 65 20 6f 62 73 63  ** Undo the obsc
4440: 75 72 69 6e 67 20 6f 66 20 74 65 78 74 20 70 65  uring of text pe
4450: 72 66 6f 72 6d 65 64 20 62 79 20 6f 62 73 63 75  rformed by obscu
4460: 72 65 28 29 2e 20 20 4f 72 2c 20 69 66 20 74 68  re().  Or, if th
4470: 65 20 69 6e 70 75 74 20 69 73 0a 2a 2a 20 6e 6f  e input is.** no
4480: 74 20 68 65 78 61 64 65 63 69 6d 61 6c 20 28 6d  t hexadecimal (m
4490: 65 61 6e 69 6e 67 20 74 68 65 20 69 6e 70 75 74  eaning the input
44a0: 20 69 73 20 6e 6f 74 20 74 68 65 20 6f 75 74 70   is not the outp
44b0: 75 74 20 6f 66 20 6f 62 73 63 75 72 65 28 29 29  ut of obscure())
44c0: 20 74 68 65 6e 0a 2a 2a 20 64 6f 20 74 68 65 20   then.** do the 
44d0: 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 73 74  equivalent of st
44e0: 72 64 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  rdup()..**.** Th
44f0: 65 20 72 65 73 75 6c 74 20 69 73 20 6d 65 6d 6f  e result is memo
4500: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
4510: 20 6d 61 6c 6c 6f 63 20 74 68 61 74 20 73 68 6f   malloc that sho
4520: 75 6c 64 20 62 65 20 66 72 65 65 64 20 62 79 20  uld be freed by 
4530: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 63  the caller..*/.c
4540: 68 61 72 20 2a 75 6e 6f 62 73 63 75 72 65 28 63  har *unobscure(c
4550: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b  onst char *zIn){
4560: 0a 20 20 69 6e 74 20 6e 2c 20 69 3b 0a 20 20 75  .  int n, i;.  u
4570: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 61 6c  nsigned char sal
4580: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b  t;.  char *zOut;
4590: 0a 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29  ..  if( zIn==0 )
45a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d   return 0;.  n =
45b0: 20 73 74 72 6c 65 6e 28 7a 49 6e 29 3b 0a 20 20   strlen(zIn);.  
45c0: 7a 4f 75 74 20 3d 20 66 6f 73 73 69 6c 5f 6d 61  zOut = fossil_ma
45d0: 6c 6c 6f 63 28 20 6e 20 2b 20 31 20 29 3b 0a 20  lloc( n + 1 );. 
45e0: 20 69 66 28 20 6e 3c 32 0a 20 20 20 20 7c 7c 20   if( n<2.    || 
45f0: 64 65 63 6f 64 65 31 36 28 28 75 6e 73 69 67 6e  decode16((unsign
4600: 65 64 20 63 68 61 72 2a 29 7a 49 6e 2c 20 26 73  ed char*)zIn, &s
4610: 61 6c 74 2c 20 32 29 0a 20 20 20 20 7c 7c 20 64  alt, 2).    || d
4620: 65 63 6f 64 65 31 36 28 28 75 6e 73 69 67 6e 65  ecode16((unsigne
4630: 64 20 63 68 61 72 2a 29 26 7a 49 6e 5b 32 5d 2c  d char*)&zIn[2],
4640: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
4650: 29 7a 4f 75 74 2c 20 6e 2d 32 29 0a 20 20 29 7b  )zOut, n-2).  ){
4660: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74  .    memcpy(zOut
4670: 2c 20 7a 49 6e 2c 20 6e 2b 31 29 3b 0a 20 20 7d  , zIn, n+1);.  }
4680: 65 6c 73 65 7b 0a 20 20 20 20 6e 20 3d 20 6e 2f  else{.    n = n/
4690: 32 20 2d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  2 - 1;.    for(i
46a0: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 7a 4f  =0; i<n; i++) zO
46b0: 75 74 5b 69 5d 20 3d 20 7a 4f 75 74 5b 69 5d 5e  ut[i] = zOut[i]^
46c0: 61 4f 62 73 63 75 72 65 72 5b 69 26 30 78 30 66  aObscurer[i&0x0f
46d0: 5d 5e 73 61 6c 74 3b 0a 20 20 20 20 7a 4f 75 74  ]^salt;.    zOut
46e0: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  [n] = 0;.  }.  r
46f0: 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f  eturn zOut;.}../
4700: 2a 0a 2a 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 20  *.** Command to 
4710: 74 65 73 74 20 6f 62 73 63 75 72 65 28 29 20 61  test obscure() a
4720: 6e 64 20 75 6e 6f 62 73 63 75 72 65 28 29 2e 20  nd unobscure(). 
4730: 20 54 68 65 73 65 20 63 6f 6d 6d 61 6e 64 73 20   These commands 
4740: 61 72 65 20 61 6c 73 6f 20 75 73 65 66 75 6c 0a  are also useful.
4750: 2a 2a 20 75 74 69 6c 69 74 69 65 73 20 66 6f 72  ** utilities for
4760: 20 64 65 63 6f 64 69 6e 67 20 70 61 73 73 77 6f   decoding passwo
4770: 72 64 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65  rds found in the
4780: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
4790: 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 6f   COMMAND: test-o
47a0: 62 73 63 75 72 65 0a 2a 2a 0a 2a 2a 20 46 6f 72  bscure.**.** For
47b0: 20 65 61 63 68 20 63 6f 6d 6d 61 6e 64 2d 6c 69   each command-li
47c0: 6e 65 20 61 72 67 75 6d 65 6e 74 20 58 2c 20 72  ne argument X, r
47d0: 75 6e 20 62 6f 74 68 20 6f 62 73 63 75 72 65 28  un both obscure(
47e0: 58 29 20 61 6e 64 0a 2a 2a 20 75 6e 6f 62 73 63  X) and.** unobsc
47f0: 75 72 65 28 6f 62 73 63 75 72 65 28 58 29 29 20  ure(obscure(X)) 
4800: 61 6e 64 20 70 72 69 6e 74 20 74 68 65 20 72 65  and print the re
4810: 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20  sults.  This is 
4820: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
4830: 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e  .** and debuggin
4840: 67 20 6f 66 20 74 68 65 20 6f 62 73 63 75 72 65  g of the obscure
4850: 28 29 20 61 6e 64 20 75 6e 6f 62 73 63 75 72 65  () and unobscure
4860: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  () functions..*/
4870: 0a 76 6f 69 64 20 74 65 73 74 5f 6f 62 73 63 75  .void test_obscu
4880: 72 65 5f 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20  re_cmd(void){.  
4890: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
48a0: 2c 20 2a 7a 32 3b 0a 20 20 66 6f 72 28 69 3d 32  , *z2;.  for(i=2
48b0: 3b 20 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29  ; i<g.argc; i++)
48c0: 7b 0a 20 20 20 20 7a 20 3d 20 6f 62 73 63 75 72  {.    z = obscur
48d0: 65 28 67 2e 61 72 67 76 5b 69 5d 29 3b 0a 20 20  e(g.argv[i]);.  
48e0: 20 20 7a 32 20 3d 20 75 6e 6f 62 73 63 75 72 65    z2 = unobscure
48f0: 28 7a 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  (z);.    fossil_
4900: 70 72 69 6e 74 28 22 4f 42 53 43 55 52 45 3a 20  print("OBSCURE: 
4910: 20 20 20 25 73 20 2d 3e 20 25 73 20 28 25 73 29     %s -> %s (%s)
4920: 5c 6e 22 2c 20 67 2e 61 72 67 76 5b 69 5d 2c 20  \n", g.argv[i], 
4930: 7a 2c 20 7a 32 29 3b 0a 20 20 20 20 66 72 65 65  z, z2);.    free
4940: 28 7a 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 32  (z);.    free(z2
4950: 29 3b 0a 20 20 20 20 7a 20 3d 20 75 6e 6f 62 73  );.    z = unobs
4960: 63 75 72 65 28 67 2e 61 72 67 76 5b 69 5d 29 3b  cure(g.argv[i]);
4970: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e  .    fossil_prin
4980: 74 28 22 55 4e 4f 42 53 43 55 52 45 3a 20 20 25  t("UNOBSCURE:  %
4990: 73 20 2d 3e 20 25 73 5c 6e 22 2c 20 67 2e 61 72  s -> %s\n", g.ar
49a0: 67 76 5b 69 5d 2c 20 7a 29 3b 0a 20 20 20 20 66  gv[i], z);.    f
49b0: 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a        ree(z);.  }.}.