Browse Source

Add first-pass attempt at reducing conf file sprawl

master
cancel 5 years ago
parent
commit
db385d7a06
  1. 43
      sysmisc.c
  2. 14
      sysmisc.h
  3. 61
      tui_main.c

43
sysmisc.c

@ -172,6 +172,37 @@ ok:
return Conf_read_left_and_right; return Conf_read_left_and_right;
} }
bool conf_read_match(FILE **pfile, char const *const *names, Usz nameslen,
char *buf, Usz bufsize, Usz *out_index, char **out_value) {
FILE *file = *pfile;
if (!file)
return false;
char *left;
Usz leftsz, rightsz;
next_line:;
Conf_read_result res =
conf_read_line(file, buf, bufsize, &left, &leftsz, out_value, &rightsz);
switch (res) {
case Conf_read_left_and_right:
for (Usz i = 0; i < nameslen; i++) {
if (strcmp(names[i], left) == 0) {
*out_index = i;
return true;
}
}
goto next_line;
case Conf_read_irrelevant:
goto next_line;
case Conf_read_buffer_too_small:
case Conf_read_eof:
case Conf_read_io_error:
break;
}
fclose(file);
*pfile = NULL;
return false;
}
typedef enum { typedef enum {
Conf_dir_ok = 0, Conf_dir_ok = 0,
Conf_dir_no_home, Conf_dir_no_home,
@ -342,3 +373,15 @@ char const *prefs_save_error_string(Prefs_save_error error) {
} }
return "Unknown"; return "Unknown";
} }
void ezconf_read_start(Ezconf_read *ezcr) {
ezcr->file = conf_file_open_for_reading();
ezcr->index = 0;
ezcr->value = NULL;
}
bool ezconf_read_step(Ezconf_read *ezcr, char const *const *names,
Usz nameslen) {
return conf_read_match(&ezcr->file, names, nameslen, ezcr->buffer,
sizeof ezcr->buffer, &ezcr->index, &ezcr->value);
}

14
sysmisc.h

