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; }
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); }
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; }
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]; }
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); }
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; }