[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: [PATCH 2/3] libbb: add config_from_fp() and config_free() functions
From: Bartosz Golaszewski <bartekgola () gmail ! com>
Date: 2016-09-30 10:04:41
Message-ID: 1475229882-29715-3-git-send-email-bartekgola () gmail ! com
[Download RAW message or body]
The first function allows to create parser_t objects for files
that are already open.
The second frees the parser_t instance without closing the file.
With these functions it is now possible to feed config files to
applets via stdin.
Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
---
include/libbb.h | 3 +++
libbb/parse_config.c | 27 +++++++++++++++++++++------
2 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/include/libbb.h b/include/libbb.h
index 8deddc8..4da308a 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1313,11 +1313,14 @@ typedef struct parser_t {
} parser_t;
parser_t* config_open(const char *filename) FAST_FUNC;
parser_t* config_open2(const char *filename, FILE* FAST_FUNC (*fopen_func)(const char *path)) FAST_FUNC;
+parser_t* config_from_fp(FILE *fp) FAST_FUNC;
/* delims[0] is a comment char (use '\0' to disable), the rest are token delimiters */
int config_read(parser_t *parser, char **tokens, unsigned flags, const char *delims) FAST_FUNC;
#define config_read(parser, tokens, max, min, str, flags) \
config_read(parser, tokens, ((flags) | (((min) & 0xFF) << 8) | ((max) & 0xFF)), str)
void config_close(parser_t *parser) FAST_FUNC;
+/* Free all memory used by parser, but don't close the file. */
+void config_free(parser_t *parser) FAST_FUNC;
/* Concatenate path and filename to new allocated buffer.
* Add "/" only as needed (no duplicate "//" are produced).
diff --git a/libbb/parse_config.c b/libbb/parse_config.c
index 4084397..a3c3c5d 100644
--- a/libbb/parse_config.c
+++ b/libbb/parse_config.c
@@ -65,17 +65,25 @@ int parse_main(int argc UNUSED_PARAM, char **argv)
}
#endif
+parser_t* FAST_FUNC config_from_fp(FILE *fp)
+{
+ parser_t *parser;
+
+ parser = xzalloc(sizeof(*parser));
+ parser->fp = fp;
+
+ return parser;
+}
+
parser_t* FAST_FUNC config_open2(const char *filename, FILE* FAST_FUNC (*fopen_func)(const char *path))
{
FILE* fp;
- parser_t *parser;
fp = fopen_func(filename);
if (!fp)
return NULL;
- parser = xzalloc(sizeof(*parser));
- parser->fp = fp;
- return parser;
+
+ return config_from_fp(fp);
}
parser_t* FAST_FUNC config_open(const char *filename)
@@ -83,18 +91,25 @@ parser_t* FAST_FUNC config_open(const char *filename)
return config_open2(filename, fopen_or_warn_stdin);
}
-void FAST_FUNC config_close(parser_t *parser)
+void FAST_FUNC config_free(parser_t *parser)
{
if (parser) {
if (PARSE_KEEP_COPY) /* compile-time constant */
free(parser->data);
- fclose(parser->fp);
free(parser->line);
free(parser->nline);
free(parser);
}
}
+void FAST_FUNC config_close(parser_t *parser)
+{
+ if (parser) {
+ fclose(parser->fp);
+ config_free(parser);
+ }
+}
+
/* This function reads an entire line from a text file,
* up to a newline, exclusive.
* Trailing '\' is recognized as line continuation.
--
2.7.4
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic