Skip to content

Commit 9145107

Browse files
authored
Merge pull request #23 from asdf-format/issue-21
#21: Initial version of public headers
2 parents 1e26a6b + 8d587f3 commit 9145107

File tree

24 files changed

+553
-338
lines changed

24 files changed

+553
-338
lines changed

.github/workflows/build.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,8 @@ jobs:
7575
tail -n +1 tests/*.log
7676
tail -n +1 tests/tmp/*.out.txt
7777
78+
- name: Dist
79+
run: make dist ${{ github.event.inputs.make_flags }}
80+
81+
- name: Dist check
82+
run: make distcheck ${{ github.event.inputs.make_flags }}

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ Makefile
1717
*/Makefile
1818

1919
# build outputs
20+
/asdf
2021
*/*.o
2122
*/*.lo
2223
.deps
2324
.dirstamp
2425
.libs
25-
asdf
2626
libasdf.la
2727
libtool
2828
m4/libtool.m4

Makefile.am

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,27 @@
1+
src_files = src/block.c src/event.c src/info.c src/parse.c src/parse_util.c src/stream.c src/yaml.c
2+
src_headers = \
3+
src/block.h \
4+
src/compat/endian.h \
5+
src/event.h \
6+
src/info.h \
7+
src/parse.h \
8+
src/parse_util.h \
9+
src/stream.h \
10+
src/stream_intern.h \
11+
src/util.h \
12+
src/yaml.h
13+
include_dir = $(top_srcdir)/include
14+
115
AM_CFLAGS = -fvisibility=hidden
2-
AM_CPPFLAGS = -I$(top_srcdir)/src # so that tests also find header files
16+
AM_CPPFLAGS = -I$(top_srcdir)/include
317
ACLOCAL_AMFLAGS = -Im4
418

5-
src_files = src/block.c src/event.c src/info.c src/parse.c src/parse_util.c src/stream.c src/yaml.c
6-
src_headers = src/block.h src/event.h src/info.h src/parse.h src/parse_util.h src/stream.h src/yaml.h
7-
19+
include_HEADERS = $(include_dir)/asdf.h
20+
nobase_include_HEADERS = \
21+
$(include_dir)/asdf/event.h \
22+
$(include_dir)/asdf/parse.h \
23+
$(include_dir)/asdf/util.h \
24+
$(include_dir)/asdf/yaml.h
825
noinst_HEADERS = $(src_headers)
926

1027
# libasdf library
@@ -43,3 +60,24 @@ CODE_COVERAGE_IGNORE_PATTERN = \
4360
include $(top_srcdir)/aminclude_static.am
4461

4562
SUBDIRS = tests
63+
64+
# Include sample files from asdf-standard in the distribution (used in tests)
65+
# Eventually test against older reference files as well
66+
reference_files = $(top_srcdir)/asdf-standard/reference_files/1.6.0
67+
EXTRA_DIST = \
68+
$(reference_files)/anchor.asdf \
69+
$(reference_files)/ascii.asdf \
70+
$(reference_files)/basic.asdf \
71+
$(reference_files)/complex.asdf \
72+
$(reference_files)/compressed.asdf \
73+
$(reference_files)/endian.asdf \
74+
$(reference_files)/exploded0000.asdf \
75+
$(reference_files)/exploded.asdf \
76+
$(reference_files)/float.asdf \
77+
$(reference_files)/int.asdf \
78+
$(reference_files)/scalars.asdf \
79+
$(reference_files)/shared.asdf \
80+
$(reference_files)/stream.asdf \
81+
$(reference_files)/structured.asdf \
82+
$(reference_files)/unicode_bmp.asdf \
83+
$(reference_files)/unicode_spp.asdf

include/asdf.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#ifndef ASDF_H
2+
#define ASDF_H
3+
4+
#include <asdf/parse.h>
5+
6+
#endif

