2
0
Эх сурвалжийг харах

+ "raw" resource support for the JVM target. The "raw" means that no
resource compilation happens and that the standard FPC resource
helpers are not available. What happens is that all files specified
in {$r xxx} statements are packed together into an <appname>.jar
file, under the namespace "org.freepascal.rawresources". They
can be loaded using the java.lang.Class.getResource/getResourceAsStream()
api

git-svn-id: branches/jvmbackend@18776 -

Jonas Maebe 14 жил өмнө
parent
commit
f6ddabde85

+ 3 - 0
.gitattributes

@@ -12767,7 +12767,10 @@ utils/fpcmkcfg/fppkg.inc svneol=native#text/plain
 utils/fpcres/Makefile svneol=native#text/plain
 utils/fpcres/Makefile svneol=native#text/plain
 utils/fpcres/Makefile.fpc svneol=native#text/plain
 utils/fpcres/Makefile.fpc svneol=native#text/plain
 utils/fpcres/closablefilestream.pas svneol=native#text/plain
 utils/fpcres/closablefilestream.pas svneol=native#text/plain
+utils/fpcres/fpcjres.pas svneol=native#text/plain
 utils/fpcres/fpcres.pas svneol=native#text/plain
 utils/fpcres/fpcres.pas svneol=native#text/plain
+utils/fpcres/jarparamparser.pas svneol=native#text/plain
+utils/fpcres/jarsourcehandler.pas svneol=native#text/plain
 utils/fpcres/msghandler.pas svneol=native#text/plain
 utils/fpcres/msghandler.pas svneol=native#text/plain
 utils/fpcres/paramparser.pas svneol=native#text/plain
 utils/fpcres/paramparser.pas svneol=native#text/plain
 utils/fpcres/sourcehandler.pas svneol=native#text/plain
 utils/fpcres/sourcehandler.pas svneol=native#text/plain

+ 30 - 1
compiler/comprsrc.pas

@@ -63,6 +63,15 @@ type
       procedure EndCollect; override;
       procedure EndCollect; override;
    end;
    end;
 
 
+   TJVMRawResourceFile = class(TWinLikeResourceFile)
+   private
+   protected
+   public
+      function Compile(output: tresoutput; const OutName: ansistring) : boolean; override;
+      function IsCompiled(const fn : ansistring) : boolean;override;
+   end;
+
+
 procedure CompileResourceFiles;
 procedure CompileResourceFiles;
 procedure CollectResourceFiles;
 procedure CollectResourceFiles;
 
 
@@ -383,6 +392,25 @@ begin
 end;
 end;
 
 
 
 
+{****************************************************************************
+                              TJVMRawResourceFile
+****************************************************************************}
+
+function TJVMRawResourceFile.Compile(output: tresoutput; const OutName: ansistring): boolean;
+  begin
+    if output<>roOBJ then
+      internalerror(2011081703);
+    result:=inherited;
+  end;
+
+
+function TJVMRawResourceFile.IsCompiled(const fn: ansistring): boolean;
+  begin
+    internalerror(2011081704);
+    result:=true;
+  end;
+
+
 function CopyResFile(inf,outf : TCmdStr) : boolean;
 function CopyResFile(inf,outf : TCmdStr) : boolean;
 var
 var
   src,dst : TCCustomFileStream;
   src,dst : TCCustomFileStream;
@@ -418,7 +446,8 @@ var
 begin
 begin
   { Don't do anything for systems supporting resources without using resource
   { Don't do anything for systems supporting resources without using resource
     file classes (e.g. Mac OS). They process resources elsewhere. }
     file classes (e.g. Mac OS). They process resources elsewhere. }
-  if (target_info.res<>res_none) and (target_res.resourcefileclass=nil) then
+  if ((target_info.res<>res_none) and (target_res.resourcefileclass=nil)) or
+     (res_no_compile in target_res.resflags) then
     exit;
     exit;
 
 
   p:=ExtractFilePath(ExpandFileName(current_module.mainsource^));
   p:=ExtractFilePath(ExpandFileName(current_module.mainsource^));

+ 2 - 1
compiler/systems.inc

@@ -197,10 +197,11 @@
             ,res_m68k_palmos,res_m68k_mpw
             ,res_m68k_palmos,res_m68k_mpw
             ,res_powerpc_mpw,res_elf
             ,res_powerpc_mpw,res_elf
             ,res_win64_gorc, res_macho, res_ext
             ,res_win64_gorc, res_macho, res_ext
