Переписал тестовую программу, сделал сортировку имен программ по алфавиту (до этого в каком порядке попадались desktop файлы, в том и выводилось).
Для этого пришлось сначала информацию из desktop файлов набирать в память, потом там уже отсортировать и отсортированную раскидывать по файлам категорий.
Структура данных такая: большой массив структур, по структуре на desktop файл. В каждой структуре по 4 указателя на строки: name, icon,exec, categories, извлеченные из desktop файлов. Сами строки создаются в динамической памяти посредством strndup(), поэтому потом их нужно освобождать вызовом free().
После того, как прошлись по всем файлам и извлекли данные в массив, массив сортируется стандартной функцией qsort, а уже потом данные раскидываются в файлы категорий.
Наличие директории .jwm/menu/ теперь проверяется, при отсутствии она создается (ну или ругается, если и создать не вышло, например, там уже файл с таким именем лежит).
Сишник из меня довольно фиговый, программа получилась - указатель на указателе, но как данные попроще структурировать, пока не придумал.