69 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			69 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#include "stdlib.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef KINC_WASM
							 | 
						||
| 
								 | 
							
								__attribute__((import_module("imports"), import_name("js_fprintf"))) void js_fprintf(const char *format);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define HEAP_SIZE 1024 * 1024 * 8
							 | 
						||
| 
								 | 
							
								static unsigned char heap[HEAP_SIZE];
							 | 
						||
| 
								 | 
							
								static size_t heap_top = 4;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef KINC_WASM
							 | 
						||
| 
								 | 
							
								__attribute__((export_name("malloc"))) 
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								void *malloc(size_t size) {
							 | 
						||
| 
								 | 
							
								#ifdef KINC_WASM
							 | 
						||
| 
								 | 
							
									// Align to 4 bytes to make js typed arrays work
							 | 
						||
| 
								 | 
							
									if (size % 4 != 0) {
							 | 
						||
| 
								 | 
							
										size += 4 - size % 4;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									size_t old_top = heap_top;
							 | 
						||
| 
								 | 
							
									heap_top += size;
							 | 
						||
| 
								 | 
							
									if (heap_top >= HEAP_SIZE) {
							 | 
						||
| 
								 | 
							
										js_fprintf("malloc: out of memory");
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return &heap[old_top];
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
									return NULL;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void *alloca(size_t size) {
							 | 
						||
| 
								 | 
							
									return NULL;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void *realloc(void *mem, size_t size) {
							 | 
						||
| 
								 | 
							
									return NULL;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void free(void *mem) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void *memset(void *ptr, int value, size_t num) {
							 | 
						||
| 
								 | 
							
									unsigned char *data = (unsigned char *)ptr;
							 | 
						||
| 
								 | 
							
									for (size_t i = 0; i < num; ++i) {
							 | 
						||
| 
								 | 
							
										data[i] = (unsigned char)value;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return ptr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void *memcpy(void *destination, const void *source, size_t num) {
							 | 
						||
| 
								 | 
							
									unsigned char *s = (unsigned char *)source;
							 | 
						||
| 
								 | 
							
									unsigned char *d = (unsigned char *)destination;
							 | 
						||
| 
								 | 
							
									for (size_t i = 0; i < num; ++i) {
							 | 
						||
| 
								 | 
							
										d[i] = s[i];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return destination;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int memcmp(const void *ptr1, const void *ptr2, size_t num) {
							 | 
						||
| 
								 | 
							
									unsigned char *p1 = (unsigned char *)ptr1;
							 | 
						||
| 
								 | 
							
									unsigned char *p2 = (unsigned char *)ptr2;
							 | 
						||
| 
								 | 
							
									for (size_t i = 0; i < num; ++i) {
							 | 
						||
| 
								 | 
							
										if (p1[i] != p2[i]) {
							 | 
						||
| 
								 | 
							
											return (int)p1[i] - (int)p2[i];
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return 0;
							 | 
						||
| 
								 | 
							
								}
							 |