- Rewrite STRING and COMMENT expressions to remove need for CHARS. - Clean up regular expressions - get rid of unnecessary expressions. - Remove extra newline from the end of the file. - Clean up stripquotes() function -- Remove unnecessary backslashes in '\"' -- Check malloc for failure -- Remove unnecessary assignment of 0 to the end of the new string, snprintf will take care of it. - Update blobtool.lex.c_shipped to the new version. Change-Id: I002962cfae0816ed3c7a5811dfb1b8b48fdc5729 Signed-off-by: Martin Roth <martinroth@google.com> Reviewed-on: https://review.coreboot.org/19230 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com>
		
			
				
	
	
		
			134 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
/*
 | 
						|
 * blobtool - Compiler/Decompiler for data blobs with specs
 | 
						|
 * Copyright (C) 2017 Damien Zammit <damien@zamaudio.com>
 | 
						|
 *
 | 
						|
 * This program is free software: you can redistribute it and/or modify
 | 
						|
 * it under the terms of the GNU General Public License as published by
 | 
						|
 * the Free Software Foundation, either version 3 of the License, or
 | 
						|
 * (at your option) any later version.
 | 
						|
 *
 | 
						|
 * This program is distributed in the hope that it will be useful,
 | 
						|
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
 * GNU General Public License for more details.
 | 
						|
 */
 | 
						|
 | 
						|
%{
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include "blobtool.tab.h"
 | 
						|
 | 
						|
extern struct blob binary;
 | 
						|
 | 
						|
unsigned int parsehex (char *s)
 | 
						|
{
 | 
						|
	unsigned int i, nib, val = 0;
 | 
						|
	unsigned int nibs = strlen(s) - 2;
 | 
						|
 | 
						|
	for (i = 2; i < nibs + 2; i++) {
 | 
						|
		if (s[i] >= '0' && s[i] <= '9') {
 | 
						|
			nib = s[i] - '0';
 | 
						|
		} else if (s[i] >= 'a' && s[i] <= 'f') {
 | 
						|
			nib = s[i] - 'a' + 10;
 | 
						|
		} else if (s[i] >= 'A' && s[i] <= 'F') {
 | 
						|
			nib = s[i] - 'A' + 10;
 | 
						|
		} else {
 | 
						|
			return 0;
 | 
						|
		}
 | 
						|
		val |= nib << (((nibs - 1) - (i - 2)) * 4);
 | 
						|
	}
 | 
						|
	return val;
 | 
						|
}
 | 
						|
 | 
						|
char* stripquotes (char *string)
 | 
						|
{
 | 
						|
	char *stripped;
 | 
						|
	unsigned int len = strlen(string);
 | 
						|
	if (len >= 2 && string[0] == '"' && string[len - 1] == '"') {
 | 
						|
		stripped = (char *) malloc (len - 1);
 | 
						|
		if (stripped == NULL) {
 | 
						|
			printf("Out of memory\n");
 | 
						|
			exit(1);
 | 
						|
		}
 | 
						|
		snprintf (stripped, len - 1, "%s", string + 1);
 | 
						|
		return stripped;
 | 
						|
	}
 | 
						|
	return NULL;
 | 
						|
}
 | 
						|
 | 
						|
%}
 | 
						|
 | 
						|
%option noyywrap
 | 
						|
%option nounput
 | 
						|
 | 
						|
DIGIT [0-9]
 | 
						|
INT [-]?{DIGIT}|[-]?[1-9]{DIGIT}+
 | 
						|
FRAC [.]{DIGIT}+
 | 
						|
EXP [eE][+-]?{DIGIT}+
 | 
						|
NUMBER {INT}|{INT}{FRAC}|{INT}{EXP}|{INT}{FRAC}{EXP}
 | 
						|
HEX [0][x][0-9a-fA-F]+
 | 
						|
STRING ["][^"]*["]
 | 
						|
COMMENT [#][^\n]*$
 | 
						|
 | 
						|
%%
 | 
						|
 | 
						|
{STRING} {
 | 
						|
    yylval.str = stripquotes(yytext);
 | 
						|
    return name;
 | 
						|
};
 | 
						|
 | 
						|
{NUMBER} {
 | 
						|
    yylval.u32 = atoi(yytext);
 | 
						|
    return val;
 | 
						|
};
 | 
						|
 | 
						|
{HEX} {
 | 
						|
    yylval.u32 = parsehex(yytext);
 | 
						|
    return val;
 | 
						|
};
 | 
						|
 | 
						|
\{ {
 | 
						|
    return '{';
 | 
						|
};
 | 
						|
 | 
						|
\} {
 | 
						|
    return '}';
 | 
						|
};
 | 
						|
 | 
						|
\[ {
 | 
						|
    return '[';
 | 
						|
};
 | 
						|
 | 
						|
\] {
 | 
						|
    return ']';
 | 
						|
};
 | 
						|
 | 
						|
, {
 | 
						|
    return ',';
 | 
						|
};
 | 
						|
 | 
						|
: {
 | 
						|
    return ':';
 | 
						|
};
 | 
						|
 | 
						|
= {
 | 
						|
    return '=';
 | 
						|
};
 | 
						|
 | 
						|
[ \t\n]+ /* ignore whitespace */;
 | 
						|
 | 
						|
{COMMENT} /* ignore comments */
 | 
						|
 | 
						|
\% {
 | 
						|
    return '%';
 | 
						|
};
 | 
						|
 | 
						|
<<EOF>> { return eof; };
 | 
						|
 | 
						|
%%
 | 
						|
 | 
						|
void set_input_string(char* in) {
 | 
						|
	yy_scan_string(in);
 | 
						|
}
 |