<commit_before># Dirent

Dirent is a programming interface for retrieving information about files and
directories in C and C++ languages.  This project provides a Dirent interface
for Microsoft Visual Studio.


# Installation

Download the latest Dirent installation package from
[GitHub](https://github.com/tronkko/dirent/releases) and
unpack the installation file with 7-zip, for example.  The installation
package contains ``include/dirent.h`` file as well as a few example and test
programs.

To make Dirent available to all C/C++ projects in your machine, simply copy
``include/dirent.h`` file to the system include directory, e.g.
``C:\Program Files\Microsoft Visual Studio 9.0\VC\include``.  Everything you
need is included in the single ``dirent.h`` file, and you can start using
Dirent immediately -- there is no need to add files to your Visual Studio
project.

Alternatively, if you wish to distribute ``dirent.h`` alongside with your own
project, then copy ``include/dirent.h`` file to a new sub-directory within
your project and add that directory to include path on Windows while omitting
the directory under Linux/UNIX.  This allows your project to be compiled
against native ``dirent.h`` on Linux/UNIX while substituting the functionality
on Microsoft Windows.


# Example Programs

The installation package contains six example programs:

Program  | Purpose
-------- | -----------------------------------------------------------------
ls       | List files in a directory, e.g. ls "c:\Program Files"
find     | Find files in subdirectories, e.g. find "c:\Program Files\CMake"
updatedb | Build database of files in a drive, e.g. updatedb c:\
locate   | Locate a file from database, e.g. locate notepad
scandir  | Demonstrate scandir() function
cat      | Print a text file to screen

In order to build the example programs, first install
[CMake](https://cmake.org/) to your machine.  Then, open command prompt and
create a temporary directory ``c:\temp\dirent`` for the build files as

```
c:\
mkdir temp
mkdir temp\dirent
cd temp\dirent
```

Generate build files as

```
cmake d:\dirent
```

where ``d:\dirent`` is the root directory of the Dirent package containing
this README.md file.

Once CMake is finished, open Visual Studio, load the generated ``dirent.sln``
file from the build directory and build the whole solution.

Once the build completes, open command prompt and run the example programs ls,
find, updatedb and locate from the command prompt as

```
cd c:\temp\dirent\Debug
ls .
find .
updatedb c:\
locate cmd.exe
```

Visual Studio project also contains a solution named ``check`` which can be
used to verify that Dirent API works as expected.  Just build the solution
from Visual Studio to run the test programs.


# UTF-8 Support

By default, file and directory names in the Dirent API are expressed in the
currently selected windows codepage.  If you wish to use UTF-8 character
encoding instead, then replace the main function with \_main function and add
the following stub after your main function:

```
#ifdef _MSC_VER
int wmain(int argc, wchar_t *argv[])
{
	/* Select UTF-8 locale */
	setlocale(LC_ALL, ".utf8");
	SetConsoleCP(CP_UTF8);
	SetConsoleOutputCP(CP_UTF8);

	/* Allocate memory for multi-byte argv table */
	char **mbargv;
	mbargv = (char**) malloc(argc * sizeof(char*));
	if (!mbargv) {
		puts("Out of memory");
		exit(3);
	}

	/* Convert each argument in argv to UTF-8 */
	for (int i = 0; i < argc; i++) {
		size_t n;
		wcstombs_s(&n, NULL, 0, argv[i], 0);

		/* Allocate room for ith argument */
		mbargv[i] = (char*) malloc(n);
		if (!mbargv[i]) {
			puts("Out of memory");
			exit(3);
		}

		/* Convert ith argument to utf-8 */
		wcstombs_s(NULL, mbargv[i], n, argv[i], n);
	}

	/* Pass UTF-8 converted arguments to the main program */
	int errorcode = _main(argc, mbargv);

	/* Release UTF-8 arguments */
	for (int i = 0; i < argc; i++) {
		free(mbargv[i]);
	}

	/* Release the argument table */
	free(mbargv);
	return errorcode;
}
#else
int main(int argc, char *argv[])
{
	return _main(argc, argv);
}
#endif
```

The stub converts file names from command line to UTF-8 and allows your
program to receive file names correctly irrespective of the current windows
code page.

For more information on UTF-8 support, please see setlocale in Visual Studio
[C runtime library reference](https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=msvc-160#utf-8-support).


# Contributing

We love to receive contributions from you.  See the
[CONTRIBUTING](CONTRIBUTING.md) file for details.


# Copying

Dirent may be freely distributed under the MIT license.  See the
[LICENSE](LICENSE) file for details.


# Alternatives to Dirent

I ported Dirent to Microsoft Windows in 1998 when only a few alternatives
were available.  However, the situation has changed since then and nowadays
both [Cygwin](http://www.cygwin.com) and [MingW](http://www.mingw.org)
allow you to compile a great number of UNIX programs in Microsoft Windows.
They both provide a full Dirent API as well as many other UNIX APIs.  MingW
can even be used for commercial applications!

<commit_msg>Add du to example programs<commit_after># Dirent

Dirent is a programming interface for retrieving information about files and
directories in C and C++ languages.  This project provides a Dirent interface
for Microsoft Visual Studio.


# Installation

Download the latest Dirent installation package from
[GitHub](https://github.com/tronkko/dirent/releases) and
unpack the installation file with 7-zip, for example.  The installation
package contains ``include/dirent.h`` file as well as a few example and test
programs.

To make Dirent available to all C/C++ projects in your machine, simply copy
``include/dirent.h`` file to the system include directory, e.g.
``C:\Program Files\Microsoft Visual Studio 9.0\VC\include``.  Everything you
need is included in the single ``dirent.h`` file, and you can start using
Dirent immediately -- there is no need to add files to your Visual Studio
project.

Alternatively, if you wish to distribute ``dirent.h`` alongside with your own
project, then copy ``include/dirent.h`` file to a new sub-directory within
your project and add that directory to include path on Windows while omitting
the directory under Linux/UNIX.  This allows your project to be compiled
against native ``dirent.h`` on Linux/UNIX while substituting the functionality
on Microsoft Windows.


# Example Programs

The installation package contains example programs:

Program  | Purpose
-------- | -----------------------------------------------------------------
ls       | List files in a directory, e.g. ls "c:\Program Files"
find     | Find files in subdirectories, e.g. find "c:\Program Files\CMake"
updatedb | Build database of files in a drive, e.g. updatedb c:\
locate   | Locate a file from database, e.g. locate notepad
scandir  | Printed sorted list of file names in a directory, e.g. scandir .
du       | Compute disk usage, e.g. du "C:\Program Files"
cat      | Print a text file to screen, e.g. cat include/dirent.h

In order to build the example programs, first install
[CMake](https://cmake.org/) to your machine.  Then, open command prompt and
create a temporary directory ``c:\temp\dirent`` for the build files as

```
c:\
mkdir temp
mkdir temp\dirent
cd temp\dirent
```

Generate build files as

```
cmake d:\dirent
```

where ``d:\dirent`` is the root directory of the Dirent package containing
this README.md file.

Once CMake is finished, open Visual Studio, load the generated ``dirent.sln``
file from the build directory and build the whole solution.

Once the build completes, open command prompt and cd to the Debug directory to
run the example programs.  For example:

```
cd c:\temp\dirent\Debug
.\ls .
```

Visual Studio project also contains a solution named ``check`` which can be
used to verify that Dirent API works as expected.  Just build the solution
from Visual Studio to run the test programs.


# UTF-8 Support

By default, file and directory names in the Dirent API are expressed in the
currently selected windows codepage.  If you wish to use UTF-8 character
encoding, then replace the main function with \_main function and convert
wide-character arguments to UTF-8 strings as demonstrated in the snippet
below.

```
/* This is your true main function */
static int
_main(int argc, wchar_t *argv[])
{
	/* ... */
}

/* Convert arguments to UTF-8 */
#ifdef _MSC_VER
int
wmain(int argc, wchar_t *argv[])
{
	/* Select UTF-8 locale */
	setlocale(LC_ALL, ".utf8");
	SetConsoleCP(CP_UTF8);
	SetConsoleOutputCP(CP_UTF8);

	/* Allocate memory for multi-byte argv table */
	char **mbargv;
	mbargv = (char**) malloc(argc * sizeof(char*));
	if (!mbargv) {
		puts("Out of memory");
		exit(3);
	}

	/* Convert each argument in argv to UTF-8 */
	for (int i = 0; i < argc; i++) {
		size_t n;
		wcstombs_s(&n, NULL, 0, argv[i], 0);

		/* Allocate room for ith argument */
		mbargv[i] = (char*) malloc(n);
		if (!mbargv[i]) {
			puts("Out of memory");
			exit(3);
		}

		/* Convert ith argument to utf-8 */
		wcstombs_s(NULL, mbargv[i], n, argv[i], n);
	}

	/* Pass UTF-8 converted arguments to the main program */
	int errorcode = _main(argc, mbargv);

	/* Release UTF-8 arguments */
	for (int i = 0; i < argc; i++) {
		free(mbargv[i]);
	}

	/* Release the argument table */
	free(mbargv);
	return errorcode;
}
#else
int main(int argc, char *argv[])
{
	return _main(argc, argv);
}
#endif
```

For more information on UTF-8 support, please see setlocale in Visual Studio
[C runtime library reference](https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=msvc-160#utf-8-support).


# Contributing

We love to receive contributions from you.  See the
[CONTRIBUTING](CONTRIBUTING.md) file for details.


# Copying

Dirent may be freely distributed under the MIT license.  See the
[LICENSE](LICENSE) file for details.


# Alternatives to Dirent

I ported Dirent to Microsoft Windows in 1998 when only a few alternatives
were available.  However, the situation has changed since then and nowadays
both [Cygwin](http://www.cygwin.com) and [MingW](http://www.mingw.org)
allow you to compile a great number of UNIX programs in Microsoft Windows.
They both provide a full Dirent API as well as many other UNIX APIs.  MingW
can even be used for commercial applications!


{'fraction_non_alphanumeric': 0.10664739884393064, 'fraction_numerical': 0.0056840077071290945, 'mean_word_length': 3.7488563586459285, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 3, 'https://': 6, 'lorem ipsum': 0, 'www.': 4, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7400254', 'n_tokens_mistral': 3180, 'n_tokens_neox': 3008, 'n_words': 1358}