return;
}
- desc = iconv_open (to, from);
- if (desc == (iconv_t) -1)
- perror_with_name (_("Converting character sets"));
- cleanups = make_cleanup (cleanup_iconv, &desc);
+ if (!strcmp (from, "wchar_t"))
+ {
+ if (strcmp (to, host_charset ()))
- perror_with_name ("Converting character sets");
++ perror_with_name (_("Converting character sets"));
+ cleanups = NULL; /* silence gcc complaints */
+ use_wctomb = 1;
+ }
+ else
+ {
+ desc = iconv_open (to, from);
+ if (desc == (iconv_t) -1)
- perror_with_name ("Converting character sets");
++ perror_with_name (_("Converting character sets"));
+ cleanups = make_cleanup (cleanup_iconv, &desc);
+ }
inleft = num_bytes;
inp = (char *) bytes;
struct wchar_iterator *result;
iconv_t desc;
- desc = iconv_open (INTERMEDIATE_ENCODING, charset);
+ desc = iconv_open (host_charset (), charset);
if (desc == (iconv_t) -1)
- perror_with_name ("Converting character sets");
+ perror_with_name (_("Converting character sets"));
result = XNEW (struct wchar_iterator);
result->desc = desc;
necessarily update its outgoing arguments when it encounters an
invalid input sequence -- but we want to reliably report this to
our caller so it can emit an escape sequence. */
- out_request = 1;
- while (iter->bytes > 0)
+ while (iter->inter_len == 0 && iter->bytes > 0)
{
- char *outptr = (char *) &iter->out[0];
- char *orig_inptr = iter->input;
- size_t orig_in = iter->bytes;
- size_t out_avail = out_request * sizeof (gdb_wchar_t);
- size_t num;
- size_t r = iconv (iter->desc,
- (ICONV_CONST char **) &iter->input,
- &iter->bytes, &outptr, &out_avail);
-
- if (r == (size_t) -1)
+ out_request = 1;
+ while (iter->bytes > 0)
{
- switch (errno)
- {
- case EILSEQ:
- /* Invalid input sequence. We still might have
- converted a character; if so, return it. */
- if (out_avail < out_request * sizeof (gdb_wchar_t))
- break;
-
- /* Otherwise skip the first invalid character, and let
- the caller know about it. */
- *out_result = wchar_iterate_invalid;
- *ptr = iter->input;
- *len = iter->width;
- iter->input += iter->width;
- iter->bytes -= iter->width;
- return 0;
+ char *outptr = (char *) &iter->inter[iter->inter_len];
+ size_t out_avail = out_request;
- case E2BIG:
- /* We ran out of space. We still might have converted a
- character; if so, return it. Otherwise, grow the
- buffer and try again. */
- if (out_avail < out_request * sizeof (gdb_wchar_t))
- break;
-
- ++out_request;
- if (out_request > iter->out_size)
+ size_t r = iconv (iter->desc,
+ (ICONV_CONST char **) &iter->input, &iter->bytes,
+ &outptr, &out_avail);
+ if (r == (size_t) -1)
+ {
+ switch (errno)
{
- iter->out_size = out_request;
- iter->out = xrealloc (iter->out,
- out_request * sizeof (gdb_wchar_t));
+ case EILSEQ:
+ /* Invalid input sequence. Skip it, and let the caller
+ know about it. */
+ *out_result = wchar_iterate_invalid;
+ *ptr = iter->input;
+ *len = iter->width;
+ iter->input += iter->width;
+ iter->bytes -= iter->width;
+ return 0;
+
+ case E2BIG:
+ /* We ran out of space. We still might have converted a
+ character; if so, return it. Otherwise, grow the
+ buffer and try again. */
+ if (out_avail < out_request)
+ break;
+
+ ++out_request;
+ if (out_request > iter->inter_size)
+ {
+ iter->inter_size = out_request;
+ iter->inter = xrealloc (iter->inter, out_request);
+ }
+ continue;
+
+ case EINVAL:
+ /* Incomplete input sequence. Let the caller know, and
+ arrange for future calls to see EOF. */
+ *out_result = wchar_iterate_incomplete;
+ *ptr = iter->input;
+ *len = iter->bytes;
+ iter->bytes = 0;
+ return 0;
+
+ default:
- perror_with_name ("Internal error while converting character sets");
++ perror_with_name (_("Internal error while "
++ "converting character sets"));
}
- continue;
-
- case EINVAL:
- /* Incomplete input sequence. Let the caller know, and
- arrange for future calls to see EOF. */
- *out_result = wchar_iterate_incomplete;
- *ptr = iter->input;
- *len = iter->bytes;
- iter->bytes = 0;
- return 0;
-
- default:
- perror_with_name (_("Internal error while "
- "converting character sets"));
}
+
+ /* We converted something. */
+ iter->inter_len += out_request - out_avail;
+ break;
}
+ }
+
+ if (iter->inter_len > 0)
+ {
+ int r;
+
+ /* Now convert from our charset to wchar_t */
+ r = mbtowc(&iter->out, &iter->inter[0], iter->inter_len);
+
+ /* This must never happen: we just converted to a valid charset! */
+ if (r < 0)
- perror_with_name ("Internal error while converting character sets");
++ perror_with_name (_("Internal error while "
++ "converting character sets"));
+
+ /* NUL bytes are alright */
+ if (r == 0)
+ r = 1;
+
+ iter->inter_len -= r;
+ memmove(&iter->inter[0], &iter->inter[r], iter->inter_len);
- /* We converted something. */
- num = out_request - out_avail / sizeof (gdb_wchar_t);
*out_result = wchar_iterate_ok;
- *out_chars = iter->out;
+ *out_chars = &iter->out;
*ptr = orig_inptr;
*len = orig_in - iter->bytes;
- return num;
+ return 1;
}
/* Really done. */
can only allocate an inferior when all those modules have done
that. Do this after initialize_progspace, due to the
current_program_space reference. */
- current_inferior_ = add_inferior (0);
- current_inferior_->pspace = current_program_space;
- current_inferior_->aspace = current_program_space->aspace;
+
+ /* However, when invoked by DragonFly kgdb which always has many inferiors,
+ the default inferior will not be defined. The swapper process always has
+ pid 0, which conflicts with the default. */
+
+ if (!kernel_debugger) {
+ current_inferior_ = add_inferior (0);
+ current_inferior_->pspace = current_program_space;
+ current_inferior_->aspace = current_program_space->aspace;
+ }
- add_info ("inferiors", info_inferiors_command,
- _("IDs of currently known inferiors."));
+ add_info ("inferiors", info_inferiors_command,
+ _("IDs of specified inferiors (all inferiors if no argument)."));
add_com ("add-inferior", no_class, add_inferior_command, _("\
Add a new inferior.\n\