summaryrefslogtreecommitdiff
path: root/support/dktools/hbindex.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/hbindex.ctr
Initial commit
Diffstat (limited to 'support/dktools/hbindex.ctr')
-rw-r--r--support/dktools/hbindex.ctr226
1 files changed, 226 insertions, 0 deletions
diff --git a/support/dktools/hbindex.ctr b/support/dktools/hbindex.ctr
new file mode 100644
index 0000000000..35b4396e30
--- /dev/null
+++ b/support/dktools/hbindex.ctr
@@ -0,0 +1,226 @@
+%% options
+
+%% header
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Create index entry, allocate memory.
+ @param tx Index text.
+ @param fn File name.
+ @param an Anchor name (optional).
+ @param ul Anchor number, used if no anchor name specified.
+ @param app Application structure for diagnostics, may be NULL.
+ @param nptr Current node.
+ @return Pointer to new entry on success, NULL on error.
+*/
+hb_index_entry_t *
+hbindex_new(
+ dkChar const *tx,
+ dkChar const *fn,
+ dkChar const *an,
+ unsigned long const ul,
+ dk3_app_t *app,
+ hb_node_t *nptr
+);
+
+/** Destroy index entry, release memory.
+ @param pi Index entry to destroy.
+*/
+void
+hbindex_delete(hb_index_entry_t *pi);
+
+/** Compare two index entries.
+ @param l Left entry.
+ @param r Right entry or name.
+ @param cr Comparison criteria (0=object/object, 1=object/name).
+ @return Comparison result.
+*/
+int
+hbindex_compare(void const *l, void const *r, int cr);
+
+/** Write anchor name for index entry (either given name or number-based).
+ @param job Job structure.
+ @param in Index entry.
+ @return 1 on success, 0 on error.
+*/
+int
+hb_index_write_anchor(hb_job_t *job, hb_index_entry_t *in);
+
+#ifdef __cplusplus
+}
+#endif
+
+%% module
+
+
+#include "dk3all.h"
+#include "htmlbook.h"
+
+
+
+$!trace-include
+
+
+
+int
+hbindex_compare(void const *l, void const *r, int cr)
+{
+ hb_index_entry_t const *pl;
+ hb_index_entry_t const *pr;
+ int back = 0;
+ $? "+ hbindex_compare PTR=%d PTR=%d", TR_IPTR(l), TR_IPTR(r)
+ if(l) {
+ if(r) {
+ pl = (hb_index_entry_t const *)l;
+ switch(cr) {
+ case 1: {
+ back = dk3str_casecmp(pl->tx, (dkChar const *)r);
+ } break;
+ default: {
+ pr = (hb_index_entry_t const *)r;
+ back = dk3str_casecmp(pl->tx, pr->tx);
+ if(0 == back) {
+#if VERSION_BEFORE_20140423
+ if(pl->fn) {
+ if(pr->fn) {
+ back = dk3str_fncmp(pl->fn, pr->fn);
+ } else back = 1;
+ } else {
+ if(pr->fn) back = -1;
+ }
+#else
+ if (pl->no) {
+ if (pr->no) {
+ if ((pl->no)->objno > (pr->no)->objno) {
+ back = 1;
+ } else {
+ if ((pr->no)->objno > (pl->no)->objno) {
+ back = -1;
+ }
+ }
+ } else back = 1;
+ } else {
+ if (pr->no) back = -1;
+ }
+#endif
+ }
+ if(0 == back) {
+ if(pl->an) {
+ if(pr->an) {
+ back = dk3str_cmp(pl->an, pr->an);
+ } else back = 1;
+ } else {
+ if(pr->an) back = -1;
+ else {
+ if(pl->ul > pr->ul) {
+ back = 1;
+ } else {
+ if(pl->ul < pr->ul) {
+ back = -1;
+ }
+ }
+ }
+ }
+ }
+ } break;
+ }
+ if(-1 > back) { back = -1; }
+ if( 1 < back) { back = 1; }
+ } else {
+ back = 1;
+ }
+ } else {
+ if(r) {
+ back = -1;
+ }
+ } $? "- hbindex_compare %d", back
+ return back;
+}
+
+
+
+void
+hbindex_delete(hb_index_entry_t *pi)
+{
+ $? "+ hbindex_delete"
+ if(pi) {
+ $? ". anchor = \"%!ds\"", TR_STR(pi->an)
+ $? ". number = %lu", pi->ul
+ $? ". file = \"%!ds\"", TR_STR(pi->fn)
+ $? ". text = \"%!ds\"", TR_STR(pi->tx)
+ pi->no = NULL;
+ dk3_release(pi->tx);
+ dk3_release(pi->fn);
+ dk3_release(pi->an);
+ pi->ul = 0UL;
+ dk3_delete(pi);
+ } $? "- hbindex_delete"
+}
+
+
+hb_index_entry_t *
+hbindex_new(
+ dkChar const *tx,
+ dkChar const *fn,
+ dkChar const *an,
+ unsigned long const ul,
+ dk3_app_t *app,
+ hb_node_t *nptr
+)
+{
+ hb_index_entry_t *back = NULL; /* New index entry */
+ int ok = 0;
+ $? "+ hbindex_new \"%!ds\" \"%!ds\" \"%!ds\", %lu", TR_STR(tx), TR_STR(fn), TR_STR(an), ul
+ if((tx) && (fn)) {
+ back = dk3_new_app(hb_index_entry_t,1,app);
+ if(back) {
+ back->no = nptr;
+ back->tx = NULL;
+ back->fn = NULL;
+ back->an = NULL;
+ back->ul = ul;
+ back->tx = dk3str_dup_app(tx,app);
+ back->fn = dk3str_dup_app(fn,app);
+ if((back->tx) && (back->fn)) {
+ ok = 1;
+ if(an) {
+ back->an = dk3str_dup_app(an,app);
+ if(!(back->an)) { ok = 0; }
+ }
+ }
+ if(!(ok)) {
+ hbindex_delete(back);
+ back = NULL;
+ }
+ }
+ } $? "- hbindex_new PTR=%d", TR_IPTR(back)
+ return back;
+}
+
+
+
+int
+hb_index_write_anchor(hb_job_t *job, hb_index_entry_t *in)
+{
+ int back = 0;
+ $? "+ hb_index_write_anchor"
+ if((job) && (in)) {
+ back = 1;
+ if(in->an) {
+ if(!hbhtml_url_output_for_text(job, in->an)) {
+ back = 0;
+ }
+ } else {
+#if DK3_SIZEOF_LONG > 4
+ fprintf(job->of, "hb_i%016lx", in->ul);
+#else
+ fprintf(job->of, "hb_i%08lx", in->ul);
+#endif
+ }
+ } $? "- hb_index_write_anchor %d", back
+ return back;
+}
+
+