http: fix response headers and status code; clean up ft and gg
							parent
							
								
									ff730b4eb0
								
							
						
					
					
						commit
						7a7b5040e2
					
				|  | @ -1059,7 +1059,7 @@ fn (p mut Parser) close_scope() { | |||
| 			// println('breaking. "$v.name" v.scope_level=$v.scope_level')
 | ||||
| 			break | ||||
| 		} | ||||
| 		if !p.building_v && !v.is_mut && v.is_alloc { | ||||
| 		if false && !p.building_v && !v.is_mut && v.is_alloc { | ||||
| 			if v.typ.starts_with('array_') {  | ||||
| 				p.genln('v_array_free($v.name); // close_scope free') 
 | ||||
| 			}  | ||||
|  | @ -1729,17 +1729,17 @@ fn (p mut Parser) dot(str_typ string, method_ph int) string { | |||
| 			opt_type := typ.name.right(7)  | ||||
| 			p.error('unhandled option type: $opt_type?') | ||||
| 		} | ||||
| 		println('error in dot():') | ||||
| 		println('fields:') | ||||
| 		for field in typ.fields { | ||||
| 			println(field.name) | ||||
| 		} | ||||
| 		println('methods:') | ||||
| 		for field in typ.methods { | ||||
| 			println(field.name) | ||||
| 		} | ||||
| 		println('str_typ=="$str_typ"') | ||||
| 		p.error('type `$typ.name`  has no field or method `$field_name`') | ||||
| 		//println('error in dot():')
 | ||||
| 		//println('fields:')
 | ||||
| 		//for field in typ.fields {
 | ||||
| 			//println(field.name)
 | ||||
| 		//}
 | ||||
| 		//println('methods:')
 | ||||
| 		//for field in typ.methods {
 | ||||
| 			//println(field.name)
 | ||||
| 		//}
 | ||||
| 		//println('str_typ=="$str_typ"')
 | ||||
| 		p.error('type `$typ.name` has no field or method `$field_name`') | ||||
| 	} | ||||
| 	mut dot := '.' | ||||
| 	if str_typ.contains('*') { | ||||
|  |  | |||
|  | @ -1,6 +1,19 @@ | |||
| fn test_mut() { | ||||
| 	a := 1  | ||||
| 	mut b := &a | ||||
| 	*b = 10  | ||||
| 	println(a)  | ||||
| fn foo(a mut []int) { | ||||
| 	a[0] = 7  | ||||
| 	a << 4  | ||||
| }  | ||||
| 
 | ||||
| fn test_mut() { | ||||
| 	mut a := [1,2,3]  | ||||
| 	foo(mut a)  | ||||
| 	assert a.len == 4  | ||||
| 	assert a[0] == 7  | ||||
| 	assert a[3] == 4  | ||||
| 
 | ||||
| 	n := 1  | ||||
| 	mut b := &n  | ||||
| 	*b = 10  | ||||
| 
 | ||||
| 	//mut b := mut a
 | ||||
| 	//b = 10 
 | ||||
| }  | ||||
|  |  | |||
|  | @ -12,7 +12,6 @@ pub mut: | |||
| } | ||||
| 
 | ||||
| fn main() { | ||||
|         println('Running vweb test on http://localhost:$Port')
 | ||||
|         vweb.run<App>(Port) | ||||
| } | ||||
| 
 | ||||
|  | @ -27,3 +26,4 @@ pub fn (app mut App) json_endpoint() { | |||
| pub fn (app mut App) index() { | ||||
|         app.vweb.text('hello world') | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -248,7 +248,6 @@ pub fn (m map_string) str() string { | |||
| 	if m.size == 0 { | ||||
| 		return '{}' | ||||
| 	} | ||||
| 	// TODO use bytes buffer
 | ||||
| 	mut sb := strings.new_builder(50) | ||||
| 	sb.writeln('{')  | ||||
| 	for key, val  in m {  | ||||
|  |  | |||
|  | @ -5,8 +5,8 @@ | |||
| module builtin | ||||
| 
 | ||||
| struct string { | ||||
| mut: | ||||
| 	hash_cache int  | ||||
| //mut:
 | ||||
| 	//hash_cache int 
 | ||||
| pub: | ||||
| 	str byteptr | ||||
| 	len int | ||||
|  | @ -864,7 +864,8 @@ pub fn (c byte) is_white() bool { | |||
| 
 | ||||
| 
 | ||||
| pub fn (s string) hash() int { | ||||
| 	mut h := s.hash_cache  | ||||
| 	//mut h := s.hash_cache 
 | ||||
| 	mut h := 0  | ||||
| 	if h == 0 && s.len > 0 {  | ||||
| 		for c in s {  | ||||
| 			h = h * 31 + int(c)  | ||||
|  |  | |||
							
								
								
									
										90
									
								
								vlib/ft/ft.v
								
								
								
								
							
							
						
						
									
										90
									
								
								vlib/ft/ft.v
								
								
								
								
							|  | @ -4,13 +4,21 @@ | |||
| 
 | ||||
| module ft  | ||||
| 
 | ||||
| import stbi | ||||
| import glm | ||||
| import gl | ||||
| import ( | ||||
| 	os  | ||||
| gx  | ||||
| gg  | ||||
|  stbi | ||||
|  glm | ||||
|  gl | ||||
| )  | ||||
| 
 | ||||
| #flag -I @VROOT/thirdparty/freetype  | ||||
| #flag darwin -I/usr/local/Cellar/freetype/2.10.0/include/freetype2  | ||||
| #flag -lfreetype  | ||||
| 
 | ||||
| #flag @VROOT/thirdparty/freetype/libfreetype.a  | ||||
| //#flag -I @VROOT/thirdparty/freetype 
 | ||||
| 
 | ||||
| //#flag @VROOT/thirdparty/freetype/libfreetype.a 
 | ||||
| #flag darwin -lpng -lbz2 -lz  | ||||
| 
 | ||||
| 
 | ||||
|  | @ -21,32 +29,54 @@ import gl | |||
| #include "ft2build.h" | ||||
| #include FT_FREETYPE_H | ||||
| 
 | ||||
| const ( | ||||
| 	DEFAULT_FONT_SIZE = 12 | ||||
| ) | ||||
| 
 | ||||
| struct Character { | ||||
| 	texture_id u32 | ||||
| 	size       gg.Vec2 | ||||
| 	bearing    gg.Vec2 | ||||
| 	advance    u32 | ||||
| } | ||||
| 
 | ||||
| struct Face { | ||||
| 	cobj voidptr | ||||
| } | ||||
| 
 | ||||
| struct GG { | ||||
| 	shader    gl.Shader | ||||
| 	// use_ortho bool
 | ||||
| 	width     int | ||||
| 	height    int | ||||
| 	VAO       u32 | ||||
| 	vao       u32 | ||||
| 	rect_vao  u32 | ||||
| 	rect_vbo  u32 | ||||
| 	line_vao  u32 | ||||
| 	line_vbo  u32 | ||||
| 	VBO       u32 | ||||
| 	chars     []gg.Character | ||||
| 	vbo       u32 | ||||
| 	chars     []Character | ||||
| 	utf_runes []string | ||||
| 	utf_chars []gg.Character | ||||
| 	utf_chars []Character | ||||
| 	text_ctx  *GG | ||||
| 	face      Face | ||||
| 	scale     int // retina = 2 , normal = 1
 | ||||
| } | ||||
| 
 | ||||
| struct Character { | ||||
| 	texture_id u32 | ||||
| 	size       Vec2 | ||||
| 	bearing    Vec2 | ||||
| 	advance    u32 | ||||
| struct Cfg { | ||||
| 	width     int | ||||
| 	height    int | ||||
| 	use_ortho bool  | ||||
| 	retina    bool | ||||
| 	  | ||||
| 	font_size int | ||||
| 	create_window bool  | ||||
| 	window_user_ptr voidptr  | ||||
| 	window_title string  | ||||
| 	always_on_top bool  | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| // jfn ft_load_char(face FT_Face, code FT_ULong) Character {
 | ||||
| // fn ft_load_char(_face voidptr, _code voidptr) Character {
 | ||||
| fn ft_load_char(_face Face, code i64) Character { | ||||
|  | @ -86,7 +116,7 @@ fn ft_load_char(_face Face, code i64) Character { | |||
| 	return ch | ||||
| } | ||||
| 
 | ||||
| pub fn new_context_text(cfg Cfg, scale int) *GG { | ||||
| pub fn new_context(cfg gg.Cfg, scale int) *GG { | ||||
| 	// Can only have text in ortho mode
 | ||||
| 	if !cfg.use_ortho { | ||||
| 		return &GG{text_ctx: 0} | ||||
|  | @ -106,7 +136,7 @@ pub fn new_context_text(cfg Cfg, scale int) *GG { | |||
| */ | ||||
| 	// gl.enable(GL_CULL_FACE) // TODO NEED CULL?  
 | ||||
| 	gl.enable(GL_BLEND) | ||||
| return &GG{}  | ||||
| //return &GG{} 
 | ||||
| 	// return &GG{}
 | ||||
| 	# glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||
| 	shader := gl.new_shader('text') | ||||
|  | @ -124,10 +154,10 @@ return &GG{} | |||
| 	// face := FT_Face{}
 | ||||
| 	mut font_path := 'RobotoMono-Regular.ttf' | ||||
| 	if !os.file_exists(font_path) { | ||||
| 		exePath := os.getexepath() | ||||
| 		exeDir := os.basedir(exePath) | ||||
| 		println('Trying to load from $exeDir') | ||||
| 		font_path = '${exeDir}/RobotoMono-Regular.ttf' | ||||
| 		exe_path := os.executable() | ||||
| 		exe_dir := os.basedir(exe_path) | ||||
| 		println('Trying to load from $exe_dir') | ||||
| 		font_path = '$exe_dir/RobotoMono-Regular.ttf' | ||||
| 	} | ||||
| 	if !os.file_exists(font_path) { | ||||
| 		println('failed to load RobotoMono-Regular.ttf') | ||||
|  | @ -147,7 +177,7 @@ return &GG{} | |||
| 	# glPixelStorei(GL_UNPACK_ALIGNMENT, 1); | ||||
| 	// Gen texture
 | ||||
| 	// Load first 128 characters of ASCII set
 | ||||
| 	mut chars := []gg.Character{} | ||||
| 	mut chars := []Character{} | ||||
| 	f := Face { | ||||
| 		cobj: 0 | ||||
| 	} | ||||
|  | @ -175,11 +205,11 @@ return &GG{} | |||
| 	// # ch = gg__ft_load_char(f, 128169);
 | ||||
| 	// chars.push(ch)
 | ||||
| 	// Configure VAO
 | ||||
| 	VAO := gl.gen_vertex_array() | ||||
| 	println('new gg text context VAO=$VAO') | ||||
| 	VBO := gl.gen_buffer() | ||||
| 	gl.bind_vao(VAO) | ||||
| 	gl.bind_buffer(GL_ARRAY_BUFFER, VBO) | ||||
| 	vao := gl.gen_vertex_array() | ||||
| 	println('new gg text context vao=$vao') | ||||
| 	vbo := gl.gen_buffer() | ||||
| 	gl.bind_vao(vao) | ||||
| 	gl.bind_buffer(GL_ARRAY_BUFFER, vbo) | ||||
| 	// # glBufferData(GL_ARRAY_BUFFER, sizeof(GLf32) * 6 * 4, NULL, GL_DYNAMIC_DRAW);
 | ||||
| 	gl.enable_vertex_attrib_array(0) | ||||
| 	gl.vertex_attrib_pointer(0, 4, GL_FLOAT, false, 4, 0) | ||||
|  | @ -191,8 +221,8 @@ return &GG{} | |||
| 		width: width, | ||||
| 		height: height, | ||||
| 		scale: scale | ||||
| 		VAO: VAO, | ||||
| 		VBO: VBO, | ||||
| 		vao: vao, | ||||
| 		vbo: vbo, | ||||
| 		chars: chars, | ||||
| 		face: f | ||||
| 		text_ctx: 0 | ||||
|  | @ -271,7 +301,7 @@ fn (ctx &GG) _draw_text(_x, _y int, utext ustring, cfg gx.TextCfg) { | |||
| 	ctx.shader.use() | ||||
| 	ctx.shader.set_color('textColor', color) | ||||
| 	# glActiveTexture(GL_TEXTURE0); | ||||
| 	gl.bind_vao(ctx.VAO) | ||||
| 	gl.bind_vao(ctx.vao) | ||||
| 	// Iterate through all characters
 | ||||
| 	// utext := text.ustring()
 | ||||
| 	for i := 0; i < utext.len; i++ { | ||||
|  | @ -323,7 +353,7 @@ fn (ctx &GG) _draw_text(_x, _y int, utext ustring, cfg gx.TextCfg) { | |||
| 		// t1 := glfw.get_time()
 | ||||
| 		# glBindTexture(GL_TEXTURE_2D, ch.texture_id); | ||||
| 		// Update content of VBO memory
 | ||||
| 		gl.bind_buffer(GL_ARRAY_BUFFER, ctx.VBO) | ||||
| 		gl.bind_buffer(GL_ARRAY_BUFFER, ctx.vbo) | ||||
| 		// t2 := glfw.get_time()
 | ||||
| 		// # glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); // Be sure to use glBufferSubData and not glBufferData
 | ||||
| 		# glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW); | ||||
|  |  | |||
							
								
								
									
										39
									
								
								vlib/gg/gg.v
								
								
								
								
							
							
						
						
									
										39
									
								
								vlib/gg/gg.v
								
								
								
								
							|  | @ -12,6 +12,7 @@ import os | |||
| import glfw  | ||||
| 
 | ||||
| struct Vec2 { | ||||
| pub:  | ||||
| 	x int | ||||
| 	y int | ||||
| } | ||||
|  | @ -24,10 +25,6 @@ import const ( | |||
| 	GL_INT | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	DEFAULT_FONT_SIZE = 12 | ||||
| ) | ||||
| 
 | ||||
| pub fn vec2(x, y int) Vec2 { | ||||
| 	res := Vec2 { | ||||
| 		x: x, | ||||
|  | @ -42,11 +39,9 @@ pub fn init() { | |||
| 	gl.init_glad() | ||||
| } | ||||
| 
 | ||||
| struct Face { | ||||
| 	cobj voidptr | ||||
| } | ||||
| 
 | ||||
| struct Cfg { | ||||
| pub:  | ||||
| 	width     int | ||||
| 	height    int | ||||
| 	use_ortho bool  | ||||
|  | @ -95,32 +90,6 @@ pub fn new_context(cfg Cfg) *GG { | |||
| 	shader.use() | ||||
| 	if cfg.use_ortho {  | ||||
| 		projection := glm.ortho(0, cfg.width, cfg.height, 0) | ||||
| 		/*  | ||||
| 		// for debugging broken tetris in gg.o
 | ||||
| 		# projection.data[0]=0.010000; | ||||
| 		# projection.data[1]=0.000000; | ||||
| 		# projection.data[2]=0.000000; | ||||
| 		# projection.data[3]=0.000000; | ||||
| 		# projection.data[4]=0.000000; | ||||
| 		# projection.data[5]=-0.005000; | ||||
| 		# projection.data[6]=0.000000; | ||||
| 		# projection.data[7]=0.000000; | ||||
| 		# projection.data[8]=0.000000; | ||||
| 		# projection.data[9]=0.000000; | ||||
| 		# projection.data[10]=1.000000; | ||||
| 		# projection.data[11]=0.000000; | ||||
| 		# projection.data[12]=-1.000000; | ||||
| 		# projection.data[13]=1.000000; | ||||
| 		# projection.data[14]=0.000000; | ||||
| 		# projection.data[15]=1.000000; | ||||
| */ | ||||
| 		// projection_new := ortho(0, width, height, 0)
 | ||||
| 		// println('\nORTHO OLD=')
 | ||||
| 		//# for (int i=0;i<16;i++) printf("%d=%f ",i, projection.data[i]);
 | ||||
| 		// println('\n\n!ORTHO NEW=')
 | ||||
| 		// # for (int i=0;i<16;i++) printf("%d=%f ",i, projection_new[i]);
 | ||||
| 		// println('\n\n')
 | ||||
| 		//println('setting o')
 | ||||
| 		shader.set_mat4('projection', projection) | ||||
| 	} | ||||
| 	else { | ||||
|  | @ -342,6 +311,10 @@ fn (c GG) fill_color(color gx.Color) { | |||
| fn (c GG) fill() { | ||||
| } | ||||
| 
 | ||||
| pub fn (ctx &GG) draw_text(_x, _y int, text string, cfg gx.TextCfg) { | ||||
| //pub fn (c &GG) draw_text(x, y int) {
 | ||||
| }  | ||||
| 
 | ||||
| fn (c GG) move_to(x, y int) { | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -30,6 +30,26 @@ fn test_ortho() { | |||
| 	assert cmp(projection.data[14], 0.000000) | ||||
| 	assert cmp(projection.data[15], 1.000000) | ||||
| 	// f := gg.ortho(1,2,3,4)
 | ||||
| 
 | ||||
| 		/*  | ||||
| 		// for debugging broken tetris in gg.o
 | ||||
| 		# projection.data[0]=0.010000; | ||||
| 		# projection.data[1]=0.000000; | ||||
| 		# projection.data[2]=0.000000; | ||||
| 		# projection.data[3]=0.000000; | ||||
| 		# projection.data[4]=0.000000; | ||||
| 		# projection.data[5]=-0.005000; | ||||
| 		# projection.data[6]=0.000000; | ||||
| 		# projection.data[7]=0.000000; | ||||
| 		# projection.data[8]=0.000000; | ||||
| 		# projection.data[9]=0.000000; | ||||
| 		# projection.data[10]=1.000000; | ||||
| 		# projection.data[11]=0.000000; | ||||
| 		# projection.data[12]=-1.000000; | ||||
| 		# projection.data[13]=1.000000; | ||||
| 		# projection.data[14]=0.000000; | ||||
| 		# projection.data[15]=1.000000; | ||||
| */ | ||||
| } | ||||
| 
 | ||||
| fn test_rotate() { | ||||
|  |  | |||
|  | @ -50,7 +50,8 @@ fn write_fn(contents byteptr, size, nmemb int, _mem *MemoryStruct) int { | |||
| 	mut mem := _mem | ||||
| 	// # printf("size =%d nmemb=%d contents=%s\n", size, nmemb, contents);
 | ||||
| 	realsize := size * nmemb// TODO size_t ?
 | ||||
| 	if !isnil(mem.ws_func) { | ||||
| /*  | ||||
| 	if false && !isnil(mem.ws_func) { | ||||
| 		//C.printf('\n\nhttp_mac.m: GOT WS FUNC. size=%d\n', realsize)
 | ||||
| 		// Skip negative and 0 junk chars in the WS string
 | ||||
| 		mut start := 0 | ||||
|  | @ -62,12 +63,13 @@ fn write_fn(contents byteptr, size, nmemb int, _mem *MemoryStruct) int { | |||
| 			} | ||||
| 		} | ||||
| 		contents += start + 1 | ||||
| 		// printf("GOOD CONTEnTS=%s\n", contents);
 | ||||
| 		C.printf('GOOD CONTEnTS=%s\n', contents)  | ||||
| 		s := string(contents) | ||||
| 		f := mem.ws_func  | ||||
| 		f(s, mem.user_ptr)  | ||||
| 		//# mem->ws_func(s, mem->user_ptr);
 | ||||
| 	} | ||||
| */  | ||||
| 	mut c := string(contents) | ||||
| 	c = c.trim_space() | ||||
| 	// Need to clone because libcurl reuses this memory
 | ||||
|  | @ -169,22 +171,18 @@ pub fn (req &Request) do() Response { | |||
| 			continue | ||||
| 		} | ||||
| 		key := h.left(pos) | ||||
| 		val := h.right(pos + 1) | ||||
| 		// println('"$key" *** "$val"')
 | ||||
| 		val := h.right(pos + 2) | ||||
| 		//println('"$h" "$key" *** "$val"')
 | ||||
| 		// val2 := val.trim_space()
 | ||||
| 		// println('val2="$val2"')
 | ||||
| 		headers[key] = val// val.trim_space()
 | ||||
| 	} | ||||
| 	// println('done')
 | ||||
| 	// j.println(resp.status_code)
 | ||||
| 	// println('body=')
 | ||||
| 	// j.println(resp.body)
 | ||||
| 	// j.println('headers=')
 | ||||
| 	// j.println(hchunk.strings)
 | ||||
| 	C.curl_easy_cleanup(curl) | ||||
| 	//println('end of req.do() url="$req.url"')
 | ||||
| 	return Response { | ||||
| 		text: body | ||||
| 		status_code: status_code  | ||||
| 		headers: headers  | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,3 +7,4 @@ fn test_escape_unescape() { | |||
|   unescaped := http.unescape_url(escaped) | ||||
|   assert unescaped == original | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -31,7 +31,7 @@ pub fn (b mut Builder) writeln(s string) { | |||
| } | ||||
| 
 | ||||
| pub fn (b Builder) str() string { | ||||
| 	return tos(b.buf.data, b.len) | ||||
| 	return string(b.buf, b.len) | ||||
| } | ||||
| 
 | ||||
| pub fn (b Builder) cut(n int) { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue