/
githubmirror
/
efifs
Обзор
Документация
Войти
/
githubmirror
/
efifs
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
v1.1
src/path.c
94 строки
2 KB
Pete Batard
split sources into logical units
09 июл 2014, 04:11
09 июл 2014, 04:11
6472929
Код
Авторство
О чём код?
/* path.c - Path handling routines */ /* * Copyright © 2014 Pete Batard <pete@akeo.ie> * Based on path sanitation code by Ludwig Nussel <ludwig.nussel@suse.de> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <efi.h> #include <efilib.h> #include "driver.h" /* copy src into dest converting the path to a relative one inside the current * directory. dest must hold at least len bytes */ #ifndef PATH_CHAR #define PATH_CHAR '/' #endif VOID CopyPathRelative(CHAR8 *dest, CHAR8 *src, INTN len) { CHAR8* o = dest; CHAR8* p = src; *o = '\0'; while(*p && *p == PATH_CHAR) ++p; for(; len && *p;) { src = p; p = strchra(src, PATH_CHAR); if(!p) p = src+strlena(src); /* . => skip */ if(p-src == 1 && *src == '.' ) { if(*p) src = ++p; } /* .. => pop one */ else if(p-src == 2 && *src == '.' && src[1] == '.') { if(o != dest) { CHAR8* tmp; *o = '\0'; tmp = strrchra(dest, PATH_CHAR); if(!tmp) { len += o-dest; o = dest; if(*p) ++p; } else { len += o-tmp; o = tmp; if(*p) ++p; } } else /* nothing to pop */ if(*p) ++p; } else { INTN copy; if(o != dest) { --len; *o++ = PATH_CHAR; } copy = MIN(p-src,len); CopyMem(o, src, copy); len -= copy; src += copy; o += copy; if(*p) ++p; } while(*p && *p == PATH_CHAR) ++p; } o[len?0:-1] = '\0'; }