home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * 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);
-
- 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();
- }
-
- 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_SELLIST || CurRegion->rg_Type == RGT_CYCLE) {
- 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_MaxBufLen = 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_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);
- }
- }
-
- 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);
- }
- }
-
- void
- ResolveIDs()
- {
- TplRegion *rg;
-
- for (IdNo = 0, rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
- rg->rg_Id = ++IdNo;
- }
- }
-
- void
- UnResolveIDs()
- {
- TplRegion *rg;
-
- for (IdNo = 0, rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
- rg->rg_Id = 0;
- }
- }
-
-