openenvutils/commandshell/shell/commands/find/src/options.c
changeset 0 2e3d3ce01487
child 1 0fdb7f6b0309
equal deleted inserted replaced
-1:000000000000 0:2e3d3ce01487
       
     1 /*	$NetBSD: options.c,v 1.26 2007/02/06 15:33:22 perry Exp $	*/
       
     2 
       
     3 /*-  © Portions copyright (c) 2007 Symbian Software Ltd.  All rights reserved.
       
     4  * Copyright (c) 1990, 1993, 1994
       
     5  *	The Regents of the University of California.  All rights reserved.
       
     6  *
       
     7  * This code is derived from software contributed to Berkeley by
       
     8  * Cimarron D. Taylor of the University of California, Berkeley.
       
     9  *
       
    10  * Redistribution and use in source and binary forms, with or without
       
    11  * modification, are permitted provided that the following conditions
       
    12  * are met:
       
    13  * 1. Redistributions of source code must retain the above copyright
       
    14  *    notice, this list of conditions and the following disclaimer.
       
    15  * 2. Redistributions in binary form must reproduce the above copyright
       
    16  *    notice, this list of conditions and the following disclaimer in the
       
    17  *    documentation and/or other materials provided with the distribution.
       
    18  * 3. Neither the name of the University nor the names of its contributors
       
    19  *    may be used to endorse or promote products derived from this software
       
    20  *    without specific prior written permission.
       
    21  *
       
    22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
       
    23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       
    24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
       
    25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
       
    26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
       
    27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
       
    28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
       
    29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
       
    30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
       
    31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
       
    32  * SUCH DAMAGE.
       
    33  */
       
    34 
       
    35 #include <sys/cdefs.h>
       
    36 #ifndef lint
       
    37 #if 0
       
    38 static char sccsid[] = "from: @(#)options.c	8.2 (Berkeley) 4/16/94";
       
    39 #else
       
    40 __RCSID("$NetBSD: options.c,v 1.26 2007/02/06 15:33:22 perry Exp $");
       
    41 #endif
       
    42 #endif /* not lint */
       
    43 
       
    44 #include <sys/types.h>
       
    45 #include <sys/stat.h>
       
    46 
       
    47 #include <err.h>
       
    48 #include "fts.h"
       
    49 #include <stdio.h>
       
    50 #include <stdlib.h>
       
    51 #include <string.h>
       
    52 
       
    53 #include "find.h"
       
    54 
       
    55 int typecompare(const void *, const void *);
       
    56 static OPTION *option(char *);
       
    57 
       
    58 /* NB: the following table must be sorted lexically. */
       
    59 static OPTION const options[] = {
       
    60 	{ "!",		N_NOT,		c_not,		0 },
       
    61 	{ "(",		N_OPENPAREN,	c_openparen,	0 },
       
    62 	{ ")",		N_CLOSEPAREN,	c_closeparen,	0 },
       
    63 	{ "-a",		N_AND,		c_null,		0 },
       
    64 	{ "-amin",	N_AMIN,		c_amin,		1 },
       
    65 	{ "-and",	N_AND,		c_null,		0 },
       
    66 	{ "-anewer",	N_ANEWER,	c_anewer,	1 },
       
    67 	{ "-atime",	N_ATIME,	c_atime,	1 },
       
    68 	{ "-cmin",	N_CMIN,		c_cmin,		1 },
       
    69 	{ "-cnewer",	N_CNEWER,	c_cnewer,	1 },
       
    70 	{ "-ctime",	N_CTIME,	c_ctime,	1 },
       
    71 	{ "-delete",	N_DELETE,	c_delete,	0 },
       
    72 	{ "-depth",	N_DEPTH,	c_depth,	0 },
       
    73 	{ "-empty",	N_EMPTY,	c_empty,	0 },
       
    74 	{ "-exec",	N_EXEC,		c_exec,		1 },
       
    75 //	{ "-execdir",	N_EXECDIR,	c_execdir,	1 },	
       
    76 	{ "-exit",	N_EXIT,		c_exit,		0 },
       
    77 	{ "-false",	N_FALSE,	c_false,	0 },
       
    78 	{ "-flags",	N_FLAGS,	c_flags,	1 },
       
    79 	{ "-follow",	N_FOLLOW,	c_follow,	0 },
       
    80 	{ "-fprint",	N_FPRINT,	c_fprint,	1 },	
       
    81 //	{ "-fstype",	N_FSTYPE,	c_fstype,	1 },	//NA
       
    82 //	{ "-group",	N_GROUP,	c_group,	1 },		//NA
       
    83 	{ "-iname",	N_INAME,	c_iname,	1 },
       
    84 //	{ "-inum",	N_INUM,		c_inum,		1 },		//NA
       
    85 //	{ "-iregex",	N_IREGEX,	c_iregex,	1 },		
       
    86 	{ "-links",	N_LINKS,	c_links,	1 },
       
    87 	{ "-ls",	N_LS,		c_ls,		0 },
       
    88 	{ "-maxdepth",	N_MAXDEPTH,	c_maxdepth,	1 },
       
    89 	{ "-mindepth",	N_MINDEPTH,	c_mindepth,	1 },
       
    90 	{ "-mmin",	N_MMIN,		c_mmin,		1 },
       
    91 	{ "-mtime",	N_MTIME,	c_mtime,	1 },
       
    92 	{ "-name",	N_NAME,		c_name,		1 },
       
    93 	{ "-newer",	N_NEWER,	c_newer,	1 },
       
    94 //	{ "-nogroup",	N_NOGROUP,	c_nogroup,	0 },    //NA
       
    95 //	{ "-nouser",	N_NOUSER,	c_nouser,	0 },	//NA
       
    96 	{ "-o",		N_OR,		c_or,		0 },		
       
    97 	{ "-ok",	N_OK,		c_exec,		1 },
       
    98 	{ "-or",	N_OR,		c_or,		0 },
       
    99 	{ "-path", 	N_PATH,		c_path,		1 },
       
   100 //	{ "-perm",	N_PERM,		c_perm,		1 },
       
   101 	{ "-print",	N_PRINT,	c_print,	0 },
       
   102 	{ "-print0",	N_PRINT0,	c_print0,	0 },
       
   103 	{ "-printx",	N_PRINTX,	c_printx,	0 },
       
   104 	{ "-prune",	N_PRUNE,	c_prune,	0 },
       
   105 //	{ "-regex",	N_REGEX,	c_regex,	1 },
       
   106 	{ "-rm",	N_DELETE,	c_delete,	0 },
       
   107 	{ "-size",	N_SIZE,		c_size,		1 },
       
   108 	{ "-type",	N_TYPE,		c_type,		1 },
       
   109 //	{ "-user",	N_USER,		c_user,		1 },	//NA
       
   110 	{ "-xdev",	N_XDEV,		c_xdev,		0 }		//NA
       
   111 };
       
   112 
       
   113 /*
       
   114  * find_create --
       
   115  *	create a node corresponding to a command line argument.
       
   116  *
       
   117  * TODO:
       
   118  *	add create/process function pointers to node, so we can skip
       
   119  *	this switch stuff.
       
   120  */
       
   121 PLAN *
       
   122 find_create(char ***argvp)
       
   123 {
       
   124 	OPTION *p;
       
   125 	PLAN *new;
       
   126 	char **argv;
       
   127 
       
   128 	argv = *argvp;
       
   129 
       
   130 	if ((p = option(*argv)) == NULL)
       
   131 	{
       
   132 		printf("Option not supported.\n");
       
   133 		printf("%s\n",*argv);
       
   134 		exit(1);
       
   135 	}
       
   136 	
       
   137 	++argv;
       
   138 	if (p->arg && !*argv){
       
   139 		printf("%s: requires additional arguments\n", *--argv);
       
   140 		exit(0);
       
   141 	}
       
   142 
       
   143 	new = (p->create)(&argv, p->token == N_OK);
       
   144 
       
   145 	*argvp = argv;
       
   146 	return (new);
       
   147 }
       
   148 
       
   149 static OPTION *
       
   150 option(char *name)
       
   151 {
       
   152 	OPTION tmp;
       
   153 
       
   154 	tmp.name = name;
       
   155 	return ((OPTION *)bsearch(&tmp, options,
       
   156 	    sizeof(options)/sizeof(OPTION), sizeof(OPTION), typecompare));
       
   157 }
       
   158 
       
   159 int
       
   160 typecompare(const void *a, const void *b)
       
   161 {
       
   162 
       
   163 	return (strcmp(((const OPTION *)a)->name, ((const OPTION *)b)->name));
       
   164 }