]> granicus.if.org Git - postgresql/commitdiff
ecpg: Split off mmfatal() from mmerror()
authorPeter Eisentraut <peter_e@gmx.net>
Wed, 13 Nov 2013 03:12:08 +0000 (22:12 -0500)
committerPeter Eisentraut <peter_e@gmx.net>
Wed, 20 Nov 2013 02:56:54 +0000 (21:56 -0500)
This allows decorating mmfatal() with noreturn compiler hints, leading
to better diagnostics.

src/interfaces/ecpg/preproc/descriptor.c
src/interfaces/ecpg/preproc/ecpg.header
src/interfaces/ecpg/preproc/ecpg.trailer
src/interfaces/ecpg/preproc/extern.h
src/interfaces/ecpg/preproc/nls.mk
src/interfaces/ecpg/preproc/pgc.l
src/interfaces/ecpg/preproc/type.c
src/interfaces/ecpg/preproc/type.h
src/interfaces/ecpg/preproc/variable.c

index 115cb17ddc1c22f64fec01a3669b3a1e0fa6ad7b..053a7afda863104859e56ea7c1d3105b253cdebd 100644 (file)
@@ -274,7 +274,7 @@ output_set_descr(char *desc_name, char *index)
                        case ECPGd_di_precision:
                        case ECPGd_precision:
                        case ECPGd_scale:
-                               mmerror(PARSE_ERROR, ET_FATAL, "descriptor item \"%s\" is not implemented",
+                               mmfatal(PARSE_ERROR, "descriptor item \"%s\" is not implemented",
                                                descriptor_item_name(results->value));
                                break;
 
@@ -284,7 +284,7 @@ output_set_descr(char *desc_name, char *index)
                        case ECPGd_octet:
                        case ECPGd_ret_length:
                        case ECPGd_ret_octet:
-                               mmerror(PARSE_ERROR, ET_FATAL, "descriptor item \"%s\" cannot be set",
+                               mmfatal(PARSE_ERROR, "descriptor item \"%s\" cannot be set",
                                                descriptor_item_name(results->value));
                                break;
 
index 88d9cf53c0c87a41f928c6b6bd8a2a419d640f32..71b11f41e0dd5e1430c685dcbff4be7cfc5b0d3d 100644 (file)
@@ -64,11 +64,9 @@ struct ECPGtype ecpg_query = {ECPGt_char_variable, NULL, NULL, NULL, {NULL}, 0};
 /*
  * Handle parsing errors and warnings
  */
-void
-mmerror(int error_code, enum errortype type, const char *error, ...)
+static void __attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 0)))
+vmmerror(int error_code, enum errortype type, const char *error, va_list ap)
 {
-       va_list ap;
-
        /* internationalize the error message string */
        error = _(error);
 
@@ -80,14 +78,11 @@ mmerror(int error_code, enum errortype type, const char *error, ...)
                        fprintf(stderr, _("WARNING: "));
                        break;
                case ET_ERROR:
-               case ET_FATAL:
                        fprintf(stderr, _("ERROR: "));
                        break;
        }
 
-       va_start(ap, error);
        vfprintf(stderr, error, ap);
-       va_end(ap);
 
        fprintf(stderr, "\n");
 
@@ -98,18 +93,38 @@ mmerror(int error_code, enum errortype type, const char *error, ...)
                case ET_ERROR:
                        ret_value = error_code;
                        break;
-               case ET_FATAL:
-                       if (yyin)
-                               fclose(yyin);
-                       if (yyout)
-                               fclose(yyout);
-
-                       if (strcmp(output_filename, "-") != 0 && unlink(output_filename) != 0)
-                               fprintf(stderr, _("could not remove output file \"%s\"\n"), output_filename);
-                       exit(error_code);
        }
 }
 
