Added macros to convert between 32-bit ints and 64-bit ptrs to avoid compiler warnings. (CVS 5378)

FossilOrigin-Name: 6cdb6841ff4683e424ef394733da9c24f5602570
diff --git a/src/build.c b/src/build.c
index 1cff08b..926015f 100644
--- a/src/build.c
+++ b/src/build.c
@@ -22,7 +22,7 @@
 **     COMMIT
 **     ROLLBACK
 **
-** $Id: build.c,v 1.488 2008/07/08 19:34:07 drh Exp $
+** $Id: build.c,v 1.489 2008/07/08 22:28:49 shane Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -2302,7 +2302,7 @@
     regRowid = regIdxKey + pIndex->nColumn;
     j1 = sqlite3VdbeAddOp3(v, OP_IsNull, regIdxKey, 0, pIndex->nColumn);
     j2 = sqlite3VdbeAddOp4(v, OP_IsUnique, iIdx,
-                           0, regRowid, (char*)regRecord, P4_INT32);
+                           0, regRowid, SQLITE_INT_TO_PTR(regRecord), P4_INT32);
     sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CONSTRAINT, OE_Abort, 0,
                     "indexed columns are not unique", P4_STATIC);
     sqlite3VdbeJumpHere(v, j1);
diff --git a/src/func.c b/src/func.c
index 014d0af..47709ca 100644
--- a/src/func.c
+++ b/src/func.c
@@ -16,7 +16,7 @@
 ** sqliteRegisterBuildinFunctions() found at the bottom of the file.
 ** All other code has file scope.
 **
