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

📄 doio.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 5 页
字号:
	    if (stio->ofp && stio->ofp != stio->ifp) {		/* a socket */		retval = (fclose(stio->ofp) != EOF);		fclose(stio->ifp);	/* clear stdio, fd already closed */	    }	    else		retval = (fclose(stio->ifp) != EOF);	}	stio->ofp = stio->ifp = Nullfp;    }    if (explicit)	stio->lines = 0;    stio->type = ' ';    return retval;}booldo_eof(stab)STAB *stab;{    register STIO *stio;    int ch;    if (!stab) {			/* eof() */	if (argvstab)	    stio = stab_io(argvstab);	else	    return TRUE;    }    else	stio = stab_io(stab);    if (!stio)	return TRUE;    while (stio->ifp) {#ifdef STDSTDIO			/* (the code works without this) */	if (stio->ifp->_cnt > 0)	/* cheat a little, since */	    return FALSE;		/* this is the most usual case */#endif	ch = getc(stio->ifp);	if (ch != EOF) {	    (void)ungetc(ch, stio->ifp);	    return FALSE;	}#ifdef STDSTDIO	if (stio->ifp->_cnt < -1)	    stio->ifp->_cnt = -1;#endif	if (!stab) {			/* not necessarily a real EOF yet? */	    if (!nextargv(argvstab))	/* get another fp handy */		return TRUE;	}	else	    return TRUE;		/* normal fp, definitely end of file */    }    return TRUE;}longdo_tell(stab)STAB *stab;{    register STIO *stio;    if (!stab)	goto phooey;    stio = stab_io(stab);    if (!stio || !stio->ifp)	goto phooey;#ifdef ULTRIX_STDIO_BOTCH    if (feof(stio->ifp))	(void)fseek (stio->ifp, 0L, 2);		/* ultrix 1.2 workaround */#endif    return ftell(stio->ifp);phooey:    if (dowarn)	warn("tell() on unopened file");    errno = EBADF;    return -1L;}booldo_seek(stab, pos, whence)STAB *stab;long pos;int whence;{    register STIO *stio;    if (!stab)	goto nuts;    stio = stab_io(stab);    if (!stio || !stio->ifp)	goto nuts;#ifdef ULTRIX_STDIO_BOTCH    if (feof(stio->ifp))	(void)fseek (stio->ifp, 0L, 2);		/* ultrix 1.2 workaround */#endif    return fseek(stio->ifp, pos, whence) >= 0;nuts:    if (dowarn)	warn("seek() on unopened file");    errno = EBADF;    return FALSE;}intdo_ctl(optype,stab,func,argstr)int optype;STAB *stab;int func;STR *argstr;{    register STIO *stio;    register char *s;    int retval;    if (!stab || !argstr || !(stio = stab_io(stab)) || !stio->ifp) {	errno = EBADF;	/* well, sort of... */	return -1;    }    if (argstr->str_pok || !argstr->str_nok) {	if (!argstr->str_pok)	    s = str_get(argstr);#ifdef IOCPARM_MASK#ifndef IOCPARM_LEN#define IOCPARM_LEN(x)  (((x) >> 16) & IOCPARM_MASK)#endif#endif#ifdef IOCPARM_LEN	retval = IOCPARM_LEN(func);	/* on BSDish systes we're safe */#else	retval = 256;			/* otherwise guess at what's safe */#endif	if (argstr->str_cur < retval) {	    Str_Grow(argstr,retval+1);	    argstr->str_cur = retval;	}	s = argstr->str_ptr;	s[argstr->str_cur] = 17;	/* a little sanity check here */    }    else {	retval = (int)str_gnum(argstr);#ifdef DOSISH	s = (char*)(long)retval;		/* ouch */#else	s = (char*)retval;		/* ouch */#endif    }#ifndef lint    if (optype == O_IOCTL)	retval = ioctl(fileno(stio->ifp), func, s);    else#ifdef DOSISH	fatal("fcntl is not implemented");#else#ifdef HAS_FCNTL	retval = fcntl(fileno(stio->ifp), func, s);#else	fatal("fcntl is not implemented");#endif#endif#else /* lint */    retval = 0;#endif /* lint */    if (argstr->str_pok) {	if (s[argstr->str_cur] != 17)	    fatal("Return value overflowed string");	s[argstr->str_cur] = 0;		/* put our null back */    }    return retval;}intdo_stat(str,arg,gimme,arglast)STR *str;register ARG *arg;int gimme;int *arglast;{    register ARRAY *ary = stack;    register int sp = arglast[0] + 1;    int max = 13;    if ((arg[1].arg_type & A_MASK) == A_WORD) {	tmpstab = arg[1].arg_ptr.arg_stab;	if (tmpstab != defstab) {	    laststype = O_STAT;	    statstab = tmpstab;	    str_set(statname,"");	    if (!stab_io(tmpstab) || !stab_io(tmpstab)->ifp ||	      fstat(fileno(stab_io(tmpstab)->ifp),&statcache) < 0) {		max = 0;		laststatval = -1;	    }	}	else if (laststatval < 0)	    max = 0;    }    else {	str_set(statname,str_get(ary->ary_array[sp]));	statstab = Nullstab;#ifdef HAS_LSTAT	laststype = arg->arg_type;	if (arg->arg_type == O_LSTAT)	    laststatval = lstat(str_get(statname),&statcache);	else#endif	    laststatval = stat(str_get(statname),&statcache);	if (laststatval < 0) {	    if (dowarn && index(str_get(statname), '\n'))		warn(warn_nl, "stat");	    max = 0;	}    }    if (gimme != G_ARRAY) {	if (max)	    str_sset(str,&str_yes);	else	    str_sset(str,&str_undef);	STABSET(str);	ary->ary_array[sp] = str;	return sp;    }    sp--;    if (max) {#ifndef lint	(void)astore(ary,++sp,	  str_2mortal(str_nmake((double)statcache.st_dev)));	(void)astore(ary,++sp,	  str_2mortal(str_nmake((double)statcache.st_ino)));	(void)astore(ary,++sp,	  str_2mortal(str_nmake((double)statcache.st_mode)));	(void)astore(ary,++sp,	  str_2mortal(str_nmake((double)statcache.st_nlink)));	(void)astore(ary,++sp,	  str_2mortal(str_nmake((double)statcache.st_uid)));	(void)astore(ary,++sp,	  str_2mortal(str_nmake((double)statcache.st_gid)));	(void)astore(ary,++sp,	  str_2mortal(str_nmake((double)statcache.st_rdev)));	(void)astore(ary,++sp,	  str_2mortal(str_nmake((double)statcache.st_size)));	(void)astore(ary,++sp,	  str_2mortal(str_nmake((double)statcache.st_atime)));	(void)astore(ary,++sp,	  str_2mortal(str_nmake((double)statcache.st_mtime)));	(void)astore(ary,++sp,	  str_2mortal(str_nmake((double)statcache.st_ctime)));#ifdef STATBLOCKS	(void)astore(ary,++sp,	  str_2mortal(str_nmake((double)statcache.st_blksize)));	(void)astore(ary,++sp,	  str_2mortal(str_nmake((double)statcache.st_blocks)));#else	(void)astore(ary,++sp,	  str_2mortal(str_make("",0)));	(void)astore(ary,++sp,	  str_2mortal(str_make("",0)));#endif#else /* lint */	(void)astore(ary,++sp,str_nmake(0.0));#endif /* lint */    }    return sp;}#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)	/* code courtesy of William Kucharski */#define HAS_CHSIZEint chsize(fd, length)int fd;			/* file descriptor */off_t length;		/* length to set file to */{    extern long lseek();    struct flock fl;    struct stat filebuf;    if (fstat(fd, &filebuf) < 0)	return -1;    if (filebuf.st_size < length) {	/* extend file length */	if ((lseek(fd, (length - 1), 0)) < 0)	    return -1;	/* write a "0" byte */	if ((write(fd, "", 1)) != 1)	    return -1;    }    else {	/* truncate length */	fl.l_whence = 0;	fl.l_len = 0;	fl.l_start = length;	fl.l_type = F_WRLCK;    /* write lock on file space */	/*	* This relies on the UNDOCUMENTED F_FREESP argument to	* fcntl(2), which truncates the file so that it ends at the	* position indicated by fl.l_start.	*	* Will minor miracles never cease?	*/	if (fcntl(fd, F_FREESP, &fl) < 0)	    return -1;    }    return 0;}#endif /* F_FREESP */int					/*SUPPRESS 590*/do_truncate(str,arg,gimme,arglast)STR *str;register ARG *arg;int gimme;int *arglast;{    register ARRAY *ary = stack;    register int sp = arglast[0] + 1;    off_t len = (off_t)str_gnum(ary->ary_array[sp+1]);    int result = 1;    STAB *tmpstab;#if defined(HAS_TRUNCATE) || defined(HAS_CHSIZE)#ifdef HAS_TRUNCATE    if ((arg[1].arg_type & A_MASK) == A_WORD) {	tmpstab = arg[1].arg_ptr.arg_stab;	if (!stab_io(tmpstab) || !stab_io(tmpstab)->ifp ||	  ftruncate(fileno(stab_io(tmpstab)->ifp), len) < 0)	    result = 0;    }    else if (truncate(str_get(ary->ary_array[sp]), len) < 0)	result = 0;#else    if ((arg[1].arg_type & A_MASK) == A_WORD) {	tmpstab = arg[1].arg_ptr.arg_stab;	if (!stab_io(tmpstab) || !stab_io(tmpstab)->ifp ||	  chsize(fileno(stab_io(tmpstab)->ifp), len) < 0)	    result = 0;    }    else {	int tmpfd;	if ((tmpfd = open(str_get(ary->ary_array[sp]), 0)) < 0)	    result = 0;	else {	    if (chsize(tmpfd, len) < 0)		result = 0;	    close(tmpfd);	}    }#endif    if (result)	str_sset(str,&str_yes);    else	str_sset(str,&str_undef);    STABSET(str);    ary->ary_array[sp] = str;    return sp;#else    fatal("truncate not implemented");#endif}intlooks_like_number(str)STR *str;{    register char *s;    register char *send;    if (!str->str_pok)	return TRUE;    s = str->str_ptr;     send = s + str->str_cur;    while (isSPACE(*s))	s++;    if (s >= send)	return FALSE;    if (*s == '+' || *s == '-')	s++;    while (isDIGIT(*s))	s++;    if (s == send)	return TRUE;    if (*s == '.') 	s++;    else if (s == str->str_ptr)	return FALSE;    while (isDIGIT(*s))	s++;    if (s == send)	return TRUE;    if (*s == 'e' || *s == 'E') {	s++;	if (*s == '+' || *s == '-')	    s++;	while (isDIGIT(*s))	    s++;    }    while (isSPACE(*s))	s++;    if (s >= send)	return TRUE;    return FALSE;}booldo_print(str,fp)register STR *str;FILE *fp;{    register char *tmps;    if (!fp) {	if (dowarn)	    warn("print to unopened file");	errno = EBADF;	return FALSE;    }    if (!str)	return TRUE;    if (ofmt &&      ((str->str_nok && str->str_u.str_nval != 0.0)       || (looks_like_number(str) && str_gnum(str) != 0.0) ) ) {	fprintf(fp, ofmt, str->str_u.str_nval);	return !ferror(fp);    }    else {	tmps = str_get(str);	if (*tmps == 'S' && tmps[1] == 't' && tmps[2] == 'B' && tmps[3] == '\0'	  && str->str_cur == sizeof(STBP) && strlen(tmps) < str->str_cur) {	    STR *tmpstr = str_mortal(&str_undef);	    stab_efullname(tmpstr,((STAB*)str));/* a stab value, be nice */	    str = tmpstr;	    tmps = str->str_ptr;	    putc('*',fp);	}	if (str->str_cur && (fwrite(tmps,1,str->str_cur,fp) == 0 || ferror(fp)))	    return FALSE;    }    return TRUE;}booldo_aprint(arg,fp,arglast)register ARG *arg;register FILE *fp;int *arglast;{    register STR **st = stack->ary_array;    register int sp = arglast[1];    register int retval;    register int items = arglast[2] - sp;    if (!fp) {	if (dowarn)	    warn("print to unopened file");	errno = EBADF;	return FALSE;    }    st += ++sp;    if (arg->arg_type == O_PRTF) {	do_sprintf(arg->arg_ptr.arg_str,items,st);	retval = do_print(arg->arg_ptr.arg_str,fp);    }    else {	retval = (items <= 0);	for (; items > 0; items--,st++) {	    if (retval && ofslen) {		if (fwrite(ofs, 1, ofslen, fp) == 0 || ferror(fp)) {		    retval = FALSE;		    break;		}	    }	    if (!(retval = do_print(*st, fp)))		break;	}	if (retval && orslen)	    if (fwrite(ors, 1, orslen, fp) == 0 || ferror(fp))		retval = FALSE;    }    return retval;}intmystat(arg,str)ARG *arg;STR *str;{    STIO *stio;    if (arg[1].arg_type & A_DONT) {	stio = stab_io(arg[1].arg_ptr.arg_stab);	if (stio && stio->ifp) {	    statstab = arg[1].arg_ptr.arg_stab;	    str_set(statname,"");	    laststype = O_STAT;	    return (laststatval = fstat(fileno(stio->ifp), &statcache));	}	else {	    if (arg[1].arg_ptr.arg_stab == defstab)		return laststatval;	    if (dowarn)		warn("Stat on unopened file <%s>",		  stab_ename(arg[1].arg_ptr.arg_stab));	    statstab = Nullstab;	    str_set(statname,"");	    return (laststatval = -1);	}    }    else {	statstab = Nullstab;	str_set(statname,str_get(str));	laststype = O_STAT;	laststatval = stat(str_get(str),&statcache);	if (laststatval < 0 && dowarn && index(str_get(str), '\n'))	    warn(warn_nl, "stat");	return laststatval;    }}intmylstat(arg,str)ARG *arg;STR *str;{    if (arg[1].arg_type & A_DONT) {	if (arg[1].arg_ptr.arg_stab == defstab) {	    if (laststype != O_LSTAT)		fatal("The stat preceding -l _ wasn't an lstat");	    return laststatval;	}	fatal("You can't use -l on a filehandle");    }    laststype = O_LSTAT;    statstab = Nullstab;    str_set(statname,str_get(str));#ifdef HAS_LSTAT    laststatval = lstat(str_get(str),&statcache);#else    laststatval = stat(str_get(str),&statcache);#endif    if (laststatval < 0 && dowarn && index(str_get(str), '\n'))	warn(warn_nl, "lstat");    return laststatval;}STR *do_fttext(arg,str)register ARG *arg;STR *str;{    int i;    int len;    int odd = 0;    STDCHAR tbuf[512];    register STDCHAR *s;    register STIO *stio;    if (arg[1].arg_type & A_DONT) {	if (arg[1].arg_ptr.arg_stab == defstab) {

⌨️ 快捷键说明

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