- 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
typedef deque<uint8_t> bn;
#define cat2(b,e) b##e
#define cat(b,e) cat2(b,e)
#define fsi(i,s,e) for(size_t i(s), cat(i,cat(_fsi_end_,__LINE__))(e); i<cat(i,cat(_fsi_end_,__LINE__)); ++(i))
void ml10(bn& n){
n.push_front(0);
}
uint8_t ni(const bn& n, size_t i){
if(n.size()<=i)
return 0;
else
return n[i];
}
size_t ms(const bn& n1, const bn& n2){
return (max) (n1.size(), n2.size());
}
void pb(uint8_t b1, uint8_t b2, uint8_t lc, uint8_t& r, uint8_t& c){
uint8_t tr = (b1+b2+lc);
r = tr & 1;
c = !!(tr & 2);
}
bn bi(bn n){
reverse(n.begin(), n.end());
return n;
}
bn pl(const bn& n1, const bn& n2){
bn r;
uint8_t c=0,br=0;
fsi(i,0,ms(n1, n2)){
pb(ni(n1,i),ni(n2,i),c,br,c);
r.push_back(br);
}
if (c)
r.push_back(c);
return r;
}
bn ml(bn n1, const bn& n2){
bn r;
fsi(i,0,n2.size()){
if(n2[i])
r=pl(r,n1);
ml10(n1);
}
return r;
}
У меня к вам вопрос парни.
В нашем отделе взяли олимпиадника. За ним не следили. Он написал много кода и ушел в гугл.
Как бы за ним теперь код поправить? Хотябы конструкции языка типа for вернуть вместо например fsi?
Код не из проекта. но его. В проекте похожий и даже хуже.
Нужно типа утилиты препроцессор крестов для части макросов (все разворачивать макросы или инклудить хедеры очевидно нельзя).
Сложение и умножение двочиных чисел.
http://ideone.com/6ZeIkX
Пост для привлечения внимания
Вот это настораживает и в то же время многое объясняет.
О, кстати, это ж корпорация зла как раз такой инструмент и разрабатывает! Может быть поэтому?
Заменяет:
на
Можно и остальные макросы так же запилить, но мне влом :)
Т.е. достаточно искать "fsi(", соответствующую ")" и заменять их.
Мне почему-то кажется что парсер бы споткнулся и умер о такое (а препроцессор работает)
"gcc -E" прекрасно отрабатывает же.
[/code]
ОМГ, что это?!
Ну а нам то что теперь делать с результатами его гениальности?
Ладно функции мы конечно переименуем заменой.
А вот с этим как?
Может регексами как-то в преобразовать? Или лучше даже в ?
- запускаем gcc с опциями -E и -include (с файлом, в котором описаны только упрощенные версии fsi и прочей херни);
- выносим нахер все строки, начинающиеся с #
- раскомменчиваем закоммеченное на первом шаге;
???
- профит!
комментарии можно, наверное, обезопасить, заменив регулярочкой на что-то вроде /-+/ и /-+* *-+/, чтобы потом легко было вернуть их обратно
осталось только необходимые для разворачивания макросы вернуть к первоначальному валидному варианту и уже прогонять через препроцессор
но ИМХО всё равно не вариант, т.к. потом слишком много ручной работы по возвращению исходников к, кхм... исходному состоянию
UPD: ОК, это всё питушня
всё тлен
Из недостатков - если в коде встречается //# - он его раскомментит. Можно вылечить более сложной защитой директив, к примеру //----#
cpp -E -C -P -nostdinc -include fsi.h some.cpp
Что это? Подключить хедер из командной строки?
О вы выше ответили.
Ну и если честно так не хотелось бы, тк в коде есть и вполне вменяемые макросы (насколько такое возможно), которым лучше ими и остаться. Например кодогенерация с BOOST_PP_REPEAT или паттерн матчинг аля:
Ну и адский результат cat(i,cat(_fsi_end_,__LINE__)) останется. Впрочем просто fsi поправлю заменив там это на кот(i##_end)
Ага.
> Это не сработает со всеми адскими макросами гения, что юзают буст к сожалению.
Ну тут х.з. Разве что руками замакросить их на что-то более простое и понятное...
Вот если бы тут замену fsi делать регекспами на то, чем я хочу заменить или ещё чем-то кроме регекспов, то этой бы проблемы конечно не было бы, тк мог бы избирательно раскрывать макросы не раскрывая, а заменяя. Может boost::wave что-то такое может? Ну или хотябы избирательно может раскрывать?
Но может, флаги Борманда для компилятора помогут вместе с -E получить на выходе меньше питушни.
http://pastebin.com/5vBwLXph
0. Сохраняем код в preproc.js, бэкапим файлы олимпиадника
1. Берём файл file.cc с кодом олимпиадника
2. node preproc info file.cc options.txt
3. удаляем из вновь созданного options.txt всё то, что следует заинклюдить/раскрыть. Т.е. оставляем в options.txt все макросы/файлы, которые написал не Царь он.
4. node preproc comment file.cc file1.cc options.txt
5. gcc -E <ещё какие флаги> file1.cc > file2.cc
6. node preproc uncomment file2.cc file3.cc
7. удаляем из file3.cc лишнюю питушню. file3.cc - новый файл с раскрытыми макросами.
О кстати. Я придумал. Пойду в фрланс. Буду фигачить там код этими макросами. Затем методом бормонда если заказчику не понравится - рамкрывать макросы. А если понравиться, то и черт с ним. Главное быстро.
И правда, мой код вызовет сущий ад на ровном месте, если автор написал
Первая строка закомментируется, вторая останется.
Прикинь в код после раскрытия эта байда с do while говном встанет? Это явно заказчик одобрит, что по всему коду разбросан такой ад
P.S. Хотя... тогда придется ревьювить все точки, в которых раскрыт макрос :( Этот do while все-таки не от хорошей жизни втыкали.
Так что с такими макросами считерить не выйдет ;(
Тк теперь в макросне 3 запятых вместо двух. То есть таким макросом возможно будет поправить только простые случаи. Хотя конечно их большинство должно быть, так что уже хотябы часть проблем решим и не придется делать это вручную.
Вполне можно? если там чего хтирого не понапихано, с запятыми в вызовах fsi :)
Должно быть тогда ib. У него везде глагол вначале идет по вашей задумке. Единственное что радует это наличие коротких функций, по телу которых хотябы понятно что они делают.
* или я грешный посмел толковать волю Высшего Разума и сделал это неправильно
А смысл? Мути уж тогда через какие-нибудь uint8_t или даже uint32_t...
Фу-фу-фу
http://govnokod.ru/17155
>Фу-фу-фу
А судьи кто?
Мизулина.
Любой из этих пунктов решил бы проблему в зародыше.
Главное - взять в команду побольше олимпиадников, и успех обеспечен! У Дурова же "получилось"!
Стопудов. Как и выбранные языки разработки. Вот все говнят рнр и js, но вк они приносят деньги.
Но всё же я что-то сомневаюсь что Дуров лично рулил именно это самой важной бизнес-составляющей.
Там же сначала совершенно не было никакой монетизации, даже реклама отсутствовала, а мощности и траффик требовались громаднейшие. И что он годами, себе в убыток финансировал проект на этапе начальной раскрутки.
Это какая-то кулстори для прессы. Про историю успеха простого русского пацана, который упорным трудом осуществил свою мечту и всё такое.
Казалось бы глава Роснефти и один узбекский вор тут совершенно непричем...
На самом деле я не вижу ничего постыдного в привлечении крупных денег в свой стартап. Ну Гейтс ведь тоже с контракта с IBM начинал;)
Хотя конечно компании вроде Яндекса, поднявшиеся изначально на качественных продуктах и своих ноу-хау -- такие компании вызывают у меня больше симпатии)
А компания и правда хорошая.
Там мутная история. Никто ж вам правду не скажет.
Может сначала его финансировали грузинский вор и один еврей.
Судить можно только по косвенным фактам - видя как быстро и умело пашу выперли на мороз можно догадаться какая его роль во всём этом.
Да и судя по тому что контакт не закрывали за пиратство и распространение прона у него явно были высокие покровители.
7 марта бывший замгендиректора «ВКонтакте» Илья Перекопский обвинил Дурова в предательстве, заявив, что тот «увёл в Telegram 15 лучших программистов-олимпиадников»
ок, в следующий раз буду писать зелёным, раз без него не понятно.
Проблема не в том что он увел олимпиадников, а в том что весь вконтакте состоит из тысяч маленьких программок на сях примерно такого вот уровня читаемости. И каждую програмку поддерживал ее автор (олимпиадник).
Теперь авторы ушли, и вконтакнт проще переписать, чем разобраться с существующим кодом_)
--Набираешь олмпиадников
--PROFIT
Они уходят в Гугл
?????
PROFIT
>Они уходят в Гугл
Гугл объявляет банкротство и ты скупаешь их активы за бесценок?
Сами виноваты, code review для чего придумали?