diff --git a/psys/include/p2c/strings.h b/psys/include/p2c/strings.h
index 36ff0986ad4224e14af3f2944739e8664cd3c289..9ce876b10c33916dd4dfc980103b9a9c0b22d81d 100644
--- a/psys/include/p2c/strings.h
+++ b/psys/include/p2c/strings.h
@@ -1,12 +1,21 @@
 #ifndef P2C_STRING_H
 #define P2C_STRING_H
 
-void strsafeappend(char *s, char *s2);
+#include <p2c/p2c.h>
+
+/**
+ * Append the second string to the first.
+ *
+ * DEPRECATED : use strcat instead
+ */
+void strsafeappend(char *s, char *s2) DEPRECATED;
+
 //void strappendc(char *s, int ch);
+
 char *strupper (char *result, char *s);
 char *strlower (char *result, char *s);
 char *strpart (char *result, char *s, long fist, long last);
-char *strlast (char *result, char *s, long num);
+char *strlast (char *result, char *s, size_t num);
 char *strljust (char *result, char *s, long wid);
 char *strrjust (char *result, char *s, long wid);
 char *strcjust (char *result, char *s, long wid);
@@ -14,27 +23,27 @@ int strbegins (char *s1, char *s2);
 int strends (char *s1, char *s2);
 int strcibegins (char *s1, char *s2);
 int strciends (char *s1, char *s2);
-long strsubcmp (long n, char *s1, long i1, char *s2, long i2);
-int strcisubcmp (long n, char *s1, long i1, char *s2, long i2);
-void strsubst (char *repl, char *s, long index, long size);
+int strsubcmp (size_t n, char *s1, size_t i1, char *s2, size_t i2);
+int strcisubcmp (size_t n, char *s1, size_t i1, char *s2, size_t i2);
+void strsubst (char *repl, char *s, size_t index, size_t size);
 char *strint (char *result, long i);
 char *strint2 (char *result, long i, long w);
 char *streal (char *result, double r);
 char *strchar (char *result, int ch);
 long strreadint (char *s);
 double strreadreal (char *s);
-long strposb (char *s1, char *s2, long i);
-long strposc (char *s1, char ch, long i);
-long strposcset (char *s1, char *s2, long i);
-long strposbcset (char *s1, char *s2, long i);
-long strpcipos2 (char *s1, char *s2, long i);
-long strpciposb (char *s1, char *s2, long i);
+size_t strposb (char *s1, char *s2, ptrdiff_t i);
+size_t strposc (char *s1, char ch, ptrdiff_t i);
+size_t strposcset (char *s1, char *s2, size_t i);
+size_t strposbcset (char *s1, char *s2, size_t i);
+size_t strpcipos2 (char *s1, char *s2, size_t i);
+size_t strpciposb (char *s1, char *s2, size_t i);
 int strpcontains (char *s1, char *s2);
 int strsubset (char *s1, char *s2);
 int strcommon (char *s1, char *s2);
-long strlenv (char *s);
+size_t strlenv (char *s);
 char *strhex (char * Result, long i, long w);
-char *strbinary (char *Result, long i, long w);
+char *strbinary (char *Result, long i, size_t w);
 char *stadate (char *Result, char *opts);
 void strword (char *s, char *s2);
 void strword2 (char *s, char *s2);
diff --git a/psys/src/strings.c b/psys/src/strings.c
index 2dbc1c1faf0e662ea4f7f72860cfa0fad37c980e..24a78846039a6ff055cee984bde12938ac4b8080 100644
--- a/psys/src/strings.c
+++ b/psys/src/strings.c
@@ -10,7 +10,7 @@ void strsafeappend (char *s, char *s2)
 	s += 255;
 	while(cp < s && *s2)
 		*cp++ = *s2++;
-	*cp = 0;
+	*cp = '\0';
 }
 
 char *strupper(char *result, char *s)
