1 /* libs/graphics/ports/SkOSFile_stdio.cpp
2 **
3 ** Copyright 2006, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 ** http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17
18 #include "SkOSFile.h"
19
20 #include <stdio.h>
21 #include <errno.h>
22
sk_fopen(const char path[],SkFILE_Flags flags)23 SkFILE* sk_fopen(const char path[], SkFILE_Flags flags)
24 {
25 char perm[4];
26 char* p = perm;
27
28 if (flags & kRead_SkFILE_Flag)
29 *p++ = 'r';
30 if (flags & kWrite_SkFILE_Flag)
31 *p++ = 'w';
32 *p++ = 'b';
33 *p = 0;
34
35 SkFILE* f = (SkFILE*)::fopen(path, perm);
36 #if 0
37 if (NULL == f)
38 SkDebugf("sk_fopen failed for %s (%s), errno=%s\n", path, perm, strerror(errno));
39 #endif
40 return f;
41 }
42
sk_fgetsize(SkFILE * f)43 size_t sk_fgetsize(SkFILE* f)
44 {
45 SkASSERT(f);
46
47 size_t curr = ::ftell((FILE*)f); // remember where we are
48 ::fseek((FILE*)f, 0, SEEK_END); // go to the end
49 size_t size = ::ftell((FILE*)f); // record the size
50 ::fseek((FILE*)f, (long)curr, SEEK_SET); // go back to our prev loc
51 return size;
52 }
53
sk_frewind(SkFILE * f)54 bool sk_frewind(SkFILE* f)
55 {
56 SkASSERT(f);
57 ::rewind((FILE*)f);
58 // ::fseek((FILE*)f, 0, SEEK_SET);
59 return true;
60 }
61
sk_fread(void * buffer,size_t byteCount,SkFILE * f)62 size_t sk_fread(void* buffer, size_t byteCount, SkFILE* f)
63 {
64 SkASSERT(f);
65 if (buffer == NULL)
66 {
67 size_t curr = ::ftell((FILE*)f);
68 if ((long)curr == -1) {
69 SkDEBUGF(("sk_fread: ftell(%p) returned -1 feof:%d ferror:%d\n", f, feof((FILE*)f), ferror((FILE*)f)));
70 return 0;
71 }
72 // ::fseek((FILE*)f, (long)(curr + byteCount), SEEK_SET);
73 int err = ::fseek((FILE*)f, (long)byteCount, SEEK_CUR);
74 if (err != 0) {
75 SkDEBUGF(("sk_fread: fseek(%d) tell:%d failed with feof:%d ferror:%d returned:%d\n",
76 byteCount, curr, feof((FILE*)f), ferror((FILE*)f), err));
77 return 0;
78 }
79 return byteCount;
80 }
81 else
82 return ::fread(buffer, 1, byteCount, (FILE*)f);
83 }
84
sk_fwrite(const void * buffer,size_t byteCount,SkFILE * f)85 size_t sk_fwrite(const void* buffer, size_t byteCount, SkFILE* f)
86 {
87 SkASSERT(f);
88 return ::fwrite(buffer, 1, byteCount, (FILE*)f);
89 }
90
sk_fflush(SkFILE * f)91 void sk_fflush(SkFILE* f)
92 {
93 SkASSERT(f);
94 ::fflush((FILE*)f);
95 }
96
sk_fclose(SkFILE * f)97 void sk_fclose(SkFILE* f)
98 {
99 SkASSERT(f);
100 ::fclose((FILE*)f);
101 }
102
103