/* * Encode (hexify) a mailto url. * * Args s -- src url * * Returns An allocated string which is suitably encoded. * Result should be freed by caller. * * Since we don't know here which characters are reserved characters (? and &) * for use in delimiting the pieces of the url and which are just those * characters contained in the data that should be encoded, we always encode * them. That's because we know we don't use those as reserved characters. * If you do use those as reserved characters you have to encode each part * separately. */ char * rfc1738_encode_mailto(char *s) { char *d, *ret = NULL; if(s){ /* Worst case, encode every character */ ret = d = (char *)fs_get((3*strlen(s) + 1) * sizeof(char)); while(*s){ if(isalnum((unsigned char)*s) || strchr(RFC1738_SAFE, *s) || strchr(RFC1738_EXTRA, *s)) *d++ = *s++; else{ *d++ = '%'; C2XPAIR(*s, d); s++; } } *d = '\0'; } return(ret); }
int rfc2231_output(STORE_S *so, char *attrib, char *value, char *specials, char *charset) { int i, line = 0, encode = 0, quote = 0; /* * scan for hibit first since encoding clue has to * come on first line if any parms are broken up... */ for(i = 0; value && value[i]; i++) if(value[i] & 0x80){ encode++; break; } for(i = 0; ; i++){ if(!(value && value[i]) || i > 80){ /* flush! */ if((line++ && !so_puts(so, ";\015\012 ")) || !so_puts(so, attrib)) return(0); if(value){ if(((value[i] || line > 1) /* more lines or already lines */ && !(so_writec('*', so) && so_puts(so, int2string(line - 1)))) || (encode && !so_writec('*', so)) || !so_writec('=', so) || (quote && !so_writec('\"', so)) || ((line == 1 && encode) && !(so_puts(so, charset ? charset : UNKNOWN_CHARSET) && so_puts(so, "''")))) return(0); while(i--){ if(*value & 0x80){ char tmp[3], *p; p = tmp; C2XPAIR(*value, p); *p = '\0'; if(!(so_writec('%', so) && so_puts(so, tmp))) return(0); } else if(((*value == '\\' || *value == '\"') && !so_writec('\\', so)) || !so_writec(*value, so)) return(0); value++; } if(quote && !so_writec('\"', so)) return(0); if(*value) /* more? */ i = quote = 0; /* reset! */ else return(1); /* done! */ } else return(1); } if(!quote && strchr(specials, value[i])) quote++; } }