예제 #1
0
파일: genlisp.c 프로젝트: dokterp/aldor
local SExpr
gl0MakeLocals(Foam locals, SExpr inits0)
{
	SExpr     typedVars, liId, inits = inits0;
	int	  i, argc = foamDDeclArgc(locals);
	Foam	  *argv = locals->foamDDecl.argv;
	String	  id, typeId;

	assert(foamTag(locals) == FOAM_DDecl);

	typedVars = sxNil;

	for (i=0; i<argc; i++) {
		id = argv[i]->foamDecl.id;
		liId = gl0Id(FOAM_Loc, i, id);
		typeId = foamInfo(argv[i]->foamDecl.type).str;
		typedVars = sxCons(lisp1(liId, gl0typeName(typeId)),
				   typedVars);
	}

	if (sxiNull(inits0)) 
		return sxNReverse(typedVars);

	for(; inits != sxNil; inits = sxCdr(inits)) {
		liId = sxSecond(sxCar(inits)); /* Nasty ! */
		typeId = symString(sxiToSymbol(liId))[0]=='l' 
			 ? "Level" : "Env";
		typedVars = sxCons(lisp1(liId, gl0typeName(typeId)),
				   typedVars);
	}

	return sxNReverse(typedVars);
}
예제 #2
0
파일: of_util.c 프로젝트: dokterp/aldor
local void
fpClearFormats(Foam ddecl)
{
	Length	i;

	/* Never clear non-record formats */
	switch  (ddecl->foamDDecl.usage) {
	  case FOAM_DDecl_FortranSig:	/*FALLTHROUGH*/
	  case FOAM_DDecl_CSig:		/*FALLTHROUGH*/
		return; 
	  default:
		break;
	}

	for (i = 0; i < foamDDeclArgc(ddecl); i += 1) {
		Foam	decl = ddecl->foamDDecl.argv[i];
#ifdef NEW_FORMATS
		if (foamTag(decl) == FOAM_DDecl) break;
#endif
		if (foamTag(decl) == FOAM_GDecl) {
			if (decl->foamGDecl.protocol == FOAM_Proto_Foam &&
			    decl->foamGDecl.type != FOAM_Rec)
				decl->foamGDecl.format = emptyFormatSlot;
		} 
		else if (decl->foamDecl.type != FOAM_Rec
			 && decl->foamDecl.type != FOAM_Arr
			 && decl->foamDecl.type != FOAM_TR
			 && decl->foamDecl.type != FOAM_NOp)
			decl->foamDecl.format = emptyFormatSlot;
	}
}
예제 #3
0
파일: of_hfold.c 프로젝트: dokterp/aldor
local void
hfoldProg(Foam prog)
{
	Foam body;
	int i;

	hfoldProgInfo = foamOptInfo(prog);

	if (!hfoldProgInfo) return;   /* saved files have no foamOptInfo */

	hfoldStab     = hfoldProgInfo->stab ? hfoldProgInfo->stab : stabFile();
		
	/* No Stab => nothing to do */
	if (!hfoldStab)
		return;
	hfoldNumLocals = foamDDeclArgc(prog->foamProg.locals);

	body = prog->foamProg.body;
	for (i=0; i<foamArgc(body); i++) {
		body->foamSeq.argv[i] = hfoldExpr(body->foamSeq.argv[i]);
	}
	
	hfoldStab     = NULL;
	hfoldProgInfo = NULL;
}
예제 #4
0
파일: test_foam.c 프로젝트: hemmecke/aldor
local void
testDDecl()
{
	Foam ddecl = foamNewDDecl(FOAM_DDecl_Local,
				  foamNewDecl(FOAM_SInt, strCopy("fred"), emptyFormatSlot),
				  NULL);
	testIntEqual("tag", FOAM_DDecl, foamTag(ddecl));
	testIntEqual("argc", 1, foamDDeclArgc(ddecl));
}
예제 #5
0
파일: of_hfold.c 프로젝트: dokterp/aldor
local void
hfoldInit(Foam globals)
{
	int i;


	/* !! Should put runtime strings into gf_rtime.h */
	for (i=0; i<foamDDeclArgc(globals); i++) {
		Foam decl = globals->foamDDecl.argv[i];
		if (strEqual(decl->foamDecl.id, "domainHash!"))
			break;
	}
	if (i == foamDDeclArgc(globals))
		hfoldDomainHashGlobal = -1;
	else 
		hfoldDomainHashGlobal = i;

}
예제 #6
0
파일: of_retyp.c 프로젝트: raoulb/aldor
/* Set all vars that have a canditate type to be of that type
 */
local void
retDDeclFini(Foam ddecl)
{
    int i;
    Foam decl;

    assert(foamTag(ddecl) == FOAM_DDecl);

    for (i = 0; i < foamDDeclArgc(ddecl); i++) {
        decl = ddecl->foamDDecl.argv[i];
        if (retIsUnknownType(decl->foamDecl.type)) {
            decl->foamDecl.type   = FOAM_Word;
            decl->foamDecl.format = emptyFormatSlot;
        }
        else if (retIsCandidateType(decl->foamDecl.type))
            decl->foamDecl.type =
                retDefinedType(decl->foamDecl.type);
    }
}
예제 #7
0
파일: of_retyp.c 프로젝트: raoulb/aldor
/* Set all Word types in ddecl to be Unknown.
 * Return true if at least a Word type has been found.
 */
local Bool
retDDeclInit(Foam ddecl)
{
    int 	i;
    Foam 	decl;
    Bool	changed = false;

    assert(foamTag(ddecl) == FOAM_DDecl);

    for (i = 0; i < foamDDeclArgc(ddecl); i++) {
        decl = ddecl->foamDDecl.argv[i];
        if (decl->foamDecl.type == FOAM_Word) {
            changed = true;
            retSetUnknownDeclType(decl);
        }
    }

    return changed;
}