Added server example

This commit is contained in:
Eduard Urbach 2025-02-06 12:49:17 +01:00
parent d4f9071ee4
commit f36b1f6c7c
Signed by: akyoto
GPG Key ID: C874F672B1AF20C0
5 changed files with 71 additions and 7 deletions

52
examples/server/server.q Normal file
View File

@ -0,0 +1,52 @@
import sys
struct sockaddr_in {
sin_family Int16
sin_port Int16
sin_addr Int64
sin_zero Int64
}
// Open server and client in 2 terminals:
// [1] q run examples/server
// [2] netcat 127.0.0.1 8080
main() {
socket := sys.socket(2, 1, 0)
if socket < 0 {
sys.write(1, "socket error\n", 13)
sys.exit(1)
}
addr := new(sockaddr_in)
addr.sin_family = 2
addr.sin_port = 0x901F
addr.sin_addr = 0
addr.sin_zero = 0
if sys.bind(socket, addr, 20) != 0 {
sys.write(1, "bind error\n", 11)
sys.exit(1)
}
delete(addr)
if sys.listen(socket, 10) != 0 {
sys.write(1, "listen error\n", 13)
sys.exit(1)
}
sys.write(1, "listening...\n", 13)
loop {
conn := sys.accept(socket, 0, 0)
if conn != -1 {
sys.write(1, "accepted\n", 9)
sys.write(conn, "Hello\n", 6)
sys.close(conn)
} else {
sys.write(1, "error\n", 6)
}
}
}

View File

@ -5,6 +5,7 @@ import (
"git.akyoto.dev/cli/q/src/errors" "git.akyoto.dev/cli/q/src/errors"
"git.akyoto.dev/cli/q/src/expression" "git.akyoto.dev/cli/q/src/expression"
"git.akyoto.dev/cli/q/src/token"
"git.akyoto.dev/cli/q/src/types" "git.akyoto.dev/cli/q/src/types"
"git.akyoto.dev/cli/q/src/x86" "git.akyoto.dev/cli/q/src/x86"
) )
@ -94,6 +95,10 @@ func (f *Function) CompileCall(root *expression.Expression) (*Function, error) {
} }
if !types.Is(typ, fn.Input[i].Type) { if !types.Is(typ, fn.Input[i].Type) {
if parameters[i].Token.Kind == token.Number && parameters[i].Token.Text(f.File.Bytes) == "0" {
continue
}
return nil, errors.New(&errors.TypeMismatch{ return nil, errors.New(&errors.TypeMismatch{
Encountered: typ.Name(), Encountered: typ.Name(),
Expected: fn.Input[i].Type.Name(), Expected: fn.Input[i].Type.Name(),

View File

@ -4,7 +4,6 @@ import (
"git.akyoto.dev/cli/q/src/asm" "git.akyoto.dev/cli/q/src/asm"
"git.akyoto.dev/cli/q/src/errors" "git.akyoto.dev/cli/q/src/errors"
"git.akyoto.dev/cli/q/src/expression" "git.akyoto.dev/cli/q/src/expression"
"git.akyoto.dev/cli/q/src/sizeof"
"git.akyoto.dev/cli/q/src/token" "git.akyoto.dev/cli/q/src/token"
"git.akyoto.dev/cli/q/src/types" "git.akyoto.dev/cli/q/src/types"
) )
@ -37,11 +36,11 @@ func (f *Function) ExpressionToMemory(node *expression.Expression, memory asm.Me
return nil, err return nil, err
} }
size := byte(sizeof.Signed(int64(number))) // size := byte(sizeof.Signed(int64(number)))
if size > memory.Length { // if size > memory.Length {
return nil, errors.New(&errors.NumberExceedsBounds{Number: number, ExpectedSize: memory.Length, Size: size}, f.File, node.Token.Position) // return nil, errors.New(&errors.NumberExceedsBounds{Number: number, ExpectedSize: memory.Length, Size: size}, f.File, node.Token.Position)
} // }
f.MemoryNumber(asm.STORE, memory, number) f.MemoryNumber(asm.STORE, memory, number)
return types.Int, nil return types.Int, nil

View File

@ -35,7 +35,15 @@ func (s *Scanner) scanStruct(file *fs.File, tokens token.List, i int) (int, erro
fieldTypeName := tokens[i].Text(file.Bytes) fieldTypeName := tokens[i].Text(file.Bytes)
fieldType := types.Int fieldType := types.Int
if fieldTypeName != "Int" { switch fieldTypeName {
case "Int", "Int64":
case "Int32":
fieldType = types.Int32
case "Int16":
fieldType = types.Int16
case "Int8":
fieldType = types.Int8
default:
panic("not implemented") panic("not implemented")
} }

View File

@ -1,5 +1,5 @@
main() { main() {
writeToMemory(0) writeToMemory(42)
} }
writeToMemory(p Pointer) { writeToMemory(p Pointer) {