From man qsort:
SYNOPSIS
#include <stdlib.h>
void qsort(void *base, size_t nel, size_t width,
int (*compar)(const void *, const void *));
DESCRIPTION
The qsort() function shall sort an array of nel objects, the initial
element of which is pointed to by base. The size of each object, in
bytes, is specified by the width argument. If the nel argument has the
value zero, the comparison function pointed to by compar shall not be
called and no rearrangement shall take place.
The application shall ensure that the comparison function pointed to
by compar does not alter the contents of the array. The implementa-
tion may reorder elements of the array between calls to the comparison
function, but shall not alter the contents of any individual element.
So, the line you inquire about is passing a function to qsort based on the flags to the program. That function - in either case - will operate on the lineptr variable.
The numeric ? numcmp : strcmp portion of that simply decides whether to use a numeric sorting routine or a string sorting routine using a ternary operator . The (int (*)(void*, void*)) goop preceding that is just a cast to the appropriate type required by qsort (function accepting two void pointers returning an int).
As for what the code does step-by-step, I'd suggest you inject print statements into the code to see for yourself.