/********************************************
copyright 1991, Michael D. Brennan
This is a source file for mawk, an implementation of
the AWK programming language.
Mawk is distributed without warranty under the terms of
the GNU General Public License, version 2, 1991.
********************************************/
* Revision 5.1 91/12/05 07:55:48 brennan
static void PROTO( rt_where
, (void) ) ;
static void PROTO( unexpected_char
, (void) ) ;
static void PROTO( missing
, (int, char *, int) ) ;
static char *PROTO( type_to_str
, (int) ) ;
extern int NR_flag
; /* on if tracking NR */
static struct token_str
{
char *str
; } token_str
[] = {
INC_or_DEC
, string_buff
,
/* if paren_cnt >0 and we see one of these, we are missing a ')' */
static int missing_rparen
[] =
{ EOF
, NL
, SEMI_COLON
, SC_FAKE_SEMI_COLON
, RBRACE
, 0 } ;
static int missing_rbrace
[] =
{ EOF
, BEGIN
, END
, 0 } ;
static void missing( c
, n
, ln
)
{ s0
= pfile_name
; s1
= ": " ; }
errmsg(0, "%s%sline %u: missing %c near %s" ,s0
, s1
, ln
, c
, n
) ;
char *s
; /* we won't use s as input
(yacc and bison force this).
We will use s for storage to keep lint or the compiler
for ( p
= token_str
; p
->token
; p
++ )
if ( current_token
== p
->token
)
if ( ! s
) /* search the keywords */
s
= find_kw_str(current_token
) ;
for( ip
= missing_rparen
; *ip
; ip
++)
if ( *ip
== current_token
)
{ missing(')', s
, token_lineno
) ;
for( ip
= missing_rbrace
; *ip
; ip
++)
if ( *ip
== current_token
)
{ missing('}', s
, token_lineno
) ;
compile_error("syntax error at or near %s", s
) ;
"syntax error in decimal constant %s",
"syntax error at or near /%s/",
compile_error("syntax error") ;
if ( ++compile_error_count
== MAX_COMPILE_ERRORS
) mawk_exit(1) ;
/* system provided errnos and messages */
#ifndef MSDOS_MSC /* don't need the declarations */
#ifndef THINK_C /* don't WANT the declarations */
extern char *sys_errlist
[] ;
/* generic error message with a hook into the system error
messages if errnum > 0 */
void errmsg(int errnum
, char *format
, ...)
fprintf(stderr
, "%s: " , progname
) ;
(void) vfprintf(stderr
, format
, args
) ;
fprintf(stderr
, " (%s)" , strerror(errnum
) ) ;
if ( errnum
> 0 && errnum
< sys_nerr
)
fprintf(stderr
, " (%s)" , sys_errlist
[errnum
]) ;
void compile_error(char *format
, ...)
/* with multiple program files put program name in
{ s0
= pfile_name
; s1
= ": " ; }
fprintf(stderr
, "%s: %s%sline %u: " , progname
, s0
, s1
,token_lineno
) ;
vfprintf(stderr
, format
, args
) ;
if ( ++compile_error_count
== MAX_COMPILE_ERRORS
) mawk_exit(1) ;
void rt_error( char *format
, ...)
fprintf(stderr
, "%s: run time error: " , progname
) ;
vfprintf(stderr
, format
, args
) ;
/* void errmsg(errnum, format, ...) */
fprintf(stderr
, "%s: " , progname
) ;
errnum
= va_arg(ap
, int) ;
format
= va_arg(ap
, char *) ;
(void) vfprintf(stderr
, format
, ap
) ;
fprintf(stderr
, " (%s)" , strerror(errnum
) ) ;
if ( errnum
> 0 && errnum
< sys_nerr
)
fprintf(stderr
, " (%s)" , sys_errlist
[errnum
]) ;
void compile_error( va_alist
)
if ( pfile_name
) /* print program filename too */
{ s0
= pfile_name
; s1
= ": " ; }
fprintf(stderr
, "%s: %s%sline %u: " , progname
, s0
, s1
,token_lineno
) ;
format
= va_arg(args
, char *) ;
vfprintf(stderr
, format
, args
) ;
if ( ++compile_error_count
== MAX_COMPILE_ERRORS
) mawk_exit(1) ;
void rt_error( va_alist
)
fprintf(stderr
, "%s: run time error: " , progname
) ;
format
= va_arg(args
, char *) ;
vfprintf(stderr
, format
, args
) ;
{ errmsg(0, "bozo: %s" , s
) ; mawk_exit(1) ; }
char *s
; unsigned size
;
{ errmsg(0 , "program limit exceeded: %s size=%u", s
, size
) ;
/* print as much as we know about where a rt error occured */
if ( FILENAME
->type
!= C_STRING
) cast1_to_s(FILENAME
) ;
if ( TEST2(NR
) != TWO_DOUBLES
) cast2_to_d(NR
) ;
fprintf(stderr
, "\tFILENAME=\"%s\"", string(FILENAME
)->str
) ;
fprintf(stderr
, " FNR=%g NR=%g" , FNR
->dval
, NR
->dval
) ;
void rt_overflow(s
, size
)
char *s
; unsigned size
;
errmsg(0 , "program limit exceeded: %s size=%u", s
, size
) ;
static void unexpected_char()
fprintf(stderr
, "%s: %u: ", progname
, token_lineno
) ;
fprintf(stderr
, "unexpected character '%c'\n" , c
) ;
fprintf(stderr
, "unexpected character 0x%02x\n" , c
) ;
static char *type_to_str( type
)
case ST_VAR
: retval
= "variable" ; break ;
case ST_ARRAY
: retval
= "array" ; break ;
case ST_FUNCT
: retval
= "function" ; break ;
case ST_LOCAL_VAR
: retval
= "local variable" ; break ;
case ST_LOCAL_ARRAY
: retval
= "local array" ; break ;
default : bozo("type_to_str") ;
/* emit an error message about a type clash */
{ compile_error("illegal reference to %s %s",
type_to_str(p
->type
) , p
->name
) ;