aboutsummaryrefslogtreecommitdiffstats
path: root/src/mds-kbdc/mds-kbdc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mds-kbdc/mds-kbdc.c')
-rw-r--r--src/mds-kbdc/mds-kbdc.c154
1 files changed, 13 insertions, 141 deletions
diff --git a/src/mds-kbdc/mds-kbdc.c b/src/mds-kbdc/mds-kbdc.c
index d9484f6..d0d3aa7 100644
--- a/src/mds-kbdc/mds-kbdc.c
+++ b/src/mds-kbdc/mds-kbdc.c
@@ -18,7 +18,7 @@
#include "mds-kbdc.h"
#include "globals.h"
-#include "raw-data.h"
+#include "make-tree.h"
#include <libmdsserver/macros.h>
@@ -38,159 +38,31 @@
*/
int main(int argc_, char** argv_)
{
- const char* pathname = argv_[1];
- source_code_t source_code;
- size_t i, n;
+ mds_kbdc_parse_error_t** parse_errors;
argc = argc_;
argv = argv_;
- source_code_initialise(&source_code);
- fail_if (read_source_lines(pathname, &source_code) < 0);
- /* TODO '\t':s should be expanded into ' ':s. */
-
- for (i = 0, n = source_code.line_count; i < n; i++)
+ fail_if (parse_to_tree(argv[1], NULL, &parse_errors) < 0);
+ if (parse_errors != NULL)
{
- char* line = source_code.lines[i];
- char* end;
- char prev_end_char;
-
- while (*line && (*line == ' '))
- line++;
- end = strchrnul(line, ' ');
- if (end == line)
- continue;
- prev_end_char = *end;
- *end = '\0';
-
- if (!strcmp(line, "information"))
- ;
- else if (!strcmp(line, "language"))
- ;
- else if (!strcmp(line, "country"))
- ;
- else if (!strcmp(line, "variant"))
- ;
- else if (!strcmp(line, "include"))
- ;
- else if (!strcmp(line, "function"))
- ;
- else if (!strcmp(line, "macro"))
- ;
- else if (!strcmp(line, "assumption"))
- ;
- else if (!strcmp(line, "if"))
- ;
- else if (!strcmp(line, "else"))
- ;
- else if (!strcmp(line, "for"))
- ;
- else if (!strcmp(line, "end"))
- ;
- else if (!strcmp(line, "return"))
- ;
- else if (!strcmp(line, "continue"))
- ;
- else if (!strcmp(line, "break"))
- ;
- else if (!strcmp(line, "let"))
- ;
- else if (!strcmp(line, "have"))
- ;
- else if (!strcmp(line, "have_chars"))
- ;
- else if (!strcmp(line, "have_range"))
- ;
- else if ((*line != '"') && (*line != '<') && (strchr(line, '(') == NULL))
+ mds_kbdc_parse_error_t** errors = parse_errors;
+ int fatal = 0;
+ while (*errors)
{
- size_t j, m1, m2;
- m1 = (size_t)(line - source_code.lines[i]);
- m2 = (size_t)(end - source_code.lines[i]);
- fprintf(stderr, "\033[1m%s:%zu:%zu-%zu: \033[31merror:\033[0m invalid keyword \033[1m‘%s’\033[0m\n",
- pathname, i + 1, m1 + 1, m2 + 1 /* TODO measure chars, not bytes */, line);
- fprintf(stderr, " %s\n \033[1;32m", source_code.real_lines[i]);
- for (j = 0; j < m1; j++)
- fputc(' ', stderr);
- for (; j < m2; j++)
- if ((source_code.lines[i][j] & 0xC0) != 0x80)
- fputc('^', stderr);
- fprintf(stderr, "\033[0m\n");
+ if ((*errors)->severity >= MDS_KBDC_PARSE_ERROR_ERROR)
+ fatal = 1;
+ mds_kbdc_parse_error_print(*errors++, stderr);
}
-
- *end = prev_end_char;
+ mds_kbdc_parse_error_free_all(parse_errors);
+ if (fatal)
+ return 1;
}
- /*
-
- information
- language "LANGUAGE" # multiple is allowed
- country "COUNTRY" # multiple is allowed
- variant "VARIANT"
- end information
-
- include "some file"
-
- function add/3
- \add(\add(\1 \2) \3)
- end function
- function add/4
- \add(\add(\1 \2 \3) \4)
- end function
-
- macro caps_affected/2
- <letter \1> : "\1"
- <shift letter \1> : "\2"
- <caps letter \1> : "\2"
- <caps shift letter \1> : "\1"
- end macro
-
- <altgr letter \\> : <dead letter ´>
- <altgr shift letter \\> : "¬"
- <altgr shift letter j> : <dead letter \u031B> # horn
-
- assumption
- have_range "a" "z"
- have_range "A" "Z"
- have_range "0" "9"
- have_chars " !\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"
- have <dead compose>
- have <shift>
- have <altgr>
- have <alt>
- have <ctrl>
- end assumption
-
- for "A" to "Z" as \1
- <dead compose> "(" "\1" ")" : "\add(\u24B6 \sub(\1 "A"))"
- end for
-
- let \6 : { \and(\4 16) \and(\4 32) \and(\4 64) \and(\4 128) }
-
- for 0 to 3 as \8
- \set(\6 \8 \add(\rsh(\get(\6 \8) \8) \mul(2 \rsh(\get(\7 \8)))))
- end for
-
- if \or(\equals(\1 0) \equals(\1 "0"))
- "0"
- else if \or(\equals(\1 1) \equals(\1 "1"))
- "1"
- else
- "9"
- end if
-
- if \and(\1 128) ## a number is true iff it is not zero
- let \2 : \or(\2 64)
- end if
-
- <altgr menu> : <-altgr ultra>
-
- */
- source_code_destroy(&source_code);
return 0;
pfail:
xperror(*argv);
- source_code_destroy(&source_code);
return 1;
}