summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--grub.cfg4
-rw-r--r--include/term.h3
-rw-r--r--src/arch/amd64/acpi.c188
-rw-r--r--src/arch/amd64/boot.S58
-rw-r--r--src/arch/amd64/idt.S162
-rw-r--r--src/arch/amd64/linker.ld48
-rw-r--r--src/arch/amd64/mboot.c44
-rw-r--r--src/arch/amd64/pic.c2
-rw-r--r--src/lib.c256
9 files changed, 381 insertions, 384 deletions
diff --git a/grub.cfg b/grub.cfg
index fedceac..3aa3a12 100644
--- a/grub.cfg
+++ b/grub.cfg
@@ -2,6 +2,6 @@ set timeout=1
set default=0
menuentry "corn" {
- multiboot2 /boot/kernel.bin
- boot
+ multiboot2 /boot/kernel.bin
+ boot
}
diff --git a/include/term.h b/include/term.h
deleted file mode 100644
index 07ebacb..0000000
--- a/include/term.h
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-
diff --git a/src/arch/amd64/acpi.c b/src/arch/amd64/acpi.c
index 732add7..83f2014 100644
--- a/src/arch/amd64/acpi.c
+++ b/src/arch/amd64/acpi.c
@@ -65,79 +65,79 @@ struct xsdt {
// generic address structure
struct gas {
- uint8_t address_space;
- uint8_t bit_width;
- uint8_t bit_offset;
- uint8_t access_size;
- uint64_t address;
+ uint8_t address_space;
+ uint8_t bit_width;
+ uint8_t bit_offset;
+ uint8_t access_size;
+ uint64_t address;
};
// fixed acpi description table
struct fadt {
- struct acpi_header h;
- uint32_t firmware_ctrl;
- uint32_t dsdt;
+ struct acpi_header h;
+ uint32_t firmware_ctrl;
+ uint32_t dsdt;
- // field used in ACPI 1.0; no longer in use, for compatibility only
- uint8_t reserved;
+ // field used in ACPI 1.0; no longer in use, for compatibility only
+ uint8_t reserved;
- uint8_t preferred_power_management_profile;
- uint16_t sci_interrupt;
- uint32_t smi_command_port;
- uint8_t acpi_enable;
- uint8_t acpi_disable;
- uint8_t s4bios_req;
- uint8_t pstate_control;
- uint32_t pm1_a_event_block;
- uint32_t pm1_b_event_block;
- uint32_t pm1_a_control_block;
- uint32_t pm1_b_control_block;
- uint32_t pm2_control_block;
- uint32_t pm_timer_block;
- uint32_t gpe0_block;
- uint32_t gpe1_block;
- uint8_t pm1_event_length;
- uint8_t pm1_control_length;
- uint8_t pm2_control_length;
- uint8_t pm_timer_length;
- uint8_t gpe0_length;
- uint8_t gpe1_length;
- uint8_t gpe1_base;
- uint8_t cstate_control;
- uint16_t worst_c2_latency;
- uint16_t worst_c3_latency;
- uint16_t flush_size;
- uint16_t flush_stride;
- uint8_t duty_offset;
- uint8_t duty_width;
- uint8_t day_alarm;
- uint8_t month_alarm;
- uint8_t century;
+ uint8_t preferred_power_management_profile;
+ uint16_t sci_interrupt;
+ uint32_t smi_command_port;
+ uint8_t acpi_enable;
+ uint8_t acpi_disable;
+ uint8_t s4bios_req;
+ uint8_t pstate_control;
+ uint32_t pm1_a_event_block;
+ uint32_t pm1_b_event_block;
+ uint32_t pm1_a_control_block;
+ uint32_t pm1_b_control_block;
+ uint32_t pm2_control_block;
+ uint32_t pm_timer_block;
+ uint32_t gpe0_block;
+ uint32_t gpe1_block;
+ uint8_t pm1_event_length;
+ uint8_t pm1_control_length;
+ uint8_t pm2_control_length;
+ uint8_t pm_timer_length;
+ uint8_t gpe0_length;
+ uint8_t gpe1_length;
+ uint8_t gpe1_base;
+ uint8_t cstate_control;
+ uint16_t worst_c2_latency;
+ uint16_t worst_c3_latency;
+ uint16_t flush_size;
+ uint16_t flush_stride;
+ uint8_t duty_offset;
+ uint8_t duty_width;
+ uint8_t day_alarm;
+ uint8_t month_alarm;
+ uint8_t century;
- // reserved in ACPI 1.0; used since ACPI 2.0+
- uint16_t boot_architecture_flags;
+ // reserved in ACPI 1.0; used since ACPI 2.0+
+ uint16_t boot_architecture_flags;
- uint8_t reserved_2;
- uint32_t flags;
+ uint8_t reserved_2;
+ uint32_t flags;
- // 12 byte structure; see below for details
- struct gas reset_reg;
+ // 12 byte structure; see below for details
+ struct gas reset_reg;
- uint8_t reset_value;
- uint8_t reserved_3[3];
+ uint8_t reset_value;
+ uint8_t reserved_3[3];
- // 64bit pointers - Available on ACPI 2.0+
- uint64_t x_firmware_control;
- uint64_t x_dsdt;
+ // 64bit pointers - Available on ACPI 2.0+
+ uint64_t x_firmware_control;
+ uint64_t x_dsdt;
- struct gas x_pm1_a_event_block;
- struct gas x_pm1_b_event_block;
- struct gas x_pm1_a_control_block;
- struct gas x_pm1_b_control_block;
- struct gas x_pm2_control_block;
- struct gas x_pm_timer_block;
- struct gas x_gpe0_block;
- struct gas x_gpe1_block;
+ struct gas x_pm1_a_event_block;
+ struct gas x_pm1_b_event_block;
+ struct gas x_pm1_a_control_block;
+ struct gas x_pm1_b_control_block;
+ struct gas x_pm2_control_block;
+ struct gas x_pm_timer_block;
+ struct gas x_gpe0_block;
+ struct gas x_gpe1_block;
};
struct acpi_state {
@@ -154,49 +154,49 @@ struct acpi_state {
};
static bool checksum(uint8_t *data, size_t len) {
- unsigned char sum = 0;
- for (size_t i = 0; i < len; i++)
- sum += data[i];
- return sum == 0;
+ unsigned char sum = 0;
+ for (size_t i = 0; i < len; i++)
+ sum += data[i];
+ return sum == 0;
}
static int read_s5_addr(struct acpi_state *state) {
serial_out_str("a");
- uintptr_t ptr = state->fadt.dsdt;
- char *s5_addr = (void*) (ptr + 36);
+ uintptr_t ptr = state->fadt.dsdt;
+ char *s5_addr = (void*) (ptr + 36);
serial_out_str("a");
- int dsdt_len = *((int*) (ptr+1)) - 36;
- while (0 < dsdt_len--) {
- if ( memcmp(s5_addr, "_S5_", 4) == 0)
- break;
- s5_addr++;
- }
+ int dsdt_len = *((int*) (ptr+1)) - 36;
+ while (0 < dsdt_len--) {
+ if ( memcmp(s5_addr, "_S5_", 4) == 0)
+ break;
+ s5_addr++;
+ }
- if (dsdt_len > 0) {
- // check for valid AML structure
- if ( ( *(s5_addr-1) == 0x08 || ( *(s5_addr-2) == 0x08 && *(s5_addr-1) == '\\') ) && *(s5_addr+4) == 0x12 ) {
- s5_addr += 5;
- s5_addr += ((*s5_addr &0xC0)>>6) +2; // calculate PkgLength size
+ if (dsdt_len > 0) {
+ // check for valid AML structure
+ if ( ( *(s5_addr-1) == 0x08 || ( *(s5_addr-2) == 0x08 && *(s5_addr-1) == '\\') ) && *(s5_addr+4) == 0x12 ) {
+ s5_addr += 5;
+ s5_addr += ((*s5_addr &0xC0)>>6) +2; // calculate PkgLength size
- if (*s5_addr == 0x0A)
- s5_addr++; // skip byteprefix
- state->SLP_TYPa = *(s5_addr)<<10;
- s5_addr++;
+ if (*s5_addr == 0x0A)
+ s5_addr++; // skip byteprefix
+ state->SLP_TYPa = *(s5_addr)<<10;
+ s5_addr++;
- if (*s5_addr == 0x0A)
- s5_addr++; // skip byteprefix
- state->SLP_TYPb = *(s5_addr)<<10;
+ if (*s5_addr == 0x0A)
+ s5_addr++; // skip byteprefix
+ state->SLP_TYPb = *(s5_addr)<<10;
- state->SLP_EN = 1<<13;
- state->SCI_EN = 1;
+ state->SLP_EN = 1<<13;
+ state->SCI_EN = 1;
- } else {
+ } else {
return -1;
- }
- } else {
- return -1;
- }
+ }
+ } else {
+ return -1;
+ }
return -1;
}
@@ -302,12 +302,12 @@ int acpi_init(void *rootsdp) {
if (!ret)
return ret;
- outb(state.fadt.smi_command_port,state.fadt.acpi_enable);
+ outb(state.fadt.smi_command_port,state.fadt.acpi_enable);
return 0;
}
int acpi_shutdown(void) {
- outw((unsigned int) state.fadt.pm1_a_control_block, state.SLP_TYPb | state.SLP_EN);
+ outw((unsigned int) state.fadt.pm1_a_control_block, state.SLP_TYPb | state.SLP_EN);
return -1;
}
diff --git a/src/arch/amd64/boot.S b/src/arch/amd64/boot.S
index 6768beb..55d942b 100644
--- a/src/arch/amd64/boot.S
+++ b/src/arch/amd64/boot.S
@@ -26,17 +26,17 @@ mb_end:
section .bss
align 4096
-kernel_pml4: ; reserve memory for initial 512 pml4 entires
+kernel_pml4: ; reserve memory for initial 512 pml4 entires
resb 4096
-kernel_pdpt_0: ; reserve memory for initial 512 pdpt entires
+kernel_pdpt_0: ; reserve memory for initial 512 pdpt entires
resb 4096
-kernel_pd_0: ; reserve memory for initial 512 pd entries
+kernel_pd_0: ; reserve memory for initial 512 pd entries
resb 4096
-kernel_pt_0: ; reserve memory for initial 512 pt entries
+kernel_pt_0: ; reserve memory for initial 512 pt entries
resb 4096
-paging_pt: ; reserve pages for pager mappings
+paging_pt: ; reserve pages for pager mappings
resb 4096
-bootstrap_pt: ; reserve pages to bootstrap pager
+bootstrap_pt: ; reserve pages to bootstrap pager
resb 4096
align 16
@@ -53,33 +53,33 @@ EXEC equ 1 << 3
DC equ 1 << 2
RW equ 1 << 1
ACCESSED equ 1 << 0
-
+
; Flags bits
GRAN_4K equ 1 << 7
SZ_32 equ 1 << 6
LONG_MODE equ 1 << 5
-
+
GDT:
- .Null: equ $ - GDT
- dq 0
- .Code: equ $ - GDT
- dd 0xFFFF ; Limit & Base (low, bits 0-15)
- db 0 ; Base (mid, bits 16-23)
- db PRESENT | NOT_SYS | EXEC | RW ; Access
- db GRAN_4K | LONG_MODE | 0xF ; Flags & Limit (high, bits 16-19)
- db 0 ; Base (high, bits 24-31)
- .Data: equ $ - GDT
- dd 0xFFFF ; Limit & Base (low, bits 0-15)
- db 0 ; Base (mid, bits 16-23)
- db PRESENT | NOT_SYS | RW ; Access
- db GRAN_4K | SZ_32 | 0xF ; Flags & Limit (high, bits 16-19)
- db 0 ; Base (high, bits 24-31)
- .TSS: equ $ - GDT
- dd 0x00000068
- dd 0x00CF8900
- .Pointer:
- dw $ - GDT - 1
- dq GDT
+ .Null: equ $ - GDT
+ dq 0
+ .Code: equ $ - GDT
+ dd 0xFFFF ; Limit & Base (low, bits 0-15)
+ db 0 ; Base (mid, bits 16-23)
+ db PRESENT | NOT_SYS | EXEC | RW ; Access
+ db GRAN_4K | LONG_MODE | 0xF ; Flags & Limit (high, bits 16-19)
+ db 0 ; Base (high, bits 24-31)
+ .Data: equ $ - GDT
+ dd 0xFFFF ; Limit & Base (low, bits 0-15)
+ db 0 ; Base (mid, bits 16-23)
+ db PRESENT | NOT_SYS | RW ; Access
+ db GRAN_4K | SZ_32 | 0xF ; Flags & Limit (high, bits 16-19)
+ db 0 ; Base (high, bits 24-31)
+ .TSS: equ $ - GDT
+ dd 0x00000068
+ dd 0x00CF8900
+ .Pointer:
+ dw $ - GDT - 1
+ dq GDT
section .text
align 8
@@ -107,7 +107,7 @@ start:
mov ebx, 0x00000003 ; Set the B-register to 0x00000003.
mov ecx, 512 ; Set the C-register to 512.
-
+
.SetEntry:
mov DWORD [edi], ebx ; Set the uint32_t at the destination index to the B-register.
add ebx, 0x1000 ; Add 0x1000 to the B-register.
diff --git a/src/arch/amd64/idt.S b/src/arch/amd64/idt.S
index 8cb537e..33d488a 100644
--- a/src/arch/amd64/idt.S
+++ b/src/arch/amd64/idt.S
@@ -7,39 +7,39 @@ extern idt_pic_mouse
extern idt_pic_eoi
%macro PUSHALL 0
- push rax
- push rbx
- push rcx
- push rdx
- push rbp
- push rdi
- push rsi
- push r8
- push r9
- push r10
- push r11
- push r12
- push r13
- push r14
- push r15
+ push rax
+ push rbx
+ push rcx
+ push rdx
+ push rbp
+ push rdi
+ push rsi
+ push r8
+ push r9
+ push r10
+ push r11
+ push r12
+ push r13
+ push r14
+ push r15
%endmacro
%macro POPALL 0
- pop r15
- pop r14
- pop r13
- pop r12
- pop r11
- pop r10
- pop r9
- pop r8
- pop rsi
- pop rdi
- pop rbp
- pop rdx
- pop rcx
- pop rbx
- pop rax
+ pop r15
+ pop r14
+ pop r13
+ pop r12
+ pop r11
+ pop r10
+ pop r9
+ pop r8
+ pop rsi
+ pop rdi
+ pop rbp
+ pop rdx
+ pop rcx
+ pop rbx
+ pop rax
%endmacro
; call the exception handler with the interrupt number
@@ -47,15 +47,15 @@ extern idt_pic_eoi
%macro ISRException 1
align 8
isr_stub_%+%1:
- PUSHALL
- cld
- mov rdi, %1 ; exception number
- mov rsi, 0 ; placeholder error code
- mov rdx, [rsp + 15 * 8] ; instruction pointer
- mov rcx, rbp ; base pointer for stack trace
- call idt_exception_handler
- POPALL
- iretq
+ PUSHALL
+ cld
+ mov rdi, %1 ; exception number
+ mov rsi, 0 ; placeholder error code
+ mov rdx, [rsp + 15 * 8] ; instruction pointer
+ mov rcx, rbp ; base pointer for stack trace
+ call idt_exception_handler
+ POPALL
+ iretq
%endmacro
; call the exception handler with the interrupt number
@@ -64,59 +64,59 @@ isr_stub_%+%1:
%macro ISRExceptionCode 1
align 8
isr_stub_%+%1:
- PUSHALL
- cld
- mov rdi, %1 ; exception number
- mov rsi, [rsp + 15 * 8] ; error code
- mov rdx, [rsp + 16 * 8] ; instruction pointer
- mov rcx, rbp ; base pointer for stack trace
- call idt_exception_handler
- POPALL
- sub rsp, 8 ; discard error code
- iretq
+ PUSHALL
+ cld
+ mov rdi, %1 ; exception number
+ mov rsi, [rsp + 15 * 8] ; error code
+ mov rdx, [rsp + 16 * 8] ; instruction pointer
+ mov rcx, rbp ; base pointer for stack trace
+ call idt_exception_handler
+ POPALL
+ sub rsp, 8 ; discard error code
+ iretq
%endmacro
%macro PICGeneric 1
isr_stub_%+%1:
- PUSHALL
- cld
- mov rdi, %1
- call idt_pic_eoi
- POPALL
- iretq
+ PUSHALL
+ cld
+ mov rdi, %1
+ call idt_pic_eoi
+ POPALL
+ iretq
%endmacro
%macro PICTimer 1
isr_stub_%+%1:
- PUSHALL
- cld
- call idt_pic_timer
- mov rdi, %1
- call idt_pic_eoi
- POPALL
- iretq
+ PUSHALL
+ cld
+ call idt_pic_timer
+ mov rdi, %1
+ call idt_pic_eoi
+ POPALL
+ iretq
%endmacro
%macro PICKeyboard 1
isr_stub_%+%1:
- PUSHALL
- cld
- call idt_pic_keyboard
- mov rdi, %1
- call idt_pic_eoi
- POPALL
- iretq
+ PUSHALL
+ cld
+ call idt_pic_keyboard
+ mov rdi, %1
+ call idt_pic_eoi
+ POPALL
+ iretq
%endmacro
%macro PICMouse 1
isr_stub_%+%1:
- PUSHALL
- cld
- call idt_pic_mouse
- mov rdi, %1
- call idt_pic_eoi
- POPALL
- iretq
+ PUSHALL
+ cld
+ call idt_pic_mouse
+ mov rdi, %1
+ call idt_pic_eoi
+ POPALL
+ iretq
%endmacro
; do nothing
@@ -124,7 +124,7 @@ isr_stub_%+%1:
%macro ISRIgnore 1
align 8
isr_stub_%+%1:
- iretq
+ iretq
%endmacro
; isr stubs
@@ -164,7 +164,7 @@ ISRExceptionCode 29
ISRExceptionCode 30
ISRException 31
-PICTimer 32 ; 0
+PICTimer 32 ; 0
PICKeyboard 33 ; 1
PICGeneric 34 ; 2
PICGeneric 35 ; 3
@@ -184,8 +184,8 @@ PICGeneric 47 ; 15
; ignore other interrupts
%assign i 48
%rep 256 - i
- ISRIgnore i
- %assign i i+1
+ ISRIgnore i
+ %assign i i+1
%endrep
; isr stub table
@@ -196,6 +196,6 @@ align 16
isr_stub_table:
%assign i 0
%rep 256
- dq isr_stub_%+i
+ dq isr_stub_%+i
%assign i i+1
%endrep
diff --git a/src/arch/amd64/linker.ld b/src/arch/amd64/linker.ld
index a9484d4..4d0596c 100644
--- a/src/arch/amd64/linker.ld
+++ b/src/arch/amd64/linker.ld
@@ -1,38 +1,38 @@
ENTRY(start)
PHDRS {
- loadable PT_LOAD FLAGS(7) ;
+ loadable PT_LOAD FLAGS(7) ;
}
SECTIONS {
- . = 1M;
+ . = 1M;
- kernel_start = .;
+ kernel_start = .;
- .boot BLOCK(4K) : ALIGN(4K)
- {
- *(.multiboot)
- }
+ .boot BLOCK(4K) : ALIGN(4K)
+ {
+ *(.multiboot)
+ }
- .rodata BLOCK(4K) : ALIGN(4K)
- {
- *(.rodata)
- }
+ .rodata BLOCK(4K) : ALIGN(4K)
+ {
+ *(.rodata)
+ }
- .text BLOCK(4K) : ALIGN(4K)
- {
- *(.text)
- }
+ .text BLOCK(4K) : ALIGN(4K)
+ {
+ *(.text)
+ }
- .bss BLOCK(4K) : ALIGN(4K)
- {
- *(.bss)
- }
+ .bss BLOCK(4K) : ALIGN(4K)
+ {
+ *(.bss)
+ }
- .symtab : {
- symtab = .;
- *(.symtab)
- } :loadable
+ .symtab : {
+ symtab = .;
+ *(.symtab)
+ } :loadable
- kernel_end = .;
+ kernel_end = .;
}
diff --git a/src/arch/amd64/mboot.c b/src/arch/amd64/mboot.c
index 7fd3f62..6c3c413 100644
--- a/src/arch/amd64/mboot.c
+++ b/src/arch/amd64/mboot.c
@@ -133,10 +133,10 @@ static void read_cmdline(
struct mboot_cmdline *cmdline
) {
mboot_uint32_t size = cmdline->size - 8;
- if (size >= CMDLINE_MAX)
+ if (size >= CMDLINE_MAX)
size = CMDLINE_MAX; // truncate :(
- memcpy(shim_info->cmdline, cmdline->cmdline, size);
- shim_info->cmdline[size] = '\0';
+ memcpy(shim_info->cmdline, cmdline->cmdline, size);
+ shim_info->cmdline[size] = '\0';
}
static void read_memorymap(
@@ -146,8 +146,8 @@ static void read_memorymap(
int size = map->size - sizeof(mboot_uint32_t) * 4;
int count = size / map->entry_size;
- shim_info->map.entry_count = count;
- shim_info->map.entry_length = map->entry_size;
+ shim_info->map.entry_count = count;
+ shim_info->map.entry_length = map->entry_size;
shim_info->map.entries = map->entries;
}
@@ -157,19 +157,19 @@ static void read_rsdp(
) {
if (shim_info->acpi_table != NULL)
return; // xsdp is newer and has been loaded
- shim_info->acpi_table = rsdp->rsdp;
+ shim_info->acpi_table = rsdp->rsdp;
}
static void read_xsdp(
struct boot_info *shim_info,
struct mboot_xsdp *xsdp
) {
- shim_info->acpi_table = xsdp->xsdp;
+ shim_info->acpi_table = xsdp->xsdp;
}
void mboot_load_info(
- const void *mboot_data_ptr,
- struct boot_info *shim_info
+ const void *mboot_data_ptr,
+ struct boot_info *shim_info
) {
memset(shim_info, 0, sizeof(struct boot_info));
@@ -180,41 +180,41 @@ void mboot_load_info(
char *tag_ptr = mboot_info->tags;
while (tag_ptr < mboot_end) {
- struct mboot_tag *tag = (struct mboot_tag *) tag_ptr;
+ struct mboot_tag *tag = (struct mboot_tag *) tag_ptr;
switch (tag->type) {
case MBOOT_CMDLINE:
- read_cmdline(
+ read_cmdline(
shim_info,
(struct mboot_cmdline *) tag
);
- break;
- case MBOOT_MEMORYMAP:
- read_memorymap(
+ break;
+ case MBOOT_MEMORYMAP:
+ read_memorymap(
shim_info,
(struct mboot_memory_map *) tag
);
- break;
- case MBOOT_SYMBOLS:
+ break;
+ case MBOOT_SYMBOLS:
read_symbols(
shim_info,
(struct mboot_elf_header_layout *) tag
);
- break;
- case MBOOT_RSDP:
- read_rsdp(
+ break;
+ case MBOOT_RSDP:
+ read_rsdp(
shim_info,
(struct mboot_rsdp *) tag
);
- break;
+ break;
case MBOOT_XSDP:
read_xsdp(
shim_info,
(struct mboot_xsdp *) tag
);
break;
- default:
- break;
+ default:
+ break;
}
int size = tag->size;
diff --git a/src/arch/amd64/pic.c b/src/arch/amd64/pic.c
index b4907d0..658911c 100644
--- a/src/arch/amd64/pic.c
+++ b/src/arch/amd64/pic.c
@@ -15,7 +15,7 @@
#define ICW1_INTERVAL4 0x04 /* Call address interval 4 (8) */
#define ICW1_LEVEL 0x08 /* Level triggered (edge) mode */
#define ICW1_INIT 0x10 /* Initialization - required! */
-
+
#define ICW4_8086 0x01 /* 8086/88 (MCS-80/85) mode */
#define ICW4_AUTO 0x02 /* Auto (normal) EOI */
#define ICW4_BUF_SLAVE 0x08 /* Buffered mode/slave */
diff --git a/src/lib.c b/src/lib.c
index d01252d..db09dda 100644
--- a/src/lib.c
+++ b/src/lib.c
@@ -3,37 +3,37 @@
#include <stddef.h>
int memcmp(const void *restrict vl, const void *restrict vr, unsigned long n) {
- const unsigned char *l = vl, *r = vr;
- for (; n && *l == *r; n--, l++, r++);
- return n ? *l-*r : 0;
+ const unsigned char *l = vl, *r = vr;
+ for (; n && *l == *r; n--, l++, r++);
+ return n ? *l-*r : 0;
}
void *memcpy(void *restrict dest, const void *restrict src, unsigned long n) {
char *d = dest;
- const char *s = src;
- for (; n; n--) *d++ = *s++;
- return dest;
+ const char *s = src;
+ for (; n; n--) *d++ = *s++;
+ return dest;
}
void *memmove(void *dest, const void *src, unsigned long n) {
- char *d = dest;
- const char *s = src;
+ char *d = dest;
+ const char *s = src;
- if (d==s) return d;
+ if (d==s) return d;
- if (d<s) {
- for (; n; n--) *d++ = *s++;
- } else {
- while (n) n--, d[n] = s[n];
- }
+ if (d<s) {
+ for (; n; n--) *d++ = *s++;
+ } else {
+ while (n) n--, d[n] = s[n];
+ }
- return dest;
+ return dest;
}
void *memset(void *restrict dest, int c, unsigned long n) {
- unsigned char *d = dest;
- for (; n; n--) *d++ = c;
- return dest;
+ unsigned char *d = dest;
+ for (; n; n--) *d++ = c;
+ return dest;
}
int strncmp(const char *restrict lhs, const char *restrict rhs, unsigned long n) {
@@ -55,55 +55,55 @@ char *strncpy(char *restrict dest, const char *restrict src, unsigned long n) {
}
size_t strlen(const char *str) {
- const char *p;
- for(p = str; *p != 0; p++) {}
- return p - str;
+ const char *p;
+ for(p = str; *p != 0; p++) {}
+ return p - str;
}
char *strcat(char *restrict dst, const char *restrict src) {
- strcpy(dst + strlen(dst), src);
- return dst;
+ strcpy(dst + strlen(dst), src);
+ return dst;
}
int isspace(int c) {
- switch (c) {
- case ' ':
- case '\t':
- case '\v':
- case '\f':
- case '\r':
- case '\n':
- return 1;
- default:
- return 0;
- }
+ switch (c) {
+ case ' ':
+ case '\t':
+ case '\v':
+ case '\f':
+ case '\r':
+ case '\n':
+ return 1;
+ default:
+ return 0;
+ }
}
int isdigit(int c) {
- return c - '0' > -1 && c - '0' < 10;
+ return c - '0' > -1 && c - '0' < 10;
}
#define ATOX(name, type) \
- type name(const char* s) { \
- for(; isspace(*s); s++); \
- int neg = 0; \
- switch (*s) { \
- case '-': \
- neg = 1; \
- /* FALLTHRU */ \
- case '+': \
- s++; \
- break; \
- } \
- type num = 0; \
- for (; *s == '0'; s++); \
- for (; isdigit(*s); s++) { \
- num *= 10; \
- num += *s - '0'; \
- } \
- return num * (neg ? -1 : 1); \
- }
+ type name(const char* s) { \
+ for(; isspace(*s); s++); \
+ int neg = 0; \
+ switch (*s) { \
+ case '-': \
+ neg = 1; \
+ /* FALLTHRU */ \
+ case '+': \
+ s++; \
+ break; \
+ } \
+ type num = 0; \
+ for (; *s == '0'; s++); \
+ for (; isdigit(*s); s++) { \
+ num *= 10; \
+ num += *s - '0'; \
+ } \
+ return num * (neg ? -1 : 1); \
+ }
ATOX(atoi, int)
ATOX(atol, long int)
@@ -118,7 +118,7 @@ char itoc(int i) {
}
int ctoi(char c) {
- if(c < 'A') {
+ if(c < 'A') {
return c - '0';
} else if(c < 'a') {
return c - 'A' + 10;
@@ -128,89 +128,89 @@ int ctoi(char c) {
}
#define UXTOA(type, name) \
- char *name(unsigned type n, char *buffer, int radix) { \
- if (n == 0) { \
- buffer[0] = '0'; \
- buffer[1] = '\0'; \
- return buffer; \
- } \
- char *start = buffer; \
- for (; n; n /= radix) { \
- *buffer++ = itoc(n % radix); \
- } \
- *buffer-- = '\0'; \
- while(buffer > start) { \
- char tmp = *start; \
- *start++ = *buffer; \
- *buffer-- = tmp; \
- } \
- return buffer; \
- }
+ char *name(unsigned type n, char *buffer, int radix) { \
+ if (n == 0) { \
+ buffer[0] = '0'; \
+ buffer[1] = '\0'; \
+ return buffer; \
+ } \
+ char *start = buffer; \
+ for (; n; n /= radix) { \
+ *buffer++ = itoc(n % radix); \
+ } \
+ *buffer-- = '\0'; \
+ while(buffer > start) { \
+ char tmp = *start; \
+ *start++ = *buffer; \
+ *buffer-- = tmp; \
+ } \
+ return buffer; \
+ }
UXTOA(int, utoa)
UXTOA(long int, ultoa)
#define XTOA(type, name) \
- char *name(type n, char* buffer, int radix) { \
- if (n == 0) { \
- buffer[0] = '0'; \
- buffer[1] = '\0'; \
- return buffer; \
- } \
- if (n < 0) { \
- *buffer++ = '-'; \
- n = -n; \
- } \
- char *start = buffer; \
- for (; n; n /= radix) { \
- *buffer++ = itoc(n % radix); \
- } \
- *buffer-- = '\0'; \
- while(buffer > start) { \
- char tmp = *start; \
- *start++ = *buffer; \
- *buffer-- = tmp; \
- } \
- return buffer; \
- }
+ char *name(type n, char* buffer, int radix) { \
+ if (n == 0) { \
+ buffer[0] = '0'; \
+ buffer[1] = '\0'; \
+ return buffer; \
+ } \
+ if (n < 0) { \
+ *buffer++ = '-'; \
+ n = -n; \
+ } \
+ char *start = buffer; \
+ for (; n; n /= radix) { \
+ *buffer++ = itoc(n % radix); \
+ } \
+ *buffer-- = '\0'; \
+ while(buffer > start) { \
+ char tmp = *start; \
+ *start++ = *buffer; \
+ *buffer-- = tmp; \
+ } \
+ return buffer; \
+ }
XTOA(int, itoa)
XTOA(long int, ltoa)
#define STRTOX(name, type) \
- type name(const char *s, char **endptr, int radix) { \
- *endptr = NULL; \
- for(; isspace(*s); s++); \
- int neg = 0; \
- switch (*s) { \
- case '-': \
- neg = 1; \
- /* FALLTHRU */ \
- case '+': \
- s++; \
- break; \
- } \
- if (!radix) { \
- if (*s == '0') { \
- s++; \
- if (*s == 'x' || *s == 'X') { \
- s++; \
- radix = 16; \
- } else { \
- radix = 8; \
- } \
- } else { \
- radix = 10; \
- } \
- } \
- for (; *s == '0'; s++, *endptr = (void*) s); \
- type num = 0; \
- for (; isdigit(*s); s++, *endptr = (void*) s) { \
- num *= radix; \
- num += *s - '0'; \
- } \
- return num * (neg ? -1 : 1); \
- }
+ type name(const char *s, char **endptr, int radix) { \
+ *endptr = NULL; \
+ for(; isspace(*s); s++); \
+ int neg = 0; \
+ switch (*s) { \
+ case '-': \
+ neg = 1; \
+ /* FALLTHRU */ \
+ case '+': \
+ s++; \
+ break; \
+ } \
+ if (!radix) { \
+ if (*s == '0') { \
+ s++; \
+ if (*s == 'x' || *s == 'X') { \
+ s++; \
+ radix = 16; \
+ } else { \
+ radix = 8; \
+ } \
+ } else { \
+ radix = 10; \
+ } \
+ } \
+ for (; *s == '0'; s++, *endptr = (void*) s); \
+ type num = 0; \
+ for (; isdigit(*s); s++, *endptr = (void*) s) { \
+ num *= radix; \
+ num += *s - '0'; \
+ } \
+ return num * (neg ? -1 : 1); \
+ }
STRTOX(strtoi, int)
STRTOX(strtol, long int)