In ANSI C projects, a module can be constituted in a few ways:
Every module comes in one, and only one, of three kinds: logic module, state module, or definition module.
Logic modules can only declare and/or implement pure functions; they may not carry or modify any state whatsoever. This includes modifying state passed in through variable pointers. For any given shallow input, the output must be the same.
State modules have the sole job of managing state. They offer facilities for managing program state, an arduous task that deserves special attention. They should not offer significant logic facilities for the data they manage.
Definition modules contain neither state nor logic per se, but rather just enums, structs, typedefs and #defines used by the program. They are kept separate due to their brevity and difference from the other two kinds of modules.
It is good practise to put a comment at the top of each file, below the boilerplate, denoting what kind of module it is.