Blame dwarfdump/tag_common.c

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
}