Example #1
0
   GMC_DCL(tp_FilTyp, ToFilTyp)
{
   tp_DrvPth DrvPth;

   if (FilHdr == ERROR || InhFilPrm == ERROR || ToFilTyp == ERROR) {
      Ret_FilHdr(FilHdr);
      return ERROR; }/*if*/;

   if (FilHdr_FilTyp(FilHdr) == ToFilTyp) {
      if (PrecFilPrm != RootFilPrm) {
	 Do_Log("Ignoring parameters of", FilHdr, LOGLEVEL_IgnorePrm); }/*if*/;
      return FilHdr; }/*if*/;

   DrvPth = Get_DrvPth(FilHdr, ToFilTyp);
   if (DrvPth == ERROR) {
      SystemError("Cannot derive to <%s> from <%s>\n",
		  FilTyp_FTName(ToFilTyp),
		  FilTyp_FTName(FilHdr_FilTyp(FilHdr)));
      Ret_FilHdr(FilHdr);
      return ERROR; }/*if*/;
   FilHdr = Do_DrvPth(FilHdr, InhFilPrm, PrecFilPrm, DrvPth);
   Ret_DrvPth(DrvPth);

   return FilHdr;
   }/*Do_Deriv*/
Example #2
0
   GMC_DCL(tp_FilHdr, FilHdr)
{
   tp_FilHdr DestElmFH, OrigElmFH;
   tp_LocElm LocElm;
   tp_FilElm FilElm;
   tps_Str StrBuf;

   if (FilHdr_Flag(OrigFilHdr, FLAG_Union)) {
      return; }/*if*/;
   Set_Flag(OrigFilHdr, FLAG_Union);

   if (!IsRef(OrigFilHdr)) {
      DestElmFH = Copy_FilHdr(DestFilHdr);
      DestElmFH = Do_Key(DestElmFH, FilHdr_Label(StrBuf, OrigFilHdr, FALSE));
      LocElm = Make_CopyLocElm(OrigFilHdr, DestElmFH, FilHdr);
      Chain_LocElms(FirstLEPtr, LastLEPtr, LocElm);
      Ret_FilHdr(DestElmFH);
      return; }/*if*/;

   for (FilElm = LocElm_FilElm(FilHdr_LocElm(OrigFilHdr));
	FilElm != NIL;
	FilElm = FilElm_NextFilElm(FilElm)) {
      OrigElmFH = FilElm_FilHdr(FilElm);
      Get_CopyList(FirstLEPtr, LastLEPtr, OrigElmFH, DestFilHdr, FilHdr);
      Ret_FilHdr(OrigElmFH); }/*for*/;
   }/*Get_CopyList*/
Example #3
0
   GMC_DCL(tp_FilHdr, ListFilHdr)
{
   tp_FilHdr ElmFilHdr;
   tp_LocElm LocElm;
   tp_FilElm FilElm;

   if (IsViewSpec(FilHdr)) {
      FilHdr_Error("Illegal view specification argument: %s\n", FilHdr);
      return; }/*if*/;

   if (FilHdr_Flag(FilHdr, FLAG_Union)) {
      return; }/*if*/;
   Set_Flag(FilHdr, FLAG_Union);

   if (!IsRef(FilHdr)) {
      ElmFilHdr = Do_Deriv(Copy_FilHdr(FilHdr), RootFilPrm, FilPrm, FilTyp);
      /*select*/{
	 if (ElmFilHdr != ERROR) {
	    LocElm = Make_LocElm(ElmFilHdr, RootFilPrm, ListFilHdr);
	    Chain_LocElms(FirstLEPtr, LastLEPtr, LocElm);
	    Ret_FilHdr(ElmFilHdr);
	 }else{
	    FilHdr_Error(" from:\n   %s.\n", FilHdr); };}/*select*/;
      return; }/*if*/;

   for (FilElm = LocElm_FilElm(FilHdr_LocElm(FilHdr));
	FilElm != NIL;
	FilElm = FilElm_NextFilElm(FilElm)) {
      ElmFilHdr = FilElm_FilHdr(FilElm);
      Get_Map(FirstLEPtr, LastLEPtr, ElmFilHdr,
	      Append_FilPrm(FilElm_FilPrm(FilElm), FilPrm),
	      FilTyp, ListFilHdr);
      Ret_FilHdr(ElmFilHdr); }/*for*/;
   }/*Get_Map*/
Example #4
0
   GMC_DCL(boolean, IgnoreStatus)
{
   tp_FilPrm FilPrm;
   tp_FilElm FilElm;

   *FilHdrPtr = (tp_FilHdr)NIL;
   *FilPrmPtr = (tp_FilPrm)NIL;
   if (FilHdr == ERROR) {
      return; }/*if*/;
   if (FilHdr_Flag(FilHdr, FLAG_DeRef)) {
      FilHdr_Error("<%s> is circular.\n", FilHdr);
      Ret_FilHdr(FilHdr);
      return; }/*if*/;
   if (!(IsPntr(FilHdr)
	 && (FilHdr_Status(FilHdr) > STAT_Error || IgnoreStatus))) {
      *FilHdrPtr = FilHdr;
      *FilPrmPtr = RootFilPrm;
      return; }/*if*/;
   FilElm = LocElm_FilElm(FilHdr_LocElm(FilHdr));
   if (IgnoreStatus && FilElm == NIL) {
      Ret_FilHdr(FilHdr);
      return; }/*if*/;
   FORBIDDEN(!IgnoreStatus && (FilElm == NIL || FilElm_Next(FilElm) != NIL));
   *FilHdrPtr = FilElm_FilHdr(FilElm);
   FilPrm = FilElm_FilPrm(FilElm);
   Ret_FilElm(FilElm);
   Set_Flag(FilHdr, FLAG_DeRef);
   Deref_Pntrs(FilHdrPtr, FilPrmPtr, *FilHdrPtr, IgnoreStatus);
   Clr_Flag(FilHdr, FLAG_DeRef);
   *FilPrmPtr = Append_FilPrm(*FilPrmPtr, FilPrm);
   Ret_FilHdr(FilHdr);
   }/*Deref_Pntrs*/
