From 4ae56dc1859f464d3ce111e79ba1cf38bea61bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Thu, 22 May 2008 02:54:31 +0000 Subject: [PATCH] Some framework for code generation. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@23180 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/asn1/code.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 lib/asn1/code.c diff --git a/lib/asn1/code.c b/lib/asn1/code.c new file mode 100644 index 000000000..44e24abc6 --- /dev/null +++ b/lib/asn1/code.c @@ -0,0 +1,67 @@ + +#include "der_locl.h" + +enum prim_opcode { + HAP_BOOLEAN = 0 +}; + +typedef size_t (*op_length)(const void *); +typedef int (*op_get)(const unsigned char *, size_t, void *, size_t *); +typedef int (*op_put)(unsigned char *, size_t, const void *, size_t *); +typedef int (*op_release)(void *); +typedef int (*op_parse)(const char *, void *); +typedef size_t (*op_print)(const void *, char *, size_t); + +/* flags */ +#define OPTIONAL 1 + +struct op { + /* must implement */ + int dertype; + const char *name; + size_t datasize; + op_length length; + op_get get; + op_put put; + op_release release; + /* may implement */ + op_parse parse; + op_print print; +}; + +/* primitive operatators */ + +struct op pops[] = { + { + UT_EndOfContent, + "EndOfContent" + }, + { + UT_Boolean, + "boolean", + sizeof(int), + (op_length)der_length_boolean, + (op_get)der_get_boolean, + (op_put)der_put_boolean, + (op_release)der_free_generic, + NULL, + NULL + } +}; + +int +asn1code_decode_type(unsigned int op, + const unsigned char *in, size_t len, + void *data, size_t *size); + + + +int +asn1code_decode_type(unsigned int op, + const unsigned char *in, size_t len, + void *data, size_t *size) +{ + if (op > sizeof(pops)/sizeof(pops[0])) + return -1; + return (pops[op].get)(in, len, data, size); +}