misc_namelist.c from EmStar at Krugle
Show misc_namelist.c syntax highlighted
/*
*
* Copyright (c) 2003 The Regents of the University of California. 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.
*
* - Neither the name of the University 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 OR
* 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.
*
*/
/*
* implementation of namelists
*
* $Id: misc_namelist.c,v 1.4 2004/04/28 06:16:24 jelson Exp $
*/
char misc_namelist_c_cvsid[] = "$Id: misc_namelist.c,v 1.4 2004/04/28 06:16:24 jelson Exp $";
#include "misc.h"
QUEUE_FUNCTION_INSTANTIATIONS(namelist,namelist_ptrs,namelist,struct name_t_s, struct namelist_t_s);
/*
* given a name and value, add a new node to the namelist
*/
void namelist_add(namelist_t *namelist, char *name, char *value)
{
name_t *n = malloc(sizeof(name_t));
memset(n, 0, sizeof(name_t));
if (name)
n->name = strdup(name);
if (value)
n->value = strdup(value);
namelist_push(namelist, n);
}
/*
* Free an *entire* namelist, and its contents
*/
void namelist_free(namelist_t *list)
{
name_t *n, *next_n;
for (n = namelist_top(list); n; n = next_n) {
next_n = namelist_next(n);
if (n->name)
free(n->name);
if (n->value)
free(n->value);
namelist_remove(list, n);
free(n);
}
}
/*
* Return the name_t entry for a particular name, if it exists
*/
name_t *namelist_find(namelist_t *namelist, char *name)
{
name_t *pname;
for (pname = namelist_top(namelist); pname; pname = namelist_next(pname)) {
if (pname->name && !strcmp(pname->name, name))
return pname;
}
return NULL;
}
/*
* is a given name on a namelist already?
*/
int namelist_is_member(namelist_t *namelist, char *name)
{
return (namelist_find(namelist, name) == NULL ? 0 : 1);
}
/*
* Are two namelists the same? Return 1 if so, 0 if not.
*/
int namelist_is_same(namelist_t *list1, namelist_t *list2)
{
name_t *n1 = namelist_top(list1);
name_t *n2 = namelist_top(list2);
while (n1 && n2) {
/* make sure they both have names, or both don't have names */
if ((n1->name == NULL) != (n2->name == NULL))
return 0;
/* if they do have names, compare them */
if (n1->name && n2->name && strcmp(n1->name, n2->name))
return 0;
/* same check but for values */
if ((n1->value == NULL) != (n2->value == NULL))
return 0;
if (n1->value && n2->value && strcmp(n1->value, n2->value))
return 0;
n1 = namelist_next(n1);
n2 = namelist_next(n2);
}
/* make sure the lists were the same length */
if (n1 != NULL || n2 != NULL)
return 0;
/* whew... after all that, success at last! */
return 1;
}
See more files for this project here