txt2html

Converts plaintext to HTML
git clone git://src.gearsix.net/txt2htmltxt2html.zip
Log | Files | Refs | Atom | README

txt2html.c (raw) (2469B)


   1 #include "txt2html.h"
   2 
   3 struct node *convf(FILE *f);
   4 int readn(struct node *n);
   5 
   6 static uint8_t opts; // make extern if passing it about becomes a pain
   7 
   8 void help()
   9 {
  10 	puts("usage: txt2html [OPTIONS] FILE...");
  11 	puts("");
  12 	puts("Convert content in txt files to html.");
  13 	puts("");
  14 	puts("FILE...   A list of filepaths that point to files to be converted to HTML");
  15 	puts("");
  16 	puts("OPTIONS");
  17 	puts("-br           Treat newlines within paragraphs as line breaks.");
  18 	puts("-v            Print verbose logs during runtime");
  19 	puts("-h, --help    Print this message");
  20 }
  21 
  22 void verbose(const char *fmt, ...)
  23 {
  24 	if (opts & OPT_V) {
  25 		printf("txt2html: ");
  26 		va_list args;
  27 		va_start(args, fmt);
  28 		vprintf(fmt, args);
  29 		va_end(args);
  30 		fflush(stdout);
  31 	}
  32 }
  33 
  34 void parseargs(int argc, char **argv)
  35 {
  36 	int i = 0, a = argc-1;
  37 	for (; a > 0; --a) {
  38 		if (argv[a] == NULL)
  39 			continue;
  40 		if (argv[a][i] == '-') {
  41 			if (strcmp(argv[a], "-h") == 0 ||
  42 				strcmp(argv[a], "--help") == 0) {
  43 				help();
  44 				exit(0);
  45 			} else if (strcmp(argv[a], "-br") == 0) {
  46 				opts |= OPT_BR;
  47 			} else if (strcmp(argv[a], "-v") == 0) {
  48 				opts |= OPT_V;
  49 			} else if (strcmp(argv[a], "-nm") == 0) {
  50 				opts |= OPT_NM;
  51 			}
  52 			
  53 			argv[a][0] = '\0';
  54 		}
  55 	}
  56 }
  57 
  58 int main(int argc, char **argv)
  59 {
  60 	parseargs(argc, argv);
  61 	verbose("printing verbose logs\n");
  62 
  63 	int a;
  64 	FILE *f;
  65 	struct node *n;
  66 	for (a = 1; a < argc; ++a) {
  67 		if (strlen(argv[a]) == 0)
  68 			continue;
  69 
  70 		verbose("opening %s\n", argv[a]);
  71 		if ((f = fopen(argv[a], "r")) == NULL) {
  72 			perror("fopen failed, abort");
  73 			continue;
  74 		}
  75 
  76 		n = convf(f);
  77 		verbose("counted %d nodes\n", readn(n));
  78 		verbose("closing %s\n", argv[a]);
  79 		if (fclose(f) == EOF) perror("fclose failed");
  80 
  81 		while (!n) {
  82 			if (n->buf && n->buf[strlen(n->buf)+1] == '$')
  83 				free(n->buf);
  84 			if (n->next) free(n->next);
  85 			if (n->prev) {
  86 				n = n->prev;
  87 			} else {
  88 				free(n);
  89 				break;
  90 			}
  91 		}
  92 		node_create(NULL, 0); // reset node count
  93 	}
  94 
  95 	return EXIT_SUCCESS;
  96 }
  97 
  98 struct node *convf(FILE *f)
  99 {
 100 	int siz;
 101 	struct node *n = 0;
 102 	char buf[BUFSIZ] = {'\0'};
 103 	while (true) {
 104 		siz = fread(buf, sizeof(char), BUFSIZ-1, f);
 105 		if (siz == 0) break;
 106 		buf[siz+1] = '\0';
 107 		verbose("read %d bytes\n", siz);
 108 		n = parse_buf(buf, &n, opts);
 109 	}
 110 	n = parse_buf(NULL, &n, opts);
 111 	return n;
 112 }
 113 
 114 int readn(struct node *n)
 115 {
 116 	while (n->prev)
 117 		n = n->prev; // rewind
 118 	int cnt = 0;
 119 	while (n) {
 120 		if (n->buf) printf("%s", n->buf);
 121 		n = n->next;
 122 		++cnt;
 123 	}
 124 	return cnt;
 125 }