main: Fix trivial pipes error in read_pipe, better comments overall.
This commit is contained in:
15
src/main.c
15
src/main.c
@@ -20,6 +20,8 @@
|
|||||||
|
|
||||||
int read_file(const char *filename, sv_t *ret)
|
int read_file(const char *filename, sv_t *ret)
|
||||||
{
|
{
|
||||||
|
// NOTE: Stupidly simple. Presumes the file is NOT three pipes in a trench
|
||||||
|
// coat.
|
||||||
FILE *fp = fopen(filename, "rb");
|
FILE *fp = fopen(filename, "rb");
|
||||||
if (!fp)
|
if (!fp)
|
||||||
return 1;
|
return 1;
|
||||||
@@ -37,7 +39,8 @@ int read_file(const char *filename, sv_t *ret)
|
|||||||
|
|
||||||
int read_pipe(FILE *pipe, sv_t *ret)
|
int read_pipe(FILE *pipe, sv_t *ret)
|
||||||
{
|
{
|
||||||
// Keep reading in chunks, keeping it altogether in a vector
|
// NOTE: We can't read an entire pipe at once like we did for read_file. So
|
||||||
|
// let's read in buffered chunks, with a vector to keep them contiguous.
|
||||||
vec_t contents = {0};
|
vec_t contents = {0};
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
while (!feof(pipe))
|
while (!feof(pipe))
|
||||||
@@ -45,19 +48,21 @@ int read_pipe(FILE *pipe, sv_t *ret)
|
|||||||
size_t bytes_read = fread(buffer, 1, sizeof(buffer), pipe);
|
size_t bytes_read = fread(buffer, 1, sizeof(buffer), pipe);
|
||||||
vec_append(&contents, buffer, bytes_read);
|
vec_append(&contents, buffer, bytes_read);
|
||||||
}
|
}
|
||||||
if (contents.size == 0)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
ret->size = contents.size;
|
ret->size = contents.size;
|
||||||
|
// Get that null terminator in, but only after we've recorded the actual size
|
||||||
|
// of what's been read.
|
||||||
vec_append_byte(&contents, '\0');
|
vec_append_byte(&contents, '\0');
|
||||||
// NOTE: vec_data(&contents) may be stack allocated; let's create a copy if
|
|
||||||
// that's the case.
|
|
||||||
if (contents.not_inlined)
|
if (contents.not_inlined)
|
||||||
{
|
{
|
||||||
|
// Take the heap pointer from us.
|
||||||
ret->data = vec_data(&contents);
|
ret->data = vec_data(&contents);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// vec_data(&contents) is stack allocated; can't carry that out of this
|
||||||
|
// function!
|
||||||
ret->data = calloc(1, contents.size);
|
ret->data = calloc(1, contents.size);
|
||||||
memcpy(ret->data, vec_data(&contents), contents.size);
|
memcpy(ret->data, vec_data(&contents), contents.size);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user