+            ,res_jvm_raw
        );
        );
 
 
        tresinfoflags = (res_external_file,res_arch_in_file_name
        tresinfoflags = (res_external_file,res_arch_in_file_name
-            ,res_single_file);
+            ,res_single_file,res_no_compile);
 
 
        tdbg = (dbg_none
        tdbg = (dbg_none
             ,dbg_stabs,dbg_dwarf2,dbg_dwarf3,dbg_dwarf4,dbg_jasmin
             ,dbg_stabs,dbg_dwarf2,dbg_dwarf3,dbg_dwarf4,dbg_jasmin

+ 15 - 4
compiler/systems/i_jvm.pas

@@ -27,9 +27,20 @@ unit i_jvm;
   interface
   interface
 
 
     uses
     uses
-       systems;
+       systems,rescmn;
 
 
     const
     const
+       res_jvmraw_info : tresinfo =
+           (
+             id     : res_jvm_raw;
+             resbin : 'fpcjres';
+             rescmd : '-o $OBJ $DBG';
+             rcbin  : '';
+             rccmd  : '';
+             resourcefileclass : nil;
+             resflags : [res_no_compile];
+           );
+
        { The 32 only means that code written for this target behaves
        { The 32 only means that code written for this target behaves
          semantically as if it were written for a 32 bit target (default
          semantically as if it were written for a 32 bit target (default
          integer evaluation width = 32 bit). It will work equally well on 32
          integer evaluation width = 32 bit). It will work equally well on 32
@@ -53,8 +64,8 @@ unit i_jvm;
             unitlibext   : '.ppl';
             unitlibext   : '.ppl';
             asmext       : '.j';
             asmext       : '.j';
             objext       : '.class';
             objext       : '.class';
-            resext       : '.res';
-            resobjext    : '.or';
+            resext       : '';
+            resobjext    : '.jar';
             sharedlibext : '.jar';
             sharedlibext : '.jar';
             staticlibext : '.jar';
             staticlibext : '.jar';
             staticlibprefix : '';
             staticlibprefix : '';
@@ -73,7 +84,7 @@ unit i_jvm;
             link         : nil;
             link         : nil;
             linkextern   : nil;
             linkextern   : nil;
             ar           : ar_none;
             ar           : ar_none;
-            res          : res_none;
+            res          : res_jvm_raw;
             dbg          : dbg_jasmin;
             dbg          : dbg_jasmin;
             script       : script_unix;
             script       : script_unix;
             endian       : endian_big;
             endian       : endian_big;

+ 2 - 0
compiler/systems/t_jvm.pas

@@ -98,4 +98,6 @@ initialization
   RegisterImport(system_jvm_java32,timportlibjvm);
   RegisterImport(system_jvm_java32,timportlibjvm);
   RegisterExport(system_jvm_java32,texportlibjvm);
   RegisterExport(system_jvm_java32,texportlibjvm);
   RegisterTarget(system_jvm_java32_info);
   RegisterTarget(system_jvm_java32_info);
+
+  RegisterRes(res_jvmraw_info,TJVMRawResourceFile);
 end.
 end.

+ 128 - 127
utils/fpcres/Makefile

@@ -293,382 +293,382 @@ FPCFPMAKE=$(FPC)
 endif
 endif
 endif
 endif
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-haiku)
 ifeq ($(FULL_TARGET),i386-haiku)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netware)
 ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
 ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wince)
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
 ifeq ($(FULL_TARGET),i386-embedded)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
 ifeq ($(FULL_TARGET),i386-symbian)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-nativent)
 ifeq ($(FULL_TARGET),i386-nativent)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-iphonesim)
 ifeq ($(FULL_TARGET),i386-iphonesim)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
 ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
 ifeq ($(FULL_TARGET),m68k-embedded)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 ifeq ($(FULL_TARGET),powerpc-amiga)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
 ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
 ifeq ($(FULL_TARGET),powerpc-embedded)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-wii)
 ifeq ($(FULL_TARGET),powerpc-wii)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
 ifeq ($(FULL_TARGET),sparc-embedded)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-solaris)
 ifeq ($(FULL_TARGET),x86_64-solaris)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
 ifeq ($(FULL_TARGET),x86_64-darwin)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 ifeq ($(FULL_TARGET),x86_64-embedded)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 ifeq ($(FULL_TARGET),arm-palmos)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),arm-darwin)
 ifeq ($(FULL_TARGET),arm-darwin)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),arm-wince)
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),arm-gba)
 ifeq ($(FULL_TARGET),arm-gba)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),arm-nds)
 ifeq ($(FULL_TARGET),arm-nds)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
 ifeq ($(FULL_TARGET),arm-embedded)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
 ifeq ($(FULL_TARGET),arm-symbian)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 ifeq ($(FULL_TARGET),powerpc64-darwin)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),avr-embedded)
 ifeq ($(FULL_TARGET),avr-embedded)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),armeb-linux)
 ifeq ($(FULL_TARGET),armeb-linux)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),armeb-embedded)
 ifeq ($(FULL_TARGET),armeb-embedded)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),mipsel-linux)
 ifeq ($(FULL_TARGET),mipsel-linux)
