/* General utility routines for GDB, the GNU debugger.
- Copyright (C) 1986-2014 Free Software Foundation, Inc.
+ Copyright (C) 1986-2015 Free Software Foundation, Inc.
This file is part of GDB.
{
fprintf_filtered (stream, "%s", host_address_to_string (addr));
}
+
+/* See utils.h. */
+
+char *
+make_hex_string (const gdb_byte *data, size_t length)
+{
+ char *result = xmalloc (length * 2 + 1);
+ char *p;
+ size_t i;
+
+ p = result;
+ for (i = 0; i < length; ++i)
+ p += xsnprintf (p, 3, "%02x", data[i]);
+ *p = '\0';
+ return result;
+}
+
\f
/* A cleanup function that calls regfree. */
static int ATTRIBUTE_PRINTF (1, 0)
defaulted_query (const char *ctlstr, const char defchar, va_list args)
{
- int answer;
int ans2;
int retval;
int def_value;
char def_answer, not_def_answer;
- char *y_string, *n_string, *question;
+ char *y_string, *n_string, *question, *prompt;
/* Used to add duration we waited for user to respond to
prompt_for_continue_wait_time. */
struct timeval prompt_started, prompt_ended, prompt_delta;
/* Format the question outside of the loop, to avoid reusing args. */
question = xstrvprintf (ctlstr, args);
+ prompt = xstrprintf (_("%s%s(%s or %s) %s"),
+ annotation_level > 1 ? "\n\032\032pre-query\n" : "",
+ question, y_string, n_string,
+ annotation_level > 1 ? "\n\032\032query\n" : "");
+ xfree (question);
/* Used for calculating time spend waiting for user. */
gettimeofday (&prompt_started, NULL);
while (1)
{
- wrap_here (""); /* Flush any buffered output. */
- gdb_flush (gdb_stdout);
-
- if (annotation_level > 1)
- printf_filtered (("\n\032\032pre-query\n"));
+ char *response, answer;
- fputs_filtered (question, gdb_stdout);
- printf_filtered (_("(%s or %s) "), y_string, n_string);
-
- if (annotation_level > 1)
- printf_filtered (("\n\032\032query\n"));
-
- wrap_here ("");
gdb_flush (gdb_stdout);
+ response = gdb_readline_wrapper (prompt);
- answer = fgetc (stdin);
-
- /* We expect fgetc to block until a character is read. But
- this may not be the case if the terminal was opened with
- the NONBLOCK flag. In that case, if there is nothing to
- read on stdin, fgetc returns EOF, but also sets the error
- condition flag on stdin and errno to EAGAIN. With a true
- EOF, stdin's error condition flag is not set.
-
- A situation where this behavior was observed is a pseudo
- terminal on AIX. */
- while (answer == EOF && ferror (stdin) && errno == EAGAIN)
- {
- /* Not a real EOF. Wait a little while and try again until
- we read something. */
- clearerr (stdin);
- gdb_usleep (10000);
- answer = fgetc (stdin);
- }
-
- clearerr (stdin); /* in case of C-d */
- if (answer == EOF) /* C-d */
+ if (response == NULL) /* C-d */
{
printf_filtered ("EOF [assumed %c]\n", def_answer);
retval = def_value;
break;
}
- /* Eat rest of input line, to EOF or newline. */
- if (answer != '\n')
- do
- {
- ans2 = fgetc (stdin);
- clearerr (stdin);
- }
- while (ans2 != EOF && ans2 != '\n' && ans2 != '\r');
+
+ answer = response[0];
+ xfree (response);
if (answer >= 'a')
answer -= 040;
specify the required input or have it default by entering
nothing. */
if (answer == def_answer
- || (defchar != '\0' &&
- (answer == '\n' || answer == '\r' || answer == EOF)))
+ || (defchar != '\0' && answer == '\0'))
{
retval = def_value;
break;
timeval_add (&prompt_for_continue_wait_time,
&prompt_for_continue_wait_time, &prompt_delta);
- xfree (question);
+ xfree (prompt);
if (annotation_level > 1)
printf_filtered (("\n\032\032post-query\n"));
return retval;
char *
gdb_realpath (const char *filename)
{
- /* The MS Windows method. If we don't have realpath, we assume we
- don't have symlinks and just canonicalize to a Windows absolute
- path. GetFullPath converts ../ and ./ in relative paths to
- absolute paths, filling in current drive if one is not given
- or using the current directory of a specified drive (eg, "E:foo").
- It also converts all forward slashes to back slashes. */
- /* The file system is case-insensitive but case-preserving.
- So we do not lowercase the path. Otherwise, we might not
- be able to display the original casing in a given path. */
+/* On most hosts, we rely on canonicalize_file_name to compute
+ the FILENAME's realpath.
+
+ But the situation is slightly more complex on Windows, due to some
+ versions of GCC which were reported to generate paths where
+ backlashes (the directory separator) were doubled. For instance:
+ c:\\some\\double\\slashes\\dir
+ ... instead of ...
+ c:\some\double\slashes\dir
+ Those double-slashes were getting in the way when comparing paths,
+ for instance when trying to insert a breakpoint as follow:
+ (gdb) b c:/some/double/slashes/dir/foo.c:4
+ No source file named c:/some/double/slashes/dir/foo.c:4.
+ (gdb) b c:\some\double\slashes\dir\foo.c:4
+ No source file named c:\some\double\slashes\dir\foo.c:4.
+ To prevent this from happening, we need this function to always
+ strip those extra backslashes. While canonicalize_file_name does
+ perform this simplification, it only works when the path is valid.
+ Since the simplification would be useful even if the path is not
+ valid (one can always set a breakpoint on a file, even if the file
+ does not exist locally), we rely instead on GetFullPathName to
+ perform the canonicalization. */
+
#if defined (_WIN32)
{
char buf[MAX_PATH];
DWORD len = GetFullPathName (filename, MAX_PATH, buf, NULL);
+ /* The file system is case-insensitive but case-preserving.
+ So it is important we do not lowercase the path. Otherwise,
+ we might not be able to display the original casing in a given
+ path. */
if (len > 0 && len < MAX_PATH)
return xstrdup (buf);
}
return (v & -n);
}
-/* See utils.h. */
-
-LONGEST
-gdb_sign_extend (LONGEST value, int bit)
-{
- gdb_assert (bit >= 1 && bit <= 8 * sizeof (LONGEST));
-
- if (((value >> (bit - 1)) & 1) != 0)
- {
- LONGEST signbit = ((LONGEST) 1) << (bit - 1);
-
- value = (value ^ signbit) - signbit;
- }
-
- return value;
-}
-
/* Allocation function for the libiberty hash table which uses an
obstack. The obstack is passed as DATA. */