|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T i
Length: 11198 (0x2bbe)
Types: TextFile
Names: »init.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦e7f64e0c0⟧ »EurOpenD3/mail/vmh.tar.Z«
└─⟦dcb95597f⟧
└─⟦this⟧ »init.c«
#ifndef lint
static char rcsid[] =
"$Header: init.c,v 2.14 88/01/13 19:07:21 deboor Exp $";
static char notice[] =
"This program is in the public domain and is available for unlimited \
distribution as long as this notice is enclosed.";
#endif
#include "vmh.h"
/*
* initialization routines.
*
* $Source: /c/support/deboor/usr/src/old/vmh/RCS/init.c,v $
* $Revision: 2.14 $
* $Author: deboor $
*
* FUNCTIONS:
* DeBuG debug file output routine
* initprofile initialize all profile entries
* initstuff main initialization routine
* scanopts parse command line options
* set_topSize set size of top-most window (-scanwindow support)
*/
/* Initialization and exit routines */
int goodbye();
int sigwinch();
char editorstr[50]; /* Strings for favorite editor and */
char pagerstr[50]; /* display program names */
char SeqNegate[20]; /* sequence-negation string */
#ifdef MH6
char UnseenSequence[50],
MHSequences[50];
#endif MH6
char *version; /* for -help */
struct sgttyb ttyb; /* Contains erase and kill characters */
struct tchars chars; /* New tchars array */
struct ltchars lchars; /* local characters, whatever the hell that means */
char bs; /* character erase */
char litnext; /* initial literal next character */
char werasec;
char killc; /* line kill */
char dsuspc; /* delayed suspend */
char quit; /* interrupt */
char start; /* flow start */
char stop; /* flow stop */
int auto_clear;
int Dbg = 0;
int init_tty_mode;
int new_tty_mode;
char byestring[80];
char **ignores = 0,
**retains = 0;
initstuff(folder)
char *folder;
{
char folderstr[PATHLENGTH]; /*Full folder pathname */
long tostop = LTOSTOP; /* for TIOCLBIS */
extern char *progname;
extern FLDR *FHead; /* head of folder chain */
(void) Ioctl(0, TIOCGETP, &ttyb); /* Get character profiles */
(void) Ioctl(0, TIOCGETC, &chars); /* Get new characters */
(void) Ioctl(0, TIOCGLTC, &lchars);
(void) Ioctl(0, TIOCLBIS, &tostop); /* force tostop so backgrounding works */
bs = ttyb.sg_erase; /* Get backspace character */
killc = ttyb.sg_kill; /* kill for mywgetstr() */
werasec = lchars.t_werasc; /* werase for " */
quit = chars.t_intrc; /* Get interrupt key too */
litnext = lchars.t_lnextc; /* and literal-next character */
dsuspc = lchars.t_dsuspc; /* for oldtty(). ^Y is turned off */
start = chars.t_startc;
stop = chars.t_stopc;
bvShowScan = 0; /* reset show-info needed flag */
initscr(); /* initialize the screen (curses) */
/*
* this is needed when the second entry in the terminal name
* field of the termcap entry is > 10 characters long. curses
* blithely copies it over the saved tty modes and leaves the
* terminal totally f'ed up on exit. sigh. it's being changed...
* --ardeb
*/
/* make sure modes aren't brain-damaged */
if (! UPPERCASE && (_tty.sg_flags & LCASE)) {
_tty.sg_flags &= ~ (LCASE);
(void) stty (_tty_ch, &_tty);
}
if (CM == 0) /* If no cursor positioning? */
{
printf("Unusable terminal type: '%s' ", getenv("TERM"));
printf("(no cursor motion ability).\n");
printf("Check your TERM environment variable.\n");
exit(1); /* Not far enuf for punt() yet */
}
nonl();
#ifdef SIGTSTP
(void) signal(SIGTSTP, SIG_DFL); /* Undo damage done in initscr */
#endif
(void) signal (SIGQUIT, goodbye); /* quit gracefully */
#ifdef SIGWINCH
(void) signal (SIGWINCH, sigwinch);
#endif
set_biff_mode();
newtty(); /* Set vmh tty parms & signals */
fdreserved = dup(0); /* Spare fd for updatefolder */
FHead = NULL; /* Init chain of folders */
buildwins(); /* Build my windows */
startwatch(); /* Fire up the mailwatch daemon */
startclock(); /* and the clock */
if (getpath(folder, folderstr, sizeof(folderstr)) !=0)
{ char msg[100];
perror (folderstr);
(void) sprintf(msg, "Hm, '%s' is giving me some problems.",
folderstr);
punt(msg);
}
wclear (cmdWin);
infomsg(version, 0); /* Put up version number msg */
dofolder(folderstr);
init_stack(); /* initialize folder stack */
dotitle (botHdr, HELPMSG);
}
/* Read in profile once, rather than each time needed */
/* reads the auto-clear, goodbye, retain and ignore entries. */
initprofile()
{
register char *cp;
register q;
char junk[1024];
extern char *nsequence; /* in config.o */
#ifdef MH6
extern char *usequence; /* in config.o */
#endif MH6
cp = getenv ("VISUAL");
if (cp != NULL) {
(void) strncpy (editorstr, cp, sizeof(editorstr));
} else if ((cp = getenv("EDITOR")) != NULL) {
(void) strncpy(editorstr, cp, sizeof(editorstr));
} else {
(void) strcpy(editorstr, EDITOR); /* else compile def */
}
cp = getenv("SHOWPROC");
if (cp != NULL)
(void) strncpy(pagerstr, cp, sizeof(pagerstr));
else
if (readprofile("showproc:", pagerstr, sizeof(pagerstr)) != 1)
(void) strcpy(pagerstr, PAGE);
if (readprofile (nsequence, SeqNegate, sizeof (SeqNegate)) != 1)
(void) strcpy (SeqNegate, "not");
#ifdef MH6
if (readprofile(usequence, UnseenSequence, sizeof(UnseenSequence)) != 1)
*UnseenSequence = '\0';
else {
}
if (readprofile("mh-sequences:", MHSequences, sizeof (MHSequences)) !=1)
strcpy (MHSequences, mh_seq);
#endif MH6
(void) Ioctl (0, TIOCGETP, &ttyb);
if (ttyb.sg_ospeed <= B1200) /* if we're at 1200 baud or lower */
terse = auto_clear = 1; /* default to auto-clear and terse */
else
terse = auto_clear = 0; /* else no-auto-clear and no terse */
mailinterval.tv_sec = WATCHINTERVAL;
retains = ignores = (char **) 0;
}
WINDOW *topHdr,
*botHdr,
*topWin,
*botWin,
*cmdWin,
*mailWin,
*clockWin;
int topSize = 0,
botSize;
/*
* set_topSize(str)
* figure out how many rows the top window should have based on the string
* in str. If str is non-null, a copy of it is made for later use. If
* str is NULL, the previously-saved copy is used. str will be NULL
* when this function is called from rebuild_windows().
*/
set_topSize (str) char *str;
{
static char *spec = (char *)NULL; /* spec as passed to first call */
int top_num,
top_den;
if ((str == (char *)NULL) && (spec != (char *)NULL)) {
str = spec;
} else if (str != (char *)NULL) {
spec = newstr(str);
}
if (str == (char *)NULL) {
/*
* If called when rebuilding windows and no specific size
* was given, nuke the size we determined in buildwins()
* so it can figure it out again.
*/
topSize = 0;
} else if (index (str, '/')) {
/*
* String is a fraction-of-the-screen specification, so
* figure it out from there...
*/
(void) sscanf (str, "%d/%d", &top_num, &top_den);
topSize = (LINES * top_num) / top_den;
} else {
/*
* String must be an absolute number of rows
*/
(void) sscanf( str, "%d", &topSize );
}
}
buildwins()
{
char hm_top[60];
/*
* clock looks like this: 'hh:mm ap ' where 'h' is an hour digit, 'm' is
* a minute digit and 'ap' is either 'am' or 'pm'. the space is to wipe
* out when we go from double digit hour to single digit
*/
register clockwidth = sizeof("hh:mm ap ") - 1;
register mailwidth = sizeof("*** New Mail ***") - 1;
register topwidth;
if (! topSize) {
topSize = (LINES-1)/3;/* Two lines header, take third */
}
if( topSize < 3 || topSize > LINES - 3 )
punt( "scanwindow size too small");
botSize = (LINES-1)-topSize-1; /* Leave one more at bottom */
topwidth = COLS - clockwidth - mailwidth;
delwin(stdscr); /* free up some memory */
stdscr = (WINDOW *)NULL;
/* Top line for header */
topHdr = newwin(1, topwidth, topSize, mailwidth);
/* for clock */
clockWin = newwin (1, clockwidth, topSize, COLS - clockwidth);
/* for New Mail message */
mailWin = newwin (1, mailwidth, topSize, 0);
/* Rest of top half */
topWin = newwin(topSize, COLS, 0, 0);
/* Bottom window header */
botHdr = topHdr; /*newwin(1, COLS, 1+topSize, 0);*/
/* main window */
botWin = newwin(botSize, COLS, topSize+1, 0);
/* input window */
cmdWin = newwin(1, COLS - 1, topSize+1+botSize, 0);
}
rebuild_windows()
{
/*
* delete old windows and restore the tty state
*/
delwin(topHdr);
delwin(clockWin);
delwin(mailWin);
delwin(topWin);
delwin(botHdr);
delwin(botWin);
delwin(cmdWin);
oldtty();
/*
* reinitialize the window system and the tty. Note LINES and COLS
* must be reset for curses to pick up the new values.
*/
LINES = COLS = 0;
initscr();
newtty();
/*
* determine top size from initial switch/profile entry
*/
set_topSize((char *)NULL);
/*
* rebuild all windows
*/
buildwins();
/*
* redisplay clock (idleflag must be set for it to print anything)
*/
idleflag = TRUE;
startclock();
idleflag = FALSE;
/*
* refresh *** New Mail *** window
*/
startwatch();
/*
* redo title window
*/
dotitle(botHdr, HELPMSG);
/*
* update display of messages, centering current message in window.
* (Note: bvShowScan must be TRUE for update to occur)
*/
if (F->f_cur != (INFO *)NULL) {
F->f_top = i_pre(F->f_cur, topSize / 2);
F->f_line = i_diff(F->f_top, F->f_cur);
}
bvShowScan = TRUE;
updatetop();
}
/*
** set_biff_mode()
** sets biff based on the do_biff variable.
*/
set_biff_mode ()
{
struct stat ttystat;
extern char *sys_errlist[];
extern int errno;
if (fstat (_tty_ch, &ttystat)) {
perror ("tty");
punt("");
}
init_tty_mode = ttystat.st_mode;
if (do_biff)
ttystat.st_mode |= 0100;
else
ttystat.st_mode &= ~0100;
(void) Fchmod (_tty_ch, ttystat.st_mode);
new_tty_mode = ttystat.st_mode;
}
#ifdef DEBUG
FILE *DebugFile;
#endif
extern struct swit switches[];
int terse = 0, /* do terse messages/prompting */
autoinc = 0, /* automatically incorporate new mail */
do_size = 0, /* print size of msg in infowindow */
do_biff = 0, /* turn biff on */
do_page = 0, /* act like 'page' instead of 'more' */
autoprint = 0; /* print next message after deletion or <cr> */
char *cFold; /* for main() */
scanopts(argc, argv) int argc; char **argv;
{
char buf[BUFSIZ];
int ac;
char **av;
int profile = 0;
initprofile();
cFold = (char *) 0;
def_sequence = (char *) 0;
format_string = SCANFORMAT;
if (readprofile (progname, buf, sizeof buf)) {
av = brkstring (buf, " \t", "\n");
for (ac=0; av[ac]; ac++)
;
ac++, av--; /* to compensate for ++av below */
profile = 1;
}
startinfo:
if (!profile) {
ac = argc; av = argv;
}
while (--ac > 0 && **++av == '-') {
++*av; /* advance past '-' */
pcsswitch (&av, &ac, 1);
}
if (profile) {
profile = 0;
goto startinfo;
}
if (ac) {
if (**av == '+')
++*av;
cFold = *av;
}
}
#ifdef DEBUG
/*VARARGS1*/
DeBuG (fmt, args) char *fmt; int args;
{
FILE DbgFile;
char DbgBuf[BUFSIZ];
if (Dbg) {
DbgFile._flag = _IOWRT | _IOSTRG;
DbgFile._ptr = DbgBuf;
DbgFile._bufsiz = DbgFile._cnt = BUFSIZ;
DbgFile._file = -1;
(void) _doprnt (fmt, &args, &DbgFile);
(void) putc ('\0', &DbgFile);
fputs (DbgBuf, DebugFile);
(void) fflush (DebugFile);
}
}
#else
/*VARARGS1*/
/*ARGSUSED*/
DeBuG (fmt) char *fmt;
{
}
#endif