- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
// https://github.com/j123123/sexpr_parse/blob/584fc23de71bebe02545214f819e16b720a2c1e2/my_struct_utils.c#L119
blob *
blob_scan_fromstream
(
FILE *stream
)
{
size_t st_len = 0;
size_t st_alloc;
uint8_t *st = NULL;
while(true)
{
const int fg = getc(stream);
if(fg == EOF)
{
PRV_ERR_MACRO();
}
uint8_t c = fg;
if(!isprint(fg))
{
PRV_ERR_MACRO();
}
switch(c)
{
case '\\':
{
int c2 = getc(stream);
switch(c2)
{
case 'x':
{
int c3[2] =
{
getc(stream),
getc(stream)
};
uint8_t tmp[2];
for(size_t i = 0; i < 2; ++i)
{
switch(c3[i])
{
case '0' ... '9':
tmp[i] = c3[i]-'0';
break;
case 'a' ... 'f':
tmp[i] = c3[i]+10-'a';
break;
case 'A' ... 'F':
tmp[i] = c3[i]+10-'A';
break;
default:
PRV_ERR_MACRO();
}
}
M_PUSH(tmp[1] | tmp[0] << 4);
}
break;
case '\\':
M_PUSH('\\');
break;
case 't':
M_PUSH('\t');
break;
case 'n':
M_PUSH('\n');
break;
case '"':
M_PUSH('"');
break;
default:
PRV_ERR_MACRO();
}
}
break;
// case '\t':
// case '\n':
// PRV_ERR_MACRO();
// break;
case '"':
goto end;
default:
M_PUSH(c);
}
}
end:
;
blob *tmp = blob_init(st_len, st);
PRV_FREE(st);
return tmp;
}
j123123 09.11.2021 03:35 # 0
https://govnokod.ru/27679#comment710504
Это конечно так делать не надо, хуета какая-то. Надо чтоб "генератор лексических анализаторов"
bormand 09.11.2021 07:58 # +1
Да не, можно и без генератора что-то вменяемое накобенировать из примитивных парсеров. Там единственно класс грамматик поуже чем у бизона и надо очень аккуратно с рекурсией.
JloJle4Ka 09.11.2021 08:26 # 0
bormand 09.11.2021 10:13 # +1
JloJle4Ka 09.11.2021 10:20 # 0
guest6 09.11.2021 15:19 # +2
Вспоминается история Икануса про двух людей, спорящих про DN.
Один говорил про Duke Nukem, а другой про Dos Navigator
JloJle4Ka 09.11.2021 15:31 # 0
JloJle4Ka 09.11.2021 15:36 # 0
ObeseYoung 09.11.2021 17:09 # 0
ASD_77 09.11.2021 12:57 # 0
JloJle4Ka 09.11.2021 14:13 # 0
bormand 09.11.2021 15:46 # 0
Ну... видимо ты какую-то недетерминированную грамматику туда захуярил и бедный парсер её перебором с откатами потом разбирал?
Я не вижу других причин.
guest6 09.11.2021 19:22 # 0
bormand 09.11.2021 19:49 # 0
Тот же бизон умеет и вперед немножко подглядывать для разрешения конфликта и форкать стейт в неоднозначных точках и смотреть какой выживет.
Не помню уже названия для этих классов грамматик
j123123 10.11.2021 16:21 # +1
Это как в крестоговне с "жизнеспособностью" при вызове правильной функции https://govnokod.ru/27443#comment630395 ?
Можно считать баллы у двух или более стейтов по каким-то критерям, и выживает вореант, набравший максимум баллов.
А если сделать хуйню, где правила определения коэффициента жизнеспособности вореанта парсинга хуйни можно будет описывать на тьюринг-полном языке в виде специальной аннотации, парсинг может никогда не завершиться
bormand 10.11.2021 16:35 # +1
bormand 10.11.2021 16:44 # 0
bormand 09.11.2021 07:54 # +1
Кому нужны генераторы, если есть десяток трудолюбивых олимпиадников?
guest6 09.11.2021 12:16 # 0
Ого, не знал, что так можно.
Soul_re@ver 09.11.2021 12:51 # +2
guest6 09.11.2021 15:18 # +2
bormand 09.11.2021 15:50 # +2
Вряд ли без перемычки возможно это разделение ответственности.
> посылать в УК
Чтобы они потом засудили тебя нахуй за то что дом оставил без отопления? )))
Лучше позвони им и попроси байпасс приделать как положено.
guest6 09.11.2021 17:04 # 0
Охуенно же
Ну вообще я имел ввиду, что они должны поставить байпасс, а не требовать от меня "открыть кран"
bormand 09.11.2021 17:38 # 0
У юристов не бывает транзитивности, емнип.
Нельзя взять и сократить "сварщик не доделал работу и мне жарко" + "я закрыл кран и оставил соседей без тепла" до "сварщик не доделал работу и оставил соседей без тепла".
guest6 09.11.2021 19:21 # 0
Есть же какие-то законы, говорящие что я могу и не могу делать.
Я не могу портить общедомовое имущество
Я могу делать что угодно со своим имуществом
Кран -- мое имущество
Если электрик сойдет с ума, и заземление из моей квартиры с этажа проведет к батарее соседки, и ее ебнет, буду ли я виноват в том, что включил в розетку стиралку с металлическим корпусом?
bormand 09.11.2021 19:31 # 0
Первый раз наверное простят, так же как если ты откроешь кран когда соседи пожалуются.
Но вот если ты знал о проблеме и умышленно не открываешь кран или продолжаешь юзать эту машинку несмотря на просьбы соседей -- то ты пидор и будешь за это отвечать. Как и накосячивший электрик/сантехник.
bormand 09.11.2021 19:39 # 0
Ну как сказать... вроде бы по закону ты не можешь приварить радиатор слишком большой площади, т.к. это создаст дизбаланс соседям. Скорее всего блокировка потока в те же нормы прописана.
Soul_re@ver 09.11.2021 20:05 # +1
Soul_re@ver 09.11.2021 19:53 # +1
Весь стояк остался без тепла? УК придётся вернуть деньги за некачественно оказанную услугу → УК стребует эти деньги с тебя. Если УК оштрафуют, они и сумму штрафа с тебя могут истребовать. Из-за резко закрытого крана выбило стык на чердаке и 10 квартир оказались залиты кипятком? Плати. Да, он был проржавевшим насквозь, но «система успешно прошла испытания перед началом отопительного сезона, экспертиза установила причиной неквалифицированные действия guest6, спровоцировавшие гидроудар, поднявший давление в отдельных участках отопительной системы намного выше нормальных эксплуатационных величин». Чей-то попугайчик замёрз? Надеюсь, он не был очень дорогим.
guest6 09.11.2021 20:03 # 0
// я другой гость
bormand 09.11.2021 20:03 # 0
Нет. См. пример про телек ночью.
bormand 09.11.2021 16:03 # +4
З.Ы. Я помню у нас в доме тоже как-то завёлся пидор с последовательно подключенным краном, которому было жарко зимой... Всем стояком его искали чтобы выебать.
guest6 09.11.2021 16:09 # +5
j123123 09.11.2021 16:34 # +4
bormand 09.11.2021 17:08 # 0
guest6 09.11.2021 17:12 # 0
bormand 09.11.2021 17:14 # 0
Ситуация ничем не отличается от тех, у кого кранов вообще нет.
guest6 09.11.2021 17:20 # 0
bormand 09.11.2021 17:21 # 0
guest6 09.11.2021 16:39 # +4
> со стояком его искали, чтобы выебать
JloJle4Ka 09.11.2021 16:54 # +4
guest6 09.11.2021 17:04 # 0
пиздекц
Soul_re@ver 09.11.2021 17:06 # +3
guest6 09.11.2021 17:09 # 0
Почему при этом отключилисб батареи у соседей я не знаю
Вероятно, УК что-то криво провел
Разве это моя вина?
Это вина УК
А свет я могу себе выключить? Вдруг он тоже соседям холодильник отключит?
bormand 09.11.2021 17:12 # 0
j123123 09.11.2021 17:13 # 0
https://aqua-rmnt.com/interesnoe/zachem-nuzhna-peremychka-na-bataree-otopleniya.html
guest6 09.11.2021 17:20 # 0
вопрос в том, кто это должен делать
bormand 09.11.2021 17:24 # 0
- Ты оставил соседей без тепла, поэтому ты обязан открыть кран.
- Мудак, варивший трубы, не доделал работу, поэтому он должен её закончить. Бесплатно.
Ну собственно если он из УК, туда и обратись.
guest6 09.11.2021 19:05 # 0
Вот этот момент мне непонятен. Кран мое имущество, стояк общедомовое.
Общедомовое я не имею права трогать, а кран имею: я его ставил за свои деньги, я за него отвечаю, если он протечет -- то я буду платить денег.
По-моему соседи должны выебать УК, и УК должны послать мне сантхника, которому я обязан предоставить доступ к стояку (как к общедомовому имуществу) и он должен поставить туда байпасс
bormand 09.11.2021 19:20 # 0
Какой эгоизм ))))
Не, ну если они согласны -- я думаю никто и не заставит открывать кран. Но они УЖЕ пожаловались, раз управляшка к тебе пришла.
guest6 09.11.2021 19:24 # 0
Я не против открыть кран на время пока они ставят байпасс, но мне совершенно не понятно почему я обязан постоянно сидеть с этим краном, если это косяк управляйки?
У меня просто горит жопа от того, что если кран протекает, то это ТВОЙ кран и ты должен нижним соседям полтора ляма
Если ты хочешь его поменять, то это ТВОЙ кран и ты платишь сантехнику за его замену
А если ты хочешь его закрыть, то сразу это общий кран, и делать этого нельзя.
Хуйня же, ну?
bormand 09.11.2021 19:27 # 0
Хотя казалось бы -- это твой телек в твоей хате.
ObeseYoung 09.11.2021 17:36 # 0
Soul_re@ver 09.11.2021 17:13 # 0
Разве это моя вина?
guest6 09.11.2021 17:20 # 0
А кран мое
Я просто хуею с того, что если кран потечет то я буду его менять за свой счет
но закрыть не могу
bormand 09.11.2021 17:41 # 0
guest6 09.11.2021 19:05 # 0
bormand 09.11.2021 17:43 # 0
Ну почему... в теории ты можешь его поменять за счёт завода, который делал кран или сварщика если они обещали, что всё будет заебись N лет.
guest6 09.11.2021 19:06 # 0
но это мои отношения с тем, кто его ставил
Важно, что управляйка его не ставила в данном случае
bormand 09.11.2021 19:36 # 0
bormand 09.11.2021 19:44 # 0
Так всё-таки кто кран то поставил?
Рукожоп из управляйки или рукожоп которого ты сам нанял?
В первом случае они откроют кран на время, приварят байпасс и дадут пиздюлей рукожопу.
Во втором случае они придут, откроют кран и ты будешь сам разбираться с рукожопом и/или варить за свой счёт.
Desktop 09.11.2021 20:14 # +1
bormand 09.11.2021 17:55 # 0
Как страшно жить в этом мире...
ObeseYoung 09.11.2021 18:06 # +2
guest6 09.11.2021 19:07 # 0
Совершенно верно.
Если управляющая компания не заделала дырку в фановой трубе (в смысле в стояке между этажами), то она ее должна заделать.
Она не имеет права сказать "не срите пожалуйста, потому что иначе соседей зальет"
guest6 09.11.2021 15:10 # +1
Странно, что так можно в C
А вон там снизу подсказывают, что это в GCC можно
j123123 09.11.2021 21:05 # 0
можно подумать, что тут какая-то хуйня
_builtin_clzll() должна посчитать лидирующие нулевые биты в числе(для типа unsigned long long - см. https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html ), а мне тут нужно получить позицию последнего единичного бита, если считать от младшего к старшему. Например, если есть число, которое в двоичном представлении имеет вид
то мне надо вернуть 4 т.к. в четвертой позиции этот бит находится
И тут поэтому будет выделено памяти в худшем случае в 2 раза больше, а в лучшем случае на 1 бит больше, чем надо. https://wandbox.org/permlink/Plw7PlVbQ7hGajFd
Структура stack:
Этот nodes[] - flexible array member, чтобы не указатель на хуйню хранить, а просто сзади структуры. https://port70.net/~nsz/c/c99/n1256.html#6.7.2.1p16
j123123 09.11.2021 21:27 # 0
Я вот попробовал посмотреть в libstdc++ из GCC, там какая-то ебаная непонятная хуйня написана.
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/stl_vector.h
Но непохоже, чтобы оно в эту "struct _Vector_base" что-то непосредственно встраивало
bormand 09.11.2021 21:29 # 0
А оптимизация для мелочи с хранением прям в самом векторе не везде есть.
j123123 09.11.2021 21:37 # 0
Почему реализация STL из GCC такое ебаное говно с кучей "#if" и "#ifdef" и всяким макроговном? Это принципиально нельзя написать нормальным образом?
bormand 09.11.2021 21:41 # 0
А нафиг за ней так далеко лазить?
j123123 09.11.2021 21:45 # 0
Ну вот например можно хранить вектор как
или
Чем второй вариант хуже чем первый?
bormand 09.11.2021 21:48 # 0
j123123 09.11.2021 21:50 # 0
bormand 09.11.2021 21:52 # 0
И вот как раз во втором варианте до длины лишнее разыменование.
j123123 09.11.2021 21:58 # 0
А если я передаю указатель на вторую структуру (где T array_data[]; // flexible array member ) то надо лишь добавить к указателю на такую структуру размер size_t, и вот уже можно читать данные
bormand 09.11.2021 22:02 # +1
Вторая структура по одному указателю r/o. Для ресайза надо двойную индирекцию. И встраивается только по указателю.
j123123 09.11.2021 22:12 # +1
А первая структура может сама быть выделена на стеке например, и уже указатель будет на хип указывать. И можно сделать массив таких структур т.к. размер самой структуры там фиксирован. А для второй структуры только массив из указателей получится сделать
j123123 14.11.2021 04:18 # 0
Ну хорошо, а допустим если мне нужны константные (т.е. неизменяемые в рантайме) строки из байт, как более адекватная замена нуль-терминированным говнострокам сишки, но чтобы без Шлемазла Шлемиэля т.е. чтоб не нужно было прочитывать строку до конца для узнавания размера строки? И для такой хуйни понаделать структурок
Можно например сделать варианты
И для такой хуеты понаделать аналог strdup, типа функций вида datadup8() datadup16() datadup32(), отдельно для конкатенаций надо перебирать еще разные варианты datacat8_8() datacat8_16() datacat8_32() datacat16_8() ... и тут еще нужно как-то указывать, в какую строку оно должно попытаться сконкатенировать
Ну типа если надо из двух array_8 слепить array_16 то будет так
и это еще можно в макросню типа _Generic завернуть, чтобы удобно было
bormand 14.11.2021 04:56 # 0
Надеюсь вся эта кобенаторика не сожрёт профит от компактных строк.
j123123 14.11.2021 05:00 # 0
bormand 14.11.2021 07:54 # 0
guest6 14.11.2021 14:00 # +1
какой утф ))
ObeseYoung 14.11.2021 05:42 # 0
bormand 14.11.2021 07:50 # 0
У 32-битки оверхед при n>=256 в районе процента. А меньшие покрывает компактная 8-битка.
bormand 09.11.2021 22:05 # 0
bormand 09.11.2021 22:16 # 0
max(alignof(T), sizeof(size_t)), но не суть. Подумаешь немного байтов проебали в начале вектора. Некритично.
Да и size_t обычно и так один из самых жирных типов. Больше только аппаратные вектора.
bormand 09.11.2021 22:11 # 0
Первую структуру ты можешь передать по значению через регистры. И сразу начать поиск, трогая только те кешлайны, что реально нужны для работы.
Со второй структурой ты вынужден загрузить лишний кешлайн в котором лежит размер. А этот кешлайн в большинстве случаев не пригодится при поиске.
bormand 09.11.2021 22:25 # 0
bormand 09.11.2021 22:30 # 0
А в libstdc++ три поинтера: начало, конец строки и конец буфера.
guest6 14.11.2021 14:33 # 0
А сами данные могут быть где угодно, это как аллокатор решит, могут быть и в куче
bormand 09.11.2021 22:36 # +1
j123123 09.11.2021 22:44 # 0
Какая секурность )))
bormand 09.11.2021 22:45 # +1
В асме это тоже должно неплохо смотреться.
guest6 09.11.2021 22:48 # 0
guest6 09.11.2021 22:52 # 0
bormand 09.11.2021 22:55 # 0