예제 #1
0
파일: archive.c 프로젝트: hemmecke/aldor
void
arClose(Archive ar)
{
	fnameFree(ar->name);
	if (ar->hasFile) fclose(ar->file);
	listFreeDeeply(ArEntry)(ar->members, arFreeEntry);
	listFree(Syme)(ar->symes);

	stoFree((Pointer) ar);
}
예제 #2
0
파일: axlcomp.c 프로젝트: nilqed/aldor
void
compGLoopInit(int argc, char **argv, FILE *fout, FileName *pfn,
              EmitInfo *pfinfo)
{
	int		iargc;
	Bool		tmpHistory;
	FILE		* fin;
        FileName        fname;

	compInit();

	iargc     = cmdArguments(1, argc, argv);
	argc	 -= iargc;
	argv	 += iargc;
	emitDoneOptions(argc, argv);

	*pfn  = fnameStdin();
	*pfinfo  = emitInfoNew(*pfn);

	compFileInit(*pfinfo);
	comsgFini();
	fintInit();

	/* Helpful start-up banner ... */
	fprintf(osStdout,"%s\n",comsgString(ALDOR_M_GloopBanner));
	if (comsgOkRelease()) {
		fprintf(osStdout, "%s: %s(%s) version %d.%d.%d",
			"Release",
			verName, "C", /* C-language version */
			verMajorVersion,
			verMinorVersion,
			verMinorFreeze);
		if (*verPatchLevel)
			fprintf(osStdout, "(%s)", verPatchLevel);
		fprintf(osStdout, " for %s %s\n", CONFIG, DEBUG_CONFIG);
	}
	(void)fputs("Type \"#int help\" for more details.\n",osStdout);

	if (osFileIsThere(cmdInitFile)) {
		fname = fnameParse(cmdInitFile);
		fin = fileMustOpen(fname, osIoRdMode);
		fnameFree(fname);
		intStepNo = -1;
		tmpHistory = fintHistory;
		fintHistory = false;
		fprintf(fout, "Reading %s...\n", cmdInitFile);
		compGLoopEval(fin, fout, *pfinfo);
                fclose(fin);
	}
	else {
		intStepNo = 0;
		tmpHistory = fintHistory;
	}
	fintHistory = tmpHistory;
}
예제 #3
0
파일: archive.c 프로젝트: hemmecke/aldor
Bool
arHasBasicLib(Archive ar)
{
	static String	s = NULL;

	if (s == NULL) {
		FileName	fn = fnameNew("", "basic", FTYPE_INTERMED);
		s = fnameUnparse(fn);
		fnameFree(fn);
	}

	return arFindEntry(ar, s) != NULL;
}
예제 #4
0
파일: axlcomp.c 프로젝트: nilqed/aldor
int
compGLoopFinish(FileName fn, EmitInfo finfo)
{
   int totErrors = comsgErrorCount();

        /* Prevent calling gc upon exit */
	stoCtl(StoCtl_GcLevel, StoCtl_GcLevel_Never);
	fintFini();
 	compFileFini(finfo);
	emitAllDone();
	emitInfoFree(finfo);
	fnameFree(fn);
	compFini();

	return totErrors;
}
예제 #5
0
파일: file_t.c 프로젝트: dokterp/aldor
void
testFile(void)
{
	FileName	 testFile;
	FILE		 *fout;

	printf("fileSetHandler:\n");
	fileSetHandler(fileSetHandler((FileErrorFun) 0));

	printf("pathInit:\n");
	pathInit();

	printf("fileRdFind: yabba -- ");
	testFile = fileRdFind(binSearchPath(), "yabba", "");
	if (testFile) 
		printf("dir \"%s\", name \"%s\", type \"%s\"\n",
			fnameDir(testFile),
			fnameName(testFile),
			fnameType(testFile));
	else
		printf("Not found\n");

	printf("fileRdFind: cat -- ");
	testFile = fileRdFind(binSearchPath(), "cat", osExecFileType);
	if (testFile) {
		printf("dir \"%s\", name \"%s\", type \"%s\"\n",
			fnameDir(testFile),
			fnameName(testFile),
			fnameType(testFile));
		
		printf("fileRdOpen: ");
		fout = fileRdOpen(testFile);
		printf("Opened \"%s\"\n",fnameName(testFile));

		fclose(fout);
	}
	else
		printf("Not found\n");

	printf("DONE.\n");

	fnameFree(testFile);
/*	fileRemove(testFile); */

}
예제 #6
0
파일: axlcomp.c 프로젝트: nilqed/aldor
/*
 * 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;
}
예제 #7
0
파일: axlcomp.c 프로젝트: nilqed/aldor
int
compInteractiveLoop(int argc, char **argv, FILE *fin, FILE *fout)
{
	int		iargc, totErrors, lineno;
	FileName	fn;
	EmitInfo	finfo;
	AbSyn		ab;
	Stab		stab;
	Foam		foam;
	Bool		readingInitFile = true, tmpHistory;
	Bool		endOfInput = false; 
	FILE		*fin0 = fin;

	compInit();

	iargc = cmdArguments(1, argc, argv);
 
	argc	 -= iargc;
	argv	 += iargc;
	emitDoneOptions(argc, argv);


	if (osFileIsThere(cmdInitFile)) {
		FileName	fname;

		fname = fnameParse(cmdInitFile);
		fin = fileMustOpen(fname, osIoRdMode);
		fnameFree(fname);
		intStepNo = 0;
		tmpHistory = fintHistory;
		fintHistory = false;
		fprintf(fout, "Reading %s...\n", cmdInitFile);
	}
	else {
		intStepNo = 1;
		readingInitFile = false;
		tmpHistory = fintHistory;
	}

	fn  = fnameStdin();

	finfo  = emitInfoNew(fn);
 
	lineno	  = 0;
 
	compFileInit(finfo);
	stab = stabFile();
	comsgFini();
 
	fintInit();

	for (; !endOfInput; intStepNo++) {
		comsgInit();
		breakSetRoot(NULL);
		car(stab)->isChecked = false;

		if (SetJmp(compFintJmpBuf)) {
			if (feof(fin)) break;
		}

		comsgPromptPrint(fin, fout, 
		       fintHistory ? "%%%d := " : "%%%d >> ",
		       intStepNo);
 
		osSetBreakHandler(compFintBreakHandler0);

		ab = compFileFront(finfo, stab, fin, &lineno);
		breakSetRoot(ab);

		if (compIsMoreAfterFront(finfo) &&
		    !abIsEmptySequence(ab)) {
			ab = (AbSyn) fintWrap(ab, intStepNo);
 
			foam = compFileMiddle(finfo, stab, ab);
			if (foam) {
 				Bool ok = fint(foam);
				if (ok && fintVerbose)
					fintPrintType(fout, ab);

				foamFree(foam);
				fintDisplayTimings();
			}
		}

		comsgFini();
		/* abFree(ab); !! ab is seeping into types. */

		if (feof(fin)) {
			if (readingInitFile) {
				fclose(fin);

				fin = fin0;
				lineno	  = 0;
				readingInitFile = false;
				fintHistory = tmpHistory;
				intStepNo = 0;
 
				comsgFini();
			}
			else
				endOfInput = true;
		}
	}			
 
	totErrors = comsgErrorCount();

	fintFini();
 
	compFileFini(finfo);
	emitAllDone();
	emitInfoFree(finfo);
	fnameFree(fn);
	compFini();

	return totErrors;
}
예제 #8
0
파일: include.c 프로젝트: pdo/aldor
local SrcLineList
inclFile(String fname, Bool reincluding, Bool top, long *pnlines)
{
	Scope("inclFile");

	SrcLineList     sll;
	Hash            fhash;
	FileName        fn;
	FileState	o_fileState; 
	IfState		fluid(ifState);
	String		curdir;

	o_fileState 	     = fileState;     /* no fluid(struct) */
	ifState              = NoIf;
	fileState.lineNumber = 0;

	fn = inclFind(fname, fileState.curDir);

	if (fn != 0) {
		fileState.curDir   = strCopy(fnameDir(fn));
		fileState.curFile  = strCopy(fnameUnparseStatic(fn));
		fileState.curFname = fn;
	}
	curdir = fileState.curDir;

	if (fn == 0) {
		fileState = o_fileState;
		if (top) {
			comsgFatal(NULL, ALDOR_F_CantOpen, fname);
			NotReached(sll = 0);
		}
		else
			sll = inclError(ALDOR_F_CantOpen, fname);
	} 
	else {
		fhash = fileHash(fn);
		fname = strCopy (fnameUnparseStatic(fn));

		if (!reincluding && listMemq(Hash)(includedFileCodes, fhash)) {
			sll = listNil(SrcLine);
		}
		else if (listMemq(Hash)(fileState.fileCodes, fhash)) {
			String s = inclActiveFileChain
				(fileState.fileNames, "->");
			fileState = o_fileState;
			sll = inclError(ALDOR_E_InclInfinite, s);
			strFree(s);
		}
		else {
			includedFileCodes   =
			   listCons(Hash)  (fhash,includedFileCodes);
			fileState.fileCodes =
			   listCons(Hash)  (fhash,fileState.fileCodes);
			fileState.fileNames =
			   listCons(String)(fname,fileState.fileNames);
			fileState.infile    = fileRdOpen(fn);

			sll = inclFileContents();

			listFreeCons(Hash)  (fileState.fileCodes);
			listFreeCons(String)(fileState.fileNames);
			fclose(fileState.infile);
		}
		fnameFree(fn);
		strFree(curdir);
				 /*!! curFile is used in src lines */
		strFree(fname);
	}
	if (pnlines) *pnlines = fileState.lineNumber;
	fileState = o_fileState;
	Return(sll);
}