Skip to content

Instantly share code, notes, and snippets.

@quetz
Created February 17, 2017 18:13
Show Gist options
  • Save quetz/7d5e0f3fa6e17bff166c267f318325d7 to your computer and use it in GitHub Desktop.
Save quetz/7d5e0f3fa6e17bff166c267f318325d7 to your computer and use it in GitHub Desktop.
path normalizer, ugly c
char *normalize(char *src) {
char *r = (char *)(malloc(strlen(src)+2));
char *dst = r;
if (*src != '/') {
*dst++ = '/';
}
char *bt = dst;
char *bt2 = dst;
int dot = 0;
while (*src) {
*dst++ = *src;
switch (*src) {
case '/':
if (dot == 1) {
dst = bt;
} else if (dot == 2) {
dst = bt2;
bt = bt2;
} else {
bt2 = bt;
bt = dst;
}
dot = 0;
break;
case '.':
dot++;
break;
default:
dot = 0;
break;
}
src++;
}
*dst = 0;
return r;
}
@voidlizard
Copy link

voidlizard commented Feb 18, 2017

Есть мнение, что для задачи нужны динамические структуры данных, потому что последовательных конструктов /../../ может быть сколько угодно. Например:

fprintf(stdout, "%s\n", normalize("/a/b/c/d/e/f/../../../../g"));
> /a/b/c/d/e/g

но

λ> import System.Path
λ> absNormPath "" "/a/b/c/d/e/f/../../../../g"
Just "/a/b/g"

т.е в сях нужно что-то типа списков (удобнее всего в данном случае) и сразу и преимущества
сей не такие разительные, и список надо сперва написать, с reverse и intercalate или аналогом.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment