Move byte for unyped pointers

This commit is contained in:
Eugen Wissner 2025-02-01 09:21:29 +01:00
parent 4011adbe2b
commit 5108016d39
Signed by: belka
GPG Key ID: A27FDC1E8EE902C0
5 changed files with 37 additions and 27 deletions

View File

@ -32,7 +32,7 @@ namespace gcc
{
return "Float";
}
else if (type == elna_char_type_node)
else if (type == unsigned_char_type_node)
{
return "Char";
}

View File

@ -246,7 +246,9 @@ namespace gcc
void generic_visitor::visit(boot::number_literal<unsigned char> *character)
{
this->current_expression = build_int_cstu(elna_char_type_node, character->number());
auto symbol = this->symbol_map->lookup("Char");
this->current_expression = build_int_cstu(symbol->payload, character->number());
}
void generic_visitor::visit(boot::number_literal<nullptr_t> *)

View File

@ -10,10 +10,8 @@ namespace gcc
{
void init_ttree()
{
elna_char_type_node = make_unsigned_type(8);
elna_string_type_node = build_pointer_type(
build_qualified_type(char_type_node, TYPE_QUAL_CONST)); /* const char* */
TYPE_STRING_FLAG(elna_char_type_node) = 1;
}
bool is_pointer_type(tree type)
@ -77,7 +75,8 @@ namespace gcc
initial_table->enter("Word", boot::make_info(size_type_node));
initial_table->enter("Bool", boot::make_info(boolean_type_node));
initial_table->enter("Float", boot::make_info(double_type_node));
initial_table->enter("Char", boot::make_info(elna_char_type_node));
initial_table->enter("Char", boot::make_info(unsigned_char_type_node));
initial_table->enter("Byte", boot::make_info(make_unsigned_type(8)));
initial_table->enter("String", boot::make_info(elna_string_type_node));
return initial_table;

View File

@ -10,14 +10,12 @@
enum elna_tree_index
{
ELNA_TI_CHAR_TYPE,
ELNA_TI_STRING_TYPE,
ELNA_TI_MAX
};
extern GTY(()) tree elna_global_trees[ELNA_TI_MAX];
#define elna_char_type_node elna_global_trees[ELNA_TI_CHAR_TYPE]
#define elna_string_type_node elna_global_trees[ELNA_TI_STRING_TYPE]
namespace elna

View File

@ -38,7 +38,7 @@ const
TOKEN_PLUS = 43, TOKEN_MINUS = 44, TOKEN_MULTIPLICATION = 45, TOKEN_DIVISION = 46,
TOKEN_REMAINDER = 47, TOKEN_ASSIGNMENT = 48, TOKEN_COLON = 49, TOKEN_HAT = 50,
TOKEN_AT = 51, TOKEN_COMMENT = 52, TOKEN_INTEGER = 53, TOKEN_WORD = 54,
TOKEN_CHARACTER = 55;
TOKEN_CHARACTER = 55, TOKEN_STRING = 56;
(*
External procedures.
@ -47,19 +47,19 @@ proc fopen(pathname: String, mode: String): pointer to FILE; extern;
proc fclose(stream: pointer to FILE): Int; extern;
proc fseek(stream: pointer to FILE, off: Int, whence: Int): Int; extern;
proc ftell(stream: pointer to FILE): Int; extern;
proc fread(ptr: pointer to Char, size: Int, nmemb: Int, stream: pointer to FILE): Int; extern;
proc write(fd: Int, buf: pointer to Char, count: Int): Int; extern;
proc fread(ptr: pointer to Byte, size: Word, nmemb: Word, stream: pointer to FILE): Word; extern;
proc write(fd: Int, buf: pointer to Byte, Word: Int): Int; extern;
proc malloc(size: Int): pointer to Char; extern;
proc free(ptr: pointer to Char); extern;
proc calloc(nmemb: Int, size: Int): pointer to Char; extern;
proc realloc(ptr: pointer to Char, size: Word): pointer to Char; extern;
proc malloc(size: Word): pointer to Byte; extern;
proc free(ptr: pointer to Byte); extern;
proc calloc(nmemb: Word, size: Word): pointer to Byte; extern;
proc realloc(ptr: pointer to Byte, size: Word): pointer to Byte; extern;
proc reallocarray(ptr: pointer to Byte, n: Word, size: Word): pointer to Byte; extern;
proc memset(ptr: pointer to Char, c: Int, n: Int): pointer to Char; extern;
proc strncmp(s1: pointer to Char, s2: pointer to Char, n: Word): Int; extern;
proc strncpy(dst: pointer to Char, src: pointer to Char, dsize: Word): pointer to Char; extern;
proc strncpy(dst: pointer to Char, src: pointer to Char, dsize: Word): pointer to Char; extern;
proc strlen(ptr: pointer to Char): Word; extern;
proc strtol(nptr: pointer to Char, endptr: pointer to pointer to Char, base: Int): Int; extern;
@ -169,7 +169,7 @@ proc read_source(filename: String): pointer to Char;
var
input_file: pointer to FILE,
source_size: Int,
input: pointer to Char;
input: pointer to Byte;
begin
input_file := fopen(filename, "rb");
@ -260,6 +260,20 @@ begin
return nil
end;
proc lex_character(input: pointer to Char, current_token: pointer to Token): pointer to Char;
begin
if input^ = '\\' then
input := input + 1;
if escape_char(input^, @current_token^.value.char_value) then
input := input + 1
end
elsif input^ <> '\0' then
current_token^.value.char_value := input^;
input := input + 1
end;
return input
end;
proc print_tokens(tokens: pointer to Token, tokens_size: Word);
var
current_token: pointer to Token,
@ -389,10 +403,12 @@ begin
write_c('<');
write_i(current_token^.value.char_value);
write_s("c>")
elsif current_token^.kind = TOKEN_STRING then
write_s("\"...\"")
else
write_s("UNKNOWN<");
write_i(current_token^.kind);
write_s('>')
write_c('>')
end;
write_c(' ');
@ -534,17 +550,12 @@ begin
current_token^.kind := TOKEN_RIGHT_PAREN;
input_pointer := input_pointer + 1
elsif input_pointer^ = '\'' then
input_pointer := input_pointer + 1;
if input_pointer^ = '\\' then
input_pointer := input_pointer + 1;
if escape_char(input_pointer^, @current_token^.value.char_value) then
input_pointer := input_pointer + 1
end
elsif input_pointer^ <> '\0' then
current_token^.value.char_value := input_pointer^
end;
if input_pointer^ = '\'' then
token_end := lex_character(input_pointer + 1, current_token);
if token_end^ = '\'' then
current_token^.kind := TOKEN_CHARACTER;
input_pointer := token_end + 1
else
input_pointer := input_pointer + 1
end
elsif input_pointer^ = '[' then