Norminette Checker Skill
Purpose
Automatically check and fix C code according to 42 School's Norminette standards.
When to Use
- •Before committing code
- •When user mentions "norm", "norminette", or "42 style"
- •When creating or modifying .c or .h files
- •During code review
Key Rules
File Structure
- •Header: Must include standard 42 header with filename, author, dates
- •Guards: Header files must have
#ifndef,#define,#endifguards - •Line Length: Maximum 80 characters per line (including newline)
- •Function Length: Maximum 25 lines per function
- •Lines per File: Maximum 5 functions per file (excluding static helpers)
Formatting
- •Indentation: Tabs only (no spaces for indentation)
- •Braces: Opening brace on same line for control structures
c
if (condition) { // code } - •Function Braces: Opening brace on new line
c
int function(void) { // code } - •Spaces:
- •After keywords:
if (,while (,return - •Around operators:
a + b,i = 0 - •No space before semicolon:
foo();notfoo() ;
- •After keywords:
- •Line Breaks:
- •Empty line between functions
- •No multiple empty lines
Naming
- •Functions: lowercase with underscores:
ft_strlen,init_data - •Variables: lowercase with underscores:
last_meal_time,philo_count - •Defines: UPPERCASE with underscores:
#define MAX_PHILOS 200 - •Structs: lowercase with
s_prefix:struct s_philo,typedef struct s_data - •Typedefs: lowercase with
t_prefix:typedef struct s_philo t_philo
Declarations
- •Variables: Declare at beginning of function/block
- •One per Line: Each variable on separate line
c
int i; int count; char *str;
- •Alignment: Align variable names when declaring multiple variables
- •Initialization: Allowed:
int i = 0;on declaration line
Functions
- •Max Parameters: 4 parameters maximum
- •Max Lines: 25 lines per function
- •Prototype: All non-static functions must have prototype in header
- •Return: Must return value or void
- •Empty Line: Between function definition and first statement
Forbidden
- •
forloops (must usewhile) - •Multiple assignments in one line:
a = b = 0; - •Nested ternary operators
- •
switch,case,goto - •Variable-length arrays (VLA)
- •Implicit type conversions
- •Function calls in conditions without proper checks
Common Issues and Fixes
Issue: Line too long
c
// BAD (>80 chars)
printf("Philosopher %d has taken a fork and is eating delicious spaghetti\n", id);
// GOOD
printf("Philosopher %d has taken a fork\n", id);
Issue: Incorrect brace placement
c
// BAD
if (condition) {
code();
}
// GOOD
if (condition)
{
code();
}
Issue: Multiple declarations
c
// BAD int i, j, k; // GOOD int i; int j; int k;
Issue: Forbidden for loop
c
// BAD
for (int i = 0; i < n; i++)
do_something(i);
// GOOD
int i;
i = 0;
while (i < n)
{
do_something(i);
i++;
}
Checking Process
- •Run norminette:
norminette -R CheckForbiddenSourceHeader - •Check each error and warning
- •Fix systematically from top to bottom
- •Re-run until no errors
Auto-Fix Patterns
When fixing code:
- •Preserve logic and functionality
- •Maintain readability
- •Split long lines intelligently
- •Break long functions into smaller helper functions
- •Add static keyword to helper functions
- •Ensure proper alignment and spacing