LINUX.ORG.RU

Новая версия AA патча для Fluxbox.


0

0

Некоторое время назад я выпустил патч для Fluxbox (>= 0.9.8), позволяющий использовать сглаживание шрифтов в не-UTF (т.е. KOI8-R ;) локали. С ним была маленькая, но неприятная проблема - если стиль использовал тени у текста, то тень не перекодировалась (как выяснилось перекодировалась дважды). Наконец у меня дошли руки это профиксить и выпустить вторую версию.

>>> Подробности

★★★★★

Проверено: l-xoid ()

Я не понял, это типа C++ такой? :)

Возвращать char* в C++ после strdup - за это руки надо отрывать! А если исключение случится? А если забудешь освоболить?

Ведь надежных вариантов уйма!

Можно использовать std::string, правда с ним нельзя работать как с сырой строкой C. В этом случае он скорее всего будет не очень удобен.

Можно использовать std::vector<char> (для него гарантируется, что все элементы занимают непрерывный участок памяти). Наверное, самы простой вариант. Минус - труднее обойтись без копирования при возврате (не все компиляторы сообразят соптимизировать).

Ну или на худой конец std::auto_ptr<char> (хотя у него есть тонкости с владением объекта, но если просто возвращать его из функции проблем не будет). Тут копирование строчки посложнее будет (в два этапа вместо strdup, сначала new, потом std::copy)

И после этого еще говорят, что C++ отстой и тормозит. Просто на нем писать надо уметь!

P.S. В коде специально не разбирался, может какую тонкость не заметил? :) P.P.S. Опен-сурс, блин :(

WFrag ★★★★
()
Ответ на: комментарий от Ron

>Можно. Если осторожно. :-)

Я имел в виду что нет гарантии того, что элементы строки std::string расположены в непрерывном куске памяти. Т.е может быть, что &str[i+1] != &str[i]+1, поэтому в качестве буфера для функции C она не подойдет. А вот с std::vector<char> таких проблем нет и его можно использовать таким образом:

extern "C" void someCFunc(char* buf);

...
std::vector<char> buf(100);
someCFunc(&buf[0]);
...

При этом возложив все заботы по управлению памятью на std::vector.

WFrag ★★★★
()
Ответ на: комментарий от WFrag

2WFrag: А вот если бы ты внимательно посмотрел бы код, то увидел бы, что он использует для перекодировки либу iconv, котороя написана на C и стоит ей чуть не в том виде строку отдать - фиг че перекодируешь. Конечно я не спорю, что наверняка есть более эллегантные и аккуртные решения, но тут, как говорится, "Флаг в руки". Саидтесь и пишите.

svyatogor ★★★★★
() автор топика
Ответ на: комментарий от svyatogor

>2WFrag: А вот если бы ты внимательно посмотрел бы код, то увидел бы, что он использует для перекодировки либу iconv, котороя написана на C и стоит ей чуть не в том виде строку отдать - фиг че перекодируешь.

Я это заметил. Опять же, я предложил некоторые решения, с замечаниями относительно плюсов и минусов. И я не зря упоминал про непрерывное расположение элементов вектора (и отсутствие такой гарантии в std::string). Я даже пример с вектором привел, как его можно использовать для хранения C строки.

>Конечно я не спорю, что наверняка есть более эллегантные и аккуртные решения, но тут, как говорится, "Флаг в руки".

Ну так нужно совершенствоваться, становиться профессионалами! Обидно, что большинство наездов на качество опен-сорс обоснованны.

>Саидтесь и пишите.

Ну я же не могу переписать весь софт мира. :)

WFrag ★★★★
()
Ответ на: комментарий от WFrag

>>Конечно я не спорю, что наверняка есть более эллегантные и аккуртные решения, но тут, как говорится, "Флаг в руки".

> Ну так нужно совершенствоваться, становиться профессионалами! Обидно, что большинство наездов на качество опен-сорс обоснованны.

>>Саидтесь и пишите.

> Ну я же не могу переписать весь софт мира. :)

Поэтому давайте закруглятся :) парень написал полезный патч, мы доправили его досадные ошибки. он небось теперь на всю жизнь запомнит про стрдапы :) научится, программистами не рождаются.

и не важно -- оперсорс это или пропиетарщина какая-либо. Дебильного кода хвататет везде, во втором случае мы его не видим просто, а видим только результаты -- те-же лики, но уже с невозможностью исправить дело.

luc
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.