#include #include #include #include "yuri.h" static int _eat(struct uri *u, int index) { int i; char **path; free(u->path[index]); for (i = index+1; i < u->npath; i++) u->path[i-1] = u->path[i]; u->npath--; if (u->npath == 0) { free(u->path); u->path = NULL; } else { path = realloc(u->path, sizeof(*u->path)*u->npath); if (path == NULL) return -1; u->path = path; } return 0; } int uri_normalize(struct uri *u) { int i; if (u->scheme) { for (i = 0; i < strlen(u->scheme); i++) { if (isalpha(u->scheme[i])) u->scheme[i] = tolower(u->scheme[i]); } } if (u->authority.host) { for (i = 0; i < strlen(u->authority.host); i++) { if (isalpha(u->authority.host[i])) u->authority.host[i] = tolower(u->authority.host[i]); } } for (i = 0; i < u->npath; i++) { if (strcmp(u->path[i], ".") == 0) { if (_eat(u, i) == -1) return -1; } if (strcmp(u->path[i], "..") == 0) { if (u->npath >= 2 && i-1 >= 0) { if (_eat(u, i-1) == -1) return -1; if (_eat(u, i-1) == -1) return -1; } } } return 0; }