
/*
 *  SUBS.C
 */

#include "defs.h"

Prototype TplRegion *IdToRegion(long);
Prototype TplRegion *FindRegion(short, short);
Prototype TplRegion *FindRegionByGad(Gadget *);
Prototype void ClearLinks(TplRegion *);
Prototype long RegionToId(TplRegion *);
Prototype void *zalloc(long);
Prototype void DrawBox(Box *);
Prototype void FixBounds(Box *);
Prototype void AddNode(List *, char *, short);
Prototype int GetSaveFile(char *);

TplRegion *
IdToRegion(id)
long id;
{
    TplRegion *rg;

    for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
	if (rg->rg_Id == id)
	    break;
    }
    return(rg);
}

TplRegion *
FindRegion(x, y)
short x;
short y;
{
    TplRegion *rg;

    for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
	if (rg->rg_Box.bo_Xs - 2 <= x && x <= rg->rg_Box.bo_Xe + 2) {
	    if (rg->rg_Box.bo_Ys - 2 <= y && y <= rg->rg_Box.bo_Ye + 2)
		return(rg);
	}
    }
    return(NULL);
}

TplRegion *
FindRegionByGad(gad)
Gadget *gad;
{
    TplRegion *rg;

    for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
	if (rg->rg_Gad == gad)
	    return(rg);
    }
    return(NULL);
}



long
RegionToId(rg)
TplRegion *rg;
{
    if (rg)
	return(rg->rg_Id);
    return(0);
}

void *
zalloc(bytes)
long bytes;
{
    void *ptr;

    if (ptr = malloc(bytes)) {
	clrmem(ptr, bytes);
	return(ptr);
    }
    puts("No Memory!");
    exit(30);
}

void
DrawBox(box)
Box *box;
{
    RastPort *rp = Win->RPort;

    SetDrMd(rp, COMPLEMENT);
    Move(rp, box->bo_Xs, box->bo_Ys);
    Draw(rp, box->bo_Xe, box->bo_Ys);
    Draw(rp, box->bo_Xe, box->bo_Ye);
    Draw(rp, box->bo_Xs, box->bo_Ye);
    Draw(rp, box->bo_Xs, box->bo_Ys);
}

void
FixBounds(box)
Box *box;
{
    long t;

    if (box->bo_Xe < box->bo_Xs) {
	t = box->bo_Xe;
	box->bo_Xe = box->bo_Xs;
	box->bo_Xs = t;
    }
    if (box->bo_Ye < box->bo_Ys) {
	t = box->bo_Ye;
	box->bo_Ye = box->bo_Ys;
	box->bo_Ys = t;
    }
}

void
AddNode(list, str, alloc)
List *list;
char *str;
short alloc;
{
    MaxNode *node = zalloc(sizeof(MaxNode));
    node->ln_Name = (alloc) ? strdup(str) : str;
    AddTail((MaxList *)list, node);
}

int
GetSaveFile(buf)
char *buf;
{
    FileRequester *freq;
    int r = -1;

    if (freq = AllocFileRequest()) {
	if (RequestFile(freq)) {
	    short i = strlen(freq->rf_Dir) - 1;
	    strcpy(buf, freq->rf_Dir);
	    if (i >= 0 && buf[i] != '/' && buf[i] != ':')
		strcat(buf, "/");
	    strcat(buf, freq->rf_File);
	    r = 0;
	}
	FreeFileRequest(freq);
    }
    return(r);
}

void
ClearLinks(rn)
TplRegion *rn;
{
    TplRegion *rg;

    for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
	if (rn == rg->rg_LinkLeft)
	    rg->rg_LinkLeft = NULL;
	if (rn == rg->rg_LinkRight)
	    rg->rg_LinkRight = NULL;
	if (rn == rg->rg_LinkUp)
	    rg->rg_LinkUp = NULL;
	if (rn == rg->rg_LinkDown)
	    rg->rg_LinkDown = NULL;
	if (rn == rg->rg_LockedTo)
	    rg->rg_LockedTo = NULL;
    }
}

