Ruby: prism/util/pm_string.h File Reference

Ruby 3.4.1p0 (2024-12-25 revision 48d4efcb85000e1ebae42004e963b5d0cedddcf2)

Data Structures | Macros | Enumerations | Functions
pm_string.h File Reference

A generic string type that can have various ownership semantics. More...

`#include "prism/defines.h"`
`#include <assert.h>`
`#include <errno.h>`
`#include <stdbool.h>`
`#include <stddef.h>`
`#include <stdlib.h>`
`#include <string.h>`
`#include <fcntl.h>`
`#include <sys/stat.h>`

Go to the source code of this file.

## Data Structures
struct | pm_string_t
| A generic string type that can have various ownership semantics. More...

## Macros
#define | PM_STRING_EMPTY ((pm_string_t) { .type = PM_STRING_CONSTANT, .source = NULL, .length = 0 })
| Defines an empty string.

## Enumerations
enum | pm_string_init_result_t { PM_STRING_INIT_SUCCESS = 0 , PM_STRING_INIT_ERROR_GENERIC = 1 , PM_STRING_INIT_ERROR_DIRECTORY = 2 }
| Represents the result of calling pm_string_mapped_init or pm_string_file_init. More...

## Functions
PRISM_EXPORTED_FUNCTION size_t | pm_string_sizeof (void)
| Returns the size of the pm_string_t struct.
void | pm_string_shared_init (pm_string_t *string, const uint8_t *start, const uint8_t *end)
| Initialize a shared string that is based on initial input.
void | pm_string_owned_init (pm_string_t *string, uint8_t *source, size_t length)
| Initialize an owned string that is responsible for freeing allocated memory.
void | pm_string_constant_init (pm_string_t *string, const char *source, size_t length)
| Initialize a constant string that doesn't own its memory source.
PRISM_EXPORTED_FUNCTION pm_string_init_result_t | pm_string_mapped_init (pm_string_t *string, const char *filepath)
| Read the file indicated by the filepath parameter into source and load its contents and size into the given `pm_string_t`.
PRISM_EXPORTED_FUNCTION pm_string_init_result_t | pm_string_file_init (pm_string_t *string, const char *filepath)
| Read the file indicated by the filepath parameter into source and load its contents and size into the given `pm_string_t`.
void | pm_string_ensure_owned (pm_string_t *string)
| Ensure the string is owned.
int | pm_string_compare (const pm_string_t *left, const pm_string_t *right)
| Compare the underlying lengths and bytes of two strings.
PRISM_EXPORTED_FUNCTION size_t | pm_string_length (const pm_string_t *string)
| Returns the length associated with the string.
PRISM_EXPORTED_FUNCTION const uint8_t * | pm_string_source (const pm_string_t *string)
| Returns the start pointer associated with the string.
PRISM_EXPORTED_FUNCTION void | pm_string_free (pm_string_t *string)
| Free the associated memory of the given string.

## Detailed Description

A generic string type that can have various ownership semantics.

Definition in file pm_string.h.

## Macro Definition Documentation

## ◆ PM_STRING_EMPTY

#define PM_STRING_EMPTY ((pm_string_t) { .type = PM_STRING_CONSTANT, .source = NULL, .length = 0 })

Defines an empty string.

This is useful for initializing a string that will be filled in later.

Definition at line 70 of file pm_string.h.

Referenced by pm_parser_init().

## Enumeration Type Documentation

## ◆ pm_string_init_result_t

enum pm_string_init_result_t

Represents the result of calling pm_string_mapped_init or pm_string_file_init.

We need this additional information because there is not a platform-agnostic way to indicate that the file that was attempted to be opened was a directory.

Enumerator
PM_STRING_INIT_SUCCESS | Indicates that the string was successfully initialized.
PM_STRING_INIT_ERROR_GENERIC | Indicates a generic error from a string_*_init function, where the type of error should be read from `errno` or `GetLastError()`.
PM_STRING_INIT_ERROR_DIRECTORY | Indicates that the file that was attempted to be opened was a directory.

Definition at line 105 of file pm_string.h.

## Function Documentation

## ◆ pm_string_compare()

int pm_string_compare | ( | const pm_string_t * | left,
|  | const pm_string_t * | right )

Compare the underlying lengths and bytes of two strings.

Returns 0 if the strings are equal, a negative number if the left string is less than the right string, and a positive number if the left string is greater than the right string.

Parameters

  left | The left string to compare.
  right | The right string to compare.

Returns
  The comparison result.

Returns 0 if the strings are equal, a negative number if the left string is less than the right string, and a positive number if the left string is greater than the right string.

