//
// aegis - project change supervisor
// Copyright (C) 2004-2008, 2012 Peter Miller
// Copyright (C) 2006 Walter Franzini
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see
// .
//
#include
#include
#include
#include
#include
attributes_ty *
attributes_list_find(attributes_list_ty *alp, const char *name)
{
if (!alp)
return 0;
for (size_t j = 0; j < alp->length; ++j)
{
attributes_ty *ap = alp->list[j];
assert(ap);
assert(ap->name);
assert(ap->value);
if (ap->name && ap->value && 0 == strcasecmp(ap->name->str_text, name))
return ap;
}
return 0;
}
bool
attributes_list_find_boolean(attributes_list_ty *alp, const char *name,
bool default_value)
{
attributes_ty *ap = attributes_list_find(alp, name);
if (!ap || !ap->value)
return default_value;
return string_to_bool(nstring(ap->value), default_value);
}
double
attributes_list_find_real(attributes_list_ty *alp, const char *name,
double default_value)
{
attributes_ty *ap = attributes_list_find(alp, name);
if (!ap || !ap->value)
return default_value;
char *ep = 0;
double result = strtod(ap->value->str_text, &ep);
if (ep == ap->value->str_text || *ep)
return default_value;
return result;
}
long
attributes_list_find_integer(attributes_list_ty *alp, const char *name,
long default_value)
{
attributes_ty *ap = attributes_list_find(alp, name);
if (!ap || !ap->value)
return default_value;
char *ep = 0;
long result = strtol(ap->value->str_text, &ep, 0);
if (ep == ap->value->str_text || *ep)
return default_value;
return result;
}
void
attributes_list_remove(attributes_list_ty *alp, const char *name)
{
attributes_ty *ap = attributes_list_extract(alp, name);
if (ap)
attributes_type.free(ap);
}
attributes_ty *
attributes_list_extract(attributes_list_ty *alp, const char *name)
{
if (!alp)
return 0;
for (size_t j = 0; j < alp->length; ++j)
{
attributes_ty *ap = alp->list[j];
assert(ap);
assert(ap->name);
if (ap->name && 0 == strcasecmp(ap->name->str_text, name))
{
for (size_t k = j + 1; k < alp->length; ++k)
alp->list[k - 1] = alp->list[k];
alp->length--;
return ap;
}
}
return 0;
}
void
attributes_list_insert(attributes_list_ty *alp, const char *name,
const char *value)
{
attributes_ty *ap = attributes_list_find(alp, name);
if (ap)
{
assert(ap->value);
if (ap->value)
str_free(ap->value);
ap->value = str_from_c(value);
return;
}
attributes_list_append(alp, name, value);
}
void
attributes_list_append(attributes_list_ty *alp, const char *name,
const char *value)
{
assert(alp);
if (!alp)
return;
meta_type *type;
attributes_ty **app =
(attributes_ty **)attributes_list_type.list_parse(alp, &type);
assert(type == &attributes_type);
assert(app);
attributes_ty *ap = (attributes_ty *)attributes_type.alloc();
ap->name = str_from_c(name);
ap->value = str_from_c(value);
*app = ap;
}
void
attributes_list_append_unique(attributes_list_ty *alp, const char *name,
string_ty *value)
{
assert(alp);
if (!alp)
return;
//
// If this exact name and value is already present,
// return without doing anything.
//
for (size_t j = 0; j < alp->length; ++j)
{
attributes_ty *ap = alp->list[j];
assert(ap);
assert(ap->name);
assert(ap->value);
if
(
0 == strcasecmp(ap->name->str_text, name)
&&
str_equal(ap->value, value)
)
{
return;
}
}
//
// Now that we know it is a unique pair,
// append it to the end of the list.
//
attributes_list_append(alp, name, value->str_text);
}
void
attributes_list_append_unique(attributes_list_ty *alp, const char *name,
const char *value)
{
assert(alp);
if (!alp)
return;
//
// If this exact name and value is already present,
// return without doing anything.
//
for (size_t j = 0; j < alp->length; ++j)
{
attributes_ty *ap = alp->list[j];
assert(ap);
assert(ap->name);
assert(ap->value);
if
(
0 == strcasecmp(ap->name->str_text, name)
&&
0 == strcmp(ap->value->str_text, value)
)
{
return;
}
}
//
// Now that we know it is a unique pair,
// append it to the end of the list.
//
attributes_list_append(alp, name, value);
}
// vim: set ts=8 sw=4 et :