glibc/manual/examples/argp-ex4.c
Ulrich Drepper 714a562f0b Update.
<1997-06-12 21:22  Ulrich Drepper  <drepper@cygnus.com>

	* Makefile (libc-map): Define before including Makerules.
	* Makerules (lib%.so): Depend on $(lib%-map).
	(build-shlib): Adapt rule for above change.
	(libc.so): Depend on $(libc-map).
	* db/Makefile (libcdb-map): New definition.
	* elf/Makefile (libdl-map): New definition.
	* elf/dl-lookup.c: Don't use relative include path.
	(undefined_msg): New variable.  Use single string in all functions.
	(do_lookup): Correctly recognize default version.
	Return -2 if no version information is available.
	Stop processing hash entries when string was found.
	Don't bark about missing versioned symbol in file with original
	reference if it is a weak symbol.
	(_dl_lookup_symbol): Use undefined_msg.
	(_dl_lookup_versioned_symbol): Likewise.
	Give extra information if no verdef info is available.
	* elf/dl-version.c (file_needed): Remove first argument.  We must
	seek in the whole search list.
	(match_symbol): Correct check for available verdef info.
	(_dl_check_map_versions): Correct call of find_needed.
	* locale/Makefile (libBrokenLocale-map): New definition.
	* login/Makefile (libutil-map): New definition.
	* math/Makefile (libm-map): New definition.
	* md5-crypt/Makefile (libcrypt-map): New definition.
	* nis/Makefile (libnsl-map, libnss_compat-map, libnss_nis-map,
	libnss_nisplus-map): New definition.
	* nss/Makefile (libnss_files-map, libnss_db-map): New definitions.
	* resolv/Makefile (libresolv-map, libnss_dns-map): New definitions.
	* libc.map: New file.
	* db/libdb.map: New file.
	* elf/libdl.map: New file.
	* locale/libBrokenLocale.map: New file.
	* login/libutil.map: New file.
	* math/libm.map: New file.
	* md5-crypt/libcrypt.map: New file.
	* nis/libnss_compat.map: New file.
	* nis/libnsl.map: New file.
	* nis/libnss_nis.map: New file.
	* nis/libnss_nisplus.map: New file.
	* nss/libnss_files.map: New file.
	* nss/libnss_db.map: New file.
	* resolv/libnss_dns.map: New file.
	* resolv/libresolv.map: New file.

	* sysdeps/i386/dl-machine.h (elf_machine_rel): Don't do anything
	for R_386_NONE entries.

	* Makefile (manual/dir-add.info): New rule.

	* Makerules: Add vpath definition for .x files.

	* Makerules (distinfo): Make sure target directory exists.

	* argp/argp-help.c (argp_args_usage): Don't modify `fdoc' value
	since it is used to distinguish filtered strings from unmodifed
	strings.

	* elf/dl-lookup.c (do_lookup): Optimize STT_* recognition.
	* elf/dl-reloc.c: Fix typo.

	* inet/arpa/tftp.h (struct tftphdr): Change type of tu_block to
	`unsigned short'.

	* manual/Makefile (dir-add.texi): Also emit wrapper text for
	info/install-info.
	(distribute): Add dir-add.texi and dir-add.info.
	(mostlyclean): Add dir-add.info.
	(realclean): Add dir-add.texi.
	(install): Add entries in `dir' file using install-info.

	* manual/libc.texinfo: Add @dircategory and @direntry text.
	Reported by Miles Bader <miles@gnu.ai.mit.edu>.

	* manual/pattern.texi: Correct description of GLOB_MAGCHAR and
	GLOB_NOMAGIC.  Changes by Roland McGrath <roland@gnu.ai.mit.edu>.

	* nis/nis_addmember.c: Little optimizations.
	* nis/nis_call.c: Likewise.
	* nis/nis_creategroup.c: Likewise.
	* nis/nis_defaults.c: Likewise.
	* nis/nis_destroygroup.c: Likewise.
	* nis/nis_ismember.c: Likewise.
	* nis/nis_local_names.c: Likewise.
	* nis/nis_print_group_entry.c: Likewise.
	* nis/nis_verifygroup.c: Likewise.

	* posix/unistd.h: Fix comment for getcwd.

	* stdlib/Makefile (headers): Remove inttypes.h.  It's a system
	dependent header.
	* sysdeps/wordsize-32/Dist: New file.
	* sysdeps/wordsize-32/Makefile: New file.
	* sysdeps/wordsize-64/Dist: New file.
	* sysdeps/wordsize-64/Makefile: New file.

	* sunrpc/Makefile: Adopt comment for real situation.

	* sysdeps/i386/add_n.S: Add ASM_TYPE_DIRECTIVE and AS_SIZE_DIRECTIVE.
	* sysdeps/i386/addmul_1.s: Likewise.
	* sysdeps/i386/lshist.s: Likewise.
	* sysdeps/i386/rshift.s: Likewise.
	* sysdeps/i386/sub_n.s: Likewise.
	* sysdeps/i386/submul_1.s: Likewise.

	* sysdeps/unix/sysv/linux/i386/sysdep.h (SYSCALL_ERROR_HANDLER):
	Add .type and .size.