Example #5
0
   GMC_DCL(tp_DrvPth, DrvPth)
{
   tp_DrvPth DrvPthElm, GroupingDrvPthElm;
   tp_FilTyp FilTyp;
   tp_FKind FKind;
   tp_FilPrm FilPrm, DrvFilPrm;
   tp_PrmTypLst PrmTypLst;
   tps_FileName PkgDirName;
   boolean NoInput_Flag=FALSE;

   FORBIDDEN(DrvPth == ERROR);
   if (FilHdr == ERROR || InhFilPrm == ERROR || PrecFilPrm == ERROR) {
      Ret_FilHdr(FilHdr);
      return ERROR; }/*if*/;

   FilPrm = Append_FilPrm(PrecFilPrm, InhFilPrm);
   GroupingDrvPthElm = (PrecFilPrm == RootFilPrm ? NIL
			: Find_GroupingDrvPthElm(DrvPth));
   for (DrvPthElm = DrvPth;
	DrvPthElm != NIL;
	DrvPthElm = DrvPth_Next(DrvPthElm)) {
      switch (DrvPth_DPType(DrvPthElm)) {
	 case DPT_Drv: {
	    FilTyp = DrvPth_FilTyp(DrvPthElm);
	    FKind = DrvPth_FKind(DrvPthElm);
	    PrmTypLst = DrvPth_PrmTypLst(DrvPthElm);
	    /*select*/{
	       if (IsGroupingInput_FilTyp(FilTyp)) {
		  DrvFilPrm = FilPrm;
	       }else if (DrvPthElm == GroupingDrvPthElm) {
		  DrvFilPrm = Strip_FilPrm(InhFilPrm, PrmTypLst);
		  DrvFilPrm = Append_FilPrm(PrecFilPrm, DrvFilPrm);
	       }else{
		  DrvFilPrm = Strip_FilPrm(FilPrm, PrmTypLst); };}/*select*/;
	    if (NoInput_Flag) {
	       FORBIDDEN(FilHdr != ERROR);
	       Get_PkgDirName(PkgDirName,
			      Tool_Package(FilTyp_Tool(FilTyp)));
	       FilHdr = HostFN_FilHdr(PkgDirName);
	       NoInput_Flag = FALSE; }/*if*/;
	    FilHdr = Get_Drv(FilHdr, FKind, FilTyp, DrvFilPrm, DfltIdent);
	    break;}/*case*/;
	 case DPT_Eqv: {
	    if (DrvPth_FilTyp(DrvPthElm) == NoInputFilTyp) {
	       Ret_FilHdr(FilHdr);
	       FilHdr = ERROR;
	       NoInput_Flag = TRUE; }/*if*/; break;}/*case*/;
	 }/*switch*/; }/*for*/;
   return FilHdr;
   }/*Do_DrvPth*/
Example #6
0
   GMC_DCL(tp_FileName, FileName)
{
   tp_FilHdr FilHdr, SymLinkFH;

   FilHdr = OdinExpr_FilHdr(FileName);
   if (FilHdr == ERROR) {
      return; }/*if*/;
   if (IsSource(FilHdr)) {
      SymLinkFH = Deref_SymLink(Copy_FilHdr(FilHdr));
      Set_Status(SymLinkFH, STAT_Unknown);
      Ret_FilHdr(SymLinkFH);
      Update_SrcFilHdr(FilHdr, FALSE); }/*if*/;
   Ret_FilHdr(FilHdr);
   }/*Local_Test*/
Example #7
0
   GMC_DCL(tp_FilTyp, ToFilTyp)
{
   tp_DrvPth DrvPth, GenericDrvPth;
   boolean IsGeneric;
   tp_FilHdr GenericFilHdr, TmpGenericFilHdr;

   if (FilHdr == ERROR || ToFilTyp == ERROR) return ERROR;

   Do_Search(&DrvPth, &IsGeneric,
	     FilHdr_FKind(FilHdr), FilHdr_FilTyp(FilHdr), ToFilTyp);

   if (IsGeneric) {
      GenericFilHdr = Copy_FilHdr(FilHdr);
      GenericDrvPth = DrvPth;
      while (IsGeneric) {
	 TmpGenericFilHdr = GenericFilHdr;
	 GenericFilHdr = Do_DrvPth(GenericFilHdr, RootFilPrm, RootFilPrm, GenericDrvPth);
	 IsGeneric = FALSE;
	 /*select*/{
	    if (GenericFilHdr == TmpGenericFilHdr) {
	       GenericDrvPth = NIL;
	    }else if (FilHdr_FilTyp(GenericFilHdr) != ToFilTyp) {
	       Do_Search(&GenericDrvPth, &IsGeneric,
			 FilHdr_FKind(GenericFilHdr),
			 FilHdr_FilTyp(GenericFilHdr), ToFilTyp);
	       AppendDrvPth(&DrvPth, GenericDrvPth); };}/*select*/; }/*while*/;
      Ret_FilHdr(GenericFilHdr);
      if (GenericDrvPth == NIL) {
	 Ret_DrvPth(DrvPth);
	 DrvPth = NIL; }/*if*/; }/*if*/;
   return DrvPth;
   }/*Get_DrvPth*/
