Break macro structure definition into new file.
[pspp] / src / language / lexer / macro.c
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 2021 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #include <config.h>
18
19 #include "language/lexer/macro.h"
20
21 #include <stdlib.h>
22
23 void
24 macro_tokens_uninit (struct macro_tokens *tokens)
25 {
26   for (size_t i = 0; i < tokens->n; i++)
27     token_destroy (&tokens->tokens[i]);
28   free (tokens->tokens);
29 }
30
31 void
32 macro_destroy (struct macro *m)
33 {
34   if (!m)
35     return;
36
37   free (m->name);
38   for (size_t i = 0; i < m->n_params; i++)
39     {
40       struct macro_param *p = &m->params[i];
41       free (p->name);
42
43       macro_tokens_uninit (&p->def);
44
45       switch (p->arg_type)
46         {
47         case ARG_N_TOKENS:
48           break;
49
50         case ARG_CHAREND:
51           token_destroy (&p->charend);
52           break;
53
54         case ARG_ENCLOSE:
55           token_destroy (&p->enclose[0]);
56           token_destroy (&p->enclose[1]);
57           break;
58
59         case ARG_CMDEND:
60           break;
61         }
62     }
63   free (m->params);
64   for (size_t i = 0; i < m->n_body; i++)
65     free (m->body[i]);
66   free (m->body);
67   free (m);
68 }