A little investigation shows that this is actually the very legible
but the glibc headers have code which turns strncmp(c1, c2, n) into strcmp(c1, c2) when one of the strings is constant and shorter than n (this probably happens a lot in defensive code):assert (strncmp (repository, current_parsed_root->directory, strlen (current_parsed_root->directory)) == 0);
while strcmp is in turn defined to a completely nutty bit of code which seems to have something to do with inlining comparisons where at least one string is a short constant string (again, something that may happen quite a bit in practice).#ifndef _HAVE_STRING_ARCH_strncmp # define strncmp(s1, s2, n) \ (__extension__ (__builtin_constant_p (n) \ && ((__builtin_constant_p (s1) \ && strlen (s1) < ((size_t) (n))) \ || (__builtin_constant_p (s2) \ && strlen (s2) < ((size_t) (n)))) \ ? strcmp (s1, s2) : strncmp (s1, s2, n))) #endif
I am a lover of macros, having written a few humdingers of my own, but nothing to rival the sheer majesty of the ones found in glibc's internal headers. If you value your sanity, you'll steer clear of <bits/string2.h>.
As a parting gift, here's one of the "humdingers" I recently wrote, part of a Python wrapper for part of the OpenGL API:
(tsk tsk, I didn't carefully align the backslashes like the glibc author)#define GLCALL4V(name, fmt, t1, t2, t3, t4) \ static PyObject *py##name(PyObject *s, PyObject *o) { \ t1 p1; t2 p2; t3 p3; t4 p4; \ if(!PyArg_ParseTuple(o, fmt, &p1, &p2, &p3, &p4)) return NULL; \ name(p1, p2, p3, p4); \ CHECK_ERROR; \ Py_INCREF(Py_None); return Py_None; \ }
It's used like this:
which I defend as a really convenient way to write the wrapper for the gluPerspective call. But at the same time, I can imagine the horror of some future maintainer of my software, the first time he sees my macro. Don't worry. This burst of empathy won't actually change the way I write software...GLCALL4V(gluPerspective, "dddd", double, double, double, double);
Entry first conceived on 1 December 2005, 2:10 UTC, last modified on 15 January 2012, 3:46 UTC
Website Copyright © 2004-2024 Jeff Epler