---
name: "h2pas-3.2.0"
section: "1"
platform: "linux"
package: "fp-utils-3.2.0"
version: "3.2.0+dfsg-12"
release: "Debian 11 (Bullseye)"
platforms: ["linux"]
url: "https://new.carta.tech/h2pas-3.2.0"
---

# h2pas-3.2.0(1)

The C header to pascal unit conversion program.

## NAME

h2pas - The C header to pascal unit conversion program.

## SYNOPSIS

**h2pas** *\[options\] filename*

## DESCRIPTION

**h2pas** attempts to convert a C header file to a pascal unit.  it can handle most C constructs that one finds in a C header file, and attempts to translate them to their pascal counterparts. see the  **CONSTRUCTS** section for a full description of what the translator can handle.

## USAGE

H2pas is a command-line tool that translates a C header file to a spascal unit. It reads the C header file and translates the C declarations to equivalent pascal declarations that can be used to access code written in C.

The output of the h2pas program is written to a file with the same name as the C header file that was used as input, but with the extension *.pp*. The output file that h2pas creates can be customized in a number of ways by means of many options.

## OPTIONS

The output of  **h2pas** can be controlled with the following options:

- **-d**

  use  *external;* for all procedure and function declarations.

- **-D**

  use  **external** *libname* **name** *'func\_name'* for function and procedure declarations.

- **-e**

  Emit a series of constants instead of an enumeration type for the C  *enum* construct.

- **-i**

  create an include file instead of a unit (omits the unit header).

- **-l** *libname*

  specify the library name for external function declarations.

- **-o** *outfile*

  Specify the output file name. Default is the input file name with  the extension replaced by  *.pp* "."

- **-p**

  use the letter   **P** in front of pointer type parameters instead of "^".

- **-s**

  Strip comments from the input file. By default comments are converted to comments, but they may be displaced, since a comment is handled by the scanner.

- **-t**

  prepend typedef type names with the letter **T** (used to follow Borland's convention that all types should be defined with T).

- **-v**

  replace pointer parameters by call by reference parameters. Use with care because some calls can expect a NIL pointer.

- **-w**

  Header file is a win32 header file (adds support for some special macros).

- **-x**

  handle SYS\_TRAP of the PalmOS header files.

## CONSTRUCTS

The following C declarations and statements are recognized:

- **defines**

  defines are changed into pascal constants if they are simple defines. macros are changed - wherever possible to functions; however the arguments are all integers, so these must be changed manually. Simple expressions  in define staments are recognized, as are most arithmetic operators:  addition, subtraction, multiplication, division, logical operators,  comparison operators, shift operators. The C construct ( A ? B : C) is also recognized and translated to a pascal construct with an IF statement (this is buggy, however).

- **preprocessor statements**

  the conditional preprocessing commands are recognized and translated into equivalent pascal compiler directives. The special  **#ifdef \_\_cplusplus** is also recognized and removed.

- **typedef**

  A typedef statement is changed into a pascal type statement. The following basic types are recognized:

  - *char*

    changed to char.

  - *float*

    changed to real (=double in free pascal).

  - *int*

    changed to longint.

  - *long*

    changed to longint.

  - *long int*

    changed to longint.

  - *short*

    changed to integer.

  - *unsigned*

    changed to cardinal.

  - *unsigned char*

    changed to byte.

  - *unsigned int*

    changed to cardinal.

  - *unsigned long int*

    changed to cardinal.

  - *unsigned short*

    changed to word.

  - *void*

    ignored.

  These types are also changed if they appear in the arguments of a function or procedure.

- **functions and procedures**

  functions and procedures are translated as well; pointer types may be changed to call by reference arguments (using the  **var** argument) by using the  **-p** command line argument. functions that have a variable number of arguments are changed to a function with an  **array of const** argument.

- **specifiers**

  the  *extern* specifier is recognized; however it is ignored. the *packed* specifier is also recognised and changed with the *PACKRECORDS* directive. The  *const* specifier is also recognized, but is ignored.

- **modifiers**

  If the  **-w** option is specified, then the following modifiers are recognized: *STDCALL* ,  *CDECL* ,  *CALLBACK* ,  *PASCAL* ,  *WINAPI* ,  *APIENTRY* ,  *WINGDIAPI* as defined in the win32 headers. If additionally the **-x** option is specified then the  *SYS\_TRAP* specifier is also recognized.

- **enums**

  enum constructs are changed into enumeration types; bear in mind that in C enumeration types can have values assigned to them; Free Pascal also allows this to a certain degree. If you know that values are assigned to enums, it is best to use the  **-e** option to change the enus to a series of integer constants.

- **unions**

  unions are changed to variant records.

- **structs**

  are changed to pascal records, with  **C** packing.

-

  ## SEE ALSO

-

  [**ppc386**(1)](/ppc386/1.md) [**ppumove**(1)](/ppumove/1.md)
