+/**
+ * Escapes a string so it can be used safely.
+ * Currently escapes to ensure the validity for use as a JSON string
+ * Does not support unicode specifiers in the form of \uXXXX.
+ * @param buf The string to be escaped
+ * @return The escaped string (return value == buf)
+ */
+char *FCGI_EscapeText(char *buf)
+{
+ int length, i;
+ length = strlen(buf);
+
+ //Escape special characters. Must count down to escape properly
+ for (i = length - 1; i >= 0; i--) {
+ if (buf[i] < 0x20) { //Control characters
+ buf[i] = ' ';
+ } else if (buf[i] == '"') {
+ if (i-1 >= 0 && buf[i-1] == '\\')
+ i--;
+ else
+ buf[i] = '\'';
+ } else if (buf[i] == '\\') {
+ if (i-1 >= 0 && buf[i-1] == '\'')
+ i--;
+ else
+ buf[i] = ' ';
+ }
+ }
+ return buf;
+}
+
+/**
+ * Unescapes a URL encoded string in-place. The string
+ * must be NULL terminated.
+ * (e.g this%2d+string --> this- string)
+ * @param buf The buffer to decode. Will be modified in-place.
+ * @return The same buffer.
+ */
+char *FCGI_URLDecode(char *buf)
+{
+ char *head = buf, *tail = buf;
+ char hex[3] = {0};
+
+ while (*tail) {
+ if (*tail == '%') { //%hh hex to char
+ tail++;
+ if (isxdigit(*tail) && isxdigit(*(tail+1))) {
+ hex[0] = *tail++;
+ hex[1] = *tail++;
+ *head++ = (char)strtol(hex, NULL, 16);
+ } else { //Not valid format; keep original
+ head++;
+ }
+ } else if (*tail == '+') { //Plus to space
+ tail++;
+ *head++ = ' ';
+ } else { //Anything else
+ *head++ = *tail++;
+ }
+ }
+ *head = 0; //NULL-terminate at new end point
+
+ return buf;
+}
+