aboutsummaryrefslogtreecommitdiff
path: root/src/print.c
blob: 832ad4f35a234372c3d2ceabb4071f1a11c60417 (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 block lists, for debugging.
  31. // Prettyprint an inline list, for debugging.
  32. extern void print_blocks(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 document:
  42. printf("document\n");
  43. print_blocks(b->children, indent + 2);
  44. break;
  45. case block_quote:
  46. printf("block_quote\n");
  47. print_blocks(b->children, indent + 2);
  48. break;
  49. case list_item:
  50. data = &(b->attributes.list_data);
  51. printf("list_item\n");
  52. print_blocks(b->children, indent + 2);
  53. break;
  54. case list:
  55. data = &(b->attributes.list_data);
  56. if (data->list_type == ordered) {
  57. printf("list (type=ordered tight=%s start=%d delim=%s)\n",
  58. (data->tight ? "true" : "false"),
  59. data->start,
  60. (data->delimiter == parens ? "parens" : "period"));
  61. } else {
  62. printf("list (type=bullet tight=%s bullet_char=%c)\n",
  63. (data->tight ? "true" : "false"),
  64. data->bullet_char);
  65. }
  66. print_blocks(b->children, indent + 2);
  67. break;
  68. case atx_header:
  69. printf("atx_header (level=%d)\n", b->attributes.header_level);
  70. print_inlines(b->inline_content, indent + 2);
  71. break;
  72. case setext_header:
  73. printf("setext_header (level=%d)\n", b->attributes.header_level);
  74. print_inlines(b->inline_content, indent + 2);
  75. break;
  76. case paragraph:
  77. printf("paragraph\n");
  78. print_inlines(b->inline_content, indent + 2);
  79. break;
  80. case hrule:
  81. printf("hrule\n");
  82. break;
  83. case indented_code:
  84. printf("indented_code ");
  85. print_str(b->string_content.ptr, -1);
  86. putchar('\n');
  87. break;
  88. case fenced_code:
  89. printf("fenced_code length=%d info=",
  90. b->attributes.fenced_code_data.fence_length);
  91. print_str(b->attributes.fenced_code_data.info.ptr, -1);
  92. putchar(' ');
  93. print_str(b->string_content.ptr, -1);
  94. putchar('\n');
  95. break;
  96. case html_block:
  97. printf("html_block ");
  98. print_str(b->string_content.ptr, -1);
  99. putchar('\n');
  100. break;
  101. case reference_def:
  102. printf("reference_def\n");
  103. break;
  104. default:
  105. printf("# NOT IMPLEMENTED (%d)\n", b->tag);
  106. break;
  107. }
  108. b = b->next;
  109. }
  110. }
  111. // Prettyprint an inline list, for debugging.
  112. extern void print_inlines(inl* ils, int indent)
  113. {
  114. while(ils != NULL) {
  115. for (int i=0; i < indent; i++) {
  116. putchar(' ');
  117. }
  118. switch(ils->tag) {
  119. case INL_STRING:
  120. printf("str ");
  121. print_str(ils->content.literal.data, ils->content.literal.len);
  122. putchar('\n');
  123. break;
  124. case INL_LINEBREAK:
  125. printf("linebreak\n");
  126. break;
  127. case INL_SOFTBREAK:
  128. printf("softbreak\n");
  129. break;
  130. case INL_CODE:
  131. printf("code ");
  132. print_str(ils->content.literal.data, ils->content.literal.len);
  133. putchar('\n');
  134. break;
  135. case INL_RAW_HTML:
  136. printf("html ");
  137. print_str(ils->content.literal.data, ils->content.literal.len);
  138. putchar('\n');
  139. break;
  140. case INL_ENTITY:
  141. printf("entity ");
  142. print_str(ils->content.literal.data, ils->content.literal.len);
  143. putchar('\n');
  144. break;
  145. case INL_LINK:
  146. case INL_IMAGE:
  147. printf("%s url=", ils->tag == INL_LINK ? "link" : "image");
  148. if (ils->content.linkable.url)
  149. print_str(ils->content.linkable.url, -1);
  150. if (ils->content.linkable.title) {
  151. printf(" title=");
  152. print_str(ils->content.linkable.title, -1);
  153. }
  154. putchar('\n');
  155. print_inlines(ils->content.linkable.label, indent + 2);
  156. break;
  157. case INL_STRONG:
  158. printf("strong\n");
  159. print_inlines(ils->content.linkable.label, indent + 2);
  160. break;
  161. case INL_EMPH:
  162. printf("emph\n");
  163. print_inlines(ils->content.linkable.label, indent + 2);
  164. break;
  165. }
  166. ils = ils->next;
  167. }
  168. }