blob: 1254394431a18261f8757fcc204d460fdefee92c [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
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
reed@android.com8a1c16f2008-12-17 15:59:43 +00009
10#include "SkOSFile.h"
11
reed@android.com8a1c16f2008-12-17 15:59:43 +000012#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
vandebo@chromium.org6390c722012-03-28 21:03:22 +000039 long curr = ::ftell((FILE*)f); // remember where we are
40 if (curr < 0) {
41 return 0;
42 }
reed@android.com8a1c16f2008-12-17 15:59:43 +000043 ::fseek((FILE*)f, 0, SEEK_END); // go to the end
vandebo@chromium.org6390c722012-03-28 21:03:22 +000044 long size = ::ftell((FILE*)f); // record the size
45 if (size < 0) {
46 size = 0;
47 }
48 ::fseek((FILE*)f, curr, SEEK_SET); // go back to our prev loc
reed@android.com8a1c16f2008-12-17 15:59:43 +000049 return size;
50}
51
52bool sk_frewind(SkFILE* f)
53{
54 SkASSERT(f);
55 ::rewind((FILE*)f);
56// ::fseek((FILE*)f, 0, SEEK_SET);
57 return true;
58}
59
60size_t sk_fread(void* buffer, size_t byteCount, SkFILE* f)
61{
62 SkASSERT(f);
63 if (buffer == NULL)
64 {
65 size_t curr = ::ftell((FILE*)f);
66 if ((long)curr == -1) {
67 SkDEBUGF(("sk_fread: ftell(%p) returned -1 feof:%d ferror:%d\n", f, feof((FILE*)f), ferror((FILE*)f)));
68 return 0;
69 }
70 // ::fseek((FILE*)f, (long)(curr + byteCount), SEEK_SET);
71 int err = ::fseek((FILE*)f, (long)byteCount, SEEK_CUR);
72 if (err != 0) {
73 SkDEBUGF(("sk_fread: fseek(%d) tell:%d failed with feof:%d ferror:%d returned:%d\n",
74 byteCount, curr, feof((FILE*)f), ferror((FILE*)f), err));
75 return 0;
76 }
77 return byteCount;
78 }
79 else
80 return ::fread(buffer, 1, byteCount, (FILE*)f);
81}
82
83size_t sk_fwrite(const void* buffer, size_t byteCount, SkFILE* f)
84{
85 SkASSERT(f);
86 return ::fwrite(buffer, 1, byteCount, (FILE*)f);
87}
88
89void sk_fflush(SkFILE* f)
90{
91 SkASSERT(f);
92 ::fflush((FILE*)f);
93}
94
95void sk_fclose(SkFILE* f)
96{
97 SkASSERT(f);
98 ::fclose((FILE*)f);
99}
100