include/asdf/event.h

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#ifndef ASDF_EVENT_H
2+
#define ASDF_EVENT_H
3+
4+
#include <stdbool.h>
5+
#include <stdio.h>
6+
7+
#include <asdf/util.h>
8+
9+
10+
#define ASDF_EVENT_TYPES(X) \
11+
X(ASDF_NONE_EVENT) \
12+
X(ASDF_BEGIN_EVENT) \
13+
X(ASDF_ASDF_VERSION_EVENT) \
14+
X(ASDF_STANDARD_VERSION_EVENT) \
15+
X(ASDF_COMMENT_EVENT) \
16+
X(ASDF_TREE_START_EVENT) \
17+
X(ASDF_YAML_EVENT) \
18+
X(ASDF_TREE_END_EVENT) \
19+
X(ASDF_BLOCK_EVENT) \
20+
X(ASDF_PADDING_EVENT) \
21+
X(ASDF_BLOCK_INDEX_EVENT) \
22+
X(ASDF_END_EVENT)
23+
24+
typedef enum {
25+
// clang-format off
26+
#define X(member) member,
27+
ASDF_EVENT_TYPES(X)
28+
#undef X
29+
ASDF_EVENT_TYPE_COUNT
30+
// clang-format on
31+
} asdf_event_type_t;
32+
33+
34+
typedef struct asdf_event asdf_event_t;
35+
36+
37+
typedef struct asdf_block_info asdf_block_info_t;
38+
39+
40+
typedef struct asdf_tree_info asdf_tree_info_t;
41+
42+
43+
/* Forward declaration for asdf_parser_t */
44+
typedef struct asdf_parser asdf_parser_t;
45+
46+
47+
/* Public API functions */
48+
ASDF_EXPORT asdf_event_type_t asdf_event_type(asdf_event_t *event);
49+
ASDF_EXPORT const char *asdf_event_comment(const asdf_event_t *event);
50+
ASDF_EXPORT const asdf_tree_info_t *asdf_event_tree_info(const asdf_event_t *event);
51+
ASDF_EXPORT const asdf_block_info_t *asdf_event_block_info(const asdf_event_t *event);
52+
ASDF_EXPORT asdf_event_t *asdf_event_iterate(asdf_parser_t *parser);
53+
ASDF_EXPORT const char *asdf_event_type_name(asdf_event_type_t event_type);
54+
ASDF_EXPORT void asdf_event_print(const asdf_event_t *event, FILE *file, bool verbose);
55+
ASDF_EXPORT void asdf_event_free(asdf_parser_t *parser, asdf_event_t *event);
56+
57+
#endif /* ASDF_EVENT_H */

include/asdf/parse.h

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#ifndef ASDF_PARSE_H
2+
#define ASDF_PARSE_H
3+
4+
#include <stdbool.h>
5+
#include <stdint.h>
6+
#include <stdio.h>
7+
8+
#include <asdf/util.h>
9+
10+
11+
// NOLINTNEXTLINE(readability-identifier-naming)
12+
#define _ASDF_PARSER_OPTS(X) \
13+
X(ASDF_PARSER_OPT_EMIT_YAML_EVENTS, 0) \
14+
X(ASDF_PARSER_OPT_BUFFER_TREE, 1)
15+
16+
17+
typedef enum {
18+
// clang-format off
19+
#define X(flag, bit) flag = (1UL << (bit)),
20+
_ASDF_PARSER_OPTS(X)
21+
#undef X
22+
// clang-format on
23+
} asdf_parser_opt_t;
24+
25+
26+
// NOLINTNEXTLINE(readability-magic-numbers)
27+
_Static_assert(ASDF_PARSER_OPT_BUFFER_TREE < (1UL << 63), "too many flags for 64-bit int");
28+
29+
30+
typedef uint64_t asdf_parser_optflags_t;
31+
32+
33+
typedef struct asdf_parser_cfg {
34+
asdf_parser_optflags_t flags;
35+
} asdf_parser_cfg_t;
36+
37+
38+
typedef struct asdf_parser asdf_parser_t;
39+
40+
41+
/* Forward declaration for asdf_event_t */
42+
typedef struct asdf_event asdf_event_t;
43+
44+
45+
/* Public API functions */
46+
ASDF_EXPORT asdf_parser_t *asdf_parser_create(asdf_parser_cfg_t *config);
47+
ASDF_EXPORT int asdf_parser_set_input_file(asdf_parser_t *parser, const char *filename);
48+
ASDF_EXPORT int asdf_parser_set_input_fp(asdf_parser_t *parser, FILE *file, const char *filename);
49+
ASDF_EXPORT int asdf_parser_set_input_mem(asdf_parser_t *parser, const void *buf, size_t size);
50+
ASDF_EXPORT asdf_event_t *asdf_parser_parse(asdf_parser_t *parser);
51+
ASDF_EXPORT void asdf_parser_destroy(asdf_parser_t *parser);
52+
ASDF_EXPORT bool asdf_parser_has_error(const asdf_parser_t *parser);
53+
ASDF_EXPORT const char *asdf_parser_get_error(const asdf_parser_t *parser);
54+
55+
#endif /* ASDF_PARSE_H */

include/asdf/util.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#ifndef ASDF_UTIL_H
2+
#define ASDF_UTIL_H
3+
4+
#if defined(__clang__) || (defined(__GNUC__) && __GNUC__ >= 4)
5+
#define ASDF_EXPORT __attribute__ ((visibility ("default")))
6+
#define ASDF_LOCAL __attribute__ ((visibility ("hidden")))
7+
#else
8+
#define ASDF_EXPORT
9+
#define ASDF_LOCAL
10+
#endif
11+
12+
#endif /* ASDF_UTIL_H */

