Move utility functions to common/
gdb/ChangeLog 2015-06-15 Aleksandar Ristovski <aristovski@qnx.com Jan Kratochvil <jan.kratochvil@redhat.com> 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.
This commit is contained in:
parent
d1168cc1a9
commit
03aef70fec
10 changed files with 206 additions and 175 deletions
|
@ -1,3 +1,30 @@
|
|||
2015-06-15 Aleksandar Ristovski <aristovski@qnx.com
|
||||
Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
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.
|
||||
|
||||
2015-06-15 Yao Qi <yao.qi@linaro.org>
|
||||
|
||||
* data-directory/Makefile.in (SYSCALLS_FILES): Add aarch64-linux.xml.
|
||||
|
|
|
@ -224,42 +224,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)
|
||||
{
|
||||
|
|
|
@ -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. */
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "common-defs.h"
|
||||
#include "host-defs.h"
|
||||
#include <ctype.h>
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -19,6 +19,27 @@
|
|||
#ifndef HOST_DEFS_H
|
||||
#define HOST_DEFS_H
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
/* 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 <limits.h> 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 <limits.h>) 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
|
||||
|
|
19
gdb/defs.h
19
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 <limits.h> 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 <limits.h>) 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,
|
||||
|
|
99
gdb/utils.c
99
gdb/utils.c
|
@ -2987,105 +2987,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. */
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue