чување 61d9851b70dbae1437a87454559a99f1e92ca829
родитељ 40c661409fc910f463cfe2a9f42083ae3351b0e5
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Mon, 11 Jan 2021 22:18:03 +0100
Moved fprintf(output...) to a separate function; moved some slweb_parse parameters to global variables
Signed-off-by: Страхиња Радић <contact@strahinja.org>
Diffstat:
| M | TODO | | | 4 | ++-- |
| M | index.html | | | 2 | +- |
| M | slweb.c | | | 396 | +++++++++++++++++++++++++++++++++++++------------------------------------------ |
измењених датотека: 3, додавања: 186(+), брисања: 216(-)
diff --git a/TODO b/TODO
@@ -1,9 +1,9 @@
TODO
====
- [ ] Add csv templating directive
+ [~] Add csv templating directive
- [ ] Move fprintf(output...) to a separate function
+ [x] Move fprintf(output...) to a separate function
[ ] Record that function's output rom {csv}..{/csv} into
"capture blocks" - no need to do that for all of them,
diff --git a/index.html b/index.html
@@ -128,7 +128,7 @@ this program. If not, see <<a href="https://www.gnu.org/licenses">https://www
<div id="git-log">
Previous commit:
-index.slw c9c948c 2021-01-10 22:49:16 +0100 (Страхиња Радић) (HEAD -> master, origin/master, origin/HEAD)
+index.slw 40c6614 2021-01-11 15:40:39 +0100 (Страхиња Радић) (HEAD -> master, origin/master, origin/HEAD)
</div><!--git-log-->
diff --git a/slweb.c b/slweb.c
@@ -24,7 +24,17 @@ static size_t colno = 1;
static char* input_filename = NULL;
static char* input_dirname = NULL;
static char* basedir = NULL;
-static char* arg_zero = NULL;
+static KeyValue* vars = NULL;
+static KeyValue* pvars = NULL;
+static size_t vars_count = 0;
+static KeyValue* macros = NULL;
+static KeyValue* pmacros = NULL;
+static size_t macros_count = 0;
+static KeyValue* links = NULL;
+static KeyValue* plinks = NULL;
+static size_t links_count = 0;
+static ULONG state = ST_NONE;
+
#define CHECKEXITNOMEM(ptr) { if (!ptr) exit(error(ENOMEM, \
(uint8_t*)"Memory allocation failed (out of memory?)\n")); }
@@ -78,9 +88,6 @@ warning(int code, uint8_t* fmt, ...)
int
slweb_parse(uint8_t* buffer, FILE* output,
- KeyValue** vars, size_t* vars_count,
- KeyValue** macros, size_t* macros_count,
- KeyValue** links, size_t* links_count,
BOOL body_only, BOOL read_yaml_macros_and_links);
char*
@@ -167,6 +174,22 @@ strip_ext(const char* fn)
}
int
+print_output(FILE* output, char* fmt, ...)
+{
+ uint8_t buf[BUFSIZE];
+ va_list args;
+ va_start(args, fmt);
+ if (state & ST_CSV_BODY)
+ {
+ u8_vsnprintf(buf, BUFSIZE, fmt, args);
+ }
+ else
+ vfprintf(output, fmt, args);
+ va_end(args);
+ return 0;
+}
+
+int
print_command(uint8_t* command, FILE* output)
{
FILE* cmd_output = popen((char*)command, "r");
@@ -188,8 +211,7 @@ print_command(uint8_t* command, FILE* output)
if (eol)
*eol = '\0';
- fprintf(output, "%s\n", cmd_output_line);
-
+ print_output(output, "%s\n", cmd_output_line);
}
free(cmd_output_line);
pclose(cmd_output);
@@ -237,8 +259,8 @@ process_heading(uint8_t* token, FILE* output, UBYTE heading_level)
if (!token || u8_strlen(token) < 1)
warning(1, (uint8_t*)"Empty heading\n");
- fprintf(output, "<h%d>%s</h%d>", heading_level, token ? (char*)token : "",
- heading_level);
+ print_output(output, "<h%d>%s</h%d>",
+ heading_level, token ? (char*)token : "", heading_level);
return 0;
}
@@ -257,7 +279,7 @@ process_git_log(FILE* output)
else
strncpy(basename, input_filename, strlen(input_filename));
- fprintf(output, "<div id=\"git-log\">\nPrevious commit:\n");
+ print_output(output, "<div id=\"git-log\">\nPrevious commit:\n");
uint8_t* command = NULL;
CALLOC(command, uint8_t, BUFSIZE)
u8_snprintf(command, BUFSIZE,
@@ -266,10 +288,10 @@ process_git_log(FILE* output)
basename);
if (print_command(command, output))
{
- fprintf(output, "</div><!--git-log-->\n");
+ print_output(output, "</div><!--git-log-->\n");
return error(1, (uint8_t*)"git-log: Cannot run git\n");
}
- fprintf(output, "</div><!--git-log-->\n");
+ print_output(output, "</div><!--git-log-->\n");
free(command);
free(basename);
@@ -278,22 +300,22 @@ process_git_log(FILE* output)
}
int
-process_csv(uint8_t* token, FILE* output, ULONG* state,
- BOOL read_yaml_macros_and_links, BOOL end_tag)
+process_csv(uint8_t* token, FILE* output, BOOL read_yaml_macros_and_links,
+ BOOL end_tag)
{
if (read_yaml_macros_and_links)
return 0;
if (end_tag)
{
- *state &= ~ST_CSV_BODY;
+ state &= ~ST_CSV_BODY;
/*
*fprintf(stderr, "%ld:%ld:csv: /end\n", lineno, colno);
*/
}
else
{
- *state |= ST_CSV_BODY;
+ state |= ST_CSV_BODY;
uint8_t* saveptr = NULL;
uint8_t* args = u8_strtok(token, (uint8_t*)" ", &saveptr);
args = u8_strtok(NULL, (uint8_t*)" ", &saveptr);
@@ -311,18 +333,11 @@ process_csv(uint8_t* token, FILE* output, ULONG* state,
}
int
-process_include(uint8_t* token, FILE* output, ULONG* state,
- KeyValue** vars, size_t* vars_count,
- KeyValue** macros, size_t* macros_count,
- KeyValue** links, size_t* links_count,
- BOOL read_yaml_macros_and_links)
+process_include(uint8_t* token, FILE* output, BOOL read_yaml_macros_and_links)
{
if (read_yaml_macros_and_links)
return 0;
- if (!arg_zero)
- exit(error(EINVAL, (uint8_t*)"Invalid argument zero\n"));
-
if (!input_filename)
return warning(1, (uint8_t*)"Cannot use 'include' in stdin\n");
@@ -354,9 +369,7 @@ process_include(uint8_t* token, FILE* output, ULONG* state,
if (!strcmp(basedir, "."))
strncpy(basedir, input_dirname, strlen(input_dirname));
- sprintf(input_filename, "%s/%s.slw",
- basedir,
- include_filename);
+ sprintf(input_filename, "%s/%s.slw", basedir, include_filename);
FILE* input = NULL;
FILE* output = stdout;
@@ -364,19 +377,17 @@ process_include(uint8_t* token, FILE* output, ULONG* state,
read_file_into_buffer(&buffer, input_filename, &input_dirname, &input);
- free(*links);
- CALLOC(*links, KeyValue, 1)
- (*links)->key = NULL;
- (*links)->value = NULL;
- *links_count = 0;
+ free(links);
+ CALLOC(links, KeyValue, 1)
+ links->key = NULL;
+ links->value = NULL;
+ links_count = 0;
/* First pass: read YAML, macros and links */
- slweb_parse(buffer, output, vars, vars_count, macros, macros_count,
- links, links_count, TRUE, TRUE);
+ slweb_parse(buffer, output, TRUE, TRUE);
/* Second pass: parse and output */
- slweb_parse(buffer, output, vars, vars_count, macros, macros_count,
- links, links_count, TRUE, FALSE);
+ slweb_parse(buffer, output, TRUE, FALSE);
exit(0);
}
@@ -437,15 +448,13 @@ reverse_alphacompare(const struct dirent** a, const struct dirent** b)
int
process_incdir_subdir(const char* subdirname, FILE* output, BOOL details_open,
- uint8_t* macro_body, ULONG* state,
- KeyValue** vars, size_t* vars_count,
- KeyValue** macros, size_t* macros_count,
- KeyValue** links, size_t* links_count)
+ uint8_t* macro_body)
{
- fprintf(output, "<li>\n<details%s>\n<summary>", details_open ? " open" : "");
+ print_output(output, "<li>\n<details%s>\n<summary>",
+ details_open ? " open" : "");
if (macro_body)
fprintf(stdout, "%s", macro_body);
- fprintf(output, "%s</summary>\n<div>\n", subdirname);
+ print_output(output, "%s</summary>\n<div>\n", subdirname);
struct dirent** namelist;
struct dirent** pnamelist;
@@ -486,19 +495,17 @@ process_incdir_subdir(const char* subdirname, FILE* output, BOOL details_open,
read_file_into_buffer(&buffer, input_filename, &input_dirname,
&input);
- free(*links);
- CALLOC(*links, KeyValue, 1)
- (*links)->key = NULL;
- (*links)->value = NULL;
- *links_count = 0;
+ free(links);
+ CALLOC(links, KeyValue, 1)
+ links->key = NULL;
+ links->value = NULL;
+ links_count = 0;
/* First pass: read YAML, macros and links */
- slweb_parse(buffer, output, vars, vars_count, macros, macros_count,
- links, links_count, TRUE, TRUE);
+ slweb_parse(buffer, output, TRUE, TRUE);
/* Second pass: parse and output */
- slweb_parse(buffer, output, vars, vars_count, macros, macros_count,
- links, links_count, TRUE, FALSE);
+ slweb_parse(buffer, output, TRUE, FALSE);
exit(0);
}
else
@@ -510,15 +517,12 @@ process_incdir_subdir(const char* subdirname, FILE* output, BOOL details_open,
free(abs_subdirname);
- fprintf(output, "</div>\n</details>\n</li>\n");
+ print_output(output, "</div>\n</details>\n</li>\n");
return 0;
}
int
-process_incdir(uint8_t* token, FILE* output, KeyValue** vars,
- size_t* vars_count, KeyValue** macros, size_t* macros_count,
- KeyValue** pmacros, KeyValue** links, size_t* links_count, ULONG* state,
- BOOL read_yaml_macros_and_links)
+process_incdir(uint8_t* token, FILE* output, BOOL read_yaml_macros_and_links)
{
if (read_yaml_macros_and_links)
return 0;
@@ -537,7 +541,7 @@ process_incdir(uint8_t* token, FILE* output, KeyValue** vars,
if (!arg)
return warning(1, (uint8_t*)"incdir: Arguments required\n");
if (*arg == '=')
- macro_body = get_value(*macros, *macros_count, arg+1, NULL);
+ macro_body = get_value(macros, macros_count, arg+1, NULL);
else
{
uint8_t* parg = arg;
@@ -553,10 +557,10 @@ process_incdir(uint8_t* token, FILE* output, KeyValue** vars,
arg = u8_strtok(NULL, (uint8_t*)" ", &saveptr);
if (*arg != '=')
return warning(1, (uint8_t*)"incdir: Second argument not macro\n");
- macro_body = get_value(*macros, *macros_count, arg+1, NULL);
+ macro_body = get_value(macros, macros_count, arg+1, NULL);
}
- fprintf(output, "<ul class=\"incdir\">\n");
+ print_output(output, "<ul class=\"incdir\">\n");
if (scandir(basedir, &namelist, &filter_subdirs,
&reverse_alphacompare) < 0)
@@ -570,15 +574,14 @@ process_incdir(uint8_t* token, FILE* output, KeyValue** vars,
while (names_output < num && pnamelist && *pnamelist)
{
process_incdir_subdir((*pnamelist)->d_name, output, details_open,
- macro_body, state,
- vars, vars_count, macros, macros_count, links, links_count);
+ macro_body);
details_open = FALSE;
pnamelist++;
names_output++;
}
free(namelist);
- fprintf(output, "</ul>\n");
+ print_output(output, "</ul>\n");
return 0;
}
@@ -625,7 +628,8 @@ process_timestamp(FILE* output, const char* link, uint8_t* permalink_macro,
ptimestamp_format++;
}
- fprintf(output, "<a href=\"%s\" class=\"timestamp\">%s%s</a>\n",
+ print_output(output, "<a href=\"%s\""
+ " class=\"timestamp\">%s%s</a>\n",
link,
permalink_macro ? (char*)permalink_macro : "",
formatted_date);
@@ -641,15 +645,14 @@ process_timestamp(FILE* output, const char* link, uint8_t* permalink_macro,
}
int
-process_macro(uint8_t* token, FILE* output, KeyValue** macros,
- size_t* macros_count, KeyValue** pmacros, ULONG* state,
- BOOL read_yaml_macros_and_links, BOOL end_tag)
+process_macro(uint8_t* token, FILE* output, BOOL read_yaml_macros_and_links,
+ BOOL end_tag)
{
if (!end_tag)
{
BOOL seen = FALSE;
- uint8_t* macro_body = get_value(*macros, *macros_count, token+1,
+ uint8_t* macro_body = get_value(macros, macros_count, token+1,
read_yaml_macros_and_links ? NULL : &seen);
if (macro_body)
@@ -657,42 +660,39 @@ process_macro(uint8_t* token, FILE* output, KeyValue** macros,
if (!read_yaml_macros_and_links)
{
if (seen)
- fprintf(output, "%s", macro_body);
+ print_output(output, "%s", macro_body);
else
- *state |= ST_MACRO_BODY;
+ state |= ST_MACRO_BODY;
}
}
else
{
if (read_yaml_macros_and_links)
{
- (*macros_count)++;
+ macros_count++;
- if (*macros_count > 1)
+ if (macros_count > 1)
{
- REALLOC(*macros, KeyValue,
- *macros_count * sizeof(KeyValue))
- *pmacros = *macros + *macros_count - 1;
+ REALLOC(macros, KeyValue,
+ macros_count * sizeof(KeyValue))
+ pmacros = macros + macros_count - 1;
}
- CALLOC((*pmacros)->key, uint8_t, u8_strlen(token+1))
- (*pmacros)->seen = FALSE;
- u8_strcpy((*pmacros)->key, token+1);
- (*pmacros)->value = NULL;
+ CALLOC(pmacros->key, uint8_t, u8_strlen(token+1))
+ pmacros->seen = FALSE;
+ u8_strcpy(pmacros->key, token+1);
+ pmacros->value = NULL;
}
- *state |= ST_MACRO_BODY;
+ state |= ST_MACRO_BODY;
}
}
else
- *state &= ~ST_MACRO_BODY;
+ state &= ~ST_MACRO_BODY;
return 0;
}
int
-process_tag(uint8_t* token, FILE* output, KeyValue** macros,
- size_t* macros_count, KeyValue** pmacros, KeyValue** vars,
- size_t* vars_count, KeyValue** links, size_t* links_count,
- ULONG* state, BOOL read_yaml_macros_and_links,
+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)
@@ -706,7 +706,7 @@ process_tag(uint8_t* token, FILE* output, KeyValue** macros,
else if (!strcmp((char*)token, "made-by")
&& !read_yaml_macros_and_links) /* {made-by} */
{
- fprintf(output, "<div id=\"made-by\">\n"
+ print_output(output, "<div id=\"made-by\">\n"
"Generated by <a href=\"https://github.com/Strahinja/slweb\">"
"slweb</a>\n"
"© %s Strahinya Radich.\n"
@@ -715,78 +715,73 @@ process_tag(uint8_t* token, FILE* output, KeyValue** macros,
}
else if (startswith((char*)token, "csv")) /* {csv} */
{
- process_csv(token, output, state, read_yaml_macros_and_links, end_tag);
+ process_csv(token, output, read_yaml_macros_and_links, end_tag);
}
else if (startswith((char*)token, "include")) /* {include} */
{
- process_include(token, output, state, vars, vars_count,
- macros, macros_count, links, links_count,
- read_yaml_macros_and_links);
+ process_include(token, output, read_yaml_macros_and_links);
*skip_eol = TRUE;
}
else if (startswith((char*)token, "incdir")) /* {incdir} */
{
- process_incdir(token, output, vars, vars_count, macros, macros_count,
- pmacros, links, links_count, state,
- read_yaml_macros_and_links);
+ process_incdir(token, output, read_yaml_macros_and_links);
*skip_eol = TRUE;
}
else if (*token == '=') /* {=macro} */
{
- process_macro(token, output, macros, macros_count, pmacros, state,
- read_yaml_macros_and_links, end_tag);
+ process_macro(token, output, read_yaml_macros_and_links, end_tag);
*skip_eol = TRUE;
}
else if (!read_yaml_macros_and_links) /* general tags */
{
- fprintf(output, "<");
+ print_output(output, "<");
if (end_tag)
- fprintf(output, "/");
+ print_output(output, "/");
if (*token == '.' || *token == '#')
{
- fprintf(output, "div");
+ print_output(output, "div");
}
while (*token && *token != '#' && *token != '.')
- fprintf(output, "%c", *token++);
+ print_output(output, "%c", *token++);
if (!end_tag)
{
if (*token == '#')
{
token++;
- fprintf(output, " id=\"");
+ print_output(output, " id=\"");
while (*token && *token != '.')
- fprintf(output, "%c", *token++);
- fprintf(output, "\"");
+ print_output(output, "%c", *token++);
+ print_output(output, "\"");
if (*token == '.')
{
token++;
- fprintf(output, " class=\"");
+ print_output(output, " class=\"");
while (*token)
- fprintf(output, "%c", *token++);
- fprintf(output, "\"");
+ print_output(output, "%c", *token++);
+ print_output(output, "\"");
}
}
else if (*token == '.')
{
token++;
- fprintf(output, " class=\"");
+ print_output(output, " class=\"");
while (*token && *token != '#')
- fprintf(output, "%c", *token++);
- fprintf(output, "\"");
+ print_output(output, "%c", *token++);
+ print_output(output, "\"");
if (*token == '#')
{
token++;
- fprintf(output, " id=\"");
+ print_output(output, " id=\"");
while (*token)
- fprintf(output, "%c", *token++);
- fprintf(output, "\"");
+ print_output(output, "%c", *token++);
+ print_output(output, "\"");
}
}
}
- fprintf(output, ">");
+ print_output(output, ">");
}
return 0;
@@ -795,28 +790,28 @@ process_tag(uint8_t* token, FILE* output, KeyValue** macros,
int
process_bold(FILE* output, BOOL end_tag)
{
- fprintf(output, "<%sstrong>", end_tag ? "/" : "");
+ print_output(output, "<%sstrong>", end_tag ? "/" : "");
return 0;
}
int
process_italic(FILE* output, BOOL end_tag)
{
- fprintf(output, "<%sem>", end_tag ? "/" : "");
+ print_output(output, "<%sem>", end_tag ? "/" : "");
return 0;
}
int
process_code(FILE* output, BOOL end_tag)
{
- fprintf(output, "<%scode>", end_tag ? "/" : "");
+ print_output(output, "<%scode>", end_tag ? "/" : "");
return 0;
}
int
process_blockquote(FILE* output, BOOL end_tag)
{
- fprintf(output, "<%sblockquote>", end_tag ? "/" : "");
+ print_output(output, "<%sblockquote>", end_tag ? "/" : "");
return 0;
}
@@ -872,7 +867,7 @@ int
process_inline_link(uint8_t* link_text, uint8_t* link_macro_body,
uint8_t* link_url, FILE* output)
{
- fprintf(output, "<a href=\"%s\">%s%s</a>",
+ print_output(output, "<a href=\"%s\">%s%s</a>",
link_url ? (char*)link_url : "",
link_macro_body ? (char*)link_macro_body : "",
link_text);
@@ -882,7 +877,7 @@ process_inline_link(uint8_t* link_text, uint8_t* link_macro_body,
int
process_link(uint8_t* link_text, uint8_t* link_macro_body, uint8_t* link_id,
- KeyValue* links, size_t links_count, FILE* output)
+ FILE* output)
{
uint8_t* url = get_value(links, links_count, link_id, NULL);
return process_inline_link(link_text, link_macro_body,
@@ -892,7 +887,7 @@ 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)
{
- fprintf(output, "<img src=\"%s\" alt=\"%s\" />",
+ print_output(output, "<img src=\"%s\" alt=\"%s\" />",
image_url ? (char*)image_url : "",
image_text);
@@ -900,15 +895,14 @@ process_inline_image(uint8_t* image_text, uint8_t* image_url, FILE* output)
}
int
-process_image(uint8_t* image_text, uint8_t* image_id, KeyValue* links,
- size_t links_count, FILE* output)
+process_image(uint8_t* image_text, uint8_t* image_id, FILE* output)
{
uint8_t* url = get_value(links, links_count, image_id, NULL);
return process_inline_image(image_text, url, output);
}
int
-process_line_start(ULONG* state, BOOL first_line_in_doc,
+process_line_start(BOOL first_line_in_doc,
BOOL previous_line_blank, BOOL processed_start_of_line,
BOOL read_yaml_macros_and_links, FILE* output,
uint8_t** token,
@@ -916,18 +910,17 @@ process_line_start(ULONG* state, BOOL first_line_in_doc,
{
if ((first_line_in_doc || previous_line_blank)
&& !processed_start_of_line
- && !(*state & (ST_PRE | ST_BLOCKQUOTE)))
+ && !(state & (ST_PRE | ST_BLOCKQUOTE)))
{
if (!read_yaml_macros_and_links)
- fprintf(output, "<p>");
- *state |= ST_PARA_OPEN;
+ print_output(output, "<p>");
+ state |= ST_PARA_OPEN;
}
return 0;
}
int
-process_text_token(ULONG* state,
- BOOL first_line_in_doc,
+process_text_token(BOOL first_line_in_doc,
BOOL previous_line_blank,
BOOL processed_start_of_line,
BOOL read_yaml_macros_and_links,
@@ -936,15 +929,15 @@ process_text_token(ULONG* state,
uint8_t** ptoken,
BOOL add_enclosing_paragraph)
{
- if (!read_yaml_macros_and_links && !(*state & ST_YAML))
+ if (!read_yaml_macros_and_links && !(state & ST_YAML))
{
if (add_enclosing_paragraph)
- process_line_start(state, first_line_in_doc, previous_line_blank,
+ process_line_start(first_line_in_doc, previous_line_blank,
processed_start_of_line, read_yaml_macros_and_links,
output, token, ptoken);
**ptoken = '\0';
- if (**token && !(*state & ST_MACRO_BODY))
- fprintf(output, "%s", *token);
+ if (**token && !(state & ST_MACRO_BODY))
+ print_output(output, "%s", *token);
}
**token = '\0';
*ptoken = *token;
@@ -952,13 +945,13 @@ process_text_token(ULONG* state,
}
int
-begin_html_and_head(FILE* output, KeyValue* vars, size_t vars_count)
+begin_html_and_head(FILE* output)
{
uint8_t* site_name = get_value(vars, vars_count, (uint8_t*)"site-name", NULL);
uint8_t* site_desc = get_value(vars, vars_count, (uint8_t*)"site-desc", NULL);
uint8_t* favicon_url = get_value(vars, vars_count, (uint8_t*)"favicon-url", NULL);
- fprintf(output, "<!DOCTYPE html>\n"
+ print_output(output, "<!DOCTYPE html>\n"
"<html lang=\"en\">\n"
"<head>\n"
"<title>%s</title>\n"
@@ -969,28 +962,28 @@ begin_html_and_head(FILE* output, KeyValue* vars, size_t vars_count)
CALLOC(favicon, char, BUFSIZE)
sprintf(favicon, "%s/favicon.ico", basedir);
if (!access(favicon, R_OK))
- fprintf(output, "<link rel=\"shortcut icon\" type=\"image/x-icon\""
+ print_output(output, "<link rel=\"shortcut icon\" type=\"image/x-icon\""
" href=\"%s\" />\n",
favicon_url ? (char*)favicon_url : "/favicon.ico");
free(favicon);
if (site_desc && *site_desc)
- fprintf(output, "<meta name=\"description\" content=\"%s\" />\n",
+ print_output(output, "<meta name=\"description\" content=\"%s\" />\n",
(char*)site_desc);
- fprintf(output, "<meta name=\"viewport\" content=\"width=device-width,"
+ print_output(output, "<meta name=\"viewport\" content=\"width=device-width,"
" initial-scale=1\" />\n<meta name=\"generator\" content=\"slweb\" />\n");
return 0;
}
int
-add_css(FILE* output, KeyValue* vars, size_t vars_count)
+add_css(FILE* output)
{
KeyValue* pvars = vars;
while (pvars < vars + vars_count)
{
if (!u8_strcmp(pvars->key, (uint8_t*)"stylesheet"))
- fprintf(output, "<link rel=\"stylesheet\" href=\"%s\" />\n",
+ print_output(output, "<link rel=\"stylesheet\" href=\"%s\" />\n",
pvars->value);
pvars++;
}
@@ -998,9 +991,9 @@ add_css(FILE* output, KeyValue* vars, size_t vars_count)
}
int
-end_head_start_body(FILE* output, KeyValue* vars, size_t vars_count)
+end_head_start_body(FILE* output)
{
- fprintf(output, "</head>\n<body>\n");
+ print_output(output, "</head>\n<body>\n");
return 0;
}
@@ -1008,15 +1001,12 @@ end_head_start_body(FILE* output, KeyValue* vars, size_t vars_count)
int
end_body_and_html(FILE* output)
{
- fprintf(output, "</body>\n</html>\n");
+ print_output(output, "</body>\n</html>\n");
return 0;
}
int
slweb_parse(uint8_t* buffer, FILE* output,
- KeyValue** vars, size_t* vars_count,
- KeyValue** macros, size_t* macros_count,
- KeyValue** links, size_t* links_count,
BOOL body_only, BOOL read_yaml_macros_and_links)
{
uint8_t* title = NULL;
@@ -1032,10 +1022,6 @@ slweb_parse(uint8_t* buffer, FILE* output,
uint8_t* ptoken = NULL;
uint8_t* link_text = NULL;
uint8_t* link_macro = NULL;
- KeyValue* pvars = NULL;
- KeyValue* plinks = NULL;
- KeyValue* pmacros = NULL;
- ULONG state = ST_NONE;
UBYTE heading_level = 0;
BOOL end_tag = FALSE;
BOOL first_line_in_doc = TRUE;
@@ -1047,41 +1033,41 @@ slweb_parse(uint8_t* buffer, FILE* output,
if (!buffer)
exit(error(1, (uint8_t*)"Empty buffer\n"));
- if (!vars || !*vars)
+ if (!vars)
exit(error(EINVAL, (uint8_t*)"Invalid argument (vars)\n"));
- if (!links || !*links)
+ if (!links)
exit(error(EINVAL, (uint8_t*)"Invalid argument (links)\n"));
- if (!macros || !*macros)
+ if (!macros)
exit(error(EINVAL, (uint8_t*)"Invalid argument (macros)\n"));
- title = get_value(*vars, *vars_count, (uint8_t*)"title", NULL);
- title_heading_level = get_value(*vars, *vars_count,
+ title = get_value(vars, vars_count, (uint8_t*)"title", NULL);
+ title_heading_level = get_value(vars, vars_count,
(uint8_t*)"title-heading-level", NULL);
- date = get_value(*vars, *vars_count, (uint8_t*)"date", NULL);
- permalink_url = get_value(*vars, *vars_count, (uint8_t*)"permalink-url", NULL);
- ext_in_permalink = get_value(*vars, *vars_count, (uint8_t*)"ext-in-permalink", NULL);
+ date = get_value(vars, vars_count, (uint8_t*)"date", NULL);
+ permalink_url = get_value(vars, vars_count, (uint8_t*)"permalink-url", NULL);
+ ext_in_permalink = get_value(vars, vars_count, (uint8_t*)"ext-in-permalink", NULL);
CALLOC(line, uint8_t, BUFSIZE)
CALLOC(token, uint8_t, BUFSIZE)
CALLOC(link_macro, uint8_t, BUFSIZE)
pbuffer = buffer;
- pvars = *vars;
- plinks = *links;
- pmacros = *macros;
+ pvars = vars;
+ plinks = links;
+ pmacros = macros;
lineno = 0;
if (!read_yaml_macros_and_links && !body_only)
{
- begin_html_and_head(output, *vars, *vars_count);
- add_css(output, *vars, *vars_count);
- end_head_start_body(output, *vars, *vars_count);
+ begin_html_and_head(output);
+ add_css(output);
+ end_head_start_body(output);
}
if (title)
- fprintf(output, "<h%s>%s</h%s>\n",
+ print_output(output, "<h%s>%s</h%s>\n",
title_heading_level ? (char*)title_heading_level : "2",
(char*)title,
title_heading_level ? (char*)title_heading_level : "2");
@@ -1089,10 +1075,10 @@ slweb_parse(uint8_t* buffer, FILE* output,
if (date && input_filename)
{
char* link = strip_ext(input_filename);
- uint8_t* samedir_permalink = get_value(*vars, *vars_count,
+ uint8_t* samedir_permalink = get_value(vars, vars_count,
(uint8_t*)"samedir-permalink", NULL);
char* real_link = NULL;
- uint8_t* permalink_macro = get_value(*macros, *macros_count,
+ uint8_t* permalink_macro = get_value(macros, macros_count,
(uint8_t*)"permalink", NULL);
CALLOC(real_link, char, BUFSIZE)
@@ -1100,7 +1086,8 @@ slweb_parse(uint8_t* buffer, FILE* output,
strncat(link, timestamp_output_ext, strlen(timestamp_output_ext));
if (permalink_url)
- process_timestamp(output, (char*)permalink_url, permalink_macro, date);
+ process_timestamp(output, (char*)permalink_url, permalink_macro,
+ date);
else if (samedir_permalink && !u8_strcmp(samedir_permalink, (uint8_t*)"1"))
{
get_realpath(&real_link, input_dirname, link);
@@ -1166,13 +1153,13 @@ slweb_parse(uint8_t* buffer, FILE* output,
{
*ptoken = '\0';
- (*vars_count)++;
+ vars_count++;
- if (*vars_count > 1)
+ if (vars_count > 1)
{
- REALLOC(*vars, KeyValue,
- *vars_count * sizeof(KeyValue))
- pvars = *vars + *vars_count - 1;
+ REALLOC(vars, KeyValue,
+ vars_count * sizeof(KeyValue))
+ pvars = vars + vars_count - 1;
}
CALLOC(pvars->key, uint8_t, u8_strlen(token)+1)
u8_strcpy(pvars->key, token);
@@ -1213,9 +1200,9 @@ slweb_parse(uint8_t* buffer, FILE* output,
if (!read_yaml_macros_and_links)
{
if (state & ST_PRE)
- fprintf(output, "<pre>");
+ print_output(output, "<pre>");
else
- fprintf(output, "</pre>");
+ print_output(output, "</pre>");
}
pline += 3;
@@ -1244,7 +1231,7 @@ slweb_parse(uint8_t* buffer, FILE* output,
else
{
/* Output existing text up to ` */
- process_text_token(&state, first_line_in_doc,
+ process_text_token(first_line_in_doc,
previous_line_blank,
processed_start_of_line,
read_yaml_macros_and_links,
@@ -1334,7 +1321,7 @@ slweb_parse(uint8_t* buffer, FILE* output,
else
{
/* Output existing text up to __ */
- process_text_token(&state, first_line_in_doc,
+ process_text_token(first_line_in_doc,
previous_line_blank,
processed_start_of_line,
read_yaml_macros_and_links,
@@ -1376,7 +1363,7 @@ slweb_parse(uint8_t* buffer, FILE* output,
else
{
/* Output existing text up to _ */
- process_text_token(&state, first_line_in_doc,
+ process_text_token(first_line_in_doc,
previous_line_blank,
processed_start_of_line,
read_yaml_macros_and_links,
@@ -1430,7 +1417,7 @@ slweb_parse(uint8_t* buffer, FILE* output,
else
{
/* Output existing text up to * */
- process_text_token(&state, first_line_in_doc,
+ process_text_token(first_line_in_doc,
previous_line_blank,
processed_start_of_line,
read_yaml_macros_and_links,
@@ -1472,7 +1459,7 @@ slweb_parse(uint8_t* buffer, FILE* output,
else
{
/* Output existing text up to * */
- process_text_token(&state, first_line_in_doc,
+ process_text_token(first_line_in_doc,
previous_line_blank,
processed_start_of_line,
read_yaml_macros_and_links,
@@ -1564,7 +1551,7 @@ slweb_parse(uint8_t* buffer, FILE* output,
else
{
/* Output existing text up to { */
- process_text_token(&state, first_line_in_doc,
+ process_text_token(first_line_in_doc,
previous_line_blank,
processed_start_of_line,
read_yaml_macros_and_links,
@@ -1611,9 +1598,8 @@ slweb_parse(uint8_t* buffer, FILE* output,
state &= ~ST_TAG;
*ptoken = '\0';
- process_tag(token, output, macros, macros_count,
- &pmacros, vars, vars_count, links, links_count,
- &state, read_yaml_macros_and_links, &skip_eol, end_tag);
+ process_tag(token, output, read_yaml_macros_and_links,
+ &skip_eol, end_tag);
*token = '\0';
ptoken = token;
@@ -1663,7 +1649,7 @@ slweb_parse(uint8_t* buffer, FILE* output,
/* Output existing text up to ! */
*ptoken = '\0';
if (!read_yaml_macros_and_links)
- fprintf(output, "%s", token);
+ print_output(output, "%s", token);
*token = '\0';
ptoken = token;
@@ -1713,7 +1699,7 @@ slweb_parse(uint8_t* buffer, FILE* output,
if (*token)
/* Output existing text up to [ */
- process_text_token(&state, first_line_in_doc,
+ process_text_token(first_line_in_doc,
previous_line_blank,
processed_start_of_line,
read_yaml_macros_and_links,
@@ -1787,7 +1773,7 @@ slweb_parse(uint8_t* buffer, FILE* output,
{
if (state & ST_LINK_SECOND_ARG)
process_inline_link(link_text,
- get_value(*macros, *macros_count,
+ get_value(macros, macros_count,
link_macro, NULL),
token, output);
else
@@ -1817,9 +1803,9 @@ slweb_parse(uint8_t* buffer, FILE* output,
{
if (!read_yaml_macros_and_links)
process_link(link_text,
- get_value(*macros, *macros_count,
+ get_value(macros, macros_count,
link_macro, NULL),
- token, *links, *links_count, output);
+ token, output);
*token = '\0';
ptoken = token;
state &= ~(ST_LINK | ST_LINK_SECOND_ARG);
@@ -1829,8 +1815,7 @@ slweb_parse(uint8_t* buffer, FILE* output,
else if (state & ST_IMAGE_SECOND_ARG)
{
if (!read_yaml_macros_and_links)
- process_image(link_text, token, *links, *links_count,
- output);
+ process_image(link_text, token, output);
*token = '\0';
ptoken = token;
state &= ~(ST_IMAGE | ST_IMAGE_SECOND_ARG);
@@ -1842,13 +1827,13 @@ slweb_parse(uint8_t* buffer, FILE* output,
switch (*(pline+1))
{
case ':':
- (*links_count)++;
+ links_count++;
- if (*links_count > 1)
+ if (links_count > 1)
{
- REALLOC(*links, KeyValue,
- *links_count * sizeof(KeyValue))
- plinks = *links + *links_count - 1;
+ REALLOC(links, KeyValue,
+ links_count * sizeof(KeyValue))
+ plinks = links + links_count - 1;
}
CALLOC(plinks->key, uint8_t, u8_strlen(token)+1)
u8_strcpy(plinks->key, token);
@@ -1925,9 +1910,9 @@ slweb_parse(uint8_t* buffer, FILE* output,
{
if (*token)
{
+ *ptoken = '\0';
if (state & ST_MACRO_BODY)
{
- *ptoken = '\0';
size_t token_len = u8_strlen(token);
skip_eol = TRUE;
@@ -1956,7 +1941,6 @@ slweb_parse(uint8_t* buffer, FILE* output,
}
else if (state & ST_LINK_SECOND_ARG)
{
- *ptoken = '\0';
if (read_yaml_macros_and_links)
{
CALLOC(plinks->value, uint8_t, u8_strlen(token)+1)
@@ -1966,7 +1950,6 @@ slweb_parse(uint8_t* buffer, FILE* output,
else if (state & ST_HEADING)
{
state &= ~ST_HEADING;
- *ptoken = '\0';
if (!read_yaml_macros_and_links)
process_heading(token, output, heading_level);
first_line_in_doc = FALSE;
@@ -1975,7 +1958,7 @@ slweb_parse(uint8_t* buffer, FILE* output,
heading_level = 0;
}
else
- process_text_token(&state, first_line_in_doc,
+ process_text_token(first_line_in_doc,
previous_line_blank,
processed_start_of_line,
read_yaml_macros_and_links,
@@ -1990,7 +1973,7 @@ slweb_parse(uint8_t* buffer, FILE* output,
&& (!*pbuffer || *pbuffer == '\n'))
{
if (!read_yaml_macros_and_links)
- fprintf(output, "</p>");
+ print_output(output, "</p>");
state &= ~ST_PARA_OPEN;
}
@@ -2007,7 +1990,7 @@ slweb_parse(uint8_t* buffer, FILE* output,
if (!skip_eol && !read_yaml_macros_and_links
&& !(state & (ST_YAML | ST_YAML_VAL
| ST_LINK_SECOND_ARG)))
- fprintf(output, "\n");
+ print_output(output, "\n");
*token = '\0';
ptoken = token;
@@ -2044,8 +2027,6 @@ main(int argc, char** argv)
CALLOC(basedir, char, 2)
*basedir = '.';
- arg_zero = *argv;
-
while ((arg = *++argv))
{
if (*arg == '-')
@@ -2157,13 +2138,6 @@ main(int argc, char** argv)
free(bufline);
}
- KeyValue* vars = NULL;
- size_t vars_count = 0;
- KeyValue* macros = NULL;
- size_t macros_count = 0;
- KeyValue* links = NULL;
- size_t links_count = 0;
-
CALLOC(vars, KeyValue, 1)
vars->key = NULL;
vars->value = NULL;
@@ -2177,13 +2151,9 @@ main(int argc, char** argv)
links->value = NULL;
/* First pass: read YAML, macros and links */
- slweb_parse(buffer, output, &vars, &vars_count, ¯os, ¯os_count,
- &links, &links_count,
- body_only, TRUE);
+ slweb_parse(buffer, output, body_only, TRUE);
/* Second pass: parse and output */
- return slweb_parse(buffer, output, &vars, &vars_count,
- ¯os, ¯os_count, &links, &links_count,
- body_only, FALSE);
+ return slweb_parse(buffer, output, body_only, FALSE);
}