tttml.c - tttml - converters for a simpler syntax than markdown HTML git clone git://bitreich.org/tttml git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/tttml DIR Log DIR Files DIR Refs DIR Tags DIR README --- tttml.c (1298B) --- 1 #include <string.h> 2 #include <stdio.h> 3 #include <ctype.h> 4 5 #define WORD_MAX 1024 6 #define MIN(x, y) ((x) < (y) ? (x) : (y)) 7 8 /* 9 * Put the character c to stdout, and if the line is too long, insert 10 * a newline. If c == EOF, flush the last word out of fmtc's static 11 * buffer. 12 * 13 * It preserve the double space after a punctuation mark [.!?] if any. 14 */ 15 int 16 fmtc(char c, char *prefix, int max) 17 { 18 static int pos = 0, nspaces = 0, wlen = 0, was_space = 1, was_punct = 0, first = 1; 19 static char word[WORD_MAX], *w = word; 20 21 if (c != ' ' && c != '\n' && c != EOF) { 22 if (wlen + 1 < WORD_MAX) { 23 *w++ = c; 24 wlen++; 25 } 26 was_space = 0; 27 was_punct = !!strchr(".!?", c); 28 29 } else { 30 if (!was_space) { 31 was_space = 1; 32 33 if (pos + nspaces + wlen > max) { 34 pos = strlen(prefix); 35 fputc('\n', stdout); 36 fputs(prefix, stdout); 37 } else if (!first) { 38 pos += nspaces; 39 while (nspaces-- > 0) 40 fputc(' ', stdout); 41 } 42 43 pos += wlen; 44 word[wlen] = '\0'; 45 fputs(word, stdout); 46 47 w = word; 48 wlen = 0; 49 nspaces = 1; 50 } else { 51 nspaces = was_punct ? 2 : 1; 52 } 53 54 if (c == EOF) 55 fputc('\n', stdout); 56 57 first = 0; 58 } 59 60 return c; 61 } 62 63 int 64 main(void) 65 { 66 int c; 67 char *prefix; 68 69 prefix = " |"; 70 71 fputs(prefix, stdout); 72 while (fmtc(fgetc(stdin), prefix, 80) != EOF); 73 }