Development has stalled.
Lots of valiant effort, but still no release. Every bug you fix exposes two more; every new feature breaks two old ones. You have critical bugs you just can't fix.
The problem is that when you started this you could not anticipate all the different uses it would be put to. Each new requirement has added a thin layer of crud, but now the crud is too deep.
The cohesion in the original design has been lost. Routines intended for one purpose have been co-opted for others. Routines that once did only one thing now do a grab-bag of unrelated operations all at the same time. Structures now have flags in them to change the way that they are intepreted. Routines have arguments which they never use, but only pass on to other routines.
If this was a ship, you would take it into dry dock for a complete re-fit.
I can re-engineer key components to give a consistent and simple interface and a robust and flexible implementation.
I have done this many time in embedded application areas as diverse as printers, medical devices, data switches and astronomical instruments.