Example #8
0
   GMC_DCL(tp_FilPrm, FilPrm)
{
   tp_FilHdr ValFilHdr;
   tp_FilTyp FilTyp;
   tp_DrvPth DrvPth, DrvPthElm;
   tp_PrmTypLst PrmTypLst;

   Writeln(FilDsc, "*?* Possible Parameters :");
   Clr_PrmTypMarks();
   if (FilPrm == RootFilPrm) {
      SetFilHdr_PrmTypMarks(FilHdr);
      WriteMarkedPrmTyps(FilDsc);
      return; }/*if*/;

   ValFilHdr = LocHdr_FilHdr(FilPVal_LocHdr(FilPrm_FilPVal(FilPrm)));
   FilTyp = FTName_FilTyp(FilHdr_Ident(ValFilHdr));
   Ret_FilHdr(ValFilHdr);
   if (FilTyp == ERROR) {
      return; }/*if*/;
   if (FilHdr_FilTyp(FilHdr) != FilTyp) {
      DrvPth = Get_DrvPth(FilHdr, FilTyp);
      if (DrvPth == ERROR) {
	 SystemError("Cannot derive to <%s>\n", FilTyp_FTName(FilTyp));
	 return; }/*if*/;
      for (DrvPthElm = DrvPth;
	   DrvPthElm != NIL;
	   DrvPthElm = DrvPth_Next(DrvPthElm)) {
	 if (DrvPth_DPType(DrvPthElm) == DPT_Drv) {
	    PrmTypLst = DrvPth_PrmTypLst(DrvPthElm);
	    SetPrmTypLst_Marks(PrmTypLst); }/*if*/; }/*for*/;
      Ret_DrvPth(DrvPth); }/*if*/;
   WriteMarkedPrmTyps(FilDsc);
   }/*WritePrmHelp*/
Example #9
0
   GMC_DCL(tp_PrmTyp, PrmTyp)
{
   tp_PrmFHdr PrmFHdr;
   tp_FilHdr FilHdr;
   tp_FilPrm FilPrm;
   tp_LocHdr LocHdr;

   if (Nod == ERROR || PrmTyp == ERROR) {
      return ERROR; }/*if*/;

   switch (Nod_NodTyp(Nod)) {
      case DRVFIL: {
	 PrmFHdr = Nod_PrmFHdr(Nod);
	 Use_PrmFHdr(&FilHdr, &FilPrm, PrmFHdr);
	 break;}/*case*/;
      case WORD: {
	 FilHdr = Str_FilHdr(Sym_Str(Nod_Sym(Nod)), PrmTyp);
	 break;}/*case*/;
      default: {
	 FATALERROR("illegal parameter value node"); };}/*select*/;
   if (FilHdr == ERROR) {
      return ERROR; }/*if*/;
   LocHdr = FilHdr_LocHdr(FilHdr);
   Ret_FilHdr(FilHdr);
   return LocHdr;
   }/*PrmValNod_LocHdr*/
Example #10
0
void
End_Get_OdinFile(GMC_ARG_VOID)
{
   tp_FilHdr FilHdr;
   tps_FileName FileName;
   tp_Status Status;
   boolean ExecFlag, NeedsData;

   FORBIDDEN(Client_ToDo(CurrentClient) != NIL);
   FORBIDDEN(Client_Job(CurrentClient) != NIL);
   FilHdr = Client_FilHdr(CurrentClient);
   FORBIDDEN(FilHdr == NIL);
   ExecFlag = IsAutoExec(FilHdr);
   NeedsData = ExecFlag || Client_NeedsData(CurrentClient);
   Set_Client_FilHdr(CurrentClient, (tp_FilHdr)NIL, FALSE);
   (void)strcpy(FileName, "");
   Status = STAT_Unknown;
   if (Client_Interrupted(CurrentClient)) {
      Set_Client_Interrupted(CurrentClient, FALSE);
      goto done; }/*if*/;
   FilHdr = Deref(FilHdr);
   if (FilHdr == ERROR) {
      goto done; }/*if*/;
   Status = FilHdr_MinStatus(FilHdr, IK_Trans);
   if (IsList(FilHdr)) {
      goto done; }/*if*/;
   if (NeedsData) {
      FilHdr_DataFileName(FileName, FilHdr); }/*if*/;

done:;
   LocalEnd_Get_OdinFile(FileName, Status, ExecFlag);
   Ret_FilHdr(FilHdr);
   }/*End_Get_OdinFile*/
Example #11
0
   GMC_DCL(tp_FilHdr, FilHdr)
{
   tp_FilPVal FilPVal;

   FilPVal = Get_FilPVal(FilHdr_FilPrm(FilHdr), CopyDestPrmTyp);
   Ret_FilHdr(FilHdr);
   return LocHdr_FilHdr(FilPVal_LocHdr(FilPVal));
   }/*Get_Copy_DestFilHdr*/
Example #12
0
   GMC_DCL(tp_FilHdr, FilHdr)
{
   tp_FilHdr ElmFilHdr;
   tp_FilPrm ElmFilPrm;
   tp_LocElm LocElm;

   ElmFilHdr = Copy_FilHdr(OrigFilHdr);
   ElmFilPrm = Append_PrmInf(RootFilPrm, CopyDestPrmTyp,
			     FilHdr_LocHdr(DestFilHdr), (tp_LocPVal)NIL);
   ElmFilHdr = Do_Deriv(ElmFilHdr, RootFilPrm, ElmFilPrm, CopyFilTyp);
   LocElm = Make_LocElm(ElmFilHdr, RootFilPrm, FilHdr);
   Ret_FilHdr(ElmFilHdr);
   return LocElm;
   }/*Make_CopyLocElm*/
Example #13
0
   GMC_DCL(tp_FilHdr, FilHdr)
{
   size_t sz;
   tp_FilHdr OutFilHdr;
   tp_FTName FTName;

   OutFilHdr = Copy_FilHdr(FilHdr);
   if (IsInstance(OutFilHdr)) OutFilHdr = FilHdr_Father(OutFilHdr);
   FTName = FilTyp_ShortFTName(FilHdr_FilTyp(OutFilHdr));
   sz = snprintf(WorkFileName, MAX_FileName, "%s/%s", Job->JobDirName, FTName);
   if (sz >= MAX_FileName) {
      (void)fprintf(stderr, "File name too long (MAX_FileName=%d): %s/%s\n",
		  MAX_FileName, Job->JobDirName, FTName);
      exit(11); }/*if*/;
   Ret_FilHdr(OutFilHdr);
   }/*Get_WorkFileName*/
