OpenSolaris_b135/cmd/fmli/qued/acs_io.c

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

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*	Copyright (c) 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
/*	  All Rights Reserved  	*/


#pragma ident	"%Z%%M%	%I%	%E% SMI"

#include <curses.h>
#include "wish.h"
#include "token.h"
#include "winp.h"
#include "fmacs.h"
#include "vtdefs.h"
#include "vt.h"

#define STR_SIZE	256

/* acsreadline is identical to freadline except it does NOT
 * strip off the curses attribute bits, ie. it deals with
 * a line of chtype's intead of chars.
 */

int
acsreadline(row, buff, terminate)
int row;
chtype *buff;
int terminate;
{
	register int len, size = 0;
	chtype ch_string[STR_SIZE];

	fgo (row, 0);
	len = winchnstr((&VT_array[VT_curid])->win, ch_string, LASTCOL + 1) - 1;

	/* extract characters from the ch_string and copy them into buff */

	while (len >= 0 && ((ch_string[len] & A_CHARTEXT) == ' '))
		len--;

	if (len >= 0) {		/* if there is text on this line */
		size = ++len;
		len = 0;
		while (len < size)
			*buff++ = ch_string[len++];
	}
	if (terminate)
		*buff = (chtype)'\0';
	return(size);
}


void
acswinschar(ch)
chtype ch;
{
	register struct	vt	*v;

	v = &VT_array[VT_curid];
	v->flags |= VT_DIRTY;
	winsch(v->win, ch);
}


/* this routine is the same as finschar except it deals with
 * a chtype instead of a char
 */
int
acsinschar(ch)
chtype ch;
{
	int saverow, savecol;

	saverow = Cfld->currow;
	savecol = Cfld->curcol;
	/* 
	 * delete last character, re-position cursor and insert
	 * a character
	 */
	fgo(saverow, LASTCOL);
	wdelchar();
	fgo(saverow, savecol);
	acswinschar(ch);
	return (0);
}

/* this routine is the same as finsstr except it deals with
 * chtype's instead of a char's
 */
int
acsinsstr(buff)
chtype *buff;
{
	register chtype *bptr;

	for (bptr = buff; (*bptr & A_CHARTEXT) != 0 ; bptr++)
		;
	bptr--;
	while (bptr >= buff)
		acsinschar(*bptr--);
	return (0);
}

/* this routine is the same as wreadchar except it does NOT
 * strip the curses attribute bits, ie. it deals with a chtype
 * instead of a char
 */
chtype
acswreadchar(row, col)
unsigned row;
unsigned col;
{
	register struct	vt	*v;
	int savey, savex;
	register chtype ch;

	v = &VT_array[VT_curid];
	getyx(v->win, savey, savex);
	if (!(v->flags & VT_NOBORDER)) {
		row++;
		col++;
	}
	ch = mvwinch(v->win, row, col);
	wmove(v->win, savey, savex);		/* return cursor */
	return(ch);
}

/*
  -----------------------------------------------------------------------------
acswputchar
          Output character `ch' to current window
	  Used when character was already on the screen once, and
	  thus we know character is printable and any special proccesing
	  was previously done.
  -----------------------------------------------------------------------------
*/
void
acswputchar(ch)
chtype	ch;
{
    register WINDOW   *win;
    register struct vt	*v;

    v = &VT_array[VT_curid];
    v->flags |= VT_DIRTY;
    win = v->win;

    waddch(win, ch);
    return;
}


/*
 * ACSPUTSTRING is used  in place of fputstring when outputing from the 
 * scroll buffer. since all the special character and output attribute
 * proccessing was already done when fputstring wrote into the scrollbuffer
 * none of that processing is needed here.
 */
void
acsputstring(str)
chtype *str;
{
    register chtype   *sptr;
    register int row, col, done; 
    register WINDOW   *win;
    struct vt	      *v;

    v = &VT_array[VT_curid];
    v->flags |= VT_DIRTY;
    win = v->win;

    v = &VT_array[VT_curid];
    v->flags |= VT_DIRTY;
    win = v->win;
    col = Cfld->curcol;
    row = Cfld->currow;
    done = FALSE;
    sptr = str;
    while (!done)
    {
	if ((*sptr) & A_CHARTEXT)
	{
	    waddch(win, *sptr++);
	    col++;
	}
	else
	{
	    done = TRUE;
	    continue;
	}
	if (col > LASTCOL)
	{
	    if (row == LASTROW) 
		done = TRUE;
	    else
		fgo(++row, col = 0);
	}
    }
    Cfld->curcol = col;
    Cfld->currow = row;
    return;
}