Iony/Src/Core/Console.c

148 lines
4.8 KiB
C

/*
* 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 <windows.h>
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;
}