mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-28 11:44:05 +08:00
cpphash.c (trad_stringify, [...]): Make some pointers pointers to const.
* cpphash.c (trad_stringify, warn_trad_stringify, collect_params): Make some pointers pointers to const. * cpplex.c (auto_expand_name_space) Guaranteed to always expand by at least one character. (SPELL_CHAR, SPELL_NONE): Temporarily reverse order. (struct token_spelling): Use const U_CHAR * rather than PTR. (expand_name_space): Fix up token pointers if name space is moved when expanding. (INIT_NAME, cpp_scan_line, parse_name, parse_number, parse_string2, save_comment, spell_token, cpp_output_list): Update so the routines handle tokens with a direct pointer to their text, rather than an offset into the token's list's namebuf. (_cpp_lex_line): Rearrange for clarity. * cpplib.c (_cpp_check_directive): Similarly. (do_define): Make SYM a pointer to const. * cpplib.h (struct cpp_name): Replace offset with direct pointer. (CPP_INT, CPP_FLOAT): Spelling type should be SPELL_IDENT. (TOK_OFFSET): Delete. (TOK_NAME): Update. From-SVN: r33901
This commit is contained in:
parent
05ef2698d0
commit
f617b8e222
@ -1,3 +1,26 @@
|
||||
2000-05-15 Neil Booth <NeilB@earthling.net>
|
||||
|
||||
* cpphash.c (trad_stringify, warn_trad_stringify,
|
||||
collect_params): Make some pointers pointers to const.
|
||||
* cpplex.c (auto_expand_name_space) Guaranteed to always
|
||||
expand by at least one character.
|
||||
(SPELL_CHAR, SPELL_NONE): Temporarily reverse order.
|
||||
(struct token_spelling): Use const U_CHAR * rather than PTR.
|
||||
(expand_name_space): Fix up token pointers if name space
|
||||
is moved when expanding.
|
||||
(INIT_NAME, cpp_scan_line, parse_name, parse_number,
|
||||
parse_string2, save_comment, spell_token, cpp_output_list):
|
||||
Update so the routines handle tokens with a direct pointer to
|
||||
their text, rather than an offset into the token's list's namebuf.
|
||||
(_cpp_lex_line): Rearrange for clarity.
|
||||
|
||||
* cpplib.c (_cpp_check_directive): Similarly.
|
||||
(do_define): Make SYM a pointer to const.
|
||||
* cpplib.h (struct cpp_name): Replace offset with direct pointer.
|
||||
(CPP_INT, CPP_FLOAT): Spelling type should be SPELL_IDENT.
|
||||
(TOK_OFFSET): Delete.
|
||||
(TOK_NAME): Update.
|
||||
|
||||
2000-05-14 Geoffrey Keating <geoffk@cygnus.com>
|
||||
|
||||
* config/rs6000/rs6000.h (RETURN_ADDRESS_OFFSET): Correct for
|
||||
|
@ -162,9 +162,10 @@ collect_funlike_expansion PARAMS ((cpp_reader *, cpp_toklist *,
|
||||
static unsigned int collect_params PARAMS ((cpp_reader *, cpp_toklist *,
|
||||
struct arglist *));
|
||||
|
||||
static void warn_trad_stringify PARAMS ((cpp_reader *, U_CHAR *, size_t,
|
||||
static void warn_trad_stringify PARAMS ((cpp_reader *, const U_CHAR *, size_t,
|
||||
unsigned int, const struct arg *));
|
||||
static unsigned int trad_stringify PARAMS ((cpp_reader *, U_CHAR *, size_t,
|
||||
static unsigned int trad_stringify PARAMS ((cpp_reader *, const U_CHAR *,
|
||||
size_t,
|
||||
unsigned int, const struct arg *,
|
||||
struct reflist **,
|
||||
struct reflist **, unsigned int));
|
||||
@ -371,12 +372,12 @@ add_pat (pat, endpat, nchars, argno, raw_before, raw_after, strize, rest)
|
||||
static void
|
||||
warn_trad_stringify (pfile, p, len, argc, argv)
|
||||
cpp_reader *pfile;
|
||||
U_CHAR *p;
|
||||
const U_CHAR *p;
|
||||
size_t len;
|
||||
unsigned int argc;
|
||||
const struct arg *argv;
|
||||
{
|
||||
U_CHAR *limit;
|
||||
const U_CHAR *limit;
|
||||
unsigned int i;
|
||||
|
||||
limit = p + len;
|
||||
@ -406,14 +407,14 @@ warn_trad_stringify (pfile, p, len, argc, argv)
|
||||
static unsigned int
|
||||
trad_stringify (pfile, base, len, argc, argv, pat, endpat, last)
|
||||
cpp_reader *pfile;
|
||||
U_CHAR *base;
|
||||
const U_CHAR *base;
|
||||
size_t len;
|
||||
unsigned int argc;
|
||||
const struct arg *argv;
|
||||
struct reflist **pat, **endpat;
|
||||
unsigned int last;
|
||||
{
|
||||
U_CHAR *p, *limit;
|
||||
const U_CHAR *p, *limit;
|
||||
unsigned int i;
|
||||
|
||||
p = base;
|
||||
@ -548,7 +549,8 @@ collect_funlike_expansion (pfile, list, arglist, replacement)
|
||||
int j, argc;
|
||||
size_t len;
|
||||
const struct arg *argv;
|
||||
U_CHAR *tok, *exp;
|
||||
const U_CHAR *tok;
|
||||
U_CHAR *exp;
|
||||
enum { START = 0, NORM, ARG, STRIZE, PASTE } last_token = START;
|
||||
|
||||
argv = arglist->argv;
|
||||
@ -728,7 +730,8 @@ collect_params (pfile, list, arglist)
|
||||
struct arglist *arglist;
|
||||
{
|
||||
struct arg *argv = 0;
|
||||
U_CHAR *namebuf, *p, *tok;
|
||||
const U_CHAR *tok;
|
||||
U_CHAR *namebuf, *p;
|
||||
unsigned int len, argslen;
|
||||
unsigned int argc, a, i, j;
|
||||
|
||||
|
134
gcc/cpplex.c
134
gcc/cpplex.c
@ -60,7 +60,7 @@ static void pedantic_whitespace PARAMS ((cpp_reader *, U_CHAR *,
|
||||
unsigned int));
|
||||
|
||||
#define auto_expand_name_space(list) \
|
||||
expand_name_space ((list), (list)->name_cap / 2)
|
||||
expand_name_space ((list), 1 + (list)->name_cap / 2)
|
||||
|
||||
#ifdef NEW_LEXER
|
||||
|
||||
@ -85,15 +85,15 @@ void _cpp_lex_line PARAMS ((cpp_reader *, cpp_toklist *));
|
||||
static void _cpp_output_list PARAMS ((cpp_reader *, cpp_toklist *));
|
||||
|
||||
static unsigned char * spell_token PARAMS ((cpp_reader *, cpp_token *,
|
||||
cpp_toklist *, unsigned char *,
|
||||
int));
|
||||
unsigned char *, int));
|
||||
|
||||
typedef unsigned int (* speller) PARAMS ((unsigned char *, cpp_toklist *,
|
||||
cpp_token *));
|
||||
|
||||
/* Macros on a cpp_name. */
|
||||
#define INIT_NAME(list, name) \
|
||||
do {(name).len = 0; (name).offset = (list)->name_used;} while (0)
|
||||
do {(name).len = 0; \
|
||||
(name).text = (list)->namebuf + (list)->name_used;} while (0)
|
||||
|
||||
#define IS_DIRECTIVE(list) (TOK_TYPE (list, 0) == CPP_HASH)
|
||||
#define COLUMN(cur) ((cur) - buffer->line_base)
|
||||
@ -114,32 +114,6 @@ typedef unsigned int (* speller) PARAMS ((unsigned char *, cpp_toklist *,
|
||||
#define IMMED_TOKEN() (!(cur_token->flags & PREV_WHITESPACE))
|
||||
#define PREV_TOKEN_TYPE (cur_token[-1].type)
|
||||
|
||||
/* Order here matters. Those beyond SPELL_NONE store their spelling
|
||||
in the token list, and it's length in the token->val.name.len. */
|
||||
#define SPELL_OPERATOR 0
|
||||
#define SPELL_CHAR 1
|
||||
#define SPELL_NONE 2
|
||||
#define SPELL_IDENT 3
|
||||
#define SPELL_STRING 4
|
||||
|
||||
#define T(e, s) {SPELL_OPERATOR, s},
|
||||
#define I(e, s) {SPELL_IDENT, s},
|
||||
#define S(e, s) {SPELL_STRING, s},
|
||||
#define C(e, s) {SPELL_CHAR, s},
|
||||
#define N(e, s) {SPELL_NONE, s},
|
||||
|
||||
static const struct token_spelling
|
||||
{
|
||||
unsigned char type;
|
||||
PTR speller;
|
||||
} token_spellings [N_TTYPES + 1] = {TTYPE_TABLE {0, 0} };
|
||||
|
||||
#undef T
|
||||
#undef I
|
||||
#undef S
|
||||
#undef C
|
||||
#undef N
|
||||
|
||||
#define PUSH_TOKEN(ttype) cur_token++->type = ttype
|
||||
#define REVISE_TOKEN(ttype) cur_token[-1].type = ttype
|
||||
#define BACKUP_TOKEN(ttype) (--cur_token)->type = ttype
|
||||
@ -153,6 +127,32 @@ static const struct token_spelling
|
||||
|
||||
#endif
|
||||
|
||||
/* Order here matters. Those beyond SPELL_NONE store their spelling
|
||||
in the token list, and it's length in the token->val.name.len. */
|
||||
#define SPELL_OPERATOR 0
|
||||
#define SPELL_CHAR 2 /* FIXME: revert order after transition. */
|
||||
#define SPELL_NONE 1
|
||||
#define SPELL_IDENT 3
|
||||
#define SPELL_STRING 4
|
||||
|
||||
#define T(e, s) {SPELL_OPERATOR, (const U_CHAR *) s},
|
||||
#define I(e, s) {SPELL_IDENT, s},
|
||||
#define S(e, s) {SPELL_STRING, s},
|
||||
#define C(e, s) {SPELL_CHAR, s},
|
||||
#define N(e, s) {SPELL_NONE, s},
|
||||
|
||||
static const struct token_spelling
|
||||
{
|
||||
U_CHAR type;
|
||||
const U_CHAR *spelling;
|
||||
} token_spellings [N_TTYPES + 1] = {TTYPE_TABLE {0, 0} };
|
||||
|
||||
#undef T
|
||||
#undef I
|
||||
#undef S
|
||||
#undef C
|
||||
#undef N
|
||||
|
||||
/* Re-allocates PFILE->token_buffer so it will hold at least N more chars. */
|
||||
|
||||
void
|
||||
@ -525,8 +525,23 @@ expand_name_space (list, len)
|
||||
cpp_toklist *list;
|
||||
unsigned int len;
|
||||
{
|
||||
const U_CHAR *old_namebuf;
|
||||
ptrdiff_t delta;
|
||||
|
||||
old_namebuf = list->namebuf;
|
||||
list->name_cap += len;
|
||||
list->namebuf = (unsigned char *) xrealloc (list->namebuf, list->name_cap);
|
||||
|
||||
/* Fix up token text pointers. */
|
||||
delta = list->namebuf - old_namebuf;
|
||||
if (delta)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < list->tokens_used; i++)
|
||||
if (token_spellings[list->tokens[i].type].type > SPELL_NONE)
|
||||
list->tokens[i].val.name.text += delta;
|
||||
}
|
||||
}
|
||||
|
||||
/* Expand the number of tokens in a list. */
|
||||
@ -632,9 +647,14 @@ _cpp_scan_line (pfile, list)
|
||||
break;
|
||||
|
||||
TOK_LEN (list, i) = len;
|
||||
TOK_OFFSET (list, i) = list->name_used;
|
||||
memcpy (TOK_NAME (list, i), CPP_PWRITTEN (pfile), len);
|
||||
list->name_used += len;
|
||||
if (token_spellings[type].type > SPELL_NONE)
|
||||
{
|
||||
memcpy (list->namebuf + list->name_used, CPP_PWRITTEN (pfile), len);
|
||||
TOK_NAME (list, i) = list->namebuf + list->name_used;
|
||||
list->name_used += len;
|
||||
}
|
||||
else
|
||||
TOK_NAME (list, i) = token_spellings[type].spelling;
|
||||
i++;
|
||||
space_before = 0;
|
||||
}
|
||||
@ -2563,7 +2583,7 @@ parse_name (pfile, list, name)
|
||||
|
||||
out:
|
||||
buffer->cur = cur;
|
||||
name->len = namebuf - (list->namebuf + name->offset);
|
||||
name->len = namebuf - name->text;
|
||||
list->name_used = namebuf - list->namebuf;
|
||||
}
|
||||
|
||||
@ -2613,7 +2633,7 @@ parse_number (pfile, list, name)
|
||||
|
||||
out:
|
||||
buffer->cur = cur;
|
||||
name->len = namebuf - (list->namebuf + name->offset);
|
||||
name->len = namebuf - name->text;
|
||||
list->name_used = namebuf - list->namebuf;
|
||||
}
|
||||
|
||||
@ -2651,8 +2671,6 @@ parse_string2 (pfile, list, name, terminator)
|
||||
null_count++;
|
||||
else if (c == terminator || IS_NEWLINE (c))
|
||||
{
|
||||
unsigned char* name_start = list->namebuf + name->offset;
|
||||
|
||||
/* Needed for trigraph_replace and multiline string warning. */
|
||||
buffer->cur = cur;
|
||||
|
||||
@ -2660,9 +2678,9 @@ parse_string2 (pfile, list, name, terminator)
|
||||
if (CPP_OPTION (pfile, trigraphs)
|
||||
|| CPP_OPTION (pfile, warn_trigraphs))
|
||||
{
|
||||
namebuf = trigraph_replace (pfile, name_start + trigraphed_len,
|
||||
namebuf = trigraph_replace (pfile, name->text + trigraphed_len,
|
||||
namebuf);
|
||||
trigraphed_len = namebuf - 2 - (name_start + trigraphed_len);
|
||||
trigraphed_len = namebuf - 2 - (name->text + trigraphed_len);
|
||||
if (trigraphed_len < 0)
|
||||
trigraphed_len = 0;
|
||||
}
|
||||
@ -2714,7 +2732,7 @@ parse_string2 (pfile, list, name, terminator)
|
||||
/* An odd number of consecutive backslashes represents
|
||||
an escaped terminator. */
|
||||
temp = namebuf - 1;
|
||||
while (temp >= name_start && *temp == '\\')
|
||||
while (temp >= name->text && *temp == '\\')
|
||||
temp--;
|
||||
|
||||
if ((namebuf - temp) & 1)
|
||||
@ -2751,7 +2769,7 @@ parse_string2 (pfile, list, name, terminator)
|
||||
|
||||
out:
|
||||
buffer->cur = cur;
|
||||
name->len = namebuf - (list->namebuf + name->offset);
|
||||
name->len = namebuf - name->text;
|
||||
list->name_used = namebuf - list->namebuf;
|
||||
|
||||
if (null_count > 0)
|
||||
@ -2783,13 +2801,14 @@ save_comment (list, from, len, tok_no, type)
|
||||
if (list->name_used + len > list->name_cap)
|
||||
expand_name_space (list, len);
|
||||
|
||||
buffer = list->namebuf + list->name_used;
|
||||
|
||||
comment = &list->comments[list->comments_used++];
|
||||
comment->type = CPP_COMMENT;
|
||||
comment->aux = tok_no;
|
||||
comment->val.name.len = len;
|
||||
comment->val.name.offset = list->name_used;
|
||||
comment->val.name.text = buffer;
|
||||
|
||||
buffer = list->namebuf + list->name_used;
|
||||
if (type == '*')
|
||||
{
|
||||
*buffer++ = '/';
|
||||
@ -2863,20 +2882,20 @@ _cpp_lex_line (pfile, list)
|
||||
{
|
||||
case '0': case '1': case '2': case '3': case '4':
|
||||
case '5': case '6': case '7': case '8': case '9':
|
||||
/* Prepend an immediately previous CPP_DOT token. */
|
||||
cur--; /* Backup character. */
|
||||
if (PREV_TOKEN_TYPE == CPP_DOT && IMMED_TOKEN ())
|
||||
{
|
||||
/* Prepend an immediately previous CPP_DOT token. */
|
||||
cur_token--;
|
||||
if (list->name_cap == list->name_used)
|
||||
auto_expand_name_space (list);
|
||||
|
||||
cur_token->val.name.len = 1;
|
||||
cur_token->val.name.offset = list->name_used;
|
||||
cur_token->val.name.text = list->namebuf + list->name_used;
|
||||
list->namebuf[list->name_used++] = '.';
|
||||
}
|
||||
else
|
||||
INIT_NAME (list, cur_token->val.name);
|
||||
cur--; /* Backup character. */
|
||||
|
||||
continue_number:
|
||||
buffer->cur = cur;
|
||||
@ -2898,8 +2917,8 @@ _cpp_lex_line (pfile, list)
|
||||
case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
|
||||
case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
|
||||
case 'Y': case 'Z':
|
||||
INIT_NAME (list, cur_token->val.name);
|
||||
cur--; /* Backup character. */
|
||||
INIT_NAME (list, cur_token->val.name);
|
||||
cur_token->type = CPP_NAME; /* Identifier, macro etc. */
|
||||
|
||||
continue_name:
|
||||
@ -2920,7 +2939,7 @@ _cpp_lex_line (pfile, list)
|
||||
/* Do we have a wide string? */
|
||||
if (cur_token[-1].type == CPP_NAME && IMMED_TOKEN ()
|
||||
&& cur_token[-1].val.name.len == 1
|
||||
&& *(list->namebuf + cur_token[-1].val.name.offset) == 'L'
|
||||
&& cur_token[-1].val.name.text[0] == 'L'
|
||||
&& !CPP_TRADITIONAL (pfile))
|
||||
{
|
||||
/* No need for 'L' any more. */
|
||||
@ -3006,9 +3025,10 @@ _cpp_lex_line (pfile, list)
|
||||
cur_token - 1 - list->tokens, c);
|
||||
cur = buffer->cur;
|
||||
|
||||
cur_token -= 2;
|
||||
cur_token--;
|
||||
if (!CPP_OPTION (pfile, traditional))
|
||||
flags = PREV_WHITESPACE;
|
||||
break;
|
||||
}
|
||||
else if (CPP_OPTION (pfile, cplusplus))
|
||||
{
|
||||
@ -3249,6 +3269,7 @@ _cpp_lex_line (pfile, list)
|
||||
/* Fall through */
|
||||
default:
|
||||
cur_token->aux = c;
|
||||
cur_token->val.name.len = 0; /* FIXME: needed for transition only */
|
||||
PUSH_TOKEN (CPP_OTHER);
|
||||
break;
|
||||
}
|
||||
@ -3300,10 +3321,9 @@ _cpp_lex_line (pfile, list)
|
||||
to the character after the last character written. */
|
||||
|
||||
static unsigned char *
|
||||
spell_token (pfile, token, list, buffer, whitespace)
|
||||
spell_token (pfile, token, buffer, whitespace)
|
||||
cpp_reader *pfile; /* Would be nice to be rid of this... */
|
||||
cpp_token *token;
|
||||
cpp_toklist *list; /* FIXME: get rid of this... */
|
||||
unsigned char *buffer;
|
||||
int whitespace;
|
||||
{
|
||||
@ -3323,7 +3343,7 @@ spell_token (pfile, token, list, buffer, whitespace)
|
||||
if (token->flags & DIGRAPH)
|
||||
spelling = digraph_spellings[token->type - CPP_FIRST_DIGRAPH];
|
||||
else
|
||||
spelling = token_spellings[token->type].speller;
|
||||
spelling = token_spellings[token->type].spelling;
|
||||
|
||||
while ((c = *spelling++) != '\0')
|
||||
*buffer++ = c;
|
||||
@ -3331,8 +3351,7 @@ spell_token (pfile, token, list, buffer, whitespace)
|
||||
break;
|
||||
|
||||
case SPELL_IDENT:
|
||||
memcpy (buffer, list->namebuf + token->val.name.offset,
|
||||
token->val.name.len);
|
||||
memcpy (buffer, token->val.name.text, token->val.name.len);
|
||||
buffer += token->val.name.len;
|
||||
break;
|
||||
|
||||
@ -3346,8 +3365,7 @@ spell_token (pfile, token, list, buffer, whitespace)
|
||||
if (token->type == CPP_STRING || token->type == CPP_WSTRING)
|
||||
c = '"';
|
||||
*buffer++ = c;
|
||||
memcpy (buffer, list->namebuf + token->val.name.offset,
|
||||
token->val.name.len);
|
||||
memcpy (buffer, token->val.name.text, token->val.name.len);
|
||||
buffer += token->val.name.len;
|
||||
*buffer++ = c;
|
||||
}
|
||||
@ -3420,7 +3438,7 @@ _cpp_output_list (pfile, list)
|
||||
{
|
||||
/* Make space for the comment, and copy it out. */
|
||||
CPP_RESERVE (pfile, TOKEN_LEN (comment));
|
||||
pfile->limit = spell_token (pfile, comment, list, pfile->limit, 0);
|
||||
pfile->limit = spell_token (pfile, comment, pfile->limit, 0);
|
||||
|
||||
/* Stop if no comments left, or no more comments appear
|
||||
before the current token. */
|
||||
@ -3431,7 +3449,7 @@ _cpp_output_list (pfile, list)
|
||||
}
|
||||
|
||||
CPP_RESERVE (pfile, TOKEN_LEN (token));
|
||||
pfile->limit = spell_token (pfile, token, list, pfile->limit, 1);
|
||||
pfile->limit = spell_token (pfile, token, pfile->limit, 1);
|
||||
}
|
||||
while (token++->type != CPP_VSPACE);
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ _cpp_check_directive (list, token)
|
||||
cpp_toklist *list;
|
||||
cpp_token *token;
|
||||
{
|
||||
const U_CHAR *name = list->namebuf + token->val.name.offset;
|
||||
const U_CHAR *name = token->val.name.text;
|
||||
size_t len = token->val.name.len;
|
||||
unsigned int i;
|
||||
|
||||
@ -339,7 +339,7 @@ do_define (pfile)
|
||||
{
|
||||
HASHNODE *node;
|
||||
int len;
|
||||
U_CHAR *sym;
|
||||
const U_CHAR *sym;
|
||||
cpp_toklist *list = &pfile->directbuf;
|
||||
|
||||
pfile->no_macro_expand++;
|
||||
|
@ -110,8 +110,8 @@ typedef struct cpp_name cpp_name;
|
||||
C(CPP_OTHER, 0) /* stray punctuation */ \
|
||||
\
|
||||
I(CPP_NAME, 0) /* word */ \
|
||||
N(CPP_INT, 0) /* 23 */ \
|
||||
N(CPP_FLOAT, 0) /* 3.14159 */ \
|
||||
I(CPP_INT, 0) /* 23 */ \
|
||||
I(CPP_FLOAT, 0) /* 3.14159 */ \
|
||||
I(CPP_NUMBER, 0) /* 34_be+ta */ \
|
||||
S(CPP_CHAR, 0) /* 'char' */ \
|
||||
S(CPP_WCHAR, 0) /* L'char' */ \
|
||||
@ -151,7 +151,7 @@ enum cpp_ttype
|
||||
struct cpp_name
|
||||
{
|
||||
unsigned int len;
|
||||
unsigned int offset; /* from list->namebuf */
|
||||
const unsigned char *text;
|
||||
};
|
||||
|
||||
/* Accessor macros for token lists - all expect you have a
|
||||
@ -162,8 +162,7 @@ struct cpp_name
|
||||
#define TOK_AUX(l_, i_) ((l_)->tokens[i_].aux)
|
||||
#define TOK_COL(l_, i_) ((l_)->tokens[i_].col)
|
||||
#define TOK_INT(l_, i_) ((l_)->tokens[i_].val.integer)
|
||||
#define TOK_OFFSET(l_, i_) ((l_)->tokens[i_].val.name.offset)
|
||||
#define TOK_NAME(l_, i_) ((l_)->tokens[i_].val.name.offset + (l_)->namebuf)
|
||||
#define TOK_NAME(l_, i_) ((l_)->tokens[i_].val.name.text)
|
||||
#define TOK_LEN(l_, i_) ((l_)->tokens[i_].val.name.len)
|
||||
|
||||
#define TOK_PREV_WHITE(l_, i_) (TOK_FLAGS(l_, i_) & PREV_WHITESPACE)
|
||||
|
Loading…
Reference in New Issue
Block a user