Пример #1
0
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
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #4
0
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);
}
Пример #5
0
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;
    }
}