add LCC - a better C-Compiler for WEGA

This commit is contained in:
Oliver Lehmann 1985-06-07 20:24:32 +00:00
parent 74f38dcc0c
commit e580f108e0
28 changed files with 1346 additions and 0 deletions

View File

@ -0,0 +1,105 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)addch.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* This routine adds the character to the current position
*
*/
waddch(win, c)
reg WINDOW *win;
char c;
{
reg int x, y;
reg WINDOW *wp;
reg int newx;
x = win->_curx;
y = win->_cury;
# ifdef FULLDEBUG
fprintf(outf, "ADDCH('%c') at (%d, %d)\n", c, y, x);
# endif
switch (c) {
case '\t':
for (newx = x + (8 - (x & 07)); x < newx; x++)
if (waddch(win, ' ') == ERR)
return ERR;
return OK;
default:
# ifdef FULLDEBUG
fprintf(outf, "ADDCH: 1: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]);
# endif
if (win->_flags & _STANDOUT)
c |= _STANDOUT;
set_ch(win, y, x, c);
win->_y[y][x++] = c;
if (x >= win->_maxx) {
x = 0;
newline:
if (++y >= win->_maxy)
if (win->_scroll) {
scroll(win);
--y;
}
else
return ERR;
}
# ifdef FULLDEBUG
fprintf(outf, "ADDCH: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]);
# endif
break;
case '\n':
wclrtoeol(win);
if (!NONL)
x = 0;
goto newline;
case '\r':
x = 0;
break;
case '\b':
if (--x < 0)
x = 0;
break;
}
win->_curx = x;
win->_cury = y;
return OK;
}
/*
* set_ch:
* Set the first and last change flags for this window.
*/
static
set_ch(win, y, x, ch)
reg WINDOW *win;
int y, x;
{
# ifdef FULLDEBUG
fprintf(outf, "SET_CH(%0.2o, %d, %d)\n", win, y, x);
# endif
if (win->_y[y][x] != ch) {
x += win->_ch_off;
if (win->_firstch[y] == _NOCHANGE)
win->_firstch[y] = win->_lastch[y] = x;
else if (x < win->_firstch[y])
win->_firstch[y] = x;
else if (x > win->_lastch[y])
win->_lastch[y] = x;
# ifdef FULLDEBUG
fprintf(outf, "SET_CH: change gives f/l: %d/%d [%d/%d]\n",
win->_firstch[y], win->_lastch[y],
win->_firstch[y] - win->_ch_off,
win->_lastch[y] - win->_ch_off);
# endif
}
}

View File

@ -0,0 +1,28 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)addstr.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* This routine adds a string starting at (_cury,_curx)
*
*/
waddstr(win,str)
reg WINDOW *win;
reg char *str;
{
# ifdef DEBUG
fprintf(outf, "WADDSTR(\"%s\")\n", str);
# endif
while (*str)
if (waddch(win, *str++) == ERR)
return ERR;
return OK;
}

View File

@ -0,0 +1,38 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)box.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* This routine draws a box around the given window with "vert"
* as the vertical delimiting char, and "hor", as the horizontal one.
*
*/
box(win, vert, hor)
reg WINDOW *win;
char vert, hor; {
reg int i;
reg int endy, endx;
reg char *fp, *lp;
endx = win->_maxx;
endy = win->_maxy - 1;
fp = win->_y[0];
lp = win->_y[endy];
for (i = 0; i < endx; i++)
fp[i] = lp[i] = hor;
endx--;
for (i = 0; i <= endy; i++)
win->_y[i][0] = (win->_y[i][endx] = vert);
if (!win->_scroll && (win->_flags&_SCROLLWIN))
fp[0] = fp[endx] = lp[0] = lp[endx] = ' ';
touchwin(win);
}

View File

@ -0,0 +1,23 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)clear.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* This routine clears the window.
*
*/
wclear(win)
reg WINDOW *win; {
werase(win);
win->_clear = TRUE;
return OK;
}

View File

