> Anybody see a smoking gun? I don't really know what seg is supposed to be
> doing, so I don't know where to start.
As crazy idea only: try to modify seg_overlap to
bool
seg_overlap(SEG * a, SEG * b)
{
     return (
             ((a->upper >= b->upper) && (a->lower <= b->upper))
             ||
             ((b->upper >= a->upper) && (b->lower <= a->upper))
         ) ? true : false;
}
-- 
Teodor Sigaev                                   E-mail: teodor(at)sigaev(dot)ru
                                                    WWW: http://www.sigaev.ru/