123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- /*
- * shell_pwd.c
- */
- #include <stdlib.h>
- #include <assert.h>
- #include "lub/string.h"
- #include "private.h"
- /*--------------------------------------------------------- */
- void clish_shell__init_pwd(clish_shell_pwd_t *pwd)
- {
- pwd->line = NULL;
- pwd->view = NULL;
- /* initialise the tree of vars */
- lub_bintree_init(&pwd->viewid,
- clish_var_bt_offset(),
- clish_var_bt_compare, clish_var_bt_getkey);
- }
- /*--------------------------------------------------------- */
- void clish_shell__fini_pwd(clish_shell_pwd_t *pwd)
- {
- clish_var_t *var;
- lub_string_free(pwd->line);
- pwd->view = NULL;
- /* delete each VAR held */
- while ((var = lub_bintree_findfirst(&pwd->viewid))) {
- lub_bintree_remove(&pwd->viewid, var);
- clish_var_delete(var);
- }
- }
- /*--------------------------------------------------------- */
- void clish_shell__set_pwd(clish_shell_t *this,
- const char *line, clish_view_t *view, char *viewid, clish_context_t *context)
- {
- clish_shell_pwd_t **tmp;
- size_t new_size = 0;
- unsigned int i;
- unsigned int index = clish_view__get_depth(view);
- clish_shell_pwd_t *newpwd;
- /* Create new element */
- newpwd = malloc(sizeof(*newpwd));
- assert(newpwd);
- clish_shell__init_pwd(newpwd);
- /* Resize the pwd vector */
- if (index >= this->pwdc) {
- new_size = (index + 1) * sizeof(clish_shell_pwd_t *);
- tmp = realloc(this->pwdv, new_size);
- assert(tmp);
- this->pwdv = tmp;
- /* Initialize new elements */
- for (i = this->pwdc; i <= index; i++) {
- clish_shell_pwd_t *pwd = malloc(sizeof(*pwd));
- assert(pwd);
- clish_shell__init_pwd(pwd);
- this->pwdv[i] = pwd;
- }
- this->pwdc = index + 1;
- }
- /* Fill the new pwd entry */
- newpwd->line = line ? lub_string_dup(line) : NULL;
- newpwd->view = view;
- clish_shell__expand_viewid(viewid, &newpwd->viewid, context);
- clish_shell__fini_pwd(this->pwdv[index]);
- free(this->pwdv[index]);
- this->pwdv[index] = newpwd;
- this->depth = index;
- }
- /*--------------------------------------------------------- */
- char *clish_shell__get_pwd_line(const clish_shell_t *this, unsigned int index)
- {
- if (index >= this->pwdc)
- return NULL;
- return this->pwdv[index]->line;
- }
- /*--------------------------------------------------------- */
- char *clish_shell__get_pwd_full(const clish_shell_t * this, unsigned depth)
- {
- char *pwd = NULL;
- unsigned i;
- for (i = 1; i <= depth; i++) {
- const char *str =
- clish_shell__get_pwd_line(this, i);
- /* Cannot get full path */
- if (!str) {
- lub_string_free(pwd);
- return NULL;
- }
- if (pwd)
- lub_string_cat(&pwd, " ");
- lub_string_cat(&pwd, "\"");
- lub_string_cat(&pwd, str);
- lub_string_cat(&pwd, "\"");
- }
- return pwd;
- }
- /*--------------------------------------------------------- */
- clish_view_t *clish_shell__get_pwd_view(const clish_shell_t * this, unsigned int index)
- {
- if (index >= this->pwdc)
- return NULL;
- return this->pwdv[index]->view;
- }
- /*--------------------------------------------------------- */
- konf_client_t *clish_shell__get_client(const clish_shell_t * this)
- {
- return this->client;
- }
- /*--------------------------------------------------------- */
- void clish_shell__set_lockfile(clish_shell_t * this, const char * path)
- {
- if (!this)
- return;
- lub_string_free(this->lockfile);
- this->lockfile = NULL;
- if (path)
- this->lockfile = lub_string_dup(path);
- }
- /*--------------------------------------------------------- */
- char * clish_shell__get_lockfile(clish_shell_t * this)
- {
- if (!this)
- return NULL;
- return this->lockfile;
- }
- /*--------------------------------------------------------- */
- int clish_shell__set_socket(clish_shell_t * this, const char * path)
- {
- if (!this || !path)
- return -1;
- konf_client_free(this->client);
- this->client = konf_client_new(path);
- return 0;
- }
|