simple cbor print

This commit is contained in:
merlokk 2018-11-16 19:47:41 +02:00
commit 87f3e1facf

View file

@ -11,20 +11,199 @@
// //
#include "cbortools.h" #include "cbortools.h"
#include <stdlib.h>
#include "cbor.h" #include "cbor.h"
#include "util.h"
static void indent(int nestingLevel) {
while (nestingLevel--)
printf(" ");
}
int TinyCborParser(uint8_t *data, size_t length, CborValue *cb) { static CborError dumpelm(CborValue *it, bool *got_next, int nestingLevel) {
CborError err;
*got_next = false;
CborType type = cbor_value_get_type(it);
indent(nestingLevel);
switch (type) {
case CborMapType:
case CborArrayType: {
printf(type == CborArrayType ? "Array[" : "Map[");
break;
}
case CborIntegerType: {
int64_t val;
cbor_value_get_int64(it, &val); // can't fail
printf("%lld", (long long)val);
break;
}
case CborByteStringType: {
uint8_t *buf;
size_t n;
err = cbor_value_dup_byte_string(it, &buf, &n, it);
*got_next = true;
if (err)
return err; // parse error
printf("%s", sprint_hex(buf, n));
free(buf);
break;
}
case CborTextStringType: {
char *buf;
size_t n;
err = cbor_value_dup_text_string(it, &buf, &n, it);
*got_next = true;
if (err)
return err; // parse error
printf("%s", buf);
free(buf);
break;
}
case CborTagType: {
CborTag tag;
cbor_value_get_tag(it, &tag);
printf("Tag(%lld)", (long long)tag);
break;
}
case CborSimpleType: {
uint8_t type;
cbor_value_get_simple_type(it, &type);
printf("simple(%u)", type);
break;
}
case CborNullType:
printf("null");
break;
case CborUndefinedType:
printf("undefined");
break;
case CborBooleanType: {
bool val;
cbor_value_get_boolean(it, &val); // can't fail
printf("%s", val ? "true" : "false");
break;
}
case CborDoubleType: {
double val;
if (false) {
float f;
case CborFloatType:
cbor_value_get_float(it, &f);
val = f;
} else {
cbor_value_get_double(it, &val);
}
printf("%g", val);
break;
}
case CborHalfFloatType: {
uint16_t val;
cbor_value_get_half_float(it, &val);
printf("__f16(%04x)", val);
break;
}
case CborInvalidType:
printf("CborInvalidType!!!");
break;
}
return CborNoError;
}
static CborError dumprecursive(CborValue *it, int nestingLevel) {
while (!cbor_value_at_end(it)) {
CborError err;
CborType type = cbor_value_get_type(it);
//printf("^%x^", type);
bool got_next;
switch (type) {
case CborMapType: /*{
// recursive type
CborValue recursed;
assert(cbor_value_is_container(it));
printf("Map[\n");
err = cbor_value_enter_container(it, &recursed);
if (err)
return err; // parse error
// name
err = dumpelm(&recursed, next!!!!, nestingLevel + 1);
if (err)
return err;
printf(":");
err = cbor_value_advance_fixed(it);
if (err)
return err;
// value
printf("*");
err = dumprecursive(&recursed, nestingLevel + 1);
if (err)
return err; // parse error
err = cbor_value_leave_container(it, &recursed);
if (err)
return err; // parse error
indent(nestingLevel);
printf("]\n");
continue;
}*/
case CborArrayType: {
// recursive type
CborValue recursed;
assert(cbor_value_is_container(it));
indent(nestingLevel);
printf(type == CborArrayType ? "Array[\n" : "Map[\n");
err = cbor_value_enter_container(it, &recursed);
if (err)
return err; // parse error
err = dumprecursive(&recursed, nestingLevel + 1);
if (err)
return err; // parse error
err = cbor_value_leave_container(it, &recursed);
if (err)
return err; // parse error
indent(nestingLevel);
printf("]\n");
continue;
}
default: {
err = dumpelm(it, &got_next, nestingLevel);
printf("\n");
if (err)
return err;
break;
}
}
if (!got_next) {
err = cbor_value_advance_fixed(it);
if (err)
return err;
}
}
return CborNoError;
}
int TinyCborInit(uint8_t *data, size_t length, CborValue *cb) {
CborParser parser; CborParser parser;
CborError err = cbor_parser_init(data, length, 0, &parser, cb); CborError err = cbor_parser_init(data, length, 0, &parser, cb);
// if (!err) if (err)
// err = dumprecursive(cb, 0); return err;
if (err) {
fprintf(stderr, "CBOR parsing failure at offset %d: %s\n",
cb->ptr - data, cbor_error_string(err));
return 1;
}
return 0; return 0;
} }
@ -32,10 +211,20 @@ int TinyCborParser(uint8_t *data, size_t length, CborValue *cb) {
int TinyCborPrintFIDOPackage(uint8_t *data, size_t length) { int TinyCborPrintFIDOPackage(uint8_t *data, size_t length) {
CborValue cb; CborValue cb;
int res; int res;
res = TinyCborParser(data, length, &cb); res = TinyCborInit(&data[1], length - 1, &cb);
if (res) if (res)
return res; return res;
CborError err = dumprecursive(&cb, 0);
if (err) {
fprintf(stderr, "CBOR parsing failure at offset %d: %s\n",
cb.ptr - data, cbor_error_string(err));
return 1;
}
return 0; return 0;
} }