blob: dfe2ba7b6c1d8b6c37584c1107958e550e90425f (
plain) (
tree)
|
|
/*
* symbols.c - routines for symbol handling
*
* Copyright (C) 2014 Ondrej Oprala <ooprala@redhat.com>
* Copyright (C) 2016 Igor Gnatenko <i.gnatenko.brain@gmail.com>
*
* 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 <stdlib.h>
#include <unistd.h>
#include <string.h>
#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_wrap);
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_wrap:
* @sb: a pointer to a struct libscols_symbols instance
* @str: a string which will represent the symbols which wraps title output
*
* Returns: 0, a negative value in case of an error.
*/
int scols_symbols_set_title_wrap(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_wrap);
sb->title_wrap = 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_wrap(ret, sb->title_wrap);
if (!rc)
return ret;
scols_unref_symbols(ret);
return NULL;
}
|