HelenOS sources

root/uspace/app/sbi/src/program.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. program_file_process
  2. program_lib_process

/*
 * 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.
 */
errno_t program_file_process(stree_program_t *program, const char *fname)
{
        input_t *input;
        lex_t lex;
        parse_t parse;
        errno_t 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>.
 *
 * @param program       The program to which the parsed code is added.
 * @return              EOK on success, EIO if some file comprising the
 *                      library is not found, EINVAL if the library
 *                      has syntax errors.
 */
errno_t program_lib_process(stree_program_t *program)
{
        errno_t 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 EOK;
}

/* [<][>][^][v][top][bottom][index][help] */
HelenOS homepage, sources at GitHub