Messages in this thread | | | Date | Mon, 1 Sep 2014 10:58:52 +0200 | Subject | Re: [PATCH v3 1/5] seq_file: provide an analogue of print_hex_dump() | From | Geert Uytterhoeven <> |
| |
Hi Andy,
On Mon, Sep 1, 2014 at 10:36 AM, Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote: >> ... and extra copying for no good reason. Why not check that we have >> enough space in buffer and generate directly into it? See what e.g. >> seq_escape() is doing... > > What about this variant?
I think it needs a call to seq_set_overflow() in case the buffer is too small, so the caller will retry with a bigger buffer.
> > @@ -794,6 +795,47 @@ void seq_pad(struct seq_file *m, char c) > } > EXPORT_SYMBOL(seq_pad); > > +/* Analogue of print_hex_dump() */ > +void seq_hex_dump(struct seq_file *m, const char *prefix_str, int prefix_type, > + int rowsize, int groupsize, const void *buf, size_t len, > + bool ascii) > +{ > + const u8 *ptr = buf; > + int i, linelen, remaining = len; > + int ret; > + > + if (rowsize != 16 && rowsize != 32) > + rowsize = 16; > + > + for (i = 0; i < len; i += rowsize) { > + linelen = min(remaining, rowsize); > + remaining -= rowsize; > + > + ret = seq_printf(m, "%s", prefix_str); > + if (ret < 0) > + break; > + > + if (prefix_type == DUMP_PREFIX_ADDRESS) > + ret = seq_printf(m, "%p: ", ptr + i); > + else if (prefix_type == DUMP_PREFIX_OFFSET) > + ret = seq_printf(m, "%.8x: ", i); > + if (ret < 0) > + break; > + > + if (m->size < m->count + groupsize * 2 + 1) > + break; > + > + hex_dump_to_buffer(ptr + i, linelen, rowsize, groupsize, > + m->buf + m->count, m->size - m->count, > + ascii); > + > + ret = seq_putc(m, '\n'); > + if (ret < 0) > + break; > + } > +} > +EXPORT_SYMBOL(seq_hex_dump);
Gr{oetje,eeting}s,
Geert
-- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
| |