Example #14
0
void
Local_Test_All(GMC_ARG_VOID)
{
   tp_Client OldCurrentClient;
   tp_FilHdr FilHdr;
   boolean AllDone;

   CurrentDate += 1;
   VerifyDate = CurrentDate;
   OldCurrentClient = CurrentClient;
   FOREACH_CLIENT(CurrentClient) {
      FilHdr = Client_FilHdr(CurrentClient);
      if (FilHdr != NIL) {
	 Ret_ToDo();
	 Push_AllReqs(&AllDone);
	 Ret_FilHdr(FilHdr); }/*if*/; }/*for*/;
   CurrentClient = OldCurrentClient;
   }/*Local_Test_All*/
Example #15
0
   GMC_DCL(tp_FileName, OprFileName)
{
   tps_Str StrBuf, StrSegBuf;
   tp_Str Str;
   tp_FilDsc FilDsc;
   int StrLen, LineNum;
   tp_Nod Nod;
   tp_PrmFHdr PrmFHdr;
   tp_FilPrm FilPrm, ElmFilPrm;
   tp_FilHdr ElmFilHdr;
   tp_LocElm LocElm;

   LocElm = NIL;
   FilDsc = FileName_RFilDsc(OprFileName, FALSE);
   if (FilDsc == ERROR) {
      SystemError("Cannot read %s.\n", OprFileName);
      return LocElm; }/*if*/;
   (void)strcpy(StrBuf, ".");
   StrLen = strlen(StrBuf);
   for (Str = ReadLine(StrSegBuf, FilDsc);
	Str != NIL;
	Str = ReadLine(StrSegBuf, FilDsc)) {
      (void)strcat(Str, "\n");
      StrLen += strlen(Str);
      if (StrLen >= MAX_Str) {
	 SystemError("%s: parameter file too long.\n", OprFileName);
	 return LocElm; }/*if*/;
      (void)strcat(StrBuf, Str); }/*for*/;
   Close(FilDsc);
   LineNum = 0;
   Nod = YY_Parser(StrBuf, OprFileName, &LineNum);
   if (Nod == ERROR) {
      return LocElm; }/*if*/;
   FilPrm = StripExcept_FilPrm(FilHdr_FilPrm(FilHdr), ApplyPrmTyp);
   PrmFHdr = Apply_OprNods(Copy_FilHdr(InFilHdr), FilPrm,
			   Nod_Brother(Nod_Son(1, Nod)));
   Ret_Nod(Nod);
   Use_PrmFHdr(&ElmFilHdr, &ElmFilPrm, PrmFHdr);
   if (ElmFilHdr == NIL) {
      return LocElm; }/*if*/;
   LocElm = Make_LocElm(ElmFilHdr, ElmFilPrm, FilHdr);
   Ret_FilHdr(ElmFilHdr);
   return LocElm;
   }/*Make_ApplyLocElm*/
Example #16
0
   GMC_DCL(int, Status)
{
   tp_Client Client;

   if (IsServer) {
      Do_ToBroadcast();
      IPC_Finish();
      CleanUp();
      FOREACH_CLIENT(Client) {
	 if (!Is_LocalClient(Client)) {
	    Ret_Client(Client); }/*if*/; }/*for*/;
      Purge_Clients();
      FORBIDDEN(!Is_LocalClient(CurrentClient));
      Ret_Client(CurrentClient);
      Purge_Clients();
      Ret_FilHdr(RootFilHdr);
      Ret_FilHdr(NetRootFilHdr);
      Ret_FilHdr(OdinDirFilHdr);
      Ret_FilHdr(CacheDirFilHdr);
      Ret_FilHdr(PrmDataDirFilHdr);
      Ret_FilHdr(StrDirFilHdr);
      Ret_FilHdr(NilStrFilHdr);
      Ret_FilHdr(FlagPrmFilHdr);
      Ret_FilHdr(EmptyFilHdr);
      Update_Info();
      RetAbsPaths();
      Free_FilHdrs();
      Free_FilInps();
      Free_FilElms();
      Close_Info();
      FORBIDDEN(PrmFHdrs_InUse());
      FORBIDDEN(FilHdrs_InUse());
      FORBIDDEN(FilInps_InUse());
      FORBIDDEN(FilElms_InUse()); }/*if*/;
   exit(Status);
   }/*Exit*/
Example #17
0
   GMC_DCL(boolean, NeedsData)
{
   tp_Nod Root;
   tp_PrmFHdr PrmFHdr;
   tp_FilHdr FilHdr;
   tp_FilPrm FilPrm;
   boolean AllDone;

   Root = YY_Parser(OdinExpr, (tp_FileName)NIL, (int *)NIL);
   FORBIDDEN(Root == ERROR);
   PrmFHdr = Nod_PrmFHdr(Root);
   Ret_Nod(Root);
   Use_PrmFHdr(&FilHdr, &FilPrm, PrmFHdr);
   if (FilHdr == ERROR) {
      LocalEnd_Get_OdinFile("", STAT_Unknown, FALSE);
      return; }/*if*/;
   Set_Client_FilHdr(CurrentClient, FilHdr, NeedsData);
   Push_AllReqs(&AllDone);
   Ret_FilHdr(FilHdr);
   IsAny_ReadyServerAction = TRUE;
   }/*Local_Get_OdinFile*/
Example #18
0
void
Write_ENV2(GMC_ARG_VOID)
{
   tps_FileName FileName;
   tp_FilDsc FilDsc;
   tp_Str Str;
   tps_Str StrBuf;
   tp_EnvVar EnvVar;
   int i;
   tp_FilHdr FilHdr;
   size_t sz;

   sz = snprintf(FileName, MAX_FileName, "%s/ENV2", OdinDirName);
   if (sz >= MAX_FileName) {
      (void)fprintf(stderr, "File name too long (MAX_FileName=%d): %s/ENV2\n",
		  MAX_FileName, OdinDirName);
      exit(1); }/*if*/;
   FilDsc = FileName_WFilDsc(FileName, FALSE);
   if (FilDsc == ERROR) {
      SystemError("Cannot open ENV2 file.\n");
      exit(1); }/*if*/;
   for (i=0; i<num_EnvVarS; i+=1) {
      EnvVar = &EnvVarS[i];
      if (EnvVar->IsFile) {
	 Str = GetEnv(EnvVar->Name);
	 FORBIDDEN(Str == NIL);
	 FilHdr = OdinExpr_FilHdr(Str);
	 if (FilHdr == ERROR) {
	    SystemError("Value of $%s is not a legal Odin expression.\n",
			EnvVar->Name);
	    exit(1); }/*if*/;
	 FilHdr_DataFileName(StrBuf, FilHdr);
	 Ret_FilHdr(FilHdr);
	 (void)fprintf((FILE *)FilDsc, "%s=%s\1\n", EnvVar->Name, StrBuf);
	 }/*if*/; }/*for*/;
   Close(FilDsc);
   }/*Write_ENV2*/
Example #19
0
   GMC_DCL(tp_Key, Key)
{
   tp_FilHdr DirFilHdr, DirSymFilHdr, SymDirFilHdr;
   tp_FilTyp FilTyp;
   tp_FKind FKind;

   if (FilHdr == ERROR || Key == ERROR) {
      Ret_FilHdr(FilHdr);
      return ERROR; }/*if*/;

   if (strcmp(Key, ".") == 0) {
      return FilHdr; }/*if*/;

   if (strcmp(Key, "") == 0
       && !(FilHdr == RootFilHdr || FilHdr == NetRootFilHdr)) {
      return FilHdr; }/*if*/;

   if (IsSource(FilHdr)) {
      if (strcmp(Key, "..") == 0) {
	 if (FilHdr == RootFilHdr) {
	    return FilHdr; }/*if*/;
	 DirFilHdr = FilHdr_Father(Copy_FilHdr(FilHdr));
	 if (DirFilHdr == NetRootFilHdr) {
	    Ret_FilHdr(DirFilHdr);
	    return FilHdr; }/*if*/;
	 DirSymFilHdr = FilHdr_Father(Deref_SymLink(Copy_FilHdr(FilHdr)));
	 SymDirFilHdr = Deref_SymLink(Copy_FilHdr(DirFilHdr));
	 Ret_FilHdr(FilHdr);
	 if (DirSymFilHdr == SymDirFilHdr) {
	    Ret_FilHdr(DirSymFilHdr); Ret_FilHdr(SymDirFilHdr);
	    return DirFilHdr; }/*if*/;
	 Ret_FilHdr(DirFilHdr); Ret_FilHdr(SymDirFilHdr);
	 return FilHdr_AliasFilHdr(DirSymFilHdr); }/*if*/;

      if (FilHdr == CacheDirFilHdr) {
	 if (strlen(Key) == 1) {
	    return FilHdr; }/*if*/;
	 Ret_FilHdr(FilHdr);
	 return CacheFileName_FilHdr(Key); }/*if*/;

      return Get_KeyDrv(FilHdr, FK_SrcReg, Key); }/*if*/;

   if (IsVirDir(FilHdr)) {
      return Get_KeyDrv(FilHdr, FK_VirDirElm, Key); }/*if*/;

   if (IsTargets(FilHdr)) {
      return Get_KeyDrv(FilHdr, FK_ActTgtText, Key); }/*if*/;

   if (IsPntr(FilHdr)) {
      return Get_Drv(FilHdr, FK_PntrElm, Key_FilTyp(Key), RootFilPrm, Key);
      }/*if*/;

   if (IsDrvDirElm(FilHdr)) {
      return Get_KeyDrv(FilHdr, FK_DrvDirElm, Key); }/*if*/;

   if (!IsKeyList(FilHdr)) {
      FilHdr_Error("Cannot select from <%s>.\n", FilHdr);
      Ret_FilHdr(FilHdr);
      return ERROR; }/*if*/;

   FilTyp = FilHdr_FilTyp(FilHdr);
   /*select*/{
      if (FilTyp == ActTargetsFilTyp) {
	 FKind = FK_ActTgt;
      }else if (FilTyp == VirTargetsFilTyp) {
	 FKind = FK_VirTgt;
      }else{
         FKind = FK_DrvDirElm; };}/*select*/;
   return Get_KeyDrv(FilHdr, FKind, Key);
   }/*Do_Key*/
