For now, invoke as: ./mcpp -N -k -C -I- -P testarray.c This is the c pre-processor but with '#' directives changed to '$' directives, for use with the C code generated by imptoc. It is *only* here to convert fred[3][4] into fred[(3)-fredbase1][(4)-fredbase2] etc. and to insert array bound checks where possible. #include statements (or indeed any other '#' directives) are passed through, but maybe not verbatim - they can still be expanded if they contain any '$' macros. I'm considering a $begin/$end for scoping local symbols, specifically consts, because C doesn't allow "const" variables in many places where literal constants are allowed. However you probably would not want *all* $defines to go out of scope on a $end so may require new syntax for global $defines vs local ones. Whether I want to go as far as actually generating code at the end of a procedure using the macro processor (eg to create %switch tables) I'm not sure yet. [Note: switch tables could be created using *all* &&lab_001 numbers, and replace the 'default:' test by just instancing the unused ones before a piece of error code (i.e.BADSWITCH()) Also (this is a different thing) I'm sort of thinking about #define macros that can push their parameters onto a local stack for access later by a different macro, so that things like "until (cond) { ... }" can be transformed into "do { ... } while (!cond)" although clearly that would be better handled by the compiler. **NEWS** mcpp may already implement what I want - it has: '#pragma push_macro', and '#pragma pop_macro'