From 6ce51040a294e5299eb6624a18604289b22373bb Mon Sep 17 00:00:00 2001 From: Ben Gras Date: Mon, 19 Jul 2010 10:40:48 +0000 Subject: [PATCH] patch: fixes to use plan a (too) by Gautam Tirumala. --- commands/patch/inp.c | 52 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/commands/patch/inp.c b/commands/patch/inp.c index 573a128cf..ecbeabb87 100644 --- a/commands/patch/inp.c +++ b/commands/patch/inp.c @@ -58,9 +58,7 @@ static off_t i_size; /* size of the input file */ static char *i_womp; /* plan a buffer for entire file */ static char **i_ptr; /* pointers to lines in i_womp */ -#if 0 static char empty_line[] = { '\0' }; -#endif static int tifd = -1; /* plan b virtual string array */ static char *tibuf[2]; /* plan b buffers */ @@ -69,15 +67,31 @@ 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 *); -#if 0 static bool reallocate_lines(size_t *); -#endif /* returns false if insufficient memory */ static bool plan_a(const char *); static void plan_b(const char *); +static int readfile(int fd, char *buf, size_t s) +{ + int ntoread, nread; + + ntoread = s; + nread = 0; + + while(ntoread > 0) { + if((nread = read(fd, buf, ntoread)) < 0) { + return nread; + } + buf += nread; + ntoread -= nread; + } + + return 0; +} + /* New patch--prepare to edit another file. */ void @@ -116,7 +130,6 @@ scan_input(const char *filename) } } -#if 0 static bool reallocate_lines(size_t *lines_allocated) { @@ -137,16 +150,12 @@ reallocate_lines(size_t *lines_allocated) i_ptr = p; return true; } -#endif /* Try keeping everything in memory. */ static bool plan_a(const char *filename) { -#ifdef __minix - return false; -#else int ifd, statfailed; char *p, *s, lbuf[MAXLINELEN]; struct stat filestat; @@ -262,13 +271,16 @@ plan_a(const char *filename) out_of_mem = false; return false; /* force plan b because plan a bombed */ } +#ifndef __minix if (i_size > SIZE_MAX) { say("block too large to mmap\n"); return false; } +#endif if ((ifd = open(filename, O_RDONLY)) < 0) pfatal("can't open file %s", filename); +#ifndef __minix i_womp = mmap(NULL, i_size, PROT_READ, MAP_PRIVATE, ifd, 0); if (i_womp == MAP_FAILED) { perror("mmap failed"); @@ -276,10 +288,27 @@ plan_a(const char *filename) close(ifd); return false; } +#else + i_womp = malloc(i_size); + if(i_size && i_womp == NULL) { + fprintf(stderr, "Malloc failed.\n"); + i_womp = NULL; + close(ifd); + return false; + } + if(readfile(ifd, i_womp, i_size) < 0) { + perror("Readfile failed."); + i_womp = NULL; + close(ifd); + return false; + } +#endif close(ifd); +#ifndef __minix if (i_size) madvise(i_womp, i_size, MADV_SEQUENTIAL); +#endif /* estimate the number of lines */ lines_allocated = i_size / 25; @@ -312,7 +341,11 @@ plan_a(const char *filename) if (p == NULL) { free(i_ptr); i_ptr = NULL; +#ifndef __minix munmap(i_womp, i_size); +#else + free(i_womp); +#endif i_womp = NULL; return false; } @@ -352,7 +385,6 @@ plan_a(const char *filename) revision); } return true; /* plan a will work */ -#endif } /* Keep (virtually) nothing in memory. */ -- 2.44.0