home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
500-599
/
ff583.lza
/
TplEdit
/
src.lzh
/
load.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-12-03
|
7KB
|
385 lines
/*
* LOAD.C
*/
#include "defs.h"
Prototype void LoadProject(char *);
Prototype void ScanProject(short, FILE *, long);
Prototype void ResolveLinks(void);
Prototype void UnResolveIDs(void);
Prototype void ResolveIDs(void);
/*********************** LoadProject(name) **************************/
void
LoadProject(name)
char *name;
{
FILE *fi;
UnResolveIDs();
if ((fi = fopen(name, "r")) == NULL)
{
printf("unable to open %s\n", name);
return;
}
ScanProject(0, fi, -1);
fclose(fi);
ResolveIDs();
}
/*********************** ScanProject(state, ************************/
void
ScanProject(state, fi, endOffset)
short state;
FILE *fi;
long endOffset;
{
ProjEntry pe;
long subEndOffset;
while (ftell(fi) != endOffset)
{
if (fread(&pe, sizeof(pe), 1, fi) != 1)
return;
subEndOffset = ftell(fi) + pe.pe_Len;
if (DDebug)
printf("TYPE %d ENDS %08lx\n", pe.pe_Type, subEndOffset);
switch (pe.pe_Type)
{
case PT_PROJECT:
ScanProject(pe.pe_Type, fi, subEndOffset);
ResolveLinks();
break;
case PT_HEADER:
fread(&Ph, pe.pe_Len, 1, fi);
break;
case PT_REGION:
if (CurRegion)
{
puts("ScanError: region in region!");
break;
}
CurRegion = AllocTplRegion();
ScanProject(pe.pe_Type, fi, subEndOffset);
/*
* Handle list copy if RGT_CYCLE XXX
*/
if (CurRegion->rg_Type == RGT_LISTVIEW ||
CurRegion->rg_Type == RGT_CYCLE ||
CurRegion->rg_Type == RGT_MX)
{
short cnt;
MaxNode *mn;
cnt = 0;
for (mn = GetHead(&CurRegion->rg_ListSet); mn; mn = GetSucc(mn))
++cnt;
CurRegion->rg_CycleAry = zalloc(sizeof(char *)* (cnt + 1));
cnt = 0;
for (mn = GetHead(&CurRegion->rg_ListSet); mn; mn = GetSucc(mn))
CurRegion->rg_CycleAry[cnt++] = mn->ln_Name;
}
CurRegion = NULL;
break;
case PT_NAME:
{
char *str;
if (pe.pe_Len >= sizeof(TmpBuf))
break;
fread(TmpBuf, pe.pe_Len, 1, fi);
TmpBuf[pe.pe_Len] = 0;
str = strdup(TmpBuf);
switch (state)
{
case PT_REGION:
CurRegion->rg_Node.ln_Name = str;
break;
case PT_TEXTATTR:
CurRegion->rg_TextAttr.ta_Name = str;
break;
case PT_DATABASE:
CurRegion->rg_DataBase = str;
break;
case PT_LISTREF:
CurRegion->rg_ListRef = str;
break;
case PT_LISTSET:
AddNode(&CurRegion->rg_ListSet, str, 0);
break;
case PT_DEFTEXT:
CurRegion->rg_DefText = str;
break;
case PT_LABTEXT:
CurRegion->rg_LabText = str;
break;
default:
free(str);
break;
}
}
break;
case PT_BOX:
{
Box box;
fread(&box, sizeof(box), 1, fi);
switch (state)
{
case PT_REGION:
CurRegion->rg_Box = box;
break;
default:
break;
}
}
break;
case PT_MINMAX:
{
Box box;
fread(&box, sizeof(box), 1, fi);
switch (state)
{
case PT_REGION:
CurRegion->rg_MinMax = box;
break;
default:
break;
}
}
break;
case PT_MAXBUFLEN:
if (state == PT_REGION)
{
long val;
fread(&val, sizeof(val), 1, fi);
CurRegion->rg_BufSpace = val;
}
break;
case PT_ID:
if (state == PT_REGION)
{
long val;
fread(&val, sizeof(val), 1, fi);
CurRegion->rg_Id = val;
}
break;
case PT_REGLL:
if (state == PT_REGION)
{
long val;
fread(&val, sizeof(val), 1, fi);
CurRegion->rg_LinkLeft = (TplRegion *) val;
}
break;
case PT_REGLR:
if (state == PT_REGION)
{
long val;
fread(&val, sizeof(val), 1, fi);
CurRegion->rg_LinkRight = (TplRegion *) val;
}
break;
case PT_REGLU:
if (state == PT_REGION)
{
long val;
fread(&val, sizeof(val), 1, fi);
CurRegion->rg_LinkUp = (TplRegion *) val;
}
break;
case PT_REGLD:
if (state == PT_REGION)
{
long val;
fread(&val, sizeof(val), 1, fi);
CurRegion->rg_LinkDown = (TplRegion *) val;
}
break;
case PT_LOCKTO:
if (state == PT_REGION)
{
long val;
fread(&val, sizeof(val), 1, fi);
CurRegion->rg_LockedTo = (TplRegion *) val;
}
break;
case PT_FLAGS:
if (state == PT_REGION)
{
long val;
fread(&val, sizeof(val), 1, fi);
CurRegion->rg_Flags = val;
}
break;
case PT_TYPE:
if (state == PT_REGION)
{
long val;
fread(&val, sizeof(val), 1, fi);
CurRegion->rg_Type = val;
if (DDebug)
printf("PT_TYPE VAL %d\n", val);
}
break;
case PT_EXCLID:
if (state == PT_REGION)
{
long val;
fread(&val, sizeof(val), 1, fi);
CurRegion->rg_ExclGroup = val;
}
break;
case PT_SPECFLAGS:
if (state == PT_REGION)
{
long val;
fread(&val, sizeof(val), 1, fi);
CurRegion->rg_SpecFlags = val;
if (DDebug)
printf("PT_ACTIVATED VAL %d\n", val);
}
break;
case PT_MAXVAL:
if (state == PT_REGION)
{
long val;
fread(&val, sizeof(val), 1, fi);
CurRegion->rg_MaxVal = val;
}
break;
case PT_DEFVAL:
if (state == PT_REGION)
{
long val;
fread(&val, sizeof(val), 1, fi);
CurRegion->rg_DefVal = val;
}
break;
case PT_DATABASE:
case PT_LISTREF:
case PT_LISTSET:
case PT_DEFTEXT:
case PT_LABTEXT:
case PT_TEXTATTR:
ScanProject(pe.pe_Type, fi, subEndOffset);
break;
case PT_YSIZE:
if (state == PT_TEXTATTR)
{
long val;
fread(&val, sizeof(val), 1, fi);
CurRegion->rg_TextAttr.ta_YSize = val;
}
break;
case PT_END:
return;
default:
break;
}
if (ftell(fi) != subEndOffset)
fseek(fi, subEndOffset, 0);
}
}
/*********************** ResolveLinks() ****************************/
void
ResolveLinks()
{
TplRegion *rg;
for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node))
{
if (DDebug)
printf("TG TYPE %d\n", rg->rg_Type);
rg->rg_LinkLeft = IdToRegion((long) rg->rg_LinkLeft);
rg->rg_LinkRight = IdToRegion((long) rg->rg_LinkRight);
rg->rg_LinkUp = IdToRegion((long) rg->rg_LinkUp);
rg->rg_LinkDown = IdToRegion((long) rg->rg_LinkDown);
rg->rg_LockedTo = IdToRegion((long) rg->rg_LockedTo);
}
}
/*********************** ResolveIDs() ******************************/
void
ResolveIDs()
{
TplRegion *rg;
for (IdNo = 0, rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node))
rg->rg_Id = ++IdNo;
}
/*********************** UnResolveIDs() ****************************/
void
UnResolveIDs()
{
TplRegion *rg;
for (IdNo = 0, rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node))
rg->rg_Id = 0;
}