summaryrefslogtreecommitdiffstats
path: root/asn1/asn1c/per_support.h
blob: f411b6fed742b3018d09abf15fe71f5e6e18c0aa (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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105

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

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

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Pre-computed PER constraints.
 */
    typedef struct asn_per_constraint_s {
        enum asn_per_constraint_flags {
            APC_UNCONSTRAINED = 0x0,    /* No PER visible constraints */
            APC_SEMI_CONSTRAINED = 0x1, /* Constrained at "lb" */
            APC_CONSTRAINED = 0x2,      /* Fully constrained */
            APC_EXTENSIBLE = 0x4        /* May have extension */
        } flags;
        int range_bits;         /* Full number of bits in the range */
        int effective_bits;     /* Effective bits */
        long lower_bound;       /* "lb" value */
        long upper_bound;       /* "ub" value */
    } asn_per_constraint_t;
    typedef struct asn_per_constraints_s {
        asn_per_constraint_t value;
        asn_per_constraint_t size;
    } asn_per_constraints_t;

/*
 * This structure describes a position inside an incoming PER bit stream.
 */
    typedef struct asn_per_data_s {
        const uint8_t *buffer;  /* Pointer to the octet stream */
        size_t nboff;           /* Bit offset to the meaningful bit */
        size_t nbits;           /* Number of bits in the stream */
    } asn_per_data_t;

/*
 * Extract a small number of bits (<= 31) from the specified PER data pointer.
 * This function returns -1 if the specified number of bits could not be
 * extracted due to EOD or other conditions.
 */
    int32_t per_get_few_bits(asn_per_data_t * per_data, int get_nbits);

/*
 * Extract a large number of bits from the specified PER data pointer.
 * This function returns -1 if the specified number of bits could not be
 * extracted due to EOD or other conditions.
 */
    int per_get_many_bits(asn_per_data_t * pd, uint8_t * dst, int right_align,
                          int get_nbits);

/*
 * Get the length "n" from the Unaligned PER stream.
 */
    ssize_t uper_get_length(asn_per_data_t * pd, int effective_bound_bits,
                            int *repeat);

/*
 * Get the normally small non-negative whole number.
 */
    ssize_t uper_get_nsnnwn(asn_per_data_t * pd);

/*
 * This structure supports forming PER output.
 */
    typedef struct asn_per_outp_s {
        uint8_t *buffer;        /* Pointer into the (tmpspace) */
        size_t nboff;           /* Bit offset to the meaningful bit */
        size_t nbits;           /* Number of bits left in (tmpspace) */
        uint8_t tmpspace[32];   /* Preliminary storage to hold data */
        int (*outper) (const void *data, size_t size, void *op_key);
        void *op_key;           /* Key for (outper) data callback */
        size_t flushed_bytes;   /* Bytes already flushed through (outper) */
    } asn_per_outp_t;

/* Output a small number of bits (<= 31) */
    int per_put_few_bits(asn_per_outp_t * per_data, uint32_t bits, int obits);

/* Output a large number of bits */
    int per_put_many_bits(asn_per_outp_t * po, const uint8_t * src,
                          int put_nbits);

/*
 * Put the length "n" to the Unaligned PER stream.
 * This function returns the number of units which may be flushed
 * in the next units saving iteration.
 */
    ssize_t uper_put_length(asn_per_outp_t * po, size_t whole_length);

/*
 * Put the normally small non-negative whole number.
 */
    int uper_put_nsnnwn(asn_per_outp_t * po, int n);

#ifdef __cplusplus
}
#endif
#endif                          /* _PER_SUPPORT_H_ */