1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkOSFile.h"
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
9a8e2e1504b9af6ba791637f228debaa23953064atfarinaSkString SkOSPath::Join(const char *rootPath, const char *relativePath) {
10ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com    SkString result(rootPath);
116eb03cc06d0bc60da5277a83aa0251a475794b04bsalomon    if (!result.endsWith(SkPATH_SEPARATOR) && !result.isEmpty()) {
12ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com        result.appendUnichar(SkPATH_SEPARATOR);
13ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com    }
14ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com    result.append(relativePath);
15ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com    return result;
16ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com}
17ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com
18a8e2e1504b9af6ba791637f228debaa23953064atfarinaSkString SkOSPath::Basename(const char* fullPath) {
19ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com    if (!fullPath) {
20ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com        return SkString();
21ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com    }
22ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com    const char* filename = strrchr(fullPath, SkPATH_SEPARATOR);
23ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com    if (NULL == filename) {
24ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com        filename = fullPath;
25ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com    } else {
26ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com        ++filename;
27ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com    }
28ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com    return SkString(filename);
29ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com}
30ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com
316eb03cc06d0bc60da5277a83aa0251a475794b04bsalomonSkString SkOSPath::Dirname(const char* fullPath) {
326eb03cc06d0bc60da5277a83aa0251a475794b04bsalomon    if (!fullPath) {
336eb03cc06d0bc60da5277a83aa0251a475794b04bsalomon        return SkString();
346eb03cc06d0bc60da5277a83aa0251a475794b04bsalomon    }
356eb03cc06d0bc60da5277a83aa0251a475794b04bsalomon    const char* end = strrchr(fullPath, SkPATH_SEPARATOR);
366eb03cc06d0bc60da5277a83aa0251a475794b04bsalomon    if (NULL == end) {
376eb03cc06d0bc60da5277a83aa0251a475794b04bsalomon        return SkString();
386eb03cc06d0bc60da5277a83aa0251a475794b04bsalomon    }
396eb03cc06d0bc60da5277a83aa0251a475794b04bsalomon    if (end == fullPath) {
406eb03cc06d0bc60da5277a83aa0251a475794b04bsalomon        SkASSERT(fullPath[0] == SkPATH_SEPARATOR);
416eb03cc06d0bc60da5277a83aa0251a475794b04bsalomon        ++end;
426eb03cc06d0bc60da5277a83aa0251a475794b04bsalomon    }
436eb03cc06d0bc60da5277a83aa0251a475794b04bsalomon    return SkString(fullPath, end - fullPath);
446eb03cc06d0bc60da5277a83aa0251a475794b04bsalomon}
456eb03cc06d0bc60da5277a83aa0251a475794b04bsalomon
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_BUILD_FOR_WIN
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
48b50a60c463ae4e2475de8a421b0056b03335b28ereed@android.comstatic uint16_t* concat_to_16(const char src[], const char suffix[])
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
506f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    size_t  i, len = strlen(src);
516f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    size_t  len2 = 3 + (suffix ? strlen(suffix) : 0);
52b50a60c463ae4e2475de8a421b0056b03335b28ereed@android.com    uint16_t* dst = (uint16_t*)sk_malloc_throw((len + len2) * sizeof(uint16_t));
536f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com
546f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    for (i = 0; i < len; i++)
556f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        dst[i] = src[i];
566f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com
576f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    if (i > 0 && dst[i-1] != '/')
586f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        dst[i++] = '/';
596f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    dst[i++] = '*';
606f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com
616f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    if (suffix)
626f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    {
636f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        while (*suffix)
646f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            dst[i++] = *suffix++;
656f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    }
666f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    dst[i] = 0;
676f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    SkASSERT(i + 1 <= len + len2);
686f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com
696f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    return dst;
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////////////
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
74c8ad63e5e42637c65c6b4e0adfacce55730b722dbsalomon@google.comSkOSFile::Iter::Iter() : fHandle(0), fPath16(NULL)
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
78c8ad63e5e42637c65c6b4e0adfacce55730b722dbsalomon@google.comSkOSFile::Iter::Iter(const char path[], const char suffix[]) : fHandle(0), fPath16(NULL)
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
806f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    this->reset(path, suffix);
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkOSFile::Iter::~Iter()
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
856f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    sk_free(fPath16);
866f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    if (fHandle)
876f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        ::FindClose(fHandle);
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkOSFile::Iter::reset(const char path[], const char suffix[])
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
926f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    if (fHandle)
936f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    {
946f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        ::FindClose(fHandle);
956f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        fHandle = 0;
966f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    }
97c8ad63e5e42637c65c6b4e0adfacce55730b722dbsalomon@google.com    if (NULL == path)
986f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        path = "";
996f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com
1006f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    sk_free(fPath16);
1016f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    fPath16 = concat_to_16(path, suffix);
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
104b50a60c463ae4e2475de8a421b0056b03335b28ereed@android.comstatic bool is_magic_dir(const uint16_t dir[])
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1066f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    // return true for "." and ".."
1076f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    return dir[0] == '.' && (dir[1] == 0 || dir[1] == '.' && dir[2] == 0);
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic bool get_the_file(HANDLE handle, SkString* name, WIN32_FIND_DATAW* dataPtr, bool getDir)
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1126f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    WIN32_FIND_DATAW    data;
1136f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com
114c8ad63e5e42637c65c6b4e0adfacce55730b722dbsalomon@google.com    if (NULL == dataPtr)
1156f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    {
1166f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        if (::FindNextFileW(handle, &data))
1176f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            dataPtr = &data;
1186f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        else
1196f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            return false;
1206f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    }
1216f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com
1226f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    for (;;)
1236f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    {
1246f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        if (getDir)
1256f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        {
126c8ad63e5e42637c65c6b4e0adfacce55730b722dbsalomon@google.com            if ((dataPtr->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && !is_magic_dir((uint16_t*)dataPtr->cFileName))
1276f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com                break;
1286f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        }
1296f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        else
1306f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        {
1316f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            if (!(dataPtr->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
1326f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com                break;
1336f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        }
1346f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        if (!::FindNextFileW(handle, dataPtr))
1356f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            return false;
1366f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    }
1376f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    // if we get here, we've found a file/dir
1386f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    if (name)
139c8ad63e5e42637c65c6b4e0adfacce55730b722dbsalomon@google.com        name->setUTF16((uint16_t*)dataPtr->cFileName);
1406f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    return true;
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkOSFile::Iter::next(SkString* name, bool getDir)
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1456f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    WIN32_FIND_DATAW    data;
146c8ad63e5e42637c65c6b4e0adfacce55730b722dbsalomon@google.com    WIN32_FIND_DATAW*   dataPtr = NULL;
1476f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com
1486f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    if (fHandle == 0)   // our first time
1496f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    {
150c8ad63e5e42637c65c6b4e0adfacce55730b722dbsalomon@google.com        if (fPath16 == NULL || *fPath16 == 0)    // check for no path
1516f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            return false;
1526f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com
153c8ad63e5e42637c65c6b4e0adfacce55730b722dbsalomon@google.com        fHandle = ::FindFirstFileW((LPCWSTR)fPath16, &data);
1546f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        if (fHandle != 0 && fHandle != (HANDLE)~0)
1556f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            dataPtr = &data;
1566f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    }
1576f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    return fHandle != (HANDLE)~0 && get_the_file(fHandle, name, dataPtr, getDir);
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
160867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com#elif defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_IOS)
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 0
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comOSStatus FSPathMakeRef (
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   const UInt8 * path,
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   FSRef * ref,
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   Boolean * isDirectory
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com);
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkOSFile::Iter::Iter() : fDIR(0)
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkOSFile::Iter::Iter(const char path[], const char suffix[]) : fDIR(0)
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1766f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    this->reset(path, suffix);
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkOSFile::Iter::~Iter()
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1816f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    if (fDIR)
1826f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        ::closedir(fDIR);
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkOSFile::Iter::reset(const char path[], const char suffix[])
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1876f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    if (fDIR)
1886f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    {
1896f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        ::closedir(fDIR);
1906f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        fDIR = 0;
1916f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    }
1926f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com
1936f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    fPath.set(path);
1946f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    if (path)
1956f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    {
1966f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        fDIR = ::opendir(path);
1976f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        fSuffix.set(suffix);
1986f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    }
1996f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    else
2006f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        fSuffix.reset();
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// returns true if suffix is empty, or if str ends with suffix
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic bool issuffixfor(const SkString& suffix, const char str[])
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2066f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    size_t  suffixLen = suffix.size();
2076f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    size_t  strLen = strlen(str);
2080afaf9b563c79ddafbceec5389806061b0989916agl@chromium.org
2096f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    return  strLen >= suffixLen &&
2106f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            memcmp(suffix.c_str(), str + strLen - suffixLen, suffixLen) == 0;
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include <sys/stat.h>
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkOSFile::Iter::next(SkString* name, bool getDir)
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2176f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    if (fDIR)
2186f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    {
2196f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        dirent* entry;
2206f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com
2216f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        while ((entry = ::readdir(fDIR)) != NULL)
2226f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        {
2236f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            struct stat s;
2246f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            SkString    str(fPath);
2256f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com
2266f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            if (!str.endsWith("/") && !str.endsWith("\\"))
2276f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com                str.append("/");
2286f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            str.append(entry->d_name);
2296f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com
2306f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            if (0 == stat(str.c_str(), &s))
2316f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            {
2326f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com                if (getDir)
2336f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com                {
2346f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com                    if (s.st_mode & S_IFDIR)
2356f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com                        break;
2366f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com                }
2376f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com                else
2386f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com                {
2396f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com                    if (!(s.st_mode & S_IFDIR) && issuffixfor(fSuffix, entry->d_name))
2406f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com                        break;
2416f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com                }
2426f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            }
2436f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        }
2446f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        if (entry)  // we broke out with a file
2456f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        {
2466f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            if (name)
2476f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com                name->set(entry->d_name);
2486f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com            return true;
2496f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com        }
2506f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    }
2516f25297d93ed7fb29264cd072ad15ec25d1e27e7reed@android.com    return false;
2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
253ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com#endif // if one of:SK_BUILD_FOR_MAC, SK_BUILD_FOR_UNIX, SK_BUILD_FOR_ANDROID,SK_BUILD_FOR_IOS
254