Ejemplo n.º 1
0
Archive
arFrString(String name)
{
	static Table	tbl = 0;
	Archive		ar;
	FileName	fn;

	arDEBUG(dbOut, "Looking for archive \"%s\"\n", name);
	
	if (tbl == 0)
		tbl = tblNew((TblHashFun) strAHash, (TblEqFun) strAEqual);

	if ((ar = (Archive) tblElt(tbl, (TblKey) name, (TblElt) 0)) != 0)
		return ar;

	if ((fn = fileRdFind(libSearchPath(), name, FTYPE_AR_INT)) != 0)
		ar = arRead(fn);
	else if (fileIsOpenable((fn = arFileNameFrPath(name)), "r")) {
		ar = arRead(fn);
	}
	else {
		comsgWarning(NULL, ALDOR_W_CantUseArchive, name);
		ar = 0;
	}

	tblSetElt(tbl, (TblKey) name, (TblElt) ar);
	return ar;
}
Ejemplo n.º 2
0
AbSyn
compFileFront(EmitInfo finfo, Stab stab, FILE *fin, int *plno)
{
	FileName	fn = emitSrcFile(finfo);
	AbSyn		ab;
	FTypeNo		ft = ftypeNo(fnameType(fn));

	if (ft == FTYPENO_OLDABSYN) {
		comsgWarning(NULL, ALDOR_W_OldTypeAbsyn, cmdName);
	}
	if ((ft == FTYPENO_ABSYN) || (ft == FTYPENO_OLDABSYN)) {
		ab = compPhaseLoadAbSyn(finfo);
	}
	else {
		SrcLineList	sll;
		TokenList	tl;

		sll  = compPhaseInclude(finfo, fin, plno);

		fintGetInitCompTime();

		if (!compIsMoreAfterInclude(finfo)) { inclFree(sll); return 0; }

		tl   = compPhaseScan   (finfo, sll);
		tl   = compPhaseSysCmd (finfo, tl);
		tl   = compPhaseLinear (finfo, tl);
		ab   = compPhaseParse  (finfo, tl);

		inclFree(sll);
		listFreeDeeply(Token)(tl,tokFree);
		if (comsgErrorCount())		    return ab;
	}

	ab = compPhaseAbNorm (finfo, ab, false);
	ab = compPhaseMacEx  (finfo, ab);
	if (comsgErrorCount())		    return ab;

	ab = compPhaseAbNorm (finfo, ab, true);
	ab = compPhaseAbCheck(finfo, ab); /* creates the .ax file */
	if (!compIsMoreAfterSyntax(finfo))  return ab;

	compPhaseScoBind(finfo, stab, ab);
	if (comsgErrorCount())	{
		if (fintMode == FINT_LOOP) scoSetUndoState();
		return ab;
	}

	compPhaseTInfer (finfo, stab, ab);
	if (comsgErrorCount())	{
		if (fintMode == FINT_LOOP) scoSetUndoState();
		return ab;
	}

	return ab;
}
Ejemplo n.º 3
0
/*
 * Create an explicit export: see gen0DefineRhs and gen0Lambda
 * for more details on how we do this. The code in gf_fortran may
 * also be helpful.
 */
