int merge(char *name, char *dest, int dest_size) {
    char *end, c;

    if (*name == '/') {
	name++;
	end = dest;
    } else {
	char *str;
	mp_uint len;

	str = sv_string(CURRENT_FILE, &len);
	end = &str[len];
	name -= 3;
	do {
	    name += 3;
	    while (*--end != '/');
	} while (end != str && !strncmp(name, "../", 3));
	if (end - str + strlen(name) >= dest_size)
	    return 0;
	memcpy(dest, str, end - str);
	end += dest - str;
    }
    *end = '/';
    c = *name++;
    for (;;) {
	switch (c) {
	  case '\0':
	    *end++ = '\0';
	    return 1;
	  case '/':
	    break;
	  case '.':
	    if ((c = *name++) == '/')
		break;
	    if (c == '.' && *name == '/') {
		name++;
		if (end != dest)
		    while (*--end != '/');
		break;
	    }
	    *++end = '.';
	    if (!c)
		continue;
	  default:
	    do *++end = c; while (c = *name++ && c != '/');
	    *++end = c;
	    if (!c)
		return 1;
	}
	c = *name++;
    }
}