+void
+mmerror(int error_code, enum errortype type, const char *error, ...)
+{
+       va_list         ap;
+
+       va_start(ap, error);
+       vmmerror(error_code, type, error, ap);
+       va_end(ap);
+}
+
+void
+mmfatal(int error_code, const char *error, ...)
+{
+       va_list         ap;
+
+       va_start(ap, error);
+       vmmerror(error_code, ET_ERROR, error, ap);
+       va_end(ap);
+
+       if (yyin)
+               fclose(yyin);
+       if (yyout)
+               fclose(yyout);
+
+       if (strcmp(output_filename, "-") != 0 && unlink(output_filename) != 0)
+               fprintf(stderr, _("could not remove output file \"%s\"\n"), output_filename);
+       exit(error_code);
+}
+
 /*
  * string concatenation
  */
index 58155ab6604433a0480af53cf7e2f21bdf2b6f28..342b7bc4d4c0b6719cc67eb4d1a4d054046e454b 100644 (file)
@@ -1687,7 +1687,7 @@ cvariable:        CVARIABLE
                                {
                                        case '[':
                                                        if (brace)
-                                                               mmerror(PARSE_ERROR, ET_FATAL, "multidimensional arrays for simple data types are not supported");
+                                                               mmfatal(PARSE_ERROR, "multidimensional arrays for simple data types are not supported");
                                                        brace_open++;
                                                        break;
                                        case ']':
index ccf5548f577ed404febecdd3f85620fbc64c11ef..3bbb6a44737d54582246b51d60873de90e762788 100644 (file)
@@ -73,10 +73,8 @@ extern int   base_yylex(void);
 extern void base_yyerror(const char *);
 extern void *mm_alloc(size_t), *mm_realloc(void *, size_t);
 extern char *mm_strdup(const char *);
-extern void
-mmerror(int, enum errortype, const char *,...)
-/* This extension allows gcc to check the format string */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 4)));
+extern void mmerror(int errorcode, enum errortype type, const char *error, ...) __attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 4)));
+extern void mmfatal(int errorcode, const char *error, ...) __attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3),noreturn));
 extern void output_get_descr_header(char *);
 extern void output_get_descr(char *, char *);
 extern void output_set_descr_header(char *);
index 38725a16582464124d2dcc918dde390adff69651..91297a2323be593c85ce2b76eef4243869f6d130 100644 (file)
@@ -2,5 +2,5 @@
 CATALOG_NAME     = ecpg
 AVAIL_LANGUAGES  = cs de es fr it ja ko pl pt_BR ru tr zh_CN zh_TW
 GETTEXT_FILES    = descriptor.c ecpg.c pgc.c preproc.c type.c variable.c