Example #20
0
   GMC_DCL(tp_Nod, OprNod)
{
   tp_Nod ElmNod;
   tp_NodTyp NodTyp;
   tp_FilTyp FilTyp;
   tp_LocHdr LocHdr;
   tp_LocPVal LocPVal;

   if (FilHdr == ERROR || FilPrm == ERROR) return ERROR;

   while (OprNod != NIL) {
      NodTyp = Nod_NodTyp(OprNod);
      switch (NodTyp) {
	 case PRMOPR: {
	    FilPrm = Append_PrmNod(FilPrm, OprNod);
	    if (FilPrm == ERROR) {
	       Ret_FilHdr(FilHdr);
	       return ERROR; }/*if*/;
	    break;}/*case*/;
	 case APLOPR: {
	    LocHdr = PrmValNod_LocHdr(Nod_Son(1, OprNod), ApplyPrmTyp);
	    if (LocHdr == ERROR) {
	       Ret_FilHdr(FilHdr);
	       return ERROR; }/*if*/;
	    LocPVal = NIL;
	    FilPrm = Append_PrmInf(FilPrm, ApplyPrmTyp, LocHdr, LocPVal);
	    FilHdr = Extend_FilHdr(FilHdr, FK_User, ApplyFilTyp, FilPrm,
				   DfltIdent);
	    FilPrm = RootFilPrm;
	    if (FilHdr == ERROR) {
	       return ERROR; }/*if*/;
	    break;}/*case*/;
	 case DRVOPR: {
	    FilTyp = Nod_FilTyp(Nod_Son(1, OprNod));
	    /*select*/{
	       if (FilTyp == ObjectFilTyp) {
	       }else if (FilTyp == FatherFilTyp) {
		  if (!IsInstance(FilHdr)) {
		     FilHdr_Error("Input to :abstract must be an instance: %s\n", FilHdr);
		     Ret_FilHdr(FilHdr);
		     return ERROR; }/*if*/;
		  FilHdr = FilHdr_Father(FilHdr);
	       }else{
		  FilHdr = Do_Deriv(FilHdr, RootFilPrm, FilPrm, FilTyp);
		  FilPrm = RootFilPrm;
		  if (FilHdr == ERROR) {
		     return ERROR; }/*if*/; };}/*select*/;
	    break;}/*case*/;
	 case HODOPR: {
	    FilTyp = Nod_FilTyp(OprNod);
	    FilHdr = Do_Deriv(FilHdr, RootFilPrm, FilPrm, FilTyp);
	    if (FilHdr == ERROR) {
	       return ERROR; }/*if*/;
	    FilPrm = RootFilPrm;
	    break;}/*case*/;
	 case ELMOPR: {
	    ElmNod = Nod_Son(1, OprNod);
	    FilPrm = RootFilPrm;
	    FilHdr = Do_Key(FilHdr, "");
	    FilHdr = Do_Keys(FilHdr, Sym_Str(Nod_Sym(ElmNod)));
	    if (FilHdr == ERROR) {
	       return ERROR; }/*if*/;
	    break;}/*case*/;
	 case DIROPR: {
	    FilHdr = Do_Key(FilHdr, "");
	    break;}/*case*/;
	 case SEGOPR: {
	    FilHdr = Do_VTgt(FilHdr, Sym_Str(Nod_Sym(Nod_Son(1, OprNod))));
	    FilPrm = RootFilPrm;
	    break;}/*case*/;
	 default: {
	    FATALERROR("bad operator node type"); };}/*switch*/;
      OprNod = Nod_Brother(OprNod); }/*while*/;

   return New_PrmFHdr(FilHdr, FilPrm);
   }/*Apply_OprNods*/
