Zkouška 2.6.2010 - CHKFORM

Odeslat odpověď

Smajlíci
:D :) :( :o :shock: :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode je zapnutý
[img] je zapnutý
[flash] je vypnutý
[url] je zapnuté
Smajlíci jsou zapnutí

Přehled tématu
   

Rozšířit náhled Přehled tématu: Zkouška 2.6.2010 - CHKFORM

Zkouška 2.6.2010 - CHKFORM

od zbytovsky » 2. 6. 2010 19:19

Tak dneska jsme dostali asi novou úlohu - podobně jako jsou v Cčku/AWKčku formátovací funkce printf("%s: %d", "abc", 22); tak jsme dostali zadané další názvy funkcí, které mají ten formátovací řetězec a další parametry podle počtu procentových aliasů. Cílem bylo přepsat volání těchto funkcí na __printf__sd("abc", 22) a do hlavičkového souboru přidat __printf__sd(char*, int), když se to potom projelo překladačem vyhodil nám případné chyby v typech - ale bacha, bylo všude potřeba zachovat řádkování!!

Printf nějak sám od sebe kontroluje překladač, ale motivací tohoto příkladu z praxe bylo kontrolování typů různých logovacích funkcí. Všechny názevy funkce jsme měli v souboru funkce.cfg

Kód: Vybrat vše

nazevFunkce pocetArgumentuKPreskoceni
log 2
printf 0
Aby to bylo ještě trochu praktičtější, tak číslo udávalo kolik argumentů přeskočit, tyto argumenty však nemohly obsahovat jiné čárky než oddělovací. Šlo je tedy v sedu odebrat pomocí s/([^,],){1}// s patřičným escapováním.

Céčko je mrcha a může mít odřádkování kdekoliv, ale jak bylo nastíněno při vyhlašování, stačilo přemýšlet a odstranit newline po čárce, uvozovce a závorkách. Potom to snad už šlo vzít sedem příjemně bez patlání newlinů (jako jsem to dělal já) :)

Viz nástin mého řešení:

Kód: Vybrat vše

echo 'neco neco; fce
(
"",
sasdf,
" ahoj %d %s", .........

ale znovu
fce("a", 222, "ahoj %s%, ...........

' | sed '

:start
N
s~fce[ 
]*(\([ 
]*[^,]*,\)\{2\}[ 
]*"~/*&*/__printf__("~
t cil
b start
:cil
' | sed '
:nav
s~__printf__("[^%]*%\([dsg]\)~__printf__\1~

'


Zadání trvalo hodinu, dvě hodiny písemka (libovolné materiály, hodinu hlídal někdo jiný) k dispozici laptop s shellem. Pak dvě hodiny pauza. Potom jsme se všichni sešli, pan doktor si postěžoval, že tenhle případ byl k naší smůle asi těžký. Že stačilo přemýšlet atd :) Jednička 1x, dvojka 5x, trojka s diskuzí 6x, čtyřka (nabízena diskuse) 6x. Jeden vzdal.

Nahoru