Index: uspace/app/sbi/src/program.c
===================================================================
--- uspace/app/sbi/src/program.c	(revision 074444f189ee9356421b26e70454fae61c81def3)
+++ uspace/app/sbi/src/program.c	(revision 074444f189ee9356421b26e70454fae61c81def3)
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2010 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @file Main module.
+ *
+ * Main entry point for SBI, the Sysel Bootstrap Interpreter.
+ * When run without parameters, the interpreter will enter interactive
+ * mode.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "os/os.h"
+#include "mytypes.h"
+#include "stype.h"
+#include "input.h"
+#include "lex.h"
+#include "parse.h"
+
+#include "program.h"
+
+#define MAX_NAME_SIZE 64
+static char name_buf[MAX_NAME_SIZE + 1];
+
+/** Process one specified source file.
+ *
+ * @param program 	The program to which the parsed code is added.
+ * @param fname		Name of file to read from.
+ * @return		EOK on success, EIO if file is not found,
+ *			EINVAL if file has syntax errors.
+ */
+int program_file_process(stree_program_t *program, const char *fname)
+{
+	input_t *input;
+	lex_t lex;
+	parse_t parse;
+	int rc;
+
+	rc = input_new_file(&input, fname);
+	if (rc != EOK) {
+		printf("Failed opening source file '%s'.\n", fname);
+		return EIO;
+	}
+
+	/* Parse input file. */
+	lex_init(&lex, input);
+	parse_init(&parse, program, &lex);
+	parse_module(&parse);
+
+	/* Check for parse errors. */
+	if (parse.error)
+		return EINVAL;
+
+	return EOK;
+}
+
+/** Process sources of the library. 
+ *
+ * Processes all source files in the library. The list of library source files
+ * is read from '<libdir>/libflist'. Each line of the file contains one file
+ * name relative to <libdir>.
+ */
+int program_lib_process(stree_program_t *program)
+{
+	int rc;
+	char *path, *fname;
+	char *tmp;
+	char *cp;
+
+	FILE *f;
+
+	path = os_get_lib_path();
+	fname = os_str_acat(path, "/libflist");
+
+	f = fopen(fname, "rt");
+	if (f == NULL) {
+		printf("Failed opening library list file '%s'.\n", fname);
+		free(path);
+		free(fname);
+		return EIO;
+	}
+
+	free(fname);
+
+	while (b_true) {
+		if (fgets(name_buf, MAX_NAME_SIZE + 1, f) == NULL)
+			break;
+
+		/*
+		 * Remove trailing newline, if present.
+		 */
+		cp = name_buf;
+		while (*cp != '\0' && *cp != '\n')
+			++cp;
+
+		if (*cp == '\n')
+			*cp = '\0';
+
+		tmp = os_str_acat(path, "/");
+		fname = os_str_acat(tmp, name_buf);
+		free(tmp);
+
+		rc = program_file_process(program, fname);
+		if (rc != EOK) {
+			free(fname);
+			free(path);
+			fclose(f);
+			return rc;
+		}
+
+		free(fname);
+	}
+
+	if (ferror(f)) {
+		printf("Error reading from library list file.\n");
+		free(path);
+		fclose(f);
+		return EIO;
+	}
+
+	free(path);
+	fclose(f);
+
+	return rc;
+}
