⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slk_start.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
/*	Copyright (c) 1984 AT&T	*//*	  All Rights Reserved  	*//*	THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T	*//*	The copyright notice above does not evidence any   	*//*	actual or intended publication of such source code.	*/#ifndef lintstatic	char sccsid[] = "@(#)slk_start.c 1.1 92/07/30 SMI"; /* from S5R3.1 1.4 */#endif#include	"curses_inc.h"/* * Initialize usage of soft labels * This routine should be called before each call of newscreen * or initscr to initialize for the next terminal. * * ng:	number of groupings. If gp is NULL, it denotes one * 	of two default groupings: * 	0:	- - -   - -   - - - * 	1:      - - - -     - - - - * gp:	groupings. */static	void	_init_slk_func();static	char	_ngroups, _groups[LABMAX];extern	int	_slk_update(), slk_touch(), slk_noutrefresh();slk_start(ng, gp)int	ng, *gp;{    register	int	i = 0, j = 0;    if (gp == NULL)    {	switch (ng)	{	    case 2 :		_ngroups = 2;		_groups[0] = 4;		_groups[1] = 4;		break;	    case 3 :no_format :		_ngroups = 3;		_groups[0] = 3;		_groups[1] = 2;		_groups[2] = 3;		break;	    default :		if (label_format)		{		    int		k;		    char	ch1[3], *ch = label_format;		    while (TRUE)		    {			if ((*ch == ',') || (*ch == '\0'))			{			    ch1[i] = '\0';			    if ((k = atoi(ch1)) <= 0)				goto err;			    _groups[j++] = (char) k;			    i = 0;			    if (*ch == '\0')			    {				ng = j;				break;			    }			}			else			    ch1[i++] = *ch++;		    }		}		else		    goto no_format;		break;	}    }    else    {	for (; i < ng; i++)	{	    if ((j += gp[i]) > LABMAX)err :		return (ERR);	    _groups[i] = gp[i];	}	_ngroups = ng;    }    /* signal newscreen() */    _slk_init = _init_slk_func;    return (OK);}static	void_init_slk_func(){    register	int	i, len, num = 0;    register	SLK_MAP	*slk;    register	char	*cp, *ep;    register	WINDOW	*win;    /* clear this out to ready for next time */    _slk_init = NULL;    /* get space for slk structure */    if ((slk = (SLK_MAP *) malloc(sizeof(SLK_MAP))) == NULL)    {	curs_errno = CURS_BAD_MALLOC;#ifdef	DEBUG	strcpy(curs_parm_err, "_init_slk_func");#endif	/* DEBUG */	return;    }    /* compute actual number of labels */    num = 0;    for (i = 0; i < _ngroups; i++)	num += _groups[i];    /* max label length */    if (plab_norm && (label_height * label_width >= LABLEN) && (num_labels >= num))    {	win = NULL;	goto next;    }    else    {	if ((win = newwin(1, COLS, LINES - 1, 0)) == NULL)	    goto err;	win->_leave = TRUE;	wattrset(win, A_REVERSE | A_DIM);	    /* remove one line from the screen */	LINES = --SP->lsize;	if ((len = (COLS - 1) / (num + 1)) > LABLEN)	{next :	    len = LABLEN;	}    }    /* positions to place labels */    if (len <= 0 || num <= 0 || (_slk_setpos(len, slk->_labx) == ERR))    {	if (win != NULL)	    (void) delwin (win);err :	free(slk);    }    else    {	slk->_num = num;	slk->_len = len;	for (i = 0; i < num; ++i)	{	    cp = slk->_ldis[i];	    ep = cp + len;	    for (; cp < ep; ++cp)		*cp = ' ';	    *ep = '\0';	    slk->_lval[i][0] = '\0';	    slk->_lch[i] = TRUE;	}	slk->_changed = TRUE;	slk->_win = win;	_do_slk_ref = _slk_update;	_do_slk_tch = slk_touch;	_do_slk_noref = slk_noutrefresh;	SP->slk = slk;    }}/* * Compute placements of labels. The general idea is to spread * the groups out evenly. This routine is designed for the day * when > 8 labels and other kinds of groupings may be desired. * * The main assumption behind the algorithm is that the total * # of labels in all the groups is <= LABMAX. * * len: length of a label * labx: to return the coords of the labels. */static_slk_setpos(len, labx)int	len;short	*labx;{    register	int	i, k, n, spread, left, begadd;    int		grpx[LABMAX];    /* compute starting coords for each group */    grpx[0] = 0;    if (_ngroups > 1)    {	/* spacing between groups */	for (i = 0, n = 0; i < _ngroups; ++i)	    n += _groups[i] * (len + 1) - 1;	if ((spread = (COLS - (n + 1))/(_ngroups - 1)) <= 0)	    return (ERR);	left = (COLS-(n + 1)) % (_ngroups - 1);	begadd = (_ngroups / 2) - (left / 2);	/* coords of groups */	for (i = 1; i < _ngroups; ++i)	{	    grpx[i] = grpx[i - 1] + (_groups[i - 1] * (len + 1) - 1) + spread;	    if (left > 0 && i > begadd)	    {		grpx[i]++;		left--;	    }	}    }    /* now set coords of each label */    n = 0;    for (i = 0; i < _ngroups; ++i)	for (k = 0; k < _groups[i]; ++k)	    labx[n++] = grpx[i] + k * (len + 1);    return (OK);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -