What methods, practices and conventions do you know of to modularize C code as a project grows in size?
OO techniques can be applied to C code, they just require more discipline.
stdio library -- everything is organised around the opaque FILE* handle. Many successful libraries are organised around this principle (e.g. zlib, apr)structs are implicitly public in C, you need a convention + programmer discipline to enforce the useful technique of information hiding. Pick a simple, automatically checkable convention such as "private members end with '_'".