Commit 3eb27032 authored by Lev Walkin's avatar Lev Walkin

format integer value as INTEGER_t

parent bbe79251
...@@ -89,7 +89,7 @@ doc/docsrc/*.xdv ...@@ -89,7 +89,7 @@ doc/docsrc/*.xdv
/libasn1fix/check_* /libasn1fix/check_*
# /libasn1parser/ # /libasn1parser/
/libasn1parser/check_parser /libasn1parser/check_*
#code coverage #code coverage
*.gcno *.gcno
......
...@@ -17,6 +17,9 @@ asn1c_LDADD = \ ...@@ -17,6 +17,9 @@ asn1c_LDADD = \
$(top_builddir)/libasn1fix/libasn1fix.la \ $(top_builddir)/libasn1fix/libasn1fix.la \
$(top_builddir)/libasn1compiler/libasn1compiler.la $(top_builddir)/libasn1compiler/libasn1compiler.la
unber_LDADD = \
$(top_builddir)/libasn1common/libasn1common.la
bin_PROGRAMS = asn1c unber enber bin_PROGRAMS = asn1c unber enber
noinst_HEADERS = sys-common.h noinst_HEADERS = sys-common.h
......
...@@ -23,6 +23,12 @@ libasn1parser_la_SOURCES = \ ...@@ -23,6 +23,12 @@ libasn1parser_la_SOURCES = \
asn1p_integer.c asn1p_integer.h \ asn1p_integer.c asn1p_integer.h \
asn1p_list.h asn1p_list.h
check_PROGRAMS = check_asn1p_integer
LDADD = ../libasn1common/libasn1common.la libasn1parser.la
TESTS = $(check_PROGRAMS)
asn1parser.h: asn1p_expr_str.h asn1parser.h: asn1p_expr_str.h
asn1p_expr_str.h: expr-h.pl asn1p_expr.h asn1p_expr_str.h: expr-h.pl asn1p_expr.h
......
...@@ -164,3 +164,25 @@ int asn1p_itoa_s(char *buf, size_t size, asn1c_integer_t v) { ...@@ -164,3 +164,25 @@ int asn1p_itoa_s(char *buf, size_t size, asn1c_integer_t v) {
return ret; return ret;
} }
abuf *
asn1p_integer_as_INTEGER(asn1c_integer_t value) {
abuf *ab = abuf_new();
uint8_t buf[sizeof(value) + 1];
uint8_t *bp = buf;
do {
*bp++ = value;
value >>= 8;
} while(!((value == 0 && !(bp[-1] & 0x80))
|| (value == -1 && (bp[-1] & 0x80))));
abuf_printf(ab, "{ (uint8_t *)\"");
for(const uint8_t *p = bp-1; p >= buf; p--) {
abuf_printf(ab, "\\x%02x", *p);
}
abuf_printf(ab, "\\0\", %zu }", bp - buf);
return ab;
}
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
#include "config.h" #include "config.h"
#endif /* HAVE_CONFIG_H */ #endif /* HAVE_CONFIG_H */
#include <asn1_buffer.h>
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif /* HAVE_SYS_TYPES_H */ #endif /* HAVE_SYS_TYPES_H */
...@@ -42,4 +44,9 @@ const char *asn1p_itoa(asn1c_integer_t value); /* Ptr to a static buf */ ...@@ -42,4 +44,9 @@ const char *asn1p_itoa(asn1c_integer_t value); /* Ptr to a static buf */
int asn1p_itoa_s(char *buf, size_t size, int asn1p_itoa_s(char *buf, size_t size,
asn1c_integer_t value); /* Return -1 on error, or length. */ asn1c_integer_t value); /* Return -1 on error, or length. */
/*
* Convert asn1c_integer_t into INTEGER_t structure.
*/
abuf *asn1p_integer_as_INTEGER(asn1c_integer_t value);
#endif /* ASN1P_INTEGER_H */ #endif /* ASN1P_INTEGER_H */
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <limits.h>
#include <assert.h>
#include <errno.h>
#include "asn1p_integer.h"
static void check(int lineno, asn1c_integer_t value, const char *expected);
struct {
uint8_t *buf; size_t size;
} ff = {
(uint8_t *)"sdf", 3
};
int main() {
check(__LINE__, 0, "{ (uint8_t *)\"\\x00\\0\", 1 }");
check(__LINE__, 1, "{ (uint8_t *)\"\\x01\\0\", 1 }");
check(__LINE__, 127, "{ (uint8_t *)\"\\x7f\\0\", 1 }");
check(__LINE__, 128, "{ (uint8_t *)\"\\x00\\x80\\0\", 2 }");
check(__LINE__, 129, "{ (uint8_t *)\"\\x00\\x81\\0\", 2 }");
check(__LINE__, -1, "{ (uint8_t *)\"\\xff\\0\", 1 }");
check(__LINE__, -2, "{ (uint8_t *)\"\\xfe\\0\", 1 }");
check(__LINE__, -127, "{ (uint8_t *)\"\\x81\\0\", 1 }");
check(__LINE__, -128, "{ (uint8_t *)\"\\x80\\0\", 1 }");
check(__LINE__, -129, "{ (uint8_t *)\"\\xff\\x7f\\0\", 2 }");
check(__LINE__, -254, "{ (uint8_t *)\"\\xff\\x02\\0\", 2 }");
check(__LINE__, -255, "{ (uint8_t *)\"\\xff\\x01\\0\", 2 }");
check(__LINE__, -256, "{ (uint8_t *)\"\\xff\\x00\\0\", 2 }");
check(__LINE__, -257, "{ (uint8_t *)\"\\xfe\\xff\\0\", 2 }");
check(__LINE__, ~(asn1c_integer_t)0, "{ (uint8_t *)\"\\xff\\0\", 1 }");
switch(sizeof(asn1c_integer_t)) {
case 4:
check(__LINE__,
~(asn1c_integer_t)0
& ~((asn1c_integer_t)1 << (8 * sizeof(asn1c_integer_t) - 1)),
"{ (uint8_t *)\""
"\\x7f\\xff\\xff\\xff"
"\\0\", 4 }");
break;
case 8:
check(__LINE__,
~(asn1c_integer_t)0
& ~((asn1c_integer_t)1 << (8 * sizeof(asn1c_integer_t) - 1)),
"{ (uint8_t *)\""
"\\x7f\\xff\\xff\\xff\\xff\\xff\\xff\\xff"
"\\0\", 8 }");
break;
case 16:
check(__LINE__,
~(asn1c_integer_t)0
& ~((asn1c_integer_t)1 << (8 * sizeof(asn1c_integer_t) - 1)),
"{ (uint8_t *)\""
"\\x7f\\xff\\xff\\xff\\xff\\xff\\xff\\xff"
"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff"
"\\0\", 16 }");
break;
default:
assert(!"Unreachable");
}
return 0;
}
static void check(int lineno, asn1c_integer_t value, const char *expected) {
abuf *ab;
ab = asn1p_integer_as_INTEGER(value);
assert(ab);
if(strcmp(ab->buffer, expected)) {
fprintf(stderr, "%02d: %s -> [%s], expected [%s]\n", lineno,
asn1p_itoa(value), ab->buffer, expected);
assert(strcmp(ab->buffer, expected) == 0);
}
printf("%02d: %s -> %s\n", lineno, asn1p_itoa(value), ab->buffer);
abuf_free(ab);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment