#include #include #include #include static char *lstrip(char *restrict s) { size_t i; for(i = 0; s[i] != '\0'; i++) { if(!isspace(s[i])) { return &s[i]; } } return &s[i]; } static char *rstrip(char *restrict s) { char *last_nonspace = s; for(size_t i = 0; s[i] != '\0'; i++) { if(!isspace(s[i])) { last_nonspace = &s[i]; } } if(last_nonspace[0] != '\0') { last_nonspace[1] = '\0'; } return s; } static char *strip(char *restrict s) { return rstrip(lstrip(s)); } static void print_sanitized(const char *restrict s) { size_t i = 0; while(s[i] != '\0') { if(s[i] == '<') { printf("<"); } else if(s[i] == '>') { printf(">"); } else if(s[i] == '&') { printf("&"); } else if(s[i] == '"') { printf("""); } else { printf("%c", s[i]); } i++; } } int main(int argc, char **argv) { int list_mode = 0, preformat_mode = 0; // Read lines char *line = NULL; size_t line_buf_len = 0; ssize_t line_len; while((line_len = getline(&line, &line_buf_len, stdin)) != -1) { line[line_len - 1] = '\0'; line_len--; // Disable list mode if(list_mode && (line[0] != '*' || line[1] != ' ')) { list_mode = 0; printf("\n"); } // Preformatted mode if(preformat_mode) { if(line_len == 3 && line[0] == '`' && line[1] == '`' && line[2] == '`') { preformat_mode = 0; printf("\n"); } else { print_sanitized(line); printf("\n"); } continue; } // Blank lines if(line[0] == '\0') { printf("
\n"); } // Links else if(line_len >= 2 && line[0] == '=' && line[1] == '>') { // Discard leading whitespace char *url = lstrip(&line[2]); // Get label char *label = NULL; for(size_t i = 0; url[i] != '\0'; i++) { if(isspace(url[i])) { url[i] = '\0'; label = &url[i + 1]; break; } } // Print link if(label == NULL) { label = url; } else { label = strip(label); } printf(""); print_sanitized(label); printf("
\n"); } // Headings else if(line[0] == '#') { unsigned int header_count = 1; if(line_len >= 2 && line[1] == '#') { header_count++; if(line_len >= 3 && line[2] == '#') { header_count++; } } printf("", header_count); print_sanitized(strip(line + header_count)); printf("\n", header_count); } // Lists else if(line_len >= 2 && line[0] == '*' && line[1] == ' ') { if(!list_mode) { list_mode = 1; printf("
    \n"); } printf("
  • "); print_sanitized(strip(line + 2)); printf("
  • \n"); } // Blockquotes else if(line[0] == '>') { printf(""); print_sanitized(strip(line + 1)); printf("\n"); } // Preformatted text else if(line_len >= 3 && line[0] == '`' && line[1] == '`' && line[2] == '`') { preformat_mode = 1; printf("
    \n");
    		}
    		
    		// Regular text
    		else {
    			printf("

    "); print_sanitized(strip(line)); printf("

    \n"); } } free(line); // Disable list mode if(list_mode) { list_mode = 0; printf("
\n"); } // Preformatted mode if(preformat_mode) { preformat_mode = 0; printf("\n"); } // Return if(feof(stdin)) { return EXIT_SUCCESS; } else { return EXIT_FAILURE; } }