📄 ppmd.cpp
字号:
/****************************************************************************
* This file is part of PPMd project *
* Written and distributed to public domain by Dmitry Shkarin 1997, *
* 1999-2001 *
* Contents: main routine *
* Comments: system & compiler dependent file *
****************************************************************************/
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "PPMd.h"
#define BACKSLASH '\\'
#define USAGE_STR "Usage: PPMd <e|d> [switches] <FileName[s] | Wildcard[s]>\n"
static const char* pFName;
static DWORD StartFilePosition;
static BOOL EncodeFlag;
static clock_t StartClock;
static struct ARC_INFO { // FileLength & CRC? Hmm, maybe in another times...
DWORD signature,attrib;
WORD info,FNLen,time,date;
} _PACK_ATTR ai;
#if defined(_WIN32_ENVIRONMENT_)
#include <conio.h>
inline void EnvSetNormAttr(const char* FName) { SetFileAttributes(FName,FILE_ATTRIBUTE_NORMAL); }
inline int EnvGetCh() { return getch(); }
inline void EnvGetCWD(char* CurDir) { GetCurrentDirectory(260,CurDir); }
inline void EnvSetDateTimeAttr(const char* WrkStr)
{
FILETIME ft;
DosDateTimeToFileTime(ai.date,ai.time,&ft);
HANDLE hndl=CreateFile(WrkStr,GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
SetFileTime(hndl,&ft,NULL,&ft); CloseHandle(hndl);
SetFileAttributes(WrkStr,ai.attrib);
}
struct ENV_FIND_RESULT: public WIN32_FIND_DATA {
const char* getFName() const { return cFileName; }
void copyDateTimeAttr() const {
ai.attrib=dwFileAttributes;
FileTimeToDosDateTime(&ftLastWriteTime,&ai.date,&ai.time);
}
};
struct ENV_FILE_FINDER {
HANDLE hndl;
ENV_FIND_RESULT Rslt;
ENV_FIND_RESULT getResult() { return Rslt; }
BOOL isFileValid() {
return ((Rslt.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0);
}
BOOL findFirst(const char* Pattern) {
return ((hndl=FindFirstFile(Pattern,&Rslt)) != INVALID_HANDLE_VALUE);
}
BOOL findNext() { return FindNextFile(hndl,&Rslt); }
void findStop() { FindClose(hndl); }
};
#elif defined(_DOS32_ENVIRONMENT_)
#include <conio.h>
#include <dos.h>
#include <direct.h>
#if defined(__DJGPP__)
#include <unistd.h>
#include <crt0.h>
#undef BACKSLASH
#define BACKSLASH '/'
char **__crt0_glob_function (char *arg) { return 0; }
void __crt0_load_environment_file (char *progname) { }
#endif /* defined(__DJGPP__) */
inline void EnvSetNormAttr(const char* FName) { _dos_setfileattr(FName,_A_NORMAL); }
inline int EnvGetCh() { return getch(); }
inline void EnvGetCWD(char* CurDir) { getcwd(CurDir,260); }
inline void EnvSetDateTimeAttr(const char* WrkStr)
{
FILE* fpOut = fopen(WrkStr,"a+b");
_dos_setftime(fileno(fpOut),ai.date,ai.time);
fclose(fpOut);
_dos_setfileattr(WrkStr,ai.attrib);
}
struct ENV_FIND_RESULT: public find_t {
const char* getFName() const { return name; }
void copyDateTimeAttr() const {
ai.attrib=attrib;
ai.time=wr_time; ai.date=wr_date;
}
};
struct ENV_FILE_FINDER {
ENV_FIND_RESULT Rslt;
ENV_FIND_RESULT getResult() { return Rslt; }
BOOL isFileValid() { return TRUE; }
BOOL findFirst(const char* Pattern) {
return (_dos_findfirst(Pattern,_A_RDONLY | _A_HIDDEN | _A_SYSTEM | _A_ARCH,&Rslt) == 0);
}
BOOL findNext() { return (_dos_findnext(&Rslt) == 0); }
void findStop() { }
};
#elif defined(_POSIX_ENVIRONMENT_)
#define _POSIX_SOURCE
#undef BACKSLASH
#define BACKSLASH '/'
#include <sys/stat.h>
#include <time.h>
#include <utime.h>
#include <dirent.h>
#include <unistd.h>
#include <fnmatch.h>
#if defined(__DJGPP__)
#include <crt0.h>
char **__crt0_glob_function (char *arg) { return 0; }
void __crt0_load_environment_file (char *progname) { }
#endif /* defined(__DJGPP__) */
inline void EnvSetNormAttr(const char* FName) { chmod(FName,S_IWUSR); }
inline int EnvGetCh() { return getchar(); }
inline void EnvGetCWD(char* CurDir) { getcwd(CurDir,260); }
inline void EnvSetDateTimeAttr(const char* WrkStr)
{
struct utimbuf t;
t.actime=t.modtime=(ai.date << 16)+ai.time;
utime(WrkStr,&t); chmod(WrkStr,ai.attrib);
}
struct ENV_FIND_RESULT {
dirent de;
struct stat st;
const char* getFName() const { return de.d_name; }
void copyDateTimeAttr() const {
ai.attrib=st.st_mode;
ai.time=st.st_mtime & 0xFFFF; ai.date=st.st_mtime >> 16;
}
};
struct ENV_FILE_FINDER {
const char* pPattern;
DIR* dir;
dirent* de;
struct stat st;
ENV_FIND_RESULT getResult() {
ENV_FIND_RESULT Rslt;
Rslt.de=*de; Rslt.st=st;
return Rslt;
}
BOOL isFileValid() {
return (fnmatch(pPattern,de->d_name,FNM_NOESCAPE) == 0 &&
stat(de->d_name,&st) == 0 && (st.st_mode & S_IRUSR) != 0 &&
st.st_nlink == 1);
}
BOOL findFirst(const char* Pattern) {
pPattern=Pattern;
return ((dir=opendir(".")) && (de=readdir(dir)) != NULL);
}
BOOL findNext() { return ((de=readdir(dir)) != NULL); }
void findStop() { closedir(dir); }
};
#else /* _UNKNOWN_ENVIRONMENT_ */
#pragma message ("unknown environment:")
#pragma message (" 1. _fastcall and _stdcall keywords are disabled")
#pragma message (" 2. wildcards and file attributes are disabled")
#undef USAGE_STR
#define USAGE_STR "Usage: PPMd <e|d> [switches] FileName[s]\n"
inline void EnvSetNormAttr(const char* ) {}
inline int EnvGetCh() { return getchar(); }
inline void EnvGetCWD(char* CurDir) { CurDir[0]=0; }
inline void EnvSetDateTimeAttr(const char* ) {}
struct ENV_FIND_RESULT {
char FName[260];
const char* getFName() const { return FName; }
void copyDateTimeAttr() const {}
};
struct ENV_FILE_FINDER {
const char* pPattern;
ENV_FIND_RESULT getResult() {
ENV_FIND_RESULT Rslt; strcpy(Rslt.FName,pPattern);
return Rslt;
}
BOOL isFileValid() { return TRUE; }
BOOL findFirst(const char* Pattern) {
pPattern=Pattern; return TRUE;
}
BOOL findNext() { return FALSE; }
void findStop() {}
};
#endif /* defined(__WIN32_ENVIRONMENT) */
static const char* const MTxt[] = { "Can`t open file %s\n",
"read/write error for files %s/%s\n", "Out of memory!\n",
"User break\n", "unknown command: %s\n", "unknown switch: %s\n",
"designed and written by Dmitry Shkarin <dmitry.shkarin@mtu-net.ru>\n"
USAGE_STR
"Switches (for encoding only):\n"
"\t-d - delete file[s] after processing, default: disabled\n"
"\t-fName - set output file name to Name\n"
"\t-mN - use N MB memory - [1,256], default: %d\n"
"\t-oN - set model order to N - [2,%d], default: %d\n"
"\t-rN - set method of model restoration at memory insufficiency:\n"
"\t\t-r0 - restart model from scratch (default)\n"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -