Index: config.c =================================================================== --- config.c (revision 49334) +++ config.c (working copy) @@ -653,6 +657,8 @@ } if (newcat) { move_variables(newcat, *cat); + v = ast_variable_new("inherits_", catname); + ast_variable_append(*cat, v); ast_category_destroy(newcat); newcat = NULL; } @@ -665,6 +671,8 @@ return -1; } inherit_category(*cat, base); + v = ast_variable_new("inherits_", cur); + ast_variable_append(*cat, v); } } } @@ -958,9 +974,13 @@ FILE *f; char fn[256]; char date[256]=""; + const char *inherit; + const char *pvalue=""; time_t t; struct ast_variable *var; struct ast_category *cat; + struct ast_category *parent = NULL; + struct ast_comment *cmt; int blanklines = 0; @@ -993,28 +1013,61 @@ for (cmt = cat->precomments; cmt; cmt=cmt->next) { if (cmt->cmt[0] != ';' || cmt->cmt[1] != '!') + { fprintf(f,"%s", cmt->cmt); + } } + if (!cat->precomments) fprintf(f,"\n"); - fprintf(f, "[%s]", cat->name); - for(cmt = cat->sameline; cmt; cmt=cmt->next) - { + + /* is this an interited user value? */ + inherit = ast_variable_retrieve(cfg, cat->name, "inherits_"); + if (inherit) { + fprintf(f, "[%s](%s)",cat->name, inherit); + } else + fprintf(f, "[%s]", cat->name); + + for(cmt = cat->sameline; cmt; cmt=cmt->next) { fprintf(f,"%s", cmt->cmt); } if (!cat->sameline) fprintf(f,"\n"); var = cat->root; + + /* If this cat has a parent (i.e. if it inherited) only add in things which are different from the parent */ + if (inherit) + parent = ast_category_get(cfg, inherit); + while(var) { - for (cmt = var->precomments; cmt; cmt=cmt->next) - { - if (cmt->cmt[0] != ';' || cmt->cmt[1] != '!') + for (cmt = var->precomments; cmt; cmt=cmt->next) { + if (cmt->cmt[0] != ';' || cmt->cmt[1] != '!') { fprintf(f,"%s", cmt->cmt); + } } - if (var->sameline) - fprintf(f, "%s %s %s %s", var->name, (var->object ? "=>" : "="), var->value, var->sameline->cmt); - else - fprintf(f, "%s %s %s\n", var->name, (var->object ? "=>" : "="), var->value); + if (parent) + pvalue = ast_variable_retrieve(cfg, parent->name, var->name); + + if (pvalue) { + if (!strcmp(pvalue, var->value)) { + /* Same as the parent value - ignore it */ + } else if (!strcmp(var->name, "inherits_")) { + /* Automatically created inheritance marker -- ignore it */ + } else { + if (var->sameline) + fprintf(f, "%s %s %s %s", var->name, (var->object ? "=>" : "="), var->value, var->sameline->cmt); + else + fprintf(f, "%s %s %s\n", var->name, (var->object ? "=>" : "="), var->value); + } + } else { + if (!strcmp(var->name, "inherits_")) { + /* Automatically created inheritance marker -- ignore it */ + } else if (var->sameline) + fprintf(f, "%s %s %s %s", var->name, (var->object ? "=>" : "="), var->value, var->sameline->cmt); + else + fprintf(f, "%s %s %s\n", var->name, (var->object ? "=>" : "="), var->value); + } + if (var->blanklines) { blanklines = var->blanklines; while (blanklines--)