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

📄 lread.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
#ifndef lintstatic char	*sccsid = " @(#)lread.c	1.2	(ULTRIX)	1/16/86";#endif lint/************************************************************************ *									* *			Copyright (c) 1986 by				* *		Digital Equipment Corporation, Maynard, MA		* *			All rights reserved.				* *									* *   This software is furnished under a license and may be used and	* *   copied  only  in accordance with the terms of such license and	* *   with the  inclusion  of  the  above  copyright  notice.   This	* *   software  or  any  other copies thereof may not be provided or	* *   otherwise made available to any other person.  No title to and	* *   ownership of the software is hereby transferred.			* *									* *   This software is  derived  from  software  received  from  the	* *   University    of   California,   Berkeley,   and   from   Bell	* *   Laboratories.  Use, duplication, or disclosure is  subject  to	* *   restrictions  under  license  agreements  with  University  of	* *   California and with AT&T.						* *									* *   The information in this software is subject to change  without	* *   notice  and should not be construed as a commitment by Digital	* *   Equipment Corporation.						* *									* *   Digital assumes no responsibility for the use  or  reliability	* *   of its software on equipment which is not supplied by Digital.	* *									* ************************************************************************//**************************************************************************			Modification History**	David Metsky		10-Jan-86** 001	Replaced old version with BSD 4.3 version as part of upgrade.**	Based on:	lread.c		5.2		7/30/85**************************************************************************//* * list directed read */#include "fio.h"#include "lio.h"#define SP 1#define B  2#define AP 4#define EX 8#define D 16#define EIN 32#define isblnk(x)	(ltab[x+1]&B)	/* space, tab, newline */#define issep(x)	(ltab[x+1]&SP)	/* space, tab, newline, comma */#define isapos(x)	(ltab[x+1]&AP)	/* apost., quote mark, \02 */#define isexp(x)	(ltab[x+1]&EX)	/* d, e, D, E */#define isdigit(x)	(ltab[x+1]&D)#define endlinp(x)	(ltab[x+1]&EIN)	/* EOF, newline, / */#define GETC(x) (x=(*getn)())LOCAL char lrd[] = "list read";LOCAL char *lchar;LOCAL double lx,ly;LOCAL int ltype;int l_read(),t_getc(),ungetc();LOCAL char ltab[128+1] ={			EIN, 		/* offset one for EOF *//*   0- 15 */	0,0,AP,0,0,0,0,0,0,SP|B,SP|B|EIN,0,0,0,0,0, /* ^B,TAB,NEWLINE *//*  16- 31 */	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*  32- 47 */	SP|B,0,AP,0,0,0,0,AP,0,0,0,0,SP,0,0,EIN, /* space,",',comma,/ *//*  48- 63 */	D,D,D,D,D,D,D,D,D,D,0,0,0,0,0,0,	/* digits 0-9 *//*  64- 79 */	0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,	/* D,E *//*  80- 95 */	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*  96-111 */	0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,	/* d,e *//* 112-127 */	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};s_rsle(a) cilist *a;	/* start read sequential list external */{	int n;	reading = YES;	formatted = LISTDIRECTED;	fmtbuf = "ext list io";	if(n=c_le(a,READ)) return(n);	l_first = YES;	lquit = NO;	lioproc = l_read;	getn = t_getc;	ungetn = ungetc;	leof = curunit->uend;	lcount = 0;	ltype = NULL;	if(curunit->uwrt && ! nowreading(curunit)) err(errflag, errno, lrd)	return(OK);}LOCALt_getc(){	int ch;	if(curunit->uend) return(EOF);	if((ch=getc(cf))!=EOF) return(ch);	if(feof(cf))	{	curunit->uend = YES;		leof = EOF;	}	else clearerr(cf);	return(EOF);}e_rsle(){	int ch;	if(curunit->uend) return(EOF);	while(GETC(ch) != '\n' && ch != EOF);	return(ch==EOF?EOF:OK);}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(leof) err(endflag, EOF, lrd)		if(l_first)		{	l_first = NO;			while(isblnk(GETC(ch)));	/* skip blanks */			(*ungetn)(ch,cf);		}		else if(lcount==0)		/* repeat count == 0 ? */		{	ERR(t_sep());  /* look for non-blank, allow 1 comma */			if(lquit) return(OK);	/* slash found */		}		switch((int)type)		{		case TYSHORT:		case TYLONG:		case TYREAL:		case TYDREAL:			ERR(l_R(1));			break;		case TYCOMPLEX:		case TYDCOMPLEX:			ERR(l_C());			break;		case TYLOGICAL:			ERR(l_L());			break;		case TYCHAR:			ERR(l_CHAR());			break;		}		 		/* peek at next character; it should be separator or new line */ 		GETC(ch); (*ungetn)(ch,cf); 		if(!issep(ch) && !endlinp(ch)) { 			while(GETC(ch)!= '\n' && ch != EOF); 			err(errflag,F_ERLIO,lrd); 		} 		if(lquit) return(OK);		if(leof) err(endflag,EOF,lrd)		else if(external && ferror(cf)) err(errflag,errno,lrd)		if(ltype) switch((int)type)		{		case TYSHORT:			ptr->flshort=lx;			break;		case TYLOGICAL:			if(len == sizeof(short))				ptr->flshort = lx;			else				ptr->flint = lx;			break;		case TYLONG:			ptr->flint=lx;			break;		case TYREAL:			ptr->flreal=lx;			break;		case TYDREAL:			ptr->fldouble=lx;			break;		case TYCOMPLEX:			xx=(float *)ptr;			*xx++ = ly;			*xx = lx;			break;		case TYDCOMPLEX:			yy=(double *)ptr;			*yy++ = ly;			*yy = lx;			break;		case TYCHAR:			b_char(lchar,(char *)ptr,len);			break;		}		if(lcount>0) lcount--;		ptr = (flex *)((char *)ptr + len);	}	return(OK);}LOCALlr_comm(){	int ch;	if(lcount) return(lcount);	ltype=NULL;	while(isblnk(GETC(ch)));	(*ungetn)(ch,cf);	if(ch==',')	{	lcount=1;		return(lcount);	}	if(ch=='/')	{	lquit = YES;		return(lquit);	}	else		return(OK);}LOCALget_repet(){	char ch;	double lc;	if(isdigit(GETC(ch)))	{	(*ungetn)(ch,cf);		rd_int(&lc);		lcount = (int)lc;		if(GETC(ch)!='*')			if(leof) return(EOF);			else return(F_ERREPT);	}	else	{	lcount = 1;		(*ungetn)(ch,cf);	}	return(OK);}LOCALl_R(flg) int flg;{	double a,b,c,d;	int da,db,dc,dd;	int i,ch,sign=0;	a=b=c=d=0;	da=db=dc=dd=0;	if( flg )		/* real */	{		if(lr_comm()) return(OK);		da=rd_int(&a);	/* repeat count ? */		if(GETC(ch)=='*')		{			if (a <= 0.) return(F_ERNREP);			lcount=(int)a;			if (nullfld()) return(OK);	/* could be R* */			db=rd_int(&b);	/* whole part of number */		}		else		{	(*ungetn)(ch,cf);			db=da;			b=a;			lcount=1;		}	}	else		   /* complex */	{		db=rd_int(&b);	}	if(GETC(ch)=='.' && isdigit(GETC(ch)))	{	(*ungetn)(ch,cf);		dc=rd_int(&c);	/* fractional part of number */	}	else	{	(*ungetn)(ch,cf);		dc=0;		c=0.;	}	if(isexp(GETC(ch)))		dd=rd_int(&d);	/* exponent */	else if (ch == '+' || ch == '-')	{	(*ungetn)(ch,cf);		dd=rd_int(&d);	}	else	{	(*ungetn)(ch,cf);		dd=0;	}	if(db<0 || b<0)	{	sign=1;		b = -b;	}	for(i=0;i<dc;i++) c/=10.;	b=b+c;	if (dd > 0)	{	for(i=0;i<d;i++) b *= 10.;		for(i=0;i< -d;i++) b /= 10.;	}	lx=sign?-b:b;	ltype=TYLONG;	return(OK);}LOCALrd_int(x) double *x;{	int ch,sign=0,i=0;	double y=0.0;	if(GETC(ch)=='-') sign = -1;	else if(ch=='+') sign=0;	else (*ungetn)(ch,cf);	while(isdigit(GETC(ch)))	{	i++;		y=10*y + ch-'0';	}	(*ungetn)(ch,cf);	if(sign) y = -y;	*x = y;	return(y==0.0?sign:i); /* 0:[+]&&y==0, -1:-&&y==0, >0:#digits&&y!=0 */}LOCALl_C(){	int ch,n;	if(lr_comm()) return(OK);	if(n=get_repet()) return(n);		/* get repeat count */	if (nullfld()) return(OK);		/* could be R* */	if(GETC(ch)!='(') err(errflag,F_ERLIO,"no (")	while(isblnk(GETC(ch)));	(*ungetn)(ch,cf);	l_R(0);		/* get real part */	ly = lx;	if(t_sep()) return(EOF);	l_R(0);		/* get imag part */	while(isblnk(GETC(ch)));	if(ch!=')') err(errflag,F_ERLIO,"no )")	ltype = TYCOMPLEX;	return(OK);}LOCALl_L(){	int ch,n;	if(lr_comm()) return(OK);	if(n=get_repet()) return(n);		/* get repeat count */	if (nullfld()) return(OK);		/* could be R* */	if(GETC(ch)=='.') GETC(ch);	switch(ch)	{	case 't':	case 'T':		lx=1;		break;	case 'f':	case 'F':		lx=0;		break;	default:		if(issep(ch))		{	(*ungetn)(ch,cf);			lx=0;			return(OK);		}		else if(ch==EOF) return(EOF);		else	err(errflag,F_ERLIO,"logical not T or F");	}	ltype=TYLOGICAL;	while(!issep(GETC(ch)) && !endlinp(ch));	(*ungetn)(ch,cf);	return(OK);}#define BUFSIZE	128LOCALl_CHAR(){	int ch,size,i,n;	char quote,*p;	if(lr_comm()) return(OK);	if(n=get_repet()) return(n);		/* get repeat count */	if (nullfld()) return(OK);		/* could be R* */	if(isapos(GETC(ch))) quote=ch;	else if(issep(ch) || ch==EOF || ch=='\n')	{	if(ch==EOF) return(EOF);		(*ungetn)(ch,cf);		return(OK);	}	else	{	quote = '\0';	/* to allow single word non-quoted */		(*ungetn)(ch,cf);	}	ltype=TYCHAR;	if(lchar!=NULL) free(lchar);	size=BUFSIZE-1;	p=lchar=(char *)malloc(BUFSIZE);	if(lchar==NULL) err(errflag,F_ERSPACE,lrd)	for(i=0;;)	{	while( ( (quote && GETC(ch)!=quote) ||			(!quote && !issep(GETC(ch)) && !endlinp(ch)) )			&& ch!='\n' && ch!=EOF && ++i<size )				*p++ = ch;		if(i==size)		{		newone:			size += BUFSIZE;			lchar=(char *)realloc(lchar, size+1);			if(lchar==NULL) err(errflag,F_ERSPACE,lrd)			p=lchar+i-1;			*p++ = ch;		}		else if(ch==EOF) return(EOF);		else if(ch=='\n')		{	if(*(p-1) == '\\') *(p-1) = ch;			else if(!quote)			{	*p = '\0';				(*ungetn)(ch,cf);				return(OK);			}		}		else if(quote && GETC(ch)==quote)		{	if(++i<size) *p++ = ch;			else goto newone;		}		else		{	(*ungetn)(ch,cf);			*p = '\0';			return(OK);		}	}}LOCALt_sep(){	int ch;	while(isblnk(GETC(ch)));	if(leof) return(EOF);	if(ch=='/')	{	lquit = YES;		(*ungetn)(ch,cf);		return(OK);	}	if(issep(ch)) while(isblnk(GETC(ch)));	if(leof) return(EOF);	(*ungetn)(ch,cf);	return(OK);}LOCALnullfld()	/* look for null field following a repeat count */{	int	ch;	GETC(ch);	(*ungetn)(ch,cf);	if (issep(ch) || endlinp(ch))		return(YES);	return(NO);}

⌨️ 快捷键说明

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