-override TARGET_PROGRAMS+=fpcres
+override TARGET_PROGRAMS+=fpcres fpcjres
 endif
 endif
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 ifeq ($(FULL_TARGET),i386-go32v2)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 ifeq ($(FULL_TARGET),i386-beos)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-haiku)
 ifeq ($(FULL_TARGET),i386-haiku)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 ifeq ($(FULL_TARGET),i386-qnx)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netware)
 ifeq ($(FULL_TARGET),i386-netware)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 ifeq ($(FULL_TARGET),i386-openbsd)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 ifeq ($(FULL_TARGET),i386-wdosx)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 ifeq ($(FULL_TARGET),i386-darwin)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 ifeq ($(FULL_TARGET),i386-emx)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
 ifeq ($(FULL_TARGET),i386-watcom)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wince)
 ifeq ($(FULL_TARGET),i386-wince)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
 ifeq ($(FULL_TARGET),i386-embedded)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
 ifeq ($(FULL_TARGET),i386-symbian)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-nativent)
 ifeq ($(FULL_TARGET),i386-nativent)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),i386-iphonesim)
 ifeq ($(FULL_TARGET),i386-iphonesim)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 ifeq ($(FULL_TARGET),m68k-amiga)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
 ifeq ($(FULL_TARGET),m68k-atari)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 ifeq ($(FULL_TARGET),m68k-palmos)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
 ifeq ($(FULL_TARGET),m68k-embedded)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 ifeq ($(FULL_TARGET),powerpc-amiga)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
 ifeq ($(FULL_TARGET),powerpc-macos)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
 ifeq ($(FULL_TARGET),powerpc-embedded)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-wii)
 ifeq ($(FULL_TARGET),powerpc-wii)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
 ifeq ($(FULL_TARGET),sparc-embedded)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-solaris)
 ifeq ($(FULL_TARGET),x86_64-solaris)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
 ifeq ($(FULL_TARGET),x86_64-darwin)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 ifeq ($(FULL_TARGET),x86_64-embedded)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 ifeq ($(FULL_TARGET),arm-palmos)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),arm-darwin)
 ifeq ($(FULL_TARGET),arm-darwin)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),arm-wince)
 ifeq ($(FULL_TARGET),arm-wince)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),arm-gba)
 ifeq ($(FULL_TARGET),arm-gba)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),arm-nds)
 ifeq ($(FULL_TARGET),arm-nds)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
 ifeq ($(FULL_TARGET),arm-embedded)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
 ifeq ($(FULL_TARGET),arm-symbian)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 ifeq ($(FULL_TARGET),powerpc64-darwin)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),avr-embedded)
 ifeq ($(FULL_TARGET),avr-embedded)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),armeb-linux)
 ifeq ($(FULL_TARGET),armeb-linux)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),armeb-embedded)
 ifeq ($(FULL_TARGET),armeb-embedded)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 ifeq ($(FULL_TARGET),mipsel-linux)
 ifeq ($(FULL_TARGET),mipsel-linux)
-override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target
+override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 endif
 endif
 override INSTALL_FPCPACKAGE=y
 override INSTALL_FPCPACKAGE=y
 ifdef REQUIRE_UNITSDIR
 ifdef REQUIRE_UNITSDIR
@@ -1446,7 +1446,7 @@ else
 TAROPT=vz
 TAROPT=vz
 TAREXT=.tar.gz
 TAREXT=.tar.gz
 endif
 endif
-override REQUIRE_PACKAGES=rtl rtl fcl-res
+override REQUIRE_PACKAGES=rtl rtl fcl-res paszlib
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_HASH=1
 REQUIRE_PACKAGES_HASH=1
@@ -2703,3 +2703,4 @@ include fpcmake.loc
 endif
 endif
 .NOTPARALLEL:
 .NOTPARALLEL:
 fpcres$(EXEEXT): target.pas msghandler.pas closablefilestream.pas paramparser.pas sourcehandler.pas fpcres.pas
 fpcres$(EXEEXT): target.pas msghandler.pas closablefilestream.pas paramparser.pas sourcehandler.pas fpcres.pas
+fpcjres$(EXEEXT): msghandler.pas closablefilestream.pas paramparser.pas sourcehandler.pas fpcjres.pas jarsourcehandler.pas jarparamparser.pas

+ 4 - 3
utils/fpcres/Makefile.fpc

@@ -3,13 +3,13 @@
 #
 #
 
 
 [target]
 [target]
-programs=fpcres
+programs=fpcres fpcjres
 
 
 [clean]
 [clean]
-units=closablefilestream msghandler paramparser sourcehandler target
+units=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser
 
 
 [require]
 [require]
-packages=rtl fcl-res
+packages=rtl fcl-res paszlib
 
 
 [install]
 [install]
 fpcpackage=y
 fpcpackage=y
@@ -20,3 +20,4 @@ fpcdir=../..
 [rules]
 [rules]
 .NOTPARALLEL:
 .NOTPARALLEL:
 fpcres$(EXEEXT): target.pas msghandler.pas closablefilestream.pas paramparser.pas sourcehandler.pas fpcres.pas
 fpcres$(EXEEXT): target.pas msghandler.pas closablefilestream.pas paramparser.pas sourcehandler.pas fpcres.pas
+fpcjres$(EXEEXT): msghandler.pas closablefilestream.pas paramparser.pas sourcehandler.pas fpcjres.pas jarsourcehandler.pas jarparamparser.pas

+ 279 - 0
utils/fpcres/fpcjres.pas

