чување d29a55b0a22ca78c431bb2f5b550c222104fdaa7
родитељ be389e9724c95439680c33538d81ce75165930a4
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Sat, 30 Jan 2021 21:41:33 +0100
Added figure/figcaption tags to images; fixed a bug with mixed footnotes, images and links; corrected all memory leaks with valgrind
Signed-off-by: Страхиња Радић <contact@strahinja.org>
Diffstat:
| M | index.html | | | 2 | +- |
| M | slweb.c | | | 259 | ++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------- |
измењених датотека: 2, додавања: 166(+), брисања: 95(-)
diff --git a/index.html b/index.html
@@ -136,7 +136,7 @@ this program. If not, see <<a href="https://www.gnu.org/licenses">https://www
<div id="git-log">
Previous commit:
-index.slw 18fdf75 2021-01-28 15:39:22 +0100 (Страхиња Радић) (HEAD -> master, origin/master, origin/HEAD)
+index.slw be389e9 2021-01-28 18:31:28 +0100 (Страхиња Радић) (HEAD -> master, origin/master, origin/HEAD)
</div><!--git-log-->
diff --git a/slweb.c b/slweb.c
@@ -57,8 +57,8 @@ static ULONG state = ST_NONE;
CHECKEXITNOMEM(newptr) \
ptr = newptr; }
-#define REALLOCARRAY(ptr, membtype, newcount) { ptr = realloc(ptr, \
- newcount * sizeof(membtype)); CHECKEXITNOMEM(ptr) }
+#define REALLOCARRAY(ptr, membtype, newcount) \
+ REALLOC(ptr, membtype, sizeof(membtype) * newcount)
#define CHECKCOPY(token, ptoken, token_size, pline) { \
if (ptoken + 2 > token + token_size) \
@@ -117,6 +117,23 @@ warning(int code, uint8_t* fmt, ...)
}
int
+free_keyvalue(KeyValue** list, size_t list_count)
+{
+ if (!list || !*list)
+ return 1;
+
+ for (size_t index = 0; index < list_count; index++)
+ {
+ KeyValue* current = *list + index;
+ if (current->value)
+ free(current->value);
+ if (current->key)
+ free(current->key);
+ }
+ return 0;
+}
+
+int
slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
BOOL read_yaml_macros_and_links);
@@ -282,7 +299,6 @@ print_command(const char* command,
dup2(arg_pipe_fds[PIPE_READ_INDEX], STDIN_FILENO);
dup2(output_pipe_fds[PIPE_WRITE_INDEX], STDOUT_FILENO);
- dup2(output_pipe_fds[PIPE_WRITE_INDEX], STDERR_FILENO);
execvp(command, (char* const*)pass_arguments);
exit(1);
@@ -376,6 +392,8 @@ read_file_into_buffer(uint8_t** buffer, size_t* buffer_size, char* input_filenam
**input_dirname = '.';
}
+ fclose(*input);
+
return 0;
}
@@ -1164,7 +1182,8 @@ process_tag(uint8_t* token, FILE* output, BOOL read_yaml_macros_and_links,
BOOL* skip_eol, BOOL end_tag)
{
if (!token || u8_strlen(token) < 1)
- return warning(1, (uint8_t*)"Empty tag name");
+ return warning(1, (uint8_t*)"%s:%ld:%ld: Empty tag name",
+ input_filename, lineno, colno);
if (!strcmp((char*)token, "git-log")
&& !read_yaml_macros_and_links) /* {git-log} */
@@ -1361,8 +1380,11 @@ process_link(uint8_t* link_text, uint8_t* link_macro_body, uint8_t* link_id,
int
process_inline_image(uint8_t* image_text, uint8_t* image_url, FILE* output,
- BOOL add_link)
+ BOOL add_link, BOOL add_figcaption)
{
+ if (add_figcaption)
+ print_output(output, "<figure>\n");
+
if (add_link)
print_output(output, "<a href=\"%s\" title=\"%s\" class=\"image\""
" target=\"_blank\">",
@@ -1375,14 +1397,20 @@ process_inline_image(uint8_t* image_text, uint8_t* image_url, FILE* output,
if (add_link)
print_output(output, "</a>");
+
+ if (add_figcaption)
+ print_output(output, "<figcaption>%s</figcaption>\n</figure>\n",
+ image_text);
return 0;
}
int
-process_image(uint8_t* image_text, uint8_t* image_id, FILE* output, BOOL add_link)
+process_image(uint8_t* image_text, uint8_t* image_id, FILE* output,
+ BOOL add_link, BOOL add_figcaption)
{
uint8_t* url = get_value(links, links_count, image_id, NULL);
- return process_inline_image(image_text, url, output, add_link);
+ return process_inline_image(image_text, url, output, add_link,
+ add_figcaption);
}
int
@@ -1404,9 +1432,9 @@ process_line_start(uint8_t* line, BOOL first_line_in_doc,
if (state & ST_FOOTNOTE_TEXT)
{
- state &= ~ST_FOOTNOTE_TEXT;
- if (!read_yaml_macros_and_links)
+ if (!read_yaml_macros_and_links && (state & ST_PARA_OPEN))
print_output(output, "</p>\n");
+ state &= ~(ST_FOOTNOTE_TEXT | ST_PARA_OPEN);
}
}
if (!read_yaml_macros_and_links)
@@ -1417,6 +1445,29 @@ process_line_start(uint8_t* line, BOOL first_line_in_doc,
}
int
+process_text_token(uint8_t* line, BOOL first_line_in_doc,
+ BOOL previous_line_blank,
+ BOOL processed_start_of_line,
+ BOOL read_yaml_macros_and_links, BOOL list_para,
+ FILE* output, uint8_t** token,
+ uint8_t** ptoken, size_t* token_size,
+ BOOL add_enclosing_paragraph)
+{
+ if (!(state & ST_YAML))
+ {
+ if (add_enclosing_paragraph && !processed_start_of_line)
+ process_line_start(line, first_line_in_doc, previous_line_blank,
+ read_yaml_macros_and_links, list_para, output, token, ptoken);
+ **ptoken = 0;
+ if (**token && !read_yaml_macros_and_links
+ && !(state & ST_MACRO_BODY))
+ print_output(output, "%s", *token);
+ }
+ RESET_TOKEN(*token, *ptoken, *token_size)
+ return 0;
+}
+
+int
process_inline_footnote(uint8_t* token, BOOL read_yaml_macros_and_links,
FILE* output)
{
@@ -1478,6 +1529,7 @@ process_footnote(uint8_t* token, BOOL footnote_definition, BOOL footnote_output,
int
process_horizontal_rule(FILE* output)
{
+ /* Temporarily break paragraph as hr is para-level */
if (state & ST_PARA_OPEN)
print_output(output, "</p>\n");
print_output(output, "<hr />\n");
@@ -1487,29 +1539,6 @@ process_horizontal_rule(FILE* output)
}
int
-process_text_token(uint8_t* line, BOOL first_line_in_doc,
- BOOL previous_line_blank,
- BOOL processed_start_of_line,
- BOOL read_yaml_macros_and_links, BOOL list_para,
- FILE* output, uint8_t** token,
- uint8_t** ptoken, size_t* token_size,
- BOOL add_enclosing_paragraph)
-{
- if (!(state & ST_YAML))
- {
- if (add_enclosing_paragraph && !processed_start_of_line)
- process_line_start(line, first_line_in_doc, previous_line_blank,
- read_yaml_macros_and_links, list_para, output, token, ptoken);
- **ptoken = 0;
- if (**token && !read_yaml_macros_and_links
- && !(state & ST_MACRO_BODY))
- print_output(output, "%s", *token);
- }
- RESET_TOKEN(*token, *ptoken, *token_size)
- return 0;
-}
-
-int
process_formula(FILE* output, const uint8_t* token, BOOL display_formula)
{
int result = 0;
@@ -1641,6 +1670,7 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
uint8_t* permalink_url = NULL;
uint8_t* ext_in_permalink = NULL;
uint8_t* var_add_image_links = NULL;
+ uint8_t* var_add_figcaption = NULL;
uint8_t* var_add_footnote_div = NULL;
uint8_t* pbuffer = NULL;
uint8_t* line = NULL;
@@ -1661,9 +1691,10 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
BOOL previous_line_blank = FALSE;
BOOL processed_start_of_line = FALSE;
BOOL add_image_links = TRUE;
+ BOOL add_figcaption = TRUE;
BOOL add_footnote_div = FALSE;
BOOL list_para = FALSE;
- BOOL yaml_parsed = FALSE;
+ BOOL footnote_at_line_start = FALSE;
size_t pline_len = 0;
if (!buffer)
@@ -1686,6 +1717,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
ext_in_permalink = get_value(vars, vars_count, (uint8_t*)"ext-in-permalink", NULL);
var_add_image_links = get_value(vars, vars_count, (uint8_t*)"add-image-links", NULL);
add_image_links = !(var_add_image_links && *var_add_image_links == '0');
+ var_add_figcaption = get_value(vars, vars_count, (uint8_t*)"add-figcaption", NULL);
+ add_figcaption = !(var_add_figcaption && *var_add_figcaption == '0');
var_add_footnote_div = get_value(vars, vars_count, (uint8_t*)"add-footnote-div", NULL);
add_footnote_div = var_add_footnote_div && *var_add_footnote_div == '1';
@@ -1782,22 +1815,20 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
{
skip_eol = TRUE;
- if (yaml_parsed && !read_yaml_macros_and_links)
- {
+ if (!(state & ST_YAML)
+ && lineno > 1
+ && !read_yaml_macros_and_links)
process_horizontal_rule(output);
- pline = NULL;
- break;
- }
-
- state ^= ST_YAML;
-
- if (!(state & ST_YAML))
- yaml_parsed = TRUE;
-
- skip_change_first_line_in_doc = TRUE;
+ else
+ {
+ if (lineno == 1)
+ state |= ST_YAML;
+ else
+ state &= ~ST_YAML;
- pline += 3;
- colno += 3;
+ skip_change_first_line_in_doc = TRUE;
+ }
+ pline = NULL;
}
else if (colno == 1
&& u8_strlen(pline) > 1
@@ -1829,8 +1860,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
case ':':
if (state & ST_YAML
&& !(state & (ST_CODE | ST_DISPLAY_FORMULA | ST_FORMULA
- | ST_HEADING | ST_MACRO_BODY | ST_PRE | ST_TAG
- | ST_YAML_VAL))
+ | ST_HEADING | ST_IMAGE | ST_MACRO_BODY
+ | ST_PRE | ST_TAG | ST_YAML_VAL))
&& read_yaml_macros_and_links)
{
*ptoken = 0;
@@ -1865,7 +1896,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
break;
case '`':
- if (state & (ST_DISPLAY_FORMULA | ST_FORMULA | ST_MACRO_BODY))
+ if (state & (ST_DISPLAY_FORMULA | ST_FORMULA | ST_IMAGE
+ | ST_MACRO_BODY))
{
CHECKCOPY(token, ptoken, token_size, pline)
colno++;
@@ -1964,8 +1996,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
case '_':
if (state & (ST_CODE | ST_DISPLAY_FORMULA | ST_FORMULA
- | ST_HTML_TAG | ST_MACRO_BODY | ST_PRE | ST_TAG
- | ST_YAML))
+ | ST_HTML_TAG | ST_IMAGE | ST_MACRO_BODY | ST_PRE
+ | ST_TAG | ST_YAML))
{
CHECKCOPY(token, ptoken, token_size, pline)
colno++;
@@ -2058,7 +2090,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
case '*':
if (state & (ST_CODE | ST_DISPLAY_FORMULA | ST_FORMULA
- | ST_HTML_TAG | ST_MACRO_BODY | ST_PRE | ST_YAML))
+ | ST_HTML_TAG | ST_IMAGE | ST_MACRO_BODY | ST_PRE
+ | ST_YAML))
{
CHECKCOPY(token, ptoken, token_size, pline)
colno++;
@@ -2171,7 +2204,7 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
case ' ':
if (state & (ST_CODE | ST_DISPLAY_FORMULA | ST_FORMULA
- | ST_MACRO_BODY | ST_PRE | ST_YAML_VAL))
+ | ST_IMAGE | ST_MACRO_BODY | ST_PRE | ST_YAML_VAL))
{
CHECKCOPY(token, ptoken, token_size, pline)
colno++;
@@ -2284,7 +2317,7 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
case '/':
if (state & (ST_CODE | ST_DISPLAY_FORMULA | ST_FORMULA
- | ST_PRE | ST_HEADING | ST_YAML_VAL))
+ | ST_IMAGE | ST_PRE | ST_HEADING | ST_YAML_VAL))
{
CHECKCOPY(token, ptoken, token_size, pline)
colno++;
@@ -2304,7 +2337,7 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
case '}':
if (state & (ST_CODE | ST_DISPLAY_FORMULA | ST_FORMULA
- | ST_PRE | ST_YAML | ST_YAML_VAL))
+ | ST_IMAGE | ST_PRE | ST_YAML | ST_YAML_VAL))
{
CHECKCOPY(token, ptoken, token_size, pline)
colno++;
@@ -2329,7 +2362,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
case '|':
if (state & (ST_CODE | ST_DISPLAY_FORMULA | ST_FORMULA
- | ST_HTML_TAG | ST_PRE | ST_TAG | ST_YAML))
+ | ST_HTML_TAG | ST_IMAGE | ST_PRE | ST_TAG
+ | ST_YAML))
{
CHECKCOPY(token, ptoken, token_size, pline)
colno++;
@@ -2388,7 +2422,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
case '<':
if (read_yaml_macros_and_links
- || (state & (ST_DISPLAY_FORMULA | ST_FORMULA)))
+ || (state & (ST_DISPLAY_FORMULA | ST_FORMULA
+ | ST_IMAGE)))
{
CHECKCOPY(token, ptoken, token_size, pline)
colno++;
@@ -2416,7 +2451,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
if (state & ST_HTML_TAG)
state &= ~ST_HTML_TAG;
- if (state & (ST_DISPLAY_FORMULA | ST_FORMULA | ST_MACRO_BODY))
+ if (state & (ST_DISPLAY_FORMULA | ST_FORMULA | ST_IMAGE
+ | ST_MACRO_BODY))
{
CHECKCOPY(token, ptoken, token_size, pline)
colno++;
@@ -2445,7 +2481,7 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
case '!':
if (state & (ST_CODE | ST_DISPLAY_FORMULA | ST_FORMULA
- | ST_FOOTNOTE_TEXT | ST_HEADING
+ | ST_FOOTNOTE_TEXT | ST_HEADING | ST_IMAGE
| ST_INLINE_FOOTNOTE | ST_LINK | ST_MACRO_BODY
| ST_PRE))
{
@@ -2467,6 +2503,7 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
RESET_TOKEN(token, ptoken, token_size)
state |= ST_IMAGE;
+ keep_token = TRUE;
pline += 2;
colno += 2;
}
@@ -2504,21 +2541,32 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
pline_len = u8_strlen(pline);
if (state & (ST_CODE | ST_DISPLAY_FORMULA | ST_FORMULA
- | ST_HEADING | ST_MACRO_BODY | ST_PRE))
+ | ST_HEADING | ST_IMAGE | ST_MACRO_BODY | ST_PRE))
{
CHECKCOPY(token, ptoken, token_size, pline)
colno++;
break;
}
+ if (state & ST_FOOTNOTE_TEXT)
+ {
+ if (!read_yaml_macros_and_links && (state & ST_PARA_OPEN))
+ print_output(output, "</p>\n");
+ state &= ~(ST_FOOTNOTE_TEXT | ST_PARA_OPEN);
+ }
+
if (pline_len > 1 && *(pline+1) == '^')
{
- /* Output existing text up to [^ */
- *ptoken = 0;
- process_text_token(line, first_line_in_doc,
- previous_line_blank, processed_start_of_line,
- read_yaml_macros_and_links, list_para, output,
- &token, &ptoken, &token_size, TRUE);
+ footnote_at_line_start = colno == 1;
+ if (*token)
+ {
+ /* Output existing text up to [^ */
+ *ptoken = 0;
+ process_text_token(line, first_line_in_doc,
+ previous_line_blank, processed_start_of_line,
+ read_yaml_macros_and_links, list_para, output,
+ &token, &ptoken, &token_size, TRUE);
+ }
processed_start_of_line = TRUE;
RESET_TOKEN(token, ptoken, token_size)
@@ -2529,27 +2577,29 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
}
if (*token)
+ {
/* Output existing text up to [ */
+ *ptoken = 0;
process_text_token(line, first_line_in_doc,
previous_line_blank,
processed_start_of_line,
read_yaml_macros_and_links,
list_para, output, &token, &ptoken, &token_size,
TRUE);
+ }
processed_start_of_line = TRUE;
RESET_TOKEN(token, ptoken, token_size)
-
state |= ST_LINK;
+ keep_token = TRUE;
*link_macro = 0;
-
pline++;
colno++;
break;
case '(':
if (state & (ST_CODE | ST_DISPLAY_FORMULA | ST_FORMULA
- | ST_FOOTNOTE_TEXT | ST_HEADING
+ | ST_FOOTNOTE_TEXT | ST_HEADING
| ST_INLINE_FOOTNOTE | ST_MACRO_BODY | ST_PRE))
CHECKCOPY(token, ptoken, token_size, pline)
else if (state & ST_LINK)
@@ -2616,7 +2666,7 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
token, output);
else
process_inline_image(link_text, token, output,
- add_image_links);
+ add_image_links, add_figcaption);
}
RESET_TOKEN(token, ptoken, token_size)
state &= ~(ST_LINK | ST_LINK_SECOND_ARG
@@ -2651,7 +2701,7 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
else if (state & ST_FOOTNOTE)
{
BOOL footnote_definition = (u8_strlen(pline) > 1)
- && (*(pline+1) == ':');
+ && (*(pline+1) == ':') && footnote_at_line_start;
process_footnote(token,
footnote_definition && read_yaml_macros_and_links,
@@ -2660,6 +2710,7 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
RESET_TOKEN(token, ptoken, token_size)
state &= ~ST_FOOTNOTE;
+ footnote_at_line_start = FALSE;
if (footnote_definition)
{
state |= ST_FOOTNOTE_TEXT;
@@ -2684,7 +2735,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
else if (state & ST_IMAGE_SECOND_ARG)
{
if (!read_yaml_macros_and_links)
- process_image(link_text, token, output, add_image_links);
+ process_image(link_text, token, output,
+ add_image_links, add_figcaption);
RESET_TOKEN(token, ptoken, token_size)
state &= ~(ST_IMAGE | ST_IMAGE_SECOND_ARG);
pline++;
@@ -2715,6 +2767,7 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
colno++;
}
RESET_TOKEN(token, ptoken, token_size)
+ keep_token = FALSE;
state |= ST_LINK_SECOND_ARG;
break;
@@ -2739,6 +2792,7 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
pline += 2;
colno += 2;
RESET_TOKEN(token, ptoken, token_size)
+ keep_token = FALSE;
if (state & ST_LINK)
state |= ST_LINK_SECOND_ARG;
else
@@ -2760,8 +2814,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
case '^':
if (state & (ST_CODE | ST_DISPLAY_FORMULA | ST_FORMULA
- | ST_FOOTNOTE_TEXT | ST_INLINE_FOOTNOTE | ST_PRE
- | ST_YAML))
+ | ST_FOOTNOTE_TEXT | ST_IMAGE | ST_INLINE_FOOTNOTE
+ | ST_PRE | ST_YAML))
{
CHECKCOPY(token, ptoken, token_size, pline)
colno++;
@@ -2792,7 +2846,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
case '\\':
*ptoken = 0;
if (state & (ST_DISPLAY_FORMULA | ST_FORMULA
- | ST_HTML_TAG | ST_MACRO_BODY))
+ | ST_HTML_TAG | ST_IMAGE | ST_LINK
+ | ST_MACRO_BODY))
{
CHECKCOPY(token, ptoken, token_size, pline)
colno++;
@@ -2816,7 +2871,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
break;
case '$':
- if (state & (ST_CODE | ST_CSV_BODY | ST_PRE | ST_YAML))
+ if (state & (ST_CODE | ST_CSV_BODY | ST_IMAGE | ST_PRE
+ | ST_YAML))
{
CHECKCOPY(token, ptoken, token_size, pline)
colno++;
@@ -2914,7 +2970,7 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
CALLOC(pvars->value, uint8_t, pvars->value_size)
u8_strncpy(pvars->value, token, pvars->value_size-1);
}
- else if (state & (ST_DISPLAY_FORMULA | ST_FORMULA))
+ else if (keep_token)
{
size_t token_len = u8_strlen(token);
@@ -2925,7 +2981,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
REALLOC(token, uint8_t, token_size)
ptoken = token + old_size - 1;
}
- u8_strncat(token, (uint8_t*)"\n",
+ u8_strncat(token, (state & (ST_IMAGE | ST_LINK))
+ ? (uint8_t*)" " : (uint8_t*)"\n",
token_size - token_len - 1);
ptoken++;
*ptoken = 0;
@@ -3012,7 +3069,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
RESET_TOKEN(token, ptoken, token_size)
heading_level = 0;
}
- else if (!(state & (ST_DISPLAY_FORMULA | ST_FORMULA)))
+ else if (!(state & (ST_DISPLAY_FORMULA | ST_FORMULA
+ | ST_IMAGE | ST_LINK)))
process_text_token(line, first_line_in_doc,
previous_line_blank,
processed_start_of_line,
@@ -3021,7 +3079,7 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
TRUE);
}
- if (!(state & (ST_PRE | ST_LINK_SECOND_ARG))
+ if (!(state & (ST_PRE | ST_IMAGE_SECOND_ARG | ST_LINK_SECOND_ARG))
&& (!*pbuffer || *pbuffer == '\n'))
{
if (state & ST_PARA_OPEN)
@@ -3045,8 +3103,6 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
if (!*pbuffer && (state & ST_FOOTNOTE_TEXT))
{
- if (!read_yaml_macros_and_links)
- print_output(output, "</p>\n");
state &= ~ST_FOOTNOTE_TEXT;
*ptoken = 0;
@@ -3055,22 +3111,23 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
skip_eol = TRUE;
if (read_yaml_macros_and_links)
{
- if (pmacros->value)
+ if (pfootnotes->value)
{
- size_t value_len = u8_strlen(pmacros->value);
+ size_t value_len = u8_strlen(pfootnotes->value);
- if (pmacros->value_size < value_len + token_len + 1)
+ if (pfootnotes->value_size < value_len + token_len + 1)
{
- pmacros->value_size += token_len;
- REALLOC(pmacros->value, uint8_t, pmacros->value_size)
+ pfootnotes->value_size
+ = value_len + token_len + 1;
+ REALLOC(pfootnotes->value, uint8_t, pfootnotes->value_size)
}
- u8_strncat(pmacros->value, token, pmacros->value_size-1);
+ u8_strncat(pfootnotes->value, token, pfootnotes->value_size-1);
}
else
{
- pmacros->value_size = token_len+1;
- CALLOC(pmacros->value, uint8_t, pmacros->value_size)
- u8_strncpy(pmacros->value, token, pmacros->value_size-1);
+ pfootnotes->value_size = token_len + 1;
+ CALLOC(pfootnotes->value, uint8_t, pfootnotes->value_size)
+ u8_strncpy(pfootnotes->value, token, pfootnotes->value_size-1);
}
}
}
@@ -3086,7 +3143,7 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
previous_line_blank = FALSE;
}
- if (!skip_eol && !read_yaml_macros_and_links
+ if (!skip_eol && !keep_token && !read_yaml_macros_and_links
&& !(state & (ST_YAML | ST_YAML_VAL
| ST_LINK_SECOND_ARG)))
print_output(output, "\n");
@@ -3103,7 +3160,7 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
previous_line_blank = TRUE;
/* Lasts until the end of line */
- state &= ~(ST_YAML_VAL | ST_LINK | ST_LINK_SECOND_ARG);
+ state &= ~(ST_YAML_VAL | ST_IMAGE_SECOND_ARG | ST_LINK_SECOND_ARG);
}
while (pbuffer && *pbuffer);
@@ -3292,6 +3349,20 @@ main(int argc, char** argv)
/* Second pass: parse and output */
result = slweb_parse(buffer, output, body_only, FALSE);
+ if (basedir)
+ free(basedir);
+ if (input_dirname)
+ free(input_dirname);
+ if (inline_footnotes)
+ free(inline_footnotes);
+ free_keyvalue(&footnotes, footnote_count);
+ free_keyvalue(&links, links_count);
+ free_keyvalue(¯os, macros_count);
+ free_keyvalue(&vars, vars_count);
+ free(footnotes);
+ free(links);
+ free(macros);
+ free(vars);
free(buffer);
return result;