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

📄 wrtfmt.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
#include "fio.h"#include "fmt.h"extern int cursor;mv_cur(){	/*buggy, could move off front of record*/	for(;cursor>0;cursor--) (*putn)(' ');	if(cursor<0)	{		if(cursor+recpos<0) err(elist->cierr,110,"left off");		if(curunit->useek) fseek(cf,(long)cursor,1);		else err(elist->cierr,106,"fmt");		cursor=0;	}	return(0);}w_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len;{	if(mv_cur()) return(mv_cur());	switch(p->op)	{	default:		fprintf(stderr,"w_ed, unexpected code: %d\n%s\n",			p->op,fmtbuf);		abort();	case I:	return(wrt_I(ptr,p->p1,len, 10));	case IM:		return(wrt_IM(ptr,p->p1,p->p2,len));	case O:	return(wrt_I(ptr, p->p1, len, 8));	case L:	return(wrt_L(ptr,p->p1));	case A: return(wrt_A(ptr,len));	case AW:		return(wrt_AW(ptr,p->p1,len));	case D:	case E:	case EE:		return(wrt_E(ptr,p->p1,p->p2,p->p3,len));	case G:	case GE:		return(wrt_G(ptr,p->p1,p->p2,p->p3,len));	case F:	return(wrt_F(ptr,p->p1,p->p2,len));	}}w_ned(p,ptr) char *ptr; struct syl *p;{	switch(p->op)	{	default: fprintf(stderr,"w_ned, unexpected code: %d\n%s\n",			p->op,fmtbuf);		abort();	case SLASH:		return((*donewrec)());	case T: cursor = p->p1-recpos;		return(1);	case TL: cursor -= p->p1;		return(1);	case TR:	case X:		cursor += p->p1;		return(1);	case APOS:		return(wrt_AP(p->p1));	case H:		return(wrt_H(p->p1,p->p2));	}}wrt_I(n,w,len, base) uint *n; ftnlen len; register int base;{	int ndigit,sign,spare,i;	long x;	char *ans;	if(len==sizeof(short)) x=n->is;	else if(len == sizeof(char)) x = n->ic;	else x=n->il;	ans=icvt(x,&ndigit,&sign, base);	spare=w-ndigit;	if(sign || cplus) spare--;	if(spare<0)		for(i=0;i<len;i++) (*putn)('*');	else	{	for(i=0;i<spare;i++) (*putn)(' ');		if(sign) (*putn)('-');		else if(cplus) (*putn)('+');		for(i=0;i<ndigit;i++) (*putn)(*ans++);	}	return(0);}wrt_IM(n,w,m,len) uint *n; ftnlen len;{	int ndigit,sign,spare,i,xsign;	long x;	char *ans;	if(sizeof(short)==len) x=n->is;	else if(len == sizeof(char)) x = n->ic;	else x=n->il;	ans=icvt(x,&ndigit,&sign);	if(sign || cplus) xsign=1;	else xsign=0;	if(ndigit+xsign>w || m+xsign>w)	{	for(i=0;i<w;i++) (*putn)('*');		return(0);	}	if(x==0 && m==0)	{	for(i=0;i<w;i++) (*putn)(' ');		return(0);	}	if(ndigit>=m)		spare=w-ndigit-xsign;	else		spare=w-m-xsign;	for(i=0;i<spare;i++) (*putn)(' ');	if(sign) (*putn)('-');	else if(cplus) (*putn)('+');	for(i=0;i<m-ndigit;i++) (*putn)('0');	for(i=0;i<ndigit;i++) (*putn)(*ans++);	return(0);}wrt_AP(n){	char *s,quote;	if(mv_cur()) return(mv_cur());	s=(char *)n;	quote = *s++;	for(;*s;s++)	{	if(*s!=quote) (*putn)(*s);		else if(*++s==quote) (*putn)(*s);		else return(1);	}	return(1);}wrt_H(a,b){	char *s=(char *)b;	if(mv_cur()) return(mv_cur());	while(a--) (*putn)(*s++);	return(1);}wrt_L(n,len) ftnint *n;{	int i;	for(i=0;i<len-1;i++)		(*putn)(' ');	if(*n) (*putn)('t');	else (*putn)('f');	return(0);}wrt_A(p,len) char *p; ftnlen len;{	while(len-- > 0) (*putn)(*p++);	return(0);}wrt_AW(p,w,len) char * p; ftnlen len;{	while(w>len)	{	w--;		(*putn)(' ');	}	while(w-- > 0)		(*putn)(*p++);	return(0);}wrt_E(p,w,d,e,len) ufloat *p; ftnlen len;{	char *s;	int dp,sign,i,delta;	char *ecvt();	if(scale>0) d++;	s=ecvt( (len==sizeof(float)?p->pf:p->pd) ,d,&dp,&sign);	if(sign || cplus) delta=6;	else delta=5;	if(w<delta+d)	{	for(i=0;i<w;i++) (*putn)('*');		return(0);	}	for(i=0;i<w-(delta+d);i++) (*putn)(' ');	if(sign) (*putn)('-');	else if(cplus) (*putn)('+');	if(scale<0 && scale > -d)	{		(*putn)('.');		for(i=0;i<-scale;i++)			(*putn)('0');		for(i=0;i<d+scale;i++)			(*putn)(*s++);	}	else if(scale>0 && scale<d+2)	{	for(i=0;i<scale;i++)			(*putn)(*s++);		(*putn)('.');		for(i=0;i<d-scale;i++)			(*putn)(*s++);	}	else	{	(*putn)('.');		for(i=0;i<d;i++) (*putn)(*s++);	}	if(p->pf != 0) dp -= scale;	else	dp = 0;	if(dp < 100 && dp > -100) (*putn)('e');	if(dp<0)	{	(*putn)('-');		dp = -dp;	}	else	(*putn)('+');	if(e>=3 || dp >= 100)	{	(*putn)(dp/100 + '0');		dp = dp % 100;	}	if(e!=1) (*putn)(dp/10+'0');	(*putn)(dp%10+'0');	return(0);}wrt_G(p,w,d,e,len) ufloat *p; ftnlen len;{	double up = 1,x;	int i,oldscale=scale,n,j;	x= len==sizeof(float)?p->pf:p->pd;	if(x < 0 ) x = -x;	if(x<.1) return(wrt_E(p,w,d,e,len));	for(i=0;i<=d;i++,up*=10)	{	if(x>up) continue;		scale=0;		if(e==0) n=4;		else	n=e+2;		i=wrt_F(p,w-n,d-i,len);		for(j=0;j<n;j++) (*putn)(' ');		scale=oldscale;		return(i);	}	return(wrt_E(p,w,d,e,len));}wrt_F(p,w,d,len) ufloat *p; ftnlen len;{	int i,delta,dp,sign,n;	double x;	char *s,*fcvt();	x= (len==sizeof(float)?p->pf:p->pd);	if(scale)	{	if(scale>0)			for(i=0;i<scale;i++) x*=10;		else	for(i=0;i<-scale;i++) x/=10;	}	s=fcvt(x,d,&dp,&sign);	if(-dp>=d) sign=0;	if(sign || cplus) delta=2;	else delta=1;	n= w - (d+delta+(dp>0?dp:0));	if(n<0)	{		for(i=0;i<w;i++) PUT('*');		return(0);	}	for(i=0;i<n;i++) PUT(' ');	if(sign) PUT('-');	else if(cplus) PUT('+');	for(i=0;i<dp;i++) PUT(*s++);	PUT('.');	for(i=0;i< -dp && i<d;i++) PUT('0');	for(;i<d;i++)	{	if(*s) PUT(*s++);		else PUT('0');	}	return(0);}

⌨️ 快捷键说明

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