From 721cbb0869f6ee229e9740afc76fa9ae01a105c6 Mon Sep 17 00:00:00 2001 From: n-a-c-h <> Date: Mon, 27 Jun 2005 15:06:39 +0000 Subject: [PATCH] Added option to create C/C++ header file. --- zsnes/src/parsegen.cpp | 110 +++++++++++++++++++++++++++++++++++------ 1 file changed, 95 insertions(+), 15 deletions(-) diff --git a/zsnes/src/parsegen.cpp b/zsnes/src/parsegen.cpp index 14251dc1..beab2299 100644 --- a/zsnes/src/parsegen.cpp +++ b/zsnes/src/parsegen.cpp @@ -486,6 +486,31 @@ void output_parser_start(ostream& c_stream) << "\n"; } +void output_cheader_start(ostream& cheader_stream) +{ + cheader_stream << "/*\n" + << "Config file handler header generated by Nach's Config file handler creator.\n" + << "*/\n" + << "\n" + << "#ifdef __cplusplus\n" + << " extern \"C\" {\n" + << "#endif\n" + << "\n" + << "unsigned char read_cfg_vars(const char *);\n" + << "unsigned char write_cfg_vars(const char *);\n" + << "\n"; +} + +void output_cheader_end(ostream& cheader_stream) +{ + cheader_stream << "\n" + << "#ifdef __cplusplus\n" + << " }\n" + << "#endif\n" + << "\n"; +} + + void output_init_var(ostream& c_stream) { c_stream << "\n" @@ -753,10 +778,15 @@ void handle_directive(char *instruction, char *label) } } -void parser_generate(istream& psr_stream, ostream& c_stream) +void parser_generate(istream& psr_stream, ostream& c_stream, ostream& cheader_stream) { output_parser_start(c_stream); + if (cheader_stream) + { + output_cheader_start(cheader_stream); + } + while (!psr_stream.eof()) { char *token; @@ -801,7 +831,8 @@ void parser_generate(istream& psr_stream, ostream& c_stream) if (var_type) { string initial_value = get_token(0, " ,\n"); - + ostringstream var_init(""); + if (((initial_value[0] == '\"') && (initial_value[initial_value.length()-1] == '\"')) || ((initial_value[0] == '\'') && (initial_value[initial_value.length()-1] == '\''))) { @@ -814,7 +845,7 @@ void parser_generate(istream& psr_stream, ostream& c_stream) array = initial_value.length()-1; //Size minus quotes plus null } - c_stream << "char " << varname << "[" << array << "];"; + var_init << "char " << varname << "[" << array << "];"; ostringstream memset_line; @@ -840,12 +871,12 @@ void parser_generate(istream& psr_stream, ostream& c_stream) var_type += strlen("unsigned "); } - c_stream << var_type << " " << varname; + var_init << var_type << " " << varname; if (array) { if (var_type_is_char(var_type) || !init_value_num) { - c_stream << "[" << array << "]"; + var_init << "[" << array << "]"; ostringstream memset_line; memset_line << "memset(" << varname << ", " << init_value_num << ", " << array; @@ -864,12 +895,12 @@ void parser_generate(istream& psr_stream, ostream& c_stream) } else { - c_stream << "[" << array << "] = {"; + var_init << "[" << array << "] = {"; for (size_t i = array; i > 1; i--) { c_stream << init_value_num << ","; } - c_stream << init_value_num << "%d}"; + var_init << init_value_num << "%d}"; } add_config_var(varname, asm_type, parameterized_value, array); @@ -879,24 +910,37 @@ void parser_generate(istream& psr_stream, ostream& c_stream) if ((token = get_token(0, " ,\n"))) { array = 1; - c_stream << "[] = {" << init_value_num; + var_init << "[] = {" << init_value_num; do { - c_stream << "," << atoi(token); + var_init << "," << atoi(token); array++; } while((token = get_token(0, " ,\n"))); - c_stream << "}"; + var_init << "}"; add_config_var(varname, asm_type, parameterized_value, array); } else { - c_stream << " = " << init_value_num; + var_init << " = " << init_value_num; add_config_var(varname, asm_type, single_value, 0); } } - c_stream << ";"; + var_init << ";"; + c_stream << var_init.str(); + + if (cheader_stream) + { + string header_data = var_init.str(); + size_t equal_pos; + if ((equal_pos = header_data.find("=")) != string::npos) + { + header_data.erase(equal_pos-1); + header_data.append(";"); + } + cheader_stream << "extern " << header_data << "\n"; + } } } //Else already handled @@ -925,6 +969,11 @@ void parser_generate(istream& psr_stream, ostream& c_stream) c_stream << "\n"; + if (cheader_stream) + { + output_cheader_end(cheader_stream); + } + if (!ifs.empty()) { cerr << "Error: " << ifs.size() << " ifdef segments have no endif." << endl; @@ -933,6 +982,8 @@ void parser_generate(istream& psr_stream, ostream& c_stream) int main(size_t argc, const char **argv) { + const char *cheader_file = 0; + size_t param_pos = 1; for (; param_pos < argc; param_pos++) { @@ -940,6 +991,11 @@ int main(size_t argc, const char **argv) { defines.insert(argv[param_pos]+2); } + else if (!strcmp(argv[param_pos], "-cheader")) + { + param_pos++; + cheader_file = argv[param_pos]; + } else { break; @@ -951,10 +1007,16 @@ int main(size_t argc, const char **argv) cout << "Config file handler creator by Nach (C) 2005\n" << "\n" << "Usage:\n" - << "parsegen [-Ddefine] \n" + << "parsegen [options] \n" + << "\n" + << "\n" + << "Options:\n" << "\n" << " -Ddefine Define a processor director. Example: -D__LINUX__\n" << " Can specify multiple defines.\n" + << "\n" + << " -cheader Create a C/C++ header with the following name.\n" + << " Example -cheader cfgvars.h\n" << endl; return(1); @@ -969,8 +1031,26 @@ int main(size_t argc, const char **argv) ofstream c_stream(c_file); if (c_stream) { - parser_generate(psr_stream, c_stream); - + ofstream cheader_stream; + if (cheader_file) + { + cheader_stream.open(cheader_file); + if (cheader_stream) + { + parser_generate(psr_stream, c_stream, cheader_stream); + } + else + { + cerr << "Error opening " << cheader_file << " for writing." << endl; + ret_val |= 8; + } + + cheader_stream.close(); + } + else + { + parser_generate(psr_stream, c_stream, cheader_stream); + } c_stream.close(); } else