Fossil with Commonmark

Hex Artifact Content
Login

Artifact 66e0d07249986c91be8f33c510631bfae2ed59ec:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: c2 a9 20 32 30 30 36 20 44 2e 20 52 69 63 68 61  .. 2006 D. Richa
0020: 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54 68  rd Hipp.**.** Th
0030: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 72  is program is fr
0040: 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f 75  ee software; you
0050: 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 74   can redistribut
0060: 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20 6d  e it and/or.** m
0070: 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20 74  odify it under t
0080: 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
0090: 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20 4c  Simplified BSD L
00a0: 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a 20  icense (also.** 
00b0: 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32 2d  known as the "2-
00c0: 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22 20  Clause License" 
00d0: 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63 65  or "FreeBSD Lice
00e0: 6e 73 65 22 2e 29 0a 0a 2a 2a 20 54 68 69 73 20  nse".)..** This 
00f0: 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74 72  program is distr
0100: 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68 6f  ibuted in the ho
0110: 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  pe that it will 
0120: 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62 75  be useful,.** bu
0130: 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77 61  t without any wa
0140: 72 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74 20  rranty; without 
0150: 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65 64  even the implied
0160: 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a 20   warranty of.** 
0170: 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79 20  merchantability 
0180: 6f 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20 61  or fitness for a
0190: 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 72 70   particular purp
01a0: 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 74 68 6f  ose..**.** Autho
01b0: 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72 6d  r contact inform
01c0: 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 72 68 40  ation:.**   drh@
01d0: 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 20 20 68  hwaci.com.**   h
01e0: 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 63 69 2e  ttp://www.hwaci.
01f0: 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a 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 0a 2a 2a 0a 2a  ***********.**.*
0250: 2a 20 46 69 6c 65 20 75 74 69 6c 69 74 69 65 73  * File utilities
0260: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
0270: 73 20 6e 61 6d 65 64 20 66 69 6c 65 5f 2a 20 61  s named file_* a
0280: 72 65 20 67 65 6e 65 72 69 63 20 66 75 6e 63 74  re generic funct
0290: 69 6f 6e 73 20 74 68 61 74 20 61 6c 77 61 79 73  ions that always
02a0: 20 66 6f 6c 6c 6f 77 20 73 79 6d 6c 69 6e 6b 73   follow symlinks
02b0: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
02c0: 73 20 6e 61 6d 65 64 20 66 69 6c 65 5f 77 64 5f  s named file_wd_
02d0: 2a 20 61 72 65 20 74 6f 20 62 65 20 75 73 65 64  * are to be used
02e0: 20 66 6f 72 20 66 69 6c 65 73 20 69 6e 73 69 64   for files insid
02f0: 65 20 77 6f 72 6b 69 6e 67 0a 2a 2a 20 64 69 72  e working.** dir
0300: 65 63 74 6f 72 69 65 73 2e 20 54 68 65 79 20 66  ectories. They f
0310: 6f 6c 6c 6f 77 20 73 79 6d 6c 69 6e 6b 73 20 64  ollow symlinks d
0320: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 27 61 6c 6c  epending on 'all
0330: 6f 77 2d 73 79 6d 6c 69 6e 6b 73 27 20 73 65 74  ow-symlinks' set
0340: 74 69 6e 67 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ting..*/.#includ
0350: 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e  e "config.h".#in
0360: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0370: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0380: 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75  s/stat.h>.#inclu
0390: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69  de <unistd.h>.#i
03a0: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
03b0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e  >.#include <errn
03c0: 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 66  o.h>.#include "f
03d0: 69 6c 65 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 6e  ile.h"../*.** On
03e0: 20 57 69 6e 64 6f 77 73 2c 20 69 6e 63 6c 75 64   Windows, includ
03f0: 65 20 74 68 65 20 50 6c 61 74 66 6f 72 6d 20 53  e the Platform S
0400: 44 4b 20 68 65 61 64 65 72 20 66 69 6c 65 2e 0a  DK header file..
0410: 2a 2f 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32  */.#ifdef _WIN32
0420: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 64 69 72 65  .# include <dire
0430: 63 74 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20  ct.h>.# include 
0440: 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 65 6e 64  <windows.h>.#end
0450: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  if../*.** The fi
0460: 6c 65 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d  le status inform
0470: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 6d  ation from the m
0480: 6f 73 74 20 72 65 63 65 6e 74 20 73 74 61 74 28  ost recent stat(
0490: 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 55 73  ) call..**.** Us
04a0: 65 20 5f 73 74 61 74 69 36 34 20 72 61 74 68 65  e _stati64 rathe
04b0: 72 20 74 68 61 6e 20 73 74 61 74 20 6f 6e 20 77  r than stat on w
04c0: 69 6e 64 6f 77 73 2c 20 69 6e 20 6f 72 64 65 72  indows, in order
04d0: 20 74 6f 20 68 61 6e 64 6c 65 20 66 69 6c 65 73   to handle files
04e0: 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20  .** larger than 
04f0: 32 47 42 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  2GB..*/.#if defi
0500: 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 28  ned(_WIN32) && (
0510: 64 65 66 69 6e 65 64 28 5f 5f 4d 53 56 43 52 54  defined(__MSVCRT
0520: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  __) || defined(_
0530: 4d 53 43 5f 56 45 52 29 29 0a 23 20 75 6e 64 65  MSC_VER)).# unde
0540: 66 20 73 74 61 74 0a 23 20 64 65 66 69 6e 65 20  f stat.# define 
0550: 73 74 61 74 20 5f 73 74 61 74 69 36 34 0a 23 65  stat _stati64.#e
0560: 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 4f 6e 20 57 69  ndif./*.** On Wi
0570: 6e 64 6f 77 73 20 53 5f 49 53 4c 4e 4b 20 61 6c  ndows S_ISLNK al
0580: 77 61 79 73 20 72 65 74 75 72 6e 73 20 46 41 4c  ways returns FAL
0590: 53 45 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  SE..*/.#if defin
05a0: 65 64 28 5f 57 49 4e 33 32 29 0a 23 20 64 65 66  ed(_WIN32).# def
05b0: 69 6e 65 20 53 5f 49 53 4c 4e 4b 28 78 29 20 28  ine S_ISLNK(x) (
05c0: 30 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  0).#endif.static
05d0: 20 69 6e 74 20 66 69 6c 65 53 74 61 74 56 61 6c   int fileStatVal
05e0: 69 64 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 73  id = 0;.static s
05f0: 74 72 75 63 74 20 73 74 61 74 20 66 69 6c 65 53  truct stat fileS
0600: 74 61 74 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c  tat;../*.** Fill
0610: 20 73 74 61 74 20 62 75 66 20 77 69 74 68 20 69   stat buf with i
0620: 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 63 65 69  nformation recei
0630: 76 65 64 20 66 72 6f 6d 20 73 74 61 74 28 29 20  ved from stat() 
0640: 6f 72 20 6c 73 74 61 74 28 29 2e 0a 2a 2a 20 6c  or lstat()..** l
0650: 73 74 61 74 28 29 20 69 73 20 63 61 6c 6c 65 64  stat() is called
0660: 20 6f 6e 20 55 6e 69 78 20 69 66 20 69 73 57 64   on Unix if isWd
0670: 20 69 73 20 54 52 55 45 20 61 6e 64 20 61 6c 6c   is TRUE and all
0680: 6f 77 2d 73 79 6d 6c 69 6e 6b 73 20 73 65 74 74  ow-symlinks sett
0690: 69 6e 67 20 69 73 20 6f 6e 2e 0a 2a 2a 0a 2a 2f  ing is on..**.*/
06a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6f 73 73  .static int foss
06b0: 69 6c 5f 73 74 61 74 28 63 6f 6e 73 74 20 63 68  il_stat(const ch
06c0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 73  ar *zFilename, s
06d0: 74 72 75 63 74 20 73 74 61 74 20 2a 62 75 66 2c  truct stat *buf,
06e0: 20 69 6e 74 20 69 73 57 64 29 7b 0a 23 69 66 20   int isWd){.#if 
06f0: 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  !defined(_WIN32)
0700: 0a 20 20 69 66 28 20 69 73 57 64 20 26 26 20 67  .  if( isWd && g
0710: 2e 61 6c 6c 6f 77 53 79 6d 6c 69 6e 6b 73 20 29  .allowSymlinks )
0720: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 73 74  {.    return lst
0730: 61 74 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 62 75  at(zFilename, bu
0740: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
0750: 20 72 65 74 75 72 6e 20 73 74 61 74 28 7a 46 69   return stat(zFi
0760: 6c 65 6e 61 6d 65 2c 20 62 75 66 29 3b 0a 20 20  lename, buf);.  
0770: 7d 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  }.#else.  int rc
0780: 20 3d 20 30 3b 0a 20 20 77 63 68 61 72 5f 74 20   = 0;.  wchar_t 
0790: 2a 7a 4d 62 63 73 20 3d 20 66 6f 73 73 69 6c 5f  *zMbcs = fossil_
07a0: 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28  utf8_to_unicode(
07b0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63  zFilename);.  rc
07c0: 20 3d 20 5f 77 73 74 61 74 69 36 34 28 7a 4d 62   = _wstati64(zMb
07d0: 63 73 2c 20 62 75 66 29 3b 0a 20 20 66 6f 73 73  cs, buf);.  foss
07e0: 69 6c 5f 6d 62 63 73 5f 66 72 65 65 28 7a 4d 62  il_mbcs_free(zMb
07f0: 63 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  cs);.  return rc
0800: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
0810: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 66 69  * Fill in the fi
0820: 6c 65 53 74 61 74 20 76 61 72 69 61 62 6c 65 20  leStat variable 
0830: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  for the file nam
0840: 65 64 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  ed zFilename..**
0850: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30   If zFilename==0
0860: 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 70  , then use the p
0870: 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 6f 66  revious value of
0880: 20 66 69 6c 65 53 74 61 74 20 69 66 0a 2a 2a 20   fileStat if.** 
0890: 74 68 65 72 65 20 69 73 20 61 20 70 72 65 76 69  there is a previ
08a0: 6f 75 73 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ous value..**.**
08b0: 20 49 66 20 69 73 57 64 20 69 73 20 54 52 55 45   If isWd is TRUE
08c0: 2c 20 64 6f 20 6c 73 74 61 74 28 29 20 69 6e 73  , do lstat() ins
08d0: 74 65 61 64 20 6f 66 20 73 74 61 74 28 29 20 69  tead of stat() i
08e0: 66 20 61 6c 6c 6f 77 2d 73 79 6d 6c 69 6e 6b 73  f allow-symlinks
08f0: 20 69 73 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65   is on..**.** Re
0900: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
0910: 6f 66 20 65 72 72 6f 72 73 2e 20 20 4e 6f 20 65  of errors.  No e
0920: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 61 72  rror messages ar
0930: 65 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  e generated..*/.
0940: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 74  static int getSt
0950: 61 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  at(const char *z
0960: 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 69 73  Filename, int is
0970: 57 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Wd){.  int rc = 
0980: 30 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  0;.  if( zFilena
0990: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
09a0: 20 66 69 6c 65 53 74 61 74 56 61 6c 69 64 3d 3d   fileStatValid==
09b0: 30 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 7d 65  0 ) rc = 1;.  }e
09c0: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 66 6f 73  lse{.    if( fos
09d0: 73 69 6c 5f 73 74 61 74 28 7a 46 69 6c 65 6e 61  sil_stat(zFilena
09e0: 6d 65 2c 20 26 66 69 6c 65 53 74 61 74 2c 20 69  me, &fileStat, i
09f0: 73 57 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  sWd)!=0 ){.     
0a00: 20 66 69 6c 65 53 74 61 74 56 61 6c 69 64 20 3d   fileStatValid =
0a10: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31   0;.      rc = 1
0a20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0a30: 20 20 20 66 69 6c 65 53 74 61 74 56 61 6c 69 64     fileStatValid
0a40: 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
0a50: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
0a60: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
0a70: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
0a80: 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
0a90: 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
0aa0: 2d 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 64  -1 if the file d
0ab0: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 65 78 69 73 74  oes not.** exist
0ac0: 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
0ad0: 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  is NULL, return 
0ae0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
0af0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a  most recently.**
0b00: 20 73 74 61 74 2d 65 64 20 66 69 6c 65 2e 0a 2a   stat-ed file..*
0b10: 2f 0a 69 36 34 20 66 69 6c 65 5f 73 69 7a 65 28  /.i64 file_size(
0b20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
0b30: 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e  ename){.  return
0b40: 20 67 65 74 53 74 61 74 28 7a 46 69 6c 65 6e 61   getStat(zFilena
0b50: 6d 65 2c 20 30 29 20 3f 20 2d 31 20 3a 20 66 69  me, 0) ? -1 : fi
0b60: 6c 65 53 74 61 74 2e 73 74 5f 73 69 7a 65 3b 0a  leStat.st_size;.
0b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 6d 65 20 61 73  }../*.** Same as
0b80: 20 66 69 6c 65 5f 73 69 7a 65 28 29 2c 20 62 75   file_size(), bu
0b90: 74 20 74 61 6b 65 73 20 69 6e 74 6f 20 61 63 63  t takes into acc
0ba0: 6f 75 6e 74 20 73 79 6d 6c 69 6e 6b 73 2e 0a 2a  ount symlinks..*
0bb0: 2f 0a 69 36 34 20 66 69 6c 65 5f 77 64 5f 73 69  /.i64 file_wd_si
0bc0: 7a 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ze(const char *z
0bd0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74  Filename){.  ret
0be0: 75 72 6e 20 67 65 74 53 74 61 74 28 7a 46 69 6c  urn getStat(zFil
0bf0: 65 6e 61 6d 65 2c 20 31 29 20 3f 20 2d 31 20 3a  ename, 1) ? -1 :
0c00: 20 66 69 6c 65 53 74 61 74 2e 73 74 5f 73 69 7a   fileStat.st_siz
0c10: 65 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  e;  .}../*.** Re
0c20: 74 75 72 6e 20 74 68 65 20 6d 6f 64 69 66 69 63  turn the modific
0c30: 61 74 69 6f 6e 20 74 69 6d 65 20 66 6f 72 20 61  ation time for a
0c40: 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d   file.  Return -
0c50: 31 20 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a  1 if the file.**
0c60: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
0c70: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
0c80: 73 20 4e 55 4c 4c 20 72 65 74 75 72 6e 20 74 68  s NULL return th
0c90: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 6f  e size of the mo
0ca0: 73 74 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 73  st.** recently s
0cb0: 74 61 74 2d 65 64 20 66 69 6c 65 2e 0a 2a 2f 0a  tat-ed file..*/.
0cc0: 69 36 34 20 66 69 6c 65 5f 6d 74 69 6d 65 28 63  i64 file_mtime(c
0cd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
0ce0: 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  name){.  return 
0cf0: 67 65 74 53 74 61 74 28 7a 46 69 6c 65 6e 61 6d  getStat(zFilenam
0d00: 65 2c 20 30 29 20 3f 20 2d 31 20 3a 20 66 69 6c  e, 0) ? -1 : fil
0d10: 65 53 74 61 74 2e 73 74 5f 6d 74 69 6d 65 3b 0a  eStat.st_mtime;.
0d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 6d 65 20 61 73  }../*.** Same as
0d30: 20 66 69 6c 65 5f 6d 74 69 6d 65 28 29 2c 20 62   file_mtime(), b
0d40: 75 74 20 74 61 6b 65 73 20 69 6e 74 6f 20 61 63  ut takes into ac
0d50: 63 6f 75 6e 74 20 73 79 6d 6c 69 6e 6b 73 2e 0a  count symlinks..
0d60: 2a 2f 0a 69 36 34 20 66 69 6c 65 5f 77 64 5f 6d  */.i64 file_wd_m
0d70: 74 69 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  time(const char 
0d80: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72  *zFilename){.  r
0d90: 65 74 75 72 6e 20 67 65 74 53 74 61 74 28 7a 46  eturn getStat(zF
0da0: 69 6c 65 6e 61 6d 65 2c 20 31 29 20 3f 20 2d 31  ilename, 1) ? -1
0db0: 20 3a 20 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d   : fileStat.st_m
0dc0: 74 69 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  time;.}../*.** R
0dd0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
0de0: 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20  e named file is 
0df0: 61 6e 20 6f 72 64 69 6e 61 72 79 20 66 69 6c 65  an ordinary file
0e00: 20 6f 72 20 73 79 6d 6c 69 6e 6b 20 0a 2a 2a 20   or symlink .** 
0e10: 61 6e 64 20 73 79 6d 6c 69 6e 6b 73 20 61 72 65  and symlinks are
0e20: 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 52 65 74   allowed..** Ret
0e30: 75 72 6e 20 66 61 6c 73 65 20 66 6f 72 20 64 69  urn false for di
0e40: 72 65 63 74 6f 72 69 65 73 2c 20 64 65 76 69 63  rectories, devic
0e50: 65 73 2c 20 66 69 66 6f 73 2c 20 65 74 63 2e 0a  es, fifos, etc..
0e60: 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 77 64 5f 69  */.int file_wd_i
0e70: 73 66 69 6c 65 5f 6f 72 5f 6c 69 6e 6b 28 63 6f  sfile_or_link(co
0e80: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
0e90: 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 67  ame){.  return g
0ea0: 65 74 53 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65  etStat(zFilename
0eb0: 2c 20 31 29 20 3f 20 30 20 3a 20 53 5f 49 53 52  , 1) ? 0 : S_ISR
0ec0: 45 47 28 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d  EG(fileStat.st_m
0ed0: 6f 64 65 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  ode) ||.        
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 5f 49               S_I
0f00: 53 4c 4e 4b 28 66 69 6c 65 53 74 61 74 2e 73 74  SLNK(fileStat.st
0f10: 5f 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _mode);.}../*.**
0f20: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
0f30: 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69  the named file i
0f40: 73 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 66 69  s an ordinary fi
0f50: 6c 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  le.  Return fals
0f60: 65 0a 2a 2a 20 66 6f 72 20 64 69 72 65 63 74 6f  e.** for directo
0f70: 72 69 65 73 2c 20 64 65 76 69 63 65 73 2c 20 66  ries, devices, f
0f80: 69 66 6f 73 2c 20 73 79 6d 6c 69 6e 6b 73 2c 20  ifos, symlinks, 
0f90: 65 74 63 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65  etc..*/.int file
0fa0: 5f 69 73 66 69 6c 65 28 63 6f 6e 73 74 20 63 68  _isfile(const ch
0fb0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
0fc0: 20 20 72 65 74 75 72 6e 20 67 65 74 53 74 61 74    return getStat
0fd0: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 20 3f  (zFilename, 0) ?
0fe0: 20 30 20 3a 20 53 5f 49 53 52 45 47 28 66 69 6c   0 : S_ISREG(fil
0ff0: 65 53 74 61 74 2e 73 74 5f 6d 6f 64 65 29 3b 0a  eStat.st_mode);.
1000: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 6d 65 20 61 73  }../*.** Same as
1010: 20 66 69 6c 65 5f 69 73 66 69 6c 65 28 29 2c 20   file_isfile(), 
1020: 62 75 74 20 74 61 6b 65 73 20 69 6e 74 6f 20 61  but takes into a
1030: 63 63 6f 75 6e 74 20 73 79 6d 6c 69 6e 6b 73 2e  ccount symlinks.
1040: 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 77 64 5f  .*/.int file_wd_
1050: 69 73 66 69 6c 65 28 63 6f 6e 73 74 20 63 68 61  isfile(const cha
1060: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
1070: 20 72 65 74 75 72 6e 20 67 65 74 53 74 61 74 28   return getStat(
1080: 7a 46 69 6c 65 6e 61 6d 65 2c 20 31 29 20 3f 20  zFilename, 1) ? 
1090: 30 20 3a 20 53 5f 49 53 52 45 47 28 66 69 6c 65  0 : S_ISREG(file
10a0: 53 74 61 74 2e 73 74 5f 6d 6f 64 65 29 3b 0a 7d  Stat.st_mode);.}
10b0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 73  ../*.** Create s
10c0: 79 6d 6c 69 6e 6b 20 74 6f 20 66 69 6c 65 20 6f  ymlink to file o
10d0: 6e 20 55 6e 69 78 2c 20 6f 72 20 70 6c 61 69 6e  n Unix, or plain
10e0: 2d 74 65 78 74 20 66 69 6c 65 20 77 69 74 68 0a  -text file with.
10f0: 2a 2a 20 73 79 6d 6c 69 6e 6b 20 74 61 72 67 65  ** symlink targe
1100: 74 20 69 66 20 22 61 6c 6c 6f 77 2d 73 79 6d 6c  t if "allow-syml
1110: 69 6e 6b 73 22 20 69 73 20 6f 66 66 20 6f 72 20  inks" is off or 
1120: 77 65 27 72 65 20 6f 6e 20 57 69 6e 64 6f 77 73  we're on Windows
1130: 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
1140: 73 3a 20 74 61 72 67 65 74 20 66 69 6c 65 20 28  s: target file (
1150: 73 79 6d 6c 69 6e 6b 20 77 69 6c 6c 20 70 6f 69  symlink will poi
1160: 6e 74 20 74 6f 20 69 74 29 2c 20 6c 69 6e 6b 20  nt to it), link 
1170: 66 69 6c 65 0a 2a 2a 2f 0a 76 6f 69 64 20 73 79  file.**/.void sy
1180: 6d 6c 69 6e 6b 5f 63 72 65 61 74 65 28 63 6f 6e  mlink_create(con
1190: 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74  st char *zTarget
11a0: 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  File, const char
11b0: 20 2a 7a 4c 69 6e 6b 46 69 6c 65 29 7b 0a 23 69   *zLinkFile){.#i
11c0: 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f !defined(_WIN3
11d0: 32 29 0a 20 20 69 66 28 20 67 2e 61 6c 6c 6f 77  2).  if( g.allow
11e0: 53 79 6d 6c 69 6e 6b 73 20 29 7b 0a 20 20 20 20  Symlinks ){.    
11f0: 69 6e 74 20 69 2c 20 6e 4e 61 6d 65 3b 0a 20 20  int i, nName;.  
1200: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 7a    char *zName, z
1210: 42 75 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 20 20  Buf[1000];..    
1220: 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
1230: 4c 69 6e 6b 46 69 6c 65 29 3b 0a 20 20 20 20 69  LinkFile);.    i
1240: 66 28 20 6e 4e 61 6d 65 3e 3d 73 69 7a 65 6f 66  f( nName>=sizeof
1250: 28 7a 42 75 66 29 20 29 7b 0a 20 20 20 20 20 20  (zBuf) ){.      
1260: 7a 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28  zName = mprintf(
1270: 22 25 73 22 2c 20 7a 4c 69 6e 6b 46 69 6c 65 29  "%s", zLinkFile)
1280: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1290: 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b     zName = zBuf;
12a0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e  .      memcpy(zN
12b0: 61 6d 65 2c 20 7a 4c 69 6e 6b 46 69 6c 65 2c 20  ame, zLinkFile, 
12c0: 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 7d 0a  nName+1);.    }.
12d0: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 66 69 6c 65      nName = file
12e0: 5f 73 69 6d 70 6c 69 66 79 5f 6e 61 6d 65 28 7a  _simplify_name(z
12f0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b  Name, nName, 0);
1300: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
1310: 6e 4e 61 6d 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nName; i++){.   
1320: 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d     if( zName[i]=
1330: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
1340: 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  zName[i] = 0;.  
1350: 20 20 20 20 20 20 20 20 69 66 28 20 66 69 6c 65          if( file
1360: 5f 6d 6b 64 69 72 28 7a 4e 61 6d 65 2c 20 31 29  _mkdir(zName, 1)
1370: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1380: 66 6f 73 73 69 6c 5f 66 61 74 61 6c 5f 72 65 63  fossil_fatal_rec
1390: 75 72 73 69 76 65 28 22 75 6e 61 62 6c 65 20 74  ursive("unable t
13a0: 6f 20 63 72 65 61 74 65 20 64 69 72 65 63 74 6f  o create directo
13b0: 72 79 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ry %s", zName);.
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
13d0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rn;.          }.
13e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 69 5d          zName[i]
13f0: 20 3d 20 27 2f 27 3b 0a 20 20 20 20 20 20 7d 0a   = '/';.      }.
1400: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e      }.    if( zN
1410: 61 6d 65 21 3d 7a 42 75 66 20 29 20 66 72 65 65  ame!=zBuf ) free
1420: 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 69 66  (zName);..    if
1430: 28 20 73 79 6d 6c 69 6e 6b 28 7a 54 61 72 67 65  ( symlink(zTarge
1440: 74 46 69 6c 65 2c 20 7a 4e 61 6d 65 29 21 3d 30  tFile, zName)!=0
1450: 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c   ){.      fossil
1460: 5f 66 61 74 61 6c 5f 72 65 63 75 72 73 69 76 65  _fatal_recursive
1470: 28 22 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61  ("unable to crea
1480: 74 65 20 73 79 6d 6c 69 6e 6b 20 5c 22 25 73 5c  te symlink \"%s\
1490: 22 22 2c 20 7a 4e 61 6d 65 29 3b 20 20 20 20 20  "", zName);     
14a0: 20 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a   .    }.  }else.
14b0: 23 65 6e 64 69 66 20 0a 20 20 7b 0a 20 20 20 20  #endif .  {.    
14c0: 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20  Blob content;.  
14d0: 20 20 62 6c 6f 62 5f 73 65 74 28 26 63 6f 6e 74    blob_set(&cont
14e0: 65 6e 74 2c 20 7a 54 61 72 67 65 74 46 69 6c 65  ent, zTargetFile
14f0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 77 72 69 74  );.    blob_writ
1500: 65 5f 74 6f 5f 66 69 6c 65 28 26 63 6f 6e 74 65  e_to_file(&conte
1510: 6e 74 2c 20 7a 4c 69 6e 6b 46 69 6c 65 29 3b 0a  nt, zLinkFile);.
1520: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26      blob_reset(&
1530: 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a  content);.  }.}.
1540: 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 73 79 6d 62  ./*.** Copy symb
1550: 6f 6c 69 63 20 6c 69 6e 6b 20 66 72 6f 6d 20 7a  olic link from z
1560: 46 72 6f 6d 20 74 6f 20 7a 54 6f 2e 0a 2a 2f 0a  From to zTo..*/.
1570: 76 6f 69 64 20 73 79 6d 6c 69 6e 6b 5f 63 6f 70  void symlink_cop
1580: 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  y(const char *zF
1590: 72 6f 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rom, const char 
15a0: 2a 7a 54 6f 29 7b 0a 20 20 42 6c 6f 62 20 63 6f  *zTo){.  Blob co
15b0: 6e 74 65 6e 74 3b 0a 20 20 62 6c 6f 62 5f 72 65  ntent;.  blob_re
15c0: 61 64 5f 6c 69 6e 6b 28 26 63 6f 6e 74 65 6e 74  ad_link(&content
15d0: 2c 20 7a 46 72 6f 6d 29 3b 0a 20 20 73 79 6d 6c  , zFrom);.  syml
15e0: 69 6e 6b 5f 63 72 65 61 74 65 28 62 6c 6f 62 5f  ink_create(blob_
15f0: 73 74 72 28 26 63 6f 6e 74 65 6e 74 29 2c 20 7a  str(&content), z
1600: 54 6f 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65  To);.  blob_rese
1610: 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 7d 0a 0a  t(&content);.}..
1620: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 66 69 6c  /*.** Return fil
1630: 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 28 6e  e permissions (n
1640: 6f 72 6d 61 6c 2c 20 65 78 65 63 75 74 61 62 6c  ormal, executabl
1650: 65 2c 20 6f 72 20 73 79 6d 6c 69 6e 6b 29 3a 0a  e, or symlink):.
1660: 2a 2a 20 20 20 2d 20 50 45 52 4d 5f 45 58 45 20  **   - PERM_EXE 
1670: 69 66 20 66 69 6c 65 20 69 73 20 65 78 65 63 75  if file is execu
1680: 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 2d 20 50 45  table;.**   - PE
1690: 52 4d 5f 4c 4e 4b 20 6f 6e 20 55 6e 69 78 20 69  RM_LNK on Unix i
16a0: 66 20 66 69 6c 65 20 69 73 20 73 79 6d 6c 69 6e  f file is symlin
16b0: 6b 20 61 6e 64 20 61 6c 6c 6f 77 2d 73 79 6d 6c  k and allow-syml
16c0: 69 6e 6b 73 20 6f 70 74 69 6f 6e 20 69 73 20 6f  inks option is o
16d0: 6e 3b 0a 2a 2a 20 20 20 2d 20 50 45 52 4d 5f 52  n;.**   - PERM_R
16e0: 45 47 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72  EG for all other
16f0: 20 63 61 73 65 73 20 28 72 65 67 75 6c 61 72 20   cases (regular 
1700: 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79 2c  file, directory,
1710: 20 66 69 66 6f 2c 20 65 74 63 29 2e 0a 2a 2f 0a   fifo, etc)..*/.
1720: 69 6e 74 20 66 69 6c 65 5f 77 64 5f 70 65 72 6d  int file_wd_perm
1730: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1740: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 66 28 20 67  lename){.  if( g
1750: 65 74 53 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65  etStat(zFilename
1760: 2c 20 31 29 20 29 20 72 65 74 75 72 6e 20 50 45  , 1) ) return PE
1770: 52 4d 5f 52 45 47 3b 0a 23 69 66 20 64 65 66 69  RM_REG;.#if defi
1780: 6e 65 64 28 5f 57 49 4e 33 32 29 0a 23 20 20 69  ned(_WIN32).#  i
1790: 66 20 64 65 66 69 6e 65 64 28 5f 5f 44 4d 43 5f  f defined(__DMC_
17a0: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 4d  _) || defined(_M
17b0: 53 43 5f 56 45 52 29 0a 23 20 20 20 20 64 65 66  SC_VER).#    def
17c0: 69 6e 65 20 53 5f 49 58 55 53 52 20 20 5f 53 5f  ine S_IXUSR  _S_
17d0: 49 45 58 45 43 0a 23 20 20 65 6e 64 69 66 0a 20  IEXEC.#  endif. 
17e0: 20 69 66 28 20 53 5f 49 53 52 45 47 28 66 69 6c   if( S_ISREG(fil
17f0: 65 53 74 61 74 2e 73 74 5f 6d 6f 64 65 29 20 26  eStat.st_mode) &
1800: 26 20 28 28 53 5f 49 58 55 53 52 29 26 66 69 6c  & ((S_IXUSR)&fil
1810: 65 53 74 61 74 2e 73 74 5f 6d 6f 64 65 29 21 3d  eStat.st_mode)!=
1820: 30 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20 50  0 ).    return P
1830: 45 52 4d 5f 45 58 45 3b 0a 20 20 65 6c 73 65 0a  ERM_EXE;.  else.
1840: 20 20 20 20 72 65 74 75 72 6e 20 50 45 52 4d 5f      return PERM_
1850: 52 45 47 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  REG;.#else.  if(
1860: 20 53 5f 49 53 52 45 47 28 66 69 6c 65 53 74 61   S_ISREG(fileSta
1870: 74 2e 73 74 5f 6d 6f 64 65 29 20 26 26 20 0a 20  t.st_mode) && . 
1880: 20 20 20 20 20 28 28 53 5f 49 58 55 53 52 7c 53       ((S_IXUSR|S
1890: 5f 49 58 47 52 50 7c 53 5f 49 58 4f 54 48 29 26  _IXGRP|S_IXOTH)&
18a0: 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d 6f 64 65  fileStat.st_mode
18b0: 29 21 3d 30 20 29 0a 20 20 20 20 72 65 74 75 72  )!=0 ).    retur
18c0: 6e 20 50 45 52 4d 5f 45 58 45 3b 0a 20 20 65 6c  n PERM_EXE;.  el
18d0: 73 65 20 69 66 28 20 67 2e 61 6c 6c 6f 77 53 79  se if( g.allowSy
18e0: 6d 6c 69 6e 6b 73 20 26 26 20 53 5f 49 53 4c 4e  mlinks && S_ISLN
18f0: 4b 28 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d 6f  K(fileStat.st_mo
1900: 64 65 29 20 29 0a 20 20 20 20 72 65 74 75 72 6e  de) ).    return
1910: 20 50 45 52 4d 5f 4c 4e 4b 3b 0a 20 20 65 6c 73   PERM_LNK;.  els
1920: 65 0a 20 20 20 20 72 65 74 75 72 6e 20 50 45 52  e.    return PER
1930: 4d 5f 52 45 47 3b 0a 23 65 6e 64 69 66 0a 7d 0a  M_REG;.#endif.}.
1940: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
1950: 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  UE if the named 
1960: 66 69 6c 65 20 69 73 20 61 6e 20 65 78 65 63 75  file is an execu
1970: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 66  table.  Return f
1980: 61 6c 73 65 0a 2a 2a 20 66 6f 72 20 64 69 72 65  alse.** for dire
1990: 63 74 6f 72 69 65 73 2c 20 64 65 76 69 63 65 73  ctories, devices
19a0: 2c 20 66 69 66 6f 73 2c 20 73 79 6d 6c 69 6e 6b  , fifos, symlink
19b0: 73 2c 20 65 74 63 2e 0a 2a 2f 0a 69 6e 74 20 66  s, etc..*/.int f
19c0: 69 6c 65 5f 77 64 5f 69 73 65 78 65 28 63 6f 6e  ile_wd_isexe(con
19d0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
19e0: 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 69  me){.  return fi
19f0: 6c 65 5f 77 64 5f 70 65 72 6d 28 7a 46 69 6c 65  le_wd_perm(zFile
1a00: 6e 61 6d 65 29 3d 3d 50 45 52 4d 5f 45 58 45 3b  name)==PERM_EXE;
1a10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a20: 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d   TRUE if the nam
1a30: 65 64 20 66 69 6c 65 20 69 73 20 61 20 73 79 6d  ed file is a sym
1a40: 6c 69 6e 6b 20 61 6e 64 20 73 79 6d 6c 69 6e 6b  link and symlink
1a50: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  s are allowed..*
1a60: 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 66  * Return false f
1a70: 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  or all other cas
1a80: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 57 69 6e  es..**.** On Win
1a90: 64 6f 77 73 2c 20 61 6c 77 61 79 73 20 72 65 74  dows, always ret
1aa0: 75 72 6e 20 46 61 6c 73 65 2e 0a 2a 2f 0a 69 6e  urn False..*/.in
1ab0: 74 20 66 69 6c 65 5f 77 64 5f 69 73 6c 69 6e 6b  t file_wd_islink
1ac0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1ad0: 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72  lename){.  retur
1ae0: 6e 20 66 69 6c 65 5f 77 64 5f 70 65 72 6d 28 7a  n file_wd_perm(z
1af0: 46 69 6c 65 6e 61 6d 65 29 3d 3d 50 45 52 4d 5f  Filename)==PERM_
1b00: 4c 4e 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  LNK;.}../*.** Re
1b10: 74 75 72 6e 20 31 20 69 66 20 7a 46 69 6c 65 6e  turn 1 if zFilen
1b20: 61 6d 65 20 69 73 20 61 20 64 69 72 65 63 74 6f  ame is a directo
1b30: 72 79 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ry.  Return 0 if
1b40: 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 20 64 6f   zFilename.** do
1b50: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 52  es not exist.  R
1b60: 65 74 75 72 6e 20 32 20 69 66 20 7a 46 69 6c 65  eturn 2 if zFile
1b70: 6e 61 6d 65 20 65 78 69 73 74 73 20 62 75 74 20  name exists but 
1b80: 69 73 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  is something.** 
1b90: 6f 74 68 65 72 20 74 68 61 6e 20 61 20 64 69 72  other than a dir
1ba0: 65 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 66  ectory..*/.int f
1bb0: 69 6c 65 5f 69 73 64 69 72 28 63 6f 6e 73 74 20  ile_isdir(const 
1bc0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
1bd0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  {.  int rc;..  i
1be0: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 7b 0a  f( zFilename ){.
1bf0: 20 20 20 20 63 68 61 72 20 2a 7a 46 4e 20 3d 20      char *zFN = 
1c00: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 46  mprintf("%s", zF
1c10: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 66 69  ilename);.    fi
1c20: 6c 65 5f 73 69 6d 70 6c 69 66 79 5f 6e 61 6d 65  le_simplify_name
1c30: 28 7a 46 4e 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  (zFN, -1, 0);.  
1c40: 20 20 72 63 20 3d 20 67 65 74 53 74 61 74 28 7a    rc = getStat(z
1c50: 46 4e 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65  FN, 0);.    free
1c60: 28 7a 46 4e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (zFN);.  }else{.
1c70: 20 20 20 20 72 63 20 3d 20 67 65 74 53 74 61 74      rc = getStat
1c80: 28 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  (0, 0);.  }.  re
1c90: 74 75 72 6e 20 72 63 20 3f 20 30 20 3a 20 28 53  turn rc ? 0 : (S
1ca0: 5f 49 53 44 49 52 28 66 69 6c 65 53 74 61 74 2e  _ISDIR(fileStat.
1cb0: 73 74 5f 6d 6f 64 65 29 20 3f 20 31 20 3a 20 32  st_mode) ? 1 : 2
1cc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 6d 65  );.}../*.** Same
1cd0: 20 61 73 20 66 69 6c 65 5f 69 73 64 69 72 28 29   as file_isdir()
1ce0: 2c 20 62 75 74 20 74 61 6b 65 73 20 69 6e 74 6f  , but takes into
1cf0: 20 61 63 63 6f 75 6e 74 20 73 79 6d 6c 69 6e 6b   account symlink
1d00: 73 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 77  s..*/.int file_w
1d10: 64 5f 69 73 64 69 72 28 63 6f 6e 73 74 20 63 68  d_isdir(const ch
1d20: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
1d30: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1d40: 20 7a 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20   zFilename ){.  
1d50: 20 20 63 68 61 72 20 2a 7a 46 4e 20 3d 20 6d 70    char *zFN = mp
1d60: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 46 69 6c  rintf("%s", zFil
1d70: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 66 69 6c 65  ename);.    file
1d80: 5f 73 69 6d 70 6c 69 66 79 5f 6e 61 6d 65 28 7a  _simplify_name(z
1d90: 46 4e 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  FN, -1, 0);.    
1da0: 72 63 20 3d 20 67 65 74 53 74 61 74 28 7a 46 4e  rc = getStat(zFN
1db0: 2c 20 31 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  , 1);.    free(z
1dc0: 46 4e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FN);.  }else{.  
1dd0: 20 20 72 63 20 3d 20 67 65 74 53 74 61 74 28 30    rc = getStat(0
1de0: 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
1df0: 72 6e 20 72 63 20 3f 20 30 20 3a 20 28 53 5f 49  rn rc ? 0 : (S_I
1e00: 53 44 49 52 28 66 69 6c 65 53 74 61 74 2e 73 74  SDIR(fileStat.st
1e10: 5f 6d 6f 64 65 29 20 3f 20 31 20 3a 20 32 29 3b  _mode) ? 1 : 2);
1e20: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 61 70 70  .}.../*.** Wrapp
1e30: 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 61 63  er around the ac
1e40: 63 65 73 73 28 29 20 73 79 73 74 65 6d 20 63 61  cess() system ca
1e50: 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f  ll..*/.int file_
1e60: 61 63 63 65 73 73 28 63 6f 6e 73 74 20 63 68 61  access(const cha
1e70: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
1e80: 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 64 65 66  t flags){.#ifdef
1e90: 20 5f 57 49 4e 33 32 0a 20 20 77 63 68 61 72 5f   _WIN32.  wchar_
1ea0: 74 20 2a 7a 4d 62 63 73 20 3d 20 66 6f 73 73 69  t *zMbcs = fossi
1eb0: 6c 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64  l_utf8_to_unicod
1ec0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
1ed0: 69 6e 74 20 72 63 20 3d 20 5f 77 61 63 63 65 73  int rc = _wacces
1ee0: 73 28 7a 4d 62 63 73 2c 20 66 6c 61 67 73 29 3b  s(zMbcs, flags);
1ef0: 0a 20 20 66 6f 73 73 69 6c 5f 6d 62 63 73 5f 66  .  fossil_mbcs_f
1f00: 72 65 65 28 7a 4d 62 63 73 29 3b 0a 23 65 6c 73  ree(zMbcs);.#els
1f10: 65 0a 20 20 69 6e 74 20 72 63 20 3d 20 61 63 63  e.  int rc = acc
1f20: 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 66  ess(zFilename, f
1f30: 6c 61 67 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20  lags);.#endif.  
1f40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f50: 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 75 6e 75 73  .** Find an unus
1f60: 65 64 20 66 69 6c 65 6e 61 6d 65 20 73 69 6d 69  ed filename simi
1f70: 6c 61 72 20 74 6f 20 7a 42 61 73 65 20 77 69 74  lar to zBase wit
1f80: 68 20 7a 53 75 66 66 69 78 20 61 70 70 65 6e 64  h zSuffix append
1f90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 74  ed..**.** Make t
1fa0: 68 65 20 6e 61 6d 65 20 72 65 6c 61 74 69 76 65  he name relative
1fb0: 20 74 6f 20 74 68 65 20 77 6f 72 6b 69 6e 67 20   to the working 
1fc0: 64 69 72 65 63 74 6f 72 79 20 69 66 20 72 65 6c  directory if rel
1fd0: 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a  Flag is true..**
1fe0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
1ff0: 64 20 74 68 65 20 6e 65 77 20 66 69 6c 65 6e 61  d the new filena
2000: 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  me is obtained f
2010: 6f 72 6d 20 6d 70 72 69 6e 74 66 28 29 20 61 6e  orm mprintf() an
2020: 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 66  d should.** be f
2030: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
2040: 65 72 2e 0a 2a 2f 0a 63 68 61 72 20 2a 66 69 6c  er..*/.char *fil
2050: 65 5f 6e 65 77 6e 61 6d 65 28 63 6f 6e 73 74 20  e_newname(const 
2060: 63 68 61 72 20 2a 7a 42 61 73 65 2c 20 63 6f 6e  char *zBase, con
2070: 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78  st char *zSuffix
2080: 2c 20 69 6e 74 20 72 65 6c 46 6c 61 67 29 7b 0a  , int relFlag){.
2090: 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20    char *z = 0;. 
20a0: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
20b0: 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 2d  z = mprintf("%s-
20c0: 25 73 22 2c 20 7a 42 61 73 65 2c 20 7a 53 75 66  %s", zBase, zSuf
20d0: 66 69 78 29 3b 0a 20 20 77 68 69 6c 65 28 20 66  fix);.  while( f
20e0: 69 6c 65 5f 73 69 7a 65 28 7a 29 3e 3d 30 20 29  ile_size(z)>=0 )
20f0: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 65  {.    fossil_fre
2100: 65 28 7a 29 3b 0a 20 20 20 20 7a 20 3d 20 6d 70  e(z);.    z = mp
2110: 72 69 6e 74 66 28 22 25 73 2d 25 73 2d 25 64 22  rintf("%s-%s-%d"
2120: 2c 20 7a 42 61 73 65 2c 20 7a 53 75 66 66 69 78  , zBase, zSuffix
2130: 2c 20 63 6e 74 2b 2b 29 3b 0a 20 20 7d 0a 20 20  , cnt++);.  }.  
2140: 69 66 28 20 72 65 6c 46 6c 61 67 20 29 7b 0a 20  if( relFlag ){. 
2150: 20 20 20 42 6c 6f 62 20 78 3b 0a 20 20 20 20 66     Blob x;.    f
2160: 69 6c 65 5f 72 65 6c 61 74 69 76 65 5f 6e 61 6d  ile_relative_nam
2170: 65 28 7a 2c 20 26 78 2c 20 30 29 3b 0a 20 20 20  e(z, &x, 0);.   
2180: 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 29 3b   fossil_free(z);
2190: 0a 20 20 20 20 7a 20 3d 20 62 6c 6f 62 5f 73 74  .    z = blob_st
21a0: 72 28 26 78 29 3b 0a 20 20 7d 0a 20 20 72 65 74  r(&x);.  }.  ret
21b0: 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
21c0: 52 65 74 75 72 6e 20 74 68 65 20 74 61 69 6c 20  Return the tail 
21d0: 6f 66 20 61 20 66 69 6c 65 20 70 61 74 68 6e 61  of a file pathna
21e0: 6d 65 2e 20 20 54 68 65 20 74 61 69 6c 20 69 73  me.  The tail is
21f0: 20 74 68 65 20 6c 61 73 74 20 63 6f 6d 70 6f 6e   the last compon
2200: 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ent.** of the pa
2210: 74 68 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  th.  For example
2220: 2c 20 74 68 65 20 74 61 69 6c 20 6f 66 20 22 2f  , the tail of "/
2230: 61 2f 62 2f 63 2e 64 22 20 69 73 20 22 63 2e 64  a/b/c.d" is "c.d
2240: 22 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  "..*/.const char
2250: 20 2a 66 69 6c 65 5f 74 61 69 6c 28 63 6f 6e 73   *file_tail(cons
2260: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f  t char *z){.  co
2270: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20  nst char *zTail 
2280: 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b  = z;.  while( z[
2290: 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  0] ){.    if( z[
22a0: 30 5d 3d 3d 27 2f 27 20 29 20 7a 54 61 69 6c 20  0]=='/' ) zTail 
22b0: 3d 20 26 7a 5b 31 5d 3b 0a 20 20 20 20 7a 2b 2b  = &z[1];.    z++
22c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
22d0: 54 61 69 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Tail;.}../*.** C
22e0: 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  opy the content 
22f0: 6f 66 20 61 20 66 69 6c 65 20 66 72 6f 6d 20 6f  of a file from o
2300: 6e 65 20 70 6c 61 63 65 20 74 6f 20 61 6e 6f 74  ne place to anot
2310: 68 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 66 69 6c  her..*/.void fil
2320: 65 5f 63 6f 70 79 28 63 6f 6e 73 74 20 63 68 61  e_copy(const cha
2330: 72 20 2a 7a 46 72 6f 6d 2c 20 63 6f 6e 73 74 20  r *zFrom, const 
2340: 63 68 61 72 20 2a 7a 54 6f 29 7b 0a 20 20 46 49  char *zTo){.  FI
2350: 4c 45 20 2a 69 6e 2c 20 2a 6f 75 74 3b 0a 20 20  LE *in, *out;.  
2360: 69 6e 74 20 67 6f 74 3b 0a 20 20 63 68 61 72 20  int got;.  char 
2370: 7a 42 75 66 5b 38 31 39 32 5d 3b 0a 20 20 69 6e  zBuf[8192];.  in
2380: 20 3d 20 66 6f 73 73 69 6c 5f 66 6f 70 65 6e 28   = fossil_fopen(
2390: 7a 46 72 6f 6d 2c 20 22 72 62 22 29 3b 0a 20 20  zFrom, "rb");.  
23a0: 69 66 28 20 69 6e 3d 3d 30 20 29 20 66 6f 73 73  if( in==0 ) foss
23b0: 69 6c 5f 66 61 74 61 6c 28 22 63 61 6e 6e 6f 74  il_fatal("cannot
23c0: 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72   open \"%s\" for
23d0: 20 72 65 61 64 69 6e 67 22 2c 20 7a 46 72 6f 6d   reading", zFrom
23e0: 29 3b 0a 20 20 6f 75 74 20 3d 20 66 6f 73 73 69  );.  out = fossi
23f0: 6c 5f 66 6f 70 65 6e 28 7a 54 6f 2c 20 22 77 62  l_fopen(zTo, "wb
2400: 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30  ");.  if( out==0
2410: 20 29 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28   ) fossil_fatal(
2420: 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25  "cannot open \"%
2430: 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67 22  s\" for writing"
2440: 2c 20 7a 54 6f 29 3b 0a 20 20 77 68 69 6c 65 28  , zTo);.  while(
2450: 20 28 67 6f 74 3d 66 72 65 61 64 28 7a 42 75 66   (got=fread(zBuf
2460: 2c 20 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66  , 1, sizeof(zBuf
2470: 29 2c 20 69 6e 29 29 3e 30 20 29 7b 0a 20 20 20  ), in))>0 ){.   
2480: 20 66 77 72 69 74 65 28 7a 42 75 66 2c 20 31 2c   fwrite(zBuf, 1,
2490: 20 67 6f 74 2c 20 6f 75 74 29 3b 0a 20 20 7d 0a   got, out);.  }.
24a0: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
24b0: 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 7d 0a 0a  fclose(out);.}..
24c0: 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65  /*.** Set or cle
24d0: 61 72 20 74 68 65 20 65 78 65 63 75 74 65 20 62  ar the execute b
24e0: 69 74 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 52  it on a file.  R
24f0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 20  eturn true if a 
2500: 63 68 61 6e 67 65 0a 2a 2a 20 6f 63 63 75 72 72  change.** occurr
2510: 65 64 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  ed and false if 
2520: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2530: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
2540: 66 69 6c 65 5f 77 64 5f 73 65 74 65 78 65 28 63  file_wd_setexe(c
2550: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2560: 6e 61 6d 65 2c 20 69 6e 74 20 6f 6e 6f 66 66 29  name, int onoff)
2570: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
2580: 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49  #if !defined(_WI
2590: 4e 33 32 29 0a 20 20 73 74 72 75 63 74 20 73 74  N32).  struct st
25a0: 61 74 20 62 75 66 3b 0a 20 20 69 66 28 20 66 6f  at buf;.  if( fo
25b0: 73 73 69 6c 5f 73 74 61 74 28 7a 46 69 6c 65 6e  ssil_stat(zFilen
25c0: 61 6d 65 2c 20 26 62 75 66 2c 20 31 29 21 3d 30  ame, &buf, 1)!=0
25d0: 20 7c 7c 20 53 5f 49 53 4c 4e 4b 28 62 75 66 2e   || S_ISLNK(buf.
25e0: 73 74 5f 6d 6f 64 65 29 20 29 20 72 65 74 75 72  st_mode) ) retur
25f0: 6e 20 30 3b 0a 20 20 69 66 28 20 6f 6e 6f 66 66  n 0;.  if( onoff
2600: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 61 72 67   ){.    int targ
2610: 65 74 4d 6f 64 65 20 3d 20 28 62 75 66 2e 73 74  etMode = (buf.st
2620: 5f 6d 6f 64 65 20 26 20 30 34 34 34 29 3e 3e 32  _mode & 0444)>>2
2630: 3b 0a 20 20 20 20 69 66 28 20 28 62 75 66 2e 73  ;.    if( (buf.s
2640: 74 5f 6d 6f 64 65 20 26 20 30 31 31 31 29 21 3d  t_mode & 0111)!=
2650: 74 61 72 67 65 74 4d 6f 64 65 20 29 7b 0a 20 20  targetMode ){.  
2660: 20 20 20 20 63 68 6d 6f 64 28 7a 46 69 6c 65 6e      chmod(zFilen
2670: 61 6d 65 2c 20 62 75 66 2e 73 74 5f 6d 6f 64 65  ame, buf.st_mode
2680: 20 7c 20 74 61 72 67 65 74 4d 6f 64 65 29 3b 0a   | targetMode);.
2690: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
26a0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
26b0: 20 69 66 28 20 28 62 75 66 2e 73 74 5f 6d 6f 64   if( (buf.st_mod
26c0: 65 20 26 20 30 31 31 31 29 21 3d 30 20 29 7b 0a  e & 0111)!=0 ){.
26d0: 20 20 20 20 20 20 63 68 6d 6f 64 28 7a 46 69 6c        chmod(zFil
26e0: 65 6e 61 6d 65 2c 20 62 75 66 2e 73 74 5f 6d 6f  ename, buf.st_mo
26f0: 64 65 20 26 20 7e 30 31 31 31 29 3b 0a 20 20 20  de & ~0111);.   
2700: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2710: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  .  }.#endif /* _
2720: 57 49 4e 33 32 20 2a 2f 0a 20 20 72 65 74 75 72  WIN32 */.  retur
2730: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
2740: 65 6c 65 74 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  elete a file..*/
2750: 0a 76 6f 69 64 20 66 69 6c 65 5f 64 65 6c 65 74  .void file_delet
2760: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
2770: 69 6c 65 6e 61 6d 65 29 7b 0a 23 69 66 64 65 66  ilename){.#ifdef
2780: 20 5f 57 49 4e 33 32 0a 20 20 77 63 68 61 72 5f   _WIN32.  wchar_
2790: 74 20 2a 7a 20 3d 20 66 6f 73 73 69 6c 5f 75 74  t *z = fossil_ut
27a0: 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46  f8_to_unicode(zF
27b0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 5f 77 75 6e  ilename);.  _wun
27c0: 6c 69 6e 6b 28 7a 29 3b 0a 20 20 66 6f 73 73 69  link(z);.  fossi
27d0: 6c 5f 6d 62 63 73 5f 66 72 65 65 28 7a 29 3b 0a  l_mbcs_free(z);.
27e0: 23 65 6c 73 65 0a 20 20 75 6e 6c 69 6e 6b 28 7a  #else.  unlink(z
27f0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
2800: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  f.}../*.** Creat
2810: 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  e the directory 
2820: 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 61 72 67  named in the arg
2830: 75 6d 65 6e 74 2c 20 69 66 20 69 74 20 64 6f 65  ument, if it doe
2840: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
2850: 20 65 78 69 73 74 2e 20 20 49 66 20 66 6f 72 63   exist.  If forc
2860: 65 46 6c 61 67 20 69 73 20 31 2c 20 64 65 6c 65  eFlag is 1, dele
2870: 74 65 20 61 6e 79 20 70 72 69 6f 72 20 6e 6f 6e  te any prior non
2880: 2d 64 69 72 65 63 74 6f 72 79 20 6f 62 6a 65 63  -directory objec
2890: 74 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 73  t .** with the s
28a0: 61 6d 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame name..**.** 
28b0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
28c0: 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  r of errors..*/.
28d0: 69 6e 74 20 66 69 6c 65 5f 6d 6b 64 69 72 28 63  int file_mkdir(c
28e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
28f0: 2c 20 69 6e 74 20 66 6f 72 63 65 46 6c 61 67 29  , int forceFlag)
2900: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 69 6c  {.  int rc = fil
2910: 65 5f 77 64 5f 69 73 64 69 72 28 7a 4e 61 6d 65  e_wd_isdir(zName
2920: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 32 20 29  );.  if( rc==2 )
2930: 7b 0a 20 20 20 20 69 66 28 20 21 66 6f 72 63 65  {.    if( !force
2940: 46 6c 61 67 20 29 20 72 65 74 75 72 6e 20 31 3b  Flag ) return 1;
2950: 0a 20 20 20 20 66 69 6c 65 5f 64 65 6c 65 74 65  .    file_delete
2960: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69  (zName);.  }.  i
2970: 66 28 20 72 63 21 3d 31 20 29 7b 0a 23 69 66 20  f( rc!=1 ){.#if 
2980: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a  defined(_WIN32).
2990: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
29a0: 77 63 68 61 72 5f 74 20 2a 7a 4d 62 63 73 20 3d  wchar_t *zMbcs =
29b0: 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f 74 6f 5f   fossil_utf8_to_
29c0: 75 6e 69 63 6f 64 65 28 7a 4e 61 6d 65 29 3b 0a  unicode(zName);.
29d0: 20 20 20 20 72 63 20 3d 20 5f 77 6d 6b 64 69 72      rc = _wmkdir
29e0: 28 7a 4d 62 63 73 29 3b 0a 20 20 20 20 66 6f 73  (zMbcs);.    fos
29f0: 73 69 6c 5f 6d 62 63 73 5f 66 72 65 65 28 7a 4d  sil_mbcs_free(zM
2a00: 62 63 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  bcs);.    return
2a10: 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72   rc;.#else.    r
2a20: 65 74 75 72 6e 20 6d 6b 64 69 72 28 7a 4e 61 6d  eturn mkdir(zNam
2a30: 65 2c 20 30 37 35 35 29 3b 0a 23 65 6e 64 69 66  e, 0755);.#endif
2a40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2a60: 20 74 72 75 65 20 69 66 20 74 68 65 20 66 69 6c   true if the fil
2a70: 65 6e 61 6d 65 20 67 69 76 65 6e 20 69 73 20 61  ename given is a
2a80: 20 76 61 6c 69 64 20 66 69 6c 65 6e 61 6d 65 20   valid filename 
2a90: 66 6f 72 0a 2a 2a 20 61 20 66 69 6c 65 20 69 6e  for.** a file in
2aa0: 20 61 20 72 65 70 6f 73 69 74 6f 72 79 2e 20 20   a repository.  
2ab0: 56 61 6c 69 64 20 66 69 6c 65 6e 61 6d 65 73 20  Valid filenames 
2ac0: 66 6f 6c 6c 6f 77 20 61 6c 6c 20 6f 66 20 74 68  follow all of th
2ad0: 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  e.** following r
2ae0: 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ules:.**.**     
2af0: 2a 20 20 44 6f 65 73 20 6e 6f 74 20 62 65 67 69  *  Does not begi
2b00: 6e 20 77 69 74 68 20 22 2f 22 0a 2a 2a 20 20 20  n with "/".**   
2b10: 20 20 2a 20 20 44 6f 65 73 20 6e 6f 74 20 63 6f    *  Does not co
2b20: 6e 74 61 69 6e 20 61 6e 79 20 70 61 74 68 20 65  ntain any path e
2b30: 6c 65 6d 65 6e 74 20 6e 61 6d 65 64 20 22 2e 22  lement named "."
2b40: 20 6f 72 20 22 2e 2e 22 0a 2a 2a 20 20 20 20 20   or "..".**     
2b50: 2a 20 20 44 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  *  Does not cont
2b60: 61 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 73 65  ain any of these
2b70: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
2b80: 68 65 20 70 61 74 68 3a 20 22 5c 2a 5b 5d 3f 22  he path: "\*[]?"
2b90: 0a 2a 2a 20 20 20 20 20 2a 20 20 44 6f 65 73 20  .**     *  Does 
2ba0: 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 22 2f 22  not end with "/"
2bb0: 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 44 6f 65 73  ..**     *  Does
2bc0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 74 77 6f   not contain two
2bd0: 20 6f 72 20 6d 6f 72 65 20 22 2f 22 20 63 68 61   or more "/" cha
2be0: 72 61 63 74 65 72 73 20 69 6e 20 61 20 72 6f 77  racters in a row
2bf0: 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 43 6f 6e 74  ..**     *  Cont
2c00: 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
2c10: 65 20 63 68 61 72 61 63 74 65 72 0a 2a 2f 0a 69  e character.*/.i
2c20: 6e 74 20 66 69 6c 65 5f 69 73 5f 73 69 6d 70 6c  nt file_is_simpl
2c30: 65 5f 70 61 74 68 6e 61 6d 65 28 63 6f 6e 73 74  e_pathname(const
2c40: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
2c50: 20 69 3b 0a 20 20 63 68 61 72 20 63 20 3d 20 7a   i;.  char c = z
2c60: 5b 30 5d 3b 0a 20 20 69 66 28 20 63 3d 3d 27 2f  [0];.  if( c=='/
2c70: 27 20 7c 7c 20 63 3d 3d 30 20 29 20 72 65 74 75  ' || c==0 ) retu
2c80: 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 3d 3d 27  rn 0;.  if( c=='
2c90: 2e 27 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  .' ){.    if( z[
2ca0: 31 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 5b 31 5d 3d  1]=='/' || z[1]=
2cb0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2cc0: 20 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2e 27     if( z[1]=='.'
2cd0: 20 26 26 20 28 7a 5b 32 5d 3d 3d 27 2f 27 20 7c   && (z[2]=='/' |
2ce0: 7c 20 7a 5b 32 5d 3d 3d 30 29 20 29 20 72 65 74  | z[2]==0) ) ret
2cf0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  urn 0;.  }.  for
2d00: 28 69 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d  (i=0; (c=z[i])!=
2d10: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  0; i++){.    if(
2d20: 20 63 3d 3d 27 5c 5c 27 20 7c 7c 20 63 3d 3d 27   c=='\\' || c=='
2d30: 2a 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20  *' || c=='[' || 
2d40: 63 3d 3d 27 5d 27 20 7c 7c 20 63 3d 3d 27 3f 27  c==']' || c=='?'
2d50: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2d60: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
2d70: 28 20 63 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  ( c=='/' ){.    
2d80: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f    if( z[i+1]=='/
2d90: 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ' ) return 0;.  
2da0: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
2db0: 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '.' ){.        i
2dc0: 66 28 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 7c  f( z[i+2]=='/' |
2dd0: 7c 20 7a 5b 69 2b 32 5d 3d 3d 30 20 29 20 72 65  | z[i+2]==0 ) re
2de0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
2df0: 69 66 28 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20  if( z[i+2]=='.' 
2e00: 26 26 20 28 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20  && (z[i+3]=='/' 
2e10: 7c 7c 20 7a 5b 69 2b 33 5d 3d 3d 30 29 20 29 20  || z[i+3]==0) ) 
2e20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2e30: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
2e40: 28 20 7a 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29 20  ( z[i-1]=='/' ) 
2e50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
2e60: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 1;.}../*.** I
2e70: 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6d 70 6f  f the last compo
2e80: 6e 65 6e 74 20 6f 66 20 74 68 65 20 70 61 74 68  nent of the path
2e90: 6e 61 6d 65 20 69 6e 20 7a 5b 30 5d 2e 2e 7a 5b  name in z[0]..z[
2ea0: 6a 2d 31 5d 20 69 73 20 73 6f 6d 65 74 68 69 6e  j-1] is somethin
2eb0: 67 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20  g.** other than 
2ec0: 22 2e 2e 22 20 74 68 65 6e 20 62 61 63 6b 20 69  ".." then back i
2ed0: 74 20 6f 75 74 20 61 6e 64 20 72 65 74 75 72 6e  t out and return
2ee0: 20 74 72 75 65 2e 20 20 49 66 20 74 68 65 20 6c   true.  If the l
2ef0: 61 73 74 0a 2a 2a 20 63 6f 6d 70 6f 6e 65 6e 74  ast.** component
2f00: 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
2f10: 69 74 20 69 73 20 22 2e 2e 22 20 74 68 65 6e 20  it is ".." then 
2f20: 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f  return false..*/
2f30: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 63 6b  .static int back
2f40: 75 70 5f 64 69 72 28 63 6f 6e 73 74 20 63 68 61  up_dir(const cha
2f50: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 4a 29 7b 0a  r *z, int *pJ){.
2f60: 20 20 69 6e 74 20 6a 20 3d 20 2a 70 4a 3b 0a 20    int j = *pJ;. 
2f70: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 6a 3c   int i;.  if( j<
2f80: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2f90: 20 66 6f 72 28 69 3d 6a 2d 31 3b 20 69 3e 30 20   for(i=j-1; i>0 
2fa0: 26 26 20 7a 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20  && z[i-1]!='/'; 
2fb0: 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 7a 5b 69  i--){}.  if( z[i
2fc0: 5d 3d 3d 27 2e 27 20 26 26 20 69 3d 3d 6a 2d 32  ]=='.' && i==j-2
2fd0: 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20   && z[i+1]=='.' 
2fe0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2a 70  ) return 0;.  *p
2ff0: 4a 20 3d 20 69 2d 31 3b 0a 20 20 72 65 74 75 72  J = i-1;.  retur
3000: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 69  n 1;.}../*.** Si
3010: 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d  mplify a filenam
3020: 65 20 62 79 0a 2a 2a 0a 2a 2a 20 20 2a 20 43 6f  e by.**.**  * Co
3030: 6e 76 65 72 74 20 61 6c 6c 20 5c 20 69 6e 74 6f  nvert all \ into
3040: 20 2f 20 6f 6e 20 77 69 6e 64 6f 77 73 0a 2a 2a   / on windows.**
3050: 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79    * removing any
3060: 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75   trailing and du
3070: 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20  plicate /.**  * 
3080: 72 65 6d 6f 76 69 6e 67 20 2f 2e 2f 0a 2a 2a 20  removing /./.** 
3090: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 2f 41 2f 2e   * removing /A/.
30a0: 2e 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73  ./.**.** Changes
30b0: 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61   are made in-pla
30c0: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
30d0: 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e  new name length.
30e0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 6c 61 73 68  .** If the slash
30f0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
3100: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 74 72 61 69  n-zero, the trai
3110: 6c 69 6e 67 20 73 6c 61 73 68 2c 20 69 66 20 61  ling slash, if a
3120: 6e 79 2c 0a 2a 2a 20 69 73 20 72 65 74 61 69 6e  ny,.** is retain
3130: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f  ed..*/.int file_
3140: 73 69 6d 70 6c 69 66 79 5f 6e 61 6d 65 28 63 68  simplify_name(ch
3150: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e  ar *z, int n, in
3160: 74 20 73 6c 61 73 68 29 7b 0a 20 20 69 6e 74 20  t slash){.  int 
3170: 69 2c 20 6a 3b 0a 20 20 69 66 28 20 6e 3c 30 20  i, j;.  if( n<0 
3180: 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b  ) n = strlen(z);
3190: 0a 0a 20 20 2f 2a 20 4f 6e 20 77 69 6e 64 6f 77  ..  /* On window
31a0: 73 20 63 6f 6e 76 65 72 74 20 61 6c 6c 20 5c 20  s convert all \ 
31b0: 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 2f 20  characters to / 
31c0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
31d0: 57 49 4e 33 32 29 0a 20 20 66 6f 72 28 69 3d 30  WIN32).  for(i=0
31e0: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
31f0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 5c 27 20   if( z[i]=='\\' 
3200: 29 20 7a 5b 69 5d 20 3d 20 27 2f 27 3b 0a 20 20  ) z[i] = '/';.  
3210: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
3220: 65 6d 6f 76 69 6e 67 20 74 72 61 69 6c 69 6e 67  emoving trailing
3230: 20 22 2f 22 20 63 68 61 72 61 63 74 65 72 73 20   "/" characters 
3240: 2a 2f 0a 20 20 69 66 20 28 20 21 73 6c 61 73 68  */.  if ( !slash
3250: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e   ){.    while( n
3260: 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f  >1 && z[n-1]=='/
3270: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 7d 0a  ' ){ n--; }.  }.
3280: 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 64 75 70  .  /* Remove dup
3290: 6c 69 63 61 74 65 20 27 2f 27 20 63 68 61 72 61  licate '/' chara
32a0: 63 74 65 72 73 2e 20 20 45 78 63 65 70 74 2c 20  cters.  Except, 
32b0: 74 77 6f 20 2f 2f 20 61 74 20 74 68 65 20 62 65  two // at the be
32c0: 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20  ginning.  ** of 
32d0: 61 20 70 61 74 68 6e 61 6d 65 20 69 73 20 61 6c  a pathname is al
32e0: 6c 6f 77 65 64 20 73 69 6e 63 65 20 74 68 69 73  lowed since this
32f0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 6f 6e   is important on
3300: 20 77 69 6e 64 6f 77 73 2e 20 2a 2f 0a 20 20 66   windows. */.  f
3310: 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 6e 3b 20 69  or(i=j=1; i<n; i
3320: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20  ++){.    z[j++] 
3330: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 77 68 69 6c  = z[i];.    whil
3340: 65 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 26 26 20  e( z[i]=='/' && 
3350: 69 3c 6e 2d 31 20 26 26 20 7a 5b 69 2b 31 5d 3d  i<n-1 && z[i+1]=
3360: 3d 27 2f 27 20 29 20 69 2b 2b 3b 0a 20 20 7d 0a  ='/' ) i++;.  }.
3370: 20 20 6e 20 3d 20 6a 3b 0a 0a 20 20 2f 2a 20 53    n = j;..  /* S
3380: 6b 69 70 20 6f 76 65 72 20 7a 65 72 6f 20 6f 72  kip over zero or
3390: 20 6d 6f 72 65 20 69 6e 69 74 69 61 6c 20 22 2e   more initial ".
33a0: 2f 22 20 73 65 71 75 65 6e 63 65 73 20 2a 2f 0a  /" sequences */.
33b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 2d 31    for(i=0; i<n-1
33c0: 20 26 26 20 7a 5b 69 5d 3d 3d 27 2e 27 20 26 26   && z[i]=='.' &&
33d0: 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 3b 20 69 2b   z[i+1]=='/'; i+
33e0: 3d 32 29 7b 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  =2){}..  /* Begi
33f0: 6e 20 63 6f 70 79 69 6e 67 20 66 72 6f 6d 20 7a  n copying from z
3400: 5b 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d  [i] back to z[j]
3410: 2e 2e 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30  ... */.  for(j=0
3420: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3430: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
3440: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20  {.      /* Skip 
3450: 6f 76 65 72 20 69 6e 74 65 72 6e 61 6c 20 22 2f  over internal "/
3460: 2e 22 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6d  ." directory com
3470: 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  ponents */.     
3480: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
3490: 20 26 26 20 28 69 2b 32 3d 3d 6e 20 7c 7c 20 7a   && (i+2==n || z
34a0: 5b 69 2b 32 5d 3d 3d 27 2f 27 29 20 29 7b 0a 20  [i+2]=='/') ){. 
34b0: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
34c0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
34d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
34e0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
34f0: 22 2f 2e 2e 22 20 64 69 72 65 63 74 6f 72 79 20  "/.." directory 
3500: 63 6f 6d 70 6f 6e 65 6e 74 20 74 68 65 6e 20 62  component then b
3510: 61 63 6b 20 6f 75 74 20 74 68 65 0a 20 20 20 20  ack out the.    
3520: 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74 65    ** previous te
3530: 72 6d 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  rm of the direct
3540: 6f 72 79 20 69 66 20 69 74 20 69 73 20 73 6f 6d  ory if it is som
3550: 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
3560: 6e 20 22 2e 2e 22 0a 20 20 20 20 20 20 2a 2a 20  n "..".      ** 
3570: 6f 72 20 22 2e 22 0a 20 20 20 20 20 20 2a 2f 0a  or ".".      */.
3580: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
3590: 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26  =='.' && i+2<n &
35a0: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26  & z[i+2]=='.' &&
35b0: 20 28 69 2b 33 3d 3d 6e 20 7c 7c 20 7a 5b 69 2b   (i+3==n || z[i+
35c0: 33 5d 3d 3d 27 2f 27 29 0a 20 20 20 20 20 20 20  3]=='/').       
35d0: 26 26 20 62 61 63 6b 75 70 5f 64 69 72 28 7a 2c  && backup_dir(z,
35e0: 20 26 6a 29 0a 20 20 20 20 20 20 29 7b 0a 20 20   &j).      ){.  
35f0: 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20        i += 2;.  
3600: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
3610: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3620: 20 20 69 66 28 20 6a 3e 3d 30 20 29 20 7a 5b 6a    if( j>=0 ) z[j
3630: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 6a 2b  ] = z[i];.    j+
3640: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3d 3d  +;.  }.  if( j==
3650: 30 20 29 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 2e 27  0 ) z[j++] = '.'
3660: 3b 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20  ;.  z[j] = 0;.  
3670: 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a  return j;.}../*.
3680: 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74  ** COMMAND: test
3690: 2d 73 69 6d 70 6c 69 66 79 2d 6e 61 6d 65 0a 2a  -simplify-name.*
36a0: 2a 0a 2a 2a 20 25 66 6f 73 73 69 6c 20 74 65 73  *.** %fossil tes
36b0: 74 2d 73 69 6d 70 6c 69 66 79 2d 6e 61 6d 65 20  t-simplify-name 
36c0: 46 49 4c 45 4e 41 4d 45 2e 2e 2e 0a 2a 2a 0a 2a  FILENAME....**.*
36d0: 2a 20 50 72 69 6e 74 20 74 68 65 20 73 69 6d 70  * Print the simp
36e0: 6c 69 66 69 65 64 20 76 65 72 73 69 6f 6e 73 20  lified versions 
36f0: 6f 66 20 65 61 63 68 20 46 49 4c 45 4e 41 4d 45  of each FILENAME
3700: 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f 74 65  ..*/.void cmd_te
3710: 73 74 5f 73 69 6d 70 6c 69 66 79 5f 6e 61 6d 65  st_simplify_name
3720: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b  (void){.  int i;
3730: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f  .  char *z;.  fo
3740: 72 28 69 3d 32 3b 20 69 3c 67 2e 61 72 67 63 3b  r(i=2; i<g.argc;
3750: 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 20 3d 20 6d   i++){.    z = m
3760: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 67 2e 61  printf("%s", g.a
3770: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 66 6f 73  rgv[i]);.    fos
3780: 73 69 6c 5f 70 72 69 6e 74 28 22 5b 25 73 5d 20  sil_print("[%s] 
3790: 2d 3e 20 22 2c 20 7a 29 3b 0a 20 20 20 20 66 69  -> ", z);.    fi
37a0: 6c 65 5f 73 69 6d 70 6c 69 66 79 5f 6e 61 6d 65  le_simplify_name
37b0: 28 7a 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  (z, -1, 0);.    
37c0: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 5b 25  fossil_print("[%
37d0: 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 66  s]\n", z);.    f
37e0: 6f 73 73 69 6c 5f 66 72 65 65 28 7a 29 3b 0a 20  ossil_free(z);. 
37f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20   }.}../*.** Get 
3800: 74 68 65 20 63 75 72 72 65 6e 74 20 77 6f 72 6b  the current work
3810: 69 6e 67 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a  ing directory..*
3820: 2a 0a 2a 2a 20 4f 6e 20 77 69 6e 64 6f 77 73 2c  *.** On windows,
3830: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63 6f 6e   the name is con
3840: 76 65 72 74 65 64 20 66 72 6f 6d 20 75 6e 69 63  verted from unic
3850: 6f 64 65 20 74 6f 20 55 54 46 38 20 61 6e 64 20  ode to UTF8 and 
3860: 61 6c 6c 20 27 5c 5c 27 0a 2a 2a 20 63 68 61 72  all '\\'.** char
3870: 61 63 74 65 72 73 20 61 72 65 20 63 6f 6e 76 65  acters are conve
3880: 72 74 65 64 20 74 6f 20 27 2f 27 2e 20 20 4e 6f  rted to '/'.  No
3890: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65   conversions are
38a0: 20 6e 65 65 64 65 64 20 6f 6e 0a 2a 2a 20 75 6e   needed on.** un
38b0: 69 78 2e 0a 2a 2f 0a 76 6f 69 64 20 66 69 6c 65  ix..*/.void file
38c0: 5f 67 65 74 63 77 64 28 63 68 61 72 20 2a 7a 42  _getcwd(char *zB
38d0: 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 23  uf, int nBuf){.#
38e0: 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 63  ifdef _WIN32.  c
38f0: 68 61 72 20 2a 7a 50 77 64 55 74 66 38 3b 0a 20  har *zPwdUtf8;. 
3900: 20 69 6e 74 20 6e 50 77 64 3b 0a 20 20 69 6e 74   int nPwd;.  int
3910: 20 69 3b 0a 20 20 77 63 68 61 72 5f 74 20 7a 50   i;.  wchar_t zP
3920: 77 64 5b 32 30 30 30 5d 3b 0a 20 20 69 66 28 20  wd[2000];.  if( 
3930: 5f 77 67 65 74 63 77 64 28 7a 50 77 64 2c 20 73  _wgetcwd(zPwd, s
3940: 69 7a 65 6f 66 28 7a 50 77 64 29 2d 31 29 3d 3d  izeof(zPwd)-1)==
3950: 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  0 ){.    fossil_
3960: 66 61 74 61 6c 28 22 63 61 6e 6e 6f 74 20 66 69  fatal("cannot fi
3970: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  nd the current w
3980: 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
3990: 2e 22 29 3b 0a 20 20 7d 0a 20 20 7a 50 77 64 55  .");.  }.  zPwdU
39a0: 74 66 38 20 3d 20 66 6f 73 73 69 6c 5f 75 6e 69  tf8 = fossil_uni
39b0: 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28 7a 50 77  code_to_utf8(zPw
39c0: 64 29 3b 0a 20 20 6e 50 77 64 20 3d 20 73 74 72  d);.  nPwd = str
39d0: 6c 65 6e 28 7a 50 77 64 55 74 66 38 29 3b 0a 20  len(zPwdUtf8);. 
39e0: 20 69 66 28 20 6e 50 77 64 20 3e 20 6e 42 75 66   if( nPwd > nBuf
39f0: 2d 31 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c  -1 ){.    fossil
3a00: 5f 66 61 74 61 6c 28 22 70 77 64 20 74 6f 6f 20  _fatal("pwd too 
3a10: 62 69 67 3a 20 6d 61 78 20 25 64 5c 6e 22 2c 20  big: max %d\n", 
3a20: 6e 42 75 66 2d 31 29 3b 0a 20 20 7d 0a 20 20 66  nBuf-1);.  }.  f
3a30: 6f 72 28 69 3d 30 3b 20 7a 50 77 64 55 74 66 38  or(i=0; zPwdUtf8
3a40: 5b 69 5d 3b 20 69 2b 2b 29 20 69 66 28 20 7a 50  [i]; i++) if( zP
3a50: 77 64 55 74 66 38 5b 69 5d 3d 3d 27 5c 5c 27 20  wdUtf8[i]=='\\' 
3a60: 29 20 7a 50 77 64 55 74 66 38 5b 69 5d 20 3d 20  ) zPwdUtf8[i] = 
3a70: 27 2f 27 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 42  '/';.  memcpy(zB
3a80: 75 66 2c 20 7a 50 77 64 55 74 66 38 2c 20 6e 50  uf, zPwdUtf8, nP
3a90: 77 64 2b 31 29 3b 0a 20 20 66 6f 73 73 69 6c 5f  wd+1);.  fossil_
3aa0: 6d 62 63 73 5f 66 72 65 65 28 7a 50 77 64 55 74  mbcs_free(zPwdUt
3ab0: 66 38 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  f8);.#else.  if(
3ac0: 20 67 65 74 63 77 64 28 7a 42 75 66 2c 20 6e 42   getcwd(zBuf, nB
3ad0: 75 66 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  uf-1)==0 ){.    
3ae0: 69 66 28 20 65 72 72 6e 6f 3d 3d 45 52 41 4e 47  if( errno==ERANG
3af0: 45 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69  E ){.      fossi
3b00: 6c 5f 66 61 74 61 6c 28 22 70 77 64 20 74 6f 6f  l_fatal("pwd too
3b10: 20 62 69 67 3a 20 6d 61 78 20 25 64 5c 6e 22 2c   big: max %d\n",
3b20: 20 6e 42 75 66 2d 31 29 3b 0a 20 20 20 20 7d 65   nBuf-1);.    }e
3b30: 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 73 73 69  lse{.      fossi
3b40: 6c 5f 66 61 74 61 6c 28 22 63 61 6e 6e 6f 74 20  l_fatal("cannot 
3b50: 66 69 6e 64 20 63 75 72 72 65 6e 74 20 77 6f 72  find current wor
3b60: 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 3b 20  king directory; 
3b70: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
3b80: 20 20 20 20 20 20 20 20 73 74 72 65 72 72 6f 72          strerror
3b90: 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  (errno));.    }.
3ba0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
3bb0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
3bc0: 69 66 20 7a 50 61 74 68 20 69 73 20 61 6e 20 61  if zPath is an a
3bd0: 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65  bsolute pathname
3be0: 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 0a  .  Return false.
3bf0: 2a 2a 20 69 66 20 69 74 20 69 73 20 72 65 6c 61  ** if it is rela
3c00: 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c  tive..*/.int fil
3c10: 65 5f 69 73 5f 61 62 73 6f 6c 75 74 65 5f 70 61  e_is_absolute_pa
3c20: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
3c30: 50 61 74 68 29 7b 0a 20 20 69 66 28 20 7a 50 61  Path){.  if( zPa
3c40: 74 68 5b 30 5d 3d 3d 27 2f 27 0a 23 69 66 20 64  th[0]=='/'.#if d
3c50: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20  efined(_WIN32). 
3c60: 20 20 20 20 20 7c 7c 20 7a 50 61 74 68 5b 30 5d       || zPath[0]
3c70: 3d 3d 27 5c 5c 27 0a 20 20 20 20 20 20 7c 7c 20  =='\\'.      || 
3c80: 28 73 74 72 6c 65 6e 28 7a 50 61 74 68 29 3e 33  (strlen(zPath)>3
3c90: 20 26 26 20 7a 50 61 74 68 5b 31 5d 3d 3d 27 3a   && zPath[1]==':
3ca0: 27 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  '.           && 
3cb0: 28 7a 50 61 74 68 5b 32 5d 3d 3d 27 5c 5c 27 20  (zPath[2]=='\\' 
3cc0: 7c 7c 20 7a 50 61 74 68 5b 32 5d 3d 3d 27 2f 27  || zPath[2]=='/'
3cd0: 29 29 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20  )).#endif.  ){. 
3ce0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
3cf0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
3d00: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
3d10: 20 43 6f 6d 70 75 74 65 20 61 20 63 61 6e 6f 6e   Compute a canon
3d20: 69 63 61 6c 20 70 61 74 68 6e 61 6d 65 20 66 6f  ical pathname fo
3d30: 72 20 61 20 66 69 6c 65 20 6f 72 20 64 69 72 65  r a file or dire
3d40: 63 74 6f 72 79 2e 0a 2a 2a 20 4d 61 6b 65 20 74  ctory..** Make t
3d50: 68 65 20 6e 61 6d 65 20 61 62 73 6f 6c 75 74 65  he name absolute
3d60: 20 69 66 20 69 74 20 69 73 20 72 65 6c 61 74 69   if it is relati
3d70: 76 65 2e 0a 2a 2a 20 52 65 6d 6f 76 65 20 72 65  ve..** Remove re
3d80: 64 75 6e 64 61 6e 74 20 2f 20 63 68 61 72 61 63  dundant / charac
3d90: 74 65 72 73 0a 2a 2a 20 52 65 6d 6f 76 65 20 61  ters.** Remove a
3da0: 6c 6c 20 2f 2e 2f 20 70 61 74 68 20 65 6c 65 6d  ll /./ path elem
3db0: 65 6e 74 73 2e 0a 2a 2a 20 43 6f 6e 76 65 72 74  ents..** Convert
3dc0: 20 2f 41 2f 2e 2e 2f 20 74 6f 20 6a 75 73 74 20   /A/../ to just 
3dd0: 2f 0a 2a 2a 20 49 66 20 74 68 65 20 73 6c 61 73  /.** If the slas
3de0: 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  h parameter is n
3df0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 74 72 61  on-zero, the tra
3e00: 69 6c 69 6e 67 20 73 6c 61 73 68 2c 20 69 66 20  iling slash, if 
3e10: 61 6e 79 2c 0a 2a 2a 20 69 73 20 72 65 74 61 69  any,.** is retai
3e20: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 66 69 6c  ned..*/.void fil
3e30: 65 5f 63 61 6e 6f 6e 69 63 61 6c 5f 6e 61 6d 65  e_canonical_name
3e40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72  (const char *zOr
3e50: 69 67 4e 61 6d 65 2c 20 42 6c 6f 62 20 2a 70 4f  igName, Blob *pO
3e60: 75 74 2c 20 69 6e 74 20 73 6c 61 73 68 29 7b 0a  ut, int slash){.
3e70: 20 20 69 66 28 20 66 69 6c 65 5f 69 73 5f 61 62    if( file_is_ab
3e80: 73 6f 6c 75 74 65 5f 70 61 74 68 28 7a 4f 72 69  solute_path(zOri
3e90: 67 4e 61 6d 65 29 20 29 7b 0a 23 69 66 20 64 65  gName) ){.#if de
3ea0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20  fined(_WIN32).  
3eb0: 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 23 65    char *zOut;.#e
3ec0: 6e 64 69 66 0a 20 20 20 20 62 6c 6f 62 5f 73 65  ndif.    blob_se
3ed0: 74 28 70 4f 75 74 2c 20 7a 4f 72 69 67 4e 61 6d  t(pOut, zOrigNam
3ee0: 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 6d 61 74  e);.    blob_mat
3ef0: 65 72 69 61 6c 69 7a 65 28 70 4f 75 74 29 3b 0a  erialize(pOut);.
3f00: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
3f10: 33 32 29 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  32).    /*.    *
3f20: 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 6e 6f  * On Windows, no
3f30: 72 6d 61 6c 69 7a 65 20 74 68 65 20 64 72 69 76  rmalize the driv
3f40: 65 20 6c 65 74 74 65 72 20 74 6f 20 75 70 70 65  e letter to uppe
3f50: 72 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  r case..    */. 
3f60: 20 20 20 7a 4f 75 74 20 3d 20 62 6c 6f 62 5f 73     zOut = blob_s
3f70: 74 72 28 70 4f 75 74 29 3b 0a 20 20 20 20 69 66  tr(pOut);.    if
3f80: 28 20 66 6f 73 73 69 6c 5f 69 73 61 6c 70 68 61  ( fossil_isalpha
3f90: 28 7a 4f 75 74 5b 30 5d 29 20 26 26 20 7a 4f 75  (zOut[0]) && zOu
3fa0: 74 5b 31 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20  t[1]==':' ){.   
3fb0: 20 20 20 7a 4f 75 74 5b 30 5d 20 3d 20 66 6f 73     zOut[0] = fos
3fc0: 73 69 6c 5f 74 6f 75 70 70 65 72 28 7a 4f 75 74  sil_toupper(zOut
3fd0: 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  [0]);.    }.#end
3fe0: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
3ff0: 63 68 61 72 20 7a 50 77 64 5b 32 30 30 30 5d 3b  char zPwd[2000];
4000: 0a 20 20 20 20 66 69 6c 65 5f 67 65 74 63 77 64  .    file_getcwd
4010: 28 7a 50 77 64 2c 20 73 69 7a 65 6f 66 28 7a 50  (zPwd, sizeof(zP
4020: 77 64 29 2d 73 74 72 6c 65 6e 28 7a 4f 72 69 67  wd)-strlen(zOrig
4030: 4e 61 6d 65 29 29 3b 0a 23 69 66 20 64 65 66 69  Name));.#if defi
4040: 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20  ned(_WIN32).    
4050: 2f 2a 0a 20 20 20 20 2a 2a 20 4f 6e 20 57 69 6e  /*.    ** On Win
4060: 64 6f 77 73 2c 20 6e 6f 72 6d 61 6c 69 7a 65 20  dows, normalize 
4070: 74 68 65 20 64 72 69 76 65 20 6c 65 74 74 65 72  the drive letter
4080: 20 74 6f 20 75 70 70 65 72 20 63 61 73 65 2e 0a   to upper case..
4090: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66      */.    if( f
40a0: 6f 73 73 69 6c 5f 69 73 61 6c 70 68 61 28 7a 50  ossil_isalpha(zP
40b0: 77 64 5b 30 5d 29 20 26 26 20 7a 50 77 64 5b 31  wd[0]) && zPwd[1
40c0: 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 20 20  ]==':' ){.      
40d0: 7a 50 77 64 5b 30 5d 20 3d 20 66 6f 73 73 69 6c  zPwd[0] = fossil
40e0: 5f 74 6f 75 70 70 65 72 28 7a 50 77 64 5b 30 5d  _toupper(zPwd[0]
40f0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
4100: 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 4f      blob_zero(pO
4110: 75 74 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70  ut);.    blob_ap
4120: 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 25 2f 2f  pendf(pOut, "%//
4130: 25 2f 22 2c 20 7a 50 77 64 2c 20 7a 4f 72 69 67  %/", zPwd, zOrig
4140: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f  Name);.  }.  blo
4150: 62 5f 72 65 73 69 7a 65 28 70 4f 75 74 2c 20 66  b_resize(pOut, f
4160: 69 6c 65 5f 73 69 6d 70 6c 69 66 79 5f 6e 61 6d  ile_simplify_nam
4170: 65 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 4f  e(blob_buffer(pO
4180: 75 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ut),.           
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62              blob
41b0: 5f 73 69 7a 65 28 70 4f 75 74 29 2c 20 73 6c 61  _size(pOut), sla
41c0: 73 68 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  sh));.}../*.** C
41d0: 4f 4d 4d 41 4e 44 3a 20 20 74 65 73 74 2d 63 61  OMMAND:  test-ca
41e0: 6e 6f 6e 69 63 61 6c 2d 6e 61 6d 65 0a 2a 2a 20  nonical-name.** 
41f0: 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 74  Usage: %fossil t
4200: 65 73 74 2d 63 61 6e 6f 6e 69 63 61 6c 2d 6e 61  est-canonical-na
4210: 6d 65 20 46 49 4c 45 4e 41 4d 45 2e 2e 2e 0a 2a  me FILENAME....*
4220: 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 6f 70  *.** Test the op
4230: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  eration of the c
4240: 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 20 67 65  anonical name ge
4250: 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20 41 6c 73 6f  nerator..** Also
4260: 20 74 65 73 74 20 46 6f 73 73 69 6c 27 73 20 61   test Fossil's a
4270: 62 69 6c 69 74 79 20 74 6f 20 6d 65 61 73 75 72  bility to measur
4280: 65 20 61 74 74 72 69 62 75 74 65 73 20 6f 66 20  e attributes of 
4290: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  a file..*/.void 
42a0: 63 6d 64 5f 74 65 73 74 5f 63 61 6e 6f 6e 69 63  cmd_test_canonic
42b0: 61 6c 5f 6e 61 6d 65 28 76 6f 69 64 29 7b 0a 20  al_name(void){. 
42c0: 20 69 6e 74 20 69 3b 0a 20 20 42 6c 6f 62 20 78   int i;.  Blob x
42d0: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 78  ;.  blob_zero(&x
42e0: 29 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c  );.  for(i=2; i<
42f0: 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  g.argc; i++){.  
4300: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
4310: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
4320: 20 2a 7a 4e 61 6d 65 20 3d 20 67 2e 61 72 67 76   *zName = g.argv
4330: 5b 69 5d 3b 0a 20 20 20 20 66 69 6c 65 5f 63 61  [i];.    file_ca
4340: 6e 6f 6e 69 63 61 6c 5f 6e 61 6d 65 28 7a 4e 61  nonical_name(zNa
4350: 6d 65 2c 20 26 78 2c 20 30 29 3b 0a 20 20 20 20  me, &x, 0);.    
4360: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 5b 25  fossil_print("[%
4370: 73 5d 20 2d 3e 20 5b 25 73 5d 5c 6e 22 2c 20 7a  s] -> [%s]\n", z
4380: 4e 61 6d 65 2c 20 62 6c 6f 62 5f 62 75 66 66 65  Name, blob_buffe
4390: 72 28 26 78 29 29 3b 0a 20 20 20 20 62 6c 6f 62  r(&x));.    blob
43a0: 5f 72 65 73 65 74 28 26 78 29 3b 0a 20 20 20 20  _reset(&x);.    
43b0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
43c0: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
43d0: 42 75 66 2c 20 22 25 6c 6c 64 22 2c 20 66 69 6c  Buf, "%lld", fil
43e0: 65 5f 77 64 5f 73 69 7a 65 28 7a 4e 61 6d 65 29  e_wd_size(zName)
43f0: 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72  );.    fossil_pr
4400: 69 6e 74 28 22 20 20 66 69 6c 65 5f 73 69 7a 65  int("  file_size
4410: 20 20 20 3d 20 25 73 5c 6e 22 2c 20 7a 42 75 66     = %s\n", zBuf
4420: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
4430: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
4440: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 6c 6c  Buf), zBuf, "%ll
4450: 64 22 2c 20 66 69 6c 65 5f 77 64 5f 6d 74 69 6d  d", file_wd_mtim
4460: 65 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 66  e(zName));.    f
4470: 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20 20 66  ossil_print("  f
4480: 69 6c 65 5f 6d 74 69 6d 65 20 20 3d 20 25 73 5c  ile_mtime  = %s\
4490: 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 66  n", zBuf);.    f
44a0: 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20 20 66  ossil_print("  f
44b0: 69 6c 65 5f 69 73 66 69 6c 65 20 3d 20 25 64 5c  ile_isfile = %d\
44c0: 6e 22 2c 20 66 69 6c 65 5f 77 64 5f 69 73 66 69  n", file_wd_isfi
44d0: 6c 65 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  le(zName));.    
44e0: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20 20  fossil_print("  
44f0: 66 69 6c 65 5f 69 73 66 69 6c 65 5f 6f 72 5f 6c  file_isfile_or_l
4500: 69 6e 6b 20 3d 20 25 64 5c 6e 22 2c 66 69 6c 65  ink = %d\n",file
4510: 5f 77 64 5f 69 73 66 69 6c 65 5f 6f 72 5f 6c 69  _wd_isfile_or_li
4520: 6e 6b 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  nk(zName));.    
4530: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20 20  fossil_print("  
4540: 66 69 6c 65 5f 69 73 6c 69 6e 6b 20 3d 20 25 64  file_islink = %d
4550: 5c 6e 22 2c 20 66 69 6c 65 5f 77 64 5f 69 73 6c  \n", file_wd_isl
4560: 69 6e 6b 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ink(zName));.   
4570: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20   fossil_print(" 
4580: 20 66 69 6c 65 5f 69 73 65 78 65 20 20 3d 20 25   file_isexe  = %
4590: 64 5c 6e 22 2c 20 66 69 6c 65 5f 77 64 5f 69 73  d\n", file_wd_is
45a0: 65 78 65 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  exe(zName));.   
45b0: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20   fossil_print(" 
45c0: 20 66 69 6c 65 5f 69 73 64 69 72 20 20 3d 20 25   file_isdir  = %
45d0: 64 5c 6e 22 2c 20 66 69 6c 65 5f 77 64 5f 69 73  d\n", file_wd_is
45e0: 64 69 72 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  dir(zName));.  }
45f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4600: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
4610: 65 6e 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  en filename is c
4620: 61 6e 6f 6e 69 63 61 6c 2e 0a 2a 2a 0a 2a 2a 20  anonical..**.** 
4630: 43 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 73 20  Canonical names 
4640: 61 72 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  are full pathnam
4650: 65 73 20 75 73 69 6e 67 20 22 2f 22 20 6e 6f 74  es using "/" not
4660: 20 22 5c 22 20 61 6e 64 20 77 68 69 63 68 0a 2a   "\" and which.*
4670: 2a 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 22 2f 2e  * contain no "/.
4680: 2f 22 20 6f 72 20 22 2f 2e 2e 2f 22 20 74 65 72  /" or "/../" ter
4690: 6d 73 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f  ms..*/.int file_
46a0: 69 73 5f 63 61 6e 6f 6e 69 63 61 6c 28 63 6f 6e  is_canonical(con
46b0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
46c0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d  nt i;.  if( z[0]
46d0: 21 3d 27 2f 27 0a 23 69 66 20 64 65 66 69 6e 65  !='/'.#if define
46e0: 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 26 26  d(_WIN32).    &&
46f0: 20 28 7a 5b 30 5d 3d 3d 30 20 7c 7c 20 7a 5b 31   (z[0]==0 || z[1
4700: 5d 21 3d 27 3a 27 20 7c 7c 20 7a 5b 32 5d 21 3d  ]!=':' || z[2]!=
4710: 27 2f 27 29 0a 23 65 6e 64 69 66 0a 20 20 29 20  '/').#endif.  ) 
4720: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 66 6f 72  return 0;..  for
4730: 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (i=0; z[i]; i++)
4740: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
4750: 27 5c 5c 27 20 29 20 72 65 74 75 72 6e 20 30 3b  '\\' ) return 0;
4760: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
4770: 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  /' ){.      if( 
4780: 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 29 7b 0a 20  z[i+1]=='.' ){. 
4790: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 32         if( z[i+2
47a0: 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 5b 69 2b 32 5d  ]=='/' || z[i+2]
47b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
47c0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b          if( z[i+
47d0: 32 5d 3d 3d 27 2e 27 20 26 26 20 28 7a 5b 69 2b  2]=='.' && (z[i+
47e0: 33 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 5b 69 2b 33  3]=='/' || z[i+3
47f0: 5d 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  ]==0) ) return 0
4800: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
4820: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e  }../* .** Return
4830: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4840: 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  e first characte
4850: 72 20 69 6e 20 61 20 70 61 74 68 6e 61 6d 65 20  r in a pathname 
4860: 70 61 73 74 20 74 68 65 0a 2a 2a 20 64 72 69 76  past the.** driv
4870: 65 20 6c 65 74 74 65 72 2e 20 20 54 68 69 73 20  e letter.  This 
4880: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
4890: 6f 70 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2f 0a 63  op on unix..*/.c
48a0: 68 61 72 20 2a 66 69 6c 65 5f 77 69 74 68 6f 75  har *file_withou
48b0: 74 5f 64 72 69 76 65 5f 6c 65 74 74 65 72 28 63  t_drive_letter(c
48c0: 68 61 72 20 2a 7a 49 6e 29 7b 0a 23 69 66 64 65  har *zIn){.#ifde
48d0: 66 20 5f 57 49 4e 33 32 0a 20 20 69 66 28 20 66  f _WIN32.  if( f
48e0: 6f 73 73 69 6c 5f 69 73 61 6c 70 68 61 28 7a 49  ossil_isalpha(zI
48f0: 6e 5b 30 5d 29 20 26 26 20 7a 49 6e 5b 31 5d 3d  n[0]) && zIn[1]=
4900: 3d 27 3a 27 20 29 20 7a 49 6e 20 2b 3d 20 32 3b  =':' ) zIn += 2;
4910: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
4920: 20 7a 49 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   zIn;.}../*.** C
4930: 6f 6d 70 75 74 65 20 61 20 70 61 74 68 6e 61 6d  ompute a pathnam
4940: 65 20 66 6f 72 20 61 20 66 69 6c 65 20 6f 72 20  e for a file or 
4950: 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 69  directory that i
4960: 73 20 72 65 6c 61 74 69 76 65 0a 2a 2a 20 74 6f  s relative.** to
4970: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 69 72   the current dir
4980: 65 63 74 6f 72 79 2e 20 20 49 66 20 74 68 65 20  ectory.  If the 
4990: 73 6c 61 73 68 20 70 61 72 61 6d 65 74 65 72 20  slash parameter 
49a0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20  is non-zero,.** 
49b0: 74 68 65 20 74 72 61 69 6c 69 6e 67 20 73 6c 61  the trailing sla
49c0: 73 68 2c 20 69 66 20 61 6e 79 2c 20 69 73 20 72  sh, if any, is r
49d0: 65 74 61 69 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  etained..*/.void
49e0: 20 66 69 6c 65 5f 72 65 6c 61 74 69 76 65 5f 6e   file_relative_n
49f0: 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ame(const char *
4a00: 7a 4f 72 69 67 4e 61 6d 65 2c 20 42 6c 6f 62 20  zOrigName, Blob 
4a10: 2a 70 4f 75 74 2c 20 69 6e 74 20 73 6c 61 73 68  *pOut, int slash
4a20: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  ){.  char *zPath
4a30: 3b 0a 20 20 62 6c 6f 62 5f 73 65 74 28 70 4f 75  ;.  blob_set(pOu
4a40: 74 2c 20 7a 4f 72 69 67 4e 61 6d 65 29 3b 0a 20  t, zOrigName);. 
4a50: 20 62 6c 6f 62 5f 72 65 73 69 7a 65 28 70 4f 75   blob_resize(pOu
4a60: 74 2c 20 66 69 6c 65 5f 73 69 6d 70 6c 69 66 79  t, file_simplify
4a70: 5f 6e 61 6d 65 28 62 6c 6f 62 5f 62 75 66 66 65  _name(blob_buffe
4a80: 72 28 70 4f 75 74 29 2c 0a 20 20 20 20 20 20 20  r(pOut),.       
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 62 6c 6f 62 5f 73 69 7a 65 28 70 4f 75 74 29 2c  blob_size(pOut),
4ac0: 20 73 6c 61 73 68 29 29 3b 0a 20 20 7a 50 61 74   slash));.  zPat
4ad0: 68 20 3d 20 66 69 6c 65 5f 77 69 74 68 6f 75 74  h = file_without
4ae0: 5f 64 72 69 76 65 5f 6c 65 74 74 65 72 28 62 6c  _drive_letter(bl
4af0: 6f 62 5f 62 75 66 66 65 72 28 70 4f 75 74 29 29  ob_buffer(pOut))
4b00: 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d  ;.  if( zPath[0]
4b10: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 69 6e 74  =='/' ){.    int
4b20: 20 69 2c 20 6a 3b 0a 20 20 20 20 42 6c 6f 62 20   i, j;.    Blob 
4b30: 74 6d 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  tmp;.    char *z
4b40: 50 77 64 3b 0a 20 20 20 20 63 68 61 72 20 7a 42  Pwd;.    char zB
4b50: 75 66 5b 32 30 30 30 5d 3b 0a 20 20 20 20 7a 50  uf[2000];.    zP
4b60: 77 64 20 3d 20 7a 42 75 66 3b 0a 20 20 20 20 66  wd = zBuf;.    f
4b70: 69 6c 65 5f 67 65 74 63 77 64 28 7a 42 75 66 2c  ile_getcwd(zBuf,
4b80: 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 32 30   sizeof(zBuf)-20
4b90: 29 3b 0a 20 20 20 20 7a 50 77 64 20 3d 20 66 69  );.    zPwd = fi
4ba0: 6c 65 5f 77 69 74 68 6f 75 74 5f 64 72 69 76 65  le_without_drive
4bb0: 5f 6c 65 74 74 65 72 28 7a 42 75 66 29 3b 0a 20  _letter(zBuf);. 
4bc0: 20 20 20 69 20 3d 20 31 3b 0a 23 69 66 64 65 66     i = 1;.#ifdef
4bd0: 20 5f 57 49 4e 33 32 0a 20 20 20 20 77 68 69 6c   _WIN32.    whil
4be0: 65 28 20 7a 50 61 74 68 5b 69 5d 20 26 26 20 66  e( zPath[i] && f
4bf0: 6f 73 73 69 6c 5f 74 6f 6c 6f 77 65 72 28 7a 50  ossil_tolower(zP
4c00: 77 64 5b 69 5d 29 3d 3d 66 6f 73 73 69 6c 5f 74  wd[i])==fossil_t
4c10: 6f 6c 6f 77 65 72 28 7a 50 61 74 68 5b 69 5d 29  olower(zPath[i])
4c20: 20 29 20 69 2b 2b 3b 0a 23 65 6c 73 65 0a 20 20   ) i++;.#else.  
4c30: 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 69    while( zPath[i
4c40: 5d 20 26 26 20 7a 50 77 64 5b 69 5d 3d 3d 7a 50  ] && zPwd[i]==zP
4c50: 61 74 68 5b 69 5d 20 29 20 69 2b 2b 3b 0a 23 65  ath[i] ) i++;.#e
4c60: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 7a 50 61  ndif.    if( zPa
4c70: 74 68 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  th[i]==0 ){.    
4c80: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 70 4f 75    blob_reset(pOu
4c90: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  t);.      if( zP
4ca0: 77 64 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  wd[i]==0 ){.    
4cb0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
4cc0: 70 4f 75 74 2c 20 22 2e 22 2c 20 31 29 3b 0a 20  pOut, ".", 1);. 
4cd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4ce0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
4cf0: 70 4f 75 74 2c 20 22 2e 2e 22 2c 20 32 29 3b 0a  pOut, "..", 2);.
4d00: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b          for(j=i+
4d10: 31 3b 20 7a 50 77 64 5b 6a 5d 3b 20 6a 2b 2b 29  1; zPwd[j]; j++)
4d20: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
4d30: 7a 50 77 64 5b 6a 5d 3d 3d 27 2f 27 20 29 20 7b  zPwd[j]=='/' ) {
4d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f  .            blo
4d50: 62 5f 61 70 70 65 6e 64 28 70 4f 75 74 2c 20 22  b_append(pOut, "
4d60: 2f 2e 2e 22 2c 20 33 29 3b 0a 20 20 20 20 20 20  /..", 3);.      
4d70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
4d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
4d90: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
4da0: 69 66 28 20 7a 50 77 64 5b 69 5d 3d 3d 30 20 26  if( zPwd[i]==0 &
4db0: 26 20 7a 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20  & zPath[i]=='/' 
4dc0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
4dd0: 26 74 6d 70 2c 20 70 4f 75 74 2c 20 73 69 7a 65  &tmp, pOut, size
4de0: 6f 66 28 74 6d 70 29 29 3b 0a 20 20 20 20 20 20  of(tmp));.      
4df0: 62 6c 6f 62 5f 73 65 74 28 70 4f 75 74 2c 20 22  blob_set(pOut, "
4e00: 2e 2f 22 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62  ./");.      blob
4e10: 5f 61 70 70 65 6e 64 28 70 4f 75 74 2c 20 26 7a  _append(pOut, &z
4e20: 50 61 74 68 5b 69 2b 31 5d 2c 20 2d 31 29 3b 0a  Path[i+1], -1);.
4e30: 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74        blob_reset
4e40: 28 26 74 6d 70 29 3b 0a 20 20 20 20 20 20 72 65  (&tmp);.      re
4e50: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
4e60: 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 69 2d 31  while( zPath[i-1
4e70: 5d 21 3d 27 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d  ]!='/' ){ i--; }
4e80: 0a 20 20 20 20 62 6c 6f 62 5f 73 65 74 28 26 74  .    blob_set(&t
4e90: 6d 70 2c 20 22 2e 2e 2f 22 29 3b 0a 20 20 20 20  mp, "../");.    
4ea0: 66 6f 72 28 6a 3d 69 3b 20 7a 50 77 64 5b 6a 5d  for(j=i; zPwd[j]
4eb0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
4ec0: 28 20 7a 50 77 64 5b 6a 5d 3d 3d 27 2f 27 20 29  ( zPwd[j]=='/' )
4ed0: 20 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f   {.        blob_
4ee0: 61 70 70 65 6e 64 28 26 74 6d 70 2c 20 22 2e 2e  append(&tmp, "..
4ef0: 2f 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 7d 0a  /", 3);.      }.
4f00: 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 61      }.    blob_a
4f10: 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 7a 50 61  ppend(&tmp, &zPa
4f20: 74 68 5b 69 5d 2c 20 2d 31 29 3b 0a 20 20 20 20  th[i], -1);.    
4f30: 62 6c 6f 62 5f 72 65 73 65 74 28 70 4f 75 74 29  blob_reset(pOut)
4f40: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75  ;.    memcpy(pOu
4f50: 74 2c 20 26 74 6d 70 2c 20 73 69 7a 65 6f 66 28  t, &tmp, sizeof(
4f60: 74 6d 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tmp));.  }.}../*
4f70: 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 20 74 65  .** COMMAND:  te
4f80: 73 74 2d 72 65 6c 61 74 69 76 65 2d 6e 61 6d 65  st-relative-name
4f90: 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
4fa0: 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
4fb0: 20 72 65 6c 61 74 69 76 65 20 6e 61 6d 65 20 67   relative name g
4fc0: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 76 6f 69  enerator..*/.voi
4fd0: 64 20 63 6d 64 5f 74 65 73 74 5f 72 65 6c 61 74  d cmd_test_relat
4fe0: 69 76 65 5f 6e 61 6d 65 28 76 6f 69 64 29 7b 0a  ive_name(void){.
4ff0: 20 20 69 6e 74 20 69 3b 0a 20 20 42 6c 6f 62 20    int i;.  Blob 
5000: 78 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26  x;.  blob_zero(&
5010: 78 29 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69  x);.  for(i=2; i
5020: 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20  <g.argc; i++){. 
5030: 20 20 20 66 69 6c 65 5f 72 65 6c 61 74 69 76 65     file_relative
5040: 5f 6e 61 6d 65 28 67 2e 61 72 67 76 5b 69 5d 2c  _name(g.argv[i],
5050: 20 26 78 2c 20 30 29 3b 0a 20 20 20 20 66 6f 73   &x, 0);.    fos
5060: 73 69 6c 5f 70 72 69 6e 74 28 22 25 73 5c 6e 22  sil_print("%s\n"
5070: 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 78  , blob_buffer(&x
5080: 29 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73  ));.    blob_res
5090: 65 74 28 26 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  et(&x);.  }.}../
50a0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 70  *.** Compute a p
50b0: 61 74 68 6e 61 6d 65 20 66 6f 72 20 61 20 66 69  athname for a fi
50c0: 6c 65 20 72 65 6c 61 74 69 76 65 20 74 6f 20 74  le relative to t
50d0: 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 6c  he root of the l
50e0: 6f 63 61 6c 0a 2a 2a 20 74 72 65 65 2e 20 20 52  ocal.** tree.  R
50f0: 65 74 75 72 6e 20 54 52 55 45 20 6f 6e 20 73 75  eturn TRUE on su
5100: 63 63 65 73 73 2e 20 20 4f 6e 20 66 61 69 6c 75  ccess.  On failu
5110: 72 65 2c 20 70 72 69 6e 74 20 61 6e 64 20 65 72  re, print and er
5120: 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 61  ror.** message a
5130: 6e 64 20 71 75 69 74 20 69 66 20 74 68 65 20 65  nd quit if the e
5140: 72 72 46 61 74 61 6c 20 66 6c 61 67 20 69 73 20  rrFatal flag is 
5150: 74 72 75 65 2e 20 20 49 66 20 65 72 72 46 61 74  true.  If errFat
5160: 61 6c 20 69 73 0a 2a 2a 20 66 61 6c 73 65 2c 20  al is.** false, 
5170: 74 68 65 6e 20 73 69 6d 70 6c 79 20 72 65 74 75  then simply retu
5180: 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rn 0..**.** The 
5190: 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65  root of the tree
51a0: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 74   is defined by t
51b0: 68 65 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 20  he g.zLocalRoot 
51c0: 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  variable..*/.int
51d0: 20 66 69 6c 65 5f 74 72 65 65 5f 6e 61 6d 65 28   file_tree_name(
51e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
51f0: 67 4e 61 6d 65 2c 20 42 6c 6f 62 20 2a 70 4f 75  gName, Blob *pOu
5200: 74 2c 20 69 6e 74 20 65 72 72 46 61 74 61 6c 29  t, int errFatal)
5210: 7b 0a 20 20 42 6c 6f 62 20 6c 6f 63 61 6c 52 6f  {.  Blob localRo
5220: 6f 74 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61 6c  ot;.  int nLocal
5230: 52 6f 6f 74 3b 0a 20 20 63 68 61 72 20 2a 7a 4c  Root;.  char *zL
5240: 6f 63 61 6c 52 6f 6f 74 3b 0a 20 20 42 6c 6f 62  ocalRoot;.  Blob
5250: 20 66 75 6c 6c 3b 0a 20 20 69 6e 74 20 6e 46 75   full;.  int nFu
5260: 6c 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  ll;.  char *zFul
5270: 6c 3b 0a 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  l;..  blob_zero(
5280: 70 4f 75 74 29 3b 0a 20 20 64 62 5f 6d 75 73 74  pOut);.  db_must
5290: 5f 62 65 5f 77 69 74 68 69 6e 5f 74 72 65 65 28  _be_within_tree(
52a0: 29 3b 0a 20 20 66 69 6c 65 5f 63 61 6e 6f 6e 69  );.  file_canoni
52b0: 63 61 6c 5f 6e 61 6d 65 28 67 2e 7a 4c 6f 63 61  cal_name(g.zLoca
52c0: 6c 52 6f 6f 74 2c 20 26 6c 6f 63 61 6c 52 6f 6f  lRoot, &localRoo
52d0: 74 2c 20 31 29 3b 0a 20 20 6e 4c 6f 63 61 6c 52  t, 1);.  nLocalR
52e0: 6f 6f 74 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28  oot = blob_size(
52f0: 26 6c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20 20 7a  &localRoot);.  z
5300: 4c 6f 63 61 6c 52 6f 6f 74 20 3d 20 62 6c 6f 62  LocalRoot = blob
5310: 5f 62 75 66 66 65 72 28 26 6c 6f 63 61 6c 52 6f  _buffer(&localRo
5320: 6f 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ot);.  assert( n
5330: 4c 6f 63 61 6c 52 6f 6f 74 3e 30 20 26 26 20 7a  LocalRoot>0 && z
5340: 4c 6f 63 61 6c 52 6f 6f 74 5b 6e 4c 6f 63 61 6c  LocalRoot[nLocal
5350: 52 6f 6f 74 2d 31 5d 3d 3d 27 2f 27 20 29 3b 0a  Root-1]=='/' );.
5360: 20 20 66 69 6c 65 5f 63 61 6e 6f 6e 69 63 61 6c    file_canonical
5370: 5f 6e 61 6d 65 28 7a 4f 72 69 67 4e 61 6d 65 2c  _name(zOrigName,
5380: 20 26 66 75 6c 6c 2c 20 30 29 3b 0a 20 20 6e 46   &full, 0);.  nF
5390: 75 6c 6c 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28  ull = blob_size(
53a0: 26 66 75 6c 6c 29 3b 0a 20 20 7a 46 75 6c 6c 20  &full);.  zFull 
53b0: 3d 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 66  = blob_buffer(&f
53c0: 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63  ull);..  /* Spec
53d0: 69 61 6c 20 63 61 73 65 2e 20 20 7a 4f 72 69 67  ial case.  zOrig
53e0: 4e 61 6d 65 20 72 65 66 65 72 73 20 74 6f 20 67  Name refers to g
53f0: 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 20 64 69 72 65  .zLocalRoot dire
5400: 63 74 6f 72 79 2e 20 2a 2f 0a 20 20 69 66 28 20  ctory. */.  if( 
5410: 6e 46 75 6c 6c 3d 3d 6e 4c 6f 63 61 6c 52 6f 6f  nFull==nLocalRoo
5420: 74 2d 31 20 26 26 20 6d 65 6d 63 6d 70 28 7a 4c  t-1 && memcmp(zL
5430: 6f 63 61 6c 52 6f 6f 74 2c 20 7a 46 75 6c 6c 2c  ocalRoot, zFull,
5440: 20 6e 46 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20   nFull)==0 ){.  
5450: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 4f    blob_append(pO
5460: 75 74 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20  ut, ".", 1);.   
5470: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 6c 6f 63   blob_reset(&loc
5480: 61 6c 52 6f 6f 74 29 3b 0a 20 20 20 20 62 6c 6f  alRoot);.    blo
5490: 62 5f 72 65 73 65 74 28 26 66 75 6c 6c 29 3b 0a  b_reset(&full);.
54a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
54b0: 7d 0a 0a 20 20 69 66 28 20 6e 46 75 6c 6c 3c 3d  }..  if( nFull<=
54c0: 6e 4c 6f 63 61 6c 52 6f 6f 74 20 7c 7c 20 6d 65  nLocalRoot || me
54d0: 6d 63 6d 70 28 7a 4c 6f 63 61 6c 52 6f 6f 74 2c  mcmp(zLocalRoot,
54e0: 20 7a 46 75 6c 6c 2c 20 6e 4c 6f 63 61 6c 52 6f   zFull, nLocalRo
54f0: 6f 74 29 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f  ot) ){.    blob_
5500: 72 65 73 65 74 28 26 6c 6f 63 61 6c 52 6f 6f 74  reset(&localRoot
5510: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  );.    blob_rese
5520: 74 28 26 66 75 6c 6c 29 3b 0a 20 20 20 20 69 66  t(&full);.    if
5530: 28 20 65 72 72 46 61 74 61 6c 20 29 7b 0a 20 20  ( errFatal ){.  
5540: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
5550: 28 22 66 69 6c 65 20 6f 75 74 73 69 64 65 20 6f  ("file outside o
5560: 66 20 63 68 65 63 6b 6f 75 74 20 74 72 65 65 3a  f checkout tree:
5570: 20 25 73 22 2c 20 7a 4f 72 69 67 4e 61 6d 65 29   %s", zOrigName)
5580: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
5590: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62  rn 0;.  }.  blob
55a0: 5f 61 70 70 65 6e 64 28 70 4f 75 74 2c 20 26 7a  _append(pOut, &z
55b0: 46 75 6c 6c 5b 6e 4c 6f 63 61 6c 52 6f 6f 74 5d  Full[nLocalRoot]
55c0: 2c 20 6e 46 75 6c 6c 2d 6e 4c 6f 63 61 6c 52 6f  , nFull-nLocalRo
55d0: 6f 74 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65  ot);.  blob_rese
55e0: 74 28 26 6c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20  t(&localRoot);. 
55f0: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 66 75 6c   blob_reset(&ful
5600: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  l);.  return 1;.
5610: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44  }../*.** COMMAND
5620: 3a 20 20 74 65 73 74 2d 74 72 65 65 2d 6e 61 6d  :  test-tree-nam
5630: 65 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  e.**.** Test the
5640: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
5650: 65 20 74 72 65 65 20 6e 61 6d 65 20 67 65 6e 65  e tree name gene
5660: 72 61 74 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 63  rator..*/.void c
5670: 6d 64 5f 74 65 73 74 5f 74 72 65 65 5f 6e 61 6d  md_test_tree_nam
5680: 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69  e(void){.  int i
5690: 3b 0a 20 20 42 6c 6f 62 20 78 3b 0a 20 20 62 6c  ;.  Blob x;.  bl
56a0: 6f 62 5f 7a 65 72 6f 28 26 78 29 3b 0a 20 20 66  ob_zero(&x);.  f
56b0: 6f 72 28 69 3d 32 3b 20 69 3c 67 2e 61 72 67 63  or(i=2; i<g.argc
56c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
56d0: 66 69 6c 65 5f 74 72 65 65 5f 6e 61 6d 65 28 67  file_tree_name(g
56e0: 2e 61 72 67 76 5b 69 5d 2c 20 26 78 2c 20 31 29  .argv[i], &x, 1)
56f0: 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c   ){.      fossil
5700: 5f 70 72 69 6e 74 28 22 25 73 5c 6e 22 2c 20 62  _print("%s\n", b
5710: 6c 6f 62 5f 62 75 66 66 65 72 28 26 78 29 29 3b  lob_buffer(&x));
5720: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  .      blob_rese
5730: 74 28 26 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t(&x);.    }.  }
5740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20  .}../*.** Parse 
5750: 61 20 55 52 49 20 69 6e 74 6f 20 73 63 68 65 6d  a URI into schem
5760: 65 2c 20 68 6f 73 74 2c 20 70 6f 72 74 2c 20 61  e, host, port, a
5770: 6e 64 20 70 61 74 68 2e 0a 2a 2f 0a 76 6f 69 64  nd path..*/.void
5780: 20 66 69 6c 65 5f 70 61 72 73 65 5f 75 72 69 28   file_parse_uri(
5790: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
57a0: 55 72 69 2c 0a 20 20 42 6c 6f 62 20 2a 70 53 63  Uri,.  Blob *pSc
57b0: 68 65 6d 65 2c 0a 20 20 42 6c 6f 62 20 2a 70 48  heme,.  Blob *pH
57c0: 6f 73 74 2c 0a 20 20 69 6e 74 20 2a 70 50 6f 72  ost,.  int *pPor
57d0: 74 2c 0a 20 20 42 6c 6f 62 20 2a 70 50 61 74 68  t,.  Blob *pPath
57e0: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
57f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 55 72 69  .  for(i=0; zUri
5800: 5b 69 5d 20 26 26 20 7a 55 72 69 5b 69 5d 3e 3d  [i] && zUri[i]>=
5810: 27 61 27 20 26 26 20 7a 55 72 69 5b 69 5d 3c 3d  'a' && zUri[i]<=
5820: 27 7a 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66  'z'; i++){}.  if
5830: 28 20 7a 55 72 69 5b 69 5d 21 3d 27 3a 27 20 29  ( zUri[i]!=':' )
5840: 7b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  {.    blob_zero(
5850: 70 53 63 68 65 6d 65 29 3b 0a 20 20 20 20 62 6c  pScheme);.    bl
5860: 6f 62 5f 7a 65 72 6f 28 70 48 6f 73 74 29 3b 0a  ob_zero(pHost);.
5870: 20 20 20 20 62 6c 6f 62 5f 73 65 74 28 70 50 61      blob_set(pPa
5880: 74 68 2c 20 7a 55 72 69 29 3b 0a 20 20 20 20 72  th, zUri);.    r
5890: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 62 6c 6f  eturn;.  }.  blo
58a0: 62 5f 69 6e 69 74 28 70 53 63 68 65 6d 65 2c 20  b_init(pScheme, 
58b0: 7a 55 72 69 2c 20 69 29 3b 0a 20 20 69 2b 2b 3b  zUri, i);.  i++;
58c0: 0a 20 20 69 66 28 20 7a 55 72 69 5b 69 5d 3d 3d  .  if( zUri[i]==
58d0: 27 2f 27 20 26 26 20 7a 55 72 69 5b 69 2b 31 5d  '/' && zUri[i+1]
58e0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 69 20 2b  =='/' ){.    i +
58f0: 3d 20 32 3b 0a 20 20 20 20 6a 20 3d 20 69 3b 0a  = 2;.    j = i;.
5900: 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
5910: 69 5d 20 26 26 20 7a 55 72 69 5b 69 5d 21 3d 27  i] && zUri[i]!='
5920: 2f 27 20 26 26 20 7a 55 72 69 5b 69 5d 21 3d 27  /' && zUri[i]!='
5930: 3a 27 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  :' ){ i++; }.   
5940: 20 62 6c 6f 62 5f 69 6e 69 74 28 70 48 6f 73 74   blob_init(pHost
5950: 2c 20 26 7a 55 72 69 5b 6a 5d 2c 20 69 2d 6a 29  , &zUri[j], i-j)
5960: 3b 0a 20 20 20 20 69 66 28 20 7a 55 72 69 5b 69  ;.    if( zUri[i
5970: 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 20 20  ]==':' ){.      
5980: 69 2b 2b 3b 0a 20 20 20 20 20 20 2a 70 50 6f 72  i++;.      *pPor
5990: 74 20 3d 20 61 74 6f 69 28 26 7a 55 72 69 5b 69  t = atoi(&zUri[i
59a0: 5d 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ]);.      while(
59b0: 20 7a 55 72 69 5b 69 5d 20 26 26 20 7a 55 72 69   zUri[i] && zUri
59c0: 5b 69 5d 21 3d 27 2f 27 20 29 7b 20 69 2b 2b 3b  [i]!='/' ){ i++;
59d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
59e0: 7b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  {.    blob_zero(
59f0: 70 48 6f 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66  pHost);.  }.  if
5a00: 28 20 7a 55 72 69 5b 69 5d 3d 3d 27 2f 27 20 29  ( zUri[i]=='/' )
5a10: 7b 0a 20 20 20 20 62 6c 6f 62 5f 73 65 74 28 70  {.    blob_set(p
5a20: 50 61 74 68 2c 20 26 7a 55 72 69 5b 69 5d 29 3b  Path, &zUri[i]);
5a30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 6c  .  }else{.    bl
5a40: 6f 62 5f 73 65 74 28 70 50 61 74 68 2c 20 22 2f  ob_set(pPath, "/
5a50: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
5a60: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 61 6e   Construct a ran
5a70: 64 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 66 69  dom temporary fi
5a80: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 7a 42 75 66  lename into zBuf
5a90: 5b 5d 2e 0a 2a 2f 0a 76 6f 69 64 20 66 69 6c 65  []..*/.void file
5aa0: 5f 74 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  _tempname(int nB
5ab0: 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
5ac0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
5ad0: 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d  char *azDirs[] =
5ae0: 20 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f   {.#if defined(_
5af0: 57 49 4e 33 32 29 0a 20 20 20 20 20 30 2c 20 2f  WIN32).     0, /
5b00: 2a 20 47 65 74 54 65 6d 70 50 61 74 68 20 2a 2f  * GetTempPath */
5b10: 0a 20 20 20 20 20 30 2c 20 2f 2a 20 54 45 4d 50  .     0, /* TEMP
5b20: 20 2a 2f 0a 20 20 20 20 20 30 2c 20 2f 2a 20 54   */.     0, /* T
5b30: 4d 50 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 20 20  MP */.#else.    
5b40: 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
5b50: 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
5b60: 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
5b70: 22 2f 74 65 6d 70 22 2c 0a 23 65 6e 64 69 66 0a  "/temp",.#endif.
5b80: 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20       ".",.  };. 
5b90: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e   static const un
5ba0: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61  signed char zCha
5bb0: 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
5bc0: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
5bd0: 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
5be0: 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
5bf0: 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
5c00: 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73  23456789";.  uns
5c10: 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a  igned int i, j;.
5c20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
5c30: 69 72 20 3d 20 22 2e 22 3b 0a 20 20 69 6e 74 20  ir = ".";.  int 
5c40: 63 6e 74 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65  cnt = 0;..#if de
5c50: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20  fined(_WIN32).  
5c60: 77 63 68 61 72 5f 74 20 7a 54 6d 70 50 61 74 68  wchar_t zTmpPath
5c70: 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 0a 20 20 69  [MAX_PATH];..  i
5c80: 66 28 20 47 65 74 54 65 6d 70 50 61 74 68 57 28  f( GetTempPathW(
5c90: 4d 41 58 5f 50 41 54 48 2c 20 7a 54 6d 70 50 61  MAX_PATH, zTmpPa
5ca0: 74 68 29 20 29 7b 0a 20 20 20 20 61 7a 44 69 72  th) ){.    azDir
5cb0: 73 5b 30 5d 20 3d 20 66 6f 73 73 69 6c 5f 75 6e  s[0] = fossil_un
5cc0: 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28 7a 54  icode_to_utf8(zT
5cd0: 6d 70 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20  mpPath);.  }..  
5ce0: 61 7a 44 69 72 73 5b 31 5d 20 3d 20 66 6f 73 73  azDirs[1] = foss
5cf0: 69 6c 5f 67 65 74 65 6e 76 28 22 54 45 4d 50 22  il_getenv("TEMP"
5d00: 29 3b 0a 20 20 61 7a 44 69 72 73 5b 32 5d 20 3d  );.  azDirs[2] =
5d10: 20 66 6f 73 73 69 6c 5f 67 65 74 65 6e 76 28 22   fossil_getenv("
5d20: 54 4d 50 22 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  TMP");.#endif.. 
5d30: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73   .  for(i=0; i<s
5d40: 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
5d50: 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
5d60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
5d70: 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f  zDirs[i]==0 ) co
5d80: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
5d90: 21 66 69 6c 65 5f 69 73 64 69 72 28 61 7a 44 69  !file_isdir(azDi
5da0: 72 73 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e 75  rs[i]) ) continu
5db0: 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a  e;.    zDir = az
5dc0: 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65  Dirs[i];.    bre
5dd0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  ak;.  }..  /* Ch
5de0: 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74  eck that the out
5df0: 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61  put buffer is la
5e00: 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74  rge enough for t
5e10: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
5e20: 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66  e .  ** name. If
5e30: 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75   it is not, retu
5e40: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
5e50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72  .  */.  if( (str
5e60: 6c 65 6e 28 7a 44 69 72 29 20 2b 20 31 37 29 20  len(zDir) + 17) 
5e70: 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  >= (size_t)nBuf 
5e80: 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61  ){.    fossil_fa
5e90: 74 61 6c 28 22 69 6e 73 75 66 66 69 63 69 65 6e  tal("insufficien
5ea0: 74 20 73 70 61 63 65 20 66 6f 72 20 74 65 6d 70  t space for temp
5eb0: 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 22 29  orary filename")
5ec0: 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  ;.  }..  do{.   
5ed0: 20 69 66 28 20 63 6e 74 2b 2b 3e 32 30 20 29 20   if( cnt++>20 ) 
5ee0: 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 63 61  fossil_panic("ca
5ef0: 6e 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61 20  nnot generate a 
5f00: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61  temporary filena
5f10: 6d 65 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  me");.    sqlite
5f20: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
5f30: 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 2c  17, zBuf, "%s/",
5f40: 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20   zDir);.    j = 
5f50: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66  (int)strlen(zBuf
5f60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
5f70: 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
5f80: 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
5f90: 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
5fa0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
5fb0: 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
5fc0: 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
5fd0: 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
5fe0: 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
5ff0: 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
6000: 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68  uf[j] = 0;.  }wh
6010: 69 6c 65 28 20 66 69 6c 65 5f 73 69 7a 65 28 7a  ile( file_size(z
6020: 42 75 66 29 3e 3d 30 20 29 3b 0a 0a 23 69 66 20  Buf)>=0 );..#if 
6030: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a  defined(_WIN32).
6040: 20 20 66 6f 73 73 69 6c 5f 6d 62 63 73 5f 66 72    fossil_mbcs_fr
6050: 65 65 28 28 63 68 61 72 20 2a 29 61 7a 44 69 72  ee((char *)azDir
6060: 73 5b 31 5d 29 3b 0a 20 20 66 6f 73 73 69 6c 5f  s[1]);.  fossil_
6070: 6d 62 63 73 5f 66 72 65 65 28 28 63 68 61 72 20  mbcs_free((char 
6080: 2a 29 61 7a 44 69 72 73 5b 32 5d 29 3b 0a 23 65  *)azDirs[2]);.#e
6090: 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  ndif.}.../*.** R
60a0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 20  eturn true if a 
60b0: 66 69 6c 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  file named zName
60c0: 20 65 78 69 73 74 73 20 61 6e 64 20 68 61 73 20   exists and has 
60d0: 69 64 65 6e 74 69 63 61 6c 20 63 6f 6e 74 65 6e  identical conten
60e0: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62  t.** to the blob
60f0: 20 70 43 6f 6e 74 65 6e 74 2e 20 20 49 66 20 7a   pContent.  If z
6100: 4e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  Name does not ex
6110: 69 73 74 20 6f 72 20 69 66 20 74 68 65 20 63 6f  ist or if the co
6120: 6e 74 65 6e 74 20 69 73 0a 2a 2a 20 64 69 66 66  ntent is.** diff
6130: 65 72 65 6e 74 20 69 6e 20 61 6e 79 20 77 61 79  erent in any way
6140: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 66 61  , then return fa
6150: 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65  lse..*/.int file
6160: 5f 69 73 5f 74 68 65 5f 73 61 6d 65 28 42 6c 6f  _is_the_same(Blo
6170: 62 20 2a 70 43 6f 6e 74 65 6e 74 2c 20 63 6f 6e  b *pContent, con
6180: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
6190: 0a 20 20 69 36 34 20 69 53 69 7a 65 3b 0a 20 20  .  i64 iSize;.  
61a0: 69 6e 74 20 72 63 3b 0a 20 20 42 6c 6f 62 20 6f  int rc;.  Blob o
61b0: 6e 44 69 73 6b 3b 0a 0a 20 20 69 53 69 7a 65 20  nDisk;..  iSize 
61c0: 3d 20 66 69 6c 65 5f 77 64 5f 73 69 7a 65 28 7a  = file_wd_size(z
61d0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 53 69  Name);.  if( iSi
61e0: 7a 65 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ze<0 ) return 0;
61f0: 0a 20 20 69 66 28 20 69 53 69 7a 65 21 3d 62 6c  .  if( iSize!=bl
6200: 6f 62 5f 73 69 7a 65 28 70 43 6f 6e 74 65 6e 74  ob_size(pContent
6210: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
6220: 69 66 28 20 66 69 6c 65 5f 77 64 5f 69 73 6c 69  if( file_wd_isli
6230: 6e 6b 28 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  nk(zName) ){.   
6240: 20 62 6c 6f 62 5f 72 65 61 64 5f 6c 69 6e 6b 28   blob_read_link(
6250: 26 6f 6e 44 69 73 6b 2c 20 7a 4e 61 6d 65 29 3b  &onDisk, zName);
6260: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 6c  .  }else{.    bl
6270: 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c  ob_read_from_fil
6280: 65 28 26 6f 6e 44 69 73 6b 2c 20 7a 4e 61 6d 65  e(&onDisk, zName
6290: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 62 6c  );.  }.  rc = bl
62a0: 6f 62 5f 63 6f 6d 70 61 72 65 28 26 6f 6e 44 69  ob_compare(&onDi
62b0: 73 6b 2c 20 70 43 6f 6e 74 65 6e 74 29 3b 0a 20  sk, pContent);. 
62c0: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 6f 6e 44   blob_reset(&onD
62d0: 69 73 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  isk);.  return r
62e0: 63 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  c==0;.}../******
62f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6330: 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ****.** The foll
6340: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 74  owing routines t
6350: 72 61 6e 73 6c 61 74 65 20 62 65 74 77 65 65 6e  ranslate between
6360: 20 4d 42 43 53 20 61 6e 64 20 55 54 46 38 20 6f   MBCS and UTF8 o
6370: 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a 2a 20 53 69  n windows..** Si
6380: 6e 63 65 20 65 76 65 72 79 74 68 69 6e 67 20 69  nce everything i
6390: 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 6f 6e  s always UTF8 on
63a0: 20 75 6e 69 78 2c 20 74 68 65 73 65 20 72 6f 75   unix, these rou
63b0: 74 69 6e 65 73 20 61 72 65 20 6e 6f 2d 6f 70 73  tines are no-ops
63c0: 0a 2a 2a 20 74 68 65 72 65 2e 0a 2a 2f 0a 0a 2f  .** there..*/../
63d0: 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 4d  *.** Translate M
63e0: 42 43 53 20 74 6f 20 55 54 46 38 2e 20 20 52 65  BCS to UTF8.  Re
63f0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6400: 6f 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65 64  o the translated
6410: 20 74 65 78 74 2e 20 20 0a 2a 2a 20 43 61 6c 6c   text.  .** Call
6420: 20 66 6f 73 73 69 6c 5f 6d 62 63 73 5f 66 72 65   fossil_mbcs_fre
6430: 65 28 29 20 74 6f 20 64 65 61 6c 6c 6f 63 61 74  e() to deallocat
6440: 65 20 61 6e 79 20 6d 65 6d 6f 72 79 20 75 73 65  e any memory use
6450: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 0a 2a  d to store the.*
6460: 2a 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  * returned point
6470: 65 72 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 2a 2f  er when done..*/
6480: 0a 63 68 61 72 20 2a 66 6f 73 73 69 6c 5f 6d 62  .char *fossil_mb
6490: 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74  cs_to_utf8(const
64a0: 20 63 68 61 72 20 2a 7a 4d 62 63 73 29 7b 0a 23   char *zMbcs){.#
64b0: 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 65  ifdef _WIN32.  e
64c0: 78 74 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69  xtern char *sqli
64d0: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
64e0: 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61  o_utf8(const cha
64f0: 72 2a 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  r*);.  return sq
6500: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
6510: 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73 29 3b  _to_utf8(zMbcs);
6520: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
6530: 28 63 68 61 72 2a 29 7a 4d 62 63 73 3b 20 20 2f  (char*)zMbcs;  /
6540: 2a 20 4e 6f 2d 6f 70 20 6f 6e 20 75 6e 69 78 20  * No-op on unix 
6550: 2a 2f 0a 23 65 6e 64 69 66 20 20 0a 7d 0a 0a 2f  */.#endif  .}../
6560: 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 55  *.** Translate U
6570: 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 38 2e 20  nicode to UTF8. 
6580: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
6590: 72 20 74 6f 20 74 68 65 20 74 72 61 6e 73 6c 61  r to the transla
65a0: 74 65 64 20 74 65 78 74 2e 0a 2a 2a 20 43 61 6c  ted text..** Cal
65b0: 6c 20 66 6f 73 73 69 6c 5f 6d 62 63 73 5f 66 72  l fossil_mbcs_fr
65c0: 65 65 28 29 20 74 6f 20 64 65 61 6c 6c 6f 63 61  ee() to dealloca
65d0: 74 65 20 61 6e 79 20 6d 65 6d 6f 72 79 20 75 73  te any memory us
65e0: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 0a  ed to store the.
65f0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  ** returned poin
6600: 74 65 72 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 2a  ter when done..*
6610: 2f 0a 63 68 61 72 20 2a 66 6f 73 73 69 6c 5f 75  /.char *fossil_u
6620: 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28 63  nicode_to_utf8(c
6630: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55 6e 69 63  onst void *zUnic
6640: 6f 64 65 29 7b 0a 23 69 66 64 65 66 20 5f 57 49  ode){.#ifdef _WI
6650: 4e 33 32 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  N32.  int nByte 
6660: 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  = WideCharToMult
6670: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
6680: 2c 20 7a 55 6e 69 63 6f 64 65 2c 20 2d 31 2c 20  , zUnicode, -1, 
6690: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 63  0, 0, 0, 0);.  c
66a0: 68 61 72 20 2a 7a 55 74 66 20 3d 20 73 71 6c 69  har *zUtf = sqli
66b0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  te3_malloc( nByt
66c0: 65 20 29 3b 0a 20 20 69 66 28 20 7a 55 74 66 3d  e );.  if( zUtf=
66d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
66e0: 20 30 3b 0a 20 20 7d 0a 20 20 57 69 64 65 43 68   0;.  }.  WideCh
66f0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
6700: 5f 55 54 46 38 2c 20 30 2c 20 7a 55 6e 69 63 6f  _UTF8, 0, zUnico
6710: 64 65 2c 20 2d 31 2c 20 7a 55 74 66 2c 20 6e 42  de, -1, zUtf, nB
6720: 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  yte, 0, 0);.  re
6730: 74 75 72 6e 20 7a 55 74 66 3b 0a 23 65 6c 73 65  turn zUtf;.#else
6740: 0a 20 20 72 65 74 75 72 6e 20 28 63 68 61 72 20  .  return (char 
6750: 2a 29 7a 55 6e 69 63 6f 64 65 3b 20 20 2f 2a 20  *)zUnicode;  /* 
6760: 4e 6f 2d 6f 70 20 6f 6e 20 75 6e 69 78 20 2a 2f  No-op on unix */
6770: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
6780: 20 54 72 61 6e 73 6c 61 74 65 20 55 54 46 38 20   Translate UTF8 
6790: 74 6f 20 4d 42 43 53 20 66 6f 72 20 75 73 65 20  to MBCS for use 
67a0: 69 6e 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e  in system calls.
67b0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
67c0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 74 72 61  er to the.** tra
67d0: 6e 73 6c 61 74 65 64 20 74 65 78 74 2e 2e 20 20  nslated text..  
67e0: 43 61 6c 6c 20 66 6f 73 73 69 6c 5f 6d 62 63 73  Call fossil_mbcs
67f0: 5f 66 72 65 65 28 29 20 74 6f 20 64 65 61 6c 6c  _free() to deall
6800: 6f 63 61 74 65 20 61 6e 79 20 6d 65 6d 6f 72 79  ocate any memory
6810: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
6820: 65 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 70  e the returned p
6830: 6f 69 6e 74 65 72 20 77 68 65 6e 20 64 6f 6e 65  ointer when done
6840: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 66 6f 73 73 69  ..*/.char *fossi
6850: 6c 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63  l_utf8_to_mbcs(c
6860: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38  onst char *zUtf8
6870: 29 7b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32  ){.#ifdef _WIN32
6880: 0a 20 20 65 78 74 65 72 6e 20 63 68 61 72 20 2a  .  extern char *
6890: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
68a0: 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74  f8_to_mbcs(const
68b0: 20 63 68 61 72 2a 29 3b 0a 20 20 72 65 74 75 72   char*);.  retur
68c0: 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  n sqlite3_win32_
68d0: 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 55 74  utf8_to_mbcs(zUt
68e0: 66 38 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  f8);.#else.  ret
68f0: 75 72 6e 20 28 63 68 61 72 2a 29 7a 55 74 66 38  urn (char*)zUtf8
6900: 3b 20 20 2f 2a 20 4e 6f 2d 6f 70 20 6f 6e 20 75  ;  /* No-op on u
6910: 6e 69 78 20 2a 2f 0a 23 65 6e 64 69 66 20 20 0a  nix */.#endif  .
6920: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
6930: 74 65 20 55 54 46 38 20 74 6f 20 75 6e 69 63 6f  te UTF8 to unico
6940: 64 65 20 66 6f 72 20 75 73 65 20 69 6e 20 73 79  de for use in sy
6950: 73 74 65 6d 20 63 61 6c 6c 73 2e 20 20 52 65 74  stem calls.  Ret
6960: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
6970: 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 6c 61 74   the.** translat
6980: 65 64 20 74 65 78 74 2e 2e 20 20 43 61 6c 6c 20  ed text..  Call 
6990: 66 6f 73 73 69 6c 5f 6d 62 63 73 5f 66 72 65 65  fossil_mbcs_free
69a0: 28 29 20 74 6f 20 64 65 61 6c 6c 6f 63 61 74 65  () to deallocate
69b0: 20 61 6e 79 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75   any memory.** u
69c0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
69d0: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
69e0: 72 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 2a 2f 0a  r when done..*/.
69f0: 76 6f 69 64 20 2a 66 6f 73 73 69 6c 5f 75 74 66  void *fossil_utf
6a00: 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 63 6f 6e  8_to_unicode(con
6a10: 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 29 7b  st char *zUtf8){
6a20: 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20  .#ifdef _WIN32. 
6a30: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 4d 75 6c   int nByte = Mul
6a40: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
6a50: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 55 74  (CP_UTF8, 0, zUt
6a60: 66 38 2c 20 2d 31 2c 20 30 2c 20 30 29 3b 0a 20  f8, -1, 0, 0);. 
6a70: 20 77 63 68 61 72 5f 74 20 2a 7a 55 6e 69 63 6f   wchar_t *zUnico
6a80: 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
6a90: 6c 6f 63 28 20 6e 42 79 74 65 20 2a 20 32 20 29  loc( nByte * 2 )
6aa0: 3b 0a 20 20 69 66 28 20 7a 55 6e 69 63 6f 64 65  ;.  if( zUnicode
6ab0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
6ac0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 4d 75 6c 74 69  n 0;.  }.  Multi
6ad0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
6ae0: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 55 74 66 38  P_UTF8, 0, zUtf8
6af0: 2c 20 2d 31 2c 20 7a 55 6e 69 63 6f 64 65 2c 20  , -1, zUnicode, 
6b00: 6e 42 79 74 65 29 3b 0a 20 20 72 65 74 75 72 6e  nByte);.  return
6b10: 20 7a 55 6e 69 63 6f 64 65 3b 0a 23 65 6c 73 65   zUnicode;.#else
6b20: 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20  .  return (void 
6b30: 2a 29 7a 55 74 66 38 3b 20 20 2f 2a 20 4e 6f 2d  *)zUtf8;  /* No-
6b40: 6f 70 20 6f 6e 20 75 6e 69 78 20 2a 2f 0a 23 65  op on unix */.#e
6b50: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
6b60: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
6b70: 66 20 61 6e 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  f an environment
6b80: 20 76 61 72 69 61 62 6c 65 20 61 73 20 55 54 46   variable as UTF
6b90: 38 2e 0a 2a 2f 0a 63 68 61 72 20 2a 66 6f 73 73  8..*/.char *foss
6ba0: 69 6c 5f 67 65 74 65 6e 76 28 63 6f 6e 73 74 20  il_getenv(const 
6bb0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 23 69  char *zName){.#i
6bc0: 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 77 63  fdef _WIN32.  wc
6bd0: 68 61 72 5f 74 20 2a 75 4e 61 6d 65 20 3d 20 66  har_t *uName = f
6be0: 6f 73 73 69 6c 5f 75 74 66 38 5f 74 6f 5f 75 6e  ossil_utf8_to_un
6bf0: 69 63 6f 64 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  icode(zName);.  
6c00: 76 6f 69 64 20 2a 7a 56 61 6c 75 65 20 3d 20 5f  void *zValue = _
6c10: 77 67 65 74 65 6e 76 28 75 4e 61 6d 65 29 3b 0a  wgetenv(uName);.
6c20: 20 20 66 6f 73 73 69 6c 5f 6d 62 63 73 5f 66 72    fossil_mbcs_fr
6c30: 65 65 28 75 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ee(uName);.  if(
6c40: 20 7a 56 61 6c 75 65 20 29 20 7a 56 61 6c 75 65   zValue ) zValue
6c50: 20 3d 20 66 6f 73 73 69 6c 5f 75 6e 69 63 6f 64   = fossil_unicod
6c60: 65 5f 74 6f 5f 75 74 66 38 28 7a 56 61 6c 75 65  e_to_utf8(zValue
6c70: 29 3b 0a 23 65 6c 73 65 0a 20 20 63 68 61 72 20  );.#else.  char 
6c80: 2a 7a 56 61 6c 75 65 20 3d 20 67 65 74 65 6e 76  *zValue = getenv
6c90: 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  (zName);.#endif.
6ca0: 20 20 72 65 74 75 72 6e 20 7a 56 61 6c 75 65 3b    return zValue;
6cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c  .}../*.** Transl
6cc0: 61 74 65 20 55 54 46 38 20 74 6f 20 4d 42 43 53  ate UTF8 to MBCS
6cd0: 20 66 6f 72 20 64 69 73 70 6c 61 79 20 6f 6e 20   for display on 
6ce0: 74 68 65 20 63 6f 6e 73 6f 6c 65 2e 20 20 52 65  the console.  Re
6cf0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6d00: 6f 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 6c 61  o the.** transla
6d10: 74 65 64 20 74 65 78 74 2e 2e 20 20 43 61 6c 6c  ted text..  Call
6d20: 20 66 6f 73 73 69 6c 5f 6d 62 63 73 5f 66 72 65   fossil_mbcs_fre
6d30: 65 28 29 20 74 6f 20 64 65 61 6c 6c 6f 63 61 74  e() to deallocat
6d40: 65 20 61 6e 79 20 6d 65 6d 6f 72 79 0a 2a 2a 20  e any memory.** 
6d50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
6d60: 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
6d70: 65 72 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 2a 2f  er when done..*/
6d80: 0a 63 68 61 72 20 2a 66 6f 73 73 69 6c 5f 75 74  .char *fossil_ut
6d90: 66 38 5f 74 6f 5f 63 6f 6e 73 6f 6c 65 28 63 6f  f8_to_console(co
6da0: 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 29  nst char *zUtf8)
6db0: 7b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a  {.#ifdef _WIN32.
6dc0: 20 20 69 6e 74 20 6e 43 68 61 72 2c 20 6e 42 79    int nChar, nBy
6dd0: 74 65 3b 0a 20 20 57 43 48 41 52 20 2a 7a 55 6e  te;.  WCHAR *zUn
6de0: 69 63 6f 64 65 3b 20 20 20 2f 2a 20 55 6e 69 63  icode;   /* Unic
6df0: 6f 64 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 7a  ode version of z
6e00: 55 74 66 38 20 2a 2f 0a 20 20 63 68 61 72 20 2a  Utf8 */.  char *
6e10: 7a 43 6f 6e 73 6f 6c 65 3b 20 20 20 20 2f 2a 20  zConsole;    /* 
6e20: 43 6f 6e 73 6f 6c 65 20 76 65 72 73 69 6f 6e 20  Console version 
6e30: 6f 66 20 7a 55 74 66 38 20 2a 2f 0a 20 20 69 6e  of zUtf8 */.  in
6e40: 74 20 63 6f 64 65 70 61 67 65 3b 20 20 20 20 20  t codepage;     
6e50: 20 2f 2a 20 43 6f 6e 73 6f 6c 65 20 63 6f 64 65   /* Console code
6e60: 20 70 61 67 65 20 2a 2f 0a 0a 20 20 6e 43 68 61   page */..  nCha
6e70: 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57  r = MultiByteToW
6e80: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
6e90: 20 30 2c 20 7a 55 74 66 38 2c 20 2d 31 2c 20 4e   0, zUtf8, -1, N
6ea0: 55 4c 4c 2c 20 30 29 3b 0a 20 20 7a 55 6e 69 63  ULL, 0);.  zUnic
6eb0: 6f 64 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 43  ode = malloc( nC
6ec0: 68 61 72 2a 73 69 7a 65 6f 66 28 7a 55 6e 69 63  har*sizeof(zUnic
6ed0: 6f 64 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ode[0]) );.  if(
6ee0: 20 7a 55 6e 69 63 6f 64 65 3d 3d 30 20 29 7b 0a   zUnicode==0 ){.
6ef0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6f00: 7d 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74  }.  nChar = Mult
6f10: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
6f20: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 55 74 66  CP_UTF8, 0, zUtf
6f30: 38 2c 20 2d 31 2c 20 7a 55 6e 69 63 6f 64 65 2c  8, -1, zUnicode,
6f40: 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e   nChar);.  if( n
6f50: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 66  Char==0 ){.    f
6f60: 72 65 65 28 7a 55 6e 69 63 6f 64 65 29 3b 0a 20  ree(zUnicode);. 
6f70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6f80: 0a 20 20 63 6f 64 65 70 61 67 65 20 3d 20 47 65  .  codepage = Ge
6f90: 74 43 6f 6e 73 6f 6c 65 43 50 28 29 3b 0a 20 20  tConsoleCP();.  
6fa0: 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 72  nByte = WideChar
6fb0: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
6fc0: 70 61 67 65 2c 20 30 2c 20 7a 55 6e 69 63 6f 64  page, 0, zUnicod
6fd0: 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  e, -1, 0, 0, 0, 
6fe0: 30 29 3b 0a 20 20 7a 43 6f 6e 73 6f 6c 65 20 3d  0);.  zConsole =
6ff0: 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29   malloc( nByte )
7000: 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 73 6f 6c 65  ;.  if( zConsole
7010: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28  ==0 ){.    free(
7020: 7a 55 6e 69 63 6f 64 65 29 3b 0a 20 20 20 20 72  zUnicode);.    r
7030: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
7040: 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54  Byte = WideCharT
7050: 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70  oMultiByte(codep
7060: 61 67 65 2c 20 30 2c 20 7a 55 6e 69 63 6f 64 65  age, 0, zUnicode
7070: 2c 20 2d 31 2c 20 7a 43 6f 6e 73 6f 6c 65 2c 20  , -1, zConsole, 
7080: 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20  nByte, 0, 0);.  
7090: 66 72 65 65 28 7a 55 6e 69 63 6f 64 65 29 3b 0a  free(zUnicode);.
70a0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
70b0: 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f   ){.    free(zCo
70c0: 6e 73 6f 6c 65 29 3b 0a 20 20 20 20 7a 43 6f 6e  nsole);.    zCon
70d0: 73 6f 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  sole = 0;.  }.  
70e0: 72 65 74 75 72 6e 20 7a 43 6f 6e 73 6f 6c 65 3b  return zConsole;
70f0: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
7100: 28 63 68 61 72 2a 29 7a 55 74 66 38 3b 20 20 2f  (char*)zUtf8;  /
7110: 2a 20 4e 6f 2d 6f 70 20 6f 6e 20 75 6e 69 78 20  * No-op on unix 
7120: 2a 2f 0a 23 65 6e 64 69 66 20 20 0a 7d 0a 0a 2f  */.#endif  .}../
7130: 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 4d  *.** Translate M
7140: 42 43 53 20 74 6f 20 55 54 46 38 2e 20 20 52 65  BCS to UTF8.  Re
7150: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2e 20  turn a pointer. 
7160: 20 43 61 6c 6c 20 66 6f 73 73 69 6c 5f 6d 62 63   Call fossil_mbc
7170: 73 5f 66 72 65 65 28 29 0a 2a 2a 20 74 6f 20 64  s_free().** to d
7180: 65 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6d 65  eallocate any me
7190: 6d 6f 72 79 20 75 73 65 64 20 74 6f 20 73 74 6f  mory used to sto
71a0: 72 65 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  re the returned 
71b0: 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 64 6f 6e  pointer when don
71c0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 66 6f 73 73 69  e..*/.void fossi
71d0: 6c 5f 6d 62 63 73 5f 66 72 65 65 28 76 6f 69 64  l_mbcs_free(void
71e0: 20 2a 7a 4f 6c 64 29 7b 0a 23 69 66 64 65 66 20   *zOld){.#ifdef 
71f0: 5f 57 49 4e 33 32 0a 20 20 65 78 74 65 72 6e 20  _WIN32.  extern 
7200: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 66 72 65  void sqlite3_fre
7210: 65 28 76 6f 69 64 2a 29 3b 0a 20 20 73 71 6c 69  e(void*);.  sqli
7220: 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a  te3_free(zOld);.
7230: 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 2d 6f 70  #else.  /* No-op
7240: 20 6f 6e 20 75 6e 69 78 20 2a 2f 0a 23 65 6e 64   on unix */.#end
7250: 69 66 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69  if  .}../*.** Li
7260: 6b 65 20 66 6f 70 65 6e 28 29 20 62 75 74 20 61  ke fopen() but a
7270: 6c 77 61 79 73 20 74 61 6b 65 73 20 61 20 55 54  lways takes a UT
7280: 46 38 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  F8 argument..*/.
7290: 46 49 4c 45 20 2a 66 6f 73 73 69 6c 5f 66 6f 70  FILE *fossil_fop
72a0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
72b0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
72c0: 20 2a 7a 4d 6f 64 65 29 7b 0a 23 69 66 64 65 66   *zMode){.#ifdef
72d0: 20 5f 57 49 4e 33 32 0a 20 20 77 63 68 61 72 5f   _WIN32.  wchar_
72e0: 74 20 2a 75 4d 6f 64 65 20 3d 20 66 6f 73 73 69  t *uMode = fossi
72f0: 6c 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64  l_utf8_to_unicod
7300: 65 28 7a 4d 6f 64 65 29 3b 0a 20 20 77 63 68 61  e(zMode);.  wcha
7310: 72 5f 74 20 2a 75 4e 61 6d 65 20 3d 20 66 6f 73  r_t *uName = fos
7320: 73 69 6c 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63  sil_utf8_to_unic
7330: 6f 64 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 46 49  ode(zName);.  FI
7340: 4c 45 20 2a 66 20 3d 20 5f 77 66 6f 70 65 6e 28  LE *f = _wfopen(
7350: 75 4e 61 6d 65 2c 20 75 4d 6f 64 65 29 3b 0a 20  uName, uMode);. 
7360: 20 66 6f 73 73 69 6c 5f 6d 62 63 73 5f 66 72 65   fossil_mbcs_fre
7370: 65 28 75 4e 61 6d 65 29 3b 0a 20 20 66 6f 73 73  e(uName);.  foss
7380: 69 6c 5f 6d 62 63 73 5f 66 72 65 65 28 75 4d 6f  il_mbcs_free(uMo
7390: 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 46 49 4c  de);.#else.  FIL
73a0: 45 20 2a 66 20 3d 20 66 6f 70 65 6e 28 7a 4e 61  E *f = fopen(zNa
73b0: 6d 65 2c 20 7a 4d 6f 64 65 29 3b 0a 23 65 6e 64  me, zMode);.#end
73c0: 69 66 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d  if.  return f;.}
73d0: 0a                                               .