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 "src/sksl/SkSLOutputStream.h" 12 #include "src/sksl/SkSLUtil.h" 13 #include <stdio.h> 14 15 namespace SkSL { 16 17 class FileOutputStream : public OutputStream { 18 public: FileOutputStream(const SkSL::String & name)19 FileOutputStream(const SkSL::String& name) { 20 fFile = fopen(name.c_str(), "wb"); 21 } 22 ~FileOutputStream()23 ~FileOutputStream() override { 24 if (fOpen) { 25 close(); 26 } 27 } 28 isValid()29 bool isValid() const override { 30 return nullptr != fFile; 31 } 32 write8(uint8_t b)33 void write8(uint8_t b) override { 34 SkASSERT(fOpen); 35 if (isValid()) { 36 if (EOF == fputc(b, fFile)) { 37 fFile = nullptr; 38 } 39 } 40 } 41 writeText(const char * s)42 void writeText(const char* s) override { 43 SkASSERT(fOpen); 44 if (isValid()) { 45 if (EOF == fputs(s, fFile)) { 46 fFile = nullptr; 47 } 48 } 49 } 50 write(const void * s,size_t size)51 void write(const void* s, size_t size) override { 52 if (isValid()) { 53 size_t written = fwrite(s, 1, size, fFile); 54 if (written != size) { 55 fFile = nullptr; 56 } 57 } 58 } 59 close()60 bool close() { 61 fOpen = false; 62 if (isValid() && fclose(fFile)) { 63 fFile = nullptr; 64 return false; 65 } 66 return true; 67 } 68 69 private: 70 bool fOpen = true; 71 FILE *fFile; 72 73 using INHERITED = OutputStream; 74 }; 75 76 } // namespace 77 78 #endif 79