Skip to main content

A C/C++ header guard creator and updater

Project description

Header Guardian, a C/C++ header guard creator and updater

This tool can be used to update C/C++ header guards, typically using the header file path to generate unique header guards for each header.

Usage

$ header_guardian --help
usage: header_guardian [-h] (--input INPUT | -r DIR) [--output OUTPUT] [--prefix PREFIX] [--suffix SUFFIX] [--nameroot NAMEROOT]
                      [--create] [--width WIDTH] [--verbose] [--quiet]

Replace header guard with a path-based header guard (from nameroot). Assumes that the relevant preprocessor directives start at column
0 with no extra spacing.

options:
 -h, --help           show this help message and exit
 --input INPUT        Path to input header, or hyphen (-) for stdin (default: )
 -r DIR               Recursively process all .h, .H, .hpp, .HPP files from DIR (default: )
 --output OUTPUT      Path to output file, or hyphen (-) for stdout (default: -)
 --prefix PREFIX      Prefix to add to the filename guard name (default: )
 --suffix SUFFIX      Suffix to add to the filename guard name (default: )
 --nameroot NAMEROOT  Root directory for naming (default is cwd) (default: None)
 --create             Create a header guard if one does not already exist (default: False)
 --width WIDTH        Use a hash instead of text for long lines (default: 0)
 --verbose, -v
 --quiet, -q

Example

Here are some header files without guards:

$ tree .
.
├── directory1a
│   └── directory2
│       └── directory3
│           └── directory4
│               └── directory5
│                   ├── func1.h
│                   └── func2.h
└── directory1b
   └── directory2
       └── directory3
           └── directory4
               └── directory5
                   ├── func3.h
                   └── func4.h

11 directories, 4 files

$ cat directory1a/directory2/directory3/directory4/directory5/func1.h 
void func1();

$ cat directory1a/directory2/directory3/directory4/directory5/func2.h 
void func2();

$ cat directory1b/directory2/directory3/directory4/directory5/func3.h 
void func3();

$ cat directory1b/directory2/directory3/directory4/directory5/func4.h 
void func4();

Updating guards fails because they do not exist:

$ header_guardian --nameroot . --input directory1a/directory2/directory3/directory4/directory5/func1.h --output directory1a/directory2/directory3/directory4/directory5/func1.h
Non-conforming file: directory1a/directory2/directory3/directory4/directory5/func1.h

$ echo $?
1

$ cat directory1a/directory2/directory3/directory4/directory5/func1.h
void func1();

Create guards, one at a time:

$ header_guardian --nameroot . --input directory1a/directory2/directory3/directory4/directory5/func1.h --output directory1a/directory2/directory3/directory4/directory5/func1.h --create
Non-conforming file: directory1a/directory2/directory3/directory4/directory5/func1.h
Creating new guard: directory1a/directory2/directory3/directory4/directory5/func1.h

$ header_guardian --nameroot . --input directory1a/directory2/directory3/directory4/directory5/func2.h --output directory1a/directory2/directory3/directory4/directory5/func2.h --create
Non-conforming file: directory1a/directory2/directory3/directory4/directory5/func2.h
Creating new guard: directory1a/directory2/directory3/directory4/directory5/func2.h

$ header_guardian --nameroot . --input directory1b/directory2/directory3/directory4/directory5/func3.h --output directory1b/directory2/directory3/directory4/directory5/func3.h --create
Non-conforming file: directory1b/directory2/directory3/directory4/directory5/func3.h
Creating new guard: directory1b/directory2/directory3/directory4/directory5/func3.h

$ header_guardian --nameroot . --input directory1b/directory2/directory3/directory4/directory5/func4.h --output directory1b/directory2/directory3/directory4/directory5/func4.h --create
Non-conforming file: directory1b/directory2/directory3/directory4/directory5/func4.h
Creating new guard: directory1b/directory2/directory3/directory4/directory5/func4.h

$ echo $?
0

$ cat directory1a/directory2/directory3/directory4/directory5/func1.h
#ifndef DIRECTORY1A_DIRECTORY2_DIRECTORY3_DIRECTORY4_DIRECTORY5_FUNC1_H
#define DIRECTORY1A_DIRECTORY2_DIRECTORY3_DIRECTORY4_DIRECTORY5_FUNC1_H

