LINUX.ORG.RU

Библиотека для форматирования текста в Си

 ,


1

2

Привет, ЛОР!

Скажи, а есть ли что-то типа https://fmt.dev, но на чистом Си? Об printf() я слегка задолбался. Из требований: никаких внешних вызовов (будет работать без ОС), хочу тупо форматирование в строку а-ля snprintf(), но без сраных процентов и угадывания строчки к типу.

Традиционные касты @firkax @Iron_Bug

★★★★★

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

ну, это будут костыли.

А в Си есть что-то кроме костылей? Любая новая фича Си только и делает что затыкает какую-то убогость, лишь добавляя безумия в этот чудовищный недоязычок.

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

ты спросил - я ответила. претензии к пуговицам есть?

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

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

Когда-то давненько полностью разработал crt Foxpro 2.6.
В частности конечно и функцию форматирования согласно шаблона.
ИМХО строковые функции Foxpro 2.6 весьма удобны.
В частности имеется реализация строковых функций Foxpro 2.6 на Perl.
Зачем разработал crt Foxpro 2.6?
Потому что Foxpro 2.6 не умел эффективно работать с строками.
Прикрутил к нему возможность использования Perl.
Формирование отчётов стало на порядок быстрее в сравнении с штатным функционалом Foxpro 2.6.

Пожалуй добавлю к своему crt и этот функционал.

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

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

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

Самое любимое ностальжи - разработал для CM-1M, CМ-2M, … многозадачный режим работы, …
В разделе 32KB могли исполняться одновременно несколько процессов.
Штатно ОС не предоставляла такой возможности.
А ныне программирование у большинства - «Кто терабайт памяти купит, тот силён».

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

я не религиозный человек, чтобы верить. у меня есть сорцы musl'а и можно туда заглянуть. но вот чтобы printf был узким местом в софте - с таким я никогда не сталкивалась и как-то не было печали. обычно printf только печатает что-то в юзерские логи, и то редко. вероятно, если бы он как-то меня напрягал, я бы поискала другие реализации. но вот не было проблемы, которую надо было бы решать.

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

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

но вот чтобы printf был узким местом в софте - с таким я никогда не сталкивалась и как-то не было печали.

это пока сложный обработчик логов и плотную работу со строками…

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

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

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

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

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

я не понимаю, про какие «винтики» речь и при чём тут какие-то «казачки». обсуждается разработка на Си, я не вижу никаких провокаций. ну, кроме обычного мелкого срача на ЛОРе, но таков ЛОР. это же сигма-торт.

Iron_Bug ★★★★★
()

Бедные сишники всё никак не придумают f строки из могучего python-а. Напишите себе какой-нить SuperC уже, который на этапе обработки нормальной строки переделывает её в уродливые сишные строки.

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

Не сможет. Макросы вроде не полны по тьюрингу и _Generic тут не поможет. Как ты типы угадывать будешь для произвольного кода?

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

Смотри. Я лет 5 назад делал штуку для работы с текстами юникода, чтоб эти самые тексты в определённом виде предобрабатывать, векторизовывать и скармливать нейронкам. Оказалось, что тормознутый питон оптимальное решение, пусть я и буду обрабатывать текст неделю/месяц. Потому как доваривать «нормальные» ЯП до адекватной работы со строками я бы до сих пор эту фигню писал. Интерфейс работы со строками даже в шарпе и джаве плох, про сишку заикаться не приходится и потому её в такой высоконагруженной области как машинное обучение стороной обходят, если только это возможно. Удел сишки - микроконтроллеры и низкоуровневые числодробилки в хорошо формализованных задачах, где на вход в идеале и на выход идут только числа.

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

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

что касается сишки, то на ней пишут всё. от микроконтроллеров и эмбеддеда, до мощного сетевого серверного софта. есть задачи типа всяких там скоростных торгов на биржах и там до ассемблеров доходят. хотя биржи мне лично неинтересны, я работаю в основном с сетями, хай-лоадом, защитой от атак, DNS и прочим таким. софт, написанный на сишке, работает быстро, он нужен там, где серьёзные нагрузки на железо, большие объёмы трафика и нужна жёсткая оптимизация и быстрая реакция софта на события. и это полная противоположность говнопистона.

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

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

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

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

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

на сишке пишут системные вещи,

Уже потихоньку на Rust переходят. Он уже в твоём ядре на твоём компе, и будет только больше.

ради этого сишку и создали

Чем больше я пишу на Си, тем больше убеждаюсь в том, что создали её наркоманы по накурке. Собственно, и K и R из K&R траву курили только в путь. Это хорошо известный факт их биографий.

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

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

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

(я всё же математик по образованию)

Вот это удача – целый математик, ну тогда не могу не спросить: а почему математики по образованию считают, что лямбды – это просто синтаксический сахар и модное словечко для макак? (Man or boy 2к25: Ваш статически типизированный ЯП полноценен? (комментарий))

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

и а, ещё одно замечание:

я бы до сих пор эту фигню писал

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

что касается, опять же, сишки, то на ней пишут парсеры и лексеры. и специально переводят эти вещи именно в Си. потому что это работает очень быстро. но, конечно, там нет printf'ов, потому что printf - это, в основном, утилитарная функция для вывода результатов юзеру в человекочитаемой форме. а работа со строками не предполагает никакие читаемые формы, там идёт работа с байтами. строки - это не то, что думают юзеры. строки могут быть вообще бинарными. это неважно, для обработки разницы никакой. поэтому когда говорят о «работе со строками» у меня какое-то странное ощущение, что люди часто не понимают, чего они хотят и как этого достичь.

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

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

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

