180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// TODO: add unittests for all these operations 11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkOSFile_DEFINED 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkOSFile_DEFINED 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h" 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_IOS) 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #include <dirent.h> 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#include <stddef.h> // ptrdiff_t 22d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustruct SkFILE; 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruenum SkFILE_Flags { 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kRead_SkFILE_Flag = 0x01, 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kWrite_SkFILE_Flag = 0x02 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 30363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef _WIN32 31363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerconst static char SkPATH_SEPARATOR = '\\'; 32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#else 33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerconst static char SkPATH_SEPARATOR = '/'; 34363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkFILE* sk_fopen(const char path[], SkFILE_Flags); 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid sk_fclose(SkFILE*); 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querusize_t sk_fgetsize(SkFILE*); 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Return true if the file could seek back to the beginning 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/ 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool sk_frewind(SkFILE*); 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querusize_t sk_fread(void* buffer, size_t byteCount, SkFILE*); 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querusize_t sk_fwrite(const void* buffer, size_t byteCount, SkFILE*); 46d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 47d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerchar* sk_fgets(char* str, int size, SkFILE* f); 48d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid sk_fflush(SkFILE*); 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerbool sk_fseek(SkFILE*, size_t); 5258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerbool sk_fmove(SkFILE*, long); 53d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergersize_t sk_ftell(SkFILE*); 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/** Maps a file into memory. Returns the address and length on success, NULL otherwise. 5658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * The mapping is read only. 5758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * When finished with the mapping, free the returned pointer with sk_fmunmap. 5858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 5958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergervoid* sk_fmmap(SkFILE* f, size_t* length); 6058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 6158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/** Maps a file descriptor into memory. Returns the address and length on success, NULL otherwise. 6258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * The mapping is read only. 6358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * When finished with the mapping, free the returned pointer with sk_fmunmap. 6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 6558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergervoid* sk_fdmmap(int fd, size_t* length); 6658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 6758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/** Unmaps a file previously mapped by sk_fmmap or sk_fdmmap. 6858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * The length parameter must be the same as returned from sk_fmmap. 6958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 7058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergervoid sk_fmunmap(const void* addr, size_t length); 7158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 7258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/** Returns true if the two point at the exact same filesystem object. */ 7358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerbool sk_fidentical(SkFILE* a, SkFILE* b); 7458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 7558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/** Returns the underlying file descriptor for the given file. 7658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * The return value will be < 0 on failure. 7758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 7858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerint sk_fileno(SkFILE* f); 7958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 80363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Returns true if something (file, directory, ???) exists at this path. 81363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerbool sk_exists(const char *path); 82363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 83363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Returns true if a directory exists at this path. 84363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerbool sk_isdir(const char *path); 85363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 86d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger// Have we reached the end of the file? 87d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerint sk_feof(SkFILE *); 88d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 89d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 90363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Create a new directory at this path; returns true if successful. 91363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// If the directory already existed, this will return true. 92363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Description of the error, if any, will be written to stderr. 93363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerbool sk_mkdir(const char* path); 94363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkOSFile { 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru class Iter { 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru public: 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Iter(); 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Iter(const char path[], const char suffix[] = NULL); 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ~Iter(); 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void reset(const char path[], const char suffix[] = NULL); 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** If getDir is true, only returns directories. 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Results are undefined if true and false calls are 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interleaved on a single iterator. 10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool next(SkString* name, bool getDir = false); 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru private: 11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_BUILD_FOR_WIN 11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru HANDLE fHandle; 11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru uint16_t* fPath16; 11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#elif defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_IOS) 11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru DIR* fDIR; 11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString fPath, fSuffix; 11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkUTF16_Str { 12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkUTF16_Str(const char src[]); 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ~SkUTF16_Str() 12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { 12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru sk_free(fStr); 12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const uint16_t* get() const { return fStr; } 12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru uint16_t* fStr; 13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/** 13558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Functions for modifying SkStrings which represent paths on the filesystem. 13658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 13758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerclass SkOSPath { 13858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerpublic: 13958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger /** 14058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Assembles rootPath and relativePath into a single path, like this: 14158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * rootPath/relativePath. 14258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * It is okay to call with a NULL rootPath and/or relativePath. A path 14358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * separator will still be inserted. 14458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * 14558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Uses SkPATH_SEPARATOR, to work on all platforms. 14658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 14758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger static SkString SkPathJoin(const char *rootPath, const char *relativePath); 14858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 14958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger /** 15058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Return the name of the file, ignoring the directory structure. 15158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Behaves like python's os.path.basename. If the fullPath is 15258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * /dir/subdir/, an empty string is returned. 15358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @param fullPath Full path to the file. 15458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @return SkString The basename of the file - anything beyond the 15558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * final slash, or the full name if there is no slash. 15658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 15758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger static SkString SkBasename(const char* fullPath); 15858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}; 15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 160