[erlang-questions] Help! a log dump function from C.

Hynek Vychodil vychodil.hynek@REDACTED
Wed Apr 22 11:11:47 CEST 2009


On Wed, Apr 22, 2009 at 9:27 AM, Hynek Vychodil <vychodil.hynek@REDACTED>wrote:

> There are many many approaches to do this,  one that doesn't use io or
> io_lib follows:
>
> -module(dump_hex).
>
> -compile(inline).
>
> -export([dump_hex/1]).
>
> dump_hex(L) -> lists:reverse(dump_hex(0, L, [])).
>
> dump_hex(_, [pad | _], R) -> R;
> dump_hex(_, [], R) -> R;
> dump_hex(N,
>      [B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13,
>       B14, B15, B16
>       | T],
>      R) ->
>     dump_hex(N + 16, T,
>          [[addr(N), $:,
>            [[$\s | hex(X)]
>         || X
>                <- [B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12,
>                B13, B14, B15, B16]],
>            " - ",
>            [print(X)
>         || X
>                <- [B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12,
>                B13, B14, B15, B16]],
>            $\n]
>           | R]);
> dump_hex(N, L, R) ->
>     dump_hex(N,
>          L ++
>            [pad, pad, pad, pad, pad, pad, pad, pad, pad, pad, pad,
>         pad, pad, pad, pad, pad],
>          R).
>
> addr(X) ->
>     [nibble(X bsr 28), nibble(X bsr 24), nibble(X bsr 20),
>      nibble(X bsr 16), nibble(X bsr 12), nibble(X bsr 8),
>      nibble(X bsr 4), nibble(X)].
>
> hex(pad) -> "  ";
> hex(X) -> [nibble(X bsr 4), nibble(X)].
>
> nibble(X) -> nibble_(X band 15).
>
> nibble_(X) when X < 10 -> X + $0;
> nibble_(X) -> X + $a.
>
> print(pad) -> [];
> print(X) when X < $\s, X > 126 -> $.;


and another bug, it should be
 print(X) when X < $\s; X > 126 -> $.;

>
> print(X) -> X.
>
> Usage:
>
> 1> c(dump_hex).
> {ok,dump_hex}
> 2> io:put_chars(dump_hex:dump_hex("teststr1234567890abcd")).
> 00000000: 74 65 73 74 73 74 72 31 32 33 34 35 36 37 38 39 -
> teststr123456789
> 00000010: 30 61 62 63 64                                  - 0abcd
> ok
>
>
>
> On Wed, Apr 22, 2009 at 2:03 AM, feiman <lfeiman888@REDACTED> wrote:
>
>> hi,All
>>   I have a function from C,which print out detail hex information
>> about a buffer,who can help me "translate" it into Erlang?
>>
>> when I run
>>        const char *teststr = "teststr1234567890abcd";
>>
>>        dump_hex((const unsigned char *)teststr,strlen(teststr));
>>
>> it print out
>>
>> 00000000: 74 65 73 74 73 74 72 31 32 33 34 35 36 37 38 39 -
>> teststr123456789
>> 00000010: 30 61 62 63 64                                  - 0abcd
>>
>> thanks all in advance
>>
>> void dump_hex( const unsigned char *buf, int len)
>> {
>>        int i;
>>        int nlocal;
>>        const unsigned char *pc;
>>        char *out;
>>        const unsigned char *start;
>>        char c;
>>        char line[100];
>>
>>        start = buf;
>>
>>        while (len > 0)
>>        {
>>                sprintf(line, "%08x: ", buf - start);
>>                out = line + 10;
>>
>>                for (i = 0, pc = buf, nlocal = len; i < 16; i++, pc++)
>>                {
>>                        if (nlocal > 0)
>>                        {
>>                                c = *pc;
>>
>>                                *out++ = NIBBLE((c >> 4) & 0xF);
>>                                *out++ = NIBBLE(c & 0xF);
>>
>>                                nlocal--;
>>                        }
>>                        else
>>                        {
>>                                *out++ = ' ';
>>                                *out++ = ' ';
>>                        }                       /* end else */
>>
>>                        *out++ = ' ';
>>                }                       /* end for */
>>
>>                *out++ = '-';
>>                *out++ = ' ';
>>
>>                for (i = 0, pc = buf, nlocal = len;
>>                        (i < 16) && (nlocal > 0);
>>                        i++, pc++, nlocal--)
>>                {
>>                        c = *pc;
>>
>>                        if ((c < ' ') || (c >= 126))
>>                        {
>>                                c = '.';
>>                        }
>>
>>                        *out++ = c;
>>                }                       /* end for */
>>
>>                *out++ = 0;
>>
>>                llog(L_NOTICE,"%s", line);
>>
>>                buf += 16;
>>                len -= 16;
>>        }                               /* end while */
>> }                               /* end dump */
>>
>> _______________________________________________
>> erlang-questions mailing list
>> erlang-questions@REDACTED
>> http://www.erlang.org/mailman/listinfo/erlang-questions
>>
>
>
>
> --
> --Hynek (Pichi) Vychodil
>
> Analyze your data in minutes. Share your insights instantly. Thrill your
> boss.  Be a data hero!
> Try Good Data now for free: www.gooddata.com
>



-- 
--Hynek (Pichi) Vychodil

Analyze your data in minutes. Share your insights instantly. Thrill your
boss.  Be a data hero!
Try Good Data now for free: www.gooddata.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20090422/e130f8c9/attachment.htm>


More information about the erlang-questions mailing list