From 7f5ecacd12e7908a3f1575b53920c10dac2e9a56 Mon Sep 17 00:00:00 2001 From: verdant Date: Sun, 31 May 2026 11:38:49 +0800 Subject: Remove cmark, refactor all Implement head and split line parser --- vmp.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 vmp.c (limited to 'vmp.c') diff --git a/vmp.c b/vmp.c new file mode 100644 index 0000000..1480d4b --- /dev/null +++ b/vmp.c @@ -0,0 +1,91 @@ +#include +#include "vmp.h" + +int main(int argc, char** argv) +{ + + /* Get input and output file name */ + if (argc != 2) { + error("Usage: vmp \n", NO_ARG); + } + + const char* in_file_name = argv[1]; + if (sizeof(in_file_name) <= 3) { + error("File name is too short\n",IN_NAME_TOO_SHORT); + } + + run(in_file_name); + return 0; +} + +void error(const char* msg, int code) { + printf("%s", msg); + exit(code); +} + +void run(const char* in_file_name) { + FILE* fd = fopen(in_file_name, "r"); + if (!fd) { + error("Cannot open input file.\n", CANNOT_OPEN_FILE); + } + + char line[1024]; + while(fgets(line, sizeof(line), fd) != NULL) { + int len = strlen(line); + while (len > 0 && isspace(line[len - 1])) { + line[--len] = '\0'; + } + + parse_and_output(line); + } + + fclose(fd); +} + +void parse_head(const char* line) { + int level = 0; + size_t i = 0; + + while(line[i] == '#' && i < strlen(line)) { + level++; + i++; + } + + if (i < strlen(line) && line[i] == ' ' && level <=6 ) { + printf("", level); + + int start = i; + int length = strlen(line); + char head_text[512]; + strncpy(head_text, line + start + 1, length); + + printf("%s", head_text); + printf("", level); + } else { + int start = i; + int length = strlen(line); + char head_text[512]; + strncpy(head_text, line + start + 1, length); + + printf("%s", head_text); + } +} + +void parse_and_output(const char* line) { + int in_empty_line = 0; + + /* Empty */ + if (strcmp(line, "") == 0) { + printf("
\n"); + in_empty_line = 1; + } else { + in_empty_line = 0; + char line_head = line[0]; + + if (line_head == '#') { + parse_head(line); + } else if (strcmp(line, "---") == 0) { + printf("
\n"); + } + } +} -- cgit v1.2.3