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

📄 ll_sub.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[] = "@(#)ll_sub.c 1.1 92/07/30 SMI"; /* from S5R3 1.4.1.1 */#endif#include "curses.ext"/* * _line_alloc returns a pointer to a new line structure. * One is malloc'd if none is available on the free list. */struct line *_line_alloc (){	register struct line   *rv = SP->freelist;	char *malloc();#ifdef DEBUG	if(outf) fprintf(outf, "mem: _line_alloc (), prev SP->freelist %x\n", SP->freelist);#endif	if (rv) {		SP->freelist = rv -> next;	} else {#ifdef NONSTANDARD		_ec_quit("No lines available in line_alloc", "");#else		rv = (struct line *) malloc (sizeof *rv);		if (rv == NULL)			(void) fprintf (stderr, "malloc returned NULL in _line_alloc \n");		rv -> body = (chtype *) malloc (columns * sizeof (chtype));		if (rv->body == NULL)			(void) fprintf (stderr, "malloc returned NULL in _line_alloc \n");#endif	}	rv -> length = 0;	rv -> hash = 0;#ifdef DEBUG	if(outf) fprintf(outf, "_line_alloc (), rv= %x, rv->body= %x.\n",		rv, rv->body);#endif	return rv;}/* '_line_free' returns a line object to the free list */_line_free (p)register struct line   *p;{	register int i, sl, n=0;	register struct line **q;	if (p == NULL)		return;#ifdef DEBUG	if(outf) fprintf(outf, "mem: Releaseline (%x), prev SP->freelist %x", p, SP->freelist);#endif	/*	 * see how many places this line is being used. only return	 * it to the free list if it is only used once.	 */	sl = lines;	for (i=sl,q = &SP->cur_body[sl]; i>0; i--,q--)		if (p == *q)			n++;	for (i=sl,q = &SP->std_body[sl]; i>0; i--,q--)		if (p == *q)			n++;#ifdef DEBUG	if(outf) fprintf(outf, ", count %d\n", n);#endif	if (n > 1)		return;	p -> next = SP->freelist;	p -> hash = -888;	SP->freelist = p;}/* * update line length */_ll_endmove(){	register struct line *p;	register int newcol;#ifdef DEBUG	if(outf) fprintf(outf, "_ll_endmove()\n");#endif	if (SP->virt_y >= 0 && (p=SP->std_body[SP->virt_y+1]) &&	    p->length < SP->virt_x) {		newcol = SP->virt_x >= columns ?			columns : SP->virt_x;		if (newcol > p->length)			p->length = newcol;	}}/* * Validate row and col. Update virtx/y. */_ll_setyx(row,col)register int row, col;{	if (row > lines)		row = lines;	if (col > columns)		col = columns;	SP->virt_x = col;	SP->virt_y = row;}/* * _ll_move positions the cursor at position (row,col) * in the virtual screen */_ll_move (row, col)register int row, col;{	register struct line *p, *cp;	register int l;	register int rp1;#ifdef DEBUG	if(outf) fprintf(outf, "_ll_move(%d, %d)\n", row, col);#endif	_ll_endmove();	/*	 * Validate row and col. Update virtx/y. This is identical code to	 * _ll_setxy above, but done here to keep the new values of row & col.	 */	if (row > lines)		row = lines;	if (col > columns)		col = columns;	SP->virt_x = col;	SP->virt_y = row;	if (row < 0 || col < 0)		return;	/*	 * allocate a line for std_body[row] and copy in info from cur_body[row]	 */	rp1 = row + 1;	SP->fl_changed = TRUE;	cp = SP->cur_body[rp1];	if (SP->std_body[rp1] == cp || !SP->std_body[rp1])  {		p = _line_alloc();		if (cp) {			p->length = l = cp->length;			memcpy((char *)&(p->body[0]), (char *)&(cp->body[0]),				l * (int)sizeof(chtype));		}		SP->std_body[rp1] = p;	} else		p = SP->std_body[rp1];	p -> hash = 0;	/*	 * if virty is past end of row, set rest of row to blanks.	 */	l = col - p->length;	if (l > 0) {		memSset(&p->body[p->length], (chtype) ' ', l);		p->length = col;	}	SP->curptr = &(p -> body[col]);}/* * This hash function is skewed to the right-most BITS characters on * the screen line (after leading and trailing blanks are removed from * consideration), where BITS is the number of bits in an int. Ignoring * the internal blanks within a line helps with boxed windows that have * short lines at the left hand side of the boxed area. */_comphash (p)register struct line   *p;{	register chtype  *c, *l;	register int rc;	if (p == NULL)		return;	if (p -> hash)		return;	rc = 1;	c = p -> body;	l = &p -> body[p -> length];	while (--l > c && *l == ' ')		;	while (c <= l && *c == ' ')		c++;	p -> bodylen = l - c + 1;	for ( ; c <= l ; c++)		if (*c != ' ')			rc = (rc<<1) + *c;	p -> hash = rc;	if (p->hash == 0)		p->hash = 123;	else if (p->hash == -888)		p->hash = 124;}

⌨️ 快捷键说明

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