ADDED .project
Index: .project
==================================================================
--- /dev/null
+++ .project
@@ -0,0 +1,11 @@
+
+
+ fossil
+
+
+
+
+
+
+
+
ADDED .settings/org.eclipse.core.resources.prefs
Index: .settings/org.eclipse.core.resources.prefs
==================================================================
--- /dev/null
+++ .settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/=UTF-8
ADDED .settings/org.eclipse.core.runtime.prefs
Index: .settings/org.eclipse.core.runtime.prefs
==================================================================
--- /dev/null
+++ .settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+line.separator=\n
Index: src/add.c
==================================================================
--- src/add.c
+++ src/add.c
@@ -39,11 +39,11 @@
*/
const char *fossil_reserved_name(int N){
/* Possible names of the local per-checkout database file and
** its associated journals
*/
- static const char *azName[] = {
+ static const char *const azName[] = {
"_FOSSIL_",
"_FOSSIL_-journal",
"_FOSSIL_-wal",
"_FOSSIL_-shm",
".fslckout",
@@ -61,11 +61,11 @@
};
/* Names of auxiliary files generated by SQLite when the "manifest"
** properity is enabled
*/
- static const char *azManifest[] = {
+ static const char *const azManifest[] = {
"manifest",
"manifest.uuid",
};
/* Cached setting "manifest" */
@@ -531,11 +531,11 @@
** See also: changes, status
*/
void mv_cmd(void){
int i;
int vid;
- char *zDest;
+ const char *zDest;
Blob dest;
Stmt q;
db_must_be_within_tree();
vid = db_lget_int("checkout", 0);
Index: src/allrepo.c
==================================================================
--- src/allrepo.c
+++ src/allrepo.c
@@ -199,11 +199,11 @@
/* If any repositories whose names appear in the ~/.fossil file could not
** be found, remove those names from the ~/.fossil file.
*/
if( bag_count(&outOfDate)>0 ){
Blob sql;
- char *zSep = "(";
+ const char *zSep = "(";
int rowid;
blob_zero(&sql);
blob_appendf(&sql, "DELETE FROM global_config WHERE rowid IN ");
for(rowid=bag_first(&outOfDate); rowid>0; rowid=bag_next(&outOfDate,rowid)){
blob_appendf(&sql, "%s%d", zSep, rowid);
Index: src/blob.c
==================================================================
--- src/blob.c
+++ src/blob.c
@@ -767,22 +767,16 @@
int blob_write_to_file(Blob *pBlob, const char *zFilename){
FILE *out;
int wrote;
if( zFilename[0]==0 || (zFilename[0]=='-' && zFilename[1]==0) ){
- int n;
+ int n = blob_size(pBlob);
#if defined(_WIN32)
- if( _isatty(fileno(stdout)) ){
- char *z;
- z = fossil_utf8_to_console(blob_str(pBlob));
- n = strlen(z);
- fwrite(z, 1, n, stdout);
- free(z);
+ if( fossil_utf8_to_console(blob_buffer(pBlob), n, 0) >= 0 ){
return n;
}
#endif
- n = blob_size(pBlob);
fwrite(blob_buffer(pBlob), 1, n, stdout);
return n;
}else{
int i, nName;
char *zName, zBuf[1000];
Index: src/branch.c
==================================================================
--- src/branch.c
+++ src/branch.c
@@ -165,11 +165,11 @@
"\n"
"Note: the local check-out has not been updated to the new\n"
" branch. To begin working on the new branch, do this:\n"
"\n"
" %s update %s\n",
- fossil_nameofexe(), zBranch
+ g.argv[0], zBranch
);
}
/* Commit */
Index: src/captcha.c
==================================================================
--- src/captcha.c
+++ src/captcha.c
@@ -98,11 +98,11 @@
}
#endif /* CAPTCHA==1 */
#if CAPTCHA==2
-static const char *azFont2[] = {
+static const char *const azFont2[] = {
/* 0 */
" __ ",
" / \\ ",
"| () |",
" \\__/ ",
@@ -223,11 +223,11 @@
return z;
}
#endif /* CAPTCHA==2 */
#if CAPTCHA==3
-static const char *azFont3[] = {
+static const char *const azFont3[] = {
/* 0 */
" ___ ",
" / _ \\ ",
"| | | |",
"| | | |",
Index: src/cgi.c
==================================================================
--- src/cgi.c
+++ src/cgi.c
@@ -1355,13 +1355,13 @@
/*
** Name of days and months.
*/
-static const char *azDays[] =
+static const char *const azDays[] =
{"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", 0};
-static const char *azMonths[] =
+static const char *const azMonths[] =
{"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec", 0};
/*
Index: src/checkout.c
==================================================================
--- src/checkout.c
+++ src/checkout.c
@@ -186,11 +186,11 @@
*/
void checkout_cmd(void){
int forceFlag; /* Force checkout even if edits exist */
int keepFlag; /* Do not change any files on disk */
int latestFlag; /* Checkout the latest version */
- char *zVers; /* Version to checkout */
+ const char *zVers; /* Version to checkout */
int promptFlag; /* True to prompt before overwriting */
int vid, prior;
Blob cksum1, cksum1b, cksum2;
db_must_be_within_tree();
Index: src/clearsign.c
==================================================================
--- src/clearsign.c
+++ src/clearsign.c
@@ -28,11 +28,11 @@
*/
int clearsign(Blob *pIn, Blob *pOut){
char *zRand;
char *zIn;
char *zOut;
- char *zBase = db_get("pgp-command", "gpg --clearsign -o ");
+ const char *zBase = db_get("pgp-command", "gpg --clearsign -o ");
char *zCmd;
int rc;
if( is_false(zBase) ){
return 0;
}
Index: src/configure.c
==================================================================
--- src/configure.c
+++ src/configure.c
@@ -916,11 +916,11 @@
}
}
db_end_transaction(0);
fossil_print("Configuration reset to factory defaults.\n");
fossil_print("To recover, use: %s %s import %s\n",
- fossil_nameofexe(), g.argv[1], zBackup);
+ g.argv[0], g.argv[1], zBackup);
}else
{
fossil_fatal("METHOD should be one of:"
" export import merge pull push reset");
}
Index: src/db.c
==================================================================
--- src/db.c
+++ src/db.c
@@ -92,11 +92,13 @@
g.cgiOutput = 0;
cgi_printf("Database Error
\n"
"%h
%s
", z, zRebuildMsg);
cgi_reply();
}else{
- fprintf(stderr, "%s: %s\n\n%s", fossil_nameofexe(), z, zRebuildMsg);
+ char *zOut = mprintf("%s: %s\n\n%s", g.argv[0], z, zRebuildMsg);
+ fossil_puts(zOut, 1);
+ fossil_free(zOut);
}
free(z);
db_force_rollback();
fossil_exit(rc);
}
Index: src/diff.c
==================================================================
--- src/diff.c
+++ src/diff.c
@@ -1649,11 +1649,11 @@
** being annotated. Do another step of the annotation. Return true
** if additional annotation is required. zPName is the tag to insert
** on each line of the file being annotated that was contributed by
** pParent. Memory to hold zPName is leaked.
*/
-static int annotation_step(Annotator *p, Blob *pParent, char *zPName){
+static int annotation_step(Annotator *p, Blob *pParent, const char *zPName){
int i, j;
int lnTo;
int iPrevLevel;
int iThisLevel;
Index: src/diffcmd.c
==================================================================
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -287,12 +287,12 @@
int isDeleted = db_column_int(&q, 1);
int isChnged = db_column_int(&q,2);
int isNew = db_column_int(&q,3);
int srcid = db_column_int(&q, 4);
int isLink = db_column_int(&q, 5);
- char *zFullName = mprintf("%s%s", g.zLocalRoot, zPathname);
- char *zToFree = zFullName;
+ char *zToFree = mprintf("%s%s", g.zLocalRoot, zPathname);
+ const char *zFullName = zToFree;
int showDiff = 1;
if( isDeleted ){
fossil_print("DELETED %s\n", zPathname);
if( !asNewFile ){ showDiff = 0; zFullName = NULL_DEVICE; }
}else if( file_access(zFullName, 0) ){
Index: src/file.c
==================================================================
--- src/file.c
+++ src/file.c
@@ -1116,47 +1116,70 @@
#endif
return zValue;
}
/*
-** Translate UTF8 to MBCS for display on the console. Return a pointer to the
-** translated text.. Call fossil_mbcs_free() to deallocate any memory
-** used to store the returned pointer when done.
+** Display UTF8 on the console. Return the number of
+** Characters written. If stdout or stderr is redirected
+** to a file, -1 is returned and nothing is written
+** to the console.
*/
-char *fossil_utf8_to_console(const char *zUtf8){
+int fossil_utf8_to_console(const char *zUtf8, int nByte, int toStdErr){
#ifdef _WIN32
- int nChar, nByte;
- WCHAR *zUnicode; /* Unicode version of zUtf8 */
+ int nChar;
+ wchar_t *zUnicode; /* Unicode version of zUtf8 */
+#ifdef UNICODE
+ DWORD dummy;
+#else
char *zConsole; /* Console version of zUtf8 */
int codepage; /* Console code page */
+#endif
+
+ static int istty[2] = { -1, -1 };
+ if( istty[toStdErr] == -1 ){
+ istty[toStdErr] = _isatty(toStdErr + 1) != 0;
+ }
+ if( !istty[toStdErr] ){
+ /* stdout/stderr is not a console. */
+ return -1;
+ }
- nChar = MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, NULL, 0);
- zUnicode = malloc( nChar*sizeof(zUnicode[0]) );
+ nChar = MultiByteToWideChar(CP_UTF8, 0, zUtf8, nByte, NULL, 0);
+ zUnicode = malloc( (nChar + 1) *sizeof(zUnicode[0]) );
if( zUnicode==0 ){
return 0;
}
- nChar = MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, zUnicode, nChar);
+ nChar = MultiByteToWideChar(CP_UTF8, 0, zUtf8, nByte, zUnicode, nChar);
if( nChar==0 ){
free(zUnicode);
return 0;
}
+ zUnicode[nChar] = '\0';
+#ifdef UNICODE
+ WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE - toStdErr), zUnicode, nChar, &dummy, 0);
+#else /* !UNICODE */
codepage = GetConsoleCP();
- nByte = WideCharToMultiByte(codepage, 0, zUnicode, -1, 0, 0, 0, 0);
- zConsole = malloc( nByte );
+ nByte = WideCharToMultiByte(codepage, 0, zUnicode, nChar, 0, 0, 0, 0);
+ zConsole = malloc( nByte + 1);
if( zConsole==0 ){
free(zUnicode);
return 0;
}
- nByte = WideCharToMultiByte(codepage, 0, zUnicode, -1, zConsole, nByte, 0, 0);
+ nByte = WideCharToMultiByte(codepage, 0, zUnicode, nChar, zConsole, nByte, 0, 0);
+ zConsole[nByte] = '\0';
free(zUnicode);
if( nByte == 0 ){
free(zConsole);
zConsole = 0;
+ return 0;
}
- return zConsole;
+ fwrite(zConsole, 1, nByte, toStdErr ? stderr : stdout);
+ fflush(toStdErr ? stderr : stdout);
+#endif /* UNICODE */
+ return nChar;
#else
- return (char*)zUtf8; /* No-op on unix */
+ return -1; /* No-op on unix */
#endif
}
/*
** Translate MBCS to UTF8. Return a pointer. Call fossil_mbcs_free()
Index: src/http_socket.c
==================================================================
--- src/http_socket.c
+++ src/http_socket.c
@@ -66,11 +66,11 @@
}
/*
** Set the socket error message.
*/
-void socket_set_errmsg(char *zFormat, ...){
+void socket_set_errmsg(const char *zFormat, ...){
va_list ap;
socket_clear_errmsg();
va_start(ap, zFormat);
socketErrMsg = vmprintf(zFormat, ap);
va_end(ap);
Index: src/json.c
==================================================================
--- src/json.c
+++ src/json.c
@@ -348,11 +348,11 @@
if( 0 != rc ){
cson_value_free( v );
}
assert( (0==rc) && "Adding item to GC failed." );
if(0!=rc){
- fprintf(stderr,"%s: FATAL: alloc error.\n", fossil_nameofexe())
+ fprintf(stderr,"%s: FATAL: alloc error.\n", g.argv[0])
/* reminder: allocation error is the only reasonable cause of
error here, provided g.json.gc.a and v are not NULL.
*/
;
fossil_exit(1)/*not fossil_panic() b/c it might land us somewhere
@@ -1628,11 +1628,11 @@
if(!resp){
/* about the only error case here is out-of-memory. DO NOT
call fossil_panic() here because that calls this function.
*/
fprintf(stderr, "%s: Fatal error: could not allocate "
- "response object.\n", fossil_nameofexe());
+ "response object.\n", g.argv[0]);
fossil_exit(1);
}
if( g.isHTTP ){
if(alsoOutput){
json_send_response(resp);
Index: src/main.c
==================================================================
--- src/main.c
+++ src/main.c
@@ -331,28 +331,28 @@
db_close(0);
}
}
/*
-** Convert all arguments from mbcs to UTF-8. Then
+** Convert all arguments from mbcs (or unicode) to UTF-8. Then
** search g.argv for arguments "--args FILENAME". If found, then
** (1) remove the two arguments from g.argv
** (2) Read the file FILENAME
** (3) Use the contents of FILE to replace the two removed arguments:
** (a) Ignore blank lines in the file
** (b) Each non-empty line of the file is an argument, except
** (c) If the line begins with "-" and contains a space, it is broken
** into two arguments at the space.
*/
-static void expand_args_option(int argc, char **argv){
+static void expand_args_option(int argc, void *argv){
Blob file = empty_blob; /* Content of the file */
Blob line = empty_blob; /* One line of the file */
unsigned int nLine; /* Number of lines in the file*/
unsigned int i, j, k; /* Loop counters */
int n; /* Number of bytes in one line */
- char *z; /* General use string pointer */
- char **newArgv; /* New expanded g.argv under construction */
+ char *z; /* General use string pointer */
+ char **newArgv; /* New expanded g.argv under construction */
char const * zFileName; /* input file name */
FILE * zInFile; /* input FILE */
int foundBom = -1; /* -1= not searched yet, 0 = no; 1=yes */
#ifdef _WIN32
wchar_t buf[MAX_PATH];
@@ -361,11 +361,15 @@
g.argc = argc;
g.argv = argv;
#ifdef _WIN32
GetModuleFileNameW(NULL, buf, MAX_PATH);
g.argv[0] = fossil_unicode_to_utf8(buf);
+#ifdef UNICODE
+ for(i=1; ipNext;
for(p=pFirst; p && p!=pLast; p=p->pNext){
if( p->eType==TT_Id ){
static IdentTable sReserved;
static int isInit = 0;
- static char *aWords[] = { "char", "class",
+ static const char *const aWords[] = { "char", "class",
"const", "double", "enum", "extern", "EXPORT", "ET_PROC",
"float", "int", "long",
"PRIVATE", "PROTECTED", "PUBLIC",
"register", "static", "struct", "sizeof", "signed", "typedef",
"union", "volatile", "virtual", "void", };
@@ -3253,11 +3253,11 @@
/*
** The following text contains a few simple #defines that we want
** to be available to every file.
*/
-static char zInit[] =
+static const char zInit[] =
"#define INTERFACE 0\n"
"#define EXPORT_INTERFACE 0\n"
"#define LOCAL_INTERFACE 0\n"
"#define EXPORT\n"
"#define LOCAL static\n"
Index: src/makemake.tcl
==================================================================
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -334,14 +334,13 @@
#
#### Select one of MinGW, MinGW-64 (32-bit) or MinGW-w64 (64-bit) compilers.
# By default, this is an empty string (i.e. use the native compiler).
#
-PREFIX =
# PREFIX = mingw32-
# PREFIX = i686-pc-mingw32-
-# PREFIX = i686-w64-mingw32-
+PREFIX = i686-w64-mingw32-
# PREFIX = x86_64-w64-mingw32-
#### The toplevel directory of the source tree. Fossil can be built
# in a directory that is separate from the source tree. Just change
# the following to point from the build directory to the src/ folder.
@@ -425,11 +424,11 @@
# will run on the target platform. This is usually the same
# as BCC, unless you are cross-compiling. This C compiler builds
# the finished binary for fossil. The BCC compiler above is used
# for building intermediate code-generator tools.
#
-TCC = $(PREFIX)gcc -Os -Wall -L$(ZLIBDIR) -I$(ZINCDIR)
+TCC = $(PREFIX)gcc -Os -Wall -DUNICODE -D_UNICODE -L$(ZLIBDIR) -I$(ZINCDIR)
#### Compile resources for use in building executables that will run
# on the target platform.
#
RCC = $(PREFIX)windres -I$(SRCDIR) -I$(ZINCDIR)
@@ -496,15 +495,17 @@
ifdef FOSSIL_ENABLE_TCL
LIB += -lnetapi32 -lkernel32 -luser32 -ladvapi32 -lws2_32
else
LIB += -lkernel32 -lws2_32
endif
+
+LIB += -municode
#### Tcl shell for use in running the fossil test suite. This is only
# used for testing.
#
-TCLSH = tclsh
+TCLSH = tclsh86
#### Nullsoft installer MakeNSIS location
#
MAKENSIS = "$(ProgramFiles)\NSIS\MakeNSIS.exe"
@@ -894,11 +895,11 @@
ZLIBDIR = $(MSCDIR)\extra\lib
ZLIB = zlib.lib
INCL = -I. -I$(SRCDIR) -I$B\win\include -I$(MSCDIR)\extra\include -I$(ZINCDIR)
-CFLAGS = -nologo -MT -O2
+CFLAGS = -nologo -MT -O2 -DUNICODE -D_UNICODE
BCC = $(CC) $(CFLAGS)
TCC = $(CC) -c $(CFLAGS) $(MSCDEF) $(SSL) $(INCL)
LIBS = $(ZLIB) ws2_32.lib advapi32.lib $(SSLLIB)
LIBDIR = -LIBPATH:$(MSCDIR)\extra\lib -LIBPATH:$(ZLIBDIR)
}
Index: src/printf.c
==================================================================
--- src/printf.c
+++ src/printf.c
@@ -814,25 +814,16 @@
** if the output is going to the screen. If output is redirected into
** a file, no translation occurs. No translation ever occurs on unix.
*/
void fossil_puts(const char *z, int toStdErr){
#if defined(_WIN32)
- static int once = 1;
- static int istty[2];
- char *zToFree = 0;
- if( once ){
- istty[0] = _isatty(fileno(stdout));
- istty[1] = _isatty(fileno(stderr));
- once = 0;
- }
- assert( toStdErr==0 || toStdErr==1 );
- if( istty[toStdErr] ) z = zToFree = fossil_utf8_to_console(z);
- fwrite(z, 1, strlen(z), toStdErr ? stderr : stdout);
- free(zToFree);
-#else
- fwrite(z, 1, strlen(z), toStdErr ? stderr : stdout);
-#endif
+ if( fossil_utf8_to_console(z, strlen(z), toStdErr) >= 0 ){
+ return;
+ }
+#endif
+ assert( toStdErr==0 || toStdErr==1 );
+ fwrite(z, 1, strlen(z), toStdErr ? stderr : stdout);
fflush(toStdErr ? stderr : stdout);
}
/*
** Write output for user consumption. If g.cgiOutput is enabled, then
Index: src/rebuild.c
==================================================================
--- src/rebuild.c
+++ src/rebuild.c
@@ -608,11 +608,11 @@
if( activateWal ){
db_multi_exec("PRAGMA journal_mode=WAL;");
}
}
if( showStats ){
- static struct { int idx; const char *zLabel; } aStat[] = {
+ static const struct { int idx; const char *zLabel; } aStat[] = {
{ CFTYPE_ANY, "Artifacts:" },
{ CFTYPE_MANIFEST, "Manifests:" },
{ CFTYPE_CLUSTER, "Clusters:" },
{ CFTYPE_CONTROL, "Tags:" },
{ CFTYPE_WIKI, "Wikis:" },
@@ -816,11 +816,11 @@
/*
** Recursively read all files from the directory zPath and install
** every file read as a new artifact in the repository.
*/
-void recon_read_dir(char *zPath){
+void recon_read_dir(const char *zPath){
FOSSIL_DIR *d;
struct fossil_dirent *pEntry;
Blob aContent; /* content of the just read artifact */
static int nFileRead = 0;
void *zUnicodePath;
Index: src/report.c
==================================================================
--- src/report.c
+++ src/report.c
@@ -170,11 +170,11 @@
case SQLITE_SELECT:
case SQLITE_FUNCTION: {
break;
}
case SQLITE_READ: {
- static const char *azAllowed[] = {
+ static const char *const azAllowed[] = {
"ticket",
"blob",
"filename",
"mlink",
"plink",
Index: src/shell.c
==================================================================
--- src/shell.c
+++ src/shell.c
@@ -451,11 +451,11 @@
#define MODE_Insert 5 /* Generate SQL "insert" statements */
#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
#define MODE_Csv 7 /* Quote strings, numbers are plain */
#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
-static const char *modeDescr[] = {
+static const char *const modeDescr[] = {
"line",
"column",
"list",
"semi",
"html",
@@ -1381,11 +1381,11 @@
}
/*
** Text of a help message
*/
-static char zHelp[] =
+static const char zHelp[] =
".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
".bail ON|OFF Stop after hitting an error. Default OFF\n"
".databases List names and files of attached databases\n"
".dump ?TABLE? ... Dump the database in an SQL text format\n"
" If TABLE specified, only dump tables matching\n"
@@ -1436,11 +1436,11 @@
".trace FILE|off Output each SQL statement as it is run\n"
".vfsname ?AUX? Print the name of the VFS stack\n"
".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
;
-static char zTimerHelp[] =
+static const char zTimerHelp[] =
".timer ON|OFF Turn the CPU timer measurement on or off\n"
;
/* Forward reference */
static int process_input(struct callback_data *p, FILE *in);
Index: src/tag.c
==================================================================
--- src/tag.c
+++ src/tag.c
@@ -398,11 +398,11 @@
if( n==0 ){
goto tag_cmd_usage;
}
if( strncmp(g.argv[2],"add",n)==0 ){
- char *zValue;
+ const char *zValue;
const char *zDateOvrd = find_option("date-override",0,1);
const char *zUserOvrd = find_option("user-override",0,1);
if( g.argc!=5 && g.argc!=6 ){
usage("add ?--raw? ?--propagate? TAGNAME CHECK-IN ?VALUE?");
}
Index: src/th.c
==================================================================
--- src/th.c
+++ src/th.c
@@ -2296,11 +2296,11 @@
** { } [ ] \ ; ' "
**
** " 0x22
**
*/
-static unsigned char aCharProp[256] = {
+static const unsigned char aCharProp[256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, /* 0x0. */
0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1. */
5, 4, 20, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /* 0x2. */
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 20, 4, 4, 4, 4, /* 0x3. */
4, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* 0x4. */
Index: src/timeline.c
==================================================================
--- src/timeline.c
+++ src/timeline.c
@@ -1455,11 +1455,11 @@
void timeline_cmd(void){
Stmt q;
int n, k;
const char *zCount;
const char *zType;
- char *zOrigin;
+ const char *zOrigin;
char *zDate;
Blob sql;
int objid = 0;
Blob uuid;
int mode = 0 ; /* 0:none 1: before 2:after 3:children 4:parents */
Index: src/tkt.c
==================================================================
--- src/tkt.c
+++ src/tkt.c
@@ -26,13 +26,13 @@
** The list of database user-defined fields in the TICKET table.
** The real table also contains some addition fields for internal
** used. The internal-use fields begin with "tkt_".
*/
static int nField = 0;
-static char **azField = 0; /* Names of database fields */
-static char **azValue = 0; /* Original values */
-static char **azAppend = 0; /* Value to be appended */
+static const char **azField = 0; /* Names of database fields */
+static const char **azValue = 0; /* Original values */
+static const char **azAppend = 0; /* Value to be appended */
/*
** Compare two entries in azField for sorting purposes
*/
static int nameCmpr(const void *a, const void *b){
@@ -1117,23 +1117,24 @@
fossil_fatal("empty %s command aborted!",g.argv[2]);
}
getAllTicketFields();
/* read commandline and assign fields in the azValue array */
while( i0 && isspace(zOut[j-1]) ){ j--; }
zOut[j] = 0;
if( j<=0 && omitline ){
fprintf(out,"\n");
@@ -134,11 +156,16 @@
i++;
if( isspace(zLine[i]) ){ i++; }
indent = i;
for(j=0; zLine[i] && zLine[i]!='\r' && zLine[i]!='\n'; i++){
if( zLine[i]=='"' || zLine[i]=='\\' ){ zOut[j++] = '\\'; }
- zOut[j++] = zLine[i];
+ if (128 <= (unsigned char)zLine[i]) {
+ sprintf(&zOut[j], "\\0x%.2X", zLine[i] & 0xFF);
+ j += 5;
+ } else {
+ zOut[j++] = zLine[i];
+ }
if( zLine[i]!='%' || zLine[i+1]=='%' || zLine[i+1]==0 ) continue;
for(nC=1; zLine[i+nC] && zLine[i+nC]!='('; nC++){}
if( zLine[i+nC]!='(' || !isalpha(zLine[i+nC-1]) ) continue;
while( --nC ) zOut[j++] = zLine[++i];
zArg[nArg++] = ',';
Index: src/wiki.c
==================================================================
--- src/wiki.c
+++ src/wiki.c
@@ -963,11 +963,11 @@
manifest_destroy(pWiki);
return;
}else
if( strncmp(g.argv[2],"commit",n)==0
|| strncmp(g.argv[2],"create",n)==0 ){
- char *zPageName;
+ const char *zPageName;
Blob content;
if( g.argc!=4 && g.argc!=5 ){
usage("commit PAGENAME ?FILE?");
}
zPageName = g.argv[3];
Index: src/winhttp.c
==================================================================
--- src/winhttp.c
+++ src/winhttp.c
@@ -129,14 +129,20 @@
file_delete(zRequestFName);
file_delete(zReplyFName);
free(p);
}
+#if !defined(UNICODE)
+# define fossil_unicode_to_utf8 fossil_mbcs_to_utf8
+# define fossil_utf8_to_unicode fossil_utf8_to_mbcs
+#endif
+
/*
** Start a listening socket and process incoming HTTP requests on
** that socket.
*/
+
void win32_http_server(
int mnPort, int mxPort, /* Range of allowed TCP port numbers */
const char *zBrowser, /* Command to launch browser. (Or NULL) */
const char *zStopper, /* Stop server when this file is exists (Or NULL) */
const char *zNotFound, /* The --notfound option, or NULL */
@@ -146,11 +152,11 @@
SOCKET s = INVALID_SOCKET;
SOCKADDR_IN addr;
int idCnt = 0;
int iPort = mnPort;
Blob options;
- char zTmpPath[MAX_PATH];
+ TCHAR zTmpPath[MAX_PATH];
if( zStopper ) file_delete(zStopper);
blob_zero(&options);
if( zNotFound ){
blob_appendf(&options, " --notfound %s", zNotFound);
@@ -194,11 +200,11 @@
}
}
if( !GetTempPath(MAX_PATH, zTmpPath) ){
fossil_fatal("unable to get path to the temporary directory.");
}
- zTempPrefix = mprintf("%sfossil_server_P%d_", fossil_mbcs_to_utf8(zTmpPath), iPort);
+ zTempPrefix = mprintf("%sfossil_server_P%d_", fossil_unicode_to_utf8(zTmpPath), iPort);
fossil_print("Listening for HTTP requests on TCP port %d\n", iPort);
if( zBrowser ){
zBrowser = mprintf(zBrowser, iPort);
fossil_print("Launch webbrowser: %s\n", zBrowser);
fossil_system(zBrowser);
@@ -249,11 +255,11 @@
struct HttpService {
int port; /* Port on which the http server should run */
const char *zNotFound; /* The --notfound option, or NULL */
int flags; /* One or more HTTP_SERVER_ flags */
int isRunningAsService; /* Are we running as a service ? */
- const char *zServiceName; /* Name of the service */
+ const TCHAR *zServiceName;/* Name of the service */
SOCKET s; /* Socket on which the http server listens */
};
/*
** Variables used for running as windows service.
@@ -298,11 +304,11 @@
0,
NULL
);
}
if( nMsg ){
- zMsg = fossil_mbcs_to_utf8(tmp);
+ zMsg = fossil_unicode_to_utf8(tmp);
}else{
fossil_fatal("unable to get system error message.");
}
if( tmp ){
LocalFree((HLOCAL) tmp);
@@ -384,11 +390,11 @@
if( argc>0 ){
hsData.zServiceName = argv[0];
}
/* Register the service control handler function */
- sshStatusHandle = RegisterServiceCtrlHandler("", win32_http_service_ctrl);
+ sshStatusHandle = RegisterServiceCtrlHandler(TEXT(""), win32_http_service_ctrl);
if( !sshStatusHandle ){
win32_report_service_status(SERVICE_STOPPED, NO_ERROR, 0);
return;
}
@@ -429,11 +435,11 @@
const char *zNotFound, /* The --notfound option, or NULL */
int flags /* One or more HTTP_SERVER_ flags */
){
/* Define the service table. */
SERVICE_TABLE_ENTRY ServiceTable[] =
- {{"", (LPSERVICE_MAIN_FUNCTION)win32_http_service_main}, {NULL, NULL}};
+ {{TEXT(""), (LPSERVICE_MAIN_FUNCTION)win32_http_service_main}, {NULL, NULL}};
/* Initialize the HttpService structure. */
hsData.port = nPort;
hsData.zNotFound = zNotFound;
hsData.flags = flags;
@@ -447,11 +453,12 @@
}
}
return 0;
}
-/*
+#ifdef _WIN32
+/* dupe ifdef needed for mkindex
** COMMAND: winsrv*
** Usage: fossil winsrv METHOD ?SERVICE-NAME? ?OPTIONS?
**
** Where METHOD is one of: create delete show start stop.
**
@@ -565,11 +572,11 @@
if( strncmp(zMethod, "create", n)==0 ){
SC_HANDLE hScm;
SC_HANDLE hSvc;
SERVICE_DESCRIPTION
- svcDescr = {"Fossil - Distributed Software Configuration Management"};
+ svcDescr = {TEXT("Fossil - Distributed Software Configuration Management")};
char *zErrFmt = "unable to create service '%s': %s";
DWORD dwStartType = SERVICE_DEMAND_START;
const char *zDisplay = find_option("display", "D", 1);
const char *zStart = find_option("start", "S", 1);
const char *zUsername = find_option("username", "U", 1);
@@ -624,22 +631,22 @@
/* Create the service. */
hScm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if( !hScm ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
hSvc = CreateService(
hScm, /* Handle to the SCM */
- fossil_utf8_to_mbcs(zSvcName), /* Name of the service */
- fossil_utf8_to_mbcs(zDisplay), /* Display name */
+ fossil_utf8_to_unicode(zSvcName), /* Name of the service */
+ fossil_utf8_to_unicode(zDisplay), /* Display name */
SERVICE_ALL_ACCESS, /* Desired access */
SERVICE_WIN32_OWN_PROCESS, /* Service type */
dwStartType, /* Start type */
SERVICE_ERROR_NORMAL, /* Error control */
- fossil_utf8_to_mbcs(blob_str(&binPath)), /* Binary path */
+ fossil_utf8_to_unicode(blob_str(&binPath)), /* Binary path */
NULL, /* Load ordering group */
NULL, /* Tag value */
NULL, /* Service dependencies */
- fossil_utf8_to_mbcs(zUsername), /* Service account */
- fossil_utf8_to_mbcs(zPassword) /* Account password */
+ fossil_utf8_to_unicode(zUsername), /* Service account */
+ fossil_utf8_to_unicode(zPassword) /* Account password */
);
if( !hSvc ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
/* Set the service description. */
ChangeServiceConfig2(hSvc, SERVICE_CONFIG_DESCRIPTION, &svcDescr);
fossil_print("Service '%s' successfully created.\n", zSvcName);
@@ -658,11 +665,11 @@
}else if( g.argc>4 ){
fossil_fatal("to much arguments for delete method.");
}
hScm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if( !hScm ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
- hSvc = OpenService(hScm, fossil_utf8_to_mbcs(zSvcName), SERVICE_ALL_ACCESS);
+ hSvc = OpenService(hScm, fossil_utf8_to_unicode(zSvcName), SERVICE_ALL_ACCESS);
if( !hSvc ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
QueryServiceStatus(hSvc, &sstat);
if( sstat.dwCurrentState!=SERVICE_STOPPED ){
fossil_print("Stopping service '%s'", zSvcName);
if( sstat.dwCurrentState!=SERVICE_STOP_PENDING ){
@@ -695,28 +702,28 @@
SERVICE_STATUS sstat;
LPQUERY_SERVICE_CONFIG pSvcConfig;
LPSERVICE_DESCRIPTION pSvcDescr;
BOOL bStatus;
DWORD nRequired;
- char *zErrFmt = "unable to show service '%s': %s";
- static const char *zSvcTypes[] = {
+ const char *zErrFmt = "unable to show service '%s': %s";
+ static const char *const zSvcTypes[] = {
"Driver service",
"File system driver service",
"Service runs in its own process",
"Service shares a process with other services",
"Service can interact with the desktop"
};
const char *zSvcType = "";
- static char *zSvcStartTypes[] = {
+ static const char *const zSvcStartTypes[] = {
"Started by the system loader",
"Started by the IoInitSystem function",
"Started automatically by the service control manager",
"Started manually",
"Service cannot be started"
};
const char *zSvcStartType = "";
- static const char *zSvcStates[] = {
+ static const char *const zSvcStates[] = {
"Stopped", "Starting", "Stopping", "Running",
"Continue pending", "Pause pending", "Paused"
};
const char *zSvcState = "";
@@ -726,11 +733,11 @@
}else if( g.argc>4 ){
fossil_fatal("to much arguments for show method.");
}
hScm = OpenSCManager(NULL, NULL, GENERIC_READ);
if( !hScm ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
- hSvc = OpenService(hScm, fossil_utf8_to_mbcs(zSvcName), GENERIC_READ);
+ hSvc = OpenService(hScm, fossil_utf8_to_unicode(zSvcName), GENERIC_READ);
if( !hSvc ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
/* Get the service configuration */
bStatus = QueryServiceConfig(hSvc, NULL, 0, &nRequired);
if( !bStatus && GetLastError()!=ERROR_INSUFFICIENT_BUFFER ){
fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
@@ -778,19 +785,19 @@
case SERVICE_PAUSED: zSvcState = zSvcStates[6]; break;
}
/* Print service information to terminal */
fossil_print("Service name .......: %s\n", zSvcName);
fossil_print("Display name .......: %s\n",
- fossil_mbcs_to_utf8(pSvcConfig->lpDisplayName));
+ fossil_unicode_to_utf8(pSvcConfig->lpDisplayName));
fossil_print("Service description : %s\n",
- fossil_mbcs_to_utf8(pSvcDescr->lpDescription));
+ fossil_unicode_to_utf8(pSvcDescr->lpDescription));
fossil_print("Service type .......: %s.\n", zSvcType);
fossil_print("Service start type .: %s.\n", zSvcStartType);
fossil_print("Binary path name ...: %s\n",
- fossil_mbcs_to_utf8(pSvcConfig->lpBinaryPathName));
+ fossil_unicode_to_utf8(pSvcConfig->lpBinaryPathName));
fossil_print("Service username ...: %s\n",
- fossil_mbcs_to_utf8(pSvcConfig->lpServiceStartName));
+ fossil_unicode_to_utf8(pSvcConfig->lpServiceStartName));
fossil_print("Current state ......: %s.\n", zSvcState);
/* Cleanup */
fossil_free(pSvcConfig);
fossil_free(pSvcDescr);
CloseServiceHandle(hSvc);
@@ -808,11 +815,11 @@
}else if( g.argc>4 ){
fossil_fatal("to much arguments for start method.");
}
hScm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if( !hScm ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
- hSvc = OpenService(hScm, fossil_utf8_to_mbcs(zSvcName), SERVICE_ALL_ACCESS);
+ hSvc = OpenService(hScm, fossil_utf8_to_unicode(zSvcName), SERVICE_ALL_ACCESS);
if( !hSvc ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
QueryServiceStatus(hSvc, &sstat);
if( sstat.dwCurrentState!=SERVICE_RUNNING ){
fossil_print("Starting service '%s'", zSvcName);
if( sstat.dwCurrentState!=SERVICE_START_PENDING ){
@@ -844,11 +851,11 @@
}else if( g.argc>4 ){
fossil_fatal("to much arguments for stop method.");
}
hScm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if( !hScm ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
- hSvc = OpenService(hScm, fossil_utf8_to_mbcs(zSvcName), SERVICE_ALL_ACCESS);
+ hSvc = OpenService(hScm, fossil_utf8_to_unicode(zSvcName), SERVICE_ALL_ACCESS);
if( !hSvc ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
QueryServiceStatus(hSvc, &sstat);
if( sstat.dwCurrentState!=SERVICE_STOPPED ){
fossil_print("Stopping service '%s'", zSvcName);
if( sstat.dwCurrentState!=SERVICE_STOP_PENDING ){
@@ -872,7 +879,8 @@
fossil_fatal("METHOD should be one of:"
" create delete show start stop");
}
return;
}
+#endif /* _WIN32 */
#endif /* _WIN32 -- This code is for win32 only */
Index: src/xfer.c
==================================================================
--- src/xfer.c
+++ src/xfer.c
@@ -270,11 +270,11 @@
int rid, /* record id of the file to send */
int isPrivate, /* True if rid is a private artifact */
Blob *pContent, /* The content of the file to send */
Blob *pUuid /* The UUID of the file to send */
){
- static const char *azQuery[] = {
+ static const char *const azQuery[] = {
"SELECT pid FROM plink x"
" WHERE cid=%d"
" AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=pid)"
" AND NOT EXISTS(SELECT 1 FROM plink y"
" WHERE y.pid=x.cid AND y.cid=x.pid)",
ADDED test/世界/界世.txt
Index: test/世界/界世.txt
==================================================================
--- /dev/null
+++ test/世界/界世.txt
@@ -0,0 +1,1 @@
+Just some text
Index: win/Makefile.mingw
==================================================================
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -13,14 +13,13 @@
#
#### Select one of MinGW, MinGW-64 (32-bit) or MinGW-w64 (64-bit) compilers.
# By default, this is an empty string (i.e. use the native compiler).
#
-PREFIX =
# PREFIX = mingw32-
# PREFIX = i686-pc-mingw32-
-# PREFIX = i686-w64-mingw32-
+PREFIX = i686-w64-mingw32-
# PREFIX = x86_64-w64-mingw32-
#### The toplevel directory of the source tree. Fossil can be built
# in a directory that is separate from the source tree. Just change
# the following to point from the build directory to the src/ folder.
@@ -104,11 +103,11 @@
# will run on the target platform. This is usually the same
# as BCC, unless you are cross-compiling. This C compiler builds
# the finished binary for fossil. The BCC compiler above is used
# for building intermediate code-generator tools.
#
-TCC = $(PREFIX)gcc -Os -Wall -L$(ZLIBDIR) -I$(ZINCDIR)
+TCC = $(PREFIX)gcc -Os -Wall -DUNICODE -D_UNICODE -L$(ZLIBDIR) -I$(ZINCDIR)
#### Compile resources for use in building executables that will run
# on the target platform.
#
RCC = $(PREFIX)windres -I$(SRCDIR) -I$(ZINCDIR)
@@ -175,15 +174,17 @@
ifdef FOSSIL_ENABLE_TCL
LIB += -lnetapi32 -lkernel32 -luser32 -ladvapi32 -lws2_32
else
LIB += -lkernel32 -lws2_32
endif
+
+LIB += -municode
#### Tcl shell for use in running the fossil test suite. This is only
# used for testing.
#
-TCLSH = tclsh
+TCLSH = tclsh86
#### Nullsoft installer MakeNSIS location
#
MAKENSIS = "$(ProgramFiles)\NSIS\MakeNSIS.exe"
Index: win/Makefile.mingw.mistachkin
==================================================================
--- win/Makefile.mingw.mistachkin
+++ win/Makefile.mingw.mistachkin
@@ -13,14 +13,13 @@
#
#### Select one of MinGW, MinGW-64 (32-bit) or MinGW-w64 (64-bit) compilers.
# By default, this is an empty string (i.e. use the native compiler).
#
-PREFIX =
# PREFIX = mingw32-
# PREFIX = i686-pc-mingw32-
-# PREFIX = i686-w64-mingw32-
+PREFIX = i686-w64-mingw32-
# PREFIX = x86_64-w64-mingw32-
#### The toplevel directory of the source tree. Fossil can be built
# in a directory that is separate from the source tree. Just change
# the following to point from the build directory to the src/ folder.
@@ -104,11 +103,11 @@
# will run on the target platform. This is usually the same
# as BCC, unless you are cross-compiling. This C compiler builds
# the finished binary for fossil. The BCC compiler above is used
# for building intermediate code-generator tools.
#
-TCC = $(PREFIX)gcc -Os -Wall -L$(ZLIBDIR) -I$(ZINCDIR)
+TCC = $(PREFIX)gcc -Os -Wall -DUNICODE -D_UNICODE -L$(ZLIBDIR) -I$(ZINCDIR)
#### Compile resources for use in building executables that will run
# on the target platform.
#
RCC = $(PREFIX)windres -I$(SRCDIR) -I$(ZINCDIR)
@@ -175,15 +174,17 @@
ifdef FOSSIL_ENABLE_TCL
LIB += -lnetapi32 -lkernel32 -luser32 -ladvapi32 -lws2_32
else
LIB += -lkernel32 -lws2_32
endif
+
+LIB += -municode
#### Tcl shell for use in running the fossil test suite. This is only
# used for testing.
#
-TCLSH = tclsh
+TCLSH = tclsh86
#### Nullsoft installer MakeNSIS location
#
MAKENSIS = "$(ProgramFiles)\NSIS\MakeNSIS.exe"
Index: win/Makefile.msc
==================================================================
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -32,11 +32,11 @@
ZLIBDIR = $(MSCDIR)\extra\lib
ZLIB = zlib.lib
INCL = -I. -I$(SRCDIR) -I$B\win\include -I$(MSCDIR)\extra\include -I$(ZINCDIR)
-CFLAGS = -nologo -MT -O2
+CFLAGS = -nologo -MT -O2 -DUNICODE -D_UNICODE
BCC = $(CC) $(CFLAGS)
TCC = $(CC) -c $(CFLAGS) $(MSCDEF) $(SSL) $(INCL)
LIBS = $(ZLIB) ws2_32.lib advapi32.lib $(SSLLIB)
LIBDIR = -LIBPATH:$(MSCDIR)\extra\lib -LIBPATH:$(ZLIBDIR)