slidescript/src/eprintf.c

260 lines
11 KiB
C

/* ------------------------------------------------------------ */
/* file information */
/* ------------------------------------------------------------ */
// Filename: eprintf.c
// Purpose: TTY and error-message routines
// License: MIT/X. (c) OldCoder (Robert Kiraly) 1987-2022.
/* ------------------------------------------------------------ */
/* header files */
/* ------------------------------------------------------------ */
/* The "EPRINTF_P" definition used below suppresses some of the */
/* prototypes in "x3file.h" locally. This allows us to imple- */
/* ment variable-length argument lists in a non-standard (but */
/* generally portable) fashion. */
#define EPRINTF_P /* see explanation above */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "inc/eprintf.h"
/* ------------------------------------------------------------ */
/* functions */
/* ------------------------------------------------------------ */
/* Function: V_FUNC init_tty(NO_PARAM) */
/* Summary: Initializes the UX3 TTY flags. */
/* ------------------------------------------------------------ */
/* "init_tty()" sets three global character variables as fol- */
/* lows: */
/* */
/* tty_in -- standard input stream TTY mode */
/* tty_out -- standard output stream TTY mode */
/* tty_err -- standard error stream TTY mode */
/* TTY modes are determined by the standard library function */
/* "isatty()". */
/* E.g., "init_tty()" sets these three flags true if and only */
/* if the associated streams are console devices. */
/* The global character variable "tty_set" flags the TTY */
/* initialization status. "tty_set" is true if "init_tty()" */
/* has been called previously. */
/* ------------------------------------------------------------ */
V_FUNC init_tty (NO_PARAM)
{
tty_in = isatty (0); /* standard-input TTY flag */
tty_out = isatty (1); /* standard-output TTY flag */
tty_err = isatty (2); /* standard-error TTY flag */
tty_set = TRUE; /* TTY initialization flag */
}
/* ------------------------------------------------------------ */
/* "eprintf(s,...)" accepts a "printf()"-style argument list, */
/* writes the specified message to the standard error stream, */
/* and flushes the stream. */
/* This function may be system-dependent. */
/* ------------------------------------------------------------ */
V_FUNC eprintf (s,a,b,c,d,e,f,g,h,i,j)
char *s; /* format string */
unsigned long a,b,c,d,e,f,g,h,i,j; /* dummy arguments */
{
fflush (stdout); /* flush standard output stream */
fprintf (stderr, /* print message to the */
s,a,b,c,d,e,f,g,h,i,j); /* standard error stream */
fflush (stderr); /* flush standard error stream */
}
/* ------------------------------------------------------------ */
/* "eprintf2(s,...)" accepts a "printf()"-style argument list, */
/* writes the specified message to the standard error stream, */
/* and flushes the stream. */
/* If the standard output and standard error TTY modes are */
/* different, "eprintf2()" will write the message to the */
/* standard output stream as well. TTY modes are determined by */
/* the standard library function "isatty()". */
/* This function may be system-dependent. */
/* ------------------------------------------------------------ */
V_FUNC eprintf2 (s,a,b,c,d,e,f,g,h,i,j)
char *s; /* format string */
unsigned long a,b,c,d,e,f,g,h,i,j; /* dummy arguments */
{
fflush (stdout); /* flush standard output stream */
fprintf (stderr, /* print message to the */
s,a,b,c,d,e,f,g,h,i,j); /* standard error stream */
fflush (stderr); /* flush standard error stream */
if (!tty_set) init_tty(); /* initialize TTY mode flags */
if (tty_out == tty_err) /* split the error stream? */
{ /* no */
return; /* done - exit */
}
fprintf (stdout, /* print message to the stan- */
s,a,b,c,d,e,f,g,h,i,j); /* dard output stream */
fflush (stdout); /* flush standard output stream */
}
/* ------------------------------------------------------------ */
/* "z_msg(t_flag,pf,s,...)" accepts the following arguments: */
/* */
/* t_flag -- terminate-caller flag */
/* pf -- prefix-string pointer */
/* s, ... -- "printf()"-style argument list */
/* "z_msg()" writes the specified "printf()"-style message to */
/* the standard error stream, appends a newline, and flushes */
/* the stream. */
/* If the standard output and standard error TTY modes are */
/* different, "z_msg()" will write the message to the standard */
/* output stream as well. TTY modes are determined by the */
/* standard library function "isatty()". */
/* If the prefix-string pointer "pf" is not NULL, "z_msg()" */
/* prepends the specified string to the message produced. */
/* If the terminate-caller flag "t_flag" is true (nonzero), */
/* "z_msg()" terminates the caller upon completion. */
/* This function may be system-dependent. */
/* ------------------------------------------------------------ */
MODPRIV V_FUNC z_msg(t_flag,pf,s,a,b,c,d,e,f,g,h,i,j)
int t_flag; /* terminate-caller flag */
char *pf; /* prefix pointer (or NULL) */
char *s; /* format string */
unsigned long a,b,c,d,e,f,g,h,i,j; /* dummy arguments */
{
if ((pf != NULLCP) && (*pf != CH_EOS)) eprintf2 ("%s",pf);
eprintf2 (s,a,b,c,d,e,f,g,h,i,j);
eprintf2 ("\n"); /* append a newline */
if (t_flag) exit (ONE); /* terminate the caller */
}
/* ------------------------------------------------------------ */
/* "x_warn(s,...)" accepts a "printf()"-style argument list */
/* and writes an warning message based on the argument list to */
/* the standard error stream. */
/* If the standard output and standard error TTY modes are */
/* different, "x_warn()" will write the message to the standard */
/* output stream as well. TTY modes are determined by the */
/* standard library function "isatty()". */
/* This function may be system-dependent. */
/* ------------------------------------------------------------ */
V_FUNC x_warn(s,a,b,c,d,e,f,g,h,i,j)
char *s; /* format string */
unsigned long a,b,c,d,e,f,g,h,i,j; /* dummy arguments */
{
z_msg (FALSE, ":", s,a,b,c,d,e,f,g,h,i,j);
}
/* ------------------------------------------------------------ */
/* "x_error(s,...)" accepts a "printf()"-style argument list, */
/* writes an error message based on the argument list to the */
/* standard error stream, and terminates the caller. */
/* If the standard output and standard error TTY modes are */
/* different, "x_error()" will write the message to the */
/* standard output stream as well. TTY modes are determined by */
/* the standard library function "isatty()". */
/* This function may be system-dependent. */
/* ------------------------------------------------------------ */
V_FUNC x_error(s,a,b,c,d,e,f,g,h,i,j)
char *s; /* format string */
long a,b,c,d,e,f,g,h,i,j; /* dummy arguments */
{
z_msg (TRUE, ":", s,a,b,c,d,e,f,g,h,i,j);
}
/* ------------------------------------------------------------ */
/* "x_panic(s,...)" accepts a "printf()"-style argument list, */
/* writes an error message based on the argument list to the */
/* standard error stream, and terminates the caller. */
/* If the standard output and standard error TTY modes are */
/* different, "x_panic" will write the message to the standard */
/* output stream as well. TTY modes are determined by the */
/* standard library function "isatty()". */
/* "x_panic" is called primarily to handle internal consistency */
/* errors. */
/* This function may be system-dependent. */
/* ------------------------------------------------------------ */
V_FUNC x_panic (s,a,b,c,d,e,f,g,h,i,j)
char *s; /* format string */
unsigned long a,b,c,d,e,f,g,h,i,j; /* dummy arguments */
{
z_msg (TRUE, "INTERNAL ERROR! :",
s,a,b,c,d,e,f,g,h,i,j);
}
/* ------------------------------------------------------------ */
/* "n_panic(n)" prints an error message of the following form */
/* and terminates the caller: */
/* */
/* Internal error: #123 */
/* The integer "n" is used for the "#..." portion of the */
/* message. */
/* "n_panic()" writes the message to the standard error stream. */
/* If the standard output and standard error TTY modes are */
/* different, "n_panic()" will write the message to the stan- */
/* dard output stream as well. TTY modes are determined by the */
/* standard library function "isatty()". */
/* "n_panic()" is called primarily to handle internal con- */
/* sistency errors. */
/* This function may be system-dependent. */
/* ------------------------------------------------------------ */
V_FUNC n_panic(n)
REG_VAR int n; /* "panic" number */
{
x_panic ("#%d",n,0,0,0,0,0,0,0,0,0);
}