mirror of
https://github.com/netwide-assembler/nasm
synced 2026-08-26 16:23:04 -04:00
file.h was only included from file.c; combine the two and declare functions not used anywhere else as static. Split out the checking I/O routines into a separate routine fileio.c as they are (mostly) not host operating system specific, whereas file.c is mostly host operating system generalization code. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
91 lines
2.1 KiB
C
91 lines
2.1 KiB
C
/* SPDX-License-Identifier: BSD-2-Clause */
|
|
/* Copyright 1996-2017 The NASM Authors - All Rights Reserved */
|
|
|
|
#include "compiler.h"
|
|
#include "nasmlib.h"
|
|
#include "error.h"
|
|
|
|
void nasm_read(void *ptr, size_t size, FILE *f)
|
|
{
|
|
size_t n = fread(ptr, 1, size, f);
|
|
if (ferror(f)) {
|
|
nasm_fatal("unable to read input: %s", strerror(errno));
|
|
} else if (n != size || feof(f)) {
|
|
nasm_fatal("fatal short read on input");
|
|
}
|
|
}
|
|
|
|
void nasm_write(const void *ptr, size_t size, FILE *f)
|
|
{
|
|
size_t n = fwrite(ptr, 1, size, f);
|
|
if (n != size || ferror(f) || feof(f))
|
|
nasm_fatal("unable to write output: %s", strerror(errno));
|
|
}
|
|
|
|
void fwriteint16_t(uint16_t data, FILE * fp)
|
|
{
|
|
data = htole16(data);
|
|
nasm_write(&data, 2, fp);
|
|
}
|
|
|
|
void fwriteint32_t(uint32_t data, FILE * fp)
|
|
{
|
|
data = htole32(data);
|
|
nasm_write(&data, 4, fp);
|
|
}
|
|
|
|
void fwriteint64_t(uint64_t data, FILE * fp)
|
|
{
|
|
data = htole64(data);
|
|
nasm_write(&data, 8, fp);
|
|
}
|
|
|
|
void fwriteaddr(uint64_t data, int size, FILE * fp)
|
|
{
|
|
data = htole64(data);
|
|
nasm_write(&data, size, fp);
|
|
}
|
|
|
|
/* Can we adjust the file size without actually writing all the bytes? */
|
|
|
|
#ifdef HAVE_IO_H
|
|
# include <io.h>
|
|
#endif
|
|
#ifdef HAVE_UNISTD_H
|
|
# include <unistd.h>
|
|
#endif
|
|
|
|
#ifdef HAVE__CHSIZE_S
|
|
# define os_ftruncate(fd,size) _chsize_s(fd,size)
|
|
#elif defined(HAVE__CHSIZE)
|
|
# define os_ftruncate(fd,size) _chsize(fd,size)
|
|
#elif defined(HAVE_FTRUNCATE)
|
|
# define os_ftruncate(fd,size) ftruncate(fd,size)
|
|
#endif
|
|
|
|
void fwritezero(off_t bytes, FILE *fp)
|
|
{
|
|
size_t blksize;
|
|
|
|
#ifdef os_ftruncate
|
|
if (bytes >= BUFSIZ && !ferror(fp) && !feof(fp)) {
|
|
off_t pos = ftello(fp);
|
|
if (pos != (off_t)-1) {
|
|
off_t end = pos + bytes;
|
|
if (!fflush(fp) && !os_ftruncate(fileno(fp), end)) {
|
|
fseeko(fp, 0, SEEK_END);
|
|
pos = ftello(fp);
|
|
if (pos != (off_t)-1)
|
|
bytes = end - pos; /* This SHOULD be zero */
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
while (bytes > 0) {
|
|
blksize = (bytes < ZERO_BUF_SIZE) ? bytes : ZERO_BUF_SIZE;
|
|
|
|
nasm_write(zero_buffer, blksize, fp);
|
|
bytes -= blksize;
|
|
}
|
|
}
|