cgen: add _STR definition
							parent
							
								
									5f61fbcbe3
								
							
						
					
					
						commit
						c93f515a54
					
				|  | @ -41,6 +41,7 @@ pub fn cgen(files []ast.File, table &table.Table) string { | |||
| 		g.stmts(file.stmts) | ||||
| 	} | ||||
| 	g.write_variadic_types() | ||||
| 	g.write_str_definitions() | ||||
| 	return g.typedefs.str() + g.definitions.str() + g.out.str() | ||||
| } | ||||
| 
 | ||||
|  | @ -49,6 +50,8 @@ pub fn (g mut Gen) init() { | |||
| 	g.definitions.writeln('#include <inttypes.h>') // int64_t etc
 | ||||
| 	g.definitions.writeln(c_builtin_types) | ||||
| 	g.definitions.writeln(c_headers) | ||||
| 	g.definitions.writeln('\nstring _STR(const char*, ...);\n') | ||||
| 	g.definitions.writeln('\nstring _STR_TMP(const char*, ...);\n') | ||||
| 	g.write_builtin_types() | ||||
| 	g.write_typedef_types() | ||||
| 	g.write_sorted_types() | ||||
|  | @ -856,12 +859,12 @@ fn (g mut Gen) expr(node ast.Expr) { | |||
| 			g.write('sizeof($styp)') | ||||
| 		} | ||||
| 		ast.StringLiteral { | ||||
| 			// In C calls we have to generate C strings
 | ||||
| 			// `C.printf("hi")` => `printf("hi");`
 | ||||
| 			escaped_val := it.val.replace_each(['"', '\\"', | ||||
| 			'\r\n', '\\n', | ||||
| 			'\n', '\\n']) | ||||
| 			if g.is_c_call { | ||||
| 				// In C calls we have to generate C strings
 | ||||
| 				// `C.printf("hi")` => `printf("hi");`
 | ||||
| 				g.write('"$escaped_val"') | ||||
| 			} | ||||
| 			else { | ||||
|  | @ -1531,6 +1534,43 @@ fn verror(s string) { | |||
| 	// exit(1)
 | ||||
| } | ||||
| 
 | ||||
| fn (g mut Gen) write_str_definitions() { | ||||
| 	// _STR function can't be defined in vlib
 | ||||
| 	g.writeln(' | ||||
| string _STR(const char *fmt, ...) { | ||||
| 	va_list argptr; | ||||
| 	va_start(argptr, fmt); | ||||
| 	size_t len = vsnprintf(0, 0, fmt, argptr) + 1; | ||||
| 	va_end(argptr); | ||||
| 	byte* buf = malloc(len); | ||||
| 	va_start(argptr, fmt); | ||||
| 	vsprintf((char *)buf, fmt, argptr); | ||||
| 	va_end(argptr); | ||||
| #ifdef DEBUG_ALLOC | ||||
| 	puts("_STR:"); | ||||
| 	puts(buf); | ||||
| #endif | ||||
| 	return tos2(buf); | ||||
| } | ||||
| 
 | ||||
| string _STR_TMP(const char *fmt, ...) { | ||||
| 	va_list argptr; | ||||
| 	va_start(argptr, fmt); | ||||
| 	//size_t len = vsnprintf(0, 0, fmt, argptr) + 1;
 | ||||
| 	va_end(argptr); | ||||
| 	va_start(argptr, fmt); | ||||
| 	vsprintf((char *)g_str_buf, fmt, argptr); | ||||
| 	va_end(argptr); | ||||
| #ifdef DEBUG_ALLOC | ||||
| 	//puts("_STR_TMP:");
 | ||||
| 	//puts(g_str_buf);
 | ||||
| #endif | ||||
| 	return tos2(g_str_buf); | ||||
| } | ||||
| 
 | ||||
| ') | ||||
| } | ||||
| 
 | ||||
| const ( | ||||
| // TODO all builtin types must be lowercase
 | ||||
| 	builtins = ['string', 'array', 'KeyValue', 'DenseArray', 'map', 'Option'] | ||||
|  | @ -1659,7 +1699,10 @@ fn (g mut Gen) string_inter_literal(node ast.StringInterLiteral) { | |||
| 	g.write('_STR("') | ||||
| 	// Build the string with %
 | ||||
| 	for i, val in node.vals { | ||||
| 		g.write(val) | ||||
| 		escaped_val := val.replace_each(['"', '\\"', | ||||
| 		'\r\n', '\\n', | ||||
| 		'\n', '\\n']) | ||||
| 		g.write(escaped_val) | ||||
| 		if i >= node.exprs.len { | ||||
| 			continue | ||||
| 		} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue