|  | @@ -342,6 +342,7 @@ create_config_file(const struct mg_context *ctx, const char *path)
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  static unsigned
 | 
	
		
			
				|  |  |  hex2dec(char x)
 | 
	
		
			
				|  |  |  {
 | 
	
	
		
			
				|  | @@ -409,6 +410,27 @@ sdupesc(const char *str)
 | 
	
		
			
				|  |  |  				d[0] = '\t';
 | 
	
		
			
				|  |  |  				memmove(d + 1, d + 2, strlen(d + 1));
 | 
	
		
			
				|  |  |  				break;
 | 
	
		
			
				|  |  | +			case 'u':
 | 
	
		
			
				|  |  | +				if (isxdigit(d[2]) && isxdigit(d[3]) && isxdigit(d[4])
 | 
	
		
			
				|  |  | +				    && isxdigit(d[5])) {
 | 
	
		
			
				|  |  | +					unsigned short u = (unsigned short)(hex2dec(d[2]) * 4096
 | 
	
		
			
				|  |  | +					                                    + hex2dec(d[3]) * 256
 | 
	
		
			
				|  |  | +					                                    + hex2dec(d[4]) * 16
 | 
	
		
			
				|  |  | +					                                    + hex2dec(d[5]));
 | 
	
		
			
				|  |  | +					char mbc[16];
 | 
	
		
			
				|  |  | +					int mbl = wctomb(mbc, (wchar_t)u);
 | 
	
		
			
				|  |  | +					if ((mbl > 0) && (mbl < 6)) {
 | 
	
		
			
				|  |  | +						memcpy(d, mbc, mbl);
 | 
	
		
			
				|  |  | +						memmove(d + mbl, d + 6, strlen(d + 5));
 | 
	
		
			
				|  |  | +					} else {
 | 
	
		
			
				|  |  | +						/* Invalid multi byte character */
 | 
	
		
			
				|  |  | +						/* TODO: define what to do */
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				} else {
 | 
	
		
			
				|  |  | +					/* Invalid esc sequence */
 | 
	
		
			
				|  |  | +					/* TODO: define what to do */
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				break;
 | 
	
		
			
				|  |  |  			case 'v':
 | 
	
		
			
				|  |  |  				d[0] = '\v';
 | 
	
		
			
				|  |  |  				memmove(d + 1, d + 2, strlen(d + 1));
 | 
	
	
		
			
				|  | @@ -551,9 +573,12 @@ set_option(char **options, const char *name, const char *value)
 | 
	
		
			
				|  |  |  		die("Too many options specified");
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	if (options[2 * i] == NULL || options[2 * i + 1] == NULL) {
 | 
	
		
			
				|  |  | +	if (options[2 * i] == NULL) {
 | 
	
		
			
				|  |  |  		die("Out of memory");
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +	if (options[2 * i + 1] == NULL) {
 | 
	
		
			
				|  |  | +		die("Illegal escape sequence, or out of memory");
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	/* option set correctly */
 | 
	
		
			
				|  |  |  	return 1;
 |