1.1 --- a/src/tools/mdparse.c Sat Jan 26 14:00:48 2013 +1000
1.2 +++ b/src/tools/mdparse.c Fri May 29 18:47:05 2015 +1000
1.14 #define YYPARSE_ERROR( msg, ... ) \
1.16 - fprintf( stderr, "Parse error in %s:%d:%d: " msg "\n", yystate.yyfilename, yytok.yyline, yytok.yycol, __VA_ARGS__ ); \
1.17 + fprintf( stderr, "Parse error in %s:%d:%d: " msg "\n", yystate.yyfilename, yytok.yyline, yytok.yycol, ## __VA_ARGS__ ); \
1.21 @@ -159,14 +159,14 @@
1.22 return strncasecmp(yytok.yytext, cmp, yytok.yylength);
1.25 -static int yymatch( const char *arr[], unsigned numOptions )
1.26 +static int yymatch( const char *arr[], unsigned numOptions, const char *desc )
1.28 for( unsigned i=0; i<numOptions; i++ ) {
1.29 if( yystrcasecmp( arr[i] ) == 0 ) {
1.34 + YYPARSE_ERROR( "Unknown %s '%s'", desc, yystrdup() );
1.37 static gint register_block_sort_cb( gconstpointer a, gconstpointer b )
1.39 if( tok == TOK_INTEGER ) {
1.41 if( *numBytes == 0 ) {
1.42 - YYPARSE_ERROR( "Expected string initializer but was an integer (0x%x)", yytok.v.i );
1.43 + YYPARSE_ERROR( "Expected string initializer but was an integer (0x%llx)", yytok.v.i );
1.45 - } else if( tok = TOK_STRING ) {
1.46 + } else if( tok == TOK_STRING ) {
1.47 if( *numBytes == 0 ) {
1.48 *numBytes = yytok.slen;
1.50 @@ -224,10 +224,7 @@
1.53 READ(TOK_IDENTIFIER);
1.54 - flags->access = yymatch(ACCESS_NAMES,elementsof(ACCESS_NAMES));
1.55 - if( flags->access == -1 ) {
1.56 - YYPARSE_ERROR("Unknown access mode '%s'", yystrdup());
1.58 + flags->access = yymatch(ACCESS_NAMES,elementsof(ACCESS_NAMES), "access mode");
1.62 @@ -235,32 +232,23 @@
1.63 tok = iolex(TOK_INTEGER);
1.64 ioparse_apval( tok, &flags->maskValue, numBytes );
1.66 - YYPARSE_ERROR("mask is not valid on a register block",0);
1.67 + YYPARSE_ERROR("mask is not valid on a register block");
1.72 READ(TOK_IDENTIFIER);
1.73 - flags->endian = yymatch(ENDIAN_NAMES,elementsof(ENDIAN_NAMES));
1.74 - if( flags->endian == -1 ) {
1.75 - YYPARSE_ERROR("Unknown endianness '%s'", yystrdup());
1.77 + flags->endian = yymatch(ENDIAN_NAMES,elementsof(ENDIAN_NAMES), "endianness");
1.81 READ(TOK_IDENTIFIER);
1.82 - flags->traceFlag = yymatch(TRACE_NAMES,elementsof(TRACE_NAMES));
1.83 - if( flags->traceFlag == -1 ) {
1.84 - YYPARSE_ERROR("Unknown trace flag '%s'", yystrdup());
1.86 + flags->traceFlag = yymatch(TRACE_NAMES,elementsof(TRACE_NAMES), "trace flags");
1.90 READ(TOK_IDENTIFIER);
1.91 - flags->testFlag = yymatch(TRACE_NAMES,elementsof(TRACE_NAMES));
1.92 - if( flags->testFlag == -1 ) {
1.93 - YYPARSE_ERROR("Unknown test flag '%s'", yystrdup());
1.95 + flags->testFlag = yymatch(TRACE_NAMES,elementsof(TRACE_NAMES), "test flag");
1.99 @@ -274,17 +262,17 @@
1.101 static void ioparse_regdef( struct regdef *reg )
1.103 - reg->offset = yytok.v.i;
1.104 + reg->offset = (uint32_t)yytok.v.i;
1.105 reg->numElements = 1;
1.107 reg->initValue.i = 0;
1.108 reg->flags.maskValue.i = -1;
1.109 - unsigned rangeOffset = reg->offset;
1.110 + uint32_t rangeOffset = reg->offset;
1.112 int tok = iolex(TOK_COLON);
1.113 if( tok == TOK_RANGE ) {
1.115 - rangeOffset = yytok.v.i;
1.116 + rangeOffset = (uint32_t)yytok.v.i;
1.117 if( rangeOffset < reg->offset ) {
1.118 YYPARSE_ERROR( "Range end (0x%x) must be greater than the range start (0x%x)", rangeOffset, reg->offset );
1.120 @@ -293,10 +281,7 @@
1.121 YYPARSE_ERROR( "Expected ':' but was %s\n", TOKEN_NAMES[tok] );
1.123 READ(TOK_IDENTIFIER);
1.124 - reg->mode = yymatch(MODE_NAMES, elementsof(MODE_NAMES));
1.125 - if( reg->mode == -1 ) {
1.126 - YYPARSE_ERROR( "Unknown register mode '%s'", yystrdup() );
1.128 + reg->mode = yymatch(MODE_NAMES, elementsof(MODE_NAMES), "register mode");
1.129 if( reg->mode == REG_MIRROR ) {
1.130 /* Mirror regions have a target range only */
1.132 @@ -306,14 +291,14 @@
1.133 if( tok == TOK_RANGE ) {
1.135 if( yytok.v.i < reg->initValue.i ) {
1.136 - YYPARSE_ERROR( "Invalid mirror target range 0x%x..0x%x", reg->initValue.i, yytok.v.i );
1.137 + YYPARSE_ERROR( "Invalid mirror target range 0x%llx..0x%llx", reg->initValue.i, yytok.v.i );
1.139 - reg->numBytes = yytok.v.i - reg->initValue.i + 1;
1.140 + reg->numBytes = (uint32_t)(yytok.v.i - reg->initValue.i + 1);
1.141 tok = iolex(TOK_STRIDE);
1.143 if( tok == TOK_STRIDE ) {
1.145 - reg->stride = yytok.v.i;
1.146 + reg->stride = (uint32_t)yytok.v.i;
1.147 tok = iolex(TOK_ACTION);
1.149 reg->stride = reg->numBytes;
1.150 @@ -333,10 +318,7 @@
1.153 READ(TOK_IDENTIFIER);
1.154 - reg->type = yymatch(TYPE_NAMES, elementsof(TYPE_NAMES));
1.155 - if( reg->type == -1 ) {
1.156 - YYPARSE_ERROR( "Unknown register type '%s'", yystrdup() );
1.158 + reg->type = yymatch(TYPE_NAMES, elementsof(TYPE_NAMES), "register type");
1.159 reg->numBytes = TYPE_SIZES[reg->type];
1.160 tok = iolex(TOK_IDENTIFIER);
1.161 if( tok == TOK_IDENTIFIER ) {
1.162 @@ -361,7 +343,7 @@
1.164 tok = iolex(TOK_ACTION);
1.165 } else if( reg->type == REG_STRING ) {
1.166 - YYPARSE_ERROR( "String declarations must have an initializer (ie = 'abcd')",0 );
1.167 + YYPARSE_ERROR( "String declarations must have an initializer (ie = 'abcd')" );
1.169 if( tok == TOK_ACTION ) {
1.170 // reg->action = yystrdup();
1.171 @@ -393,7 +375,7 @@
1.172 YYPARSE_ERROR("Expected AT but got %s\n", TOKEN_NAMES[tok] );
1.175 - block->address = yytok.v.i;
1.176 + block->address = (uint32_t)yytok.v.i;
1.178 tok = iolex(TOK_LBRACE);
1.179 if( tok == TOK_LPAREN) {
1.180 @@ -450,7 +432,7 @@
1.182 } else if( tok == TOK_SPACE ) {
1.183 } else if( tok == TOK_REGISTERS ) {
1.184 - struct regblock *block = ioparse_regblock(block);
1.185 + struct regblock *block = ioparse_regblock();
1.187 blocks = g_list_insert_sorted(blocks, block, register_block_sort_cb);
1.189 @@ -638,7 +620,7 @@
1.190 while( yystate.yyposn < yystate.yyend && isdigit(*yystate.yyposn) )
1.193 - yytok.v.i = strtol( yystart, NULL, 0 );
1.194 + yytok.v.i = strtoll( yystart, NULL, 0 );
1.195 YYRETURN(TOK_INTEGER);
1.196 } else if( isalpha(ch) || ch == '_' ) {