<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Jul 31, 2021 at 3:33 PM Jon Steinhart <<a href="mailto:jon@fourwinds.com">jon@fourwinds.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Richard Salz writes:<br>
> On Sat, Jul 31, 2021 at 3:21 PM Jon Steinhart <<a href="mailto:jon@fourwinds.com" target="_blank">jon@fourwinds.com</a>> wrote:<br>
><br>
> > opinion, it doesn't add value to do something that's already been done<br>
> > but differently; it detracts from value because now there's yet another<br>
> > competing way to do something.<br>
> ><br>
><br>
> You mean like not using getopt and rolling your own?  Shrug.<br>
><br>
> while ((i = getopt(argc, argv, "xxxxx:xxxx")) != -1)<br>
>    switch (i) {<br>
>    case ....<br>
>   }<br>
> argc -= optind;<br>
> argv += optind;<br>
><br>
> So I never got getopt().  One of my rules is that I don't use a library<br>
> > in cases where the number of lines of gunk that that it takes to use a<br>
> > library function is >= the number of lines to just write it myself.<br>
><br>
><br>
> I don't know, what lines in the above are extra beyond what you write?  The<br>
> last two if being generous I suppose.<br>
<br>
Well, in my opinion that's not really an accurate representation of using getopt.<br>
<br>
I would of course write the #include line, and the table of options, which would<br>
end up being >= the number of lines that it takes me to do this...<br>
<br>
        while (--argc > 0) {<br>
                if (*(++argv)[0] == '-') {<br>
                        for (p = *argv + 1; *p != '\0'; p++) {<br>
                                switch (*p) {<br></blockquote><div><br></div><div>Except for all the things this gets wrong, it's ok. The problem with inlining getopt</div><div>is that you wind up with cases like -f foo'' on the command line being treated differently</div><div>than '-ffoo'. Inlined code like this can be quite frustrating for the user to use. Your</div><div>locality of reference is cut and paste bugs that getopt eliminates because it handles</div><div>all the special cases in a uniform way.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Even if it took a few more lines to do it my way, I'm a believer that good coding<br>
style keeps "meatspace locality of reference" in mind.  As programmers, we put in<br>
a lot of effort to ensure locality of reference for computers, but then completely<br>
toss it for people who aren't as good as it.  So given a choice of a few lines of<br>
code versus having to look something up somewhere else, I choose the few lines of<br>
code.<br></blockquote><div><br></div><div>And a few more bugs...</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Being a geezer, I have lots of code lying around from which I can extract working<br>
fragments such as the one above.  Writing those few lines of code provides insulation<br>
from supply-side attack vectors bugs in libraries, versioning issues, having to load<br>
debug libraries, and so on.<br></blockquote><div><br></div><div>getopt has been standardized since the 80s and has had universal adoption since</div><div>the 90s. Hardly a version chasing issue since it's in everybody's libc.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
I realize that this isn't a huge deal by itself; it's a philosophical point.  When<br>
I strace any random program that I didn't write I'm astonished by the amount of<br>
library loading that takes place.  So any issues are multiplied by n.<br></blockquote><div><br></div><div>The flip side to this is that libraries can be debugged once, while inline code</div><div>like the above needs to be deugged over and over....<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Don't get me wrong; I use plenty of libraries.  But I tend to use those for stuff<br>
that is so common that there is a benefit from shared libraries (or at least there<br>
was before everything got containerized) and for libraries that do actual hard stuff.<br>
But I don't use libraries for small snippets of code that I could easily write<br>
myself yielding better code clarity for others reading my code.<br></blockquote><div><br></div><div>Given the number of times I've been burned by trying to roll my own getopt,</div><div>I stopped trying years ago. It's harder than it looks.</div><div><br></div><div>Warner<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Jon<br>
</blockquote></div></div>