Definition at line 336 of file pm_string.c.

## ◆ pm_string_constant_init()

void pm_string_constant_init | ( | pm_string_t * | string,
|  | const char * | source,
|  | size_t | length )

Initialize a constant string that doesn't own its memory source.

Parameters

  string | The string to initialize.
  source | The source of the string.
  length | The length of the string.

Definition at line 42 of file pm_string.c.

## ◆ pm_string_ensure_owned()

void pm_string_ensure_owned | ( | pm_string_t * | string | ) |

Ensure the string is owned.

If it is not, then reinitialize it as owned and copy over the previous source.

Parameters

  string | The string to ensure is owned.

If it is not, then reinitialize it as owned and copy over the previous source.

Definition at line 316 of file pm_string.c.

## ◆ pm_string_file_init()

PRISM_EXPORTED_FUNCTION pm_string_init_result_t pm_string_file_init | ( | pm_string_t * | string,
|  | const char * | filepath )

Read the file indicated by the filepath parameter into source and load its contents and size into the given `pm_string_t`.

The given `pm_string_t` should be freed using `pm_string_free` when it is no longer used.

Parameters

  string | The string to initialize.
  filepath | The filepath to read.

Returns
  The success of the read, indicated by the value of the enum.

The given `pm_string_t` should be freed using `pm_string_free` when it is no longer used.

Definition at line 210 of file pm_string.c.

## ◆ pm_string_free()

PRISM_EXPORTED_FUNCTION void pm_string_free | ( | pm_string_t * | string | ) |

Free the associated memory of the given string.

Parameters

  string | The string to free.

Definition at line 369 of file pm_string.c.

## ◆ pm_string_length()

PRISM_EXPORTED_FUNCTION size_t pm_string_length | ( | const pm_string_t * | string | ) |

Returns the length associated with the string.

Parameters

  string | The string to get the length of.

Returns
  The length of the string.

Definition at line 353 of file pm_string.c.

## ◆ pm_string_mapped_init()

PRISM_EXPORTED_FUNCTION pm_string_init_result_t pm_string_mapped_init | ( | pm_string_t * | string,
|  | const char * | filepath )

Read the file indicated by the filepath parameter into source and load its contents and size into the given `pm_string_t`.

The given `pm_string_t` should be freed using `pm_string_free` when it is no longer used.

We want to use demand paging as much as possible in order to avoid having to read the entire file into memory (which could be detrimental to performance for large files). This means that if we're on windows we'll use `MapViewOfFile`, on POSIX systems that have access to `mmap` we'll use `mmap`, and on other POSIX systems we'll use `read`.

Parameters

  string | The string to initialize.
  filepath | The filepath to read.

Returns
  The success of the read, indicated by the value of the enum.

The given `pm_string_t` should be freed using `pm_string_free` when it is no longer used.

We want to use demand paging as much as possible in order to avoid having to read the entire file into memory (which could be detrimental to performance for large files). This means that if we're on windows we'll use `MapViewOfFile`, on POSIX systems that have access to `mmap` we'll use `mmap`, and on other POSIX systems we'll use `read`.

Definition at line 118 of file pm_string.c.

## ◆ pm_string_owned_init()

void pm_string_owned_init | ( | pm_string_t * | string,
|  | uint8_t * | source,
|  | size_t | length )

Initialize an owned string that is responsible for freeing allocated memory.

Parameters

  string | The string to initialize.
  source | The source of the string.
  length | The length of the string.

Definition at line 30 of file pm_string.c.

## ◆ pm_string_shared_init()

void pm_string_shared_init | ( | pm_string_t * | string,
|  | const uint8_t * | start,
|  | const uint8_t * | end )

Initialize a shared string that is based on initial input.

Parameters

  string | The string to initialize.
  start | The start of the string.
  end | The end of the string.

Definition at line 16 of file pm_string.c.

## ◆ pm_string_sizeof()

PRISM_EXPORTED_FUNCTION size_t pm_string_sizeof | ( | void |  | ) |

Returns the size of the pm_string_t struct.

This is necessary to allocate the correct amount of memory in the FFI backend.

Returns
  The size of the pm_string_t struct.

This is necessary to allocate the correct amount of memory in the FFI backend.

Definition at line 8 of file pm_string.c.

## ◆ pm_string_source()

PRISM_EXPORTED_FUNCTION const uint8_t * pm_string_source | ( | const pm_string_t * | string | ) |

Returns the start pointer associated with the string.

Parameters

  string | The string to get the start pointer of.

Returns
  The start pointer of the string.

Definition at line 361 of file pm_string.c.