X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=src%2Fparser.c;h=ce3f7028b5345214f83778c2c6ed2fa494610b4a;hb=bdd26d4dde3b3d3180619cc81622081025ca6cb5;hp=a573106888282a4b060fed5cd4398de3185de418;hpb=b00bb5d470d1afe9790607c2bd8bd961e96553fc;p=smdp.git diff --git a/src/parser.c b/src/parser.c index a573106..ce3f702 100644 --- a/src/parser.c +++ b/src/parser.c @@ -22,8 +22,10 @@ */ #include +#include #include #include +#include #include "parser.h" @@ -34,20 +36,21 @@ deck_t *markdown_load(FILE *input) { int l = 0; // line length int hc = 0; // header count int lc = 0; // line count - int sc = 0; // slide count + int sc = 1; // slide count int bits = 0; // markdown bits deck_t *deck = new_deck(); - slide_t *slide = new_slide(); + slide_t *slide = deck->slide; line_t *line = NULL; line_t *tmp = NULL; cstring_t *text = cstring_init(); - // assign first slide to deck - deck->slide = slide; - sc++; - while ((c = fgetc(input)) != EOF) { + if (ferror(input)) { + fprintf(stderr, "markdown_load() failed to read input: %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + if(c == '\n') { // markdown analyse @@ -178,8 +181,8 @@ deck_t *markdown_load(FILE *input) { } // split linked list - line->prev->next = (void*)0; - line->prev = (void*)0; + line->prev->next = NULL; + line->prev = NULL; // remove header lines from slide deck->slide->line = line; @@ -266,7 +269,7 @@ deck_t *markdown_load(FILE *input) { } tmp = tmp->next; } - + for(tmp = line; tmp != list_last_level_1; tmp = tmp->next) { SET_BIT(tmp->bits, IS_UNORDERED_LIST_1); } @@ -302,11 +305,12 @@ int markdown_analyse(cstring_t *text) { // strip trailing spaces for(eol = text->size; eol > offset && isspace((unsigned char) text->text[eol - 1]); eol--); + // IS_UNORDERED_LIST_# if(text->size >= offset + 2 && (text->text[offset] == '*' || text->text[offset] == '-') && text->text[offset + 1] == ' ') { - for(i = offset; itext[i] != '*' && text->text[i] != '-' && text->text[i] != ' ') { @@ -328,7 +332,7 @@ int markdown_analyse(cstring_t *text) { if(unordered_list_level == 0) { unordered_list_level = 1; unordered_list_level_offset[1] = offset; - } + } switch(unordered_list_level) { case 1: SET_BIT(bits, IS_UNORDERED_LIST_1); break; @@ -336,20 +340,22 @@ int markdown_analyse(cstring_t *text) { case 3: SET_BIT(bits, IS_UNORDERED_LIST_3); break; default: break; } - + break; } + } } - + if(!CHECK_BIT(bits, IS_UNORDERED_LIST_1) && !CHECK_BIT(bits, IS_UNORDERED_LIST_2) && !CHECK_BIT(bits, IS_UNORDERED_LIST_3)) { unordered_list_level = 0; + // IS_CODE if(offset >= CODE_INDENT) { - // IS_CODE SET_BIT(bits, IS_CODE); + } else { for(i = offset; i < eol; i++) { @@ -357,9 +363,6 @@ int markdown_analyse(cstring_t *text) { if(text->text[i] == ' ') { spaces++; - } else if(CHECK_BIT(bits, IS_CODE)) { - other++; - } else { switch(text->text[i]) { case '=': equals++; break; @@ -475,8 +478,8 @@ void markdown_debug(deck_t *deck, int debug) { } } -int is_utf8(char ch) { - return (ch & 0x80); +bool is_utf8(char ch) { + return (ch & 0x80) != 0x00; } int length_utf8(char ch) { @@ -498,6 +501,13 @@ int next_nonblank(cstring_t *text, int i) { return i; } +int prev_blank(cstring_t *text, int i) { + while ((i > 0) && !isspace((unsigned char) (text->text)[i])) + i--; + + return i; +} + int next_blank(cstring_t *text, int i) { while ((i < text->size) && !isspace((unsigned char) (text->text)[i])) i++; @@ -508,4 +518,3 @@ int next_blank(cstring_t *text, int i) { int next_word(cstring_t *text, int i) { return next_nonblank(text, next_blank(text, i)); } -