1997-06-12 13:32  Philip Blundell  <Philip.Blundell@pobox.com>

	* libc/sysdeps/unix/arm/brk.S: New file.
	* libc/sysdeps/unix/arm/sysdep.S: Likewise.
	* libc/sysdeps/unix/sysv/linux/arm/sysdep.S: Likewise.

1997-06-11 11:51  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>

	* nis/nss_nisplus/nisplus-spwd.c (_nss_nisplus_parse_spent):
	Check if we have shadow information.

1997-06-08 19:33  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>

	* nis/nis_getservlist.c (nis_getservlist): Use calloc instead of
	malloc, alloc memory for nis_server struct.
	* nis/nis_getservlist.c (nis_freeservlist): Give the memory for
	the nis_server struct free, too.

	* nis/nis_removemember (nis_removemember): Fix for loop.

1997-06-12 12:45  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/i386/fpu/__math.h (__M_SQRT2): Define here since we
	cannot rely on M_SQRT2 being defined.  (log1p): Use __M_SQRT2 not
	M_SQRT2.
	* math/math.h (_Mldbl): Define even if M_* constants are not
	defined.
	Reported by corsepiu@faw.uni-ulm.de.

1997-06-12 03:08  Philip Blundell  <Philip.Blundell@pobox.com>

	* nss/getXXbyYY_r.c (do_weak_alias): Remove extra parentheses.

1997-06-11 13:22  Ulrich Drepper  <drepper@cygnus.com>

	* misc/regexp.h (compile): Allow use of macro INIT for variable
	declaration.  Add documentation for INIT.
	Reported by Robert Bihlmeyer <robbe@orcus.priv.at>.

1997-06-11 10:47  Philip Blundell  <Philip.Blundell@pobox.com>

	* sysdeps/unix/sysv/linux/net/if_arp.h: Add two new hardware types.

1997-06-10 11:31  H.J. Lu  <hjl@gnu.ai.mit.edu>

	* sysdeps/powerpc/strlen.s: Use -0x101 instead of 0xfffffeff
	for a signed 16-bit value.

1997-06-07 07:54  H.J. Lu  <hjl@gnu.ai.mit.edu>

	* sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c
	(_dl_sysdep_read_whole_file): Deleted.

	* sysdeps/powerpc/fenvbits.h (__FE_ALL_INVALID): Changed
	to FE_ALL_INVALID.

	* sysdeps/powerpc/fraiseexcpt.c (__FE_INVALID_SOFTWARE):
	Changed to FE_INVALID_SOFTWARE.
	(__FPSCR_STICKY_BITS): Changed to FPSCR_STICKY_BITS.

	* sysdeps/libm-ieee754/s_fmin.c: Fix a typo.

