/* copy file f to file g, for longcount bytes */ int copyfile(FILE * f, FILE * g, word32 longcount) { int count, status = 0; do { /* read and write the whole file... */ if (longcount < (word32) DISKBUFSIZE) count = (int) longcount; else count = DISKBUFSIZE; count = fread(textbuf, 1, count, f); if (count > 0) { if (CONVERSION != NO_CONV) { int i; for (i = 0; i < count; i++) textbuf[i] = (CONVERSION == EXT_CONV) ? EXT_C(textbuf[i]) : INT_C(textbuf[i]); } if (fwrite(textbuf, 1, count, g) != count) { /* Problem: return error value */ status = -1; break; } longcount -= count; #ifdef MACTC5 mac_poll_for_break(); #endif } /* if text block was short, exit loop */ } while (count == DISKBUFSIZE); burn(textbuf); /* burn sensitive data on stack */ return status; } /* copyfile */
/* * return foreign translation of s */ char * PSTR (char *s) { long filepos; if (subtitles_available == 0) init_lang(); if (subtitles_available < 0) return(s); filepos = lookup_offset(message_crc(s)); if (filepos == -1) { return(s); } else { fseek(langf, filepos, SEEK_SET); readstr(langf, strbuf, 1); } if (strbuf[0] == '\0') return(s); for (s = strbuf; *s; ++s) *s = EXT_C(*s); return(strbuf); }
/* copy file f to file g, for longcount bytes. Convert from * canonical to local form as we go. g is open in text mode. Canonical * form uses crlf's as line separators. */ int copyfile_from_canon(FILE * f, FILE * g, word32 longcount) { int count, status = 0; byte c, *tb1, *tb2; int i, nbytes; do { /* read and write the whole file... */ if (longcount < (word32) DISKBUFSIZE) count = (int) longcount; else count = DISKBUFSIZE; count = fread(textbuf, 1, count, f); if (count > 0) { /* Convert by removing CR's */ tb1 = textbuf; tb2 = (byte *) textbuf2; for (i = 0; i < count; ++i) { switch (CONVERSION) { case EXT_CONV: c = EXT_C(*tb1++); break; case INT_CONV: c = INT_C(*tb1++); break; default: c = *tb1++; } if (c != '\r') *tb2++ = c; } nbytes = tb2 - (byte *) textbuf2; if (fwrite(textbuf2, 1, nbytes, g) != nbytes) { /* Problem: return error value */ status = -1; break; } longcount -= count; } /* if text block was short, exit loop */ } while (count == DISKBUFSIZE); burn(textbuf); /* burn sensitive data on stack */ burn(textbuf2); return status; } /* copyfile_from_canon */
/* copy file f to file g, for longcount bytes. Convert to * canonical form as we go. f is open in text mode. Canonical * form uses crlf's as line separators. */ int copyfile_to_canon(FILE * f, FILE * g, word32 longcount) { int count, status = 0; byte c, *tb1, *tb2; int i, nbytes; int nspaces = 0; #ifdef MACTC5 Boolean warning = true; /* MACTC5 */ #endif do { /* read and write the whole file... */ if (longcount < (word32) DISKBUFSIZE) count = (int) longcount; else count = DISKBUFSIZE; count = fread(textbuf, 1, count, f); if (count > 0) { /* Convert by adding CR before LF */ tb1 = textbuf; tb2 = (byte *) textbuf2; for (i = 0; i < count; ++i) { switch (CONVERSION) { case EXT_CONV: c = EXT_C(*tb1++); break; case INT_CONV: c = INT_C(*tb1++); break; default: c = *tb1++; } #ifdef MACTC5 if ( (((uchar) c) < ' ') && (c != '\n') && (c != '\t') && warning) { warning = false; fprintf(stdout, "\aWarning text file contains control characters!\n"); } #endif if (strip_spaces) { if (c == ' ') { /* Don't output spaces yet */ nspaces += 1; } else { if (c == '\n') { *tb2++ = '\r'; nspaces = 0; /* Delete trailing spaces */ } if (nspaces) { /* Put out spaces now */ do *tb2++ = ' '; while (--nspaces); } *tb2++ = c; } } else { if (c == '\n') *tb2++ = '\r'; *tb2++ = c; } } nbytes = tb2 - (byte *) textbuf2; if (fwrite(textbuf2, 1, nbytes, g) != nbytes) { /* Problem: return error value */ status = -1; break; } longcount -= count; } /* if text block was short, exit loop */ } while (count == DISKBUFSIZE); burn(textbuf); /* burn sensitive data on stack */ burn(textbuf2); return status; } /* copyfile_to_canon */