aboutsummaryrefslogtreecommitdiffstats
path: root/src/mds-kbdc/process-includes.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mds-kbdc/process-includes.c')
-rw-r--r--src/mds-kbdc/process-includes.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/mds-kbdc/process-includes.c b/src/mds-kbdc/process-includes.c
index 9677671..8c4bbbf 100644
--- a/src/mds-kbdc/process-includes.c
+++ b/src/mds-kbdc/process-includes.c
@@ -16,6 +16,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "process-includes.h"
+/* TODO we need to deal with mutually recursive includes */
#include "make-tree.h"
#include "simplify-tree.h"
@@ -68,26 +69,34 @@ static int transfer_errors(mds_kbdc_parsed_t* restrict subresult, mds_kbdc_tree_
{
mds_kbdc_parse_error_t** errors = NULL;
mds_kbdc_parse_error_t* suberror;
- size_t errors_ptr = 0, i;
+ size_t errors_ptr = 0;
int saved_errno;
- /* List errors backwards, so that we can easily insert “included from here”-notes. */
+ /* Allocate temporary list for errors. */
+ if (subresult->errors_ptr == 0)
+ return 0;
fail_if (xmalloc(errors, subresult->errors_ptr * 2, mds_kbdc_parse_error_t*));
+
+ /* List errors backwards, so that we can easily handle errors and add “included from here”-note. */
while (subresult->errors_ptr--)
{
suberror = subresult->errors[subresult->errors_ptr];
+
+ /* If it is more severe than a note, we want to say there it was included. */
if (suberror->severity > MDS_KBDC_PARSE_ERROR_NOTE)
{
NEW_ERROR(tree, NOTE, "included from here");
errors[errors_ptr++] = error;
result->errors[--(result->errors_ptr)] = NULL;
}
+
+ /* Include error. */
errors[errors_ptr++] = suberror;
subresult->errors[subresult->errors_ptr] = NULL;
}
/* Append errors. */
- for (i = 0; i < errors_ptr; errors[i++] = NULL)
+ for (; errors_ptr--; errors[errors_ptr] = NULL)
{
if (result->errors_ptr + 1 >= result->errors_size)
{
@@ -98,8 +107,8 @@ static int transfer_errors(mds_kbdc_parsed_t* restrict subresult, mds_kbdc_tree_
result->errors = new_errors;
result->errors_size = new_errors_size;
}
-
- result->errors[result->errors_ptr++] = errors[i];
+
+ result->errors[result->errors_ptr++] = errors[errors_ptr];
result->errors[result->errors_ptr] = NULL;
}
@@ -108,10 +117,7 @@ static int transfer_errors(mds_kbdc_parsed_t* restrict subresult, mds_kbdc_tree_
pfail:
saved_errno = errno;
while (errors_ptr--)
- if (errors[errors_ptr] == NULL)
- break;
- else
- mds_kbdc_parse_error_free(errors[errors_ptr]);
+ mds_kbdc_parse_error_free(errors[errors_ptr]);
free(errors);
return errno = saved_errno, -1;
}
@@ -150,7 +156,7 @@ static int process_include(mds_kbdc_tree_include_t* restrict tree)
* but we will not assume that glibc is used here. */
for (;;)
{
- fail_if (!xxrealloc(old, cwd, cwd_size <<= 1, char));
+ fail_if (xxrealloc(old, cwd, cwd_size <<= 1, char));
if (getcwd(cwd, cwd_size))
break;
else
@@ -165,6 +171,10 @@ static int process_include(mds_kbdc_tree_include_t* restrict tree)
our_result = result;
/* Process include. */
+ old = tree->filename, tree->filename = NULL;
+ tree->filename = parse_raw_string(old);
+ fail_if (tree->filename == NULL);
+ free(old), old = NULL;
process (parse_to_tree(tree->filename, &subresult));
process (simplify_tree(&subresult));
process (process_includes(&subresult));