[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: [RFC/PATCH v2 4/5] libbb: add config_from_fp() and config_free() functions
From: Bartosz Golaszewski <bartekgola () gmail ! com>
Date: 2015-08-21 14:23:42
Message-ID: 1440167023-31099-5-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 7b41c9b..e5559be 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1285,11 +1285,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 1590d9a..7e3be8a 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.1.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