Blame convert-dtsv0-lexer.l

Packit Service 0ee8e1
/* SPDX-License-Identifier: GPL-2.0-or-later */
Packit 2ad57b
/*
Packit 2ad57b
 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005, 2008.
Packit 2ad57b
 */
Packit 2ad57b
Packit 2ad57b
%option noyywrap nounput noinput never-interactive
Packit 2ad57b
Packit 2ad57b
%x BYTESTRING
Packit 2ad57b
%x PROPNODENAME
Packit 2ad57b
Packit 2ad57b
PROPNODECHAR	[a-zA-Z0-9,._+*#?@-]
Packit 2ad57b
PATHCHAR	({PROPNODECHAR}|[/])
Packit 2ad57b
LABEL		[a-zA-Z_][a-zA-Z0-9_]*
Packit 2ad57b
STRING		\"([^\\"]|\\.)*\"
Packit 2ad57b
WS		[[:space:]]
Packit 2ad57b
COMMENT		"/*"([^*]|\*+[^*/])*\*+"/"
Packit 2ad57b
LINECOMMENT	"//".*\n
Packit 2ad57b
GAP		({WS}|{COMMENT}|{LINECOMMENT})*
Packit 2ad57b
Packit 2ad57b
%{
Packit 2ad57b
#include <string.h>
Packit 2ad57b
#include <stdlib.h>
Packit 2ad57b
#include <stdarg.h>
Packit 2ad57b
Packit 2ad57b
#include <errno.h>
Packit 2ad57b
#include <assert.h>
Packit 2ad57b
#include <fnmatch.h>
Packit 2ad57b
Packit 2ad57b
#include "srcpos.h"
Packit 2ad57b
#include "util.h"
Packit 2ad57b
Packit 2ad57b
static int v1_tagged; /* = 0 */
Packit 2ad57b
static int cbase = 16;
Packit 2ad57b
static int saw_hyphen; /* = 0 */
Packit 2ad57b
static unsigned long long last_val;
Packit 2ad57b
static char *last_name; /* = NULL */
Packit 2ad57b
Packit 2ad57b
static const struct {
Packit 2ad57b
	const char *pattern;
Packit 2ad57b
	int obase, width;
Packit 2ad57b
} guess_table[] = {
Packit 2ad57b
	{ "*-frequency", 10, 0 },
Packit 2ad57b
	{ "num-*", 10, 0 },
Packit 2ad57b
	{ "#*-cells", 10, 0 },
Packit 2ad57b
	{ "*cache-line-size", 10, 0 },
Packit 2ad57b
	{ "*cache-block-size", 10, 0 },
Packit 2ad57b
	{ "*cache-size", 10, 0 },
Packit 2ad57b
	{ "*cache-sets", 10, 0 },
Packit 2ad57b
	{ "cell-index", 10, 0 },
Packit 2ad57b
	{ "bank-width", 10, 0 },
Packit 2ad57b
	{ "*-fifo-size", 10, 0 },
Packit 2ad57b
	{ "*-frame-size", 10, 0 },
Packit 2ad57b
	{ "*-channel", 10, 0 },
Packit 2ad57b
	{ "current-speed", 10, 0 },
Packit 2ad57b
	{ "phy-map", 16, 8 },
Packit 2ad57b
	{ "dcr-reg", 16, 3 },
Packit 2ad57b
	{ "reg", 16, 8 },
Packit 2ad57b
	{ "ranges", 16, 8},
Packit 2ad57b
};
Packit 2ad57b
%}
Packit 2ad57b
Packit 2ad57b
%%
Packit 2ad57b
<*>"/include/"{GAP}{STRING}	ECHO;
Packit 2ad57b
Packit 2ad57b
<*>\"([^\\"]|\\.)*\"	ECHO;
Packit 2ad57b
Packit 2ad57b
<*>"/dts-v1/"	{
Packit 2ad57b
			die("Input dts file is already version 1\n");
Packit 2ad57b
		}
