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); }
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; } }
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; }
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)); }
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; }
/* 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); } }
/* 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; }