Foam compPhaseLoadFoam(EmitInfo finfo) { SymeList symes = 0; Foam foam; FileName fn = emitSrcFile(finfo); int ftype = ftypeNo(fnameType(fn)); phStart(PH_Load); foam = 0; if (ftype == FTYPENO_INTERMED) { Lib lib = libRead(fn); emitSetFileIdName(libGetFileId(lib)); if (emitIsOutputNeeded(finfo, FTYPENO_SYMEEXPR)) { symes = libGetSymes(lib); stabPutMeanings(stabFile(), symes); } foam = libGetFoam(lib); /*!! libClose(lib); */ } if (ftype == FTYPENO_FOAMEXPR) { FILE *fin; fin = fileRdOpen(fn); foam = foamRdSExpr(fin, &fn, NULL); fclose(fin); } phEnd((PhPrFun) foamPrint, (PhPrFun) 0, (Pointer) foam); return foam; }
SymeList arGetSymes(Archive ar) { ArEntryList alist; SymeList symes; if (!ar) return 0; if (ar->symes) return ar->symes; arFilter(ar); for (alist = ar->members; alist; alist = cdr(alist)) { ArEntry arent = car(alist); if (!arent->mark) continue; symes = listReverse(Syme)(libGetSymes(arEntryLib(ar, arent))); ar->symes = listNConcat(Syme)(symes, ar->symes); } ar->symes = listNReverse(Syme)(ar->symes); return ar->symes; }