Packit 2ad57b
Packit 2ad57b
<*>"/memreserve/"	{
Packit 2ad57b
			if (!v1_tagged) {
Packit 2ad57b
				fprintf(yyout, "/dts-v1/;\n\n");
Packit 2ad57b
				v1_tagged = 1;
Packit 2ad57b
			}
Packit 2ad57b
Packit 2ad57b
			ECHO;
Packit 2ad57b
			BEGIN(INITIAL);
Packit 2ad57b
		}
Packit 2ad57b
Packit 2ad57b
<*>{LABEL}:		ECHO;
Packit 2ad57b
Packit 2ad57b
<INITIAL>[bodh]# {
Packit 2ad57b
			if (*yytext == 'b')
Packit 2ad57b
				cbase = 2;
Packit 2ad57b
			else if (*yytext == 'o')
Packit 2ad57b
				cbase = 8;
Packit 2ad57b
			else if (*yytext == 'd')
Packit 2ad57b
				cbase = 10;
Packit 2ad57b
			else
Packit 2ad57b
				cbase = 16;
Packit 2ad57b
		}
Packit 2ad57b
Packit 2ad57b
<INITIAL>[0-9a-fA-F]+	{
Packit 2ad57b
			unsigned long long val;
Packit 2ad57b
			int obase = 16, width = 0;
Packit 2ad57b
			int i;
Packit 2ad57b
Packit 2ad57b
			val = strtoull(yytext, NULL, cbase);
Packit 2ad57b
Packit 2ad57b
			if (saw_hyphen)
Packit 2ad57b
				val = val - last_val + 1;
Packit 2ad57b
Packit 2ad57b
			if (last_name) {
Packit 2ad57b
				for (i = 0; i < ARRAY_SIZE(guess_table); i++)
Packit 2ad57b
					if (fnmatch(guess_table[i].pattern,
Packit 2ad57b
					    last_name, 0) == 0) {
Packit 2ad57b
						obase = guess_table[i].obase;
Packit 2ad57b
						width = guess_table[i].width;
Packit 2ad57b
					}
Packit 2ad57b
			} else {
Packit 2ad57b
				obase = 16;
Packit 2ad57b
				width = 16;
Packit 2ad57b
			}
Packit 2ad57b
Packit 2ad57b
			if (cbase != 16)
Packit 2ad57b
				obase = cbase;
Packit 2ad57b
Packit 2ad57b
			switch (obase) {
Packit 2ad57b
			case 2:
Packit 2ad57b
			case 16:
Packit 2ad57b
				fprintf(yyout, "0x%0*llx", width, val);
Packit 2ad57b
				break;
Packit 2ad57b
			case 8:
Packit 2ad57b
				fprintf(yyout, "0%0*llo", width, val);
Packit 2ad57b
				break;
Packit 2ad57b
			case 10:
Packit 2ad57b
				fprintf(yyout, "%*llu", width, val);
Packit 2ad57b
				break;
Packit 2ad57b
			}
Packit 2ad57b
Packit 2ad57b
			cbase = 16;
Packit 2ad57b
			last_val = val;
Packit 2ad57b
			saw_hyphen = 0;
Packit 2ad57b
		}
Packit 2ad57b
Packit 2ad57b
\&{LABEL}		ECHO;
Packit 2ad57b
Packit 2ad57b
"&{/"{PATHCHAR}+\}	ECHO;
Packit 2ad57b
Packit 2ad57b
<INITIAL>"&/"{PATHCHAR}+ fprintf(yyout, "&{/%s}", yytext + 2);
Packit 2ad57b
Packit 2ad57b
<BYTESTRING>[0-9a-fA-F]{2} ECHO;
Packit 2ad57b
Packit 2ad57b
<BYTESTRING>"]"	{
Packit 2ad57b
			ECHO;
Packit 2ad57b
			BEGIN(INITIAL);
Packit 2ad57b
		}
Packit 2ad57b
Packit 2ad57b
<PROPNODENAME>{PROPNODECHAR}+ {
Packit 2ad57b
			ECHO;
Packit 2ad57b
			last_name = xstrdup(yytext);
Packit 2ad57b
			BEGIN(INITIAL);
Packit 2ad57b
		}
