
///                              　　　　　　　　　                         <
///
///   More includes   <
///
///                              拭　　　　　　　　ヾ                         <
///

///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
///                              exec.library                                 <
///
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
#include <clib/exec_protos.h>
#include <pragmas/exec_sysbase_pragmas.h>
#include <exec/types.h>
#include <exec/ports.h>
#include <exec/nodes.h>
#include <exec/alerts.h>
#include <exec/memory.h>
#include <exec/execbase.h>

IMPORT struct ExecBase *SysBase;  // 草籵a 鱚 迹蜿a
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
///                        a琿a  a蒻a諛 - dos.library                     <
///
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
#include <clib/dos_protos.h>
#include <pragmas/dos_pragmas.h>
#include <dos.h>
#include <dos/dostags.h>

IMPORT struct Library *DOSBase;   // 迹蜿a 裹跚-蜊竝 蜊謗芒骰a
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
///                            intuition.library                              <
///
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
#include <clib/intuition_protos.h>
#include <pragmas/intuition_pragmas.h>

#define INTUITION_LIBRARY_NAME      "intuition.library"
#define INTUITION_LIBRARY_VERSION   36L

STATIC struct Library *IntuitionBase = NULL;
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
///                             icon.library                                  <
///
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
#include <proto/icon.h>           // 迹蜿a 裹跚-蜊竝 蜊謗芒骰a
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
///                          commodities.library                              <
///
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
#include <proto/commodities.h>    // 迹蜿a 裹跚-蜊竝 蜊謗芒骰a
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
///                            xpkmaster.library                              <
///
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
#include <pragma/xpkmaster_lib.h>

#define XPK_LIBRARY_NAME    "xpkmaster.library"
#define XPK_LIBRARY_VERSION 4L

STATIC struct Library *XpkBase = NULL;
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
///                   零窿粹繪a 褄a裹a艸 - locale.library                  <
///
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
#include <libraries/locale.h>
#include <clib/locale_protos.h>
#include <pragmas/locale_pragmas.h>

#define LOCALE_LIBRARY_NAME         "locale.library"
#define LOCALE_LIBRARY_VERSION      38L
#define CATALOG_LAST_VERSION        1

STATIC struct Library *LocaleBase = NULL;
STATIC struct Catalog *catalog    = NULL;
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
///                              蜊-骰 糯...                              <
///
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
#include <error.h>
#include <string.h>
#include <clib/alib_protos.h>
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
// 刋砒 苣鉈襌胙粳 韵闥蜻鳫:

// aa褄 a蒻a 鴃a跋瘢:
struct SetsHeader
{
  ULONG sh_ID;
  ULONG sh_version;
  ULONG sh_amount;
};

// a硴褄瘢 a琲迪a  a蒻 鴃a跋瘢:
struct PatternHeader
{
  unsigned ph_PatternMode   : 2;
  unsigned ph_StorageMode   : 2;
  unsigned ph_StorageMethod : 2;
  unsigned ph_PerformCheck  : 1;
  unsigned ph_UseXPK        : 1;
  unsigned ph_pad           : 8;
  UBYTE    ph_XPKName[6];
  UWORD    ph_XPKMode;
  UWORD    ph_PatternSize;
  UWORD    ph_StorageSize;
  UWORD    ph_PasswordSize;
};

// 落苣aa a琲迪 a琿a 韵闥蜻鳫a:
struct PatternNode
{
  struct Node pn_Node;
  unsigned pn_PatternMode   : 2;
  unsigned pn_StorageMode   : 2;
  unsigned pn_StorageMethod : 2;
  unsigned pn_PerformCheck  : 1;
  unsigned pn_UseXPK        : 1;
  unsigned pn_pad           : 8;
  UBYTE    pn_XPKName[6];
  UWORD    pn_XPKMode;
  UBYTE    pn_Pattern[FMSIZE];
  UBYTE    pn_Storage[FMSIZE];
  UBYTE    pn_Password[32];
  UBYTE    pn_Match[2*FMSIZE+8];
};
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
// 問韈迥蜊 a蜿逅轣:

#define REG(x)           register __ ## x
#define GETMES(x)        (messages[x])
#define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
// 刋鈔陋 a蓚暑顰 芫粲轣a跛諛 蜊跟a跣a諛:

// 嚏a砒:
// - 麗逍粐:

#define SETS_VERSION                   1L
#define SETS_ID                        MAKE_ID('A','M','I','R')

#define ALL_RIGHT                      TRUE           //    ;-)  <- 闕 竝 鴕粫
#define GAME_OVER                      FALSE          //    :-(  <- 謐閭a 蜃闔莓暑

