diff options
Diffstat (limited to 'gnu/usr.bin/as/output-file.c')
| -rw-r--r-- | gnu/usr.bin/as/output-file.c | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/gnu/usr.bin/as/output-file.c b/gnu/usr.bin/as/output-file.c new file mode 100644 index 000000000000..95b23ea6a52b --- /dev/null +++ b/gnu/usr.bin/as/output-file.c @@ -0,0 +1,122 @@ +/* output-file.c - Deal with the output file + Copyright (C) 1987, 1990, 1991, 1992 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + + GAS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GAS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GAS; see the file COPYING. If not, write to + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* + * Confines all details of emitting object bytes to this module. + * All O/S specific crocks should live here. + * What we lose in "efficiency" we gain in modularity. + * Note we don't need to #include the "as.h" file. No common coupling! + */ + +/* note that we do need config info. xoxorich. */ + +#ifndef lint +static char rcsid[] = "$Id: output-file.c,v 1.2 1993/11/03 00:52:08 paul Exp $"; +#endif + +#include <stdio.h> + +#include "as.h" + +#include "output-file.h" +#ifdef BFD_HEADERS +#include "bfd.h" +bfd *stdoutput; +void output_file_create(name) +char *name; +{ + if (name[0] == '-' && name[1] == '\0') { + as_perror("FATAL: Can't open a bfd on stdout %s ", name); + } + else if ( ! (stdoutput = bfd_openw( name, TARGET_FORMAT )) ) + { + as_perror ("FATAL: Can't create %s", name); + exit(42); + } + bfd_set_format(stdoutput, bfd_object); +} +/* output_file_create() */ + + +void output_file_close(filename) +char *filename; +{ + /* Close the bfd without getting bfd to write out anything by itself */ + if ( bfd_close_all_done( stdoutput ) == 0 ) + { + as_perror ("FATAL: Can't close %s\n", filename); + exit(42); + } + stdoutput = NULL; /* Trust nobody! */ +} /* output_file_close() */ + +void output_file_append(where, length, filename) +char *where; +long length; +char *filename; +{ + abort(); /* Never do this */ +} + +#else + +static FILE *stdoutput; + +void output_file_create(name) +char *name; +{ + if (name[0] == '-' && name[1] == '\0') + stdoutput=stdout; + else if (!(stdoutput = fopen(name, "wb"))) { + as_perror("FATAL: Can't create %s", name); + exit(42); + } +} /* output_file_create() */ + + + +void output_file_close(filename) +char *filename; +{ + if (EOF == fclose(stdoutput)) { + as_perror ("FATAL: Can't close %s", filename); + exit(42); + } + stdoutput = NULL; /* Trust nobody! */ +} /* output_file_close() */ + +void output_file_append(where, length, filename) +char *where; +long length; +char *filename; +{ + + for (; length; length--, where++) { + (void) putc(*where, stdoutput); + if (ferror(stdoutput)) + /* if ( EOF == (putc( *where, stdoutput )) ) */ + { + as_perror("Failed to emit an object byte", filename); + as_fatal("Can't continue"); + } + } +} /* output_file_append() */ +#endif + +/* end of output-file.c */ |
