Re: [PATCH] kernel: add helpers for ascii character conversion

From: Andrew Morton
Date: Thu May 01 2008 - 15:43:45 EST


On Thu, 01 May 2008 12:23:00 -0700
Harvey Harrison <harvey.harrison@xxxxxxxxx> wrote:

> Add helpers for getting an ascii hex char for the high and low
> nibble of a byte. Also add a small helper to get an integer
> value from a given hex char.
>
> Included here are a few of the current places that roll their
> own versions being moved to the common helper.

ahh, someone cares ;)

Does this mean that

y:/usr/src/linux-2.6.25> grep -ri '"0123456789abcdef"' . | wc -l
40

will decrease?

> --- a/include/linux/kernel.h
> +++ b/include/linux/kernel.h
> @@ -277,6 +277,21 @@ extern void print_hex_dump(const char *level, const char *prefix_str,
> extern void print_hex_dump_bytes(const char *prefix_str, int prefix_type,
> const void *buf, size_t len);
> #define hex_asc(x) "0123456789abcdef"[x]
> +#define hex_asc_lo(x) hex_asc(((x) & 0x0f))
> +#define hex_asc_hi(x) hex_asc(((x) & 0xf0) >> 4)

umm, this might mean that each .c file which uses hex_asc_lo/hi gets
its own copy of "0123456789abcdef". I believe that gcc/ld are getting
better at handling this, but I haven't checked, and I don't know which
versions get it right nor in which way. etc.

So it might be better to give the kernel the One True Digitstring in
lib/something.c and export that to modules.

> +static inline u8 hex_to_int(char ch)
> +{
> + /*
> + * Make ch lower-case, works only for digits and letters
> + */
> + ch |= 0x20;
> + if ((ch >= 'a') && (ch <= 'f'))
> + return (ch - 'a' + 10);
> + if ((ch >= '0') && (ch <= '9'))
> + return (ch - '0');
> + return (-1);
> +}

probably should be uninlined.

return-is-not-a-function ;)

> #define pr_emerg(fmt, arg...) \
> printk(KERN_EMERG fmt, ##arg)
> diff --git a/lib/hexdump.c b/lib/hexdump.c
> index 3435465..32b0bd7 100644
> --- a/lib/hexdump.c
> +++ b/lib/hexdump.c
> @@ -93,8 +93,8 @@ void hex_dump_to_buffer(const void *buf, size_t len, int rowsize,
> for (j = 0; (j < rowsize) && (j < len) && (lx + 4) < linebuflen;
> j++) {
> ch = ptr[j];
> - linebuf[lx++] = hex_asc(ch >> 4);
> - linebuf[lx++] = hex_asc(ch & 0x0f);
> + linebuf[lx++] = hex_asc_hi(ch);
> + linebuf[lx++] = hex_asc_lo(ch);
> linebuf[lx++] = ' ';
> }
> ascii_column = 3 * rowsize + 2;

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/