+ "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 -
This commit is contained in:
Jonas Maebe 2011-08-20 08:34:57 +00:00
parent c22394a9f4
commit f6ddabde85
12 changed files with 584 additions and 140 deletions

3
.gitattributes vendored
View File

@ -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

View File

@ -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^));

View File

@ -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

View File

@ -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'; resext : '';
resobjext : '.or'; 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;

View File

@ -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.

View File

@ -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

View File

@ -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
utils/fpcres/fpcjres.pas Normal file
View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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 ParseOutputFormat(aList : TStringList; var index : integer; const parname : string);virtual;
procedure ParseArchitecture(aList : TStringList; var index : integer; const parname : string); procedure ParseArchitecture(aList : TStringList; var index : integer; const parname : string);virtual;
procedure ParseSubArchitecture(aList : TStringList; var index : integer; const parname : string); 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;

View File

@ -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;