/***********************************************************************************
 * Chaga string arithmetic library                                                 *
 * Copyright (C) 2026 Robert James Bruce                                           *
 *                                                                                 *
 * This file is part of the Chaga string arithmetic library.                       *
 *                                                                                 *
 * The Chaga string arithmetic library is free software: you can redistribute it   * 
 * and/or modify it under the terms of the GNU General Public License as published *
 * by the Free Software Foundation, either version 3 of the License, or (at your   *
 * option) any later version.                                                      *
 *                                                                                 *
 * The Chaga string arithmetic library is distributed in the hope that it will be  *
 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of          *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public *
 * License for more details.                                                       *
 *                                                                                 *
 * You should have received a copy of the GNU General Public License               *
 * along with the Chaga compiler. If not, see <https://www.gnu.org/licenses/>.     *
 ***********************************************************************************/
#ifndef LIBCHAGA_PACKED_STRING_INTEGER_FUNCTIONS
#define LIBCHAGA_PACKED_STRING_INTEGER_FUNCTIONS 1
#endif

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>

#ifndef LIBCHAGA_CONSTANTS
#include "libchaga-constants.h"
#endif

#ifndef LIBCHAGA_DATA_STRUCTURES
#include "libchaga-data_structures.h"
#endif


psint * packed_string_integer_release_memory (psint *);
psint * packed_string_integer_component_release_memory (psint *);
psint * packed_string_integer_copy_number (psint *, psint *);
psint * packed_string_integer_set_sign (psint *, enum string_number_sign);
psint * packed_string_integer_set_status_flag (psint *, unsigned int);
psint * packed_string_integer_initialize_to_zero (psint *);
psint * packed_string_integer_initialize_to_undefined (psint *);
psint * packed_string_integer_append_one_digit (psint *, unsigned char);
psint * packed_string_integer_append_two_digits (psint *, unsigned char);
psint * packed_string_integer_set_value (psint *, char *);
psint * packed_string_integer_append_unpacked_digit_string (psint *, char *);
psint * _packed_string_integer_add_both_numbers_same_sign (psint *, psint *, psint *);
psint * packed_string_integer_add (psint *, psint *, psint *);
psint * _packed_string_integer_subtract_both_numbers_same_sign (psint *, psint *, psint *);
psint * packed_string_integer_subtract (psint *, psint *, psint *);
psint * _packed_string_integer_decrement_one (psint *);
psint * packed_string_integer_decrement_one (psint *);
psint * _packed_string_integer_multiply (psint *, psint *, psint *);
psint * _packed_string_integer_multiply_with_toom3 (psint *, psint *, psint *);
psint * packed_string_integer_multiply (psint *, psint *, psint *);
psint * packed_string_integer_multiply_traditional (psint *, psint *, psint *);
psint_list_node * _packed_string_integer_divide_on_positive_integers_returning_quotient_and_remainder (psint *, psint *);
psint_list_node * _packed_string_integer_divide_on_positive_integers_returning_quotient_and_remainder_high_performance (psint *, psint *);
psint_list_node * packed_string_integer_divide_returning_quotient_and_remainder (psint *, psint *);
psint * _packed_string_integer_divide_on_positive_integers (psint *, psint *, psint *);
psint * packed_string_integer_divide (psint *, psint *, psint *);
psint * _packed_string_integer_modulo_on_positive_integers (psint *, psint *, psint *);
psint * packed_string_integer_modulo (psint *, psint *, psint *);
void packed_string_integer_display (psint *, int);
int packed_string_integer_determine_absolute_value_number_greater_than_one (psint *);
int packed_string_integer_determine_absolute_value_larger_of_two_integers (psint *, psint *);
unsigned char packed_string_integer_greater_than (psint *, psint *);
unsigned char packed_string_integer_greater_than_or_equal (psint *, psint *);
unsigned char packed_string_integer_less_than (psint *, psint *);
unsigned char packed_string_integer_less_than_or_equal (psint *, psint *);
unsigned char packed_string_integer_equal (psint *, psint *);
unsigned char packed_string_integer_not_equal (psint *, psint *);
unsigned char packed_string_integer_is_divisible_by_two (psint *);
unsigned char packed_string_integer_is_divisible_by_five (psint *);
psint * packed_string_integer_shift_digits_left (psint *, long long int);
psint * packed_string_integer_factorial (psint *);
psint * packed_string_integer_factorial_v2 (psint *);
unsigned char packed_string_integer_contains_only_two_and_five_as_factors (psint *);
psflt * convert_packed_string_integer_to_packed_string_float (psflt *, psint *);
unsigned char * convert_packed_string_integer_to_boolean (psint *);
psint * convert_boolean_to_packed_string_integer (unsigned char *);

