This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[commit] Separate X packet escape code into its own function
- From: Daniel Jacobowitz <drow at false dot org>
- To: gdb-patches at sourceware dot org
- Date: Thu, 22 Jun 2006 10:38:23 -0400
- Subject: [commit] Separate X packet escape code into its own function
This change was included in my qXfer patch yesterday, but it's
independent. Through a remarkable series of coincidences we have three
different people here on three different projects that needed to touch
this code, so I'm committing this obvious refactoring patch to reduce
our merge conflicts (and make the other patch smaller, too).
Tested on x86_64-pc-linux-gnu, with a shiny new implementation of 'X'
for gdbserver.
--
Daniel Jacobowitz
CodeSourcery
2006-06-22 Daniel Jacobowitz <dan@codesourcery.com>
* remote.c (remote_escape_output): New function.
(remote_write_bytes): Use remote_escape_output.
Index: src/gdb/remote.c
===================================================================
--- src.orig/gdb/remote.c 2006-06-22 09:55:00.000000000 -0400
+++ src/gdb/remote.c 2006-06-22 09:55:16.000000000 -0400
@@ -3689,6 +3689,45 @@ remote_address_masked (CORE_ADDR addr)
return addr;
}
+/* Convert BUFFER, binary data at least LEN bytes long, into escaped
+ binary data in OUT_BUF. Set *OUT_LEN to the length of the data
+ encoded in OUT_BUF, and return the number of bytes in OUT_BUF
+ (which may be more than *OUT_LEN due to escape characters). The
+ total number of bytes in the output buffer will be at most
+ OUT_MAXLEN. */
+
+static int
+remote_escape_output (const gdb_byte *buffer, int len,
+ gdb_byte *out_buf, int *out_len,
+ int out_maxlen)
+{
+ int input_index, output_index;
+
+ output_index = 0;
+ for (input_index = 0; input_index < len; input_index++)
+ {
+ gdb_byte b = buffer[input_index];
+
+ if (b == '$' || b == '#' || b == '}')
+ {
+ /* These must be escaped. */
+ if (output_index + 2 > out_maxlen)
+ break;
+ out_buf[output_index++] = '}';
+ out_buf[output_index++] = b ^ 0x20;
+ }
+ else
+ {
+ if (output_index + 1 > out_maxlen)
+ break;
+ out_buf[output_index++] = b;
+ }
+ }
+
+ *out_len = input_index;
+ return output_index;
+}
+
/* Determine whether the remote target supports binary downloading.
This is accomplished by sending a no-op memory write of zero length
to the target at the specified address. It does not suffice to send
@@ -3839,24 +3878,7 @@ remote_write_bytes (CORE_ADDR memaddr, g
/* Binary mode. Send target system values byte by byte, in
increasing byte addresses. Only escape certain critical
characters. */
- for (nr_bytes = 0;
- (nr_bytes < todo) && (p - payload_start) < payload_size;
- nr_bytes++)
- {
- switch (myaddr[nr_bytes] & 0xff)
- {
- case '$':
- case '#':
- case 0x7d:
- /* These must be escaped. */
- *p++ = 0x7d;
- *p++ = (myaddr[nr_bytes] & 0xff) ^ 0x20;
- break;
- default:
- *p++ = myaddr[nr_bytes] & 0xff;
- break;
- }
- }
+ p += remote_escape_output (myaddr, todo, p, &nr_bytes, payload_size);
if (nr_bytes < todo)
{
/* Escape chars have filled up the buffer prematurely,