@@ -0,0 +1,279 @@
+{
+
+    FPCRes - Free Pascal Resource Converter
+    Part of the Free Pascal distribution
+    Copyright (C) 2008 by Giulio Bernardi
+    Copyright (C) 2011 by Jonas Maebe
+
+    See the file COPYING, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+}
+
+{
+  Java's internal resource file handling system is based on simply loading
+  files from withing the package name space. We reserve the namespace
+  org.freepascal.rawresources for this purpose.
+
+  This program creates a jar file (= zip file) containing all specified files.
+}
+
+program fpcjres;
+
+{$MODE OBJFPC} {$H+}
+
+uses
+  SysUtils, Classes, paramparser, msghandler, jarsourcehandler,
+  zipper
+  ;
+
+const
+  halt_no_err = 0;
+  halt_param_err = 1;
+  halt_read_err = 2;
+  halt_write_err = 3;
+
+  progname = 'fpcjres';
+  progversion = '1.0'; //to distinguish from the old fpcres
+
+  fpcversion = {$INCLUDE %FPCVERSION%};
+  host_arch = {$INCLUDE %FPCTARGETCPU%};
+  host_os = {$INCLUDE %FPCTARGETOS%};
+  build_date = {$INCLUDE %DATE%};
+
+
+var
+  params : TParameters = nil;
+  resources : TZipper = nil;
+  sourcefiles : TJarSourceFiles = nil;
+
+procedure ShowVersion;
+begin
+  writeln(progname+' - resource file converter, version '+progversion+' ['+build_date+'], FPC '+fpcversion);
+  writeln('Host platform: '+host_os+' - '+host_arch);
+  writeln('Copyright (c) 2008 by Giulio Bernardi.');
+  writeln('Copyright (c) 2011 by Jonas Maebe.');
+end;
+
+procedure ShowHelp;
+begin
+  ShowVersion;
+  writeln('Syntax: '+progname+' [options] <inputfile> [<inputfile>...] [-o <outputfile>]');
+  writeln;
+  writeln('Options:');
+  writeln('  --help, -h, -?       Show this screen.');
+  writeln('  --version, -V        Show program version.');
+  writeln('  --verbose, -v        Be verbose.');
+  writeln('  --input, -i <x>      Ignored for compatibility.');
+  writeln('  --output, -o <x>     Set the output file name.');
+  writeln('  @<file>              Read more options from file <file>');
+end;
+
+const
+  SOutputFileAlreadySet = 'Output file name already set.';
+  SUnknownParameter = 'Unknown parameter ''%s''';
+  SArgumentMissing = 'Argument missing for option ''%s''';
+  SUnknownObjFormat = 'Unknown file format ''%s''';
+  SUnknownMachine = 'Unknown architecture ''%s''';
+  SFormatArchMismatch = 'Architecture %s is not available for %s format';
+  SNoInputFiles = 'No input files';
+  SNoOutputFile = 'No output file name specified';
+  SCannotReadConfFile ='Can''t read config file ''%s''';
+  
+  SCantOpenFile = 'Can''t open file ''%s''';
+  SUnknownInputFormat = 'No known file format detected for file ''%s''';
+  
+  SCantCreateDirHier = 'Can''t create directory hierarchy ''%s''';
+  SCantCreateFile = 'Can''t create file ''%s''';
+
+function GetCurrentTimeMsec : longint;
+var h,m,s,ms : word;
+begin
+  DecodeTime(Time,h,m,s,ms);
+  Result:=h*3600*1000 + m*60*1000 + s*1000 + ms;
+end;
+
+procedure CheckInputFiles;
+begin
+  if params.InputFiles.Count=0 then
+  begin
+    Messages.DoError(SNoInputFiles);
+    halt(halt_param_err);
+  end;
+end;
+
+procedure CheckOutputFile;
+var tmp : string;
+begin
+  if params.OutputFile<>'' then exit;
+  if params.InputFiles.Count>1 then
+  begin
+    Messages.DoError(SNoOutputFile);
+    halt(halt_param_err);
+  end;
+  tmp:=ChangeFileExt(ExtractFileName(params.InputFiles[0]),
+    '.jar');
+  if lowercase(tmp)=lowercase(params.InputFiles[0]) then
+    tmp:=tmp+'.jar';
+  params.OutputFile:=tmp;
+end;
+
+procedure ParseParams;
+var msg : string;
+begin
+  Messages.DoVerbose('parsing command line parameters');
+  msg:='';
+  if ParamCount = 0 then
+  begin
+    ShowHelp;
+    halt(halt_no_err);
+  end;
+  params:=TParameters.Create;
+  try
+    params.Parse;
+  except
+    on e : EOutputFileAlreadySetException do msg:=SOutputFileAlreadySet;
+    on e : EUnknownParameterException do msg:=Format(SUnknownParameter,[e.Message]);
+    on e : EArgumentMissingException do msg:=Format(SArgumentMissing,[e.Message]);
+    on e : EUnknownObjFormatException do msg:=Format(SUnknownObjFormat,[e.Message]);
+    on e : EUnknownMachineException do msg:=Format(SUnknownMachine,[e.Message]);
+    on e : ECannotReadConfFile do msg:=Format(SCannotReadConfFile,[e.Message]);
+  end;
+  Messages.Verbose:=params.Verbose;
+  if msg<>'' then
+  begin
+    Messages.DoError(msg);
+    halt(halt_param_err);
+  end;
+  if params.Version then
+  begin
+    ShowVersion;
+    halt(halt_no_err);
+  end;
+  if params.Help then
+  begin
+    ShowHelp;
+    halt(halt_no_err);
+  end;
+
+  CheckInputFiles;
+  CheckOutputFile;
+
+  Messages.DoVerbose('finished parsing command line parameters');
+end;
+
+procedure LoadSourceFiles;
+var msg : string;
+begin
+  msg:='';
+  resources:=TZipper.Create;
+  sourcefiles:=TJarSourceFiles.Create;
+  sourcefiles.FileList.AddStrings(params.InputFiles);
+  try
+    sourcefiles.Load(resources);
+  except
+    on e : ECantOpenFileException do msg:=Format(SCantOpenFile,[e.Message]);
+    on e : EUnknownInputFormatException do msg:=Format(SUnknownInputFormat,[e.Message]);
+    on e : Exception do
+    begin
+      if e.Message='' then msg:=e.ClassName
+      else msg:=e.Message;
+    end;
+  end;
+  if msg<>'' then
+  begin
+    Messages.DoError(msg);
+    halt(halt_read_err);
+  end;
+end;
+
+
+procedure WriteOutputFile;
+var
+  msg : string;
+  outfile: THandle;
+  removedirlevel: longint;
+begin
+  { create the "resbasedir" hierarchy, since that directory has to exist for
+    TZipper to be able to add it. If it already exists, make sure we don't
+    remove it }
+  if DirectoryExists('org') then
+    if DirectoryExists('org'+DirectorySeparator+'freepascal') then
+      if DirectoryExists(resbasedir) then
+        removedirlevel:=0
+      else
+        removedirlevel:=1
+    else
+      removedirlevel:=2
+  else
+    removedirlevel:=3;
+  try
+    ForceDirectories(resbasedir);
+  except
+    Messages.DoError(Format(SCantCreateDirHier,[resbasedir]));
+    halt(halt_write_err);
+  end;
+  try
+    Messages.DoVerbose(Format('Trying to write output file %s...',[params.OutputFile]));
+    try
+      { will be overwritten by the tzipper }
+      outfile:=FileCreate(params.OutputFile,fmCreate or fmShareDenyWrite,438);
+      FileClose(outfile);
+    except
+      Messages.DoError(Format(SCantCreateFile,[params.OutputFile]));
+      halt(halt_write_err);
+    end;
+    try
+      Messages.DoVerbose(Format('Writing output file %s...',[params.OutputFile]));
+      resources.FileName:=params.OutputFile;
+      resources.ZipAllFiles;
+    except
+      on e : Exception do
+      begin
+        if e.Message='' then msg:=e.ClassName
+        else msg:=e.Message;
+        Messages.DoError(msg);
+        halt(halt_write_err);
+      end;
+    end;
+    Messages.DoVerbose(Format('Output file %s written',[params.OutputFile]));
+  finally
+    if removedirlevel>0 then
+      begin
+        if removedirlevel>1 then
+          begin
+            if removedirlevel>2 then
+              RemoveDir(resbasedir);
+            RemoveDir('org'+DirectorySeparator+'freepascal');
+          end;
+        RemoveDir('org');
+      end;
+  end;
+end;
+
+procedure Cleanup;
+begin
+  Messages.DoVerbose('Cleaning up');
+  if Resources<>nil then Resources.Free;
+  if SourceFiles<>nil then SourceFiles.Free;
+  if Params<>nil then Params.Free;
+end;
+
+var before, elapsed : longint;
+
+begin
+  try
+    before:=GetCurrentTimeMsec;
+    ParseParams;
+    LoadSourceFiles;
+    WriteOutputFile;
+    elapsed:=GetCurrentTimeMsec-before;
+    if elapsed<0 then elapsed:=24*3600*1000 + elapsed;
+    Messages.DoVerbose(Format('Time elapsed: %d.%d seconds',[elapsed div 1000,(elapsed mod 1000) div 10]));
+  finally
+    Cleanup;
+  end;
+end.

