FreeCalypso > hg > freecalypso-sw
diff rvinterf/ctracedec/processlog.c @ 858:4c6e7ada647b
compressed trace decoder almost fully implemented
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Sat, 02 May 2015 08:08:26 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/ctracedec/processlog.c Sat May 02 08:08:26 2015 +0000 @@ -0,0 +1,81 @@ +/* + * 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); +}