diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/block.c | 28 | ||||
| -rw-r--r-- | src/block.h | 5 | ||||
| -rw-r--r-- | src/blocks/date.c | 34 | ||||
| -rw-r--r-- | src/blocks/fs.c | 50 | ||||
| -rw-r--r-- | src/blocks/group.c | 10 | ||||
| -rw-r--r-- | src/blocks/ram.c | 36 | ||||
| -rw-r--r-- | src/blocks/scheme.h | 1 | ||||
| -rw-r--r-- | src/blocks/text.c | 13 | ||||
| -rw-r--r-- | src/config.c | 42 |
9 files changed, 116 insertions, 103 deletions
diff --git a/src/block.c b/src/block.c index f735174..6a7311e 100644 --- a/src/block.c +++ b/src/block.c @@ -31,36 +31,10 @@ void block_update(block_t *block) } } -void block_copy(block_t *copy, const block_t *block) -{ -// memcpy(copy, block, sizeof(block_t)); -// -// // NOTE: Strings must be copied -// copy->label = strcopy(block->label); -// -// if (block->type == BLOCK_TEXT) { -// copy->text.text = strcopy(block->text.text); -// } else if (block->type == BLOCK_GROUP) { -// copy->group.children = calloc(block->group.n_children, sizeof(block_t *)); -// -// for (int i = 0; i < block->group.n_children; i++) { -// block->group.children[i] = malloc(sizeof(block_t)); -// block_copy(block->group.children[i], copy->group.children[i]); -// } -// } -} - -// NOTE: This does not recursively free groups! void block_free(block_t *block) { free(block->label); -// -// if (block->type == BLOCK_TEXT) { -// free(block->text.text); -// } else if (block->type == BLOCK_GROUP) { -// free(block->group.children); -// } -// assert(block->clean_fn != NULL); block->clean_fn(block); + free(block); } diff --git a/src/block.h b/src/block.h index d9800ee..b310a36 100644 --- a/src/block.h +++ b/src/block.h @@ -36,6 +36,7 @@ typedef void (*block_event_t)(block_t *block, event_t event); typedef void (*block_update_t)(block_t *block); // Called to cleanup a block and free its memory +// NOTE: This should NOT free any other block! // typedef void (*block_clean_t)(block_t *block); @@ -87,7 +88,7 @@ typedef struct { block_t block; unsigned int spacing; size_t n_children; - struct block **children; + block_t **children; bool collapse; } block_group_t; @@ -100,8 +101,6 @@ typedef struct { void block_update(block_t *block); -void block_copy(block_t *copy, const block_t *block); - void block_free(block_t *block); #endif diff --git a/src/blocks/date.c b/src/blocks/date.c index 01c62c3..93747c3 100644 --- a/src/blocks/date.c +++ b/src/blocks/date.c @@ -6,33 +6,43 @@ #include "../any_log.h" +typedef struct { + block_text_t block; + char *format; +} block_date_t; + static void block_date_update(block_t *block) { + block_date_t *date = (block_date_t *)block; + time_t epoch = time(NULL); struct tm *loc_time = localtime(&epoch); char buffer[64]; - strftime(buffer, sizeof(buffer), block->state, loc_time); + strftime(buffer, sizeof(buffer), date->format, loc_time); - free(block->text.text); - block->text.text = strcopy(buffer); - assert(block->text.text != NULL); + free(date->block.text); + date->block.text = strcopy(buffer); + assert(date->block.text != NULL); } -static void block_date_finalize(block_t *block) +static void block_date_clean(block_t *block) { - free(block->state); + block_date_t *date = (block_date_t *)block; + free(date->format); } static bool block_date_validate(block_t *block, const block_scheme_t *scheme) { - if (block->text.text == NULL) { + block_date_t *date = (block_date_t *)block; + + if (date->block.text == NULL) { log_error("Block '%s' requires key '%s'", block->label, "text"); return false; } - block->state = block->text.text; - block->text.text = NULL; + date->format = date->block.text; + date->block.text = NULL; return true; } @@ -44,10 +54,10 @@ const block_scheme_t block_date_scheme = { .tv_sec = 1, .tv_nsec = 0, }, - .update_cb = block_date_update, - .finalize_cb = block_date_finalize, + .update_fn = block_date_update, + .clean_fn = block_date_clean, }, - .size = sizeof(char *), + .size = sizeof(block_date_t), .entries = NULL, .validate = block_date_validate, }; diff --git a/src/blocks/fs.c b/src/blocks/fs.c index 65e8fe2..9bb4452 100644 --- a/src/blocks/fs.c +++ b/src/blocks/fs.c @@ -10,13 +10,18 @@ #include "../any_log.h" +typedef struct { + block_text_t block; + char *format; + char *path; +} block_fs_t; + static void block_fs_update(block_t *block) { - const char *path = ((char **)block->state)[0]; - const char *text = ((char **)block->state)[1]; + block_fs_t *fs = (block_fs_t *)block; struct statvfs sbuf; - assert(statvfs(path, &sbuf) == 0); + assert(statvfs(fs->path, &sbuf) == 0); static const char *fs_formats[] = { "total", @@ -38,47 +43,48 @@ static void block_fs_update(block_t *block) buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], NULL, }; - free(block->text.text); - block->text.text = strformat(text, '%', fs_formats, fs_values); - assert(block->text.text != NULL); + free(fs->block.text); + fs->block.text = strformat(fs->format, '%', fs_formats, fs_values); + assert(fs->block.text != NULL); } -static void block_fs_finalize(block_t *block) +static void block_fs_clean(block_t *block) { - free(block->state); + block_fs_t *fs = (block_fs_t *)block; + free(fs->format); + free(fs->path); } static bool block_fs_validate(block_t *block, const block_scheme_t *scheme) { - if (block->text.text == NULL) { + block_fs_t *fs = (block_fs_t *)block; + + if (fs->block.text == NULL) { log_error("Block '%s' requires key '%s'", block->label, "text"); return false; } - if (strstr(block->text.text, "%{") == NULL) { + if (strstr(fs->block.text, "%{") == NULL) { log_warn("Block '%s' does not use any fs variable", block->label); - block->update_cb = NULL; + block->update_fn = NULL; log_debug("Disabled updates for block '%s'", block->label); return true; } - const char *path = ((char **)block->state)[0]; struct stat sbuf; - - if (path == NULL || stat(path, &sbuf) < 0) { - log_error("Block '%s' was given an invalid path '%s'", block->label, path); + if (fs->path == NULL || stat(fs->path, &sbuf) < 0) { + log_error("Block '%s' was given an invalid path '%s'", block->label, fs->path); return false; } - ((char **)block->state)[1] = block->text.text; - block->text.text = NULL; - + fs->format = fs->block.text; + fs->block.text = NULL; return true; } static const config_entry_t block_fs_entries[] = { - { "path", CONFIG_STRING, NULL, 0 }, + { "path", CONFIG_STRING, NULL, offsetof(block_fs_t, path) }, { 0 }, }; @@ -90,10 +96,10 @@ const block_scheme_t block_fs_scheme = { .tv_sec = 20, .tv_nsec = 0, }, - .update_cb = block_fs_update, - .finalize_cb = block_fs_finalize, + .update_fn = block_fs_update, + .clean_fn = block_fs_clean, }, - .size = 2 * sizeof(char *), + .size = sizeof(block_fs_t), .entries = block_fs_entries, .validate = block_fs_validate, }; diff --git a/src/blocks/group.c b/src/blocks/group.c index 9843afa..ae8f981 100644 --- a/src/blocks/group.c +++ b/src/blocks/group.c @@ -1,12 +1,18 @@ #include "scheme.h" +static void block_group_clean(block_t *block) +{ + block_group_t *group = (block_group_t *)block; + free(group->children); +} + const block_scheme_t block_group_scheme = { .name = "group", .block = { .type = BLOCK_GROUP, - .group.collapse = false, + .clean_fn = block_group_clean, }, - .size = 0, + .size = sizeof(block_group_t), .entries = NULL, .validate = NULL, }; diff --git a/src/blocks/ram.c b/src/blocks/ram.c index 5a95013..8c21b21 100644 --- a/src/blocks/ram.c +++ b/src/blocks/ram.c @@ -7,6 +7,11 @@ #include "../any_log.h" +typedef struct { + block_text_t block; + char *format; +} block_ram_t; + static void block_ram_update(block_t *block) { FILE *meminfo = fopen("/proc/meminfo", "rb"); @@ -47,33 +52,38 @@ static void block_ram_update(block_t *block) NULL, }; - free(block->text.text); - block->text.text = strformat(block->state, '%', ram_formats, ram_values); - assert(block->text.text != NULL); + block_ram_t *ram = (block_ram_t *)block; + free(ram->block.text); + + ram->block.text = strformat(ram->format, '%', ram_formats, ram_values); + assert(ram->block.text != NULL); } -static void block_ram_finalize(block_t *block) +static void block_ram_clean(block_t *block) { - free(block->state); + block_ram_t *ram = (block_ram_t *)block; + free(ram->format); } static bool block_ram_validate(block_t *block, const block_scheme_t *scheme) { - if (block->text.text == NULL) { + block_ram_t *ram = (block_ram_t *)block; + + if (ram->block.text == NULL) { log_error("Block '%s' requires key '%s'", block->label, "text"); return false; } - if (strstr(block->text.text, "%{") == NULL) { + if (strstr(ram->block.text, "%{") == NULL) { log_warn("Block '%s' does not use any ram variable", block->label); - block->update_cb = NULL; + block->update_fn = NULL; log_debug("Disabled updates for block '%s'", block->label); return true; } - block->state = block->text.text; - block->text.text = NULL; + ram->format = ram->block.text; + ram->block.text = NULL; return true; } @@ -85,10 +95,10 @@ const block_scheme_t block_ram_scheme = { .tv_sec = 1, .tv_nsec = 0, }, - .update_cb = block_ram_update, - .finalize_cb = block_ram_finalize, + .update_fn = block_ram_update, + .clean_fn = block_ram_clean, }, - .size = sizeof(char *), + .size = sizeof(block_ram_t), .entries = NULL, .validate = block_ram_validate, }; diff --git a/src/blocks/scheme.h b/src/blocks/scheme.h index b726afe..a3dc9c2 100644 --- a/src/blocks/scheme.h +++ b/src/blocks/scheme.h @@ -13,7 +13,6 @@ struct block_scheme { size_t size; const config_entry_t *entries; block_validate_t validate; - //block_resolve_t resolve; }; extern const block_scheme_t *block_schemes[]; diff --git a/src/blocks/text.c b/src/blocks/text.c index f2c1651..270b197 100644 --- a/src/blocks/text.c +++ b/src/blocks/text.c @@ -2,9 +2,17 @@ #include "../any_log.h" +static void block_text_clean(block_t *block) +{ + block_text_t *text = (block_text_t *)block; + free(text->text); +} + static bool block_text_validate(block_t *block, const block_scheme_t *scheme) { - if (block->text.text == NULL) { + block_text_t *text = (block_text_t *)block; + + if (text->text == NULL) { log_error("Block '%s' requires key '%s'", block->label, "text"); return false; } @@ -16,8 +24,9 @@ const block_scheme_t block_text_scheme = { .name = "text", .block = { .type = BLOCK_TEXT, + .clean_fn = block_text_clean, }, - .size = 0, + .size = sizeof(block_text_t), .entries = NULL, .validate = block_text_validate, }; diff --git a/src/config.c b/src/config.c index 0d48ef6..d89bdde 100644 --- a/src/config.c +++ b/src/config.c @@ -350,6 +350,21 @@ static config_status_t config_read_block(const block_scheme_t *scheme, block_t * : config_read_entry(scheme->entries, block, type, section, key, value); } +static block_t *config_alloc_block(config_t *config, const block_scheme_t *scheme, char *label) +{ + config->blocks = realloc(config->blocks, ++config->n_blocks * sizeof(block_t *)); + assert(config->blocks != NULL); + + config->blocks[config->n_blocks - 1] = calloc(1, scheme->size); + block_t *block = config->blocks[config->n_blocks - 1]; + assert(block != NULL); + + memcpy(block, &scheme->block, sizeof(block_t)); + block->label = label; + return block; +} + +// TODO: More robust way to define defaults void config_init(config_t *config) { const config_t config_default = { @@ -363,11 +378,9 @@ void config_init(config_t *config) memcpy(config, &config_default, sizeof(config_t)); config->font = strcopy(config_default.font); - config->n_blocks = 1; - config->blocks = calloc(1, sizeof(block_t *)); - config->blocks[0]->label = strcopy("bar"); - config->blocks[0]->type = BLOCK_GROUP; - //config->blocks->group.spacing = 10; + extern const block_scheme_t block_group_scheme; + block_group_t *bar = (block_group_t *)config_alloc_block(config, &block_group_scheme, strcopy("bar")); + bar->spacing = 10; } void config_read(config_t *config, FILE *file) @@ -388,10 +401,6 @@ void config_read(config_t *config, FILE *file) if (section != NULL) { if (!strncmp(section, "block.", 6)) { - config->blocks = realloc(config->blocks, ++config->n_blocks * sizeof(block_t *)); - assert(config->blocks != NULL); - block = config->blocks[config->n_blocks - 1]; - char *label = strcopy(section + 6); if (label == NULL || *label == '\0' || !strcmp(label, "bar")) { ++errors; @@ -399,7 +408,7 @@ void config_read(config_t *config, FILE *file) "s:section", section, "i:line", ini.line); } else { - for (size_t i = 0; i < config->n_blocks - 1; i++) { + for (size_t i = 0; i < config->n_blocks; i++) { if (!strcmp(label, config->blocks[i]->label)) { ++errors; log_value_error("Block section must have a unique label", @@ -432,15 +441,7 @@ void config_read(config_t *config, FILE *file) continue; scheme = block_schemes[i]; - block_copy(block, &scheme->block); - free(block->label); - block->label = label; - - //if (scheme->size != 0) { - // block->state = malloc(scheme->size); - // memset(block->state, 0, scheme->size); - //} - + block = config_alloc_block(config, scheme, label); goto skip_pair; } @@ -481,8 +482,7 @@ void config_read(config_t *config, FILE *file) } if (block != NULL) { - status = config_read_block(scheme, config->blocks[config->n_blocks - 1], - &type, section, key, value); + status = config_read_block(scheme, block, &type, section, key, value); } switch (status) { |
