/* This file is part of solidity. solidity is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. solidity is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with solidity. If not, see . */ /** * @author Christian * @date 2014 * Public compiler API. */ #include #include #include #include #include #include #include #include "license.h" using namespace std; using namespace dev; using namespace solidity; namespace { ReadCallback::Callback wrapReadCallback(CStyleReadFileCallback _readCallback, void* _readContext) { ReadCallback::Callback readCallback; if (_readCallback) { readCallback = [=](string const& _kind, string const& _data) { char* contents_c = nullptr; char* error_c = nullptr; _readCallback(_readContext, _kind.c_str(), _data.c_str(), &contents_c, &error_c); ReadCallback::Result result; result.success = true; if (!contents_c && !error_c) { result.success = false; result.responseOrErrorMessage = "Callback not supported."; } if (contents_c) { result.success = true; result.responseOrErrorMessage = string(contents_c); free(contents_c); } if (error_c) { result.success = false; result.responseOrErrorMessage = string(error_c); free(error_c); } return result; }; } return readCallback; } string compile(string _input, CStyleReadFileCallback _readCallback, void* _readContext) { StandardCompiler compiler(wrapReadCallback(_readCallback, _readContext)); return compiler.compile(std::move(_input)); } } static string s_outputBuffer; extern "C" { extern char const* solidity_license() noexcept { static string fullLicenseText = otherLicenses + licenseText; return fullLicenseText.c_str(); } extern char const* solidity_version() noexcept { return VersionString.c_str(); } extern char const* solidity_compile(char const* _input, CStyleReadFileCallback _readCallback, void* _readContext) noexcept { s_outputBuffer = compile(_input, _readCallback, _readContext); return s_outputBuffer.c_str(); } extern void solidity_free() noexcept { // This is called right before each compilation, but not at the end, so additional memory // can be freed here. yul::YulStringRepository::reset(); s_outputBuffer.clear(); } }