Implement strstr.
[monolithium.git] / kernel / include / common.h
1 /*
2  * common.h
3  *
4  * Copyright (C) 2016 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Affero General Public License as
8  * published by the Free Software Foundation, either version 3 of the
9  * License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Affero General Public License for more details.
15  *
16  * You should have received a copy of the GNU Affero General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifndef _COMMON_H_
21 #define _COMMON_H_
22
23 #define NULL (void*)0
24 #define FALSE 0
25 #define TRUE 1
26
27 #define VARIABLE_SIZE 0
28
29 #define CHAR_MIN  -128
30 #define CHAR_MAX  127
31 #define BYTE_MIN  0
32 #define BYTE_MAX  0xFF
33 #define SHORT_MIN -32768
34 #define SHORT_MAX 32767
35 #define WORD_MIN  0
36 #define WORD_MAX  0xFFFF
37 #define INT_MIN   -2147483648
38 #define INT_MAX   2147483647
39 #define DWORD_MIN 0
40 #define DWORD_MAX 0xFFFFFFFF
41 #define QWORD_MIN 0ULL
42 #define QWORD_MAX 0xFFFFFFFFFFFFFFFFULL
43
44 #define ERR_SUCCESS   0x00000000
45 #define ERR_NOTFOUND  0xE0000001
46 #define ERR_FORBIDDEN 0xE0000002
47 #define ERR_INVALID   0xE0000003
48 #define ERR_EXISTS    0xE0000004
49 #define ERR_NOMEMORY  0xE0000005
50 #define ERR_HARDWARE  0xE0000006
51 #define ERR_BUSY      0xE0000007
52 #define ERR_NOMEDIA   0xE0000008
53 #define ERR_NOTRESP   0xE0000009
54 #define ERR_WRITEPROT 0xE000000A
55 #define ERR_NOSYSCALL 0xE000000B
56 #define ERR_TIMEOUT   0xE000000C
57 #define ERR_BADPTR    0xE000000D
58 #define ERR_CANCELED  0xE000000E
59 #define ERR_ISDIR     0xE000000F
60 #define ERR_ISNOTDIR  0xE0000010
61 #define ERR_DISKFULL  0xE0000011
62 #define ERR_MEDIACHG  0xE0000012
63 #define ERR_BEYOND    0xE0000013
64 #define ERR_SMALLBUF  0xE0000014
65 #define ERR_NOMORE    0xE0000015
66 #define MAX_ERR       0xE0000016
67
68 #define CMOS_CMD_PORT 0x70
69 #define CMOS_DATA_PORT 0x71
70
71 #define va_start(v,l) __builtin_va_start(v,l)
72 #define va_arg(v,l) __builtin_va_arg(v,l)
73 #define va_end(v) __builtin_va_end(v)
74 #define va_copy(d,s) __builtin_va_copy(d,s)
75
76 #define UNUSED_PARAMETER(x) (x)=(x)
77 #define SEGMENT_RPL(x) ((x) & 0x03)
78 #define OFFSET_OF(type, field) ((dword_t)(&((type*)NULL)->field))
79 #define CONTAINER_OF(ptr, type, field) ((type*)((dword_t)(ptr) - OFFSET_OF(type, field)))
80
81 #define MAX_PATH 16384
82
83 #define VIDEO_MEMORY 0xF0000000
84 #define TEXT_VIDEO_MEMORY 0xB8000
85 #define TEXT_COLOR_BLUE  0x01
86 #define TEXT_COLOR_GREEN 0x02
87 #define TEXT_COLOR_RED   0x04
88 #define TEXT_COLOR_STRONG 0x08
89
90 #define MIN(a, b) ((a) < (b) ? (a) : (b))
91 #define MAX(a, b) ((a) > (b) ? (a) : (b))
92
93 typedef unsigned char bool_t;
94 typedef __builtin_va_list va_list;
95 typedef unsigned char byte_t;
96 typedef unsigned short word_t;
97 typedef unsigned int dword_t;
98 typedef unsigned long long qword_t;
99 typedef bool_t critical_t;
100 typedef char int8_t;
101 typedef short int16_t;
102 typedef long int32_t;
103 typedef long long int64_t;
104
105 typedef int32_t intptr_t;
106 typedef dword_t uintptr_t;
107
108 typedef uintptr_t size_t;
109
110 static inline byte_t inportb(word_t port)
111 {
112     byte_t byte;
113     asm volatile ("inb %1, %0" : "=a"(byte) : "Nd"(port));
114     return byte;
115 }
116
117 static inline void outportb(word_t port, byte_t byte)
118 {
119     asm volatile ("outb %0, %1" :: "a"(byte), "Nd"(port));
120 }
121
122 static inline word_t inportw(unsigned short port)
123 {
124     word_t word;
125     asm volatile ("inw %1, %0" : "=a"(word) : "Nd"(port));
126     return word;
127 }
128
129 static inline void outportw(word_t port, unsigned short word)
130 {
131     asm volatile ("outw %0, %1" :: "a"(word), "Nd"(port));
132 }
133
134 static inline dword_t inportl(word_t port)
135 {
136     dword_t dword;
137     asm volatile ("inl %1, %0" : "=a"(dword) : "Nd"(port));
138     return dword;
139 }
140
141 static inline void outportl(word_t port, dword_t dword)
142 {
143     asm volatile ("outl %0, %1" :: "a"(dword), "Nd"(port));
144 }
145
146 static inline void enable_ints()
147 {
148     asm volatile ("sti");
149 }
150
151 static inline void disable_ints()
152 {
153     asm volatile ("cli");
154 }
155
156 static inline bool_t check_ints()
157 {
158     dword_t eflags;
159     asm volatile ("pushfl\npopl %0" : "=g"(eflags));
160     return (eflags & 0x200) != 0 ? TRUE : FALSE;
161 }
162
163 static inline void halt()
164 {
165     asm volatile ("hlt");
166 }
167
168 static inline void enable_nmi()
169 {
170     outportb(0x70, inportb(0x70) & 0x7F);
171 }
172
173 static inline void disable_nmi()
174 {
175     outportb(0x70, inportb(0x70) | 0x80);
176 }
177
178 static inline void set_bit(dword_t *bitfield, dword_t bit)
179 {
180     bitfield[bit >> 5] |= 1 << (bit & 0x1F);
181 }
182
183 static inline void clear_bit(dword_t *bitfield, dword_t bit)
184 {
185     bitfield[bit >> 5] &= ~(1 << (bit & 0x1F));
186 }
187
188 static inline bool_t test_bit(dword_t *bitfield, dword_t bit)
189 {
190     return (bitfield[bit >> 5] & (1 << (bit & 0x1F))) ? TRUE : FALSE;
191 }
192
193 static inline void push_to_stack(uintptr_t *stack, uintptr_t value)
194 {
195     *stack -= sizeof(uintptr_t);
196     *((uintptr_t*)(*stack)) = value;
197 }
198
199 static inline uintptr_t pop_from_stack(uintptr_t *stack)
200 {
201     uintptr_t value = *((uintptr_t*)(*stack));
202     *stack += sizeof(uintptr_t);
203     return value;
204 }
205
206 void enter_critical(critical_t *critical);
207 void leave_critical(critical_t *critical);
208 int strlen(const char *str);
209 void strrev(char *str);
210 char *strcpy(char *destination, const char *source);
211 char *strcat(char *destination, const char *source);
212 char *strncpy(char *destination, const char *source, dword_t num);
213 int strcmp(const char *str1, const char *str2);
214 char *strchr(const char *str, char c);
215 char *strrchr(const char *str, char c);
216 int strncmp(const char *str1, const char *str2, int length);
217 char *strstr(const char *haystack, const char *needle);
218 char *strtok(char *str, const char *delimiters, char **endptr);
219 dword_t strtoul(const char *str, char **endptr, int base);
220 qword_t strtoull(const char *str, char **endptr, int base);
221 char *strdup(const char *source);
222 int isprint(int c);
223 int isdigit(int c);
224 int isxdigit(int c);
225 int isspace(int c);
226 char tolower(char c);
227 char toupper(char c);
228 void memset(void *ptr, byte_t value, dword_t size);
229 int memcmp(const void *mem1, const void *mem2, dword_t size);
230 void memcpy(void *destination, const void *source, dword_t size);
231 void memmove(void *destination, const void *source, dword_t size);
232 char *itoa(int value, char *str, int base);
233 void putchar(char character);
234 void puts(const char *string);
235 void clearscreen();
236 void set_text_color(byte_t color);
237 int vsnprintf(char *output, dword_t count, const char *format, va_list args);
238 int vsprintf(char *output, const char *format, va_list args);
239 int snprintf(char *output, dword_t count, const char *format, ...);
240 int vprintf(const char *format, va_list args);
241 int printf(const char *format, ...);
242 int sprintf(char *output, const char *format, ...);
243 const char *get_error_string(dword_t err_code);
244 int max(int a, int b);
245 int min(int a, int b);
246 void qsort(void *base, dword_t nmemb, dword_t size, int (*compare)(const void*, const void*));
247 void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compare)(const void*, const void*));
248
249 #endif