| /* |
| * Copyright 2017 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "bookmaker.h" |
| |
| #include "SkOSFile.h" |
| #include "SkOSPath.h" |
| |
| bool Catalog::appendFile(const string& path) { |
| FILE* file = fopen(path.c_str(), "r"); |
| if (!file) { |
| SkDebugf("could not append %s\n", path.c_str()); |
| return false; |
| } |
| fseek(file, 0L, SEEK_END); |
| int sz = (int) ftell(file); |
| rewind(file); |
| char* buffer = new char[sz]; |
| memset(buffer, ' ', sz); |
| SkAssertResult(sz == (int)fread(buffer, 1, sz, file)); |
| fclose(file); |
| this->writeBlock(sz, buffer); |
| return true; |
| } |
| |
| bool Catalog::openCatalog(const char* inDir, const char* outDir) { |
| fDocsDir = inDir; |
| if ('/' != fDocsDir.back()) { |
| fDocsDir += '/'; |
| } |
| string outie = outDir; |
| if ('/' != outie.back()) { |
| outie += '/'; |
| } |
| fFullName = outie + "catalog.htm"; |
| fOut = fopen(fFullName.c_str(), "wb"); |
| if (!fOut) { |
| SkDebugf("could not open output file %s\n", fFullName.c_str()); |
| return false; |
| } |
| fContinuation = false; |
| if (!appendFile(fDocsDir + "catalogHeader.txt")) { |
| return false; |
| } |
| this->lf(1); |
| return true; |
| } |
| |
| bool Catalog::closeCatalog() { |
| if (fOut) { |
| this->lf(1); |
| this->writeString("}"); |
| this->lf(1); |
| if (!appendFile(fDocsDir + "catalogTrailer.txt")) { |
| return false; |
| } |
| this->lf(1); |
| this->writePending(); |
| fclose(fOut); |
| SkDebugf("wrote %s\n", fFullName.c_str()); |
| fOut = nullptr; |
| } |
| return true; |
| } |
| |
| bool Catalog::parseFromFile(const char* path) { |
| if (!INHERITED::parseSetup(path)) { |
| return false; |
| } |
| fIndent = 4; |
| this->writeString("var text = {"); |
| this->lf(1); |
| fTextOut = true; |
| TextParser::Save save(this); |
| if (!parseFiddles()) { |
| return false; |
| } |
| this->lf(1); |
| this->writeString("}"); |
| this->lf(2); |
| this->writeString("var pngs = {"); |
| fTextOut = false; |
| fPngOut = true; |
| save.restore(); |
| fContinuation = false; |
| return parseFiddles(); |
| } |
| |
| bool Catalog::pngOut(Definition* example) { |
| string result; |
| if (!example->exampleToScript(&result, Definition::ExampleOptions::kPng)) { |
| return false; |
| } |
| if (result.length() > 0) { |
| if (fContinuation) { |
| this->writeString(","); |
| this->lf(1); |
| } else { |
| fContinuation = true; |
| } |
| this->writeBlock(result.size(), result.c_str()); |
| } |
| return true; |
| } |
| |
| bool Catalog::textOut(Definition* example, const char* stdOutStart, |
| const char* stdOutEnd) { |
| string result; |
| if (!example->exampleToScript(&result, Definition::ExampleOptions::kText)) { |
| return false; |
| } |
| if (result.length() > 0) { |
| if (fContinuation) { |
| this->writeString(","); |
| this->lf(1); |
| } else { |
| fContinuation = true; |
| } |
| fIndent = 8; |
| this->writeBlock(result.size(), result.c_str()); |
| this->lf(1); |
| this->writeString("\"stdout\": \""); |
| size_t pos = 0; |
| size_t len = stdOutEnd - stdOutStart; |
| string example; |
| while ((size_t) pos < len) { |
| example += '"' == stdOutStart[pos] ? "\\\"" : |
| '\\' == stdOutStart[pos] ? "\\\\" : |
| string(&stdOutStart[pos], 1); |
| ++pos; |
| } |
| this->writeBlock(example.length(), example.c_str()); |
| this->writeString("\""); |
| this->lf(1); |
| fIndent = 4; |
| this->writeString("}"); |
| } |
| return true; |
| } |