/* * de/encoding stuff. hopefully mostly to be depricated in favour of subst.c + strbuf */ #define SHOW_ME_VAPPEND_PRINTF #include #include #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 ecsputs1 */ 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("", 3)) { wc_printf("]]]]>"); ++ptr; ++ptr; ++ptr; } else { wc_printf("%c", ptr[0]); ++ptr; } } wc_printf("]]>"); }