/* * ***************************************************************************** * * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2018-2021 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * ***************************************************************************** * * Generates a const array from a bc script. * */ #include #include #include #include #include // For some reason, Windows needs this header. #ifndef _WIN32 #include #endif // _WIN32 // This is exactly what it looks like. It just slaps a simple license header on // the generated C source file. static const char* const bc_gen_header = "// Copyright (c) 2018-2021 Gavin D. Howard and contributors.\n" "// Licensed under the 2-clause BSD license.\n" "// *** AUTOMATICALLY GENERATED FROM %s. DO NOT MODIFY. ***\n\n"; // These are just format strings used to generate the C source. static const char* const bc_gen_label = "const char *%s = \"%s\";\n\n"; static const char* const bc_gen_label_extern = "extern const char *%s;\n\n"; static const char* const bc_gen_ifdef = "#if %s\n"; static const char* const bc_gen_endif = "#endif // %s\n"; static const char* const bc_gen_name = "const char %s[] = {\n"; static const char* const bc_gen_name_extern = "extern const char %s[];\n\n"; // Error codes. We can't use 0 because these are used as exit statuses, and 0 // as an exit status is not an error. #define IO_ERR (1) #define INVALID_INPUT_FILE (2) #define INVALID_PARAMS (3) // This is the max width to print characters to the screen. This is to ensure // that lines don't go much over 80 characters. #define MAX_WIDTH (72) /** * Open a file. This function is to smooth over differences between POSIX and * Windows. * @param f A pointer to the FILE pointer that will be initialized. * @param filename The name of the file. * @param mode The mode to open the file in. */ static void open_file(FILE** f, const char* filename, const char* mode) { #ifndef _WIN32 *f = fopen(filename, mode); #else // _WIN32 // We want the file pointer to be NULL on failure, but fopen_s() is not // guaranteed to set it. *f = NULL; fopen_s(f, filename, mode); #endif // _WIN32 } /** * Outputs a label, which is a string literal that the code can use as a name * for the file that is being turned into a string. This is important for the * math libraries because the parse and lex code expects a filename. The label * becomes the filename for the purposes of lexing and parsing. * * The label is generated from bc_gen_label (above). It has the form: * * const char * =