Ну, с комментариями и вообще встречающимися не на месте словами можно примерно так:
else if ((tpoint=strstr(str,"Exec"))!=0 && tpoint==str ) strncpy(execstr, strchr(tpoint, '=')+1, sizeof(execstr)-1);
То есть добавилось дополнительное условие, если указатели tpoint и str равны - значит ключевое слово начинается прямо с начала
строки. А не с начала - ничего отсюда не берем, это либо под комментарием либо что-то вообще другое.
Споткнуться может, если встретит какой-нибудь Execute с начала строки, но вроде бы такого не встречалось. Можно попробовать
"Exec=" искать.
С последним значением можно так.
Сначала, там где в строки нули вписываются, добавим еще ноль в начало:
namestr[64]=iconstr[64]=execstr[64]=0; /* чтоб в любом случае в конце был, даже если строка длиннее окажется */
namestr[0]=0; /* а здесь и в начале тоже - будем проверять на пустое значение */
А поиск "Name" обставим дополнительными условиями:
else if ((tpoint=strstr(str,"Name"))!=0 && tpoint==str && ( namestr[0]==0 || strncmp(tpoint+5, "[ru]", 4)==0 ))
strncpy(namestr, strchr(tpoint, '=')+1, sizeof(namestr)-1); /* найденную строку сохранили */
То есть из строчки с "Name" строку сохраняем либо если в namestr еще вообще ничего нет, либо если сразу за "Name" идет "[ru]"
Тут может споткнуться, если Name[ru] нет вообще, а первым идет какой-нибудь Name[jp]. Не знаю, встречается ли такое.