1 /*
2  * Copyright 2017 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SKSL_FILEOUTPUTSTREAM
9 #define SKSL_FILEOUTPUTSTREAM
10 
11 #include "SkSLOutputStream.h"
12 #include "SkSLUtil.h"
13 #include <stdio.h>
14 
15 namespace SkSL {
16 
17 class FileOutputStream : public OutputStream {
18 public:
FileOutputStream(const char * name)19     FileOutputStream(const char* name) {
20         fFile = fopen(name, "wb");
21     }
22 
~FileOutputStream()23     ~FileOutputStream() override {
24         SkASSERT(!fOpen);
25     }
26 
isValid()27     bool isValid() const override {
28         return nullptr != fFile;
29     }
30 
write8(uint8_t b)31     void write8(uint8_t b) override {
32         SkASSERT(fOpen);
33         if (isValid()) {
34             if (EOF == fputc(b, fFile)) {
35                 fFile = nullptr;
36             }
37         }
38     }
39 
writeText(const char * s)40     void writeText(const char* s) override {
41         SkASSERT(fOpen);
42         if (isValid()) {
43             if (EOF == fputs(s, fFile)) {
44                 fFile = nullptr;
45             }
46         }
47     }
48 
write(const void * s,size_t size)49     void write(const void* s, size_t size) override {
50         if (isValid()) {
51             size_t written = fwrite(s, 1, size, fFile);
52             if (written != size) {
53                 fFile = nullptr;
54             }
55         }
56     }
57 
close()58     bool close() {
59         fOpen = false;
60         if (isValid() && fclose(fFile)) {
61             fFile = nullptr;
62             return false;
63         }
64         return true;
65     }
66 
67 private:
68     bool fOpen = true;
69     FILE *fFile;
70 
71     typedef OutputStream INHERITED;
72 };
73 
74 } // namespace
75 
76 #endif
77