Completed support for config file comments @. Updated framework for upcoming goodies.
This commit is contained in:
@@ -290,6 +290,28 @@ bool all_spaces(const char *str)
|
|||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string encode_string(string& str, bool quotes = true)
|
||||||
|
{
|
||||||
|
string newstr("");
|
||||||
|
if (quotes) { newstr += '\"'; }
|
||||||
|
|
||||||
|
for (size_t i = 0; i < str.length(); i++)
|
||||||
|
{
|
||||||
|
if ((str[i] == '\\') ||
|
||||||
|
(str[i] == '\"') ||
|
||||||
|
(str[i] == '\'') ||
|
||||||
|
(str[i] == '\n') ||
|
||||||
|
(str[i] == '\t'))
|
||||||
|
{
|
||||||
|
newstr += '\\';
|
||||||
|
}
|
||||||
|
newstr += str[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (quotes) { newstr += '\"'; }
|
||||||
|
return(newstr);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
Structures used to store config data
|
Structures used to store config data
|
||||||
@@ -371,7 +393,7 @@ namespace variable
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void add_comment(string& comment)
|
void add_comment(string comment)
|
||||||
{
|
{
|
||||||
config_data_element new_element = { "", none, NT, 0, comment };
|
config_data_element new_element = { "", none, NT, 0, comment };
|
||||||
data_array.push_back(new_element);
|
data_array.push_back(new_element);
|
||||||
@@ -442,31 +464,6 @@ Compiler with it's helper functions
|
|||||||
#define short_scale "*sizeof(short)"
|
#define short_scale "*sizeof(short)"
|
||||||
#define int_scale "*sizeof(int)"
|
#define int_scale "*sizeof(int)"
|
||||||
|
|
||||||
//Return the comment from global line variable
|
|
||||||
char *get_comment()
|
|
||||||
{
|
|
||||||
char *comment = find_chr(line, ';');
|
|
||||||
if (comment)
|
|
||||||
{
|
|
||||||
*comment = 0;
|
|
||||||
comment++;
|
|
||||||
if (isspace(comment[strlen(comment)-1]))
|
|
||||||
{
|
|
||||||
comment[strlen(comment)-1] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(comment);
|
|
||||||
}
|
|
||||||
|
|
||||||
void output_comment(ostream& c_stream, const char *comment)
|
|
||||||
{
|
|
||||||
if (comment)
|
|
||||||
{
|
|
||||||
c_stream << " //" << comment;
|
|
||||||
}
|
|
||||||
c_stream << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
//Convert asm types to C types
|
//Convert asm types to C types
|
||||||
char *convert_asm_type(const char *str, bool unsigned_var = true)
|
char *convert_asm_type(const char *str, bool unsigned_var = true)
|
||||||
{
|
{
|
||||||
@@ -657,7 +654,7 @@ void output_array_write(ostream& c_stream, variable::ctype type)
|
|||||||
if (variable::config_data.ctype_mult_used(type))
|
if (variable::config_data.ctype_mult_used(type))
|
||||||
{
|
{
|
||||||
c_stream << "\n"
|
c_stream << "\n"
|
||||||
<< "static void write_" << variable::info[type].CTypeUnderscore << "_array(FILE *fp, const char *var_name, " << variable::info[type].CTypeSpace << " *var, size_t size)\n"
|
<< "static void write_" << variable::info[type].CTypeUnderscore << "_array(FILE *fp, const char *var_name, " << variable::info[type].CTypeSpace << " *var, size_t size, const char *comment)\n"
|
||||||
<< "{\n"
|
<< "{\n"
|
||||||
<< " size_t i;\n"
|
<< " size_t i;\n"
|
||||||
<< " fprintf(fp, \"%s=%" << variable::info[type].FormatChar << "\", var_name, (int)*var);\n"
|
<< " fprintf(fp, \"%s=%" << variable::info[type].FormatChar << "\", var_name, (int)*var);\n"
|
||||||
@@ -665,6 +662,10 @@ void output_array_write(ostream& c_stream, variable::ctype type)
|
|||||||
<< " {\n"
|
<< " {\n"
|
||||||
<< " fprintf(fp, \",%" << variable::info[type].FormatChar << "\", (int)(var[i]));\n"
|
<< " fprintf(fp, \",%" << variable::info[type].FormatChar << "\", (int)(var[i]));\n"
|
||||||
<< " }\n"
|
<< " }\n"
|
||||||
|
<< " if (comment)\n"
|
||||||
|
<< " {\n"
|
||||||
|
<< " fprintf(fp, \" ;%s\", comment);\n"
|
||||||
|
<< " }\n"
|
||||||
<< " fprintf(fp, \"\\n\");\n"
|
<< " fprintf(fp, \"\\n\");\n"
|
||||||
<< "}\n";
|
<< "}\n";
|
||||||
}
|
}
|
||||||
@@ -690,21 +691,26 @@ void output_write_var(ostream& c_stream)
|
|||||||
<< " {\n";
|
<< " {\n";
|
||||||
for (variable::config_data_array::iterator i = variable::config_data.begin(); i != variable::config_data.end(); i++)
|
for (variable::config_data_array::iterator i = variable::config_data.begin(); i != variable::config_data.end(); i++)
|
||||||
{
|
{
|
||||||
if (i->format == variable::mult)
|
if (i->format == variable::none)
|
||||||
|
{
|
||||||
|
c_stream << " fprintf(fp, \";%s\\n\", " << encode_string(i->comment) << ");\n";
|
||||||
|
}
|
||||||
|
else if (i->format == variable::mult)
|
||||||
{
|
{
|
||||||
c_stream << " write_" << variable::info[i->type].CTypeUnderscore
|
c_stream << " write_" << variable::info[i->type].CTypeUnderscore
|
||||||
<< "_array(fp, \"" << i->name << "\", " << i->name << ", " << i->length << ");\n";
|
<< "_array(fp, \"" << i->name << "\", " << i->name << ", " << i->length << ", " << ((i->comment != "") ? encode_string(i->comment) : "0") << ");\n";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
string config_comment = (i->comment != "") ? (string(" ;") + encode_string(i->comment, false)) : "";
|
||||||
c_stream << " fprintf(fp, \"" << i->name << "=";
|
c_stream << " fprintf(fp, \"" << i->name << "=";
|
||||||
if (i->format == variable::single)
|
if (i->format == variable::single)
|
||||||
{
|
{
|
||||||
c_stream << "%" << variable::info[i->type].FormatChar << "\\n\", " << i->name;
|
c_stream << "%" << variable::info[i->type].FormatChar << config_comment << "\\n\", " << i->name;
|
||||||
}
|
}
|
||||||
else
|
else if (i->format == variable::quoted)
|
||||||
{
|
{
|
||||||
c_stream << "%s\\n\", encode_string(" << i->name << ")";
|
c_stream << "%s" << config_comment << "\\n\", encode_string(" << i->name << ")";
|
||||||
}
|
}
|
||||||
c_stream << ");\n";
|
c_stream << ");\n";
|
||||||
}
|
}
|
||||||
@@ -780,6 +786,8 @@ void output_read_var(ostream& c_stream)
|
|||||||
<< " }\n"
|
<< " }\n"
|
||||||
<< "\n";
|
<< "\n";
|
||||||
for (variable::config_data_array::iterator i = variable::config_data.begin(); i != variable::config_data.end(); i++)
|
for (variable::config_data_array::iterator i = variable::config_data.begin(); i != variable::config_data.end(); i++)
|
||||||
|
{
|
||||||
|
if (i->format != variable::none)
|
||||||
{
|
{
|
||||||
c_stream << " if (!strcmp(var, \"" + i->name + "\")) { ";
|
c_stream << " if (!strcmp(var, \"" + i->name + "\")) { ";
|
||||||
if (i->format == variable::single)
|
if (i->format == variable::single)
|
||||||
@@ -791,13 +799,14 @@ void output_read_var(ostream& c_stream)
|
|||||||
c_stream << "read_" << variable::info[i->type].CTypeUnderscore
|
c_stream << "read_" << variable::info[i->type].CTypeUnderscore
|
||||||
<< "_array(value, " << i->name << ", " << i->length << ");";
|
<< "_array(value, " << i->name << ", " << i->length << ");";
|
||||||
}
|
}
|
||||||
else
|
else if (i->format == variable::quoted)
|
||||||
{
|
{
|
||||||
c_stream << "*" << i->name << " = 0; "
|
c_stream << "*" << i->name << " = 0; "
|
||||||
<< "strncat(" << i->name << ", decode_string(value), sizeof(" << i->name << ")-1);";
|
<< "strncat(" << i->name << ", decode_string(value), sizeof(" << i->name << ")-1);";
|
||||||
}
|
}
|
||||||
c_stream << " continue; }\n";
|
c_stream << " continue; }\n";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
c_stream << " }\n"
|
c_stream << " }\n"
|
||||||
<< "\n"
|
<< "\n"
|
||||||
<< " fclose(fp);\n"
|
<< " fclose(fp);\n"
|
||||||
@@ -931,6 +940,33 @@ void handle_directive(char *instruction, char *label)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Return the comment from global line variable
|
||||||
|
char *get_comment(char comment_seperator)
|
||||||
|
{
|
||||||
|
char *comment = find_chr(line, comment_seperator);
|
||||||
|
if (comment)
|
||||||
|
{
|
||||||
|
*comment = 0;
|
||||||
|
comment++;
|
||||||
|
if (isspace(comment[strlen(comment)-1]))
|
||||||
|
{
|
||||||
|
comment[strlen(comment)-1] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
void output_parser_comment(ostream& c_stream, const char *comment)
|
||||||
|
{
|
||||||
|
if (comment)
|
||||||
|
{
|
||||||
|
c_stream << " //" << comment;
|
||||||
|
}
|
||||||
|
c_stream << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CONFIG_COMMENT (config_comment ? config_comment : "")
|
||||||
|
|
||||||
void parser_generate(istream& psr_stream, ostream& c_stream, ostream& cheader_stream)
|
void parser_generate(istream& psr_stream, ostream& c_stream, ostream& cheader_stream)
|
||||||
{
|
{
|
||||||
current_location.line_number = current_location.column_number = 0;
|
current_location.line_number = current_location.column_number = 0;
|
||||||
@@ -945,16 +981,25 @@ void parser_generate(istream& psr_stream, ostream& c_stream, ostream& cheader_st
|
|||||||
while (!psr_stream.eof())
|
while (!psr_stream.eof())
|
||||||
{
|
{
|
||||||
char *token;
|
char *token;
|
||||||
char *comment;
|
char *parser_comment;
|
||||||
|
char *config_comment;
|
||||||
|
|
||||||
psr_stream.getline(line, LINE_LENGTH);
|
psr_stream.getline(line, LINE_LENGTH);
|
||||||
current_location.line_number++;
|
current_location.line_number++;
|
||||||
|
|
||||||
comment = get_comment();
|
parser_comment = get_comment(';');
|
||||||
|
|
||||||
if (all_spaces(line))
|
if (all_spaces(line))
|
||||||
{
|
{
|
||||||
output_comment(c_stream, comment);
|
output_parser_comment(c_stream, parser_comment);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
config_comment = get_comment('@');
|
||||||
|
|
||||||
|
if (all_spaces(line) && config_comment)
|
||||||
|
{
|
||||||
|
variable::config_data.add_comment(config_comment);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1014,8 +1059,7 @@ void parser_generate(istream& psr_stream, ostream& c_stream, ostream& cheader_st
|
|||||||
<< varname << "[" << array << "] = 0;";
|
<< varname << "[" << array << "] = 0;";
|
||||||
}
|
}
|
||||||
memsets.push_back(memset_line.str());
|
memsets.push_back(memset_line.str());
|
||||||
|
variable::config_data.add_var_quoted(varname, CONFIG_COMMENT);
|
||||||
variable::config_data.add_var_quoted(varname);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1058,7 +1102,7 @@ void parser_generate(istream& psr_stream, ostream& c_stream, ostream& cheader_st
|
|||||||
var_init << init_value_num << "%d}";
|
var_init << init_value_num << "%d}";
|
||||||
}
|
}
|
||||||
|
|
||||||
variable::config_data.add_var_mult(varname, var_type, array);
|
variable::config_data.add_var_mult(varname, var_type, array, CONFIG_COMMENT);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1073,13 +1117,13 @@ void parser_generate(istream& psr_stream, ostream& c_stream, ostream& cheader_st
|
|||||||
} while((token = get_token(0, " ,\n")));
|
} while((token = get_token(0, " ,\n")));
|
||||||
var_init << "}";
|
var_init << "}";
|
||||||
|
|
||||||
variable::config_data.add_var_mult(varname, var_type, array);
|
variable::config_data.add_var_mult(varname, var_type, array, CONFIG_COMMENT);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var_init << " = " << init_value_num;
|
var_init << " = " << init_value_num;
|
||||||
|
|
||||||
variable::config_data.add_var_single(varname, var_type);
|
variable::config_data.add_var_single(varname, var_type, CONFIG_COMMENT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var_init << ";";
|
var_init << ";";
|
||||||
@@ -1116,7 +1160,7 @@ void parser_generate(istream& psr_stream, ostream& c_stream, ostream& cheader_st
|
|||||||
current_location.error("Could not get variable name");
|
current_location.error("Could not get variable name");
|
||||||
}
|
}
|
||||||
|
|
||||||
output_comment(c_stream, comment);
|
output_parser_comment(c_stream, parser_comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
output_init_var(c_stream);
|
output_init_var(c_stream);
|
||||||
|
|||||||
Reference in New Issue
Block a user