-rw-r--r-- 1202 lib25519-20240321/command/freadall.inc raw
/*
* some speedup possibilities:
* lower-level read(), skipping stdio
* replace this function with suitable mmap in common file case
*/
unsigned char *freadall(long long *len,long long padafter,FILE *fi)
{
const long long lengthlimit = (sizeof(size_t) >= 8 ? 0x1000000000000040LL : 0x40000040LL);
unsigned char *buf;
unsigned char *newbuf;
long long bufalloc;
long long pos = 0;
if (padafter < 0) return 0;
if (padafter >= lengthlimit) return 0;
bufalloc = 1024+padafter;
if (bufalloc >= lengthlimit) bufalloc = lengthlimit;
buf = malloc(bufalloc);
if (!buf) return 0;
pos = 0;
for (;;) {
/* invariant: pos+padafter < bufalloc <= lengthlimit */
long long r = fread(buf+pos,1,bufalloc-pos,stdin);
if (r == 0) {
if (bufalloc > pos) memset(buf+pos,0,bufalloc-pos);
*len = pos;
return buf;
}
pos += r;
if (pos >= bufalloc-padafter) {
if (pos >= lengthlimit-padafter) goto nomem;
bufalloc = pos+padafter+(bufalloc>>1)+1024;
if (bufalloc > lengthlimit) bufalloc = lengthlimit;
newbuf = realloc(buf,bufalloc);
if (!newbuf) goto nomem;
buf = newbuf;
}
}
nomem:
free(buf);
return 0;
}