int FindSepar(const FChar *s) throw() { for (const FChar *p = s;; p++) { const FChar c = *p; if (c == 0) return -1; if (IS_SEPAR(c)) return (int)(p - s); } }
static int ReverseFind_PathSepar(const wchar_t *s) { int separ = -1; int i; for (i = 0;; i++) { wchar_t c = s[i]; if (c == 0) return separ; if (IS_SEPAR(c)) separ = i; } }
static WRes CreateComplexDir() { WCHAR s[MAX_PATH + 10]; unsigned prefixSize = 0; WRes wres; { size_t len = wcslen(path); if (len > MAX_PATH) return ERROR_INVALID_NAME; wcscpy(s, path); } if (IS_DRIVE_PATH(s)) prefixSize = 3; else if (IS_SEPAR(s[0]) && IS_SEPAR(s[1])) prefixSize = 2; else return ERROR_INVALID_NAME; { DWORD attrib = GetFileAttributesW(s); if (attrib != INVALID_FILE_ATTRIBUTES) return (attrib & FILE_ATTRIBUTE_DIRECTORY) != 0 ? 0 : ERROR_ALREADY_EXISTS; } wres = MyCreateDir(s); if (wres == 0 || wres == ERROR_ALREADY_EXISTS) return 0; { size_t len = wcslen(s); { int pos = ReverseFind_PathSepar(s); if (pos < 0) return wres; if ((unsigned)pos < prefixSize) return wres; if ((unsigned)pos == len - 1) { if (len == 1) return 0; s[pos] = 0; len = pos; } } for (;;) { int pos; wres = MyCreateDir(s); if (wres == 0) break; if (wres == ERROR_ALREADY_EXISTS) { DWORD attrib = GetFileAttributesW(s); if (attrib != INVALID_FILE_ATTRIBUTES) if ((attrib & FILE_ATTRIBUTE_DIRECTORY) == 0) return ERROR_ALREADY_EXISTS; break; } pos = ReverseFind_PathSepar(s); if (pos < 0 || pos == 0 || (unsigned)pos < prefixSize) return wres; s[pos] = 0; } for (;;) { size_t pos = wcslen(s); if (pos >= len) return 0; s[pos] = CHAR_PATH_SEPARATOR; wres = MyCreateDir(s); if (wres != 0) return wres; } } }