txt2html.c 2.4 KB

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