init_costs.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* 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 2004 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1988 AT&T */
/* All Rights Reserved */
/*
* University Copyright- Copyright (c) 1982, 1986, 1988
* The Regents of the University of California
* All Rights Reserved
*
* University Acknowledgment- Portions of this document are derived from
* software developed by the University of California, Berkeley, and its
* contributors.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
/*LINTLIBRARY*/
#include <stdlib.h>
#include <sys/types.h>
#include "curses_inc.h"
/*
* Figure out (roughly) how much each of these capabilities costs.
* In the parameterized cases, we just take a typical case and
* use that value. This is done only once at startup, since it
* would be too expensive for intensive use.
*/
static int _cost_fn(char *, int);
static short offsets[] = {
52, /* insert_character, */
21, /* delete_character, */
12, /* cursor_home, */
18, /* cursor_to_ll, */
14, /* cursor_left, */
17, /* cursor_right, */
11, /* cursor_down, */
19, /* cursor_up, */
2, /* carriage_return, */
134, /* tab, */
0, /* back_tab, */
6, /* clr_eol, */
269, /* clr_bol, */
#define FIRST_LOOP 13
108, /* parm_ich, */
105, /* parm_dch, */
111, /* parm_left_cursor, */
114, /* parm_up_cursor, */
107, /* parm_down_cursor, */
112, /* parm_right_cursor, */
#define SECOND_LOOP 19
};
void
_init_costs(void)
{
short *costptr = &(SP->term_costs.icfixed);
char **str_array = (char **) cur_strs;
int i = 0;
char save_xflag = xon_xoff;
xon_xoff = 0;
/*
* This next block of code is actually correct in that it takes into
* account many things that wrefresh has to keep figuring in the function
* _useidch. Wrefresh MUST be changed (in the words of Tony Hansen) !!!
*
* Wrefresh has been changed (in my words -Phong Vo) !!!!
*/
*costptr++ = ((enter_insert_mode) && (exit_insert_mode)) ?
_cost_fn(enter_insert_mode, 0) + _cost_fn(exit_insert_mode, 0) : 0;
*costptr++ = ((enter_delete_mode) && (exit_delete_mode)) ?
_cost_fn(enter_delete_mode, 0) + _cost_fn(exit_delete_mode, 0) : 0;
while (i < FIRST_LOOP)
*costptr++ = _cost_fn(str_array[offsets[i++]], 1);
while (i < SECOND_LOOP)
*costptr++ = _cost_fn(tparm_p1(str_array[offsets[i++]], 10), 1);
*costptr++ = _cost_fn(tparm_p2(cursor_address, 8, 10), 1);
*costptr++ = _cost_fn(tparm_p1(row_address, 8), 1);
xon_xoff = save_xflag;
#ifdef DEBUG
if (outf) {
fprintf(outf, "icfixed %d=%d+%d\n", _COST(icfixed),
_cost_fn(enter_insert_mode, 0),
_cost_fn(exit_insert_mode, 0));
fprintf(outf, "from ich1 %x '%s' %d\n", insert_character,
insert_character, _cost_fn(insert_character, 1));
fprintf(outf, "ip %x '%s' %d\n", insert_padding,
insert_padding, _cost_fn(insert_padding, 1));
fprintf(outf, "dcfixed %d\n", _COST(dcfixed));
}
#endif /* DEBUG */
/*FALLTHROUGH*/
}
static int counter = 0;
int
/* ARGSUSED */
_countchar(char dummy)
{
counter++;
return (0);
}
/*
* Figure out the _COST in characters to print this string.
* Due to padding, we can't just use strlen, so instead we
* feed it through tputs and trap the results.
* Even if the terminal uses xon/xoff handshaking, count the
* pad chars here since they estimate the real time to do the
* operation, useful in calculating costs.
*/
static int
_cost_fn(char *str, int affcnt)
{
if (str == NULL)
return (LARGECOST);
counter = 0;
(void) tputs(str, affcnt, _countchar);
return (counter);
}