Find Duplicate Code in C: Deslop Adds C Support Deslop added C language support, parsing .c and .h files with tree-sitter-c and running them through the same fingerprint, sibling-window, token and ranking stages used for its other languages, the tool's documentation announced. The first scan of the Osprey compiler's hand-written C runtime — around 190 files and 46,000 lines — measured 7.5% duplication, mostly repeated test set-up, and surfaced two false positives now pinned by fixtures. Deslop deliberately refuses to count macro definitions, prototypes and flat for-loop headers as clone evidence, treating duplicated macro bodies as a documented false negative. Find Duplicate Code in C: Deslop Adds C Support C support runs through the same structural pipeline as every other Deslop language: tree-sitter parsing instead of regex, identifier and literal normalization instead of raw line matching, worst-offender-first ranking, and live LSP and MCP feedback while the code is changing. .c and .h files are discovered, parsed with tree-sitter-c https://github.com/tree-sitter/tree-sitter-c , and fed into the shared fingerprint, sibling-window, token and ranking stages described in How It Works https://deslop.live/docs/how-it-works/ . Why C, and why now why-c-and-why-now The Osprey https://deslop.live/docs/osprey/ compiler ships a hand-written C runtime: around 190 files and 46,000 lines, compiled with warnings as errors. Its maintainers wanted the same duplication gate over that runtime that they already had over the Osprey and Python sources, and they named the shape they cared about most: copied error-path and cleanup blocks. A loader opens a file, allocates a buffer, reads it, and at each step has an if x == NULL { fprintf ... ; free ... ; return NULL; } rung. The next loader is written by copying the first. One of them later gets the fix. The first scan of that runtime measured 7.5% duplication, mostly repeated test set-up, and it also measured two false positives that are now pinned by fixtures. Both are described below, because what a detector refuses to report matters as much as what it finds. What the C parser sees what-the-c-parser-sees The normalized tree keeps structure and drops spelling: - identifier , field identifier , type identifier , statement identifier and primitive type collapse to one marker, so renaming a function, a struct member or a typedef, or swapping int for long , never hides a copy; - numbers, characters, string contents, escape sequences,