|  | @@ -36,6 +36,8 @@
 | 
	
		
			
				|  |  |  #include <stdio.h>
 | 
	
		
			
				|  |  |  #include <string.h>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#include <grpc/support/string.h>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  static int round_up(int x, int divisor) {
 | 
	
		
			
				|  |  |    return (x / divisor + (x % divisor != 0)) * divisor;
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -53,15 +55,21 @@ static int round_up_to_three_sig_figs(int x) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /* encode our minimum viable timeout value */
 | 
	
		
			
				|  |  | -static void enc_tiny(char *buffer) { strcpy(buffer, "1n"); }
 | 
	
		
			
				|  |  | +static void enc_tiny(char *buffer) { memcpy(buffer, "1n", 3); }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static void enc_ext(char *buffer, long value, char ext) {
 | 
	
		
			
				|  |  | +  int n = gpr_ltoa(value, buffer);
 | 
	
		
			
				|  |  | +  buffer[n] = ext;
 | 
	
		
			
				|  |  | +  buffer[n+1] = 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void enc_seconds(char *buffer, long sec) {
 | 
	
		
			
				|  |  |    if (sec % 3600 == 0) {
 | 
	
		
			
				|  |  | -    sprintf(buffer, "%ldH", sec / 3600);
 | 
	
		
			
				|  |  | +    enc_ext(buffer, sec / 3600, 'H');
 | 
	
		
			
				|  |  |    } else if (sec % 60 == 0) {
 | 
	
		
			
				|  |  | -    sprintf(buffer, "%ldM", sec / 60);
 | 
	
		
			
				|  |  | +    enc_ext(buffer, sec / 60, 'M');
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  | -    sprintf(buffer, "%ldS", sec);
 | 
	
		
			
				|  |  | +    enc_ext(buffer, sec, 'S');
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -69,23 +77,23 @@ static void enc_nanos(char *buffer, int x) {
 | 
	
		
			
				|  |  |    x = round_up_to_three_sig_figs(x);
 | 
	
		
			
				|  |  |    if (x < 100000) {
 | 
	
		
			
				|  |  |      if (x % 1000 == 0) {
 | 
	
		
			
				|  |  | -      sprintf(buffer, "%du", x / 1000);
 | 
	
		
			
				|  |  | +      enc_ext(buffer, x / 1000, 'u');
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  | -      sprintf(buffer, "%dn", x);
 | 
	
		
			
				|  |  | +      enc_ext(buffer, x, 'n');
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    } else if (x < 100000000) {
 | 
	
		
			
				|  |  |      if (x % 1000000 == 0) {
 | 
	
		
			
				|  |  | -      sprintf(buffer, "%dm", x / 1000000);
 | 
	
		
			
				|  |  | +      enc_ext(buffer, x / 1000000, 'm');
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  | -      sprintf(buffer, "%du", x / 1000);
 | 
	
		
			
				|  |  | +      enc_ext(buffer, x / 1000, 'u');
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    } else if (x < 1000000000) {
 | 
	
		
			
				|  |  | -    sprintf(buffer, "%dm", x / 1000000);
 | 
	
		
			
				|  |  | +    enc_ext(buffer, x / 1000000, 'm');
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  |      /* note that this is only ever called with times of less than one second,
 | 
	
		
			
				|  |  |         so if we reach here the time must have been rounded up to a whole second
 | 
	
		
			
				|  |  |         (and no more) */
 | 
	
		
			
				|  |  | -    strcpy(buffer, "1S");
 | 
	
		
			
				|  |  | +    memcpy(buffer, "1S", 3);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -93,18 +101,18 @@ static void enc_micros(char *buffer, int x) {
 | 
	
		
			
				|  |  |    x = round_up_to_three_sig_figs(x);
 | 
	
		
			
				|  |  |    if (x < 100000) {
 | 
	
		
			
				|  |  |      if (x % 1000 == 0) {
 | 
	
		
			
				|  |  | -      sprintf(buffer, "%dm", x / 1000);
 | 
	
		
			
				|  |  | +      enc_ext(buffer, x / 1000, 'm');
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  | -      sprintf(buffer, "%du", x);
 | 
	
		
			
				|  |  | +      enc_ext(buffer, x, 'u');
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    } else if (x < 100000000) {
 | 
	
		
			
				|  |  |      if (x % 1000000 == 0) {
 | 
	
		
			
				|  |  | -      sprintf(buffer, "%dS", x / 1000000);
 | 
	
		
			
				|  |  | +      enc_ext(buffer, x / 1000000, 'S');
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  | -      sprintf(buffer, "%dm", x / 1000);
 | 
	
		
			
				|  |  | +      enc_ext(buffer, x / 1000, 'm');
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  | -    sprintf(buffer, "%dS", x / 1000000);
 | 
	
		
			
				|  |  | +    enc_ext(buffer, x / 1000000, 'S');
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |