Added option to create C/C++ header file.
This commit is contained in:
@@ -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,6 +831,7 @@ 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] <output> <input>\n"
|
||||
<< "parsegen [options] <output> <input>\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
|
||||
|
||||
Reference in New Issue
Block a user