@ -0,0 +1,44 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)clrtoeol.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* This routine clears up to the end of line
*
*/
wclrtoeol(win)
reg WINDOW *win; {
reg char *sp, *end;
reg int y, x;
reg char *maxx;
reg int minx;
y = win->_cury;
x = win->_curx;
end = &win->_y[y][win->_maxx];
minx = _NOCHANGE;
maxx = &win->_y[y][x];
for (sp = maxx; sp < end; sp++)
if (*sp != ' ') {
maxx = sp;
if (minx == _NOCHANGE)
minx = sp - win->_y[y];
*sp = ' ';
}
/*
* update firstch and lastch for the line
*/
touchline(win, y, win->_curx, win->_maxx - 1);
# ifdef DEBUG
fprintf(outf, "CLRTOEOL: minx = %d, maxx = %d, firstch = %d, lastch = %d\n", minx, maxx - win->_y[y], win->_firstch[y], win->_lastch[y]);
# endif
}

View File

@ -0,0 +1,33 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)delch.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* This routine performs an insert-char on the line, leaving
* (_cury,_curx) unchanged.
*
*/
wdelch(win)
reg WINDOW *win; {
reg char *temp1, *temp2;
reg char *end;
reg int lch;
end = &win->_y[win->_cury][win->_maxx - 1];
temp1 = &win->_y[win->_cury][win->_curx];
temp2 = temp1 + 1;
while (temp1 < end)
*temp1++ = *temp2++;
*temp1 = ' ';
touchline(win, win->_cury, win->_curx, win->_maxx - 1);
return OK;
}

View File

@ -0,0 +1,47 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)deleteln.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* This routine deletes a line from the screen. It leaves
* (_cury,_curx) unchanged.
*
*/
wdeleteln(win)
reg WINDOW *win;
{
reg char *temp;
reg int y;
reg char *end;
reg int x;
# ifdef DEBUG
fprintf(outf, "DELETELN(%0.2o)\n", win);
# endif
temp = win->_y[win->_cury];
for (y = win->_cury; y < win->_maxy - 1; y++) {
if (win->_orig == NULL)
win->_y[y] = win->_y[y + 1];
else
bcopy(win->_y[y + 1], win->_y[y], win->_maxx);
touchline(win, y, 0, win->_maxx - 1);
}
if (win->_orig == NULL)
win->_y[y] = temp;
else
temp = win->_y[y];
for (end = &temp[win->_maxx]; temp < end; )
*temp++ = ' ';
touchline(win, win->_cury, 0, win->_maxx - 1);
if (win->_orig == NULL)
_id_subwins(win);
return OK;
}

View File

@ -0,0 +1,52 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)delwin.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* This routine deletes a window and releases it back to the system.
*
*/
delwin(win)
reg WINDOW *win; {
reg int i;
reg WINDOW *wp, *np;
if (win->_orig == NULL) {
/*
* If we are the original window, delete the space for
* all the subwindows, and the array of space as well.
*/
for (i = 0; i < win->_maxy && win->_y[i]; i++)
free(win->_y[i]);
free(win->_firstch);
free(win->_lastch);
wp = win->_nextp;
while (wp != win) {
np = wp->_nextp;
delwin(wp);
wp = np;
}
}
else {
/*
* If we are a subwindow, take ourselves out of the
* list. NOTE: if we are a subwindow, the minimum list
* is orig followed by this subwindow, so there are
* always at least two windows in the list.
*/
for (wp = win->_nextp; wp->_nextp != win; wp = wp->_nextp)
continue;
wp->_nextp = win->_nextp;
}
free(win->_y);
free(win);
}

View File

@ -0,0 +1,30 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)endwin.c 5.1 (Berkeley) 6/7/85";
#endif not lint
/*
* Clean things up before exiting
*
*/
# include "curses.ext"
endwin()
{
resetty();
_puts(VE);
_puts(TE);
if (curscr) {
if (curscr->_flags & _STANDOUT) {
_puts(SE);
curscr->_flags &= ~_STANDOUT;
}
_endwin = TRUE;
}
}

View File

