Build this from contrib/ now.

This commit is contained in:
Mark Murray 1999-09-04 09:52:36 +00:00
parent f9ce010afd
commit d8f5c86825
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=50881
20 changed files with 10 additions and 1264 deletions

View file

@ -1,14 +1,18 @@
# $FreeBSD$
LIB= com_err
SRCS= com_err.c error_message.c et_name.c init_et.c
SRCS= com_err.c error.c
MAN3= com_err.3
COM_ERRDIR= ${.CURDIR}/../../contrib/com_err
CFLAGS+= -I${COM_ERRDIR}
SUBDIR= doc
beforeinstall:
${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 ${.CURDIR}/com_err.h \
${DESTDIR}/usr/include
${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
${COM_ERRDIR}/com_err.h ${COM_ERRDIR}/com_right.h \
${DESTDIR}/usr/include
.include <bsd.lib.mk>
.PATH: ${COM_ERRDIR}

View file

@ -1,96 +0,0 @@
.\" Copyright (c) 1988 Massachusetts Institute of Technology,
.\" Student Information Processing Board. All rights reserved.
.\"
.\" $FreeBSD$
.\"
.TH COM_ERR 3 "22 Nov 1988" SIPB
.SH NAME
com_err \- common error display routine
.SH SYNOPSIS
.nf
#include <com_err.h>
.PP
void com_err (whoami, code, format, ...);
const char *whoami;
long code;
const char *format;
.PP
proc = set_com_err_hook (proc);
.fi
void (*
.I proc
) (const char *, long, const char *, va_list);
.nf
.PP
proc = reset_com_err_hook ();
.PP
void initialize_XXXX_error_table ();
.fi
.SH DESCRIPTION
.I Com_err
displays an error message on the standard error stream
.I stderr
(see
.IR stdio (3S))
composed of the
.I whoami
string, which should specify the program name or some subportion of
a program, followed by an error message generated from the
.I code
value (derived from
.IR compile_et (1)),
and a string produced using the
.I format
string and any following arguments, in the same style as
.IR fprintf (3).
The behavior of
.I com_err
can be modified using
.I set_com_err_hook;
this defines a procedure which is called with the arguments passed to
.I com_err,
instead of the default internal procedure which sends the formatted
text to error output. Thus the error messages from a program can all
easily be diverted to another form of diagnostic logging, such as
.IR syslog (3).
.I Reset_com_err_hook
may be used to restore the behavior of
.I com_err
to its default form. Both procedures return the previous ``hook''
value. These ``hook'' procedures must have the declaration given for
.I proc
above in the synopsis.
The
.I initialize_XXXX_error_table
routine is generated mechanically by
.IR compile_et (1)
from a source file containing names and associated strings. Each
table has a name of up to four characters, which is used in place of
the
.B XXXX
in the name of the routine. These routines should be called before
any of the corresponding error codes are used, so that the
.I com_err
library will recognize error codes from these tables when they are
used.
The
.B com_err.h
header file should be included in any source file that uses routines
from the
.I com_err
library; executable files must be linked using
.I ``-lcom_err''
in order to cause the
.I com_err
library to be included.
.\" .IR for manual entries
.\" .PP for paragraph breaks
.SH "SEE ALSO"
compile_et (1), syslog (3).
Ken Raeburn, "A Common Error Description Library for UNIX".

View file

@ -1,111 +0,0 @@
/*
* Copyright 1987, 1988 by MIT Student Information Processing Board.
*
* For copyright info, see mit-sipb-copyright.h.
*/
#include <stdio.h>
#include "mit-sipb-copyright.h"
#include <stdarg.h>
#include "error_table.h"
#include "internal.h"
#include "com_err.h"
#if ! lint
static const char rcsid[] =
"$FreeBSD$";
#endif /* ! lint */
static void
#ifdef __STDC__
default_com_err_proc (const char *whoami, long code, const char *fmt, va_list args)
#else
default_com_err_proc (whoami, code, fmt, args)
const char *whoami;
long code;
const char *fmt;
va_list args;
#endif
{
if (whoami) {
fputs(whoami, stderr);
fputs(": ", stderr);
}
if (code) {
fputs(error_message(code), stderr);
fputs(" ", stderr);
}
if (fmt) {
vfprintf (stderr, fmt, args);
}
putc('\n', stderr);
/* should do this only on a tty in raw mode */
putc('\r', stderr);
fflush(stderr);
}
#ifdef __STDC__
typedef void (*errf) (const char *, long, const char *, va_list);
#else
typedef void (*errf) ();
#endif
errf com_err_hook = default_com_err_proc;
void com_err_va (whoami, code, fmt, args)
const char *whoami;
long code;
const char *fmt;
va_list args;
{
(*com_err_hook) (whoami, code, fmt, args);
}
#if ! VARARGS
void com_err (const char *whoami,
long code,
const char *fmt, ...)
{
#else
void com_err (va_alist)
va_dcl
{
const char *whoami, *fmt;
long code;
#endif
va_list pvar;
if (!com_err_hook)
com_err_hook = default_com_err_proc;
#if VARARGS
va_start (pvar);
whoami = va_arg (pvar, const char *);
code = va_arg (pvar, long);
fmt = va_arg (pvar, const char *);
#else
va_start(pvar, fmt);
#endif
com_err_va (whoami, code, fmt, pvar);
va_end(pvar);
}
errf set_com_err_hook (new_proc)
errf new_proc;
{
errf x = com_err_hook;
if (new_proc)
com_err_hook = new_proc;
else
com_err_hook = default_com_err_proc;
return x;
}
errf reset_com_err_hook () {
errf x = com_err_hook;
com_err_hook = default_com_err_proc;
return x;
}

View file

@ -1,36 +0,0 @@
/*
* Header file for common error description library.
*
* Copyright 1988, Student Information Processing Board of the
* Massachusetts Institute of Technology.
*
* For copyright and distribution info, see the documentation supplied
* with this package.
*/
#ifndef __COM_ERR_H
#ifdef __STDC__
#ifndef __HIGHC__ /* gives us STDC but not stdarg */
#include <stdarg.h>
#else
#include <varargs.h>
#endif
/* ANSI C -- use prototypes etc */
void com_err (const char *, long, const char *, ...);
char const *error_message (long);
void (*com_err_hook) (const char *, long, const char *, va_list);
void (*set_com_err_hook (void (*) (const char *, long, const char *, va_list)))
(const char *, long, const char *, va_list);
void (*reset_com_err_hook ()) (const char *, long, const char *, va_list);
#else
/* no prototypes */
void com_err ();
char *error_message ();
void (*com_err_hook) ();
void (*set_com_err_hook ()) ();
void (*reset_com_err_hook ()) ();
#endif
#define __COM_ERR_H
#endif /* ! defined(__COM_ERR_H) */

View file

@ -1,72 +0,0 @@
/*
* $FreeBSD$
* $Source: /home/ncvs/src/lib/libcom_err/error_message.c,v $
* $Locker: $
*
* Copyright 1987 by the Student Information Processing Board
* of the Massachusetts Institute of Technology
*
* For copyright info, see "mit-sipb-copyright.h".
*/
#include <stdio.h>
#include <string.h>
#include "error_table.h"
#include "mit-sipb-copyright.h"
#include "internal.h"
static const char rcsid[] =
"$FreeBSD$";
static const char copyright[] =
"Copyright 1986, 1987, 1988 by the Student Information Processing Board\nand the department of Information Systems\nof the Massachusetts Institute of Technology";
static char buffer[25];
struct et_list * _et_list = (struct et_list *) NULL;
const char * error_message (code)
long code;
{
int offset;
struct et_list *et;
int table_num;
int started = 0;
char *cp;
offset = code & ((1<<ERRCODE_RANGE)-1);
table_num = code - offset;
if (!table_num) {
if (offset < sys_nerr)
return(sys_errlist[offset]);
else
goto oops;
}
for (et = _et_list; et; et = et->next) {
if (et->table->base == table_num) {
/* This is the right table */
if (et->table->n_msgs <= offset)
goto oops;
return(et->table->msgs[offset]);
}
}
oops:
strcpy (buffer, "Unknown code ");
if (table_num) {
strcat (buffer, error_table_name (table_num));
strcat (buffer, " ");
}
for (cp = buffer; *cp; cp++)
;
if (offset >= 100) {
*cp++ = '0' + offset / 100;
offset %= 100;
started++;
}
if (started || offset >= 10) {
*cp++ = '0' + offset / 10;
offset %= 10;
}
*cp++ = '0' + offset;
*cp = '\0';
return(buffer);
}

View file

@ -1,30 +0,0 @@
/*
* Copyright 1988 by the Student Information Processing Board of the
* Massachusetts Institute of Technology.
*
* For copyright info, see mit-sipb-copyright.h.
*/
#ifndef _ET_H
/* Are we using ANSI C? */
#ifndef __STDC__
#define const
#endif
extern int errno;
struct error_table {
char const * const * msgs;
long base;
int n_msgs;
};
struct et_list {
struct et_list *next;
const struct error_table *table;
};
extern struct et_list * _et_list;
#define ERRCODE_RANGE 8 /* # of bits to shift table number */
#define BITS_PER_CHAR 6 /* # bits to shift per character in name */
extern const char *error_table_name();
#define _ET_H
#endif

View file

@ -1,43 +0,0 @@
/*
* Copyright 1987 by MIT Student Information Processing Board
*
* For copyright info, see mit-sipb-copyright.h.
*/
#include "error_table.h"
#include "mit-sipb-copyright.h"
#include "internal.h"
#ifndef lint
static const char copyright[] =
"Copyright 1987,1988 by Student Information Processing Board, Massachusetts Institute of Technology";
static const char rcsid_et_name_c[] =
"$FreeBSD$";
#endif
static const char char_set[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";
static char buf[6];
const char * error_table_name(num)
int num;
{
int ch;
int i;
char *p;
/* num = aa aaa abb bbb bcc ccc cdd ddd d?? ??? ??? */
p = buf;
num >>= ERRCODE_RANGE;
/* num = ?? ??? ??? aaa aaa bbb bbb ccc ccc ddd ddd */
num &= 077777777;
/* num = 00 000 000 aaa aaa bbb bbb ccc ccc ddd ddd */
for (i = 4; i >= 0; i--) {
ch = (num >> BITS_PER_CHAR * i) & ((1 << BITS_PER_CHAR) - 1);
if (ch != 0)
*p++ = char_set[ch-1];
}
*p = '\0';
return(buf);
}

View file

@ -1,54 +0,0 @@
/*
* $FreeBSD$
* $Source: /home/ncvs/src/lib/libcom_err/init_et.c,v $
* $Locker: $
*
* Copyright 1986, 1987, 1988 by MIT Information Systems and
* the MIT Student Information Processing Board.
*
* For copyright info, see mit-sipb-copyright.h.
*/
#include <stdio.h>
#include <stdlib.h>
#include "error_table.h"
#include "mit-sipb-copyright.h"
#ifndef __STDC__
#define const
#endif
#ifndef lint
static const char rcsid_init_et_c[] =
"$FreeBSD$";
#endif
struct foobar {
struct et_list etl;
struct error_table et;
};
extern struct et_list * _et_list;
int init_error_table(msgs, base, count)
const char * const * msgs;
int base;
int count;
{
struct foobar * new_et;
if (!base || !count || !msgs)
return 0;
new_et = (struct foobar *) malloc(sizeof(struct foobar));
if (!new_et)
return errno; /* oops */
new_et->etl.table = &new_et->et;
new_et->et.msgs = msgs;
new_et->et.base = base;
new_et->et.n_msgs= count;
new_et->etl.next = _et_list;
_et_list = &new_et->etl;
return 0;
}

View file

@ -1,18 +0,0 @@
/*
* internal include file for com_err package
*/
#include "mit-sipb-copyright.h"
#ifndef __STDC__
#undef const
#define const
#endif
extern int errno;
extern char const * const sys_errlist[];
extern /* const */ int sys_nerr;
#ifdef __STDC__
void perror (const char *);
#else
int perror ();
#endif

View file

@ -1,19 +0,0 @@
/*
Copyright 1987, 1988 by the Student Information Processing Board
of the Massachusetts Institute of Technology
Permission to use, copy, modify, and distribute this software
and its documentation for any purpose and without fee is
hereby granted, provided that the above copyright notice
appear in all copies and that both that copyright notice and
this permission notice appear in supporting documentation,
and that the names of M.I.T. and the M.I.T. S.I.P.B. not be
used in advertising or publicity pertaining to distribution
of the software without specific, written prior permission.
M.I.T. and the M.I.T. S.I.P.B. make no representations about
the suitability of this software for any purpose. It is
provided "as is" without express or implied warranty.
*/

View file

@ -1,47 +0,0 @@
#include <stdio.h>
#include <errno.h>
#include "com_err.h"
#include "test1.h"
#include "test2.h"
extern int sys_nerr, errno;
main()
{
printf("Before initiating error table:\n\n");
printf("Table name '%s'\n", error_table_name(KRB_MK_AP_TGTEXP));
printf("UNIX name '%s'\n", error_table_name(EPERM));
printf("Msg TGT-expired is '%s'\n", error_message(KRB_MK_AP_TGTEXP));
printf("Msg EPERM is '%s'\n", error_message(EPERM));
printf("Msg FOO_ERR is '%s'\n", error_message(FOO_ERR));
printf("Msg {sys_nerr-1} is '%s'\n", error_message(sys_nerr-1));
printf("Msg {sys_nerr} is '%s'\n", error_message(sys_nerr));
printf("With 0: tgt-expired -> %s\n", error_message(KRB_MK_AP_TGTEXP));
initialize_krb_error_table();
printf("KRB error table initialized: base %d (%s), name %s\n",
ERROR_TABLE_BASE_krb, error_message(ERROR_TABLE_BASE_krb),
error_table_name(ERROR_TABLE_BASE_krb));
initialize_krb_error_table();
printf("With krb: tgt-expired -> %s\n",
error_message(KRB_MK_AP_TGTEXP));
initialize_quux_error_table();
printf("QUUX error table initialized: base %d (%s), name %s\n",
ERROR_TABLE_BASE_quux, error_message(ERROR_TABLE_BASE_quux),
error_table_name(ERROR_TABLE_BASE_quux));
printf("Msg for TGT-expired is '%s'\n",
error_message(KRB_MK_AP_TGTEXP));
printf("Msg {sys_nerr-1} is '%s'\n", error_message(sys_nerr-1));
printf("Msg FOO_ERR is '%s'\n", error_message(FOO_ERR));
printf("Msg KRB_SKDC_CANT is '%s'\n",
error_message(KRB_SKDC_CANT));
printf("Msg 1e6 (8B 64) is '%s'\n", error_message(1000000));
printf("\n\nCOM_ERR tests:\n");
com_err("whoami", FOO_ERR, (char *)NULL);
com_err("whoami", FOO_ERR, " -- message goes %s", "here");
com_err("whoami", 0, (char *)0);
com_err("whoami", 0, "error number %d\n", 0);
}

View file

@ -1,69 +0,0 @@
error_table krb
error_code KRB_MK_AP_TKFIL,
"Can't read ticket file"
ec KRB_MK_AP_NOTKT,
"Can't find ticket or TGT"
ec KRB_MK_AP_TGTEXP,
"TGT expired"
ec KRB_RD_AP_UNDEC,
"Can't decode authenticator"
ec KRB_RD_AP_EXP,
"Ticket expired"
ec KRB_RD_AP_REPEAT,
"Repeated request"
ec KRB_RD_AP_NOT_US,
"The ticket isn't for us"
ec KRB_RD_AP_INCON,
"Request is inconsistent"
ec KRB_RD_AP_TIME,
"Delta-T too big"
ec KRB_RD_AP_BADD,
"Incorrect net address"
ec KRB_RD_AP_VERSION,
"Protocol version mismatch"
ec KRB_RD_AP_MSG_TYPE,
"Invalid message type"
ec KRB_RD_AP_MODIFIED,
"Message stream modified"
ec KRB_RD_AP_ORDER,
"Message out of order"
ec KRB_RD_AP_UNAUTHOR,
"Unauthorized request"
ec KRB_GT_PW_NULL,
"Current password is null"
ec KRB_GT_PW_BADPW,
"Incorrect current password"
ec KRB_GT_PW_PROT,
"Protocol error"
ec KRB_GT_PW_KDCERR,
"Error returned by KDC"
ec KRB_GT_PW_NULLTKT,
"Null ticket returned by KDC"
ec KRB_SKDC_RETRY,
"Retry count exceeded"
ec KRB_SKDC_CANT,
"Can't send request"
end

View file

@ -1,9 +0,0 @@
error_table quux
ec FOO_ERR, "foo"
ec BAR_ERR, "bar"
ec BAZ_ERR, "meow"
end

View file

@ -1,16 +1,9 @@
# $FreeBSD$
PROG= compile_et
SRCS= compile_et.c error_table.y
CFLAGS+=-I. -I${.CURDIR}/../../lib/libcom_err
LFLAGS+=-l
YFLAGS=
DPADD= ${LIBL}
LDADD= -ll
CLEANFILES= et_lex.lex.c
error_table.o: et_lex.lex.c
SRCS= compile_et.c parse.y lex.l getarg.c
CFLAGS+=-I. -I${.CURDIR}/../../contrib/com_err
.include <bsd.prog.mk>
${DEPENDFILE}: et_lex.lex.c
.PATH: ${.CURDIR}/../../contrib/com_err

View file

@ -1,78 +0,0 @@
.\" Copyright (c) 1988 Massachusetts Institute of Technology,
.\" Student Information Processing Board. All rights reserved.
.\"
.\" $FreeBSD$
.\"
.Dd November 22, 1988
.Os
.Dt COMPILE_ET 1
.Sh NAME
.Nm compile_et
.Nd error table compiler
.Sh SYNOPSIS
.Nm compile_et
.Ar file
.Sh DESCRIPTION
.Nm Compile_et
converts a table listing error-code names and associated messages into
a C source file suitable for use with the
.Xr com_err 3
library.
.Pp
The source file name must end with a suffix of ``.et''; the file
consists of a declaration supplying the name (up to four characters
long) of the error-code table:
.Em error_table name
followed by up to 256 entries of the form:
.Em error_code name ,
"
.Em string
"
and a final
.Em end
to indicate the end of the table.
.Pp
The name of the table is used to construct the name of a subroutine
.Em initialize_XXXX_error_table
which must be called in order for the
.Xr com_err 3
library to recognize the error table.
.Pp
The various error codes defined are assigned sequentially increasing
numbers (starting with a large number computed as a hash function of
the name of the table); thus for compatibility it is suggested that
new codes be added only to the end of an existing table, and that no
codes be removed from tables.
.Pp
The names defined in the table are placed into a C header file with
preprocessor directives defining them as integer constants of up to
32 bits in magnitude.
.Pp
A C source file is also generated which should be compiled and linked
with the object files which reference these error codes; it contains
the text of the messages and the initialization subroutine. Both C
files have names derived from that of the original source file, with
the ``.et'' suffix replaced by ``.c'' and ``.h''.
.Pp
A ``#'' in the source file is treated as a comment character, and all
remaining text to the end of the source line will be ignored.
.Sh BUGS
Since
.Nm compile_et
uses a very simple parser based on
.Xr yacc 1 ,
its error recovery leaves much to be desired.
.Sh "SEE ALSO"
.Xr yacc 1 ,
.Xr com_err 3
.Pp
.Rs
.%A Ken Raeburn
.%T "A Common Error Description Library for UNIX"
.Re

View file

@ -1,268 +0,0 @@
/*
*
* Copyright 1986, 1987, 1988
* by MIT Student Information Processing Board.
*
* For copyright info, see "mit-sipb-copyright.h".
*
*/
#include <err.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/file.h>
#include <sys/param.h>
#include "mit-sipb-copyright.h"
#include "compiler.h"
#ifndef __STDC__
#define const
#endif
#ifndef lint
static const char copyright[] =
"Copyright 1987,1988 by MIT Student Information Processing Board";
static const char rcsid_compile_et_c[] =
"$FreeBSD$";
#endif
extern char *gensym();
extern char *current_token;
extern int table_number, current;
char buffer[BUFSIZ];
char *table_name = (char *)NULL;
FILE *hfile, *cfile;
/* lex stuff */
extern FILE *yyin;
extern int yylineno;
char * xmalloc (size) unsigned int size; {
char * p = malloc (size);
if (!p)
err(1, NULL);
return p;
}
static int check_arg (str_list, arg) char const *const *str_list, *arg; {
while (*str_list)
if (!strcmp(arg, *str_list++))
return 1;
return 0;
}
static const char *const debug_args[] = {
"d",
"debug",
0,
};
static const char *const lang_args[] = {
"lang",
"language",
0,
};
static const char *const language_names[] = {
"C",
"K&R C",
"C++",
0,
};
static const char * const noargs_def[] = {
"#ifdef __STDC__\n",
"#define NOARGS void\n",
"#else\n",
"#define NOARGS\n",
"#define const\n",
"#endif\n\n",
0,
};
static const char *const struct_def[] = {
"struct error_table {\n",
" char const * const * msgs;\n",
" long base;\n",
" int n_msgs;\n",
"};\n",
"struct et_list {\n",
" struct et_list *next;\n",
" const struct error_table * table;\n",
"};\n",
"extern struct et_list *_et_list;\n",
"\n", 0,
};
static const char warning[] =
"/*\n * %s:\n * This file is automatically generated; please do not edit it.\n */\n";
/* pathnames */
char c_file[MAXPATHLEN]; /* output file */
char h_file[MAXPATHLEN]; /* output */
static void usage () {
fprintf (stderr, "usage: compile_et ERROR_TABLE\n");
exit (1);
}
static void dup_err (type, one, two) char const *type, *one, *two; {
warnx("multiple %s specified: `%s' and `%s'", type, one, two);
usage ();
}
int main (argc, argv) int argc; char **argv; {
char *p, *ename;
int len;
char const * const *cpp;
int got_language = 0;
/* argument parsing */
debug = 0;
filename = 0;
while (argv++, --argc) {
char *arg = *argv;
if (arg[0] != '-') {
if (filename)
dup_err ("filenames", filename, arg);
filename = arg;
}
else {
arg++;
if (check_arg (debug_args, arg))
debug++;
else if (check_arg (lang_args, arg)) {
got_language++;
arg = *++argv, argc--;
if (!arg)
usage ();
if (language)
dup_err ("languages", language_names[(int)language], arg);
#define check_lang(x,v) else if (!strcasecmp(arg,x)) language = v
check_lang ("c", lang_C);
check_lang ("ansi_c", lang_C);
check_lang ("ansi-c", lang_C);
check_lang ("krc", lang_KRC);
check_lang ("kr_c", lang_KRC);
check_lang ("kr-c", lang_KRC);
check_lang ("k&r-c", lang_KRC);
check_lang ("k&r_c", lang_KRC);
check_lang ("c++", lang_CPP);
check_lang ("cplusplus", lang_CPP);
check_lang ("c-plus-plus", lang_CPP);
#undef check_lang
else {
errx(1, "unknown language name `%s'\n\tpick one of: C K&R-C", arg);
}
}
else {
warnx("unknown control argument -`%s'", arg);
usage ();
}
}
}
if (!filename)
usage ();
if (!got_language)
language = lang_KRC;
else if (language == lang_CPP) {
errx(1, "sorry, C++ support is not yet finished");
}
p = xmalloc (strlen (filename) + 5);
strcpy (p, filename);
filename = p;
p = strrchr(filename, '/');
if (p == (char *)NULL)
p = filename;
else
p++;
ename = p;
len = strlen (ename);
p += len - 3;
if (strcmp (p, ".et"))
p += 3;
*p++ = '.';
/* now p points to where "et" suffix should start */
/* generate new filenames */
strcpy (p, "c");
strcpy (c_file, ename);
*p = 'h';
strcpy (h_file, ename);
strcpy (p, "et");
yyin = fopen(filename, "r");
if (!yyin) {
perror(filename);
exit(1);
}
hfile = fopen(h_file, "w");
if (hfile == (FILE *)NULL) {
perror(h_file);
exit(1);
}
fprintf (hfile, warning, h_file);
cfile = fopen(c_file, "w");
if (cfile == (FILE *)NULL) {
perror(c_file);
exit(1);
}
fprintf (cfile, warning, c_file);
/* prologue */
for (cpp = noargs_def; *cpp; cpp++) {
fputs (*cpp, cfile);
fputs (*cpp, hfile);
}
fputs("static const char * const text[] = {\n", cfile);
/* parse it */
yyparse();
fclose(yyin); /* bye bye input file */
fputs (" 0\n};\n\n", cfile);
for (cpp = struct_def; *cpp; cpp++)
fputs (*cpp, cfile);
fprintf(cfile,
"static const struct error_table et = { text, %dL, %d };\n\n",
table_number, current);
fputs("static struct et_list link = { 0, 0 };\n\n",
cfile);
fprintf(cfile, "void initialize_%s_error_table (NOARGS) {\n",
table_name);
fputs(" if (!link.table) {\n", cfile);
fputs(" link.next = _et_list;\n", cfile);
fputs(" link.table = &et;\n", cfile);
fputs(" _et_list = &link;\n", cfile);
fputs(" }\n", cfile);
fputs("}\n", cfile);
fclose(cfile);
fprintf (hfile, "extern void initialize_%s_error_table (NOARGS);\n",
table_name);
fprintf (hfile, "#define ERROR_TABLE_BASE_%s (%dL)\n",
table_name, table_number);
/* compatibility... */
fprintf (hfile, "\n/* for compatibility with older versions... */\n");
fprintf (hfile, "#define init_%s_err_tbl initialize_%s_error_table\n",
table_name, table_name);
fprintf (hfile, "#define %s_err_base ERROR_TABLE_BASE_%s\n", table_name,
table_name);
fclose(hfile); /* bye bye include file */
return 0;
}
int yyerror(s) char *s; {
fputs(s, stderr);
fprintf(stderr, "\nLine number %d; last token was '%s'\n",
yylineno, current_token);
return 0;
}

View file

@ -1,19 +0,0 @@
/*
* definitions common to the source files of the error table compiler
*/
#ifndef __STDC__
/* loser */
#undef const
#define const
#endif
enum lang {
lang_C, /* ANSI C (default) */
lang_KRC, /* C: ANSI + K&R */
lang_CPP /* C++ */
};
int debug; /* dump debugging info? */
char *filename; /* error table source */
enum lang language;

View file

@ -1,237 +0,0 @@
%{
#include <stdio.h>
#include <stdlib.h>
char *str_concat(), *ds(), *quote();
char *current_token = (char *)NULL;
extern char *table_name;
%}
%union {
char *dynstr;
}
%token ERROR_TABLE ERROR_CODE_ENTRY END
%token <dynstr> STRING QUOTED_STRING
%type <dynstr> ec_name description table_id
%{
%}
%start error_table
%%
error_table : ERROR_TABLE table_id error_codes END
{ table_name = ds($2);
current_token = table_name;
put_ecs(); }
;
table_id : STRING
{ current_token = $1;
set_table_num($1);
$$ = $1; }
;
error_codes : error_codes ec_entry
| ec_entry
;
ec_entry : ERROR_CODE_ENTRY ec_name ',' description
{ add_ec($2, $4);
free($2);
free($4); }
| ERROR_CODE_ENTRY ec_name '=' STRING ',' description
{ add_ec_val($2, $4, $6);
free($2);
free($4);
free($6);
}
;
ec_name : STRING
{ $$ = ds($1);
current_token = $$; }
;
description : QUOTED_STRING
{ $$ = ds($1);
current_token = $$; }
;
%%
/*
*
* Copyright 1986, 1987 by the MIT Student Information Processing Board
*
* For copyright info, see mit-sipb-copyright.h.
*/
#include <string.h>
#include <assert.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/time.h>
#include "internal.h"
#include "error_table.h"
#include "mit-sipb-copyright.h"
#ifndef lint
static char const rcsid_error_table_y[] =
"$FreeBSD$";
#endif
void *malloc(), *realloc();
extern FILE *hfile, *cfile;
static long gensym_n = 0;
char *
gensym(x)
char const *x;
{
char *symbol;
if (!gensym_n) {
struct timeval tv;
struct timezone tzp;
gettimeofday(&tv, &tzp);
gensym_n = (tv.tv_sec%10000)*100 + tv.tv_usec/10000;
}
symbol = malloc(32 * sizeof(char));
gensym_n++;
sprintf(symbol, "et%ld", gensym_n);
return(symbol);
}
char *
ds(string)
char const *string;
{
char *rv;
rv = malloc(strlen(string)+1);
strcpy(rv, string);
return(rv);
}
char *
quote(string)
char const *string;
{
char *rv;
rv = malloc(strlen(string)+3);
strcpy(rv, "\"");
strcat(rv, string);
strcat(rv, "\"");
return(rv);
}
long table_number;
int current = 0;
char **error_codes = (char **)NULL;
void
add_ec(name, description)
char const *name, *description;
{
fprintf(cfile, "\t\"%s\",\n", description);
if (error_codes == (char **)NULL) {
error_codes = (char **)malloc(sizeof(char *));
*error_codes = (char *)NULL;
}
error_codes = (char **)realloc((char *)error_codes,
(current + 2)*sizeof(char *));
error_codes[current++] = ds(name);
error_codes[current] = (char *)NULL;
}
void
add_ec_val(name, val, description)
char const *name, *val, *description;
{
const int ncurrent = atoi(val);
if (ncurrent < current) {
printf("Error code %s (%d) out of order", name,
current);
return;
}
while (ncurrent > current)
fputs("\t(char *)NULL,\n", cfile), current++;
fprintf(cfile, "\t\"%s\",\n", description);
if (error_codes == (char **)NULL) {
error_codes = (char **)malloc(sizeof(char *));
*error_codes = (char *)NULL;
}
error_codes = (char **)realloc((char *)error_codes,
(current + 2)*sizeof(char *));
error_codes[current++] = ds(name);
error_codes[current] = (char *)NULL;
}
void
put_ecs()
{
int i;
for (i = 0; i < current; i++) {
if (error_codes[i] != (char *)NULL)
fprintf(hfile, "#define %-40s (%ldL)\n",
error_codes[i], table_number + i);
}
}
/*
* char_to_num -- maps letters and numbers into a small numbering space
* uppercase -> 1-26
* lowercase -> 27-52
* digits -> 53-62
* underscore-> 63
*/
static const char char_set[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";
int char_to_num(c)
char c;
{
const char *where;
int diff;
where = strchr (char_set, c);
if (where) {
diff = where - char_set + 1;
assert (diff < (1 << ERRCODE_RANGE));
return diff;
}
else if (isprint (c))
fprintf (stderr,
"Illegal character `%c' in error table name\n",
c);
else
fprintf (stderr,
"Illegal character %03o in error table name\n",
c);
exit (1);
}
void
set_table_num(string)
char *string;
{
if (char_to_num (string[0]) > char_to_num ('z')) {
fprintf (stderr, "%s%s%s%s",
"First character of error table name must be ",
"a letter; name ``",
string, "'' rejected\n");
exit (1);
}
if (strlen(string) > 4) {
fprintf(stderr, "Table name %s too long, truncated ",
string);
string[4] = '\0';
fprintf(stderr, "to %s\n", string);
}
while (*string != '\0') {
table_number = (table_number << BITS_PER_CHAR)
+ char_to_num(*string);
string++;
}
table_number = table_number << ERRCODE_RANGE;
}
#include "et_lex.lex.c"

View file

@ -1,26 +0,0 @@
PC [^\"]
AN [A-Z_a-z0-9]
%%
error_table return ERROR_TABLE;
et return ERROR_TABLE;
error_code return ERROR_CODE_ENTRY;
ec return ERROR_CODE_ENTRY;
end return END;
[\t\n ] ;
\"{PC}*\" { register char *p; yylval.dynstr = ds(yytext+1);
if ( (p=rindex(yylval.dynstr, '"')) ) *p='\0';
return QUOTED_STRING;
}
{AN}* { yylval.dynstr = ds(yytext); return STRING; }
#.*\n ;
. { return (*yytext); }
%%
#ifndef lint
static char rcsid_et_lex_lex_l[] = "$FreeBSD$";
#endif

View file

@ -1,19 +0,0 @@
/*
Copyright 1987, 1988 by the Student Information Processing Board
of the Massachusetts Institute of Technology
Permission to use, copy, modify, and distribute this software
and its documentation for any purpose and without fee is
hereby granted, provided that the above copyright notice
appear in all copies and that both that copyright notice and
this permission notice appear in supporting documentation,
and that the names of M.I.T. and the M.I.T. S.I.P.B. not be
used in advertising or publicity pertaining to distribution
of the software without specific, written prior permission.
M.I.T. and the M.I.T. S.I.P.B. make no representations about
the suitability of this software for any purpose. It is
provided "as is" without express or implied warranty.
*/