C++ C D Python Objective-C C# Other
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
.github adds ISSUE_TEMPLATE Nov 14, 2016
cmake inject CodeCoverage dependencies from the main CMakeLists.txt Jun 17, 2018
documentation make default files May 17, 2018
emscripten update emscripten interface Jun 10, 2018
etc make default files May 17, 2018
lnt add explanation about *.lnt files Jan 21, 2017
man Remove old build system files Sep 27, 2016
osx Add missing osx directory. Oct 25, 2009
scripts Run CTest tests in parallel Jul 3, 2018
src Merge pull request #1945 from mwoehlke/use-option-accessors Aug 20, 2018
tests To test bom and the case char_encoding_e::e_UTF8: at write_bom Aug 19, 2018
.editorconfig Added .editorconfig files that matches current Uncrustify style Jul 22, 2016
.gitattributes update .gitattributes Mar 9, 2018
.gitignore Clean up and "modernize" .gitignore Jun 22, 2018
.travis.yml Don't enable testing on CI cross-compile Jul 10, 2018
AUTHORS The actual list of collaborators Aug 25, 2016
BUGS Change to GitHub Jul 29, 2016
CMakeLists.txt Create accessors for options Aug 15, 2018
CONTRIBUTING.md Update contribute guidelines after receiving feedback Jan 26, 2017
COPYING Import r1644 from subversion Oct 17, 2009
ChangeLog Add sp_sizeof_ellipsis_paren option Jun 20, 2018
Comments.txt prepare the configuration file for the sources Apr 25, 2016
HELP Change to GitHub Jul 29, 2016
LIMITATIONS.txt Control the length of the token names May 25, 2018
NEWS Import r1644 from subversion Oct 17, 2009
README.md merge master and fixed conflicts Jun 22, 2018
TESTING Prepare the version 0.66 Nov 3, 2017
appveyor.yml Run CTest tests in parallel Jul 3, 2018
commit.log Update ChangeLog and commit.log Feb 3, 2016
coverity.sh Missed an 'exit' when the NOTIFICATION_EMAIL is blank. Jan 26, 2017
coverity.travis.yml Coverity: Add a travis.yml file and script to push code to coverity Jan 26, 2017
extras.vpj Add a few files to the workspace Jan 1, 2013
forUncrustifySources.cfg Set align_var_def_amp_style for uncrustify sources Aug 7, 2018
forUncrustifySources.txt uncrustify all the sources with forUncrustifySources.cfg Apr 27, 2016
package.json update some more files to prepare 0.67 May 14, 2018
release-steps.txt Update the file May 17, 2018
run_tests.bat correct the file Mar 14, 2018
run_tests.sh ./run_tests.sh and .bat root scripts were unable to locate a relative… Aug 11, 2016
uncrustify.vpj update at new May 27, 2018
uncrustify.vpw Update SlickEdit project files Oct 9, 2011
working.txt save off work in the freebsd branch Dec 5, 2009


Travis CI Travis CI AppVeyor Coverity Coverage Status


