file_buffer_ty * read_file( char * filename, struct stat64 * file_stats) { static file_buffer_ty fileptr; /* * size is required to be unsigned for MSDOS, * in order to read files larger than 32767 * bytes in a 16-bit world... */ unsigned int size; int namelen = strlen(filename); int fd = open(filename, O_RDONLY, 0777); if (fd < 0) { fatal (_("Can't open input file %s"), filename); } if (fstat64(fd, file_stats) < 0) { fatal (_("Can't stat input file %s"), filename); } if (file_stats->st_size == 0) { ERROR (_("Warning: Zero-length file %s"), filename, 0); } #if !defined(__DJGPP__) if (sizeof (int) == 2) /* Old MSDOS */ { if ((file_stats->st_size < 0) || (file_stats->st_size > (0xffff - 1))) { fatal(_("File %s is too big to read"), filename); } } else #endif { if (file_stats->st_size < 0) { fatal(_("System problem reading file %s"), filename); } } fileptr.size = file_stats->st_size; if (fileptr.data != 0) { fileptr.data = (char *) xrealloc (fileptr.data, (unsigned) file_stats->st_size + 2); /* add 1 for '\0' and 1 for * potential final added * newline. */ } else { fileptr.data = (char *) xmalloc ((unsigned) file_stats->st_size + 2); /* add 1 for '\0' and 1 for * potential final added * newline. */ } size = INDENT_SYS_READ (fd, fileptr.data, fileptr.size); if (size == (unsigned int) -1) { fatal (_("Error reading input file %s"), filename); } if (close (fd) < 0) { fatal (_("Error closeing input file %s"), filename); } /* Apparently, the DOS stores files using CR-LF for newlines, but * then the DOS `read' changes them into '\n'. Thus, the size of the * file on disc is larger than what is read into memory. Thanks, Bill. */ if (size < fileptr.size) { fileptr.size = size; } if (fileptr.name != NULL) { fileptr.name = (char *) xrealloc (fileptr.name, (unsigned) namelen + 1); } else { fileptr.name = (char *) xmalloc (namelen + 1); } (void)strncpy(fileptr.name, filename, namelen); fileptr.name[namelen] = EOS; if (fileptr.data[fileptr.size - 1] != EOL) { fileptr.data[fileptr.size] = EOL; fileptr.size++; } fileptr.data[fileptr.size] = EOS; return &fileptr; }
extern file_buffer_ty * read_file( char * filename, struct stat * file_stats) { static file_buffer_ty fileptr = {NULL}; #if defined(__MSDOS__) || defined(VMS) /* * size is required to be unsigned for MSDOS, * in order to read files larger than 32767 * bytes in a 16-bit world... */ unsigned int size = 0, size_to_read = 0; #else ssize_t size = 0; size_t size_to_read = 0; #endif int namelen = strlen(filename); int fd = open(filename, O_RDONLY, 0777); if (fd < 0) { fatal (_("Can't open input file %s"), filename); } if (fstat(fd, file_stats) < 0) { fatal (_("Can't stat input file %s"), filename); } if (file_stats->st_size == 0) { ERROR (_("Zero-length file %s"), filename, 0); } #if !defined(__DJGPP__) if (sizeof (int) == 2) /* Old MSDOS */ { if ((file_stats->st_size < 0) || (file_stats->st_size > (0xffff - 1))) { fatal(_("File %s is too big to read"), filename); } } else #endif { if (file_stats->st_size < 0) { fatal(_("System problem reading file %s"), filename); } } if (file_stats->st_size > SSIZE_MAX) { fatal(_("File %s is too big to read"), filename); } fileptr.size = file_stats->st_size; if (fileptr.data != 0) { fileptr.data = (char *) xrealloc (fileptr.data, (unsigned) file_stats->st_size + 2); /* add 1 for '\0' and 1 for * potential final added * newline. */ } else { fileptr.data = (char *) xmalloc ((unsigned) file_stats->st_size + 2); /* add 1 for '\0' and 1 for * potential final added * newline. */ } size_to_read = fileptr.size; while (size_to_read > 0) { size = INDENT_SYS_READ (fd, fileptr.data + fileptr.size - size_to_read, size_to_read); if (size == #if defined(__MSDOS__) || defined(VMS) (unsigned int) #endif -1) { #if !defined(__MSDOS__) && !defined(VMS) if (errno == EINTR) { continue; } #endif xfree(fileptr.data); fatal (_("Error reading input file %s"), filename); } size_to_read -= size; } if (close (fd) < 0) { xfree(fileptr.data); fatal (_("Error closing input file %s"), filename); } /* Apparently, the DOS stores files using CR-LF for newlines, but * then the DOS `read' changes them into '\n'. Thus, the size of the * file on disc is larger than what is read into memory. Thanks, Bill. */ if (size < fileptr.size) { fileptr.size = size; } if (fileptr.name != NULL) { fileptr.name = (char *) xrealloc (fileptr.name, (unsigned) namelen + 1); } else { fileptr.name = (char *) xmalloc (namelen + 1); } memcpy(fileptr.name, filename, namelen); fileptr.name[namelen] = EOS; if (fileptr.data[fileptr.size - 1] != EOL) { fileptr.data[fileptr.size] = EOL; fileptr.size++; } fileptr.data[fileptr.size] = EOS; return &fileptr; }