richtext.c (1186B)
1 /* 2 * Copy me if you can. 3 * by 20h 4 */ 5 6 #include <unistd.h> 7 #include <stdlib.h> 8 #include <stdio.h> 9 #include <string.h> 10 11 #include "ind.h" 12 13 /* 14 * There is no reason for encoding support. 15 */ 16 17 /* 18 * Decoding based on Appendix D in RFC 1341. 19 */ 20 21 /* 22 * UNTESTED 23 */ 24 25 char * 26 richtextdec(char *str, int *len, int ishdr) 27 { 28 char *ret, *tend, *token, *addstr; 29 int i, alen, rlen, commct; 30 31 ret = NULL; 32 commct = 0; 33 34 for (i = 0, rlen = 0; i < len; i++) { 35 addstr = NULL; 36 if (str[i] == '<') { 37 tend = strchr(&str[i], '>'); 38 if (tend == NULL) 39 break; 40 token = memdupz(&str[i+1], tend - &str[i+1]); 41 42 if (!strcasecmp(token, "lt")) { 43 addstr = memdupz("<", 1); 44 } else if (!strcasecmp(token, "nl")) { 45 addstr = memdupz("\n", 1); 46 } else if (!strcasecmp(token, "/paragraph")) { 47 addstr = memdupz("\n\n", 2); 48 } else if (!strcasecmp(token, "/comment")) { 49 commct--; 50 } else if (!strcasecmp(token, "comment")) { 51 commct++; 52 } 53 free(token); 54 } else { 55 addstr = memdupz(&str[i], 1); 56 } 57 58 if (addstr == NULL || commct) 59 continue; 60 61 alen = strlen(addstr); 62 ret = memdupcat(ret, rlen, addstr, alen+1); 63 rlen += alen; 64 65 free(addstr); 66 } 67 68 return ret; 69 } 70