/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * ----------------------------------------------------------------------------- * File: Console.c * Description: * This file contains the functions for reading and writting to the console. * * Author: Mineplay * ----------------------------------------------------------------------------- */ #include "../../Include/Iony/Core/Console.h" #include "Iony/Utils/Error.h" #if defined(_WIN32) #include static HANDLE iony_standard_console_out = 0; static HANDLE iony_standard_console_in = 0; #elif defined(__GNUC__) #include "../../Include/Iony/Utils/System.h" #endif IonyError iony_console_print(const char *text, const long length) { if (text == 0) { return IONY_ERROR_INVALID_POINTER; } #if defined(_WIN32) if (iony_standard_console_out == 0) { iony_standard_console_out = GetStdHandle(STD_OUTPUT_HANDLE); if (iony_standard_console_out == INVALID_HANDLE_VALUE) { return IONY_ERROR_HANDLE_NOT_FOUND; } } DWORD characters_written; if (!WriteFile(iony_standard_console_out, text, length, &characters_written, 0)) { return IONY_ERROR_SYSTEM_CALL_FAILED; } #elif defined(__GNUC__) if (iony_system_call(IONY_SYS_WRITE, 1, (long)text, length, 0, 0, 0) < 0) { return IONY_ERROR_SYSTEM_CALL_FAILED; } #endif return IONY_ERROR_NONE; } IonyError iony_console_clear(void) { #if defined(_WIN32) if (iony_standard_console_out == 0) { iony_standard_console_out = GetStdHandle(STD_OUTPUT_HANDLE); if (iony_standard_console_out == INVALID_HANDLE_VALUE) { return IONY_ERROR_HANDLE_NOT_FOUND; } } CONSOLE_SCREEN_BUFFER_INFO console_info; DWORD characters_written, cell_count; COORD cursor_coords = { 0, 0 }; if (!GetConsoleScreenBufferInfo(iony_standard_console_out, &console_info)) { return IONY_ERROR_SYSTEM_CALL_FAILED; } cell_count = console_info.dwSize.X * console_info.dwSize.Y; if (!FillConsoleOutputCharacterA(iony_standard_console_out, ' ', cell_count, cursor_coords, &characters_written)) { return IONY_ERROR_SYSTEM_CALL_FAILED; } if (!FillConsoleOutputAttribute(iony_standard_console_out, console_info.wAttributes, cell_count, cursor_coords, &characters_written)) { return IONY_ERROR_SYSTEM_CALL_FAILED; } SetConsoleCursorPosition(iony_standard_console_out, cursor_coords); #elif defined(__GNUC__) const char clear[] = "\033[2J\033[H"; if (iony_system_call(IONY_SYS_WRITE, 1, (long)clear, sizeof(clear) - 1, 0, 0, 0) < 0) { return IONY_ERROR_SYSTEM_CALL_FAILED; } #endif return IONY_ERROR_NONE; } IonyError iony_console_get_character(char *character) { if (character == 0) { return IONY_ERROR_INVALID_POINTER; } #if defined(_WIN32) if (iony_standard_console_in == 0) { iony_standard_console_in = GetStdHandle(STD_INPUT_HANDLE); if (iony_standard_console_in == INVALID_HANDLE_VALUE) { return IONY_ERROR_HANDLE_NOT_FOUND; } } DWORD characters_read; if (!ReadFile(iony_standard_console_in, character, 1, &characters_read, 0)) { return IONY_ERROR_SYSTEM_CALL_FAILED; } #elif defined(__GNUC__) if (iony_system_call(IONY_SYS_READ, 0, (long)character, 1, 0, 0, 0) < 0) { return IONY_ERROR_SYSTEM_CALL_FAILED; } #endif return IONY_ERROR_NONE; } IonyError iony_console_get_line(char *character_string, const long max_length, long *characters_read) { if (character_string == 0) { return IONY_ERROR_INVALID_POINTER; } #if defined(_WIN32) if (iony_standard_console_in == 0) { iony_standard_console_in = GetStdHandle(STD_INPUT_HANDLE); if (iony_standard_console_in == INVALID_HANDLE_VALUE) { return IONY_ERROR_HANDLE_NOT_FOUND; } } DWORD characters_read; if (!ReadFile(iony_standard_console_in, character_string, max_length, characters_read, 0)) { return IONY_ERROR_SYSTEM_CALL_FAILED; } #elif defined(__GNUC__) long result = iony_system_call(IONY_SYS_READ, 0, (long)character_string, max_length, 0, 0, 0); if (result < 0) { return IONY_ERROR_SYSTEM_CALL_FAILED; } *characters_read = result; #endif return IONY_ERROR_NONE; }