public static byte[] create_string_for_read( byte[] src,
bool symbolp )
{
int len= src.Length;
int w= 0;
for ( int i= 0 ; i < len ; ++i )
{
byte cn= src[i];
switch (cn)
{
case (byte)'\n':
case (byte)'\t':
case (byte)'\b':
case (byte)'\r':
case (byte)'\f':
case (byte)11:
case (byte)'"':
case (byte)'\\':
w+= 2;
break;
case (byte)'|':
w+= (symbolp ? 2 : 1);
break;
default:
w+= (((32 <= cn) && (cn <= 126)) ? 1 : 4);
break;
}
}
byte[] res= new byte[w];
w= 0;
for ( int i= 0 ; i < len ; ++i )
{
byte cn= src[i];
switch (cn)
{
case (byte)'\n':
res[w++]= (byte)'\\';
res[w++]= (byte)'n';
break;
case (byte)'\t':
res[w++]= (byte)'\\';
res[w++]= (byte)'t';
break;
case (byte)'\b':
res[w++]= (byte)'\\';
res[w++]= (byte)'b';
break;
case (byte)'\r':
res[w++]= (byte)'\\';
res[w++]= (byte)'r';
break;
case (byte)'\f':
res[w++]= (byte)'\\';
res[w++]= (byte)'f';
break;
case (byte)11:
res[w++]= (byte)'\\';
res[w++]= (byte)'v';
break;
case (byte)'"':
case (byte)'\\':
res[w++]= (byte)'\\';
res[w++]= cn;
break;
case (byte)'|':
if (symbolp)
res[w++]= (byte)'\\';
res[w++] = (byte)'|';
break;
default:
if ((32 <= cn) && (cn <= 126))
res[w++]= cn;
else
{
int icn= cn & 0xFF;
res[w++]= (byte)'\\';
res[w++]= (byte)('0' + ((icn >> 6) & 0x7));
res[w++]= (byte)('0' + ((icn >> 3) & 0x7));
res[w++]= (byte)('0' + (icn & 0x7));
}
break;
}
}
return res;
}