diff --git a/include/utils/p2c.h b/include/utils/p2c.h
index 671b8a2bead4889058696668c41748fc6b6f93a5..171f634eda3797cac3b5033842e76d805e57751a 100644
--- a/include/utils/p2c.h
+++ b/include/utils/p2c.h
@@ -90,13 +90,6 @@ void	_EscIO       (int);
 
 int      microsleep    (long);
 
-char    *strsub       (char *, char *, size_t, size_t);
-char    *strltrim     (char *);
-char    *strrtrim     (char *);
-size_t  strpos2      (char *, char *, size_t);
-void    strmove      (size_t len, char * s, size_t spos, char * d, size_t dpos);
-int     strcicmp     (char * s1, char * s2);
-
 int      P_eof        (FILE *);
 int      P_eoln       (FILE *);
 long    *P_setunion   (long *, long *, long *) DEPRECATED;
diff --git a/include/utils/strings.h b/include/utils/strings.h
index 5fd6bdbdf3652043dd3da836b718582449fc906e..f776c0ebca0d65d59b8a26c70bda3d8bd431f2ab 100644
--- a/include/utils/strings.h
+++ b/include/utils/strings.h
@@ -10,14 +10,23 @@
  */
 void strsafeappend(char *s, char *s2) DEPRECATED;
 
-//void strappendc(char *s, int ch);
+/**
+ * Put the string in upper case
+ */
 char *strupper (char *result, char *s);
+
+/**
+ * Put the string in lower case
+ */
 char *strlower (char *result, char *s);
+
+/**
+ * Return a substring by the begin and end of wanted part.
+ * Result must be free.
+ */
 char *strpart (char *result, char *s, long fist, long last);
 char *strlast (char *result, char *s, size_t num);
 char *strreverse (char *result, char*);
-//char *strljust (char *result, char *s, long wid);
-//char *strrjust (char *result, char *s, long wid);
 char *strcjust (char *result, char *s, size_t wid);
 int strbegins (char *s1, char *s2);
 int strends (char *s1, char *s2);
@@ -28,17 +37,13 @@ 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 *strreal (char *result, double r);
 char *strchar (char *result, int ch);
-//long strreadint (char *s);
-//double strreadreal (char *s);
 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 strcipos2 (char *s1, char *s2, size_t i);
 size_t strciposb (char *s1, char *s2, size_t i);
-//int strcontains (char *s1, char *s2);
 int strsubset (char *s1, char *s2);
 int strcommon (char *s1, char *s2);
 size_t strlenv (char *s);
@@ -51,7 +56,14 @@ void strcomment (char *s, char* bracket);
 void strcompress (char *s, char *chars, int all);
 void strdispose (char **sp);
 void strchange (char** sp, char *);
