view rvinterf/ctracedec/processlog.c @ 815:bc1e150f5bd9

rvinterf/include/bsim_etm_cmd.h: copy from FC Tourmaline
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 14 May 2021 15:51:20 +0000
parents e7502631a0f9
children
line wrap: on
line source

/*
 * This module contains the code that processes rvtdump/rvinterf log files
 * at the high level and identifies which lines are compressed traces.
 */

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>

is_logline_ctrace(line)
	char *line;
{
	char *cp = line;

	if (*cp++ != '[')
		return(0);
	if (!isdigit(*cp++))
		return(0);
	if (!isdigit(*cp++))
		return(0);
	if (*cp++ != ':')
		return(0);
	if (!isdigit(*cp++))
		return(0);
	if (!isdigit(*cp++))
		return(0);
	if (*cp++ != ':')
		return(0);
	if (!isdigit(*cp++))
		return(0);
	if (!isdigit(*cp++))
		return(0);
	if (strncmp(cp, "] GPF trace ", 12))
		return(0);
	cp += 12;
	while (isalpha(*cp)) {
		while (*cp && !isspace(*cp))
			cp++;
		if (isspace(*cp))
			cp++;
		else
			return(0);
	}
	if (isdigit(*cp))
		return(cp - line);
	else
		return(0);
}

process_log_file(filename)
	char *filename;
{
	FILE *f;
	char linebuf[512], *cp;
	int lineno, i;

	f = fopen(filename, "r");
	if (!f) {
		perror(filename);
		exit(1);
	}
	for (lineno = 1; fgets(linebuf, sizeof linebuf, f); lineno++) {
		cp = index(linebuf, '\n');
		if (!cp) {
			fprintf(stderr,
			    "error: %s line %d is too long or unterminated\n",
				filename, lineno);
			exit(1);
		}
		*cp = '\0';
		i = is_logline_ctrace(linebuf);
		if (i)
			process_ctrace_line(linebuf, i, filename, lineno);
		else
			puts(linebuf);
	}
	fclose(f);
	return(0);
}