summaryrefslogtreecommitdiff
path: root/support/dktools/dkct-tr.h
blob: af90e25e21e78f3f4f6578278a59d99b31f2fdba (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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
/*
Copyright 2011-2020, Dirk Krause. All rights reserved.
SPDX-License-Identifier:	BSD-3-Clause
*/

/**	@file	dkct-tr.h	Header file for the dkct-tr module.
*/

#ifndef DKCT_TR_H_INCLUDED
#define	DKCT_TR_H_INCLUDED 1


#if DK3_USE_WX
#include "DkWxCommunicator.h"
#endif


/**	State machine entry (input, output state).
*/
typedef struct {
  char const	*name;		/**< Name. */
  char const	*comment;	/**< Comment text. */
  unsigned long	 lineno;	/**< Line number of definition. */
  int		 value;		/**< Numeric value. */
  char		 flag;		/**< Flag: Numeric value set. */
} DKCT_STM_ENTRY;



/**	Transition rule.
*/
typedef struct {
  DKCT_STM_ENTRY	*state;		/**< Current (old) state. */
  DKCT_STM_ENTRY	*input;		/**< Input. */
  DKCT_STM_ENTRY	*newstate;	/**< New state. */
  DKCT_STM_ENTRY	*output;	/**< Output. */
  unsigned long		 lineno;	/**< Line number of definition. */
} DKCT_STM_RULE;



/**	State machine description.
*/
typedef struct {
  dk3_sto_t	*s_states;	/**< Storage for states. */
  dk3_sto_it_t	*i_states;	/**< Iterator for states. */
  dk3_sto_t	*s_inputs;	/**< Storage for inputs. */
  dk3_sto_it_t	*i_inputs;	/**< Iterator for inputs. */
  dk3_sto_t	*s_outputs;	/**< Storage for outputs. */
  dk3_sto_it_t	*i_outputs;	/**< Iterator for outputs. */
  dk3_sto_t	*s_exact;	/**< Storage for exact rules. */
  dk3_sto_it_t	*i_exact;	/**< Iterator for exact rules. */
  dk3_sto_t	*s_wildcard;	/**< Storage for one-wildcard rules. */
  dk3_sto_it_t	*i_wildcard;	/**< Iterator for one-wildcard rules. */
  char const	*name;		/**< State machine name. */
  DKCT_STM_ENTRY	*rs;	/**< Reset state. */
  DKCT_STM_ENTRY	*ds;	/**< Default state. */
  DKCT_STM_ENTRY	*dout;	/**< Default output. */
  unsigned long	 stmno;		/**< State machine number. */
  unsigned long	 lineno;	/**< Line number of start. */
  unsigned long	 lngr;		/**< Line number of general rule. */
  int		 wrh;		/**< Flag: Write definitions to header. */
  int		 section;	/**< Current section. */
  int		 usedef;	/**< Flag: Use defines instead of enums. */
} DKCT_STM;



/**	One input source line.
*/
typedef struct {
  char const	*t;	/**< Text. */
  unsigned long	 l;	/**< Line number. */
} DKCT_LINE;



/**	One source file read in.
*/
typedef struct {
  DKCT_OPTION_SET	dkcto;	/**< Conversion options. */
  dk3_app_t		*app;	/**< Application structure. */
  dkChar const * const	*msg;	/**< Localized message texts. */
  dkChar const		*ffn;	/**< Full source file name. */
  dk3_sto_t		*hss;	/**< Header start storage. */
  dk3_sto_it_t		*hsi;	/**< Header start iterator. */
  dk3_sto_t		*hes;	/**< Header end storage. */
  dk3_sto_it_t		*hei;	/**< Header end iterator. */
  dk3_sto_t		*clss;	/**< Class start storage. */
  dk3_sto_it_t		*clsi;	/**< Class start iterator. */
  dk3_sto_t		*cles;	/**< Class end storage. */
  dk3_sto_it_t		*clei;	/**< Class end iterator. */
  dk3_sto_t		*mss;	/**< Module start storage. */
  dk3_sto_it_t		*msi;	/**< Module start iterator. */
  dk3_sto_t		*mes;	/**< Module end iterator. */
  dk3_sto_it_t		*mei;	/**< Module end iterator. */
  dk3_sto_t		*coss;	/**< Constructor start storage. */
  dk3_sto_it_t		*cosi;	/**< Constructor start iterator. */
  dk3_sto_t		*coes;	/**< Constructor end iterator. */
  dk3_sto_it_t		*coei;	/**< Constructor end iterator. */
  dk3_sto_t		*s_stm;	/**< Storage for state machines. */
  dk3_sto_it_t		*i_stm;	/**< Iterator for state machines. */
  dk3_sto_it_t		*cursr;	/**< Current source. */
  DKCT_STM		*cstm;	/**< Current state machine. */
  void			*gui;	/**< GUI description. */
  FILE			*fipo;	/**< Output file. */
  FILE			*cbfip;	/**< Comment box file. */
  char const		*sfn;	/**< Short file name. */
  char const		*crn;	/**< Copyright name. */
  char const		*cry;	/**< Copyright year. */
  char const		*sli;	/**< SPDX license identifier. */
  char			*cmdb;	/**< Command buffer. */
  char			*cbfn;	/**< Comment box file name. */
  unsigned long		lineno;	/**< Current line number. */
  size_t		 szcmd;	/**< Size of command buffer. */
  size_t		 ucmd;	/**< Used characters in command buffer. */
  size_t		 cbcp;	/**< Comment box current position. */
  size_t		 cbmx;	/**< Comment box max line length. */
  int			 lict;	/**< License type. */
  int			 type;	/**< Source type. */
  int			 ec;	/**< Error code. */
  int			 st;	/**< Current state. */
  int			 sufi;	/**< Source suffix index. */
  int			 doxyh;	/**< Doxygen comment found in header. */
  int			 doxym;	/**< Doxygen comment found in module. */
  int			 shln;	/**< Flag: Show line number. */
  int			 curdi;	/**< Flag: Processing the current directory. */
  int			 hdr;	/**< Flag: Currently processing header. */
  char			 cchr;	/**< Current character to process. */
#if DK3_USE_WX
  DkWxCommunicator	*pComm;	/**< Communicator for threads. */
#endif
} DKCT_SRC;


/**	@defgroup	dkctsections	Source file sections.
*/
/**@{*/

/**	Start of module.
*/
#define	DKCT_SECTION_MODULE_START	0

/**	End of module
*/
#define DKCT_SECTION_MODULE_END		1

/**	Start of constructor.
*/
#define	DKCT_SECTION_CONSTRUCTOR_START	2

/**	End of constructor.
*/
#define DKCT_SECTION_CONSTRUCTOR_END	3

/**	Start of header.
*/
#define	DKCT_SECTION_HEADER_START	4

/**	End of header.
*/
#define	DKCT_SECTION_HEADER_END		5

/**	Start of class.
*/
#define	DKCT_SECTION_CLASS_START	6

/**	End of class.
*/
#define	DKCT_SECTION_CLASS_END		7

/**	Options.
*/
#define	DKCT_SECTION_OPTIONS		8

/**	wxWidgets GUI.
*/
#define	DKCT_SECTION_GUI		9

/**	State machine description.
*/
#define	DKCT_SECTION_STATE_MACHINE	10

/**@}*/



#ifdef __cplusplus
extern "C" {
#endif

/**	Destroy line structure.
	@param	p	Structure to destroy.
*/
void
dkct_tr_line_delete(DKCT_LINE *p);

/**	Create new source line.
	@param	t	Text.
	@param	l	Line number.
	@param	app	Application structure for diagnostics, may be NULL.
	@return	Pointer to new line structure on success, NULL on error.
*/
DKCT_LINE *
dkct_tr_line_new(char const *t, unsigned long l, dk3_app_t *app);

/**	Destroy dkct-tr source structure.
	@param	p	Structure to destroy.
*/
void
dkct_tr_delete(DKCT_SRC *p);

/**	Create new dkct-tr source structure.
	@param	o	Option set.
	@param	fn	Short file name.
	@param	ai	File suffix array index.
	@param	app	Application structure for diagnostics, may be NULL.
	@param	ffn	Full source file name.
	@return	Pointer to new structure on success, NULL on error.
*/
DKCT_SRC *
dkct_tr_new(
  DKCT_OPTION_SET	*o,
  char const		*fn,
  int			 ai,
  dk3_app_t		*app,
  dkChar const		*ffn
);

/**	Read source file.
	@param	psrc	Source file structure to store data.
	@param	fn	Source file name.
	@param	sufi	File name suffix index.
	@return	1 on success, 0 on error.
*/
int
dkct_tr_read(DKCT_SRC *psrc, dkChar const *fn, int sufi);

/**	Check setup (especially GUI).
	@param	psrc	Source file structure to store data.
	@param	fn	Source file name.
	@param	sufi	File name suffix index.
	@return	1 on success, 0 on error.
*/
int
dkct_tr_check(DKCT_SRC *psrc, dkChar const *fn, int sufi);

/**	Write output.
	@param	psrc	Source file structure to store data.
	@param	fn	Source file name.
	@param	sufi	File name suffix index.
	@return	1 on success, 0 on error.
*/
int
dkct_tr_write(DKCT_SRC *psrc, dkChar const *fn, int sufi);

/**	Create new state machine description.
	@param	lineno	Source line number.
	@param	app	Application structure for diagnostics, may be NULL.
	@return	Pointer to new structure on success, NULL on error.
*/
DKCT_STM *
dkct_au_stm_new(unsigned long lineno, dk3_app_t *app);

/**	Destroy state machine description.
	@param	p	Structure to destroy.
*/
void
dkct_au_stm_delete(DKCT_STM *p);

/**	Add one text line to state machine description.
	@param	stm	State machine description.
	@param	psrc	Source structure.
	@param	line	Text to add.
	@param	lineno	Line number.
	@return	1 on success, 0 on error.
*/
int
dkct_au_add_line(
  DKCT_STM *stm, DKCT_SRC *psrc, char *line, unsigned long lineno
);

/**	Check state machine consistency.
	@param	psrc	Source structure.
	@param	stm	State machine to check.
	@return	1 on success, 0 on error.
*/
int
dkct_au_stm_check(DKCT_SRC *psrc, DKCT_STM *stm);

/**	Write "#line ..." information to output.
	@param	psrc	Source structure.
	@param	newlines	Number of newlines to use in counting.
*/
void
dkct_tr_show_source_line(DKCT_SRC *psrc, size_t newlines);

/**	Write state, input and output constants.
	@param	psrc	Source structure.
	@param	stm	State machine.
*/
void
dkct_au_write_entries(DKCT_SRC *psrc, DKCT_STM *stm);

/**	Write function prototypes for state machine.
	@param	psrc	Source structure.
	@param	stm	State machine.
*/
void
dkct_au_write_prototypes(DKCT_SRC *psrc, DKCT_STM *stm);

/**	Write state machine functions.
	@param	psrc	Source structure.
	@param	stm	State machine.
	@param	f_static	Flag: Use static keyword.
*/
void
dkct_au_write_functions(DKCT_SRC *psrc, DKCT_STM *stm, int f_static);

/**	Get one of the dkct-tr keywords.
	@param	sz	Keyword index.
	@return	Pointer to keyword or NULL.
*/
char const *
dkct_tr_get_kw8(size_t sz);

/**	Write string containing file name and line number to output.
	@param	psrc	Source structure.
*/
void
dkct_tr_show_filename_and_lineno(DKCT_SRC *psrc);

#ifdef __cplusplus
}
#endif

#endif