1 2/* 3 * Copyright 2006 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10#include "SkOSFile.h" 11 12#include <stdio.h> 13#include <errno.h> 14 15SkFILE* sk_fopen(const char path[], SkFILE_Flags flags) 16{ 17 char perm[4]; 18 char* p = perm; 19 20 if (flags & kRead_SkFILE_Flag) 21 *p++ = 'r'; 22 if (flags & kWrite_SkFILE_Flag) 23 *p++ = 'w'; 24 *p++ = 'b'; 25 *p = 0; 26 27 SkFILE* f = (SkFILE*)::fopen(path, perm); 28#if 0 29 if (NULL == f) 30 SkDebugf("sk_fopen failed for %s (%s), errno=%s\n", path, perm, strerror(errno)); 31#endif 32 return f; 33} 34 35size_t sk_fgetsize(SkFILE* f) 36{ 37 SkASSERT(f); 38 39 size_t curr = ::ftell((FILE*)f); // remember where we are 40 ::fseek((FILE*)f, 0, SEEK_END); // go to the end 41 size_t size = ::ftell((FILE*)f); // record the size 42 ::fseek((FILE*)f, (long)curr, SEEK_SET); // go back to our prev loc 43 return size; 44} 45 46bool sk_frewind(SkFILE* f) 47{ 48 SkASSERT(f); 49 ::rewind((FILE*)f); 50// ::fseek((FILE*)f, 0, SEEK_SET); 51 return true; 52} 53 54size_t sk_fread(void* buffer, size_t byteCount, SkFILE* f) 55{ 56 SkASSERT(f); 57 if (buffer == NULL) 58 { 59 size_t curr = ::ftell((FILE*)f); 60 if ((long)curr == -1) { 61 SkDEBUGF(("sk_fread: ftell(%p) returned -1 feof:%d ferror:%d\n", f, feof((FILE*)f), ferror((FILE*)f))); 62 return 0; 63 } 64 // ::fseek((FILE*)f, (long)(curr + byteCount), SEEK_SET); 65 int err = ::fseek((FILE*)f, (long)byteCount, SEEK_CUR); 66 if (err != 0) { 67 SkDEBUGF(("sk_fread: fseek(%d) tell:%d failed with feof:%d ferror:%d returned:%d\n", 68 byteCount, curr, feof((FILE*)f), ferror((FILE*)f), err)); 69 return 0; 70 } 71 return byteCount; 72 } 73 else 74 return ::fread(buffer, 1, byteCount, (FILE*)f); 75} 76 77size_t sk_fwrite(const void* buffer, size_t byteCount, SkFILE* f) 78{ 79 SkASSERT(f); 80 return ::fwrite(buffer, 1, byteCount, (FILE*)f); 81} 82 83void sk_fflush(SkFILE* f) 84{ 85 SkASSERT(f); 86 ::fflush((FILE*)f); 87} 88 89void sk_fclose(SkFILE* f) 90{ 91 SkASSERT(f); 92 ::fclose((FILE*)f); 93} 94 95