--- /dev/null
+// de/encoding stuff. hopefully mostly to be depricated in favour of subst.c + strbuf
+
+#define SHOW_ME_VAPPEND_PRINTF
+#include <stdio.h>
+#include <stdarg.h>
+#include "webcit.h"
+
+
+// remove escaped strings from i.e. the url string (like %20 for blanks)
+long unescape_input(char *buf) {
+ unsigned int a, b;
+ char hex[3];
+ long buflen;
+ long len;
+
+ buflen = strlen(buf);
+
+ while ((buflen > 0) && (isspace(buf[buflen - 1]))){
+ buf[buflen - 1] = 0;
+ buflen --;
+ }
+
+ a = 0;
+ while (a < buflen) {
+ if (buf[a] == '+')
+ buf[a] = ' ';
+ if (buf[a] == '%') {
+ // don't let % chars through, rather truncate the input.
+ if (a + 2 > buflen) {
+ buf[a] = '\0';
+ buflen = a;
+ }
+ else {
+ hex[0] = buf[a + 1];
+ hex[1] = buf[a + 2];
+ hex[2] = 0;
+ b = 0;
+ b = decode_hex(hex);
+ buf[a] = (char) b;
+ len = buflen - a - 2;
+ if (len > 0)
+ memmove(&buf[a + 1], &buf[a + 3], len);
+
+ buflen -=2;
+ }
+ }
+ a++;
+ }
+ return a;
+}
+
+// Copy a string, escaping characters which have meaning in HTML.
+//
+// target target buffer
+// strbuf source buffer
+// nbsp If nonzero, spaces are converted to non-breaking spaces.
+// nolinebreaks if set, linebreaks are removed from the string.
+long stresc(char *target, long tSize, char *strbuf, int nbsp, int nolinebreaks) {
+ char *aptr, *bptr, *eptr;
+
+ *target = '\0';
+ aptr = strbuf;
+ bptr = target;
+ eptr = target + tSize - 6; // our biggest unit to put in...
+
+
+ while ((bptr < eptr) && !IsEmptyStr(aptr) ){
+ if (*aptr == '<') {
+ memcpy(bptr, "<", 4);
+ bptr += 4;
+ }
+ else if (*aptr == '>') {
+ memcpy(bptr, ">", 4);
+ bptr += 4;
+ }
+ else if (*aptr == '&') {
+ memcpy(bptr, "&", 5);
+ bptr += 5;
+ }
+ else if (*aptr == '\"') {
+ memcpy(bptr, """, 6);
+ bptr += 6;
+ }
+ else if (*aptr == '\'') {
+ memcpy(bptr, "'", 5);
+ bptr += 5;
+ }
+ else if (*aptr == LB) {
+ *bptr = '<';
+ bptr ++;
+ }
+ else if (*aptr == RB) {
+ *bptr = '>';
+ bptr ++;
+ }
+ else if (*aptr == QU) {
+ *bptr ='"';
+ bptr ++;
+ }
+ else if ((*aptr == 32) && (nbsp == 1)) {
+ memcpy(bptr, " ", 6);
+ bptr += 6;
+ }
+ else if ((*aptr == '\n') && (nolinebreaks)) {
+ *bptr='\0'; /* nothing */
+ }
+ else if ((*aptr == '\r') && (nolinebreaks)) {
+ *bptr='\0'; /* nothing */
+ }
+ else{
+ *bptr = *aptr;
+ bptr++;
+ }
+ aptr ++;
+ }
+ *bptr = '\0';
+ if ((bptr = eptr - 1 ) && !IsEmptyStr(aptr) )
+ return -1;
+ return (bptr - target);
+}
+
+// static wrapper for escputs1
+void escputs(const char *strbuf) {
+ StrEscAppend(WC->WBuf, NULL, strbuf, 0, 0);
+}
+
+// urlescape buffer and print it to the client
+void urlescputs(const char *strbuf) {
+ StrBufUrlescAppend(WC->WBuf, NULL, strbuf);
+}
+
+
+// urlescape buffer and print it as header
+void hurlescputs(const char *strbuf) {
+ StrBufUrlescAppend(WC->HBuf, NULL, strbuf);
+}
+
+
+// Output a string to the client as a CDATA block
+void cdataout(char *rawdata) {
+ char *ptr = rawdata;
+ wc_printf("<![CDATA[");
+
+ while ((ptr != NULL) && (ptr[0] != 0))
+ {
+ if (!strncmp(ptr, "]]>", 3)) {
+ wc_printf("]]]]><![CDATA[>");
+ ++ptr; ++ptr; ++ptr;
+ }
+ else {
+ wc_printf("%c", ptr[0]);
+ ++ptr;
+ }
+ }
+
+ wc_printf("]]>");
+}
\ No newline at end of file