@@ -18,7 +18,7 @@ char *strupper(char *result, char *s)
 	char *d = result;
 	while (*s)
 		*d++ = toupper(*s++);
-	*d = 0;
+	*d = '\0';
 	return result;
 }
 
@@ -27,7 +27,7 @@ char *strlower(char *result, char *s)
 	char *d = result;
 	while (*s)
 		*d++ = tolower(*s++);
-	*d = 0;
+	*d = '\0';
 	return result;
 }
 
@@ -36,34 +36,42 @@ char *strpart(char *result, char *s, long first, long last)
 	return strsub(result, s, first, last-first+1);
 }
 
-char *strlast(char *result, char *s, long num)
+char *strlast(char *result, char *s, size_t num)
 {
-	char *cp = s + strlen(s) - num;
+	ptrdiff_t diff = strlen(s) - num;
+	char *cp = s + diff;
 	if (cp <= s)
 		return strcpy(result, s);
 	else
 		return strcpy(result, cp);
 }
 
-char *strjust(char *result, char *s, long wid)
+char *strjust(char *result, char *s, size_t wid)
 {
-	int len = strlen(s);
-	int wid2;
+	size_t len = strlen(s);
+	ptrdiff_t wid2;
 	char *cp = result;
 
 	if (wid > 255)
 		wid = 255;
+
 	wid -= len;
+	
 	if (wid <=0)
 		return strcpy(result, s);
+	
 	wid2 = wid >> 1;
 	while (--wid2 >= 0)
 		*cp++ = ' ';
+	
 	while (*s)
 		*cp++ = *s++;
-	wid2 = (wid +1) >> 1;
+	
+	wid2 = (wid + 1) >> 1;
+	
 	while (--wid2 >= 0)
 		*cp++ = ' ';
+	
 	*cp = 0;
 	return result;
 }
@@ -71,7 +79,7 @@ char *strjust(char *result, char *s, long wid)
 int strbegins(char *s1, char *s2)
 {
 	while (*s2)
-		if (*s1++ != *s2++)
+		if (*s1 == '\0' || *s1++ != *s2++)
 			return false;
 	return true;
 }
@@ -95,7 +103,7 @@ int strcibegins(char *s1, char *s2)
 
 int strciends(char *s1, char *s2)
 {
-	int skip = strlen(s1) - strlen(s2);
+	ptrdiff_t skip = strlen(s1) - strlen(s2);
 
 	if (skip < 0)
 		return 0;
@@ -112,12 +120,12 @@ int strcicmp(char *s1, char *s2)
 	{
 		if(*s1++ != *s2++)
 		{
-			if(!s2[-1])
+			if(s2[-1] == '\0')
 				return 1;
 			c1 = toupper(s1[-1]);
 			c2 = toupper(s2[-1]);
 			if(c1 != c2)
-				return c1 -c2;
+				return c1 - c2;
 		}
 	}
 	if (*s2)
@@ -125,7 +133,7 @@ int strcicmp(char *s1, char *s2)
 	return 0;
 }
 
-long strsubcmp(long n, char *s1, long i1, char *s2, long i2)
+int strsubcmp(size_t n, char *s1, size_t i1, char *s2, size_t i2)
 {
 	if (i1 <= 0) s1 = (char *) "";
 	if (i2 <= 0) s2 = (char *) "";
@@ -148,7 +156,7 @@ long strsubcmp(long n, char *s1, long i1, char *s2, long i2)
 	return strncmp(s1, s2, n);
 }
 
-int strcisubcmp(long n, char * s1, long i1, char * s2, long i2)
+int strcisubcmp(size_t n, char * s1, size_t i1, char * s2, size_t i2)
 {
 	if (i1 <= 0) s1 = (char *) "";
 	if (i2 <= 0) s2 = (char *) "";
@@ -168,7 +176,7 @@ int strcisubcmp(long n, char * s1, long i1, char * s2, long i2)
 			break;
 		}
 	}