@ -0,0 +1,42 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)erase.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* This routine erases everything on the window.
*
*/
werase(win)
reg WINDOW *win; {
reg int y;
reg char *sp, *end, *start, *maxx;
reg int minx;
# ifdef DEBUG
fprintf(outf, "WERASE(%0.2o)\n", win);
# endif
for (y = 0; y < win->_maxy; y++) {
minx = _NOCHANGE;
start = win->_y[y];
end = &start[win->_maxx];
for (sp = start; sp < end; sp++)
if (*sp != ' ') {
maxx = sp;
if (minx == _NOCHANGE)
minx = sp - start;
*sp = ' ';
}
if (minx != _NOCHANGE)
touchline(win, y, minx, maxx - win->_y[y]);
}
win->_curx = win->_cury = 0;
}

View File

@ -0,0 +1,38 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)fullname.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# define reg register
/*
* This routine fills in "def" with the full name of the terminal.
* This is assumed to be the last name in the list of aliases.
*
*/
char *
fullname(bp, def)
reg char *bp, *def;
{
reg char *cp;
*def = 0; /* in case no name */
while (*bp && *bp != ':') {
cp = def; /* start of answer */
while (*bp && *bp != ':' && *bp != '|') {
*cp++ = *bp++; /* copy name over */
}
*cp = 0; /* zero end of name */
if (*bp == '|') {
bp++; /* skip over '|' if that is case */
}
}
return(def);
}

View File

@ -0,0 +1,29 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)getstr.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* This routine gets a string starting at (_cury,_curx)
*
*/
wgetstr(win,str)
reg WINDOW *win;
reg char *str; {
while ((*str = wgetch(win)) != ERR && *str != '\n')
str++;
if (*str == ERR) {
*str = '\0';
return ERR;
}
*str = '\0';
return OK;
}

View File

@ -0,0 +1,38 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)id_subwins.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* _id_subwins:
* Re-sync the pointers to _y for all the subwindows.
*
*/
_id_subwins(orig)
register WINDOW *orig;
{
register WINDOW *win;
register int realy;
register int y, oy, x;
realy = orig->_begy + orig->_cury;
for (win = orig->_nextp; win != orig; win = win->_nextp) {
/*
* If the window ends before our current position,
* don't need to do anything.
*/
if (win->_begy + win->_maxy <= realy)
continue;
oy = orig->_cury;
for (y = realy - win->_begy; y < win->_maxy; y++, oy++)
win->_y[y] = &orig->_y[oy][win->_ch_off];
}
}

View File

@ -0,0 +1,27 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)idlok.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* idlok:
* Turn on and off using insert/deleteln sequences for the given
* window.
*
*/
idlok(win, bf)
register WINDOW *win;
bool bf;
{
if (bf)
win->_flags |= _IDLINE;
else
win->_flags &= ~_IDLINE;
}

View File

@ -0,0 +1,70 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)initscr.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
# include <signal.h>
extern char *getenv();
/*
* This routine initializes the current and standard screen.
*
*/
WINDOW *
initscr() {
reg char *sp;
int tstp();
int nfd;
# ifdef DEBUG
fprintf(outf, "INITSCR()\n");
# endif
if (My_term)
setterm(Def_term);
else {
for (_tty_ch = 0; _tty_ch < nfd; _tty_ch++)
if (isatty(_tty_ch))
break;
gettmode();
if ((sp = getenv("TERM")) == NULL)
sp = Def_term;
setterm(sp);
# ifdef DEBUG
fprintf(outf, "INITSCR: term = %s\n", sp);
# endif
}
_puts(TI);
_puts(VS);
# ifdef SIGTSTP
signal(SIGTSTP, tstp);
# endif
if (curscr != NULL) {
# ifdef DEBUG
fprintf(outf, "INITSCR: curscr = 0%o\n", curscr);
# endif
delwin(curscr);
}
# ifdef DEBUG
fprintf(outf, "LINES = %d, COLS = %d\n", LINES, COLS);
# endif
if ((curscr = newwin(LINES, COLS, 0, 0)) == ERR)
return ERR;
clearok(curscr, TRUE);
curscr->_flags &= ~_FULLLINE;
if (stdscr != NULL) {
# ifdef DEBUG
fprintf(outf, "INITSCR: stdscr = 0%o\n", stdscr);
# endif
delwin(stdscr);
}
stdscr = newwin(LINES, COLS, 0, 0);
return stdscr;
}

View File

@ -0,0 +1,41 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)insch.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* This routine performs an insert-char on the line, leaving
* (_cury,_curx) unchanged.
*
*/
winsch(win, c)
reg WINDOW *win;
char c; {
reg char *temp1, *temp2;
reg char *end;
end = &win->_y[win->_cury][win->_curx];
temp1 = &win->_y[win->_cury][win->_maxx - 1];
temp2 = temp1 - 1;
while (temp1 > end)
*temp1-- = *temp2--;
*temp1 = c;
touchline(win, win->_cury, win->_curx, win->_maxx - 1);
if (win->_cury == LINES - 1 && win->_y[LINES-1][COLS-1] != ' ')
if (win->_scroll) {
wrefresh(win);
scroll(win);
win->_cury--;
}
else
return ERR;
return OK;
}

View File

@ -0,0 +1,47 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)insertln.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* This routine performs an insert-line on the window, leaving
* (_cury,_curx) unchanged.
*
*/
winsertln(win)
reg WINDOW *win; {
reg char *temp;
reg int y;
reg char *end;
reg int x;
#ifdef DEBUG
fprintf(outf, "INSERTLN(%0.2o)\n", win);
#endif
if (win->_orig == NULL)
temp = win->_y[win->_maxy - 1];
for (y = win->_maxy - 1; y > win->_cury; --y) {
if (win->_orig == NULL)
win->_y[y] = win->_y[y - 1];
else
bcopy(win->_y[y - 1], win->_y[y], win->_maxx);
touchline(win, y, 0, win->_maxx - 1);
}
if (win->_orig == NULL)
win->_y[y] = temp;
else
temp = win->_y[y];
for (end = &temp[win->_maxx]; temp < end; )
*temp++ = ' ';
touchline(win, y, 0, win->_maxx - 1);
if (win->_orig == NULL)
_id_subwins(win);
}

View File

@ -0,0 +1,33 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)longname.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# define reg register
/*
* This routine fills in "def" with the long name of the terminal.
*
*/
char *
longname(bp, def)
reg char *bp, *def; {
reg char *cp;
while (*bp && *bp != ':' && *bp != '|')
bp++;
if (*bp == '|') {
bp++;
cp = def;
while (*bp && *bp != ':' && *bp != '|')
*cp++ = *bp++;
*cp = 0;
}
return def;
}

View File

@ -0,0 +1,34 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)mvprintw.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* implement the mvprintw commands. Due to the variable number of
* arguments, they cannot be macros. Sigh....
*
*/
mvprintw(y, x, fmt, args)
reg int y, x;
char *fmt;
int args; {
return move(y, x) == OK ? _sprintw(stdscr, fmt, &args) : ERR;
}
mvwprintw(win, y, x, fmt, args)
reg WINDOW *win;
reg int y, x;
char *fmt;
int args; {
return wmove(win, y, x) == OK ? _sprintw(win, fmt, &args) : ERR;
}

View File

@ -0,0 +1,34 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)mvscanw.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* implement the mvscanw commands. Due to the variable number of
* arguments, they cannot be macros. Another sigh....
*
*/
mvscanw(y, x, fmt, args)
reg int y, x;
char *fmt;
int args; {
return move(y, x) == OK ? _sscans(stdscr, fmt, &args) : ERR;
}
mvwscanw(win, y, x, fmt, args)
reg WINDOW *win;
reg int y, x;
char *fmt;
int args; {
return wmove(win, y, x) == OK ? _sscans(win, fmt, &args) : ERR;
}

View File

@ -0,0 +1,51 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)mvwin.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* relocate the starting position of a window
*
*/
mvwin(win, by, bx)
reg WINDOW *win;
reg int by, bx; {
register WINDOW *orig;
register int dy, dx;
if (by + win->_maxy > LINES || bx + win->_maxx > COLS)
return ERR;
dy = by - win->_begy;
dx = bx - win->_begx;
orig = win->_orig;
if (orig == NULL) {
orig = win;
do {
win->_begy += dy;
win->_begx += dx;
_swflags_(win);
win = win->_nextp;
} while (win != orig);
}
else {
if (by < orig->_begy || win->_maxy + dy > orig->_maxy)
return ERR;
if (bx < orig->_begx || win->_maxx + dx > orig->_maxx)
return ERR;
win->_begy = by;
win->_begx = bx;
_swflags_(win);
_set_subwin_(orig, win);
}
touchwin(win);
return OK;
}

