diff --git a/tests/HTTPFileServer.nct b/tests/HTTPFileServer.nct new file mode 100644 index 0000000..33d7f66 --- /dev/null +++ b/tests/HTTPFileServer.nct @@ -0,0 +1,68 @@ +record LibCSockAddrInet6 { + u16 family; + u16 port; + u32 flowinfo; + u8[16] address; +} + +@section(".text"); + +extern u32(u32 domain, u32 type, u32 protocol) socket; +extern u32(u32 sockfd, u8* addr, u32 socklen) bind; +extern u32(u32 sockfd, u32 backlog) listen; +extern u32(u32 sockfd, u8* addr, u32* socklen) accept; +extern u32(u32 sockfd, u8* data, u32 length) write; +extern u32(u32 sockfd, u8* data, u32 length) read; +extern u32(u32 fd) close; + +main: u0() -> { + SERV_SOCKET = socket(10, 1, 0); + + LibCSockAddrInet6 addr; + addr.family = 10; /* AF_INET6 */ + addr.port = 43105; /* 25000 in reversed endian */ + addr.flowinfo = 0; + addr.address[0] = 0; + addr.address[1] = 0; + addr.address[2] = 0; + addr.address[3] = 0; + addr.address[4] = 0; + addr.address[5] = 0; + addr.address[6] = 0; + addr.address[7] = 0; + addr.address[8] = 0; + addr.address[9] = 0; + addr.address[10] = 0; + addr.address[11] = 0; + addr.address[12] = 0; + addr.address[13] = 0; + addr.address[14] = 0; + addr.address[15] = 0; + bind(SERV_SOCKET, &addr, @sizeof(addr)); + + listen(SERV_SOCKET, 16); + + loop { + u32 fd = accept(SERV_SOCKET, &addr, &SOCK_LEN); + if(fd == -1) { + continue; + } + + read(fd, &BUFFER, @sizeof(BUFFER)); + write(fd, &RESPONSE, @sizeof(RESPONSE)); + + close(fd); + } + + return; +}; + +@section(".data"); + +u32 SOCK_LEN:; + +u32 SERV_SOCKET:; + +u8[?] RESPONSE: "HTTP/1.0 200 OK\r\nServer: NectarTestHTTPFileServer\r\nContent-Type: text/plain\r\n\r\nYo."; + +u8[1024] BUFFER:; diff --git a/tests/IrregularAllocation.nct b/tests/IrregularAllocation.nct new file mode 100644 index 0000000..73c0d48 --- /dev/null +++ b/tests/IrregularAllocation.nct @@ -0,0 +1,14 @@ +u8 a = 12; +u8 b = 19; +u8 c = a + b; +u32 d = 1; +u8 e = d + 1; +u32 f = 10; +u32 g = 55; +a; +b; +c; +d; +e; +f; +g; diff --git a/tests/ListDLC.nct b/tests/ListDLC.nct new file mode 100644 index 0000000..10e4e74 --- /dev/null +++ b/tests/ListDLC.nct @@ -0,0 +1,43 @@ +/* + * ListDLC: Dynamic, Linear growth, C-managed +*/ + +extern u8*(u8*, u32) realloc; + +record ListDLC[T, S; growth] { + S capacity; + S size; + T[?]* data; +} + +ListDLC_remove: [T, S; growth]u0(ListDLC[T, S; growth]* this, S index) -> { + T* data0 = &((*((*this).data))[index]); + T* data1 = data0 + @sizeof T; + S sz = (*this).size; + (*this).size = (*this).size - 1; + loop { + if(index == sz) { + break; + } + + *data0 = *data1; + + data0 = data0 + @sizeof T; + data1 = data1 + @sizeof T; + index = index + 1; + } + return; +}; + +ListDLC_add: [T, S; growth]u0(ListDLC[T, S; growth]* this, T value) -> { + if((*this).size == (*this).capacity) { + u32 newcap = (*this).capacity + growth; + (*this).capacity = newcap; + (*this).data = realloc((*this).data, newcap * @sizeof T); + } + + (*((*this).data))[(*this).size] = value; + (*this).size = (*this).size + 1; + + return; +}; diff --git a/tests/ListS.nct b/tests/ListS.nct new file mode 100644 index 0000000..2ca5367 --- /dev/null +++ b/tests/ListS.nct @@ -0,0 +1,27 @@ +record ListS[T, S; capacity] { + S size; + T[capacity] data; +} + +ListS_remove: [T, S; capacity]u0(ListS[T, S; capacity]* this, S index) -> { + T* data = &((*this).data[index]); + (*this).size = (*this).size - 1; + S sz = (*this).size; + loop { + if(index == sz) { + break; + } + + *data = *(data + 1); + + data = data + 1; + index = index + 1; + } + return; +}; + +ListS_add: [T, S; capacity]u0(ListS[T, S; capacity]* this, T value) -> { + (*this).data[(*this).size] = value; + (*this).size = (*this).size + 1; + return; +}; diff --git a/tests/UserListDLC.nct b/tests/UserListDLC.nct new file mode 100644 index 0000000..e771b50 --- /dev/null +++ b/tests/UserListDLC.nct @@ -0,0 +1,19 @@ +use ListDLC; + +@section(".text"); + +@instantiate ListDLC_remove[u32, u32; 9]; +@instantiate ListDLC_add[u32, u32; 9]; + +main: u0() -> { + ListDLC_add[u32, u32; 9](&list, 1234); + ListDLC_add[u32, u32; 9](&list, 4321); + ListDLC_add[u32, u32; 9](&list, 7777); + ListDLC_add[u32, u32; 9](&list, 6969); + ListDLC_remove[u32, u32; 9](&list, 1); + return; +}; + +@section(".bss"); + +ListDLC[u32, u32; 9] list:;