V10/cmd/visi/macros.c

Compare this file to the similar file:
Show the results in this format:

/*
 *      macros.c 1.8
 *
 *	Screen Handling Functions for Spreadsheet Program `vis'
 *
 *      A. F. Gettier
 *      Bell Laboratories
 *      Update made 11/15/82 10:50:58
 *      Retrieved 11/15/82 13:22:33
 */
#include	<math.h>
#include	<stdio.h>
#include	"curses.h"
#include	"vis.h"

extern int	LINES, COLS;
extern struct qheader	Fixup;

extern struct colhdr	Col;
extern struct rowhdr	Row;

/*
 *	duplicate a block of definitions
 */
duplicate( fr, fc, tr, tc, ar, ac )
int	fr, fc, tr, tc, ar, ac;
{
	char	tbuf[128];
	int	i, or, oc, nr, nc;
	struct rowlabel	**r1;
	struct node	*n, *n2;
	/*
	 *	get the row offset
	 */
	or = ar - fr;
	oc = ac - fc;
	/*
	 *	Now make all the copies
	 */
	r1 = Row.table;
	for ( i=fr; i<=tr && i<Row.size; i++ ) {
		n = r1[i]->next;
		while ( n != 0 ) {
			if ( n->col > tc )  break;
			if ( n->col >= fc ) {
				nr =  n->row + or;
				nc =  n->col + oc;
				n2 = getnode( nr, nc );
				(void)strcat(strcpy( tbuf, makevar( nr, nc ) ),
				    strchr( n->def, '=' ));
				n2->def = copystr( tbuf );
				qadd( &Fixup, n2 );
			}
			n = n->next;
		}
	}
}

/*
 *	replicate a block of definitions
 */
replicate( ar, ac, fr, fc, tr, tc )
int	ar, ac, fr, fc, tr, tc;
{
	char	tbuf[128], *defin;
	int	i, j;
	struct node	*n;
	/*
	 *	Is there a def to be copied
	 */
	n = getnode( ar, ac );
	if ( n->def == 0 )  {
		(void)sprintf( tbuf, "Not previous definition at %s", 
		    makevar( ar, ac ) );
		yyerror( tbuf );
		lexinit();
	}
	/*
	 *	get the definition part
	 */
	defin = strchr( n->def, '=' );
	if ( defin == 0 )  {
		(void)sprintf( tbuf, "Bug in the definition at %s", 
		    makevar( ar, ac ) );
		yyerror( tbuf );
		lexinit();
	}
	/*
	 *	Now make all the copies
	 */
	for ( i=fr; i<=tr; i++ ) {
		for ( j=fc; j<=tc; j++ ) {
			n = getnode( i, j );
			(void)strcat(strcpy( tbuf, makevar( i, j ) ), defin );
			n->def = copystr( tbuf );
			qadd( &Fixup, n );
		}
	}
}

/*
 *	Convert from a row and column format to a character string
 */
char *
makevar( row, col )
int	row, col;
{
	static char	buf[16];
	int	i;
	/*
	 *	and the letters on the vertical
	 */
	i = col / 26;
	if ( i > 0 )  i += 'A' - 1;
	else i = ' ';
	col =  col % 26 + 'A';
	(void)sprintf( buf, "%c%c%d", i, col, row+1 );
	return( buf );
}

/*
 *	List the HELP to the Terminal
 */
listhelp()
{
	int	cnt;
	char	tbuf[128];
	FILE	*fp;
	WINDOW	*listwin;

	if ( (fp=fopen( HELPFILE, "r" )) == 0 ) {
		(void)sprintf( tbuf, "Cannot open HELPFILE (%s)", HELPFILE );
		yyerror( tbuf );
		return;
	}
	listwin = newwin( LINES, COLS, 0, 0 );
	wmove( listwin, 0, 0 );
	wclear( listwin );
	wrefresh( listwin );
	loop {
		werase( listwin );
		for( cnt=0; cnt<LINES-2; cnt++ ) {
			if ( fgets( tbuf, 80, fp ) == NULL )  break;
			if( tbuf[0] == '\f' )  break;
			wmove( listwin, cnt, 0 );
			(void)wprintw( listwin, "%s", tbuf );
		}
		if ( cnt == 0 ) break;
		wmove( listwin, LINES-2, (COLS-25)/2 );
		wstandout( listwin );
		(void)wprintw(listwin,"PRESS <RETURN> WHEN READY");
		wstandend( listwin );
		wrefresh( listwin );
		wgetstr(  listwin, tbuf );
	}
	delwin( listwin );
	touchwin( stdscr );
}

/*
 *	edit the definitions file
 */
editfile()
{
	FILE	*fp;
	char	*file, bfr[128], *editor;


	clear();
	move( 0, 25 );
	standout( );
	printw( "Entering Editor, Please Wait" );
	standend( );
	move( 1, 0 );
	refresh();
	file = mktemp("/tmp/visXXXXXX");

	/*
	 *	Write the definitions out
	 */

	refresh();
	if ( (fp=fopen( file, "w" )) == 0 ) {
		char	errbuf[64];
		(void)sprintf( errbuf, "Cannot open '%s'", file );
		yyerror( errbuf );
		lexinit();
		return;
	}

	else dumpfile( fp );

	(void)fclose( fp );

	/*
	 *	zero out the current definitions
	 */

	zerodef();

	/*
	 *	edit the file
	 */

	editor = getenv( "ED" );

	if ( editor == 0 || *editor == '\0' )
		(void)sprintf( bfr, "ed %s", file );
	else
		(void)sprintf( bfr, "%s %s", editor, file );

	resetty();
	(void)system( bfr );
	noecho();
	crmode();

	/*
	 *	clean up the screen
	 */

	clear();
	prheading();
	refresh();

	/*
	 *	Read in the new definitions
	 */

	if ( (fp=fopen( file, "r" )) == 0 ) {
		char	errbuf[64];
		(void)sprintf( errbuf, "Cannot open '%s'", file );
		yyerror( errbuf );
		lexinit();
	}
	else readfile( fp );
	(void)unlink( file );
}

quit()
{
	move( LINES-1, 0 );
	clrtoeol();
	refresh();
	endwin();
	resetty();
	exit( 0 );
}