mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Fixed build on Linux and macOS that was failing because of using std::to_chars and std::from_chars with floating-point values.
The old version of GCC and Clang support only integers to be passed to std::to_chars and std::from_chars. macOS older version of Clang doesn't support std::from_chars at all. So for Linux and macOS, it was replaced std::from_chars with strtod and temporarily was replace std::to_chars with snprintf.
This commit is contained in:
		
							parent
							
								
									428509ac00
								
							
						
					
					
						commit
						0bc77cef3e
					
				
					 2 changed files with 16 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -71,9 +71,16 @@ const char* GCodeReader::parse_line_internal(const char *ptr, const char *end, G
 | 
			
		|||
            }
 | 
			
		||||
            if (axis != NUM_AXES_WITH_UNKNOWN) {
 | 
			
		||||
                // Try to parse the numeric value.
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
                double v;
 | 
			
		||||
                auto [pend, ec] = std::from_chars(++ c, end, v);
 | 
			
		||||
                if (pend != c && is_end_of_word(*pend)) {
 | 
			
		||||
#else
 | 
			
		||||
                // The older version of GCC and Clang support std::from_chars just for integers, so strtod we used it instead.
 | 
			
		||||
                char   *pend = nullptr;
 | 
			
		||||
                double  v = strtod(++ c, &pend);
 | 
			
		||||
                if (pend != nullptr && is_end_of_word(*pend)) {
 | 
			
		||||
#endif
 | 
			
		||||
                    // The axis value has been parsed correctly.
 | 
			
		||||
                    if (axis != UNKNOWN_AXIS)
 | 
			
		||||
	                    gline.m_axis[int(axis)] = float(v);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -309,7 +309,16 @@ public:
 | 
			
		|||
 | 
			
		||||
    void emit_axis(const char axis, const double v, size_t digits) {
 | 
			
		||||
        *ptr_err.ptr ++ = ' '; *ptr_err.ptr ++ = axis;
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
        this->ptr_err = std::to_chars(this->ptr_err.ptr, this->buf_end, v, std::chars_format::fixed, digits);
 | 
			
		||||
#else
 | 
			
		||||
        int buf_capacity = int(this->buf_end - this->ptr_err.ptr);
 | 
			
		||||
        int ret          = snprintf(this->ptr_err.ptr, buf_capacity, "%.*lf", int(digits), v);
 | 
			
		||||
        if (ret <= 0 || ret > buf_capacity)
 | 
			
		||||
            ptr_err.ec = std::errc::value_too_large;
 | 
			
		||||
        else
 | 
			
		||||
            this->ptr_err.ptr = this->ptr_err.ptr + ret;
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void emit_xy(const Vec2d &point) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue