windows-nt/Source/XPSP1/NT/sdktools/asn1/asn1c/error.c
2020-09-26 16:20:57 +08:00

94 lines
2.5 KiB
C

/* Copyright (C) Boris Nikolaus, Germany, 1996-1997. All rights reserved. */
/* Copyright (C) Microsoft Corporation, 1997-1998. All rights reserved. */
#include "precomp.h"
#include "error.h"
/* MyAbort by an error message */
void
error(int errornr, LLPOS *pos)
{
char errbuf[256];
switch (errornr) {
case E_systemerror:
strcpy(errbuf, strerror(errno));
break;
case E_COMPONENTS_OF_in_extension:
strcpy(errbuf, "`COMPONENTS OF' may not be used in extensions");
break;
case E_applied_COMPONENTS_OF_to_bad_type:
strcpy(errbuf, "`COMPONENTS OF' must be applied to SEQUENCE/SET/CHOICE type");
break;
case E_COMPONENTS_OF_extended_type:
strcpy(errbuf, "`COMPONENTS OF' can only be applied to unextended types");
break;
case E_bad_component_in_selectiontype:
strcpy(errbuf, "unknown component in selection type");
break;
case E_selection_of_bad_type:
strcpy(errbuf, "selection type can only be applied to SEQUENCE/SET/CHOICE types");
break;
case E_recursive_type_definition:
strcpy(errbuf, "recursive type definition, introduce --<POINTER>-- to break recursion");
break;
case E_undefined_typereference:
strcpy(errbuf, "undefined type reference");
break;
case E_unterminated_string:
strcpy(errbuf, "unterminated string constant");
break;
case E_bad_character:
strcpy(errbuf, "bad character in file");
break;
case E_duplicate_tag:
strcpy(errbuf, "duplicate tag in sequence/set/choice type");
break;
case E_bad_directive:
strcpy(errbuf, "directive does not fit to given type");
break;
case E_constraint_too_complex:
strcpy(errbuf, "constraint is too complex");
break;
default:
sprintf(errbuf, "unknown error 0x%x", errornr);
break;
}
ASSERT(0);
llerror(stderr, pos, "%s", errbuf);
/*NOTREACHED*/
}
/* print an error message: */
/* print the file name, the line number, the line and mark the column where */
/* the error occured and terminate unsuccessful */
void
llverror(FILE *f, LLPOS *pos, char *fmt, va_list args)
{
char *p, *q;
int i;
if (pos) {
p = file;
for (i = 1; i < pos->line; i++) {
p = strchr(p, '\n');
if (!p)
break;
p++;
}
if (pos && pos->file)
fprintf(f, "File %s, line %d:\n", pos->file, pos->line);
if (p && (q = strchr(p, '\n'))) {
if (q[-1] == '\r')
q--;
fprintf(f, "%.*s\n", q - p, p);
for (i = 0; i < pos->column - 1; i++)
putc(p[i] == '\t' ? '\t' : ' ', f);
fprintf(f, "^ ");
}
}
vfprintf(f, fmt, args);
putc('\n', f);
MyExit(1);
}