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 :
15 0 : SkFILE* sk_fopen(const char path[], SkFILE_Flags flags)
16 : {
17 : char perm[4];
18 0 : char* p = perm;
19 :
20 0 : if (flags & kRead_SkFILE_Flag)
21 0 : *p++ = 'r';
22 0 : if (flags & kWrite_SkFILE_Flag)
23 0 : *p++ = 'w';
24 0 : *p++ = 'b';
25 0 : *p = 0;
26 :
27 0 : 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 0 : return f;
33 : }
34 :
35 0 : size_t sk_fgetsize(SkFILE* f)
36 : {
37 0 : SkASSERT(f);
38 :
39 0 : size_t curr = ::ftell((FILE*)f); // remember where we are
40 0 : ::fseek((FILE*)f, 0, SEEK_END); // go to the end
41 0 : size_t size = ::ftell((FILE*)f); // record the size
42 0 : ::fseek((FILE*)f, (long)curr, SEEK_SET); // go back to our prev loc
43 0 : return size;
44 : }
45 :
46 0 : bool sk_frewind(SkFILE* f)
47 : {
48 0 : SkASSERT(f);
49 0 : ::rewind((FILE*)f);
50 : // ::fseek((FILE*)f, 0, SEEK_SET);
51 0 : return true;
52 : }
53 :
54 0 : size_t sk_fread(void* buffer, size_t byteCount, SkFILE* f)
55 : {
56 0 : SkASSERT(f);
57 0 : if (buffer == NULL)
58 : {
59 0 : size_t curr = ::ftell((FILE*)f);
60 0 : if ((long)curr == -1) {
61 0 : SkDEBUGF(("sk_fread: ftell(%p) returned -1 feof:%d ferror:%d\n", f, feof((FILE*)f), ferror((FILE*)f)));
62 0 : return 0;
63 : }
64 : // ::fseek((FILE*)f, (long)(curr + byteCount), SEEK_SET);
65 0 : int err = ::fseek((FILE*)f, (long)byteCount, SEEK_CUR);
66 0 : if (err != 0) {
67 0 : SkDEBUGF(("sk_fread: fseek(%d) tell:%d failed with feof:%d ferror:%d returned:%d\n",
68 0 : byteCount, curr, feof((FILE*)f), ferror((FILE*)f), err));
69 0 : return 0;
70 : }
71 0 : return byteCount;
72 : }
73 : else
74 0 : return ::fread(buffer, 1, byteCount, (FILE*)f);
75 : }
76 :
77 0 : size_t sk_fwrite(const void* buffer, size_t byteCount, SkFILE* f)
78 : {
79 0 : SkASSERT(f);
80 0 : return ::fwrite(buffer, 1, byteCount, (FILE*)f);
81 : }
82 :
83 0 : void sk_fflush(SkFILE* f)
84 : {
85 0 : SkASSERT(f);
86 0 : ::fflush((FILE*)f);
87 0 : }
88 :
89 0 : void sk_fclose(SkFILE* f)
90 : {
91 0 : SkASSERT(f);
92 0 : ::fclose((FILE*)f);
93 0 : }
94 :
|