1997-06-07 18:48  H.J. Lu  <hjl@gnu.ai.mit.edu>

	* shlib-versions (.*-.*-linux.*): Set libc to 6.

1997-06-08 15:35  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>

	* nis/nis_add.c (nis_add): Use nis_leaf_of_r instead of nis_name_of_r.

	* nis/nis_addmember.c (nis_addmember): Fix a lot of pointer errors.
	* nis/nis_clone.c: Likewise.
	* nis/nis_removemember.c (nis_removemember): Likewise.
	* nis/nis_table.c: Likewise.

	* nis/nss_nis/nis-hosts.c: Use addr, not p for inet_pton call.
	* nis/nss_nisplus/nisplus-hosts.c: Likewise.

	* nis/nss_nis/nis-netgrp.c (_nss_nis_setnetgrent): Check for
	group == NULL.

1997-06-08 21:21  Mark Kettenis  <kettenis@phys.uva.nl>

	* login/login.c, login/utmp_daemon.c, login/utmp_file.c,
	login/getutent_r.c, login/utmpname.c: Cleanup `#if _LIBC' and
	`#ifndef _LIBC' fragments.

	* login/programs/utmpd.c: Define DEFAULT_USER.
	(drop_priviliges): Use it.
	(main): Set locale and text domain.

	* login/programs/utmpd-private.h: Declare proc_utmp_eq.
	* login/programs/database.c (proc_utmp_eq): Removed.
	* login/programs/request.c (proc_utmp_eq): Made global.  Only use
	ut_id field if valid.

	* login/utmp_file.c (proc_utmp_eq): Restore patch made by Miles
	Bader that was lost when adding the daemon backend; Only use ut_id
	field if valid.

1997-06-05 23:10  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/unix/sysv/linux/Dist: Remove netatalk/atalk.h and
	netinet/icmp.h, add netatalk/at.h.
	* sysdeps/unix/sysv/linux/powerpc/Dist: Remove termios.h.
	* sysdeps/unix/sysv/linux/sparc/Dist: Remove start.c.

1997-06-04 19:22  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* stdlib/testsort.c (compare): Fix parameter types.

1997-06-04 19:05  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* md5-crypt/Makefile (distribute): Fix name of file.

1997-06-04 19:02  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* login/Makefile (utmpd-routines): Remove utmpd again, which is
	already added implicitly through $(others).

1997-06-05 13:43  Fila Kolodny  <fila@filapc.ibi.com>

	* sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add netipx/ipx.h.

1997-06-05 13:25  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* md5-crypt/md5-crypt.c: Add prototype for __md5_crypt.

1997-06-05 17:08  Ulrich Drepper  <drepper@cygnus.com>

	* string/argz-addsep.c: Correct weak alias.
	Reported by Ben Pfaff <pfaffben@pilot.msu.edu>.

	* locale/setlocale.c (setlocale): Free variable with locale path
	before returning.
	(setname): Don't test for _nl_current[category] being NULL before
	freeing.
	Reported by Ben Pfaff <pfaffben@pilot.msu.edu>.

1997-06-04 12:41  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* manual/intro.texi (XPG): Correct some typos.

	* manual/libc.texinfo (Program Arguments): Menu updated.
	* nis/nis_local_names.c (nis_local_host): Fix pointer errors.
1997-06-12 21:38:55 +00:00

145 lines
4.0 KiB
C

