libbb: updated config_parse() from Vladimir

function                                             old     new   delta
config_read                                          385     460     +75
runsvdir_main                                       1701    1716     +15
readit                                               331     338      +7
passwd_main                                         1049    1053      +4
parse_command                                       1504    1507      +3
decode_format_string                                 822     824      +2
bb__parsespent                                       117     119      +2
udhcp_get_option                                     221     222      +1
changepath                                           196     194      -2
parse_inittab                                        400     396      -4
nameif_main                                          683     679      -4
make_device                                         1176    1172      -4
config_open                                           48      40      -8
expand_main                                          698     689      -9
readcmd                                             1012    1002     -10
config_free_data                                      37      21     -16
SynchronizeFile                                      683     643     -40
sleep_main                                           474     362    -112
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 8/10 up/down: 109/-209)        Total: -100 bytes

diff --git a/include/libbb.h b/include/libbb.h
index 14af136..af6c138 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -988,16 +988,22 @@
 int bb_parse_mode(const char* s, mode_t* theMode) FAST_FUNC;
 
 /*
- * Uniform config file parser helpers
+ * Config file parser
  */
+#define PARSE_DONT_REDUCE       0x00010000 // do not treat consecutive delimiters as one
+#define PARSE_DONT_TRIM         0x00020000 // do not trim line of leading and trailing delimiters
+#define PARSE_LAST_IS_GREEDY    0x00040000 // last token takes whole remainder of the line
+//#define PARSE_DONT_NULL         0x00080000 // do not set tokens[] to NULL
 typedef struct parser_t {
 	FILE *fp;
-	char *line, *data;
+	char *line;
+	USE_FEATURE_PARSE_COPY(char *data;)
 	int lineno;
 } parser_t;
 parser_t* config_open(const char *filename) FAST_FUNC;
-/* TODO: add define magic to collapse ntokens/mintokens/comment into one int param */
-int config_read(parser_t *parser, char **tokens, int ntokens, int mintokens, const char *delims, char comment) FAST_FUNC;
+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;
 
 /* Concatenate path and filename to new allocated buffer.