#define TASK_PREFS_NAME                "AMIMIRRORPREFS"
#define COM_PORT_NAME                  "AMIMIRROR_PORT"
#define PREFS_PORT_NAME                "AMIMIRRORPREFS_PORT"
#define SETS_FILE                      "ENV:amimirror.sets"
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
// A 驗鈔陋 - 蜊跟a跣 鈔閼苣襞粳轤 驥a:

// 刧鋩 鞜粹蜃 a琲迪a:
enum
{
  PAT_MODE_NAME,
  PAT_MODE_DIR,
  PAT_MODE_PATH
};

// 粤芫 齏a趙趺:
enum
{
  STO_MODE_FILE,
  STO_MODE_DIR
};

// 埋骰笞 齏a趙趺:
enum
{
  STO_METHOD_REPLACE,
  STO_METHOD_SUFFIX
};


// 総聲aa粳 肚a粲苙
enum
{
  FUNK_CANCEL,
  FUNK_YES,
  FUNK_NO
};


// 俯轢粲苙 艷 aa褄a...
enum
{
  PROG_VERSION,
  PROG_COPYRIGHT,
  CATALOG_NAME,
  BUILTIN_LANGUAGE,
  PROG_DESC,
  REQ_TITLE_ERROR,
  OUT_MEM,
  LIBRARY_PROBLEM,
  DOS_ERROR_STR,
  CANT_LOCK,
  CANT_CREATE,
  CANT_OPEN_SETS,
  CANT_READ_SETS,
  NOT_SETS_FILE,
  CANT_PARSE,
  CANT_MSGPORT,
  CANT_OPEN,
  CANT_EXAM,
  CANT_EXAMXPK,
  CANT_READ,
  CANT_DELETE,
  CANT_RENAME,
  CANT_WRITE,
  CANT_PACK,
  CANT_UNPACK,
  QUIT_BUT,
  CANCEL_BUT,
  OK_BUT,

  FINISH,
};

STATIC STRPTR messages[] =
{
  "$VER: AmiMirror 1.0 (8.09.98)",
  "AmiMirror  1998 Black Square Software",
  "amimirror.catalog",
  "english",
  "Makes spare copies of your files",
  "AmiMirror error",
  "Not enough memory",
  "Can not open %s version %ld+",
  "\nDOS Error",
  "Cannot lock\n%s%s",
  "Cannot create\n%s%s",
  "Cannot open settings file\n%s%s",
  "Cannot read settings file\n%s%s",
  "Wrong settings file\n%s",
  "Cannot prepare pattern\n%s%s",
  "Cannot create message port",
  "Cannot open file\n%s%s",
  "Cannot examine file\n%s%s",
  "Cannot examine file\n%s\nXPK Error: %s",
  "Cannot read file\n%s%s",
  "Cannot delete file\n%s%s",
  "Cannot rename file\n%s%s",
  "Cannot write file\n%s%s",
  "Cannot pack\nXPK Error: %s",
  "Cannot unpack file\n%s\nXPK Error: %s",
  "Quit",
  "Cancel",
  "Ok"
};
///　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 <
///
// 問蜊骰陏 礪轢a襌蹂 鈔閼諢跛  a跛.

IMPORT LONG  __stack        = 8192L;
IMPORT LONG  __STKNEED      = 2048L;
IMPORT UBYTE __stdiowin[]   = "CON:10/10/200/80/AmiMirror";

extern LONG __far LVOClose;
STATIC LONG __asm (*OldClose)(register __d1 BPTR);

STATIC struct List PatList;
STATIC struct SignalSemaphore Sema;
STATIC BOOL patch = FALSE;

STATIC UBYTE  path[FMSIZE];
STATIC UBYTE  name[FMSIZE];
STATIC UBYTE   dir[FMSIZE];
STATIC UBYTE spath[FMSIZE];
STATIC UBYTE  sdir[FMSIZE];
STATIC UBYTE  dosfault[2*FAULT_MAX];

STATIC STRPTR in_buf = NULL;
STATIC LONG   in_len = 0L;

STATIC CxObj *broker;
STATIC struct MsgPort *broker_mp;
STATIC ULONG cxsigflag = 0L;
STATIC STRPTR *ttypes;
STATIC struct NewBroker newbroker =
  {
    NB_VERSION,
    "AmiMirror",
    "AmiMirror",
    NULL,
    NBU_UNIQUE | NBU_NOTIFY,
    COF_SHOW_HIDE,
    0,
    NULL,
    0
  };