-	while (--n >= 0)
+	while (n-- > 0)
 	{
 		if (toupper(*s1++) != toupper(*s2++))
 			return 0;
@@ -176,18 +184,12 @@ int strcisubcmp(long n, char * s1, long i1, char * s2, long i2)
 	return 1;
 }
 
-void strsubst(char *repl, char *s, long index, long size)
+void strsubst(char *repl, char *s, size_t index, size_t size)
 {
-	int len = strlen(repl);
+	size_t len = strlen(repl);
 
 	s += index - 1;
-	if (size < 0) 
-	{
-		char* cp;
-		for (cp = s + strlen(s); cp >= s; cp--)
-			*cp = cp[size];
-	}
-	else if (size > 0)
+	if (size > 0)
 	{
 		char *cp;
 		for (cp = s; (*cp = cp[size]); cp++) ;
@@ -204,13 +206,14 @@ char *strint2(char *res, long i, long w)
 	return res;
 }
 
-long strposb(char *s1, char *s2, long i)
+size_t strposb(char *s1, char *s2, ptrdiff_t i)
 {
-	int len1 = strlen(s1);
-	int len2 = strlen(s2);
+	size_t len1 = strlen(s1);
+	size_t len2 = strlen(s2);
+	ptrdiff_t diff = len1 - len2;
 
-	if (--i > len1 - len2)
-		i = len1 - len2;
+	if (--i > diff)
+		i = diff;
 	if (i < 0 || !len2)
 		return 0;
 	while (i > 0 && strncmp(s1 +i, s2, len2))
@@ -218,7 +221,7 @@ long strposb(char *s1, char *s2, long i)
 	return i+1;
 }
 
-long strposc (char *s1, char ch, long i)
+size_t strposc (char *s1, char ch, ptrdiff_t i)
 {
 	char *cp = s1;
 
@@ -233,10 +236,10 @@ long strposc (char *s1, char ch, long i)
 	return 0;
 }
 
-long strcipos2(char *s1, char *s2, long i)
+size_t strcipos2(char *s1, char *s2, ptrdiff_t i)
 {
 	char *cp = s1;
-	int len = strlen(s2);
+	size_t len = strlen(s2);
 
 	if (i <= 0 || ! len)
 		return 0;
@@ -249,20 +252,20 @@ long strcipos2(char *s1, char *s2, long i)
 	return 0;
 }
 
-long strciposb(char *s1, char *s2, long i)
+size_t strciposb(char *s1, char *s2, ptrdiff_t i)
 {
-	int len = strlen(s1) - strlen(s2);
+	ptrdiff_t len = strlen(s1) - strlen(s2);
 
 	if(--i > len)
 		i = len;
-	if (i < 0 || !*s2)
+	if (!*s2)
 		return 0;
 	while (i >= 0 && !! strcibegins(s1 + i, s2))
 		i--;
 	return i + 1;
 }
 
-long strposcset(char *s1, char *s2, long i)
+size_t strposcset(char *s1, char *s2, size_t i)
 {
 	char *cp = s1;
 	char *cp2;
@@ -283,19 +286,15 @@ long strposcset(char *s1, char *s2, long i)
 	return 0;
 }
 
-long strposbcset(char *s1, char *s2, long i)
+size_t strposbcset(char *s1, char *s2, size_t i)
 {
 	char *cp2;
 	char ch;
 	char ch2;
-	int len;
-
-	len = strlen(s1);
+	size_t len = strlen(s1);
 	if (i >= len)
 		i = len;
-	if (i <= 0)
-		i = 0;
-	while (--i >= 0)
+	while (i-- > 0)
 	{
 		ch = s1[i];
 		for (cp2 =s2; (ch2 = *cp2); cp2++)
@@ -308,12 +307,12 @@ long strposbcset(char *s1, char *s2, long i)
 int strsubset( char *s1, char *s2)
 {
 	char *cp;
-	char* ch;
-	char *ch2;
+	char ch;
+	char ch2;
 
-	while (ch = *s1++)
+	while ((ch = *s1++))
 	{
-		for (cp = s2; (ch2 = *s2++) != ch; cp++)
+		for (cp = s2; (ch2 = *(s2++)) != ch; cp++)
 			if (!ch2)
 				return 0;
 	}
@@ -325,9 +324,9 @@ int strcommon(char *s1, char *s2)
 	return strsubset(s1, s2) && strsubset(s2,s1);
 }
 
-long strlenv(char *s1)
+size_t strlenv(char *s1)
 {
-	int len = 0;
+	size_t len = 0;
 	char ch;
 	while ((ch = *s1++))
 	{
@@ -338,8 +337,8 @@ long strlenv(char *s1)
 				break;
 
 			case 8:
-				if (--len < 0)
-					++len;
+				if (len > 0)
+					len--;
 				break;
 			case 9:
 				len = (len | 7) + 1;
@@ -350,7 +349,7 @@ long strlenv(char *s1)
 				break;
 
 			default:
-				++ len;
+				++len;
 		}
 	}
 	return len;
@@ -359,13 +358,13 @@ long strlenv(char *s1)
 char *strhex(char *res, long i, long w)
 {
 	if (w < 1 || w > 8)
-		sprintf(res, "%IIX", i);
+		sprintf(res, "%lX", i);
 	else
-		sprintf(res, "%.*IX", (int)w, i);
+		sprintf(res, "%i.%lX", (int)w, i);
 	return res;
 }
 
-char *strbinary(char *res, long i, long w)
+char *strbinary(char *res, long i, size_t w)
 {
 	if (w < 1 || w > 32)
 	{
@@ -398,7 +397,7 @@ char *strdate(char *res, char *opts) /* ignore opts for now */
 {
 	time_t t = time(NULL);
 	strcpy(res, (char*) ctime(&t));
-	res[strlen(res)-1] = 0;  /* change the \n to a NULdL */
+	res[strlen(res)-1] = '\0';  /* change the \n to a "\0" (NULL character) */
 	return res;
 }
 
@@ -411,7 +410,7 @@ void strword(char *s, char *word)
 	while (*s1 == ' ') s1++;
 	while (*s1)
 		*s++ = *s1++;
-	*s = 0;
+	*s = '\0';
 }
 
 void strword2(char* s, char* word)
@@ -434,10 +433,10 @@ void strword2(char* s, char* word)
 			*word++ =  *s1++;
 	}
 	while (*s1 == ' ') s1++;
-	*word = 0;
+	*word = '\0';
 	while (*s1)
 		*s++ = *s1++;
-	*s = 0;
+	*s = '\0';
 }
 
 void strcomment(char *s, char* bracket)
@@ -473,7 +472,7 @@ void strcomment(char *s, char* bracket)
 				*cp++ = *s++;
 			}
 		}
-		*cp = 0;
+		*cp = '\0';
 	}
 }
 
@@ -503,7 +502,7 @@ void strcompress(char *s, char *chars, int all)
 			s++;
 		}
 	}
-	*cp = 0;
+	*cp = '\0';
 }
 
 void strdispose(char **sp)
@@ -515,14 +514,14 @@ void strdispose(char **sp)
 
 void strchange(char **sp, char *s)
 {
-	int len1;
-	int len2 = strlen(s);
+	size_t len1;
+	size_t len2 = strlen(s);
 	if (*sp)
 	{
 		len1 = strlen(*sp);
 		if (len1 != len2)
 		{
-			*sp = (char *) realloc(*sp, len2 +1);
+			*sp = (char *) realloc(*sp, len2 + 1);
 		}
 	}
 	else
@@ -536,7 +535,7 @@ void strchange(char **sp, char *s)
 
 char *strcpy_overlap(char *dst, char *src)
 {
-	int i = 0;
+	size_t i = 0;
 
 	do {
 		dst[i] = src[i];