---
name: "unibi_run"
section: "3"
platform: "linux"
package: "unibilium"
version: "2.1.4-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/unibi_run"
---

# unibi\_run(3)

interpret a terminfo format string

## NAME

unibi\_format, unibi\_run - interpret a terminfo format string

## SYNOPSIS

```
  #include <unibilium.h>

  void unibi_format(
      unibi_var_t var_dyn[26],
      unibi_var_t var_static[26],
      const char *fmt,
      unibi_var_t param[9],
      void (*out)(void *, const char *, size_t),
      void *ctx1,
      void (*pad)(void *, size_t, int, int),
      void *ctx2
  );

  size_t unibi_run(const char *fmt, unibi_var_t param[9], char *p, size_t n);
```

## DESCRIPTION

`"unibi_format"` takes a format string *fmt* and executes it. All output is done by (possibly repeated) calls to *out*. In the calls to *out* the first argument is always *ctx1*, the second argument is a pointer to a chunk of data, and the third argument is a count specifying the size of the chunk in bytes.

*pad* is used when the format string contains `"$<...>"` padding instructions. In the calls to *pad* the first argument is always *ctx2*, the second argument is the delay in tenths of milliseconds, the third argument is a boolean flag indicating whether `"*"` (proportional delay) was specified in the format string, and the fourth argument is a boolean flag indicating whether `"/"` (forced padding) was specified in the format string. Thus a format string of `"$<5/>"` would translate into `"pad(ctx2, 50, 0, 1)"`. You may pass a null pointer for *pad*; in that case padding instructions are silently skipped.

The values of *param* are used for the format codes `%p1` .. `%p9`; the values of *var\_dyn* and *var\_static* are used for the so-called dynamic/static variables `%Pa` .. `%Pz` and `%PA` .. `%PZ`, respectively.

`"unibi_run"` is a wrapper around `"unibi_format"`. It passes two arrays (each initialized to 26 zeroes) as *var\_dyn* and *var\_static*. *fmt* and *param* are passed on unchanged. It ignores padding and places all normal output in the buffer pointed to by *p*. *n* is the size of the buffer; at most *n* bytes will be written to *p*.

## RETURN VALUE

`"unibi_run"` returns the number of bytes that would have been written if the buffer was big enough. Thus the number of valid bytes in *p* after a call to `"unibi_run"` is the minimum of *n* and the return value of `"unibi_run"`.

## SEE ALSO

[**unibi\_var\_from\_num**(3)](/unibi_var_from_num/3.md), [**unibi\_var\_from\_str**(3)](/unibi_var_from_str/3.md), [**unibilium.h**(3)](/unibilium.h/3.md)