/* Argp example #4 -- a program with somewhat more complicated options */
#include <stdlib.h>
#include <error.h>
#include <argp.h>
const char *argp_program_version =
"argp-ex4 1.0";
const char *argp_program_bug_address =
"<bug-gnu-utils@@prep.ai.mit.edu>";
/* Program documentation. */
static char doc[] =
"Argp example #4 -- a program with somewhat more complicated\
options\
\vThis part of the documentation comes *after* the options;\
note that the text is automatically filled, but it's possible\
to force a line-break, e.g.\n<-- here.";
/* A description of the arguments we accept. */
static char args_doc[] = "ARG1 [STRING...]";
/* Keys for options without short-options. */
#define OPT_ABORT 1 /* --abort */
/* The options we understand. */
static struct argp_option options[] = {
{"verbose", 'v', 0, 0, "Produce verbose output" },
{"quiet", 'q', 0, 0, "Don't produce any output" },
{"silent", 's', 0, OPTION_ALIAS },
{"output", 'o', "FILE", 0,
"Output to FILE instead of standard output" },
{0,0,0,0, "The following options should be grouped together:" },
{"repeat", 'r', "COUNT", OPTION_ARG_OPTIONAL,
"Repeat the output COUNT (default 10) times"},
{"abort", OPT_ABORT, 0, 0, "Abort before showing any output"},
{ 0 }
};
/* Used by @code{main} to communicate with @code{parse_opt}. */
struct arguments
{
char *arg1; /* @var{arg1} */
char **strings; /* [@var{string}@dots{}] */
int silent, verbose, abort; /* @samp{-s}, @samp{-v}, @samp{--abort} */
char *output_file; /* @var{file} arg to @samp{--output} */
int repeat_count; /* @var{count} arg to @samp{--repeat} */
};
/* Parse a single option. */
static error_t
parse_opt (int key, char *arg, struct argp_state *state)
{
/* Get the @code{input} argument from @code{argp_parse}, which we
know is a pointer to our arguments structure. */
struct arguments *arguments = state->input;
switch (key)
{
case 'q': case 's':
arguments->silent = 1;
break;
case 'v':
arguments->verbose = 1;
break;
case 'o':
arguments->output_file = arg;
break;
case 'r':
arguments->repeat_count = arg ? atoi (arg) : 10;
break;
case OPT_ABORT:
arguments->abort = 1;
break;
case ARGP_KEY_NO_ARGS:
argp_usage (state);
case ARGP_KEY_ARG:
/* Here we know that @code{state->arg_num == 0}, since we
force argument parsing to end before any more arguments can
get here. */
arguments->arg1 = arg;
/* Now we consume all the rest of the arguments.
@code{state->next} is the index in @code{state->argv} of the
next argument to be parsed, which is the first @var{string}
we're interested in, so we can just use
@code{&state->argv[state->next]} as the value for
arguments->strings.
@emph{In addition}, by setting @code{state->next} to the end
of the arguments, we can force argp to stop parsing here and
return. */
arguments->strings = &state->argv[state->next];
state->next = state->argc;
break;
default:
return ARGP_ERR_UNKNOWN;
}
return 0;
}
/* Our argp parser. */
static struct argp argp = { options, parse_opt, args_doc, doc };
int main (int argc, char **argv)
{
int i, j;
struct arguments arguments;
/* Default values. */
arguments.silent = 0;
arguments.verbose = 0;
arguments.output_file = "-";
arguments.repeat_count = 1;
arguments.abort = 0;
/* Parse our arguments; every option seen by @code{parse_opt} will be
reflected in @code{arguments}. */
argp_parse (&argp, argc, argv, 0, 0, &arguments);
if (arguments.abort)
error (10, 0, "ABORTED");
for (i = 0; i < arguments.repeat_count; i++)
{
printf ("ARG1 = %s\n", arguments.arg1);
printf ("STRINGS = ");
for (j = 0; arguments.strings[j]; j++)
printf (j == 0 ? "%s" : ", %s", arguments.strings[j]);
printf ("\n");
printf ("OUTPUT_FILE = %s\nVERBOSE = %s\nSILENT = %s\n",
arguments.output_file,
arguments.verbose ? "yes" : "no",
arguments.silent ? "yes" : "no");
}
exit (0);
}