SkOSFile_stdio.cpp revision 03202c9c3dfbf8c4feb0a1ee9b3680817e633f58
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#ifndef SK_BUILD_FOR_BREW
21
22#include <stdio.h>
23#include <errno.h>
24
25SkFILE* sk_fopen(const char path[], SkFILE_Flags flags)
26{
27    char    perm[4];
28    char*   p = perm;
29
30    if (flags & kRead_SkFILE_Flag)
31        *p++ = 'r';
32    if (flags & kWrite_SkFILE_Flag)
33        *p++ = 'w';
34    *p++ = 'b';
35    *p = 0;
36
37    SkFILE* f = (SkFILE*)::fopen(path, perm);
38#if 0
39    if (NULL == f)
40        SkDebugf("sk_fopen failed for %s (%s), errno=%s\n", path, perm, strerror(errno));
41#endif
42    return f;
43}
44
45size_t sk_fgetsize(SkFILE* f)
46{
47    SkASSERT(f);
48
49    size_t  curr = ::ftell((FILE*)f);       // remember where we are
50    ::fseek((FILE*)f, 0, SEEK_END);         // go to the end
51    size_t size = ::ftell((FILE*)f);        // record the size
52    ::fseek((FILE*)f, (long)curr, SEEK_SET);        // go back to our prev loc
53    return size;
54}
55
56bool sk_frewind(SkFILE* f)
57{
58    SkASSERT(f);
59    ::rewind((FILE*)f);
60//  ::fseek((FILE*)f, 0, SEEK_SET);
61    return true;
62}
63
64size_t sk_fread(void* buffer, size_t byteCount, SkFILE* f)
65{
66    SkASSERT(f);
67    if (buffer == NULL)
68    {
69        size_t curr = ::ftell((FILE*)f);
70        if ((long)curr == -1) {
71            SkDEBUGF(("sk_fread: ftell(%p) returned -1 feof:%d ferror:%d\n", f, feof((FILE*)f), ferror((FILE*)f)));
72            return 0;
73        }
74    //  ::fseek((FILE*)f, (long)(curr + byteCount), SEEK_SET);
75        int err = ::fseek((FILE*)f, (long)byteCount, SEEK_CUR);
76        if (err != 0) {
77            SkDEBUGF(("sk_fread: fseek(%d) tell:%d failed with feof:%d ferror:%d returned:%d\n",
78                        byteCount, curr, feof((FILE*)f), ferror((FILE*)f), err));
79            return 0;
80        }
81        return byteCount;
82    }
83    else
84        return ::fread(buffer, 1, byteCount, (FILE*)f);
85}
86
87size_t sk_fwrite(const void* buffer, size_t byteCount, SkFILE* f)
88{
89    SkASSERT(f);
90    return ::fwrite(buffer, 1, byteCount, (FILE*)f);
91}
92
93void sk_fflush(SkFILE* f)
94{
95    SkASSERT(f);
96    ::fflush((FILE*)f);
97}
98
99void sk_fclose(SkFILE* f)
100{
101    SkASSERT(f);
102    ::fclose((FILE*)f);
103}
104
105#endif
106
107