я полагаю, что тут имеет место какая-то латентность. ты что-то ниасилил в сишке, но обиделся не на себя, а на сишку. и вот теперь ты как «лиса и виноград»: старательно всем сообщаешь, «какая плохая сишка». тем временем те, кто на ней пишут, никаких проблем не испытывают и не поднимают шум на пустом месте.

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

да, в дополнение, про строки:

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

люди тащат гору к Магомеду и это тяжело, а нужно наоборот.

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

но зачем ты тогда его так бешено преследуешь?

Ну, во-первых, на нём до жопы кода уже написано. И мне приходится с ним работать.

А во-вторых, мне нравится троллировать сишников на ЛОРе. Из-за того, что средний возраст ЛОРовца давно перевалил за 35, престарелые сишники тут – самая вкусная публика.

ты что-то ниасилил в сишке, но обиделся не на себя, а на сишку.

Я там выше кинул ссылку на мой старый тред. Может ты мне расскажешь, как в Си нормально препроцессором проверить размер типа без вызова внешних программ?

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

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

наравне с сишкой в мире было очень много языков всё это время. но мы видим результат: много кода написано именно на сишке. не на фортране, который тоже неплохо оптимизируется, не на паскале, который, вроде бы отличается только синтаксисом, не на экзотических функциональных языках, не на чём-то ещё, а именно на сишке. такова селяви.

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

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

ну, это же не проблема сишки. это проблема в головах.

и да, если ты хочешь эффективности - придётся отказаться от «защиты от дурака». а если ты хочешь защиту от дурака и песочницы - ну, вон есть жаба, например. квадратно-гнездовое программирование, никуда ты там не вылезешь за пределы песочницы, всё обложено со всех сторон подушками безопасности. но и эффективность соответствующая, и жор ресурсов, как не в себя. так что либо эффективно, но надо понимать, что ты пишешь, либо песочницы и там думать головой не надо, но будет медленно и печально. других вариантов не бывает в природе.

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

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

ну, это же не проблема сишки. это проблема в головах.

Ты мне так и не написала, как можно в Си на стадии препроцессора узнать размер типа. Пока что половина проектов это делает через autoconf и ведро пердолева.

и да, если ты хочешь эффективности - придётся отказаться от «защиты от дурака».

Ты бредишь. На этапе компиляции можно проверить очень и очень многое. Код на Rust как минимум не медленнее сишного выходит.

а сишка не виновата в том, что ты её ниасилил или ещё кто-то её ниасилил.

Конечно не виновата. Виноваты её авторы, потому что породили такой чудовищный говноязычок.

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

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

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

и да, пока не началась компиляция, пока не известны опции архитектуры, оптимизации и прочего, ничего сказать о размерах типов нельзя. компилятор вычисляет их из текущей конфигурации.

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

но sizeof чем тебе не нравится?

Тем, что не работает с препроцессором. Нельзя написать код типа:

#if sizeof(size_t) > 4
...
#else
...
#endif

Ещё варианты?

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

и да, пока не началась компиляция, пока не известны опции архитектуры, оптимизации и прочего, ничего сказать о размерах типов нельзя. компилятор вычисляет их из текущей конфигурации.

Я понял, почему ты так ненавидишь нейросетки: они конкурируют с тобой по части галлюцинирования и генерации бреда.

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

потому что это не макрос. препроцессор - это не логическая конструкция языка. а ты хочешь второе, но пытаешься зачем-то засунуть это в препроцессор. мне трудно представить, зачем такой ifdef может быть нужен. если ты напишешь if(sizeof(typename)==const_x), то компилятор просто поставит условие в тру и выкинет код другой ветки. разницы никакой.

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

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

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

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

потому что это не макрос.

Тогда нахера ты его притащила? У ChatGPT хранение контекста лучше чем у тебя. Напомню задачу: нужно получить заголовочный файл с макросами типа #define SIZEOF_VOID_P 8 без вызова внешних програм и генерации его внешними средствами. Си так не может.

мне трудно представить, зачем такой ifdef может быть нужен.

Например, чтобы сделать разное наполнение структур или разные размеры массивов в зависимости от платформы. Поищи AC_COMPUTE_INT в исходниках проектов с autoconf, оно для этого в основном используется.

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

Есть обоснованное мнение, что ты пишешь одноразовые хелловорлды.

в С11 завезли дженерики. я не видела в них особой ценности: обходились без них и никто не умер.

Потому что они бесполезны в среднем.

Зачем в C _Generic?

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

Наверное? То есть, ты не знаешь?

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

Потому что они бесполезны в среднем.

Перегрузка функций по типу бесполезна? Именно так они и используются, в math.h где теперь можно забыть о постфиксах для float/double, и в других около-математических библиотеках с несколькими типами, при условии что они реально для С. Например GraphBLAS активно их использует.

Одного синуса 6 штук для разных типов.

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

Потому что они бесполезны в среднем.

Перегрузка функций по типу бесполезна?

Ага. Потому что это очень ограниченный и убогий вариант перегрузки, который ни для чего кроме синусов не подходит. О чём и тред по ссылке.

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

Можно, конечно. Но это не даёт никаких гарантий на то, что свой printf соответствует стандартному. В данном вот случае не соответствовал.

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