- case CONFIG_ITEM_BOOL:
- case CONFIG_ITEM_INTEGER:
- if( p_item->psz_text )
- fprintf( file, "# %s (%s)\n", p_item->psz_text,
- (p_item->i_type == CONFIG_ITEM_BOOL) ?
- _("boolean") : _("integer") );
- if( i_value == p_item->orig.i )
- fputc ('#', file);
- fprintf( file, "%s=%i\n", p_item->psz_name, i_value );
-
- p_item->saved.i = i_value;
- break;
-
- case CONFIG_ITEM_KEY:
- if( p_item->psz_text )
- fprintf( file, "# %s (%s)\n", p_item->psz_text,
- _("key") );
- if( i_value == p_item->orig.i )
- fputc ('#', file);
- psz_key = ConfigKeyToString( i_value );
- fprintf( file, "%s=%s\n", p_item->psz_name,
- psz_key ? psz_key : "" );
- free (psz_key);
-
- p_item->saved.i = i_value;
- break;
-
- case CONFIG_ITEM_FLOAT:
- if( p_item->psz_text )
- fprintf( file, "# %s (%s)\n", p_item->psz_text,
- _("float") );
- if( f_value == p_item->orig.f )
- fputc ('#', file);
- fprintf( file, "%s=%f\n", p_item->psz_name, (double)f_value );
-
- p_item->saved.f = f_value;
- break;
-
- default:
- if( p_item->psz_text )
- fprintf( file, "# %s (%s)\n", p_item->psz_text,
- _("string") );
- if( (!psz_value && !p_item->orig.psz) ||
- (psz_value && p_item->orig.psz &&
- !strcmp( psz_value, p_item->orig.psz )) )
- fputc ('#', file);
- fprintf( file, "%s=%s\n", p_item->psz_name,
- psz_value ?: "" );
-
- if( b_autosave && !p_item->b_autosave ) break;
-
- free ((char *)p_item->saved.psz);
- if( (psz_value && p_item->orig.psz &&
- strcmp( psz_value, p_item->orig.psz )) ||
- !psz_value || !p_item->orig.psz)
- p_item->saved.psz = strdupnull (psz_value);
- else
- p_item->saved.psz = NULL;
+ const char *psz_value = b_retain ? p_item->saved.psz
+ : p_item->value.psz;
+ bool modified;
+
+ assert (IsConfigStringType (p_item->i_type));
+
+ if (b_retain && (psz_value == NULL)) /* FIXME: hack */
+ psz_value = p_item->orig.psz;
+
+ modified =
+ (psz_value != NULL)
+ ? ((p_item->orig.psz != NULL)
+ ? (strcmp (psz_value, p_item->orig.psz) != 0)
+ : true)
+ : (p_item->orig.psz != NULL);
+
+ config_Write (file, p_item->psz_text, N_("string"),
+ !modified, p_item->psz_name, "%s",
+ psz_value ? psz_value : "");
+
+ if ( !b_retain )
+ {
+
+ free ((char *)p_item->saved.psz);
+ if( (psz_value && p_item->orig.psz &&
+ strcmp( psz_value, p_item->orig.psz )) ||
+ !psz_value || !p_item->orig.psz)
+ p_item->saved.psz = strdupnull (psz_value);
+ else
+ p_item->saved.psz = NULL;
+ }