LINUX.ORG.RU

динамические строки Си. Реинкарнация

 


0

2

Сегодня залил в реп первую версию библиотеки для работы с динамическими строками на Си: https://github.com/maksspace/dynamic-string

Товарищи, посмотрите это творение и выскажете свое мнение об этом) Буду очень признателен за конструктивную критику.)

Рекомендую освоить английский, прежде, чем писать на нём.

anonymous ()

Чем оно отличается от обычных C-строк? Позволяет ли прозрачно работать с кодировками типа UTF-8, UTF-16?

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

Рекомендую освоить английский, прежде, чем писать на нём.

Если этот проект вам кажется бесполезным, то ваша рекомендация не имеет смысла. Если это проект показался вам полезным, то вместо рекомендации вы могли бы помочь его развитию.

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

Нет.

struct dstring
{
    char* data;
    size_t length;
    size_t capacity;
};
dstring_t* dstr_toupper(dstring_t* str)
{
    for(size_t i = 0; i < str->length; i++)
        str->data[i] = toupper(str->data[i]);
    return str;
}
APPLE_OS_XX_OS_XY ()
Ответ на: комментарий от XMs

Позволяет ли прозрачно работать с кодировками типа UTF-8, UTF-16?

Посмотрел код - нет, такого там нету.

Структура избыточная, нужность сомнительная.

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

maksspaces is a pretty cool gay, he writes English and doesn't afraid of anything

пофиксил, и не благодари

anonymous ()
Ответ на: комментарий от maksspaces

А зачем тебе три файла для того, что можно сделать в одном?

Bfgeshka ★★★★★ ()

Наверное, у каждого есть свои велосипеды-квадратные-колеса. Мои.

Eddy_Em ☆☆☆☆☆ ()

с какой целью/в какой проект пишется либа?

ps/ есть такое ощущение, что цели у неё нет, что делает бессмысленным любое обсуждение или критику.

MKuznetsov ★★★★★ ()

Правильно-правильно. В ядре фряхи тоже есть такое, sbuf называется

anonymous ()
Ответ на: комментарий от MKuznetsov

Да хоть как аналог with-output-to-string из коммон лиспа

anonymous ()

Чувак, сам понимаешь, не хватает dstr_printf с сестрами, курсора по положению в строке, как получать данные в виде обычной C-строки из структуры - тоже не ясно, тем более что это у тебя opaque тип, что в принципе грамотно.

anonymous ()

Без покрытия тестами, даже в своём проекте, использовать как минимум опасно

art_corp ()
Ответ на: комментарий от unt1tled

Дык, там же хрюникод хотят, а у меня, ясен пень, КОИ8. Три слеша, как видишь, являются комментарием для gettext. Потом вполне простым парсером можно автоматом файл перевода генерить.

Eddy_Em ☆☆☆☆☆ ()

Если за 43(!) года существования языка подобные библиотеки (а велосипедов было уже много) так и остались невостребованными, я бы задумался об надобности написания ещё одного N+1 велосипеда. :)

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

А что ты хочешь, если до сих пор даже нет нормальных «стандартных» библиотек для обработки изображений и приходится штудировать свежую литературу, чтобы реализовать более менее адекватные методы. Хоть ту же медиану

Думал тестов ради попробовать, насколько тормозной является OpenCV, но не нашел там вменяемого сишного интерфейса.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от anonymous

Data of dynamic string are stored without of terminator '\0'

anonymous ()

куча опечаток, прямо с первой строчки: " * Dyncamic strings. Implementation"

ну и в целом вообще ненужное ненужно, некоторые функции дублируют libc, причем делают это наименее эффективным образом. функция dstr_equal жесть. про memcmp ты не слышал?

да, к тому же строки, как я понимаю, не содержат 0 в конце — что делает их еще более бесполезными.

waker ★★★★★ ()
Последнее исправление: waker (всего исправлений: 1)
Ответ на: комментарий от waker

не содержат 0 в конце

Я код не открывал, но предполагаю, что это типа у него там внутренний формат хранения, а на выход он высрет уже все каноничненько.

deep-purple ★★★★★ ()
Ответ на: комментарий от slonopotamus

Чем вам GString не угодил?

ну например вот этим:

g_utf8_strdown ()

...

Converts all Unicode characters in the string that have a case to lowercase. The exact manner that this is done depends on the current locale, and may result in the number of characters in the string changing.

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

а, ну и вообще GString не годится тем, что glib не самая портабельная библиотека, да еще и LGPL к тому же..

