rendered paste body/*
Parsegen stuff.
*/
/*
Line Tracking and Error Control
*/
class Location
{
public:
size_t line_number;
size_t column_number;
void error( const char *str );
};
/*
Structures used to store config data.
*/
class nstack
{
public:
nstack( void );
~nstack( void );
bool top( void );
bool all_true( void );
bool empty( void );
size_t size( void );
void pop( void );
void push(bool data);
private:
vector<bool> data;
};
namespace variable
{
typedef enum { NT, UC, US, UD, SC, SS, SD, LT } ctype;
typedef enum { none, single, quoted, mult, mult_packed, ptr } storage_format;
static struct
{
const char *CTypeSpace;
const char *CTypeUnderscore;
char FormatChar;
bool Signed;
} info[7] =
{
{ "", "", 0, false },
{ "unsigned char", "unsigned_char", 'u', false },
{ "unsigned short", "unsigned_short", 'u', false },
{ "unsigned int", "unsigned_int", 'u', false },
{ "char", "char", 'd', true },
{ "short", "short", 'd', true },
{ "int", "int", 'd', true }
};
typedef struct
{
string name;
storage_format format;
ctype type;
size_t length;
string dependancy;
string comment;
bool operator==(const string& name) const;
} config_data_element;
typedef vector<config_data_element> config_data_array;
ctype GetCType( const char *str );
static class ConfigData
{
private:
config_data_array data_array;
bool duplicate_name( string &name );
public:
void add_comment( string comment );
void add_var_single( string &name, ctype type, string dependancy, string comment );
void add_var_single( string &name, const char *type, string dependancy, string comment );
void add_var_quoted( string &name, string dependancy, string comment );
void add_var_mult( string &name, ctype type, size_t length, string dependancy, string comment );
void add_var_mult( string &name, const char *type, size_t length, string dependancy, string comment );
void add_var_packed( string &name, size_t length, string dependancy, string comment );
void add_var_ptr( string &name, ctype type, size_t length, string dependancy, string comment );
void add_var_ptr( string &name, const char *type, size_t length, string dependancy, string comment );
bool ctype_mult_used( ctype type );
bool ctype_ptr_used( ctype type );
bool packed_used( void );
bool quoted_used( void );
bool unsigned_used( void );
config_data_array::iterator begin( void );
config_data_array::iterator end( void );
} config_data;
}
/* Convert asm types to C types. */
const char *convert_asm_type( const char *str, bool unsigned_var );
void output_parser_start( ostream &c_stream, string &cheader_file );
void output_cheader_start( ostream &cheader_stream );
void output_cheader_end( ostream &cheader_stream );
void output_extsym_dependancies( ostream &c_stream );
void output_init_var( ostream &c_stream );
void output_packed_write( ostream &c_stream );
void output_array_write( ostream &c_stream, variable::ctype type );
void output_write_var( ostream &c_stream );
void output_packed_read( ostream &c_stream );
void output_array_read( ostream &c_stream, variable::ctype type );
void output_read_var( ostream &c_stream );
void handle_directive( const char *instruction, const char *label );
/* Return the comment from global line variable. */
char *get_comment( char comment_seperator );
void output_parser_comment( ostream &c_stream, const char *comment );
void output_header_conditional( ostream &cheader_stream, const char *instruction, const char *label );
void parser_generate( istream &psr_stream, ostream &c_stream, ostream &cheader_stream, string cheader_file );