From 3ce7811758c351df069ae36c55886af8b577cb66 Mon Sep 17 00:00:00 2001 From: dx Date: Wed, 6 May 2020 06:03:32 +0100 Subject: +routine to compile plain text +diagnostics This routine will handle asterisks and bullet points. Works by checking characters at each step. Also has diagnostics by checking for matching characters. If a matching asterisk, for example, isn't found then present an error and quit. --- Converter/src/compiler.c | 112 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 107 insertions(+), 5 deletions(-) (limited to 'Converter/src') diff --git a/Converter/src/compiler.c b/Converter/src/compiler.c index 1c5b728..c6060be 100644 --- a/Converter/src/compiler.c +++ b/Converter/src/compiler.c @@ -2,15 +2,116 @@ #include #include -string compile_line(string line, size_t size_of_line) +void compile_plain_text(string dest, string src, size_t size_of_line, + string line_or_source) +{ + /* cursor is the current index on the dest pointer + * lower represents the last tag character before content + * upper represents the first tag character after content + * + * size_of_content is self explanatory (size of content in tags) + * tag_size is the compiled size of a tag + * md_tag_size is the precompiled size of a tag + * + * tag is the string for the open HTML tag + * close_tag is the string for the close HTML tag + * + * i and j are iterator variables + */ + int cursor, lower, upper; + size_t size_of_content, tag_size, md_tag_size; + string tag, close_tag; + int i, j; + + lower = 0; + upper = 0; + cursor = 0; + + for (i = 0; i < size_of_line; ++i) + { + // Asterisk routine + if (src[i] == '*') + { + j = i + 1; + + // Twin asterisks + if (src[i + 1] == '*') + { + tag = ""; + close_tag = ""; + tag_size = 8; + md_tag_size = 2; + + // Make j the cursor seeking for the matching asterisk pair + while ((j < size_of_line - 1) && (src[j] != '*' || src[j + 1] != '*')) + ++j; + + // if found + if (src[j] == '*') + { + lower = i + 1; + upper = j; + } + else + { + // ERROR + fprintf(stderr, "No matching asterisk for %s:%d\n", line_or_source, + i); + exit(-1); + } + } + + // one asterisk + else + { + tag = ""; + close_tag = ""; + tag_size = 3; + md_tag_size = 1; + while ((j < size_of_line) && (src[j] != '*')) ++j; + + if (src[j] == '*') + { + lower = i; + upper = j; + } + else + { + // error, no matching asterisk + fprintf(stderr, "No matching asterisk for %s:%d\n", line_or_source, + i); + exit(-1); + } + } + + /* + * Copy all + */ + size_of_content = upper - lower - 1; + strncpy(dest + cursor, tag, tag_size); + strncpy(dest + cursor + tag_size, src + lower + 1, size_of_content); + strncpy(dest + cursor + tag_size + size_of_content, close_tag, + tag_size + 1); + cursor += + tag_size + size_of_content + tag_size + 1; // shift after operation + i += size_of_content + (2 * md_tag_size) - 1; + } + else + { + strncpy(dest + cursor, &src[i], 1); + cursor += 1; + } + } +} + +string compile_line(string line, size_t size_of_line, string line_or_source) { string compiled_line; size_t size_of_content; + // Compile a header if (line[0] == '#') { - // Compile a header - // Get the level of header (h1, h2, etc) int depth; for (depth = 1; line[depth] == '#'; ++depth) continue; @@ -38,8 +139,9 @@ string compile_line(string line, size_t size_of_line) else { - compiled_line = malloc(sizeof(*compiled_line) * size_of_line); - strncpy(compiled_line, line, size_of_line); + // Assume standard text + compiled_line = malloc(sizeof(*compiled_line) * size_of_line * 2); + compile_plain_text(compiled_line, line, size_of_line, line_or_source); } return compiled_line; -- cgit v1.2.3-13-gbd6f