mrr@softie.UUCP (09/26/87)
# This is a shell archive. Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file"
# Created Fri Sep 25 07:26:10 1987
#
# This archive contains:
# Menu.c
# Menu.h
# MiscRequest.c
# PathRequest.c
# Restore.c
# UserPrefs.c
echo "Creating Menu.c"
cat > Menu.c <<"***EOF Menu.c***"
/*****************************************************
* Menu Definitions *
* *
* Created with Menu Creator *
* by *
* David Pehrson *
* *
* Copyright (C) 1986 David Pehrson *
* Mantis Development *
* *
*****************************************************/
#include <exec/types.h>
#include <intuition/intuition.h>
char stTopaz[] = "topaz.font";
struct TextAttr taPlain =
{
(STRPTR) stTopaz, 8, FS_NORMAL, FPF_ROMFONT
};
struct TextAttr taBIU =
{
(STRPTR) stTopaz, 8, FSF_BOLD | FSF_ITALIC | FSF_UNDERLINED, FPF_ROMFONT
};
struct TextAttr taBU =
{
(STRPTR) stTopaz, 8, FSF_BOLD | FSF_UNDERLINED, FPF_ROMFONT
};
struct TextAttr taBI =
{
(STRPTR) stTopaz, 8, FSF_BOLD | FSF_ITALIC, FPF_ROMFONT
};
struct TextAttr taB =
{
(STRPTR) stTopaz, 8, FSF_BOLD, FPF_ROMFONT
};
struct TextAttr taIU =
{
(STRPTR) stTopaz, 8, FSF_ITALIC | FSF_UNDERLINED, FPF_ROMFONT
};
struct TextAttr taI =
{
(STRPTR) stTopaz, 8, FSF_ITALIC, FPF_ROMFONT
};
struct TextAttr taU =
{
(STRPTR) stTopaz, 8, FSF_UNDERLINED, FPF_ROMFONT
};
struct IntuiText ItemText[] =
{
{ 0, 1, JAM1, 0, 1, &taPlain, "Backup", NULL },
{ 0, 1, JAM1, 0, 1, &taPlain, "Restore", NULL },
{ 0, 1, JAM1, 0, 1, &taPlain, "About", NULL },
{ 0, 1, JAM1, 0, 1, &taPlain, "Quit", NULL },
{ 0, 1, JAM1, 0, 1, &taPlain, " Compression", NULL },
{ 0, 1, JAM1, 0, 1, &taPlain, " No Compression", NULL },
{ 0, 1, JAM1, 0, 1, &taPlain, " Listing", NULL },
{ 0, 1, JAM1, 0, 1, &taPlain, " No Listing", NULL },
{ 0, 1, JAM1, 0, 1, &taPlain, " Speech", NULL },
{ 0, 1, JAM1, 0, 1, &taPlain, " No Speech", NULL },
};
struct MenuItem Items[] =
{
{ /* Backup */
&Items[1], 0, 0, 72, 10,
ITEMENABLED | ITEMTEXT | HIGHCOMP ,
0, (APTR)&ItemText[0], NULL, NULL, NULL, MENUNULL
},
{
&Items[2], 0, 10, 72, 10,
ITEMENABLED | ITEMTEXT | HIGHCOMP ,
0, (APTR)&ItemText[1], NULL, NULL, NULL, MENUNULL
},
{
&Items[3], 0, 20, 72, 10,
ITEMENABLED | ITEMTEXT | HIGHCOMP,
0, (APTR)&ItemText[2], NULL, NULL, NULL, MENUNULL
},
{
NULL, 0, 30, 72, 10,
ITEMENABLED | ITEMTEXT | HIGHCOMP,
0, (APTR)&ItemText[3], NULL, NULL, NULL, MENUNULL
},
{
&Items[5], 0, 0, 152, 10, /* Compression */
ITEMENABLED | ITEMTEXT | CHECKIT | HIGHCOMP | CHECKED,
2, (APTR)&ItemText[4], NULL, NULL, NULL, MENUNULL
},
{
&Items[6], 0, 10, 152, 10, /* No Compression */
ITEMENABLED | ITEMTEXT | CHECKIT | HIGHCOMP,
1, (APTR)&ItemText[5], NULL, NULL, NULL, MENUNULL
},
{
&Items[7], 0, 20, 152, 10, /* Listing */
ITEMENABLED | ITEMTEXT | CHECKIT | HIGHCOMP | CHECKED,
8, (APTR)&ItemText[6], NULL, NULL, NULL, MENUNULL
},
{
&Items[8], 0, 30, 152, 10, /* No Listing */
ITEMENABLED | ITEMTEXT | CHECKIT | HIGHCOMP,
4, (APTR)&ItemText[7], NULL, NULL, NULL, MENUNULL
},
{
&Items[9], 0, 40, 152, 10, /* Speech */
ITEMENABLED | ITEMTEXT | CHECKIT | HIGHCOMP | CHECKED,
32, (APTR)&ItemText[8], NULL, NULL, NULL, MENUNULL
},
{
NULL, 0, 50, 152, 10, /* No Speech */
ITEMENABLED | ITEMTEXT | CHECKIT | HIGHCOMP,
16, (APTR)&ItemText[9], NULL, NULL, NULL, MENUNULL
},
};
struct Menu Titles[] =
{
{ &Titles[1], 3, 0, 70, 0, MENUENABLED, "Project", &Items[0],0,0,0,0 },
{ NULL, 72, 0, 54, 0, MENUENABLED, "Flags", &Items[4],0,0,0,0 },
};
***EOF Menu.c***
echo "Creating Menu.h"
cat > Menu.h <<"***EOF Menu.h***"
/* Menu constant definitions */
#define MENU_PROJECT 0
#define ITEM_BACKUP 0
#define ITEM_RESTORE 1
#define ITEM_ABOUT 2
#define ITEM_QUIT 3
#define MENU_FLAGS 1
#define ITEM_COMPRESS 0
#define ITEM_NOCOMPRESS 1
#define ITEM_LIST 2
#define ITEM_NOLIST 3
#define ITEM_SPEECH 4
#define ITEM_NOSPEECH 5
***EOF Menu.h***
echo "Creating MiscRequest.c"
cat > MiscRequest.c <<"***EOF MiscRequest.c***"
/* Miscellaneous requester support routines. */
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <libraries/dosextens.h>
#include <graphics/text.h>
#include <functions.h>
#include <ctype.h>
struct IntuiText diskreq_body_text = {
AUTOFRONTPEN, /* FrontPen */
AUTOBACKPEN, /* BackPen */
AUTODRAWMODE, /* DrawMode */
AUTOLEFTEDGE, /* LeftEdge */
AUTOTOPEDGE, /* TopEdge */
NULL, /* ITextFont Pointer */
(UBYTE *)"", /* IText */
NULL /* NextText */
};
struct IntuiText diskreq_pos_text = {
AUTOFRONTPEN, /* FrontPen */
AUTOBACKPEN, /* BackPen */
AUTODRAWMODE, /* DrawMode */
AUTOLEFTEDGE, /* LeftEdge */
AUTOTOPEDGE, /* TopEdge */
NULL, /* ITextFont Pointer */
(UBYTE *)"OK", /* IText */
NULL /* NextText */
};
struct IntuiText diskreq_neg_text = {
AUTOFRONTPEN, /* FrontPen */
AUTOBACKPEN, /* BackPen */
AUTODRAWMODE, /* DrawMode */
AUTOLEFTEDGE, /* LeftEdge */
AUTOTOPEDGE, /* TopEdge */
NULL, /* ITextFont Pointer */
(UBYTE *)"Cancel", /* IText */
NULL /* NextText */
};
/* Generate an autorequest for the insertion of a floppy disk.
* Called with:
* window: pointer to window for request
* drivespec: the disk drive name
*/
int
RequestDisk(window, drivespec)
struct Window *window; char *drivespec;
{
UBYTE prompt[41];
strcpy(prompt,"Insert blank disk in ");
strncat(prompt,drivespec,(sizeof(prompt)-strlen(prompt)-1));
diskreq_body_text.IText = prompt;
return AutoRequest(
window, &diskreq_body_text, &diskreq_pos_text,
&diskreq_neg_text, DISKINSERTED, NULL, 300L, 50L);
}
***EOF MiscRequest.c***
echo "Creating PathRequest.c"
cat > PathRequest.c <<"***EOF PathRequest.c***"
/* MRBackup Pathname Specifications "Requester"
* Filename: PathRequest.c
* History: (most recent change first)
*
* 09/20/87 -MRR- V1.3: The pathname gadgets were formerly attached to
* a requester. I have removed the requester stuff, since
* it did nothing to enhance the functionality of the
* pathname specification window.
*/
/**********************************************************************
* Gadget Structure Definitions
*
* Some of the following structures were defined using the Gadget Editor
* created by the Programmer's Network.
* The credits for the Gadget Editor are:
*
* John Draper - Initial design, coordination, and integration.
* Ray Larson - Images and Intuitext.
* Brent Southard - Saving and restoring gadgets in binary form.
* Dave Milligan - Gadget Editor Main menu.
*
*
**********************************************************************/
/* The header files needed for gadget definitions */
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <libraries/dosextens.h>
#include <graphics/gfxbase.h>
#include <graphics/gfx.h>
#include <graphics/display.h>
#include <graphics/text.h>
#include <functions.h>
#include <ctype.h>
#include "gadget.h"
#define PATHGADTYPE STRGADGET
/**********************************************************************
* Text attribute structures used in rendering IntuiTexts
**********************************************************************/
/* A note to the fastidious: These things are duplicated in the menu
* package. Some ambitious soul should consolidate them into a single
* definition.
*/
char def_font[] ="topaz.font";
struct TextAttr TxtAt_Plain = { (UBYTE *)def_font, 8,
FS_NORMAL, FPF_ROMFONT};
struct TextAttr TxtAt_BIU = {(UBYTE *)def_font, 8,
FSF_BOLD | FSF_ITALIC | FSF_UNDERLINED, FPF_ROMFONT};
struct TextAttr TxtAt_BU = {(UBYTE *)def_font, 8,
FSF_BOLD | FSF_UNDERLINED, FPF_ROMFONT};
struct TextAttr TxtAt_BI = {(UBYTE *)def_font, 8,
FSF_BOLD | FSF_ITALIC, FPF_ROMFONT};
struct TextAttr TxtAt_B ={(UBYTE *)def_font, 8,
FSF_BOLD, FPF_ROMFONT};
struct TextAttr TxtAt_IU ={(UBYTE *)def_font, 8,
FSF_ITALIC | FSF_UNDERLINED, FPF_ROMFONT};
struct TextAttr TxtAt_I ={(UBYTE *)def_font, 8,
FSF_ITALIC, FPF_ROMFONT};
struct TextAttr TxtAt_U ={(UBYTE *)def_font, 8,
FSF_UNDERLINED, FPF_ROMFONT};
/* STOP gadget definition */
/***************************************************************/
/* The following data structure contains the image data */
/***************************************************************/
USHORT StopGadImg_dat[]= {
0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0020, 0x0000, 0x00ff, 0xffff, 0xffe0, 0x0000,
0x0006, 0x0000, 0x03ff, 0xffff, 0xfff8, 0x0000, 0x0006, 0x0000,
0x07ff, 0xffff, 0xfffc, 0x0000, 0x0027, 0x0000, 0x1fff, 0xffff,
0xffff, 0x0000, 0x0021, 0x0000, 0x3fff, 0xffff, 0xffff, 0x8000,
0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xe000, 0x0026, 0x0001,
0xffff, 0xffff, 0xffff, 0xf000, 0x0000, 0x0007, 0xffff, 0xffff,
0xffff, 0xfc00, 0x0020, 0x000f, 0xffff, 0xffff, 0xffff, 0xfe00,
0x0038, 0x000f, 0xffff, 0xffff, 0xffff, 0xfe00, 0x0010, 0x000f,
0xffff, 0xffff, 0xffff, 0xfe00, 0x0000, 0x000f, 0xffff, 0xffff,
0xffff, 0xfe00, 0x0000, 0x000f, 0xffff, 0xffff, 0xffff, 0xfe00,
0x0000, 0x000f, 0xffff, 0xffff, 0xffff, 0xfe00, 0x0000, 0x000f,
0xffff, 0xffff, 0xffff, 0xfe00, 0x0000, 0x000f, 0xffff, 0xffff,
0xffff, 0xfe00, 0x0000, 0x000f, 0xffff, 0xffff, 0xffff, 0xfe00,
0x0036, 0x000f, 0xffff, 0xffff, 0xffff, 0xfe00, 0x0020, 0x000f,
0xffff, 0xffff, 0xffff, 0xfe00, 0x0006, 0x000f, 0xffff, 0xffff,
0xffff, 0xfe00, 0x003c, 0x000f, 0xffff, 0xffff, 0xffff, 0xfe00,
0x0006, 0x0007, 0xffff, 0xffff, 0xffff, 0xfc00, 0x0031, 0x0001,
0xffff, 0xffff, 0xffff, 0xf000, 0x0000, 0x0000, 0xffff, 0xffff,
0xffff, 0xe000, 0x0000, 0x0000, 0x3fff, 0xffff, 0xffff, 0x8000,
0x000f, 0x0000, 0x1fff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000,
0x07ff, 0xffff, 0xfffc, 0x0000, 0x0000, 0x0000, 0x03ff, 0xffff,
0xfff8, 0x0000, 0x0000, 0x0000, 0x00ff, 0xffff, 0xffe0, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x00ff, 0xffff,
0xffe0, 0x0000, 0x0000, 0x0000, 0x03ff, 0xffff, 0xfff8, 0x0000,
0x0000, 0x0000, 0x07ff, 0xffff, 0xfffc, 0x0000, 0x0000, 0x0000,
0x1fff, 0xffff, 0xffff, 0x0000, 0x0020, 0x0000, 0x3fff, 0xffff,
0xffff, 0x8000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xe000,
0x003f, 0x0001, 0xffff, 0xffff, 0xffff, 0xf000, 0x0006, 0x0007,
0xffff, 0xffff, 0xffff, 0xfc00, 0x0001, 0x0007, 0xffff, 0xffff,
0xffff, 0xfc00, 0x0026, 0x0007, 0xffff, 0xffff, 0xffff, 0xfc00,
0x0000, 0x0007, 0xffff, 0xffff, 0xffff, 0xfc00, 0x0001, 0x0007,
0xffff, 0xffff, 0xffff, 0xfc00, 0x0006, 0x0007, 0xffff, 0xffff,
0xffff, 0xfc00, 0x0006, 0x0007, 0xffff, 0xffff, 0xffff, 0xfc00,
0x0003, 0x0007, 0xffff, 0xffff, 0xffff, 0xfc00, 0x0001, 0x0007,
0xffff, 0xffff, 0xffff, 0xfc00, 0x0000, 0x0007, 0xffff, 0xffff,
0xffff, 0xfc00, 0x0024, 0x0007, 0xffff, 0xffff, 0xffff, 0xfc00,
0x0000, 0x0007, 0xffff, 0xffff, 0xffff, 0xfc00, 0x0006, 0x0007,
0xffff, 0xffff, 0xffff, 0xfc00, 0x0000, 0x0001, 0xffff, 0xffff,
0xffff, 0xf000, 0x0001, 0x0000, 0xffff, 0xffff, 0xffff, 0xe000,
0x0000, 0x0000, 0x3fff, 0xffff, 0xffff, 0x8000, 0x0001, 0x0000,
0x1fff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x07ff, 0xffff,
0xfffc, 0x0000, 0x0000, 0x0000, 0x03ff, 0xffff, 0xfff8, 0x0000,
0x0000, 0x0000, 0x00ff, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x003f, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002
};
/***************************************************************/
/* The following data structure defines the image */
/***************************************************************/
struct Image StopGadImg = {
0, 0, /* Left, Top */
90, 38, /* Width, Height */
2, /* Depth */
(USHORT *)&StopGadImg_dat, /* ImageData */
0xff, /* PlanePick */
0x00, /* PlaneOnOff */
NULL /* Next Image */
};
/**********************************************************************
* IntuiTexts for the StopGad gadget.
**********************************************************************/
struct IntuiText StopGad_Text_0 = {
0, 3, /* FrontPen, BackPen */
JAM2, /* DrawMode */
26, 13, /* LeftEdge, TopEdge */
&TxtAt_B, /* ITextFont Pointer - bold */
/* The IText */
(UBYTE *)"STOP",
NULL
};
/**********************************************************************
* Gadget Structure definition for the StopGad gadget.
**********************************************************************/
struct Gadget StopGad = {
NULL, /* NextGadget pointer */
76, 30, /* LeftEdge, TopEdge */
90, 38, /* Width, Height */
GADGIMAGE, /* Gadget Flags */
RELVERIFY, /* Activation Flags */
BOOLGADGET, /* GadgetType */
(APTR)&StopGadImg, /* GadgetRender */
NULL, /* SelectRender */
&StopGad_Text_0, /* GadgetText */
0x0, /* MutualExclude */
NULL, /* SpecialInfo */
STOPGAD, /* GadgetID */
0x0 /* UserData Pointer */
};
#define REQUESTWIDTH 260
#define REQUESTHEIGHT 70
/* New window structure */
static struct NewWindow pathreqnw = {
640 - REQUESTWIDTH - 8, /* LeftEdge */
12, /* TopEdge */
REQUESTWIDTH + 4, /* Width */
REQUESTHEIGHT + 10, /* Height */
0, /* DetailPen */
1, /* BlockPen */
GADGETDOWN | GADGETUP , /* IDCMP Flags */
WINDOWDEPTH | WINDOWDRAG | ACTIVATE ,/* Flags */
NULL, /* First gadget */
NULL, /* Checkmark */
(UBYTE *)"Pathname Specifications", /* Window title */
NULL, /* No custom streen */
NULL, /* Not a super bitmap window */
REQUESTWIDTH+4, /* MinWidth */
REQUESTHEIGHT + 10, /* MinHeight */
640, /* MaxWidth */
200, /* MaxHeight */
WBENCHSCREEN
};
/**********************************************************************
* IntuiTexts for the excludepat gadget.
**********************************************************************/
struct IntuiText excludepath_Text_0 = {
3, 0, /* FrontPen, BackPen */
JAM2, /* DrawMode */
-112, 0, /* LeftEdge, TopEdge */
&TxtAt_Plain, /* ITextFont Pointer */
(UBYTE *)"Exclude Path:", /* The IText */
NULL
};
/**********************************************************************
* String information for the excludepat string gadget.
**********************************************************************/
static UBYTE excludepath_sbuf_1[81];
static UBYTE excludepath_ubuf_1[81];
struct StringInfo excludepath_txstr_1 = {
excludepath_sbuf_1, /* Buffer */
excludepath_ubuf_1, /* UndoBuffer */
0, 80, 0, /* BufferPos, MaxChars, DispPos */
0, 0, /* UndoPos, NumChars */
0, 0, 0, /* DispCount, CLeft, CTop */
0x0, 0, /* LayerPtr, LongInt */
0x0 /* AltKeyMap */
};
/**********************************************************************
* Gadget Structure definition for the excludepat gadget.
**********************************************************************/
struct Gadget excludepathgad = {
NULL, /* NextGadget pointer */
144, 60, /* LeftEdge, TopEdge */
100, 9, /* Width, Height */
GADGHCOMP, /* Gadget Flags */
GADGIMMEDIATE | RELVERIFY, /* Activation Flags */
PATHGADTYPE, /* GadgetType */
NULL, /* GadgetRender */
NULL, /* SelectRender */
&excludepath_Text_0, /* GadgetText */
0x0, /* MutualExclude */
(APTR)&excludepath_txstr_1, /* SpecialInfo */
XCLDPATHGAD, /* GadgetID */
NULL /* UserData Pointer */
};
/**********************************************************************
* IntuiTexts for the listpath gadget.
**********************************************************************/
struct IntuiText listpath_Text_0 = {
3, 0, /* FrontPen, BackPen */
JAM2, /* DrawMode */
-112, 0, /* LeftEdge, TopEdge */
&TxtAt_Plain, /* ITextFont Pointer */
(UBYTE *)"Listing Path:", /* The IText */
NULL
};
/**********************************************************************
* String information for the listpath string gadget.
**********************************************************************/
UBYTE listpath_sbuf_1[81] = "PRT:";
UBYTE listpath_ubuf_1[81];
struct StringInfo listpath_txstr_1 = {
listpath_sbuf_1, listpath_ubuf_1, /* Buffer, UndoBuffer */
0, 80, 0, /* BufferPos, MaxChars, DispPos */
0, 4, /* UndoPos, NumChars */
0, 0, 0, /* DispCount, CLeft, CTop */
0x0, 0, /* LayerPtr, LongInt */
0x0 /* AltKeyMap */
};
/**********************************************************************
* Gadget Structure definition for the listpath gadget.
**********************************************************************/
struct Gadget listpathgad = {
NULL, /* NextGadget pointer */
144, 48, /* LeftEdge, TopEdge */
100, 9, /* Width, Height */
GADGHCOMP, /* Gadget Flags */
GADGIMMEDIATE | RELVERIFY , /* Activation Flags */
PATHGADTYPE, /* GadgetType */
NULL, /* GadgetRender */
NULL, /* SelectRender */
&listpath_Text_0, /* GadgetText */
0x0, /* MutualExclude */
(APTR)&listpath_txstr_1, /* SpecialInfo */
LISTPATHGAD, /* GadgetID */
NULL /* UserData Pointer */
};
/**********************************************************************
* IntuiTexts for the backpath gadget.
**********************************************************************/
struct IntuiText backpath_Text_0 = {
3, 0, /* FrontPen, BackPen */
JAM2, /* DrawMode */
-104, 0, /* LeftEdge, TopEdge */
&TxtAt_Plain, /* ITextFont Pointer */
(UBYTE *)"Backup Path:", /* The IText */
NULL
};
/**********************************************************************
* String information for the backpath string gadget.
**********************************************************************/
UBYTE backpath_sbuf_1[81] = "DF0:";
UBYTE backpath_ubuf_1[81];
struct StringInfo backpath_txstr_1 = {
backpath_sbuf_1, /* Buffer */
backpath_ubuf_1, /* UndoBuffer */
0, 80, 0, /* BufferPos, MaxChars, DispPos */
0, 4, /* UndoPos, NumChars */
0, 0, 0, /* DispCount, CLeft, CTop */
0x0, 0, /* LayerPtr, LongInt */
0x0 /* AltKeyMap */
};
/**********************************************************************
* Gadget Structure definition for the backpath gadget.
**********************************************************************/
struct Gadget backpathgad = {
NULL, /* NextGadget pointer */
144, 36, /* LeftEdge, TopEdge */
100, 9, /* Width, Height */
GADGHCOMP, /* Flags */
GADGIMMEDIATE | RELVERIFY , /* Activation */
PATHGADTYPE, /* GadgetType */
NULL, /* GadgetRender */
NULL, /* SelectRender */
&backpath_Text_0, /* GadgetText */
0x0, /* MutualExclude */
(APTR)&backpath_txstr_1, /* SpecialInfo */
BACKPATHGAD, /* GadgetID */
NULL /* UserData Pointer */
};
/**********************************************************************
* IntuiTexts for the homepath gadget.
**********************************************************************/
struct IntuiText homepath_Text_0 = {
3, 0, /* FrontPen, BackPen */
JAM2, /* DrawMode */
-88, 0, /* LeftEdge, TopEdge */
&TxtAt_Plain, /* ITextFont Pointer */
(UBYTE *)"Home Path:", /* The IText */
NULL
};
/**********************************************************************
* String information for the homepath string gadget.
**********************************************************************/
UBYTE homepath_sbuf_1[81] = "DH0:";
UBYTE homepath_ubuf_1[81];
struct StringInfo homepath_txstr_1 = {
homepath_sbuf_1, /* Buffer */
homepath_ubuf_1, /* UndoBuffer */
0, 80, 0, /* BufferPos, MaxChars, DispPos */
0, 4, /* UndoPos, NumChars */
0, 0, 0, /* DispCount, CLeft, CTop */
0x0, 0, /* LayerPtr, LongInt */
0x0 /* AltKeyMap */
};
/**********************************************************************
* Gadget Structure definition for the homepath gadget.
**********************************************************************/
struct Gadget homepathgad = {
NULL, /* NextGadget pointer */
144, 24, /* LeftEdge, TopEdge */
100, 9, /* Width, Height */
GADGHCOMP, /* Gadget Flags */
GADGIMMEDIATE | RELVERIFY, /* Activation Flags */
PATHGADTYPE, /* GadgetType */
NULL, /* GadgetRender */
NULL, /* SelectRender */
&homepath_Text_0, /* GadgetText */
0x0, /* MutualExclude */
(APTR)&homepath_txstr_1, /* SpecialInfo */
HOMEPATHGAD, /* GadgetID */
NULL /* UserData Pointer */
};
struct Requester *pathrequest;
struct Window *pathwindow;
/* Initialize the pathname requester. */
int
InitPathRequest()
{
int status = 0;
if (pathwindow = OpenWindow(&pathreqnw)) {
/* I used AddGList here - got a crash. Problems with fullword
* alignment, maybe?
*/
AddGadget(pathwindow, homepathgad, -1L);
AddGadget(pathwindow, backpathgad, -1L);
AddGadget(pathwindow, listpathgad, -1L);
AddGadget(pathwindow, excludepathgad, -1L);
}
else {
status = IoErr();
TypeAndSpeak("I couldn't open the pathname window!\n");
}
return status;
}
/* Shut down the pathname requester mechanisms. */
CancelPathRequest()
{
if (pathwindow) CloseWindow(pathwindow);
}
***EOF PathRequest.c***
echo "Creating Restore.c"
cat > Restore.c <<"***EOF Restore.c***"
/* Filename: restore.c
* Author: Mark R. Rinfret
* Date: 08/02/87
* Description: Restore processing module for MRBackup
*
* History: (most recent change first)
*
* 09/19/87 -MRR- Added NewHomeDir() which creates subdirectories as
* necessary when the initial backup path specifies a
* subdirectory.
*/
#include "MRBackup.h"
#ifdef DEBUG
extern char debugmsg[];
#endif
static char fullbackpath[256], fullhomepath[256];
static unsigned home_is_device; /* true => home is "DH<N>:" */
/* Create a new directory on the home device.
* Called with:
* name: directory pathname
* Returns:
* false => success
* true => failure
*/
int
NewHomeDir(name)
char *name;
{
char c;
struct Lock *dirlock;
int dirleng;
int errnum;
char dirname[256];
int nameindx = 0, nameleng;
*dirname = '\0';
dirleng = 0;
nameleng = strlen(name);
/* Parse the pathname, one directory node at a time, creating
* directories as needed.
*/
while (nameindx < nameleng) {
if (nameindx) /* 2nd - nth pass? */
dirname[dirleng++] = '/'; /* directory separator */
while ((c = name[nameindx++]) && c != '/')
dirname[dirleng++] = c;
dirname[dirleng] = '\0'; /* terminate with null */
if (dirlock = Lock(dirname,SHARED_LOCK)) /* subdir exists? */
UnLock(dirlock);
else { /* create subdirectory */
if ((dirlock = CreateDir(dirname))== NULL){
if ((errnum = IoErr())== ERROR_DIRECTORY_NOT_EMPTY){
sprintf(conmsg,
"Directory %s already exists!\n",dirname);
TypeAndSpeak(conmsg);
}
else {
sprintf(conmsg,
"ERROR %d: Unable to create directory %s\n",
errnum,dirname);
TypeAndSpeak(conmsg);
return errnum;
}
}
else
UnLock(dirlock);
}
} /* endwhile */
return 0;
}
/* Restore files from floppy disk. */
int
Restore()
{
int status = 0;
Speak("And away we go!");
if (!IsDir(backpath)) {
TypeAndSpeak("Backup path must be a device or directory name!\n");
return ERR_ABORT;
}
BreakPath(backpath, srcvol, srcpath);
home_is_device = (homepath[strlen(homepath)-1] == ':');
status = RestoreFile(srcpath);
if (status == 0) {
TypeAndSpeak("Your restoration project is completed, sire.\n");
}
else {
sprintf(conmsg,"Restore terminated with status %d.\n",status);
TypeAndSpeak(conmsg);
TypeAndSpeak(
"Perhaps you should check things out and try it again.\n");
}
return status;
}
/* Restore all the files in a directory.
* Called with:
* lock: lock on the directory
* fib: pointer to file info block
* path: directory pathname (without volume)
* Returns:
* status (0 => success)
*/
int
RestoreDir(lock, fib, path)
struct Lock *lock; struct FileInfoBlock *fib; char *path;
{
struct Lock *dirlock = NULL, *filelock = NULL;
char newpath[256];
int status = 0;
strcpy(temp, homepath);
if (*path) {
if (!home_is_device) strcat(temp, "/");
strcat(temp, path);
}
#ifdef DEBUG
sprintf(debugmsg,"Checking for directory %s\n",temp);
DebugWrite(debugmsg);
#endif
if (!(dirlock = Lock(temp, SHARED_LOCK))) {
if ((status = IoErr()) == ERROR_OBJECT_NOT_FOUND) {
#ifdef DEBUG
sprintf(debugmsg,"Creating directory %s\n",temp);
DebugWrite(debugmsg);
#endif
if (status = NewHomeDir(temp))
return status;
}
else {
sprintf(conmsg,"RestoreDir cannot lock %s: %d\n",temp, status);
TypeAndSpeak(conmsg);
return status;
}
}
if (dirlock) UnLock(dirlock);
while (ExNext(lock,fib)) {
strcpy(newpath, path);
if (*newpath)
strcat(newpath, "/");
strcat(newpath, fib->fib_FileName);
if (status = RestoreFile(newpath)) {
/* filter out "permissable:" errors */
if (status == ERROR_OBJECT_IN_USE ||
status == ERROR_WRITE_PROTECTED)
status = 0;
else
break;
}
}
done:
return status;
}
/* Restore one or more files according to the calling pathname.
* The path argument does not contain the backup volume name.
*/
int
RestoreFile(path)
char *path;
{
struct FileInfoBlock *fib = NULL, *fib2 = NULL;
UBYTE exists = FALSE, ignore = FALSE;
struct Lock *lock = NULL;
USHORT namelength;
UBYTE savechar;
int status = 0;
if (status = CheckStop()) return status;
if (!(fib = (struct FileInfoBlock *)
AllocMem((long) sizeof (struct FileInfoBlock),
MEMF_PUBLIC | MEMF_CHIP))) {
TypeAndSpeak("RestoreFile could not allocate FIB!\n");
return ERROR_NO_FREE_STORE;
}
sprintf(fullbackpath, "%s:%s",srcvol,path);
strcpy(fullhomepath, homepath);
if (*path) {
if (!home_is_device) strcat(fullhomepath, "/");
strcat(fullhomepath, path);
}
#ifdef DEBUG
sprintf(conmsg,"fullbackpath = %s\n",fullbackpath);
DebugWrite(conmsg);
sprintf(conmsg,"fullhomepath = %s\n",fullhomepath);
DebugWrite(conmsg);
#endif
if (!(lock = Lock(fullbackpath, SHARED_LOCK))) {
status = IoErr();
sprintf(conmsg, "RestoreFile: can't lock %s: %d\n",
fullbackpath, status);
TypeAndSpeak(conmsg);
goto done;
}
if (!Examine(lock, fib)) {
status = IoErr();
sprintf(conmsg, "RestoreFile can't examine %s: %d\n",
fullbackpath, status);
TypeAndSpeak(conmsg);
goto done;
}
if (fib->fib_DirEntryType > 0) { /* path is a directory */
status = RestoreDir(lock, fib, path);
UnLock(lock);
lock = NULL;
}
else {
UnLock(lock);
lock = NULL;
/*#define NOCOPY*/
#ifndef NOCOPY
/* If this file exists, then check its modification date. If
* it's newer than the backup, don't replace it.
*/
if ((lock = Lock(fullhomepath, SHARED_LOCK))) {
if (!(fib2 = (struct FileInfoBlock *)
AllocMem((long) sizeof (struct FileInfoBlock),
MEMF_PUBLIC | MEMF_CHIP))) {
TypeAndSpeak("RestoreFile could not allocate FIB!\n");
status = ERROR_NO_FREE_STORE;
goto done;
}
Examine(lock, fib2);
UnLock(lock);
lock = NULL;
if (CompareDS(&fib2->fib_Date, &fib->fib_Date) >= 0)
ignore = TRUE;
}
if (ignore) {
sprintf(conmsg,"Skipping %s. Current version is newer.\n",
path);
TypeAndSpeak(conmsg);
}
else {
if (!do_compress || !IsCompressed(fullhomepath)) {
copyfile:
sprintf(conmsg,"Copying %s\n", fullbackpath);
WriteConsole(conmsg);
status = CopyFile(fullbackpath, fullhomepath);
}
else {
/* truncate the destination pathname (remove ".z") */
namelength = strlen(fullhomepath);
fullhomepath[namelength-2] = '\0';
sprintf(conmsg, "Decompressing %s\n", fullbackpath);
WriteConsole(conmsg);
if (status = decompress(fullbackpath, fullhomepath)) {
sprintf(conmsg,
"Decompression of %s failed; status is %d.\n",
fullbackpath, status);
TypeAndSpeak(conmsg);
TypeAndSpeak("I will try to copy the file, instead.\n");
/* restore ".z" to name */
fullhomepath[namelength-2] = '.';
goto copyfile;
}
CopyFileDate(fullbackpath, fullhomepath);
}
}
#endif
}
done:
if (lock) UnLock(lock);
if (fib) FreeMem(fib, (long) sizeof(struct FileInfoBlock));
if (fib2) FreeMem(fib2, (long) sizeof(struct FileInfoBlock));
return status;
}
***EOF Restore.c***
echo "Creating UserPrefs.c"
cat > UserPrefs.c <<"***EOF UserPrefs.c***"
/* MRBackup user preferences processing.
* Filename: UserPrefs.c
* Date: 08/23/87
*/
#include "MRBackup.h"
char *fgets();
extern struct Gadget backpathgad;
extern struct Gadget excludepathgad;
extern struct Gadget homepathgad;
extern struct Gadget listpathgad;
extern struct Requester *pathrequest;
extern struct Window *pathwindow;
#define KEYMAX 20 /* max length of a keyword */
#define NKEYWORD 7 /* number of keywords supported */
#define PREFERENCES_FILE "S:MRBackup.init"
#define KW_HOME 0
#define KW_BACKUP 1
#define KW_LIST 2
#define KW_EXCLUDE 3
#define KW_COMPRESSION 4
#define KW_LISTING 5
#define KW_SPEECH 6
static char *keywords[NKEYWORD] = {
"home", "backup", "list", "exclude",
"compression", "listing", "speech"
};
/* Process the user preferences file. */
GetUserPrefs()
{
char c;
USHORT i;
char keyword[KEYMAX+1];
short keyindex;
USHORT keyleng;
FILE *prefs;
char s[81];
char *s1, *s2, *s3;
if (!(prefs = fopen(PREFERENCES_FILE,"r"))) {
WriteConsole("I couldn't get your preferences.\n");
return;
}
while (fgets(s, 80, prefs)) {
if (*s == '#') continue;
WriteConsole(s);
s1 = s;
keyleng = 0;
while ((c = *s1++) && isalpha(c)) {
if (keyleng < KEYMAX) keyword[keyleng++] = tolower(c);
else {
badkey:
WriteConsole("Keyword error in preferences file.\n");
err:
goto done;
}
}
keyword[keyleng] = '\0';
for (keyindex = -1, i = 0; i < NKEYWORD; ++i) {
if (!strcmp(keyword, keywords[i])) {
keyindex = i; /* found it */
break;
}
}
if (keyindex < 0) goto badkey;
while (c == ' ') c = *s1++;
if (c != '=') {
badsyn:
WriteConsole("Syntax error in preferences file.\n");
goto done;
}
/* Get the parameter field, minus any leading or trailing
* blanks.
*/
while ((c = *s1) == ' ') ++s1; /* skip leading blanks */
/* Delete trailing blanks. */
s2 = s3 = s1;
while (c && c != '\n') {
if (c != ' ') s2 = s3; /* record non-blank end of string */
c = *s3++;
}
*s2 = '\0'; /* truncate the string here */
SetUserPref(keyindex, s1);
}
done:
fclose(prefs);
}
/* Save the current program settings in the user preferences file. */
PutUserPrefs()
{
WriteConsole("PutUserPrefs() is not implemented\n");
}
/* Set/Clear checkmarks according to the item being set. This routine
* is VERY application specific and assumes that the affected menu
* items are
* 1. grouped in pairs (on/off)
* 2. adjacent (item, item+1)
* 3. ordered in on, off order (Listing, No Listing)
*/
BOOL
SetMenuItem(item, value)
USHORT item; char *value;
{
BOOL boolean;
LONG excludebits, excludemask;
LONG menu1, menu2;
struct MenuItem *item1, *item2;
short i;
/* Get pointers and menu numbers for the affected items. */
menu1 = SHIFTITEM((long) item) | SHIFTMENU((long) MENU_FLAGS);
item1 = ItemAddress(&Titles[0], menu1);
menu2 = SHIFTITEM((long) item + 1) | SHIFTMENU((long) MENU_FLAGS);
item2 = ItemAddress(&Titles[0], menu2);
if (item1 == NULL || item2 == NULL) {
WriteConsole("Null menu item in SetMenuItem - call Mark!!\n");
return false;
}
boolean = ( tolower(*value) == 'y' );
if (boolean) { /* true? */
item1->Flags |= CHECKED;
item2->Flags &= ~CHECKED;
}
else { /* false */
item1->Flags &= ~CHECKED;
item2->Flags |= CHECKED;
}
return boolean;
}
void
SetStringGadget(gadget, value)
struct Gadget *gadget; char *value;
{
UBYTE *gs; /* pointer to gadget string */
RemoveGadget(pathwindow, gadget);
gs = (UBYTE *) GadgetString(gadget);
strcpy(gs, value);
ResetStringInfo(gadget->SpecialInfo);
AddGadget(pathwindow, gadget, -1L);
DoGadget(pathwindow, GADGETUP, gadget); /* simulate GADGETUP */
}
/* Set one user preference item.
* Called with:
* kw: keyword index
* parm: parameter string
*/
SetUserPref(kw, parm)
USHORT kw; char *parm;
{
switch (kw) {
case KW_HOME:
SetStringGadget(&homepathgad, parm);
break;
case KW_BACKUP:
SetStringGadget(&backpathgad, parm);
break;
case KW_LIST:
SetStringGadget(&listpathgad, parm);
break;
case KW_LISTING:
do_listing = SetMenuItem(ITEM_LIST, parm);
break;
case KW_EXCLUDE:
SetStringGadget(&excludepathgad, parm);
break;
case KW_COMPRESSION:
do_compress = SetMenuItem(ITEM_COMPRESS, parm);
break;
case KW_SPEECH:
do_speech = SetMenuItem(ITEM_SPEECH, parm);
break;
default:
break;
}
}
***EOF UserPrefs.c***
--
< Mark R. Rinfret, mrr@softie, ..rayssd!unisec!softie!mrr >
< SofTech, Inc. Home: 401-846-7639 >
< 1 Silva Lane, Work: 401-849-4174 >
< Middletown, RI 02840 "The name has changed but I'm still guilty." >