From 5a5ea4ea590f7f0825ac140585af027f7b658470 Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Sat, 5 Oct 2024 13:34:24 +0200 Subject: [PATCH] Implemented a proper libc --- Makefile | 71 ++++++++++++++++---------- include/libc/color.h | 15 ++++++ include/{c => libc}/math.h | 0 include/{c => libc}/stdarg.h | 0 include/{c => libc}/stdbool.h | 0 include/{c => libc}/stddef.h | 0 include/{c => libc}/stdint.h | 0 include/libc/stdio.h | 41 +++++++++++++++ include/libc/stdlib.h | 10 ++++ include/libc/string.h | 23 +++++++++ include/libc/syscall.h | 38 ++++++++++++++ include/libc/time.h | 8 +++ kern.iso | Bin 1470464 -> 1470464 bytes include/c/_fileio.h => libc/_fileio.c | 21 +------- include/c/_printf.h => libc/_printf.c | 9 +--- include/c/color.h => libc/color.c | 14 +---- libc/math.c | 16 ++++++ libc/stdarg.c | 10 ++++ libc/stdbool.c | 8 +++ libc/stddef.c | 9 ++++ libc/stdint.c | 20 ++++++++ include/c/stdio.h => libc/stdio.c | 17 ++---- include/c/stdlib.h => libc/stdlib.c | 5 +- include/c/string.h => libc/string.c | 11 +--- include/c/syscall.h => libc/syscall.c | 27 +--------- include/c/time.h => libc/time.c | 6 +-- src/kernel.c | 1 + src/stage3.c | 1 + 28 files changed, 258 insertions(+), 123 deletions(-) create mode 100644 include/libc/color.h rename include/{c => libc}/math.h (100%) rename include/{c => libc}/stdarg.h (100%) rename include/{c => libc}/stdbool.h (100%) rename include/{c => libc}/stddef.h (100%) rename include/{c => libc}/stdint.h (100%) create mode 100644 include/libc/stdio.h create mode 100644 include/libc/stdlib.h create mode 100644 include/libc/string.h create mode 100644 include/libc/syscall.h create mode 100644 include/libc/time.h rename include/c/_fileio.h => libc/_fileio.c (73%) rename include/c/_printf.h => libc/_printf.c (96%) rename include/c/color.h => libc/color.c (53%) create mode 100644 libc/math.c create mode 100644 libc/stdarg.c create mode 100644 libc/stdbool.c create mode 100644 libc/stddef.c create mode 100644 libc/stdint.c rename include/c/stdio.h => libc/stdio.c (83%) rename include/c/stdlib.h => libc/stdlib.c (82%) rename include/c/string.h => libc/string.c (92%) rename include/c/syscall.h => libc/syscall.c (54%) rename include/c/time.h => libc/time.c (72%) diff --git a/Makefile b/Makefile index 98823ff..c71d52a 100644 --- a/Makefile +++ b/Makefile @@ -3,8 +3,8 @@ CC := i686-elf-gcc LD := i686-elf-ld AS := nasm -CFLAGS := -g -std=c17 -ffreestanding -fno-builtin -fno-stack-protector -fno-pie \ - -Os -nostdinc -mgeneral-regs-only -m32 -march=i386 -Wall -Iinclude/c +CCFLAGS := -g -std=c17 -ffreestanding -fno-builtin -fno-stack-protector -fno-pie \ + -Os -nostdinc -mgeneral-regs-only -m32 -march=i386 -Wall LDFLAGS := -z notext -melf_i386 -nostdlib ASFLAGS := @@ -12,61 +12,78 @@ include make.config SRC := ./src BIN := ./bin +LIBK_INC := ./include +LIBC_INC := ./include/libc +LIBC_DIR := ./libc +LIBK_DIR := ./libk + C_FILES := calc edit FONTS := testfont term16n +BOOTLOADER := $(BIN)/stage1.bin $(BIN)/stage2.bin $(BIN)/stage3.bin +KERNEL := $(BIN)/kernel.bin +LIBC := $(BIN)/libc.o +# TODO: LIBK := $(BIN)/libk.o +ISO := kern.iso + .PHONY: os clean run # Main compilation target -os: $(BIN) bootloader kernel $(C_FILES) $(FONTS) - @cc ./makedisk.c -o ./makedisk - @./makedisk # TODO: List of files +os: $(ISO) +$(ISO): $(BIN) $(BOOTLOADER) $(KERNEL) $(C_FILES) $(FONTS) + cc ./makedisk.c -o ./makedisk + ./makedisk # TODO: List of files @echo "\nDone!\n" $(BIN): - @[ -d $(BIN) ] || mkdir $(BIN) - @rm -rf $(BIN)/* + [ -d $(BIN) ] || mkdir $(BIN) + rm -rf $(BIN)/* # Bootloader: This target is responsible for creating stage?.bin (1,2,3) -bootloader: $(SRC)/stage1.asm $(SRC)/stage2.asm +$(BOOTLOADER): $(SRC)/stage1.asm $(SRC)/stage2.asm $(SRC)/stage3.c $(LIBC) @echo "Assembling $(SRC)/stage1.asm..." - @$(AS) -fbin -o $(BIN)/stage1.bin $(SRC)/stage1.asm $(ASFLAGS) + $(AS) -fbin -o $(BIN)/stage1.bin $(SRC)/stage1.asm $(ASFLAGS) @echo "Assembling $(SRC)/stage2.asm..." - @$(AS) -fbin -o $(BIN)/stage2.bin $(SRC)/stage2.asm $(ASFLAGS) + $(AS) -fbin -o $(BIN)/stage2.bin $(SRC)/stage2.asm $(ASFLAGS) @echo "Compiling $(SRC)/stage3.c..." - @$(CC) $(CFLAGS) -Iinclude -o $(BIN)/stage3.o -c $(SRC)/stage3.c - @$(LD) $(LDFLAGS) -T$(SRC)/stage3.ld --oformat binary -o $(BIN)/stage3.bin $(BIN)/stage3.o - @rm $(BIN)/stage3.o + $(CC) $(CCFLAGS) -I$(LIBK_INC) -I$(LIBC_INC) -o $(BIN)/stage3.o -c $(SRC)/stage3.c + $(LD) $(LDFLAGS) -T$(SRC)/stage3.ld --oformat binary -o $(BIN)/stage3.bin $(BIN)/stage3.o $(LIBC) + rm $(BIN)/stage3.o # Kernel: This target is responsible for creating kernel.bin -kernel: $(SRC)/kernel.c +$(KERNEL): $(SRC)/kernel.c $(LIBC) #TODO: $(LIBK) @echo "Compiling $(SRC)/kernel.c..." - @$(CC) $(CFLAGS) -Iinclude -o $(BIN)/kernel.o -c $(SRC)/kernel.c - @$(LD) $(LDFLAGS) -T$(SRC)/kernel.ld --oformat binary -o $(BIN)/kernel.bin $(BIN)/kernel.o - @rm $(BIN)/kernel.o + $(CC) $(CCFLAGS) -I$(LIBK_INC) -I$(LIBC_INC) -o $(BIN)/kernel.o -c $(SRC)/kernel.c + $(LD) $(LDFLAGS) -T$(SRC)/kernel.ld --oformat binary -o $(BIN)/kernel.bin $(BIN)/kernel.o $(LIBC) #TODO: LIBK + rm $(BIN)/kernel.o # This target compiles *.c (except kernel.c) -$(C_FILES): +$(C_FILES): $(LIBC) @echo "Compiling $(SRC)/$@.c..." - @$(CC) $(CFLAGS) -o $(BIN)/$@.o -c $(SRC)/$@.c - @$(LD) $(LDFLAGS) -T$(SRC)/$@.ld --oformat binary -o $(BIN)/$@.bin $(BIN)/$@.o - @rm $(BIN)/$@.o + $(CC) $(CCFLAGS) -I$(LIBC_INC) -o $(BIN)/$@.o -c $(SRC)/$@.c + $(LD) $(LDFLAGS) -T$(SRC)/$@.ld --oformat binary -o $(BIN)/$@.bin $(BIN)/$@.o $(LIBC) + rm $(BIN)/$@.o -# This target builds all fonts inside src/fonts +$(LIBC): $(LIBC_DIR)/**.c + @echo "Compiling $(LIBC)..." + mkdir -p $(BIN)/libc + for f in libc/*.c; do $(CC) $(CCFLAGS) -I$(LIBC_INC) -o $(BIN)/$$f.o -c $$f; done + $(LD) $(LDFLAGS) -r -o $(LIBC) $(BIN)/libc/**.o + +# This target retrieves all fonts inside src/fonts $(FONTS): - @cp $(SRC)/fonts/$@.fnt $(BIN)/$@.fnt + cp $(SRC)/fonts/$@.fnt $(BIN)/$@.fnt # Run QEMU run: qemu-system-x86_64\ - -drive format=raw,file="./kern.iso",index=0,media=disk\ + -drive format=raw,file=$(ISO),index=0,media=disk\ -m 256M -accel tcg -monitor stdio\ -rtc base=localtime,clock=host,driftfix=slew\ -audiodev coreaudio,id=audio0 -machine pcspk-audiodev=audio0 # Clean all build files clean: - @rm -rf $(BIN) - @#rm -f kern.iso - @rm -f makedisk + rm -rf $(BIN) + rm -f makedisk diff --git a/include/libc/color.h b/include/libc/color.h new file mode 100644 index 0000000..b303c8f --- /dev/null +++ b/include/libc/color.h @@ -0,0 +1,15 @@ +#ifndef COLOR_H +#define COLOR_H + +#define BLACK 0x00000000 // 0 +#define RED 0x00ff0000 // 1 +#define GREEN 0x0000ff00 // 2 +#define YELLOW 0x00ffff00 // 3 +#define BLUE 0x000000ff // 4 +#define MAGENTA 0x00ff00ff // 5 +#define CYAN 0x0000ffff // 6 +#define WHITE 0x00ffffff // 7 + +uint32_t codeToColor(uint8_t code); + +#endif diff --git a/include/c/math.h b/include/libc/math.h similarity index 100% rename from include/c/math.h rename to include/libc/math.h diff --git a/include/c/stdarg.h b/include/libc/stdarg.h similarity index 100% rename from include/c/stdarg.h rename to include/libc/stdarg.h diff --git a/include/c/stdbool.h b/include/libc/stdbool.h similarity index 100% rename from include/c/stdbool.h rename to include/libc/stdbool.h diff --git a/include/c/stddef.h b/include/libc/stddef.h similarity index 100% rename from include/c/stddef.h rename to include/libc/stddef.h diff --git a/include/c/stdint.h b/include/libc/stdint.h similarity index 100% rename from include/c/stdint.h rename to include/libc/stdint.h diff --git a/include/libc/stdio.h b/include/libc/stdio.h new file mode 100644 index 0000000..82315dd --- /dev/null +++ b/include/libc/stdio.h @@ -0,0 +1,41 @@ +#ifndef STDIO_H +#define STDIO_H + +#include + +// Nobody should have to interface with the internals of this structure +typedef struct _iobuf { // 24B + unsigned char* _ptr; // File buffer base + unsigned int _size; // Size of buffer + int _offset; // Offset into file + unsigned short _flag; // Open flags + int _file; // File descriptor + + char __reserved[6]; +} FILE; + +// Standard file pointers +extern FILE* stdin; +extern FILE* stdout; +extern FILE* stderr; + +/* File IO */ +FILE* fopen(const char* filename, const char* mode); +int fclose(FILE* stream); +size_t fread(void* ptr, size_t size, size_t count, FILE* stream); +size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream); +int fseek(FILE* stream, long int origin, int offset); +long int ftell(FILE* stream); + +/* Terminal IO */ +int printf(const char* fmt, ...); +int sprintf(char* str, const char* fmt, ...); +int snprintf(char* str, size_t n, const char* fmt, ...); +int fprintf(FILE* stream, const char* fmt, ...); +void putc(char c); +char getc(); +void print(const char* str); +void clear(); +void reads(char* str); + +#endif diff --git a/include/libc/stdlib.h b/include/libc/stdlib.h new file mode 100644 index 0000000..f02dfed --- /dev/null +++ b/include/libc/stdlib.h @@ -0,0 +1,10 @@ +#ifndef STDLIB_H +#define STDLIB_H + +#include +#include + +void* malloc(const uint32_t size); +void free(const void* ptr); + +#endif diff --git a/include/libc/string.h b/include/libc/string.h new file mode 100644 index 0000000..0bd6b49 --- /dev/null +++ b/include/libc/string.h @@ -0,0 +1,23 @@ +#ifndef STRING_H +#define STRING_H + +#include + +void* memcpy(void* src, void* dst, uint32_t length); +void* memcpy32(void* src, void* dst, uint32_t length); +void* memset(void* dst, uint8_t value, uint32_t length); + +char* itoa(uint32_t val, uint8_t base); +uint32_t atoi(const char* str); +int isSpace(char c); +char* strcpy(char* str1, const char* str2); +char* strncpy(char* str1, const char* str2, size_t n); +char* strcat(char* str1, const char* str2); +char* strncat(char* str1, const char* str2, size_t n); +char* strchr(const char* str, char c); +char* strrchr(const char* str, char c); +int strcmp(const char* str1, const char* str2); +int strncmp(const char* str1, const char* str2, size_t n); +uint32_t strlen(const char* str); + +#endif diff --git a/include/libc/syscall.h b/include/libc/syscall.h new file mode 100644 index 0000000..317bc43 --- /dev/null +++ b/include/libc/syscall.h @@ -0,0 +1,38 @@ +#ifndef SYSCALL_H +#define SYSCALL_H + +#include + +#define MAX_SYSCALLS 9 + +typedef enum { + SYS_RESERVED, + SYS_SLEEP, + SYS_READ, + SYS_WRITE, + SYS_OPEN, + SYS_CLOSE, + SYS_MALLOC, + SYS_FREE, + SYS_SEEK, +} SYSCALL_NUMBERS; + +typedef enum { + O_CREAT = 0x01, // Create if does not exist + O_RDONLY = 0x02, // Read only + O_WRONLY = 0x04, // Write only + O_RDWR = 0x08, // Read and write + O_APPEND = 0x10, // Always writes at the end (appends) + O_TRUNC = 0x20, // Truncate file size and position to 0 on Open + O_BIN = 0x40, // Read bytes, not text +} OFLAGS; + +int syscall(int nr, int arg0, int arg1, int arg2); + +/* Syscall wrappers */ +int read(int fd, void* ptr, size_t count); +int write(int fd, const void* ptr, size_t count); +int open(const char* path, int oflag); +int close(int fd); + +#endif diff --git a/include/libc/time.h b/include/libc/time.h new file mode 100644 index 0000000..cfeb5a4 --- /dev/null +++ b/include/libc/time.h @@ -0,0 +1,8 @@ +#ifndef TIME_H +#define TIME_H + +#include + +void sleep(uint32_t ms); + +#endif diff --git a/kern.iso b/kern.iso index 094b8a70c329871bbee542a71051f6efd1e9784f..5f7c6d2e34270d9da4a79131313fd0e7ec6396cc 100644 GIT binary patch delta 13451 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 #include #include #include -// Nobody should have to interface with the internals of this structure -typedef struct _iobuf { // 24B - unsigned char* _ptr; // File buffer base - unsigned int _size; // Size of buffer - int _offset; // Offset into file - unsigned short _flag; // Open flags - int _file; // File descriptor - - char __reserved[6]; -} FILE; - -FILE* stdin; -FILE* stdout; -FILE* stderr; - FILE* fopen(const char* filename, const char* mode) { int oflag = O_RDWR | O_CREAT | O_BIN; // TODO! @@ -79,5 +62,3 @@ long int ftell(FILE* stream) { return -1; } -#endif - diff --git a/include/c/_printf.h b/libc/_printf.c similarity index 96% rename from include/c/_printf.h rename to libc/_printf.c index cd3457f..de4d8f9 100644 --- a/include/c/_printf.h +++ b/libc/_printf.c @@ -1,14 +1,11 @@ -#ifndef _PRINTF_H -#define _PRINTF_H - +#include #include #include #include #include #include -#include <_fileio.h> -// Warning: returns a allocated buffer, must be freed! +// Warning: returns an allocated buffer, must be freed! char* _format(const char* fmt, va_list args) { static char* buffer; size_t len = 0; @@ -126,5 +123,3 @@ int printf(const char* fmt, ...) { return len; } -#endif - diff --git a/include/c/color.h b/libc/color.c similarity index 53% rename from include/c/color.h rename to libc/color.c index f366336..b2eabf0 100644 --- a/include/c/color.h +++ b/libc/color.c @@ -1,14 +1,5 @@ -#ifndef COLOR_H -#define COLOR_H - -#define BLACK 0x00000000 // 0 -#define RED 0x00ff0000 // 1 -#define GREEN 0x0000ff00 // 2 -#define YELLOW 0x00ffff00 // 3 -#define BLUE 0x000000ff // 4 -#define MAGENTA 0x00ff00ff // 5 -#define CYAN 0x0000ffff // 6 -#define WHITE 0x00ffffff // 7 +#include +#include uint32_t codeToColor(uint8_t code) { switch (code) { @@ -24,4 +15,3 @@ uint32_t codeToColor(uint8_t code) { } } -#endif diff --git a/libc/math.c b/libc/math.c new file mode 100644 index 0000000..e23694d --- /dev/null +++ b/libc/math.c @@ -0,0 +1,16 @@ +#ifndef MATH_H +#define MATH_H + +// Constants +#define PI 3.141592653589 // Should be good enough +#define E 2.718281828459 + +// Macros +#define abs(x) ( (x) > 0 ? (x) : -(x) ) +#define sign(x) ( (x) == 0 ? 0 : ((x) < 0 ? -1 : 1 ) ) + +#define floor(x) ( (int)(x) ) // C floors floats when converting to ints +#define round(x) ( (int)((x) + 0.5) ) // Normal rounding +#define ceil(x) ( (int)((x) + 1) ) // Always rounds up + +#endif diff --git a/libc/stdarg.c b/libc/stdarg.c new file mode 100644 index 0000000..c5f3ec8 --- /dev/null +++ b/libc/stdarg.c @@ -0,0 +1,10 @@ +#ifndef STDARG_H +#define STDARG_H + +typedef char* va_list; +#define va_start(ap, paramn) (void)((ap) = (char*)(&(paramn) + 1)) +#define va_end(ap) (void)((ap) = 0) +#define va_arg(ap, type) (((type*)((ap) = ((ap) + sizeof(type))))[-1]) + +#endif + diff --git a/libc/stdbool.c b/libc/stdbool.c new file mode 100644 index 0000000..98349dc --- /dev/null +++ b/libc/stdbool.c @@ -0,0 +1,8 @@ +#ifndef BOOL_H +#define BOOL_H + +#define bool _Bool +#define true 1 +#define false 0 + +#endif diff --git a/libc/stddef.c b/libc/stddef.c new file mode 100644 index 0000000..fbe6e30 --- /dev/null +++ b/libc/stddef.c @@ -0,0 +1,9 @@ +#ifndef STDDEF_H +#define STDDEF_H + +#define NULL ((void*)0) + +typedef unsigned int size_t; +typedef signed int ssize_t; + +#endif diff --git a/libc/stdint.c b/libc/stdint.c new file mode 100644 index 0000000..acc4ea0 --- /dev/null +++ b/libc/stdint.c @@ -0,0 +1,20 @@ +#ifndef STDINT_H +#define STDINT_H + +#include + +// Signed ints +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef signed long long int64_t; + +// Unsigned ints +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +// TODO: floats + +#endif diff --git a/include/c/stdio.h b/libc/stdio.c similarity index 83% rename from include/c/stdio.h rename to libc/stdio.c index 08255b1..6995f74 100644 --- a/include/c/stdio.h +++ b/libc/stdio.c @@ -1,20 +1,12 @@ -#ifndef STDIO_H -#define STDIO_H - +#include #include #include #include #include -/* Declarations */ -void putc(char); -char getc(); - -int printf(const char*, ...); - -/* STDIO Include */ -#include <_fileio.h> -#include <_printf.h> +FILE* stdin; +FILE* stdout; +FILE* stderr; void putc(char c) { // write(stdout, &c, 1); TODO: This doesn't work and we need to use a static variable @@ -59,4 +51,3 @@ void reads(char* buffer) { buffer[len] = '\0'; // Null terminate } -#endif diff --git a/include/c/stdlib.h b/libc/stdlib.c similarity index 82% rename from include/c/stdlib.h rename to libc/stdlib.c index e8bc904..5c623ea 100644 --- a/include/c/stdlib.h +++ b/libc/stdlib.c @@ -1,8 +1,6 @@ -#ifndef STDLIB_H -#define STDLIB_H - #include #include +#include void* malloc(const uint32_t size) { return (void*)syscall(SYS_MALLOC, size, 0, 0); @@ -12,4 +10,3 @@ void free(const void* ptr) { syscall(SYS_FREE, (int)ptr, 0, 0); } -#endif diff --git a/include/c/string.h b/libc/string.c similarity index 92% rename from include/c/string.h rename to libc/string.c index a3b25e0..ea6a71b 100644 --- a/include/c/string.h +++ b/libc/string.c @@ -1,12 +1,6 @@ -#ifndef STRING_H -#define STRING_H - +#include #include -void* memcpy(void* src, void* dst, uint32_t length); -void* memcpy32(void* src, void* dst, uint32_t length); -void* memset(void* dst, uint8_t value, uint32_t length); - // Source: http://www.strudel.org.uk/itoa/ char* itoa(uint32_t val, uint8_t base) { static char buf[32] = { 0 }; @@ -84,7 +78,7 @@ char* strchr(const char* str, char c) { return (*s == c) ? (char*)s : NULL; } -// char* strrchr(const char* str, char c); +char* strrchr(const char* str, char c) { return NULL; } // TODO int strcmp(const char* str1, const char* str2) { while (*str1 != '\0' && *str1 == *str2) { @@ -140,4 +134,3 @@ void* memset(void* dst, uint8_t value, uint32_t length) { return dst; } -#endif diff --git a/include/c/syscall.h b/libc/syscall.c similarity index 54% rename from include/c/syscall.h rename to libc/syscall.c index 2070b58..ef8ee20 100644 --- a/include/c/syscall.h +++ b/libc/syscall.c @@ -1,32 +1,8 @@ -#ifndef SYSCALL_H -#define SYSCALL_H - +#include #include #define MAX_SYSCALLS 9 -typedef enum { - SYS_RESERVED, - SYS_SLEEP, - SYS_READ, - SYS_WRITE, - SYS_OPEN, - SYS_CLOSE, - SYS_MALLOC, - SYS_FREE, - SYS_SEEK, -} SYSCALL_NUMBERS; - -typedef enum { - O_CREAT = 0x01, // Create if does not exist - O_RDONLY = 0x02, // Read only - O_WRONLY = 0x04, // Write only - O_RDWR = 0x08, // Read and write - O_APPEND = 0x10, // Always writes at the end (appends) - O_TRUNC = 0x20, // Truncate file size and position to 0 on Open - O_BIN = 0x40, // Read bytes, not text -} OFLAGS; - int syscall(int nr, int arg0, int arg1, int arg2) { int ret = 0; __asm__ volatile ("int $0x80" : "=a"(ret) : "a"(nr), "b"(arg0), "c"(arg1), "d"(arg2)); @@ -54,4 +30,3 @@ int close(int fd) { return syscall(SYS_CLOSE, fd, 0, 0); } -#endif diff --git a/include/c/time.h b/libc/time.c similarity index 72% rename from include/c/time.h rename to libc/time.c index 7842c93..ede1bf4 100644 --- a/include/c/time.h +++ b/libc/time.c @@ -1,11 +1,7 @@ -#ifndef TIME_H -#define TIME_H - +#include #include #include void sleep(uint32_t ms) { syscall(SYS_SLEEP, ms, 0, 0); } - -#endif diff --git a/src/kernel.c b/src/kernel.c index daa0d5c..fe8e4f0 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -93,6 +93,7 @@ void main() { // Run Interactive Shell Program // TODO: Make it in another file while (1) { + printf("\e[6M\x7f\x80\n"); printf("\e[6M\e[8N%s \e[2M%s \e[8M", cwd, PROMPT); char input[256]; char* inputPtr = input; diff --git a/src/stage3.c b/src/stage3.c index c26beb0..65b40a5 100644 --- a/src/stage3.c +++ b/src/stage3.c @@ -6,6 +6,7 @@ #include #include #include +#include void bigError();