Packit 2ad57b
Packit 2ad57b
<*>{GAP}	ECHO;
Packit 2ad57b
Packit 2ad57b
<*>-		{	/* Hack to convert old style memreserves */
Packit 2ad57b
			saw_hyphen = 1;
Packit 2ad57b
			fprintf(yyout, " ");
Packit 2ad57b
		}
Packit 2ad57b
Packit 2ad57b
<*>.		{
Packit 2ad57b
			if (!v1_tagged) {
Packit 2ad57b
				fprintf(yyout, "/dts-v1/;\n\n");
Packit 2ad57b
				v1_tagged = 1;
Packit 2ad57b
			}
Packit 2ad57b
Packit 2ad57b
			ECHO;
Packit 2ad57b
			if (yytext[0] == '[') {
Packit 2ad57b
				BEGIN(BYTESTRING);
Packit 2ad57b
			}
Packit 2ad57b
			if ((yytext[0] == '{')
Packit 2ad57b
			    || (yytext[0] == ';')) {
Packit 2ad57b
				BEGIN(PROPNODENAME);
Packit 2ad57b
			}
Packit 2ad57b
		}
Packit 2ad57b
Packit 2ad57b
%%
Packit 2ad57b
/* Usage related data. */
Packit 2ad57b
static const char usage_synopsis[] = "convert-dtsv0 [options] <v0 dts file>...";
Packit 2ad57b
static const char usage_short_opts[] = "" USAGE_COMMON_SHORT_OPTS;
Packit 2ad57b
static struct option const usage_long_opts[] = {
Packit 2ad57b
	USAGE_COMMON_LONG_OPTS
Packit 2ad57b
};
Packit 2ad57b
static const char * const usage_opts_help[] = {
Packit 2ad57b
	USAGE_COMMON_OPTS_HELP
Packit 2ad57b
};
Packit 2ad57b
Packit 2ad57b
static void convert_file(const char *fname)
Packit 2ad57b
{
Packit 2ad57b
	const char suffix[] = "v1";
Packit 2ad57b
	int len = strlen(fname);
Packit 2ad57b
	char *newname;
Packit 2ad57b
Packit 2ad57b
	newname = xmalloc(len + sizeof(suffix));
Packit 2ad57b
	memcpy(newname, fname, len);
Packit 2ad57b
	memcpy(newname + len, suffix, sizeof(suffix));
Packit 2ad57b
Packit 2ad57b
	yyin = fopen(fname, "r");
Packit 2ad57b
	if (!yyin)
Packit 2ad57b
		die("Couldn't open input file %s: %s\n",
Packit 2ad57b
		    fname, strerror(errno));
Packit 2ad57b
Packit 2ad57b
	yyout = fopen(newname, "w");
Packit 2ad57b
	if (!yyout)
Packit 2ad57b
		die("Couldn't open output file %s: %s\n",
Packit 2ad57b
		    newname, strerror(errno));
Packit 2ad57b
Packit 2ad57b
	while(yylex())
Packit 2ad57b
		;
Packit 2ad57b
Packit 2ad57b
	free(newname);
Packit 2ad57b
}
Packit 2ad57b
Packit 2ad57b
int main(int argc, char *argv[])
Packit 2ad57b
{
Packit 2ad57b
	int opt;
Packit 2ad57b
	int i;
Packit 2ad57b
Packit 2ad57b
	while ((opt = util_getopt_long()) != EOF) {
Packit 2ad57b
		switch (opt) {
Packit 2ad57b
		case_USAGE_COMMON_FLAGS
Packit 2ad57b
		}
Packit 2ad57b
	}
Packit 2ad57b
	if (argc < 2)
Packit 2ad57b
		usage("missing filename");
Packit 2ad57b
Packit 2ad57b
	for (i = 1; i < argc; i++) {
Packit 2ad57b
		fprintf(stderr, "Converting %s from dts v0 to dts v1\n", argv[i]);
Packit 2ad57b
		convert_file(argv[i]);
Packit 2ad57b
	}
Packit 2ad57b
Packit 2ad57b
	exit(0);
Packit 2ad57b
}