summaryrefslogtreecommitdiff
path: root/support/dktools/hbconf.ctr
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/hbconf.ctr
Initial commit
Diffstat (limited to 'support/dktools/hbconf.ctr')
-rw-r--r--support/dktools/hbconf.ctr1455
1 files changed, 1455 insertions, 0 deletions
diff --git a/support/dktools/hbconf.ctr b/support/dktools/hbconf.ctr
new file mode 100644
index 0000000000..5cacff78f2
--- /dev/null
+++ b/support/dktools/hbconf.ctr
@@ -0,0 +1,1455 @@
+%% options
+
+copyright owner = Dirk Krause
+copyright year = 2013-xxxx
+license = bsd
+
+
+%% header
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Read configuration files.
+ @param job Job structure.
+ @return 1 on success, 0 on error.
+*/
+int
+hbconf_read_files(hb_job_t *job);
+
+/** Read one configuration file.
+ @param job Job structure.
+ @param fn Configuration file name.
+ @return 1 on success, 0 on error.
+*/
+int
+hbconf_read_one_file(hb_job_t *job, dkChar const *fn);
+
+/** Process one configuration line.
+ @param job Job structure.
+ @param il Input line to process, stored also in ilfile.
+ @param st Section type.
+ @return 1 on success, 0 on error (can continue), -1 on error (exit).
+*/
+int
+hbconf_process_line(hb_job_t *job, dkChar *il, int st);
+
+/** Find template name for a node.
+ @param job Job structure.
+ @param node Node to find template for.
+ @return Template file name on success, NULL on error.
+*/
+dkChar const *
+hbconf_node_template(hb_job_t *job, hb_node_t *node);
+
+/** Find icon file name.
+ @param job Job structure.
+ @param node Node to find icon for.
+ @param icno Icon number
+ (0=TOC, 1=previous, 2=next, 3=index, 4=home).
+ @return File name pointer.
+*/
+dkChar const *
+hbconf_node_icon(hb_job_t *job, hb_node_t *node, int icno);
+
+/** Find title for current node.
+ This function is used by the hbhtml_write_header() function
+ to find the title in the HTML head section.
+ We use the full title if available, the title or the title
+ from parent objets...
+ @param node Node to find title for.
+ @return Title on success, NULL on error.
+*/
+dkChar const *
+hbconf_title(hb_node_t *node);
+
+/** Find CSS style file for current node.
+ @param node Node to find style file for.
+ @return File name on success, NULL on error.
+*/
+dkChar const *
+hbconf_stylefile(hb_node_t *node);
+
+/** Find author for current node.
+ @param node Node to find author for.
+ @return Author name on success, NULL on error.
+*/
+dkChar const *
+hbconf_author(hb_node_t *node);
+
+/** Find shortcut icon file name.
+ @param node Node to find file name for.
+ @return File name on success, NULL on error.
+*/
+dkChar const *
+hbconf_favicon(hb_node_t *node);
+
+/** Find location (city).
+ @param node Node to find location for.
+ @return Location on success, NULL on error.
+*/
+dkChar const *
+hbconf_location(hb_node_t *node);
+
+#ifdef __cplusplus
+}
+#endif
+
+%% module
+
+#include "dk3all.h"
+#include "htmlbook.h"
+
+
+
+$!trace-include
+
+
+
+/** Names of configuration file options.
+*/
+dkChar const * const hbconf_options[] = {
+$!string-table macro=dkT
+#
+# 0
+#
+author
+#
+# 1
+#
+title
+#
+# 2
+#
+url
+#
+# 3
+#
+output directory
+#
+# 4
+#
+output script
+#
+# 5
+#
+html charset
+#
+# 6
+#
+template
+#
+# 7
+#
+style
+#
+# 8
+#
+page toc
+#
+# 9
+#
+index file
+#
+# 10
+#
+create index
+#
+# 11
+#
+replace ampersand
+#
+# 12
+#
+tidy
+#
+# 13
+#
+location
+#
+# 14
+#
+write position
+#
+# 15
+#
+navigation
+#
+# 16
+#
+short
+#
+# 17
+#
+file
+#
+# 18
+#
+suffix
+#
+# 19
+#
+icon toc
+#
+# 20
+#
+icon previous
+#
+# 21
+#
+icon next
+#
+# 22
+#
+icon index
+#
+# 23
+#
+create toc
+#
+# 24
+#
+shortcut icon
+#
+# 25
+#
+var
+#
+# 26
+#
+impressum link
+#
+# 27
+#
+impressum page
+#
+# 28
+#
+chm
+#
+# 29
+#
+ln
+#
+# 30
+#
+input encoding
+#
+# 31
+#
+chm language
+#
+# 32
+#
+js file
+#
+# 33
+#
+inherit js
+#
+# 34
+#
+section numbers in position
+#
+# 35
+#
+section numbers in index
+#
+# 36
+#
+section numbers in page header
+#
+# 37
+#
+context number
+#
+# 38
+#
+chm full text search
+#
+# 39
+#
+code line numbers
+#
+# 40
+#
+icon home
+$!end
+};
+
+
+
+/** Character sets for HTML output.
+*/
+dkChar const * const hbconf_charsets[] = {
+$!string-table macro=dkT
+utf-8
+ascii
+us-ascii
+$!end
+};
+
+
+
+/** Set jump node for the nodes parents.
+ @param nodeptr Text node.
+*/
+static
+void
+hbconf_set_jump_node(hb_node_t *nodeptr)
+{
+ hb_node_t *parent; /* Parent node */
+ int cc; /* Flag: Can continue */
+ $? "+ hbconf_set_jump_node"
+ parent = nodeptr->parent;
+ cc = 1;
+ while(cc) {
+ if(parent) {
+ if(parent->jumpnode) {
+ cc = 0;
+ } else {
+ if(-1 != parent->indent) {
+ parent->jumpnode = nodeptr;
+ parent = parent->parent;
+ } else {
+ cc = 0;
+ }
+ }
+ } else {
+ cc = 0;
+ }
+ } $? "- hbconf_set_jump_node"
+}
+
+
+
+/** Process one configuration line from configuration file.
+ @param job Job structure.
+ @param il Input line to process.
+ @param st Current section type, HB_SECTION_OPTIONS
+ or HB_SECTION_CONTENTS.
+ @return 1 on success, 0 on error (continue), -1 on error (exit).
+*/
+int
+hbconf_process_line(hb_job_t *job, dkChar *il, int st)
+{
+ dk3_key_value_t *kvp; /* New key value pair */
+ hb_link_t *linkptr; /* New data for JS file */
+ dkChar *kp; /* Key */
+ dkChar *vp; /* Value */
+ dkChar *ap; /* Argument */
+ dkChar *nc; /* New text for existing key/value */
+ dkChar *ptr; /* Traverse string */
+ int newie; /* Input encoding */
+ int back = 1;
+ $? "+ hbconf_process_line %!ds", TR_STR(il)
+ kp = dk3str_start(il, NULL);
+ if(kp) {
+ if(dkT('#') != *kp) {
+ vp = dk3str_chr(kp, dkT('='));
+ if(vp) {
+ *(vp++) = dkT('\0');
+ vp = dk3str_start(vp, NULL);
+ if(vp) {
+ dk3str_normalize(kp, NULL, dkT(' '));
+ dk3str_chomp(vp, NULL);
+ switch(dk3str_array_index(hbconf_options, kp, 0)) {
+ case 0: { /* author */
+ if(job->currentnode) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ if((job->currentnode)->author) {
+ if(0UL != (job->currentnode)->objno) {
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 69);
+ }
+ }
+ dk3_release((job->currentnode)->author);
+ (job->currentnode)->author = ptr;
+ } else {
+ back = -1; /* REPORTED */
+ }
+ }
+ } break;
+ case 1: { /* title */
+ if(job->currentnode) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+
+#if VERSION_BEFORE_20161026
+ if((job->currentnode)->title) {
+ if(0UL != (job->currentnode)->objno) {
+ /* Overwriting title */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 70);
+ }
+ }
+ dk3_release((job->currentnode)->title);
+ (job->currentnode)->title = ptr;
+#else
+ if((job->currentnode)->title) {
+ if ((job->currentnode)->fulltitle) {
+ if (0UL != (job->currentnode)->objno) {
+ /* Overwriting title */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 70);
+ }
+ dk3mem_free((job->currentnode)->fulltitle);
+ }
+ (job->currentnode)->fulltitle = ptr;
+ } else {
+ (job->currentnode)->title = ptr;
+ }
+#endif
+ } else {
+ back = -1; /* REPORTED */
+ }
+ }
+ } break;
+ case 2: { /* url */
+ if(HB_SECTION_OPTIONS == st) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ dk3_release(job->url);
+ job->url = ptr;
+ } else {
+ back = -1; /* REPORTED */
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app,DK3_LL_ERROR,job->msg,38);
+ back = -1;
+ }
+ } break;
+ case 3: { /* output directory */
+ if(HB_SECTION_OPTIONS == st) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ dk3str_correct_filename(ptr);
+ if(job->outputdir) {
+ /* Overwrite output directory */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 71);
+ }
+ dk3_release(job->outputdir);
+ job->outputdir = ptr;
+ /* CHECK FILENAME CHARACTERS */
+ if(!hbtool_check_filename_encoding(job, ptr)) {
+ back = -1;
+ }
+ } else {
+ back = -1; /* REPORTED */
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 4: { /* output script */
+ if(HB_SECTION_OPTIONS == st) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ if(job->outputscript) {
+ /* Overwrite output script */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 72);
+ }
+ dk3_release(job->outputscript);
+ job->outputscript = ptr;
+ /* CHECK FILENAME CHARACTERS */
+ if(!hbtool_check_filename(job, ptr)) {
+ back = -1;
+ }
+ } else {
+ back = -1; /* REPORTED */
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 5: { /* html charset */
+ if(job->currentnode) {
+ switch(dk3str_array_index(hbconf_charsets, vp, 0)) {
+ case 0: {
+ job->cs = HB_CS_UTF_8;
+ } break;
+ case 1: case 2: {
+ job->cs = HB_CS_ASCII;
+ } break;
+ default: {
+ /* WARNING: Unknown charset! */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 11);
+ } break;
+ }
+ }
+ } break;
+ case 6: { /* template */
+ if(job->currentnode) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ dk3str_correct_filename(ptr);
+ if((job->currentnode)->template) {
+ if(0UL != (job->currentnode)->objno) {
+ /* Overwriting template */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 73);
+ }
+ }
+ dk3_release((job->currentnode)->template);
+ (job->currentnode)->template = ptr;
+ } else {
+ back = -1; /* REPORTED */
+ }
+ }
+ } break;
+ case 7: { /* style */
+ if(job->currentnode) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ dk3str_correct_filename(ptr);
+ if(!hbtool_check_filename(job, ptr)) { back = -1; }
+ if((job->currentnode)->stylefile) {
+ if(0UL != (job->currentnode)->objno) {
+ /* Overwriting style */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 74);
+ }
+ }
+ dk3_release((job->currentnode)->stylefile);
+ (job->currentnode)->stylefile = ptr;
+ } else {
+ back = -1; /* REPORTED */
+ }
+ }
+ } break;
+ case 8: { /* page toc */
+ if(job->currentnode) {
+ if(dk3str_is_bool(vp)) {
+ if(dk3str_is_on(vp)) {
+ (job->currentnode)->options =
+ ((job->currentnode)->options) | HB_NODE_OPT_PAGE_TOC;
+ } else {
+ (job->currentnode)->options =
+ ((job->currentnode)->options) & (~(HB_NODE_OPT_PAGE_TOC));
+ }
+ } else {
+ /* WARNING: Not a boolean value! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
+ }
+ }
+ } break;
+ case 9: { /* toc file */
+ if(HB_SECTION_OPTIONS == st) {
+ if(job->rootnode) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ dk3str_correct_filename(ptr);
+ if(!hbtool_check_filename(job, ptr)) { back = -1; }
+ dk3_release((job->rootnode)->filename);
+ (job->rootnode)->filename = ptr;
+ } else {
+ back = -1; /* REPORTED */
+ }
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 10: { /* create index */
+ if(HB_SECTION_OPTIONS == st) {
+ if(dk3str_is_bool(vp)) {
+ if(dk3str_is_on(vp)) {
+ job->options = (job->options) | HB_JOB_OPT_CREATE_INDEX;
+ } else {
+ job->options = (job->options) & (~(HB_JOB_OPT_CREATE_INDEX));
+ }
+ } else {
+ /* WARNING: Not a boolean */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 11: { /* replace ampersand */
+ if(job->currentnode) {
+ if(dk3str_is_bool(vp)) {
+ if(dk3str_is_on(vp)) {
+ (job->currentnode)->options =
+ ((job->currentnode)->options)
+ | HB_NODE_OPT_REPLACE_AMPERSAND;
+ } else {
+ (job->currentnode)->options =
+ ((job->currentnode)->options)
+ & (~(HB_NODE_OPT_REPLACE_AMPERSAND));
+ }
+ } else {
+ /* WARNING: Not a boolean. */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
+ }
+ }
+ } break;
+ case 12: { /* use tidy */
+ if(job->currentnode) {
+ if(dk3str_is_bool(vp)) {
+ if(dk3str_is_on(vp)) {
+ (job->currentnode)->options =
+ ((job->currentnode)->options)
+ | HB_NODE_OPT_USE_TIDY;
+ } else {
+ (job->currentnode)->options =
+ ((job->currentnode)->options)
+ & (~(HB_NODE_OPT_USE_TIDY));
+ }
+ } else {
+ /* WARNING: Not a boolean. */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
+ }
+ }
+ } break;
+ case 13: { /* location */
+ if(job->currentnode) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ dk3_release((job->currentnode)->location);
+ (job->currentnode)->location = ptr;
+ } else {
+ back = -1; /* REPORTED */
+ }
+ }
+ } break;
+ case 14: { /* write header chain */
+ if(job->currentnode) {
+ if(dk3str_is_bool(vp)) {
+ if(dk3str_is_on(vp)) {
+ (job->currentnode)->options =
+ ((job->currentnode)->options)
+ | HB_NODE_OPT_HEADER_CHAIN;
+ } else {
+ (job->currentnode)->options =
+ ((job->currentnode)->options)
+ & (~(HB_NODE_OPT_HEADER_CHAIN));
+ }
+ } else {
+ /* WARNING: Not a boolean */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
+ }
+ }
+ } break;
+ case 15: { /* navigation */
+ /* navigation is now configured via arguments to special cmd */
+ } break;
+ case 16: { /* short */
+ if(job->currentnode) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ if((job->currentnode)->shorttitle) {
+ if(0UL != (job->currentnode)->objno) {
+ /* Overwriting short */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 75);
+ }
+ }
+ dk3_release((job->currentnode)->shorttitle);
+ (job->currentnode)->shorttitle = ptr;
+ } else {
+ back = -1; /* REPORTED */
+ }
+ }
+ } break;
+ case 17: { /* file */
+ if(job->currentnode) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ dk3str_correct_filename(ptr);
+ if(!hbtool_check_filename(job, ptr)) { back = -1; }
+ if((job->currentnode)->filename) {
+ if(0UL != (job->currentnode)->objno) {
+ /* Overwriting file */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 76);
+ }
+ }
+ dk3_release((job->currentnode)->filename);
+ (job->currentnode)->filename = ptr;
+ hbconf_set_jump_node(job->currentnode);
+ if(!(dk3sto_it_find_like(job->i_pnodes,job->currentnode,0))) {
+ if(!(dk3sto_add(job->s_pnodes, job->currentnode))) {
+ back = -1; /* REPORTED */
+ }
+ }
+ } else {
+ back = -1; /* REPORTED */
+ }
+ }
+ } break;
+ case 18: { /* suffix */
+ if(job->currentnode) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ if((job->currentnode)->suffix) {
+ if(0UL != (job->currentnode)->objno) {
+ /* Overwriting suffix */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 77);
+ }
+ }
+ dk3_release((job->currentnode)->suffix);
+ (job->currentnode)->suffix = ptr;
+ /* CHECK FILENAME CHARACTERS */
+ if(!hbtool_check_filename_encoding(job, ptr)) { back = -1; }
+ } else {
+ back = -1; /* REPORTED */
+ }
+ }
+ } break;
+ case 19: {
+ if(job->currentnode) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ dk3str_correct_filename(ptr);
+ if(!hbtool_check_filename(job, ptr)) { back = -1; }
+ if((job->currentnode)->icontoc) {
+ if(0UL != (job->currentnode)->objno) {
+ /* Overwriting icon toc */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 78);
+ }
+ }
+ dk3_release((job->currentnode)->icontoc);
+ (job->currentnode)->icontoc = ptr;
+ /* CHECK FILENAME CHARACTERS */
+ } else {
+ back = -1; /* REPORTED */
+ }
+ }
+ } break;
+ case 20: {
+ if(job->currentnode) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ dk3str_correct_filename(ptr);
+ if(!hbtool_check_filename(job, ptr)) { back = -1; }
+ if((job->currentnode)->iconprev) {
+ if(0UL != (job->currentnode)->objno) {
+ /* Overwriting icon previous */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 79);
+ }
+ }
+ dk3_release((job->currentnode)->iconprev);
+ (job->currentnode)->iconprev = ptr;
+ /* CHECK FILENAME CHARACTERS */
+ } else {
+ back = -1; /* REPORTED */
+ }
+ }
+ } break;
+ case 21: {
+ if(job->currentnode) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ dk3str_correct_filename(ptr);
+ if(!hbtool_check_filename(job, ptr)) { back = -1; }
+ if((job->currentnode)->iconnext) {
+ if(0UL != (job->currentnode)->objno) {
+ /* Overwriting icon next */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 80);
+ }
+ }
+ dk3_release((job->currentnode)->iconnext);
+ (job->currentnode)->iconnext = ptr;
+ /* CHECK FILENAME CHARACTERS */
+ } else {
+ back = -1; /* REPORTED */
+ }
+ }
+ } break;
+ case 22: {
+ if(job->currentnode) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ dk3str_correct_filename(ptr);
+ if(!hbtool_check_filename(job, ptr)) { back = -1; }
+ if((job->currentnode)->iconindex) {
+ if(0UL != (job->currentnode)->objno) {
+ /* Overwriting icon index */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 81);
+ }
+ }
+ dk3_release((job->currentnode)->iconindex);
+ (job->currentnode)->iconindex = ptr;
+ /* CHECK FILENAME CHARACTERS */
+ } else {
+ back = -1; /* REPORTED */
+ }
+ }
+ } break;
+ case 23: {
+ if(HB_SECTION_OPTIONS == st) {
+ if(dk3str_is_bool(vp)) {
+ if(dk3str_is_on(vp)) {
+ job->options = ((job->options) | HB_JOB_OPT_CREATE_TOC);
+ } else {
+ job->options =
+ ((job->options) & (~(HB_JOB_OPT_CREATE_TOC)));
+ }
+ } else {
+ /* Warning: Not a boolean! */
+ dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 24: {
+ if(job->currentnode) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ dk3str_correct_filename(ptr);
+ hbtool_correct_backslash_to_slash(ptr);
+ if((job->currentnode)->favicon) {
+ if(0UL != (job->currentnode)->objno) {
+ /* Overwriting shortcut icon */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 82);
+ }
+ }
+ dk3_release((job->currentnode)->favicon);
+ (job->currentnode)->favicon = ptr;
+ /* ADD TO LIST OF ADDITIONAL FILES */
+ if (!(hbtool_add_file(job, ptr))) {
+ back = -1;
+ }
+ /* CHECK FILENAME CHARACTERS */
+ if(!hbtool_check_filename_encoding(job, ptr)) { back = -1; }
+ } else {
+ back = -1; /* REPORTED */
+ }
+ }
+ } break;
+ case 25: { $? ". set variable"
+ if(job->currentnode) { $? ". have current node"
+ ap = dk3str_next(vp, NULL);
+ if(ap) { $? ". value specified (add,change)"
+ kvp = dk3sto_it_find_like(
+ (job->currentnode)->i_variables, vp, 1
+ );
+ if(kvp) { $? ". existing value found, change"
+ nc = dk3str_dup_app(ap, job->app);
+ if(nc) { $? ". replace previous value"
+ if(kvp->val) {
+ if(0UL != (job->currentnode)->objno) {
+ /* Overwriting var */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 83);
+ }
+ }
+ dk3_release(kvp->val);
+ kvp->val = nc;
+ } else { $? "! allocation failed"
+ back = -1; /* REPORTED */
+ }
+ } else { $? ". no existing value, create"
+ kvp = dk3kv_new_app(vp, ap, job->app);
+ if(kvp) { $? ". allocation ok"
+ if(!(dk3sto_add((job->currentnode)->s_variables, kvp))) {
+ dk3kv_delete(kvp); $? "! add"
+ back = -1; /* REPORTED */
+ }
+ } else { $? "! allocation"
+ back = -1; /* REPORTED */
+ }
+ }
+ } else { $? ". no value (delete)"
+ kvp = dk3sto_it_find_like(
+ (job->currentnode)->i_variables, vp, 1
+ );
+ if(kvp) { $? ". found, removing"
+ dk3sto_remove((job->currentnode)->s_variables, kvp);
+ dk3kv_delete(kvp);
+ }
+ }
+ } else { $? "! no current node"
+ }
+ } break;
+ case 26: { $? ". impressum link"
+ if(HB_SECTION_OPTIONS == st) {
+ ptr = dk3str_dup_app(vp, job->app);
+ if(ptr) {
+ dk3_release(job->impressumlink);
+ job->impressumlink = ptr;
+ } else {
+ back = -1; /* REPORTED */
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 27: { $? ". impressum page"
+ if(HB_SECTION_OPTIONS == st) { $? ". options section"
+ job->impressumnode = hb_node_new(
+ job, job->rootnode, job->lineno, job->nextobj, 0
+ );
+ job->nextobj += 1UL;
+ if(job->impressumnode) { $? ". impressumnode"
+ if((job->impressumnode)->depth > job->maxdepth) {
+ job->maxdepth = (job->impressumnode)->depth;
+ }
+ (job->impressumnode)->options |= HB_NODE_OPT_IMPRESSUM;
+ if(dk3sto_add(job->s_nodes, (void *)(job->impressumnode))) {
+ $? ". added"
+ (job->impressumnode)->title =
+ dk3str_dup_app((job->msg)[0], job->app);
+ if((job->impressumnode)->title) { $? ". title"
+ dk3str_correct_filename(vp);
+ if(!hbtool_check_filename(job, vp)) { back = -1; }
+ /* CHECK FILENAME CHARACTERS */
+ (job->impressumnode)->filename =
+ dk3str_dup_app(vp, job->app);
+ if(!((job->impressumnode)->filename)) {
+ back = -1;
+ }
+ } else { $? "! title"
+ back = -1; /* REPORTED */
+ }
+ if(1 == back) { $? ". success so far"
+ if(!dk3sto_add(job->s_pnodes,(void*)(job->impressumnode)))
+ { $? "! adding to pnodes failed"
+ back = -1; /* REPORTED */
+ }
+ }
+ } else { $? "! failed to add"
+ hb_node_delete(job->impressumnode);
+ job->impressumnode = NULL;
+ back = -1; /* REPORTED */
+ }
+ } else { $? "! impressumnode"
+ back = -1; /* REPORTED */
+ }
+ } else { $? "! wrong section"
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 28: { $? ". chm"
+ if(HB_SECTION_OPTIONS == st) {
+ if(dk3str_is_bool(vp)) {
+ if(dk3str_is_on(vp)) {
+ job->options |= HB_JOB_OPT_CHM;
+ } else {
+ job->options &= (~(HB_JOB_OPT_CHM));
+ }
+ } else {
+ /* Warning: Not a boolean */
+ dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 29: { $? ". ln"
+ if(HB_SECTION_OPTIONS == st) {
+ if(dk3str_is_bool(vp)) {
+ if(dk3str_is_on(vp)) {
+ job->options |= HB_JOB_OPT_LN;
+ } else {
+ job->options &= (~(HB_JOB_OPT_LN));
+ }
+ } else {
+ /* Warning: Not a boolean */
+ dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 30: { $? ". input encoding"
+ newie = dk3enc_get_text_encoding_app(vp, NULL);
+ if(0 <= newie) {
+ if(HB_SECTION_OPTIONS == st) {
+ job->iecmd = newie;
+ (job->rootnode)->inenc = newie;
+ }
+ (job->currentnode)->inenc = newie;
+ } else {
+ if(dk3str_casecmp((job->kwnl)[25], vp) == 0) {
+ if(HB_SECTION_OPTIONS == st) {
+ job->iecmd = -1;
+ (job->rootnode)->inenc = -1;
+ }
+ (job->currentnode)->inenc = -1;
+ } else {
+ back = 0;
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 129, 130, vp);
+ }
+ }
+ } break;
+ case 31: { $? ". chm language"
+ if(HB_SECTION_OPTIONS == st) {
+ ptr = dk3str_dup_app(vp, job->app);
+ if(ptr) {
+ dk3_release(job->chmlang);
+ job->chmlang = ptr;
+ } else {
+ back = -1;
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 32: { $? ". js file"
+ if((job->currentnode) && (vp)) {
+ if(!((job->currentnode)->s_jsfiles)) {
+ (job->currentnode)->s_jsfiles =
+ dk3sto_open_app(job->app);
+ if((job->currentnode)->s_jsfiles) {
+ dk3sto_set_comp(
+ (job->currentnode)->s_jsfiles,
+ hbnode_link_compare, 2
+ );
+ }
+ }
+ if(!((job->currentnode)->i_jsfiles)) {
+ if((job->currentnode)->s_jsfiles) {
+ (job->currentnode)->i_jsfiles = dk3sto_it_open(
+ (job->currentnode)->s_jsfiles
+ );
+ }
+ }
+ if((job->currentnode)->s_jsfiles) {
+ if((job->currentnode)->i_jsfiles) {
+ linkptr = hbnode_link_new(
+ vp, (job->currentnode)->nextjs, job->app
+ );
+ if(linkptr) {
+ if(dk3sto_add((job->currentnode)->s_jsfiles, linkptr)) {
+ (job->currentnode)->nextjs += 1UL;
+ } else {
+ hbnode_link_delete(linkptr);
+ back = -1;
+ }
+ } else {
+ back = -1;
+ }
+ } else {
+ back = -1;
+ }
+ } else {
+ back = -1;
+ }
+ }
+ if(vp) {
+ if(!hbtool_add_url(job, vp)) { back = -1; }
+ }
+ } break;
+ case 33: { $? ". inherit js"
+ if(vp) {
+ if(dk3str_is_bool(vp)) {
+ if(dk3str_is_on(vp)) {
+ (job->currentnode)->options &=
+ (~(HB_NODE_OPT_STOP_JS_INHERITANCE));
+ } else {
+ (job->currentnode)->options |=
+ HB_NODE_OPT_STOP_JS_INHERITANCE;
+ }
+ } else {
+ /* Warning: Not a boolean */
+ dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
+ }
+ } else {
+ if(job->currentnode) {
+ (job->currentnode)->options &=
+ (~(HB_NODE_OPT_STOP_JS_INHERITANCE));
+ }
+ }
+ } break;
+ case 34: { $? ". numbers in position"
+ if(HB_SECTION_OPTIONS == st) {
+ if (vp) {
+ if (dk3str_is_bool(vp)) {
+ if (dk3str_is_on(vp)) {
+ job->options |= HB_JOB_OPT_NUM_IN_POS;
+ } else {
+ job->options &= (~(HB_JOB_OPT_NUM_IN_POS));
+ }
+ } else {
+ /* Warning: Not a boolean */
+ dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
+ }
+ } else {
+ job->options |= HB_JOB_OPT_NUM_IN_POS;
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 35: { $? ". numbers in index"
+ if(HB_SECTION_OPTIONS == st) {
+ if (vp) {
+ if (dk3str_is_bool(vp)) {
+ if (dk3str_is_on(vp)) {
+ job->options |= HB_JOB_OPT_NUM_IN_IDX;
+ } else {
+ job->options &= (~(HB_JOB_OPT_NUM_IN_IDX));
+ }
+ } else {
+ dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
+ }
+ } else {
+ job->options |= HB_JOB_OPT_NUM_IN_IDX;
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 36: {
+ if(HB_SECTION_OPTIONS == st) {
+ if (vp) {
+ if (dk3str_is_bool(vp)) {
+ if (dk3str_is_on(vp)) {
+ job->options |= HB_JOB_OPT_NUM_IN_PAGE_HEADER;
+ } else {
+ job->options &= (~(HB_JOB_OPT_NUM_IN_PAGE_HEADER));
+ }
+ } else {
+ dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
+ }
+ } else {
+ job->options |= HB_JOB_OPT_NUM_IN_PAGE_HEADER;
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 37: {
+ long cn;
+ if (vp) {
+#if VERSION_BEFORE_20140716
+ if (1 == dk3sf_sscanf3(vp, dkT("%ld"), &cn))
+#else
+ if (0 != dk3ma_l_from_string(&cn, vp, NULL))
+#endif
+ {
+ if (job->currentnode) {
+ (job->currentnode)->contnum = cn;
+ } else {
+ /* BUG: No current node set! */
+ }
+ } else {
+ /* ERROR: Not a number */
+ dk3app_log_i1(job->app, DK3_LL_ERROR, 141);
+ }
+ } else {
+ /* ERROR: No context number specified */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 133, 134, kp);
+ }
+ } break;
+ case 38: {
+ if(HB_SECTION_OPTIONS == st) {
+ if (vp) {
+ if (dk3str_is_bool(vp)) {
+ if (dk3str_is_on(vp)) {
+ job->options |= HB_JOB_OPT_CHM_FULL_TEXT_SEARCH;
+ } else {
+ job->options &= (~(HB_JOB_OPT_CHM_FULL_TEXT_SEARCH));
+ }
+ } else {
+ dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
+ }
+ } else {
+ job->options |= HB_JOB_OPT_CHM_FULL_TEXT_SEARCH;
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 39: {
+ if(HB_SECTION_OPTIONS == st) {
+ if (vp) {
+ if (dk3str_is_bool(vp)) {
+ if (dk3str_is_on(vp)) {
+ job->options |= HB_JOB_OPT_CODE_LINE_NUMBERS;
+ } else {
+ job->options &= (~(HB_JOB_OPT_CODE_LINE_NUMBERS));
+ }
+ } else {
+ dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
+ }
+ } else {
+ job->options |= HB_JOB_OPT_CODE_LINE_NUMBERS;
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 40: {
+ if(job->currentnode) {
+ ptr = dk3str_dup_app(vp,job->app);
+ if(ptr) {
+ dk3str_correct_filename(ptr);
+ if(!hbtool_check_filename(job, ptr)) { back = -1; }
+ if((job->currentnode)->iconhome) {
+ if(0UL != (job->currentnode)->objno) {
+ /* Overwriting icon home */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 95);
+ }
+ }
+ dk3_release((job->currentnode)->iconhome);
+ (job->currentnode)->iconhome = ptr;
+ /* CHECK FILENAME CHARACTERS */
+ } else {
+ back = -1; /* REPORTED */
+ }
+ }
+ } break;
+ default: {
+ dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 43, 44, kp);
+ } break;
+ }
+ } else {
+ /* Warning: Syntax error! */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 9);
+ }
+ } else {
+ /* Warning: Syntax error in configuration file */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 8);
+ }
+ } else { $? ". comment line, ok"
+ }
+ } else { $? ". empty line, always ok"
+ }
+ $? "- hbconf_process_line %d", back
+ return back;
+}
+
+
+
+/** Line handler function to process a configuration file.
+ @param obj Pointer to a job structure.
+ @param il Input line to process.
+ @return 1 on success, 0 on error (continue), -1 on error (exit).
+*/
+static
+int
+hbconf_line_reader_handler(void *obj, dkChar *il)
+{
+ int back;
+ $? "+ hbconf_line_reader_handler %!ds", TR_STR(il)
+ back = hbconf_process_line((hb_job_t *)obj, il, HB_SECTION_OPTIONS);
+ $? "- hbconf_line_reader_handler %d", back
+ return back;
+}
+
+
+
+/** Process one configuration file.
+ @param job Job structure.
+ @param fn File name to process.
+ @return 1 on success, 0 on error (continue), -1 on error (exit).
+*/
+int
+hbconf_read_one_file(hb_job_t *job, dkChar const *fn)
+{
+ int back = 0;
+ $? "+ hbconf_read_one_file %!ds", TR_STR(fn)
+ back = dk3stream_process_filename_lines_app(
+ (void *)job, hbconf_line_reader_handler, fn,
+ job->ilfile, job->bs,
+ dk3app_get_encoding(job->app),
+ dk3app_get_input_file_encoding(job->app),
+ job->app
+ );
+ if(1 != back) { back = 0; /* REPORTED */ }
+ $? "- hbconf_read_one_file %d", back
+ return back;
+}
+
+
+
+int
+hbconf_read_files(hb_job_t *job)
+{
+ dk3_search_t *sr = NULL; /* File search result */
+ dkChar const *fn; /* One config file name */
+ int back = 1;
+ $? "+ hbconf_read_files"
+ sr = dk3app_find_config_file(job->app, (job->kwnl)[3], 0);
+ if(sr) {
+ dk3search_reset(sr);
+ while(NULL != (fn = dk3search_next(sr))) {
+ if(back) {
+ if(!hbconf_read_one_file(job, fn)) {
+ back = 0; /* REPORTED */
+ }
+ }
+ }
+ dk3search_close(sr);
+ } $? "- hbconf_read_files %d", back
+ return back;
+}
+
+
+
+dkChar const *
+hbconf_node_template(hb_job_t *job, hb_node_t *node)
+{
+ dkChar const *back = NULL;
+ hb_node_t *nptr; /* Traverse node and parent nodes */
+ $? "+ hbconf_node_template"
+ nptr = node;
+ while((nptr) && (NULL == back)) {
+ if(nptr->template) {
+ back = nptr->template;
+ } else {
+ nptr = nptr->parent;
+ }
+ } $? "- hbconf_node_template \"%!ds\"", TR_STR(back)
+ return back;
+}
+
+
+
+dkChar const *
+hbconf_node_icon(hb_job_t *job, hb_node_t *node, int icno)
+{
+ dkChar const *back = NULL;
+ hb_node_t *nptr; /* Traverse node and parent nodes */
+ $? "+ hbconf_node_icon"
+ nptr = node;
+ while((nptr) && (NULL == back)) {
+ switch(icno) {
+ case 0: {
+ if(nptr->icontoc) {
+ back = nptr->icontoc;
+ } else {
+ nptr = nptr->parent;
+ }
+ } break;
+ case 1: {
+ if(nptr->iconprev) {
+ back = nptr->iconprev;
+ } else {
+ nptr = nptr->parent;
+ }
+ } break;
+ case 2: {
+ if(nptr->iconnext) {
+ back = nptr->iconnext;
+ } else {
+ nptr = nptr->parent;
+ }
+ } break;
+ case 4: {
+ if(nptr->iconhome) {
+ back = nptr->iconhome;
+ } else {
+ nptr = nptr->parent;
+ }
+ } break;
+ default: {
+ if(nptr->iconindex) {
+ back = nptr->iconindex;
+ } else {
+ nptr = nptr->parent;
+ }
+ } break;
+ }
+ }
+ if(!(back)) {
+ back = (job->kwnl)[4 + icno];
+ } $? "- hbconf_node_icon \"%!ds\"", TR_STR(back)
+ return back;
+}
+
+
+
+dkChar const *
+hbconf_title(hb_node_t *node)
+{
+ dkChar const *back = NULL;
+ $? "+ hbconf_title"
+ if (NULL != node->fulltitle) {
+ back = node->fulltitle;
+ } else {
+ while((NULL == back) && (node)) {
+ if(node->title) {
+ back = node->title;
+ } else {
+ node = node->parent;
+ }
+ }
+ }
+ $? "- hbconf_title \"%!ds\"", TR_STR(back)
+ return back;
+}
+
+
+
+dkChar const *
+hbconf_stylefile(hb_node_t *node)
+{
+ dkChar const *back = NULL;
+ $? "+ hbconf_stylefile"
+ while((NULL == back) && (node)) {
+ if(node->stylefile) {
+ back = node->stylefile;
+ } else {
+ node = node->parent;
+ }
+ } $? "- hbconf_stylefile \"%!ds\"", TR_STR(back)
+ return back;
+}
+
+
+
+dkChar const *
+hbconf_author(hb_node_t *node)
+{
+ dkChar const *back = NULL;
+ $? "+ hbconf_author"
+ while((NULL == back) && (node)) {
+ if(node->author) {
+ back = node->author;
+ } else {
+ node = node->parent;
+ }
+ } $? "- hbconf_author \"%!ds\"", TR_STR(back)
+ return back;
+}
+
+
+
+dkChar const *
+hbconf_location(hb_node_t *node)
+{
+ dkChar const *back = NULL;
+ $? "+ hbconf_location"
+ while((NULL == back) && (node)) {
+ if(node->location) {
+ back = node->location;
+ } else {
+ node = node->parent;
+ }
+ } $? "- hbconf_location \"%!ds\"", TR_STR(back)
+ return back;
+}
+
+
+
+dkChar const *
+hbconf_favicon(hb_node_t *node)
+{
+ dkChar const *back = NULL;
+ $? "+ hbconf_favicon"
+ while((NULL == back) && (node)) {
+ if(node->favicon) {
+ back = node->favicon;
+ } else {
+ node = node->parent;
+ }
+ } $? "- hbconf_favicon \"%!ds\"", TR_STR(back)
+ return back;
+}
+
+