@ -28,6 +28,9 @@ Conf_read_result conf_read_line(FILE *file, char *buf, Usz bufsize,
char **out_left, Usz *out_leftlen, char **out_left, Usz *out_leftlen,
char **out_right, Usz *out_rightlen); char **out_right, Usz *out_rightlen);
bool conf_read_match(FILE **pfile, char const *const *names, Usz nameslen,
char *buf, Usz bufsize, Usz *out_index, char **out_value);
FILE *conf_file_open_for_reading(void); FILE *conf_file_open_for_reading(void);
typedef struct { typedef struct {
@ -92,3 +95,14 @@ typedef enum {
} Prefs_save_error; } Prefs_save_error;
char const *prefs_save_error_string(Prefs_save_error error); char const *prefs_save_error_string(Prefs_save_error error);
// Just playing around with this design
typedef struct {
FILE *file;
Usz index;
char *value;
char buffer[1024];
} Ezconf_read;
void ezconf_read_start(Ezconf_read *ezcr);
bool ezconf_read_step(Ezconf_read *ezcr, char const *const*names, Usz nameslen);

61
tui_main.c

@ -2366,47 +2366,32 @@ typedef enum {
Prefs_load_ok = 0, Prefs_load_ok = 0,
} Prefs_load_error; } Prefs_load_error;
static char const *confkey_portmidi_output_device = "portmidi_output_device"; char const *const confopts[] = {"portmidi_output_device", "margins"};
static char const *confkey_margins = "margins"; enum { Confoptslen = ORCA_ARRAY_COUNTOF(confopts) };
enum {
Confopt_portmidi_output_device,
Confopt_margins,
};
ORCA_FORCE_NO_INLINE ORCA_FORCE_NO_INLINE
Prefs_load_error prefs_load_from_conf_file(Prefs *p) { Prefs_load_error prefs_load_from_conf_file(Prefs *p) {
(void)p; Ezconf_read ez;
FILE *conffile = conf_file_open_for_reading(); for (ezconf_read_start(&ez); ezconf_read_step(&ez, confopts, Confoptslen);) {
if (!conffile) { switch (ez.index) {
return Prefs_load_ok; case Confopt_portmidi_output_device: {
} osoput(&p->portmidi_output_device, ez.value);
char linebuff[1024]; } break;
char *left, *right; case Confopt_margins: {
Usz leftsz, rightsz;
for (;;) {
Conf_read_result res = conf_read_line(conffile, linebuff, sizeof linebuff,
&left, &leftsz, &right, &rightsz);
switch (res) {
case Conf_read_left_and_right: {
if (strcmp(confkey_portmidi_output_device, left) == 0) {
osoput(&p->portmidi_output_device, right);
} else if (strcmp(confkey_margins, left) == 0) {
int softmargin_y, softmargin_x; int softmargin_y, softmargin_x;
if (read_nxn_or_n(right, &softmargin_x, &softmargin_y) && if (read_nxn_or_n(ez.value, &softmargin_x, &softmargin_y) &&
softmargin_y >= 0 && softmargin_x >= 0) { softmargin_y >= 0 && softmargin_x >= 0) {
p->softmargin_y = softmargin_y; p->softmargin_y = softmargin_y;
p->softmargin_x = softmargin_x; p->softmargin_x = softmargin_x;
p->has_softmargins = true; p->has_softmargins = true;
} }
} break;
} }
continue;
}
case Conf_read_irrelevant:
continue;
case Conf_read_buffer_too_small:
case Conf_read_eof:
case Conf_read_io_error:
break;
}
break;
} }
fclose(conffile);
return Prefs_load_ok; return Prefs_load_ok;
} }
@ -2481,22 +2466,22 @@ Prefs_save_error save_prefs_to_disk(Midi_mode const *midi_mode,
switch (res) { switch (res) {
case Conf_read_left_and_right: case Conf_read_left_and_right:
#ifdef FEAT_PORTMIDI #ifdef FEAT_PORTMIDI
if (strcmp(confkey_portmidi_output_device, left) == 0) { if (strcmp(confopts[Confopt_portmidi_output_device], left) == 0) {
if (midi_output_pref != Midi_output_pref_portmidi) if (midi_output_pref != Midi_output_pref_portmidi)
continue; continue;
midi_output_pref = Midi_output_pref_none; midi_output_pref = Midi_output_pref_none;
put_conf_pair(save.tempfile, confkey_portmidi_output_device, put_conf_pair(save.tempfile, confopts[Confopt_portmidi_output_device],
osoc(midi_output_device_name)); osoc(midi_output_device_name));
osowipe(&midi_output_device_name); osowipe(&midi_output_device_name);
continue; continue;
} }
#endif #endif
if (strcmp(confkey_margins, left) == 0) { if (strcmp(confopts[Confopt_margins], left) == 0) {
if (!needs_write_margins) if (!needs_write_margins)
continue; continue;
needs_write_margins = false; needs_write_margins = false;
fprintf(save.tempfile, "%s = %dx%d\n", confkey_margins, softmargin_x, fprintf(save.tempfile, "%s = %dx%d\n", confopts[Confopt_margins],
softmargin_y); softmargin_x, softmargin_y);
continue; continue;
} }
put_conf_pair(save.tempfile, left, right); put_conf_pair(save.tempfile, left, right);
@ -2521,7 +2506,7 @@ done_reading_existing:
break; break;
#ifdef FEAT_PORTMIDI #ifdef FEAT_PORTMIDI
case Midi_output_pref_portmidi: case Midi_output_pref_portmidi:
put_conf_pair(save.tempfile, confkey_portmidi_output_device, put_conf_pair(save.tempfile, confopts[Confopt_portmidi_output_device],
osoc(midi_output_device_name)); osoc(midi_output_device_name));
osowipe(&midi_output_device_name); osowipe(&midi_output_device_name);
break; break;
@ -2529,8 +2514,8 @@ done_reading_existing:
} }
if (needs_write_margins) { if (needs_write_margins) {
needs_write_margins = false; needs_write_margins = false;
fprintf(save.tempfile, "%s = %dx%d\n", confkey_margins, softmargin_x, fprintf(save.tempfile, "%s = %dx%d\n", confopts[Confopt_margins],
softmargin_y); // TODO redundant softmargin_x, softmargin_y); // TODO redundant
} }
need_cancel_save = false; need_cancel_save = false;
Conf_save_commit_error comerr = conf_save_commit(&save); Conf_save_commit_error comerr = conf_save_commit(&save);

Loading…
Cancel
Save