state = ‘CHAR’;
break;
}
break;
case ‘HEX1’:
state = ‘CHAR’;
if (charCode(‘0’) <= c && c <= charCode(‘9’)) {
m = c – charCode(‘0’);
} else if (charCode(‘a’) <= c && c <= charCode(‘f’)) {
m = c – charCode(‘a’) + 10;
} else if (charCode(‘A’) <= c && c <= charCode(‘F’)) {
m = c – charCode(‘A’) + 10;
} else {
out[outIndex++] = charCode(‘%’);
out[outIndex++] = hexchar;
out[outIndex++] = c;
break;
}
out[outIndex++] = 16 * n + m;
break;
}
}
// TODO support returning arbitrary buffers.
return out.slice(0, outIndex – 1);
};









