- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
static int internal_CheckMac(char * inc_mac)
{
int return_value = 0x1;
if (strlen(inc_mac) != 17)
{
return return_value;
}
unsigned int i = 0x0;
for (i = 3; i <=17; i=i+2)
{
if (inc_mac[i-1] != 58)
{
return_value = 0x1;
break;
}
else
return_value = 0x0;
i++;
}
return return_value;
}
Функция проверяет содержимое строки. В строке должен быть мак адрес формата 00:01:02:03:04:05. 58 в строке 13 - это десятичное значение символа ":"
Авторство функции принадлежит Виталию Кострову, великому программисту из Рыбинска. После ревизии этого кода пришло понимание что надо избавляться от этого сотрудника.
defecate-plusplus 19.07.2012 09:05 # +10
код говно, но это меркнет на фоне вашего мужского поступка
evgeny 19.07.2012 09:11 # 0
absolut 19.07.2012 10:57 # +2
evgeny 19.07.2012 11:02 # +2
absolut 19.07.2012 11:12 # +3
roman-kashitsyn 19.07.2012 11:21 # +6
evgeny 19.07.2012 11:27 # +1
bormand 19.07.2012 11:23 # +1
absolut 19.07.2012 11:28 # +1
krypt 20.07.2012 10:43 # +1
TarasB 19.07.2012 09:36 # +3
> i++;
> 58
> 17
evgeny 19.07.2012 09:41 # 0
sscanf(addr, "%X:%X:%X:%X:%X:%X", &u8[0], &u8[1], &u8[2], &u8[3], &u8[4], &u8[5]);
defecate-plusplus 19.07.2012 09:49 # +3
evgeny 19.07.2012 09:55 # 0
TarasB 19.07.2012 09:58 # 0
defecate-plusplus 19.07.2012 09:59 # +3
evgeny 19.07.2012 10:02 # 0
defecate-plusplus 19.07.2012 10:05 # +10
sayidandrtfm 19.07.2012 10:12 # +13
Считаю что, ФИО гавнюков(написавших код) не подлежит огласке, в силу программистской этики.
P.S. "Мудрые обсуждают идеи. Умные — события. Глупые — других людей." (с)
bormand 19.07.2012 10:32 # +6
movaxbx 19.07.2012 10:58 # +6
Виталий Костров, человек и ASCII таблица.
roman-kashitsyn 19.07.2012 11:17 # +4
evgeny 19.07.2012 11:19 # 0
bormand 19.07.2012 11:22 # +2
evgeny 19.07.2012 11:23 # −2
psycho-coder 19.07.2012 14:51 # +1
Lowezar 20.07.2012 09:36 # +1
roman-kashitsyn 19.07.2012 11:24 # +4
evgeny 19.07.2012 11:25 # −3
absolut 19.07.2012 11:35 # +5
TarasB 19.07.2012 11:29 # +5
bormand 19.07.2012 12:41 # +7
TarasB 19.07.2012 14:31 # +1
Однако у вас вышло тоньше всех...
someone 19.07.2012 11:42 # 0
Fixed?
kipar 19.07.2012 11:59 # +3
TarasB 19.07.2012 12:02 # +8
someone 19.07.2012 12:04 # +1
rat4 19.07.2012 12:59 # 0
Тем временем уже есть C11 с генериками...
absolut 19.07.2012 13:04 # +1
roman-kashitsyn 19.07.2012 13:06 # +1
TarasB 19.07.2012 13:08 # +3
defecate-plusplus 19.07.2012 13:11 # +3
чтобы не ломать существующий десятилетиями код, добавили _Вот такое вот новое _Слово, потому что _Имели _Право
3.14159265 19.07.2012 13:14 # 0
absolut 19.07.2012 13:59 # +4
По-моему, требование совместимости с архаичными стандартами, что для C, что для C++, делает их с каждым новым обновлением всё менее элегантными. И скоро это превратится в жуткую кашу, если уже не превратилось.
defecate-plusplus 19.07.2012 14:48 # 0
на самом деле, реальная совместимость старого и нового синтаксиса должна быть разрулена ключами компиляции,
а раз ты ССЗБ, что скопипастил старый костыльный код именно в файл с новым синтаксисом - ну значит, не западло будет и исправить руками, никаких уже отмазок "но мы не можем ведь поменять старый код!" уже приниматься не должно
roman-kashitsyn 19.07.2012 15:05 # +7
absolut 20.07.2012 09:14 # 0
TarasB 19.07.2012 14:30 # +3
Поменять одно слово (внизапно ставшее ключевым) на другое во всех файлах проекта - говно вопрос, а уродство в языке - навсегда.
rat4 19.07.2012 14:39 # 0
defecate-plusplus 19.07.2012 12:11 # +2
someone 19.07.2012 12:14 # 0
Да, scanf - не замена регэкспам.
Придётся ещё либо strlen, либо все шесть интов проверять на (i == i & 0xff). А это некузяво. :(
defecate-plusplus 19.07.2012 12:27 # +2
формат %02x подразумевает, что больше 1 байта не вычитается
sscanf вернет число успешно распарсенных значений - их должно быть ровно 6
можно, например, тупо "%02x:%02x:%02x:%02x:%02x:%02x%с", проследить, что либо результат == 6, тогда ок, либо == 7, тогда проверить последний char на isspace
во всех остальных случаях - не ок
по поводу регэкспа - если мне будет не лень, напишу тестик
defecate-plusplus 19.07.2012 12:17 # +2
в той же винде, например
мне сейчас лень искать официальные документы на MAC-48 на предмет регламента записи 6 октетов
defecate-plusplus 19.07.2012 13:53 # +4
под виндой, как обычно, сишные stdio работают супер-шустро, пока не выставишь локаль
код:
http://liveworkspace.org/code/b828b89821d56ecf74dd7219bdfe64fd
на винде результаты:
test_mac_sscanf : 93 milliseconds
test_mac_boost_regex : 244 milliseconds
test_mac_boost_xpressive : 608 milliseconds
after locale setup......
test_mac_sscanf : 292 milliseconds
test_mac_boost_regex : 235 milliseconds
test_mac_boost_xpressive : 611 milliseconds
на линухе x86 результаты:
test_mac_sscanf : 111 milliseconds
test_mac_boost_regex : 314 milliseconds
test_mac_boost_xpressive : 3315 milliseconds
after locale setup......
test_mac_sscanf : 134 milliseconds
test_mac_boost_regex : 317 milliseconds
test_mac_boost_xpressive : 3300 milliseconds
на линухе x86_64:
см ссылку на liveworkspace
выводы -
1) расхваленный boost::xpressive очень сильно отстает от boost::regex на 32-битном коде, отставание сокращается на х64, но всё равно сильно заметно
2) строгое ожидание 2 hex символов в октете заставило меня использовать уродское %1x%1x, может я подзабыл все нюансы формата, но я не смог заставить %02x парсить ровно 2 символа, а не не более 2 символов (т.е. он дозволял :a:b: и я это только так поборол)
3) для boost::regex есть мутные намеки в интернете, что если его перекомпилировать с некими доп. настройками, он будет работать в 2-3 раза быстрее (типа USE_CPP_LOCALE), но если честно, не сильно хочется пробовать
defecate-plusplus 19.07.2012 14:50 # +1
roman-kashitsyn 19.07.2012 15:06 # +3
defecate-plusplus 19.07.2012 15:14 # 0
может я его не умею готовить...
http://bit.ly/NAX1aE - видать инфа о превосходстве борна несколько устарела (Boost.Regex Version: 1.33+, BOOST_REGEX_USE_CPP_LOCALE, BOOST_REGEX_RECURSIVE)
roman-kashitsyn 19.07.2012 15:35 # 0
unu-foja 19.07.2012 19:02 # +2
defecate-plusplus 19.07.2012 20:11 # 0
кстати еще всплывала мысль запилить тест на boost::spirit, вспомнить молодость так сказать, но на работе иногда и поработать надо
unu-foja 19.07.2012 20:24 # 0
Ага. Но ведь "регулярка" - это тоже некоторая (выбранная ввиду частой встречаемости) грамматика.
> будет считать валидным "11-22:33-44:55-66"?
<|> пробует левый парсер, если он ничего не смог съесть - переключается правый (развилка без возврата).
А здесь по разделителю строится целиком парсер последних 15 символов, вроде все путем.
BTW: не подскажите как boost можно прилинковать для быстрой проверки из командной строки?
(*.pc нема, не make же файл писать, а то по ошибкам выбирать долго)
defecate-plusplus 19.07.2012 20:33 # 0
линукс для меня не родная система, поэтому если я что то компилю из командной строки, то указать вручную одну директорию поиска и несколько имен в -l не особо напрягает (-L/usr/lib/boost -lboost_system -lboost_regex -lboost_chrono ...)
а большие проекты под линухом - там список один раз задан и подставится автоматом
если честно, не знаю способа, чтобы код в gcc/ld самостоятельно искал, какие либы он хочет линковать (типа pragma comment lib в студийном тулчейне)
guest 24.07.2012 11:59 # 0
http://liveworkspace.org/
Даже компиляторы и бусты распаковывать себе не придется. Все уже готово онлайново и весьма удобно в онлайновой иде.
bormand 19.07.2012 18:39 # 0
По теме - интересно, почему на линухе xpressive настолько медленный.
P.S. На liveworkspace только у меня глючит редактор (пишет символы 2-3 знакоместа правее курсора), когда включена подсветка синтаксиса?
unu-foja 19.07.2012 19:00 # +1
Может за это минуснули, типа "непоказательно"?
Xom94ok 19.07.2012 20:51 # +3
Psionic 19.07.2012 14:12 # +7
sayidandrtfm 19.07.2012 15:24 # +3
Ага.
http://v6decode.com/
2001:0db8:0000:0000:0000:0000:1428:57ab
201:0db8:0000:0000:0000::1428:57ab
21:0db8:0:0:0:0:1428:57ab
1:0db8:0:0::1428:57ab
2001:0db8::1428:57ab
2001:db8::1428:57ab
http://download.dartware.com/thirdparty/test-ipv6-regex.pl
defecate-plusplus 19.07.2012 15:34 # +4
absolut 19.07.2012 20:58 # 0
И мужик...
eth0 19.07.2012 19:41 # +2
rat4 19.07.2012 19:50 # +1
vistefan 19.07.2012 20:52 # +2
>какой-то фигни вместо ойпи адреса
fixed
rat4 19.07.2012 20:57 # 0
Найн
vistefan 19.07.2012 21:03 # 0
Жаль...
sayidandrtfm 19.07.2012 20:53 # +1
Просто надо взять и осилить регэкспы, бле@ть!
rat4 19.07.2012 20:55 # +2
Не нужны.
sayidandrtfm 19.07.2012 21:01 # +1
Не нужно.
rat4 19.07.2012 21:15 # +1
bormand 20.07.2012 05:19 # +1
sayidandrtfm 20.07.2012 07:00 # 0
defecate-plusplus 20.07.2012 07:25 # +3
sayidandrtfm 20.07.2012 07:36 # +2
bormand 20.07.2012 11:31 # +3
Да скорее всего тупой конечный автомат. Не думаю, что там будут регулярки.
> владеть несколькими методами
Безусловно.
> А там уже по обстоятельствам.
Вот-вот. Написать тот же автомат или регулярку не сложно и не долго. Только вот тот же inet_pton уже отлажен и оттестирован. А с регуляркой все это проходить заново. Так что нужны очень веские обстоятельства, чтобы этим заниматься...
sayidandrtfm 20.07.2012 14:07 # 0
Например лаборатория одного очень не безызвестного дяди умеет определять,
что вызывают для своей работы программы безызвестных дядь...
bormand 21.07.2012 20:10 # 0
sayidandrtfm 21.07.2012 20:28 # 0
1) считает подозрительным по умолчанию всё , если им же(продуктом) не доказано обратное;
2) тем более подозрительным всё то, что использует функции из множества «сетевые».
Если смотреть немного шире, то по существу, дублирование функционала
(естественно, там где это возможно/разумно/etc), несколько усложняет
анализ продуктов безызвестных дядь, а значит повышает их шансы на успеваемость.
Это всё к тому, что необходимость есть, может и не такая повседневная, но есть.
eth0 21.07.2012 20:50 # 0
sayidandrtfm 21.07.2012 20:52 # 0
Lure Of Chaos 19.07.2012 18:23 # +2
guest 24.07.2012 12:17 # 0
говнокод?
Как показало обсуждение strlen делать все равно надо.
А цикл проверки на валидность формата в котором
представлены данные самый быстрый.
Сразу возникает вопрос, а была ли поставлена задача
в данной функции проверять данные записанные в этом
формате.
wvxvw 24.07.2012 10:19 # +2
Так намана, насяльника?
TarasB 24.07.2012 10:56 # +2
wvxvw 24.07.2012 10:59 # 0
roman-kashitsyn 24.07.2012 11:03 # 0
Не у всех есть компилятор C99
> ctype.h
> hex_digit_p
isxdigit
> validator validators[17]
Создание массива на стеке при каждом вызове функции
> for (i = 0; i < 17; ++i)
семнадцать вызовов функций для проверки одной маленькой строки как-то жирновато
TarasB 24.07.2012 11:11 # +1
А компилятор не догадается, что это константа и можно только 1 раз инициализировать?
wvxvw 24.07.2012 11:32 # 0
Та ну, в массиве всего 17 элементов... можно и руками заполнить, подумаешь... тем более, что как выяснилось, нужно было бы еще добавить последним номером в этой программе проверку на то, что последний символ таки ноль. Можно было бы написать функцию, которая это делает, но она была бы совсем одноразовой.
Про компилятор С99... я последний раз писал на Си примерно в том же году... так что извиняйте... я не в курсе последних изменений.
По поводу проверки - если честно, то не понятно, что именно мы проверяем, т.как у МАК адресов нет задокументированой печатной формы, есть только общие какие-то "пожелания", где говорится что, например, можно использовать значек переноса вместо двоеточия, но я не видел ни одного примера где бы использовались одновременно и двоеточия и переносы. Изза чего не понятно можно ли допускать и то и другое одновременно.
Что до ipv6, то там вообще, как обычно, жопа полная в смысле написания и расшифровки. Там возможно 17 вызовами не обойтись. Как-то инженерная озадаченная сила любит озадачивать оставшуюся часть незадачливого человечества всякой херней в духе электорпочтовых адресов, универсальных идентификаторов в интернете и т.п. Этот совсем даже не исключение.
guest 24.07.2012 11:36 # +3
guest 24.07.2012 11:39 # 0
wvxvw 24.07.2012 11:42 # 0
guest 24.07.2012 11:42 # 0
> (
> r=validators[0](x),
> rotate(begin(validators), end(validators)-1, end(validators)),
> r
> );
Хахах. Что только не сделают крестушки, чтобы использовать вывод типа результата лямбды и не указывать его вручную. Haskell чтоле возьми.
guest 24.07.2012 11:52 # 0
guest 24.07.2012 11:46 # 0
guest 24.07.2012 12:09 # 0
Можно было обойтись и без тежолой function<bool(char)>
guest 24.07.2012 12:11 # 0
roman-kashitsyn 26.07.2012 14:13 # +1
bormand 26.07.2012 17:20 # +1
P.S. Сорри, хотел плюсануть, а попал в минус.
roman-kashitsyn 27.07.2012 08:45 # +1
я старался
> не претендует на обобщенность
хотел намекнуть, что микро-язык можно легко расширить и принимать шаблон как параметр, но делать этого не стал.
> Сорри, хотел плюсануть, а попал в минус
У меня, кстати, родилась вот какая идея для клона гк:
заменить плюсы и минусы битовыми сдвигами только не совсем понять, как быть с отрицательным рейтингом... или так
eth0 27.07.2012 14:29 # +2
Двоичной дробью.
HaskellGovno 26.07.2012 18:33 # +3
P.S. Сорри, хотел плюсануть, а попал в минус. Проклятье минуса. :\
HaskellGovno 26.07.2012 19:06 # 0
fixed
3.14159265 26.07.2012 21:14 # +1
HaskellGovno 26.07.2012 21:22 # 0
3.14159265 26.07.2012 21:49 # +1
"xx:xx:xx:xx:xx:xx"
В отличие от Хацкильного варианта и magic number проверок длины.
HaskellGovno 26.07.2012 22:24 # −2
3.14159265 27.07.2012 14:30 # +2
Тебя же процитировали.
Зачем вообще акцентировать на этом внимание?
HaskellGovno 27.07.2012 14:35 # +1
HaskellGovno 26.07.2012 19:08 # +1
bormand 26.07.2012 19:27 # +3
HaskellGovno 26.07.2012 19:27 # +1
HaskellGovno 26.07.2012 19:28 # +1
Не примет. У тебя там лишний пробел. :D
bormand 26.07.2012 21:16 # +2
absolut 31.07.2012 15:20 # 0
HaskellGovno 26.07.2012 18:37 # 0
HaskellGovno 26.07.2012 18:38 # +2