/src/CMake/Utilities/cmllpkgc/llpkgc_dep.c
Line | Count | Source |
1 | | /* Distributed under the OSI-approved BSD 3-Clause License. |
2 | | See accompanying file LICENSE.rst for details. */ |
3 | | |
4 | | #include <stdint.h> |
5 | | #include <stdlib.h> |
6 | | #include <string.h> |
7 | | |
8 | | #include "llpkgc_dep.h" |
9 | | |
10 | | #define CALLBACK_MAYBE(PARSER, NAME) \ |
11 | 0 | do { \ |
12 | 0 | const llpkgc_dep_settings_t* settings; \ |
13 | 0 | settings = \ |
14 | 0 | (const llpkgc_dep_settings_t*) (PARSER)->llpkgc_dep__settings; \ |
15 | 0 | if(settings == NULL || settings->NAME == NULL) { \ |
16 | 0 | err = 0; \ |
17 | 0 | break; \ |
18 | 0 | } \ |
19 | 0 | err = settings->NAME((PARSER)); \ |
20 | 0 | } while(0) |
21 | | |
22 | | #define SPAN_CALLBACK_MAYBE(PARSER, NAME, START, LEN) \ |
23 | 0 | do { \ |
24 | 0 | const llpkgc_dep_settings_t* settings; \ |
25 | 0 | settings = \ |
26 | 0 | (const llpkgc_dep_settings_t*) (PARSER)->llpkgc_dep__settings; \ |
27 | 0 | if(settings == NULL || settings->NAME == NULL) { \ |
28 | 0 | err = 0; \ |
29 | 0 | break; \ |
30 | 0 | } \ |
31 | 0 | err = settings->NAME((PARSER), (START), (LEN)); \ |
32 | 0 | if(err == -1) { \ |
33 | 0 | err = PDEP_USER; \ |
34 | 0 | llpkgc_dep_set_error_reason((PARSER), "Span callback error in " #NAME); \ |
35 | 0 | } \ |
36 | 0 | } while(0) |
37 | | |
38 | | enum llpkgc_dep_state { |
39 | | PDEP_START = 0, |
40 | | PDEP_DEP_NAME = 1, |
41 | | PDEP_DEP_OP = 2, |
42 | | PDEP_AFTER_OP = 3, |
43 | | PDEP_DEP_VERSION = 4, |
44 | | }; |
45 | | |
46 | | void llpkgc_dep_init(llpkgc_dep_t* parser, |
47 | 0 | const llpkgc_dep_settings_t* settings) { |
48 | 0 | llpkgc_dep__internal_init(parser); |
49 | 0 | parser->llpkgc_dep__settings = (void*) settings; |
50 | 0 | } |
51 | | |
52 | 0 | void llpkgc_dep_reset(llpkgc_dep_t* parser) { |
53 | 0 | llpkgc_dep_settings_t* settings = parser->llpkgc_dep__settings; |
54 | 0 | void* data = parser->data; |
55 | 0 | llpkgc_dep__internal_init(parser); |
56 | 0 | parser->llpkgc_dep__settings = settings; |
57 | 0 | parser->data = data; |
58 | 0 | } |
59 | | |
60 | 0 | void llpkgc_dep_settings_init(llpkgc_dep_settings_t* settings) { |
61 | 0 | memset(settings, 0, sizeof(*settings)); |
62 | 0 | } |
63 | | |
64 | | llpkgc_dep_errno_t llpkgc_dep_execute(llpkgc_dep_t* parser, const char* data, |
65 | 0 | size_t len) { |
66 | 0 | return llpkgc_dep__internal_execute(parser, data, data + len); |
67 | 0 | } |
68 | | |
69 | 0 | llpkgc_dep_errno_t llpkgc_dep_finish(llpkgc_dep_t* parser) { |
70 | 0 | int err = PDEP_OK; |
71 | |
|
72 | 0 | if(parser->error != 0) { |
73 | 0 | return parser->error; |
74 | 0 | } |
75 | | |
76 | 0 | switch(parser->llpkgc_dep__state) { |
77 | 0 | case PDEP_DEP_NAME: |
78 | 0 | CALLBACK_MAYBE(parser, on_dep_complete); |
79 | 0 | if(err != PDEP_OK) { |
80 | 0 | parser->error = err; |
81 | 0 | return err; |
82 | 0 | } |
83 | 0 | break; |
84 | | |
85 | 0 | case PDEP_DEP_OP: |
86 | 0 | case PDEP_AFTER_OP: |
87 | 0 | case PDEP_DEP_VERSION: |
88 | 0 | CALLBACK_MAYBE(parser, on_dep_complete); |
89 | 0 | if(err != PDEP_OK) { |
90 | 0 | parser->error = err; |
91 | 0 | return err; |
92 | 0 | } |
93 | 0 | break; |
94 | | |
95 | 0 | case PDEP_START: |
96 | 0 | break; |
97 | 0 | } |
98 | | |
99 | 0 | CALLBACK_MAYBE(parser, on_dep_list_complete); |
100 | 0 | if(err != PDEP_OK) { |
101 | 0 | parser->error = err; |
102 | 0 | return err; |
103 | 0 | } |
104 | | |
105 | 0 | return PDEP_OK; |
106 | 0 | } |
107 | | |
108 | 0 | void llpkgc_dep_pause(llpkgc_dep_t* parser) { |
109 | 0 | if(parser->error != PDEP_OK) { |
110 | 0 | return; |
111 | 0 | } |
112 | 0 | parser->error = PDEP_PAUSED; |
113 | 0 | parser->reason = "Paused"; |
114 | 0 | } |
115 | | |
116 | 0 | void llpkgc_dep_resume(llpkgc_dep_t* parser) { |
117 | 0 | if(parser->error != PDEP_PAUSED) { |
118 | 0 | return; |
119 | 0 | } |
120 | 0 | parser->error = 0; |
121 | 0 | } |
122 | | |
123 | 0 | llpkgc_dep_errno_t llpkgc_dep_get_errno(const llpkgc_dep_t* parser) { |
124 | 0 | return parser->error; |
125 | 0 | } |
126 | | |
127 | 0 | const char* llpkgc_dep_get_error_reason(const llpkgc_dep_t* parser) { |
128 | 0 | return parser->reason; |
129 | 0 | } |
130 | | |
131 | 0 | void llpkgc_dep_set_error_reason(llpkgc_dep_t* parser, const char* reason) { |
132 | 0 | parser->reason = reason; |
133 | 0 | } |
134 | | |
135 | 0 | const char* llpkgc_dep_get_error_pos(const llpkgc_dep_t* parser) { |
136 | 0 | return parser->error_pos; |
137 | 0 | } |
138 | | |
139 | 0 | const char* llpkgc_dep_errno_name(llpkgc_dep_errno_t err) { |
140 | 0 | switch(err) { |
141 | 0 | case PDEP_OK: |
142 | 0 | return "PDEP_OK"; |
143 | 0 | case PDEP_INTERNAL: |
144 | 0 | return "PDEP_INTERNAL"; |
145 | 0 | case PDEP_PAUSED: |
146 | 0 | return "PDEP_PAUSED"; |
147 | 0 | case PDEP_USER: |
148 | 0 | return "PDEP_USER"; |
149 | 0 | case PDEP_UNFINISHED: |
150 | 0 | return "PDEP_UNFINISHED"; |
151 | 0 | } |
152 | 0 | return "INVALID_ERRNO"; |
153 | 0 | } |
154 | | |
155 | | int llpkgc_dep__dep_name(llpkgc_dep_t* s, const char* p, |
156 | 0 | const char* endp) { |
157 | 0 | int err; |
158 | 0 | SPAN_CALLBACK_MAYBE(s, on_dep_name, p, endp - p); |
159 | 0 | return err; |
160 | 0 | } |
161 | | |
162 | | int llpkgc_dep__dep_op(llpkgc_dep_t* s, const char* p, |
163 | 0 | const char* endp) { |
164 | 0 | int err; |
165 | 0 | SPAN_CALLBACK_MAYBE(s, on_dep_op, p, endp - p); |
166 | 0 | return err; |
167 | 0 | } |
168 | | |
169 | | int llpkgc_dep__dep_version(llpkgc_dep_t* s, const char* p, |
170 | 0 | const char* endp) { |
171 | 0 | int err; |
172 | 0 | SPAN_CALLBACK_MAYBE(s, on_dep_version, p, endp - p); |
173 | 0 | return err; |
174 | 0 | } |
175 | | |
176 | | int llpkgc_dep__dep_complete(llpkgc_dep_t* s, const char* p, |
177 | 0 | const char* endp) { |
178 | 0 | int err; |
179 | | CALLBACK_MAYBE(s, on_dep_complete); |
180 | 0 | return err; |
181 | 0 | } |