diff options
author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-01-09 23:22:20 +0000 |
---|---|---|
committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-01-09 23:22:20 +0000 |
commit | 108cbb2a887bf0a30f17ccbf0d4e6ae6ac92ac69 (patch) | |
tree | 4ec2ce790b230d37a09abdcb0794c0003dd70c6b /fastjar/jartool.c | |
parent | b93f38e1aa4cde7539445e2931f6ba3752228e56 (diff) | |
download | ppe42-gcc-108cbb2a887bf0a30f17ccbf0d4e6ae6ac92ac69.tar.gz ppe42-gcc-108cbb2a887bf0a30f17ccbf0d4e6ae6ac92ac69.zip |
For PR libgcj/5303:
* jargrep.h: Removed RCS keywords.
(GVERSION): Removed.
* configure, Makefile.in, config.h.in: Rebuilt.
* configure.in: Added AM_MAINTAINER_MODE.
Don't look for getopt.h. Use `fastjar' as package name.
* Makefile.am (INCLUDES): Look in ../include.
(LIBIBERTY): New macro.
(jar_LDADD): Use it.
(jar_DEPENDENCIES): Likewise.
(grepjar_LDADD): Likewise.
(grepjar_DEPENDENCIES): Likewise.
* jargrep.c: Removed RCS keywords. Always include getopt.h.
(LONG_OPT): New macro.
(OPT_HELP): Likewise.
(main): Use getopt_long. Let getopt print invalid argument
message. Handle --help. Use version().
(version): New function.
(optarg, optind): Don't declare.
(option_vec): New global.
(help): New function.
(Usage): Updated to GNU standards.
* jartool.c: Removed RCS keywords. Include getopt.h.
(LONG_OPT): New macro.
(OPT_HELP): Likewise.
(options): New global.
(help): New function.
(usage): Print a single line.
(version): New function.
(expand_options): New function.
(main): Use getopt_long and expand_options. Fail if `-u'
specified. Changed handling of -f, -m, -V options.
(OPTION_STRING): New macro.
(version_string): Removed.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@48697 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'fastjar/jartool.c')
-rw-r--r-- | fastjar/jartool.c | 243 |
1 files changed, 175 insertions, 68 deletions
diff --git a/fastjar/jartool.c b/fastjar/jartool.c index 25ce2abf9b1..dd71592e8b9 100644 --- a/fastjar/jartool.c +++ b/fastjar/jartool.c @@ -1,5 +1,6 @@ /* jartool.c - main functions for fastjar utility + Copyright (C) 2002 Free Software Foundation Copyright (C) 1999, 2000, 2001 Bryan Burns This program is free software; you can redistribute it and/or @@ -17,9 +18,22 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: jartool.c,v 1.9 2001/10/12 00:49:42 bryce Exp $ +/* + Revision 1.10 2002/01/03 04:57:56 rodrigc + 2001-01-02 Craig Rodrigues <rodrigc@gcc.gnu.org> + + PR bootstrap/5117 + * configure.in (AC_CHECK_HEADERS): Check for stdlib.h. + * Makefile.am: Move grepjar to bin_PROGRAMS. + * config.h.in: Regenerated. + * Makefile.in: Regenerated. + * aclocal.m4: Regenerated. + * jargrep.c: Eliminate some signed/unsigned and default + uninitialized warnings. Use HAVE_STDLIB_H instead of + STDC_HEADERS macro. + * jartool.c: Likewise. + * compress.c: Likewise. - $Log: jartool.c,v $ Revision 1.9 2001/10/12 00:49:42 bryce * jatool.c (extract_jar): Account for null termination when determining whether to expand "filename". @@ -217,6 +231,8 @@ #include <time.h> #endif +#include <getopt.h> + #include "jartool.h" #include "zipfile.h" #include "dostime.h" @@ -234,8 +250,6 @@ #endif -static char version_string[] = VERSION; - #ifndef errno extern int errno; #endif @@ -245,6 +259,8 @@ extern int errno; #endif void usage(const char*); +void help(const char *); +void version(void); void add_entry(struct zipentry *); void init_headers(void); @@ -258,6 +274,7 @@ int make_manifest(int, const char*); static void init_args(char **, int); static char *get_next_arg (void); static char *jt_strdup (char*); +static void expand_options (int *argcp, char ***argvp); /* global variables */ ub1 file_header[30]; @@ -281,19 +298,37 @@ zipentry *ziptail; /* tail of the linked list */ int number_of_entries; /* number of entries in the linked list */ +/* This is used to mark options with no short value. */ +#define LONG_OPT(Num) ((Num) + 128) + +#define OPT_HELP LONG_OPT (0) + +/* This holds all options except `-C', which is handled specially. */ +#define OPTION_STRING "-ctxuvVf:m:0ME@" + +static const struct option options[] = +{ + { "help", no_argument, NULL, OPT_HELP }, + { "version", no_argument, NULL, 'V' }, + { NULL, no_argument, NULL, 0 } +}; + int main(int argc, char **argv){ - char mfile[256]; + char *mfile = NULL; int action = ACTION_NONE; int manifest = TRUE; - int manifest_file = FALSE; - int file = FALSE; - int file_first = FALSE; + int opt; - int i, j; + int j; int jarfd = -1; + /* These are used to collect file names and `-C' options for the + second pass through the command line. */ + int new_argc; + char **new_argv; + do_compress = TRUE; verbose = FALSE; @@ -306,8 +341,18 @@ int main(int argc, char **argv){ j = strlen(argv[1]); - for(i = 0; i < j; i++){ - switch(argv[1][i]){ + new_argc = 0; + new_argv = (char **) malloc (argc * sizeof (char *)); + + expand_options (&argc, &argv); + while ((opt = getopt_long (argc, argv, OPTION_STRING, + options, NULL)) != -1) { + switch(opt){ + case 1: + /* File name or unparsed option, due to RETURN_IN_ORDER. In + particular `-C' is handled here and not elsewhere. */ + new_argv[new_argc++] = optarg; + break; case 'c': action = ACTION_CREATE; break; @@ -324,17 +369,13 @@ int main(int argc, char **argv){ verbose = TRUE; break; case 'V': - printf("%s\n", version_string); + version(); exit(0); case 'f': - file = TRUE; - if(!manifest_file) - file_first = TRUE; - else - file_first = FALSE; + jarfile = optarg; break; case 'm': - manifest_file = TRUE; + mfile = optarg; break; case '0': do_compress = FALSE; @@ -342,8 +383,11 @@ int main(int argc, char **argv){ case 'M': manifest = FALSE; break; - case '-': + + case OPT_HELP: + help(argv[0]); break; + /* The following options aren't supported by the original jar tool. */ case 'E': use_explicit_list_only = TRUE; @@ -352,16 +396,25 @@ int main(int argc, char **argv){ read_names_from_stdin = TRUE; break; default: - fprintf(stderr, "Illegal option: %c\n", argv[1][i]); usage(argv[0]); } } + /* We might have seen `--'. In this case we want to make sure that + all following options are handled as file names. */ + while (optind < argc) + new_argv[new_argc++] = argv[optind++]; + if(action == ACTION_NONE){ fprintf(stderr, "One of options -{ctxu} must be specified.\n"); usage(argv[0]); } + if(action == ACTION_UPDATE){ + fprintf(stderr, "%s: `-u' mode unimplemented.\n", argv[0]); + exit(1); + } + /* Verify unsupported combinations and warn of the use of non standard features */ if(verbose && use_explicit_list_only) @@ -374,32 +427,9 @@ int main(int argc, char **argv){ usage(argv[0]); } - i = 2; - - /* get the jarfile and manifest file (if any) */ - if(file && file_first){ - if(i >= argc) - usage(argv[0]); - - jarfile = jt_strdup (argv[i++]); - } - if(manifest_file){ - if(i >= argc) - usage(argv[0]); - - strncpy(mfile, argv[i++], 256); - } - - if(file && !file_first){ - if(i >= argc) - usage(argv[0]); - - jarfile = jt_strdup (argv[i++]); - } - /* create the jarfile */ if(action == ACTION_CREATE){ - if(file){ + if(jarfile){ jarfd = open(jarfile, O_CREAT | O_BINARY | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); @@ -425,7 +455,7 @@ int main(int argc, char **argv){ } } else if(action == ACTION_LIST || action == ACTION_EXTRACT){ - if(file){ + if(jarfile){ jarfd = open(jarfile, O_RDONLY | O_BINARY); if(jarfd < 0){ @@ -447,7 +477,7 @@ int main(int argc, char **argv){ const char *arg; init_headers(); - if((action == ACTION_UPDATE) && file) { + if((action == ACTION_UPDATE) && jarfile) { if((jarfd = open(jarfile, O_RDWR | O_BINARY)) < 0) { fprintf(stderr, "Error opening %s for reading!\n", jarfile); perror(jarfile); @@ -460,12 +490,12 @@ int main(int argc, char **argv){ /* Add the META-INF/ directory and the manifest */ - if(manifest && manifest_file) + if(manifest && mfile) make_manifest(jarfd, mfile); else if(manifest) make_manifest(jarfd, NULL); - init_args (argv, i); + init_args (new_argv, new_argc); /* now we add the files to the archive */ while ((arg = get_next_arg ())){ @@ -495,9 +525,9 @@ int main(int argc, char **argv){ fprintf(stderr, "Error closing jar archive!\n"); } } else if(action == ACTION_LIST){ - list_jar(jarfd, &argv[i], (argc - i)); + list_jar(jarfd, &new_argv[0], new_argc); } else if(action == ACTION_EXTRACT){ - extract_jar(jarfd, &argv[i], (argc - i)); + extract_jar(jarfd, &new_argv[0], new_argc); } exit(0); @@ -1830,26 +1860,47 @@ int consume(pb_file *pbf, int amt){ } void usage(const char *filename){ - fprintf(stderr, "\ + fprintf(stderr, "Try `%s --help' for more information.\n", filename); + exit (1); +} + +void version () +{ + printf("jar (%s) %s\n\n", PACKAGE, VERSION); + printf("Copyright 1999, 2000, 2001 Bryan Burns\n"); + printf("Copyright 2002 Free Software Foundation\n"); + printf("\ +This is free software; see the source for copying conditions. There is NO\n\ +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"); + exit (0); +} + +void help(const char *filename) +{ + printf("\ Usage: %s {ctxuV}[vfm0ME@] [jar-file] [manifest-file] [-C dir] files ...\n\ -Options\n\ - -c create new archive\n\ - -t list table of contents for archive\n\ - -x extract named (or all) files from archive\n\ +\n\ +Store many files together in a single `jar' file.\n\ +\n\ + -c create new archive\n\ + -t list table of contents for archive\n\ + -x extract named (or all) files from archive\n\ + -u update existing archive\n\ ", filename); - fprintf(stderr, "\ - -u update existing archive\n\ - -V display version information\n\ - -v generate verbose output on standard output\n\ - -f specify archive file name\n\ - -m include manifest information from specified manifest file\n\ - -0 store only; use no ZIP compression\n\ - -M Do not create a manifest file for the entries\n\ - -C change to the specified directory and include the following file\n\ - -E don't include the files found in a directory\n\ - -@ Read names from stdin\n\ + printf("\n\ + -@ read names from stdin\n\ + -0 store only; use no ZIP compression\n\ + -C DIR FILE change to the specified directory and include\n\ + the following file\n\ + -E don't include the files found in a directory\n\ + -f FILE specify archive file name\n\ + --help print this help, then exit\n\ + -m FILE include manifest information from specified manifest file\n\ + -M Do not create a manifest file for the entries\n\ + -v generate verbose output on standard output\n\ + -V, --version display version information\n\ "); - fprintf(stderr, "\ + printf("\n\ If any file is a directory then it is processed recursively.\n\ The manifest file name and the archive file name needs to be specified\n\ in the same order the 'm' and 'f' flags are specified.\n\ @@ -1861,7 +1912,7 @@ Example 2: use an existing manifest file 'mymanifest' and archive all the\n\ jar cvfm classes.jar mymanifest -C foo/ .\n\ "); - exit(1); + exit(0); } static char * @@ -1874,3 +1925,59 @@ jt_strdup(s) strcpy(result, s); return result; } + +/* Convert "tar-style" first argument to a form expected by getopt. + This idea and the code comes from GNU tar. This can allocate a new + argument vector. This might leak some memory, but we don't care. */ +static void +expand_options (int *argcp, char ***argvp) +{ + int argc = *argcp; + char **argv = *argvp; + + if (argc > 1 && argv[1][0] != '-') + { + char buf[3]; + char **new_argv; + int new_argc; + char *p; + char **in, **out; + + buf[0] = '-'; + buf[2] = '\0'; + + new_argc = argc - 1 + strlen (argv[1]); + new_argv = (char **) malloc (new_argc * sizeof (char *)); + in = argv; + out = new_argv; + + *out++ = *in++; + for (p = *in++; *p; ++p) + { + char *opt; + buf[1] = *p; + *out++ = jt_strdup (buf); + /* If the option takes an argument, move the next argument + to just after this option. */ + opt = strchr (OPTION_STRING, *p); + if (opt && opt[1] == ':') + { + if (in < argv + argc) + *out++ = *in++; + else + { + fprintf(stderr, "%s: option `%s' requires an argument.\n", + argv[0], buf); + usage(argv[0]); + } + } + } + + /* Copy remaining options. */ + while (in < argv + argc) + *out++ = *in++; + + *argcp = new_argc; + *argvp = new_argv; + } +} |