Toon posts:

coding style (indent) en functienamen scriptbased veranderen

Pagina: 1
Acties:

Verwijderd

Topicstarter
edit:
Argh, er mist een woord in de titel. |:(. Moet "coding style (indent) en functienamen script-based veranderen" zijn. :o.


edit:
gef1x0rt! Dankje, wilke!


Ik zit nu al een avondje te pruts0ren met indent, ik wil een soort standaard coding style meekrijgen voor bepaalde C source bestandjes. Okee, welke stijl wil ik: grotendeels kernel-standard (K&R), dus 8-space tabs, 1-tab indent, cuddled braces, etc. Een standaard stukje code ziet er dan zo uit:

code:
1
2
3
4
5
if (bla) {
        ..
} else {
        ..
}


Daarnaast wil ik spaties na if/else/while statements, boolean operators voor line break:

code:
1
2
3
4
if (bla1 &&
    bla2) {
        ..
}


Bij switch/case wil ik zo weinig mogelijk ruimte verspillen, en dus zoveel mogelijk op dezelfde indent:

code:
1
2
3
4
5
6
7
8
9
10
switch (bla) {
case BLA:
{
        ..
}
        break;
default:
        ..
        break;
}


Voor dit totaal gebruik ik de volgende indent regel:

code:
1
indent -kr -i8 -psl -bfda -lp -cli0 -cbi0 -npcs -sc -nhnl -nbbo


Enkele dingen gaan nog niet zoals ik wil. Een functie declaratie wil ik bijvoorbeeld met een spatie, maar functie calls zonder spatie. En de parameters in een functie declaratie wil ik lined-up hebben, dus iets a la:

code:
1
2
3
4
5
6
static void
bla_functie (const char *blaat,
             int         blaat2)
{
        bla_functie2(blaat, blaat);
}


Ik hoopte dat -pcs dit zou doen, maar die zet ook spaties bij de functie calls, en niet alleen bij de functie declaraties. Oftewel, zuig! :P. Ook kan ik geen fatsoenlijke manier vinden om de functie parameters te line-up'en (type links uitgelijnd, naam rechts uitgelijnd), het ziet er bij mij momenteel dus zo uit:

code:
1
2
3
4
5
6
static void
bla_functie(const char *blaat,
            int blaat2)
{
        bla_functie2(blaat, blaat);
}


Dat wil ik dus niet. Vraag 1 dus: hoe krijg ik spaties tussen functie-naam en parameters in de functie declaratie, maar niet in de call? En hoe kan ik de parameters in de declaratie line-up'en?

Okee, dan nog wat anders, sommige stukjes code gebruiken nog oude macro's, die ik in andere stukken code al gestandaardiseerd heb naar andere macro's. Het is dus nu een zootje aan enerzijds DEBUGX(printk("...")); macro's, en anderzijds dprintk(X, "..."); macro's. Ik wil alleen dprintk() gebruiken. Is er ergens een manier om dit script-gewijs om te zetten (bv. sed -e s/DEBUG1/dprintk(1,/, maar dan iets slimmer dat ie 1 automatisch snapt en dat haakje aan het eind ook weghaalt)? Ik heb weinig zin om 600kB aan code te doorlopen en dit handmatig te doen. :D.

Thanks in advance! _O_.

[ Voor 8% gewijzigd door Verwijderd op 05-01-2003 01:43 ]


  • Wilke
  • Registratie: December 2000
  • Laatst online: 23:27
Het 2e moet gewoon kunnen met een reguliere expressie (vind ik), als het me nog lukt om er een te maken die werkt hoor je het wel!

Wat betreft het eerste: geen idee of dat kan, ik weet niet hoe erg de code van indent zelf is, desnoods verander je indent zelf gewoon :?

Verwijderd

Topicstarter
Op zich, indent veranderen kan wel... 't Lijkt me alleen zo onlogisch dat ik de enige ben die zoiets wil... Ik bedoel, ik ben toch niet de enige die zo code? :P. Nouja, als ik niks beter kan verzinnen ga ik dat wel alsnog doen... :{.

  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 14-05 20:19

odysseus

Debian GNU/Linux Sid

Je kunt toch eerst indent draaien en vervolgens weer de extra spatie voor function calls eruitslopen? Die kun je gewoon herkennen door te zoeken naar "\ blabla(bla);". Aangenomen dat al je function calls maximaal één regel beslaan, zou het volgende toch kunnen werken als regexp?
code:
1
$line =~ s/\ // if ($line =~ /^\s*\ .*;$/);

Zonder /g zal alleen de eerste gevonden spatie worden verwijderd. Bovenstaande gaat er werkt ook als je voor je indent-tab geen echte tab gebruikt maar acht spaties, want dan gooit hij als het goed is in de juiste gevallen gewoon de eerste spatie weg (er wordt immers gematched op een ';' aan het eind).

Usual disclaimers apply. No tests for correct functionality have been done.

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.


  • Wilke
  • Registratie: December 2000
  • Laatst online: 23:27
Wat betreft het 2e probleem:

Bij deze een typisch stukje perl-code (dus: Write-only code), maar het werkt wel!! tenminste, dat denk ik :P

code:
1
2
3
4
5
6
7
8
[nohtml]
#!/usr/bin/perl
undef $/;
while ( <> ) {
  s/DEBUG(\d)\s*\(\s*printk\s*\(\s*(.*?)\s*\)\s*\)\s*;/dprintk($1, $2);/gsm;
  print;
}
[/nohtml]


Werkwijze:
  • Plaats bovenstaande in 'editmacro.pl'
  • chmod +x editmacro.pl
  • ./editmacro.pl < mijnsource.c > mijnsource.c.new
Hier wat zooi die je er doorheen kunt halen om een beetje te testen:

// De normale vorm
DEBUG0(printk("Foutje, bedankt!"));
statement();
bladiebla();
if (yaddah) {
printf("Blaat\n");
}
/* Met spaties, newlines en extra functieaanroepen 'binnen' de te matchen string all over the place */
DEBUG1 ( printk(
"dit is een test"
+ functietje( bewerking("zie je wel"))
)
);
DEBUG2 (printk ( "even uitproberen of 'ie deze twee wel uit elkaar haalt") );

DEBUG1(printk(
"Moet je"
"Eens opletten"
"Of dit ook werkt"
+ functie("bladiebla")
) )
;


printk(2, "Dit moet gewoon blijven staan");
printk(
1, "Dit ook");

DEBUG1(printk("Dit is het enige wat nog fout gaat" \
"(onwaarschijnlijk dat dit voorkomt in je code)); aahhh wat gemeen"));
Nou ja, het enige wat mis kan gaan (zie onderste voorbeeld) is wanneer je ergens '));' binnen een te printen string hebt staan - onwaarschijnlijk. Of als je ergens binnen een string dit hebt staan 'DEBUG1(printk(' gaat het ook fout. Maar ja, ik wens je veel succes om het zo te schrijven dat dat ook goed gaat - het komt toch niet voor neem ik aan :)

Dit is de uitvoer van bovenstaande rommel:

dprintk(0, "Foutje, bedankt!");
[..onnutige zooi verwijderd, blijft idd gewoon staan...]
dprintk(1, "dit is een test"
+ functietje( bewerking("zie je wel")));
dprintk(2, "even uitproberen");

dprintk(1, "Moet je"
"Eens opletten"
"Of dit ook werkt"
+ functie("bladiebla"));


printk(2, "Dit moet gewoon blijven staan");
printk(
1, "Dit ook");

dprintk(1, "Dit is het enige wat nog fout gaat" \
"(onwaarschijnlijk dat dit voorkomt in je code); aahhh wat gemeen"));
Kan 'ie mee door, of wat?

Verwijderd

Topicstarter
Perfect wilke! Inderdaad, ik doe geen twee haakjes binnen strings, hooguit 1 (als in __FUNC__), dus dat gaat wel werken! Odysseus, veel functie calls zijn over meerdere regels uitgespreid... Ik vrees eigenlijk dat dat toch met de hand zal moeten, ik kan echt helemaal niks zinnigs bedenken om dat te voorkomen. ;(.

Maargoed, morgen zal ik wilke's script eens proberen, ziet er veelbelovend uit! Dank!

[edit]

Ik ben ongeduldig en heb dus vandaag Wilke's script al geprobeerd, het werkt uitermate goed! Dank, Wilke! Nu nog uitvinden hoe ik indent iets aan z'n verstand kan peuteren (of alsnog veel handwerk. :{).

[ Voor 22% gewijzigd door Verwijderd op 06-01-2003 00:02 ]

Pagina: 1