void
gen0ImplicitExport(Syme syme, SymeList context, AbSyn ab)
{
	TForm	tf;
	FoamTag	repTag;
	Foam	lhs, rhs, def;


	/* What is the Rep of this domain? */
	tf = gen1ImplicitRepValue(context);


	/* Get the FOAM type for this Rep */
	if (tf)
		repTag = gen1ImplicitType(tf);
	else
	{
		/* Raise an error because we can't find Rep */
		comsgWarning(ab, ALDOR_E_GenImpNoRep);


		/* Non-fatal so continue */
		repTag = FOAM_Word;
	}


	/* Get the rhs of the export definition */
	rhs = gen1ImplicitExport(syme, repTag);
	if (!rhs) return;


	/* Create the FOAM for the lhs */
	lhs = gen0ExtendSyme(syme);


	/*
	 * If this is a domain export then record the foam loc/lex
	 * used to hold the value of this syme.
	 */
	if (gen0IsDomLevel(gen0State->tag) && gen0State->tag != GF_File)
		gen0SymeSetInit(syme, lhs);


	/* Create a definition */
	def = foamNewDef(lhs, rhs);


	/* Not sure if this hackery is needed anymore */
	def->foamDef.hdr.defnId = symeDefnNum(syme);


	/* Add the definition to the code stream */
	gen0AddStmt(def, (AbSyn)NULL);
}
Ejemplo n.º 4
0
local void
arFilter(Archive ar)
{
	ArEntry		arent0 = arFindEntry(ar, arCurrentFileName);
	ArEntryList	alist;
	Bool		precede = true;
	String tmp;

	if (arent0 == NULL)
		return;

	if (arent0->lib == NULL)
		return;

	tmp = libGetFileId(arent0->lib);
	
	if (!strEqual(tmp, arCurrentFileId))
		return;

	arDEBUG(dbOut, "arFilter:\n");
	comsgWarning(NULL, ALDOR_W_OverRideLibraryFile, arToString(ar));

	arent0->mark = false;
	for (alist = ar->members; alist; alist = cdr(alist)) {
		ArEntry		arent = car(alist);
		libLibrarySyme(arEntryLib(ar, arent));
		if (!arUseExpanded)
			arent->mark = false;
		else if (arent == arent0)
			precede = false;
		else if (precede)
			arent->mark = true;
		else
			arFilterMarkExpanded(ar, arent);
	}

	if (!arUseExpanded) arFilterScanMember(ar, arent0);
}
Ejemplo n.º 5
0
/*
 * Compile files controlled by the argument vector and
 * return the total error count.
 */
