aboutsummaryrefslogtreecommitdiff
path: root/drive-sdk/src/anki_util.c
blob: 24cb1dd3d5d86f408be3fa0cbc8d3110e93ba3e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/*
 * Copyright (c) 2014 Anki, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include <assert.h>

void bytes_to_hex(const void *value, size_t len, char **output) {
    const unsigned char *bytes = (const unsigned char *)value;
    size_t bufferLen = len * 3 * sizeof(char);
    char str[bufferLen];
    memset(str, 0, bufferLen);
  
    const char *hex = "0123456789ABCDEF";
    char *s = str;
  
    for (size_t i = 0; i < len-1; ++i ) {
        *s++ = hex[(*bytes>>4)&0xF];
        *s++ = hex[(*bytes++)&0xF];
        *s++ = ' ';
    }
    *s++ = hex[(*bytes>>4)&0xF];
    *s++ = hex[(*bytes++)&0xF];
    *s++ = 0;

    if (output != NULL)
        memmove(*output, str, bufferLen); 
}

void hexdump(const char *prefix, const size_t column_len, const void *value, size_t len) {
    assert(prefix != NULL);
    assert(column_len > 0);
    int row_count = (len / column_len) + 1;
    int i;

    size_t slen = column_len*3;
    char* s = malloc(slen * sizeof(char));
    for (i = 0; i < row_count; ++i) {
        memset(s, 0, slen);
        bytes_to_hex(value, len, (char **)&s);
        printf("%s %s\n", prefix, s);
    }
    free(s);
}