---
name: "rtcore"
section: "3tcl"
platform: "linux"
package: "tcllib"
version: "2.0+dfsg-4"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/rtcore"
---

# rtcore(3tcl)

Runtime core for file type recognition engines written in pure Tcl

```

```

## NAME

fileutil::magic::rt - Runtime core for file type recognition engines written in pure Tcl

## SYNOPSIS

package require **Tcl 8.5 9**

package require **fileutil::magic::rt ?2.0?**

**::fileutil::magic::rt::\>**

**::fileutil::magic::rt::\<**

**::fileutil::magic::rt::new** *chan* *named* *analyze*

**::fileutil::magic::rt::file\_start** *name*

**::fileutil::magic::rt::emit** *msg*

**::fileutil::magic::rt::O** *where*

**::fileutil::magic::rt::R** *where*

**::fileutil::magic::rt::Nv** *type* *offset* *compinvert* *comp* *expected*

**::fileutil::magic::rt::N** *type* *offset* *testinvert* *compinvert* *mod* *mand* *comp* *expected*

**::fileutil::magic::rt::S** *type* *offset* *testinvert* *mod* *mand* *comp* *val*

**::fileutil::magic::rt::L** *newlevel*

**::fileutil::magic::rt::I** *offset* *it* *ioi* *ioo* *iir* *io*

**::fileutil::magic::rt::R** *offset*

**::fileutil::magic::rt::U** *fileindex* *name*

```

```

## DESCRIPTION

This package provides the runtime core for file type recognition engines written in pure Tcl and is thus used by all other packages in this module such as **fileutil::magic::filetype** and the two compiler packages **fileutil::magic::cgen** and **fileutil::magic::cfront**.

## COMMANDS

- **::fileutil::magic::rt::\>**

  Increment the level and perform related housekeeping

- **::fileutil::magic::rt::\<**

  Decrement the level and perform related housekeeping

- **::fileutil::magic::rt::new** *chan* *named* *analyze*

  Create a new command which returns one description of the file each time it is called, and a code of *break* when there are no more descriptions. *chan* is the channel containing the data to describe.  The channel configuration is then managed as needed. *named* is a dictionary of named tests, as generated by **fileutil::magic::cfront::compile**. *test* is a command prefix for a routine composed of the list of commands as returned by **fileutil::magic::cfront::compile**.

- **::fileutil::magic::rt::file\_start** *name*

  This command marks the start of a magic file when debugging. It returns the empty string as its result.

- **::fileutil::magic::rt::emit** *msg*

  This command adds the text *msg* to the result buffer. The message may contain the following special character sequences. They will be replaced with buffered values before the message is added to the result. The command returns the empty string as its result.

  - **\\b**

    This sequence is removed

  - **%s**

    Replaced with the last buffered string value.

  - **%ld**

    Replaced with the last buffered numeric value.

  - **%d**

    See above.

  - **${x:...?...}**

    Substitute one string if the file is executable, and another string otherwise.

- **::fileutil::magic::rt::O** *where*

  Produce an offset from *where*, relative to the cursor one level up. Produce an offset from *where*, relative to the offset one level up.

- **::fileutil::magic::rt::Nv** *type* *offset* *compinvert* *comp* *expected*

  A limited form of **::fileutile::magic::rt::N** that only checks for equality and can't be told to invert the test.

- **::fileutil::magic::rt::N** *type* *offset* *testinvert* *compinvert* *mod* *mand* *comp* *expected*

  Fetch the numeric value with *type* from the absolute location *offset*, compare it with *expected* using *comp* as the comparision operator,  and returns the result.

  The argument *comp* must be one of Tcl's comparison operators.

  ```
  	<comp> <fetched-and-masked-value> <comp> <expected>
  ```

  The special comparison operator **x** signals that no comparison should be done, or, in other words, that the fetched value will always match *val*.

- **::fileutil::magic::rt::S** *type* *offset* *testinvert* *mod* *mand* *comp* *val*

  Like **::fileutil::magic::rt::N** except that it fetches and compares string types , not numeric data.

- **::fileutil::magic::rt::L** *newlevel*

  Sets the current level in the calling context to *newlevel*. The command returns the empty string as its result.

- **::fileutil::magic::rt::I** *offset* *it* *ioi* *ioo* *iir* *io*

  Calculates an offset based on an initial offset and the provided modifiers.

- **::fileutil::magic::rt::R** *offset*

  Given an initial offset, calculates an offset relative to the cursor at the next level up. The cursor is the position in the data one character after the data extracted from the file one level up.

- **::fileutil::magic::rt::U** *fileindex* *name*

  Add a level and use a named test script.

## NUMERIC TYPES

- **byte**

  8-bit integer

- **short**

  16-bit integer, stored in native endianess

- **beshort**

  see above, stored in big endian

- **leshort**

  see above, stored in small/little endian

- **long**

  32-bit integer, stored in native endianess

- **belong**

  see above, stored in big endian

- **lelong**

  see above, stored in small/little endian

All of the types above exit in an unsigned form as well. The type names are the same, with the character "u" added as prefix.

- **date**

  32-bit integer timestamp, stored in native endianess

- **bedate**

  see above, stored in big endian

- **ledate**

  see above, stored in small/little endian

- **ldate**

  32-bit integer timestamp, stored in native endianess

- **beldate**

  see above, stored in big endian

- **leldate**

  see above, stored in small/little endian

## BUGS, IDEAS, FEEDBACK

This document, and the package it describes, will undoubtedly contain bugs and other problems. Please report such in the category *fileutil :: magic* of the *Tcllib Trackers* \[http://core.tcl.tk/tcllib/reportlist\]. Please also report any ideas for enhancements you may have for either package and/or documentation.

When proposing code changes, please provide *unified diffs*, i.e the output of **diff -u**.

Note further that *attachments* are strongly preferred over inlined patches. Attachments can be made by going to the **Edit** form of the ticket immediately after its creation, and then using the left-most button in the secondary navigation bar.

## SEE ALSO

[file(1)](/file/1.md), fileutil, [magic(5)](/magic/5.md)

## KEYWORDS

file recognition, file type, file utilities, mime, type

## CATEGORY

Programming tools