Example #21
0
   GMC_DCL(tp_Date, DepModDate)
{
   tps_ExecSpc _ExecSpc; tp_ExecSpc ExecSpc = &_ExecSpc;
   tp_Job Job;
   tp_Tool Tool;
   tp_TClass TClass;
   tp_InpFilHdrs Inputs;
   tp_OutFilHdrs Outputs;
   tp_FileName OldErrFileName;
   tp_FilDsc OldErrFD;
   tps_FileName InFileName, OutFileName;
   tps_Str StrBuf;
   tp_FilDsc InFD, OutFD;
   tp_Status MinStatus;
   tp_FilHdr ElmFilHdr, DestFilHdr, OprFilHdr;
   tp_LocElm LocElm, FirstLE, LastLE;
   tp_FilElm FilElm;
   int i;
   boolean ErrFlag, OldIsIPC;

   Do_Log("Generating", FilHdr, LOGLEVEL_IntGenerate);
   MinStatus = DepStatus;

   Tool = FilHdr_Tool(FilHdr);
   FilHdr_ExecSpc(ExecSpc, FilHdr);
   Job = New_Job();
   ExecSpc->Job = Job;
   Inputs = ExecSpc->InpFilHdrs;
   Outputs = ExecSpc->OutFilHdrs;

   Save_ErrFile(&OldErrFileName, &OldIsIPC, &OldErrFD);
   Set_ErrFile(Job->ErrorFN, FALSE, (tp_FilDsc)NIL);
   Clr_ErrStatus(FilHdr);

   TClass = Tool_TClass(Tool);
   switch (TClass) {
      case TC_Str: {
	 break;}/*case*/;
      case TC_StructMem: {
	 FATALERROR("StructMem's should always be up-to-date");
	 break;}/*case*/;
      case TC_PrmValues: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 FirstLE = NIL; LastLE = NIL;
	 FilPVal_LocElm(&FirstLE, &LastLE,
			FilPrm_FilPVal(FilHdr_FilPrm(FilHdr)), FilHdr);
	 Set_LocElm(FilHdr, FirstLE);
	 break;}/*case*/;
      case TC_First: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 /*select*/{
	    if (FilHdr_LocElm(Inputs[0]) == 0) {
	       LocElm = Make_LocElm(NilStrFilHdr, RootFilPrm, FilHdr);
	    }else{
	       FilElm = LocElm_FilElm(FilHdr_LocElm(Inputs[0]));
	       ElmFilHdr = FilElm_FilHdr(FilElm);
	       Ret_FilElm(FilElm);
	       LocElm = Make_LocElm(ElmFilHdr, RootFilPrm, FilHdr);
	       Ret_FilHdr(ElmFilHdr); };}/*select*/;
	 Set_LocElm(FilHdr, LocElm);
	 break;}/*case*/;
      case TC_DrvDirElm: {
	 if (MinStatus > STAT_NoFile) {
	    Add_ErrStatus(FilHdr, STAT_NoFile);
	    MinStatus = STAT_NoFile; }/*if*/;
	 break;}/*case*/;
      case TC_VirDirElm: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 LocElm = 0;
	 ElmFilHdr = Do_Key(FilHdr_Father(Copy_FilHdr(Inputs[0])),
			    FilHdr_Key(StrBuf, FilHdr));
	 if (ElmFilHdr != ERROR) {
	    LocElm = Make_LocElm(ElmFilHdr, RootFilPrm, FilHdr);
	    Ret_FilHdr(ElmFilHdr); }/*if*/;
	 Set_LocElm(FilHdr, LocElm);
	 break;}/*case*/;
      case TC_Collect: {
	 FORBIDDEN(ExecSpc->NumInps < 1 || ExecSpc->NumOuts != 1);
	 FirstLE = NIL; LastLE = NIL;
	 for (i=0; i<ExecSpc->NumInps; i++) {
	    LocElm = Make_LocElm(Inputs[i], FilHdr_FilPrm(FilHdr), FilHdr);
	    Chain_LocElms(&FirstLE, &LastLE, LocElm);
	    }/*for*/;
	 Set_LocElm(FilHdr, FirstLE);
	 if (IsPntr(FilHdr)) Validate_IsPntr(FilHdr);
	 break;}/*case*/;
      case TC_ReadList: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Exec_List(FilHdr, Inputs[0], FilHdr_FilPrm(FilHdr), FALSE);
	 if (IsPntr(FilHdr)) Validate_IsPntr(FilHdr);
	 break;}/*case*/;
      case TC_SrcNames: case TC_OpNames: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 FilHdr_DataFileName(InFileName, Inputs[0]);
	 WriteSrcNames(OutFD, InFileName, (TClass == TC_OpNames));
	 Close(OutFD);
	 break;}/*case*/;
      case TC_ViewSpec: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Exec_List(FilHdr, Inputs[0], RootFilPrm, FALSE);
	 Validate_ViewSpec(FilHdr);
	 break;}/*case*/;
      case TC_CmptView: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Exec_CmptView(&ErrFlag, FilHdr, Inputs[0]);
	 if (ErrFlag) {
	    Add_ErrStatus(FilHdr, STAT_TgtValError);
	    if (MinStatus > STAT_TgtValError) {
	       MinStatus = STAT_TgtValError; }/*if*/; }/*if*/;
	 break;}/*case*/;
      case TC_Directory: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 ElmFilHdr = FilHdr_DirFilHdr(Copy_FilHdr(Inputs[0]));
	 Set_LocElm(FilHdr, Make_LocElm(ElmFilHdr, RootFilPrm, FilHdr));
	 Ret_FilHdr(ElmFilHdr);
	 break;}/*case*/;
      case TC_Name: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 WritePrmOdinExpr(OutFD, Inputs[0], FilHdr_FilPrm(FilHdr));
	 Close(OutFD);
	 break;}/*case*/;
      case TC_Names: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 WriteNames(OutFD, Inputs[0], FilHdr_FilPrm(FilHdr));
	 Close(OutFD);
	 break;}/*case*/;
      case TC_FileName: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 /*select*/{
	    if (IsAtmc(Inputs[0])) {
	       Get_WorkFileName(OutFileName, Job, FilHdr);
	       OutFD = FileName_WFilDsc(OutFileName, TRUE);
	       FilHdr_DataFileName(InFileName, Inputs[0]);
	       Writeln(OutFD, InFileName);
	       Close(OutFD);
	    }else{
	       FilHdr_Error("Input to :filename must be atomic: <%s>.\n",
			    Inputs[0]); };}/*select*/;
	 break;}/*case*/;
      case TC_FileNames: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 WriteFlat(OutFD, Inputs[0]);
	 Close(OutFD);
	 break;}/*case*/;
      case TC_Cat: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 WriteCat(OutFD, Inputs[0]);
	 Close(OutFD);
	 break;}/*case*/;
      case TC_Union: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Set_LocElm(FilHdr, Make_UnionLocElm(Inputs[0], FilHdr));
	 break;}/*case*/;
      case TC_PntrHo: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Set_LocElm(FilHdr, Make_PntrHoLocElm(Inputs[0], FilHdr));
	 break;}/*case*/;
      case TC_Apply: {
	 FORBIDDEN(ExecSpc->NumInps != 2 || ExecSpc->NumOuts != 1);
	 OprFilHdr = Deref(Copy_FilHdr(Inputs[1]));
	 FilHdr_DataFileName(InFileName, OprFilHdr);
	 Push_ContextFilHdr(OprFilHdr);
	 Set_LocElm(FilHdr, Make_ApplyLocElm(Inputs[0], FilHdr, InFileName));
	 Pop_ContextFilHdr();
	 break;}/*case*/;
      case TC_DerefPrmVal: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Set_LocElm(FilHdr, Make_DerefPrmValLocElm(Inputs[0], FilHdr));
	 break;}/*case*/;
      case TC_Map: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Set_LocElm(FilHdr, Make_MapLocElm(Inputs[0], FilHdr));
	 break;}/*case*/;
      case TC_Recurse: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Set_LocElm(FilHdr, Make_RecurseLocElm(Inputs[0], FilHdr));
	 break;}/*case*/;
      case TC_Extract: case TC_Delete: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Set_LocElm(FilHdr, Make_ExDelLocElm(Inputs[0], FilHdr,
					     (TClass == TC_Extract)));
	 break;}/*case*/;
      case TC_PntrElm: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 LocElm = 0;
	 ElmFilHdr = Do_Key(Copy_FilHdr(Inputs[0]), FilHdr_Key(StrBuf, FilHdr));
	 if (ElmFilHdr != ERROR) {
	    LocElm = Make_LocElm(ElmFilHdr, RootFilPrm, FilHdr);
	    Ret_FilHdr(ElmFilHdr); }/*if*/;
	 Set_LocElm(FilHdr, LocElm);
	 break;}/*case*/;
      case TC_Error: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 WriteReport(OutFD, Inputs[0], STAT_TgtValError);
	 Close(OutFD);
	 break;}/*case*/;
      case TC_Warning: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 WriteReport(OutFD, Inputs[0], STAT_Warning);
	 Close(OutFD);
	 break;}/*case*/;
      case TC_Label: {
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 Writeln(OutFD, FilHdr_Label(StrBuf, Inputs[0], FALSE));
	 Close(OutFD);
	 break;}/*case*/;
      case TC_Labels: {
	 FORBIDDEN(!IsList(Inputs[0]));
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 WriteLabels(OutFD, Inputs[0]);
	 Close(OutFD);
	 break;}/*case*/;
      case TC_Id: {
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 WriteInt(OutFD, (int)FilHdr_LocHdr(Inputs[0]));
	 Writeln(OutFD, "");
	 Close(OutFD);
	 break;}/*case*/;
      case TC_Depend: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 FirstLE = NIL; LastLE = NIL;
	 GetDepend(&FirstLE, &LastLE, Inputs[0], FilHdr);
	 Set_LocElm(FilHdr, FirstLE);
	 break;}/*case*/;
      case TC_InternalPntr: {
	 break;}/*case*/;
      case TC_TargetsPtr: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Exec_TargetsPtr(FilHdr, Inputs[0]);
	 break;}/*case*/;
      case TC_TargetsInc: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Exec_List(FilHdr, Inputs[0], RootFilPrm, TRUE);
	 break;}/*case*/;
      case TC_Targets: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 FilHdr_DataFileName(InFileName, Inputs[0]);
	 Push_ContextFilHdr(Copy_FilHdr(Inputs[0]));
	 Exec_Targets(OutFD, InFileName);
	 Pop_ContextFilHdr();
	 Close(OutFD);
	 break;}/*case*/;
      case TC_ActTargets: case TC_VirTargets: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 FilHdr_DataFileName(InFileName, Inputs[0]);
	 InFD = FileName_RFilDsc(InFileName, FALSE);
	 LocElm = NIL;
	 if (InFD != NIL) {
	    Push_ContextFilHdr(Copy_FilHdr(FilHdr));
	    LocElm = Make_TargetsLocElm(FilHdr, InFD, InFileName, DepModDate,
					 (TClass == TC_VirTargets));
	    Pop_ContextFilHdr();
	    Close(InFD); }/*if*/;
	 Set_LocElm(FilHdr, LocElm);
	 break;}/*case*/;
      case TC_VirDir: {
	 Exec_VirDir(FilHdr, Inputs[0]);
	 break;}/*case*/;
      case TC_CopyCmd: {
	 DestFilHdr = Deref(LocHdr_FilHdr
	    (FilPVal_LocHdr(FilPrm_FilPVal(FilHdr_FilPrm(FilHdr)))));
	 /*select*/{
	    if (DestFilHdr == ERROR) {
	       SystemError("+copydestdesc=(dest) parameter required.\n");
	    }else{
	       Exec_CopyCmd(FilHdr, DestFilHdr, Inputs[0]);
	       Ret_FilHdr(DestFilHdr); };}/*select*/;
	 break;}/*case*/;
      case TC_ExpandHooks: {
	 FORBIDDEN(ExecSpc->NumInps != 2 || ExecSpc->NumOuts != 1);
	 FilHdr_DataFileName(InFileName, Inputs[1]);
	 InFD = FileName_RFilDsc(InFileName, TRUE);
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 ExpandHooks(OutFD, InFD, Inputs[0]);
	 Close(InFD); Close(OutFD);
	 break;}/*case*/;
      case TC_NestedHooks: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 2);
	 FilHdr_DataFileName(InFileName, Inputs[0]);
	 InFD = FileName_RFilDsc(InFileName, TRUE);
	 Get_WorkFileName(OutFileName, Job, Outputs[1]);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 NestedHooks(Outputs[0], Outputs[1], OutFD,
		     InFD, FilHdr_FilPrm(FilHdr));
	 Close(InFD); Close(OutFD);
	 break;}/*case*/;
      case TC_TextDef: {
	 FilHdr_DataFileName(InFileName, Inputs[0]);
	 InFD = FileName_RFilDsc(InFileName, TRUE);
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 WriteTextDef(FilHdr, OutFD, OutFileName, InFD, InFileName);
	 Close(InFD); Close(OutFD);
	 break;}/*case*/;
      case TC_PrefixHelp: case TC_SuffixHelp: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 WriteSrcFilTyps(OutFD, (TClass == TC_PrefixHelp));
	 Close(OutFD);
	 break;}/*case*/;
      case TC_DrvHelp: {
	 FORBIDDEN(ExecSpc->NumInps != 1 || ExecSpc->NumOuts != 1);
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 WriteDrvHelp(OutFD, Inputs[0]);
	 Close(OutFD);
	 break;}/*case*/;
      case TC_PrmHelp: {
	 FORBIDDEN(ExecSpc->NumInps > 2 || ExecSpc->NumOuts != 1);
	 Get_WorkFileName(OutFileName, Job, FilHdr);
	 OutFD = FileName_WFilDsc(OutFileName, TRUE);
	 WritePrmHelp(OutFD, Inputs[0], FilHdr_FilPrm(FilHdr));
	 Close(OutFD);
	 break;}/*case*/;
      default: {
	 FATALERROR("illegal system tool"); }}/*switch*/;

   ErrFlag = IsErr();
   Set_ErrFile(OldErrFileName, OldIsIPC, OldErrFD);
   if (ErrFlag) {
      Add_StatusFile(FilHdr, STAT_Error, Job->ErrorFN);
      if (MinStatus > STAT_Error) {
	 MinStatus = STAT_Error; }/*if*/; }/*if*/;
   if (MinStatus == STAT_Error && IsTargets(FilHdr)) {
      MinStatus = STAT_TgtValError; }/*if*/;

   Do_Update(FilHdr, ExecSpc->OutFilHdrs, ExecSpc->NumOuts, Job,
	     MinStatus, DepModDate, TRUE);

   Ret_Job(Job);
   Ret_ExecSpc(ExecSpc);
   }/*ExecInternal*/