/* 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 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_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 );