+ 38 - 0
utils/fpcres/jarparamparser.pas

@@ -0,0 +1,38 @@
+unit jarparamparser;
+
+{$mode objfpc}{$h+}
+
+interface
+
+uses
+  paramparser;
+
+type
+  TJarParameters = class(TParameters)
+    procedure ParseOutputFormat(aList : TStringList; var index : integer; const parname : string);override;
+    procedure ParseArchitecture(aList : TStringList; var index : integer; const parname : string);override;
+    procedure ParseSubArchitecture(aList : TStringList; var index : integer; const parname : string);override;
+  end;
+
+
+implementation
+
+
+{ TJarParameters }
+
+procedure TJarParameters.ParseOutputFormat(aList: TStringList; var index: integer; const parname: string);
+begin
+  raise EUnknownParameterException.Create(tmp);
+end;
+
+procedure TJarParameters.ParseArchitecture(aList: TStringList; var index: integer; const parname: string);
+begin
+  raise EUnknownParameterException.Create(tmp);
+end;
+
+procedure TJarParameters.ParseSubArchitecture(aList: TStringList; var index: integer; const parname: string);
+begin
+  raise EUnknownParameterException.Create(tmp);
+end;
+
+end.

+ 79 - 0
utils/fpcres/jarsourcehandler.pas

