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

📄 vmtbl.c

📁 早期freebsd实现
💻 C
字号:
#ifdef PSC# include <stdio.h># include "sc.h"# ifndef FALSE#  define	FALSE	0#  define	TRUE	1# endif /* !FALSE */# undef	error# define error(msg)	fprintf(stderr, msg);#else /* PSC */# include <curses.h># include "sc.h"#endif /* PSC */extern	char	*malloc();extern	char	*realloc();#if defined(BSD42) || defined(BSD43)#define	memcpy(dest, source, len)	bcopy(source, dest, (unsigned int)len);#define	memset(dest, zero, len)		bzero((dest), (unsigned int)(len));#endif/* * check to see if *rowp && *colp are currently allocated, if not expand the * current size if we can. */#ifndef PSCvoidcheckbounds(rowp, colp)int	*rowp;int	*colp;{	if (*rowp < 0)		*rowp = 0;	else if (*rowp >= maxrows)	{	if (*colp >= maxcols)		{	if (!growtbl(GROWBOTH, *rowp, *colp))			{	*rowp = maxrows -1;				*colp = maxcols -1;			}			return;		}		else		{	if (!growtbl(GROWROW, *rowp, 0))				*rowp = maxrows-1;			return;		}	}	if (*colp < 0) 		*colp = 0;	else if (*colp >= maxcols)	{	if (!growtbl(GROWCOL, 0, *colp));			*colp = maxcols-1;	}}#endif /* !PSC */	#define GROWALLOC(newptr, oldptr, nelem, type, msg) \	if (oldptr == (type *)NULL) \		newptr = (type *)malloc((unsigned)(nelem*sizeof(type))); \	else \		newptr = (type *)realloc((char *)oldptr, \					 (unsigned)(nelem*sizeof(type))); \	if (newptr == (type *)NULL) \	{   error(msg); \	    return(FALSE); \	} \	oldptr = newptr /* wait incase we can't alloc */static	char	nolonger[] = "The table can't be any longer";static	char	nowider[] = "The table can't be any wider";/* * grow the main && auxiliary tables (reset maxrows/maxcols as needed) * toprow &&/|| topcol tell us a better guess of how big to become. * we return TRUE if we could grow, FALSE if not.... */intgrowtbl(rowcol, toprow, topcol)int	rowcol;int	toprow, topcol;{	struct ent ***tbl2;	int	*fwidth2;	int	*precision2;	char	*col_hidden2;	char	*row_hidden2;	int	newrows, newcols;	int	i;#ifndef PSC	newrows = maxrows;#endif /* !PSC */	newcols = maxcols;	if (rowcol == GROWNEW)	{#ifndef PSC		maxrows = toprow = 0;		/* when we first start up, fill the screen w/ cells */		{	int startval;			startval = LINES - RESROW;			newrows = startval > MINROWS ? startval : MINROWS;			startval = ((COLS) - RESCOL) / DEFWIDTH;			newcols = startval > MINCOLS ? startval : MINCOLS;		}#else		newcols = MINCOLS;#endif /* !PSC */		maxcols = topcol = 0;	}#ifndef PSC	/* set how much to grow */	if ((rowcol == GROWROW) || (rowcol == GROWBOTH))	{	if (toprow > maxrows)			newrows = GROWAMT + toprow;		else			newrows += GROWAMT;	}#endif /* !PSC */	if ((rowcol == GROWCOL) || (rowcol == GROWBOTH))	{	if ((rowcol == GROWCOL) && ((maxcols == ABSMAXCOLS) ||					(topcol >= ABSMAXCOLS)))		{	error(nowider);			return(FALSE);		}		if (topcol > maxcols)			newcols = GROWAMT + topcol;		else			newcols += GROWAMT;		if (newcols > ABSMAXCOLS)			newcols = ABSMAXCOLS;	}#ifndef PSC	if ((rowcol == GROWROW) || (rowcol == GROWBOTH) || (rowcol == GROWNEW))	{		GROWALLOC(row_hidden2, row_hidden, newrows, char, nolonger);		memset(row_hidden+maxrows, 0, (newrows-maxrows)*sizeof(char));		/* alloc tbl row pointers */		GROWALLOC(tbl2, tbl, newrows, struct ent **, nolonger);		memset(tbl+maxrows, 0, (newrows-maxrows)*(sizeof(struct ent **)));	}#endif /* !PSC */	if ((rowcol == GROWCOL) || (rowcol == GROWBOTH) || (rowcol == GROWNEW))	{		GROWALLOC(fwidth2, fwidth, newcols, int, nowider);		GROWALLOC(precision2, precision, newcols, int, nowider);#ifdef PSC		memset(fwidth+maxcols, 0, (newcols-maxcols)*sizeof(int));		memset(precision+maxcols, 0, (newcols-maxcols)*sizeof(int));	}#else		GROWALLOC(col_hidden2, col_hidden, newcols, char, nowider);		memset(col_hidden+maxcols, 0, (newcols-maxcols)*sizeof(char));		for (i = maxcols; i < newcols; i++) {			fwidth[i] = DEFWIDTH;			precision[i] = DEFPREC;		}		/* [re]alloc the space for each row */		for (i = 0; i < maxrows; i++)		{		    if ((tbl[i] = (struct ent **)realloc((char *)tbl[i],			(unsigned)(newcols * sizeof(struct ent **)))) == (struct ent **)0)			{	error(nowider);				return(FALSE);			}		    memset((char *)ATBL(tbl,i, maxcols), 0,			   (newcols-maxcols)*sizeof(struct ent **));		}	}	else		i = maxrows;	/* fill in the bottom of the table */	for (; i < newrows; i++)	{	if ((tbl[i] = (struct ent **)malloc((unsigned)(newcols *				sizeof(struct ent **)))) == (struct ent **)0)		{	error(nowider);			return(FALSE);		}		memset((char *)tbl[i], 0, newcols*sizeof(struct ent **));	}	FullUpdate++;	maxrows = newrows;#endif /* PSC */	maxcols = newcols;	return(TRUE);}

⌨️ 快捷键说明

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