From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27433 invoked by alias); 20 Jan 2014 19:18:29 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 27309 invoked by uid 89); 20 Jan 2014 19:18:29 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.2 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 20 Jan 2014 19:18:25 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s0KJIOn7002987 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 20 Jan 2014 14:18:24 -0500 Received: from barimba.redhat.com (ovpn-113-85.phx2.redhat.com [10.3.113.85]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s0KJINCr031799; Mon, 20 Jan 2014 14:18:23 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFC 1/9] share "cell" code Date: Mon, 20 Jan 2014 19:18:00 -0000 Message-Id: <1390245501-1186-2-git-send-email-tromey@redhat.com> In-Reply-To: <1390245501-1186-1-git-send-email-tromey@redhat.com> References: <1390245501-1186-1-git-send-email-tromey@redhat.com> X-SW-Source: 2014-01/txt/msg00749.txt.bz2 The "cell"-based printing code, like phex, was duplicated in both gdb and gdbserver. This patch merges the two implementations into a new file in common/. 2014-01-20 Tom Tromey * utils.c (NUMCELLS, CELLSIZE, get_cell, decimal2str, pulongest) (plongest, thirty_two, phex, phex_nz, octal2str, hex_string) (hex_string_custom, int_string, core_addr_to_string) (core_addr_to_string_nz, host_address_to_string): Move to common/cells.c. * common/cells.h: New file. * common/cells.c: New file * Makefile.in (SFILES): Add common/cells.c. (HFILES_NO_SRCDIR): Add common/cells.h. (COMMON_OBS): Add cells.o. (cells.o): New target. 2014-01-20 Tom Tromey * utils.c (NUMCELLS, CELLSIZE, get_cell, decimal2str, pulongest) (plongest, thirty_two, phex_nz): Remove. * Makefile.in (SFILES): Add common/cells.c. (OBS): Add cells.o. (cell-ipas.o): New target. (cells.o): New target. (IPA_OBJS): Add cells-ipa.o. --- gdb/ChangeLog | 14 ++ gdb/Makefile.in | 12 +- gdb/common/cells.c | 332 ++++++++++++++++++++++++++++++++++++++++++++++ gdb/common/cells.h | 70 ++++++++++ gdb/gdbserver/ChangeLog | 10 ++ gdb/gdbserver/Makefile.in | 12 +- gdb/gdbserver/utils.c | 117 ---------------- gdb/utils.c | 296 ----------------------------------------- 8 files changed, 444 insertions(+), 419 deletions(-) create mode 100644 gdb/common/cells.c create mode 100644 gdb/common/cells.h diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 0fbaaa3..43ff30e 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -780,7 +780,7 @@ SFILES = ada-exp.y ada-lang.c ada-typeprint.c ada-valprint.c ada-tasks.c \ common/gdb_vecs.c common/common-utils.c common/xml-utils.c \ common/ptid.c common/buffer.c gdb-dlfcn.c common/agent.c \ common/format.c common/filestuff.c btrace.c record-btrace.c ctf.c \ - target/waitstatus.c + target/waitstatus.c common/cells.c LINTFILES = $(SFILES) $(YYFILES) $(CONFIG_SRCS) init.c @@ -861,7 +861,8 @@ common/format.h common/host-defs.h utils.h common/queue.h \ common/linux-osdata.h gdb-dlfcn.h auto-load.h probe.h stap-probe.h \ gdb_bfd.h sparc-ravenscar-thread.h ppc-ravenscar-thread.h common/linux-btrace.h \ ctf.h common/i386-cpuid.h common/i386-gcc-cpuid.h target/resume.h \ -target/wait.h target/waitstatus.h nat/linux-nat.h nat/linux-waitpid.h +target/wait.h target/waitstatus.h nat/linux-nat.h nat/linux-waitpid.h \ +common/cells.h # Header files that already have srcdir in them, or which are in objdir. @@ -958,7 +959,8 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \ inferior.o osdata.o gdb_usleep.o record.o record-full.o gcore.o \ gdb_vecs.o jit.o progspace.o skip.o probe.o \ common-utils.o buffer.o ptid.o gdb-dlfcn.o common-agent.o \ - format.o registry.o btrace.o record-btrace.o waitstatus.o + format.o registry.o btrace.o record-btrace.o waitstatus.o \ + cells.o TSOBS = inflow.o @@ -2070,6 +2072,10 @@ mips-linux-watch.o: ${srcdir}/common/mips-linux-watch.c $(COMPILE) $(srcdir)/common/mips-linux-watch.c $(POSTCOMPILE) +cells.o: ${srcdir}/common/cells.c + $(COMPILE) $(srcdir)/common/cells.c + $(POSTCOMPILE) + # # gdb/target/ dependencies # diff --git a/gdb/common/cells.c b/gdb/common/cells.c new file mode 100644 index 0000000..4ddad1c --- /dev/null +++ b/gdb/common/cells.c @@ -0,0 +1,332 @@ +/* Cell-based print utility routines for GDB, the GNU debugger. + + Copyright (C) 1986-2014 Free Software Foundation, Inc. + + This file is part of GDB. + + This program 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 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see . */ + +#ifdef GDBSERVER +#include "server.h" +#else +#include "defs.h" +#endif + +#include +#include + +/* Temporary storage using circular buffer. */ + +#define NUMCELLS 16 +#define CELLSIZE 50 + +/* Return the next entry in the circular buffer. */ + +static char * +get_cell (void) +{ + static char buf[NUMCELLS][CELLSIZE]; + static int cell = 0; + + if (++cell >= NUMCELLS) + cell = 0; + return buf[cell]; +} + +static char * +decimal2str (char *sign, ULONGEST addr, int width) +{ + /* Steal code from valprint.c:print_decimal(). Should this worry + about the real size of addr as the above does? */ + unsigned long temp[3]; + char *str = get_cell (); + int i = 0; + + do + { + temp[i] = addr % (1000 * 1000 * 1000); + addr /= (1000 * 1000 * 1000); + i++; + width -= 9; + } + while (addr != 0 && i < (sizeof (temp) / sizeof (temp[0]))); + + width += 9; + if (width < 0) + width = 0; + + switch (i) + { + case 1: + xsnprintf (str, CELLSIZE, "%s%0*lu", sign, width, temp[0]); + break; + case 2: + xsnprintf (str, CELLSIZE, "%s%0*lu%09lu", sign, width, + temp[1], temp[0]); + break; + case 3: + xsnprintf (str, CELLSIZE, "%s%0*lu%09lu%09lu", sign, width, + temp[2], temp[1], temp[0]); + break; + default: + internal_error (__FILE__, __LINE__, + _("failed internal consistency check")); + } + + return str; +} + +static char * +octal2str (ULONGEST addr, int width) +{ + unsigned long temp[3]; + char *str = get_cell (); + int i = 0; + + do + { + temp[i] = addr % (0100000 * 0100000); + addr /= (0100000 * 0100000); + i++; + width -= 10; + } + while (addr != 0 && i < (sizeof (temp) / sizeof (temp[0]))); + + width += 10; + if (width < 0) + width = 0; + + switch (i) + { + case 1: + if (temp[0] == 0) + xsnprintf (str, CELLSIZE, "%*o", width, 0); + else + xsnprintf (str, CELLSIZE, "0%0*lo", width, temp[0]); + break; + case 2: + xsnprintf (str, CELLSIZE, "0%0*lo%010lo", width, temp[1], temp[0]); + break; + case 3: + xsnprintf (str, CELLSIZE, "0%0*lo%010lo%010lo", width, + temp[2], temp[1], temp[0]); + break; + default: + internal_error (__FILE__, __LINE__, + _("failed internal consistency check")); + } + + return str; +} + +/* See cells.h. */ + +char * +pulongest (ULONGEST u) +{ + return decimal2str ("", u, 0); +} + +/* See cells.h. */ + +char * +plongest (LONGEST l) +{ + if (l < 0) + return decimal2str ("-", -l, 0); + else + return decimal2str ("", l, 0); +} + +/* Eliminate warning from compiler on 32-bit systems. */ +static int thirty_two = 32; + +/* See cells.h. */ + +char * +phex (ULONGEST l, int sizeof_l) +{ + char *str; + + switch (sizeof_l) + { + case 8: + str = get_cell (); + xsnprintf (str, CELLSIZE, "%08lx%08lx", + (unsigned long) (l >> thirty_two), + (unsigned long) (l & 0xffffffff)); + break; + case 4: + str = get_cell (); + xsnprintf (str, CELLSIZE, "%08lx", (unsigned long) l); + break; + case 2: + str = get_cell (); + xsnprintf (str, CELLSIZE, "%04x", (unsigned short) (l & 0xffff)); + break; + default: + str = phex (l, sizeof (l)); + break; + } + + return str; +} + +/* See cells.h. */ + +char * +phex_nz (ULONGEST l, int sizeof_l) +{ + char *str; + + switch (sizeof_l) + { + case 8: + { + unsigned long high = (unsigned long) (l >> thirty_two); + + str = get_cell (); + if (high == 0) + xsnprintf (str, CELLSIZE, "%lx", + (unsigned long) (l & 0xffffffff)); + else + xsnprintf (str, CELLSIZE, "%lx%08lx", high, + (unsigned long) (l & 0xffffffff)); + break; + } + case 4: + str = get_cell (); + xsnprintf (str, CELLSIZE, "%lx", (unsigned long) l); + break; + case 2: + str = get_cell (); + xsnprintf (str, CELLSIZE, "%x", (unsigned short) (l & 0xffff)); + break; + default: + str = phex_nz (l, sizeof (l)); + break; + } + + return str; +} + +/* See cells.h. */ + +char * +hex_string (LONGEST num) +{ + char *result = get_cell (); + + xsnprintf (result, CELLSIZE, "0x%s", phex_nz (num, sizeof (num))); + return result; +} + +/* See cells.h. */ + +char * +hex_string_custom (LONGEST num, int width) +{ + char *result = get_cell (); + char *result_end = result + CELLSIZE - 1; + const char *hex = phex_nz (num, sizeof (num)); + int hex_len = strlen (hex); + + if (hex_len > width) + width = hex_len; + if (width + 2 >= CELLSIZE) + internal_error (__FILE__, __LINE__, _("\ +hex_string_custom: insufficient space to store result")); + + strcpy (result_end - width - 2, "0x"); + memset (result_end - width, '0', width); + strcpy (result_end - hex_len, hex); + return result_end - width - 2; +} + +/* See cells.h. */ + +char * +int_string (LONGEST val, int radix, int is_signed, int width, + int use_c_format) +{ + switch (radix) + { + case 16: + { + char *result; + + if (width == 0) + result = hex_string (val); + else + result = hex_string_custom (val, width); + if (! use_c_format) + result += 2; + return result; + } + case 10: + { + if (is_signed && val < 0) + return decimal2str ("-", -val, width); + else + return decimal2str ("", val, width); + } + case 8: + { + char *result = octal2str (val, width); + + if (use_c_format || val == 0) + return result; + else + return result + 1; + } + default: + internal_error (__FILE__, __LINE__, + _("failed internal consistency check")); + } +} + +/* See cells.h. */ + +const char * +core_addr_to_string (const CORE_ADDR addr) +{ + char *str = get_cell (); + + strcpy (str, "0x"); + strcat (str, phex (addr, sizeof (addr))); + return str; +} + +/* See cells.h. */ + +const char * +core_addr_to_string_nz (const CORE_ADDR addr) +{ + char *str = get_cell (); + + strcpy (str, "0x"); + strcat (str, phex_nz (addr, sizeof (addr))); + return str; +} + +/* See cells.h. */ + +const char * +host_address_to_string (const void *addr) +{ + char *str = get_cell (); + + xsnprintf (str, CELLSIZE, "0x%s", phex_nz ((uintptr_t) addr, sizeof (addr))); + return str; +} diff --git a/gdb/common/cells.h b/gdb/common/cells.h new file mode 100644 index 0000000..35b9739 --- /dev/null +++ b/gdb/common/cells.h @@ -0,0 +1,70 @@ +/* Cell-based print utility routines for GDB, the GNU debugger. + + Copyright (C) 1986-2014 Free Software Foundation, Inc. + + This file is part of GDB. + + This program 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 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see . */ + +#ifndef COMMON_CELLS_H +#define COMMON_CELLS_H + +/* %d for LONGEST. The result is stored in a circular static buffer, + NUMCELLS deep. */ + +extern char *pulongest (ULONGEST u); + +/* %u for ULONGEST. The result is stored in a circular static buffer, + NUMCELLS deep. */ + +extern char *plongest (LONGEST l); + +extern char *phex (ULONGEST l, int sizeof_l); + +/* Convert a ULONGEST into a HEX string, like %lx. The result is + stored in a circular static buffer, NUMCELLS deep. */ + +extern char *phex_nz (ULONGEST l, int sizeof_l); + +/* Converts a LONGEST to a C-format hexadecimal literal and stores it + in a static string. Returns a pointer to this string. */ + +extern char *hex_string (LONGEST num); + +/* Converts a LONGEST number to a C-format hexadecimal literal and + stores it in a static string. Returns a pointer to this string + that is valid until the next call. The number is padded on the + left with 0s to at least WIDTH characters. */ + +extern char *hex_string_custom (LONGEST num, int width); + +/* Convert VAL to a numeral in the given radix. For + * radix 10, IS_SIGNED may be true, indicating a signed quantity; + * otherwise VAL is interpreted as unsigned. If WIDTH is supplied, + * it is the minimum width (0-padded if needed). USE_C_FORMAT means + * to use C format in all cases. If it is false, then 'x' + * and 'o' formats do not include a prefix (0x or leading 0). */ + +extern char *int_string (LONGEST val, int radix, int is_signed, int width, + int use_c_format); + +/* Convert a CORE_ADDR into a string. */ + +extern const char *core_addr_to_string (const CORE_ADDR addr); + +extern const char *core_addr_to_string_nz (const CORE_ADDR addr); + +extern const char *host_address_to_string (const void *addr); + +#endif /* COMMON_CELLS_H */ diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in index e72ee6b..60d6e2f 100644 --- a/gdb/gdbserver/Makefile.in +++ b/gdb/gdbserver/Makefile.in @@ -163,7 +163,7 @@ SFILES= $(srcdir)/gdbreplay.c $(srcdir)/inferiors.c $(srcdir)/dll.c \ $(srcdir)/common/linux-osdata.c $(srcdir)/common/ptid.c \ $(srcdir)/common/buffer.c $(srcdir)/common/linux-btrace.c \ $(srcdir)/common/filestuff.c $(srcdir)/target/waitstatus.c \ - $(srcdir)/common/mips-linux-watch.c + $(srcdir)/common/mips-linux-watch.c $(srcdir)/common/cells.c DEPFILES = @GDBSERVER_DEPFILES@ @@ -176,7 +176,7 @@ OBS = agent.o ax.o inferiors.o regcache.o remote-utils.o server.o signals.o \ target.o waitstatus.o utils.o version.o vec.o gdb_vecs.o \ mem-break.o hostio.o event-loop.o tracepoint.o xml-utils.o \ common-utils.o ptid.o buffer.o format.o filestuff.o dll.o notif.o \ - tdesc.o $(XML_BUILTIN) $(DEPFILES) $(LIBOBJS) + tdesc.o cells.o $(XML_BUILTIN) $(DEPFILES) $(LIBOBJS) GDBREPLAY_OBS = gdbreplay.o version.o GDBSERVER_LIBS = @GDBSERVER_LIBS@ XM_CLIBS = @LIBS@ @@ -291,7 +291,7 @@ gdbreplay$(EXEEXT): $(GDBREPLAY_OBS) $(LIBGNU) ${CC-LD} $(INTERNAL_CFLAGS) $(INTERNAL_LDFLAGS) -o gdbreplay$(EXEEXT) $(GDBREPLAY_OBS) \ $(XM_CLIBS) $(LIBGNU) -IPA_OBJS=ax-ipa.o tracepoint-ipa.o format-ipa.o utils-ipa.o regcache-ipa.o remote-utils-ipa.o common-utils-ipa.o tdesc-ipa.o ${IPA_DEPFILES} +IPA_OBJS=ax-ipa.o tracepoint-ipa.o format-ipa.o utils-ipa.o regcache-ipa.o remote-utils-ipa.o common-utils-ipa.o tdesc-ipa.o cells-ipa.o ${IPA_DEPFILES} IPA_LIB=libinproctrace.so @@ -471,6 +471,9 @@ amd64-linux-ipa.o: amd64-linux.c tdesc-ipa.o: tdesc.c $(IPAGENT_COMPILE) $< $(POSTCOMPILE) +cells-ipa.o: ../common/cells.c + $(IPAGENT_COMPILE) $< + $(POSTCOMPILE) ax.o: ax.c $(COMPILE) $(WARN_CFLAGS_NO_FORMAT) $< @@ -479,6 +482,9 @@ ax.o: ax.c signals.o: ../common/signals.c $(COMPILE) $< $(POSTCOMPILE) +cells.o: ../common/cells.c + $(COMPILE) $< + $(POSTCOMPILE) linux-procfs.o: ../common/linux-procfs.c $(COMPILE) $< $(POSTCOMPILE) diff --git a/gdb/gdbserver/utils.c b/gdb/gdbserver/utils.c index eff4499..19955dc 100644 --- a/gdb/gdbserver/utils.c +++ b/gdb/gdbserver/utils.c @@ -165,123 +165,6 @@ internal_error (const char *file, int line, const char *fmt, ...) exit (1); } -/* Temporary storage using circular buffer. */ -#define NUMCELLS 10 -#define CELLSIZE 50 - -/* Return the next entry in the circular buffer. */ - -static char * -get_cell (void) -{ - static char buf[NUMCELLS][CELLSIZE]; - static int cell = 0; - if (++cell >= NUMCELLS) - cell = 0; - return buf[cell]; -} - -static char * -decimal2str (char *sign, ULONGEST addr) -{ - /* Steal code from valprint.c:print_decimal(). Should this worry - about the real size of addr as the above does? */ - unsigned long temp[3]; - char *str = get_cell (); - int i = 0; - int width = 9; - - do - { - temp[i] = addr % (1000 * 1000 * 1000); - addr /= (1000 * 1000 * 1000); - i++; - } - while (addr != 0 && i < (sizeof (temp) / sizeof (temp[0]))); - - switch (i) - { - case 1: - xsnprintf (str, CELLSIZE, "%s%0*lu", sign, width, temp[0]); - break; - case 2: - xsnprintf (str, CELLSIZE, "%s%0*lu%09lu", sign, width, - temp[1], temp[0]); - break; - case 3: - xsnprintf (str, CELLSIZE, "%s%0*lu%09lu%09lu", sign, width, - temp[2], temp[1], temp[0]); - break; - default: - internal_error (__FILE__, __LINE__, - "failed internal consistency check"); - } - - return str; -} - -/* %u for ULONGEST. The result is stored in a circular static buffer, - NUMCELLS deep. */ - -char * -pulongest (ULONGEST u) -{ - return decimal2str ("", u); -} - -/* %d for LONGEST. The result is stored in a circular static buffer, - NUMCELLS deep. */ - -char * -plongest (LONGEST l) -{ - if (l < 0) - return decimal2str ("-", -l); - else - return decimal2str ("", l); -} - -/* Eliminate warning from compiler on 32-bit systems. */ -static int thirty_two = 32; - -/* Convert a ULONGEST into a HEX string, like %lx. The result is - stored in a circular static buffer, NUMCELLS deep. */ - -char * -phex_nz (ULONGEST l, int sizeof_l) -{ - char *str; - - switch (sizeof_l) - { - case 8: - { - unsigned long high = (unsigned long) (l >> thirty_two); - str = get_cell (); - if (high == 0) - xsnprintf (str, CELLSIZE, "%lx", - (unsigned long) (l & 0xffffffff)); - else - xsnprintf (str, CELLSIZE, "%lx%08lx", high, - (unsigned long) (l & 0xffffffff)); - break; - } - case 4: - str = get_cell (); - xsnprintf (str, CELLSIZE, "%lx", (unsigned long) l); - break; - case 2: - str = get_cell (); - xsnprintf (str, CELLSIZE, "%x", (unsigned short) (l & 0xffff)); - break; - default: - str = phex_nz (l, sizeof (l)); - break; - } - - return str; -} - /* Convert a CORE_ADDR into a HEX string, like %lx. The result is stored in a circular static buffer, NUMCELLS deep. */ diff --git a/gdb/utils.c b/gdb/utils.c index e062e89..2506c9c 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -2748,21 +2748,6 @@ When set, debugging messages will be marked with seconds and microseconds."), &setdebuglist, &showdebuglist); } -/* Print routines to handle variable size regs, etc. */ -/* Temporary storage using circular buffer. */ -#define NUMCELLS 16 -#define CELLSIZE 50 -static char * -get_cell (void) -{ - static char buf[NUMCELLS][CELLSIZE]; - static int cell = 0; - - if (++cell >= NUMCELLS) - cell = 0; - return buf[cell]; -} - const char * paddress (struct gdbarch *gdbarch, CORE_ADDR addr) { @@ -2822,278 +2807,6 @@ core_addr_eq (const void *ap, const void *bp) return *addr_ap == *addr_bp; } -static char * -decimal2str (char *sign, ULONGEST addr, int width) -{ - /* Steal code from valprint.c:print_decimal(). Should this worry - about the real size of addr as the above does? */ - unsigned long temp[3]; - char *str = get_cell (); - int i = 0; - - do - { - temp[i] = addr % (1000 * 1000 * 1000); - addr /= (1000 * 1000 * 1000); - i++; - width -= 9; - } - while (addr != 0 && i < (sizeof (temp) / sizeof (temp[0]))); - - width += 9; - if (width < 0) - width = 0; - - switch (i) - { - case 1: - xsnprintf (str, CELLSIZE, "%s%0*lu", sign, width, temp[0]); - break; - case 2: - xsnprintf (str, CELLSIZE, "%s%0*lu%09lu", sign, width, - temp[1], temp[0]); - break; - case 3: - xsnprintf (str, CELLSIZE, "%s%0*lu%09lu%09lu", sign, width, - temp[2], temp[1], temp[0]); - break; - default: - internal_error (__FILE__, __LINE__, - _("failed internal consistency check")); - } - - return str; -} - -static char * -octal2str (ULONGEST addr, int width) -{ - unsigned long temp[3]; - char *str = get_cell (); - int i = 0; - - do - { - temp[i] = addr % (0100000 * 0100000); - addr /= (0100000 * 0100000); - i++; - width -= 10; - } - while (addr != 0 && i < (sizeof (temp) / sizeof (temp[0]))); - - width += 10; - if (width < 0) - width = 0; - - switch (i) - { - case 1: - if (temp[0] == 0) - xsnprintf (str, CELLSIZE, "%*o", width, 0); - else - xsnprintf (str, CELLSIZE, "0%0*lo", width, temp[0]); - break; - case 2: - xsnprintf (str, CELLSIZE, "0%0*lo%010lo", width, temp[1], temp[0]); - break; - case 3: - xsnprintf (str, CELLSIZE, "0%0*lo%010lo%010lo", width, - temp[2], temp[1], temp[0]); - break; - default: - internal_error (__FILE__, __LINE__, - _("failed internal consistency check")); - } - - return str; -} - -char * -pulongest (ULONGEST u) -{ - return decimal2str ("", u, 0); -} - -char * -plongest (LONGEST l) -{ - if (l < 0) - return decimal2str ("-", -l, 0); - else - return decimal2str ("", l, 0); -} - -/* Eliminate warning from compiler on 32-bit systems. */ -static int thirty_two = 32; - -char * -phex (ULONGEST l, int sizeof_l) -{ - char *str; - - switch (sizeof_l) - { - case 8: - str = get_cell (); - xsnprintf (str, CELLSIZE, "%08lx%08lx", - (unsigned long) (l >> thirty_two), - (unsigned long) (l & 0xffffffff)); - break; - case 4: - str = get_cell (); - xsnprintf (str, CELLSIZE, "%08lx", (unsigned long) l); - break; - case 2: - str = get_cell (); - xsnprintf (str, CELLSIZE, "%04x", (unsigned short) (l & 0xffff)); - break; - default: - str = phex (l, sizeof (l)); - break; - } - - return str; -} - -char * -phex_nz (ULONGEST l, int sizeof_l) -{ - char *str; - - switch (sizeof_l) - { - case 8: - { - unsigned long high = (unsigned long) (l >> thirty_two); - - str = get_cell (); - if (high == 0) - xsnprintf (str, CELLSIZE, "%lx", - (unsigned long) (l & 0xffffffff)); - else - xsnprintf (str, CELLSIZE, "%lx%08lx", high, - (unsigned long) (l & 0xffffffff)); - break; - } - case 4: - str = get_cell (); - xsnprintf (str, CELLSIZE, "%lx", (unsigned long) l); - break; - case 2: - str = get_cell (); - xsnprintf (str, CELLSIZE, "%x", (unsigned short) (l & 0xffff)); - break; - default: - str = phex_nz (l, sizeof (l)); - break; - } - - return str; -} - -/* Converts a LONGEST to a C-format hexadecimal literal and stores it - in a static string. Returns a pointer to this string. */ -char * -hex_string (LONGEST num) -{ - char *result = get_cell (); - - xsnprintf (result, CELLSIZE, "0x%s", phex_nz (num, sizeof (num))); - return result; -} - -/* Converts a LONGEST number to a C-format hexadecimal literal and - stores it in a static string. Returns a pointer to this string - that is valid until the next call. The number is padded on the - left with 0s to at least WIDTH characters. */ -char * -hex_string_custom (LONGEST num, int width) -{ - char *result = get_cell (); - char *result_end = result + CELLSIZE - 1; - const char *hex = phex_nz (num, sizeof (num)); - int hex_len = strlen (hex); - - if (hex_len > width) - width = hex_len; - if (width + 2 >= CELLSIZE) - internal_error (__FILE__, __LINE__, _("\ -hex_string_custom: insufficient space to store result")); - - strcpy (result_end - width - 2, "0x"); - memset (result_end - width, '0', width); - strcpy (result_end - hex_len, hex); - return result_end - width - 2; -} - -/* Convert VAL to a numeral in the given radix. For - * radix 10, IS_SIGNED may be true, indicating a signed quantity; - * otherwise VAL is interpreted as unsigned. If WIDTH is supplied, - * it is the minimum width (0-padded if needed). USE_C_FORMAT means - * to use C format in all cases. If it is false, then 'x' - * and 'o' formats do not include a prefix (0x or leading 0). */ - -char * -int_string (LONGEST val, int radix, int is_signed, int width, - int use_c_format) -{ - switch (radix) - { - case 16: - { - char *result; - - if (width == 0) - result = hex_string (val); - else - result = hex_string_custom (val, width); - if (! use_c_format) - result += 2; - return result; - } - case 10: - { - if (is_signed && val < 0) - return decimal2str ("-", -val, width); - else - return decimal2str ("", val, width); - } - case 8: - { - char *result = octal2str (val, width); - - if (use_c_format || val == 0) - return result; - else - return result + 1; - } - default: - internal_error (__FILE__, __LINE__, - _("failed internal consistency check")); - } -} - -/* Convert a CORE_ADDR into a string. */ -const char * -core_addr_to_string (const CORE_ADDR addr) -{ - char *str = get_cell (); - - strcpy (str, "0x"); - strcat (str, phex (addr, sizeof (addr))); - return str; -} - -const char * -core_addr_to_string_nz (const CORE_ADDR addr) -{ - char *str = get_cell (); - - strcpy (str, "0x"); - strcat (str, phex_nz (addr, sizeof (addr))); - return str; -} - /* Convert a string back into a CORE_ADDR. */ CORE_ADDR string_to_core_addr (const char *my_string) @@ -3132,15 +2845,6 @@ string_to_core_addr (const char *my_string) return addr; } -const char * -host_address_to_string (const void *addr) -{ - char *str = get_cell (); - - xsnprintf (str, CELLSIZE, "0x%s", phex_nz ((uintptr_t) addr, sizeof (addr))); - return str; -} - char * gdb_realpath (const char *filename) { -- 1.8.1.4