ref: 4dd8392ce7ff341b5d19cf8a9d1473aa94b9d807
parent: 665c38d088b19183501943cd0b179bc8d6b75357
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Tue Apr 21 11:12:32 EDT 2015
Add longjmp point of recover This is the first commit of the non exit feature. At this point when there is an error the program try an external declaration again. This is a very bad error recovery, because it is going to generate error for all the symbols after the first, but it is a first step.
--- a/cc1/error.c
+++ b/cc1/error.c
@@ -1,27 +1,32 @@
+#include <setjmp.h>
#include <stdarg.h>
+#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
-#include <stdio.h>
#include "../inc/cc.h"
#include "cc1.h"
-extern unsigned linenum;
-extern unsigned columnum;
-extern const char *filename;
-
static void
-warn_helper(signed char flag, const char *fmt, va_list va)
+warn_helper(int8_t flag, const char *fmt, va_list va)
{
+ extern unsigned linenum;
+ extern unsigned columnum;
+ extern const char *filename;
+ extern uint8_t failure;
+ extern jmp_buf recover;
+
if (!flag)
return;
fprintf(stderr, "%s:%s:%u: ",
- (!flag) ? "warning" : "error", filename, linenum);
+ (flag < 0) ? "warning" : "error", filename, linenum);
vfprintf(stderr, fmt, va);
putc('\n', stderr);
- if (flag < 0)
- exit(EXIT_FAILURE); /* TODO: uhmmmm */
+ if (flag < 0) {
+ failure = 1;
+ longjmp(recover, 1);
+ }
}
void
--- a/cc1/main.c
+++ b/cc1/main.c
@@ -1,5 +1,6 @@
#include <inttypes.h>
+#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -12,16 +13,16 @@
open_file(const char *file), init_expr(void);
uint8_t npromote, warnings;
+jmp_buf recover;
-static uint8_t noerror;
static char *output;
static void
clean(void)
{
- if (noerror)
- return;
- if (output)
+ extern uint8_t failure;
+
+ if (failure && output)
remove(output);
}
@@ -38,6 +39,7 @@
char c, *input, *cp;
atexit(clean);
+
repeat:
--argc, ++argv;
if (*argv && argv[0][0] == '-' && argv[0][1] != '-') {
@@ -69,15 +71,16 @@
init_keywords();
init_expr();
open_file(input);
+
+ setjmp(recover);
next();
while (yytoken != EOFTOK)
extdecl();
- if (ferror(stdin) || ferror(stdout)) {
- die("error reading/writing from input/output:%s",
- strerror(errno));
- }
- noerror = 1;
+ if (fclose(stdin))
+ die("error reading from input:%s", strerror(errno));
+ if (fclose(stdout))
+ die("error writing in output:%s", strerror(errno));
return 0;
}
--- a/lib/die.c
+++ b/lib/die.c
@@ -1,4 +1,5 @@
+#include <inttypes.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
@@ -5,9 +6,12 @@
#include "../inc/cc.h"
+uint8_t failure;
+
void
die(const char *fmt, ...)
{
+ failure = 1;
va_list va;
va_start(va, fmt);
fprintf(stderr, fmt, va);