Browse Source

Enhance source position implementation.

Implemented some print and copy routines.
Made empty srcpos objects that will be used later.
Protected .h file from multiple #include's.
Added srcpos_error() and srcpos_warn().

Signed-off-by: Jon Loeliger <jdl@freescale.com>
main
Jon Loeliger 16 years ago
parent
commit
e5c8e1dcd7
  1. 29
      dtc-parser.y
  2. 142
      srcpos.c
  3. 23
      srcpos.h

29
dtc-parser.y

@ -27,6 +27,7 @@ @@ -27,6 +27,7 @@
#include "srcpos.h"

extern int yylex(void);
extern void yyerror(char const *s);

extern struct boot_info *the_boot_info;
extern int treesource_error;
@ -208,9 +209,11 @@ propdata: @@ -208,9 +209,11 @@ propdata:

if ($6 != 0)
if (fseek(file->file, $6, SEEK_SET) != 0)
yyerrorf("Couldn't seek to offset %llu in \"%s\": %s",
(unsigned long long)$6,
$4.val, strerror(errno));
srcpos_error(&yyloc,
"Couldn't seek to offset %llu in \"%s\": %s",
(unsigned long long)$6,
$4.val,
strerror(errno));

d = data_copy_file(file->file, $8);

@ -339,26 +342,10 @@ label: @@ -339,26 +342,10 @@ label:

%%

void yyerrorf(char const *s, ...)
void yyerror(char const *s)
{
const char *fname = srcpos_file ? srcpos_file->name : "<no-file>";
va_list va;
va_start(va, s);

if (strcmp(fname, "-") == 0)
fname = "stdin";

fprintf(stderr, "%s:%d ", fname, yylloc.first_line);
vfprintf(stderr, s, va);
fprintf(stderr, "\n");

srcpos_error(&yylloc, "%s", s);
treesource_error = 1;
va_end(va);
}

void yyerror (char const *s)
{
yyerrorf("%s", s);
}

static unsigned long long eval_literal(const char *s, int base, int bits)

142
srcpos.c

@ -17,18 +17,40 @@ @@ -17,18 +17,40 @@
* USA
*/

#define _GNU_SOURCE

#include <stdio.h>

#include "dtc.h"
#include "srcpos.h"


/*
* Like yylineno, this is the current open file pos.
*/

struct dtc_file *srcpos_file;

static int dtc_open_one(struct dtc_file *file,
const char *search,
const char *fname)
/*
* The empty source position.
*/

struct dtc_file dtc_empty_file = {
.dir = NULL,
.name = "<no file>",
.file = NULL
};

srcpos srcpos_empty = {
.first_line = 0,
.first_column = 0,
.last_line = 0,
.last_column = 0,
.file = &dtc_empty_file
};


static int
dtc_open_one(struct dtc_file *file, const char *search, const char *fname)
{
char *fullname;

@ -53,8 +75,8 @@ static int dtc_open_one(struct dtc_file *file, @@ -53,8 +75,8 @@ static int dtc_open_one(struct dtc_file *file,
}


struct dtc_file *dtc_open_file(const char *fname,
const struct search_path *search)
struct dtc_file *
dtc_open_file(const char *fname, const struct search_path *search)
{
static const struct search_path default_search = { NULL, NULL, NULL };

@ -106,11 +128,113 @@ fail: @@ -106,11 +128,113 @@ fail:
die("Couldn't open \"%s\": %s\n", fname, strerror(errno));
}

void dtc_close_file(struct dtc_file *file)

void
dtc_close_file(struct dtc_file *file)
{
if (fclose(file->file))
die("Error closing \"%s\": %s\n", file->name, strerror(errno));
}


srcpos *
srcpos_copy(srcpos *pos)
{
srcpos *pos_new;

pos_new = xmalloc(sizeof(srcpos));
memcpy(pos_new, pos, sizeof(srcpos));

return pos_new;
}



void
srcpos_dump(srcpos *pos)
{
printf("file : \"%s\"\n",
pos->file ? (char *) pos->file : "<no file>");
printf("first_line : %d\n", pos->first_line);
printf("first_column: %d\n", pos->first_column);
printf("last_line : %d\n", pos->last_line);
printf("last_column : %d\n", pos->last_column);
printf("file : %s\n", pos->file->name);
}


char *
srcpos_string(srcpos *pos)
{
const char *fname;
char col_buf[100];
char *pos_str;

if (!pos) {
fname = "<no-file>";
} else if (pos->file->name) {
fname = pos->file->name;
if (strcmp(fname, "-") == 0)
fname = "stdin";
} else {
fname = "<no-file>";
}

if (pos->first_line == pos->last_line) {
if (pos->first_column == pos->last_column) {
snprintf(col_buf, sizeof(col_buf),
"%d:%d",
pos->first_line, pos->first_column);
} else {
snprintf(col_buf, sizeof(col_buf),
"%d:%d-%d",
pos->first_line,
pos->first_column, pos->last_column);
}

} else {
snprintf(col_buf, sizeof(col_buf),
"%d:%d - %d:%d",
pos->first_line, pos->first_column,
pos->last_line, pos->last_column);
}

if (asprintf(&pos_str, "%s %s", fname, col_buf) == -1)
return "<unknown source position?";

return pos_str;
}


void
srcpos_error(srcpos *pos, char const *fmt, ...)
{
const char *srcstr;
va_list va;
va_start(va, fmt);

srcstr = srcpos_string(pos);

fprintf(stderr, "Error: %s ", srcstr);
vfprintf(stderr, fmt, va);
fprintf(stderr, "\n");

va_end(va);
}


void
srcpos_warn(srcpos *pos, char const *fmt, ...)
{
const char *srcstr;
va_list va;
va_start(va, fmt);

srcstr = srcpos_string(pos);

fprintf(stderr, "Warning: %s ", srcstr);
vfprintf(stderr, fmt, va);
fprintf(stderr, "\n");

free(file->dir);
free(file);
va_end(va);
}

23
srcpos.h

@ -17,6 +17,9 @@ @@ -17,6 +17,9 @@
* USA
*/

#ifndef _SRCPOS_H_
#define _SRCPOS_H_

/*
* Augment the standard YYLTYPE with a filenum index into an
* array of all opened filenames.
@ -69,9 +72,14 @@ typedef struct YYLTYPE { @@ -69,9 +72,14 @@ typedef struct YYLTYPE {
while (YYID (0))


typedef YYLTYPE srcpos;

extern void yyerror(char const *);
extern void yyerrorf(char const *, ...) __attribute__((format(printf, 1, 2)));
/*
* Fictional source position used for IR nodes that are
* created without otherwise knowing a true source position.
* For example,constant definitions from the command line.
*/
extern srcpos srcpos_empty;

extern struct dtc_file *srcpos_file;

@ -83,3 +91,14 @@ struct search_path { @@ -83,3 +91,14 @@ struct search_path {
extern struct dtc_file *dtc_open_file(const char *fname,
const struct search_path *search);
extern void dtc_close_file(struct dtc_file *file);

extern srcpos *srcpos_copy(srcpos *pos);
extern char *srcpos_string(srcpos *pos);
extern void srcpos_dump(srcpos *pos);

extern void srcpos_error(srcpos *pos, char const *, ...)
__attribute__((format(printf, 2, 3)));
extern void srcpos_warn(srcpos *pos, char const *, ...)
__attribute__((format(printf, 2, 3)));

#endif /* _SRCPOS_H_ */

Loading…
Cancel
Save