/* * Do the function */ MAINENT main(int argc, uchar * *argv) { /* Parse arguments */ parseargs(argc, argv); /* Open and check input file */ openpfm(); /* Make output file name and open */ openafm(); /* Put out header information */ putheader(); /* Put out character table */ putchartab(); /* Put out kerning table */ if (pfm->kernpairs) { putkerntab((KERN *)(buffer+pfm->kernpairs+2), *(ushort *)(buffer+pfm->kernpairs)); } if (pfm->kerntrack) { /* rjl */ fprintf(stderr, "Ignoring track kern table\n"); } /* Put out trailer line */ puttrailer(); /* Cleanup */ if (buffer) free(buffer); fclose(inf); fclose(outf); return 0; }
void fileout(register Archive_t* ap, register File_t* f) { register size_t m; register ssize_t n; register off_t c; int err; Buffer_t* bp; if (f->delta.op == DELTA_verify) ap->selected--; else if (putheader(ap, f)) { if (!ap->format->putdata || !(*ap->format->putdata)(&state, ap, f, f->fd)) { err = 0; c = f->st->st_size; while (c > 0) { n = m = c > state.buffersize ? state.buffersize : c; if (!err) { if (f->fd >= 0) { if ((n = read(f->fd, ap->io->next, m)) < 0 && errno == EIO) { static char* buf; if (!buf) { n = 1024 * 8; error(1, "EIO read error -- falling back to aligned reads"); if (!(buf = malloc(state.buffersize + n))) nospace(); buf += n - (((ssize_t)buf) & (n - 1)); } if ((n = read(f->fd, buf, m)) > 0) memcpy(ap->io->next, buf, n); } } else if (bp = getbuffer(f->fd)) { memcpy(ap->io->next, bp->next, m); if (f->extended && ap->convert[SECTION_CONTROL].f2a) ccmapstr(ap->convert[SECTION_CONTROL].f2a, ap->io->next, m); bp->next += m; } else if (bread(f->ap, ap->io->next, (off_t)0, (off_t)n, 1) <= 0) n = -1; } if (n <= 0) { if (n) error(ERROR_SYSTEM|2, "%s: read error", f->path); else error(2, "%s: file size changed", f->path); memzero(ap->io->next, state.buffersize); err = 1; } else { c -= n; bput(ap, n); } } } puttrailer(ap, f); } if (f->fd >= 0) closein(ap, f, f->fd); }