# 2.11BSD#431 - /usr/src/local/mtools/file_write.c

##### Functions

    file_write        X

       1: #include <stdio.h>
       2: #include "msdos.h"
       3:
       4: extern int full, fat_error, clus_size, dir_start, dir_len;
       5: extern unsigned end_fat;
       6:
       7: static int need_nl, put_cluster();
       8:
       9: /*
      10:  * Write out clusters with input from the given file pointer.   Returns the
      11:  * size of the file (which may have changed) or -1 on error.
      12:  */
      13:
      14: long
      15: file_write(fp, firstfat, filesize, textmode)
      16: FILE *fp;
      17: unsigned int firstfat;
      18: long filesize;
      19: int textmode;
      20: {
      21:     int i;
      22:     unsigned int fat, oldfat, next_fat();
      23:     long size;
      24:
      25:     oldfat = 0;
      26:     fat = firstfat;
      27:     need_nl = 0;
      28:     size = 0L;
      29:
      30:     /* CONSTCOND */
      31:     while (1) {
      32:         if ((i = put_cluster(fp, fat, &filesize, textmode)) < 0) {
      33:             if (oldfat) {
      34:                 fat_encode(oldfat, end_fat);
      35:                 if (fat_free(firstfat))
      36:                     fat_error++;
      37:                 full = 1;
      38:             }
      39:             return(-1);
      40:         }
      41:
      42:         size += i;
      43:         if (size >= filesize) {
      44:             fat_encode(fat, end_fat);
      45:             break;
      46:         }
      47:         oldfat = fat;
      48:                     /* get next free cluster */
      49:         fat = next_fat(oldfat);
      50:         if (fat == 1) {
      51:             fat_encode(oldfat, end_fat);
      52:                     /* delete it, if doesn't fit */
      53:             if (fat_free(firstfat))
      54:                 fat_error++;
      55:             full = 1;
      56:             return(-1);
      57:         }
      58:         fat_encode(oldfat, fat);
      59:     }
      60:     return(size);
      61: }
      62:
      63: /*
      64:  * Write to the cluster from the named Unix file descriptor.  Returns the
      65:  * size of what was written, or -1 on error.
      66:  */
      67:
      68: static int
      69: put_cluster(fp, num, filesize, textmode)
      70: FILE *fp;
      71: unsigned int num;
      72: long *filesize;
      73: int textmode;
      74: {
      75:     int i, buflen, c;
      76:     long start;
      77:     unsigned char tbuf[MAX_CLUSTER];
      78:     void disk_write(), perror();
      79:
      80:     start = (long) (num - 2) * clus_size + dir_start + dir_len;
      81:     buflen = clus_size * MSECTOR_SIZE;
      82:                     /* '\n' to '\r\n' translation */
      83:     if (textmode) {
      84:         i = 0;
      85:         if (need_nl) {
      86:             tbuf[i++] = '\n';
      87:             need_nl = 0;
      88:         }
      89:         while (i < buflen) {
      90:             if ((c = fgetc(fp)) == EOF) {
      91:                     /* put a file EOF marker */
      92:                 tbuf[i++] = 0x1a;
      93:                     /* make the file appear larger */
      94:                 *filesize = *filesize + 1;
      95:                 break;
      96:             }
      97:             if (c == '\n') {
      98:                 tbuf[i++] = '\r';
      99:                     /* make the file appear larger */
     100:                 *filesize = *filesize + 1;
     101:                     /* if at the end of the buffer */
     102:                 if (i == buflen) {
     103:                     need_nl++;
     104:                     break;
     105:                 }
     106:             }
     107:             tbuf[i++] = (unsigned char) c;
     108:         }
     109:     }
     110:                     /* much easier.... */
     111:     else {
     112:         if ((i = fread((char *) tbuf, sizeof(*tbuf), buflen, fp)) <= 0) {
     113:             perror("putcluster: fread");
     114:             return(-1);
     115:         }
     116:     }
     117:
     118:     disk_write(start, tbuf, buflen);
     119:     return(i);
     120: }

#### Defined functions

file_write defined in line 14; used 2 times

- in /usr/src/local/mtools/mwrite.c line 250, 302

put_cluster defined in line 68; used 2 times

- in line 7, 32

#### Defined variables

need_nl defined in line 7; used 4 times

- in line 27, 85-87(2), 103

Last modified: 1992-06-24 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 584 |