line and column handling + better debug log

This commit is contained in:
Richard Thier 2024-09-26 13:05:38 +02:00
parent aaa8b2fb9c
commit 5d2f0d187b

View File

@ -246,23 +246,24 @@ typedef iores (*ioconn)(SLC_IO_OP op, const char *param);
*/ */
typedef char (*coderead)(); typedef char (*coderead)();
enum slc_state : uint32_t { /** States the main state-engine can pick up - use characters for debugging better */
enum slc_state : uint8_t {
/** Before things */ /** Before things */
SLC_START = 0, SLC_START = 's',
/** In a comment */ /** In a comment */
SLC_COMMENT = 1, SLC_COMMENT = 'c',
/** In multi-line comment */ /** In multi-line comment */
SLC_MULTILINE_COMMENT = 2, SLC_MULTILINE_COMMENT = 'm',
/** Name part of word-definition (after ':') - whitespace ends it */ /** Name part of word-definition (after ':') - whitespace ends it */
SLC_DEF_NAME = 3, SLC_DEF_NAME = 'd',
/** Variable-listing part of word-definition - endline, '(', '[' or '{' ends it */ /** Variable-listing part of word-definition - endline, '(', '[' or '{' ends it */
SLC_DEF_VAR = 4, SLC_DEF_VAR = 'D',
/** Raw body part of the word definition - these can contain local variable accesses + words, depth counted by vars */ /** Raw body part of the word definition - these can contain local variable accesses + words, depth counted by vars */
SLC_DEF_BODY = 5, SLC_DEF_BODY = 'b',
/** Name part of a word "call" (non-definition). Ends by whitespace, '@' (in case of variable) or various parentheses */ /** Name part of a word "call" (non-definition). Ends by whitespace, '@' (in case of variable) or various parentheses */
SLC_WORD_NAME = 6, SLC_WORD_NAME = 'w',
/** Variable call (MYWORD@MYVAR) - we get to be here from SLC_WORD_NAME or from START */ /** Variable call (MYWORD@MYVAR) - we get to be here from SLC_WORD_NAME or from START */
SLC_WORD_VAR = 7, SLC_WORD_VAR = 'W',
}; };
typedef enum slc_state slc_state; typedef enum slc_state slc_state;
@ -372,11 +373,14 @@ static inline void slc(
const char *ender, const char *ender,
const char *varprefix) { const char *varprefix) {
slc_state state = SLC_START; char last_is_endl = 0;
int line = 0;
int col_plus_one = -1;
// TODO: Count line numbers
// TODO: Handle/count indentation for better error messages // TODO: Handle/count indentation for better error messages
slc_state state = SLC_START;
int comment_i = 0; int comment_i = 0;
int multiline_i = 0; int multiline_i = 0;
int prefix_i = 0; int prefix_i = 0;
@ -385,9 +389,18 @@ static inline void slc(
char c = 0; char c = 0;
while(((c = code_src()) != 0)) { while(((c = code_src()) != 0)) {
/* Handle lines and columns */
if(c == '\n' || c == '\r') {
if(!last_is_endl) {
++line;
col_plus_one = 0;
}
last_is_endl = 1;
} else { last_is_endl = 0; ++col_plus_one; }
process_char: process_char:
int col = col_plus_one;
#ifdef SLC_DEBUG #ifdef SLC_DEBUG
printf("%c @ %d\n", c, state); printf("%c state:%c @ line:%d col:%d\n", c, state, line, col);
#endif #endif
switch(state) { switch(state) {
case SLC_START: case SLC_START: