diff --git a/src/builtin.cmod b/src/builtin.cmod
index 47a6a2896e5af16f72b9e9a3ee298fd02c92a9b5..6fe4c49fe7dce845d11b7e5b0659edd15ec0ca92 100644
--- a/src/builtin.cmod
+++ b/src/builtin.cmod
@@ -102,12 +102,12 @@ PIKEFUN mapping(1:2) mkmapping(array(1=mixed) a, array(2=mixed) b)
   RETURN mkmapping(a,b);
 }
 
-PIKEFUN int string_count(string haystack, string needle)
+PIKEFUN ptrdiff_t string_count(string haystack, string needle)
   errname String.count;
   optflags OPT_TRY_OPTIMIZE;
 {
-   int c=0;
-   int i,j;
+   ptrdiff_t c = 0;
+   ptrdiff_t i, j;
 
    switch (needle->len)
    {
diff --git a/src/queue.c b/src/queue.c
index 41e62d27dcdf9822440c672febfbb200dda3f2c6..dc4d4c03c045c0c57d002953ae018cf04eed19e3 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -23,7 +23,7 @@ void run_queue(struct pike_queue *q)
   struct queue_block *b;
 
 #ifdef PIKE_DEBUG
-  if (q->first && q->last == (struct queue_block *) 1)
+  if (q->first && q->last == (struct queue_block *)(ptrdiff_t)1)
     fatal("This looks like a lifo queue.\n");
 #endif
 
@@ -60,7 +60,7 @@ void enqueue(struct pike_queue *q, queue_call call, void *data)
 
 #ifdef PIKE_DEBUG
   if (!q->first) q->last = 0;
-  else if (q->last == (struct queue_block *) 1)
+  else if (q->last == (struct queue_block *)(ptrdiff_t)1)
     fatal("This looks like a lifo queue.\n");
 #endif
 
@@ -89,7 +89,7 @@ void run_lifo_queue(struct pike_queue *q)
   struct queue_block *b;
 
 #ifdef PIKE_DEBUG
-  if (q->first && q->last != (struct queue_block *) 1)
+  if (q->first && q->last != (struct queue_block *)(ptrdiff_t)1)
     fatal("This does not look like a lifo queue.\n");
 #endif
 
@@ -112,8 +112,8 @@ void enqueue_lifo(struct pike_queue *q, queue_call call, void *data)
   struct queue_block *b=q->first;
 
 #ifdef PIKE_DEBUG
-  if (!q->first) q->last = (struct queue_block *) 1;
-  else if (q->last != (struct queue_block *) 1)
+  if (!q->first) q->last = (struct queue_block *)(ptrdiff_t)1;
+  else if (q->last != (struct queue_block *)(ptrdiff_t)1)
     fatal("This does not look like a lifo queue.\n");
 #endif
 
@@ -135,7 +135,7 @@ void *dequeue_lifo(struct pike_queue *q, queue_call call)
   struct queue_block *b;
 
 #ifdef PIKE_DEBUG
-  if (q->first && q->last != (struct queue_block *) 1)
+  if (q->first && q->last != (struct queue_block *)(ptrdiff_t)1)
     fatal("This does not look like a lifo queue.\n");
 #endif
 
diff --git a/src/stralloc.c b/src/stralloc.c
index ec4bc4abeec0584ec6bc1186db770e5b1083037a..cfd1f6170cda2c2d050c34d3435e740b9a3735ca 100644
--- a/src/stralloc.c
+++ b/src/stralloc.c
@@ -25,7 +25,7 @@
 #define HUGE HUGE_VAL
 #endif /*!HUGE*/
 
-RCSID("$Id: stralloc.c,v 1.94 2000/08/10 18:00:09 grubba Exp $");
+RCSID("$Id: stralloc.c,v 1.95 2000/08/10 18:23:17 grubba Exp $");
 
 #define BEGIN_HASH_SIZE 997
 #define MAX_AVG_LINK_LENGTH 3
@@ -39,7 +39,7 @@ static unsigned int need_more_hash_prefix=0;
 unsigned INT32 htable_size=0;
 static unsigned int hashprimes_entry=0;
 static struct pike_string **base_table=0;
-static unsigned INT32 full_hash_value;
+static size_t full_hash_value;
 unsigned INT32 num_strings=0;
 
 /*** Main string hash function ***/
@@ -47,13 +47,13 @@ unsigned INT32 num_strings=0;
 
 #define StrHash(s,len) low_do_hash(s,len,0)
 
-static unsigned int low_do_hash(const void *s, ptrdiff_t len, int size_shift)
+static size_t low_do_hash(const void *s, ptrdiff_t len, int size_shift)
 {
   full_hash_value=hashmem(s,len<<size_shift,HASH_PREFIX<<size_shift);
   return full_hash_value % htable_size;
 }
 
-static INLINE unsigned int do_hash(struct pike_string *s)
+static INLINE size_t do_hash(struct pike_string *s)
 {
   return low_do_hash(s->str, s->len, s->size_shift);
 }
@@ -287,7 +287,7 @@ static int improper_zero_termination(struct pike_string *s)
 static struct pike_string *internal_findstring(const char *s,
 					       ptrdiff_t len,
 					       int size_shift,
-					       int h)
+					       ptrdiff_t h)
 {
   struct pike_string *curr,**prev, **base;
 #ifndef HASH_PREFIX
@@ -323,7 +323,7 @@ static struct pike_string *internal_findstring(const char *s,
   }
 #ifndef HASH_PREFIX
   /* These heuruistics might require tuning! /Hubbe */
-  if((depth > HASH_PREFIX) && (HASH_PREFIX < (unsigned int)len))
+  if((depth > HASH_PREFIX) && (HASH_PREFIX < (size_t)len))
   {
     need_more_hash_prefix++;
 /*    fprintf(stderr,"depth=%d  num_strings=%d need_more_hash_prefix=%d  HASH_PREFIX=%d\n",depth,num_strings,need_more_hash_prefix,HASH_PREFIX); */
@@ -350,7 +350,7 @@ PMOD_EXPORT struct pike_string *findstring(const char *foo)
  * of that list in the hastable
  */
 static struct pike_string *propagate_shared_string(const struct pike_string *s,
-						   int h)
+						   ptrdiff_t h)
 {
   struct pike_string *curr, **prev, **base;
 
@@ -379,10 +379,10 @@ static struct pike_string *propagate_shared_string(const struct pike_string *s,
 
 static void rehash_string_backwards(struct pike_string *s)
 {
-  int h;
+  ptrdiff_t h;
   if(!s) return;
   rehash_string_backwards(s->next);
-  h=s->hval % htable_size;
+  h = s->hval % htable_size;
   s->next=base_table[h];
   base_table[h]=s;
 }
@@ -427,7 +427,7 @@ PMOD_EXPORT struct pike_string *debug_begin_shared_string(size_t len)
   return t;
 }
 
-static void link_pike_string(struct pike_string *s, unsigned int h)
+static void link_pike_string(struct pike_string *s, size_t h)
 {
   s->refs = 0;
   s->next = base_table[h];
@@ -467,7 +467,7 @@ static void link_pike_string(struct pike_string *s, unsigned int h)
 	base_table[h2]=tmp2;
       }
     }
-    full_hash_value=save_full_hash_value;
+    full_hash_value = save_full_hash_value;
   }
 #endif
 }
