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