1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-06-15 08:28:03 +02:00

52153: mapfile without HAVE_MMAP should not trim newlines

This commit is contained in:
Bart Schaefer 2023-09-16 13:08:59 -07:00
parent aecef41f2e
commit 355cfc1b95
3 changed files with 46 additions and 13 deletions

View file

@ -1,3 +1,8 @@
2023-09-16 Bart Schaefer <schaefer@zsh.org>
* 52153: Src/input.c, Src/Modules/mapfile.c: $mapfile[fname]
should not trim newlines (only applies when not HAVE_MMAP)
2023-09-15 Mikael Magnusson <mikachu@gmail.com>
* 52142: Completion/Zsh/Context/_parameter,

View file

@ -170,6 +170,8 @@ get_contents(char *fname)
#ifdef USE_MMAP
caddr_t mmptr;
struct stat sbuf;
#else
off_t size;
#endif
char *val;
unmetafy(fname = ztrdup(fname), &fd);
@ -196,12 +198,8 @@ get_contents(char *fname)
close(fd);
#else /* don't USE_MMAP */
val = NULL;
if ((fd = open(fname, O_RDONLY | O_NOCTTY)) >= 0) {
LinkList ll;
if ((ll = readoutput(fd, 1, 0)))
val = peekfirst(ll);
}
if ((size = zstuff(&val, fname)) > 0)
val = metafy(val, size, META_HEAPDUP);
#endif /* USE_MMAP */
free(fname);
return val;

View file

@ -610,11 +610,11 @@ inungetc(int c)
}
}
/* stuff a whole file into the input queue and print it */
/* stuff a whole file into memory and return it */
/**/
int
stuff(char *fn)
off_t
zstuff(char **out, const char *fn)
{
FILE *in;
char *buf;
@ -622,20 +622,50 @@ stuff(char *fn)
if (!(in = fopen(unmeta(fn), "r"))) {
zerr("can't open %s", fn);
return 1;
return -1;
}
queue_signals();
fseek(in, 0, SEEK_END);
len = ftell(in);
fseek(in, 0, SEEK_SET);
buf = (char *)zalloc(len + 1);
if (!(fread(buf, len, 1, in))) {
if (len && !(fread(buf, len, 1, in))) {
zerr("read error on %s", fn);
fclose(in);
zfree(buf, len + 1);
return 1;
unqueue_signals();
return -1;
}
fclose(in);
buf[len] = '\0';
*out = buf;
unqueue_signals();
return len;
}
/**/
char *
ztuff(const char *fn)
{
char *buf;
off_t len = zstuff(&buf, fn);
if (len > 0)
return buf;
else
return NULL;
}
/* stuff a whole file into the input queue and print it */
/**/
int
stuff(char *fn)
{
char *buf;
off_t len = zstuff(&buf, fn);
if (len < 0)
return 1;
fwrite(buf, len, 1, stderr);
fflush(stderr);
inputsetline(metafy(buf, len, META_REALLOC), INP_FREE);