-void strwordx(char *buf, char *wrd);
+void strwordx (char *buf, char *wrd);
+char *strsub (char *, char *, size_t, size_t);
+char *strltrim (char *);
+char *strrtrim (char *);
+size_t strpos2 (char *, char *, size_t);
+void strmove (size_t len, char * s, size_t spos, char * d, size_t dpos);
+int  strcicmp (char * s1, char * s2);
+
 
 /**
  * \deprecated
diff --git a/src/utils/p2c.c b/src/utils/p2c.c
index 6d6cef2fe145b4ba866b2922674e9e7fd2fe5780..73d1ca1121f63a6f6acb71156511759edaaea2d1 100644
--- a/src/utils/p2c.c
+++ b/src/utils/p2c.c
@@ -47,162 +47,6 @@ void PASCAL_MAIN(int argc, char **argv)
 	bigendian = isbigendian();
 }
 
-/* Common string functions: */
-
-/* Store in "ret" the substring of length "len" starting from "pos" (1-based).
-   Store a shorter or null string if out-of-range.  Return "ret". */
-
-char *strsub(char *ret, char *s, size_t pos, size_t len)
-{
-	char *s2;
-
-	if (pos == 0 || len == 0)
-	{
-		*ret = '\0';
-		return ret;
-	}
-	--pos;
-
-	while (pos-- > 0)
-	{
-		if (!*s++)
-		{
-			*ret = '\0';
-			return ret;
-		}
-	}
-
-	s2 = ret;
-	while (len-- > 0)
-	{
-		if (!(*s2++ = *s++))
-			return ret;
-	}
-
-	*s2 = '\0';
-	return ret;
-}
-
-
-/** Return the index of the first occurrence of "pat" as a substring of "s",
-	starting at index "pos" (1-based).  Result is 1-based, 0 if not found. */
-size_t strpos2(char *s, char *pat, size_t pos)
-{
-	char *cp, ch;
-	ptrdiff_t slen;
-
-	if (pos == 0)
-		return 0;
-	pos--;
-	slen = strlen(s) - pos;
-	cp = s + pos;
-	if (!(ch = *pat++))
-		return 0;
-	pos = strlen(pat);
-	slen -= pos;
-	while (--slen >= 0)
-	{
-		if (*cp++ == ch && !strncmp(cp, pat, pos))
-			return cp - s;
-	}
-	return 0;
-}
-
-
-/* HP and Turbo Pascal string functions: */
-
-/* Trim blanks at left end of string. */
-
-char *strltrim(char *s)
-{
-	while (isspace(*s))
-		s++;
-	return s;
-}
-
-/* Trim blanks at right end of string. */
-
-char *strrtrim(char *s)
-{
-	char *s2 = s;
-
-	if (!*s)
-		return s;
-	while (*++s2) ;
-	while (s2 > s && isspace(*--s2))
-		*s2 = '\0';
-	return s;
-}
-
-
-/* Copy the substring of length "len" from index "spos" of "s" (1-based)
-   to index "dpos" of "d", lengthening "d" if necessary.  Length and
-   indices must be in-range. */
-void strmove(size_t len, char *s, size_t spos, char *d, size_t dpos)
-{
-	s += spos - 1;
-	d += dpos - 1;
-	while (*d && len-- > 0)
-		*d++ = *s++;
-
-	while (len-- > 0)
-		*d++ = *s++;
-	*d = 0;
-}
-
-
-/* Delete the substring of length "len" at index "pos" from "s".
-   Delete less if out-of-range. */
-
-void strdelete(char *s, size_t pos, size_t len)
-{
-	ptrdiff_t slen;
-
-	if (pos == 0)
-		return;
-	--pos;
-	slen = strlen(s) - pos;
-	if (slen <= 0)
-		return;
-	s += pos;
-	if ((size_t)slen <= len)
-	{
-		*s = 0;
-		return;
-	}
-	while ((*s = s[len])) s++;
-}
-
-
-/* Insert string "src" at index "pos" of "dst". */
-
-void strinsert(char *src, char *dst, size_t pos)
-{
-	ptrdiff_t slen, dlen;
-
-	if (pos == 0)
-		return;
-	--pos;
-	dlen = strlen(dst);
-	dst += dlen;
-	dlen -= pos;
-	if (dlen <= 0)
-	{
-		strcpy(dst, src);
-		return;
-    }
-	slen = strlen(src);
-
-	do
-	{
-		dst[slen] = *dst;
-		--dst;
-	} while (--dlen >= 0);
-	dst++;
-	while (--slen >= 0)
-		*dst++ = *src++;
-}
-
 /* File functions */
 
 /* Check if at end of file, using Pascal "eof" semantics.  End-of-file for
diff --git a/src/utils/strings.c b/src/utils/strings.c
index 48edb3e7e64f96b4ca49022b370bd279ff703212..86ded785aa4dce9c83c7ac7752589e5e0a8009c2 100644
--- a/src/utils/strings.c
+++ b/src/utils/strings.c
@@ -590,3 +590,148 @@ void strwordx(char *buf, char *wrd)
 	strcpy_overlap(buf, buf + i);
 }
 
+/* Store in "ret" the substring of length "len" starting from "pos" (1-based).
+   Store a shorter or null string if out-of-range.  Return "ret". */
+char *strsub(char *ret, char *s, size_t pos, size_t len)
+{
+	char *s2;
+
+	if (pos == 0 || len == 0)
+	{
+		*ret = '\0';
+		return ret;
+	}
+	--pos;
+
+	while (pos-- > 0)
+	{
+		if (!*s++)
+		{
+			*ret = '\0';
+			return ret;
+		}
+	}
+
+	s2 = ret;
+	while (len-- > 0)
+	{
+		if (!(*s2++ = *s++))
+			return ret;
+	}
+
+	*s2 = '\0';
+	return ret;
+}
+
+
+/** Return the index of the first occurrence of "pat" as a substring of "s",
+	starting at index "pos" (1-based).  Result is 1-based, 0 if not found. */
+size_t strpos2(char *s, char *pat, size_t pos)
+{
+	char *cp, ch;
+	ptrdiff_t slen;
+
+	if (pos == 0)
+		return 0;
+	pos--;
+	slen = strlen(s) - pos;
+	cp = s + pos;
+	if (!(ch = *pat++))
+		return 0;
+	pos = strlen(pat);
+	slen -= pos;
+	while (--slen >= 0)
+	{
+		if (*cp++ == ch && !strncmp(cp, pat, pos))
+			return cp - s;
+	}
+	return 0;
+}
+
+
+
+/* Trim blanks at left end of string. */
+char *strltrim(char *s)
+{
+	while (isspace(*s))
+		s++;
+	return s;
+}
+
+/* Trim blanks at right end of string. */
+char *strrtrim(char *s)
+{
+	char *s2 = s;
+
+	if (!*s)
+		return s;
+	while (*++s2) ;
+	while (s2 > s && isspace(*--s2))
+		*s2 = '\0';
+	return s;
+}
+
+/* Copy the substring of length "len" from index "spos" of "s" (1-based)
+   to index "dpos" of "d", lengthening "d" if necessary.  Length and
+   indices must be in-range. */
+void strmove(size_t len, char *s, size_t spos, char *d, size_t dpos)
+{
+	s += spos - 1;
+	d += dpos - 1;
+	while (*d && len-- > 0)
+		*d++ = *s++;
+
+	while (len-- > 0)
+		*d++ = *s++;
+	*d = 0;
+}
+
+/* Delete the substring of length "len" at index "pos" from "s".
+   Delete less if out-of-range. */
+void strdelete(char *s, size_t pos, size_t len)
+{
+	ptrdiff_t slen;
+
+	if (pos == 0)
+		return;
+	--pos;
+	slen = strlen(s) - pos;
+	if (slen <= 0)
+		return;
+	s += pos;
+	if ((size_t)slen <= len)
+	{
+		*s = 0;
+		return;
+	}
+	while ((*s = s[len])) s++;
+}
+
+/* Insert string "src" at index "pos" of "dst". */
+void strinsert(char *src, char *dst, size_t pos)
+{
+	ptrdiff_t slen, dlen;
+
+	if (pos == 0)
+		return;
+	--pos;
+	dlen = strlen(dst);
+	dst += dlen;
+	dlen -= pos;
+	if (dlen <= 0)
+	{
+		strcpy(dst, src);
+		return;
+    }
+	slen = strlen(src);
+
+	do
+	{
+		dst[slen] = *dst;
+		--dst;
+	} while (--dlen >= 0);
+	dst++;
+	while (--slen >= 0)
+		*dst++ = *src++;
+}
+
diff --git a/src/utils/strlist.c b/src/utils/strlist.c
index 6a198fcf166aa9537f1fb68cb61a4d3dd92dad24..b59fc24707a918852d777618c0bd54ec502f7702 100644
--- a/src/utils/strlist.c
+++ b/src/utils/strlist.c
@@ -1,5 +1,6 @@
 #include <utils/p2c.h>
 #include <utils/strlist.h>
+#include <utils/strings.h>
 
 void strlist_init(strlist_t **base)
 {