home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d8xx
/
d812
/
ppmc.lha
/
PPMC
/
Source
/
PPMC1.2b_source.lha
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-27
|
29KB
|
1,000 lines
/*
----------------------
main.c
© 1992,1993 REELSOFT
----------------------
*/
#include <proto/asl.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/gadtools.h>
#include <proto/graphics.h>
#include <proto/icon.h>
#include <proto/intuition.h>
#include <proto/powerpacker.h>
#include <proto/reqtools.h>
#include <proto/utility.h>
#include <proto/wb.h>
#include <libraries/dos.h>
#include <libraries/ppbase.h>
#include <libraries/reqtools.h>
#include <dos/stdio.h>
#include <graphics/gfxmacros.h>
#include <intuition/gadgetclass.h>
#include <workbench/icon.h>
#include <workbench/startup.h>
#include <dos.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "protos.h"
#include "macros.h"
#include "debug.h"
#include "ppmc.h"
#include "main.h"
#include "locale.h"
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
VOID main (int argc, char *argv[])
{
switch (argc) {
case 0 : // started from the Workbench..
case 1 : // started from the CLI with no argument..
sup.cli = sup.font = sup.asl = pac.pass = FALSE ;
sup.verb = sup.fill = TRUE ;
sup.apen = 3 ;
if (NOT argc)
ReadWBArgs() ;
break ;
default : // started from CLI with one ore more arguments..
ReadCLIArgs() ;
break ;
}
Setup() ;
if (sup.cli)
CLIonly() ;
else
MainLoop() ;
Cleanup (RETURN_OK) ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
VOID ReadCLIArgs (VOID)
{
struct RDArgs *readargs ;
memset ((UBYTE *)rargs,0,sizeof(rargs)) ;
readargs = ReadArgs(TEMPLATE,rargs,NULL) ;
FreeArgs (readargs) ;
SetVBuf (Output(),NULL,BUF_NONE,-1) ;
if (rargs[8]) { // VER (show the PPMC version..)
Printf ("%s\n",&version[6]) ;
Cleanup (RETURN_OK) ;
}
sup.cli = TRUE ;
if (rargs[9]) { // HELP (show the help message and exit..)
Setup() ; // load locale.library..
Printf ( "\033[3m- EFF (%s):\n\t\033[0m1 = %s\n\t2 = %s\n\t3 = %s\n\t4 = %s\n\t5 = %s\n\033[3m- BUF (%s):\n\t\033[0m1 = %s\n\t2 = %s\n\t3 = %s\n\033[3m- DEC (%s):\n\t\033[0m1 = %s\n\t2 = %s\n\t3 = %s\n\t4 = %s\n\t5 = %s\n",
LOC(MSG_PARAMETERS_EFFICIENCY),
LOC(MSG_EFFICIENCY0_GAD),
LOC(MSG_EFFICIENCY1_GAD),
LOC(MSG_EFFICIENCY2_GAD),
LOC(MSG_EFFICIENCY3_GAD),
LOC(MSG_EFFICIENCY4_GAD),
LOC(MSG_PARAMETERS_SUBUFFER),
LOC(MSG_SUBUFFER0_GAD),
LOC(MSG_SUBUFFER1_GAD),
LOC(MSG_SUBUFFER2_GAD),
LOC(MSG_PARAMETERS_DECEFFECT),
LOC(MSG_DECEFFECT0_GAD),
LOC(MSG_DECEFFECT1_GAD),
LOC(MSG_DECEFFECT2_GAD),
LOC(MSG_DECEFFECT3_GAD),
LOC(MSG_DECEFFECT4_GAD) ) ;
Cleanup (RETURN_OK) ;
}
if (NOT readargs) {
PrintFault (IoErr(),"\033[32mPPMC\033[31m") ;
Cleanup (RETURN_FAIL) ;
}
strcpy (name.old,(UBYTE *)rargs[0]) ;
pac.eff = (UBYTE)rargs[2] ; // EFFICIENCY
pac.buf = (UBYTE)rargs[3] ; // BUFFER
pac.dec = (UBYTE)rargs[4] ; // DECRUNCHING
pac.pass = (BOOL) rargs[5] ; // ENCRYPT
sup.verb = NOT (BOOL)rargs[7] ; // QUIET
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
VOID ReadWBArgs (VOID)
{
struct Library *IconBase ;
struct DiskObject *dobj ;
if (WANAME && (IconBase = OpenLibrary (ICONNAME,37L))) {
if (dobj = GetDiskObject (_WBenchMsg->sm_ArgList->wa_Name)) {
char *s, **tt=dobj->do_ToolTypes ;
if (s = FindToolType(tt,"PUBSCREEN"))
sup.pubscreen = strdup(s) ;
if (s = FindToolType(tt,"LANGUAGE"))
sup.language = strdup(s) ;
if (s = FindToolType(tt,"ENCRYPT"))
pac.pass = MatchToolValue(s,"ON") ;
if (s = FindToolType(tt,"ASL"))
sup.asl = MatchToolValue(s,"ON") ;
if (s = FindToolType(tt,"VERBOSE"))
sup.verb = MatchToolValue(s,"ON") ;
if (s = FindToolType(tt,"PATTERN"))
sup.fill = MatchToolValue(s,"ON") ;
if (s = FindToolType(tt,"COLOR"))
sup.apen = (UBYTE)atoi(s) ;
pac.eff = (UBYTE)atoi(FindToolType(tt,"EFFICIENCY")) ;
pac.buf = (UBYTE)atoi(FindToolType(tt,"BUFFER")) ;
pac.dec = (UBYTE)atoi(FindToolType(tt,"DECRUNCHING")) ;
FreeDiskObject (dobj) ;
}
CloseLibrary (IconBase) ;
}
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
VOID CLIonly (VOID)
{
Printf ("\033[7m\033[42m The Powerpacker Mini Clone v1.2b \033[0m\033[33m\n Copyright (c) 1992,1993 REELSOFT\033[31m\n") ;
switch (AnalyseFile()) {
case 1 : // unable to open the file !..
PrintFault (IoErr(),"\033[32mPPMC\033[31m") ;
return ;
case 2 : // file is empty !..
// Printf ("\033[32mPPMC:\033[31m %s %s !\n",FilePart(name.old),LOC(MSG_EMPTY_FILE)) ;
return ;
case 3 : // user doesn't want to pack an executable file..
return ;
case 4 : // file is powerpacked and encrypted..
crypted = TRUE ;
case 5 : // file is powerpacked..
Decrunch() ;
break ;
case 0 : // file seems OK..
if (NOT Crunch())
return ;
break ;
}
Save (FALSE) ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
VOID About (VOID) // `About PPMC' requester..
{
REQTITLE = (ULONG)LOC(MSG_ABOUT) ;
rtEZRequest ( "%s\n"COPYRIGHT"\n\n"
"%s "AUTHOR"\n%s\n\n"
TOOL1"\n\n"TOOL2"\n\n"TOOL3"\n\n%s",
LOC(MSG_OK_CONTINUE), NULL, rttags,
&version[6],
LOC(MSG_WRITTEN),
LOC(MSG_USING),
LOC(MSG_FREEWARE) ) ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
BOOL Load (BOOL choose) // selecting a file (Intuition interface only)..
{
if (choose) {
if (sup.asl) {
struct FileRequester *aslfreq = AllocAslRequest(ASL_FileRequest,NULL) ;
if (NOT aslfreq) {
REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_MEMORY)) ;
return FALSE ;
}
if (NOT AslRequestTags( aslfreq,
ASLFR_Window, Wnd,
ASLFR_SleepWindow, TRUE,
ASLFR_TitleText, LOC(MSG_TITLE_LOAD),
ASLFR_PositiveText, LOC(MSG_OK_LOAD),
ASLFR_RejectIcons, TRUE,
TAG_END ) || NOT strlen(aslfreq->fr_File))
{
FreeAslRequest (aslfreq) ;
return FALSE ;
}
strcpy (name.old,aslfreq->fr_Drawer) ;
AddPart (name.old,aslfreq->fr_File,256L) ;
FreeAslRequest (aslfreq) ;
}
else {
struct rtFileRequester *rtfreq = rtAllocRequestA(RT_FILEREQ,NULL) ;
UBYTE filename[108] ;
if (NOT rtfreq) {
REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_MEMORY)) ;
return FALSE ;
}
filename[0] = '\0' ;
if (NOT rtFileRequest ( rtfreq,
filename,
LOC(MSG_TITLE_LOAD),
RT_ReqPos, REQPOS_CENTERWIN,
RT_LockWindow, TRUE,
RT_ShareIDCMP, TRUE,
RTFI_OkText, LOC(MSG_OK_LOAD),
TAG_END ))
{
rtFreeRequest (rtfreq) ;
return FALSE ;
}
strcpy (name.old,rtfreq->Dir) ;
AddPart (name.old,filename,256L) ;
rtFreeRequest (rtfreq) ;
}
}
switch (AnalyseFile()) {
case 1 : // unable to open the file !..
{
UBYTE errmsg[81] ;
REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
Fault (IoErr(),NULL,errmsg,80) ;
rtEZRequest ("%s \"%s\" !\n\n%s",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_OPEN),FilePart(name.old),errmsg) ;
}
// return FALSE ;
case 2 : // file is empty !..
// REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
// rtEZRequest ("%s\n%s !",LOC(MSG_OK_ABORT),NULL,rttags,FilePart(name.old),LOC(MSG_EMPTY_FILE)) ;
// return FALSE ;
case 3 : // user doesn't want to pack an executable file..
return FALSE ;
case 4 : // file is powerpacked and encrypted..
case 5 : // file is powerpacked..
case 0 : // file seems OK..
break ;
}
SETGA (Gadgets[GDX_Status], Wnd,NULL,GTTX_Text,tocrunch?LOC(MSG_STATUS_START_PACK):LOC(MSG_STATUS_START_UNPACK),TAG_DONE) ;
SETGA (Gadgets[GDX_FileName],Wnd,NULL,GTTX_Text, FilePart(name.new),TAG_DONE) ;
SETGA (Gadgets[GDX_Gained], Wnd,NULL,GTNM_Number,0L, TAG_DONE) ;
SETGA (Gadgets[GDX_Packed], Wnd,NULL,GTNM_Number,0L, TAG_DONE) ;
SETGA (Gadgets[GDX_Save], Wnd,NULL,GA_Disabled,TRUE, TAG_DONE) ;
SETGA (Gadgets[GDX_Pack], Wnd,NULL,GA_Disabled,NOT tocrunch, TAG_DONE) ;
SETGA (Gadgets[GDX_UnPack], Wnd,NULL,GA_Disabled,tocrunch, TAG_DONE) ;
NMFLAG(NM_Project_Save) = NMFLAG(NM_Project_SaveAs) = NM_ITEMDISABLED ;
NMFLAG(NM_Crunching_Pack) = tocrunch?0:NM_ITEMDISABLED ;
NMFLAG(NM_Crunching_UnPack) = tocrunch?NM_ITEMDISABLED:0 ;
ClearMenus() ;
SetupMenus() ;
FillGauge (0,0) ;
FreeCrMem() ;
return TRUE ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
UBYTE exeofs[8] = { 0x00,0x00,0x03,0xf3,0x00,0x00,0x00,0x00 } ;
UBYTE AnalyseFile (VOID) // analyse the loaded file..
{
struct FileInfoBlock fib ;
BPTR flock ;
UBYTE offset[8] ;
if ((flock = Open (name.old,MODE_OLDFILE)) == NULL)
return (1) ;
if (NOT Read (flock,offset,8)) {
Close (flock) ;
return (2) ;
}
ExamineFH (flock,&fib) ;
Close (flock) ;
// is the loaded file executable ?..
if (NOT strncmp (offset,exeofs,8)) {
if (NOT sup.cli) {
REQTITLE = (ULONG)LOC(MSG_TITLE_WARNING) ;
if (NOT rtEZRequest ("\"%s\"\n%s",LOC(MSG_OK_OKCANCEL),NULL,rttags,FilePart(name.old),LOC(MSG_EXECUTABLE)))
return (3) ;
}
else if (NOT rargs[6]) {
Printf ("\033[32mPPMC:\033[31m %s %s\n",FilePart(name.old),LOC(MSG_CLI_EXECUTABLE)) ;
Flush (Output()) ;
{
UBYTE ret = getch() ;
if (ret != ToLower(LOC(MSG_CLI_YES)[0])
&& ret != ToUpper(LOC(MSG_CLI_YES)[0]))
return (3) ;
}
}
}
strcpy (name.new,name.old) ;
fsize = fib.fib_Size ;
if (sup.cli)
Printf ("\033[32mPPMC:\033[31m \033[1m%s\033[0m - %s (%ld %s)\n",LOC(MSG_CLI_ORIGINAL_FILE),FilePart(name.new),fib.fib_Size,LOC(MSG_CLI_BYTES)) ;
else
SETGA (Gadgets[GDX_Size],Wnd,NULL,GTNM_Number,fsize,TAG_DONE) ;
// is the file packed and encrypted ?..
if (NOT strncmp (offset,"PX20",4)) {
tocrunch = FALSE ;
return (4) ;
}
// so, maybe it's only packed ?..
if (NOT strncmp (offset,"PP20",4)) {
tocrunch = FALSE ;
return (5) ;
}
// file seems OK..
tocrunch = TRUE ;
return (0) ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
BOOL ChooseSaveFile (VOID)
{
if (sup.asl) {
struct FileRequester *aslfreq = AllocAslRequest(ASL_FileRequest,NULL) ;
UBYTE path[256] ;
if (NOT aslfreq) {
REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_MEMORY)) ;
return FALSE ;
}
stcgfp (path,name.new) ;
if (NOT AslRequestTags( aslfreq,
ASLFR_Window, Wnd,
ASLFR_SleepWindow, TRUE,
ASLFR_TitleText, LOC(MSG_TITLE_SAVE),
ASLFR_PositiveText, LOC(MSG_OK_SAVE),
ASLFR_InitialFile, FilePart(name.new),
ASLFR_InitialDrawer, path,
ASLFR_DoSaveMode, TRUE,
ASLFR_RejectIcons, TRUE,
TAG_END ) || NOT strlen(aslfreq->fr_File))
{
FreeAslRequest (aslfreq) ;
return FALSE ;
}
strcpy (name.new,aslfreq->fr_Drawer) ;
AddPart (name.new,aslfreq->fr_File,256L) ;
FreeAslRequest (aslfreq) ;
}
else {
struct rtFileRequester *rtfreq = rtAllocRequestA(RT_FILEREQ,NULL) ;
UBYTE filename[108] ;
if (NOT rtfreq) {
REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_MEMORY)) ;
return FALSE ;
}
strcpy (filename,FilePart(name.new)) ;
if (NOT rtFileRequest ( rtfreq,
filename,
LOC(MSG_TITLE_SAVE),
RT_ReqPos, REQPOS_CENTERWIN,
RT_LockWindow, TRUE,
RT_ShareIDCMP, TRUE,
RTFI_Flags, FREQF_SAVE,
RTFI_OkText, LOC(MSG_OK_SAVE),
TAG_END ) )
{
rtFreeRequest (rtfreq) ;
return FALSE ;
}
strcpy (name.new,rtfreq->Dir) ;
AddPart (name.new,filename,256L) ;
rtFreeRequest (rtfreq) ;
}
return TRUE ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
BOOL Save (BOOL choose) // selecting a file to Save to..
{
BPTR flock ;
// destination file name..
if (rargs[1])
strcpy (name.new,(UBYTE *)rargs[1]) ;
else {
if (tocrunch)
strcat (name.new,".pp") ;
else if (NOT strcmp(&name.new[strlen(name.new)-3],".pp"))
name.new[strlen(name.new)-3] = '\0' ;
}
if (choose && NOT ChooseSaveFile()) {
strcpy (name.new,name.old) ;
return FALSE ;
}
// checking if the destination file already exists..
if(NOT access (name.new,0)) {
if (sup.cli) {
Printf ("\n\033[32mPPMC:\033[31m %s %s",FilePart(name.new),LOC(MSG_CLI_FILE_EXISTS)) ;
Flush (Output()) ;
{
UBYTE ret = getch() ;
if (ret != ToLower(LOC(MSG_CLI_YES)[0])
&& ret != ToUpper(LOC(MSG_CLI_YES)[0]))
_CXBRK() ;
}
}
else {
REQTITLE = (ULONG)LOC(MSG_TITLE_WARNING) ;
switch (rtEZRequest ("%s\n%s",LOC(MSG_OK_OVERWRITE),NULL,rttags,FilePart(name.new),LOC(MSG_FILE_EXISTS))) {
case 1 :
if (ChooseSaveFile())
break ;
case 0 :
strcpy (name.new,name.old) ;
return FALSE ;
case 2 :
break ;
}
}
}
// creating the Save file..
flock = Open (name.new,MODE_NEWFILE) ;
if (NOT flock) {
if (sup.cli)
PrintFault (IoErr(),"\033[32mPPMC\033[31m") ;
else {
UBYTE errmsg[81] ;
Fault (IoErr(),NULL,errmsg,80) ;
REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
rtEZRequest ("%s \"%s\" !\n\n%s",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_OPEN),FilePart(name.new),errmsg) ;
strcpy (name.new,name.old) ;
}
return FALSE ;
}
// writing the Crunch Data Header if file is packed..
if (tocrunch && NOT ppWriteDataHeader (flock,(ULONG)pac.eff,crypted,checksum)) {
if (sup.cli)
Printf ("\n\033[32mPPMC:\033[31m %s %s\n",LOC(MSG_CLI_ERROR_SAVE),FilePart(name.new)) ;
else {
REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_HEADER)) ;
strcpy (name.new,name.old) ;
}
Close (flock) ;
return FALSE ;
}
// writing the Packed/UnPacked file..
if (Write (flock,cdata,clen) != clen) {
if (sup.cli)
Printf ("\n\033[32mPPMC:\033[31m %s %s\n",LOC(MSG_CLI_ERROR_SAVE),FilePart(name.new)) ;
else {
REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_SAVE)) ;
}
Close (flock) ;
return FALSE ;
}
Close (flock) ;
if (sup.cli)
Printf ("\n\033[32mPPMC:\033[31m \033[1m%s\033[0m - %s (%ld %s)\n",tocrunch?LOC(MSG_CLI_PACKED_FILE):LOC(MSG_CLI_UNPACKED_FILE),FilePart(name.new),tocrunch?clen+8L:csize,LOC(MSG_CLI_BYTES)) ;
else {
SETGA (Gadgets[GDX_Status], Wnd, NULL, GTTX_Text, LOC(MSG_STATUS_SAVED), TAG_DONE) ;
SETGA (Gadgets[GDX_FileName], Wnd, NULL, GTTX_Text, FilePart(name.new), TAG_DONE) ;
SETGA (Gadgets[GDX_Save], Wnd, NULL, GA_Disabled, TRUE, TAG_DONE) ;
SETGA (Gadgets[tocrunch?GDX_Pack:GDX_UnPack], Wnd, NULL, GA_Disabled, TRUE, TAG_DONE) ;
NMFLAG(NM_Project_Save) = NMFLAG(NM_Project_SaveAs) = NM_ITEMDISABLED ;
NMFLAG(tocrunch?NM_Crunching_Pack:NM_Crunching_UnPack) = NM_ITEMDISABLED ;
ClearMenus() ;
SetupMenus() ;
FreeCrMem() ;
}
return TRUE ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
BOOL Crunch (VOID) // main crunch function..
{
WORD err ;
if (pac.pass) {
if (NOT EnterPassword())
return FALSE ;
checksum = ppCalcChecksum (password) ;
crypted = TRUE ;
}
else
crypted = FALSE ;
if (NOT sup.cli) {
SetPointer (Wnd,waitPointer,22L,15L,0L,0L) ;
SETGA (Gadgets[GDX_Status],Wnd,NULL,GTTX_Text,LOC(MSG_STATUS_LOADING),TAG_DONE) ;
SETGA (Gadgets[GDX_Save], Wnd,NULL,GA_Disabled,TRUE,TAG_DONE) ;
FillGauge (0,0) ;
FreeCrMem() ;
}
else if (sup.verb) {
Printf ("\033[32mPPMC:\033[31m %s...",LOC(MSG_CLI_LOADING_FILE)) ;
Flush (Output()) ;
}
// allocating the Crunching Informations..
crin = ppAllocCrunchInfo ((ULONG)pac.eff,(ULONG)pac.buf,sup.verb?CrStatus:NULL,NULL) ;
if (NOT crin) {
if (sup.cli)
Printf ("\n\033[32mPPMC:\033[31m %s\n",LOC(MSG_ERROR_MEMORY)) ;
else {
REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_MEMORY)) ;
crypted = FALSE ;
}
return (FALSE) ;
}
// loading the file to Pack..
err = ppLoadData (name.new,(ULONG)pac.dec,NULL,&cdata,&csize,FALSE) ;
if (err) {
// note: ppErrorMessage() is not localized !..
if (sup.cli)
Printf ("\n\033[32mPPMC:\033[31m %s\n",ppErrorMessage(err)) ;
else {
REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,ppErrorMessage(err)) ;
SETGA (Gadgets[GDX_Status], Wnd, NULL, GTTX_Text, LOC(MSG_STATUS_ANOTHER), TAG_DONE) ;
SETGA (Gadgets[GDX_FileName], Wnd, NULL, GTTX_Text, "", TAG_DONE) ;
SETGA (Gadgets[GDX_Size], Wnd, NULL, GTNM_Number, 0L, TAG_DONE) ;
crypted = FALSE ;
}
ppFreeCrunchInfo (crin) ;
return (FALSE) ;
}
else
frpack = TRUE ;
if (NOT sup.cli) {
SETGA (Gadgets[GDX_Status],Wnd,NULL,GTTX_Text,LOC(MSG_STATUS_PACKING),TAG_DONE) ;
SETGA (Gadgets[GDX_Abort], Wnd,NULL,GA_Disabled,FALSE,TAG_DONE) ;
SetAPen (WRP,sup.apen) ;
SetBPen (WRP,1) ;
}
// crunching..
clen = ppCrunchBuffer (crin,cdata,csize) ;
if (sup.cli) {
switch (clen) {
case PP_CRUNCHABORTED :
break ;
case PP_BUFFEROVERFLOW :
Printf ("\n\033[32mPPMC:\033[31m %s\n",LOC(MSG_ERROR_OVERFLOW)) ;
break ;
default :
if (pac.pass) // checking wether or not to crypt the file..
ppDecrypt (cdata,clen -4,ppCalcPasskey(password)) ;
Printf ("\r\033[32mPPMC:\033[31m 100%% %s , %02ld%% %s",LOC(MSG_PER_PACKED),100L-(clen*100L+800L)/csize,LOC(MSG_PER_GAINED)) ;
return TRUE ;
}
}
else {
SETGA (Gadgets[GDX_Abort],Wnd,NULL,GA_Disabled,TRUE,TAG_DONE) ;
switch (clen) {
case PP_CRUNCHABORTED :
SETGA (Gadgets[GDX_Size],Wnd,NULL,GTNM_Number,csize,TAG_DONE) ;
break ;
case PP_BUFFEROVERFLOW :
REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_OVERFLOW)) ;
break ;
default :
if (pac.pass) // checking wether or not to crypt the file..
ppDecrypt (cdata,clen-4,ppCalcPasskey(password)) ;
DisplayBeep (Scr) ;
SETGA (Gadgets[GDX_Status], Wnd, NULL, GTTX_Text, LOC(MSG_STATUS_PACKED), TAG_DONE) ;
SETGA (Gadgets[GDX_Size], Wnd, NULL, GTNM_Number, clen+8L, TAG_DONE) ;
SETGA (Gadgets[GDX_Gained], Wnd, NULL, GTNM_Number, 100L-(clen*100L+800L)/csize, TAG_DONE) ;
SETGA (Gadgets[GDX_Packed], Wnd, NULL, GTNM_Number, 100L, TAG_DONE) ;
SETGA (Gadgets[GDX_Save], Wnd, NULL, GA_Disabled, FALSE, TAG_DONE) ;
FillGauge (sup.apen,1) ;
NMFLAG(NM_Project_Save) = NMFLAG(NM_Project_SaveAs) = 0 ;
ClearMenus() ;
SetupMenus() ;
return TRUE ;
}
SETGA (Gadgets[GDX_Status],Wnd,NULL,GTTX_Text,LOC(MSG_STATUS_START_PACK),TAG_DONE) ;
FillGauge (0,0) ;
FreeCrMem() ;
crypted = FALSE ;
}
return (FALSE) ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
// this is the callback function called during the crunching..
BOOL __stdargs __saveds CrStatus (ULONG sofar, ULONG crunlen, ULONG totlen, APTR userdata)
{
struct IntuiMessage *imsg ;
if (sofar) {
REGISTER ULONG packed = (sofar*100L)/totlen,
gained = 100-(crunlen*100L)/sofar ;
if (sup.cli)
Printf ("\r\033[32mPPMC:\033[31m %02ld%% %s , %02ld%% %s ",packed,LOC(MSG_PER_PACKED),gained,LOC(MSG_PER_GAINED)) ;
else {
SETGA (Gadgets[GDX_Size], Wnd, NULL, GTNM_Number, crunlen, TAG_DONE) ;
SETGA (Gadgets[GDX_Gained], Wnd, NULL, GTNM_Number, gained, TAG_DONE) ;
SETGA (Gadgets[GDX_Packed], Wnd, NULL, GTNM_Number, packed, TAG_DONE) ;
RectFill (WRP,27,WBT+72,27+216*sofar/totlen,WBT+85) ;
}
}
if (sup.cli)
chkabort() ;
else if (imsg = GT_GetIMsg (Wnd->UserPort)) {
if ((imsg->Class == IDCMP_VANILLAKEY && imsg->Code == 0x1b) ||
(imsg->Class == IDCMP_GADGETUP && ((struct Gadget *)(imsg->IAddress))->GadgetID == GDX_Abort))
{
REQTITLE = (ULONG)LOC(MSG_TITLE_WARNING) ;
return (BOOL)(NOT rtEZRequest ("%s",LOC(MSG_OK_RESUME),NULL,rttags,LOC(MSG_CRUNCH_ABORTED))) ;
}
else
GT_ReplyIMsg (imsg) ;
}
return TRUE ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
BOOL Decrunch (VOID) // decrunch function..
{
WORD err ;
if (NOT sup.cli) {
SetPointer (Wnd,waitPointer,22L,15L,0L,0L) ;
SETGA (Gadgets[GDX_Status],Wnd,NULL,GTTX_Text,LOC(MSG_STATUS_UNPACKING),TAG_DONE) ;
}
else if (NOT crypted) {
Printf ("\033[32mPPMC:\033[31m%s",LOC(MSG_STATUS_UNPACKING)) ;
Flush (Output()) ;
}
err = ppLoadData (name.new,(ULONG)pac.dec,NULL,&cdata,&csize,AskPassword) ;
if (err) {
if (sup.cli)
_CXBRK() ;
else {
REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,ppErrorMessage(err)) ;
if (err != PP_PASSERR) {
SETGA (Gadgets[GDX_Status], Wnd,NULL,GTTX_Text, LOC(MSG_STATUS_ANOTHER),TAG_DONE) ;
SETGA (Gadgets[GDX_FileName],Wnd,NULL,GTTX_Text, "",TAG_DONE) ;
SETGA (Gadgets[GDX_Size], Wnd,NULL,GTNM_Number,0L,TAG_DONE) ;
}
return FALSE ;
}
}
else
frunpack = TRUE ;
if (NOT sup.cli) {
DisplayBeep (Scr) ;
SETGA (Gadgets[GDX_Status], Wnd, NULL, GTTX_Text, LOC(MSG_STATUS_UNPACKED), TAG_DONE) ;
SETGA (Gadgets[GDX_Size], Wnd, NULL, GTNM_Number, csize, TAG_DONE) ;
SETGA (Gadgets[GDX_Gained], Wnd, NULL, GTNM_Number, 100L-(100L*csize/fsize), TAG_DONE) ;
SETGA (Gadgets[GDX_Packed], Wnd, NULL, GTNM_Number, 100L, TAG_DONE) ;
SETGA (Gadgets[GDX_Save], Wnd, NULL, GA_Disabled, FALSE, TAG_DONE) ;
FillGauge (sup.apen,1) ;
NMFLAG(NM_Project_Save) = NMFLAG(NM_Project_SaveAs) = 0 ;
ClearMenus() ;
SetupMenus() ;
}
clen = csize ;
return TRUE ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
// custom password prompting functions..
BOOL EnterPassword (VOID)
{
char pass[17], verify[17],
l, n ;
BOOL again = TRUE ;
pass[0] = verify[0] = '\0' ;
FOREVER {
if (sup.cli) {
Printf ("\033[32mPPMC:\033[31m %s : ",again?LOC(MSG_ENTER_PASSWORD):LOC(MSG_REENTER_PASSWORD)) ;
Flush (Output()) ;
n = 0 ;
FOREVER {
l = n<16?getch():'\r' ;
if (l==0x1b||(l=='\r'&&!n))
_CXBRK() ;
if (l=='\r') {
if (again)
pass[n] = '\0' ;
else
verify[n] = '\0' ;
break ;
}
if (again)
pass[n++] = l ;
else
verify[n++] = l ;
Printf("\033[1m·\033[0m") ;
Flush (Output()) ;
}
WriteChar('\n') ;
}
else if (NOT rtGetString(again?pass:verify,16L,again?"PPMC":LOC(MSG_VERIFICATION),NULL,RTGS_Invisible,TRUE,RTGS_TextFmt,again?LOC(MSG_ENTER_PASSWORD):LOC(MSG_REENTER_PASSWORD),TAG_MORE,rttags))
return FALSE ;
if (NOT again) {
if (NOT strcmp(pass,verify)) {
strcpy (password,pass) ;
return TRUE ;
}
else if (NOT sup.cli)
DisplayBeep (Scr) ;
pass[0] = verify[0] = '\0' ;
}
again = NOT again ;
}
}
BOOL __stdargs __saveds AskPassword (UBYTE *password, ULONG checksum)
{
char pass[17] ;
UBYTE try,l,n ;
for (try=1 ; try<4 ; try++) {
if (sup.cli) {
Printf ("%s\033[32m[%ld]PPMC:\033[31m %s : ",(try>1?"\n":""),try,LOC(MSG_ENTER_PASSWORD)) ;
Flush (Output()) ;
n = 0 ;
FOREVER {
l = n<16?getch():'\r' ;
if (l==0x1b)
return FALSE ;
if (l=='\r') {
pass[n] = '\0' ;
break ;
}
pass[n++] = l ;
Printf("\033[1m·\033[0m") ;
Flush (Output()) ;
}
}
else {
pass[0] = '\0' ;
if (NOT rtGetString (pass,16L,"PPMC",NULL,RTGS_Invisible,TRUE,RTGS_TextFmt,LOC(MSG_ENTER_PASSWORD),TAG_MORE,rttags))
break ;
}
if (ppCalcChecksum(pass) == checksum) {
strcpy (password,pass) ;
if (sup.cli) {
Printf ("\n\033[32mPPMC:\033[31m%s",LOC(MSG_STATUS_UNPACKING)) ;
Flush (Output()) ;
}
return TRUE ;
}
}
return FALSE ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
VOID FillGauge (UBYTE apen, UBYTE bpen)
{
SetAPen (WRP,apen) ;
SetBPen (WRP,bpen) ;
RectFill (WRP,27,WBT+72,243,WBT+85) ;
gauge = (apen?FULL:EMPTY) ;
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
VOID FreeCrMem (VOID)
{
if (frpack||frunpack) {
FreeMem (cdata,csize) ;
if (frpack)
ppFreeCrunchInfo (crin) ;
frpack = frunpack = FALSE ;
}
}
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
VOID MainLoop (VOID) // intuition interface loop..
{
ULONG appwinsig = 1L << MsgPort->mp_SigBit,
winsig = 1L << Wnd->UserPort->mp_SigBit,
globalsig = ((AppWin?appwinsig:0)|winsig) ;
FOREVER {
if (Wait (globalsig)) {
if (MsgPort && appwinsig) {
struct AppMessage *amsg ;
while (amsg = (struct AppMessage *)GetMsg (MsgPort)) {
NameFromLock (amsg->am_ArgList->wa_Lock,name.old,256) ;
AddPart (name.old,amsg->am_ArgList->wa_Name,256L) ;
ReplyMsg ((struct Message *)amsg) ;
ActivateWindow (Wnd) ;
Load (FALSE) ;
}
}
if (winsig) {
struct IntuiMessage *imsg ;
struct Gadget *object ;
struct MenuItem *item ;
UWORD code ;
BOOL loop ;
while (imsg = GT_GetIMsg (Wnd->UserPort)) {
object = imsg->IAddress;
code = imsg->Code ;
loop = TRUE ;
switch (imsg->Class) {
case IDCMP_REFRESHWINDOW :
GT_BeginRefresh (Wnd) ;
Render() ;
if (sup.fill)
GT_RefreshWindow (Wnd,NULL) ;
GT_EndRefresh (Wnd,TRUE) ;
if (gauge == FULL)
FillGauge (sup.apen,1) ;
break ;
case IDCMP_GADGETUP :
switch (object->GadgetID) {
case GDX_About :
About() ;
break ;
case GDX_Load :
Load (TRUE) ;
break ;
case GDX_Save :
Save (TRUE) ;
break ;
case GDX_Pack :
Crunch() ;
ClearPointer (Wnd) ;
break ;
case GDX_UnPack :
Decrunch() ;
ClearPointer (Wnd) ;
break ;
case GDX_Encrypt :
pac.pass = NOT pac.pass ;
NMFLAG(NM_Parameters_Encrypt) = CHECKIT|MENUTOGGLE|(pac.pass?CHECKED:0) ;
ClearMenus() ;
SetupMenus() ;
break ;
case GDX_CrunEff :
pac.eff = (UBYTE)code ;
break ;
case GDX_SUBuffer :
pac.buf = (UBYTE)code ;
break ;
case GDX_DecrEff :
pac.dec = (UBYTE)code ;
break ;
}
break ;
case IDCMP_MENUPICK :
while (loop && code !=MENUNULL) {
item = ItemAddress (Menus,code) ;
switch (MENUNUM (code)) {
case 0 : // `Project' menu
switch (ITEMNUM (code)) {
case 0 : // About...
About() ;
break ;
case 2 : // Load...
Load (TRUE) ;
loop = FALSE ;
break ;
case 3 : // Save
case 4 : // Save As...
loop = NOT Save ((BOOL)(ITEMNUM(code)-3)) ;
break ;
case 6 : // Quit
return ;
}
break ;
case 1 : // `Parameters' menu
switch (ITEMNUM (code)) {
case 0 : // Efficiency
pac.eff = SUBNUM (code) ;
SETGA (Gadgets[GDX_CrunEff],Wnd,NULL,GTCY_Active,(UWORD)pac.eff,TAG_DONE) ;
break ;
case 1 : // Speedup Buffer
pac.buf = SUBNUM (code) ;
SETGA (Gadgets[GDX_SUBuffer],Wnd,NULL,GTCY_Active,(UWORD)pac.buf,TAG_DONE) ;
break ;
case 2 : // Decrunching Effect
pac.dec = SUBNUM (code) ;
SETGA (Gadgets[GDX_DecrEff],Wnd,NULL,GTCY_Active,(UWORD)pac.dec,TAG_DONE) ;
break ;
case 3 : // Encrypt File
pac.pass = NOT pac.pass ;
SETGA (Gadgets[GDX_Encrypt],Wnd,NULL,GTCB_Checked,pac.pass,TAG_DONE) ;
break ;
}
break ;
case 2 : // `Crunching' menu
ITEMNUM(code)?Decrunch():Crunch() ;
ClearPointer (Wnd) ;
loop = FALSE ;
break ;
}
code = item->NextSelect ;
}
break ;
case IDCMP_CLOSEWINDOW :
return ;
case IDCMP_VANILLAKEY :
if ((code==key.encrypt||code==key.encrypt+32)) {
pac.pass = NOT pac.pass ;
SETGA (Gadgets[GDX_Encrypt],Wnd,NULL,GTCB_Checked,pac.pass,TAG_DONE) ;
NMFLAG(NM_Parameters_Encrypt) = CHECKIT|MENUTOGGLE|(pac.pass?CHECKED:0) ;
ClearMenus() ;
SetupMenus() ;
}
else if ((code==key.pack||code==key.pack+32) && NOT NMFLAG(NM_Crunching_Pack)) {
Crunch() ;
ClearPointer (Wnd) ;
}
else if ((code==key.unpack||code==key.unpack+32) && NOT NMFLAG(NM_Crunching_UnPack)) {
Decrunch() ;
ClearPointer (Wnd) ;
}
else if ((code==key.save||code==key.save+32) && NOT NMFLAG(NM_Project_Save))
Save (TRUE) ;
break ;
}
GT_ReplyIMsg (imsg) ;
}
}
}
}
}
// ...