[C] Omskrivning av funktion från scratch. Hur kan den optimeras? datatyper etc

Permalänk
Medlem

[C] Omskrivning av funktion från scratch. Hur kan den optimeras? datatyper etc

Hej,

Jag håller på och försöker skriva om en gammal funktion i ett program. Funktionen är reg_assoc (fr. ~94), och omskrirvning är till för att använda PCRE biblioteket för reguljära uttryck. Jag har redan skrivit om funktionen till att använda PCRE och det fungerar, men tror nog att funktionen skulle må bättre av att skrivas om från scratch.

Funktionen har som argument 1 subjekt och en eller flera reguljära uttryck. dessa skall matchas mot subjektet som skall splittas i substrängar vid matchning.

Tillämpning av funktionen (i LPC): http://wiki.desolation.org/Reg_assoc
Dess källkod i C (sista funktionen): http://svn2.assembla.com/svn/aml/trunk/fluffos-2.7-ds2.018/ar...

Enkelt exempel hur den fungerar:
Strängen "abcdefgh", skall matchas mot de reguljära uttrycken ({ "bc", "e", "gh" }), Tredje argumentet är en token array t.ex. ({ "bc-match", "e-match", "gh-match" }) som användas för att skapa en form av associativ array som är funktionens returvärde. Ett fjärde och frivilligt argument är en token som matchas med icke-träffar.

reg_assoc("abcdefgh", ({ "bc", "e", "gh" }), ({ "bc-match", "e-match", gh-match"}), "no-match");

[list="1"]
[*] Matcha "abcdefgh" mot "bc":

({ ({ "a", "bc", "defgh"}), ({ "no-match", "bc-match", "no-match"}) })

[*] Matcha "e" mot alla icke matchar från föregående:

({ ({ "a", "bc", "d", "e", "fgh"}), ({ "no-match", "bc-match", "no-match", "e-match", "no-match"_}) })

[*] Matcha "gh" mot all icke matcher från föregående:

({ ({ "a", "bc", "d", "e", "f", "gh" }), ({ "no-match", "bc-match", "no-match", "e-match", "no-match", "gh-match"}) })

[/list=1]

D.V.S. den matchar succesivt icke träffer tills alla reguljära uttryck är använda.

Min fundering är hur hade ni löst det? Vilken sorts datatyp passar bäst (till att lagra all intermediär data, resultatet vet jag hur det lagras)? Känns som om det är något som skulle kunna lösas rekursivt, men lite osäker hur...