> Le 11 f?vr. 2016 ? 17:33, Olivier Mascia <om at integral.be> a ?crit : > > In between if any of you want to experiment with the path I followed, up to > now, here is a quick and dirty patch made on the amalgamation code from > https://www.sqlite.org/snapshot/sqlite-snapshot-201602101910.tar.gz
Inline patch here: Index: shell.c =================================================================== --- shell.c (revision 13558) +++ shell.c (working copy) @@ -486,8 +486,8 @@ /* For interactive input on Windows systems, translate the ** multi-byte characterset characters into UTF-8. */ if( stdin_is_interactive ){ - extern char *sqlite3_win32_mbcs_to_utf8(const char*); - char *zTrans = sqlite3_win32_mbcs_to_utf8(zLine); + extern char *sqlite3_win32_oem_to_utf8(const char*); + char *zTrans = sqlite3_win32_oem_to_utf8(zLine); if( zTrans ){ int nTrans = strlen30(zTrans)+1; if( nTrans>nLine ){ @@ -549,9 +549,9 @@ va_list ap; va_start(ap, zFormat); if( stdout_is_console && (out==stdout || out==stderr) ){ - extern char *sqlite3_win32_utf8_to_mbcs(const char*); + extern char *sqlite3_win32_utf8_to_oem(const char*); char *z1 = sqlite3_vmprintf(zFormat, ap); - char *z2 = sqlite3_win32_utf8_to_mbcs(z1); + char *z2 = sqlite3_win32_utf8_to_oem(z1); sqlite3_free(z1); fputs(z2, out); sqlite3_free(z2); @@ -2043,7 +2043,6 @@ */ static void open_db(ShellState *p, int keepAlive){ if( p->db==0 ){ - sqlite3_initialize(); sqlite3_open(p->zDbFilename, &p->db); globalDb = p->db; if( p->db && sqlite3_errcode(p->db)==SQLITE_OK ){ @@ -4538,7 +4537,6 @@ " cannot read ~/.sqliterc\n"); return; } - sqlite3_initialize(); zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir); sqliterc = zBuf; } @@ -4666,6 +4664,8 @@ int nCmd = 0; char **azCmd = 0; + sqlite3_initialize(); // Required early for sqlite3_malloc + #if USE_SYSTEM_SQLITE+0!=1 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){ utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n", @@ -4709,7 +4709,8 @@ z = argv[i]; if( z[0]!='-' ){ if( data.zDbFilename==0 ){ - data.zDbFilename = z; + extern char *sqlite3_win32_mbcs_to_utf8(const char*); + data.zDbFilename = sqlite3_win32_mbcs_to_utf8(z); }else{ /* Excesss arguments are interpreted as SQL (or dot-commands) and ** mean that nothing is read from stdin */ Index: sqlite3.c =================================================================== --- sqlite3.c (revision 13558) +++ sqlite3.c (working copy) @@ -36710,7 +36710,7 @@ } /* -** Convert an ANSI string to Microsoft Unicode, based on the +** Convert an MBCS filename string to Microsoft Unicode, based on the ** current codepage settings for file apis. ** ** Space to hold the returned string is obtained @@ -36740,6 +36740,34 @@ } /* +** Convert an OEM string to Microsoft Unicode. +** +** Space to hold the returned string is obtained +** from sqlite3_malloc. +*/ +static LPWSTR winOemToUnicode(const char *zText) { + int nByte; + LPWSTR zWideText; + + nByte = osMultiByteToWideChar(CP_OEMCP, 0, zText, -1, NULL, + 0)*sizeof(WCHAR); + if (nByte == 0) { + return 0; + } + zWideText = sqlite3MallocZero(nByte*sizeof(WCHAR)); + if (zWideText == 0) { + return 0; + } + nByte = osMultiByteToWideChar(CP_OEMCP, 0, zText, -1, zWideText, + nByte); + if (nByte == 0) { + sqlite3_free(zWideText); + zWideText = 0; + } + return zWideText; +} + +/* ** Convert Microsoft Unicode to multi-byte character string, based on the ** user's ANSI codepage. ** @@ -36769,6 +36797,33 @@ } /* +** Convert Microsoft Unicode to OEM character string. +** +** Space to hold the returned string is obtained from +** sqlite3_malloc(). +*/ +static char *winUnicodeToOem(LPCWSTR zWideText) { + int nByte; + char *zText; + + nByte = osWideCharToMultiByte(CP_OEMCP, 0, zWideText, -1, 0, 0, 0, 0); + if (nByte == 0) { + return 0; + } + zText = sqlite3MallocZero(nByte); + if (zText == 0) { + return 0; + } + nByte = osWideCharToMultiByte(CP_OEMCP, 0, zWideText, -1, zText, + nByte, 0, 0); + if (nByte == 0) { + sqlite3_free(zText); + zText = 0; + } + return zText; +} + +/* ** Convert multibyte character string to UTF-8. Space to hold the ** returned string is obtained from sqlite3_malloc(). */ @@ -36786,6 +36841,23 @@ } /* +** Convert OEM character string to UTF-8. Space to hold the +** returned string is obtained from sqlite3_malloc(). +*/ +SQLITE_API char *SQLITE_STDCALL sqlite3_win32_oem_to_utf8(const char *zText) { + char *zTextUtf8; + LPWSTR zTmpWide; + + zTmpWide = winOemToUnicode(zText); + if (zTmpWide == 0) { + return 0; + } + zTextUtf8 = winUnicodeToUtf8(zTmpWide); + sqlite3_free(zTmpWide); + return zTextUtf8; +} + +/* ** Convert UTF-8 to multibyte character string. Space to hold the ** returned string is obtained from sqlite3_malloc(). */ @@ -36803,6 +36875,23 @@ } /* +** Convert UTF-8 to OEM character string. Space to hold the +** returned string is obtained from sqlite3_malloc(). +*/ +SQLITE_API char *SQLITE_STDCALL sqlite3_win32_utf8_to_oem(const char *zText) { + char *zTextOem; + LPWSTR zTmpWide; + + zTmpWide = winUtf8ToUnicode(zText); + if (zTmpWide == 0) { + return 0; + } + zTextOem = winUnicodeToOem(zTmpWide); + sqlite3_free(zTmpWide); + return zTextOem; +} + +/* ** This function sets the data directory or the temporary directory based on ** the provided arguments. The type argument must be 1 in order to set the ** data directory or 2 in order to set the temporary directory. The zValue @@ -171600,7 +171689,7 @@ const char *zEnum, int *peVal ){ - int nEnum = strlen(zEnum); + int nEnum = (int)strlen(zEnum); int i; int iVal = -1; @@ -174752,7 +174841,7 @@ Fts5ExprTerm *pTerm; if( p->aPopulator[i].bOk==0 ) continue; for(pTerm=&pExpr->apExprPhrase[i]->aTerm[0]; pTerm; pTerm=pTerm->pSynonym){ - int nTerm = strlen(pTerm->zTerm); + int nTerm = (int)strlen(pTerm->zTerm); if( (nTerm==nToken || (nTerm<nToken && pTerm->bPrefix)) && memcmp(pTerm->zTerm, pToken, nTerm)==0 ){ -- Meilleures salutations, Met vriendelijke groeten, Best Regards, Olivier Mascia, integral.be/om -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 842 bytes Desc: Message signed with OpenPGP using GPGMail URL: <http://mailinglists.sqlite.org/cgi-bin/mailman/private/sqlite-users/attachments/20160211/f15ade0d/attachment.pgp>