=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/patch/inp.c,v retrieving revision 1.41 retrieving revision 1.42 diff -c -r1.41 -r1.42 *** src/usr.bin/patch/inp.c 2014/11/25 10:22:08 1.41 --- src/usr.bin/patch/inp.c 2014/12/09 20:28:43 1.42 *************** *** 1,4 **** ! /* $OpenBSD: inp.c,v 1.41 2014/11/25 10:22:08 tobias Exp $ */ /* * patch - a program to apply diffs to original files --- 1,4 ---- ! /* $OpenBSD: inp.c,v 1.42 2014/12/09 20:28:43 tobias Exp $ */ /* * patch - a program to apply diffs to original files *************** *** 55,62 **** static int tifd = -1; /* plan b virtual string array */ static char *tibuf[2]; /* plan b buffers */ static LINENUM tiline[2] = {-1, -1}; /* 1st line in each buffer */ ! static LINENUM lines_per_buf; /* how many lines per buffer */ ! static int tireclen; /* length of records in tmp file */ static bool rev_in_string(const char *); static bool reallocate_lines(size_t *); --- 55,63 ---- static int tifd = -1; /* plan b virtual string array */ static char *tibuf[2]; /* plan b buffers */ static LINENUM tiline[2] = {-1, -1}; /* 1st line in each buffer */ ! static size_t lines_per_buf; /* how many lines per buffer */ ! static size_t tibuflen; /* plan b buffer length */ ! static size_t tireclen; /* length of records in tmp file */ static bool rev_in_string(const char *); static bool reallocate_lines(size_t *); *************** *** 333,340 **** plan_b(const char *filename) { FILE *ifp; ! size_t i = 0, j, maxlen = 1; ! char *p; bool found_revision = (revision == NULL); using_plan_a = false; --- 334,341 ---- plan_b(const char *filename) { FILE *ifp; ! size_t i = 0, j, len, maxlen = 1; ! char *lbuf = NULL, *p; bool found_revision = (revision == NULL); using_plan_a = false; *************** *** 343,357 **** (void) unlink(TMPINNAME); if ((tifd = open(TMPINNAME, O_EXCL | O_CREAT | O_WRONLY, 0666)) < 0) pfatal("can't open file %s", TMPINNAME); ! while (fgets(buf, sizeof buf, ifp) != NULL) { ! if (revision != NULL && !found_revision && rev_in_string(buf)) found_revision = true; ! if ((i = strlen(buf)) > maxlen) ! maxlen = i; /* find longest line */ } ! last_line_missing_eol = i > 0 && buf[i - 1] != '\n'; ! if (last_line_missing_eol && maxlen == i) ! maxlen++; if (revision != NULL) { if (!found_revision) { --- 344,371 ---- (void) unlink(TMPINNAME); if ((tifd = open(TMPINNAME, O_EXCL | O_CREAT | O_WRONLY, 0666)) < 0) pfatal("can't open file %s", TMPINNAME); ! while ((p = fgetln(ifp, &len)) != NULL) { ! if (p[len - 1] == '\n') ! p[len - 1] = '\0'; ! else { ! /* EOF without EOL, copy and add the NUL */ ! if ((lbuf = malloc(len + 1)) == NULL) ! fatal("out of memory\n"); ! memcpy(lbuf, p, len); ! lbuf[len] = '\0'; ! p = lbuf; ! ! last_line_missing_eol = true; ! len++; ! } ! if (revision != NULL && !found_revision && rev_in_string(p)) found_revision = true; ! if (len > maxlen) ! maxlen = len; /* find longest line */ } ! free(lbuf); ! if (ferror(ifp)) ! pfatal("can't read file %s", filename); if (revision != NULL) { if (!found_revision) { *************** *** 376,398 **** revision); } fseek(ifp, 0L, SEEK_SET); /* rewind file */ - lines_per_buf = BUFFERSIZE / maxlen; tireclen = maxlen; ! tibuf[0] = malloc(BUFFERSIZE + 1); if (tibuf[0] == NULL) fatal("out of memory\n"); ! tibuf[1] = malloc(BUFFERSIZE + 1); if (tibuf[1] == NULL) fatal("out of memory\n"); for (i = 1;; i++) { p = tibuf[0] + maxlen * (i % lines_per_buf); if (i % lines_per_buf == 0) /* new block */ ! if (write(tifd, tibuf[0], BUFFERSIZE) < BUFFERSIZE) pfatal("can't write temp file"); if (fgets(p, maxlen + 1, ifp) == NULL) { input_lines = i - 1; if (i % lines_per_buf != 0) ! if (write(tifd, tibuf[0], BUFFERSIZE) < BUFFERSIZE) pfatal("can't write temp file"); break; } --- 390,415 ---- revision); } fseek(ifp, 0L, SEEK_SET); /* rewind file */ tireclen = maxlen; ! tibuflen = maxlen > BUFFERSIZE ? maxlen : BUFFERSIZE; ! lines_per_buf = tibuflen / maxlen; ! tibuf[0] = malloc(tibuflen + 1); if (tibuf[0] == NULL) fatal("out of memory\n"); ! tibuf[1] = malloc(tibuflen + 1); if (tibuf[1] == NULL) fatal("out of memory\n"); for (i = 1;; i++) { p = tibuf[0] + maxlen * (i % lines_per_buf); if (i % lines_per_buf == 0) /* new block */ ! if (write(tifd, tibuf[0], tibuflen) != ! (ssize_t) tibuflen) pfatal("can't write temp file"); if (fgets(p, maxlen + 1, ifp) == NULL) { input_lines = i - 1; if (i % lines_per_buf != 0) ! if (write(tifd, tibuf[0], tibuflen) != ! (ssize_t) tibuflen) pfatal("can't write temp file"); break; } *************** *** 434,443 **** tiline[whichbuf] = baseline; if (lseek(tifd, (off_t) (baseline / lines_per_buf * ! BUFFERSIZE), SEEK_SET) < 0) pfatal("cannot seek in the temporary input file"); ! if (read(tifd, tibuf[whichbuf], BUFFERSIZE) < 0) pfatal("error reading tmp file %s", TMPINNAME); } return tibuf[whichbuf] + (tireclen * offline); --- 451,461 ---- tiline[whichbuf] = baseline; if (lseek(tifd, (off_t) (baseline / lines_per_buf * ! tibuflen), SEEK_SET) < 0) pfatal("cannot seek in the temporary input file"); ! if (read(tifd, tibuf[whichbuf], tibuflen) ! != (ssize_t) tibuflen) pfatal("error reading tmp file %s", TMPINNAME); } return tibuf[whichbuf] + (tireclen * offline);