/* * symbols.c - routines for symbol handling * * Copyright (C) 2014 Ondrej Oprala * Copyright (C) 2016 Igor Gnatenko * * This file may be redistributed under the terms of the * GNU Lesser General Public License. */ /** * SECTION: symbols * @title: Symbols * @short_description: allows to overwrite default output chars (for ascii art) * * An API to access and modify data and information per symbol/symbol group. */ #include #include #include #include "smartcolsP.h" /** * scols_new_symbols: * * Returns: a pointer to a newly allocated struct libscols_symbols instance. */ struct libscols_symbols *scols_new_symbols(void) { struct libscols_symbols *sy = calloc(1, sizeof(struct libscols_symbols)); if (!sy) return NULL; sy->refcount = 1; return sy; } /** * scols_ref_symbols: * @sy: a pointer to a struct libscols_symbols instance * * Increases the refcount of @sy. */ void scols_ref_symbols(struct libscols_symbols *sy) { if (sy) sy->refcount++; } /** * scols_unref_symbols: * @sy: a pointer to a struct libscols_symbols instance * * Decreases the refcount of @sy. */ void scols_unref_symbols(struct libscols_symbols *sy) { if (sy && --sy->refcount <= 0) { free(sy->branch); free(sy->vert); free(sy->right); free(sy->title_padding); free(sy); } } /** * scols_symbols_set_branch: * @sb: a pointer to a struct libscols_symbols instance * @str: a string which will represent the branch part of a tree output * * Returns: 0, a negative value in case of an error. */ int scols_symbols_set_branch(struct libscols_symbols *sb, const char *str) { char *p = NULL; assert(sb); if (!sb) return -EINVAL; if (str) { p = strdup(str); if (!p) return -ENOMEM; } free(sb->branch); sb->branch = p; return 0; } /** * scols_symbols_set_vertical: * @sb: a pointer to a struct libscols_symbols instance * @str: a string which will represent the vertical part of a tree output * * Returns: 0, a negative value in case of an error. */ int scols_symbols_set_vertical(struct libscols_symbols *sb, const char *str) { char *p = NULL; assert(sb); if (!sb) return -EINVAL; if (str) { p = strdup(str); if (!p) return -ENOMEM; } free(sb->vert); sb->vert = p; return 0; } /** * scols_symbols_set_right: * @sb: a pointer to a struct libscols_symbols instance * @str: a string which will represent the right part of a tree output * * Returns: 0, a negative value in case of an error. */ int scols_symbols_set_right(struct libscols_symbols *sb, const char *str) { char *p = NULL; assert(sb); if (!sb) return -EINVAL; if (str) { p = strdup(str); if (!p) return -ENOMEM; } free(sb->right); sb->right = p; return 0; } /** * scols_symbols_set_title_padding: * @sb: a pointer to a struct libscols_symbols instance * @str: a string which will represent the symbols which wraps title output * * The current implemetation uses only the first byte from the padding string. * A multibyte chars are not supported yet. * * Returns: 0, a negative value in case of an error. * * Since: 2.28 */ int scols_symbols_set_title_padding(struct libscols_symbols *sb, const char *str) { char *p = NULL; assert(sb); if (!sb) return -EINVAL; if (str) { p = strdup(str); if (!p) return -ENOMEM; } free(sb->title_padding); sb->title_padding = p; return 0; } /** * scols_copy_symbols: * @sb: a pointer to a struct libscols_symbols instance * * Returns: a newly allocated copy of the @sb symbol group or NULL in caes of an error. */ struct libscols_symbols *scols_copy_symbols(const struct libscols_symbols *sb) { struct libscols_symbols *ret; int rc; assert(sb); if (!sb) return NULL; ret = scols_new_symbols(); if (!ret) return NULL; rc = scols_symbols_set_branch(ret, sb->branch); if (!rc) rc = scols_symbols_set_vertical(ret, sb->vert); if (!rc) rc = scols_symbols_set_right(ret, sb->right); if (!rc) rc = scols_symbols_set_title_padding(ret, sb->title_padding); if (!rc) return ret; scols_unref_symbols(ret); return NULL; }