View File

@ -0,0 +1,208 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)newwin.c 5.1 (Berkeley) 6/7/85";
#endif not lint
/*
* allocate space for and set up defaults for a new window
*
*/
# include "curses.ext"
char *malloc();
# define SMALLOC (short *) malloc
static WINDOW *makenew();
# undef nl /* don't need it here, and it interferes */
WINDOW *
newwin(num_lines, num_cols, begy, begx)
int num_lines, num_cols, begy, begx;
{
reg WINDOW *win;
reg char *sp;
reg int i, by, bx, nl, nc;
reg int j;
by = begy;
bx = begx;
nl = num_lines;
nc = num_cols;
if (nl == 0)
nl = LINES - by;
if (nc == 0)
nc = COLS - bx;
if ((win = makenew(nl, nc, by, bx)) == NULL)
return ERR;
if ((win->_firstch = SMALLOC(nl * sizeof win->_firstch[0])) == NULL) {
free(win->_y);
free(win);
return NULL;
}
if ((win->_lastch = SMALLOC(nl * sizeof win->_lastch[0])) == NULL) {
free(win->_y);
free(win->_firstch);
free(win);
return NULL;
}
win->_nextp = win;
for (i = 0; i < nl; i++) {
win->_firstch[i] = _NOCHANGE;
win->_lastch[i] = _NOCHANGE;
}
for (i = 0; i < nl; i++)
if ((win->_y[i] = malloc(nc * sizeof win->_y[0])) == NULL) {
for (j = 0; j < i; j++)
free(win->_y[j]);
free(win->_firstch);
free(win->_lastch);
free(win->_y);
free(win);
return ERR;
}
else
for (sp = win->_y[i]; sp < win->_y[i] + nc; )
*sp++ = ' ';
win->_ch_off = 0;
# ifdef DEBUG
fprintf(outf, "NEWWIN: win->_ch_off = %d\n", win->_ch_off);
# endif
return win;
}
WINDOW *
subwin(orig, num_lines, num_cols, begy, begx)
reg WINDOW *orig;
int num_lines, num_cols, begy, begx;
{
reg int i;
reg WINDOW *win;
reg int by, bx, nl, nc;
by = begy;
bx = begx;
nl = num_lines;
nc = num_cols;
/*
* make sure window fits inside the original one
*/
# ifdef DEBUG
fprintf(outf, "SUBWIN(%0.2o, %d, %d, %d, %d)\n", orig, nl, nc, by, bx);
# endif
if (by < orig->_begy || bx < orig->_begx
|| by + nl > orig->_maxy + orig->_begy
|| bx + nc > orig->_maxx + orig->_begx)
return ERR;
if (nl == 0)
nl = orig->_maxy + orig->_begy - by;
if (nc == 0)
nc = orig->_maxx + orig->_begx - bx;
if ((win = makenew(nl, nc, by, bx)) == NULL)
return ERR;
win->_nextp = orig->_nextp;
orig->_nextp = win;
win->_orig = orig;
_set_subwin_(orig, win);
return win;
}
/*
* this code is shared with mvwin()
*/
_set_subwin_(orig, win)
register WINDOW *orig, *win;
{
register int i, j, k;
j = win->_begy - orig->_begy;
k = win->_begx - orig->_begx;
win->_ch_off = k;
# ifdef DEBUG
fprintf(outf, "_SET_SUBWIN_: win->_ch_off = %d\n", win->_ch_off);
# endif
win->_firstch = &orig->_firstch[j];
win->_lastch = &orig->_lastch[j];
for (i = 0; i < win->_maxy; i++, j++)
win->_y[i] = &orig->_y[j][k];
}
/*
* This routine sets up a window buffer and returns a pointer to it.
*/
static WINDOW *
makenew(num_lines, num_cols, begy, begx)
int num_lines, num_cols, begy, begx; {
reg int i;
reg WINDOW *win;
reg int by, bx, nl, nc;
by = begy;
bx = begx;
nl = num_lines;
nc = num_cols;
# ifdef DEBUG
fprintf(outf, "MAKENEW(%d, %d, %d, %d)\n", nl, nc, by, bx);
# endif
if ((win = (WINDOW *) malloc(sizeof *win)) == NULL)
return NULL;
# ifdef DEBUG
fprintf(outf, "MAKENEW: nl = %d\n", nl);
# endif
if ((win->_y = (char **) malloc(nl * sizeof win->_y[0])) == NULL) {
free(win);
return NULL;
}
# ifdef DEBUG
fprintf(outf, "MAKENEW: nc = %d\n", nc);
# endif
win->_cury = win->_curx = 0;
win->_clear = FALSE;
win->_maxy = nl;
win->_maxx = nc;
win->_begy = by;
win->_begx = bx;
win->_flags = 0;
win->_scroll = win->_leave = FALSE;
_swflags_(win);
# ifdef DEBUG
fprintf(outf, "MAKENEW: win->_clear = %d\n", win->_clear);
fprintf(outf, "MAKENEW: win->_leave = %d\n", win->_leave);
fprintf(outf, "MAKENEW: win->_scroll = %d\n", win->_scroll);
fprintf(outf, "MAKENEW: win->_flags = %0.2o\n", win->_flags);
fprintf(outf, "MAKENEW: win->_maxy = %d\n", win->_maxy);
fprintf(outf, "MAKENEW: win->_maxx = %d\n", win->_maxx);
fprintf(outf, "MAKENEW: win->_begy = %d\n", win->_begy);
fprintf(outf, "MAKENEW: win->_begx = %d\n", win->_begx);
# endif
return win;
}
_swflags_(win)
register WINDOW *win;
{
win->_flags &= ~(_ENDLINE|_FULLLINE|_FULLWIN|_SCROLLWIN);
if (win->_begx + win->_maxx == COLS) {
win->_flags |= _ENDLINE;
if (win->_begx == 0) {
if (AL && DL)
win->_flags |= _FULLLINE;
if (win->_maxy == LINES && win->_begy == 0)
win->_flags |= _FULLWIN;
}
if (win->_begy + win->_maxy == LINES)
win->_flags |= _SCROLLWIN;
}
}

