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

📄 rdfmt.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
#include "fio.h"#include "fmt.h"extern int cursor;rd_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len;{	int ch;	for(;cursor>0;cursor--) if((ch=(*getn)())<0) return(ch);	if(cursor<0)	{	if(recpos+cursor < 0) err(elist->cierr,110,"fmt")		if(curunit->useek) fseek(cf,(long) cursor,1);		else err(elist->cierr,106,"fmt");		cursor=0;	}	switch(p->op)	{	default: fprintf(stderr,"rd_ed, unexpected code: %d\n%s\n",			p->op,fmtbuf);		abort();	case I: ch = (rd_I(ptr,p->p1,len, 10));		break;	case IM: ch = (rd_I(ptr,p->p1,len, 10));		break;	case O: ch = (rd_I(ptr, p->p1, len, 8));		break;	case L: ch = (rd_L(ptr,p->p1));		break;	case A:	ch = (rd_A(ptr,len));		break;	case AW:		ch = (rd_AW(ptr,p->p1,len));		break;	case E: case EE:	case D:	case G:	case GE:	case F:	ch = (rd_F(ptr,p->p1,p->p2,len));		break;	}	if(ch == 0) return(ch);	else if(feof(cf)) return(EOF);	clearerr(cf);	return(errno);}rd_ned(p,ptr) char *ptr; struct syl *p;{	switch(p->op)	{	default: fprintf(stderr,"rd_ned, unexpected code: %d\n%s\n",			p->op,fmtbuf);		abort();	case APOS:		return(rd_POS(p->p1));	case H:	return(rd_H(p->p1,p->p2));	case SLASH: return((*donewrec)());	case TR:	case X:	cursor += p->p1;		return(1);	case T: cursor=p->p1-recpos;		return(1);	case TL: cursor -= p->p1;		return(1);	}}rd_I(n,w,len, base) ftnlen len; uint *n; register int base;{	long x=0;	int i,sign=0,ch;	for(i=0;i<w;i++)	{		if((ch=(*getn)())<0) return(ch);		switch(ch)		{		default:			return(errno=115);		case ',': goto done;		case '+': break;		case '-':			sign=1;			break;		case '\n':		case ' ':			if(cblank) x *= base;			break;		case '0': case '1': case '2': case '3': case '4':		case '5': case '6': case '7': case '8': case '9':			x=base*x+ch-'0';			break;		}	}done:	if(sign) x = -x;	if(len==sizeof(short)) n->is=x;	else if(len == sizeof(char)) n->ic = x;	else n->il=x;	return(0);}rd_L(n,w) ftnint *n;{	int ch,i,v = -1;	for(i=0;i<w;i++)	{	if((ch=(*getn)())<0) return(ch);		if(ch=='t' && v==-1) v=1;		else if(ch=='f' && v==-1) v=0;		else if(ch==',') return(0);	}	if(v==-1)	{	errno=116;		return(1);	}	*n=v;	return(0);}rd_F(p,w,d,len) ftnlen len; ufloat *p;{	double x,y;	int i,sx,sz,ch,dot,ny,z,sawz;	x=y=0;	sawz=z=ny=dot=sx=sz=0;	for(i=0;i<w;)	{	i++;		if((ch=(*getn)())<0) return(ch);		else if(ch == ' ' && !cblank || ch == '+' && x == 0			|| ch == '\n' && !cblank) continue;		else if(ch=='-' && x==0) sx=1;		else if(ch == '+' || ch == '-') goto expon;		else if(ch<='9' && ch>='0')			x=10*x+ch-'0';		else if(ch=='e' || ch=='d' || ch=='.')			break;		else if(cblank && (ch==' ' || ch== '\n')) x*=10;		else if(ch==',')		{	i=w;			break;		}		else return(errno = 115);	}	if(ch=='.') dot=1;	while(i<w && ch!='e' && ch!='d' && ch!='+' && ch!='-')	{	i++;		if((ch=(*getn)())<0) return(ch);		else if(ch<='9' && ch>='0')			y=10*y+ch-'0';		else if(cblank && (ch==' ' || ch == '\n'))			y *= 10;		else if(ch==',') {i=w; break;}		else if(ch==' ') continue;		else continue;		ny++;	}expon:	if(ch=='-') sz=1;	while(i<w)	{	i++;		sawz=1;		if((ch=(*getn)())<0) return(ch);		else if(ch=='-') sz=1;		else if(ch<='9' && ch>='0')			z=10*z+ch-'0';		else if(cblank && (ch==' ' || ch == '\n'))			z *= 10;		else if(ch==',') break;		else if(ch==' ') continue;		else if(ch=='+') continue;		else if(ch!='\n') return(errno=115);	}	if(!dot)		for(i=0;i<d;i++) x /= 10;	for(i=0;i<ny;i++) y /= 10;	x=x+y;	if(sz)		for(i=0;i<z;i++) x /=10;	else	for(i=0;i<z;i++) x *= 10;	if(sx) x = -x;	if(!sawz)	{		for(i=scale;i>0;i--) x /= 10;		for(i=scale;i<0;i++) x *= 10;	}	if(len==sizeof(float)) p->pf=x;	else p->pd=x;	return(0);}rd_A(p,len) char *p; ftnlen len;{	int i,ch;	for(i=0;i<len;i++)	{	GET(ch);		*p++=VAL(ch);	}	return(0);}rd_AW(p,w,len) char *p; ftnlen len;{	int i,ch;	if(w>=len)	{	for(i=0;i<w-len;i++)			GET(ch);		for(i=0;i<len;i++)		{	GET(ch);			*p++=VAL(ch);		}		return(0);	}	for(i=0;i<w;i++)	{	GET(ch);		*p++=VAL(ch);	}	for(i=0;i<len-w;i++) *p++=' ';	return(0);}rd_H(n,s) char *s;{	int i,ch;	for(i=0;i<n;i++)		if((ch=(*getn)())<0) return(ch);		else *s++ = ch=='\n'?' ':ch;	return(1);}rd_POS(s) char *s;{	char quote;	int ch;	quote= *s++;	for(;*s;s++)		if(*s==quote && *(s+1)!=quote) break;		else if((ch=(*getn)())<0) return(ch);		else *s = ch=='\n'?' ':ch;	return(1);}

⌨️ 快捷键说明

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