@@ -569,7 +569,7 @@ PMOD_EXPORT struct pike_string *end_shared_string(struct pike_string *s)
 PMOD_EXPORT struct pike_string * debug_make_shared_binary_string(const char *str,size_t len)
 {
   struct pike_string *s;
-  int h=StrHash(str,len);
+  ptrdiff_t h = StrHash(str, len);
 
   s = internal_findstring(str,len,0,h);
   if (!s) 
@@ -614,7 +614,7 @@ PMOD_EXPORT struct pike_string * debug_make_shared_binary_string0(const p_wchar0
 PMOD_EXPORT struct pike_string * debug_make_shared_binary_string1(const p_wchar1 *str,size_t len)
 {
   struct pike_string *s;
-  int h;
+  ptrdiff_t h;
 
   if(!find_magnitude1(str,len))
   {
@@ -642,7 +642,7 @@ PMOD_EXPORT struct pike_string * debug_make_shared_binary_string1(const p_wchar1
 PMOD_EXPORT struct pike_string * debug_make_shared_binary_string2(const p_wchar2 *str,size_t len)
 {
   struct pike_string *s;
-  int h;
+  ptrdiff_t h;
 
   switch(find_magnitude2(str,len))
   {
@@ -702,11 +702,11 @@ PMOD_EXPORT struct pike_string *debug_make_shared_string2(const p_wchar2 *str)
 
 PMOD_EXPORT void unlink_pike_string(struct pike_string *s)
 {
-  unsigned int h=s->hval % htable_size;
+  size_t h = s->hval % htable_size;
   propagate_shared_string(s,h);
   base_table[h]=s->next;
 #ifdef PIKE_DEBUG
-  s->next=(struct pike_string *)-1;
+  s->next=(struct pike_string *)(ptrdiff_t)-1;
 #endif
   num_strings--;
 }
@@ -727,10 +727,10 @@ PMOD_EXPORT void really_free_string(struct pike_string *s)
     }
     if(d_flag > 2)
     {
-      if(s->next == (struct pike_string *)-1)
+      if(s->next == (struct pike_string *)(ptrdiff_t)-1)
 	fatal("Freeing shared string again!\n");
 
-      if(((long)s->next) & 1)
+      if(((ptrdiff_t)s->next) & 1)
 	fatal("Freeing shared string again, memory corrupt or other bug!\n");
     }
   }
@@ -761,7 +761,7 @@ struct pike_string *add_string_status(int verbose)
     int allocd_bytes=0;
     int num_distinct_strings=0;
     int bytes_distinct_strings=0;
-    int overhead_bytes=0;
+    ptrdiff_t overhead_bytes = 0;
     unsigned INT32 e;
     struct pike_string *p;
     for(e=0;e<htable_size;e++)
@@ -785,10 +785,11 @@ struct pike_string *add_string_status(int verbose)
     sprintf(b,"Strings malloced\t\t%8ld %8ld + %ld overhead\n",
 	    (long)num_distinct_strings,
 	    (long)bytes_distinct_strings,
-	    (long)overhead_bytes);
+	    DO_NOT_WARN((long)overhead_bytes));
     my_strcat(b);
-    sprintf(b,"Space actually required/total string bytes %d%%\n",
-	    (bytes_distinct_strings + overhead_bytes)*100 / allocd_bytes);
+    sprintf(b, "Space actually required/total string bytes %ld%%\n",
+	    DO_NOT_WARN((long)((bytes_distinct_strings + overhead_bytes)*100 /
+			       allocd_bytes)));
     my_strcat(b);
   }
 /*
@@ -824,7 +825,7 @@ PMOD_EXPORT void check_string(struct pike_string *s)
 PMOD_EXPORT void verify_shared_strings_tables(void)
 {
   unsigned INT32 e, h, num=0;
-  unsigned INT32 orig_full_hash = full_hash_value;
+  size_t orig_full_hash = full_hash_value;
   struct pike_string *s;
 
   for(e=0;e<htable_size;e++)
@@ -935,10 +936,10 @@ PMOD_EXPORT void debug_dump_pike_string(struct pike_string *s, INT32 max)
   fprintf(stderr,"0x%p: %ld refs, len=%ld, size_shift=%d, hval=%lux (%lx)\n",
 	  s,
 	  (long)s->refs,
-	  (long)s->len,
+	  DO_NOT_WARN((long)s->len),
 	  s->size_shift,
-	  (unsigned long)s->hval,
-	  (unsigned long)StrHash(s->str, s->len));
+	  DO_NOT_WARN((unsigned long)s->hval),
+	  DO_NOT_WARN((unsigned long)StrHash(s->str, s->len)));
   fprintf(stderr," \"");
   for(e=0;e<s->len && max>0;e++)
   {
@@ -982,8 +983,8 @@ void dump_stralloc_strings(void)
 /*** String compare functions ***/
 
 /* does not take locale into account */
-PMOD_EXPORT int low_quick_binary_strcmp(char *a,INT32 alen,
-			    char *b,INT32 blen)
+PMOD_EXPORT int low_quick_binary_strcmp(char *a, ptrdiff_t alen,
+					char *b, ptrdiff_t blen)
 {
   int tmp;
   if(alen > blen)
@@ -1002,8 +1003,10 @@ PMOD_EXPORT int low_quick_binary_strcmp(char *a,INT32 alen,
 
 
 /* does not take locale into account */
-PMOD_EXPORT int generic_quick_binary_strcmp(const char *a,INT32 alen, int asize,
-				const char *b,INT32 blen, int bsize)
+PMOD_EXPORT ptrdiff_t generic_quick_binary_strcmp(const char *a,
+						  ptrdiff_t alen, int asize,
+						  const char *b,
+						  ptrdiff_t blen, int bsize)
 {
   if(!asize && !bsize)
   {
@@ -1039,8 +1042,8 @@ PMOD_EXPORT int c_compare_string(struct pike_string *s, char *foo, int len)
 
 #ifndef HAVE_STRCOLL
 /* No locale function available */
-int low_binary_strcmp(char *a,INT32 alen,
-		      char *b,INT32 blen)
+int low_binary_strcmp(char *a, ptrdiff_t alen,
+		      char *b, ptrdiff_t blen)
 {
   low_quick_binary_strcmp(a,alen,b,blen);
 }
@@ -1069,7 +1072,8 @@ static int low_binary_strcmp(char *a,INT32 alen,
 
 /* Does not take locale into account */
 
-PMOD_EXPORT int my_quick_strcmp(struct pike_string *a,struct pike_string *b)
+PMOD_EXPORT ptrdiff_t my_quick_strcmp(struct pike_string *a,
+				      struct pike_string *b)
 {
   if(a==b) return 0;
 
@@ -1078,7 +1082,7 @@ PMOD_EXPORT int my_quick_strcmp(struct pike_string *a,struct pike_string *b)
 }
 
 /* Does take locale into account */
-PMOD_EXPORT int my_strcmp(struct pike_string *a,struct pike_string *b)
+PMOD_EXPORT ptrdiff_t my_strcmp(struct pike_string *a,struct pike_string *b)
 {
   if(a==b) return 0;
 
@@ -1089,7 +1093,7 @@ PMOD_EXPORT int my_strcmp(struct pike_string *a,struct pike_string *b)
 
     default:
     {
-      INT32 e,l=MINIMUM(a->len,b->len);
+      ptrdiff_t e, l = MINIMUM(a->len, b->len);
       for(e=0;e<l;e++)
       {
 	INT32 ac=index_shared_string(a,e);
@@ -1115,7 +1119,8 @@ PMOD_EXPORT int my_strcmp(struct pike_string *a,struct pike_string *b)
   }
 }
 
-PMOD_EXPORT struct pike_string *realloc_unlinked_string(struct pike_string *a, INT32 size)
+PMOD_EXPORT struct pike_string *realloc_unlinked_string(struct pike_string *a,
+							ptrdiff_t size)
 {
   struct pike_string *r;
   r=(struct pike_string *)realloc((char *)a,
@@ -1135,7 +1140,8 @@ PMOD_EXPORT struct pike_string *realloc_unlinked_string(struct pike_string *a, I
 }
 
 /* Returns an unlinked string ready for end_shared_string */
-PMOD_EXPORT struct pike_string *realloc_shared_string(struct pike_string *a, INT32 size)
+PMOD_EXPORT struct pike_string *realloc_shared_string(struct pike_string *a,
+						      ptrdiff_t size)
 {
   struct pike_string *r;
   if(a->refs==1)
@@ -1323,10 +1329,10 @@ PMOD_EXPORT struct pike_string *add_shared_strings(struct pike_string *a,
 PMOD_EXPORT struct pike_string *add_and_free_shared_strings(struct pike_string *a,
 						struct pike_string *b)
 {
-  INT32 alen=a->len;
+  ptrdiff_t alen = a->len;
   if(a->size_shift == b->size_shift)
   {
-    a=realloc_shared_string(a,alen + b->len);
+    a = realloc_shared_string(a,alen + b->len);
     MEMCPY(a->str+(alen<<a->size_shift),b->str,b->len<<b->size_shift);
     free_string(b);
     return end_shared_string(a);
@@ -1339,9 +1345,9 @@ PMOD_EXPORT struct pike_string *add_and_free_shared_strings(struct pike_string *
 }
 
 
-PMOD_EXPORT int string_search(struct pike_string *haystack,
-		  struct pike_string *needle,
-		  int start)
+PMOD_EXPORT ptrdiff_t string_search(struct pike_string *haystack,
+				    struct pike_string *needle,
+				    ptrdiff_t start)
 {
   struct generic_mem_searcher s;
   char *r;
@@ -1633,10 +1639,10 @@ PMOD_EXPORT void *string_builder_allocate(struct string_builder *s, ptrdiff_t ch
 
 PMOD_EXPORT void string_builder_putchar(struct string_builder *s, int ch)
 {
-  INT32 i;
+  ptrdiff_t i;
   string_build_mkspace(s,1,min_magnitude(ch));
   s->known_shift=MAXIMUM(min_magnitude(ch),s->known_shift);
-  i=s->s->len++;
+  i = s->s->len++;
   low_set_index(s->s,i,ch);
 }
 
diff --git a/src/stralloc.h b/src/stralloc.h
index b720db0a9e4ca2a5a3b958399c2a813bdc15d94d..432fb45b6797cfcbd023c0eed4a84aae67c20825 100644
--- a/src/stralloc.h
+++ b/src/stralloc.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: stralloc.h,v 1.53 2000/08/10 18:00:42 grubba Exp $
+ * $Id: stralloc.h,v 1.54 2000/08/10 18:23:30 grubba Exp $
  */
 #ifndef STRALLOC_H
 #define STRALLOC_H
@@ -192,19 +192,22 @@ PMOD_EXPORT int safe_debug_findstring(struct pike_string *foo);
 PMOD_EXPORT struct pike_string *debug_findstring(const struct pike_string *foo);
 PMOD_EXPORT void debug_dump_pike_string(struct pike_string *s, INT32 max);
 void dump_stralloc_strings(void);
-PMOD_EXPORT int low_quick_binary_strcmp(char *a,INT32 alen,
-			    char *b,INT32 blen);
-PMOD_EXPORT int generic_quick_binary_strcmp(const char *a,INT32 alen, int asize,
-				const char *b,INT32 blen, int bsize);
+PMOD_EXPORT int low_quick_binary_strcmp(char *a, ptrdiff_t alen,
+					char *b, ptrdiff_t blen);
+PMOD_EXPORT ptrdiff_t generic_quick_binary_strcmp(const char *a,
+						  ptrdiff_t alen, int asize,
+						  const char *b,
+						  ptrdiff_t blen, int bsize);
 PMOD_EXPORT int c_compare_string(struct pike_string *s, char *foo, int len);
-PMOD_EXPORT static int low_binary_strcmp(char *a,INT32 alen,
-		      char *b,INT32 blen);
-PMOD_EXPORT static int low_binary_strcmp(char *a,INT32 alen,
-			     char *b,INT32 blen);
-PMOD_EXPORT int my_quick_strcmp(struct pike_string *a,struct pike_string *b);
-PMOD_EXPORT int my_strcmp(struct pike_string *a,struct pike_string *b);
-PMOD_EXPORT struct pike_string *realloc_unlinked_string(struct pike_string *a, INT32 size);
-PMOD_EXPORT struct pike_string *realloc_shared_string(struct pike_string *a, INT32 size);
+PMOD_EXPORT static int low_binary_strcmp(char *a, ptrdiff_t alen,
+					 char *b, ptrdiff_t blen);
+PMOD_EXPORT ptrdiff_t my_quick_strcmp(struct pike_string *a,
+				      struct pike_string *b);
+PMOD_EXPORT ptrdiff_t my_strcmp(struct pike_string *a,struct pike_string *b);
+PMOD_EXPORT struct pike_string *realloc_unlinked_string(struct pike_string *a,
+							ptrdiff_t size);
+PMOD_EXPORT struct pike_string *realloc_shared_string(struct pike_string *a,
+						      ptrdiff_t size);
 PMOD_EXPORT struct pike_string *new_realloc_shared_string(struct pike_string *a, INT32 size, int shift);
 PMOD_EXPORT struct pike_string *modify_shared_string(struct pike_string *a,
 					 INT32 index,
@@ -213,9 +216,9 @@ PMOD_EXPORT struct pike_string *add_shared_strings(struct pike_string *a,
 					 struct pike_string *b);
 PMOD_EXPORT struct pike_string *add_and_free_shared_strings(struct pike_string *a,
 						struct pike_string *b);
-PMOD_EXPORT int string_search(struct pike_string *haystack,
-		  struct pike_string *needle,
-		  int start);
+PMOD_EXPORT ptrdiff_t string_search(struct pike_string *haystack,
+				    struct pike_string *needle,
+				    ptrdiff_t start);
 PMOD_EXPORT struct pike_string *string_slice(struct pike_string *s,
 					     ptrdiff_t start,
 					     ptrdiff_t len);
diff --git a/src/threads.c b/src/threads.c
index eab2105dce6d87d1a6845b101b801eba70026797..5858d41d9ffb7d80005576e7721e720b3b752fc0 100644
--- a/src/threads.c
+++ b/src/threads.c
@@ -1,5 +1,5 @@
 #include "global.h"
-RCSID("$Id: threads.c,v 1.134 2000/08/10 09:51:52 per Exp $");
+RCSID("$Id: threads.c,v 1.135 2000/08/10 18:25:17 grubba Exp $");
 
 PMOD_EXPORT int num_threads = 1;
 PMOD_EXPORT int threads_disabled = 0;
@@ -213,7 +213,7 @@ struct program *thread_local_prog = 0;
 pthread_attr_t pattr;
 pthread_attr_t small_pattr;
 #endif
-PMOD_EXPORT int thread_storage_offset;
+PMOD_EXPORT ptrdiff_t thread_storage_offset;
 
 struct thread_starter
 {
@@ -528,7 +528,7 @@ PMOD_EXPORT void f_all_threads(INT32 args)
       ref_push_object(o);
     }
   mt_unlock( & thread_table_lock );
-  f_aggregate(Pike_sp-oldsp);
+  f_aggregate(DO_NOT_WARN(Pike_sp - oldsp));
 }
 
 
@@ -678,7 +678,7 @@ TH_RETURN_TYPE new_thread_func(void * data)
   mt_unlock_interpreter();
   th_exit(0);
   /* NOT_REACHED, but removes a warning */
-  return(NULL);
+  return(0);
 }
 
 #ifdef UNIX_THREADS
@@ -1221,7 +1221,7 @@ void low_th_init(void)
 void th_init(void)
 {
   struct program *tmp;
-  INT32 mutex_key_offset;
+  ptrdiff_t mutex_key_offset;
 
 #ifdef UNIX_THREADS
   
@@ -1429,7 +1429,7 @@ static TH_RETURN_TYPE farm(void *_a)
       --_num_farmers;
       mt_unlock( &rosie );
       free( me );
-      return NULL;
+      return 0;
     }
     me->neighbour = farmers;
     farmers = me;
@@ -1440,7 +1440,7 @@ static TH_RETURN_TYPE farm(void *_a)
 /*     fprintf(stderr, "farm_endwait %p\n", me); */
   } while(1);
   /* NOT_REACHED */
-  return NULL;/* Keep the compiler happy. */
+  return 0;/* Keep the compiler happy. */
 }
 
 int th_num_idle_farmers(void)