-** $Id: func.c,v 1.194 2008/06/18 15:34:10 drh Exp $
+** $Id: func.c,v 1.195 2008/07/08 22:28:49 shane Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -908,7 +908,7 @@
     }
   }
   if( nChar>0 ){
-    flags = (int)sqlite3_user_data(context);
+    flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
     if( flags & 1 ){
       while( nIn>0 ){
         int len;
@@ -1286,7 +1286,7 @@
   for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
     void *pArg;
     u8 argType = aFuncs[i].argType;
-    pArg = (void*)(int)argType;
+    pArg = SQLITE_INT_TO_PTR(argType);
     sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
         aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
     if( aFuncs[i].needCollSeq ){
@@ -1304,7 +1304,7 @@
   sqlite3AttachFunctions(db);
 #endif
   for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
-    void *pArg = (void*)(int)aAggs[i].argType;
+    void *pArg = SQLITE_INT_TO_PTR(aAggs[i].argType);
     sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8, 
         pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
     if( aAggs[i].needCollSeq ){
diff --git a/src/insert.c b/src/insert.c
index bada466..586775e 100644
--- a/src/insert.c
+++ b/src/insert.c
@@ -12,7 +12,7 @@
 ** This file contains C code routines that are called by the parser
 ** to handle INSERT statements in SQLite.
 **
-** $Id: insert.c,v 1.245 2008/07/08 19:34:07 drh Exp $
+** $Id: insert.c,v 1.246 2008/07/08 22:28:49 shane Exp $
 */
 #include "sqliteInt.h"
 
@@ -1258,7 +1258,7 @@
     regR = sqlite3GetTempReg(pParse);
     sqlite3VdbeAddOp2(v, OP_SCopy, regRowid-hasTwoRowids, regR);
     j3 = sqlite3VdbeAddOp4(v, OP_IsUnique, baseCur+iCur+1, 0,
-                           regR, (char*)aRegIdx[iCur],
+                           regR, SQLITE_INT_TO_PTR(aRegIdx[iCur]),
                            P4_INT32);
 
     /* Generate code that executes if the new index entry is not unique */
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index e56f6f5..103fd04 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -11,7 +11,7 @@
 *************************************************************************
 ** Internal interface definitions for SQLite.
 **
-** @(#) $Id: sqliteInt.h,v 1.736 2008/07/08 19:34:07 drh Exp $
+** @(#) $Id: sqliteInt.h,v 1.737 2008/07/08 22:28:49 shane Exp $
 */
 #ifndef _SQLITEINT_H_
 #define _SQLITEINT_H_
@@ -77,6 +77,22 @@
 # define unlikely(X)  !!(X)
 #endif
 
+/*
+ * This macro is used to "hide" some ugliness in casting an int
+ * value to a ptr value under the MSVC 64-bit compiler.   Casting
+ * non 64-bit values to ptr types results in a "hard" error with 
+ * the MSVC 64-bit compiler which this attempts to avoid.  
+ *
+ * A simple compiler pragma or casting sequence could not be found
+ * to correct this in all situations, so this macro was introduced.
+ *
+ * It could be argued that the intptr_t type could be used in this
+ * case, but that type is not available on all compilers, or 
+ * requires the #include of specific headers which differs between
+ * platforms.
+ */
+#define SQLITE_INT_TO_PTR(X)   ((void*)&((char*)0)[X])
+#define SQLITE_PTR_TO_INT(X)   ((int)(((char*)X)-(char*)0))
 
 /*
 ** These #defines should enable >2GB file support on Posix if the
diff --git a/src/table.c b/src/table.c
index 563bf63..1bd1bd1 100644
--- a/src/table.c
+++ b/src/table.c
@@ -16,7 +16,7 @@
 ** These routines are in a separate files so that they will not be linked
 ** if they are not used.
 **
-** $Id: table.c,v 1.35 2008/05/16 04:51:55 danielk1977 Exp $
+** $Id: table.c,v 1.36 2008/07/08 22:28:49 shane Exp $
 */
 #include "sqliteInt.h"
 #include <stdlib.h>
@@ -147,7 +147,7 @@
   res.azResult[0] = 0;
   rc = sqlite3_exec(db, zSql, sqlite3_get_table_cb, &res, pzErrMsg);
   assert( sizeof(res.azResult[0])>= sizeof(res.nData) );
-  res.azResult[0] = (char*)res.nData;
+  res.azResult[0] = SQLITE_INT_TO_PTR(res.nData);
   if( (rc&0xff)==SQLITE_ABORT ){
     sqlite3_free_table(&res.azResult[1]);
     if( res.zErrMsg ){
@@ -192,7 +192,7 @@
     int i, n;
     azResult--;
     assert( azResult!=0 );
-    n = (int)azResult[0];
+    n = SQLITE_PTR_TO_INT(azResult[0]);
     for(i=1; i<n; i++){ if( azResult[i] ) sqlite3_free(azResult[i]); }
     sqlite3_free(azResult);
   }
diff --git a/src/vdbeaux.c b/src/vdbeaux.c
index 0a7dc6e..b774d99 100644
--- a/src/vdbeaux.c
+++ b/src/vdbeaux.c
@@ -14,7 +14,7 @@
 ** to version 2.8.7, all this code was combined into the vdbe.c source file.
 ** But that file was getting too big so this subroutines were split out.
 **
-** $Id: vdbeaux.c,v 1.394 2008/07/08 19:34:07 drh Exp $
+** $Id: vdbeaux.c,v 1.395 2008/07/08 22:28:49 shane Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -535,7 +535,7 @@
   if( n==P4_INT32 ){
     /* Note: this cast is safe, because the origin data point was an int
     ** that was cast to a (const char *). */
-    pOp->p4.i = (int)zP4;
+    pOp->p4.i = SQLITE_PTR_TO_INT(zP4);
     pOp->p4type = n;
   }else if( zP4==0 ){
     pOp->p4.p = 0;
diff --git a/src/vdbemem.c b/src/vdbemem.c
index 7abf08d..22ca21d9 100644
--- a/src/vdbemem.c
+++ b/src/vdbemem.c
@@ -15,7 +15,7 @@
 ** only within the VDBE.  Interface routines refer to a Mem using the
 ** name sqlite_value
 **
-** $Id: vdbemem.c,v 1.116 2008/07/08 14:52:10 drh Exp $
+** $Id: vdbemem.c,v 1.117 2008/07/08 22:28:49 shane Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -904,7 +904,7 @@
   expandBlob(pVal);
   if( pVal->flags&MEM_Str ){
     sqlite3VdbeChangeEncoding(pVal, enc & ~SQLITE_UTF16_ALIGNED);
-    if( (enc & SQLITE_UTF16_ALIGNED)!=0 && 1==(1&(int)pVal->z) ){
+    if( (enc & SQLITE_UTF16_ALIGNED)!=0 && 1==(1&SQLITE_PTR_TO_INT(pVal->z)) ){
       assert( (pVal->flags & (MEM_Ephem|MEM_Static))!=0 );
       if( sqlite3VdbeMemMakeWriteable(pVal)!=SQLITE_OK ){
         return 0;
diff --git a/src/where.c b/src/where.c
index 069b707..b59450a 100644
--- a/src/where.c
+++ b/src/where.c
@@ -16,7 +16,7 @@
 ** so is applicable.  Because this module is responsible for selecting
 ** indices, you might also think of this module as the "query optimizer".
 **
-** $Id: where.c,v 1.313 2008/07/08 19:45:02 drh Exp $
+** $Id: where.c,v 1.314 2008/07/08 22:28:49 shane Exp $
 */
 #include "sqliteInt.h"
 
@@ -2605,7 +2605,7 @@
       testcase( op==OP_MoveLe );
       testcase( op==OP_MoveLt );
       sqlite3VdbeAddOp4(v, op, iIdxCur, nxt, regBase, 
-                        (char*)nConstraint, P4_INT32);
+                        SQLITE_INT_TO_PTR(nConstraint), P4_INT32);
 
       /* Load the value for the inequality constraint at the end of the
       ** range (if any).
@@ -2627,7 +2627,7 @@
       testcase( op==OP_IdxGE );
       testcase( op==OP_IdxLT );
       sqlite3VdbeAddOp4(v, op, iIdxCur, nxt, regBase,
-                        (char*)nConstraint, P4_INT32);
+                        SQLITE_INT_TO_PTR(nConstraint), P4_INT32);
       sqlite3VdbeChangeP5(v, endEq!=bRev);
 
       /* If there are inequality constraints, check that the value