|  | History uses fts3 with an icu-based segmenter.  These changes allow | 
|  | building a sqlite3 binary which can read those files. | 
|  |  | 
|  | Index: src/shell.c | 
|  | =================================================================== | 
|  | --- src/shell.c	2009-09-04 13:37:43.000000000 -0700 | 
|  | +++ src/shell.c	2009-09-15 11:32:08.000000000 -0700 | 
|  | @@ -3007,6 +3007,14 @@ | 
|  | int i; | 
|  | int rc = 0; | 
|  |  | 
|  | +  /* Begin evanm patch. */ | 
|  | +  extern int sqlite_shell_init_icu(); | 
|  | +  if( !sqlite_shell_init_icu() ){ | 
|  | +    fprintf(stderr, "%s: warning: couldn't find icudt38.dll; " | 
|  | +                    "queries against ICU FTS tables will fail.\n", argv[0]); | 
|  | +  } | 
|  | +  /* End evanm patch. */ | 
|  | + | 
|  | Argv0 = argv[0]; | 
|  | main_init(&data); | 
|  | stdin_is_interactive = isatty(0); | 
|  | diff --git src/shell_icu_linux.c src/shell_icu_linux.c | 
|  | new file mode 100644 | 
|  | index 0000000..4ad0e42 | 
|  | --- /dev/null | 
|  | +++ src/shell_icu_linux.c | 
|  | @@ -0,0 +1,27 @@ | 
|  | +/* Copyright 2007 Google Inc. All Rights Reserved. | 
|  | +**/ | 
|  | + | 
|  | +#include <limits.h> | 
|  | +#include <unistd.h> | 
|  | +#include "unicode/putil.h" | 
|  | +#include "unicode/udata.h" | 
|  | + | 
|  | +/* | 
|  | +** This function attempts to load the ICU data tables from a data file. | 
|  | +** Returns 0 on failure, nonzero on success. | 
|  | +** This a hack job of icu_utils.cc:Initialize().  It's Chrome-specific code. | 
|  | +*/ | 
|  | +int sqlite_shell_init_icu() { | 
|  | +  char bin_dir[PATH_MAX + 1]; | 
|  | +  int bin_dir_size = readlink("/proc/self/exe", bin_dir, PATH_MAX); | 
|  | +  if (bin_dir_size < 0 || bin_dir_size > PATH_MAX) | 
|  | +    return 0; | 
|  | +  bin_dir[bin_dir_size] = 0;; | 
|  | + | 
|  | +  u_setDataDirectory(bin_dir); | 
|  | +  // Only look for the packaged data file; | 
|  | +  // the default behavior is to look for individual files. | 
|  | +  UErrorCode err = U_ZERO_ERROR; | 
|  | +  udata_setFileAccess(UDATA_ONLY_PACKAGES, &err); | 
|  | +  return err == U_ZERO_ERROR; | 
|  | +} | 
|  | Index: src/shell_icu_win.c | 
|  | =================================================================== | 
|  | --- src/shell_icu_win.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ src/shell_icu_win.c	2011-03-03 14:29:11.000000000 -0700 | 
|  | @@ -0,0 +1,32 @@ | 
|  | +/* Copyright 2011 Google Inc. All Rights Reserved. | 
|  | +**/ | 
|  | + | 
|  | +#include <windows.h> | 
|  | +#include "unicode/udata.h" | 
|  | + | 
|  | +/* | 
|  | +** This function attempts to load the ICU data tables from a DLL. | 
|  | +** Returns 0 on failure, nonzero on success. | 
|  | +** This a hack job of icu_utils.cc:Initialize().  It's Chrome-specific code. | 
|  | +*/ | 
|  | + | 
|  | +#define ICU_DATA_SYMBOL "icudt" U_ICU_VERSION_SHORT "_dat" | 
|  | +int sqlite_shell_init_icu() { | 
|  | +  HMODULE module; | 
|  | +  FARPROC addr; | 
|  | +  UErrorCode err; | 
|  | + | 
|  | +  // Chrome dropped U_ICU_VERSION_SHORT from the icu data dll name. | 
|  | +  module = LoadLibrary(L"icudt.dll"); | 
|  | +  if (!module) | 
|  | +    return 0; | 
|  | + | 
|  | +  addr = GetProcAddress(module, ICU_DATA_SYMBOL); | 
|  | +  if (!addr) | 
|  | +    return 0; | 
|  | + | 
|  | +  err = U_ZERO_ERROR; | 
|  | +  udata_setCommonData(addr, &err); | 
|  | + | 
|  | +  return 1; | 
|  | +} |