-GETTEXT_TRIGGERS = mmerror:3
-GETTEXT_FLAGS    = mmerror:3:c-format
+GETTEXT_TRIGGERS = mmerror:3 mmfatal:2
+GETTEXT_FLAGS    = mmerror:3:c-format mmfatal:2:c-format
index 55b44ee286948ae65ba3103a32a9f8618824db2e..24936ea935d698588b128da8aff747605a00a0dd 100644 (file)
@@ -400,7 +400,7 @@ cppline                     {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
 <xc>{op_chars} { ECHO; }
 <xc>\*+                        { ECHO; }
 
-<xc><<EOF>>            { mmerror(PARSE_ERROR, ET_FATAL, "unterminated /* comment"); }
+<xc><<EOF>>            { mmfatal(PARSE_ERROR, "unterminated /* comment"); }
 
 <SQL>{xbstart} {
                                        token_start = yytext;
@@ -422,7 +422,7 @@ cppline                     {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
 <xb>{xbinside} { addlit(yytext, yyleng); }
 <xh>{quotecontinue}    |
 <xb>{quotecontinue}    { /* ignore */ }
-<xb><<EOF>>            { mmerror(PARSE_ERROR, ET_FATAL, "unterminated bit string literal"); }
+<xb><<EOF>>            { mmfatal(PARSE_ERROR, "unterminated bit string literal"); }
 
 <SQL>{xhstart} {
                                        token_start = yytext;
@@ -438,7 +438,7 @@ cppline                     {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
                                return XCONST;
                        }
 
-<xh><<EOF>>            { mmerror(PARSE_ERROR, ET_FATAL, "unterminated hexadecimal string literal"); }
+<xh><<EOF>>            { mmfatal(PARSE_ERROR, "unterminated hexadecimal string literal"); }
 <SQL>{xnstart} {
                                /* National character.
                                 * Transfer it as-is to the backend.
@@ -516,7 +516,7 @@ cppline                     {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
                           /* This is only needed for \ just before EOF */
                           addlitchar(yytext[0]);
                        }
-<xq,xqc,xe,xn,xus><<EOF>>      { mmerror(PARSE_ERROR, ET_FATAL, "unterminated quoted string"); }
+<xq,xqc,xe,xn,xus><<EOF>>      { mmfatal(PARSE_ERROR, "unterminated quoted string"); }
 <SQL>{dolqfailed}      {
                                /* throw back all but the initial "$" */
                                yyless(1);
@@ -592,7 +592,7 @@ cppline                     {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
                                        }
 <xd,xui>{xddouble}             { addlitchar('"'); }
 <xd,xui>{xdinside}             { addlit(yytext, yyleng); }
-<xd,xdc,xui><<EOF>>            { mmerror(PARSE_ERROR, ET_FATAL, "unterminated quoted identifier"); }
+<xd,xdc,xui><<EOF>>            { mmfatal(PARSE_ERROR, "unterminated quoted identifier"); }
 <C,SQL>{xdstart}       {
                                                state_before = YYSTATE;
                                                BEGIN(xdc);
@@ -938,7 +938,7 @@ cppline                     {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
                                        BEGIN(C);
                                }
 <undef>{other}|\n {
-                                               mmerror(PARSE_ERROR, ET_FATAL, "missing identifier in EXEC SQL UNDEF command");
+                                               mmfatal(PARSE_ERROR, "missing identifier in EXEC SQL UNDEF command");
                                                yyterminate();
                                }
 <C>{exec_sql}{include}{space}* { BEGIN(incl); }
@@ -984,10 +984,10 @@ cppline                   {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
                                        }
 <C,xskip>{exec_sql}{elif}{space}*      {       /* pop stack */
                                                if ( preproc_tos == 0 ) {
-                                                       mmerror(PARSE_ERROR, ET_FATAL, "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"");
+                                                       mmfatal(PARSE_ERROR, "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"");
                                                }
                                                else if ( stacked_if_value[preproc_tos].else_branch )
-                                                       mmerror(PARSE_ERROR, ET_FATAL, "missing \"EXEC SQL ENDIF;\"");
+                                                       mmfatal(PARSE_ERROR, "missing \"EXEC SQL ENDIF;\"");
                                                else
                                                        preproc_tos--;
 
@@ -998,9 +998,9 @@ cppline                     {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
                                        if (INFORMIX_MODE)
                                        {
                                                if (preproc_tos == 0)
-                                                       mmerror(PARSE_ERROR, ET_FATAL, "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"");
+                                                       mmfatal(PARSE_ERROR, "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"");
                                                else if (stacked_if_value[preproc_tos].else_branch)
-                                                       mmerror(PARSE_ERROR, ET_FATAL, "missing \"EXEC SQL ENDIF;\"");
+                                                       mmfatal(PARSE_ERROR, "missing \"EXEC SQL ENDIF;\"");
                                                else
                                                        preproc_tos--;
 
@@ -1016,7 +1016,7 @@ cppline                   {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
 
 <C,xskip>{exec_sql}{else}{space}*";" { /* only exec sql endif pops the stack, so take care of duplicated 'else' */
                                        if (stacked_if_value[preproc_tos].else_branch)
-                                               mmerror(PARSE_ERROR, ET_FATAL, "more than one EXEC SQL ELSE");
+                                               mmfatal(PARSE_ERROR, "more than one EXEC SQL ELSE");
                                        else
                                        {
                                                stacked_if_value[preproc_tos].else_branch = TRUE;
@@ -1035,7 +1035,7 @@ cppline                   {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
                                        if (INFORMIX_MODE)
                                        {
                                                if (stacked_if_value[preproc_tos].else_branch)
-                                                       mmerror(PARSE_ERROR, ET_FATAL, "more than one EXEC SQL ELSE");
+                                                       mmfatal(PARSE_ERROR, "more than one EXEC SQL ELSE");
                                                else
                                                {
                                                        stacked_if_value[preproc_tos].else_branch = TRUE;
@@ -1057,7 +1057,7 @@ cppline                   {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
                                }
 <C,xskip>{exec_sql}{endif}{space}*";" {
                                        if (preproc_tos == 0)
-                                               mmerror(PARSE_ERROR, ET_FATAL, "unmatched EXEC SQL ENDIF");
+                                               mmfatal(PARSE_ERROR, "unmatched EXEC SQL ENDIF");
                                        else
                                                preproc_tos--;
 
@@ -1071,7 +1071,7 @@ cppline                   {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
                                        if (INFORMIX_MODE)
                                        {
                                                if (preproc_tos == 0)
-                                                       mmerror(PARSE_ERROR, ET_FATAL, "unmatched EXEC SQL ENDIF");
+                                                       mmfatal(PARSE_ERROR, "unmatched EXEC SQL ENDIF");
                                                else
                                                        preproc_tos--;
 
@@ -1091,7 +1091,7 @@ cppline                   {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
 
 <xcond>{identifier}{space}*";" {
                                        if (preproc_tos >= MAX_NESTED_IF-1)
-                                               mmerror(PARSE_ERROR, ET_FATAL, "too many nested EXEC SQL IFDEF conditions");
+                                               mmfatal(PARSE_ERROR, "too many nested EXEC SQL IFDEF conditions");
                                        else
                                        {
                                                struct _defines *defptr;
@@ -1124,7 +1124,7 @@ cppline                   {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
                                }
 
 <xcond>{other}|\n      {
-                               mmerror(PARSE_ERROR, ET_FATAL, "missing identifier in EXEC SQL IFDEF command");
+                               mmfatal(PARSE_ERROR, "missing identifier in EXEC SQL IFDEF command");
                                yyterminate();
                        }
 <def_ident>{identifier} {
@@ -1133,7 +1133,7 @@ cppline                   {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
                                startlit();
                        }
 <def_ident>{other}|\n  {
-                               mmerror(PARSE_ERROR, ET_FATAL, "missing identifier in EXEC SQL DEFINE command");
+                               mmfatal(PARSE_ERROR, "missing identifier in EXEC SQL DEFINE command");
                                yyterminate();
                        }
 <def>{space}*";"       {
@@ -1166,7 +1166,7 @@ cppline                   {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
 <incl>{dquote}{xdinside}{dquote}{space}*";"?   {       parse_include(); }
 <incl>[^;\<\>\"]+";"           { parse_include(); }
 <incl>{other}|\n               {
-                                       mmerror(PARSE_ERROR, ET_FATAL, "syntax error in EXEC SQL INCLUDE command");
+                                       mmfatal(PARSE_ERROR, "syntax error in EXEC SQL INCLUDE command");
                                        yyterminate();
                                }
 
@@ -1176,7 +1176,7 @@ cppline                   {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
                                                if ( preproc_tos > 0 )
                                                {
                                                        preproc_tos = 0;
-                                                       mmerror(PARSE_ERROR, ET_FATAL, "missing \"EXEC SQL ENDIF;\"");
+                                                       mmfatal(PARSE_ERROR, "missing \"EXEC SQL ENDIF;\"");
                                                }
                                                yyterminate();
                                        }
@@ -1215,7 +1215,7 @@ cppline                   {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
 
                                        }
                                }
-<INITIAL>{other}|\n    { mmerror(PARSE_ERROR, ET_FATAL, "internal error: unreachable state; please report this to <pgsql-bugs@postgresql.org>"); }
+<INITIAL>{other}|\n    { mmfatal(PARSE_ERROR, "internal error: unreachable state; please report this to <pgsql-bugs@postgresql.org>"); }
 %%
 void
 lex_init(void)
@@ -1362,7 +1362,7 @@ parse_include(void)
                }
        }
        if (!yyin)
-               mmerror(NO_INCLUDE_FILE, ET_FATAL, "could not open include file \"%s\" on line %d", yytext, yylineno);
+               mmfatal(NO_INCLUDE_FILE, "could not open include file \"%s\" on line %d", yytext, yylineno);
 
        input_filename = mm_strdup(inc_file);
        yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE ));
index 5f0b20e2b1a5662ee1b01feacaf4fb3d368b3e24..28184b9f4406c2c40b164642bc6b23e88810a131 100644 (file)
@@ -15,7 +15,7 @@ mm_alloc(size_t size)
        void       *ptr = malloc(size);
 
        if (ptr == NULL)
-               mmerror(OUT_OF_MEMORY, ET_FATAL, "out of memory");
+               mmfatal(OUT_OF_MEMORY, "out of memory");
 
        return ptr;
 }
@@ -27,7 +27,7 @@ mm_strdup(const char *string)
        char       *new = strdup(string);
 
        if (new == NULL)
-               mmerror(OUT_OF_MEMORY, ET_FATAL, "out of memory");
+               mmfatal(OUT_OF_MEMORY, "out of memory");
 
        return new;
 }
@@ -282,7 +282,7 @@ ECPGdump_a_type(FILE *o, const char *name, struct ECPGtype * type, const int bra
        {
                case ECPGt_array:
                        if (indicator_set && ind_type->type != ECPGt_array)
-                               mmerror(INDICATOR_NOT_ARRAY, ET_FATAL, "indicator for array/pointer has to be array/pointer");
+                               mmfatal(INDICATOR_NOT_ARRAY, "indicator for array/pointer has to be array/pointer");
                        switch (type->u.element->type)
                        {
                                case ECPGt_array:
@@ -319,7 +319,7 @@ ECPGdump_a_type(FILE *o, const char *name, struct ECPGtype * type, const int bra
                        break;
                case ECPGt_struct:
                        if (indicator_set && ind_type->type != ECPGt_struct)
-                               mmerror(INDICATOR_NOT_STRUCT, ET_FATAL, "indicator for struct has to be a struct");
+                               mmfatal(INDICATOR_NOT_STRUCT, "indicator for struct has to be a struct");
 
                        ECPGdump_a_struct(o, name, ind_name, mm_strdup("1"), type, ind_type, prefix, ind_prefix);
                        break;
@@ -328,7 +328,7 @@ ECPGdump_a_type(FILE *o, const char *name, struct ECPGtype * type, const int bra
                        break;
                case ECPGt_char_variable:
                        if (indicator_set && (ind_type->type == ECPGt_struct || ind_type->type == ECPGt_array))
-                               mmerror(INDICATOR_NOT_SIMPLE, ET_FATAL, "indicator for simple data type has to be simple");
+                               mmfatal(INDICATOR_NOT_SIMPLE, "indicator for simple data type has to be simple");
 
                        ECPGdump_a_simple(o, name, type->type, mm_strdup("1"), (arr_str_siz && strcmp(arr_str_siz, "0") != 0) ? arr_str_siz : mm_strdup("1"), struct_sizeof, prefix, 0);
                        if (ind_type != NULL)
@@ -336,7 +336,7 @@ ECPGdump_a_type(FILE *o, const char *name, struct ECPGtype * type, const int bra
                        break;
                case ECPGt_descriptor:
                        if (indicator_set && (ind_type->type == ECPGt_struct || ind_type->type == ECPGt_array))
-                               mmerror(INDICATOR_NOT_SIMPLE, ET_FATAL, "indicator for simple data type has to be simple");
+                               mmfatal(INDICATOR_NOT_SIMPLE, "indicator for simple data type has to be simple");
 
                        ECPGdump_a_simple(o, name, type->type, NULL, mm_strdup("-1"), NULL, prefix, 0);
                        if (ind_type != NULL)
@@ -344,7 +344,7 @@ ECPGdump_a_type(FILE *o, const char *name, struct ECPGtype * type, const int bra
                        break;
                default:
                        if (indicator_set && (ind_type->type == ECPGt_struct || ind_type->type == ECPGt_array))
-                               mmerror(INDICATOR_NOT_SIMPLE, ET_FATAL, "indicator for simple data type has to be simple");
+                               mmfatal(INDICATOR_NOT_SIMPLE, "indicator for simple data type has to be simple");
 
                        ECPGdump_a_simple(o, name, type->type, type->size, (arr_str_siz && strcmp(arr_str_siz, "0") != 0) ? arr_str_siz : mm_strdup("-1"), struct_sizeof, prefix, type->counter);
                        if (ind_type != NULL)
index b7768fd66146e16547f385d30272e2a42e4d6832..cd0d1da8c4a1a641acd9f6b6b7dfa88e7241394d 100644 (file)
@@ -186,7 +186,7 @@ struct assignment
 
 enum errortype
 {
-       ET_WARNING, ET_ERROR, ET_FATAL
+       ET_WARNING, ET_ERROR
 };
 
 struct fetch_desc
index 6ff574bbd9213296bb77fe408b1259794b60c903..cc923a797bc37baeb66f3b5925624c78f43e3a30 100644 (file)
@@ -86,7 +86,7 @@ find_struct_member(char *name, char *str, struct ECPGstruct_member * members, in
                                        case '\0':      /* found the end, but this time it has to be
                                                                 * an array element */
                                                if (members->type->type != ECPGt_array)
-                                                       mmerror(PARSE_ERROR, ET_FATAL, "incorrectly formed variable \"%s\"", name);
+                                                       mmfatal(PARSE_ERROR, "incorrectly formed variable \"%s\"", name);
 
                                                switch (members->type->u.element->type)
                                                {
@@ -113,7 +113,7 @@ find_struct_member(char *name, char *str, struct ECPGstruct_member * members, in
                                                        return (find_struct_member(name, end, members->type->u.members, brace_level));
                                                break;
                                        default:
-                                               mmerror(PARSE_ERROR, ET_FATAL, "incorrectly formed variable \"%s\"", name);
+                                               mmfatal(PARSE_ERROR, "incorrectly formed variable \"%s\"", name);
                                                break;
                                }
                        }
@@ -136,10 +136,10 @@ find_struct(char *name, char *next, char *end)
        if (c == '-')
        {
                if (p->type->type != ECPGt_array)
-                       mmerror(PARSE_ERROR, ET_FATAL, "variable \"%s\" is not a pointer", name);
+                       mmfatal(PARSE_ERROR, "variable \"%s\" is not a pointer", name);
 
                if (p->type->u.element->type != ECPGt_struct && p->type->u.element->type != ECPGt_union)
-                       mmerror(PARSE_ERROR, ET_FATAL, "variable \"%s\" is not a pointer to a structure or a union", name);
+                       mmfatal(PARSE_ERROR, "variable \"%s\" is not a pointer to a structure or a union", name);
 
                /* restore the name, we will need it later */
                *next = c;
@@ -151,7 +151,7 @@ find_struct(char *name, char *next, char *end)
                if (next == end)
                {
                        if (p->type->type != ECPGt_struct && p->type->type != ECPGt_union)
-                               mmerror(PARSE_ERROR, ET_FATAL, "variable \"%s\" is neither a structure nor a union", name);
+                               mmfatal(PARSE_ERROR, "variable \"%s\" is neither a structure nor a union", name);
 
                        /* restore the name, we will need it later */
                        *next = c;
@@ -161,10 +161,10 @@ find_struct(char *name, char *next, char *end)
                else
                {
                        if (p->type->type != ECPGt_array)
-                               mmerror(PARSE_ERROR, ET_FATAL, "variable \"%s\" is not an array", name);
+                               mmfatal(PARSE_ERROR, "variable \"%s\" is not an array", name);
 
                        if (p->type->u.element->type != ECPGt_struct && p->type->u.element->type != ECPGt_union)
-                               mmerror(PARSE_ERROR, ET_FATAL, "variable \"%s\" is not a pointer to a structure or a union", name);
+                               mmfatal(PARSE_ERROR, "variable \"%s\" is not a pointer to a structure or a union", name);
 
                        /* restore the name, we will need it later */
                        *next = c;
@@ -230,7 +230,7 @@ find_variable(char *name)
                                *next = '\0';
                                p = find_simple(name);
                                if (p == NULL)
-                                       mmerror(PARSE_ERROR, ET_FATAL, "variable \"%s\" is not declared", name);
+                                       mmfatal(PARSE_ERROR, "variable \"%s\" is not declared", name);
 
                                *next = c;
                                switch (p->type->u.element->type)
@@ -252,7 +252,7 @@ find_variable(char *name)
                p = find_simple(name);
 
        if (p == NULL)
-               mmerror(PARSE_ERROR, ET_FATAL, "variable \"%s\" is not declared", name);
+               mmfatal(PARSE_ERROR, "variable \"%s\" is not declared", name);
 
        return (p);
 }
@@ -497,7 +497,7 @@ get_typedef(char *name)
 
        for (this = types; this && strcmp(this->name, name) != 0; this = this->next);
        if (!this)
-               mmerror(PARSE_ERROR, ET_FATAL, "unrecognized data type name \"%s\"", name);
+               mmfatal(PARSE_ERROR, "unrecognized data type name \"%s\"", name);
 
        return (this);
 }
@@ -508,7 +508,7 @@ adjust_array(enum ECPGttype type_enum, char **dimension, char **length, char *ty
        if (atoi(type_index) >= 0)
        {
                if (atoi(*length) >= 0)
-                       mmerror(PARSE_ERROR, ET_FATAL, "multidimensional arrays are not supported");
+                       mmfatal(PARSE_ERROR, "multidimensional arrays are not supported");
 
                *length = type_index;
        }
@@ -516,7 +516,7 @@ adjust_array(enum ECPGttype type_enum, char **dimension, char **length, char *ty
        if (atoi(type_dimension) >= 0)
        {
                if (atoi(*dimension) >= 0 && atoi(*length) >= 0)
-                       mmerror(PARSE_ERROR, ET_FATAL, "multidimensional arrays are not supported");
+                       mmfatal(PARSE_ERROR, "multidimensional arrays are not supported");
 
                if (atoi(*dimension) >= 0)
                        *length = *dimension;
@@ -525,18 +525,18 @@ adjust_array(enum ECPGttype type_enum, char **dimension, char **length, char *ty
        }
 
        if (pointer_len > 2)
-               mmerror(PARSE_ERROR, ET_FATAL, ngettext("multilevel pointers (more than 2 levels) are not supported; found %d level",
+               mmfatal(PARSE_ERROR, ngettext("multilevel pointers (more than 2 levels) are not supported; found %d level",
                                                                                                "multilevel pointers (more than 2 levels) are not supported; found %d levels", pointer_len),
                                pointer_len);
 
        if (pointer_len > 1 && type_enum != ECPGt_char && type_enum != ECPGt_unsigned_char && type_enum != ECPGt_string)
-               mmerror(PARSE_ERROR, ET_FATAL, "pointer to pointer is not supported for this data type");
+               mmfatal(PARSE_ERROR, "pointer to pointer is not supported for this data type");
 
        if (pointer_len > 1 && (atoi(*length) >= 0 || atoi(*dimension) >= 0))
-               mmerror(PARSE_ERROR, ET_FATAL, "multidimensional arrays are not supported");
+               mmfatal(PARSE_ERROR, "multidimensional arrays are not supported");
 
        if (atoi(*length) >= 0 && atoi(*dimension) >= 0 && pointer_len)
-               mmerror(PARSE_ERROR, ET_FATAL, "multidimensional arrays are not supported");
+               mmfatal(PARSE_ERROR, "multidimensional arrays are not supported");
 
        switch (type_enum)
        {
@@ -550,7 +550,7 @@ adjust_array(enum ECPGttype type_enum, char **dimension, char **length, char *ty
                        }
 
                        if (atoi(*length) >= 0)
-                               mmerror(PARSE_ERROR, ET_FATAL, "multidimensional arrays for structures are not supported");
+                               mmfatal(PARSE_ERROR, "multidimensional arrays for structures are not supported");
 
                        break;
                case ECPGt_varchar:
@@ -611,7 +611,7 @@ adjust_array(enum ECPGttype type_enum, char **dimension, char **length, char *ty
                        }
 
                        if (atoi(*length) >= 0)
-                               mmerror(PARSE_ERROR, ET_FATAL, "multidimensional arrays for simple data types are not supported");
+                               mmfatal(PARSE_ERROR, "multidimensional arrays for simple data types are not supported");
 
                        break;
        }