added function to replace all escaped characters in a string
authorHolger Schemel <info@artsoft.org>
Mon, 19 Feb 2024 23:18:40 +0000 (00:18 +0100)
committerHolger Schemel <info@artsoft.org>
Mon, 19 Feb 2024 23:18:40 +0000 (00:18 +0100)
src/libgame/misc.c
src/libgame/misc.h

index 2c3e449361dd0c1f2ce21becf7bb643caede8548..6101cbaec3ea68a64dcc37d051ca06bbfeb55061 100644 (file)
@@ -1321,6 +1321,96 @@ void freeStringArray(char **s_array)
   checked_free(s_array);
 }
 
+char *getUnescapedString(const char *s)
+{
+  const char *s_ptr = s;
+  const char *octal_ptr;
+  char *s_unescaped;
+  char *s_unescaped_ptr;
+
+  if (s == NULL)
+    return NULL;
+
+  s_unescaped = checked_malloc(strlen(s) + 1);
+  s_unescaped_ptr = s_unescaped;
+
+  while (*s_ptr != '\0')
+  {
+    if (*s_ptr == '\\')
+    {
+      s_ptr++;
+
+      switch (*s_ptr)
+      {
+       case '\0':
+         Warn("getUnescapedString: trailing \\");
+         goto out;
+
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+         *s_unescaped_ptr = 0;
+         octal_ptr = s_ptr;
+
+         while (s_ptr < octal_ptr + 3 && *s_ptr >= '0' && *s_ptr <= '7')
+         {
+           *s_unescaped_ptr = (*s_unescaped_ptr * 8) + (*s_ptr - '0');
+           s_ptr++;
+         }
+
+         s_unescaped_ptr++;
+         s_ptr--;
+         break;
+
+       case 'b':
+         *s_unescaped_ptr++ = '\b';
+         break;
+
+       case 'f':
+         *s_unescaped_ptr++ = '\f';
+         break;
+
+       case 'n':
+         *s_unescaped_ptr++ = '\n';
+         break;
+
+       case 'r':
+         *s_unescaped_ptr++ = '\r';
+         break;
+
+       case 't':
+         *s_unescaped_ptr++ = '\t';
+         break;
+
+       case 'v':
+         *s_unescaped_ptr++ = '\v';
+         break;
+
+       default:
+         /* also handles \" and \\ */
+         *s_unescaped_ptr++ = *s_ptr;
+         break;
+      }
+    }
+    else
+    {
+      *s_unescaped_ptr++ = *s_ptr;
+    }
+
+    s_ptr++;
+  }
+
+ out:
+  *s_unescaped_ptr = '\0';
+
+  return s_unescaped;
+}
+
 boolean strEqual(const char *s1, const char *s2)
 {
   return (s1 == NULL && s2 == NULL ? TRUE  :
index 50f0ddb229abc5bfacf4516c4ea9aeca7198253f..46820c1e094d3f9ca8f522352cd04e69b49446e0 100644 (file)
@@ -184,6 +184,7 @@ void setString(char **, const char *);
 char **getSplitStringArray(const char *s, const char *, int);
 int getStringArrayLength(char **);
 void freeStringArray(char **);
+char *getUnescapedString(const char *);
 boolean strEqual(const char *, const char *);
 boolean strEqualN(const char *, const char *, int);
 boolean strEqualCase(const char *, const char *);