Do not include <quotearg.h>; no longer needed.

(boundary): New type.
(location_t): Use it.  This allows locations to span file boundaries.
All member uses changed: file -> start.file or end.file (as needed),
first_line -> start.line, first_column -> start.column,
last_line -> end.line, last_column -> end.column.
(equal_boundaries): New function.
(LOCATION_RESET, LOCATION_STEP): Remove.
(LOCATION_PRINT): Remove.  All callers changed to use location_print.
(empty_location): Now const.
(location_print): New decl.
This commit is contained in:
Paul Eggert
2002-12-07 05:58:38 +00:00
parent b17a1fc541
commit 8f759107f1

View File

@@ -1,5 +1,5 @@
/* Locations for Bison /* Locations for Bison
Copyright (C) 2002 Free Software Foundation, Inc. Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
@@ -20,56 +20,46 @@
#ifndef LOCATION_H_ #ifndef LOCATION_H_
# define LOCATION_H_ # define LOCATION_H_
# include "quotearg.h"
typedef struct location_s /* A boundary between two characters. */
typedef struct
{ {
const char *file; /* The name of the file that contains the boundary. */
int first_line; char const *file;
int first_column;
int last_line; /* The (origin-1) line that contains the boundary. */
int last_column; int line;
} location_t;
/* The (origin-1) column just after the boundary. This is neither a
byte count, nor a character count; it is a column count. */
int column;
} boundary;
/* Return nonzero if A and B are equal boundaries. */
static inline bool
equal_boundaries (boundary a, boundary b)
{
return (a.column == b.column
&& a.line == b.line
&& a.file == b.file);
}
/* A location, that is, a region of source code. */
typedef struct
{
/* Boundary just before the location starts. */
boundary start;
/* Boundary just after the location ends. */
boundary end;
} location_t;
#define YYLTYPE location_t #define YYLTYPE location_t
/* Initialize LOC. */ extern location_t const empty_location;
# define LOCATION_RESET(Loc) \
do { \
(Loc).file = NULL; \
(Loc).first_column = (Loc).first_line = 1; \
(Loc).last_column = (Loc).last_line = 1; \
} while (0)
void location_print (FILE *, location_t);
/* Restart: move the first cursor to the last position. */ #endif /* ! defined LOCATION_H_ */
# define LOCATION_STEP(Loc) \
do { \
(Loc).first_column = (Loc).last_column; \
(Loc).first_line = (Loc).last_line; \
} while (0)
/* Output LOC on the stream OUT.
Warning: it uses quotearg's slot 3. */
# define LOCATION_PRINT(Out, Loc) \
do { \
fprintf (stderr, "%s:", quotearg_n_style (3, escape_quoting_style, \
(Loc).file)); \
if ((Loc).first_line) \
{ \
if ((Loc).first_line != (Loc).last_line) \
fprintf (Out, "%d.%d-%d.%d", \
(Loc).first_line, (Loc).first_column, \
(Loc).last_line, (Loc).last_column - 1); \
else if ((Loc).first_column < (Loc).last_column - 1) \
fprintf (Out, "%d.%d-%d", (Loc).first_line, \
(Loc).first_column, (Loc).last_column - 1); \
else \
fprintf (Out, "%d.%d", (Loc).first_line, (Loc).first_column); \
} \
} while (0)
extern location_t empty_location;
#endif /* !LOCATION_H_ */