|
Packit |
cdaae3 |
/*
|
|
Packit |
cdaae3 |
Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved.
|
|
Packit |
cdaae3 |
Portions Copyright (C) 2009-2012 SN Systems Ltd. All Rights Reserved.
|
|
Packit |
cdaae3 |
Portions Copyright (C) 2009-2012 David Anderson. All Rights Reserved.
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
This program is free software; you can redistribute it and/or modify it
|
|
Packit |
cdaae3 |
under the terms of version 2 of the GNU General Public License as
|
|
Packit |
cdaae3 |
published by the Free Software Foundation.
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
This program is distributed in the hope that it would be useful, but
|
|
Packit |
cdaae3 |
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
cdaae3 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
Further, this software is distributed without any warranty that it is
|
|
Packit |
cdaae3 |
free of the rightful claim of any third person regarding infringement
|
|
Packit |
cdaae3 |
or the like. Any license provided herein, whether implied or
|
|
Packit |
cdaae3 |
otherwise, applies only to this software file. Patent licenses, if
|
|
Packit |
cdaae3 |
any, provided herein do not apply to combinations of this program with
|
|
Packit |
cdaae3 |
other software, or any other product whatsoever.
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
You should have received a copy of the GNU General Public License along
|
|
Packit |
cdaae3 |
with this program; if not, write the Free Software Foundation, Inc., 51
|
|
Packit |
cdaae3 |
Franklin Street - Fifth Floor, Boston MA 02110-1301, USA.
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
*/
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
#include <dwarf.h>
|
|
Packit |
cdaae3 |
#include <stdio.h>
|
|
Packit |
cdaae3 |
#include <stdarg.h> /* For va_start va_arg va_list */
|
|
Packit |
cdaae3 |
#include <stdlib.h>/* For exit() declaration etc. */
|
|
Packit |
cdaae3 |
#include <errno.h>/* For errno declaration. */
|
|
Packit |
cdaae3 |
#include <ctype.h> /* For isspace() declaration */
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
#include "globals.h"
|
|
Packit |
cdaae3 |
#include "naming.h"
|
|
Packit |
cdaae3 |
#include "tag_common.h"
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
static int linecount = 0;
|
|
Packit |
cdaae3 |
static char line_in[MAX_LINE_SIZE];
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
void
|
|
Packit |
cdaae3 |
bad_line_input(char *format,...)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
va_list ap;
|
|
Packit |
cdaae3 |
va_start(ap,format);
|
|
Packit |
cdaae3 |
fprintf(stderr,
|
|
Packit |
cdaae3 |
"tag_(tree,attr) table build failed, line %d: \"%s\". ",
|
|
Packit |
cdaae3 |
linecount, line_in);
|
|
Packit |
cdaae3 |
vfprintf(stderr,format, ap);
|
|
Packit |
cdaae3 |
/* "The object ap may be passed as an argument to another
|
|
Packit |
cdaae3 |
function; if that function invokes the va_arg()
|
|
Packit |
cdaae3 |
macro with parameter ap, the value of ap in the calling
|
|
Packit |
cdaae3 |
function is unspecified and shall be passed to the va_end()
|
|
Packit |
cdaae3 |
macro prior to any further reference to ap."
|
|
Packit |
cdaae3 |
Single Unix Specification. */
|
|
Packit |
cdaae3 |
va_end(ap);
|
|
Packit |
cdaae3 |
fprintf(stderr,"\n");
|
|
Packit |
cdaae3 |
exit(FAILED);
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
void
|
|
Packit |
cdaae3 |
trim_newline(char *line, int max)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
char *end = line + max - 1;
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
for (; *line && (line < end); ++line) {
|
|
Packit |
cdaae3 |
if (*line == '\n') {
|
|
Packit |
cdaae3 |
/* Found newline, drop it */
|
|
Packit |
cdaae3 |
*line = 0;
|
|
Packit |
cdaae3 |
return;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
return;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
/* Detect empty lines (and other lines we do not want to read) */
|
|
Packit |
cdaae3 |
static boolean
|
|
Packit |
cdaae3 |
is_skippable_line(char *pLine)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
boolean empty = TRUE;
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
if (pLine[0] == '#') {
|
|
Packit |
cdaae3 |
/* Preprocessor lines are of no interest. */
|
|
Packit |
cdaae3 |
return TRUE;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
for (; *pLine && empty; ++pLine) {
|
|
Packit |
cdaae3 |
empty = isspace(*pLine);
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
return empty;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
/* Reads a value from the text table.
|
|
Packit |
cdaae3 |
Exits with non-zero status
|
|
Packit |
cdaae3 |
if the table is erroneous in some way.
|
|
Packit |
cdaae3 |
*/
|
|
Packit |
cdaae3 |
int
|
|
Packit |
cdaae3 |
read_value(unsigned int *outval, FILE*file)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
char *res = 0;
|
|
Packit |
cdaae3 |
unsigned long lval;
|
|
Packit |
cdaae3 |
char *strout = 0;
|
|
Packit |
cdaae3 |
boolean bBlankLine = TRUE;
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
++linecount;
|
|
Packit |
cdaae3 |
*outval = 0;
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
while (bBlankLine) {
|
|
Packit |
cdaae3 |
res = fgets(line_in, sizeof(line_in), file);
|
|
Packit |
cdaae3 |
if (res == 0) {
|
|
Packit |
cdaae3 |
if (ferror(file)) {
|
|
Packit |
cdaae3 |
fprintf(stderr,
|
|
Packit |
cdaae3 |
"tag_attr: Error reading table, %d lines read\n",
|
|
Packit |
cdaae3 |
linecount);
|
|
Packit |
cdaae3 |
exit(FAILED);
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
if (feof(file)) {
|
|
Packit |
cdaae3 |
return IS_EOF;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
/* Impossible */
|
|
Packit |
cdaae3 |
fprintf(stderr, "tag_attr: Impossible error reading table, "
|
|
Packit |
cdaae3 |
"%d lines read\n", linecount);
|
|
Packit |
cdaae3 |
exit(FAILED);
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
bBlankLine = is_skippable_line(line_in);
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
trim_newline(line_in, sizeof(line_in));
|
|
Packit |
cdaae3 |
errno = 0;
|
|
Packit |
cdaae3 |
lval = strtoul(line_in, &strout, 0);
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
if (strout == line_in) {
|
|
Packit |
cdaae3 |
bad_line_input("bad number input!");
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
if (errno != 0) {
|
|
Packit |
cdaae3 |
int myerr = errno;
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
fprintf(stderr, "tag_attr errno %d\n", myerr);
|
|
Packit |
cdaae3 |
bad_line_input("invalid number on line");
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
*outval = (int) lval;
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
return NOT_EOF;
|
|
Packit |
cdaae3 |
}
|