/* * Copyright (c) 2026, Apollo Telephone Laboratories. * Provided under the BSD-3 clause. */ #include #include #include #include /* * Returns true if the given char is a whitespace * * @c: Character to compare against a set of whitespace */ static inline bool lexer_is_ws(char c) { switch (c) { case '\n': case '\f': case '\t': case '\r': case ' ': return true; } return false; } /* * Scan a single byte from the input source file * * @state: Assembler state * @skip_ws: If true, skip whitespaces * * Returns the scanned byte on success, returns '\0' * on failure. */ static char lexer_scan_byte(struct atas_state *state, bool skip_ws) { char c; if (state == NULL) { return '\0'; } if ((c = fgetc(state->in_file)) == EOF) { return '\0'; } while (lexer_is_ws(c) && skip_ws) { if ((c = fgetc(state->in_file)) == EOF) { return '\0'; } } return c; } int atas_lexer_scan(struct atas_state *state, struct atas_token *token) { char c; if (state == NULL || token == NULL) { return -1; } c = lexer_scan_byte(state, true); if (c == '\0') { return -1; } switch (c) { case ',': token->type = TT_COMMA; token->c = c; return 0; } trace_fatal("unexpected token '%c' while scanning\n", c); atas_fatal(state); return -1; }