include/asdf/yaml.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#ifndef ASDF_YAML_H
2+
#define ASDF_YAML_H
3+
4+
#include <asdf/event.h>
5+
#include <asdf/util.h>
6+
7+
8+
typedef enum {
9+
// Not a YAML event
10+
ASDF_YAML_NONE_EVENT = 0,
11+
ASDF_YAML_STREAM_START_EVENT,
12+
ASDF_YAML_STREAM_END_EVENT,
13+
ASDF_YAML_DOCUMENT_START_EVENT,
14+
ASDF_YAML_DOCUMENT_END_EVENT,
15+
ASDF_YAML_MAPPING_START_EVENT,
16+
ASDF_YAML_MAPPING_END_EVENT,
17+
ASDF_YAML_SEQUENCE_START_EVENT,
18+
ASDF_YAML_SEQUENCE_END_EVENT,
19+
ASDF_YAML_SCALAR_EVENT,
20+
ASDF_YAML_ALIAS_EVENT
21+
} asdf_yaml_event_type_t;
22+
23+
24+
ASDF_EXPORT const char *asdf_yaml_event_scalar_value(const asdf_event_t *event, size_t *lenp);
25+
ASDF_EXPORT const char *asdf_yaml_event_tag(const asdf_event_t *event, size_t *lenp);
26+
ASDF_EXPORT asdf_yaml_event_type_t asdf_yaml_event_type(const asdf_event_t *event);
27+
ASDF_EXPORT const char *asdf_yaml_event_type_text(const asdf_event_t *event);
28+
29+
#endif /* ASDF_YAML_H */

src/event.c

Lines changed: 61 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "block.h"
1313
#include "event.h"
1414
#include "parse.h"
15+
#include "parse_util.h"
1516
#include "util.h"
1617
#include "yaml.h"
1718

@@ -48,13 +49,57 @@ const asdf_block_info_t *asdf_event_block_info(const asdf_event_t *event) {
4849
}
4950

5051

51-
int asdf_event_iterate(asdf_parser_t *parser, asdf_event_t *event) {
52+
void asdf_event_cleanup(asdf_parser_t *parser, asdf_event_t *event) {
5253
assert(parser);
53-
assert(event);
5454

55-
// Clear previous event contents
56-
asdf_event_destroy(parser, event);
57-
return asdf_parser_parse(parser, event);
55+
if (!event)
56+
return;
57+
58+
switch (event->type) {
59+
case ASDF_TREE_START_EVENT:
60+
case ASDF_TREE_END_EVENT:
61+
free(event->payload.tree);
62+
break;
63+
case ASDF_YAML_EVENT:
64+
fy_parser_event_free(parser->yaml_parser, event->payload.yaml);
65+
break;
66+
case ASDF_ASDF_VERSION_EVENT:
67+
case ASDF_STANDARD_VERSION_EVENT:
68+
if (event->payload.version)
69+
free(event->payload.version->version);
70+
71+
free(event->payload.version);
72+
break;
73+
case ASDF_BLOCK_EVENT:
74+
free(event->payload.block);
75+
break;
76+
case ASDF_COMMENT_EVENT:
77+
free(event->payload.comment);
78+
break;
79+
default:
80+
break;
81+
}
82+
ZERO_MEMORY(event, sizeof(asdf_event_t));
83+
}
84+
85+
86+
asdf_event_t *asdf_event_iterate(asdf_parser_t *parser) {
87+
if (!parser)
88+
return NULL;
89+
90+
// Recycle the current event before allocating a new one
91+
if (parser->current_event_p) {
92+
asdf_event_cleanup(parser, &parser->current_event_p->event);
93+
asdf_parse_event_recycle(parser, &parser->current_event_p->event);
94+
parser->current_event_p = NULL;
95+
}
96+
97+
asdf_event_t *event = asdf_parser_parse(parser);
98+
99+
if (!event)
100+
free(parser->current_event_p);
101+
102+
return event;
58103
}
59104

60105

@@ -171,31 +216,16 @@ void asdf_event_print(const asdf_event_t *event, FILE *file, bool verbose) {
171216
}
172217

173218

174-
void asdf_event_destroy(asdf_parser_t *parser, asdf_event_t *event) {
175-
assert(event);
176-
switch (event->type) {
177-
case ASDF_TREE_START_EVENT:
178-
case ASDF_TREE_END_EVENT:
179-
free(event->payload.tree);
180-
break;
181-
case ASDF_YAML_EVENT:
182-
fy_parser_event_free(parser->yaml_parser, event->payload.yaml);
183-
break;
184-
case ASDF_ASDF_VERSION_EVENT:
185-
case ASDF_STANDARD_VERSION_EVENT:
186-
if (event->payload.version)
187-
free(event->payload.version->version);
219+
void asdf_event_free(asdf_parser_t *parser, asdf_event_t *event) {
220+
assert(parser);
188221

189-
free(event->payload.version);
190-
break;
191-
case ASDF_BLOCK_EVENT:
192-
free(event->payload.block);
193-
break;
194-
case ASDF_COMMENT_EVENT:
195-
free(event->payload.comment);
196-
break;
197-
default:
198-
break;
199-
}
200-
ZERO_MEMORY(event, sizeof(asdf_event_t));
222+
if (!event)
223+
return;
224+
225+
if (!event) return;
226+
227+
struct asdf_event_p *event_p = (struct asdf_event_p *)((char *)event - offsetof(struct asdf_event_p, event));
228+
asdf_event_cleanup(parser, &event_p->event);
229+
free(event_p);
230+
parser->current_event_p = NULL;
201231
}

0 commit comments

Comments
 (0)