int fn_cleanpath(const char *name, char *newname, size_t size, int flags) { size_t l = 0; size_t n = 0; int slashes = 0; #define add(x) if (l >= size) return -1; else newname[l++] = (x) name = fn_skip_drive(name); while (*name && fn_is_sep(*name)) name++; while (name[n]) { size_t last_n; assert(!fn_is_sep(name[n])); last_n = n++; while (name[n] && !fn_is_sep(name[n])) n++; if (n - last_n == 2 && name[n-2] == '.' && name[n-1] == '.') { if (flags & 1) return -2; while (l > 0) { if (newname[--l] == '/') { --slashes; break; } } /* newname[l] = 0; printf("del %s\n", newname); */ } else if (n - last_n == 1 && name[n-1] == '.') { if (flags & 2) return -3; } else { if (l > 0) { ++slashes; add('/'); } while (last_n < n) { add(name[last_n++]); } /* newname[l] = 0; printf("add %s\n", newname); */ } while (name[n] && fn_is_sep(name[n])) n++; } add('\0'); return slashes; #undef add }
char *fn_basename(const char *name) { const char *n, *nn; name = fn_skip_drive(name); for (nn = n = name; *nn; nn++) if (fn_is_sep(*nn)) n = nn + 1; return ACC_UNCONST_CAST(char *, n); }
char *fn_basename(const char *name) { const char *n, *nn; name = fn_skip_drive(name); for (nn = n = name; *nn; nn++) if (fn_is_sep(*nn)) n = nn + 1; return const_cast<char *>(n); }
unsigned fn_baseindex(const char *name) { const char *n, *nn; n = fn_skip_drive(name); for (nn = n; *nn; nn++) if (fn_is_sep(*nn)) n = nn + 1; return (unsigned) (n - name); }
void fn_addslash(char *name, bool slash) { char *p; name = fn_skip_drive(name); p = name + strlen(name); while (p > name && fn_is_sep(p[-1])) *p-- = 0; if (p > name) { if (slash) *p++ = dir_sep[0]; *p = 0; } }