📄 doio.c
字号:
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 + -