* New YANG generated auto-cli feature with syntax modes

* The existing autocli does not support modes, complete paths must be given, eg: `set a b c d 42`.
  * In the new auto-cli, automatic modes are present at each YANG syntax node level, eg the above can be given as: `edit a b c; set d 4; top`
  * The existing CLI API remains, the new API is as follows: `cli_auto_edit()`, `cli_auto_up()`, `cli_auto_top()`, `cli_auto_show()`, `cli_auto_set()`, `cli_auto_merge()`, `cli_auto_create()`, `cli_auto_del()`.
  * See `test/test_cli_auto.sh` for an example of the new API, and `apps/cli/cli_auto.c` for the source code of the new callback API.
  * Documentation will be appear and full integration with the main example.
* Added inline state field to clixon-example.yang
* Added new clicon_data_cvec_*() API for generic cvec structs
This commit is contained in:
Olof hagsand 2020-10-14 10:54:10 +02:00
parent 8d901e1fde
commit 2d56c9674a
11 changed files with 972 additions and 12 deletions

View file

@ -134,6 +134,78 @@ clicon_data_del(clicon_handle h,
return clicon_hash_del(cdat, (char*)name);
}
/*! Get generic cligen varaibel vector (cvv) on the form <name>=<val> where <val> is cvv
*
* @param[in] h Clicon handle
* @param[in] name Data name
* @retval cvv Data value as cvv
* @retval NULL Not found (or error)
* @code
* cvec *cvv = NULL;
* if (clicon_data_cvec_get(h, "mycvv", &cvv) < 0)
* err;
* @endcode
*/
cvec *
clicon_data_cvec_get(clicon_handle h,
const char *name)
{
clicon_hash_t *cdat = clicon_data(h);
size_t len = 0;
void *p;
if ((p = clicon_hash_value(cdat, (char*)name, &len)) != NULL)
return *(cvec **)p;
return NULL;
}
/*! Set generic cligen varaibel vector (cvv) on the form <name>=<val> where <val> is cvv
* @param[in] h Clicon handle
* @param[in] name Name
* @param[in] cvv CLIgen variable vector (cvv) (malloced)
*/
int
clicon_data_cvec_set(clicon_handle h,
const char *name,
cvec *cvv)
{
clicon_hash_t *cdat = clicon_data(h);
cvec *cvv0;
/* It is the pointer to cvec that should be copied by hash,
so we send a ptr to the ptr to indicate what to copy.
*/
if ((cvv0 = clicon_data_cvec_get(h, name)) != NULL){
fprintf(stderr, "%s free %p\n", __FUNCTION__, cvv0);
cvec_free(cvv0);
}
fprintf(stderr, "%s set %p\n", __FUNCTION__, cvv);
if (clicon_hash_add(cdat, (char*)name, &cvv, sizeof(cvv)) == NULL)
return -1;
return 0;
}
/*! Delete generic cligen varaibel vector (cvv)
* @param[in] h Clicon handle
* @param[in] name Name
*/
int
clicon_data_cvec_del(clicon_handle h,
const char *name)
{
clicon_hash_t *cdat = clicon_data(h);
cvec *cvv0;
/* It is the pointer to cvec that should be copied by hash,
so we send a ptr to the ptr to indicate what to copy.
*/
if ((cvv0 = clicon_data_cvec_get(h, name)) != NULL){
fprintf(stderr, "%s free %p\n", __FUNCTION__, cvv0);
cvec_free(cvv0);
}
return clicon_hash_del(cdat, (char*)name);
}
/*!
* @param[in] h Clicon handle
* @retval yspec Yang spec