aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2020-05-26 13:57:25 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2020-05-26 13:57:25 -0400
commit73e15115a66ab0b45acbbd9f45f4622f19a32187 (patch)
treef99ee8eb2941c04890f872683688bb5715c12e07
parent41d94bc6dcb86de14c2eb1295213a72032ba01a9 (diff)
downloadspmc-73e15115a66ab0b45acbbd9f45f4622f19a32187.tar.gz
file_readlines now accepts STDIN (filename = "-")
-rw-r--r--lib/fs.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/lib/fs.c b/lib/fs.c
index cacaf6d..e75c6a0 100644
--- a/lib/fs.c
+++ b/lib/fs.c
@@ -647,8 +647,19 @@ char **file_readlines(const char *filename, size_t start, size_t limit, ReaderFn
char **result = NULL;
char *buffer = NULL;
size_t lines = 0;
+ int use_stdin = 0;
- if ((fp = fopen(filename, "r")) == NULL) {
+ if (strcmp(filename, "-") == 0) {
+ use_stdin = 1;
+ }
+
+ if (use_stdin) {
+ fp = stdin;
+ } else {
+ fp = fopen(filename, "r");
+ }
+
+ if (fp == NULL) {
perror(filename);
fprintf(SYSERROR);
return NULL;
@@ -658,7 +669,9 @@ char **file_readlines(const char *filename, size_t start, size_t limit, ReaderFn
if ((buffer = calloc(BUFSIZ, sizeof(char))) == NULL) {
perror("line buffer");
fprintf(SYSERROR);
- fclose(fp);
+ if (!use_stdin) {
+ fclose(fp);
+ }
return NULL;
}
@@ -669,10 +682,10 @@ char **file_readlines(const char *filename, size_t start, size_t limit, ReaderFn
if (!lines) {
free(buffer);
- fclose(fp);
- result = calloc(2, sizeof(char *));
- result[0] = strdup("");
- return result;
+ if (!use_stdin) {
+ fclose(fp);
+ }
+ return NULL;
}
rewind(fp);
@@ -721,6 +734,8 @@ char **file_readlines(const char *filename, size_t start, size_t limit, ReaderFn
}
free(buffer);
- fclose(fp);
+ if (!use_stdin) {
+ fclose(fp);
+ }
return result;
} \ No newline at end of file