/* // Copyright (c) 2016-2017 Intel Corporation // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. */ /* * Copyright (c) 2009, Olivier MATZ * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the University of California, Berkeley nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include "parse_obj_list.h" /* This file is an example of extension of libcmdline. It provides an * example of objects stored in a list. */ struct cmdline_token_ops token_obj_list_ops = { .parse = parse_obj_list, .complete_get_nb = complete_get_nb_obj_list, .complete_get_elt = complete_get_elt_obj_list, .get_help = get_help_obj_list, }; int parse_obj_list(cmdline_parse_token_hdr_t *tk, const char *buf, void *res, unsigned ressize) { struct token_obj_list *tk2 = (struct token_obj_list *)tk; struct token_obj_list_data *tkd = &tk2->obj_list_data; struct object *o; unsigned int token_len = 0; if (*buf == 0) return -1; if (res && ressize < sizeof(struct object *)) return -1; while(!cmdline_isendoftoken(buf[token_len])) token_len++; SLIST_FOREACH(o, tkd->list, next) { if (token_len != strnlen(o->name, OBJ_NAME_LEN_MAX)) continue; if (strncmp(buf, o->name, token_len)) continue; break; } if (!o) /* not found */ return -1; /* store the address of object in structure */ if (res) *(struct object **)res = o; return token_len; } int complete_get_nb_obj_list(cmdline_parse_token_hdr_t *tk) { struct token_obj_list *tk2 = (struct token_obj_list *)tk; struct token_obj_list_data *tkd = &tk2->obj_list_data; struct object *o; int ret = 0; SLIST_FOREACH(o, tkd->list, next) { ret ++; } return ret; } int complete_get_elt_obj_list(cmdline_parse_token_hdr_t *tk, int idx, char *dstbuf, unsigned int size) { struct token_obj_list *tk2 = (struct token_obj_list *)tk; struct token_obj_list_data *tkd = &tk2->obj_list_data; struct object *o; int i = 0; unsigned len; SLIST_FOREACH(o, tkd->list, next) { if (i++ == idx) break; } if (!o) return -1; len = strnlen(o->name, OBJ_NAME_LEN_MAX); if ((len + 1) > size) return -1; if (dstbuf) snprintf(dstbuf, size, "%s", o->name); return 0; } int get_help_obj_list(__attribute__((unused)) cmdline_parse_token_hdr_t *tk, char *dstbuf, unsigned int size) { snprintf(dstbuf, size, "Obj-List"); return 0; }