:- module char.
:- use_module builtin, enum, private_builtin, require.
:- instance (enum:enum(character)).
:- pragma foreign_import_module("C", char).
char:to_int(C_3) = N_4 :-
		char:to_int(C_3, N_4).
:- pragma promise_pure((char:to_int)/2).
:- pragma foreign_proc("C", char:to_int(Character :: (builtin:out), Int :: (builtin:in)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], "
	/*
	** If the integer doesn\'t fit into a char, then
	** the assignment `Character = Int\' below will truncate it.
	** SUCCESS_INDICATOR will be set to true only if
	** the result was not truncated.
	*/
	Character = Int;
	SUCCESS_INDICATOR = ((MR_UnsignedChar) Character == Int);
").
:- pragma foreign_proc("C", char:to_int(Character :: (builtin:in), Int :: (builtin:in)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], "
	SUCCESS_INDICATOR = ((MR_UnsignedChar) Character == Int);
").
:- pragma foreign_proc("C", char:to_int(Character :: (builtin:in), Int :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], "
	Int = (MR_UnsignedChar) Character;
").
char:max_char_value = N_2 :-
		char:max_char_value(N_2).
:- pragma foreign_proc("C", char:max_char_value(Max :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], "
	Max = UCHAR_MAX;
").
char:min_char_value = N_2 :-
		char:min_char_value(N_2).
char:min_char_value(0).
char:to_upper(C1_3) = C2_4 :-
		char:to_upper(C1_3, C2_4).
char:to_upper(Char_3, Upper_4) :-
		(if
			char:lower_upper(Char_3, UpperChar_5)
		then
			Upper_4 = UpperChar_5
		else
			Upper_4 = Char_3
		).
char:to_lower(C1_3) = C2_4 :-
		char:to_lower(C1_3, C2_4).
char:to_lower(Char_3, Lower_4) :-
		(if
			char:lower_upper(LowerChar_5, Char_3)
		then
			Lower_4 = LowerChar_5
		else
			Lower_4 = Char_3
		).
char:is_upper(Upper_2) :-
		(if
			char:lower_upper(V_3, Upper_2)
		then
			true
		else
			fail
		).
char:is_lower(Lower_2) :-
		char:lower_upper(Lower_2, V_3).
char:is_alpha_or_underscore(Char_2) :-
		(if
			Char_2 = '_'
		then
			true
		else
			char:is_alpha(Char_2)
		).
char:is_binary_digit('0').
char:is_binary_digit('1').
char:digit_to_int(Digit_3, Int_4) :-
		(if
			char:lower_upper(Digit_3, Upper_5)
		then
			char:int_to_digit(Int_4, Upper_5)
		else
			char:int_to_digit(Int_4, Digit_3)
		).
char:det_int_to_digit(N_3) = C_4 :-
		char:det_int_to_digit(N_3, C_4).
:- pragma termination_info(char:to_int((builtin:in)) = (builtin:out), infinite, cannot_loop).
:- pragma termination_info(char:to_int((builtin:in), (builtin:out)), infinite, cannot_loop).
:- pragma termination_info(char:to_int((builtin:in), (builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(char:to_int((builtin:out), (builtin:in)), infinite, cannot_loop).
:- pragma termination_info((char:max_char_value) = (builtin:out), infinite, cannot_loop).
:- pragma termination_info(char:max_char_value((builtin:out)), infinite, cannot_loop).
:- pragma termination_info((char:min_char_value) = (builtin:out), finite(0, [no]), cannot_loop).
:- pragma termination_info(char:min_char_value((builtin:out)), finite(0, [no]), cannot_loop).
:- pragma termination_info(char:to_upper((builtin:in)) = (builtin:out), finite(0, [yes, no]), cannot_loop).
:- pragma termination_info(char:to_upper((builtin:in), (builtin:out)), finite(0, [yes, no]), cannot_loop).
:- pragma termination_info(char:to_lower((builtin:in)) = (builtin:out), finite(0, [yes, no]), cannot_loop).
:- pragma termination_info(char:to_lower((builtin:in), (builtin:out)), finite(0, [yes, no]), cannot_loop).
:- pragma termination_info(char:lower_upper((builtin:in), (builtin:out)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(char:lower_upper((builtin:out), (builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(char:is_whitespace((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info(char:is_upper((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info(char:is_lower((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info(char:is_alpha((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info(char:is_alnum((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info(char:is_alpha_or_underscore((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info(char:is_alnum_or_underscore((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info(char:is_digit((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info(char:is_binary_digit((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info(char:is_octal_digit((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info(char:is_hex_digit((builtin:in)), finite(0, [no]), cannot_loop).
:- pragma termination_info(char:digit_to_int((builtin:in), (builtin:out)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(char:int_to_digit((builtin:in), (builtin:out)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(char:int_to_digit((builtin:out), (builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(char:det_int_to_digit((builtin:in)) = (builtin:out), finite(0, [no, no]), can_loop).
:- pragma termination_info(char:det_int_to_digit((builtin:in), (builtin:out)), finite(0, [no, no]), can_loop).
