Added server example
This commit is contained in:
parent
d4f9071ee4
commit
f36b1f6c7c
52
examples/server/server.q
Normal file
52
examples/server/server.q
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
@ -5,6 +5,7 @@ import (
|
||||
|
||||
"git.akyoto.dev/cli/q/src/errors"
|
||||
"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/x86"
|
||||
)
|
||||
@ -94,6 +95,10 @@ func (f *Function) CompileCall(root *expression.Expression) (*Function, error) {
|
||||
}
|
||||
|
||||
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{
|
||||
Encountered: typ.Name(),
|
||||
Expected: fn.Input[i].Type.Name(),
|
||||
|
@ -4,7 +4,6 @@ import (
|
||||
"git.akyoto.dev/cli/q/src/asm"
|
||||
"git.akyoto.dev/cli/q/src/errors"
|
||||
"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/types"
|
||||
)
|
||||
@ -37,11 +36,11 @@ func (f *Function) ExpressionToMemory(node *expression.Expression, memory asm.Me
|
||||
return nil, err
|
||||
}
|
||||
|
||||
size := byte(sizeof.Signed(int64(number)))
|
||||
// size := byte(sizeof.Signed(int64(number)))
|
||||
|
||||
if size > memory.Length {
|
||||
return nil, errors.New(&errors.NumberExceedsBounds{Number: number, ExpectedSize: memory.Length, Size: size}, f.File, node.Token.Position)
|
||||
}
|
||||
// if size > memory.Length {
|
||||
// return nil, errors.New(&errors.NumberExceedsBounds{Number: number, ExpectedSize: memory.Length, Size: size}, f.File, node.Token.Position)
|
||||
// }
|
||||
|
||||
f.MemoryNumber(asm.STORE, memory, number)
|
||||
return types.Int, nil
|
||||
|
@ -35,7 +35,15 @@ func (s *Scanner) scanStruct(file *fs.File, tokens token.List, i int) (int, erro
|
||||
fieldTypeName := tokens[i].Text(file.Bytes)
|
||||
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")
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
main() {
|
||||
writeToMemory(0)
|
||||
writeToMemory(42)
|
||||
}
|
||||
|
||||
writeToMemory(p Pointer) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user