Supported C language subset (read joint example 'otccex.c' to have an introduction to OTCC dialect): - Expressions: * binary operators, by decreasing priority order: '*' '/' '%', '+' '-', '>>' '<<', '<' '<=' '>' '>=', '==' '!=', '&', '^', '|', '=', '&&', '||'. * '&&' and '||' have the same semantics as C : left to right evaluation and early exit. * Parenthesis are supported. * Unary operators: '&', '*' (pointer indirection), '-' (negation), '+', '!', '~', post fixed '++' and '--'. * Pointer indirection ('*') only works with explicit cast to 'char *', 'int *' or 'int (*)()' (function pointer). * '++', '--', and unary '&' can only be used with variable lvalue (left value). * '=' can only be used with variable or '*' (pointer indirection) lvalue. * Function calls are supported with standard i386 calling convention. Function pointers are supported with explicit cast. Functions can be used before being declared. - Types: only signed integer ('int') variables and functions can be declared. Variables cannot be initialized in declarations. Only old K&R function declarations are parsed (implicit integer return value and no types on arguments). - Any function or variable from the libc can be used because OTCC uses the libc dynamic linker to resolve undefined symbols. - Instructions: blocks ('{' '}') are supported as in C. 'if' and 'else' can be used for tests. The 'while' and 'for' C constructs are supported for loops. 'break' can be used to exit loops. 'return' is used for the return value of a function. - Identifiers are parsed the same way as C. Local variables are handled, but there is no local name space (not a problem if different names are used for local and global variables). - Numbers can be entered in decimal, hexadecimal ('0x' or '0X' prefix), or octal ('0' prefix). - '#define' is supported without function like arguments. No macro recursion is tolerated. Other preprocessor directives are ignored. - C Strings and C character constants are supported. Only '\n', '\"', '\'' and '\\' escapes are recognized. - Both C comments ( /* */ ) and C++ comments ( // ... end-of-line ) can be used. - No error is displayed if an incorrect program is given. - Memory: the code, data, and symbol sizes are limited to 100KB (it can be changed in the source code).