/*
 * Copyright (c) 2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
 * Redistribution and modifications are permitted subject to BSD license.
 */
#ifndef	OER_SUPPORT_H
#define	OER_SUPPORT_H

#include <asn_system.h>		/* Platform-specific types */

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Pre-computed OER constraints.
 */
typedef struct asn_oer_constraint_number_s {
    unsigned width;    /* ±8,4,2,1 fixed bytes */
    unsigned positive; /* 1 for unsigned number, 0 for signed */
} asn_oer_constraint_number_t;
typedef struct asn_oer_constraints_s {
    asn_oer_constraint_number_t value;
    ssize_t size;    /* -1 (no constraint) or >= 0 */
} asn_oer_constraints_t;


/*
 * Fetch the length determinant (X.696 (08/2015), #8.6) into *len_r.
 * RETURN VALUES:
 *       0:     More data expected than bufptr contains.
 *      -1:     Fatal error deciphering length.
 *      >0:     Number of bytes used from bufptr.
 */
ssize_t oer_fetch_length(const void *bufptr, size_t size, size_t *len_r);

/*
 * Serialize OER length. Returns the number of bytes serialized
 * or -1 if a given callback returned with negative result.
 */
ssize_t oer_serialize_length(size_t length, asn_app_consume_bytes_f *cb, void *app_key);


#ifdef __cplusplus
}
#endif

#endif	/* OER_SUPPORT_H */