mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 06:47:35 +00:00
Userland: Allow building SerenityOS with -funsigned-char
Some of the code assumed that chars were always signed while that is not the case on ARM hosts. Also, some of the code tried to use EOF (-1) in a way similar to what fgetc() does, however instead of storing the characters in an int variable a char was used. While this seemed to work it also meant that character 0xFF would be incorrectly seen as an end-of-file. Careful reading of fgetc() reveals that fgetc() stores character data in an int where valid characters are in the range of 0-255 and the EOF value is explicitly outside of that range (usually -1).
This commit is contained in:
parent
6ab48d612a
commit
d476144565
9 changed files with 20 additions and 13 deletions
|
@ -177,7 +177,8 @@ URL URLParser::parse(Badge<URL>, StringView const& raw_input, URL const* base_ur
|
||||||
size_t start_index = 0;
|
size_t start_index = 0;
|
||||||
size_t end_index = raw_input.length();
|
size_t end_index = raw_input.length();
|
||||||
for (size_t i = 0; i < raw_input.length(); ++i) {
|
for (size_t i = 0; i < raw_input.length(); ++i) {
|
||||||
if (0 <= raw_input[i] && raw_input[i] <= 0x20) {
|
i8 ch = raw_input[i];
|
||||||
|
if (0 <= ch && ch <= 0x20) {
|
||||||
++start_index;
|
++start_index;
|
||||||
has_validation_error = true;
|
has_validation_error = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -185,7 +186,8 @@ URL URLParser::parse(Badge<URL>, StringView const& raw_input, URL const* base_ur
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (ssize_t i = raw_input.length() - 1; i >= 0; --i) {
|
for (ssize_t i = raw_input.length() - 1; i >= 0; --i) {
|
||||||
if (0 <= raw_input[i] && raw_input[i] <= 0x20) {
|
i8 ch = raw_input[i];
|
||||||
|
if (0 <= ch && ch <= 0x20) {
|
||||||
--end_index;
|
--end_index;
|
||||||
has_validation_error = true;
|
has_validation_error = true;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -139,9 +139,10 @@ void Lexer::consume()
|
||||||
auto did_reach_eof = [this] {
|
auto did_reach_eof = [this] {
|
||||||
if (m_position != m_source.length())
|
if (m_position != m_source.length())
|
||||||
return false;
|
return false;
|
||||||
|
m_eof = true;
|
||||||
|
m_current_char = '\0';
|
||||||
m_position++;
|
m_position++;
|
||||||
m_line_column++;
|
m_line_column++;
|
||||||
m_current_char = EOF;
|
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -276,7 +277,7 @@ bool Lexer::match(char a, char b, char c, char d) const
|
||||||
|
|
||||||
bool Lexer::is_eof() const
|
bool Lexer::is_eof() const
|
||||||
{
|
{
|
||||||
return m_current_char == EOF;
|
return m_eof;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Lexer::is_line_terminator() const
|
bool Lexer::is_line_terminator() const
|
||||||
|
@ -540,7 +541,7 @@ Token Lexer::next()
|
||||||
} else {
|
} else {
|
||||||
consume();
|
consume();
|
||||||
}
|
}
|
||||||
} else if (m_current_char == EOF) {
|
} else if (m_eof) {
|
||||||
if (unterminated_comment) {
|
if (unterminated_comment) {
|
||||||
token_type = TokenType::Invalid;
|
token_type = TokenType::Invalid;
|
||||||
token_message = "Unterminated multi-line comment";
|
token_message = "Unterminated multi-line comment";
|
||||||
|
|
|
@ -46,6 +46,7 @@ private:
|
||||||
size_t m_position { 0 };
|
size_t m_position { 0 };
|
||||||
Token m_current_token;
|
Token m_current_token;
|
||||||
char m_current_char { 0 };
|
char m_current_char { 0 };
|
||||||
|
bool m_eof { false };
|
||||||
|
|
||||||
StringView m_filename;
|
StringView m_filename;
|
||||||
size_t m_line_number { 1 };
|
size_t m_line_number { 1 };
|
||||||
|
|
|
@ -40,7 +40,7 @@ static Value parse_simplified_iso8601(const String& iso_8601)
|
||||||
|
|
||||||
int year = -1, month = -1, day = -1;
|
int year = -1, month = -1, day = -1;
|
||||||
int hours = -1, minutes = -1, seconds = -1, milliseconds = -1;
|
int hours = -1, minutes = -1, seconds = -1, milliseconds = -1;
|
||||||
char timezone = -1;
|
int timezone = -1;
|
||||||
int timezone_hours = -1, timezone_minutes = -1;
|
int timezone_hours = -1, timezone_minutes = -1;
|
||||||
auto lex_year = [&]() {
|
auto lex_year = [&]() {
|
||||||
if (lexer.consume_specific('+'))
|
if (lexer.consume_specific('+'))
|
||||||
|
|
|
@ -36,11 +36,11 @@ Lexer::Lexer(const StringView source)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ALWAYS_INLINE char Lexer::peek(size_t offset) const
|
ALWAYS_INLINE int Lexer::peek(size_t offset) const
|
||||||
{
|
{
|
||||||
if ((m_position + offset) >= m_source.length())
|
if ((m_position + offset) >= m_source.length())
|
||||||
return EOF;
|
return EOF;
|
||||||
return m_source[m_position + offset];
|
return (unsigned char)m_source[m_position + offset];
|
||||||
}
|
}
|
||||||
|
|
||||||
void Lexer::back(size_t offset)
|
void Lexer::back(size_t offset)
|
||||||
|
@ -90,6 +90,7 @@ char Lexer::skip()
|
||||||
{
|
{
|
||||||
auto c = peek();
|
auto c = peek();
|
||||||
consume();
|
consume();
|
||||||
|
VERIFY(c != EOF);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,7 @@ public:
|
||||||
const auto& source() const { return m_source; }
|
const auto& source() const { return m_source; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ALWAYS_INLINE char peek(size_t offset = 0) const;
|
ALWAYS_INLINE int peek(size_t offset = 0) const;
|
||||||
ALWAYS_INLINE void consume();
|
ALWAYS_INLINE void consume();
|
||||||
|
|
||||||
StringView m_source {};
|
StringView m_source {};
|
||||||
|
|
|
@ -121,7 +121,8 @@ void Lexer::consume()
|
||||||
auto did_reach_eof = [this] {
|
auto did_reach_eof = [this] {
|
||||||
if (m_position != m_source.length())
|
if (m_position != m_source.length())
|
||||||
return false;
|
return false;
|
||||||
m_current_char = EOF;
|
m_eof = true;
|
||||||
|
m_current_char = '\0';
|
||||||
++m_line_column;
|
++m_line_column;
|
||||||
++m_position;
|
++m_position;
|
||||||
return true;
|
return true;
|
||||||
|
@ -325,7 +326,7 @@ bool Lexer::is_line_break() const
|
||||||
|
|
||||||
bool Lexer::is_eof() const
|
bool Lexer::is_eof() const
|
||||||
{
|
{
|
||||||
return m_current_char == EOF;
|
return m_eof;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,7 @@ private:
|
||||||
size_t m_line_number { 1 };
|
size_t m_line_number { 1 };
|
||||||
size_t m_line_column { 0 };
|
size_t m_line_column { 0 };
|
||||||
char m_current_char { 0 };
|
char m_current_char { 0 };
|
||||||
|
bool m_eof { false };
|
||||||
size_t m_position { 0 };
|
size_t m_position { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -388,7 +388,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char m_name { -1 };
|
char m_name { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
class TildeValue final : public Value {
|
class TildeValue final : public Value {
|
||||||
|
@ -1290,7 +1290,7 @@ private:
|
||||||
virtual Vector<Line::CompletionSuggestion> complete_for_editor(Shell&, size_t, const HitTestResult&) override;
|
virtual Vector<Line::CompletionSuggestion> complete_for_editor(Shell&, size_t, const HitTestResult&) override;
|
||||||
virtual HitTestResult hit_test_position(size_t) const override;
|
virtual HitTestResult hit_test_position(size_t) const override;
|
||||||
|
|
||||||
char m_name { -1 };
|
char m_name { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
class Juxtaposition final : public Node {
|
class Juxtaposition final : public Node {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue