mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-01-31 05:00:35 +00:00
full \ handling in strings (including \e for escape (why C doesn't have that
is beyond me))
This commit is contained in:
parent
340e104778
commit
aa825853bf
1 changed files with 64 additions and 6 deletions
|
@ -158,6 +158,7 @@ PR_LexString (void)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
int len;
|
int len;
|
||||||
|
int i;
|
||||||
|
|
||||||
len = 0;
|
len = 0;
|
||||||
pr_file_p++;
|
pr_file_p++;
|
||||||
|
@ -171,12 +172,69 @@ PR_LexString (void)
|
||||||
c = *pr_file_p++;
|
c = *pr_file_p++;
|
||||||
if (!c)
|
if (!c)
|
||||||
PR_ParseError ("EOF inside quote");
|
PR_ParseError ("EOF inside quote");
|
||||||
if (c == 'n')
|
switch (c) {
|
||||||
c = '\n';
|
case 'n':
|
||||||
else if (c == '"')
|
c = '\n';
|
||||||
c = '"';
|
break;
|
||||||
else
|
case '"':
|
||||||
PR_ParseError ("Unknown escape char");
|
c = '\"';
|
||||||
|
break;
|
||||||
|
case '0':
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
for (i = c = 0; i < 3
|
||||||
|
&& *pr_file_p >= '0'
|
||||||
|
&& *pr_file_p <='7'; i++, pr_file_p++) {
|
||||||
|
c *= 8;
|
||||||
|
c += *pr_file_p - '0';
|
||||||
|
}
|
||||||
|
if (!*pr_file_p)
|
||||||
|
PR_ParseError ("EOF inside quote");
|
||||||
|
break;
|
||||||
|
case 'x':
|
||||||
|
c = 0;
|
||||||
|
while (*pr_file_p && isxdigit (*pr_file_p)) {
|
||||||
|
c *= 16;
|
||||||
|
if (*pr_file_p <= 9)
|
||||||
|
c += *pr_file_p - '0';
|
||||||
|
else if (*pr_file_p <= 'F')
|
||||||
|
c += *pr_file_p - 'A';
|
||||||
|
else
|
||||||
|
c += *pr_file_p - 'a';
|
||||||
|
}
|
||||||
|
if (!*pr_file_p)
|
||||||
|
PR_ParseError ("EOF inside quote");
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
c = '\a';
|
||||||
|
break;
|
||||||
|
case 'b':
|
||||||
|
c = '\b';
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
c = '\033';
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
c = '\f';
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
c = '\r';
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
c = '\t';
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
c = '\v';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PR_ParseError ("Unknown escape char");
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else if (c == '\"') {
|
} else if (c == '\"') {
|
||||||
pr_token[len] = 0;
|
pr_token[len] = 0;
|
||||||
pr_token_type = tt_immediate;
|
pr_token_type = tt_immediate;
|
||||||
|
|
Loading…
Reference in a new issue