int
compFilesLoop(int argc, char **argv)
{
	int		i, iargc, totErrors, nErrors;
	FileName	fn;
	Bool		isSolo;
 
	compInit();

	iargc = cmdArguments(1, argc, argv);
 
	argc -= iargc;
	argv += iargc;
	if (argc == 0) {
		if (comsgOkBreakLoop())
			bloopMsgFPrintf(osStdout, ALDOR_W_NoFiles, cmdName);
		comsgWarning(NULL, ALDOR_W_NoFiles, cmdName);
	}
	emitDoneOptions(argc, argv);
	ccGetReady();
 
	isSolo    = (cmdFileCount == 1);
 
	compFinfov = (EmitInfo *) stoAlloc((unsigned) OB_Other,
					   (cmdFileCount+1) * sizeof(EmitInfo));
	for (i = 0; i <= cmdFileCount; i += 1) compFinfov[i] = 0;
 
	totErrors = 0;
	for (i = 0; i < cmdFileCount; i++) {
		fn = fnameParse(argv[i]);
		compFinfov[i] = emitInfoNew(fn);
		nErrors = 0;
 
		if (!fileIsReadable(fn)) {
			if (comsgOkBreakLoop())
				bloopMsgFPrintf(osStdout, ALDOR_F_CantOpen, argv[i]);
			comsgFatal(NULL, ALDOR_F_CantOpen, argv[i]);
		}
 
		switch (ftypeNo(fnameType(fn))) {
#if 0
		case FTYPENO_C:
			nErrors = compCFile(compFinfov[i]);
			break;
#endif
		case FTYPENO_OBJECT:
		case FTYPENO_AR_OBJ:
		case FTYPENO_AR_INT:
			break;
		case FTYPENO_FOAMEXPR:
		case FTYPENO_INTERMED:
			if (!isSolo) fprintf(osStdout, "\n%s:\n", argv[i]);
			nErrors = compSavedFile(compFinfov[i]);
			break;
		default:
			if (!ftypeEqual(fnameType(fn), "")) {
				if (comsgOkBreakLoop())
					bloopMsgFPrintf(osStdout,
							ALDOR_F_BadFType,
							argv[i],
							fnameType(fn),
							FTYPE_SRC);
				comsgFatal(NULL, ALDOR_F_BadFType, argv[i],
					   fnameType(fn), FTYPE_SRC);
			}
			/* Fall through. */
		case FTYPENO_NONE:
		case FTYPENO_SRC:
		case FTYPENO_INCLUDED:
		case FTYPENO_ABSYN:
		case FTYPENO_OLDABSYN:
			if (!isSolo) fprintf(osStdout, "\n%s:\n", argv[i]);
			nErrors = compSourceFile(compFinfov[i]);
			break;
		}
		totErrors += nErrors;
		fnameFree(fn);
	}
 
	if (cmdFileCount > 0 && totErrors == 0) {
		compFinfov[cmdFileCount] = emitInfoNewAXLmain();
		compAXLmainFile(compFinfov[cmdFileCount]);
		emitLink(cmdFileCount + 1, compFinfov);
		argc -= cmdFileCount;
		argv += cmdFileCount;
		emitInterp(argc, argv);
		emitRun   (argc, argv);
	}
	if (totErrors > 0) emitAllDone();
 
	for (i = 0; i < cmdFileCount + 1; i++) emitInfoFree(compFinfov[i]);
	stoFree((Pointer) compFinfov);
	compFinfov = 0;

	if (!isSolo) phGrandTotals(cmdVerboseFlag);
	compFini();

	return totErrors;
}
Ejemplo n.º 6
0
AbSyn
abPutUse(AbSyn absyn, AbUse context)
{
	int	i, argc;
	AbSyn	parent;
	AbUse	con1;

	if (!absyn) return absyn;

	parent  = current;
	current = absyn;

	switch (abTag(absyn)) {
	  case AB_Id:
	  case AB_LitInteger:
	  case AB_LitFloat:
	  case AB_LitString:
		break;
	  case AB_Apply:
		con1 =  abIsApplyOf(absyn, ssymJoin) || abIsAnyMap(absyn)
			? AB_Use_Type
			: AB_Use_Value;

		for (i = 0; i < abArgc(absyn); i++)
			abPutUse(abArgv(absyn)[i], con1);

		if (isFunnyEquals(context, absyn, parent))
			comsgWarning(absyn, ALDOR_W_FunnyEquals);
		break;
	  case AB_Default:
		abPutUse(absyn->abDefault.body, AB_Use_Default);
		break;
	  case AB_Define:
		abPutUse(absyn->abDefine.lhs,  AB_Use_Define);
		abPutUse(absyn->abDefine.rhs,  AB_Use_Value);
		break;
	  case AB_Assign:
		abPutUse(absyn->abAssign.lhs,  AB_Use_Assign);
		abPutUse(absyn->abAssign.rhs,  AB_Use_Value);
		break;
	  case AB_Declare:
		abPutUse(absyn->abDeclare.id,   context);
		abPutUse(absyn->abDeclare.type, AB_Use_Type);

		if (isFunnyColon(context, absyn, parent))
			comsgWarning(absyn, ALDOR_W_FunnyColon);
		break;
	  case AB_Label:
		abPutUse(absyn->abLabel.label, AB_Use_Label);
		abPutUse(absyn->abLabel.expr,  context);
		break;
	  case AB_Lambda:
	  case AB_PLambda:
		abPutUse(absyn->abLambda.param, AB_Use_Declaration);
		abPutUse(absyn->abLambda.rtype, AB_Use_Type);
		abPutUse(absyn->abLambda.body,  AB_Use_RetValue);
		break;
	  case AB_Generate:
		abPutUse(absyn->abGenerate.count,AB_Use_Value);
		abPutUse(absyn->abGenerate.body, AB_Use_NoValue);
		break;
	  case AB_Reference:
		/* No idea what sort of use this ought to be ... */
		abPutUse(absyn->abReference.body, AB_Use_Value);
		break;
	  case AB_Add:
		abPutUse(absyn->abAdd.base,     AB_Use_Type);
		abPutUse(absyn->abAdd.capsule,  AB_Use_Declaration);
		break;
	  case AB_With:
		abPutUse(absyn->abWith.base,    AB_Use_Type);
		abPutUse(absyn->abWith.within,  AB_Use_Declaration);
		break;
	  case AB_Where:
		abPutUse(absyn->abWhere.context,AB_Use_Declaration);
		abPutUse(absyn->abWhere.expr,   context);
		break;
	  case AB_If:
		abPutUse(absyn->abIf.test,    AB_Use_Value);
		abPutUse(absyn->abIf.thenAlt, context);
		abPutUse(absyn->abIf.elseAlt, context);
		break;
	  case AB_Exit:
		abPutUse(absyn->abExit.test,  AB_Use_Value);
		abPutUse(absyn->abExit.value, context);
		break;
	  case AB_Test:
		abPutUse(absyn->abTest.cond,  AB_Use_Value);
		break;
	  case AB_Repeat:
		argc = abRepeatIterc(absyn);
		for (i = 0; i < argc; i++)
			abPutUse(absyn->abRepeat.iterv[i], AB_Use_Iterator);
		abPutUse(absyn->abRepeat.body, AB_Use_NoValue);
		break;
	  case AB_While:
		abPutUse(absyn->abWhile.test,  AB_Use_Value);
		break;
	  case AB_For:
		abPutUse(absyn->abFor.lhs,     AB_Use_Assign);
		abPutUse(absyn->abFor.whole,   AB_Use_Value);
		abPutUse(absyn->abFor.test,    AB_Use_Value);
		break;
	  case AB_Local:
		for (i = 0; i < abArgc(absyn); i++)
			abPutUse(absyn->abLocal.argv[i], AB_Use_Declaration);
		break;
	  case AB_Free:
		for (i = 0; i < abArgc(absyn); i++)
			abPutUse(absyn->abFree.argv[i], AB_Use_Declaration);
		break;
	  case AB_Foreign:
		abPutUse(absyn->abForeign.what,   AB_Use_Declaration);
		abPutUse(absyn->abForeign.origin, AB_Use_Type);
		break;
	  case AB_Builtin:
		abPutUse(absyn->abBuiltin.what, AB_Use_Declaration);
		break;
	  case AB_Import:
		abPutUse(absyn->abImport.what,   AB_Use_Declaration);
		abPutUse(absyn->abImport.origin, AB_Use_Type);
		break;
	  case AB_Inline:
		abPutUse(absyn->abInline.what,   AB_Use_Declaration);
		abPutUse(absyn->abInline.origin, AB_Use_Type);
		break;
	  case AB_Export:
		abPutUse(absyn->abExport.what,        AB_Use_Declaration);
		abPutUse(absyn->abExport.destination, AB_Use_Type);
		break;
	  case AB_Extend:
		abPutUse(absyn->abExtend.body, AB_Use_Declaration);
		break;
	  case AB_Qualify:
		abPutUse(absyn->abQualify.what,   AB_Use_Value);
		abPutUse(absyn->abQualify.origin, AB_Use_Type);
		break;
	  case AB_RestrictTo:
		abPutUse(absyn->abRestrictTo.expr, AB_Use_Value);
		abPutUse(absyn->abRestrictTo.type, AB_Use_Type);
	  	break;
	  case AB_PretendTo:
		abPutUse(absyn->abPretendTo.expr, AB_Use_Value);
		abPutUse(absyn->abPretendTo.type, AB_Use_Type);
		break;
	  case AB_Comma:
		for (i = 0; i < abArgc(absyn); i++)
			abPutUse(abArgv(absyn)[i], context);
		break;
	  case AB_Sequence:
		argc = abArgc(absyn);

		con1 = AB_Use_NoValue;
		if (context == AB_Use_Declaration || context == AB_Use_Default)
			con1 = context;

		for (i = 0; i < argc; i++) {
			AbSyn si   = abArgv(absyn)[i];
			Bool  ex   = abTag(si) == AB_Exit;
			Bool  last = (i == argc - 1);
			AbUse au;

			au = (ex || last) ? context : con1;

			abPutUse(si, au);
		}
		break;
	  default:
		if (!abIsLeaf(absyn))
			for (i = 0; i < abArgc(absyn); i++)
				abPutUse(abArgv(absyn)[i],AB_Use_Value);
		break;
	}
	abUse(absyn) = context;
	current      = parent;
	return absyn;
}