summaryrefslogtreecommitdiffstats
path: root/fastjar/jartool.c
diff options
context:
space:
mode:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2002-01-09 23:22:20 +0000
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2002-01-09 23:22:20 +0000
commit108cbb2a887bf0a30f17ccbf0d4e6ae6ac92ac69 (patch)
tree4ec2ce790b230d37a09abdcb0794c0003dd70c6b /fastjar/jartool.c
parentb93f38e1aa4cde7539445e2931f6ba3752228e56 (diff)
downloadppe42-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.c243
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;
+ }
+}
OpenPOWER on IntegriCloud