Xref: utzoo comp.lang.c:8970 comp.unix.wizards:7626 Path: utzoo!mnetor!uunet!lll-winken!lll-tis!ames!umd5!cvl!elsie!ado From: ado@elsie.UUCP (Arthur David Olson) Newsgroups: comp.lang.c,comp.unix.wizards Subject: Re: command line options Message-ID: <8039@elsie.UUCP> Date: 7 Apr 88 14:59:26 GMT References: <2414@zyx.UUCP> Organization: NIH-LEC, Bethesda, MD Lines: 68 Here are three things I want from a command line option handler. 1. I want all the information about a particular option to appear in one place. So instead of an interface where I set up a table such as > static Option desc[] = { > O_flg ('f', flag), > O_int ('i', number), > O_str ('s', string), > O_chr ('c', character), > O_dbl ('d', dbl), > O_directive ("remaining: 1-2"), > O_directive > ("usage: [-f] [-i nn] [-cC] [-d float] [-s string] src [dst]"), > O_end, > }; (see the referenced article), I want an interface where I set up a table such as static Option desc[] = { O_flg('f', flag), O_int('i', number, "nn"), O_str('s', string, "string"), O_chr('c', character, "C"), O_dbl('d', dbl, "float"), O_directive("remaining: 1-2", "src [dst]"), O_end, }; This helps ensure that usage messages match what the program actually does, and eases the business of conditionally compiling options into a program. 2. I want some uniform way of getting programs to output their usage messages. Here at elsie, the convention we use is that if a (locally written) program's only argument is "=", as in the command line zic = or zic -l = (for the benefit of csh/ksh aliasing fanatics) the program outputs its usage message. The particular convention used is unimportant to me; what counts is having a uniform way to ask for the usage message, and an easy way to achieve uniformity is to push the logic into the command line option handler. 3. I want to be able to find out if "--" was used on the command line. Pike's Position is that Programs that accept multiple filenames should do nothing if given no arguments. (The name and wording are mine; see page 186 of "The UNIX Programming Environment" for details.) This ensures that if you use a command such as cat `find * -type f -print` to concatenate all the files in a directory and its subdirectories, you won't get surprised when there are NO files in the directory and cat starts reading from its standard input. My preference is to provide a uniform way of telling programs that you want them to do nothing if there are no arguments; one way I see of doing this is to use the presence of "--" on the command line for that purpose. So, for example, you'd cat -- `find * -type f -print` to avoid having cat do anything if find didn't find any files. With such a mechanism in place, you can avoid having to write cat - when you want to use cat as a filter, and still avoid surprises when you want to give cat a (potentially empty) list of file names. -- ado@ncifcrf.gov ADO is a trademark of Ampex.