aboutsummaryrefslogtreecommitdiff
path: root/src/print.c
blob: 36140a84a67df12898c17cff1aa5528af4d3f5c2 (plain)
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "stmd.h"
  5. #include "debug.h"
  6. static void print_str(const unsigned char *s, int len)
  7. {
  8. int i;
  9. if (len < 0)
  10. len = strlen((char *)s);
  11. putchar('"');
  12. for (i = 0; i < len; ++i) {
  13. unsigned char c = s[i];
  14. switch (c) {
  15. case '\n':
  16. printf("\\n");
  17. break;
  18. case '"':
  19. printf("\\\"");
  20. break;
  21. case '\\':
  22. printf("\\\\");
  23. break;
  24. default:
  25. putchar((int)c);
  26. }
  27. }
  28. putchar('"');
  29. }
  30. // Functions to pretty-print inline and node_block lists, for debugging.
  31. // Prettyprint an inline list, for debugging.
  32. extern void print_blocks(node_block* b, int indent)
  33. {
  34. struct ListData *data;
  35. while(b != NULL) {
  36. // printf("%3d %3d %3d| ", b->start_line, b->start_column, b->end_line);
  37. for (int i=0; i < indent; i++) {
  38. putchar(' ');
  39. }
  40. switch(b->tag) {
  41. case BLOCK_DOCUMENT:
  42. printf("document\n");
  43. print_blocks(b->children, indent + 2);
  44. break;
  45. case BLOCK_BQUOTE:
  46. printf("block_quote\n");
  47. print_blocks(b->children, indent + 2);
  48. break;
  49. case BLOCK_LIST_ITEM:
  50. printf("list_item\n");
  51. print_blocks(b->children, indent + 2);
  52. break;
  53. case BLOCK_LIST:
  54. data = &(b->as.list);
  55. if (data->list_type == ordered) {
  56. printf("list (type=ordered tight=%s start=%d delim=%s)\n",
  57. (data->tight ? "true" : "false"),
  58. data->start,
  59. (data->delimiter == parens ? "parens" : "period"));
  60. } else {
  61. printf("list (type=bullet tight=%s bullet_char=%c)\n",
  62. (data->tight ? "true" : "false"),
  63. data->bullet_char);
  64. }
  65. print_blocks(b->children, indent + 2);
  66. break;
  67. case BLOCK_ATX_HEADER:
  68. printf("atx_header (level=%d)\n", b->as.header.level);
  69. print_inlines(b->inline_content, indent + 2);
  70. break;
  71. case BLOCK_SETEXT_HEADER:
  72. printf("setext_header (level=%d)\n", b->as.header.level);
  73. print_inlines(b->inline_content, indent + 2);
  74. break;
  75. case BLOCK_PARAGRAPH:
  76. printf("paragraph\n");
  77. print_inlines(b->inline_content, indent + 2);
  78. break;
  79. case BLOCK_HRULE:
  80. printf("hrule\n");
  81. break;
  82. case BLOCK_INDENTED_CODE:
  83. printf("indented_code ");
  84. print_str(b->string_content.ptr, -1);
  85. putchar('\n');
  86. break;
  87. case BLOCK_FENCED_CODE:
  88. printf("fenced_code length=%d info=",
  89. b->as.code.fence_length);
  90. print_str(b->as.code.info.ptr, -1);
  91. putchar(' ');
  92. print_str(b->string_content.ptr, -1);
  93. putchar('\n');
  94. break;
  95. case BLOCK_HTML:
  96. printf("html_block ");
  97. print_str(b->string_content.ptr, -1);
  98. putchar('\n');
  99. break;
  100. case BLOCK_REFERENCE_DEF:
  101. printf("reference_def\n");
  102. break;
  103. default:
  104. printf("# NOT IMPLEMENTED (%d)\n", b->tag);
  105. break;
  106. }
  107. b = b->next;
  108. }
  109. }
  110. // Prettyprint an inline list, for debugging.
  111. extern void print_inlines(node_inl* ils, int indent)
  112. {
  113. while(ils != NULL) {
  114. for (int i=0; i < indent; i++) {
  115. putchar(' ');
  116. }
  117. switch(ils->tag) {
  118. case INL_STRING:
  119. printf("str ");
  120. print_str(ils->content.literal.data, ils->content.literal.len);
  121. putchar('\n');
  122. break;
  123. case INL_LINEBREAK:
  124. printf("linebreak\n");
  125. break;
  126. case INL_SOFTBREAK:
  127. printf("softbreak\n");
  128. break;
  129. case INL_CODE:
  130. printf("code ");
  131. print_str(ils->content.literal.data, ils->content.literal.len);
  132. putchar('\n');
  133. break;
  134. case INL_RAW_HTML:
  135. printf("html ");
  136. print_str(ils->content.literal.data, ils->content.literal.len);
  137. putchar('\n');
  138. break;
  139. case INL_LINK:
  140. case INL_IMAGE:
  141. printf("%s url=", ils->tag == INL_LINK ? "link" : "image");
  142. if (ils->content.linkable.url)
  143. print_str(ils->content.linkable.url, -1);
  144. if (ils->content.linkable.title) {
  145. printf(" title=");
  146. print_str(ils->content.linkable.title, -1);
  147. }
  148. putchar('\n');
  149. print_inlines(ils->content.linkable.label, indent + 2);
  150. break;
  151. case INL_STRONG:
  152. printf("strong\n");
  153. print_inlines(ils->content.linkable.label, indent + 2);
  154. break;
  155. case INL_EMPH:
  156. printf("emph\n");
  157. print_inlines(ils->content.linkable.label, indent + 2);
  158. break;
  159. }
  160. ils = ils->next;
  161. }
  162. }