summaryrefslogtreecommitdiff
path: root/test/compression/optlist.c
diff options
context:
space:
mode:
authorGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2008-08-09 08:06:33 +0000
committerGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2008-08-09 08:06:33 +0000
commit285f5bec5bb03d4e825e5d866e94008088dd6155 (patch)
tree9df69ded9ed4f4049e0b3887fdd99fcdf3b1746f /test/compression/optlist.c
parenta83f0c1710cc5143dd885e84c94e14f7d3216f93 (diff)
Ajout nouveaux tests
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@708 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'test/compression/optlist.c')
-rw-r--r--test/compression/optlist.c228
1 files changed, 228 insertions, 0 deletions
diff --git a/test/compression/optlist.c b/test/compression/optlist.c
new file mode 100644
index 0000000..d1fc013
--- /dev/null
+++ b/test/compression/optlist.c
@@ -0,0 +1,228 @@
+/***************************************************************************
+* 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 <http://www.gnu.org/licenses/>.
+*
+***************************************************************************/
+
+/***************************************************************************
+* INCLUDED FILES
+***************************************************************************/
+#include "optlist.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/***************************************************************************
+* 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;
+}