%% 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 %s %s", TR_PTR(l), TR_PTR(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 = \"%s\"", TR_STR(pi->an) $? ". number = %lu", pi->ul $? ". file = \"%s\"", TR_STR(pi->fn) $? ". text = \"%s\"", 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 \"%s\" \"%s\" \"%s\", %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 %s", TR_PTR(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; }