*/
char *file_read_line_alloc(FILE * fp)
{
+ size_t buf_len, line_size;
char buf[BUFSIZ];
- unsigned int buf_len;
char *line = NULL;
- unsigned int line_size = 0;
int got_nl = 0;
- buf[0] = '\0';
-
while (fgets(buf, BUFSIZ, fp)) {
buf_len = strlen(buf);
- if (buf[buf_len - 1] == '\n') {
+ if (buf_len > 0 && buf[buf_len - 1] == '\n') {
buf_len--;
buf[buf_len] = '\0';
got_nl = 1;
{
size_t slen;
unsigned char *p;
- const unsigned char *s = (unsigned char *)src;
+ const unsigned char *s;
static unsigned char buf[32];
if (!src) {
return NULL;
}
- for (p = buf, *len = 0;
+ for (s = (unsigned char *)src, p = buf, *len = 0;
slen > 0 && isxdigit(s[0]) && isxdigit(s[1]);
slen--, s += 2, (*len)++)
*p++ = hex2bin(s[0]) * 16 + hex2bin(s[1]);
return (char *)copy;
}
+
+char *urldecode_path(const char *filename)
+{
+ unsigned char *copy = (unsigned char *)xstrdup(filename);
+ unsigned char *in, *out;
+
+ for (in = copy, out = copy; *in != 0; in++) {
+ if (*in == '%' && isxdigit(in[1]) && isxdigit(in[2])) {
+ *out++ = hex2bin(in[1]) * 16 + hex2bin(in[2]);
+ in += 2;
+ }
+ else {
+ *out++ = *in;
+ }
+ }
+
+ *out = 0;
+
+ return (char *)copy;
+}