📄 file_write.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 + -