@technobuddha/library
Version:
A large library of useful functions
89 lines (88 loc) • 2.56 kB
JavaScript
import { empty } from '../constants';
import { oct, hex, x2, u4, U8 } from '../_escape';
/**
* Escape a string for use in C/C++
*
* @param input The string to escape
* @returns the escaped string
*/
export function escapeC(input) {
const output = [];
for (let i = 0; i < input.length; ++i) {
const u0 = input.codePointAt(i);
const u1 = input.codePointAt(i + 1);
if (u0 < 0x00000020) {
switch (u0) {
case 0x00000000: {
output.push(oct(u1) ? '\\000' : '\\0');
break;
}
case 0x00000007: {
output.push('\\a');
break;
}
case 0x00000008: {
output.push('\\b');
break;
}
case 0x00000009: {
output.push('\\t');
break;
}
case 0x0000000a: {
output.push('\\n');
break;
}
case 0x0000000b: {
output.push('\\v');
break;
}
case 0x0000000c: {
output.push('\\f');
break;
}
case 0x0000000d: {
output.push('\\r');
break;
}
default: output.push(hex(u1) ? u4(u0) : x2(u0));
}
}
else if (u0 < 0x0000007f) {
switch (u0) {
case 0x00000022: {
output.push('\\"');
break;
}
case 0x00000027: {
output.push("\\'");
break;
}
case 0x0000003f: {
output.push('\\?');
break;
}
case 0x0000005c: {
output.push('\\\\');
break;
}
default: output.push(String.fromCharCode(u0));
}
}
else if (u0 < 0x000000a1) {
output.push(hex(u1) ? u4(u0) : x2(u0));
}
else if (u0 < 0x00000100) {
output.push(String.fromCharCode(u0));
}
else if (u0 < 0x00010000) {
output.push(u4(u0));
}
else {
++i;
output.push(U8(u0));
}
}
return output.join(empty);
}
export default escapeC;