/* OSSP rc - Run-command processor ** Copyright (c) 2002 Ralf S. Engelschall ** Copyright (c) 2002 Cable & Wireless Deutschland GmbH ** Copyright (c) 2002 The OSSP Project ** ** This file is part of OSSP rc, a portable Run-command processor ** which can be found at http://www.ossp.org/pkg/lib/rc/ ** ** Permission to use, copy, modify, and distribute this software for ** any purpose with or without fee is hereby granted, provided that ** the above copyright notice and this permission notice appear in all ** copies. ** ** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR ** 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. ** ** rc_opt.c: Run-command processor ISO C source file */ #include #include #include #include "rc.h" #include "rc_opt.h" /*************************************** * optConstruct(rc_opt_t **) * * Construct an option * ***************************************/ rc_return_t optConstruct(rc_opt_t **ppOption) { assert(*ppOption == NULL); /* Error if constructed already */ *ppOption = malloc(sizeof(**ppOption)); /* Allocate an option instance */ if (!*ppOption) return(RC_THROW(RC_ERR_MEM)); (*ppOption)->szName = NULL; /* We don't know how much to */ (*ppOption)->szVal = NULL; /* allocate, so do it later */ return(RC_THROW(RC_OK)); } /*************************************** * optGetXXXX(rc_opt_t *, char **) * * Option accessors * ***************************************/ rc_return_t optGetname(rc_opt_t *pOption, char **pszName) { assert(pOption && pOption->szName); if (!(*pszName = strdup(pOption->szName))) /* Get name from option */ return(RC_THROW(RC_ERR_MEM)); else return(RC_THROW(RC_OK)); } rc_return_t optGetval(rc_opt_t *pOption, char **pszVal) { assert(pOption && pOption->szVal); if (!(*pszVal = strdup(pOption->szVal))) /* Get value from option */ return(RC_THROW(RC_ERR_MEM)); else return(RC_THROW(RC_OK)); } /*************************************** * optSetXXXX(rc_opt_t *, const char *) * * Option accessors * ***************************************/ rc_return_t optSetname(rc_opt_t *pOption, const char *cszName) { if (pOption->szName) /* Guard against leaks */ free(pOption->szName); /* if resetting name */ if (!(pOption->szName = strdup(cszName))) /* Set name of option */ return(RC_THROW(RC_ERR_MEM)); else return(RC_THROW(RC_OK)); } rc_return_t optSetval(rc_opt_t *pOption, const char *cszVal) { if (pOption->szVal) /* Guard against leaks */ free(pOption->szVal); /* if resetting value */ if (!(pOption->szVal = strdup(cszVal))) /* Set value of option */ return(RC_THROW(RC_ERR_MEM)); else return(RC_THROW(RC_OK)); } /*************************************** * optDestruct(rc_opt_t **) * * Destruct a command line option * ***************************************/ rc_return_t optDestruct(rc_opt_t **ppOption) { ex_t Except; assert(*ppOption); /* Error if not constructed */ ex_try { if ((*ppOption)->szName) /* Might not be mallocd yet */ free((*ppOption)->szName); if ((*ppOption)->szVal) /* Might not be mallocd yet */ free((*ppOption)->szVal); free(*ppOption); /* Deallocate option and */ *ppOption = NULL; /* clear its reference */ } ex_catch(Except) { rethrow; } return(RC_THROW(RC_OK)); }