View File

@ -0,0 +1,45 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)overwrite.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
# include <ctype.h>
# define min(a,b) (a < b ? a : b)
# define max(a,b) (a > b ? a : b)
/*
* This routine writes win1 on win2 destructively.
*
*/
overwrite(win1, win2)
reg WINDOW *win1, *win2; {
reg char *sp, *end;
reg int x, y, endy, endx, starty, startx;
# ifdef DEBUG
fprintf(outf, "OVERWRITE(%0.2o, %0.2o);\n", win1, win2);
# endif
starty = max(win1->_begy, win2->_begy);
startx = max(win1->_begx, win2->_begx);
endy = min(win1->_maxy + win1->_begy, win2->_maxy + win2->_begx);
endx = min(win1->_maxx + win1->_begx, win2->_maxx + win2->_begx);
if (starty >= endy || startx >= endx)
return;
# ifdef DEBUG
fprintf(outf, "OVERWRITE:from (%d,%d) to (%d,%d)\n", starty, startx, endy, endx);
# endif
x = endx - startx;
for (y = starty; y < endy; y++) {
bcopy(&win1->_y[y - win1->_begy][startx - win1->_begx],
&win2->_y[y - win2->_begy][startx - win2->_begx], x);
touchline(win2, y, startx - win2->_begx, endx - win2->_begx);
}
}

View File

@ -0,0 +1,21 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)putchar.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
char
_putchar(c)
reg char c; {
putchar(c);
#ifdef DEBUG
fprintf(outf, "_PUTCHAR(%s)\n", unctrl(c));
#endif
}

View File

