diff --git a/include/bal_engine.h b/include/bal_engine.h index b6ee49d..18a67c6 100644 --- a/include/bal_engine.h +++ b/include/bal_engine.h @@ -90,7 +90,7 @@ BAL_ALIGNED(64) typedef struct /// /// # Errors /// -/// Returns [`BAL_ERROR_INVALID_ARGUMENT` if the pointers are `NULL`. +/// Returns [`BAL_ERROR_INVALID_ARGUMENT`] if the pointers are `NULL`. /// /// Returns [`BAL_ERROR_ALLOCATION_FAILED`] if the allocator cannot fulfill the /// request. diff --git a/tools/cdoc.c b/tools/cdoc.c index 535096b..7ea2b93 100644 --- a/tools/cdoc.c +++ b/tools/cdoc.c @@ -589,24 +589,47 @@ void write_common_head(FILE* f, const char* title) { fprintf(f, ""); } +int compare_item_ptrs(const void* a, const void* b) { + const DocItem* da = *(const DocItem**)a; + const DocItem* db = *(const DocItem**)b; + + if (!da->name && !db->name) return 0; + if (!da->name) return 1; + if (!db->name) return -1; + + return strcmp(da->name, db->name); +} + void render_sidebar_section(FILE* f, FileContext* ctx, ItemKind kind, const char* title) { - int found = 0; - // Check if any items of this kind exist + size_t count = 0; + // Count items of this kind for(size_t i=0; icount; i++) { if (ctx->items[i].kind == kind) { - found = 1; - break; + count++; } } - // If found, print the header and the links - if (found) { - fprintf(f, "

%s

", title); - for(size_t i=0; icount; i++) { - if (ctx->items[i].kind == kind) { - fprintf(f, "%s", ctx->items[i].anchor_id, ctx->items[i].name); - } + + if (count == 0) return; + + // Create a temporary array of pointers + DocItem** ptrs = malloc(sizeof(DocItem*) * count); + size_t idx = 0; + for(size_t i=0; icount; i++) { + if (ctx->items[i].kind == kind) { + ptrs[idx++] = &ctx->items[i]; } } + + // Sort the pointers alphabetically for the sidebar + qsort(ptrs, count, sizeof(DocItem*), compare_item_ptrs); + + // Render sorted links + fprintf(f, "

%s

", title); + for(size_t i=0; i%s", ptrs[i]->anchor_id, ptrs[i]->name); + } + + free(ptrs); } void generate_file_html(ProjectContext* proj, FileContext* ctx, const char* out_dir) { @@ -860,10 +883,6 @@ int main(int argc, char** argv) { clang_disposeTranslationUnit(unit); } - for (size_t i = 0; i < proj.count; i++) { - qsort(proj.files[i].items, proj.files[i].count, sizeof(DocItem), compare_items); - } - printf("Generating HTML in '%s'...\n", out_dir); #ifdef _WIN32