patch: fixes to use plan a (too) by Gautam Tirumala.
This commit is contained in:
parent
34dd221af7
commit
6ce51040a2
@ -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. */
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user