blob: 7fb6f6f8958a1b5839988c083f4538ff506b6ea9 [file] [log] [blame]
Lev Walkinf15320b2004-06-03 03:38:44 +00001/*
2 * CLASS-related stuff.
3 */
4#ifndef ASN1_PARSER_CLASS_H
5#define ASN1_PARSER_CLASS_H
6
Lev Walkind370e9f2006-03-16 10:03:35 +00007struct asn1p_expr_s; /* Forward declaration */
8
9typedef struct asn1p_ioc_row_s {
10 struct asn1p_ioc_cell_s {
11 struct asn1p_expr_s *field; /* may never be NULL */
12 struct asn1p_expr_s *value; /* may be left uninitialized */
Bi-Ruei, Chiu80fd3062017-05-07 21:00:51 +080013 int new_ref;
Lev Walkind370e9f2006-03-16 10:03:35 +000014 } *column;
Lev Walkin62d95d22017-08-06 23:41:11 -070015 size_t columns;
Lev Walkind370e9f2006-03-16 10:03:35 +000016} asn1p_ioc_row_t;
17
18asn1p_ioc_row_t *asn1p_ioc_row_new(struct asn1p_expr_s *oclass);
Bi-Ruei, Chiu5bdb5552017-10-23 15:20:55 +080019asn1p_ioc_row_t *asn1p_ioc_row_clone(asn1p_ioc_row_t *src, int base_idx);
Lev Walkin4dcf8362017-08-07 20:10:05 -070020size_t asn1p_ioc_row_max_identifier_length(asn1p_ioc_row_t *);
Lev Walkind370e9f2006-03-16 10:03:35 +000021void asn1p_ioc_row_delete(asn1p_ioc_row_t *);
Lev Walkinea6635b2017-08-06 23:23:04 -070022
Lev Walkin4dcf8362017-08-07 20:10:05 -070023typedef struct asn1p_ioc_table_s {
24 asn1p_ioc_row_t **row;
25 size_t rows;
Lev Walkinbc407262017-08-23 10:03:22 -070026 int extensible; /* 0 if non-extensible (sealed). Otherwise, extensible. */
Lev Walkin4dcf8362017-08-07 20:10:05 -070027} asn1p_ioc_table_t;
28
29asn1p_ioc_table_t *asn1p_ioc_table_new(void);
30void asn1p_ioc_table_add(asn1p_ioc_table_t *, asn1p_ioc_row_t *row);
Bi-Ruei, Chiu50934ba2017-09-11 08:50:59 +080031void asn1p_ioc_table_append(asn1p_ioc_table_t *it, asn1p_ioc_table_t *src);
Lev Walkin4dcf8362017-08-07 20:10:05 -070032size_t asn1p_ioc_table_max_identifier_length(asn1p_ioc_table_t *);
33void asn1p_ioc_table_free(asn1p_ioc_table_t *);
34
Lev Walkinea6635b2017-08-06 23:23:04 -070035/*
36 * Match is similar to a comparison,
37 * but -1 means error and 1 means not equal. 0 is OK
38 */
39int asn1p_ioc_row_match(const asn1p_ioc_row_t *, const asn1p_ioc_row_t *);
40
Lev Walkind370e9f2006-03-16 10:03:35 +000041struct asn1p_ioc_cell_s *asn1p_ioc_row_cell_fetch(asn1p_ioc_row_t *,
42 const char *fieldname);
43
Lev Walkinf15320b2004-06-03 03:38:44 +000044/*
45 * WITH SYNTAX free-form chunks.
46 */
47typedef struct asn1p_wsyntx_chunk_s {
Lev Walkin9d542d22006-03-14 16:31:37 +000048 enum {
49 WC_LITERAL,
Lev Walkin57074f12006-03-16 05:11:14 +000050 WC_WHITESPACE,
Lev Walkind370e9f2006-03-16 10:03:35 +000051 WC_FIELD,
Lev Walkin9d542d22006-03-14 16:31:37 +000052 WC_OPTIONALGROUP
53 } type;
Lev Walkinf15320b2004-06-03 03:38:44 +000054 /*
Lev Walkin57074f12006-03-16 05:11:14 +000055 * WC_LITERAL -> {token}
56 * WC_WHITESPACE -> {token}
Lev Walkind370e9f2006-03-16 10:03:35 +000057 * WC_FIELD -> {token}
Lev Walkin9d542d22006-03-14 16:31:37 +000058 * WC_OPTIONALGROUP -> {syntax}
Lev Walkinf15320b2004-06-03 03:38:44 +000059 */
Lev Walkin9d542d22006-03-14 16:31:37 +000060 union {
Lev Walkind370e9f2006-03-16 10:03:35 +000061 char *token;
Lev Walkin9d542d22006-03-14 16:31:37 +000062 struct asn1p_wsyntx_s *syntax;
63 } content;
Lev Walkinf15320b2004-06-03 03:38:44 +000064
65 TQ_ENTRY(struct asn1p_wsyntx_chunk_s) next;
66} asn1p_wsyntx_chunk_t;
67
68typedef struct asn1p_wsyntx_s {
69
Bi-Ruei, Chiu80fd3062017-05-07 21:00:51 +080070 struct asn1p_wsyntx_chunk_s *parent;
71
Lev Walkinf15320b2004-06-03 03:38:44 +000072 TQ_HEAD(struct asn1p_wsyntx_chunk_s) chunks;
73
74} asn1p_wsyntx_t;
75
76
77/*
78 * Constructor, destructor and cloning function.
79 */
80asn1p_wsyntx_chunk_t *asn1p_wsyntx_chunk_new(void);
81void asn1p_wsyntx_chunk_free(asn1p_wsyntx_chunk_t *);
82asn1p_wsyntx_chunk_t *asn1p_wsyntx_chunk_clone(asn1p_wsyntx_chunk_t *);
83
84asn1p_wsyntx_t *asn1p_wsyntx_new(void);
85void asn1p_wsyntx_free(asn1p_wsyntx_t *);
86asn1p_wsyntx_t *asn1p_wsyntx_clone(asn1p_wsyntx_t *);
87
88/*
89 * RETURN VALUES:
90 * 0: Component has been added
91 * -1: Failure to add component (refer to errno)
92 */
Lev Walkinc46b7cb2006-08-18 02:27:55 +000093asn1p_wsyntx_chunk_t *asn1p_wsyntx_chunk_fromstring(char *token, int _copy);
Lev Walkin9d542d22006-03-14 16:31:37 +000094asn1p_wsyntx_chunk_t *asn1p_wsyntx_chunk_fromsyntax(asn1p_wsyntx_t *syntax);
Lev Walkinf15320b2004-06-03 03:38:44 +000095
96
97#endif /* ASN1_PARSER_CLASS_H */