Пример #1
0
static void
get_require_input(RequireList *req, char *found_path,
                  SourceInput *source_input)
{
    char *search_path;
    char search_file[FILENAME_MAX];
    FILE *fp;
    SearchFileStatus status;

    search_path = getenv("DKM_REQUIRE_SEARCH_PATH");
    if (search_path == NULL) {
        search_path = ".";
    }
    make_search_path(req->line_number, req->package_name, search_file);

    status = dvm_search_file(search_path, search_file, found_path, &fp);
    
    if (status != SEARCH_FILE_SUCCESS) {
        if (status == SEARCH_FILE_NOT_FOUND) {
            dkc_compile_error(req->line_number,
                              REQUIRE_FILE_NOT_FOUND_ERR,
                              STRING_MESSAGE_ARGUMENT, "file", search_file,
                              MESSAGE_ARGUMENT_END);
        } else {
            dkc_compile_error(req->line_number,
                              REQUIRE_FILE_ERR,
                              INT_MESSAGE_ARGUMENT, "status", (int)status,
                              MESSAGE_ARGUMENT_END);
        }
    }
    source_input->input_mode = FILE_INPUT_MODE;
    source_input->u.file.fp = fp;
}
Пример #2
0
static void
make_search_path(int line_number, PackageName *package_name, char *buf)
{
    PackageName *pos;
    int len = 0;
    int prev_len = 0;
    int suffix_len;

    suffix_len = strlen(DIKSAM_REQUIRE_SUFFIX);
    buf[0] = '\0';
    for (pos = package_name; pos; pos = pos->next) {
        prev_len = len;
        len += strlen(pos->name);
        if (len > FILENAME_MAX - (2 + suffix_len)) {
            dkc_compile_error(line_number,
                              PACKAGE_NAME_TOO_LONG_ERR,
                              MESSAGE_ARGUMENT_END);
        }
        strcpy(&buf[prev_len], pos->name);
        if (pos->next) {
            buf[strlen(buf)] = FILE_SEPARATOR;
            len++;
        }
    }
    strcpy(&buf[len], DIKSAM_REQUIRE_SUFFIX);
}
Пример #3
0
int
yyerror(char const *str)
{
    dkc_compile_error(dkc_get_current_compiler()->current_line_number,
                      PARSE_ERR,
                      STRING_MESSAGE_ARGUMENT, "token", yytext,
                      MESSAGE_ARGUMENT_END);

    return 0;
}
Пример #4
0
int
dkc_close_character_literal(void)
{
    DVM_Char buf[16];
    int new_str_len;

    dkc_add_string_literal('\0');
    new_str_len = dvm_mbstowcs_len(st_string_literal_buffer);
    if (new_str_len < 0) {
        dkc_compile_error(dkc_get_current_compiler()->current_line_number,
                          BAD_MULTIBYTE_CHARACTER_ERR,
                          MESSAGE_ARGUMENT_END);
    } else if (new_str_len > 1) {
        dkc_compile_error(dkc_get_current_compiler()->current_line_number,
                          TOO_LONG_CHARACTER_LITERAL_ERR,
                          MESSAGE_ARGUMENT_END);
    }
    
    dvm_mbstowcs(st_string_literal_buffer, buf);

    return buf[0];
}
Пример #5
0
static void
generate_break_statement(DVM_Executable *exe, Block *block,
                         Statement *statement, OpcodeBuf *ob)
{
    BreakStatement *break_s = &statement->u.break_s;
    Block       *block_p;

    for (block_p = block; block_p; block_p = block_p->outer_block) {
        if (block_p->type != WHILE_STATEMENT_BLOCK
            && block_p->type != FOR_STATEMENT_BLOCK)
            continue;

        if (break_s->label == NULL) {
            break;
        }

        if (block_p->type == WHILE_STATEMENT_BLOCK) {
            if (block_p->parent.statement.statement->u.while_s.label == NULL)
                continue;

            if (!strcmp(break_s->label,
                        block_p->parent.statement.statement
                        ->u.while_s.label)) {
                break;
            }
        } else if (block_p->type == FOR_STATEMENT_BLOCK) {
            if (block_p->parent.statement.statement->u.for_s.label == NULL)
                continue;

            if (!strcmp(break_s->label,
                        block_p->parent.statement.statement
                        ->u.for_s.label)) {
                break;
            }
        }
    }
    if (block_p == NULL) {
        dkc_compile_error(statement->line_number,
                          LABEL_NOT_FOUND_ERR,
                          STRING_MESSAGE_ARGUMENT, "label", break_s->label,
                          MESSAGE_ARGUMENT_END);
    }

    generate_code(ob, statement->line_number,
                  DVM_JUMP,
                  block_p->parent.statement.break_label);

}
Пример #6
0
DVM_Char *
dkc_close_string_literal(void)
{
    DVM_Char *new_str;
    int new_str_len;

    dkc_add_string_literal('\0');
    new_str_len = dvm_mbstowcs_len(st_string_literal_buffer);
    if (new_str_len < 0) {
        dkc_compile_error(dkc_get_current_compiler()->current_line_number,
                          BAD_MULTIBYTE_CHARACTER_ERR,
                          MESSAGE_ARGUMENT_END);
    }
    new_str = MEM_malloc(sizeof(DVM_Char) * (new_str_len+1));
    dvm_mbstowcs(st_string_literal_buffer, new_str);

    return new_str;
}