| diff --git a/base/third_party/dmg_fp/dtoa.cc b/base/third_party/dmg_fp/dtoa.cc | 
 | index 3312fa4..502c16c 100644 | 
 | --- a/base/third_party/dmg_fp/dtoa.cc | 
 | +++ b/base/third_party/dmg_fp/dtoa.cc | 
 | @@ -548,8 +548,10 @@ Balloc | 
 |  	ACQUIRE_DTOA_LOCK(0); | 
 |  	/* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */ | 
 |  	/* but this case seems very unlikely. */ | 
 | -	if (k <= Kmax && (rv = freelist[k])) | 
 | +	if (k <= Kmax && freelist[k]) { | 
 | +		rv = freelist[k]; | 
 |  		freelist[k] = rv->next; | 
 | +		} | 
 |  	else { | 
 |  		x = 1 << k; | 
 |  #ifdef Omit_Private_Memory | 
 | @@ -650,7 +652,7 @@ multadd | 
 |  			Bfree(b); | 
 |  			b = b1; | 
 |  			} | 
 | -		b->x[wds++] = carry; | 
 | +		b->x[wds++] = (ULong)carry; | 
 |  		b->wds = wds; | 
 |  		} | 
 |  	return b; | 
 | @@ -834,7 +836,8 @@ mult | 
 |  	xc0 = c->x; | 
 |  #ifdef ULLong | 
 |  	for(; xb < xbe; xc0++) { | 
 | -		if ((y = *xb++)) { | 
 | +		y = *xb++; | 
 | +		if (y) { | 
 |  			x = xa; | 
 |  			xc = xc0; | 
 |  			carry = 0; | 
 | @@ -844,7 +847,7 @@ mult | 
 |  				*xc++ = z & FFFFFFFF; | 
 |  				} | 
 |  				while(x < xae); | 
 | -			*xc = carry; | 
 | +			*xc = (ULong)carry; | 
 |  			} | 
 |  		} | 
 |  #else | 
 | @@ -916,16 +919,19 @@ pow5mult | 
 |  	int i; | 
 |  	static int p05[3] = { 5, 25, 125 }; | 
 |   | 
 | -	if ((i = k & 3)) | 
 | +	i = k & 3; | 
 | +	if (i) | 
 |  		b = multadd(b, p05[i-1], 0); | 
 |   | 
 |  	if (!(k >>= 2)) | 
 |  		return b; | 
 | -	if (!(p5 = p5s)) { | 
 | +	p5 = p5s; | 
 | +	if (!p5) { | 
 |  		/* first time */ | 
 |  #ifdef MULTIPLE_THREADS | 
 |  		ACQUIRE_DTOA_LOCK(1); | 
 | -		if (!(p5 = p5s)) { | 
 | +		p5 = p5s; | 
 | +		if (!p5) { | 
 |  			p5 = p5s = i2b(625); | 
 |  			p5->next = 0; | 
 |  			} | 
 | @@ -943,10 +949,12 @@ pow5mult | 
 |  			} | 
 |  		if (!(k >>= 1)) | 
 |  			break; | 
 | -		if (!(p51 = p5->next)) { | 
 | +		p51 = p5->next; | 
 | +		if (!p51) { | 
 |  #ifdef MULTIPLE_THREADS | 
 |  			ACQUIRE_DTOA_LOCK(1); | 
 | -			if (!(p51 = p5->next)) { | 
 | +			p51 = p5->next; | 
 | +			if (!p51) { | 
 |  				p51 = p5->next = mult(p5,p5); | 
 |  				p51->next = 0; | 
 |  				} | 
 | @@ -997,7 +1005,8 @@ lshift | 
 |  			z = *x++ >> k1; | 
 |  			} | 
 |  			while(x < xe); | 
 | -		if ((*x1 = z)) | 
 | +		*x1 = z; | 
 | +		if (*x1) | 
 |  			++n1; | 
 |  		} | 
 |  #else | 
 | @@ -1299,21 +1308,25 @@ d2b | 
 |  	z |= Exp_msk11; | 
 |  #endif | 
 |  #else | 
 | -	if ((de = (int)(d0 >> Exp_shift))) | 
 | +	de = (int)(d0 >> Exp_shift); | 
 | +	if (de) | 
 |  		z |= Exp_msk1; | 
 |  #endif | 
 |  #ifdef Pack_32 | 
 | -	if ((y = d1)) { | 
 | -		if ((k = lo0bits(&y))) { | 
 | +	y = d1; | 
 | +	if (y) { | 
 | +		k = lo0bits(&y); | 
 | +		if (k) { | 
 |  			x[0] = y | z << (32 - k); | 
 |  			z >>= k; | 
 |  			} | 
 |  		else | 
 |  			x[0] = y; | 
 | +		x[1] = z; | 
 | +		b->wds = x[1] ? 2 : 1; | 
 |  #ifndef Sudden_Underflow | 
 | -		i = | 
 | +		i = b->wds; | 
 |  #endif | 
 | -		    b->wds = (x[1] = z) ? 2 : 1; | 
 |  		} | 
 |  	else { | 
 |  		k = lo0bits(&z); | 
 | @@ -1498,7 +1511,7 @@ htinit(unsigned char *h, unsigned char *s, int inc) | 
 |  { | 
 |  	int i, j; | 
 |  	for(i = 0; (j = s[i]) !=0; i++) | 
 | -		h[j] = i + inc; | 
 | +		h[j] = (unsigned char)(i + inc); | 
 |  	} | 
 |   | 
 |   static void | 
 | @@ -1536,7 +1549,7 @@ match | 
 |  	int c, d; | 
 |  	CONST char *s = *sp; | 
 |   | 
 | -	while((d = *t++)) { | 
 | +	for(d = *t++; d; d = *t++) { | 
 |  		if ((c = *++s) >= 'A' && c <= 'Z') | 
 |  			c += 'a' - 'A'; | 
 |  		if (c != d) | 
 | @@ -1566,12 +1579,13 @@ hexnan | 
 |  	udx0 = 1; | 
 |  	s = *sp; | 
 |  	/* allow optional initial 0x or 0X */ | 
 | -	while((c = *(CONST unsigned char*)(s+1)) && c <= ' ') | 
 | +	for(c = *(CONST unsigned char*)(s+1); c && c <= ' '; c = *(CONST unsigned char*)(s+1)) | 
 |  		++s; | 
 |  	if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X')) | 
 |  		s += 2; | 
 | -	while((c = *(CONST unsigned char*)++s)) { | 
 | -		if ((c1 = hexdig[c])) | 
 | +	for(c = *(CONST unsigned char*)++s; c; c = *(CONST unsigned char*)++s) { | 
 | +		c1 = hexdig[c]; | 
 | +		if (c1) | 
 |  			c  = c1 & 0xf; | 
 |  		else if (c <= ' ') { | 
 |  			if (udx0 && havedig) { | 
 | @@ -1594,7 +1608,8 @@ hexnan | 
 |  					*sp = s + 1; | 
 |  					break; | 
 |  					} | 
 | -				} while((c = *++s)); | 
 | +				c = *++s; | 
 | +				} while(c); | 
 |  			break; | 
 |  			} | 
 |  #endif | 
 | @@ -2328,7 +2343,8 @@ bigcomp | 
 |  	/* Now b/d = exactly half-way between the two floating-point values */ | 
 |  	/* on either side of the input string.  Compute first digit of b/d. */ | 
 |   | 
 | -	if (!(dig = quorem(b,d))) { | 
 | +	dig = quorem(b,d); | 
 | +	if (!dig) { | 
 |  		b = multadd(b, 10, 0);	/* very unlikely */ | 
 |  		dig = quorem(b,d); | 
 |  		} | 
 | @@ -2336,7 +2352,8 @@ bigcomp | 
 |  	/* Compare b/d with s0 */ | 
 |   | 
 |  	for(i = 0; i < nd0; ) { | 
 | -		if ((dd = s0[i++] - '0' - dig)) | 
 | +		dd = s0[i++] - '0' - dig; | 
 | +		if (dd) | 
 |  			goto ret; | 
 |  		if (!b->x[0] && b->wds == 1) { | 
 |  			if (i < nd) | 
 | @@ -2347,7 +2364,8 @@ bigcomp | 
 |  		dig = quorem(b,d); | 
 |  		} | 
 |  	for(j = bc->dp1; i++ < nd;) { | 
 | -		if ((dd = s0[j++] - '0' - dig)) | 
 | +		dd = s0[j++] - '0' - dig; | 
 | +		if (dd) | 
 |  			goto ret; | 
 |  		if (!b->x[0] && b->wds == 1) { | 
 |  			if (i < nd) | 
 | @@ -2747,7 +2765,8 @@ strtod | 
 |  	/* Get starting approximation = rv * 10**e1 */ | 
 |   | 
 |  	if (e1 > 0) { | 
 | -		if ((i = e1 & 15)) | 
 | +		i = e1 & 15; | 
 | +		if (i) | 
 |  			dval(&rv) *= tens[i]; | 
 |  		if (e1 &= ~15) { | 
 |  			if (e1 > DBL_MAX_10_EXP) { | 
 | @@ -2805,7 +2824,8 @@ strtod | 
 |  		} | 
 |  	else if (e1 < 0) { | 
 |  		e1 = -e1; | 
 | -		if ((i = e1 & 15)) | 
 | +		i = e1 & 15; | 
 | +		if (i) | 
 |  			dval(&rv) /= tens[i]; | 
 |  		if (e1 >>= 4) { | 
 |  			if (e1 >= 1 << n_bigtens) | 
 | @@ -3283,7 +3303,7 @@ strtod | 
 |  #ifdef Avoid_Underflow | 
 |  			if (bc.scale && y <= 2*P*Exp_msk1) { | 
 |  				if (aadj <= 0x7fffffff) { | 
 | -					if ((z = aadj) <= 0) | 
 | +					if ((z = (ULong)aadj) <= 0) | 
 |  						z = 1; | 
 |  					aadj = z; | 
 |  					aadj1 = bc.dsign ? aadj : -aadj; | 
 | @@ -3456,7 +3476,7 @@ nrv_alloc(CONST char *s, char **rve, int n) | 
 |  	char *rv, *t; | 
 |   | 
 |  	t = rv = rv_alloc(n); | 
 | -	while((*t = *s++)) t++; | 
 | +	for(*t = *s++; *t; *t = *s++) t++; | 
 |  	if (rve) | 
 |  		*rve = t; | 
 |  	return rv; | 
 | @@ -3569,7 +3589,7 @@ dtoa | 
 |  	int denorm; | 
 |  	ULong x; | 
 |  #endif | 
 | -	Bigint *b, *b1, *delta, *mlo, *mhi, *S; | 
 | +	Bigint *b, *b1, *delta, *mlo = NULL, *mhi, *S; | 
 |  	U d2, eps, u; | 
 |  	double ds; | 
 |  	char *s, *s0; | 
 | @@ -3645,10 +3665,9 @@ dtoa | 
 |  #endif | 
 |   | 
 |  	b = d2b(&u, &be, &bbits); | 
 | -#ifdef Sudden_Underflow | 
 |  	i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)); | 
 | -#else | 
 | -	if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) { | 
 | +#ifndef Sudden_Underflow | 
 | +	if (i) { | 
 |  #endif | 
 |  		dval(&d2) = dval(&u); | 
 |  		word0(&d2) &= Frac_mask1; | 
 | @@ -3803,13 +3822,16 @@ dtoa | 
 |  					} | 
 |  			dval(&u) /= ds; | 
 |  			} | 
 | -		else if ((j1 = -k)) { | 
 | -			dval(&u) *= tens[j1 & 0xf]; | 
 | -			for(j = j1 >> 4; j; j >>= 1, i++) | 
 | -				if (j & 1) { | 
 | -					ieps++; | 
 | -					dval(&u) *= bigtens[i]; | 
 | -					} | 
 | +		else { | 
 | +			j1 = -k; | 
 | +			if (j1) { | 
 | +				dval(&u) *= tens[j1 & 0xf]; | 
 | +				for(j = j1 >> 4; j; j >>= 1, i++) | 
 | +					if (j & 1) { | 
 | +						ieps++; | 
 | +						dval(&u) *= bigtens[i]; | 
 | +						} | 
 | +				} | 
 |  			} | 
 |  		if (k_check && dval(&u) < 1. && ilim > 0) { | 
 |  			if (ilim1 <= 0) | 
 | @@ -3837,9 +3859,9 @@ dtoa | 
 |  			 */ | 
 |  			dval(&eps) = 0.5/tens[ilim-1] - dval(&eps); | 
 |  			for(i = 0;;) { | 
 | -				L = dval(&u); | 
 | +				L = (long)dval(&u); | 
 |  				dval(&u) -= L; | 
 | -				*s++ = '0' + (int)L; | 
 | +				*s++ = '0' + (char)L; | 
 |  				if (dval(&u) < dval(&eps)) | 
 |  					goto ret1; | 
 |  				if (1. - dval(&u) < dval(&eps)) | 
 | @@ -3858,7 +3880,7 @@ dtoa | 
 |  				L = (Long)(dval(&u)); | 
 |  				if (!(dval(&u) -= L)) | 
 |  					ilim = i; | 
 | -				*s++ = '0' + (int)L; | 
 | +				*s++ = '0' + (char)L; | 
 |  				if (i == ilim) { | 
 |  					if (dval(&u) > 0.5 + dval(&eps)) | 
 |  						goto bump_up; | 
 | @@ -3901,7 +3923,7 @@ dtoa | 
 |  				dval(&u) += ds; | 
 |  				} | 
 |  #endif | 
 | -			*s++ = '0' + (int)L; | 
 | +			*s++ = '0' + (char)L; | 
 |  			if (!dval(&u)) { | 
 |  #ifdef SET_INEXACT | 
 |  				inexact = 0; | 
 | @@ -3964,7 +3986,8 @@ dtoa | 
 |  				Bfree(b); | 
 |  				b = b1; | 
 |  				} | 
 | -			if ((j = b5 - m5)) | 
 | +			j = b5 - m5; | 
 | +			if (j) | 
 |  				b = pow5mult(b, j); | 
 |  			} | 
 |  		else | 
 | @@ -4002,7 +4025,8 @@ dtoa | 
 |  	 * can do shifts and ors to compute the numerator for q. | 
 |  	 */ | 
 |  #ifdef Pack_32 | 
 | -	if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f)) | 
 | +	i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f; | 
 | +	if (i) | 
 |  		i = 32 - i; | 
 |  #define iInc 28 | 
 |  #else | 
 | @@ -4077,7 +4101,7 @@ dtoa | 
 |  				else if (!b->x[0] && b->wds <= 1) | 
 |  					inexact = 0; | 
 |  #endif | 
 | -				*s++ = dig; | 
 | +				*s++ = (char)dig; | 
 |  				goto ret; | 
 |  				} | 
 |  #endif | 
 | @@ -4107,7 +4131,7 @@ dtoa | 
 |  						goto round_9_up; | 
 |  					} | 
 |   accept_dig: | 
 | -				*s++ = dig; | 
 | +				*s++ = (char)dig; | 
 |  				goto ret; | 
 |  				} | 
 |  			if (j1 > 0) { | 
 | @@ -4120,13 +4144,13 @@ dtoa | 
 |  					*s++ = '9'; | 
 |  					goto roundoff; | 
 |  					} | 
 | -				*s++ = dig + 1; | 
 | +				*s++ = (char)dig + 1; | 
 |  				goto ret; | 
 |  				} | 
 |  #ifdef Honor_FLT_ROUNDS | 
 |   keep_dig: | 
 |  #endif | 
 | -			*s++ = dig; | 
 | +			*s++ = (char)dig; | 
 |  			if (i == ilim) | 
 |  				break; | 
 |  			b = multadd(b, 10, 0); | 
 | @@ -4140,7 +4164,8 @@ dtoa | 
 |  		} | 
 |  	else | 
 |  		for(i = 1;; i++) { | 
 | -			*s++ = dig = quorem(b,S) + '0'; | 
 | +			dig = quorem(b,S) + '0'; | 
 | +			*s++ = (char)dig; | 
 |  			if (!b->x[0] && b->wds <= 1) { | 
 |  #ifdef SET_INEXACT | 
 |  				inexact = 0; | 
 | diff --git a/base/third_party/dmg_fp/g_fmt.cc b/base/third_party/dmg_fp/g_fmt.cc | 
 | index d864eb7..bfa358d 100644 | 
 | --- a/base/third_party/dmg_fp/g_fmt.cc | 
 | +++ b/base/third_party/dmg_fp/g_fmt.cc | 
 | @@ -46,14 +46,14 @@ g_fmt(register char *b, double x) | 
 |  	if (sign) | 
 |  		*b++ = '-'; | 
 |  	if (decpt == 9999) /* Infinity or Nan */ { | 
 | -		while((*b++ = *s++)) {} | 
 | +		for(*b = *s++; *b++; *b = *s++) {} | 
 |  		goto done0; | 
 |  		} | 
 |  	if (decpt <= -4 || decpt > se - s + 5) { | 
 |  		*b++ = *s++; | 
 |  		if (*s) { | 
 |  			*b++ = '.'; | 
 | -			while((*b = *s++)) | 
 | +			for(*b = *s++; *b; *b = *s++) | 
 |  				b++; | 
 |  			} | 
 |  		*b++ = 'e'; | 
 | @@ -67,7 +67,7 @@ g_fmt(register char *b, double x) | 
 |  		for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10) {} | 
 |  		for(;;) { | 
 |  			i = decpt / k; | 
 | -			*b++ = i + '0'; | 
 | +			*b++ = (char)i + '0'; | 
 |  			if (--j <= 0) | 
 |  				break; | 
 |  			decpt -= i*k; | 
 | @@ -79,10 +79,10 @@ g_fmt(register char *b, double x) | 
 |  		*b++ = '.'; | 
 |  		for(; decpt < 0; decpt++) | 
 |  			*b++ = '0'; | 
 | -		while((*b++ = *s++)) {} | 
 | +		for(*b = *s++; *b++; *b = *s++) {} | 
 |  		} | 
 |  	else { | 
 | -		while((*b = *s++)) { | 
 | +		for(*b = *s++; *b; *b = *s++) { | 
 |  			b++; | 
 |  			if (--decpt == 0 && *s) | 
 |  				*b++ = '.'; |