A source code beautifier for C, C++, C#, ObjectiveC, D, Java, Pawn and VALA


  • highly configurable - 639 configurable options as of version 0.67
  • add/remove spaces
    • sp_before_sparen: Add or remove space before '(' of 'if', 'for', 'switch', 'while', etc.
    • sp_compare: Add or remove space around compare operator '<', '>', '==', etc
  • add/remove newlines
    • nl_if_brace: Add or remove newline between 'if' and '{'
    • nl_brace_while: Add or remove newline between '}' and 'while' of 'do' statement
  • add/remove blanklines
    • eat_blanks_before_close_brace: Whether to remove blank lines before '}'
    • nl_max: The maximum consecutive newlines (3 = 2 blank lines)
  • indent code
    • indent_switch_case: indent_switch_case: Spaces to indent 'case' from 'switch'
    • indent_class_colon: Whether to indent the stuff after a leading base class colon
  • align code
    • align_func_params: Align variable definitions in prototypes and functions
    • align_struct_init_span: The span for aligning struct initializer values (0=don't align)
  • modify code
    • mod_full_brace_for: Add or remove braces on single-line 'for' statement
    • mod_paren_on_return: Add or remove unnecessary paren on 'return' statement

Here is an example configuration file, and here is a before and after C source example. That should give you a pretty good idea of what Uncrustify can do.


Pre compiled binaries for Windows can be downloaded here.


Python is an "interpreted high-level programming language for general-purpose programming", for this project it is needed to extend the capabilities of CMake.

CMake is a tool that generates build systems (Makefiles, Visual Studio project files, Xcode project files and others).

To generate a build system for Uncrustify using CMake, create a build folder and run CMake from it:

$ mkdir build
$ cd build
$ cmake ..

(Use cmake -G Xcode .. for Xcode)

Then use the build tools of your build system (in many cases this will simply be make, but on Windows it could be MSBuild or Visual Studio). Or use CMake to invoke it:

$ cmake --build .

If testing is enabled, CMake generates a test target, which you can build using your build system tools (usually make test). This can also be invoked using CTest:

$ ctest -V -C Debug

There is also an install target, which can be used to install the Uncrustify executable (typically make install).

A note on CMake configurations

Some build systems are single-configuration, which means you specify the build type when running CMake (by setting the CMAKE_BUILD_TYPE variable), and the generated files then build that configuration.

An example of a single-configuration build system are Makefiles. You can build the Release configuration of Uncrustify (from the build folder) with:

$ cmake -DCMAKE_BUILD_TYPE=Release ..
$ make

Other build systems are multi-configuration, which means you specify the build type when building.

An example of a multi-configuration build system are Visual Studios project files. When you open the project in Visual Studio, you can select which configuration to build. You can also do this while building from the command line with cmake --build . --config Release.


Post any bugs to the issue tracker found on the projects GitHub page: https://github.com/uncrustify/uncrustify/issues

Please include the following with your issue:

  • a description of what is not working right
  • input code sufficient to demonstrate the issue
  • expected output code
  • configuration options used to generate the output

More about this is in the ISSUE_TEMPLATE

Known problems

Look at the Wiki

Which repositories have uncrustify?

Look here


If you want to add a feature, fix a bug, or implement missing functionality, feel free to do so! Patches are welcome! Here are some areas that need attention:

  • Patches for Objective-C support. We really need someone who knows this language as it has more than plenty open issues. A good starting point would be to integrate changes made in the Unity fork
  • Test Java support and provide feedback (or patches!)
  • Test Embedded SQL to see what works
  • A logo of some sort
  • Anything else that you want to do to make it better?

A note about pull requests

Firstly take a look at the CONTRIBUTING.md

Currently we have two continuous integration systems that test your PRs, TravisCI and Appveyor. Tested are the test cases, the formatting of the code base and the output of the command line options.

Test cases can be found in the tests/ directory. Every file ending with .test is a test set. Inside each line with these components is a single test: testNr[!] testConfigFileName testInputFileName [lang]

The configuration file testConfigFileName has to be located inside tests/config, the input file testInputFileName inside tests/input/<testSetName>/, and expected results file inside the tests/output/<testSetName>/ directory. Expected results have the following naming convention: testNr-testConfigFileName.

Optionally a ! can follow the testNr to enable a custom rerun configuration. Rerun configurations need to be named like this: testConfigFileName(without extension)+.rerun+.exension

Also, optionally a language for the input can be provided with lang.

The codebase has to be formatted by the options set up in forUncrustifySources.cfg. Failing to format the sources correctly will cause TravisCI build failures.

The Command line interface (CLI) output is tested by the test_cli_options.sh script. It is located inside of tests/cli/ and operates on the subdirectories of that folder.

If a PR is altering the CLI output, files inside those directories might need to be manually updated. This often happens when options are added, removed or altered. Keep in mind that the version string line (example: # Uncrustify-0.65_f) of outputs from commands like --show-config should be replaced with a blank line.


We are pretty sure that nothing OS-specific is used in the code base. The software has been previously tested on the following operating systems:

  • Linux
  • QNX
  • OS X
  • FreeBSD, NetBSD, OpenBSD
  • Sun Solaris 9
  • Windows (binary available)

Running the program

NOTE This application works reasonably well but it has bugs. Do not apply it on your whole codebase without checking the results!

Here are ways to run it:

$ uncrustify -c mystyle.cfg -f somefile.c -o somefile.c.unc
$ uncrustify -c mystyle.cfg -f somefile.c > somefile.c.unc
$ uncrustify -c mystyle.cfg somefile.c
$ uncrustify -c mystyle.cfg --no-backup somefile.c
$ uncrustify -c mystyle.cfg *.c
$ uncrustify -c mystyle.cfg --no-backup *.c

The -c flag selects the configuration file. The -f flag specifies the input file. The -o flag specifies the output file. If flag -f is used without flag -o the output will be send to stdout.

Alternatively multiple or single files that should be processed can be specified at the command end without flags. If the flag --no-backup is missing, every file saved with the initial name and an additional suffix (can be changed with --suffix).

For more options descriptions call:

$ uncrustify -h

Configuring the program

Uncrustify usually reads configuration files that are passed via the -c flag. If the flag is not provided Uncrustify will try to find a configuration file via the UNCRUSTIFY_CONFIG environment variable or a file with the name uncrustify or .uncrustify in your home folder.

To get a list of:

  • all available options use:

    uncrustify --show-config
  • all available options in a usable configuration file format use:

    uncrustify --update-config


    uncrustify --update-config-with-doc

    As the names suggest both options can produce output that adds newly introduced options to your old configuration file. For this your old configuration file has to be passed via the -c flag:

    uncrustify --update-config-with-doc -c path/to/your.cfg

Example configuration files that can be used as a starting point can be found in the etc/ directory (such as ben.cfg).

Modify to your liking. Use a quality side-by-side diff tool to determine if the program did what you wanted. Repeat until your style is refined.

To ease the process a bit, some 3rd party tools are available:

  • Universal Indent GUI - A cross-platform graphical configuration file editor for many code beautifiers, including Uncrustify.
  • uncrustify_config - A web configuration tool based on Uncrustifys emscripten interface.
  • UncrustifyX - Uncrustify utility and documentation browser for Mac OS X