output-file.c revision 130562
1169718Skan/* output-file.c -  Deal with the output file
2169718Skan   Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1996, 1998, 1999, 2001, 2003
3169718Skan   Free Software Foundation, Inc.
4169718Skan
5169718Skan   This file is part of GAS, the GNU Assembler.
6169718Skan
7   GAS is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 2, or (at your option)
10   any later version.
11
12   GAS is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with GAS; see the file COPYING.  If not, write to
19   the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20   02111-1307, USA.  */
21
22#include <stdio.h>
23
24#include "as.h"
25
26#include "output-file.h"
27
28#ifdef BFD_HEADERS
29#define USE_BFD
30#endif
31
32#ifdef BFD_ASSEMBLER
33#define USE_BFD
34#ifndef TARGET_MACH
35#define TARGET_MACH 0
36#endif
37#endif
38
39#ifdef USE_BFD
40#include "bfd.h"
41bfd *stdoutput;
42
43void
44output_file_create (char *name)
45{
46  if (name[0] == '-' && name[1] == '\0')
47    as_fatal (_("can't open a bfd on stdout %s"), name);
48
49  else if (!(stdoutput = bfd_openw (name, TARGET_FORMAT)))
50    {
51      as_perror (_("FATAL: can't create %s"), name);
52      exit (EXIT_FAILURE);
53    }
54
55  bfd_set_format (stdoutput, bfd_object);
56#ifdef BFD_ASSEMBLER
57  bfd_set_arch_mach (stdoutput, TARGET_ARCH, TARGET_MACH);
58#endif
59  if (flag_traditional_format)
60    stdoutput->flags |= BFD_TRADITIONAL_FORMAT;
61}
62
63void
64output_file_close (char *filename)
65{
66#ifdef BFD_ASSEMBLER
67  /* Close the bfd.  */
68  if (bfd_close (stdoutput) == 0)
69    {
70      bfd_perror (filename);
71      as_perror (_("FATAL: can't close %s\n"), filename);
72      exit (EXIT_FAILURE);
73    }
74#else
75  /* Close the bfd without getting bfd to write out anything by itself.  */
76  if (bfd_close_all_done (stdoutput) == 0)
77    {
78      as_perror (_("FATAL: can't close %s\n"), filename);
79      exit (EXIT_FAILURE);
80    }
81#endif
82  stdoutput = NULL;		/* Trust nobody!  */
83}
84
85#ifndef BFD_ASSEMBLER
86void
87output_file_append (char *where ATTRIBUTE_UNUSED,
88		    long length ATTRIBUTE_UNUSED,
89		    char *filename ATTRIBUTE_UNUSED)
90{
91  abort ();
92}
93#endif
94
95#else
96
97static FILE *stdoutput;
98
99void
100output_file_create (char *name)
101{
102  if (name[0] == '-' && name[1] == '\0')
103    {
104      stdoutput = stdout;
105      return;
106    }
107
108  stdoutput = fopen (name, FOPEN_WB);
109  if (stdoutput == NULL)
110    {
111#ifdef BFD_ASSEMBLER
112      bfd_set_error (bfd_error_system_call);
113#endif
114      as_perror (_("FATAL: can't create %s"), name);
115      exit (EXIT_FAILURE);
116    }
117}
118
119void
120output_file_close (char *filename)
121{
122  if (EOF == fclose (stdoutput))
123    {
124#ifdef BFD_ASSEMBLER
125      bfd_set_error (bfd_error_system_call);
126#endif
127      as_perror (_("FATAL: can't close %s"), filename);
128      exit (EXIT_FAILURE);
129    }
130
131  /* Trust nobody!  */
132  stdoutput = NULL;
133}
134
135void
136output_file_append (char * where, long length, char * filename)
137{
138  for (; length; length--, where++)
139    {
140      (void) putc (*where, stdoutput);
141
142      if (ferror (stdoutput))
143	{
144#ifdef BFD_ASSEMBLER
145	  bfd_set_error (bfd_error_system_call);
146#endif
147	  as_perror (_("Failed to emit an object byte"), filename);
148	  as_fatal (_("can't continue"));
149	}
150    }
151}
152
153#endif
154
155