LINUX.ORG.RU

История изменений

Исправление thunar, (текущая версия) :

работать с массивами хоть в куче, хоть не в куче

Ты упорот? Я тебе только-что доказал что массивов вне стека нет из за того что размер неизвестен, а он опять за старое.

Или путём перебора до условного конца (например, '\0').

А сложность сего действа O(n) а не O(1) — т.е. получаем ту же бодягу что с юникодом.

Но, с юникодом это так с ходу не сработает из за модификаторов.

Ну поясни. Вот, например:

size_t utf8len(const char* str){
	size_t len = 0;
	for(char* s = (char*)str; *s; s++){
		if ((*s & 0xC0) != 0x80) len++;
	} return len;
}
void foo(char* s){
	size_t nbytes = strlen(s);
	size_t nsymb = utf8len(s);
	cout<<"\""<<s<<"\": "<<nsymb<<" symbols ("<<nbytes<<" bytes)"<<endl;
}
int main(int argc, char **argv)
{
	foo("J");
	foo("Ж");
	foo("Ç");
	foo("⺟");
	foo("𠜎");
	return 0;
}
Корректно возвращает
"J": 1 symbols (1 bytes)
"Ж": 1 symbols (2 bytes)
"Ç": 1 symbols (2 bytes)
"⺟": 1 symbols (3 bytes)
"𠜎": 1 symbols (4 bytes)

Исходная версия thunar, :

работать с массивами хоть в куче, хоть не в куче

Ты упорот? Я тебе только-что доказал что массивов вне стека нет из за того что размер неизвестен, а он опять за старое.

Или путём перебора до условного конца (например, '\0').

А сложность сего действа O(n) а не O(1) — т.е. получаем ту же бодягу что с юникодом.

Но, с юникодом это так с ходу не сработает из за модификаторов.

Ну поясни. Вот, например:

size_t utf8len(const char* str){
	size_t len = 0;
	for(char* s = (char*)str; *s; s++){
		if ((*s & 0xC0) != 0x80) len++;
	} return len;
}
void foo(char* s){
	size_t nbytes = strlen(s);
	size_t nsymb = utf8len(s);
	cout<<"\""<<s<<"\": "<<nsymb<<" symbols ("<<nbytes<<" bytes)"<<endl;
}
int main(int argc, char **argv)
{
	foo("J");
	foo("Ж");
	foo("Ç");
	foo("⺟");
	foo("𠜎");
	return 0;
}
"J": 1 symbols (1 bytes)
"Ж": 1 symbols (2 bytes)
"Ç": 1 symbols (2 bytes)
"⺟": 1 symbols (3 bytes)
"𠜎": 1 symbols (4 bytes)