Add support for bool type.
[smdp.git] / src / parser.c
index ef7c697..ce3f702 100644 (file)
  */
 
 #include <ctype.h>
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
 #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,41 +305,57 @@ 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] == ' ') {
-        if(offset > unordered_list_offset + CODE_INDENT) {
-            SET_BIT(bits, IS_CODE);
-        } else if(offset != unordered_list_offset) {
-            for(i = unordered_list_level; i >= 0; i--) {
-                if(unordered_list_level_offset[i] == offset) {
-                    unordered_list_level = i;
-                    break;
+
+        for(i = offset; i<eol; i++) {
+            if(text->text[i] != '*' &&
+               text->text[i] != '-' &&
+               text->text[i] != ' ') {
+                if(offset > unordered_list_offset + CODE_INDENT) {
+                    SET_BIT(bits, IS_CODE);
+                } else if(offset != unordered_list_offset) {
+                    for(i = unordered_list_level; i >= 0; i--) {
+                        if(unordered_list_level_offset[i] == offset) {
+                            unordered_list_level = i;
+                            break;
+                        }
+                    }
+                    if(i != unordered_list_level) {
+                        unordered_list_level = MIN(unordered_list_level + 1, UNORDERED_LIST_MAX_LEVEL);
+                        unordered_list_level_offset[unordered_list_level] = offset;
+                    }
                 }
-            }
-            if(i != unordered_list_level) {
-                unordered_list_level = MIN(unordered_list_level + 1, UNORDERED_LIST_MAX_LEVEL);
-                unordered_list_level_offset[unordered_list_level] = offset;
+
+                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;
+                    case 2: SET_BIT(bits, IS_UNORDERED_LIST_2); break;
+                    case 3: SET_BIT(bits, IS_UNORDERED_LIST_3); break;
+                    default: break;
+                }
+
+                break;
             }
         }
+    }
 
-        if(unordered_list_level == 0) {
-            unordered_list_level = 1;
-            unordered_list_level_offset[1] = offset;
-        }
+    if(!CHECK_BIT(bits, IS_UNORDERED_LIST_1) &&
+       !CHECK_BIT(bits, IS_UNORDERED_LIST_2) &&
+       !CHECK_BIT(bits, IS_UNORDERED_LIST_3)) {
 
-        switch(unordered_list_level) {
-            case 1: SET_BIT(bits, IS_UNORDERED_LIST_1); break;
-            case 2: SET_BIT(bits, IS_UNORDERED_LIST_2); break;
-            case 3: SET_BIT(bits, IS_UNORDERED_LIST_3); break;
-            default: break;
-        }
-    } else {
         unordered_list_level = 0;
 
+        // IS_CODE
         if(offset >= CODE_INDENT) {
-            // IS_CODE
             SET_BIT(bits, IS_CODE);
+
         } else {
 
             for(i = offset; i < eol; i++) {
@@ -344,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;
@@ -462,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) {
@@ -485,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++;
@@ -495,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));
 }
-