Ruby  3.4.0dev (2024-12-06 revision 892c46283a5ea4179500d951c9d4866c0051f27b)
Data Structures | Enumerations | Functions
pm_integer.h File Reference

(892c46283a5ea4179500d951c9d4866c0051f27b)

This module provides functions for working with arbitrary-sized integers. More...

#include "prism/defines.h"
#include "prism/util/pm_buffer.h"
#include <assert.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
Include dependency graph for pm_integer.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  pm_integer_t
 A structure represents an arbitrary-sized integer. More...
 

Enumerations

enum  pm_integer_base_t {
  PM_INTEGER_BASE_DEFAULT , PM_INTEGER_BASE_BINARY , PM_INTEGER_BASE_OCTAL , PM_INTEGER_BASE_DECIMAL ,
  PM_INTEGER_BASE_HEXADECIMAL , PM_INTEGER_BASE_UNKNOWN
}
 An enum controlling the base of an integer. More...
 

Functions

void pm_integer_parse (pm_integer_t *integer, pm_integer_base_t base, const uint8_t *start, const uint8_t *end)
 Parse an integer from a string. More...
 
int pm_integer_compare (const pm_integer_t *left, const pm_integer_t *right)
 Compare two integers. More...
 
void pm_integers_reduce (pm_integer_t *numerator, pm_integer_t *denominator)
 Reduce a ratio of integers to its simplest form. More...
 
PRISM_EXPORTED_FUNCTION void pm_integer_string (pm_buffer_t *buffer, const pm_integer_t *integer)
 Convert an integer to a decimal string. More...
 
PRISM_EXPORTED_FUNCTION void pm_integer_free (pm_integer_t *integer)
 Free the internal memory of an integer. More...
 

Detailed Description

This module provides functions for working with arbitrary-sized integers.

Definition in file pm_integer.h.

Enumeration Type Documentation

◆ pm_integer_base_t

An enum controlling the base of an integer.

It is expected that the base is already known before parsing the integer, even though it could be derived from the string itself.

Enumerator
PM_INTEGER_BASE_DEFAULT 

The default decimal base, with no prefix.

Leading 0s will be ignored.

PM_INTEGER_BASE_BINARY 

The binary base, indicated by a 0b or 0B prefix.

PM_INTEGER_BASE_OCTAL 

The octal base, indicated by a 0, 0o, or 0O prefix.

PM_INTEGER_BASE_DECIMAL 

The decimal base, indicated by a 0d, 0D, or empty prefix.

PM_INTEGER_BASE_HEXADECIMAL 

The hexadecimal base, indicated by a 0x or 0X prefix.

PM_INTEGER_BASE_UNKNOWN 

An unknown base, in which case pm_integer_parse will derive it based on the content of the string.

This is less efficient and does more comparisons, so if callers know the base ahead of time, they should use that instead.

Definition at line 50 of file pm_integer.h.

Function Documentation

◆ pm_integer_compare()

int pm_integer_compare ( const pm_integer_t left,
const pm_integer_t right 
)

Compare two integers.

This function returns -1 if the left integer is less than the right integer, 0 if they are equal, and 1 if the left integer is greater than the right integer.

Parameters
leftThe left integer to compare.
rightThe right integer to compare.
Returns
The result of the comparison.

This function returns -1 if the left integer is less than the right integer, 0 if they are equal, and 1 if the left integer is greater than the right integer.

Definition at line 545 of file pm_integer.c.

◆ pm_integer_free()

PRISM_EXPORTED_FUNCTION void pm_integer_free ( pm_integer_t integer)

Free the internal memory of an integer.

This memory will only be allocated if the integer exceeds the size of a single node in the linked list.

Parameters
integerThe integer to free.

This memory will only be allocated if the integer exceeds the size of a single uint32_t.

Definition at line 666 of file pm_integer.c.

Referenced by pm_integer_string(), and pm_node_destroy().

◆ pm_integer_parse()

void pm_integer_parse ( pm_integer_t integer,
pm_integer_base_t  base,
const uint8_t *  start,
const uint8_t *  end 
)

Parse an integer from a string.

This assumes that the format of the integer has already been validated, as internal validation checks are not performed here.

Parameters
integerThe integer to parse into.
baseThe base of the integer.
startThe start of the string.
endThe end of the string.

This assumes that the format of the integer has already been validated, as internal validation checks are not performed here.

Definition at line 475 of file pm_integer.c.

◆ pm_integer_string()

PRISM_EXPORTED_FUNCTION void pm_integer_string ( pm_buffer_t buffer,
const pm_integer_t integer 
)

Convert an integer to a decimal string.

Parameters
bufferThe buffer to append the string to.
integerThe integer to convert to a string.

Definition at line 607 of file pm_integer.c.

Referenced by pm_dump_json().

◆ pm_integers_reduce()

void pm_integers_reduce ( pm_integer_t numerator,
pm_integer_t denominator 
)

Reduce a ratio of integers to its simplest form.

If either the numerator or denominator do not fit into a 32-bit integer, then this function is a no-op. In the future, we may consider reducing even the larger numbers, but for now we're going to keep it simple.

Parameters
numeratorThe numerator of the ratio.
denominatorThe denominator of the ratio.

Definition at line 573 of file pm_integer.c.