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

📄 lread.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
#include "fio.h"#include "fmt.h"#include "lio.h"#include "ctype.h"extern char *fmtbuf;int (*lioproc)();#define isblnk(x) (ltab[x+1]&B)#define issep(x) (ltab[x+1]&SX)#define isapos(x) (ltab[x+1]&AX)#define isexp(x) (ltab[x+1]&EX)#define issign(x) (ltab[x+1]&SG)#define SX 1#define B 2#define AX 4#define EX 8#define SG 16char ltab[128+1]	/* offset one for EOF */{	0,	0,0,AX,0,0,0,0,0,0,0,B,0,0,0,0,0,	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	SX|B,0,AX,0,0,0,0,0,0,0,0,SG,SX,SG,0,SX,	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,	AX,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};int l_first;t_getc(){	int ch;	if(curunit->uend) return(EOF);	if((ch=getc(cf))!=EOF) return(ch);	if(feof(cf)) curunit->uend = 1;	return(EOF);}e_rsle(){	int ch;	if(curunit->uend) return(0);	while((ch=t_getc())!='\n' && ch!=EOF);	return(0);}flag lquit;int lcount,ltype;char *lchar;double lx,ly;#define ERR(x) if(n=(x)) return(n)#define GETC(x) (x=t_getc())l_read(number,ptr,len,type) ftnint *number,type; flex *ptr; ftnlen len;{	int i,n,ch;	double *yy;	float *xx;	for(i=0;i<*number;i++)	{		if(curunit->uend) err(elist->ciend, EOF, "list in")		if(l_first)		{	l_first=0;			for(GETC(ch);isblnk(ch);GETC(ch));			ungetc(ch,cf);		}		else if(lcount==0)		{	ERR(t_sep());			if(lquit) return(0);		}		switch((int)type)		{		case TYSHORT:		case TYLONG:		case TYREAL:		case TYDREAL:			ERR(l_R());			break;		case TYCOMPLEX:		case TYDCOMPLEX:			ERR(l_C());			break;		case TYLOGICAL:			ERR(l_L());			break;		case TYCHAR:			ERR(l_CHAR());			break;		}		if(lquit) return(0);		if(feof(cf)) err(elist->ciend,(EOF),"list in")		else if(ferror(cf))		{	clearerr(cf);			err(elist->cierr,errno,"list in")		}		if(ltype==NULL) goto bump;		switch((int)type)		{		case TYSHORT:			ptr->flshort=lx;			break;		case TYLOGICAL:		case TYLONG:			ptr->flint=lx;			break;		case TYREAL:			ptr->flreal=lx;			break;		case TYDREAL:			ptr->fldouble=lx;			break;		case TYCOMPLEX:			xx=(float *)ptr;			*xx++ = lx;			*xx = ly;			break;		case TYDCOMPLEX:			yy=(double *)ptr;			*yy++ = lx;			*yy = ly;			break;		case TYCHAR:			b_char(lchar,(char *)ptr,len);			break;		}	bump:		if(lcount>0) lcount--;		ptr = (char *)ptr + len;	}	return(0);}l_R(){	double a,b,c,d;	int i,ch,sign=0,da,db,dc;	a=b=c=d=0;	da=db=dc=0;	if(lcount>0) return(0);	ltype=NULL;	for(GETC(ch);isblnk(ch);GETC(ch));	if(ch==',')	{	lcount=1;		return(0);	}	if(ch=='/')	{	lquit=1;		return(0);	}	ungetc(ch,cf);	da=rd_int(&a);	if(da== -1) sign=da;	if(GETC(ch)!='*')	{	ungetc(ch,cf);		db=1;		b=a;		a=1;	}	else		db=rd_int(&b);	if(GETC(ch)!='.')	{	dc=c=0;		ungetc(ch,cf);	}	else	dc=rd_int(&c);	if(isexp(GETC(ch))) db=rd_int(&d);	else if(issign(ch))	{	ungetc(ch, cf);		db = rd_int(&d);	}	else	{	ungetc(ch,cf);		d=0;	}	lcount=a;	if(!db && !dc)		return(0);	if(db && b<0)	{	sign=1;		b = -b;	}	for(i=0;i<dc;i++) c/=10;	b=b+c;	for(i=0;i<d;i++) b *= 10;	for(i=0;i< -d;i++) b /= 10;	if(sign) b = -b;	ltype=TYLONG;	lx=b;	return(0);}rd_int(x) double *x;{	int ch,sign=0,i;	double y;	i=0;	y=0;	if(GETC(ch)=='-') sign = -1;	else if(ch=='+') sign=0;	else ungetc(ch,cf);	while(isdigit(GETC(ch)))	{	i++;		y=10*y+ch-'0';	}	ungetc(ch,cf);	if(sign) y = -y;	*x = y;	return(y!=0?i:sign);}l_C(){	int ch;	if(lcount>0) return(0);	ltype=NULL;	for(GETC(ch);isblnk(ch);GETC(ch));	if(ch==',')	{	lcount=1;		return(0);	}	if(ch=='/')	{	lquit=1;		return(0);	}	if(ch!='(')	{	if(fscanf(cf,"%d",&lcount)!=1)			if(!feof(cf)) err(elist->cierr,112,"no rep")			else err(elist->cierr,(EOF),"lread");		if(GETC(ch)!='*')		{	ungetc(ch,cf);			if(!feof(cf)) err(elist->cierr,112,"no star")			else err(elist->cierr,(EOF),"lread");		}		if(GETC(ch)!='(')		{	ungetc(ch,cf);			return(0);		}	}	lcount = 1;	ltype=TYLONG;	fscanf(cf,"%lf",&lx);	while(isblnk(GETC(ch)));	if(ch!=',')	{	ungetc(ch,cf);		err(elist->cierr,112,"no comma");	}	while(isblnk(GETC(ch)));	ungetc(ch,cf);	fscanf(cf,"%lf",&ly);	while(isblnk(GETC(ch)));	if(ch!=')') err(elist->cierr,112,"no )");	while(isblnk(GETC(ch)));	ungetc(ch,cf);	return(0);}l_L(){	int ch;	if(lcount>0) return(0);	ltype=NULL;	while(isblnk(GETC(ch)));	if(ch==',')	{	lcount=1;		return(0);	}	if(ch=='/')	{	lquit=1;		return(0);	}	if(isdigit(ch))	{	ungetc(ch,cf);		fscanf(cf,"%d",&lcount);		if(GETC(ch)!='*')			if(!feof(cf)) err(elist->cierr,112,"no star")			else err(elist->cierr,(EOF),"lread");	}	else	ungetc(ch,cf);	if(GETC(ch)=='.') GETC(ch);	switch(ch)	{	case 't':	case 'T':		lx=1;		break;	case 'f':	case 'F':		lx=0;		break;	default:		if(isblnk(ch) || issep(ch) || ch==EOF)		{	ungetc(ch,cf);			return(0);		}		else	err(elist->cierr,112,"logical");	}	ltype=TYLONG;	while(!issep(GETC(ch)) && ch!='\n' && ch!=EOF);	return(0);}#define BUFSIZE	128l_CHAR(){	int ch,size,i;	char quote,*p;	if(lcount>0) return(0);	ltype=NULL;	while(isblnk(GETC(ch)));	if(ch==',')	{	lcount=1;		return(0);	}	if(ch=='/')	{	lquit=1;		return(0);	}	if(isdigit(ch))	{	ungetc(ch,cf);		fscanf(cf,"%d",&lcount);		if(GETC(ch)!='*') err(elist->cierr,112,"no star");	}	else	ungetc(ch,cf);	if(GETC(ch)=='\'' || ch=='"') quote=ch;	else if(isblnk(ch) || issep(ch) || ch==EOF)	{	ungetc(ch,cf);		return(0);	}	else err(elist->cierr,112,"no quote");	ltype=TYCHAR;	if(lchar!=NULL) free(lchar);	size=BUFSIZE;	p=lchar=(char *)malloc(size);	if(lchar==NULL) err(elist->cierr,113,"no space");	for(i=0;;)	{	while(GETC(ch)!=quote && ch!='\n'			&& ch!=EOF && ++i<size) *p++ = ch;		if(i==size)		{		newone:			lchar=(char *)realloc(lchar, size += BUFSIZE);			p=lchar+i-1;			*p++ = ch;		}		else if(ch==EOF) return(EOF);		else if(ch=='\n')		{	if(*(p-1) != '\\') continue;			i--;			p--;			if(++i<size) *p++ = ch;			else goto newone;		}		else if(GETC(ch)==quote)		{	if(++i<size) *p++ = ch;			else goto newone;		}		else		{	ungetc(ch,cf);			*p++ = 0;			return(0);		}	}}s_rsle(a) cilist *a;{	int n;	if(!init) f_init();	if(n=c_le(a,READ)) return(n);	reading=1;	external=1;	formatted=1;	l_first=1;	lioproc = l_read;	lcount = 0;	if(curunit->uwrt)		return(nowreading(curunit));	else	return(0);}t_sep(){	int ch;	for(GETC(ch);isblnk(ch);GETC(ch));	if(ch == EOF)		if(feof(cf)) return(EOF);		else return(errno);	if(ch=='/')	{	lquit=1;		return(0);	}	if(ch==',') for(GETC(ch);isblnk(ch);GETC(ch));	ungetc(ch,cf);	return(0);}c_le(a,flag) cilist *a;{	fmtbuf="list io";	if(a->ciunit>=MXUNIT || a->ciunit<0)		err(a->cierr,101,"stler");	scale=recpos=0;	elist=a;	curunit = &units[a->ciunit];	if(curunit->ufd==NULL && fk_open(flag,SEQ,FMT,a->ciunit))		err(a->cierr,102,"lio");	cf=curunit->ufd;	if(!curunit->ufmt) err(a->cierr,103,"lio")	return(0);}do_lio(type,number,ptr,len) ftnint *number,*type; flex *ptr; ftnlen len;{	return((*lioproc)(number,ptr,len,*type));}

⌨️ 快捷键说明

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