Zkouška 2.6.2010 - CHKFORM

Seznámení se základními principy operačního systému UNIX, převážně z uživatelského hlediska. Absolvent kurzu by měl být schopen napsat netriviální program v shellu.
zbytovsky
Matfyz(ák|ačka) level I
Příspěvky: 7
Registrován: 29. 10. 2009 18:12
Typ studia: Informatika Bc.

Zkouška 2.6.2010 - CHKFORM

Příspěvek od zbytovsky »

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.
Odpovědět

Zpět na „SWI095 Úvod do UNIXu“