333 lines
5.5 KiB
Markdown
333 lines
5.5 KiB
Markdown
# Common Language Quick Reference
|
|
|
|
## Compilation
|
|
|
|
```bash
|
|
./common source.cm output.asm
|
|
nasm -f elf32 output.asm -o output.o
|
|
gcc -m32 output.o -o program
|
|
```
|
|
|
|
## Types
|
|
|
|
```c
|
|
void // No return value
|
|
int8 int16 int32 int64 // Signed integers
|
|
uint8 uint16 uint32 uint64 // Unsigned integers
|
|
type* // Pointer to type
|
|
type[N] // Array of N elements
|
|
```
|
|
|
|
## Variables
|
|
|
|
```c
|
|
int32 x; // Declaration
|
|
int32 y = 42; // Initialization
|
|
int32 arr[10]; // Array
|
|
int32 nums[3] = {1, 2, 3}; // Array with initializer
|
|
int32 *ptr; // Pointer
|
|
```
|
|
|
|
## Operators
|
|
|
|
### Arithmetic
|
|
```c
|
|
+ - * / % // Add, Sub, Mul, Div, Mod
|
|
```
|
|
|
|
### Comparison
|
|
```c
|
|
== != < <= > >= // Equal, Not-equal, Less, etc.
|
|
```
|
|
|
|
### Logical
|
|
```c
|
|
&& || ! // AND, OR, NOT (short-circuit)
|
|
```
|
|
|
|
### Bitwise
|
|
```c
|
|
& | ^ ~ // AND, OR, XOR, NOT
|
|
<< >> // Left shift, Right shift
|
|
```
|
|
|
|
### Assignment
|
|
```c
|
|
= += -= *= /= %= // Assign, Add-assign, etc.
|
|
&= |= ^= <<= >>= // Bitwise assign ops
|
|
```
|
|
|
|
### Increment/Decrement
|
|
```c
|
|
++ -- // Increment, Decrement (pre/post)
|
|
```
|
|
|
|
### Pointer/Array
|
|
```c
|
|
&x // Address of x
|
|
*ptr // Dereference ptr
|
|
arr[i] // Array index (same as *(arr+i))
|
|
```
|
|
|
|
### Ternary
|
|
```c
|
|
cond ? true_val : false_val // Conditional expression
|
|
```
|
|
|
|
## Control Flow
|
|
|
|
### If-Else
|
|
```c
|
|
if (condition)
|
|
statement;
|
|
|
|
if (condition) {
|
|
statements;
|
|
} else {
|
|
statements;
|
|
}
|
|
```
|
|
|
|
### While Loop
|
|
```c
|
|
while (condition) {
|
|
statements;
|
|
}
|
|
```
|
|
|
|
### For Loop
|
|
```c
|
|
for (int32 i = 0; i < n; i++) {
|
|
statements;
|
|
}
|
|
```
|
|
|
|
### Switch
|
|
```c
|
|
switch (expr) {
|
|
case 1:
|
|
statements;
|
|
break;
|
|
case 2:
|
|
statements;
|
|
break;
|
|
default:
|
|
statements;
|
|
}
|
|
```
|
|
|
|
### Break/Continue/Return
|
|
```c
|
|
break; // Exit loop or switch
|
|
continue; // Next loop iteration
|
|
return; // Return from void function
|
|
return expr; // Return value
|
|
```
|
|
|
|
## Functions
|
|
|
|
### Declaration
|
|
```c
|
|
int32 add(int32 a, int32 b); // Forward declaration
|
|
```
|
|
|
|
### Definition
|
|
```c
|
|
int32 add(int32 a, int32 b) {
|
|
return a + b;
|
|
}
|
|
```
|
|
|
|
### No Parameters
|
|
```c
|
|
void func(void) {
|
|
// ...
|
|
}
|
|
```
|
|
|
|
### Main Function
|
|
```c
|
|
int32 main(void) {
|
|
// Entry point
|
|
return 0;
|
|
}
|
|
```
|
|
|
|
## Pointers
|
|
|
|
```c
|
|
int32 x = 42;
|
|
int32 *p = &x; // p points to x
|
|
*p = 100; // Set x to 100 via pointer
|
|
int32 y = *p; // Read through pointer
|
|
```
|
|
|
|
## Arrays
|
|
|
|
```c
|
|
int32 arr[5]; // Declare
|
|
arr[0] = 10; // Set element
|
|
int32 x = arr[2]; // Get element
|
|
|
|
// Array initialization
|
|
int32 nums[5] = {1, 2, 3, 4, 5};
|
|
|
|
// Arrays decay to pointers
|
|
int32 *p = arr; // p points to arr[0]
|
|
```
|
|
|
|
## Strings
|
|
|
|
```c
|
|
uint8 *str = "Hello"; // String literal
|
|
printf("%s\n", str); // Print string
|
|
|
|
// String as array
|
|
uint8 msg[] = "Hello";
|
|
msg[0] = 'h'; // Modify
|
|
```
|
|
|
|
## Comments
|
|
|
|
```c
|
|
// Single-line comment
|
|
|
|
/* Multi-line
|
|
comment */
|
|
```
|
|
|
|
## Type Casting
|
|
|
|
```c
|
|
(type)expression // Cast to type
|
|
|
|
int32 x = 1000;
|
|
uint8 y = (uint8)x; // Truncate to 8 bits
|
|
|
|
uint8 *s = (uint8*)"string"; // Pointer cast
|
|
```
|
|
|
|
## Common Patterns
|
|
|
|
### Swap
|
|
```c
|
|
void swap(int32 *a, int32 *b) {
|
|
int32 temp = *a;
|
|
*a = *b;
|
|
*b = temp;
|
|
}
|
|
```
|
|
|
|
### String Length
|
|
```c
|
|
int32 strlen(uint8 *s) {
|
|
int32 len = 0;
|
|
while (s[len]) len++;
|
|
return len;
|
|
}
|
|
```
|
|
|
|
### Array Sum
|
|
```c
|
|
int32 sum(int32 *arr, int32 n) {
|
|
int32 total = 0;
|
|
for (int32 i = 0; i < n; i++)
|
|
total += arr[i];
|
|
return total;
|
|
}
|
|
```
|
|
|
|
### Min/Max
|
|
```c
|
|
int32 min(int32 a, int32 b) {
|
|
return (a < b) ? a : b;
|
|
}
|
|
|
|
int32 max(int32 a, int32 b) {
|
|
return (a > b) ? a : b;
|
|
}
|
|
```
|
|
|
|
## Calling C Functions
|
|
|
|
```c
|
|
// Declare before use
|
|
void printf(uint8 *fmt, ...);
|
|
void *malloc(uint32 size);
|
|
void free(void *ptr);
|
|
|
|
// Use
|
|
printf("Value: %d\n", x);
|
|
void *mem = malloc(100);
|
|
free(mem);
|
|
```
|
|
|
|
## Operator Precedence (High to Low)
|
|
|
|
1. `()` `[]` `.` `->`
|
|
2. `!` `~` `++` `--` `+` `-` `*` `&` (unary) `(cast)`
|
|
3. `*` `/` `%`
|
|
4. `+` `-`
|
|
5. `<<` `>>`
|
|
6. `<` `<=` `>` `>=`
|
|
7. `==` `!=`
|
|
8. `&`
|
|
9. `^`
|
|
10. `|`
|
|
11. `&&`
|
|
12. `||`
|
|
13. `?:`
|
|
14. `=` `+=` `-=` etc.
|
|
|
|
## Limitations
|
|
|
|
- No structs/unions (use arrays)
|
|
- No enums (use int32 constants)
|
|
- No floats (integers only)
|
|
- No preprocessor (#define, #include)
|
|
- Single file compilation only
|
|
- 1D arrays only (simulate 2D: `arr[row*width+col]`)
|
|
- No goto
|
|
- No static/extern keywords
|
|
- 64-bit types partially supported
|
|
|
|
## Common Gotchas
|
|
|
|
```c
|
|
// Assignment vs. Equality
|
|
if (x = 5) // WRONG: assigns 5 to x
|
|
if (x == 5) // RIGHT: compares x to 5
|
|
|
|
// Array indexing
|
|
int32 arr[10];
|
|
arr[10] = 0; // WRONG: out of bounds
|
|
arr[9] = 0; // RIGHT: last element
|
|
|
|
// Pointer arithmetic scales by type size
|
|
int32 *p = arr;
|
|
p + 1; // Points 4 bytes ahead (size of int32)
|
|
|
|
// Semicolons required
|
|
if (x > 0)
|
|
y = 1 // WRONG: missing semicolon
|
|
|
|
if (x > 0)
|
|
y = 1; // RIGHT
|
|
```
|
|
|
|
## Error Messages
|
|
|
|
```
|
|
line N: syntax error near 'token'
|
|
line N: Unknown char 'X'
|
|
line N: expected expression
|
|
line N: too many locals/globals/strings
|
|
```
|
|
|
|
Check:
|
|
- Missing semicolons
|
|
- Mismatched braces/parentheses
|
|
- Undeclared variables
|
|
- Type mismatches
|
|
- Buffer limits exceeded
|