/***************************************************************************
* Command Line Option Parser
*
* File : optlist.c
* Purpose : Provide getopt style command line option parsing
* Author : Michael Dipperstein
* Date : August 1, 2007
*
****************************************************************************
* HISTORY
*
* $Id: optlist.c,v 1.1.1.2 2007/09/04 04:45:42 michael Exp $
* $Log: optlist.c,v $
* Revision 1.1.1.2 2007/09/04 04:45:42 michael
* Added FreeOptList.
*
* Revision 1.1.1.1 2007/08/07 05:01:48 michael
* Initial Release
*
****************************************************************************
*
* OptList: A command line option parsing library
* Copyright (C) 2007 by Michael Dipperstein (mdipper@alumni.engr.ucsb.edu)
*
* This file is part of the OptList library.
*
* OptList is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* OptList 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 Lesser
* General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
***************************************************************************/
/***************************************************************************
* INCLUDED FILES
***************************************************************************/
#include "optlist.h"
#include
#include
#include
/***************************************************************************
* TYPE DEFINITIONS
***************************************************************************/
/***************************************************************************
* CONSTANTS
***************************************************************************/
/***************************************************************************
* GLOBAL VARIABLES
***************************************************************************/
/***************************************************************************
* PROTOTYPES
***************************************************************************/
option_t *MakeOpt(const char option, char *const argument, const int index);
/***************************************************************************
* FUNCTIONS
***************************************************************************/
/****************************************************************************
* Function : GetOptList
* Description: This function is similar to the POSIX function getopt. All
* options and their corresponding arguments are returned in a
* linked list. This function should only be called once per
* an option list and it does not modify argv or argc.
* Parameters : argc - the number of command line arguments (including the
* name of the executable)
* argv - pointer to the open binary file to write encoded
* output
* options - getopt style option list. A NULL terminated
* string of single character options. Follow an
* option with a colon to indicate that it requires
* an argument.
* Effects : Creates a link list of command line options and their
* arguments.
* Returned : option_t type value where the option and arguement fields
* contain the next option symbol and its argument (if any).
* The argument field will be set to NULL if the option is
* specified as having no arguments or no arguments are found.
* The option field will be set to PO_NO_OPT if no more
* options are found.
*
* NOTE: The caller is responsible for freeing up the option list when it
* is no longer needed.
****************************************************************************/
option_t *GetOptList(const int argc, char *const argv[], char *const options)
{
int nextArg;
option_t *head, *tail;
int optIndex;
/* start with first argument and nothing found */
nextArg = 1;
head = NULL;
tail = NULL;
/* loop through all of the command line arguments */
while (nextArg < argc)
{
if ((strlen(argv[nextArg]) > 1) && ('-' == argv[nextArg][0]))
{
/* possible option */
optIndex = 0;
/* attempt to find a matching option */
while ((options[optIndex] != '\0') &&
(options[optIndex] != argv[nextArg][1]))
{
do
{
optIndex++;
}
while ((options[optIndex] != '\0') &&
(':' == options[optIndex]));
}
if (options[optIndex] == argv[nextArg][1])
{
/* we found the matching option */
if (NULL == head)
{
head = MakeOpt(options[optIndex], NULL, OL_NOINDEX);
tail = head;
}
else
{
tail->next = MakeOpt(options[optIndex], NULL, OL_NOINDEX);
tail = tail->next;
}
if (':' == options[optIndex + 1])
{
/* the option found should have a text arguement */
if (strlen(argv[nextArg]) > 2)
{
/* no space between argument and option */
tail->argument = &(argv[nextArg][2]);
tail->argIndex = nextArg;
}
else if (nextArg < argc)
{
/* there must be space between the argument option */
nextArg++;
tail->argument = argv[nextArg];
tail->argIndex = nextArg;
}
}
}
}
nextArg++;
}
return head;
}
/****************************************************************************
* Function : MakeOpt
* Description: This function uses malloc to allocate space for an option_t
* type structure and initailizes the structure with the
* values passed as a parameter.
* Parameters : option - this option character
* argument - pointer string containg the argument for option.
* Use NULL for no argument
* index - argv[index] contains argument us OL_NOINDEX for
* no argument
* Effects : A new option_t type variable is created on the heap.
* Returned : Pointer to newly created and initialized option_t type
* structure. NULL if space for structure can't be allocated.
****************************************************************************/
option_t *MakeOpt(const char option, char *const argument, const int index)
{
option_t *opt;
opt = malloc(sizeof(option_t));
if (opt != NULL)
{
opt->option = option;
opt->argument = argument;
opt->argIndex = index;
opt->next = NULL;
}
else
{
perror("Failed to Allocate option_t");
}
return opt;
}
/****************************************************************************
* Function : FreeOptList
* Description: This function will free all the elements in an option_t
* type linked list starting from the node passed as a
* parameter.
* Parameters : list - head of linked list to be freed
* Effects : All elements of the linked list pointed to by list will
* be freed and list will be set to NULL.
* Returned : None
****************************************************************************/
void FreeOptList(option_t *list)
{
option_t *head, *next;
head = list;
list = NULL;
while (head != NULL)
{
next = head->next;
free(head);
head = next;
}
return;
}