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

📄 file_write.c

📁 MTOOLS version 2.0 Mtools is a public domain collection of programs to allow Unix systems t
💻 C
字号:
#include <stdio.h>#include "msdos.h"extern int full, fat_error, clus_size, dir_start, dir_len;extern unsigned end_fat;static int need_nl, put_cluster();/* * Write out clusters with input from the given file pointer.   Returns the * size of the file (which may have changed) or -1 on error. */longfile_write(fp, firstfat, filesize, textmode)FILE *fp;unsigned int firstfat;long filesize;int textmode;{	int i;	unsigned int fat, oldfat, next_fat();	long size;	oldfat = 0;	fat = firstfat;	need_nl = 0;	size = 0L;	/* CONSTCOND */	while (1) {		if ((i = put_cluster(fp, fat, &filesize, textmode)) < 0) {			if (oldfat) {				fat_encode(oldfat, end_fat);				if (fat_free(firstfat))					fat_error++;				full = 1;			}			return(-1);		}		size += i;		if (size >= filesize) {			fat_encode(fat, end_fat);			break;		}		oldfat = fat;					/* get next free cluster */		fat = next_fat(oldfat);		if (fat == 1) {			fat_encode(oldfat, end_fat);					/* delete it, if doesn't fit */			if (fat_free(firstfat))				fat_error++;			full = 1;			return(-1);		}		fat_encode(oldfat, fat);	}	return(size);}/* * Write to the cluster from the named Unix file descriptor.  Returns the * size of what was written, or -1 on error. */static intput_cluster(fp, num, filesize, textmode)FILE *fp;unsigned int num;long *filesize;int textmode;{	int i, buflen, c;	long start;	unsigned char tbuf[MAX_CLUSTER];	void disk_write(), perror();	start = (long) (num - 2) * clus_size + dir_start + dir_len;	buflen = clus_size * MSECTOR_SIZE;					/* '\n' to '\r\n' translation */	if (textmode) {		i = 0;		if (need_nl) {			tbuf[i++] = '\n';			need_nl = 0;		}		while (i < buflen) {			if ((c = fgetc(fp)) == EOF) {					/* put a file EOF marker */				tbuf[i++] = 0x1a;					/* make the file appear larger */				*filesize = *filesize + 1;				break;			}			if (c == '\n') {				tbuf[i++] = '\r';					/* make the file appear larger */				*filesize = *filesize + 1;					/* if at the end of the buffer */				if (i == buflen) {					need_nl++;					break;				}			}			tbuf[i++] = (unsigned char) c;		}	}					/* much easier.... */	else {		if ((i = fread((char *) tbuf, sizeof(*tbuf), buflen, fp)) <= 0) {			perror("put_cluster: fread");			return(-1);		}	}	disk_write(start, tbuf, buflen);	return(i);}

⌨️ 快捷键说明

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