From patchwork Sun Jun 7 20:04:32 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kratochvil X-Patchwork-Id: 7057 Received: (qmail 102516 invoked by alias); 7 Jun 2015 20:04:40 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 102507 invoked by uid 89); 7 Jun 2015 20:04:40 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.3 required=5.0 tests=AWL, BAYES_40, KAM_LAZY_DOMAIN_SECURITY, SPF_HELO_PASS, T_RP_MATCHES_RCVD autolearn=no 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 (AES256-GCM-SHA384 encrypted) ESMTPS; Sun, 07 Jun 2015 20:04:36 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 262518E663; Sun, 7 Jun 2015 20:04:35 +0000 (UTC) Received: from host1.jankratochvil.net (ovpn-116-44.ams2.redhat.com [10.36.116.44]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t57K4XQB021095; Sun, 7 Jun 2015 16:04:33 -0400 Subject: [PATCH v6 01/10] Move utility functions to common/ From: Jan Kratochvil To: gdb-patches@sourceware.org Cc: Aleksandar Ristovski Date: Sun, 07 Jun 2015 22:04:32 +0200 Message-ID: <20150607200432.8918.20411.stgit@host1.jankratochvil.net> In-Reply-To: <20150607200422.8918.48900.stgit@host1.jankratochvil.net> References: <20150607200422.8918.48900.stgit@host1.jankratochvil.net> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-IsSubscribed: yes Hi, some parts of the former patch have been reimplemented in the meantime by other patches so this is only a part of the former cleanup. Approved by: https://sourceware.org/ml/gdb-patches/2014-05/msg00363.html Jan gdb/ChangeLog 2014-02-26 Aleksandar Ristovski Move utility functions to common/. * cli/cli-utils.c (skip_spaces, skip_spaces_const, skip_to_space_const): Move defs to common/common-utils.c. * cli/cli-utils.h (skip_spaces, skip_spaces_const, skip_to_space) (skip_to_space_const): Move decls to common/common-utils.h. * common/common-defs.h: Move include of common-types.h before common-utils.h. * common/common-utils.c: Include host-defs.h and ctype.h. (HIGH_BYTE_POSN, is_digit_in_base, digit_to_int, strtoulst): Move from utils.c. (skip_spaces, skip_spaces_const, skip_to_space_const): Move from cli/cli-utils.c. * common/common-utils.h (strtoulst): Move decl from utils.h. (skip_spaces, skip_spaces_const, skip_to_space, skip_to_space_const): Move from cli/cli-utils.h. * common/host-defs.h: Include limits.h. (TARGET_CHAR_BIT, HOST_CHAR_BIT): Moved from defs.h. (skip_spaces, skip_spaces_const): Move decls from cli/cli-utils.h. * defs.h (TARGET_CHAR_BIT, HOST_CHAR_BIT): Move to common/common-utils.h. * utils.c (HIGH_BYTE_POSN, is_digit_in_base, digit_to_int) (strtoulst): Move to common/common-utils.c. * utils.h (strtoulst): Moved decl to common/common-utils.h. --- gdb/cli/cli-utils.c | 36 ------------ gdb/cli/cli-utils.h | 18 ------ gdb/common/common-defs.h | 2 - gdb/common/common-utils.c | 137 +++++++++++++++++++++++++++++++++++++++++++++ gdb/common/common-utils.h | 20 +++++++ gdb/common/host-defs.h | 21 +++++++ gdb/defs.h | 19 ------ gdb/utils.c | 99 --------------------------------- gdb/utils.h | 2 - 9 files changed, 179 insertions(+), 175 deletions(-) diff --git a/gdb/cli/cli-utils.c b/gdb/cli/cli-utils.c index f3586b6..5c6338b 100644 --- a/gdb/cli/cli-utils.c +++ b/gdb/cli/cli-utils.c @@ -225,42 +225,6 @@ number_is_in_list (const char *list, int number) /* See documentation in cli-utils.h. */ char * -skip_spaces (char *chp) -{ - if (chp == NULL) - return NULL; - while (*chp && isspace (*chp)) - chp++; - return chp; -} - -/* A const-correct version of the above. */ - -const char * -skip_spaces_const (const char *chp) -{ - if (chp == NULL) - return NULL; - while (*chp && isspace (*chp)) - chp++; - return chp; -} - -/* See documentation in cli-utils.h. */ - -const char * -skip_to_space_const (const char *chp) -{ - if (chp == NULL) - return NULL; - while (*chp && !isspace (*chp)) - chp++; - return chp; -} - -/* See documentation in cli-utils.h. */ - -char * remove_trailing_whitespace (const char *start, char *s) { while (s > start && isspace (*(s - 1))) diff --git a/gdb/cli/cli-utils.h b/gdb/cli/cli-utils.h index 5e191ec..ad46581 100644 --- a/gdb/cli/cli-utils.h +++ b/gdb/cli/cli-utils.h @@ -93,24 +93,6 @@ extern int get_number_or_range (struct get_number_or_range_state *state); extern int number_is_in_list (const char *list, int number); -/* Skip leading whitespace characters in INP, returning an updated - pointer. If INP is NULL, return NULL. */ - -extern char *skip_spaces (char *inp); - -/* A const-correct version of the above. */ - -extern const char *skip_spaces_const (const char *inp); - -/* Skip leading non-whitespace characters in INP, returning an updated - pointer. If INP is NULL, return NULL. */ - -#define skip_to_space(INP) ((char *) skip_to_space_const (INP)) - -/* A const-correct version of the above. */ - -extern const char *skip_to_space_const (const char *inp); - /* Reverse S to the last non-whitespace character without skipping past START. */ diff --git a/gdb/common/common-defs.h b/gdb/common/common-defs.h index 62d9de5..2be0d7d 100644 --- a/gdb/common/common-defs.h +++ b/gdb/common/common-defs.h @@ -41,10 +41,10 @@ #include "gdb/signals.h" #include "gdb_locale.h" #include "ptid.h" +#include "common-types.h" #include "common-utils.h" #include "gdb_assert.h" #include "errors.h" -#include "common-types.h" #include "print-utils.h" #include "common-debug.h" #include "cleanups.h" diff --git a/gdb/common/common-utils.c b/gdb/common/common-utils.c index 2925dd5..e86ed5b 100644 --- a/gdb/common/common-utils.c +++ b/gdb/common/common-utils.c @@ -18,6 +18,8 @@ along with this program. If not, see . */ #include "common-defs.h" +#include "host-defs.h" +#include /* The xmalloc() (libiberty.h) family of memory management routines. @@ -151,3 +153,138 @@ savestring (const char *ptr, size_t len) p[len] = 0; return p; } + +/* The bit offset of the highest byte in a ULONGEST, for overflow + checking. */ + +#define HIGH_BYTE_POSN ((sizeof (ULONGEST) - 1) * HOST_CHAR_BIT) + +/* True (non-zero) iff DIGIT is a valid digit in radix BASE, + where 2 <= BASE <= 36. */ + +static int +is_digit_in_base (unsigned char digit, int base) +{ + if (!isalnum (digit)) + return 0; + if (base <= 10) + return (isdigit (digit) && digit < base + '0'); + else + return (isdigit (digit) || tolower (digit) < base - 10 + 'a'); +} + +static int +digit_to_int (unsigned char c) +{ + if (isdigit (c)) + return c - '0'; + else + return tolower (c) - 'a' + 10; +} + +/* As for strtoul, but for ULONGEST results. */ + +ULONGEST +strtoulst (const char *num, const char **trailer, int base) +{ + unsigned int high_part; + ULONGEST result; + int minus = 0; + int i = 0; + + /* Skip leading whitespace. */ + while (isspace (num[i])) + i++; + + /* Handle prefixes. */ + if (num[i] == '+') + i++; + else if (num[i] == '-') + { + minus = 1; + i++; + } + + if (base == 0 || base == 16) + { + if (num[i] == '0' && (num[i + 1] == 'x' || num[i + 1] == 'X')) + { + i += 2; + if (base == 0) + base = 16; + } + } + + if (base == 0 && num[i] == '0') + base = 8; + + if (base == 0) + base = 10; + + if (base < 2 || base > 36) + { + errno = EINVAL; + return 0; + } + + result = high_part = 0; + for (; is_digit_in_base (num[i], base); i += 1) + { + result = result * base + digit_to_int (num[i]); + high_part = high_part * base + (unsigned int) (result >> HIGH_BYTE_POSN); + result &= ((ULONGEST) 1 << HIGH_BYTE_POSN) - 1; + if (high_part > 0xff) + { + errno = ERANGE; + result = ~ (ULONGEST) 0; + high_part = 0; + minus = 0; + break; + } + } + + if (trailer != NULL) + *trailer = &num[i]; + + result = result + ((ULONGEST) high_part << HIGH_BYTE_POSN); + if (minus) + return -result; + else + return result; +} + +/* See documentation in cli-utils.h. */ + +char * +skip_spaces (char *chp) +{ + if (chp == NULL) + return NULL; + while (*chp && isspace (*chp)) + chp++; + return chp; +} + +/* A const-correct version of the above. */ + +const char * +skip_spaces_const (const char *chp) +{ + if (chp == NULL) + return NULL; + while (*chp && isspace (*chp)) + chp++; + return chp; +} + +/* See documentation in cli-utils.h. */ + +const char * +skip_to_space_const (const char *chp) +{ + if (chp == NULL) + return NULL; + while (*chp && !isspace (*chp)) + chp++; + return chp; +} diff --git a/gdb/common/common-utils.h b/gdb/common/common-utils.h index cd2665a..eef5e6b 100644 --- a/gdb/common/common-utils.h +++ b/gdb/common/common-utils.h @@ -77,4 +77,24 @@ startswith (const char *string, const char *pattern) return strncmp (string, pattern, strlen (pattern)) == 0; } +ULONGEST strtoulst (const char *num, const char **trailer, int base); + +/* Skip leading whitespace characters in INP, returning an updated + pointer. If INP is NULL, return NULL. */ + +extern char *skip_spaces (char *inp); + +/* A const-correct version of the above. */ + +extern const char *skip_spaces_const (const char *inp); + +/* Skip leading non-whitespace characters in INP, returning an updated + pointer. If INP is NULL, return NULL. */ + +#define skip_to_space(INP) ((char *) skip_to_space_const (INP)) + +/* A const-correct version of the above. */ + +extern const char *skip_to_space_const (const char *inp); + #endif diff --git a/gdb/common/host-defs.h b/gdb/common/host-defs.h index 6c67034..7bc41a2 100644 --- a/gdb/common/host-defs.h +++ b/gdb/common/host-defs.h @@ -19,6 +19,27 @@ #ifndef HOST_DEFS_H #define HOST_DEFS_H +#include + +/* Static host-system-dependent parameters for GDB. */ + +/* * Number of bits in a char or unsigned char for the target machine. + Just like CHAR_BIT in but describes the target machine. */ +#if !defined (TARGET_CHAR_BIT) +#define TARGET_CHAR_BIT 8 +#endif + +/* * If we picked up a copy of CHAR_BIT from a configuration file + (which may get it by including ) then use it to set + the number of bits in a host char. If not, use the same size + as the target. */ + +#if defined (CHAR_BIT) +#define HOST_CHAR_BIT CHAR_BIT +#else +#define HOST_CHAR_BIT TARGET_CHAR_BIT +#endif + #ifdef __MSDOS__ # define CANT_FORK # define GLOBAL_CURDIR diff --git a/gdb/defs.h b/gdb/defs.h index 44702ea..32b08bb 100644 --- a/gdb/defs.h +++ b/gdb/defs.h @@ -591,25 +591,6 @@ extern double atof (const char *); /* X3.159-1989 4.10.1.1 */ enum { MAX_REGISTER_SIZE = 64 }; -/* Static target-system-dependent parameters for GDB. */ - -/* * Number of bits in a char or unsigned char for the target machine. - Just like CHAR_BIT in but describes the target machine. */ -#if !defined (TARGET_CHAR_BIT) -#define TARGET_CHAR_BIT 8 -#endif - -/* * If we picked up a copy of CHAR_BIT from a configuration file - (which may get it by including ) then use it to set - the number of bits in a host char. If not, use the same size - as the target. */ - -#if defined (CHAR_BIT) -#define HOST_CHAR_BIT CHAR_BIT -#else -#define HOST_CHAR_BIT TARGET_CHAR_BIT -#endif - /* In findvar.c. */ extern LONGEST extract_signed_integer (const gdb_byte *, int, diff --git a/gdb/utils.c b/gdb/utils.c index aaaf9c5..67ab1c5 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -3004,105 +3004,6 @@ dummy_obstack_deallocate (void *object, void *data) return; } -/* The bit offset of the highest byte in a ULONGEST, for overflow - checking. */ - -#define HIGH_BYTE_POSN ((sizeof (ULONGEST) - 1) * HOST_CHAR_BIT) - -/* True (non-zero) iff DIGIT is a valid digit in radix BASE, - where 2 <= BASE <= 36. */ - -static int -is_digit_in_base (unsigned char digit, int base) -{ - if (!isalnum (digit)) - return 0; - if (base <= 10) - return (isdigit (digit) && digit < base + '0'); - else - return (isdigit (digit) || tolower (digit) < base - 10 + 'a'); -} - -static int -digit_to_int (unsigned char c) -{ - if (isdigit (c)) - return c - '0'; - else - return tolower (c) - 'a' + 10; -} - -/* As for strtoul, but for ULONGEST results. */ - -ULONGEST -strtoulst (const char *num, const char **trailer, int base) -{ - unsigned int high_part; - ULONGEST result; - int minus = 0; - int i = 0; - - /* Skip leading whitespace. */ - while (isspace (num[i])) - i++; - - /* Handle prefixes. */ - if (num[i] == '+') - i++; - else if (num[i] == '-') - { - minus = 1; - i++; - } - - if (base == 0 || base == 16) - { - if (num[i] == '0' && (num[i + 1] == 'x' || num[i + 1] == 'X')) - { - i += 2; - if (base == 0) - base = 16; - } - } - - if (base == 0 && num[i] == '0') - base = 8; - - if (base == 0) - base = 10; - - if (base < 2 || base > 36) - { - errno = EINVAL; - return 0; - } - - result = high_part = 0; - for (; is_digit_in_base (num[i], base); i += 1) - { - result = result * base + digit_to_int (num[i]); - high_part = high_part * base + (unsigned int) (result >> HIGH_BYTE_POSN); - result &= ((ULONGEST) 1 << HIGH_BYTE_POSN) - 1; - if (high_part > 0xff) - { - errno = ERANGE; - result = ~ (ULONGEST) 0; - high_part = 0; - minus = 0; - break; - } - } - - if (trailer != NULL) - *trailer = &num[i]; - - result = result + ((ULONGEST) high_part << HIGH_BYTE_POSN); - if (minus) - return -result; - else - return result; -} - /* Simple, portable version of dirname that does not modify its argument. */ diff --git a/gdb/utils.h b/gdb/utils.h index cae1ac0..4965553 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -37,8 +37,6 @@ extern int streq (const char *, const char *); extern int subset_compare (char *, char *); -ULONGEST strtoulst (const char *num, const char **trailer, int base); - int compare_positive_ints (const void *ap, const void *bp); int compare_strings (const void *ap, const void *bp);