strconv.v_sprintf: add runtime checks&panics on arrity mismatches
							parent
							
								
									bb20586a5e
								
							
						
					
					
						commit
						80b150d3ad
					
				|  | @ -428,7 +428,6 @@ pub fn v_printf(str string, pt ... voidptr) { | |||
| } | ||||
| 
 | ||||
| pub fn v_sprintf(str string, pt ... voidptr) string{ | ||||
| 
 | ||||
| 	mut res := strings.new_builder(pt.len * 16) | ||||
| 
 | ||||
| 	mut i            := 0                // main strign index
 | ||||
|  | @ -473,7 +472,8 @@ pub fn v_sprintf(str string, pt ... voidptr) string{ | |||
| 		} | ||||
| 
 | ||||
| 		// single char, manage it here
 | ||||
| 		if ch == `c` && status == .field_char { | ||||
| 		if ch == `c` && status == .field_char {         | ||||
| 			v_sprintf_panic(p_index, pt.len) | ||||
| 			d1 := unsafe {*(&byte(pt[p_index]))} | ||||
| 			res.write_b(d1) | ||||
| 			status = .reset_params | ||||
|  | @ -484,6 +484,7 @@ pub fn v_sprintf(str string, pt ... voidptr) string{ | |||
| 
 | ||||
| 		// pointer, manage it here
 | ||||
| 		if ch == `p` && status == .field_char { | ||||
| 			v_sprintf_panic(p_index, pt.len) | ||||
| 			res.write("0x") | ||||
| 			res.write(ptr_str(unsafe {pt[p_index]})) | ||||
| 			status = .reset_params | ||||
|  | @ -526,8 +527,10 @@ pub fn v_sprintf(str string, pt ... voidptr) string{ | |||
| 			} | ||||
| 			// manage "%.*s" precision field
 | ||||
| 			else if ch == `.` && fc_ch1 == `*` && fc_ch2 == `s` { | ||||
| 				v_sprintf_panic(p_index, pt.len) | ||||
| 				len := unsafe {*(&int(pt[p_index]))} | ||||
| 				p_index++ | ||||
| 				v_sprintf_panic(p_index, pt.len) | ||||
| 				mut s := unsafe {*(&string(pt[p_index]))} | ||||
| 				s = s[..len] | ||||
| 				p_index++ | ||||
|  | @ -630,6 +633,7 @@ pub fn v_sprintf(str string, pt ... voidptr) string{ | |||
| 					// hh fot 8 bit int
 | ||||
| 					`h` { | ||||
| 						if ch2 == `h` { | ||||
| 							v_sprintf_panic(p_index, pt.len) | ||||
| 							x := unsafe {*(&i8(pt[p_index]))} | ||||
| 							positive = if x >= 0 { true } else { false } | ||||
| 							d1 = if positive { u64(x) } else { u64(-x) } | ||||
|  | @ -645,28 +649,31 @@ pub fn v_sprintf(str string, pt ... voidptr) string{ | |||
| 						// placeholder for future 128bit integer code
 | ||||
| 						/* | ||||
| 						if ch2 == `l` { | ||||
| 							v_sprintf_panic(p_index, pt.len) | ||||
| 							x := *(&i128(pt[p_index])) | ||||
| 							positive = if x >= 0 { true } else { false } | ||||
| 							d1 = if positive { u128(x) } else { u128(-x) } | ||||
| 						} else { | ||||
| 							v_sprintf_panic(p_index, pt.len) | ||||
| 							x := *(&i64(pt[p_index])) | ||||
| 							positive = if x >= 0 { true } else { false } | ||||
| 							d1 = if positive { u64(x) } else { u64(-x) } | ||||
| 						} | ||||
| 						*/ | ||||
| 						v_sprintf_panic(p_index, pt.len) | ||||
| 						x := unsafe {*(&i64(pt[p_index]))} | ||||
| 						positive = if x >= 0 { true } else { false } | ||||
| 						d1 = if positive { u64(x) } else { u64(-x) } | ||||
| 					} | ||||
| 					// default int
 | ||||
| 					else { | ||||
| 						v_sprintf_panic(p_index, pt.len) | ||||
| 						x := unsafe {*(&int(pt[p_index]))} | ||||
| 						positive = if x >= 0 { true } else { false } | ||||
| 						d1 = if positive { u64(x) } else { u64(-x) } | ||||
| 					} | ||||
| 
 | ||||
| 				} | ||||
| 
 | ||||
| 				res.write(format_dec(d1,{pad_ch: pad_ch, len0: len0, len1: 0, positive: positive, sign_flag: sign, allign: allign})) | ||||
| 				status = .reset_params | ||||
| 				p_index++ | ||||
|  | @ -680,7 +687,7 @@ pub fn v_sprintf(str string, pt ... voidptr) string{ | |||
| 			else if ch == `u` { | ||||
| 				mut d1 := u64(0) | ||||
| 				positive := true | ||||
| 
 | ||||
| 				v_sprintf_panic(p_index, pt.len) | ||||
| 				match ch1 { | ||||
| 					// h for 16 bit unsigned int
 | ||||
| 					// hh fot 8 bit unsigned int
 | ||||
|  | @ -704,7 +711,7 @@ pub fn v_sprintf(str string, pt ... voidptr) string{ | |||
| 						*/ | ||||
| 						d1 = u64(unsafe {*(&u64(pt[p_index]))}) | ||||
| 					} | ||||
| 					// defualt int
 | ||||
| 					// default int
 | ||||
| 					else { | ||||
| 						d1 = u64(unsafe {*(&u32(pt[p_index]))}) | ||||
| 					} | ||||
|  | @ -719,8 +726,8 @@ pub fn v_sprintf(str string, pt ... voidptr) string{ | |||
| 
 | ||||
| 			// hex
 | ||||
| 			else if ch in [`x`, `X`] { | ||||
| 				v_sprintf_panic(p_index, pt.len) | ||||
| 				mut s := "" | ||||
| 
 | ||||
| 				match ch1 { | ||||
| 					// h for 16 bit int
 | ||||
| 					// hh fot 8 bit int
 | ||||
|  | @ -768,6 +775,7 @@ pub fn v_sprintf(str string, pt ... voidptr) string{ | |||
| 
 | ||||
| 			// float and double
 | ||||
| 			if ch in [`f`, `F`] { | ||||
| 				v_sprintf_panic(p_index, pt.len) | ||||
| 				x := unsafe {*(&f64(pt[p_index]))} | ||||
| 				mut positive := x >= f64(0.0) | ||||
| 				len1 = if len1 >= 0 { len1 } else { def_len1 } | ||||
|  | @ -779,6 +787,7 @@ pub fn v_sprintf(str string, pt ... voidptr) string{ | |||
| 				continue | ||||
| 			} | ||||
| 			else if ch in [`e`, `E`] { | ||||
| 				v_sprintf_panic(p_index, pt.len) | ||||
| 				x := unsafe {*(&f64(pt[p_index]))} | ||||
| 				mut positive := x >= f64(0.0) | ||||
| 				len1 = if len1 >= 0 { len1 } else { def_len1 } | ||||
|  | @ -790,6 +799,7 @@ pub fn v_sprintf(str string, pt ... voidptr) string{ | |||
| 				continue | ||||
| 			} | ||||
| 			else if ch in [`g`, `G`] { | ||||
| 				v_sprintf_panic(p_index, pt.len) | ||||
| 				x := unsafe {*(&f64(pt[p_index]))} | ||||
| 				mut positive := x >= f64(0.0) | ||||
| 				mut s := "" | ||||
|  | @ -811,6 +821,7 @@ pub fn v_sprintf(str string, pt ... voidptr) string{ | |||
| 
 | ||||
| 			// string
 | ||||
| 			else if ch == `s` { | ||||
| 				v_sprintf_panic(p_index, pt.len) | ||||
| 				s1 := unsafe{*(&string(pt[p_index]))} | ||||
| 				pad_ch = ` ` | ||||
| 				res.write(format_str(s1, {pad_ch: pad_ch, len0: len0, len1: 0, positive: true, sign_flag: false, allign: allign})) | ||||
|  | @ -826,9 +837,20 @@ pub fn v_sprintf(str string, pt ... voidptr) string{ | |||
| 		i++ | ||||
| 	} | ||||
| 
 | ||||
| 	if p_index != pt.len { | ||||
| 		panic('${p_index} % conversion specifiers, but given ${pt.len} args') | ||||
| 	} | ||||
| 
 | ||||
| 	return res.str() | ||||
| } | ||||
| 
 | ||||
| [inline]                 | ||||
| fn v_sprintf_panic( idx, len int) { | ||||
| 	if idx >= len { | ||||
| 		panic('${idx+1} % conversion specifiers, but given only ${len} args') | ||||
| 	}         | ||||
| } | ||||
| 
 | ||||
| fn fabs(x f64) f64 { | ||||
| 	if x < 0.0 { | ||||
| 		return -x | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue