Posts Tagged ‘сорс’

Регулярни изрази в C (PCRE)

Thursday, November 19th, 2009

Предполагам че на всеки, който пише код рано или късно му се налага да парсва низове. В случай че низът не е нещо кратко, точно и ясно, се налага използването на regex. В различните езици регулярни изрази се ползват по различен начин. Общото е че върху изследвания низ се налага шаблон и според това дали низът попада в шаблона (match-ва) се предприемат някакви действия или части от низа се прехвърлят в други променливи. В Perl това става лесно - има си езикова конструкция:

  1.  
  2. $string = "The lazy dog jumped over the quick brown fox.";
  3. if ($string =~ /(\w{3}\./){
  4. $match = $1;
  5. do_something_on($match);
  6. }
  7.  

Кракто и ясно - ако низът попада в /шаблон/ - да се направи еди какво си. Няма да се спирам точно върху синтаксиса на шаблоните, понеже самия факт че четете това тук предполага че сте на ясно :)
Все пак ако не сте на ясно, ето ви един плашещ шаблон, за да се откажете още тук:
/^([\d\.]+?)\skill\s+(\d+)\s+([\w\s]+?)(\d+?)\s+([\w\s]+?)\w+$/
Това използвам за парсване на тези редове от логовете на Unreal Tournament:
175.48 kill 1 Sniper Rifle 5 Sniper Rifle Decapitated
В PHP няма езикова конструкция, но има доста функции за Perl Compatible Regular Expressions, които работят на същия принцип.
Сега да видим как е положението в С.
От много време търсех как мога да ползвам регулярни изрази, но все удрях на камък. Когато ми се е налагало да парсвам низове съм ползвал sscanf или разбиване на символи, броене, чакане Х-тия символ да е точно 'А', Y-тия да е точно 'B' и т.н. Неприятна работа включваща жонглиране с цикли, if-ове, strcmp и двадесет нива индентация на кода.
Днес открих че в С има поддръжка на PCRE и ми се дощя да се самоубия :)
Ако работите на нормална операционна система, то може да видите много информация с man pcre и man pcreapi. Ако сте наистина щастливци, някъде из дистрибуцията ще имате файл pcredemo.c, който нагледно показва как се работи с PCRE функциите.
Ако не сте от тези щастливци можете да си намерите файла от тук.
Използват се две основни функции: pcre_compile и pcre_exec. Първата поема съставения шаблон от потребителски низов вид и го превръща във вътрешното представяне, което компилатора използва. Втората функция налага шаблона върху тествания низ и връща съвпаденията във вид на масив от вектори, сочещи началните позиции на съвпаденията. Можете да прочетете за функциите в съответните man страници. И най-добре вижте pcredemo.c

Закоментиране на цял блок код с един знак

Sunday, November 1st, 2009

Този бърз хак работи само в езици, които поддържат коментари от вида "//" за коментиране на ред и такива от вида "/* ... */" за коментиране на блок.
Да вземем този блок:

  1.  
  2. blqk();
  3. puf();
  4. paf();
  5.  

Да го закоментираме целия:

  1.  
  2. /*
  3. blqk();
  4. puf();
  5. paf();
  6. */
  7.  

И да закоментираме затварящия коментар :)

  1.  
  2. /*
  3. blqk();
  4. puf();
  5. paf();
  6. //*/
  7.  

В този момент целия блок е закоментиран. Ако сега добавим единична "/" пред отварящия коментар, коментарите ще отпаднат и блокът ще се разкоментира:

  1.  
  2. //*
  3. blqk();
  4. puf();
  5. paf();
  6. //*/
  7.  

Изпробвано е и работи в С и РНР. Ако имате пуснато оцветяване на кода в редактора, който ползвате (и оцветяването работи добре в реално време), ще видите интерсна гледка при добавяне и премахване на магическата "/" :)

Интегриране на GCC във Vim

Wednesday, March 25th, 2009

Вдъхновен от поста на един приятел, реших че може малко да си улесня живота като добавя бързи бутони за Compile и CompileRun във vim :) Пиниза наистина е лесен и си струва. Следните редове се добавят във .vimrc:

  1.  
  2. map <F9> :call CompileRun()<CR>
  3. map <F5> :call Compile()<CR>
  4. func! CompileRun()
  5.         exec "w"        
  6.         exec "!gcc % -o %< && ./%<"
  7. endfunc
  8. func! Compile()
  9.         exec "w"
  10.         exec "!gcc % -o %<"
  11. endfunc
  12.  

След това докато редактирате .с файл цъкате F5 и файла се компилира, F9 и се компилира и изпълнява. Евентуално може да бъде добавена и функцийка за make с Makefile.

Ах този фреймрейт…

Tuesday, February 3rd, 2009

Не ми харесва когато се окаже че субтитрите за някой филм не съвпадат с кадрите на филма. Резултата е постоянно избързване или изоставане на субтитрите спрямо действието, което с течение на времето се увеличава все повече и повече. Някой от умните съвременни плеъри имат опция за смяна на framerate на субтитърния файл. Но повечето го нямат.
По-неприятното е когато всички български сайтове за субтитри имат само една версия на субтитрите, които ви трябват, и то тази версия е за фреймрейт, който е различен от този на филма ви. Тогава или постоянно коригирате субтитрите (бутони Z и X в mplayer) или ги зарязвате и гледате филма в оригинал. Поздрави на хората, които могат от първо слушане да разбират говорим диалектен и жаргонен английски език. Завиждам им.
Алтернативата е да си оправите субтитрите - в нета има доста програмки, които нагласят фреймрейта. Всъщност цялата философия е да се смени времето на появяване на всяка реплика по една проста формула, за това реших да се поупражня и да си напиша моя програмка.
Представям ви - subconv.c. Програмата за сега работи само със субтитри във формат MicroDVD, а в кода има инструкции за експлоатация. Много неща трябва да се пипнат там, което ще направя когато отново ме стегне шапката че не мога да гледам нещо :)

Карта на интернет

Tuesday, June 3rd, 2008

Нещо ме е хванала скуката. Пробвах да уча по Компютърни Архитектури, но резултата беше следобедна дрямка :)
Така че за да се измъкна за малко от творческата дупка, упражних малко PHP и регулярни изрази.
Резултата е налице - скрипт, който прави карта на 'интернет' :D
По-точно приема като параметър URL и тръгва по изходящите от там връзки. Изходяща е връзка към домейн различен от домейна на URL-то. Не се следят броя връзки, нито въпросното URL се crawl-ва до всяка под-страница. Така от всеки домейн се преглежда само по едно URL, което означава че картата е далееече от точност :) Ама я си представете от някой голям портал като dir.bg колко връзки навън има... и как се представят графично. За графичното представяне използвам Graphviz.
Вижда се че тук-таме субдомейните се представят като отделни сайтове. Примерно според скрипта idg.bg и www.idg.bg са две различни неща. Това е така, защото субдомейна www наистина може да е съвсем друг сайт :) Скрипта не проверява съдържанието буква по буква за съвпадение.
И естествено целия паяк има 'ограда', за да не тръгне да прави наистина карта на Интернет. Това което се вижда е на разстояние до 2 хопа от ivan.tu-plovdiv.info.
Извинявам се на сайтовете, които се виждат вътре за спамопободния трафик към тях.
Ето я й самата карта (не съм си играл с настройките за шарении):
out.jpg

А тук има същата карта, но този път се вижда малко по-далече - на 3 хопа разстояние. Всичко се върти около google, picasa, youtube, myspace... Хмм, виждат се и няколко бъга, които имат нужда оправяне :)