https://gcc.gnu.org/g:f5ffb084e1c2f9d679306c9999f8d3cb53a79d23
commit r16-6168-gf5ffb084e1c2f9d679306c9999f8d3cb53a79d23 Author: Jose E. Marchesi <[email protected]> Date: Mon Dec 15 14:03:01 2025 +0100 a68: introduce a68_file_size and a68_file_read This commit introduces two new utility functions that replace some ad-hoc infrastructure in the scanner. Signed-off-by: Jose E. Marchesi <[email protected]> gcc/algol68/ChangeLog * a68.h: Prototypes for a68_get_file_size and a68_file_read. * a68-parser-scanner.cc (a68_file_size): New function. (a68_file_read): Renamed from io_read. (get_source_size): Deleted function. (include_files): Use a68_file_size and a68_file_read. Diff: --- gcc/algol68/a68-parser-scanner.cc | 75 +++++++++++++++++++++------------------ gcc/algol68/a68.h | 2 ++ 2 files changed, 42 insertions(+), 35 deletions(-) diff --git a/gcc/algol68/a68-parser-scanner.cc b/gcc/algol68/a68-parser-scanner.cc index 8c0694de9ba2..aa67fb8d09c5 100644 --- a/gcc/algol68/a68-parser-scanner.cc +++ b/gcc/algol68/a68-parser-scanner.cc @@ -119,10 +119,35 @@ supper_postlude[] = { } \ while (0) +/* Get the size of a file given a file descriptor FILE. In case the size of + the file cannot be determined then this function returns -1. */ + +ssize_t +a68_file_size (FILE *file) +{ + ssize_t fsize; + off_t off, save; + + save = ftell (file); + if (save == -1) + return -1; + + off = lseek (fileno (file), 0, SEEK_END); + if (off == (off_t) -1) + return -1; + fsize = (ssize_t) off; + + off = lseek (fileno (file), 0, save); + if (off == (off_t) -1) + return -1; + + return fsize; +} + /* Read bytes from file into buffer. */ -static ssize_t -io_read (FILE *file, void *buf, size_t n) +ssize_t +a68_file_read (FILE *file, void *buf, size_t n) { int fd = fileno (file); size_t to_do = n; @@ -291,15 +316,6 @@ concatenate_lines (LINE_T * top) } } -/* Size of source file. */ - -static int -get_source_size (void) -{ - FILE *f = FILE_SOURCE_FD (&A68_JOB); - return (int) lseek (fileno (f), 0, SEEK_END); -} - /* Read source file FILENAME and make internal copy. */ static bool @@ -328,7 +344,10 @@ read_source_file (const char *filename) fatal_error (UNKNOWN_LOCATION, "specified file %s is a directory", filename); - source_file_size = get_source_size (); + l = a68_file_size (f); + if (l < 0) + error ("could not get size of source file"); + source_file_size = l; /* Allocate A68_PARSER (scan_buf), which is an auxiliary buffer used by the scanner known to be big enough to hold any string contained in the source @@ -344,13 +363,9 @@ read_source_file (const char *filename) /* Read the file into a single buffer, so we save on system calls. */ line_num = 1; - errno = 0; buffer = (char *) xmalloc (8 + source_file_size); - if (lseek (fileno (f), 0, SEEK_SET) < 0) - gcc_unreachable (); - errno = 0; - bytes_read = io_read (f, buffer, source_file_size); - gcc_assert (errno == 0 && bytes_read == source_file_size); + bytes_read = a68_file_read (f, buffer, source_file_size); + gcc_assert (bytes_read == source_file_size); /* Link all lines into the list. */ k = 0; @@ -969,8 +984,8 @@ include_files (LINE_T *top) if (item != NO_TEXT && streq (item, "INCLUDE") == 0) { FILE *fp; - int fd; size_t fsize, k; + ssize_t ssize; int n, linum, bytes_read; char *fbuf, delim; BUFFER fnb; @@ -1060,26 +1075,16 @@ include_files (LINE_T *top) t = NO_LINE; /* Access the file. */ - errno = 0; fp = fopen (fn, "r"); SCAN_ERROR (fp == NULL, start_l, start_c, "error opening included file"); - fd = fileno (fp); - errno = 0; - off_t off = lseek (fd, 0, SEEK_END); - gcc_assert (off >= 0); - fsize = (size_t) off; - SCAN_ERROR (errno != 0, start_l, start_c, - "error while reading file"); + ssize = a68_file_size (fp); + SCAN_ERROR (ssize < 0, start_l, start_c, + "error getting included file size"); + fsize = ssize; fbuf = (char *) xmalloc (8 + fsize); - errno = 0; - if (lseek (fd, 0, SEEK_SET) < 0) - gcc_unreachable (); - SCAN_ERROR (errno != 0, start_l, start_c, - "error while reading file"); - errno = 0; - bytes_read = (int) io_read (fp, fbuf, (size_t) fsize); - SCAN_ERROR (errno != 0 || (size_t) bytes_read != fsize, start_l, start_c, + bytes_read = (int) a68_file_read (fp, fbuf, (size_t) fsize); + SCAN_ERROR ((size_t) bytes_read != fsize, start_l, start_c, "error while reading file"); /* Buffer still usable?. */ diff --git a/gcc/algol68/a68.h b/gcc/algol68/a68.h index 40ceec9ddc3e..ed4508365c41 100644 --- a/gcc/algol68/a68.h +++ b/gcc/algol68/a68.h @@ -281,6 +281,8 @@ void a68_scan_error (LINE_T *u, char *v, const char *txt, ...); /* a68-parser-scanner.cc */ bool a68_lexical_analyser (const char *filename, bool *empty_file); +ssize_t a68_get_file_size (FILE *file); +ssize_t a68_file_read (FILE *file, void *buf, size_t n); /* a68-parser.cc */
