Λοιπόν, έκανα και εγώ μια γρήγορη υλοποίηση, που λειτουργικά είναι νομίζω αρκετά πιστή με αυτή του αυθεντικού. Δεν την δοκίμασα εξαντλητικά, οπότε μπορεί να περιέχει bugs.
http://ideone.com/1oMC1Τα options τα έχω σε έναν ομώνυμο πίνακα στην
main(), με την κάθε γραμμή του να αντιστοιχεί σε ένα option και τον enumerator
OptionId να περιέχει τα indicies του πίνακα.
Το καθένα από τα options εκτός από την short & long εντολή του (
sstr &
lstr), και την περιγραφή του (
desc), έχει κι ένα bitflag (
obit) που το χρησιμοποιώ για να δηλώσω πως είναι ενεργοποιημένο το συγκεκριμένο option.
Η μεταβλητή
obitmap στην main() αποτελείται από 2 bytes (uint16_t) εκ των οποίων χρησιμοποιώ μονάχα το ένα (το άλλο είναι άδειο, αν χρειαστεί να μπουν κι άλλα options). Την ξεκινάω με μηδενική τιμή και για κάθε option που καθορίζει ο χρήστης στη γραμμή εντολών ανάβω το κατάλληλο bit μέσα σε αυτή την μεταβλητή. Αυτό το κάνει συνάρτηση
parse_cmdln_args() οπότε μόλις τελειώσει, η μεταβλητή
obitmap έχει αναμμένα μονάχα τα bits που αντιστοιχούν στα activated options.
Η
parse_cmdln_args() ενημερώνει επίσης έναν πίνακα από δείκτες (
fnames) που δείχνουν μονάχα σε όσα argv[ i ] περιέχουν ονόματα αρχείων στη γραμμή εντολών. Ενημερώνει επίσης το πλήθος αυτών των filenames που βρήκε στη γραμμή εντολών (
nfiles). Στην αρχή του προγράμματος έχω βάλει όριο μέχρι 100 filenames (+1 γιατί τον τελευταίο δείκτη τον θέλω πάντα NULL).