2004-11-01 09:30:43 +03:00
|
|
|
/* Copyright (c) 1992, 1999, 2001, 2002, 2003 John E. Davis
|
2002-10-07 08:41:03 +04:00
|
|
|
* This file is part of the S-Lang library.
|
|
|
|
*
|
|
|
|
* Trimmed down for use in GNU Midnight Commander.
|
|
|
|
*
|
|
|
|
* You may distribute under the terms of either the GNU General Public
|
|
|
|
* License or the Perl Artistic License.
|
|
|
|
*/
|
2004-11-01 09:30:43 +03:00
|
|
|
#define _GNU_SOURCE
|
2002-10-07 08:41:03 +04:00
|
|
|
#include "slinclud.h"
|
|
|
|
|
|
|
|
#include "slang.h"
|
|
|
|
#include "_slang.h"
|
2004-11-29 14:11:47 +03:00
|
|
|
const int SLang_Version = SLANG_VERSION;
|
2004-11-08 19:47:29 +03:00
|
|
|
|
2002-10-07 08:41:03 +04:00
|
|
|
/* p and ch may point to the same buffer */
|
|
|
|
char *_SLexpand_escaped_char(char *p, char *ch)
|
|
|
|
{
|
|
|
|
int i = 0;
|
|
|
|
int max = 0, num, base = 0;
|
|
|
|
char ch1;
|
|
|
|
|
|
|
|
ch1 = *p++;
|
|
|
|
|
|
|
|
switch (ch1)
|
|
|
|
{
|
|
|
|
default: num = ch1; break;
|
|
|
|
case 'n': num = '\n'; break;
|
|
|
|
case 't': num = '\t'; break;
|
|
|
|
case 'v': num = '\v'; break;
|
|
|
|
case 'b': num = '\b'; break;
|
|
|
|
case 'r': num = '\r'; break;
|
|
|
|
case 'f': num = '\f'; break;
|
|
|
|
case 'E': case 'e': num = 27; break;
|
|
|
|
case 'a': num = 7;
|
|
|
|
break;
|
|
|
|
|
|
|
|
/* octal */
|
|
|
|
case '0': case '1': case '2': case '3':
|
|
|
|
case '4': case '5': case '6': case '7':
|
|
|
|
max = '7';
|
|
|
|
base = 8; i = 2; num = ch1 - '0';
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'd': /* decimal -- S-Lang extension */
|
|
|
|
base = 10;
|
|
|
|
i = 3;
|
|
|
|
max = '9';
|
|
|
|
num = 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'x': /* hex */
|
|
|
|
base = 16;
|
|
|
|
max = '9';
|
|
|
|
i = 2;
|
|
|
|
num = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
while (i--)
|
|
|
|
{
|
|
|
|
ch1 = *p;
|
|
|
|
|
|
|
|
if ((ch1 <= max) && (ch1 >= '0'))
|
|
|
|
{
|
|
|
|
num = base * num + (ch1 - '0');
|
|
|
|
}
|
|
|
|
else if (base == 16)
|
|
|
|
{
|
|
|
|
ch1 |= 0x20;
|
|
|
|
if ((ch1 < 'a') || ((ch1 > 'f'))) break;
|
|
|
|
num = base * num + 10 + (ch1 - 'a');
|
|
|
|
}
|
|
|
|
else break;
|
|
|
|
p++;
|
|
|
|
}
|
|
|
|
|
|
|
|
*ch = (char) num;
|
|
|
|
return p;
|
|
|
|
}
|