move to stack based model
This commit is contained in:
parent
d93b4d8dc6
commit
4e3de8bdb1
|
@ -1,10 +1,10 @@
|
||||||
(set screen-width 800)
|
(set screen-width 800:i32)
|
||||||
(set screen-height 450)
|
(set screen-height 450:i32)
|
||||||
(set username (get argv 1))
|
(set username (get argv 1))
|
||||||
(set password (get argv 2))
|
(set password (get argv 2))
|
||||||
(set me (make :player username (0.0 1.0 2.0) PURPLE))
|
(set me (make:player username (0.0 1.0 2.0) PURPLE))
|
||||||
(set players (login me))
|
(set players (login me))
|
||||||
(set camera (make :camera (me.pos.x (add me.pos.y 10.0) (add me.pos.z 10.0))
|
(set camera (make:camera (me.pos.x (add me.pos.y 10.0) (add me.pos.z 10.0))
|
||||||
(me.pos.x me.pos.y me.pos.z)
|
(me.pos.x me.pos.y me.pos.z)
|
||||||
(0.0 1.0 0.0)
|
(0.0 1.0 0.0)
|
||||||
45.0
|
45.0
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
fn build(c: ProjectConfig) {
|
||||||
|
c.name("MMO Project");
|
||||||
|
|
||||||
|
c.client([
|
||||||
|
LanguageSettings {
|
||||||
|
lang: "c",
|
||||||
|
file: "src/client.ztl",
|
||||||
|
outpath: "client/",
|
||||||
|
ffi: [
|
||||||
|
FFISetting {
|
||||||
|
"name":"raylib",
|
||||||
|
"library":"$RAYLIB_PATH/libraylib.a",
|
||||||
|
"path":"",
|
||||||
|
"build": "make build",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
|
c.server([
|
||||||
|
LanguageSettings {
|
||||||
|
lang: "javascript",
|
||||||
|
file: "src/server.ztl",
|
||||||
|
outpath: "server/"
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
c.common([
|
||||||
|
LanguageSettings {
|
||||||
|
lang: "c",
|
||||||
|
file: "src/common.ztl",
|
||||||
|
outpath: "client/"
|
||||||
|
},
|
||||||
|
LanguageSettings {
|
||||||
|
lang: "javascript",
|
||||||
|
file: "src/common.ztl",
|
||||||
|
outpath: "server/"
|
||||||
|
},
|
||||||
|
LanguageSettings {
|
||||||
|
lang: "sqlite",
|
||||||
|
file: "src/common.ztl",
|
||||||
|
outpath: "db/"
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
c.build();
|
||||||
|
}
|
|
@ -1,100 +1,93 @@
|
||||||
use "common.ztl"
|
use "common.ztl"
|
||||||
|
|
||||||
fn :login (9p, Player, str -> []Player) {
|
fn login(s: 9p, p: Player, password: str): []Player {
|
||||||
set s to pop;
|
s.auth(p.username, password)
|
||||||
set p to pop;
|
return s.read("players")
|
||||||
set password to pop;
|
}
|
||||||
|
|
||||||
s.auth(p.username, password);
|
fn main(argc: i32, argv: []str): i32 {
|
||||||
return s.read("players");
|
const screen_width = 800;
|
||||||
};
|
const screen_height = 450;
|
||||||
|
|
||||||
fn :main (i32 str[] -> i32) {
|
let username = argv[0];
|
||||||
set :argc to pop;
|
let password = argv[1];
|
||||||
set :argv to pop;
|
|
||||||
|
|
||||||
set :screen_width to i32 800;
|
let s = tunnel("localhost:25565");
|
||||||
set :screen_height to i32 450;
|
s.attach();
|
||||||
|
|
||||||
set :username to argv[0];
|
let me = Player(
|
||||||
set :password to argv[1];
|
|
||||||
|
|
||||||
set :me to Player {
|
|
||||||
username,
|
username,
|
||||||
vec {0.0 1.0 2.0},
|
Vec(0.0, 1.0, 2.0),
|
||||||
purple,
|
purple
|
||||||
};
|
);
|
||||||
|
let players = login(s, me, password);
|
||||||
|
|
||||||
set :players to Player[] { login me password; };
|
let camera = Camera3D(
|
||||||
|
Vec(0.0, 1.0, 0.0),
|
||||||
|
45.0,
|
||||||
|
:CAMERA_PERSPECTIVE,
|
||||||
|
Vec(
|
||||||
|
me.pos.x + 10.0,
|
||||||
|
me.pos.y + 10.0,
|
||||||
|
me.pos.z
|
||||||
|
),
|
||||||
|
me.pos
|
||||||
|
);
|
||||||
|
|
||||||
set :camera to Camera3D {
|
init_window("zwl client : raylib", screen_width, screen_height);
|
||||||
vec {0.0 1.0 0.0},
|
set_target_fps(60);
|
||||||
i32 45.0,
|
|
||||||
atom :CAMERA_PERSPECTIVE,
|
|
||||||
vec {
|
|
||||||
add me.pos.x 10.0,
|
|
||||||
add me.pos.y 10.0,
|
|
||||||
me.pos.z,
|
|
||||||
},
|
|
||||||
me.pos,
|
|
||||||
};
|
|
||||||
|
|
||||||
init_window "zwl client : raylib" screen_width screen_height;
|
|
||||||
set_target_fps 60;
|
|
||||||
|
|
||||||
(* Main game loop *)
|
(* Main game loop *)
|
||||||
while ( not window_should_close ) {
|
while ( not window_should_close() ) {
|
||||||
|
let player_updated = false;
|
||||||
|
|
||||||
if (is_key_down :KEY_RIGHT) {
|
if (is_key_down(KEY_RIGHT)) {
|
||||||
set me.pos.x to {add me.pos.x 0.2};
|
me.pos.x = me.pos.x + 0.2;
|
||||||
set :player_updated true;
|
player_updated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_key_down :KEY_LEFT) {
|
if (is_key_down(KEY_LEFT)) {
|
||||||
set me.pos.x to {sub me.pos.x 0.2};
|
me.pos.x = me.pos.x - 0.2;
|
||||||
set :player_updated true;
|
player_updated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_key_down :KEY_DOWN) {
|
if (is_key_down(KEY_DOWN)) {
|
||||||
set me.pos.z to {add me.pos.z 0.2};
|
me.pos.z = me.pos.z + 0.2;
|
||||||
set :player_updated true;
|
player_updated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_key_down :KEY_UP) {
|
if (is_key_down(KEY_UP)) {
|
||||||
set me.pos.z to {sub me.pos.z 0.2};
|
me.pos.z = me.pos.z - 0.2;
|
||||||
set :player_updated true;
|
player_updated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
sync_camera camera me;
|
sync_camera(s, me, camera);
|
||||||
|
|
||||||
if (player_updated) {
|
if (player_updated) {
|
||||||
set :players move me;
|
players = move(s, me);
|
||||||
} else {
|
} else {
|
||||||
set :players ping me;
|
players = ping(s, me);
|
||||||
}
|
}
|
||||||
|
|
||||||
begin_drawing;
|
begin_drawing();
|
||||||
clear_background RAYWHITE;
|
clear_background(RAYWHITE);
|
||||||
|
|
||||||
begin_mode_3d camera;
|
begin_mode_3d(camera);
|
||||||
|
|
||||||
(* Draw floor *)
|
(* Draw floor *)
|
||||||
draw_grid 30 1.0;
|
draw_grid(30, 1.0);
|
||||||
|
|
||||||
draw_cube me.pos 0.5 0.5 0.5 me.apperance;
|
draw_cube(me.pos, 0.5, 0.5, 0.5, me.apperance);
|
||||||
|
|
||||||
map :player players {
|
for (player in players) {
|
||||||
draw_cube player.pos 0.5 0.5 0.5 player.apperance;
|
draw_cube(player.pos, 0.5, 0.5, 0.5, player.apperance);
|
||||||
}
|
}
|
||||||
|
|
||||||
end_mode_3d;
|
end_mode_3d();
|
||||||
|
|
||||||
end_drawing;
|
end_drawing();
|
||||||
}
|
}
|
||||||
/* Detect window close button or ESC key */
|
|
||||||
|
|
||||||
set :players to logout me;
|
logout(me);
|
||||||
close_window; /*Close window and OpenGL context */
|
close_window(); (* Close window and OpenGL context *)
|
||||||
};
|
}
|
||||||
|
|
||||||
main;
|
|
||||||
|
|
|
@ -1,19 +1,19 @@
|
||||||
type :Vec {
|
type Vec {
|
||||||
f32 :x,
|
x: f32,
|
||||||
f32 :y,
|
y: f32,
|
||||||
f32 :z,
|
z: f32,
|
||||||
};
|
}
|
||||||
|
|
||||||
type :Color {
|
type Color {
|
||||||
i8 :r,
|
r: u8,
|
||||||
i8 :g,
|
g: u8,
|
||||||
i8 :b,
|
b: u8,
|
||||||
};
|
}
|
||||||
|
|
||||||
type :Player {
|
type Player {
|
||||||
str :username,
|
username: str,
|
||||||
Vec :pos,
|
pos: Vec,
|
||||||
Color :color,
|
color: Color,
|
||||||
};
|
}
|
||||||
|
|
||||||
Color :purple {255 255 0};
|
const purple = Color{255, 255, 0};
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
use "common.ztl"
|
use "common.ztl"
|
||||||
|
|
||||||
fn :main(i32, []str -> i32) {
|
fn main(argc: i32, argv: []str): i32 {
|
||||||
set :argc to pop;
|
let s = tunnel();
|
||||||
set :argv to pop;
|
s.host("0.0.0.0:25565",
|
||||||
|
|
||||||
set s to tunnel "0.0.0.0:25565";
|
|
||||||
s.host (
|
|
||||||
version,
|
version,
|
||||||
auth,
|
auth,
|
||||||
error,
|
error,
|
||||||
|
@ -18,46 +15,45 @@ fn :main(i32, []str -> i32) {
|
||||||
write,
|
write,
|
||||||
clunk,
|
clunk,
|
||||||
remove,
|
remove,
|
||||||
stat,
|
stat);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn :version(9pmsg) {
|
fn version(m : 9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn :auth(9pmsg) {
|
fn auth(m : 9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn :error(9pmsg) {
|
fn error(m : 9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn :flush(9pmsg) {
|
fn flush(m : 9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn :attach(9pmsg) {
|
fn attach(m : 9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn :walk(9pmsg) {
|
fn walk(m : 9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn :open(9pmsg) {
|
fn open(m : 9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn :create(9pmsg) {
|
fn create(m : 9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn :read(9pmsg) {
|
fn read(m : 9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn :write(9pmsg) {
|
fn write(m : 9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn :clunk(9pmsg) {
|
fn clunk(m : 9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn :remove(9pmsg) {
|
fn remove(m : 9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn :stat(9pmsg) {
|
fn stat(m : 9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,16 +1,18 @@
|
||||||
fn build(c: ProjectConfig) {
|
fn :build (ProjectConfig) {
|
||||||
|
set c to pop;
|
||||||
|
|
||||||
c.name("MMO Project");
|
c.name("MMO Project");
|
||||||
|
|
||||||
c.client([
|
c.client([
|
||||||
LanguageSettings {
|
LanguageSettings {
|
||||||
lang: "c",
|
"lang": "c",
|
||||||
file: "src/client.ztl",
|
"file": "src/client.ztl",
|
||||||
outpath: "client/",
|
"outpath": "client/",
|
||||||
ffi: [
|
"ffi": [
|
||||||
FFISetting {
|
FFISetting {
|
||||||
"name":"raylib",
|
"name":"raylib",
|
||||||
"library":"$RAYLIB_PATH/libraylib.a",
|
"library":"$RAYLIB_PATH/libraylib.a",
|
||||||
"path":"",
|
"path":"./",
|
||||||
"build": "make build",
|
"build": "make build",
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -19,27 +21,27 @@ fn build(c: ProjectConfig) {
|
||||||
|
|
||||||
c.server([
|
c.server([
|
||||||
LanguageSettings {
|
LanguageSettings {
|
||||||
lang: "javascript",
|
"lang": "javascript",
|
||||||
file: "src/server.ztl",
|
"file": "src/server.ztl",
|
||||||
outpath: "server/"
|
"outpath": "server/"
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
|
||||||
c.common([
|
c.common([
|
||||||
LanguageSettings {
|
LanguageSettings {
|
||||||
lang: "c",
|
"lang": "c",
|
||||||
file: "src/common.ztl",
|
"file": "src/common.ztl",
|
||||||
outpath: "client/"
|
"outpath": "client/"
|
||||||
},
|
},
|
||||||
LanguageSettings {
|
LanguageSettings {
|
||||||
lang: "javascript",
|
"lang": "javascript",
|
||||||
file: "src/common.ztl",
|
"file": "src/common.ztl",
|
||||||
outpath: "server/"
|
"outpath": "server/"
|
||||||
},
|
},
|
||||||
LanguageSettings {
|
LanguageSettings {
|
||||||
lang: "sqlite",
|
"lang": "sqlite",
|
||||||
file: "src/common.ztl",
|
"file": "src/common.ztl",
|
||||||
outpath: "db/"
|
"outpath": "db/"
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
|
@ -1,93 +1,101 @@
|
||||||
use "common.ztl"
|
use "common.ztl"
|
||||||
|
|
||||||
fn login(s: 9p, p: Player, password: str): []Player {
|
fn :login (9p Player str -> []Player) {
|
||||||
s.auth(p.username, password)
|
set s to pop;
|
||||||
return s.read("players")
|
set p to pop;
|
||||||
}
|
set password to pop;
|
||||||
|
|
||||||
fn main(argc: i32, argv: []str): i32 {
|
s.auth(p.username, password);
|
||||||
const screen_width = 800;
|
return s.read("players");
|
||||||
const screen_height = 450;
|
};
|
||||||
|
|
||||||
let username = argv[0];
|
|
||||||
let password = argv[1];
|
|
||||||
|
|
||||||
let s = tunnel("localhost:25565");
|
fn :main (i32 str[i32] -> i32) { /* str[i32] is the same as Map<number, string> in JS*/
|
||||||
s.attach();
|
set :argc to pop;
|
||||||
|
set :argv to pop;
|
||||||
|
|
||||||
let me = Player(
|
set :screen_width to i32 800;
|
||||||
|
set :screen_height to i32 450;
|
||||||
|
|
||||||
|
set :username to argv[0];
|
||||||
|
set :password to argv[1];
|
||||||
|
|
||||||
|
set :me to Player {
|
||||||
username,
|
username,
|
||||||
Vec(0.0, 1.0, 2.0),
|
vec {0.0 1.0 2.0},
|
||||||
purple
|
purple,
|
||||||
);
|
};
|
||||||
let players = login(s, me, password);
|
|
||||||
|
|
||||||
let camera = Camera3D(
|
set :players to Player[] { login me password; };
|
||||||
Vec(0.0, 1.0, 0.0),
|
|
||||||
45.0,
|
|
||||||
:CAMERA_PERSPECTIVE,
|
|
||||||
Vec(
|
|
||||||
me.pos.x + 10.0,
|
|
||||||
me.pos.y + 10.0,
|
|
||||||
me.pos.z
|
|
||||||
),
|
|
||||||
me.pos
|
|
||||||
);
|
|
||||||
|
|
||||||
init_window("zwl client : raylib", screen_width, screen_height);
|
set :camera to Camera3D {
|
||||||
set_target_fps(60);
|
vec {0.0 1.0 0.0},
|
||||||
|
i32 45.0,
|
||||||
|
atom :CAMERA_PERSPECTIVE,
|
||||||
|
vec {
|
||||||
|
add me.pos.x 10.0,
|
||||||
|
add me.pos.y 10.0,
|
||||||
|
me.pos.z,
|
||||||
|
},
|
||||||
|
me.pos,
|
||||||
|
};
|
||||||
|
|
||||||
(* Main game loop *)
|
init_window "zwl client : raylib" screen_width screen_height;
|
||||||
while ( not window_should_close() ) {
|
set_target_fps 60;
|
||||||
let player_updated = false;
|
|
||||||
|
|
||||||
if (is_key_down(KEY_RIGHT)) {
|
/* Main game loop */
|
||||||
me.pos.x = me.pos.x + 0.2;
|
while ( not window_should_close ) {
|
||||||
player_updated = true;
|
|
||||||
|
if (is_key_down :KEY_RIGHT) {
|
||||||
|
set me.pos.x to {add me.pos.x 0.2};
|
||||||
|
set :player_updated true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_key_down(KEY_LEFT)) {
|
if (is_key_down :KEY_LEFT) {
|
||||||
me.pos.x = me.pos.x - 0.2;
|
set me.pos.x to {sub me.pos.x 0.2};
|
||||||
player_updated = true;
|
set :player_updated true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_key_down(KEY_DOWN)) {
|
if (is_key_down :KEY_DOWN) {
|
||||||
me.pos.z = me.pos.z + 0.2;
|
set me.pos.z to {add me.pos.z 0.2};
|
||||||
player_updated = true;
|
set :player_updated true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_key_down(KEY_UP)) {
|
if (is_key_down :KEY_UP) {
|
||||||
me.pos.z = me.pos.z - 0.2;
|
set me.pos.z to {sub me.pos.z 0.2};
|
||||||
player_updated = true;
|
set :player_updated true;
|
||||||
}
|
}
|
||||||
|
|
||||||
sync_camera(s, me, camera);
|
sync_camera camera me;
|
||||||
|
|
||||||
if (player_updated) {
|
if (player_updated) {
|
||||||
players = move(s, me);
|
set :players move me;
|
||||||
} else {
|
} else {
|
||||||
players = ping(s, me);
|
set :players ping me;
|
||||||
}
|
}
|
||||||
|
|
||||||
begin_drawing();
|
begin_drawing;
|
||||||
clear_background(RAYWHITE);
|
clear_background RAYWHITE;
|
||||||
|
|
||||||
begin_mode_3d(camera);
|
begin_mode_3d camera;
|
||||||
|
|
||||||
(* Draw floor *)
|
/* Draw floor */
|
||||||
draw_grid(30, 1.0);
|
draw_grid 30 1.0;
|
||||||
|
|
||||||
draw_cube(me.pos, 0.5, 0.5, 0.5, me.apperance);
|
draw_cube me.pos 0.5 0.5 0.5 me.apperance;
|
||||||
|
|
||||||
for (player in players) {
|
map :player players {
|
||||||
draw_cube(player.pos, 0.5, 0.5, 0.5, player.apperance);
|
draw_cube player.pos 0.5 0.5 0.5 player.apperance;
|
||||||
}
|
}
|
||||||
|
|
||||||
end_mode_3d();
|
end_mode_3d;
|
||||||
|
|
||||||
end_drawing();
|
end_drawing;
|
||||||
}
|
}
|
||||||
|
/* Detect window close button or ESC key */
|
||||||
|
|
||||||
logout(me);
|
set :players to logout me;
|
||||||
close_window(); (* Close window and OpenGL context *)
|
close_window; /*Close window and OpenGL context */
|
||||||
}
|
};
|
||||||
|
|
||||||
|
main;
|
|
@ -1,19 +1,19 @@
|
||||||
type Vec {
|
type :Vec {
|
||||||
x: f32,
|
f32 :x,
|
||||||
y: f32,
|
f32 :y,
|
||||||
z: f32,
|
f32 :z,
|
||||||
}
|
};
|
||||||
|
|
||||||
type Color {
|
type :Color {
|
||||||
r: u8,
|
i8 :r,
|
||||||
g: u8,
|
i8 :g,
|
||||||
b: u8,
|
i8 :b,
|
||||||
}
|
};
|
||||||
|
|
||||||
type Player {
|
type :Player {
|
||||||
username: str,
|
str :username,
|
||||||
pos: Vec,
|
Vec :pos,
|
||||||
color: Color,
|
Color :color,
|
||||||
}
|
};
|
||||||
|
|
||||||
const purple = Color{255, 255, 0};
|
Color :purple {255 255 0};
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
use "common.ztl"
|
use "common.ztl"
|
||||||
|
|
||||||
fn main(argc: i32, argv: []str): i32 {
|
fn :main(i32, []str -> i32) {
|
||||||
let s = tunnel();
|
set :argc to pop;
|
||||||
s.host("0.0.0.0:25565",
|
set :argv to pop;
|
||||||
|
|
||||||
|
set s to tunnel "0.0.0.0:25565";
|
||||||
|
s.host (
|
||||||
version,
|
version,
|
||||||
auth,
|
auth,
|
||||||
error,
|
error,
|
||||||
|
@ -15,45 +18,46 @@ fn main(argc: i32, argv: []str): i32 {
|
||||||
write,
|
write,
|
||||||
clunk,
|
clunk,
|
||||||
remove,
|
remove,
|
||||||
stat);
|
stat,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn version(m : 9pmsg) {
|
fn :version(9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn auth(m : 9pmsg) {
|
fn :auth(9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn error(m : 9pmsg) {
|
fn :error(9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn flush(m : 9pmsg) {
|
fn :flush(9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn attach(m : 9pmsg) {
|
fn :attach(9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn walk(m : 9pmsg) {
|
fn :walk(9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn open(m : 9pmsg) {
|
fn :open(9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn create(m : 9pmsg) {
|
fn :create(9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn read(m : 9pmsg) {
|
fn :read(9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn write(m : 9pmsg) {
|
fn :write(9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn clunk(m : 9pmsg) {
|
fn :clunk(9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn remove(m : 9pmsg) {
|
fn :remove(9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
fn stat(m : 9pmsg) {
|
fn :stat(9pmsg) {
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue