mirror of
https://github.com/odin-lang/Odin.git
synced 2026-04-19 04:50:29 +00:00
Demo 003
This commit is contained in:
10
build.bat
10
build.bat
@@ -4,7 +4,7 @@
|
||||
set exe_name=odin.exe
|
||||
|
||||
:: Debug = 0, Release = 1
|
||||
set release_mode=0
|
||||
set release_mode=1
|
||||
|
||||
set compiler_flags= -nologo -Oi -TP -W4 -fp:fast -fp:except- -Gm- -MP -FC -GS- -EHsc- -GR-
|
||||
|
||||
@@ -46,10 +46,10 @@ rem pushd %build_dir%
|
||||
del *.pdb > NUL 2> NUL
|
||||
del *.ilk > NUL 2> NUL
|
||||
|
||||
cl %compiler_settings% "src\main.cpp" ^
|
||||
/link %linker_settings% -OUT:%exe_name% ^
|
||||
&& odin run code/demo.odin
|
||||
rem odin run code/demo.odin
|
||||
rem cl %compiler_settings% "src\main.cpp" ^
|
||||
rem /link %linker_settings% -OUT:%exe_name% ^
|
||||
rem && odin run code/demo.odin
|
||||
odin run code/demo.odin
|
||||
|
||||
|
||||
:do_not_compile_exe
|
||||
|
||||
196
code/demo.odin
196
code/demo.odin
@@ -1,5 +1,8 @@
|
||||
#import "fmt.odin"
|
||||
#import "os.odin"
|
||||
// #import "http_test.odin" as ht
|
||||
// #import "game.odin" as game
|
||||
// #import "punity.odin" as pn
|
||||
|
||||
|
||||
|
||||
@@ -11,6 +14,15 @@ main :: proc() {
|
||||
// crazy_introspection()
|
||||
// namespaces_and_files()
|
||||
// miscellany()
|
||||
|
||||
// ht.run()
|
||||
// game.run()
|
||||
// {
|
||||
// init :: proc(c: ^pn.Core) {}
|
||||
// step :: proc(c: ^pn.Core) {}
|
||||
|
||||
// pn.run(init, step)
|
||||
// }
|
||||
}
|
||||
|
||||
struct_padding :: proc() {
|
||||
@@ -260,6 +272,8 @@ crazy_introspection :: proc() {
|
||||
fmt.printf("\t%\t= %,\n", info.names[i], info.values[i])
|
||||
}
|
||||
fmt.printf("}\n")
|
||||
|
||||
// NOTE(bill): look at that type-safe printf!
|
||||
}
|
||||
|
||||
{
|
||||
@@ -276,6 +290,7 @@ crazy_introspection :: proc() {
|
||||
// n.b. This pretty much "solves" serialization (to strings)
|
||||
}
|
||||
|
||||
// #import "test.odin"
|
||||
|
||||
namespaces_and_files :: proc() {
|
||||
/*
|
||||
@@ -317,184 +332,3 @@ miscellany :: proc() {
|
||||
|
||||
|
||||
|
||||
|
||||
// #import "fmt.odin" as fmt
|
||||
|
||||
// #foreign_system_library "Ws2_32"
|
||||
|
||||
|
||||
// SOCKET :: type uint
|
||||
// INVALID_SOCKET :: ~(0 as SOCKET)
|
||||
|
||||
// AF :: enum i32 {
|
||||
// UNSPEC = 0, // unspecified
|
||||
// UNIX = 1, // local to host (pipes, portals)
|
||||
// INET = 2, // internetwork: UDP, TCP, etc.
|
||||
// IMPLINK = 3, // arpanet imp addresses
|
||||
// PUP = 4, // pup protocols: e.g. BSP
|
||||
// CHAOS = 5, // mit CHAOS protocols
|
||||
// NS = 6, // XEROX NS protocols
|
||||
// ISO = 7, // ISO protocols
|
||||
// OSI = ISO, // OSI is ISO
|
||||
// ECMA = 8, // european computer manufacturers
|
||||
// DATAKIT = 9, // datakit protocols
|
||||
// CCITT = 10, // CCITT protocols, X.25 etc
|
||||
// SNA = 11, // IBM SNA
|
||||
// DECnet = 12, // DECnet
|
||||
// DLI = 13, // Direct data link interface
|
||||
// LAT = 14, // LAT
|
||||
// HYLINK = 15, // NSC Hyperchannel
|
||||
// APPLETALK = 16, // AppleTalk
|
||||
// ROUTE = 17, // Internal Routing Protocol
|
||||
// LINK = 18, // Link layer interface
|
||||
// XTP = 19, // eXpress Transfer Protocol (no AF)
|
||||
// COIP = 20, // connection-oriented IP, aka ST II
|
||||
// CNT = 21, // Computer Network Technology
|
||||
// RTIP = 22, // Help Identify RTIP packets
|
||||
// IPX = 23, // Novell Internet Protocol
|
||||
// SIP = 24, // Simple Internet Protocol
|
||||
// PIP = 25, // Help Identify PIP packets
|
||||
// MAX = 26,
|
||||
// }
|
||||
|
||||
// SOCK_STREAM :: 1
|
||||
// SOCKET_ERROR :: -1
|
||||
// IPPROTO_TCP :: 6
|
||||
// AI_PASSIVE :: 0x0020
|
||||
// SOMAXCONN :: 128
|
||||
|
||||
// SD_RECEIVE :: 0
|
||||
// SD_SEND :: 1
|
||||
// SD_BOTH :: 2
|
||||
|
||||
// WSADESCRIPTION_LEN :: 256
|
||||
// WSASYS_STATUS_LEN :: 128
|
||||
// WSADATA :: struct #ordered {
|
||||
// version: i16
|
||||
// high_version: i16
|
||||
|
||||
|
||||
// // NOTE(bill): This is x64 ordering
|
||||
// max_sockets: u16
|
||||
// max_udp_dg: u16
|
||||
// vendor_info: ^byte
|
||||
// description: [WSADESCRIPTION_LEN+1]byte
|
||||
// system_status: [WSASYS_STATUS_LEN+1]byte
|
||||
// }
|
||||
|
||||
// addrinfo :: struct #ordered {
|
||||
// flags: i32
|
||||
// family: i32
|
||||
// socktype: i32
|
||||
// protocol: i32
|
||||
// addrlen: uint
|
||||
// canonname: ^u8
|
||||
// addr: ^sockaddr
|
||||
// next: ^addrinfo
|
||||
// }
|
||||
|
||||
// sockaddr :: struct #ordered {
|
||||
// family: u16
|
||||
// data: [14]byte
|
||||
// }
|
||||
|
||||
|
||||
// WSAStartup :: proc(version_requested: i16, data: ^WSADATA) -> i32 #foreign #dll_import
|
||||
// WSACleanup :: proc() -> i32 #foreign #dll_import
|
||||
// getaddrinfo :: proc(node_name, service_name: ^u8, hints: ^addrinfo, result: ^^addrinfo) -> i32 #foreign #dll_import
|
||||
// freeaddrinfo :: proc(ai: ^addrinfo) #foreign #dll_import
|
||||
// socket :: proc(af, type_, protocol: i32) -> SOCKET #foreign #dll_import
|
||||
// closesocket :: proc(s: SOCKET) -> i32 #foreign #dll_import
|
||||
// bind :: proc(s: SOCKET, name: ^sockaddr, name_len: i32) -> i32 #foreign #dll_import
|
||||
// listen :: proc(s: SOCKET, back_log: i32) -> i32 #foreign #dll_import
|
||||
// accept :: proc(s: SOCKET, addr: ^sockaddr, addr_len: i32) -> SOCKET #foreign #dll_import
|
||||
// recv :: proc(s: SOCKET, buf: ^byte, len: i32, flags: i32) -> i32 #foreign #dll_import
|
||||
// send :: proc(s: SOCKET, buf: ^byte, len: i32, flags: i32) -> i32 #foreign #dll_import
|
||||
// shutdown :: proc(s: SOCKET, how: i32) -> i32 #foreign #dll_import
|
||||
// WSAGetLastError :: proc() -> i32 #foreign #dll_import
|
||||
|
||||
// to_c_string :: proc(s: string) -> ^byte {
|
||||
// c_str := new_slice(byte, s.count+1)
|
||||
// assert(c_str.data != null)
|
||||
// copy(c_str, s as []byte)
|
||||
// c_str[s.count] = 0
|
||||
// return c_str.data
|
||||
// }
|
||||
|
||||
// main :: proc() {
|
||||
// wsa: WSADATA
|
||||
// res: ^addrinfo = null
|
||||
// hints: addrinfo
|
||||
// s, client: SOCKET
|
||||
|
||||
// if WSAStartup(2 | (2 << 8), ^wsa) != 0 {
|
||||
// fmt.println("WSAStartup failed: ", WSAGetLastError())
|
||||
// return
|
||||
// }
|
||||
// defer WSACleanup()
|
||||
|
||||
// hints.family = AF.INET as i32
|
||||
// hints.socktype = SOCK_STREAM
|
||||
// hints.protocol = IPPROTO_TCP
|
||||
// hints.flags = AI_PASSIVE
|
||||
|
||||
// if getaddrinfo(null, to_c_string("8080"), ^hints, ^res) != 0 {
|
||||
// fmt.println("getaddrinfo failed: ", WSAGetLastError())
|
||||
// return
|
||||
// }
|
||||
// defer freeaddrinfo(res)
|
||||
|
||||
// s = socket(res.family, res.socktype, res.protocol)
|
||||
// if s == INVALID_SOCKET {
|
||||
// fmt.println("socket failed: ", WSAGetLastError())
|
||||
// return
|
||||
// }
|
||||
// defer closesocket(s)
|
||||
|
||||
// bind(s, res.addr, res.addrlen as i32)
|
||||
// listen(s, SOMAXCONN)
|
||||
|
||||
// client = accept(s, null, null)
|
||||
// if client == INVALID_SOCKET {
|
||||
// fmt.println("socket failed: ", WSAGetLastError())
|
||||
// return
|
||||
// }
|
||||
// defer closesocket(client)
|
||||
|
||||
// html :=
|
||||
// `HTTP/1.1 200 OK
|
||||
// Connection: close
|
||||
// Content-type: text/html
|
||||
|
||||
// <html>
|
||||
// <head>
|
||||
// <title>Demo Title</title>
|
||||
// </head>
|
||||
// <body>
|
||||
// <h1 style="color: orange;">Odin Server Demo</h1>
|
||||
// </body>
|
||||
// </html>
|
||||
// `
|
||||
|
||||
// buf: [1024]byte
|
||||
// for {
|
||||
// bytes := recv(client, ^buf[0], buf.count as i32, 0)
|
||||
// if bytes > 0 {
|
||||
// // fmt.println(buf[:bytes] as string)
|
||||
// bytes_sent := send(client, html.data, (html.count-1) as i32, 0)
|
||||
// if bytes_sent == SOCKET_ERROR {
|
||||
// fmt.println("send failed: ", WSAGetLastError())
|
||||
// return
|
||||
// }
|
||||
// break
|
||||
// } else if bytes == 0 {
|
||||
// fmt.println("Connection closing...")
|
||||
// break
|
||||
// } else {
|
||||
// fmt.println("recv failed: ", WSAGetLastError())
|
||||
// return
|
||||
// }
|
||||
// }
|
||||
|
||||
// shutdown(client, SD_SEND)
|
||||
// }
|
||||
|
||||
@@ -134,7 +134,6 @@ run :: proc() {
|
||||
return DefWindowProcA(hwnd, msg, wparam, lparam)
|
||||
}
|
||||
|
||||
|
||||
window, window_success := make_window("Odin Language Demo", 854, 480, win32_proc)
|
||||
if !window_success {
|
||||
return
|
||||
@@ -142,6 +141,7 @@ run :: proc() {
|
||||
defer destroy_window(^window)
|
||||
|
||||
|
||||
|
||||
prev_time := time_now()
|
||||
running := true
|
||||
|
||||
|
||||
181
code/http_test.odin
Normal file
181
code/http_test.odin
Normal file
@@ -0,0 +1,181 @@
|
||||
|
||||
#import "fmt.odin" as fmt
|
||||
|
||||
#foreign_system_library "Ws2_32"
|
||||
|
||||
|
||||
SOCKET :: type uint
|
||||
INVALID_SOCKET :: ~(0 as SOCKET)
|
||||
|
||||
AF :: enum i32 {
|
||||
UNSPEC = 0, // unspecified
|
||||
UNIX = 1, // local to host (pipes, portals)
|
||||
INET = 2, // internetwork: UDP, TCP, etc.
|
||||
IMPLINK = 3, // arpanet imp addresses
|
||||
PUP = 4, // pup protocols: e.g. BSP
|
||||
CHAOS = 5, // mit CHAOS protocols
|
||||
NS = 6, // XEROX NS protocols
|
||||
ISO = 7, // ISO protocols
|
||||
OSI = ISO, // OSI is ISO
|
||||
ECMA = 8, // european computer manufacturers
|
||||
DATAKIT = 9, // datakit protocols
|
||||
CCITT = 10, // CCITT protocols, X.25 etc
|
||||
SNA = 11, // IBM SNA
|
||||
DECnet = 12, // DECnet
|
||||
DLI = 13, // Direct data link interface
|
||||
LAT = 14, // LAT
|
||||
HYLINK = 15, // NSC Hyperchannel
|
||||
APPLETALK = 16, // AppleTalk
|
||||
ROUTE = 17, // Internal Routing Protocol
|
||||
LINK = 18, // Link layer interface
|
||||
XTP = 19, // eXpress Transfer Protocol (no AF)
|
||||
COIP = 20, // connection-oriented IP, aka ST II
|
||||
CNT = 21, // Computer Network Technology
|
||||
RTIP = 22, // Help Identify RTIP packets
|
||||
IPX = 23, // Novell Internet Protocol
|
||||
SIP = 24, // Simple Internet Protocol
|
||||
PIP = 25, // Help Identify PIP packets
|
||||
MAX = 26,
|
||||
}
|
||||
|
||||
SOCK_STREAM :: 1
|
||||
SOCKET_ERROR :: -1
|
||||
IPPROTO_TCP :: 6
|
||||
AI_PASSIVE :: 0x0020
|
||||
SOMAXCONN :: 128
|
||||
|
||||
SD_RECEIVE :: 0
|
||||
SD_SEND :: 1
|
||||
SD_BOTH :: 2
|
||||
|
||||
WSADESCRIPTION_LEN :: 256
|
||||
WSASYS_STATUS_LEN :: 128
|
||||
WSADATA :: struct #ordered {
|
||||
version: i16
|
||||
high_version: i16
|
||||
|
||||
|
||||
// NOTE(bill): This is x64 ordering
|
||||
max_sockets: u16
|
||||
max_udp_dg: u16
|
||||
vendor_info: ^byte
|
||||
description: [WSADESCRIPTION_LEN+1]byte
|
||||
system_status: [WSASYS_STATUS_LEN+1]byte
|
||||
}
|
||||
|
||||
addrinfo :: struct #ordered {
|
||||
flags: i32
|
||||
family: i32
|
||||
socktype: i32
|
||||
protocol: i32
|
||||
addrlen: uint
|
||||
canonname: ^u8
|
||||
addr: ^sockaddr
|
||||
next: ^addrinfo
|
||||
}
|
||||
|
||||
sockaddr :: struct #ordered {
|
||||
family: u16
|
||||
data: [14]byte
|
||||
}
|
||||
|
||||
|
||||
WSAStartup :: proc(version_requested: i16, data: ^WSADATA) -> i32 #foreign #dll_import
|
||||
WSACleanup :: proc() -> i32 #foreign #dll_import
|
||||
getaddrinfo :: proc(node_name, service_name: ^u8, hints: ^addrinfo, result: ^^addrinfo) -> i32 #foreign #dll_import
|
||||
freeaddrinfo :: proc(ai: ^addrinfo) #foreign #dll_import
|
||||
socket :: proc(af, type_, protocol: i32) -> SOCKET #foreign #dll_import
|
||||
closesocket :: proc(s: SOCKET) -> i32 #foreign #dll_import
|
||||
bind :: proc(s: SOCKET, name: ^sockaddr, name_len: i32) -> i32 #foreign #dll_import
|
||||
listen :: proc(s: SOCKET, back_log: i32) -> i32 #foreign #dll_import
|
||||
accept :: proc(s: SOCKET, addr: ^sockaddr, addr_len: i32) -> SOCKET #foreign #dll_import
|
||||
recv :: proc(s: SOCKET, buf: ^byte, len: i32, flags: i32) -> i32 #foreign #dll_import
|
||||
send :: proc(s: SOCKET, buf: ^byte, len: i32, flags: i32) -> i32 #foreign #dll_import
|
||||
shutdown :: proc(s: SOCKET, how: i32) -> i32 #foreign #dll_import
|
||||
WSAGetLastError :: proc() -> i32 #foreign #dll_import
|
||||
|
||||
to_c_string :: proc(s: string) -> ^byte {
|
||||
c_str := new_slice(byte, s.count+1)
|
||||
assert(c_str.data != null)
|
||||
copy(c_str, s as []byte)
|
||||
c_str[s.count] = 0
|
||||
return c_str.data
|
||||
}
|
||||
|
||||
run :: proc() {
|
||||
wsa: WSADATA
|
||||
res: ^addrinfo = null
|
||||
hints: addrinfo
|
||||
s, client: SOCKET
|
||||
|
||||
if WSAStartup(2 | (2 << 8), ^wsa) != 0 {
|
||||
fmt.println("WSAStartup failed: ", WSAGetLastError())
|
||||
return
|
||||
}
|
||||
defer WSACleanup()
|
||||
|
||||
hints.family = AF.INET as i32
|
||||
hints.socktype = SOCK_STREAM
|
||||
hints.protocol = IPPROTO_TCP
|
||||
hints.flags = AI_PASSIVE
|
||||
|
||||
if getaddrinfo(null, to_c_string("8080"), ^hints, ^res) != 0 {
|
||||
fmt.println("getaddrinfo failed: ", WSAGetLastError())
|
||||
return
|
||||
}
|
||||
defer freeaddrinfo(res)
|
||||
|
||||
s = socket(res.family, res.socktype, res.protocol)
|
||||
if s == INVALID_SOCKET {
|
||||
fmt.println("socket failed: ", WSAGetLastError())
|
||||
return
|
||||
}
|
||||
defer closesocket(s)
|
||||
|
||||
bind(s, res.addr, res.addrlen as i32)
|
||||
listen(s, SOMAXCONN)
|
||||
|
||||
client = accept(s, null, null)
|
||||
if client == INVALID_SOCKET {
|
||||
fmt.println("socket failed: ", WSAGetLastError())
|
||||
return
|
||||
}
|
||||
defer closesocket(client)
|
||||
|
||||
html :=
|
||||
`HTTP/1.1 200 OK
|
||||
Connection: close
|
||||
Content-type: text/html
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>Demo Title</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1 style="color: orange;">Odin Server Demo</h1>
|
||||
</body>
|
||||
</html>
|
||||
`
|
||||
|
||||
buf: [1024]byte
|
||||
for {
|
||||
bytes := recv(client, ^buf[0], buf.count as i32, 0)
|
||||
if bytes > 0 {
|
||||
// fmt.println(buf[:bytes] as string)
|
||||
bytes_sent := send(client, html.data, (html.count-1) as i32, 0)
|
||||
if bytes_sent == SOCKET_ERROR {
|
||||
fmt.println("send failed: ", WSAGetLastError())
|
||||
return
|
||||
}
|
||||
break
|
||||
} else if bytes == 0 {
|
||||
fmt.println("Connection closing...")
|
||||
break
|
||||
} else {
|
||||
fmt.println("recv failed: ", WSAGetLastError())
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
shutdown(client, SD_SEND)
|
||||
}
|
||||
@@ -434,7 +434,7 @@ run :: proc(user_init, user_step: proc(c: ^Core)) {
|
||||
{
|
||||
data: [128]byte
|
||||
buf := data[:0]
|
||||
fmt.printf_to_buffer(^buf, "Punity: % ms\x00", dt*1000)
|
||||
fmt.bprintf(^buf, "Punity: % ms\x00", dt*1000)
|
||||
win32.SetWindowTextA(win32_window, buf.data)
|
||||
}
|
||||
|
||||
@@ -447,7 +447,7 @@ run :: proc(user_init, user_step: proc(c: ^Core)) {
|
||||
}
|
||||
}
|
||||
|
||||
memory_zero(^_core.key_deltas[0], size_of(_core.key_deltas[0]))
|
||||
memory_zero(^_core.key_deltas[0], size_of_val(_core.key_deltas[0]))
|
||||
|
||||
|
||||
for PeekMessageA(^message, null, 0, 0, PM_REMOVE) != 0 {
|
||||
|
||||
Reference in New Issue
Block a user