gfx/skia/trunk/src/ports/SkOSFile_stdio.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/gfx/skia/trunk/src/ports/SkOSFile_stdio.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,165 @@
     1.4 +/*
     1.5 + * Copyright 2006 The Android Open Source Project
     1.6 + *
     1.7 + * Use of this source code is governed by a BSD-style license that can be
     1.8 + * found in the LICENSE file.
     1.9 + */
    1.10 +
    1.11 +#include "SkOSFile.h"
    1.12 +
    1.13 +#include <errno.h>
    1.14 +#include <stdio.h>
    1.15 +#include <sys/stat.h>
    1.16 +#include <sys/types.h>
    1.17 +
    1.18 +#ifdef _WIN32
    1.19 +#include <direct.h>
    1.20 +#include <io.h>
    1.21 +#else
    1.22 +#include <unistd.h>
    1.23 +#endif
    1.24 +
    1.25 +SkFILE* sk_fopen(const char path[], SkFILE_Flags flags) {
    1.26 +    char    perm[4];
    1.27 +    char*   p = perm;
    1.28 +
    1.29 +    if (flags & kRead_SkFILE_Flag) {
    1.30 +        *p++ = 'r';
    1.31 +    }
    1.32 +    if (flags & kWrite_SkFILE_Flag) {
    1.33 +        *p++ = 'w';
    1.34 +    }
    1.35 +    *p++ = 'b';
    1.36 +    *p = 0;
    1.37 +
    1.38 +    //TODO: on Windows fopen is just ASCII or the current code page,
    1.39 +    //convert to utf16 and use _wfopen
    1.40 +    return (SkFILE*)::fopen(path, perm);
    1.41 +}
    1.42 +
    1.43 +char* sk_fgets(char* str, int size, SkFILE* f) {
    1.44 +    return ::fgets(str, size, (FILE *)f);
    1.45 +}
    1.46 +
    1.47 +int sk_feof(SkFILE *f) {
    1.48 +    // no :: namespace qualifier because it breaks android
    1.49 +    return feof((FILE *)f);
    1.50 +}
    1.51 +
    1.52 +size_t sk_fgetsize(SkFILE* f) {
    1.53 +    SkASSERT(f);
    1.54 +
    1.55 +    long curr = ::ftell((FILE*)f); // remember where we are
    1.56 +    if (curr < 0) {
    1.57 +        return 0;
    1.58 +    }
    1.59 +
    1.60 +    ::fseek((FILE*)f, 0, SEEK_END); // go to the end
    1.61 +    long size = ::ftell((FILE*)f); // record the size
    1.62 +    if (size < 0) {
    1.63 +        size = 0;
    1.64 +    }
    1.65 +
    1.66 +    ::fseek((FILE*)f, curr, SEEK_SET); // go back to our prev location
    1.67 +    return size;
    1.68 +}
    1.69 +
    1.70 +bool sk_frewind(SkFILE* f) {
    1.71 +    SkASSERT(f);
    1.72 +    ::rewind((FILE*)f);
    1.73 +    return true;
    1.74 +}
    1.75 +
    1.76 +size_t sk_fread(void* buffer, size_t byteCount, SkFILE* f) {
    1.77 +    SkASSERT(f);
    1.78 +    if (buffer == NULL) {
    1.79 +        size_t curr = ::ftell((FILE*)f);
    1.80 +        if ((long)curr == -1) {
    1.81 +            SkDEBUGF(("sk_fread: ftell(%p) returned -1 feof:%d ferror:%d\n", f, feof((FILE*)f), ferror((FILE*)f)));
    1.82 +            return 0;
    1.83 +        }
    1.84 +        int err = ::fseek((FILE*)f, (long)byteCount, SEEK_CUR);
    1.85 +        if (err != 0) {
    1.86 +            SkDEBUGF(("sk_fread: fseek(%d) tell:%d failed with feof:%d ferror:%d returned:%d\n",
    1.87 +                        byteCount, curr, feof((FILE*)f), ferror((FILE*)f), err));
    1.88 +            return 0;
    1.89 +        }
    1.90 +        return byteCount;
    1.91 +    }
    1.92 +    else
    1.93 +        return ::fread(buffer, 1, byteCount, (FILE*)f);
    1.94 +}
    1.95 +
    1.96 +size_t sk_fwrite(const void* buffer, size_t byteCount, SkFILE* f) {
    1.97 +    SkASSERT(f);
    1.98 +    return ::fwrite(buffer, 1, byteCount, (FILE*)f);
    1.99 +}
   1.100 +
   1.101 +void sk_fflush(SkFILE* f) {
   1.102 +    SkASSERT(f);
   1.103 +    ::fflush((FILE*)f);
   1.104 +}
   1.105 +
   1.106 +bool sk_fseek(SkFILE* f, size_t byteCount) {
   1.107 +    int err = ::fseek((FILE*)f, (long)byteCount, SEEK_SET);
   1.108 +    return err == 0;
   1.109 +}
   1.110 +
   1.111 +bool sk_fmove(SkFILE* f, long byteCount) {
   1.112 +    int err = ::fseek((FILE*)f, byteCount, SEEK_CUR);
   1.113 +    return err == 0;
   1.114 +}
   1.115 +
   1.116 +size_t sk_ftell(SkFILE* f) {
   1.117 +    long curr = ::ftell((FILE*)f);
   1.118 +    if (curr < 0) {
   1.119 +        return 0;
   1.120 +    }
   1.121 +    return curr;
   1.122 +}
   1.123 +
   1.124 +void sk_fclose(SkFILE* f) {
   1.125 +    SkASSERT(f);
   1.126 +    ::fclose((FILE*)f);
   1.127 +}
   1.128 +
   1.129 +bool sk_exists(const char *path) {
   1.130 +#ifdef _WIN32
   1.131 +    return (0 == _access(path, 0));
   1.132 +#else
   1.133 +    return (0 == access(path, 0));
   1.134 +#endif
   1.135 +}
   1.136 +
   1.137 +bool sk_isdir(const char *path) {
   1.138 +    struct stat status;
   1.139 +    if (0 != stat(path, &status)) {
   1.140 +        return false;
   1.141 +    }
   1.142 +    return SkToBool(status.st_mode & S_IFDIR);
   1.143 +}
   1.144 +
   1.145 +bool sk_mkdir(const char* path) {
   1.146 +    if (sk_isdir(path)) {
   1.147 +        return true;
   1.148 +    }
   1.149 +    if (sk_exists(path)) {
   1.150 +        fprintf(stderr,
   1.151 +                "sk_mkdir: path '%s' already exists but is not a directory\n",
   1.152 +                path);
   1.153 +        return false;
   1.154 +    }
   1.155 +
   1.156 +    int retval;
   1.157 +#ifdef _WIN32
   1.158 +    retval = _mkdir(path);
   1.159 +#else
   1.160 +    retval = mkdir(path, 0777);
   1.161 +#endif
   1.162 +    if (0 == retval) {
   1.163 +        return true;
   1.164 +    } else {
   1.165 +        fprintf(stderr, "sk_mkdir: error %d creating dir '%s'\n", errno, path);
   1.166 +        return false;
   1.167 +    }
   1.168 +}

mercurial