aboutsummaryrefslogtreecommitdiff
path: root/binutils/bucomm.c
diff options
context:
space:
mode:
Diffstat (limited to 'binutils/bucomm.c')
-rw-r--r--binutils/bucomm.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/binutils/bucomm.c b/binutils/bucomm.c
new file mode 100644
index 0000000..00f379f
--- /dev/null
+++ b/binutils/bucomm.c
@@ -0,0 +1,151 @@
+/*** bucomm.c -- Bin Utils COMmon code.
+
+ We might put this in a library someday so it could be dynamically
+ loaded, but for now it's not necessary */
+
+#include "sysdep.h"
+#include "bfd.h"
+#include <varargs.h>
+
+char *target = NULL; /* default as late as possible */
+
+/* Yes, this is what atexit is for, but that isn't guaranteed yet.
+ And yes, I know this isn't as good, but it does what is needed just fine */
+void (*exit_handler) ();
+
+/** Memory hackery */
+
+PROTO (char *, malloc, (unsigned size));
+PROTO (char *, realloc, (char *ptr, unsigned size));
+
+
+/* Error reporting */
+
+char *program_name;
+
+void
+bfd_fatal (string)
+ char *string;
+{
+ char *errmsg = bfd_errmsg (bfd_error);
+
+ if (string)
+ fprintf (stderr, "%s: %s: %s\n", program_name, string, errmsg);
+ else
+ fprintf (stderr, "%s: %s\n", program_name, errmsg);
+
+ if (NULL != exit_handler) (*exit_handler) ();
+ exit (1);
+}
+
+#ifndef NO_STDARG
+void
+fatal (Format)
+ const char *Format;
+{
+ va_list args;
+
+ va_start (args, Format);
+ vfprintf (stderr, Format, args);
+ va_end (args);
+ (void) putc ('\n', stderr);
+ if (NULL != exit_handler) (*exit_handler) ();
+ exit (1);
+}
+#else
+#ifndef NO_VARARGS
+void fatal (va_alist)
+ va_dcl
+{
+ char *Format;
+ va_list args;
+
+ va_start (args);
+ Format = va_arg(args, char *);
+ vfprintf (stderr, Format, args);
+ va_end (args);
+ (void) putc ('\n', stderr);
+ if (NULL != exit_handler) (*exit_handler) ();
+ exit (1);
+} /* fatal() */
+#else
+/*VARARGS1 */
+fatal (Format, args)
+ char *Format;
+{
+ as_where ();
+ _doprnt (Format, &args, stderr); /* not terribly portable, but... */
+ (void) putc ('\n', stderr);
+ if (NULL != exit_handler) (*exit_handler) ();
+ exit (1);
+}
+#endif /* not NO_VARARGS */
+#endif /* not NO_STDARG */
+
+
+/** Display the archive header for an element as if it were an ls -l listing */
+
+/* Mode User\tGroup\tSize\tDate Name */
+
+void
+print_arelt_descr (abfd, verbose)
+ bfd *abfd;
+ boolean verbose;
+{
+ struct stat buf;
+ char modebuf[11];
+ char timebuf[40];
+ long when;
+ long current_time = time ((long *) 0);
+
+ if (verbose) {
+
+ if (bfd_stat_arch_elt (abfd, &buf) == 0) { /* if not, huh? */
+
+ mode_string (buf.st_mode, modebuf);
+ modebuf[10] = '\0';
+ fputs (modebuf, stdout);
+
+ when = buf.st_mtime;
+ strcpy (timebuf, ctime (&when));
+
+ /* This code comes from gnu ls. */
+ if ((current_time - when > 6 * 30 * 24 * 60 * 60)
+ || (current_time - when < 0)) {
+ /* The file is fairly old or in the future.
+ POSIX says the cutoff is 6 months old;
+ approximate this by 6*30 days.
+ Show the year instead of the time of day. */
+ strcpy (timebuf + 11, timebuf + 19);
+ }
+ timebuf[16] = 0;
+
+ printf (" %d\t%d\t%ld\t%s ", buf.st_uid, buf.st_gid, buf.st_size, timebuf);
+ }
+ }
+
+ puts (abfd->filename);
+}
+
+/* Like malloc but get fatal error if memory is exhausted. */
+char *
+xmalloc (size)
+ unsigned size;
+{
+ register char *result = malloc (size);
+ if (result == NULL && size != NULL) fatal ("virtual memory exhausted");
+
+ return result;
+}
+
+/* Like realloc but get fatal error if memory is exhausted. */
+char *
+xrealloc (ptr, size)
+ char *ptr;
+ unsigned size;
+{
+ register char *result = realloc (ptr, size);
+ if (result == 0 && size != 0) fatal ("virtual memory exhausted");
+
+ return result;
+}