Fix #3476 - wf support offset and size parameters

This commit is contained in:
pancake 2015-10-26 03:29:57 +01:00
parent 1641acb11f
commit b312439484
2 changed files with 47 additions and 17 deletions

View File

@ -201,6 +201,50 @@ static void cmd_write_value (RCore *core, const char *input) {
r_core_block_read (core, 0);
}
static bool cmd_wf(RCore *core, const char *input) {
ut8 *buf;
int size;
const char *arg = input + ((input[1] == ' ')? 2: 1);
int wseek = r_config_get_i (core->config, "cfg.wseek");
char *p, *a = r_str_chop (strdup (arg));
// XXX: file names cannot contain spaces
p = strchr (a, ' ');
if (p) {
*p++ = 0;
}
if (*arg=='?' || !*arg) {
eprintf ("Usage: wf [file] ([size] ([offset]))\n");
} else
if (!strcmp (arg, "-")) {
char *out = r_core_editor (core, NULL, NULL);
if (out) {
r_io_write_at (core->io, core->offset,
(ut8*)out, strlen (out));
free (out);
}
} else
if ((buf = (ut8*) r_file_slurp (a, &size))) {
int u_size = size;
int u_offset = 0;
u_size = r_num_math (core->num, p);
if (u_size<1) u_size = size;
if (p) {
*p++ = 0;
u_offset = r_num_math (core->num, p);
if (u_offset > size) {
eprintf ("Invalid offset\n");
return false;
}
}
r_io_use_desc (core->io, core->file->desc);
r_io_write_at (core->io, core->offset, buf + u_offset, u_size);
WSEEK (core, size);
free (buf);
r_core_block_read (core, 0);
} else eprintf ("Cannot open file '%s'\n", arg);
return true;
}
/* TODO: simplify using r_write */
static int cmd_write(void *data, const char *input) {
int wseek, i, size, len = strlen (input);
@ -752,22 +796,7 @@ static int cmd_write(void *data, const char *input) {
}
break;
case 'f':
arg = (const char *)(input+((input[1]==' ')?2:1));
if (!strcmp (arg, "-")) {
char *out = r_core_editor (core, NULL, NULL);
if (out) {
r_io_write_at (core->io, core->offset,
(ut8*)out, strlen (out));
free (out);
}
} else
if ((buf = (ut8*) r_file_slurp (arg, &size))) {
r_io_use_desc (core->io, core->file->desc);
r_io_write_at (core->io, core->offset, buf, size);
WSEEK (core, size);
free (buf);
r_core_block_read (core, 0);
} else eprintf ("Cannot open file '%s'\n", arg);
cmd_wf (core, input);
break;
case 'F': // wF
arg = (const char *)(input+((input[1]==' ')?2:1));

View File

@ -476,6 +476,7 @@ R_API char *r_str_newf(const char *fmt, ...) {
return (char*)fmt;
}
// TODO: rename to r_str_trim_inplace() or something like that
R_API char *r_str_chop(char *str) {
int len;
char *ptr;
@ -548,7 +549,7 @@ R_API char *r_str_trim(char *str) {
char *ptr;
if (str == NULL)
return NULL;
for (ptr=str, i=0;str[i]; i++)
for (ptr = str, i=0; str[i]; i++)
if (!iswhitechar (str[i]))
*ptr++ = str[i];
*ptr = '\0';