Да тут не настолько сложный разбор, чтобы требовались какие-нибудь библиотеки типа поиска по регулярным выражениям.
Алгорим причесать и будет нормально.
Тут надо сначала продумать структуру данных, тогда страшные условия выделятся в функцию и все будет красиво.
Например, меня удивило, что вы выходные файлы открываете/закрываете многократно. Я бы открыл их сразу все, сложил файловые указатели в массив и по индексу к ним обращался, когда понадобилось в ту или иную категорию записать.
Или можно вообще завести массив структур. Каждая структура отвечает за свой выходной файл:
int catIndex, wordIndex;
char *keyword;
char *keywords_Desktop[5]={"Desktop", "Screensaver", "Accessibility", NULL}; //массив из 5 указателей на строки, 3 указывают, четвертый нулевой,
// 5 пофиг, дальше зануленного не пойдем.
struct outfile {
char *filename;
FILE *fp;
char **keyword; // указатель на массив строк
}; //создали тип структуры
struct outfile outfiles[10]; // завели массив из 10 таких структур
outfiles[0].filename="/home/live/.jwm/Desktop";
outfiles[0].keyword=keywords_Desktop; // записали адрес массива строк
// ...
outfiles[7].filename=NULL; // не весь массив использовали
for(catIndex=0; catIndex<10; catIndex++){ // по всем категориям
if( outfiles[catIndex].filename == NULL ) break; // если пусто, категории кончились
outfiles[catIndex].fp = fopen(outfiles[catIndex].filename, "w");
} // пооткрывали сразу все файлы, потом в конце таким же циклом надо закрыть
// Тут цикл перебора *.desktop
// здесь ищем name и exec
for(catIndex=0; catIndex<10; catIndex++){
if( outfiles[catIndex].filename == NULL ) break;
for(wordIndex=0; wordIndex<5; wordIndex++){ // по всем ключевым словам категории
keyword=outfiles[catIndex].keyword[wordIndex]; // слово, которое будем в строке категорий искать
if(keyword == NULL) break; // ключевые слова закончились, выходим из их перебора
if (strstr(categorystr, keyword)){
fprintf(outfiles[catIndex].fp, "......."); // если категория нашлась, вывели в соответствующий файл
break; // и дальше слова можно не перебирать
}
}
}
UPD. Лучше даже будет filename отдельным полем структуры не держать, а вписать в массив слов первым словом, вся инициализация будет в одном месте.
Тогда при открытии файла делаем
outfiles[catIndex].fp = fopen(outfiles[catIndex].keyword[0], "w");,
а цикл по словам начинаем не с нуля, а с единицы:
for(wordIndex=1; wordIndex<5; wordIndex++)