@@ -0,0 +1,79 @@
+{
+
+    FPCRes - Free Pascal Resource Converter
+    Part of the Free Pascal distribution
+    Copyright (C) 2008 by Giulio Bernardi
+
+    Source files handling
+
+    See the file COPYING, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+}
+
+unit jarsourcehandler;
+
+{$MODE OBJFPC} {$H+}
+
+interface
+
+uses
+  Classes, SysUtils, sourcehandler, zipper;
+
+const
+  resbasedir = 'org'+DirectorySeparator+'freepascal'+DirectorySeparator+'rawresources'+DirectorySeparator;
+
+type
+  ESourceFilesException = class(Exception);
+  ECantOpenFileException = class(ESourceFilesException);
+  EUnknownInputFormatException = class(ESourceFilesException);
+  
+type
+
+  { TSourceFiles }
+
+  TJarSourceFiles = class(TSourceFiles)
+  private
+  protected
+  public
+    procedure Load(aResources : TZipper);reintroduce;
+  end;
+  
+implementation
+
+uses msghandler, closablefilestream;
+
+{ TJarSourceFiles }
+
+procedure TJarSourceFiles.Load(aResources: TZipper);
+var aStream : TClosableFileStream;
+    i : integer;
+begin
+  if fFileList.Count<>0 then
+    begin
+      aResources.Entries.AddFileEntry('org/');
+      aResources.Entries.AddFileEntry('org/freepascal/');
+      aResources.Entries.AddFileEntry(resbasedir);
+    end;
+  try
+    for i:=0 to fFileList.Count-1 do
+    begin
+      Messages.DoVerbose(Format('Trying to open file %s...',[fFileList[i]]));
+      try
+        aStream:=TClosableFileStream.Create(fFileList[i],fmOpenRead or fmShareDenyWrite);
+      except
+        raise ECantOpenFileException.Create(fFileList[i]);
+      end;
+      astream.Free;
+      aResources.Entries.AddFileEntry(fFileList[i],resbasedir+fFileList[i]);
+    end;
+    Messages.DoVerbose(Format('%d resources read.',[aResources.Entries.Count]));
+  finally
+  end;
+end;
+
+end.
+

+ 3 - 3
utils/fpcres/paramparser.pas

@@ -48,9 +48,9 @@ type
 
 
     procedure ParseInputFiles(aList : TStringList; var index : integer; const parname : string);
     procedure ParseInputFiles(aList : TStringList; var index : integer; const parname : string);
     procedure ParseOutputFile(aList : TStringList; var index : integer; const parname : string);
     procedure ParseOutputFile(aList : TStringList; var index : integer; const parname : string);
-    procedure ParseOutputFormat(aList : TStringList; var index : integer; const parname : string);
-    procedure ParseArchitecture(aList : TStringList; var index : integer; const parname : string);
-    procedure ParseSubArchitecture(aList : TStringList; var index : integer; const parname : string);
+    procedure ParseOutputFormat(aList : TStringList; var index : integer; const parname : string);virtual;
+    procedure ParseArchitecture(aList : TStringList; var index : integer; const parname : string);virtual;
+    procedure ParseSubArchitecture(aList : TStringList; var index : integer; const parname : string);virtual;
     procedure ParseConfigFile(aList : TStringList; var index : integer; const parname : string);
     procedure ParseConfigFile(aList : TStringList; var index : integer; const parname : string);
     function DoOptionalArgument(aList : TStringList; const i : integer) : string;
     function DoOptionalArgument(aList : TStringList; const i : integer) : string;
     function DoMandatoryArgument(aList : TStringList; const i : integer) : string;
     function DoMandatoryArgument(aList : TStringList; const i : integer) : string;

+ 1 - 1
utils/fpcres/sourcehandler.pas

@@ -34,9 +34,9 @@ type
 
 
   TSourceFiles = class
   TSourceFiles = class
   private
   private
+  protected
     fFileList : TStringList;
     fFileList : TStringList;
     fStreamList : TFPList;
     fStreamList : TFPList;
-  protected
   public
   public
     constructor Create;
     constructor Create;
     destructor Destroy; override;
     destructor Destroy; override;