@ -0,0 +1,42 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)scroll.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* This routine scrolls the window up a line.
*
*/
scroll(win)
register WINDOW *win;
{
register int oy, ox;
# ifdef DEBUG
fprintf(outf, "SCROLL(%0.2o)\n", win);
# endif
if (!win->_scroll)
return ERR;
getyx(win, oy, ox);
wmove(win, 0, 0);
wdeleteln(win);
wmove(win, oy, ox);
if (win == curscr) {
_putchar('\n');
if (!NONL)
win->_curx = 0;
# ifdef DEBUG
fprintf(outf, "SCROLL: win == curscr\n");
# endif
}
}

View File

@ -0,0 +1,44 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)standout.c 5.1 (Berkeley) 6/7/85";
#endif not lint
/*
* routines dealing with entering and exiting standout mode
*
*/
# include "curses.ext"
/*
* enter standout mode
*/
char *
wstandout(win)
reg WINDOW *win;
{
if (!SO && !UC)
return FALSE;
win->_flags |= _STANDOUT;
return (SO ? SO : UC);
}
/*
* exit standout mode
*/
char *
wstandend(win)
reg WINDOW *win;
{
if (!SO && !UC)
return FALSE;
win->_flags &= ~_STANDOUT;
return (SE ? SE : UC);
}

View File

@ -0,0 +1,46 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)toucholap.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
# define min(a,b) (a < b ? a : b)
# define max(a,b) (a > b ? a : b)
/*
* Touch, on win2, the part that overlaps with win1.
*
*/
touchoverlap(win1, win2)
reg WINDOW *win1, *win2; {
reg int x, y, endy, endx, starty, startx;
# ifdef DEBUG
fprintf(outf, "TOUCHOVERLAP(%0.2o, %0.2o);\n", win1, win2);
# endif
starty = max(win1->_begy, win2->_begy);
startx = max(win1->_begx, win2->_begx);
endy = min(win1->_maxy + win1->_begy, win2->_maxy + win2->_begx);
endx = min(win1->_maxx + win1->_begx, win2->_maxx + win2->_begx);
# ifdef DEBUG
fprintf(outf, "TOUCHOVERLAP:from (%d,%d) to (%d,%d)\n", starty, startx, endy, endx);
fprintf(outf, "TOUCHOVERLAP:win1 (%d,%d) to (%d,%d)\n", win1->_begy, win1->_begx, win1->_begy + win1->_maxy, win1->_begx + win1->_maxx);
fprintf(outf, "TOUCHOVERLAP:win2 (%d,%d) to (%d,%d)\n", win2->_begy, win2->_begx, win2->_begy + win2->_maxy, win2->_begx + win2->_maxx);
# endif
if (starty >= endy || startx >= endx)
return;
starty -= win2->_begy;
startx -= win2->_begx;
endy -= win2->_begy;
endx -= win2->_begx;
endx--;
for (y = starty; y < endy; y++)
touchline(win2, y, startx, endx);
}

View File

@ -0,0 +1,56 @@
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)touchwin.c 5.1 (Berkeley) 6/7/85";
#endif not lint
# include "curses.ext"
/*
* make it look like the whole window has been changed.
*
*/
touchwin(win)
register WINDOW *win;
{
register int y, maxy;
# ifdef DEBUG
fprintf(outf, "TOUCHWIN(%0.2o)\n", win);
# endif
maxy = win->_maxy;
for (y = 0; y < maxy; y++)
touchline(win, y, 0, win->_maxx - 1);
}
/*
* touch a given line
*/
touchline(win, y, sx, ex)
register WINDOW *win;
register int y, sx, ex;
{
# ifdef DEBUG
fprintf(outf, "TOUCHLINE(%0.2o, %d, %d, %d)\n", win, y, sx, ex);
fprintf(outf, "TOUCHLINE:first = %d, last = %d\n", win->_firstch[y], win->_lastch[y]);
# endif
sx += win->_ch_off;
ex += win->_ch_off;
if (win->_firstch[y] == _NOCHANGE) {
win->_firstch[y] = sx;
win->_lastch[y] = ex;
}
else {
if (win->_firstch[y] > sx)
win->_firstch[y] = sx;
if (win->_lastch[y] < ex)
win->_lastch[y] = ex;
}
# ifdef DEBUG
fprintf(outf, "TOUCHLINE:first = %d, last = %d\n", win->_firstch[y], win->_lastch[y]);
# endif
}