---
name: "mkstr"
section: "1"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["freebsd"]
url: "https://new.carta.tech/mkstr"
---

# mkstr(1)

create an error message file by massaging C source

## NAME

**mkstr** – create an error message file by massaging C source

## SYNOPSIS

**mkstr** \[**-**\] *mesgfile* *prefix* *file ...*

## DESCRIPTION

The **mkstr** utility creates a file containing error messages extracted from C source, and restructures the same C source, to utilize the created error message file. The intent of **mkstr** was to reduce the size of large programs and reduce swapping (see BUGS section below).

The **mkstr** utility processes each of the specified files, placing a restructured version of the input in a file whose name consists of the specified *prefix* and the original name. A typical usage of **mkstr** is

```
mkstr pistrings xx *.c
```

This command causes all the error messages from the C source files in the current directory to be placed in the file *pistrings* and restructured copies of the sources to be placed in files whose names are prefixed with “xx”.

Options:

- **-**

  Error messages are placed at the end of the specified message file for recompiling part of a large **mkstr**ed program.

The **mkstr** utility finds error messages in the source by searching for the string ‘error("’ in the input stream. Each time it occurs, the C string starting at the ‘"’ is stored in the message file followed by a null character and a new-line character; The new source is restructured with [lseek(2)](/lseek/2.md) pointers into the error message file for retrieval.

```
char efilname = "/usr/lib/pi_strings";
int efil = -1;
error(a1, a2, a3, a4)
{
	char buf[256];
	if (efil < 0) {
		efil = open(efilname, 0);
		if (efil < 0)
			err(1, "%s", efilname);
	}
	if (lseek(efil, (off_t)a1, SEEK_SET) < 0 ||
	    read(efil, buf, 256) <= 0)
		err(1, "%s", efilname);
	printf(buf, a2, a3, a4);
}
```

## SEE ALSO

[gencat(1)](/gencat/1.md), [xstr(1)](/xstr/1.md), [lseek(2)](/lseek/2.md)

## HISTORY

The **mkstr** utility first appeared in 1BSD.

## AUTHORS

Bill Joy and Chuck Haley, 1977.

## BUGS

The **mkstr** utility was intended for the limited architecture of the PDP 11 family. Very few programs actually use it. The memory savings are negligible in modern computers.
