char *xml_string(char *s) { static char *buf = NULL; static int bufsize = 0; char *p, *sub; int len, pos = 0; if (!buf) { bufsize = 64; buf = gmalloc(bufsize); } p = buf; while (*s) { if (pos > (bufsize - 8)) { bufsize *= 2; buf = grealloc(buf, bufsize); p = buf + pos; } /* these are safe even if string is already UTF-8 coded * since UTF-8 strings won't contain '<' or '>' */ if (*s == '<') { sub = "<"; len = 4; } else if (*s == '>') { sub = ">"; len = 4; } else if (*s == '"') { sub = """; len = 6; } else if (*s == '-') { /* can't be used in xml comment strings */ sub = "-"; len = 5; } else if (*s == '\'') { sub = "'"; len = 5; } /* escape '&' only if not part of a legal entity sequence */ else if (*s == '&' && !(xml_isentity(s))) { sub = "&"; len = 5; } else { sub = s; len = 1; } while (len--) { *p++ = *sub++; pos++; } s++; } *p = '\0'; return buf; }
/* a variant of xml_string for urls in hrefs */ char *xml_url_string(char *s) { static char *buf = NULL; static int bufsize = 0; char *p, *sub; #if 0 char *prev = NULL; #endif int len, pos = 0; if (!buf) { bufsize = 64; buf = gmalloc(bufsize); } p = buf; while (s && *s) { if (pos > (bufsize - 8)) { bufsize *= 2; buf = grealloc(buf, bufsize); p = buf + pos; } /* escape '&' only if not part of a legal entity sequence */ if (*s == '&' && !(xml_isentity(s))) { sub = "&"; len = 5; } /* '<' '>' are safe to substitute even if string is already UTF-8 coded * since UTF-8 strings won't contain '<' or '>' */ else if (*s == '<') { sub = "<"; len = 4; } else if (*s == '>') { sub = ">"; len = 4; } #if 0 else if (*s == '-') { /* can't be used in xml comment strings */ sub = "-"; len = 5; } else if (*s == ' ' && prev && *prev == ' ') { /* substitute 2nd and subsequent spaces with required_spaces */ sub = " "; /* inkscape doesn't recognise */ len = 6; } #endif else if (*s == '"') { sub = """; len = 6; } else if (*s == '\'') { sub = "'"; len = 5; } else { sub = s; len = 1; } while (len--) { *p++ = *sub++; pos++; } #if 0 prev = s; #endif s++; } *p = '\0'; return buf; }
/* html_string is a modified version of xml_string */ char *html_string(char *s) { static char *buf = NULL; static int bufsize = 0; char *p, *sub, *prev = NULL; int len, pos = 0; int temp,cnt,remaining=0; char workstr[16]; long unsigned int charnum=0; unsigned char byte; unsigned char mask; if (!buf) { bufsize = 64; buf = gmalloc(bufsize); } p = buf; while (s && *s) { if (pos > (bufsize - 8)) { bufsize *= 2; buf = grealloc(buf, bufsize); p = buf + pos; } /* escape '&' only if not part of a legal entity sequence */ if (*s == '&' && !(xml_isentity(s))) { sub = "&"; len = 5; } /* '<' '>' are safe to substitute even if string is already UTF-8 coded * since UTF-8 strings won't contain '<' or '>' */ else if (*s == '<') { sub = "<"; len = 4; } else if (*s == '>') { sub = ">"; len = 4; } else if (*s == '-') { /* can't be used in xml comment strings */ sub = "-"; len = 5; } else if (*s == ' ' && prev && *prev == ' ') { /* substitute 2nd and subsequent spaces with required_spaces */ sub = " "; /* inkscape doesn't recognise */ len = 6; } else if (*s == '"') { sub = """; len = 6; } else if (*s == '\'') { sub = "'"; len = 5; } else if ((unsigned char)*s > 127) { byte=(unsigned char)*s; cnt=0; for (mask=127; mask < byte; mask=mask >>1){ cnt++; byte=byte & mask; } if (cnt>1){ charnum=byte; remaining=cnt-1; }else{ charnum=charnum<<6; charnum+=byte; remaining--; } if (remaining>0){ s++; continue; } /* we will build the html value right-to-left * (least significant-to-most) */ workstr[15]=';'; sub=&workstr[14]; len=3; /* &# + ; */ do { temp=charnum%10; *(sub--)=(char)((int)'0'+ temp); charnum/=10; len++; if (len>12){ /* 12 is arbitrary, but clearly in error */ fprintf(stderr, "Error during conversion to \"UTF-8\". Quiting.\n"); exit(1); } } while (charnum>0); *(sub--)='#'; *(sub)='&'; } else {