My feeling is that an engine is a chunk of code that has a interface, but also is clearly defined to have the intention of being reused. Furthermore, an engine must also be defined to cover some complete portion of a project.

For example, a graphics engine is defined to be an object or battery of functions that are called exclusively for graphics and covers all functionality for graphics.

However, I feel that this definition is still rough...