Skip to content

Instantly share code, notes, and snippets.

@Eugeny
Created March 10, 2013 09:31
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Eugeny/5127791 to your computer and use it in GitHub Desktop.
Save Eugeny/5127791 to your computer and use it in GitHub Desktop.
#include <lang/libc-ext.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <limits.h>
char * normalize_path(char* pwd, const char * src, char* res) {
size_t res_len;
size_t src_len = strlen(src);
const char * ptr = src;
const char * end = &src[src_len];
const char * next;
if (src_len == 0 || src[0] != '/') {
// relative path
size_t pwd_len;
pwd_len = strlen(pwd);
memcpy(res, pwd, pwd_len);
res_len = pwd_len;
} else {
res_len = 0;
}
for (ptr = src; ptr < end; ptr=next+1) {
size_t len;
next = (char*)memchr(ptr, '/', end-ptr);
if (next == NULL) {
next = end;
}
len = next-ptr;
switch(len) {
case 2:
if (ptr[0] == '.' && ptr[1] == '.') {
const char * slash = (char*)memrchr(res, '/', res_len);
if (slash != NULL) {
res_len = slash - res;
}
continue;
}
break;
case 1:
if (ptr[0] == '.') {
continue;
}
break;
case 0:
continue;
}
if (res_len != 1)
res[res_len++] = '/';
memcpy(&res[res_len], ptr, len);
res_len += len;
}
if (res_len == 0) {
res[res_len++] = '/';
}
res[res_len] = '\0';
return res;
}
@neurobin
Copy link

Can you give an example...?
#include <lang/libc-ext.h> seems to be not required. It shows error in compiler (it can't find it).
And what should be the three arguments be...?

@dgoo2308
Copy link

dgoo2308 commented Nov 5, 2017

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