waker ★★★★★ ()
Последнее исправление: waker (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Я код не открывал, но предполагаю, что это типа у него там внутренний формат хранения, а на выход он высрет уже все каноничненько.

ну да, получится что он пытался сделать быстрые строки (путем хранения длины в структуре — что вовсе не плохо), но из-за отсутствия нуля в конце, чтобы использовать их практически в любом другом коде — придется копировать строку целиком, что убьет любой выигрыш в скорости на корню.

waker ★★★★★ ()

аффтар, релизить библиотеки под жопиэлем — не лучшее начало.

с другой стороны, если бы ты был типичным фанатиком — то жопиэль был бы третий.. а так вообще ничего не ясно.

waker ★★★★★ ()

дальнейшие замечания....

struct dstring
{
    char* data;
    size_t length;
    size_t capacity;
};

это полная херня.

чтобы выделить подобную структуру — нужно дернуть malloc 2 раза.

я бы заменил на

struct dstring {
    size_t length;
    size_t capacity;
    char data[1];
}

и выделял память под всю структуру и строку целиком.

(если вдруг непонятно, дело тут не только в количестве mallocs, но и в гарантированных кеш-промахах)

waker ★★★★★ ()
Последнее исправление: waker (всего исправлений: 1)
Ответ на: комментарий от waker

Твой велосипед скорее всего не в курсе про разложение эсцета и прочих диграфов, хотя тут я пальцем в небо. Что важнее, так это то, что strdown/tolower и прочая низкоуровневая ерунда имеет смысл лишь для идентификаторов самого программиста, которые и так ascii. Попробуй применить эту операцию к любому китайско-немецкому сообщению в этом треде и ты поймешь всю бессмысленность этого действия. А начинающий лингвист тебе вообще может за такое по шапке надавать.

anonymous ()
Ответ на: комментарий от waker

знатная херь

struct dstring {
    size_t length;
    size_t capacity;
    char data[1];
}
не учи человека плохому..

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

А чтобы держать такой динамический объект, нужно положить его в struct dstring **pstr, и постоянно обновлять все такие места, т.к. очередной realloc может привести к изменению исходного адреса. Этот совет канает только для иммутабельных д-строк.

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

Попробуй применить эту операцию к любому китайско-немецкому сообщению в этом треде и ты поймешь всю бессмысленность этого действия.

приведи пример сообщения, я применю, без проблем.

А начинающий лингвист тебе вообще может за такое по шапке надавать.

за какое «такое»?

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

не учи человека плохому..

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

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

Этот совет канает только для иммутабельных д-строк.

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

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

не учи человека плохому...

Это Си, там нет хорошего...

i-rinat ★★★★★ ()
Ответ на: комментарий от waker

Я не сомневаюсь, что ты применишь — я утверждаю бессмысленность этого действия с точки зрения языка, а не уникод-формализации, поскольку китайские иероглифы (привел чисто афаик, влом проверять), как и многие другие буквы, не имеют кейса, а регулярный немец не потерпит от тебя ловера, как это условно делают англичанин и русский.

anonymous ()
Ответ на: комментарий от i-rinat

В Си много хорошего, просто ты гонишься за лучшим.

anonymous ()
Ответ на: комментарий от maksspaces

GString смотрел. Просто хотел для практики написать свое)

Кто-то мешает взять интерфейс от GString, но написать свою реализацию?

i-rinat ★★★★★ ()
Ответ на: комментарий от anonymous

В Си много хорошего, просто ты гонишься за лучшим.

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

i-rinat ★★★★★ ()

Я что-то где-то недоглядел или там нету какой-нибудь функции to_cstr?

hlebushek ()
Ответ на: комментарий от waker

мой велосипед, к примеру, это может. и для моего проекта это критично.

Что твой велосипед вернёт для «I»? «i» или «ı»?

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

не учи человека плохому..

аргументы будут, ...?

Ты предлагаешь использовать undefined behavior.

А потом компилятор будет (правомерно) оптимизировать

for (i=0; i<d.length; i++)
  if (d.data[i] == c) return 1;
return 0;

в

if (d.data[0] == c) return 1;
return 0;

Ведь при UB можно делать что угодно.

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

Можешь объяснить почему не переходишь на юникод? Боишься, что символы будут занимать в 2 раза больше памяти?

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

Я не сомневаюсь, что ты применишь — я утверждаю бессмысленность этого действия с точки зрения языка, а не уникод-формализации, поскольку китайские иероглифы (привел чисто афаик, влом проверять), как и многие другие буквы, не имеют кейса, а регулярный немец не потерпит от тебя ловера, как это условно делают англичанин и русский.

программа — это мертвый кусок байтов и битов. ей плевать что там немец не потерпит. ей надо выполнять то, что от нее требуется. например, преобразовать строку целиком в нижний (или верхний) регистр, по заданным правилам, без привязки к локали. немец, скорее всего, не узнает что данное преобразование вообще имело место быть, например в алгоритмах поиска.

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

лучше бы задумался о надобности еще одного сишника на этой планете, ибо пишет он чисто для прокачки скила

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