void func1();

#endif  // DIRECTORY1A_DIRECTORY2_DIRECTORY3_DIRECTORY4_DIRECTORY5_FUNC1_H

$ cat directory1b/directory2/directory3/directory4/directory5/func4.h
#ifndef DIRECTORY1B_DIRECTORY2_DIRECTORY3_DIRECTORY4_DIRECTORY5_FUNC4_H
#define DIRECTORY1B_DIRECTORY2_DIRECTORY3_DIRECTORY4_DIRECTORY5_FUNC4_H

void func4();

#endif  // DIRECTORY1B_DIRECTORY2_DIRECTORY3_DIRECTORY4_DIRECTORY5_FUNC4_H

Update directory1a headers automatically, adding a guard macro name prefix:

$ header_guardian --prefix SYS1_ --nameroot . -r directory1a

$ echo $?
0

$ cat directory1a/directory2/directory3/directory4/directory5/func2.h 
#ifndef SYS1_DIRECTORY1A_DIRECTORY2_DIRECTORY3_DIRECTORY4_DIRECTORY5_FUNC2_H
#define SYS1_DIRECTORY1A_DIRECTORY2_DIRECTORY3_DIRECTORY4_DIRECTORY5_FUNC2_H

void func2();

#endif  // SYS1_DIRECTORY1A_DIRECTORY2_DIRECTORY3_DIRECTORY4_DIRECTORY5_FUNC2_H

$ cat directory1b/directory2/directory3/directory4/directory5/func4.h
#ifndef DIRECTORY1B_DIRECTORY2_DIRECTORY3_DIRECTORY4_DIRECTORY5_FUNC4_H
#define DIRECTORY1B_DIRECTORY2_DIRECTORY3_DIRECTORY4_DIRECTORY5_FUNC4_H

void func4();

#endif  // DIRECTORY1B_DIRECTORY2_DIRECTORY3_DIRECTORY4_DIRECTORY5_FUNC4_H

Make sure that the width of guard lines does not go over 40 columns, by using a hash:

$ header_guardian --nameroot . -r directory1b --width 40

$ cat directory1b/directory2/directory3/directory4/directory5/func3.h 
#ifndef HASH_E31CC83282930C6D2EB2A91C26ABFDE3
#define HASH_E31CC83282930C6D2EB2A91C26ABFDE3

void func3();

#endif  // HASH_E31CC83282930C6D2EB2A91C26ABFDE3

$ cat directory1b/directory2/directory3/directory4/directory5/func4.h 
#ifndef HASH_13EF278DE3829713E022DF6000B9CD74
#define HASH_13EF278DE3829713E022DF6000B9CD74

void func4();

#endif  // HASH_13EF278DE3829713E022DF6000B9CD74

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

header_guardian-0.0.1.tar.gz (5.8 kB view details)

Uploaded Source

Built Distribution

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

header_guardian-0.0.1-py3-none-any.whl (6.5 kB view details)

Uploaded Python 3

File details

Details for the file header_guardian-0.0.1.tar.gz.

File metadata

  • Download URL: header_guardian-0.0.1.tar.gz
  • Upload date:
  • Size: 5.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for header_guardian-0.0.1.tar.gz
Algorithm Hash digest
SHA256 f68e0e98d7206208ec119c4264af63fa2e044398403d3559d257ad129bac1d47
MD5 2529166959e1cd640cb22ba23fdad091
BLAKE2b-256 e48fbc4d2c64c68fd9828233dcd8eac4cfacbeaca6ddb5245201d49e18203be4

See more details on using hashes here.

File details

Details for the file header_guardian-0.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for header_guardian-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3cb004d5628fd5c4bd9980c71f77f48bd09ed8a890d042ab2bc5f482cb680ad2
MD5 a62b14cfbc3b94fff0f87f63deb0aed1
BLAKE2b-256 6dece00f5f1c0761d8353c6dfd094d124e6547bcdd2db3acdd17707bd9b7b822

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