CHAR8 * strrchra(IN const CHAR8 *s, const INTN c) { CHAR8 *found, *p, ch = (CHAR8)c; /* Since strchr is fast, we use it rather than the obvious loop. */ if (ch == '\0') return strchra(s, '\0'); found = NULL; while ((p = strchra(s, ch)) != NULL) { found = p; s = p + 1; } return (CHAR8 *) found; }
CHAR8 * strtok_simple(CHAR8 *in, CHAR8 c) { static CHAR8 *last; CHAR8 *tmp; if (in == NULL) in = last; if (in == NULL) return NULL; if (*in == c) in++; tmp = strchra(in, c); if (tmp) { *tmp = '\0'; last = tmp+1; } else { last = NULL; } return in; }
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'; }