You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by dl...@apache.org on 2007/08/13 00:10:48 UTC

svn commit: r565172 - /harmony/enhanced/sandbox/bootjvm/bootJVM/jvm/src/jar.h

Author: dlydick
Date: Sun Aug 12 15:10:47 2007
New Revision: 565172

URL: http://svn.apache.org/viewvc?view=rev&rev=565172
Log:
Java archive file format.

Added:
    harmony/enhanced/sandbox/bootjvm/bootJVM/jvm/src/jar.h   (with props)

Added: harmony/enhanced/sandbox/bootjvm/bootJVM/jvm/src/jar.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/sandbox/bootjvm/bootJVM/jvm/src/jar.h?view=auto&rev=565172
==============================================================================
--- harmony/enhanced/sandbox/bootjvm/bootJVM/jvm/src/jar.h (added)
+++ harmony/enhanced/sandbox/bootjvm/bootJVM/jvm/src/jar.h Sun Aug 12 15:10:47 2007
@@ -0,0 +1,705 @@
+#ifndef _jar_h_defined_
+#define _jar_h_defined_
+
+/*!
+ * @file jar.h
+ *
+ * @brief Java archive utilities.
+ *
+ * The Java archiver creates, maintains, and extracts Java archive
+ * files.  This file format is a Java support utility for storing
+ * Java class files, properties files, and any arbitrary data used
+ * by Java programs.
+ *
+ * This file is used both by the JVM java archive extraction and
+ * by the JAR utility.  The contents are organized as an API library
+ * with function definitions and return codes.
+ *
+ * The overall structure of the JAR file looks something like this:
+ *
+ * @verbatim
+   ... data ...
+   directory
+   global trailer
+   EOF
+ * @endverbatim
+ *
+ * @section Control
+ *
+ * \$URL$
+ *
+ * \$Id$
+ *
+ * Copyright 2006 The Apache Software Foundation
+ * or its licensors, as applicable.
+ *
+ * Licensed under the Apache License, Version 2.0 ("the License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied.
+ *
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * @version $
+ *
+ * @date $
+ *
+ * @author $
+ *
+ * @section Reference
+ *
+ */
+
+ARCH_HEADER_COPYRIGHT_APACHE(jar, h,
+"$URL$",
+"$Id$");
+
+#include "jrtypes.h"
+
+/* Declare full 1-byte structure packing */
+#pragma pack(1)
+
+/*!
+ * @name Java archiver error code enumerations.
+ *
+ * These codes report the success or reason for failure of
+ * the @b jar_XXX() functions defined in
+ * @link jvm/src/jar.c jar.c@endlink.
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef enum
+{
+    JAR_OKAY             = 0, /**< JAR operation successful */
+    JAR_PARM             = 1, /**< API parameter error */
+    JAR_OPEN             = 2, /**< Error with @b open(2) on JAR file */
+    JAR_LSEEK            = 3, /**< Error with @b lseek(2) on JAR file */
+    JAR_READ             = 4, /**< Error with @b read(2) on JAR file */
+    JAR_TRAILER_NOT_FOUND= 4,/**< Global trailer not found in JAR file*/
+    JAR_BAD_TRAILER      = 6, /**< Global trailer truncated or corrupt*/
+  JAR_BAD_DIRECTORY_ENTRY= 7, /**< Directory entry corrupt */
+    JAR_BAD_MEMBER_ENTRY = 8, /**< Member file entry header corrupt */
+    JAR_MEMBER_NOT_FOUND = 9, /**< Member file not found in JAR file */
+    JAR_COMPRESSION_METHOD=10,/**< Compression method not supported */
+    JAR_UNCOMPRESSED_SIZE =11,/**< Compression method not supported */
+    JAR_FIELD_MISMATCH   = 12,/**< Critical field in directory do not
+                                     match same in member header */
+    JAR_INFLATEINIT      = 13,/**< ZLIB inflateInit() failed */
+    JAR_INFLATE          = 14,/**< ZLIB inflate() failed */
+    JAR_CRC32            = 15,/**< crc32 on extracted data failed */
+
+} jar_api_enum;
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @brief Maximum size of Java archive global file trailer
+ *
+ */
+#define JAR_MAX_TRAILER_SIZE 65535
+
+/*!
+ * @brief Maximum length of Java archive member file name.
+ *
+ */
+#define JAR_MAX_MEMBER_FILENAME_LENGTH 256
+
+/*!
+ * @name Compression methods used in JAR files.
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define JAR_COMPRESSION_METHOD_STORE 0   /**< No compression used */
+#define JAR_COMPRESSION_METHOD_DEFLATE Z_DEFLATED
+                                         /**< inflate/deflate method
+                                            from @b LIBZ (see zlib.h) */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @brief Length of typical file read operations in global trailer.
+ */
+#define JAR_READ_BLOCK_SIZE 1024
+
+/*!
+ * @name Global trailer signature bytes
+ *
+ * These are found together in sequence at the beginning
+ * of the global trailer and indicate the actual start
+ * position of the global trailer.
+ *
+ * @note Just for your edification, the first two bytes are the
+ * initials of the author of the compression algorithm used
+ * by 'libz', namely, Phil Katz.  (Nice signature, Phil!
+ * Thanks for your efforts and your skill.  I have appreciated
+ * your work since the mid-1980's when 'arc' and 'pkarc' came
+ * out! --DL)
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define JAR_TRAILER_SIGNATURE_BYTE1 0x50   /**< Letter @b 'P' */
+#define JAR_TRAILER_SIGNATURE_BYTE2 0x4b   /**< Letter @b 'K' */
+#define JAR_TRAILER_SIGNATURE_BYTE3 0x05
+#define JAR_TRAILER_SIGNATURE_BYTE4 0x06
+
+/*@} */ /* End of grouped definitions */
+
+/*!
+ * @brief Size of global trailer signature in bytes.
+ *
+ */
+#define JAR_NUM_TRAILER_SIGNATURE_BYTES 4
+
+
+/*!
+ * @brief Contents of global trailer of Java archive.
+ *
+ * @internal Notice that in this implementation, @e only a single volume
+ * is supported, even though the trailer contains fields that support
+ * multi-volume archives.  This is likely a relic of the days of
+ * ZIP files on diskettes.
+ *
+ *
+ */
+typedef struct
+{
+    rushort volume_number; /**< Volume number (only 1 vol supported) */
+
+    rushort volume_with_directory_start; /**< Volume holding start of
+                                              directory (only 1 volume
+                                              supported) */
+
+    rushort this_volume_directory_entries; /**< Number of entries in
+                                                this volume's directory
+                                                */
+
+    rushort total_directory_entries;     /**< Number of directory
+                                              entries in the whole
+                                              directory */
+
+    ruint   total_directory_size;        /**< Length of @b entire
+                                              directory in bytes
+                                              relative to starting
+                                              disk number */
+
+    ruint  directory_position;           /**< Position (offset) of
+                                              directory relative to
+                                              starting disk */
+
+    ruint   trailer_size;               /**< Length of global trailer
+                                             in bytes*/
+
+} jar_global_trailer;
+
+
+/*!
+ * @name Directory signature word
+ *
+ * These are found together in sequence at the beginning
+ * of the directory and indicate the actual start
+ * position of the directory.
+ *
+ * @note See note above on @link #JAR_TRAILER_SIGNATURE_BYTE1
+   JAR_TRAILER_SIGNATURE_BYTEx@endlink on contents of these bytes.
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define JAR_DIRECTORY_SIGNATURE_BYTE1 0x50   /**< Letter @b 'P' */
+#define JAR_DIRECTORY_SIGNATURE_BYTE2 0x4b   /**< Letter @b 'K' */
+#define JAR_DIRECTORY_SIGNATURE_BYTE3 0x01
+#define JAR_DIRECTORY_SIGNATURE_BYTE4 0x02
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @brief Size of directory signature in bytes.
+ *
+ */
+#define JAR_NUM_DIRECTORY_SIGNATURE_BYTES 4
+
+
+/*!
+ * @brief Time stamp in generic form, not platform-specific.
+ *
+ * This structure is reminiscent of <b><code>(struct tm)</code></b>
+ * in @b <time.h> in the naming of the members.
+ *
+ */
+typedef struct
+{
+    ruint  tm_sec;     /**< Seconds after the minute, 0-59 */
+
+    ruint  tm_min;     /**< Minutes after the hour, 0-59 */
+
+    ruint  tm_hour;    /**< Hours after midnight, 0-23 */
+
+    ruint  tm_mday;    /**< Day of the month, 1-31 */
+
+    ruint  tm_mon;     /**< Months since beginning of year, 0-11 */
+
+    ruint  tm_year;    /**< Years 1980-2044 (MS-DOS min/max year) */
+
+} tm_zip;
+
+
+/*!
+ * @brief Java archive file directory entry.
+ *
+ * @todo HARMONY-6-jvm-jar.h-1  Why does the reference implementation's
+ * structure declare all of these fields as (unsigned long)?  It also
+ * says that the places where it reads 2-byte fields are only used
+ * as 2-byte fields, so why have 4 bytes in its structure definition?
+ *
+ */
+typedef struct
+{
+    ruint  position;         /**< Position in ZIP file of
+                                        this directory entry */
+
+    rbyte   magic[JAR_NUM_DIRECTORY_SIGNATURE_BYTES];
+                             /**< Directory entry signature */
+
+    rushort version;         /**< ZIP version that created this entry */
+
+    rushort version_needed;  /**< ZIP version required to extract
+                                  this entry */
+
+    rushort flags;           /**< Status bits and flags */
+
+    rushort compression_method;/**< Compression method used in
+                                    creating the entry */
+
+    ruint   dos_date;        /**< Modification data in MS-DOS format */
+
+    ruint   crc32;           /**< CRC-32 of the entry */
+
+    ruint  compressed_size;  /**< Compressed data size in bytes */
+
+    ruint  uncompressed_size;/**< Uncompressed data size in bytes */
+
+    rushort size_member_filename;
+                             /**< Member file name length of entry
+                                  in bytes */
+
+    rushort size_member_extra;/**< Extra field length in bytes */
+
+    rushort size_member_comment;/**< Member comment length in bytes */
+
+    rushort disk_num_start; /**< Volume number of start of file (must
+                                 be zero in this implementation) */
+
+    rushort internal_fa;    /**< internal file attributes */
+
+    ruint   external_fa;    /**< external file attributes */
+
+    ruint   member_offset;  /**< Offset in bytes of where this member
+                                 is stored in archive */
+
+
+    rbyte member_filename[JAR_MAX_MEMBER_FILENAME_LENGTH + 1];
+                            /**< Name of member file, plus NUL byte */
+
+    rbyte notused1;         /**< Pad byte, member_filename is odd len*/
+
+
+    tm_zip  generic_date;   /**< Date in generic format as derived
+                                 from directory entry date itself in
+                                 @link #jar_directory_entry.dos_date 
+                                 jar_directory_fixed.dos_date@endlink */
+
+    ruint   extra_offset;   /**< Offset in bytes of where member's
+                                 extra field is stored in archive.  Only
+                                 meaningful when @b size_member_extra
+                                 is non-zero */
+
+    ruint   comment_offset; /**< Offset in bytes of where member's
+                                 comment field is stored in archive.
+                                 Only meaningful when
+                                 @b size_member_comment is non-zero */
+
+} jar_directory_entry;
+
+
+/*!
+ * @name Member signature word
+ *
+ * These are found together in sequence at the beginning
+ * of each member file's storage area and indicate the
+ * actual start position of each member entry.
+ *
+ * @note See note above on @link #JAR_TRAILER_SIGNATURE_BYTE1
+   JAR_TRAILER_SIGNATURE_BYTEx@endlink on contents of these bytes.
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define JAR_MEMBER_SIGNATURE_BYTE1 0x50   /**< Letter @b 'P' */
+#define JAR_MEMBER_SIGNATURE_BYTE2 0x4b   /**< Letter @b 'K' */
+#define JAR_MEMBER_SIGNATURE_BYTE3 0x03
+#define JAR_MEMBER_SIGNATURE_BYTE4 0x04
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @brief Size of directory signature in bytes.
+ *
+ */
+#define JAR_NUM_MEMBER_SIGNATURE_BYTES 4
+
+
+/*!
+ * @brief Java archive file member file entry.
+ *
+ * @todo HARMONY-6-jvm-jar.h-2  Need to study more closely the
+ * usage of the fields of this structure in the reference
+ * implementation.  In particular, the bitwise flags of both
+ * this and of the directory entry.  The reference implementation
+ * function <b><code>unzlocal_CheckCurrentFileCoherencyHeader</code></b>
+ * is probably the place to start.
+ *
+ */
+typedef struct
+{
+    rbyte   magic[JAR_NUM_DIRECTORY_SIGNATURE_BYTES];
+                             /**< Directory entry signature */
+
+    rushort version;         /**< ZIP version that created this entry */
+
+    rushort flags;           /**< Status bits and flags */
+
+#define MEMBER_ENTRY_FLAG_BIT3 0x0008 /**< Suppress comparison of
+                                  certain member fields with directory
+                                  entry equivalent, namely CRC,
+                                  compressed and uncompressed sizes.
+                                  When clear, perform comparison and
+                                  report error if mismatch found. */
+
+
+    rushort compression_method;/**< Compression method used in
+                                    creating the entry */
+
+    ruint   dos_date;        /**< Modification data in MS-DOS format */
+
+    ruint   crc32;           /**< CRC-32 of the entry */
+
+    ruint  compressed_size;  /**< Compressed data size in bytes */
+
+    ruint  uncompressed_size;/**< Uncompressed data size in bytes */
+
+    rushort size_member_filename;
+                             /**< Member file name length of entry
+                                  in bytes */
+
+    rushort size_member_extra;/**< Extra field length in bytes */
+
+    rbyte member_filename[JAR_MAX_MEMBER_FILENAME_LENGTH + 1];
+                            /**< Name of member file, plus NUL byte */
+
+    rbyte notused1;         /**< Pad byte, member_filename is odd len*/
+
+    ruint   extra_offset;   /**< Offset in bytes of where member's
+                                 extra field is stored in archive.  Only
+                                 meaningful when @b size_member_extra
+                                 is non-zero */
+
+} jar_member_entry;
+
+
+/*!
+ * @brief State of open JAR file.
+ *
+ */
+typedef struct
+{
+    const rchar *jar_filename;
+                       /**< Name of Java archive file */
+
+    ruint  archive_length; /**< Length in bytes of Jave archive file */
+
+    const rchar *member_filename;
+                       /**< Name of current archive member file */
+
+    ruint  trailer_position; /**< Position (offset) of global trailer */
+
+    jar_global_trailer trailer; /**< Global trailer at end of archive */
+
+    /*!
+     * @todo HARMONY-6-jvm-jar.h-3  This gap field needs to be
+     * studied for cases when it is non-zero.  The reference
+     * implementation says, "(>0 for sfx)", whatever that means.
+     * It is calculated only once, when the JAR trailer has been
+     * parsed and is always calculated as,
+     *
+     *       <b><code>trailer_position -
+                      trailer.directory_position -
+                      trailer.total_directory_size</code></b>
+     */
+    ruint  trailer_directory_gap; /**< Effectively number of bytes
+                                   *   between global trailer (at EOF)
+                                   *   and end of directory (which
+                                   *   @e should immediately precede it.
+                                   */
+
+    jar_directory_entry directory_entry;
+                                  /**< JAR file directory entry of
+                                       requested member file */
+
+    jar_member_entry member_entry; /**< JAR file member header of
+                                       requested member file */
+
+    rvoid *(* /* const */ heap_get_data)(rint, rboolean);
+                       /**< Name of heap allocator for data blocks */
+
+    rvoid  (* /* const */ heap_free_data)(rvoid *);
+                       /**< Name of heap de-allocator for data blocks */
+
+    rint fd;           /**< File descriptor of open JAR file.  If ever
+                            a presumed open file handle is set to
+                            @link #JAR_MEMBER_IMPOSSIBLE_OPEN_FD
+                            JAR_MEMBER_IMPOSSIBLE_OPEN_FD@endlink
+                            then an error occurred on a previous file
+                            operation and the file was closed.  (See
+                            @b jar_code and other fields for more
+                            information at this stage.) This same value
+                            is used to initialize the field before a
+                            file is open. */
+
+    ruint  seek_read;  /**< Read pointer for next @b read(2) operation*/
+
+    rchar *bfr;        /**< Generic buffer pointer for read/write */
+
+    jar_api_enum jar_code;
+                       /**< Diagnostic state upon failure of request, or
+                            @link #JAR_OKAY JAR_OKAY@endlink upon
+                            success */
+
+    rchar *jar_msg;    /**< Message returned from Java archive request,
+                            if any.  Set to @link #rnull rnull@endlink
+                            when there is no message. This is a fixed
+                            string and does not need to be freed once
+                            read.  */
+
+    rint zlib_code;    /**< Diagnostic state upon failure of ZLIB
+                            decompression request, or @b Z_STREAM_END
+                            upon success.  (This code is returned by the
+                            ZLIB <b><code>inflate()</code></b> function
+                            following successful decompression of the
+                            last or only segment of a compressed
+                            archive member file.) Meaningful when
+                           @link #jar_directory_entry.compression_method
+                          jar_directory_entry.compression_method@endlink
+                            is not @link #JAR_COMPRESSION_METHOD_STORE
+                            JAR_COMPRESSION_METHOD_STORE@endlink */
+
+    rchar *zlib_msg;   /**< Message returned from ZLIB decompression
+                            request, if any.  Simply copied out, never
+                            interpreted.  Set to
+                            @link #rnull rnull@endlink when there is
+                            no message or when the requested member was
+                            not compressed.  This @e appears to be a
+                            fixed string and does not need to be freed
+                            once read.  */
+} jar_state;
+
+
+/*!
+ * @name JAR informational return messages
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define JAR_MSG_OPEN               "cannot open archive file"
+#define JAR_MSG_END_SEEK           "cannot seek to end of archive file"
+#define JAR_MSG_COMPRESSION_METHOD "unsupported compression method"
+
+
+
+#define JAR_MSG_TRAILER_SEEK       "cannot seek global trailer"
+#define JAR_MSG_TRAILER_READ       "cannot read global trailer"
+#define JAR_MSG_TRAILER_TRUNCATED  "truncated global trailer"
+#define JAR_MSG_TRAILER_CONFLICT   "conflicting trailer data"
+#define JAR_MSG_TRAILER_MISSING    "global trailer not found"
+
+
+
+#define JAR_MSG_DIRENT_SEEK        "cannot seek directory entry"
+#define JAR_MSG_DIRENT_READ        "cannot read directory entry"
+#define JAR_MSG_DIRENT_CORRUPT     "directory entry corrupt"
+#define JAR_MSG_DIRENT_FILENAME_SIZE \
+                                "file name too large in directory entry"
+#define JAR_MSG_DIRENT_MULTIVOLUME "multi-volume archives not supported"
+#define JAR_MSG_DIRENT_READ_MEMBERNAME \
+                          "cannot read directory entry member file name"
+#define JAR_MSG_DIRENT_MEMBER_NOT_FOUND \
+                                   "member file not found"
+
+
+
+#define JAR_MSG_MEMBER_SEEK_HEADER "cannot seek member header"
+#define JAR_MSG_MEMBER_READ_HEADER "cannot read member header"
+#define JAR_MSG_MEMBER_CORRUPT     "member header corrupt"
+#define JAR_MSG_MEMBER_FILENAME_SIZE \
+                                  "file name too large in member header"
+#define JAR_MSG_MEMBER_DIRENT_MISMATCH "directory/member field mismatch"
+#define JAR_MSG_MEMBER_READ_MEMBERNAME \
+                          "cannot read member header file name"
+#define JAR_MSG_MEMBER_SEEK_DATA "cannot seek member data area"
+#define JAR_MSG_MEMBER_READ_DATA "cannot read member data area"
+#define JAR_MSG_MEMBER_CRC32     "CRC-32 error reading member"
+#define JAR_MSG_MEMBER_BAD_SIZE  "Uncompressed size too small for data"
+#define JAR_MSG_MEMBER_ZLIB_INITD "initializing ZLIB decompression"
+#define JAR_MSG_MEMBER_ZLIB_DECOMPRESS "performing ZLIB decompression"
+#define JAR_MSG_MEMBER_ZLIB_FINALD "finalizing ZLIB decompression"
+
+
+/*@} */ /* End of grouped definitions */
+
+
+
+
+/*!
+ * @brief Impossible @b lseek(2) position of member in JAR file.
+ *
+ */
+#define JAR_MEMBER_IMPOSSIBLE_LSEEK (-1)
+
+
+/*!
+ * @brief Impossible @b open(2) file handle.
+ *
+ * This value is used to initialize the
+ * @link #jar_state.fd jar_state.fd@endlink field and is stored there
+ * after the file is closed.
+ *
+ */
+#define JAR_MEMBER_IMPOSSIBLE_OPEN_FD (-1)
+
+
+
+/*!
+ * @brief Java archiver @b jar command line arguments, less
+ * implementation-specific options.
+ *
+ */
+typedef struct
+{
+    rboolean  jar_is_a_flag;     /**< jar -{anything} requested */
+
+    rboolean cannot_be_jar_option;/**< The first option may omit
+                                       prefixed '-' if desired */
+
+    /*!
+     * @name JAR command line switch parsing flags and counters
+     *
+     */
+
+    /*@{ */ /* Begin grouped definitions */
+
+    rboolean  jar_c_flag;        /**< jar -c requested */
+    rboolean  jar_t_flag;        /**< jar -t requested */
+    rboolean  jar_x_flag;        /**< jar -x requested */
+    rboolean  jar_u_flag;        /**< jar -u requested */
+
+    rboolean  jar_0_flag;        /**< jar -0 requested */
+    rboolean  jar_v_flag;        /**< jar -v requested */
+    rboolean  jar_M_flag;        /**< jar -M requested */
+    rboolean  jar_i_flag;        /**< jar -i requested */
+
+    /*@} */ /* End of grouped definitions */
+
+
+    rint      jar_next_position; /**< argv[idx] of next parm */
+
+    /*!
+     * @name Commands that take an argument
+     *
+     */
+
+    /*@{ */ /* Begin grouped definitions */
+
+    rboolean  jar_f_flag;        /**< jar -f requested */
+    rint      jar_f_position;    /**< argv[idx] of -f parm */
+    rchar    *jar_f_argv;        /**< *argv[idx] of -f parm */
+
+    rboolean  jar_m_flag;        /**< jar -c requested */
+    rint      jar_m_position;    /**< argv[idx] of -m parm */
+    rchar    *jar_m_argv;        /**< *argv[idx] of -m parm */
+
+    rboolean  jar_C_flag;        /**< jar -C requested */
+    rint      jar_C_position;    /**< argv[idx] of -C parm */
+    rchar    *jar_C_argv;        /**< *argv[idx] of -C parm */
+
+    /*@} */ /* End of grouped definitions */
+
+
+    /*!
+     * @name Remainder of arguments describe the requested JAR members
+     *
+     */
+
+    /*@{ */ /* Begin grouped definitions */
+
+    rboolean  jar_member_flag;     /**< jar members are requested */
+    rint      jar_member_position; /**< argv[idx] of first member */
+
+    /*@} */ /* End of grouped definitions */
+
+
+} jar_argv;
+
+
+/* Prototypes for selected functions in 'jarargv.c' */
+/* (Prototype for other jarargv_xxx() fns are in 'util.h') */
+extern jar_argv *jarargv_init(int        argc,
+                              char     **argv,
+                              char     **envp,
+                              rboolean  *argv_init_flag);
+
+
+/* Prototypes for functions in 'jarutil.c' */
+
+extern jar_api_enum  jarutil_locate_global_trailer(jar_state *jps);
+
+extern jar_api_enum  jarutil_locate_zip_directory(jar_state *jps);
+
+extern jar_state    *jarutil_read_current_member(jar_state *jps);
+
+extern jar_state    *jarutil_find_member(
+                      const rchar *jar_filename,
+                      const rchar *member_filename,
+                      rvoid *(*const heap_get_data) (rint, rboolean),
+                      rvoid (*const heap_free_data) (rvoid *));
+
+extern jar_state    *jarutil_read_member(
+                      const rchar *jar_filename,
+                      const rchar *member_filename,
+                      rvoid *(*const heap_get_data) (rint, rboolean),
+                      rvoid (*const heap_free_data) (rvoid *));
+
+/* Restore previous structure packing */
+#pragma pack()
+
+#endif /* _jar_h_defined_ */
+
+
+/* EOF */

Propchange: harmony/enhanced/sandbox/bootjvm/bootJVM/jvm/src/jar.h
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id