endfile.c
来自「算断裂的」· C语言 代码 · 共 196 行
C
196 行
#include "f2c.h"#include "fio.h"#ifndef NON_UNIX_STDIO#include "sys/types.h"#endif#include "rawio.h"#ifdef KR_headersextern char *strcpy();#else#undef abs#undef min#undef max#include "stdlib.h"#include "string.h"#endif#ifdef NON_UNIX_STDIO#ifndef unlink#define unlink remove#endif#else#ifdef MSDOS#include "io.h"#endif#endif#ifdef NON_UNIX_STDIOextern char *f__r_mode[], *f__w_mode[];#endif#ifdef KR_headersinteger f_end(a) alist *a;#elseinteger f_end(alist *a)#endif{ unit *b; if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"endfile"); b = &f__units[a->aunit]; if(b->ufd==NULL) { char nbuf[10]; (void) sprintf(nbuf,"fort.%ld",a->aunit);#ifdef NON_UNIX_STDIO { FILE *tf; if (tf = fopen(nbuf, f__w_mode[0])) fclose(tf); }#else close(creat(nbuf, 0666));#endif return(0); } b->uend=1; return(b->useek ? t_runc(a) : 0);} static int#ifdef NON_UNIX_STDIO#ifdef KR_headerscopy(from, len, to) char *from, *to; register long len;#elsecopy(FILE *from, register long len, FILE *to)#endif{ int k, len1; char buf[BUFSIZ]; while(fread(buf, len1 = len > BUFSIZ ? BUFSIZ : (int)len, 1, from)) { if (!fwrite(buf, len1, 1, to)) return 1; if ((len -= len1) <= 0) break; } return 0; }#else#ifdef KR_headerscopy(from, len, to) char *from, *to; register long len;#elsecopy(char *from, register long len, char *to)#endif{ register int n; int k, rc = 0, tmp; char buf[BUFSIZ]; if ((k = open(from, O_RDONLY)) < 0) return 1; if ((tmp = creat(to,0666)) < 0) return 1; while((n = read(k, buf, len > BUFSIZ ? BUFSIZ : (int)len)) > 0) { if (write(tmp, buf, n) != n) { rc = 1; break; } if ((len -= n) <= 0) break; } close(k); close(tmp); return n < 0 ? 1 : rc; }#endif#ifndef L_tmpnam#define L_tmpnam 16#endif int#ifdef KR_headerst_runc(a) alist *a;#elset_runc(alist *a)#endif{ char nm[L_tmpnam+12]; /* extra space in case L_tmpnam is tiny */ long loc, len; unit *b;#ifdef NON_UNIX_STDIO FILE *bf, *tf;#else FILE *bf;#endif int rc = 0; b = &f__units[a->aunit]; if(b->url) return(0); /*don't truncate direct files*/ loc=ftell(bf = b->ufd); fseek(bf,0L,SEEK_END); len=ftell(bf); if (loc >= len || b->useek == 0 || b->ufnm == NULL) return(0);#ifdef NON_UNIX_STDIO fclose(b->ufd);#else rewind(b->ufd); /* empty buffer */#endif if (!loc) {#ifdef NON_UNIX_STDIO if (!(bf = fopen(b->ufnm, f__w_mode[b->ufmt])))#else if (close(creat(b->ufnm,0666)))#endif rc = 1; if (b->uwrt) b->uwrt = 1; goto done; }#ifdef _POSIX_SOURCE tmpnam(nm);#else strcpy(nm,"tmp.FXXXXXX"); mktemp(nm);#endif#ifdef NON_UNIX_STDIO if (!(bf = fopen(b->ufnm, f__r_mode[0]))) { bad: rc = 1; goto done; } if (!(tf = fopen(nm, f__w_mode[0]))) goto bad; if (copy(bf, loc, tf)) { bad1: rc = 1; goto done1; } if (!(bf = freopen(b->ufnm, f__w_mode[0], bf))) goto bad1; if (!(tf = freopen(nm, f__r_mode[0], tf))) goto bad1; if (copy(tf, loc, bf)) goto bad1; if (f__w_mode[0] != f__w_mode[b->ufmt]) { if (!(bf = freopen(b->ufnm, f__w_mode[b->ufmt|2], bf))) goto bad1; fseek(bf, loc, SEEK_SET); }done1: fclose(tf); unlink(nm);done: f__cf = b->ufd = bf;#else if (copy(b->ufnm, loc, nm) || copy(nm, loc, b->ufnm)) rc = 1; unlink(nm); fseek(b->ufd, loc, SEEK_SET);done:#endif if (rc) err(a->aerr,111,"endfile"); return 0; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?