1 /*
2 Copyright (C) 2013-2021, Dirk Krause
3 SPDX-License-Identifier: BSD-3-Clause
4 */
5 
6 /*
7 	WARNING: This file was generated by the dkct program (see
8 	http://dktools.sourceforge.net/ for details).
9 	Changes you make here will be lost if dkct is run again!
10 	You should modify the original source and run dkct on it.
11 	Original source: hbconf.ctr
12 */
13 
14 /**	@file hbconf.c The hbconf module.
15 */
16 
17 
18 #include <libdk3c/dk3all.h>
19 #include <htmlbook/htmlbook.h>
20 #include <libdk3c/dk3maihd.h>
21 
22 
23 
24 
25 
26 
27 /**	Names of configuration file options.
28 */
29 dkChar const * const	hbconf_options[] = {
30 /* 0 */
31 dkT("author"),
32 
33 /* 1 */
34 dkT("title"),
35 
36 /* 2 */
37 dkT("url"),
38 
39 /* 3 */
40 dkT("output directory"),
41 
42 /* 4 */
43 dkT("output script"),
44 
45 /* 5 */
46 dkT("html charset"),
47 
48 /* 6 */
49 dkT("template"),
50 
51 /* 7 */
52 dkT("style"),
53 
54 /* 8 */
55 dkT("page toc"),
56 
57 /* 9 */
58 dkT("index file"),
59 
60 /* 10 */
61 dkT("create index"),
62 
63 /* 11 */
64 dkT("replace ampersand"),
65 
66 /* 12 */
67 dkT("tidy"),
68 
69 /* 13 */
70 dkT("location"),
71 
72 /* 14 */
73 dkT("write position"),
74 
75 /* 15 */
76 dkT("navigation"),
77 
78 /* 16 */
79 dkT("short"),
80 
81 /* 17 */
82 dkT("file"),
83 
84 /* 18 */
85 dkT("suffix"),
86 
87 /* 19 */
88 dkT("icon toc"),
89 
90 /* 20 */
91 dkT("icon previous"),
92 
93 /* 21 */
94 dkT("icon next"),
95 
96 /* 22 */
97 dkT("icon index"),
98 
99 /* 23 */
100 dkT("create toc"),
101 
102 /* 24 */
103 dkT("shortcut icon"),
104 
105 /* 25 */
106 dkT("var"),
107 
108 /* 26 */
109 dkT("impressum link"),
110 
111 /* 27 */
112 dkT("impressum page"),
113 
114 /* 28 */
115 dkT("chm"),
116 
117 /* 29 */
118 dkT("ln"),
119 
120 /* 30 */
121 dkT("input encoding"),
122 
123 /* 31 */
124 dkT("chm language"),
125 
126 /* 32 */
127 dkT("js file"),
128 
129 /* 33 */
130 dkT("inherit js"),
131 
132 /* 34 */
133 dkT("section numbers in position"),
134 
135 /* 35 */
136 dkT("section numbers in index"),
137 
138 /* 36 */
139 dkT("section numbers in page header"),
140 
141 /* 37 */
142 dkT("context number"),
143 
144 /* 38 */
145 dkT("chm full text search"),
146 
147 /* 39 */
148 dkT("code line numbers"),
149 
150 /* 40 */
151 dkT("icon home"),
152 
153 /* 41 */
154 dkT("mark external links"),
155 
156 /* 42 */
157 dkT("external link marker symbol"),
158 
159 /* 43 */
160 dkT("table summaries"),
161 
162 /* 44 */
163 dkT("svg wh"),
164 
165 /* 45 */
166 dkT("html doctype"),
167 
168 /* 46 */
169 dkT("privacy link"),
170 
171 /* 47 */
172 dkT("privacy page"),
173 
174 /* 48 */
175 dkT("html lang"),
176 
177 /* 49 */
178 dkT("async js file"),
179 
180 /* 50 */
181 dkT("fold page toc"),
182 
183 /* 51 */
184 dkT("page toc js file"),
185 
186 NULL
187 
188 };
189 
190 
191 
192 /**	Names for HTML doctypes. Must correspond to the enumeration
193 	in the htmlbook header and the hbhtml_doctypes array in the
194 	hbhtml module.
195 */
196 dkChar const * const	hbconf_doctype_names[] = {
197 /* 0 */
198 dkT("none"),
199 
200 /* 1 */
201 dkT("html-5"),
202 
203 /* 2 */
204 dkT("html-4.01-strict"),
205 
206 /* 3 */
207 dkT("html-4.01-transitional"),
208 
209 /* 4 */
210 dkT("html-4.01-frameset"),
211 
212 /* 5 */
213 dkT("xhtml-1.0-strict"),
214 
215 /* 6 */
216 dkT("xhtml-1.0-transitional"),
217 
218 /* 7 */
219 dkT("xhtml-1.0-frameset"),
220 
221 /* 8 */
222 dkT("xhtml-1.1"),
223 
224 NULL
225 
226 };
227 
228 
229 
230 /**	Character sets for HTML output.
231 */
232 dkChar const * const	hbconf_charsets[] = {
233 /* 0 */
234 dkT("utf-8"),
235 
236 /* 1 */
237 dkT("ascii"),
238 
239 /* 2 */
240 dkT("us-ascii"),
241 
242 NULL
243 
244 };
245 
246 
247 
248 void
hbconf_write_external_marker_character(hb_job_t * job)249 hbconf_write_external_marker_character(hb_job_t *job)
250 {
251   char	buf[8*sizeof(dk3_um_t)];
252 
253   if (NULL != job) {
254     job->elmbuf[0] = '\0';
255     if (0UL < job->elmchr) {
256       if (0 != dk3ma_um_to_c8_hex_string(buf,sizeof(buf),job->elmchr,6)) {
257         dk3str_c8_cpy(&(job->elmbuf[0]), buf);
258       }
259     }
260   }
261 }
262 
263 
264 
265 /**	Set jump node for the nodes parents.
266 	@param	nodeptr	Text node.
267 */
268 static
269 void
hbconf_set_jump_node(hb_node_t * nodeptr)270 hbconf_set_jump_node(hb_node_t *nodeptr)
271 {
272   hb_node_t	*parent;	/* Parent node */
273   int		 cc;		/* Flag: Can continue */
274 
275   parent = nodeptr->parent;
276   cc = 1;
277   while(cc) {
278     if(parent) {
279       if(parent->jumpnode) {
280         cc = 0;
281       } else {
282         if(-1 != parent->indent) {
283           parent->jumpnode = nodeptr;
284 	  parent = parent->parent;
285 	} else {
286 	  cc = 0;
287 	}
288       }
289     } else {
290       cc = 0;
291     }
292   }
293 }
294 
295 
296 
297 static
298 void
hbconf_change_external_marker_character(hb_job_t * job,dkChar * vp,int * backptr)299 hbconf_change_external_marker_character(
300   hb_job_t	*job,
301   dkChar	*vp,
302   int		*backptr
303 )
304 {
305   dk3_um_t	 um	= (dk3_um_t)0UL;
306   int		 ec	= 0;
307 
308   if (0 != dk3ma_um_from_hex_string(&um, vp, &ec)) {
309     if ((dk3_um_t)0x01000000UL > um) {
310       job->elmchr = (unsigned long)um;
311       hbconf_write_external_marker_character(job);
312     }
313     else {
314       /* ERROR: Math overflow */
315       dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 101);
316     }
317   }
318   else {
319     switch (ec) {
320       case DK3_ERROR_MATH_OVERFLOW : {
321         /* ERROR: Math overflow */
322 	dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 101);
323       } break;
324       default : {
325         /* ERROR: Syntax, not a hexadecimal number */
326 	dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 100);
327       } break;
328     }
329     *backptr = -1;
330   }
331 }
332 
333 
334 
335 
336 /**	Process one configuration line from configuration file.
337 	@param	job	Job structure.
338 	@param	il	Input line to process.
339 	@param	st	Current section type, HB_SECTION_OPTIONS
340 			or HB_SECTION_CONTENTS.
341 	@return	1 on success, 0 on error (continue), -1 on error (exit).
342 */
343 int
hbconf_process_line(hb_job_t * job,dkChar * il,int st)344 hbconf_process_line(hb_job_t *job, dkChar *il, int st)
345 {
346   dk3_key_value_t	*kvp;		/* New key value pair */
347   hb_link_t		*linkptr;	/* New data for JS file */
348   dkChar		*kp;		/* Key */
349   dkChar		*vp;		/* Value */
350   dkChar		*ap;		/* Argument */
351   dkChar		*nc;		/* New text for existing key/value */
352   dkChar		*ptr;		/* Traverse string */
353   int			 newie;		/* Input encoding */
354   int			 back	= 1;
355 
356   kp = dk3str_start(il, NULL);
357   if(kp) {
358     if(dkT('#') != *kp) {
359       vp = dk3str_chr(kp, dkT('='));
360       if(vp) {
361         *(vp++) = dkT('\0');
362 	vp = dk3str_start(vp, NULL);
363 	if(vp) {
364 	  dk3str_normalize(kp, NULL, dkT(' '));
365 	  dk3str_chomp(vp, NULL);
366 	  switch(dk3str_array_index(hbconf_options, kp, 0)) {
367 	    case  0: {		/* author */
368 	      if(job->currentnode) {
369 	        ptr = dk3str_dup_app(vp,job->app);
370 		if(ptr) {
371 		  if((job->currentnode)->author) {
372 		    if(0UL != (job->currentnode)->objno) {
373 		      dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 69);
374 		    }
375 		  }
376 		  dk3_release((job->currentnode)->author);
377 		  (job->currentnode)->author = ptr;
378 		} else {
379 		  back = -1;	/* REPORTED */
380 		}
381 	      }
382 	    } break;
383 	    case  1: {		/* title */
384 	      if(job->currentnode) {
385 	        ptr = dk3str_dup_app(vp,job->app);
386 		if(ptr) {
387 
388 #if	VERSION_BEFORE_20161026
389 		  if((job->currentnode)->title) {
390 		    if(0UL != (job->currentnode)->objno) {
391 		      /* Overwriting title */
392 		      dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 70);
393 		    }
394 		  }
395 		  dk3_release((job->currentnode)->title);
396 		  (job->currentnode)->title = ptr;
397 #else
398 		  if((job->currentnode)->title) {
399 		    if ((job->currentnode)->fulltitle) {
400 		      if (0UL != (job->currentnode)->objno) {
401 		        /* Overwriting title */
402 			dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 70);
403 		      }
404 		      dk3mem_free((job->currentnode)->fulltitle);
405 		    }
406 		    (job->currentnode)->fulltitle = ptr;
407 		  } else {
408 		    (job->currentnode)->title = ptr;
409 		  }
410 #endif
411 		} else {
412 		  back = -1;	/* REPORTED */
413 		}
414 	      }
415 	    } break;
416 	    case  2: {		/* url */
417 	      if(HB_SECTION_OPTIONS == st) {
418 	        ptr = dk3str_dup_app(vp,job->app);
419 	        if(ptr) {
420 	          dk3_release(job->url);
421 		  job->url = ptr;
422 	        } else {
423 	          back = -1;	/* REPORTED */
424 	        }
425 	      } else {
426 	        /* ERROR: Only allowed in options section */
427 		dk3app_log_1(job->app,DK3_LL_ERROR,job->msg,38);
428 		back = -1;
429 	      }
430 	    } break;
431 	    case  3: {		/* output directory */
432 	      if(HB_SECTION_OPTIONS == st) {
433 	        ptr = dk3str_dup_app(vp,job->app);
434 	        if(ptr) {
435 		  dk3str_correct_filename(ptr);
436 		  if(job->outputdir) {
437 		    /* Overwrite output directory */
438 		    dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 71);
439 		  }
440 	          dk3_release(job->outputdir);
441 		  job->outputdir = ptr;
442 		  /* CHECK FILENAME CHARACTERS */
443 		  if(!hbtool_check_filename_encoding(job, ptr)) {
444 		    back = -1;
445 		  }
446 	        } else {
447 	          back = -1;	/* REPORTED */
448 	        }
449 	      } else {
450 	        /* ERROR: Only allowed in options section */
451 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
452 	      }
453 	    } break;
454 	    case  4: {		/* output script */
455 	      if(HB_SECTION_OPTIONS == st) {
456 	        ptr = dk3str_dup_app(vp,job->app);
457 	        if(ptr) {
458 		  if(job->outputscript) {
459 		    /* Overwrite output script */
460 		    dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 72);
461 		  }
462 	          dk3_release(job->outputscript);
463 		  job->outputscript = ptr;
464 		  /* CHECK FILENAME CHARACTERS */
465 		  if(!hbtool_check_filename(job, ptr)) {
466 		    back = -1;
467 		  }
468 	        } else {
469 	          back = -1;	/* REPORTED */
470 	        }
471 	      } else {
472 	        /* ERROR: Only allowed in options section */
473 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
474 	      }
475 	    } break;
476 	    case  5: {		/* html charset */
477 	      if(job->currentnode) {
478 	        switch(dk3str_array_index(hbconf_charsets, vp, 0)) {
479 		  case 0: {
480 		    job->cs = HB_CS_UTF_8;
481 		  } break;
482 		  case 1: case 2: {
483 		    job->cs = HB_CS_ASCII;
484 		  } break;
485 		  default: {
486 		    /* WARNING: Unknown charset! */
487 		    dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 11);
488 		  } break;
489 		}
490 	      }
491 	    } break;
492 	    case  6: {		/* template */
493 	      if(job->currentnode) {
494 	        ptr = dk3str_dup_app(vp,job->app);
495 		if(ptr) {
496 		  dk3str_correct_filename(ptr);
497 		  if((job->currentnode)->templatefi) {
498 		    if(0UL != (job->currentnode)->objno) {
499 		      /* Overwriting template */
500 		      dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 73);
501 		    }
502 		  }
503 		  dk3_release((job->currentnode)->templatefi);
504 		  (job->currentnode)->templatefi = ptr;
505 		} else {
506 		  back = -1;	/* REPORTED */
507 		}
508 	      }
509 	    } break;
510 	    case  7: {		/* style */
511 	      if(job->currentnode) {
512 	        ptr = dk3str_dup_app(vp,job->app);
513 		if(ptr) {
514 		  dk3str_correct_filename(ptr);
515 		  if(!hbtool_check_filename(job, ptr)) { back = -1; }
516 		  if((job->currentnode)->stylefile) {
517 		    if(0UL != (job->currentnode)->objno) {
518 		      /* Overwriting style */
519 		      dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 74);
520 		    }
521 		  }
522 		  dk3_release((job->currentnode)->stylefile);
523 		  (job->currentnode)->stylefile = ptr;
524 		} else {
525 		  back = -1;	/* REPORTED */
526 		}
527 	      }
528 	    } break;
529 	    case  8: {		/* page toc */
530 	      if(job->currentnode) {
531 	        if(dk3str_is_bool(vp)) {
532 		  if(dk3str_is_on(vp)) {
533 		    (job->currentnode)->options =
534 		    ((job->currentnode)->options) | HB_NODE_OPT_PAGE_TOC;
535 		  } else {
536 		    (job->currentnode)->options =
537 		    ((job->currentnode)->options) & (~(HB_NODE_OPT_PAGE_TOC));
538 		  }
539 		} else {
540 		  /* WARNING: Not a boolean value! */
541 		  dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
542 		}
543 	      }
544 	    } break;
545 	    case  9: {		/* toc file */
546 	      if(HB_SECTION_OPTIONS == st) {
547 	        if(job->rootnode) {
548 	          ptr = dk3str_dup_app(vp,job->app);
549 		  if(ptr) {
550 		    dk3str_correct_filename(ptr);
551 		    if(!hbtool_check_filename(job, ptr)) { back = -1; }
552 		    dk3_release((job->rootnode)->filename);
553 		    (job->rootnode)->filename = ptr;
554 		  } else {
555 		    back = -1;	/* REPORTED */
556 		  }
557 	        }
558 	      } else {
559 	        /* ERROR: Only allowed in options section */
560 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
561 	      }
562 	    } break;
563 	    case 10: {		/* create index */
564 	      if(HB_SECTION_OPTIONS == st) {
565 	        if(dk3str_is_bool(vp)) {
566 	          if(dk3str_is_on(vp)) {
567 		    job->options = (job->options) | HB_JOB_OPT_CREATE_INDEX;
568 		  } else {
569 		    job->options = (job->options) & (~(HB_JOB_OPT_CREATE_INDEX));
570 		  }
571 	        } else {
572 	          /* WARNING: Not a boolean */
573 		  dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
574 	        }
575 	      } else {
576 	        /* ERROR: Only allowed in options section */
577 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
578 	      }
579 	    } break;
580 	    case 11: {		/* replace ampersand */
581 	      if(job->currentnode) {
582 	        if(dk3str_is_bool(vp)) {
583 		  if(dk3str_is_on(vp)) {
584 		    (job->currentnode)->options =
585 		    ((job->currentnode)->options)
586 		    | HB_NODE_OPT_REPLACE_AMPERSAND;
587 		  } else {
588 		    (job->currentnode)->options =
589 		    ((job->currentnode)->options)
590 		    & (~(HB_NODE_OPT_REPLACE_AMPERSAND));
591 		  }
592 		} else {
593 		  /* WARNING: Not a boolean. */
594 		  dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
595 		}
596 	      }
597 	    } break;
598 	    case 12: {		/* use tidy */
599 	      if(job->currentnode) {
600 	        if(dk3str_is_bool(vp)) {
601 		  if(dk3str_is_on(vp)) {
602 		    (job->currentnode)->options =
603 		    ((job->currentnode)->options)
604 		    | HB_NODE_OPT_USE_TIDY;
605 		  } else {
606 		    (job->currentnode)->options =
607 		    ((job->currentnode)->options)
608 		    & (~(HB_NODE_OPT_USE_TIDY));
609 		  }
610 		} else {
611 		  /* WARNING: Not a boolean. */
612 		  dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
613 		}
614 	      }
615 	    } break;
616 	    case 13: {		/* location */
617 	      if(job->currentnode) {
618 	        ptr = dk3str_dup_app(vp,job->app);
619 		if(ptr) {
620 		  dk3_release((job->currentnode)->location);
621 		  (job->currentnode)->location = ptr;
622 		} else {
623 		  back = -1;	/* REPORTED */
624 		}
625 	      }
626 	    } break;
627 	    case 14: {		/* write header chain */
628 	      if(job->currentnode) {
629 	        if(dk3str_is_bool(vp)) {
630 		  if(dk3str_is_on(vp)) {
631 		    (job->currentnode)->options =
632 		    ((job->currentnode)->options)
633 		    | HB_NODE_OPT_HEADER_CHAIN;
634 		  } else {
635 		    (job->currentnode)->options =
636 		    ((job->currentnode)->options)
637 		    & (~(HB_NODE_OPT_HEADER_CHAIN));
638 		  }
639 		} else {
640 		  /* WARNING: Not a boolean */
641 		  dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
642 		}
643 	      }
644 	    } break;
645 	    case 15: {		/* navigation */
646 	      /* navigation is now configured via arguments to special cmd */
647 	    } break;
648 	    case 16: {		/* short */
649 	      if(job->currentnode) {
650 	        ptr = dk3str_dup_app(vp,job->app);
651 		if(ptr) {
652 		  if((job->currentnode)->shorttitle) {
653 		    if(0UL != (job->currentnode)->objno) {
654 		      /* Overwriting short */
655 		      dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 75);
656 		    }
657 		  }
658 		  dk3_release((job->currentnode)->shorttitle);
659 		  (job->currentnode)->shorttitle = ptr;
660 		} else {
661 		  back = -1;	/* REPORTED */
662 		}
663 	      }
664 	    } break;
665 	    case 17: {		/* file */
666 	      if(job->currentnode) {
667 	        ptr = dk3str_dup_app(vp,job->app);
668 		if(ptr) {
669 		  dk3str_correct_filename(ptr);
670 		  if(!hbtool_check_filename(job, ptr)) { back = -1; }
671 		  if((job->currentnode)->filename) {
672 		    if(0UL != (job->currentnode)->objno) {
673 		      /* Overwriting file */
674 		      dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 76);
675 		    }
676 		  }
677 		  dk3_release((job->currentnode)->filename);
678 		  (job->currentnode)->filename = ptr;
679 		  hbconf_set_jump_node(job->currentnode);
680 		  if(!(dk3sto_it_find_like(job->i_pnodes,job->currentnode,0))) {
681 		    if(!(dk3sto_add(job->s_pnodes, job->currentnode))) {
682 		      back = -1;	/* REPORTED */
683 		    }
684 		  }
685 		} else {
686 		  back = -1;		/* REPORTED */
687 		}
688 	      }
689 	    } break;
690 	    case 18: {		/* suffix */
691 	      if(job->currentnode) {
692 	        ptr = dk3str_dup_app(vp,job->app);
693 		if(ptr) {
694 		  if((job->currentnode)->suffix) {
695 		    if(0UL != (job->currentnode)->objno) {
696 		      /* Overwriting suffix */
697 		      dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 77);
698 		    }
699 		  }
700 		  dk3_release((job->currentnode)->suffix);
701 		  (job->currentnode)->suffix = ptr;
702 		  /* CHECK FILENAME CHARACTERS */
703 		  if(!hbtool_check_filename_encoding(job, ptr)) { back = -1; }
704 		} else {
705 		  back = -1;		/* REPORTED */
706 		}
707 	      }
708 	    } break;
709 	    case 19: {
710 	      if(job->currentnode) {
711 	        ptr = dk3str_dup_app(vp,job->app);
712 		if(ptr) {
713 		  dk3str_correct_filename(ptr);
714 		  if(!hbtool_check_filename(job, ptr)) { back = -1; }
715 		  if((job->currentnode)->icontoc) {
716 		    if(0UL != (job->currentnode)->objno) {
717 		      /* Overwriting icon toc */
718 		      dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 78);
719 		    }
720 		  }
721 		  dk3_release((job->currentnode)->icontoc);
722 		  (job->currentnode)->icontoc = ptr;
723 		  /* CHECK FILENAME CHARACTERS */
724 		} else {
725 		  back = -1;		/* REPORTED */
726 		}
727 	      }
728 	    } break;
729 	    case 20: {
730 	      if(job->currentnode) {
731 	        ptr = dk3str_dup_app(vp,job->app);
732 		if(ptr) {
733 		  dk3str_correct_filename(ptr);
734 		  if(!hbtool_check_filename(job, ptr)) { back = -1; }
735 		  if((job->currentnode)->iconprev) {
736 		    if(0UL != (job->currentnode)->objno) {
737 		      /* Overwriting icon previous */
738 		      dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 79);
739 		    }
740 		  }
741 		  dk3_release((job->currentnode)->iconprev);
742 		  (job->currentnode)->iconprev = ptr;
743 		  /* CHECK FILENAME CHARACTERS */
744 		} else {
745 		  back = -1;		/* REPORTED */
746 		}
747 	      }
748 	    } break;
749 	    case 21: {
750 	      if(job->currentnode) {
751 	        ptr = dk3str_dup_app(vp,job->app);
752 		if(ptr) {
753 		  dk3str_correct_filename(ptr);
754 		  if(!hbtool_check_filename(job, ptr)) { back = -1; }
755 		  if((job->currentnode)->iconnext) {
756 		    if(0UL != (job->currentnode)->objno) {
757 		      /* Overwriting icon next */
758 		      dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 80);
759 		    }
760 		  }
761 		  dk3_release((job->currentnode)->iconnext);
762 		  (job->currentnode)->iconnext = ptr;
763 		  /* CHECK FILENAME CHARACTERS */
764 		} else {
765 		  back = -1;		/* REPORTED */
766 		}
767 	      }
768 	    } break;
769 	    case 22: {
770 	      if(job->currentnode) {
771 	        ptr = dk3str_dup_app(vp,job->app);
772 		if(ptr) {
773 		  dk3str_correct_filename(ptr);
774 		  if(!hbtool_check_filename(job, ptr)) { back = -1; }
775 		  if((job->currentnode)->iconindex) {
776 		    if(0UL != (job->currentnode)->objno) {
777 		      /* Overwriting icon index */
778 		      dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 81);
779 		    }
780 		  }
781 		  dk3_release((job->currentnode)->iconindex);
782 		  (job->currentnode)->iconindex = ptr;
783 		  /* CHECK FILENAME CHARACTERS */
784 		} else {
785 		  back = -1;		/* REPORTED */
786 		}
787 	      }
788 	    } break;
789 	    case 23: {
790 	      if(HB_SECTION_OPTIONS == st) {
791 	        if(dk3str_is_bool(vp)) {
792 	          if(dk3str_is_on(vp)) {
793 		    job->options = ((job->options) | HB_JOB_OPT_CREATE_TOC);
794 		  } else {
795 		    job->options =
796 		    ((job->options) & (~(HB_JOB_OPT_CREATE_TOC)));
797 		  }
798 	        } else {
799 	          /* Warning: Not a boolean! */
800 		  dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
801 	        }
802 	      } else {
803 	        /* ERROR: Only allowed in options section */
804 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
805 	      }
806 	    } break;
807 	    case 24: {
808 	        if(job->currentnode) {
809 		  ptr = dk3str_dup_app(vp,job->app);
810 		  if(ptr) {
811 		    dk3str_correct_filename(ptr);
812 		    hbtool_correct_backslash_to_slash(ptr);
813 		    if((job->currentnode)->favicon) {
814 		      if(0UL != (job->currentnode)->objno) {
815 		        /* Overwriting shortcut icon */
816 		        dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 82);
817 		      }
818 		    }
819 		    dk3_release((job->currentnode)->favicon);
820 		    (job->currentnode)->favicon = ptr;
821 		    /* ADD TO LIST OF ADDITIONAL FILES */
822 		    if (!(hbtool_add_file(job, ptr))) {
823 		      back = -1;
824 		    }
825 		    /* CHECK FILENAME CHARACTERS */
826 		    if(!hbtool_check_filename_encoding(job, ptr)) { back = -1; }
827 		  } else {
828 		    back = -1;	/* REPORTED */
829 		  }
830 		}
831 	    } break;
832 	    case 25: {
833 	      if(job->currentnode) {
834 		ap = dk3str_next(vp, NULL);
835 		if(ap) {
836 		  kvp = (dk3_key_value_t *)dk3sto_it_find_like(
837 		    (job->currentnode)->i_variables, vp, 1
838 		  );
839 		  if(kvp) {
840 		    nc = dk3str_dup_app(ap, job->app);
841 		    if(nc) {
842 		      if(kvp->val) {
843 		        if(0UL != (job->currentnode)->objno) {
844 		          /* Overwriting var */
845 		          dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 83);
846 		        }
847 		      }
848 		      dk3_release(kvp->val);
849 		      kvp->val = nc;
850 		    } else {
851 		      back = -1;	/* REPORTED */
852 		    }
853 		  } else {
854 		    kvp = dk3kv_new_app(vp, ap, job->app);
855 		    if(kvp) {
856 		      if(!(dk3sto_add((job->currentnode)->s_variables, kvp))) {
857 		        dk3kv_delete(kvp);
858 			back = -1;	/* REPORTED */
859 		      }
860 		    } else {
861 		      back = -1;	/* REPORTED */
862 		    }
863 		  }
864 		} else {
865 		  kvp = (dk3_key_value_t *)dk3sto_it_find_like(
866 		    (job->currentnode)->i_variables, vp, 1
867 		  );
868 		  if(kvp) {
869 		    dk3sto_remove((job->currentnode)->s_variables, kvp);
870 		    dk3kv_delete(kvp);
871 		  }
872 		}
873 	      } else {
874 	      }
875 	    } break;
876 	    case 26: {
877 	      if(HB_SECTION_OPTIONS == st) {
878 	        ptr = dk3str_dup_app(vp, job->app);
879 	        if(ptr) {
880 	          dk3_release(job->impressumlink);
881 		  job->impressumlink = ptr;
882 	        } else {
883 	          back = -1;	/* REPORTED */
884 	        }
885 	      } else {
886 	        /* ERROR: Only allowed in options section */
887 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
888 	      }
889 	    } break;
890 	    case 27: {
891 	      if(HB_SECTION_OPTIONS == st) {
892 	        job->impressumnode = hb_node_new(
893 		  job, job->rootnode, job->lineno, job->nextobj, 0
894 		);
895 
896 		job->nextobj += 1UL;
897 		if(job->impressumnode) {
898 		  if((job->impressumnode)->depth > job->maxdepth) {
899 		    job->maxdepth = (job->impressumnode)->depth;
900 		  }
901 		  (job->impressumnode)->options |= HB_NODE_OPT_IMPRESSUM;
902 		  if(dk3sto_add(job->s_nodes, (void *)(job->impressumnode))) {
903 
904 		    (job->impressumnode)->title =
905 		    dk3str_dup_app((job->msg)[0], job->app);
906 		    if((job->impressumnode)->title) {
907 		      dk3str_correct_filename(vp);
908 		      if(!hbtool_check_filename(job, vp)) { back = -1; }
909 		      /* CHECK FILENAME CHARACTERS */
910 		      (job->impressumnode)->filename =
911 		      dk3str_dup_app(vp, job->app);
912 		      if(!((job->impressumnode)->filename)) {
913 		        back = -1;
914 		      }
915 		    } else {
916 		      back = -1;	/* REPORTED */
917 		    }
918 		    if(1 == back) {
919 		      if(!dk3sto_add(job->s_pnodes,(void*)(job->impressumnode)))
920 		      {
921 		        back = -1;	/* REPORTED */
922 		      }
923 		    }
924 		  } else {
925 		    hb_node_delete(job->impressumnode);
926 		    job->impressumnode = NULL;
927 		    back = -1;		/* REPORTED */
928 		  }
929 		} else {
930 		  back = -1;		/* REPORTED */
931 		}
932 	      } else {
933 	        /* ERROR: Only allowed in options section */
934 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
935 	      }
936 	    } break;
937 	    case 28: {
938 	      if(HB_SECTION_OPTIONS == st) {
939 	        if(dk3str_is_bool(vp)) {
940 	          if(dk3str_is_on(vp)) {
941 		    job->options |= HB_JOB_OPT_CHM;
942 		  } else {
943 		    job->options &= (~(HB_JOB_OPT_CHM));
944 		  }
945 	        } else {
946 	          /* Warning: Not a boolean */
947 		  dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
948 	        }
949 	      } else {
950 	        /* ERROR: Only allowed in options section */
951 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
952 	      }
953 	    } break;
954 	    case 29: {
955 	      if(HB_SECTION_OPTIONS == st) {
956 		if(dk3str_is_bool(vp)) {
957 		  if(dk3str_is_on(vp)) {
958 		    job->options |= HB_JOB_OPT_LN;
959 		  } else {
960 		    job->options &= (~(HB_JOB_OPT_LN));
961 		  }
962 		} else {
963 		  /* Warning: Not a boolean */
964 		  dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
965 		}
966 	      } else {
967 	        /* ERROR: Only allowed in options section */
968 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
969 	      }
970 	    } break;
971 	    case 30: {
972 	      newie = dk3enc_get_text_encoding_app(vp, NULL);
973 	      if(0 <= newie) {
974 	        if(HB_SECTION_OPTIONS == st) {
975 		  job->iecmd = newie;
976 		  (job->rootnode)->inenc = newie;
977 		}
978 		(job->currentnode)->inenc = newie;
979 	      } else {
980 	        if(dk3str_casecmp((job->kwnl)[25], vp) == 0) {
981 		  if(HB_SECTION_OPTIONS == st) {
982 		    job->iecmd = -1;
983 		    (job->rootnode)->inenc = -1;
984 		  }
985 		  (job->currentnode)->inenc = -1;
986 		} else {
987 		  back = 0;
988 		  dk3app_log_i3(job->app, DK3_LL_ERROR, 129, 130, vp);
989 		}
990 	      }
991 	    } break;
992 	    case 31: {
993 	      if(HB_SECTION_OPTIONS == st) {
994 	        ptr = dk3str_dup_app(vp, job->app);
995 		if(ptr) {
996 		  dk3_release(job->chmlang);
997 		  job->chmlang = ptr;
998 		} else {
999 		  back = -1;
1000 		}
1001 	      } else {
1002 	        /* ERROR: Only allowed in options section */
1003 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
1004 	      }
1005 	    } break;
1006 	    case 32: {
1007 	      if((job->currentnode) && (vp)) {
1008 	        if(!((job->currentnode)->s_jsfiles)) {
1009 		  (job->currentnode)->s_jsfiles =
1010 		  dk3sto_open_app(job->app);
1011 		  if((job->currentnode)->s_jsfiles) {
1012 		    dk3sto_set_comp(
1013 		      (job->currentnode)->s_jsfiles,
1014 		      hbnode_link_compare, 2
1015 		    );
1016 		  }
1017 		}
1018 		if(!((job->currentnode)->i_jsfiles)) {
1019 		  if((job->currentnode)->s_jsfiles) {
1020 		    (job->currentnode)->i_jsfiles = dk3sto_it_open(
1021 		      (job->currentnode)->s_jsfiles
1022 		    );
1023 		  }
1024 		}
1025 		if((job->currentnode)->s_jsfiles) {
1026 		  if((job->currentnode)->i_jsfiles) {
1027 		    linkptr = hbnode_link_new(
1028 		      vp, (job->currentnode)->nextjs, job->app
1029 		    );
1030 		    if(linkptr) {
1031 		      if(dk3sto_add((job->currentnode)->s_jsfiles, linkptr)) {
1032 		        (job->currentnode)->nextjs += 1UL;
1033 		      } else {
1034 		        hbnode_link_delete(linkptr);
1035 			back = -1;
1036 		      }
1037 		    } else {
1038 		      back = -1;
1039 		    }
1040 		  } else {
1041 		    back = -1;
1042 		  }
1043 		} else {
1044 		  back = -1;
1045 		}
1046 	      }
1047 	      if(vp) {
1048 	        if(!hbtool_add_url(job, vp)) { back = -1; }
1049 	      }
1050 	    } break;
1051 	    case 33: {
1052 	      if(vp) {
1053 	        if(dk3str_is_bool(vp)) {
1054 		  if(dk3str_is_on(vp)) {
1055 		    (job->currentnode)->options &=
1056 		    (~(HB_NODE_OPT_STOP_JS_INHERITANCE));
1057 		  } else {
1058 		    (job->currentnode)->options |=
1059 		    HB_NODE_OPT_STOP_JS_INHERITANCE;
1060 		  }
1061 		} else {
1062 		  /* Warning: Not a boolean */
1063 		  dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
1064 		}
1065 	      } else {
1066 	        if(job->currentnode) {
1067 		  (job->currentnode)->options &=
1068 		  (~(HB_NODE_OPT_STOP_JS_INHERITANCE));
1069 		}
1070 	      }
1071 	    } break;
1072 	    case 34: {
1073 	      if(HB_SECTION_OPTIONS == st) {
1074 	        if (vp) {
1075 	          if (dk3str_is_bool(vp)) {
1076 		    if (dk3str_is_on(vp)) {
1077 		      job->options |= HB_JOB_OPT_NUM_IN_POS;
1078 		    } else {
1079 		      job->options &= (~(HB_JOB_OPT_NUM_IN_POS));
1080 		    }
1081 		  } else {
1082 		    /* Warning: Not a boolean */
1083 		    dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
1084 		  }
1085 	        } else {
1086 	          job->options |= HB_JOB_OPT_NUM_IN_POS;
1087 	        }
1088 	      } else {
1089 	        /* ERROR: Only allowed in options section */
1090 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
1091 	      }
1092 	    } break;
1093 	    case 35: {
1094 	      if(HB_SECTION_OPTIONS == st) {
1095 	        if (vp) {
1096 	          if (dk3str_is_bool(vp)) {
1097 		    if (dk3str_is_on(vp)) {
1098 		      job->options |= HB_JOB_OPT_NUM_IN_IDX;
1099 		    } else {
1100 		      job->options &= (~(HB_JOB_OPT_NUM_IN_IDX));
1101 		    }
1102 		  } else {
1103 		    dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
1104 		  }
1105 	        } else {
1106 	          job->options |= HB_JOB_OPT_NUM_IN_IDX;
1107 	        }
1108 	      } else {
1109 	        /* ERROR: Only allowed in options section */
1110 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
1111 	      }
1112 	    } break;
1113 	    case 36: {
1114 	      if(HB_SECTION_OPTIONS == st) {
1115 	        if (vp) {
1116 	          if (dk3str_is_bool(vp)) {
1117 		    if (dk3str_is_on(vp)) {
1118 		      job->options |= HB_JOB_OPT_NUM_IN_PAGE_HEADER;
1119 		    } else {
1120 		      job->options &= (~(HB_JOB_OPT_NUM_IN_PAGE_HEADER));
1121 		    }
1122 		  } else {
1123 		    dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
1124 		  }
1125 	        } else {
1126 	          job->options |= HB_JOB_OPT_NUM_IN_PAGE_HEADER;
1127 	        }
1128 	      } else {
1129 	        /* ERROR: Only allowed in options section */
1130 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
1131 	      }
1132 	    } break;
1133 	    case 37: {
1134 	      long cn;
1135 	      if (vp) {
1136 #if VERSION_BEFORE_20140716
1137 	        if (1 == dk3sf_sscanf3(vp, dkT("%ld"), &cn))
1138 #else
1139 		if (0 != dk3ma_l_from_string(&cn, vp, NULL))
1140 #endif
1141 		{
1142 		  if (job->currentnode) {
1143 		    (job->currentnode)->contnum = cn;
1144 		  } else {
1145 		    /* BUG: No current node set! */
1146 		  }
1147 		} else {
1148 		  /* ERROR: Not a number */
1149 		  dk3app_log_i1(job->app, DK3_LL_ERROR, 141);
1150 		}
1151 	      } else {
1152 	        /* ERROR: No context number specified */
1153 		dk3app_log_i3(job->app, DK3_LL_ERROR, 133, 134, kp);
1154 	      }
1155 	    } break;
1156 	    case 38: {
1157 	      if(HB_SECTION_OPTIONS == st) {
1158 	        if (vp) {
1159 	          if (dk3str_is_bool(vp)) {
1160 		    if (dk3str_is_on(vp)) {
1161 		      job->options |= HB_JOB_OPT_CHM_FULL_TEXT_SEARCH;
1162 		    } else {
1163 		      job->options &= (~(HB_JOB_OPT_CHM_FULL_TEXT_SEARCH));
1164 		    }
1165 		  } else {
1166 		    dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
1167 		  }
1168 	        } else {
1169 	          job->options |= HB_JOB_OPT_CHM_FULL_TEXT_SEARCH;
1170 	        }
1171 	      } else {
1172 	        /* ERROR: Only allowed in options section */
1173 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
1174 	      }
1175 	    } break;
1176 	    case 39: {
1177 	      if(HB_SECTION_OPTIONS == st) {
1178 	        if (vp) {
1179 	          if (dk3str_is_bool(vp)) {
1180 		    if (dk3str_is_on(vp)) {
1181 		      job->options |= HB_JOB_OPT_CODE_LINE_NUMBERS;
1182 		    } else {
1183 		      job->options &= (~(HB_JOB_OPT_CODE_LINE_NUMBERS));
1184 		    }
1185 		  } else {
1186 		    dk3app_log_i3(job->app, DK3_LL_WARNING, 146, 144, vp);
1187 		  }
1188 	        } else {
1189 	          job->options |= HB_JOB_OPT_CODE_LINE_NUMBERS;
1190 	        }
1191 	      } else {
1192 	      	/* ERROR: Only allowed in options section */
1193 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
1194 	      }
1195 	    } break;
1196 	    case 40: {
1197 	      if(job->currentnode) {
1198 	        ptr = dk3str_dup_app(vp,job->app);
1199 		if(ptr) {
1200 		  dk3str_correct_filename(ptr);
1201 		  if(!hbtool_check_filename(job, ptr)) { back = -1; }
1202 		  if((job->currentnode)->iconhome) {
1203 		    if(0UL != (job->currentnode)->objno) {
1204 		      /* Overwriting icon home */
1205 		      dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 95);
1206 		    }
1207 		  }
1208 		  dk3_release((job->currentnode)->iconhome);
1209 		  (job->currentnode)->iconhome = ptr;
1210 		  /* CHECK FILENAME CHARACTERS */
1211 		} else {
1212 		  back = -1;		/* REPORTED */
1213 		}
1214 	      }
1215 	    } break;
1216 	    case 41 : {
1217 	      if(HB_SECTION_OPTIONS == st) {
1218 	        if (NULL != vp) {
1219 		  if(dk3str_is_bool(vp)) {
1220 		    job->markel = dk3str_is_bool(vp);
1221 		  }
1222 		  else {
1223 		    /* WARNING: Not a boolean value! */
1224 		    dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
1225 		  }
1226 		}
1227 		else {
1228 		  job->markel = 1;
1229 		}
1230 	      }
1231 	      else {
1232 	        /* ERROR: Only allowed in options section */
1233 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
1234 	      }
1235 	    } break;
1236 	    case 42 : {
1237 	      if(HB_SECTION_OPTIONS == st) {
1238 	        if (NULL != vp) {
1239 	          hbconf_change_external_marker_character(job, vp, &back);
1240 	        }
1241 	        else {
1242 	          job->elmchr = 0x01F310UL;
1243 		  hbconf_write_external_marker_character(job);
1244 	        }
1245 	      }
1246 	      else {
1247 	        /* ERROR: Only allowed in options section */
1248 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
1249 	      }
1250 	    } break;
1251 	    case 43: {
1252 	      if(HB_SECTION_OPTIONS == st) {
1253 	        if (NULL != vp) {
1254 		  if(dk3str_is_bool(vp)) {
1255 		    job->tabsum = dk3str_is_on(vp);
1256 		  }
1257 		  else {
1258 		    /* WARNING: Not a boolean value! */
1259 		    dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
1260 		  }
1261 		}
1262 		else {
1263 		  job->tabsum = 1;
1264 		}
1265 	      }
1266 	      else {
1267 	        /* ERROR: Only allowed in options section */
1268 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
1269 	      }
1270 	    } break;
1271 	    case 44: {
1272 	      if(HB_SECTION_OPTIONS == st) {
1273 	        if (NULL != vp) {
1274 		  if (dk3str_is_bool(vp)) {
1275 		    job->svgwhdef = dk3str_is_on(vp);
1276 		  }
1277 		  else {
1278 		    /* WARNING: Not a boolean value! */
1279 		    dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
1280 		  }
1281 		}
1282 		else {
1283 		  job->svgwhdef = 1;
1284 		}
1285 	      }
1286 	      else {
1287 	        /* ERROR: Only allowed in options section */
1288 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
1289 	      }
1290 	    } break;
1291 	    case 45: {
1292 	      if (NULL != vp) {
1293 	        newie = dk3str_array_index(hbconf_doctype_names, vp, 0);
1294 		if (HTML_DOCTYPE_NONE <= newie) {
1295 		  if (HB_SECTION_OPTIONS == st) {
1296 		    if (HTML_DOCTYPE_UNSPECIFIED != job->htdt) {
1297 		      /* WARNING Overwriting doctype */
1298 		      dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 103);
1299 		    }
1300 		    job->htdt = newie;
1301 		  }
1302 		  else {
1303 		    if (HB_SECTION_CONTENTS == st) {
1304 		      if (NULL != job->currentnode) {
1305 		        if (HTML_DOCTYPE_UNSPECIFIED != job->htdt) {
1306 			  /* WARNING Overwriting doctype */
1307 			  dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 103);
1308 			}
1309 		        job->currentnode->htdt = newie;
1310 		      }
1311 		    }
1312 		  }
1313 		}
1314 		else {
1315 		  /* ERROR: Invalid doctype */
1316 		  dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 102);
1317 		}
1318 	      }
1319 	      else {
1320 	        /* ERROR: Value required */
1321 		dk3app_log_i3(job->app, DK3_LL_ERROR, 133, 134, kp);
1322 	      }
1323 	    } break;
1324 	    case 46 : {		/* privacy link */
1325 	      if(HB_SECTION_OPTIONS == st) {
1326 	        ptr = dk3str_dup_app(vp, job->app);
1327 		if (NULL != ptr) {
1328 		  dk3_release(job->privacylink);
1329 		  job->privacylink = ptr;
1330 		} else {
1331 		  back = -1;	/* REPORTED */
1332 		}
1333 	      } else {
1334 	        /* ERROR: Only allowed in options section */
1335 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
1336 	      }
1337 	    } break;
1338 	    case 47 : {		/* privacy page */
1339 	      if(HB_SECTION_OPTIONS == st) {
1340 	        job->privacynode = hb_node_new(
1341 		  job, job->rootnode, job->lineno, job->nextobj, 0
1342 		);
1343 
1344 		job->nextobj += 1UL;
1345 		if (job->privacynode) {
1346 		  if ((job->privacynode)->depth > job->maxdepth) {
1347 		    job->maxdepth = (job->privacynode)->depth;
1348 		  }
1349 		  (job->privacynode)->options |= HB_NODE_OPT_PRIVACY;
1350 		  if(dk3sto_add(job->s_nodes, (void *)(job->privacynode))) {
1351 		    (job->privacynode)->shorttitle =
1352 		    dk3str_dup_app((job->msg)[104], job->app);
1353 		    (job->privacynode)->title =
1354 		    dk3str_dup_app((job->msg)[105], job->app);
1355 		    if ((job->privacynode)->title) {
1356 		      dk3str_correct_filename(vp);
1357 		      if (!(hbtool_check_filename(job, vp))) { back = -1; }
1358 		      (job->privacynode)->filename =
1359 		      dk3str_dup_app(vp, job->app);
1360 		      if (!((job->privacynode)->filename)) {
1361 		        back = -1;
1362 		      }
1363 		    } else {
1364 		      back = -1;	/* REPORTED */
1365 		    }
1366 		    if (1 == back) {
1367 		      if(!dk3sto_add(job->s_pnodes,(void*)(job->privacynode)))
1368 		      {
1369 		        back = -1;	/* REPORTED */
1370 		      }
1371 		    }
1372 		  } else {
1373 		    hb_node_delete(job->privacynode);
1374 		    job->privacynode = NULL;
1375 		    back = -1;		/* REPORTED */
1376 		  }
1377 		} else {
1378 		  back = -1;		/* REPORTED */
1379 		}
1380 	      } else {
1381 	        /* ERROR: Only allowed in options section */
1382 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
1383 	      }
1384 	    } break;
1385 	    case 48 : {
1386 	      if (HB_SECTION_OPTIONS == st) {
1387 	        ptr = dk3str_dup_app(vp, job->app);
1388 		if (NULL != ptr) {
1389 		  dk3_release(job->htmllang);
1390 		  job->htmllang = ptr;
1391 		}
1392 		else {
1393 		  back = -1;
1394 		}
1395 	      }
1396 	      else {
1397 	        /* ERROR: Only allowed in options section */
1398 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
1399 	      }
1400 	    } break;
1401 	    case 49: {
1402 	      if((job->currentnode) && (vp)) {
1403 	        if(!((job->currentnode)->s_jsfiles)) {
1404 		  (job->currentnode)->s_jsfiles =
1405 		  dk3sto_open_app(job->app);
1406 		  if((job->currentnode)->s_jsfiles) {
1407 		    dk3sto_set_comp(
1408 		      (job->currentnode)->s_jsfiles,
1409 		      hbnode_link_compare, 2
1410 		    );
1411 		  }
1412 		}
1413 		if(!((job->currentnode)->i_jsfiles)) {
1414 		  if((job->currentnode)->s_jsfiles) {
1415 		    (job->currentnode)->i_jsfiles = dk3sto_it_open(
1416 		      (job->currentnode)->s_jsfiles
1417 		    );
1418 		  }
1419 		}
1420 		if((job->currentnode)->s_jsfiles) {
1421 		  if((job->currentnode)->i_jsfiles) {
1422 		    linkptr = hbnode_link_new(
1423 		      vp, (job->currentnode)->nextjs, job->app
1424 		    );
1425 		    if(linkptr) {
1426 		      if(dk3sto_add((job->currentnode)->s_jsfiles, linkptr)) {
1427 		        (job->currentnode)->nextjs += 1UL;
1428 			linkptr->flags |= LINK_FLAG_SCRIPT_ASYNC;
1429 		      } else {
1430 		        hbnode_link_delete(linkptr);
1431 			back = -1;
1432 		      }
1433 		    } else {
1434 		      back = -1;
1435 		    }
1436 		  } else {
1437 		    back = -1;
1438 		  }
1439 		} else {
1440 		  back = -1;
1441 		}
1442 	      }
1443 	      if(vp) {
1444 	        if(!hbtool_add_url(job, vp)) { back = -1; }
1445 	      }
1446 	    } break;
1447 	    case 50 : {
1448 	      if(HB_SECTION_OPTIONS == st) {
1449 	        if (NULL != vp) {
1450 		  if (dk3str_is_bool(vp)) {
1451 		    if (0 != dk3str_is_on(vp)) {
1452 		      job->options |= HB_JOB_OPT_FOLD_PTOC;
1453 		    }
1454 		    else {
1455 		      job->options &= (~(HB_JOB_OPT_FOLD_PTOC));
1456 		    }
1457 		  }
1458 		  else {
1459 		    /* WARNING: Not a boolean value! */
1460 		    dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
1461 		  }
1462 		}
1463 		else {
1464 		  job->options |= HB_JOB_OPT_FOLD_PTOC;
1465 		}
1466 	      }
1467 	      else {
1468 	        /* ERROR: Only allowed in options section */
1469 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
1470 	      }
1471 	    } break;
1472 	    case 51 : {	/* page toc js file */
1473 	      if (HB_SECTION_OPTIONS == st) {
1474 	        ptr = dk3str_dup_app(vp, job->app);
1475 		if (NULL != ptr) {
1476 		  dk3_release(job->ptocjsfile);
1477 		  job->ptocjsfile = ptr;
1478 		}
1479 		else {
1480 		  back = -1;
1481 		}
1482 	      }
1483 	      else {
1484 	        /* ERROR: Only allowed in options section */
1485 		dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
1486 	      }
1487 	    } break;
1488 	    default: {
1489 	      dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 43, 44, kp);
1490 	    } break;
1491 	  }
1492 	} else {
1493 	  /* Warning: Syntax error! */
1494 	  dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 9);
1495 	}
1496       } else {
1497         /* Warning: Syntax error in configuration file */
1498 	dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 8);
1499       }
1500     } else {
1501     }
1502   } else {
1503   }
1504 
1505   return back;
1506 }
1507 
1508 
1509 
1510 /**	Line handler function to process a configuration file.
1511 	@param	obj	Pointer to a job structure.
1512 	@param	il	Input line to process.
1513 	@return	1 on success, 0 on error (continue), -1 on error (exit).
1514 */
1515 static
1516 int
hbconf_line_reader_handler(void * obj,dkChar * il)1517 hbconf_line_reader_handler(void *obj, dkChar *il)
1518 {
1519   int			back;
1520 
1521   back = hbconf_process_line((hb_job_t *)obj, il, HB_SECTION_OPTIONS);
1522 
1523   return back;
1524 }
1525 
1526 
1527 
1528 /**	Process one configuration file.
1529 	@param	job	Job structure.
1530 	@param	fn	File name to process.
1531 	@return	1 on success, 0 on error (continue), -1 on error (exit).
1532 */
1533 int
hbconf_read_one_file(hb_job_t * job,dkChar const * fn)1534 hbconf_read_one_file(hb_job_t *job, dkChar const *fn)
1535 {
1536   int			back	= 0;
1537 
1538   back = dk3stream_process_filename_lines_app(
1539     (void *)job, hbconf_line_reader_handler, fn,
1540     job->ilfile, job->bs,
1541     dk3app_get_encoding(job->app),
1542     dk3app_get_input_file_encoding(job->app),
1543     job->app
1544   );
1545   if(1 != back) { back = 0; /* REPORTED */ }
1546 
1547   return back;
1548 }
1549 
1550 
1551 
1552 int
hbconf_read_files(hb_job_t * job)1553 hbconf_read_files(hb_job_t *job)
1554 {
1555   dk3_search_t		*sr = NULL;	/* File search result */
1556   dkChar const		*fn;		/* One config file name */
1557   int			 back = 1;
1558 
1559   sr = dk3app_find_config_file(job->app, (job->kwnl)[3], 0);
1560   if(sr) {
1561     dk3search_reset(sr);
1562     while(NULL != (fn = dk3search_next(sr))) {
1563       if(back) {
1564         if(!hbconf_read_one_file(job, fn)) {
1565 	  back = 0;	/* REPORTED */
1566 	}
1567       }
1568     }
1569     dk3search_close(sr);
1570   }
1571   return back;
1572 }
1573 
1574 
1575 
1576 dkChar const *
hbconf_node_template(hb_node_t * node)1577 hbconf_node_template(hb_node_t *node)
1578 {
1579   dkChar const	*back	= NULL;
1580   hb_node_t	*nptr;		/* Traverse node and parent nodes */
1581 
1582   nptr = node;
1583   while((nptr) && (NULL == back)) {
1584     if(nptr->templatefi) {
1585       back = nptr->templatefi;
1586     } else {
1587       nptr = nptr->parent;
1588     }
1589   }
1590   return back;
1591 }
1592 
1593 
1594 
1595 dkChar const *
hbconf_node_icon(hb_job_t * job,hb_node_t * node,int icno)1596 hbconf_node_icon(hb_job_t *job, hb_node_t *node, int icno)
1597 {
1598   dkChar const	*back	= NULL;
1599   hb_node_t	*nptr;		/* Traverse node and parent nodes */
1600 
1601   nptr = node;
1602   while((nptr) && (NULL == back)) {
1603     switch(icno) {
1604       case 0: {
1605         if(nptr->icontoc) {
1606 	  back = nptr->icontoc;
1607 	} else {
1608 	  nptr = nptr->parent;
1609 	}
1610       } break;
1611       case 1: {
1612         if(nptr->iconprev) {
1613 	  back = nptr->iconprev;
1614 	} else {
1615 	  nptr = nptr->parent;
1616 	}
1617       } break;
1618       case 2: {
1619         if(nptr->iconnext) {
1620 	  back = nptr->iconnext;
1621 	} else {
1622 	  nptr = nptr->parent;
1623 	}
1624       } break;
1625       case 4: {
1626         if(nptr->iconhome) {
1627 	  back = nptr->iconhome;
1628 	} else {
1629 	  nptr = nptr->parent;
1630 	}
1631       } break;
1632       default: {
1633         if(nptr->iconindex) {
1634 	  back = nptr->iconindex;
1635 	} else {
1636 	  nptr = nptr->parent;
1637 	}
1638       } break;
1639     }
1640   }
1641   if(!(back)) {
1642     back = (job->kwnl)[4 + icno];
1643   }
1644   return back;
1645 }
1646 
1647 
1648 
1649 dkChar const *
hbconf_title(hb_node_t * node)1650 hbconf_title(hb_node_t *node)
1651 {
1652   dkChar const	*back = NULL;
1653 
1654   if (NULL != node->fulltitle) {
1655     back = node->fulltitle;
1656   } else {
1657     while((NULL == back) && (node)) {
1658       if(node->title) {
1659         back = node->title;
1660       } else {
1661         node = node->parent;
1662       }
1663     }
1664   }
1665 
1666   return back;
1667 }
1668 
1669 
1670 
1671 dkChar const *
hbconf_stylefile(hb_node_t * node)1672 hbconf_stylefile(hb_node_t *node)
1673 {
1674   dkChar const	*back = NULL;
1675 
1676   while((NULL == back) && (node)) {
1677     if(node->stylefile) {
1678       back = node->stylefile;
1679     } else {
1680       node = node->parent;
1681     }
1682   }
1683   return back;
1684 }
1685 
1686 
1687 
1688 dkChar const *
hbconf_author(hb_node_t * node)1689 hbconf_author(hb_node_t *node)
1690 {
1691   dkChar const	*back = NULL;
1692 
1693   while((NULL == back) && (node)) {
1694     if(node->author) {
1695       back = node->author;
1696     } else {
1697       node = node->parent;
1698     }
1699   }
1700   return back;
1701 }
1702 
1703 
1704 
1705 dkChar const *
hbconf_location(hb_node_t * node)1706 hbconf_location(hb_node_t *node)
1707 {
1708   dkChar const	*back = NULL;
1709 
1710   while((NULL == back) && (node)) {
1711     if(node->location) {
1712       back = node->location;
1713     } else {
1714       node = node->parent;
1715     }
1716   }
1717   return back;
1718 }
1719 
1720 
1721 
1722 dkChar const *
hbconf_favicon(hb_node_t * node)1723 hbconf_favicon(hb_node_t *node)
1724 {
1725   dkChar const	*back = NULL;
1726 
1727   while((NULL == back) && (node)) {
1728     if(node->favicon) {
1729       back = node->favicon;
1730     } else {
1731       node = node->parent;
1732     }
1733   }
1734   return back;
1735 }
1736 
1737 
1738