Skip to main content

EPITA C/C++ Coding Style Checker - validates C and C++ code against EPITA coding standards

Project description

EPITA C/C++ Coding Style Checker

A fast C and C++ linter for EPITA coding style rules. Uses tree-sitter for robust AST-based parsing.

Features

  • C (.c, .h) and C++ (.cc, .hh, .hxx) support
  • 58 rules across file formatting, functions, exports, preprocessor, declarations, control flow, naming, and more
  • AST-based checks via tree-sitter (no regex hacks for structure)
  • clang-format integration with language-specific configs (C vs C++)
  • Configurable via TOML, presets, or CLI flags
  • Pre-commit hook support

Installation

pipx install epita-coding-style

Quick Start

epita-coding-style src/           # Check files/directories
epita-coding-style --list-rules   # List all rules with descriptions
epita-coding-style --show-config  # Show current configuration
epita-coding-style --help         # Full usage info

Example Output

$ epita-coding-style src/
src/rbtree.c:1:1: error: No blank lines at start of file [epita-file.spurious]

src/rbtree.c:307:1: error: 'rb_delete_cases' has 5 args (max 4) [epita-fun.arg.count]
static void rb_delete_cases(struct rb_node **node, struct rb_node **tmp,
src/rbtree.c:12:1: error: 2 exported globals (max 1) [epita-export.other]
src/rbtree.c:1:1: error: 36 lines need formatting [epita-format]

Files: 1  Major: 4  Minor: 0

Fix formatting: clang-format -i src/rbtree.c

Supported File Extensions

Language Source Header
C .c .h
C++ .cc .hh, .hxx

C++ files using .cpp / .hpp will be checked but flagged with a file.ext violation.

Configuration

Configuration is auto-detected from (in order):

  • .epita-style
  • .epita-style.toml
  • epita-style.toml
  • [tool.epita-coding-style] in pyproject.toml

Priority: CLI flags > config file > preset > defaults

Generate a Config File

epita-coding-style --show-config --no-color > .epita-style.toml

This outputs a complete, commented TOML config you can customize.

Presets

epita-coding-style --preset 42sh src/      # 40 lines, goto/cast allowed
epita-coding-style --preset noformat src/  # Same + skip clang-format

Example Config

# .epita-style.toml
max_lines = 40

[rules]
"keyword.goto" = false  # Allow goto
"cast" = false          # Allow casts

Or in pyproject.toml:

[tool.epita-coding-style]
max_lines = 40

[tool.epita-coding-style.rules]
"keyword.goto" = false

Limits

Setting Default (C) Default (C++) Description
max_lines 30 50 Max lines per function body
max_args 4 4 Max arguments per function
max_funcs 10 Max exported functions per file (C only)
max_globals 1 Max exported globals per file (C only)

Rules Overview

Use epita-coding-style --list-rules for the full list. Key categories:

C rules (enabled by default):

  • File — line endings, trailing whitespace, blank lines, file termination
  • Style — Allman brace style
  • Functions — length, argument count, (void) for empty params
  • Exports — max exported functions/globals per .c file
  • Preprocessor — include guards, # column, #endif comments, digraphs
  • Declarations — one per line, no VLAs
  • Control — no empty loop bodies
  • Strict — no goto, no explicit casts
  • Formatting — clang-format compliance

C++ rules (auto-enabled for .cc/.hh/.hxx files):

  • File — correct extensions (.cc/.hh/.hxx, not .cpp/.hpp)
  • Preprocessor#pragma once, include order, no source includes, constexpr
  • Global — C++ casts, no malloc, nullptr, no extern "C", C++ headers, std:: functions
  • Naming — CamelCase classes/structs, lowercase namespaces with closing comments
  • Declarations&/* next to type, explicit constructors, no VLAs
  • Control — switch default case, label padding, no empty loops
  • Writing — empty braces, single-expression braces, throw/catch rules, operator overloads, enum class, function length

clang-format

The format rule uses clang-format to check code formatting. Requires clang-format to be installed.

The checker uses language-specific configs:

  • C: looks for .clang-format-c, then .clang-format
  • C++: looks for .clang-format-cxx, then .clang-format

It searches from the file's directory up to root, falling back to the bundled EPITA configs.

To disable: set "format" = false in your config, or use --preset noformat.

Pre-commit Hook

# .pre-commit-config.yaml
repos:
  - repo: https://github.com/KazeTachinuu/epita-coding-style
    rev: v3.1.0
    hooks:
      - id: epita-coding-style
        args: [--preset, 42sh]  # optional

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

epita_coding_style-3.3.0.tar.gz (38.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

epita_coding_style-3.3.0-py3-none-any.whl (28.8 kB view details)

Uploaded Python 3

File details

Details for the file epita_coding_style-3.3.0.tar.gz.

File metadata

  • Download URL: epita_coding_style-3.3.0.tar.gz
  • Upload date:
  • Size: 38.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for epita_coding_style-3.3.0.tar.gz
Algorithm Hash digest
SHA256 4b032b0146126d570ac08a68dbd2b42220a300d10cd513216a441f9b446909b9
MD5 58ce3fd0829bfc55c41dd803c29ae6b3
BLAKE2b-256 4ae22676a78c69980f006731e4d15f349fb038d9521fc685b3e45840a6b6314b

See more details on using hashes here.

File details

Details for the file epita_coding_style-3.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for epita_coding_style-3.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d7313197fe1884e28ec719b4eee35851b71415b914d5ab1fcd3ef9f4d8589826
MD5 049b179d733f564c6f3817b1e5b82dc0
BLAKE2b-256 addfa794e549961fb1c87605eb6debadc3b95d8f73f23ed87afff651caf1ed43

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page