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

📄 tbl.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
字号:
## define ever (;;)# define MAXCHS 2000main(argc,argv)	char *argv[];{char line[200];extern int cin;extern char *cspace;	cspace = getvec(MAXCHS + 100);for ever{	if (argc>1)	{	argc--;	argv++;	if (match(*argv, "-ms"))		*argv = "/usr/lib/tmac.s";	cin = copen(*argv, 'r');	if (cin < 0)		{		printf(2,"where is input file %s\n",*argv);		cexit();		}	}while (gets(line))	if (match(line, ".TS"))		tableput();	else		puts(line);if (argc <= 1) break;}cexit();}# define MAXCOL 35# define MAXLIN 220# define ONELINE 250char *tabentry[MAXLIN][MAXCOL];char extra[MAXCHS];char *cspace, *cstore;char *exstore extra;int sep[MAXCOL], dwide[MAXCOL];char *instead[MAXLIN];int newtab[MAXLIN];char *style[MAXCOL];tableput(){/* read input, write output, make tables on the way */char st[ONELINE], *format;int ilin, nlin, icol, ncol, k, ch, ws, cs, ns;int maxchnge, ct;printf(".TS\n");/* get command line */cstore = cspace;exstore = extra;ncol = 0;for (ilin=0; ilin<MAXLIN; ilin++)	newtab[ilin]=0;gets (st);for (k=0; k<ONELINE && st[k] != '\0'; k++)	if (!space(st[k]))		{		style[ncol] = st+k;		dwide[ncol] =0;		for(; letter(st[k]); k++)			{			if ((st[k]=='n' || st[k] == 'N') &&				!dwide[ncol])				{				dwide[ncol]=1;				sep[ncol++] = 0;				style[ncol] = style[ncol-1];				dwide [ncol] = 0;				}			}		if (digit(st[k]))			sep[ncol] = numb(st+k);		else			sep[ncol] = 3;		ncol++;		while (digit(st[k]))			st[k++] = '\0';		if (st[k] == '\0')			break;		st[k] = '\0';		}/* now get input lines */for (nlin=0; gets(cstore) && !match(cstore, ".TE"); nlin++)	{	if (cstore[0] == '.' && letter(cstore[1]))		{		instead[nlin] = cstore;		while (*cstore) cstore++;		}	else instead[nlin] = 0;	for (icol = 0; icol <ncol; icol++)		{		tabentry[nlin][icol] = cstore;		for(; (ch= *cstore) != '\0' && ch != '\t'; cstore++)				;		*cstore++ = '\0';		if (dwide[icol] )			if (broken(style[icol],nlin))				{				tabentry[nlin][icol+1]=maknew(tabentry[nlin][icol]);				icol++;				if (tabentry[nlin][icol] ==0)					newtab[nlin]=newtab[nlin+1]=1;				}			else				tabentry[nlin][++icol] = 0;		while (span(style[icol+1],nlin) )			tabentry[nlin][++icol] = "";		if (ch == '\0') break;		}	while (++icol <ncol)		tabentry[nlin][icol] = "";	while (*cstore != '\0')		 *cstore++;	if (cstore-cspace > MAXCHS)		cstore = cspace  = getvec(MAXCHS+100);	}/* find longest command string */for (icol=maxchnge=0; icol<ncol; icol++)	if (slen(style[icol]) >maxchnge)		maxchnge = slen(style[icol]);/* set tab stops */printf(".nr 49 0\n");for (icol = 0; icol<ncol; icol++)	{	ct = 1 + (icol>0 ? sep[icol-1] : 0);	printf(".nr %2d 0\n", icol+50);	for (ilin=0; ilin < nlin; ilin++)		{		if (icol>0 && dwide[icol-1]>0 && tabentry[ilin][icol]==0)			{			printf(".nr 48 \\n(%2d+\\w'%s'+%dn\n",				icol+48, tabentry[ilin][icol-1], sep[icol-1]);			printf(".if \\n(48-\\n(%2d .nr %2d \\n(48\n",				icol+50,icol+50);			}		if ( !span(style[icol],ilin) && /* not part of span */		   (dwide[icol] == 0 || tabentry[ilin][icol+1]!= 0)				/* not a double item */		     && (!span(style[icol+1],ilin) || icol==ncol))			{			printf(".nr 47 \\n(%2d+\\w'%s'+%dn\n",			icol+49,tabentry[ilin][icol], ct);			printf(".if \\n(47-\\n(%2d .nr %2d \\n(47\n",				icol+50,icol+50);			}		}	/* clean up spanned headings */	for(ilin=0; ilin<maxchnge; ilin++)		{		if( !(span(style[icol],ilin)) &&		  (icol ==1 || dwide[icol-1] == 0) &&		  span(style[icol+(dwide[icol]?2:1)],ilin))			printf(".nr %d \\n(%2d+\\w'%s'+%dn\n",			  ilin+30, icol+49, tabentry[ilin][icol], ct);		else if (span(style[icol],ilin) &&		  (icol+1==ncol || !span(style[icol+1],ilin)))			printf(".if \\n(%d-\\n(%d .nr %d \\n(%d\n",				30+ilin, icol+50, icol+50, ilin+30);		}	}/* run out table, put field characters in */printf (".fc  @\n");for (ilin=0; ilin<nlin; ilin++)	{	if (instead[ilin])		{		printf("%s\n",instead[ilin]);		continue;		}	/* is a new set of tab stops needed */	if (ilin < maxchnge || newtab[ilin])		settab(ncol, ilin);	for (icol=0; icol<ncol; icol++)		{		switch ( ylet(style[icol],ilin))			{			default:			case 'L': case 'l':				format = "%s@"; break;			case 'R': case 'r':				format= "@%s"; break;			case 'n': case 'N':				if (!dwide[icol] || tabentry[ilin][icol+1] != 0)					{					format=dwide[icol]? "@%s" : "%s@";					break;					}			case 'c': case 'C':				format = "@%s@"; break;			case 's':  case 'S':				format= "";				break;			}		if (! (dwide [icol-1]>0 && tabentry[ilin][icol] == 0 ))		printf(format, tabentry[ilin][icol]);		if (!span(style[icol+1],ilin))			for (k=sep[icol]; k>0; k--)				printf(" ");		}	printf("\n");	}printf(".fc\n");printf(".TE\n");}match (s1, s2)	char *s1, *s2;{	while (*s1 == *s2)		if (*s1++ == '\0')			return(1);		else			*s2++;	return(0);}slen(str)	char *str;{	int k;	for (k=0; *str++ != '\0'; k++);	return(k);}space(ch)	{	switch (ch)		{		case ' ': case '\t':			return(1);	}	return(0);	}letter (ch)	{	if (ch >= 'a' && ch <= 'z')		return(1);	if (ch >= 'A' && ch <= 'Z')		return(1);	return(0);	}numb(str)	char *str;	{	/* convert to integer */	int k;	for (k=0; *str >= '0' && *str <= '9'; str++)		k = k*10 + *str - '0';	return(k);	}broken(str, nlin)	{	switch(ylet(str,nlin))		{		case 'n': case 'N':			return(1);		}	return(0);	}ylet (str, k)	char *str;{	k++;	while (*str &&k--)		str++;	return(*--str);}span(str, k)	{	switch(ylet(str,k))		{		case 's': case 'S':			return(1);		}	return(0);	}maknew(str)	char *str;{	/* make two numerical fields */	int point;	char *p, *q;	p = str;	for (point=0; *str; str++)		if (*str=='.')			point=1;	if (!point && *(str-1)== '$')		return(0);	for(; str>p; str--)		if ( (point && *str == '.') ||		    (!point && digit(*(str-1)) ) )			break;	if (!point && p==str) /* not numerical, don't split */		return(0);	p= str;	q = exstore;	while (*exstore++ = *str++);	*p = 0;	return(q);	}digit(x)	{	return(x>= '0' && x<= '9');	}settab(ncol, ilin){	int k, icol;	printf(".ta ");	for (icol = 0; icol<ncol; icol++)	   if ((dwide[icol] == 0 || tabentry[ilin][icol+1] != 0)		&& !span(style[icol+1],ilin))		printf("\\n(%du ",icol+50);	printf("\n");}

⌨️ 快捷键说明

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