summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2006-03-22 10:01:24 -0500
committerTheodore Ts'o <tytso@mit.edu>2006-03-22 10:01:24 -0500
commit204ae371ad2e038b41c03aba13d3a57e4e6921ec (patch)
tree2fd8a2b69ec497a9ebd97a26be96cfe877570547
parentf4f425b20bfec2bfa11a2b1df99b246541b3aff9 (diff)
downloade2fsprogs-204ae371ad2e038b41c03aba13d3a57e4e6921ec.tar.gz
Tighten up profile parsing code by combining functions
Integrate profile_std_line() into parse_line(), and profile_parse_file() into profile_update_file() to make the code use less memory. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
-rw-r--r--e2fsck/ChangeLog7
-rw-r--r--e2fsck/profile.c116
2 files changed, 55 insertions, 68 deletions
diff --git a/e2fsck/ChangeLog b/e2fsck/ChangeLog
index bd53c2ee..1421d36c 100644
--- a/e2fsck/ChangeLog
+++ b/e2fsck/ChangeLog
@@ -1,3 +1,10 @@
+2006-03-22 Theodore Ts'o <tytso@mit.edu>
+
+ * profile.c (profile_update_file, profile_parse_file, parse_line,
+ parse_std_line): Integrate profile_std_line() into
+ parse_line(), and profile_parse_file() into
+ profile_update_file() to make the code tighter.
+
2006-03-18 Theodore Ts'o <tytso@mit.edu>
* unix.c (show_stats): Use blk_t instead of int when referring to
diff --git a/e2fsck/profile.c b/e2fsck/profile.c
index 89a8d237..f50cb539 100644
--- a/e2fsck/profile.c
+++ b/e2fsck/profile.c
@@ -147,8 +147,18 @@ struct profile_node {
if ((node)->magic != PROF_MAGIC_NODE) \
return PROF_MAGIC_NODE;
-static errcode_t profile_parse_file
- (FILE *f, prf_file_t prf);
+/* profile parser declarations */
+struct parse_state {
+ int state;
+ int group_level;
+ int line_num;
+ struct profile_node *root_section;
+ struct profile_node *current_section;
+};
+
+static profile_syntax_err_cb_t syntax_err_cb;
+
+static errcode_t parse_line(char *line, struct parse_state *state);
#ifdef DEBUG_PROGRAM
static errcode_t profile_write_tree_file
@@ -433,6 +443,8 @@ errcode_t profile_update_file(prf_file_t prf)
#endif
#endif
FILE *f;
+ char buf[2048];
+ struct parse_state state;
#ifdef HAVE_STAT
#ifdef STAT_ONCE_PER_SECOND
@@ -465,6 +477,10 @@ errcode_t profile_update_file(prf_file_t prf)
return 0;
}
#endif
+ memset(&state, 0, sizeof(struct parse_state));
+ retval = profile_create_node("(root)", 0, &state.root_section);
+ if (retval)
+ return retval;
errno = 0;
f = fopen(prf->filespec, "r");
if (f == NULL) {
@@ -474,11 +490,22 @@ errcode_t profile_update_file(prf_file_t prf)
return retval;
}
prf->upd_serial++;
- retval = profile_parse_file(f, prf);
- fclose(f);
- if (retval) {
- return retval;
+ while (!feof(f)) {
+ if (fgets(buf, sizeof(buf), f) == NULL)
+ break;
+ retval = parse_line(buf, &state);
+ if (retval) {
+ if (syntax_err_cb)
+ (syntax_err_cb)(prf->filespec, retval,
+ state.line_num);
+ fclose(f);
+ return retval;
+ }
}
+ prf->root = state.root_section;
+
+ fclose(f);
+
#ifdef HAVE_STAT
prf->timestamp = st.st_mtime;
#endif
@@ -496,8 +523,6 @@ void profile_free_file(prf_file_t prf)
/* Begin the profile parser */
-static profile_syntax_err_cb_t syntax_err_cb;
-
profile_syntax_err_cb_t profile_set_syntax_err_cb(profile_syntax_err_cb_t hook)
{
profile_syntax_err_cb_t old;
@@ -511,14 +536,6 @@ profile_syntax_err_cb_t profile_set_syntax_err_cb(profile_syntax_err_cb_t hook)
#define STATE_STD_LINE 1
#define STATE_GET_OBRACE 2
-struct parse_state {
- int state;
- int group_level;
- int line_num;
- struct profile_node *root_section;
- struct profile_node *current_section;
-};
-
static char *skip_over_blanks(char *cp)
{
while (*cp && isspace((int) (*cp)))
@@ -574,8 +591,7 @@ static void parse_quoted_string(char *str)
*to = '\0';
}
-
-static errcode_t parse_std_line(char *line, struct parse_state *state)
+static errcode_t parse_line(char *line, struct parse_state *state)
{
char *cp, ch, *tag, *value;
char *p;
@@ -584,6 +600,20 @@ static errcode_t parse_std_line(char *line, struct parse_state *state)
int do_subsection = 0;
void *iter = 0;
+ state->line_num++;
+ if (state->state == STATE_GET_OBRACE) {
+ cp = skip_over_blanks(line);
+ if (*cp != '{')
+ return PROF_MISSING_OBRACE;
+ state->state = STATE_STD_LINE;
+ return 0;
+ }
+ if (state->state == STATE_INIT_COMMENT) {
+ if (line[0] != '[')
+ return 0;
+ state->state = STATE_STD_LINE;
+ }
+
if (*line == 0)
return 0;
strip_line(line);
@@ -715,56 +745,6 @@ static errcode_t parse_std_line(char *line, struct parse_state *state)
return 0;
}
-static errcode_t parse_line(char *line, struct parse_state *state)
-{
- char *cp;
-
- state->line_num++;
- switch (state->state) {
- case STATE_INIT_COMMENT:
- if (line[0] != '[')
- return 0;
- state->state = STATE_STD_LINE;
- case STATE_STD_LINE:
- return parse_std_line(line, state);
- case STATE_GET_OBRACE:
- cp = skip_over_blanks(line);
- if (*cp != '{')
- return PROF_MISSING_OBRACE;
- state->state = STATE_STD_LINE;
- }
- return 0;
-}
-
-errcode_t profile_parse_file(FILE *f, prf_file_t file)
-{
- char buf[2048];
- errcode_t retval;
- struct parse_state state;
-
- memset(&state, 0, sizeof(struct parse_state));
-
- retval = profile_create_node("(root)", 0, &state.root_section);
- if (retval)
- return retval;
-
- while (!feof(f)) {
- if (fgets(buf, sizeof(buf), f) == NULL)
- break;
- retval = parse_line(buf, &state);
- if (retval) {
- if (syntax_err_cb)
- (syntax_err_cb)(file->filespec, retval,
- state.line_num);
- return retval;
- }
- }
- file->root = state.root_section;
-
- return 0;
-}
-
-
#ifdef DEBUG_PROGRAM
/*
* Return TRUE if the string begins or ends with whitespace