mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-05-31 01:45:52 +08:00
all remaining *.c *.h files from hp merge.
This commit is contained in:
405
gdb/utils.c
405
gdb/utils.c
@ -53,9 +53,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Prototypes for local functions */
|
||||
|
||||
static void vfprintf_maybe_filtered PARAMS ((FILE *, const char *, va_list, int));
|
||||
static void vfprintf_maybe_filtered PARAMS ((GDB_FILE *, const char *,
|
||||
va_list, int));
|
||||
|
||||
static void fputs_maybe_filtered PARAMS ((const char *, FILE *, int));
|
||||
static void fputs_maybe_filtered PARAMS ((const char *, GDB_FILE *, int));
|
||||
|
||||
#if defined (USE_MMALLOC) && !defined (NO_MMCHECK)
|
||||
static void malloc_botch PARAMS ((void));
|
||||
@ -70,12 +71,19 @@ prompt_for_continue PARAMS ((void));
|
||||
static void
|
||||
set_width_command PARAMS ((char *, int, struct cmd_list_element *));
|
||||
|
||||
static void
|
||||
set_width PARAMS ((void));
|
||||
|
||||
/* If this definition isn't overridden by the header files, assume
|
||||
that isatty and fileno exist on this system. */
|
||||
#ifndef ISATTY
|
||||
#define ISATTY(FP) (isatty (fileno (FP)))
|
||||
#endif
|
||||
|
||||
#ifndef GDB_FILE_ISATTY
|
||||
#define GDB_FILE_ISATTY(GDB_FILE_PTR) (gdb_file_isatty(GDB_FILE_PTR))
|
||||
#endif
|
||||
|
||||
/* Chain of cleanup actions established with make_cleanup,
|
||||
to be executed if an error happens. */
|
||||
|
||||
@ -132,6 +140,9 @@ char *quit_pre_print;
|
||||
/* String to be printed before warning messages, if any. */
|
||||
|
||||
char *warning_pre_print = "\nwarning: ";
|
||||
|
||||
int pagination_enabled = 1;
|
||||
|
||||
|
||||
/* Add a new cleanup to the cleanup_chain,
|
||||
and return the previous chain pointer
|
||||
@ -969,10 +980,16 @@ mstrsave (md, ptr)
|
||||
void
|
||||
print_spaces (n, file)
|
||||
register int n;
|
||||
register FILE *file;
|
||||
register GDB_FILE *file;
|
||||
{
|
||||
while (n-- > 0)
|
||||
fputc (' ', file);
|
||||
if (file->ts_streamtype == astring) {
|
||||
gdb_file_adjust_strbuf (n, file);
|
||||
while (n-- > 0)
|
||||
strcat(file->ts_strbuf, ' ');
|
||||
} else {
|
||||
while (n-- > 0)
|
||||
fputc (' ', file->ts_filestream);
|
||||
}
|
||||
}
|
||||
|
||||
/* Print a host address. */
|
||||
@ -1052,21 +1069,43 @@ query (va_alist)
|
||||
fputs_unfiltered ("\n", gdb_stdout);
|
||||
#endif /* MPW */
|
||||
|
||||
wrap_here("");
|
||||
gdb_flush (gdb_stdout);
|
||||
answer = fgetc (stdin);
|
||||
|
||||
#if defined(TUI)
|
||||
if (!tui_version || cmdWin == tuiWinWithFocus())
|
||||
#endif
|
||||
answer = fgetc (stdin);
|
||||
#if defined(TUI)
|
||||
else
|
||||
|
||||
answer = (unsigned char)tuiBufferGetc();
|
||||
|
||||
#endif
|
||||
clearerr (stdin); /* in case of C-d */
|
||||
if (answer == EOF) /* C-d */
|
||||
{
|
||||
retval = 1;
|
||||
break;
|
||||
}
|
||||
if (answer != '\n') /* Eat rest of input line, to EOF or newline */
|
||||
/* Eat rest of input line, to EOF or newline */
|
||||
if ((answer != '\n') || (tui_version && answer != '\r'))
|
||||
do
|
||||
{
|
||||
ans2 = fgetc (stdin);
|
||||
#if defined(TUI)
|
||||
if (!tui_version || cmdWin == tuiWinWithFocus())
|
||||
#endif
|
||||
ans2 = fgetc (stdin);
|
||||
#if defined(TUI)
|
||||
else
|
||||
|
||||
ans2 = (unsigned char)tuiBufferGetc();
|
||||
#endif
|
||||
clearerr (stdin);
|
||||
}
|
||||
while (ans2 != EOF && ans2 != '\n');
|
||||
while (ans2 != EOF && ans2 != '\n' && ans2 != '\r');
|
||||
TUIDO(((TuiOpaqueFuncPtr)tui_vStartNewLines, 1));
|
||||
|
||||
if (answer >= 'a')
|
||||
answer -= 040;
|
||||
if (answer == 'Y')
|
||||
@ -1178,7 +1217,7 @@ parse_escape (string_ptr)
|
||||
void
|
||||
gdb_printchar (c, stream, quoter)
|
||||
register int c;
|
||||
FILE *stream;
|
||||
GDB_FILE *stream;
|
||||
int quoter;
|
||||
{
|
||||
|
||||
@ -1283,13 +1322,87 @@ static char *wrap_indent;
|
||||
is not in effect. */
|
||||
static int wrap_column;
|
||||
|
||||
/* ARGSUSED */
|
||||
static void
|
||||
set_width_command (args, from_tty, c)
|
||||
char *args;
|
||||
int from_tty;
|
||||
struct cmd_list_element *c;
|
||||
|
||||
/* Inialize the lines and chars per page */
|
||||
void
|
||||
init_page_info()
|
||||
{
|
||||
#if defined(TUI)
|
||||
if (tui_version && m_winPtrNotNull(cmdWin))
|
||||
{
|
||||
lines_per_page = cmdWin->generic.height;
|
||||
chars_per_line = cmdWin->generic.width;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
/* These defaults will be used if we are unable to get the correct
|
||||
values from termcap. */
|
||||
#if defined(__GO32__)
|
||||
lines_per_page = ScreenRows();
|
||||
chars_per_line = ScreenCols();
|
||||
#else
|
||||
lines_per_page = 24;
|
||||
chars_per_line = 80;
|
||||
|
||||
#if !defined (MPW) && !defined (_WIN32)
|
||||
/* No termcap under MPW, although might be cool to do something
|
||||
by looking at worksheet or console window sizes. */
|
||||
/* Initialize the screen height and width from termcap. */
|
||||
{
|
||||
char *termtype = getenv ("TERM");
|
||||
|
||||
/* Positive means success, nonpositive means failure. */
|
||||
int status;
|
||||
|
||||
/* 2048 is large enough for all known terminals, according to the
|
||||
GNU termcap manual. */
|
||||
char term_buffer[2048];
|
||||
|
||||
if (termtype)
|
||||
{
|
||||
status = tgetent (term_buffer, termtype);
|
||||
if (status > 0)
|
||||
{
|
||||
int val;
|
||||
|
||||
val = tgetnum ("li");
|
||||
if (val >= 0)
|
||||
lines_per_page = val;
|
||||
else
|
||||
/* The number of lines per page is not mentioned
|
||||
in the terminal description. This probably means
|
||||
that paging is not useful (e.g. emacs shell window),
|
||||
so disable paging. */
|
||||
lines_per_page = UINT_MAX;
|
||||
|
||||
val = tgetnum ("co");
|
||||
if (val >= 0)
|
||||
chars_per_line = val;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* MPW */
|
||||
|
||||
#if defined(SIGWINCH) && defined(SIGWINCH_HANDLER)
|
||||
|
||||
/* If there is a better way to determine the window size, use it. */
|
||||
SIGWINCH_HANDLER (SIGWINCH);
|
||||
#endif
|
||||
#endif
|
||||
/* If the output is not a terminal, don't paginate it. */
|
||||
if (!GDB_FILE_ISATTY (gdb_stdout))
|
||||
lines_per_page = UINT_MAX;
|
||||
} /* the command_line_version */
|
||||
set_width();
|
||||
}
|
||||
|
||||
static void
|
||||
set_width()
|
||||
{
|
||||
if (chars_per_line == 0)
|
||||
init_page_info();
|
||||
|
||||
if (!wrap_buffer)
|
||||
{
|
||||
wrap_buffer = (char *) xmalloc (chars_per_line + 2);
|
||||
@ -1297,7 +1410,17 @@ set_width_command (args, from_tty, c)
|
||||
}
|
||||
else
|
||||
wrap_buffer = (char *) xrealloc (wrap_buffer, chars_per_line + 2);
|
||||
wrap_pointer = wrap_buffer; /* Start it at the beginning */
|
||||
wrap_pointer = wrap_buffer; /* Start it at the beginning */
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
static void
|
||||
set_width_command (args, from_tty, c)
|
||||
char *args;
|
||||
int from_tty;
|
||||
struct cmd_list_element *c;
|
||||
{
|
||||
set_width ();
|
||||
}
|
||||
|
||||
/* Wait, so the user can read what's on the screen. Prompt the user
|
||||
@ -1436,18 +1559,100 @@ begin_line ()
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
gdb_file_isatty (stream)
|
||||
GDB_FILE *stream;
|
||||
{
|
||||
|
||||
if (stream->ts_streamtype == afile)
|
||||
return (isatty(fileno(stream->ts_filestream)));
|
||||
else return 0;
|
||||
}
|
||||
|
||||
GDB_FILE *
|
||||
gdb_file_init_astring (n)
|
||||
int n;
|
||||
{
|
||||
GDB_FILE *tmpstream;
|
||||
|
||||
tmpstream = xmalloc (sizeof(GDB_FILE));
|
||||
tmpstream->ts_streamtype = astring;
|
||||
tmpstream->ts_filestream = NULL;
|
||||
if (n > 0)
|
||||
{
|
||||
tmpstream->ts_strbuf = xmalloc ((n + 1)*sizeof(char));
|
||||
tmpstream->ts_strbuf[0] = '\0';
|
||||
}
|
||||
else
|
||||
tmpstream->ts_strbuf = NULL;
|
||||
tmpstream->ts_buflen = n;
|
||||
|
||||
return tmpstream;
|
||||
}
|
||||
|
||||
void
|
||||
gdb_file_deallocate (streamptr)
|
||||
GDB_FILE **streamptr;
|
||||
{
|
||||
GDB_FILE *tmpstream;
|
||||
|
||||
tmpstream = *streamptr;
|
||||
if ((tmpstream->ts_streamtype == astring) &&
|
||||
(tmpstream->ts_strbuf != NULL))
|
||||
{
|
||||
free (tmpstream->ts_strbuf);
|
||||
}
|
||||
|
||||
free (tmpstream);
|
||||
*streamptr = NULL;
|
||||
}
|
||||
|
||||
char *
|
||||
gdb_file_get_strbuf (stream)
|
||||
GDB_FILE *stream;
|
||||
{
|
||||
return (stream->ts_strbuf);
|
||||
}
|
||||
|
||||
/* adjust the length of the buffer by the amount necessary
|
||||
to accomodate appending a string of length N to the buffer contents */
|
||||
void
|
||||
gdb_file_adjust_strbuf (n, stream)
|
||||
int n;
|
||||
GDB_FILE *stream;
|
||||
{
|
||||
int non_null_chars;
|
||||
|
||||
non_null_chars = strlen(stream->ts_strbuf);
|
||||
|
||||
if (n > (stream->ts_buflen - non_null_chars - 1))
|
||||
{
|
||||
stream->ts_buflen = n + non_null_chars + 1;
|
||||
stream->ts_strbuf = xrealloc (stream->ts_strbuf, stream->ts_buflen);
|
||||
}
|
||||
}
|
||||
|
||||
GDB_FILE *
|
||||
gdb_fopen (name, mode)
|
||||
char * name;
|
||||
char * mode;
|
||||
{
|
||||
return fopen (name, mode);
|
||||
int gdb_file_size;
|
||||
GDB_FILE *tmp;
|
||||
|
||||
gdb_file_size = sizeof(GDB_FILE);
|
||||
tmp = (GDB_FILE *) xmalloc (gdb_file_size);
|
||||
tmp->ts_streamtype = afile;
|
||||
tmp->ts_filestream = fopen (name, mode);
|
||||
tmp->ts_strbuf = NULL;
|
||||
tmp->ts_buflen = 0;
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
void
|
||||
gdb_flush (stream)
|
||||
FILE *stream;
|
||||
GDB_FILE *stream;
|
||||
{
|
||||
if (flush_hook
|
||||
&& (stream == gdb_stdout
|
||||
@ -1457,7 +1662,18 @@ gdb_flush (stream)
|
||||
return;
|
||||
}
|
||||
|
||||
fflush (stream);
|
||||
fflush (stream->ts_filestream);
|
||||
}
|
||||
|
||||
void
|
||||
gdb_fclose(streamptr)
|
||||
GDB_FILE **streamptr;
|
||||
{
|
||||
GDB_FILE *tmpstream;
|
||||
|
||||
tmpstream = *streamptr;
|
||||
fclose (tmpstream->ts_filestream);
|
||||
gdb_file_deallocate (streamptr);
|
||||
}
|
||||
|
||||
/* Like fputs but if FILTER is true, pause after every screenful.
|
||||
@ -1476,7 +1692,7 @@ gdb_flush (stream)
|
||||
static void
|
||||
fputs_maybe_filtered (linebuffer, stream, filter)
|
||||
const char *linebuffer;
|
||||
FILE *stream;
|
||||
GDB_FILE *stream;
|
||||
int filter;
|
||||
{
|
||||
const char *lineptr;
|
||||
@ -1580,7 +1796,7 @@ fputs_maybe_filtered (linebuffer, stream, filter)
|
||||
void
|
||||
fputs_filtered (linebuffer, stream)
|
||||
const char *linebuffer;
|
||||
FILE *stream;
|
||||
GDB_FILE *stream;
|
||||
{
|
||||
fputs_maybe_filtered (linebuffer, stream, 1);
|
||||
}
|
||||
@ -1600,7 +1816,7 @@ putchar_unfiltered (c)
|
||||
int
|
||||
fputc_unfiltered (c, stream)
|
||||
int c;
|
||||
FILE * stream;
|
||||
GDB_FILE * stream;
|
||||
{
|
||||
char buf[2];
|
||||
|
||||
@ -1613,7 +1829,7 @@ fputc_unfiltered (c, stream)
|
||||
int
|
||||
fputc_filtered (c, stream)
|
||||
int c;
|
||||
FILE * stream;
|
||||
GDB_FILE * stream;
|
||||
{
|
||||
char buf[2];
|
||||
|
||||
@ -1713,7 +1929,7 @@ puts_debug (prefix, string, suffix)
|
||||
|
||||
static void
|
||||
vfprintf_maybe_filtered (stream, format, args, filter)
|
||||
FILE *stream;
|
||||
GDB_FILE *stream;
|
||||
const char *format;
|
||||
va_list args;
|
||||
int filter;
|
||||
@ -1735,7 +1951,7 @@ vfprintf_maybe_filtered (stream, format, args, filter)
|
||||
|
||||
void
|
||||
vfprintf_filtered (stream, format, args)
|
||||
FILE *stream;
|
||||
GDB_FILE *stream;
|
||||
const char *format;
|
||||
va_list args;
|
||||
{
|
||||
@ -1744,7 +1960,7 @@ vfprintf_filtered (stream, format, args)
|
||||
|
||||
void
|
||||
vfprintf_unfiltered (stream, format, args)
|
||||
FILE *stream;
|
||||
GDB_FILE *stream;
|
||||
const char *format;
|
||||
va_list args;
|
||||
{
|
||||
@ -1781,7 +1997,7 @@ vprintf_unfiltered (format, args)
|
||||
/* VARARGS */
|
||||
void
|
||||
#ifdef ANSI_PROTOTYPES
|
||||
fprintf_filtered (FILE *stream, const char *format, ...)
|
||||
fprintf_filtered (GDB_FILE *stream, const char *format, ...)
|
||||
#else
|
||||
fprintf_filtered (va_alist)
|
||||
va_dcl
|
||||
@ -1791,11 +2007,11 @@ fprintf_filtered (va_alist)
|
||||
#ifdef ANSI_PROTOTYPES
|
||||
va_start (args, format);
|
||||
#else
|
||||
FILE *stream;
|
||||
GDB_FILE *stream;
|
||||
char *format;
|
||||
|
||||
va_start (args);
|
||||
stream = va_arg (args, FILE *);
|
||||
stream = va_arg (args, GDB_FILE *);
|
||||
format = va_arg (args, char *);
|
||||
#endif
|
||||
vfprintf_filtered (stream, format, args);
|
||||
@ -1805,7 +2021,7 @@ fprintf_filtered (va_alist)
|
||||
/* VARARGS */
|
||||
void
|
||||
#ifdef ANSI_PROTOTYPES
|
||||
fprintf_unfiltered (FILE *stream, const char *format, ...)
|
||||
fprintf_unfiltered (GDB_FILE *stream, const char *format, ...)
|
||||
#else
|
||||
fprintf_unfiltered (va_alist)
|
||||
va_dcl
|
||||
@ -1815,11 +2031,11 @@ fprintf_unfiltered (va_alist)
|
||||
#ifdef ANSI_PROTOTYPES
|
||||
va_start (args, format);
|
||||
#else
|
||||
FILE *stream;
|
||||
GDB_FILE *stream;
|
||||
char *format;
|
||||
|
||||
va_start (args);
|
||||
stream = va_arg (args, FILE *);
|
||||
stream = va_arg (args, GDB_FILE *);
|
||||
format = va_arg (args, char *);
|
||||
#endif
|
||||
vfprintf_unfiltered (stream, format, args);
|
||||
@ -1832,7 +2048,7 @@ fprintf_unfiltered (va_alist)
|
||||
/* VARARGS */
|
||||
void
|
||||
#ifdef ANSI_PROTOTYPES
|
||||
fprintfi_filtered (int spaces, FILE *stream, const char *format, ...)
|
||||
fprintfi_filtered (int spaces, GDB_FILE *stream, const char *format, ...)
|
||||
#else
|
||||
fprintfi_filtered (va_alist)
|
||||
va_dcl
|
||||
@ -1843,12 +2059,12 @@ fprintfi_filtered (va_alist)
|
||||
va_start (args, format);
|
||||
#else
|
||||
int spaces;
|
||||
FILE *stream;
|
||||
GDB_FILE *stream;
|
||||
char *format;
|
||||
|
||||
va_start (args);
|
||||
spaces = va_arg (args, int);
|
||||
stream = va_arg (args, FILE *);
|
||||
stream = va_arg (args, GDB_FILE *);
|
||||
format = va_arg (args, char *);
|
||||
#endif
|
||||
print_spaces_filtered (spaces, stream);
|
||||
@ -1978,7 +2194,7 @@ n_spaces (n)
|
||||
void
|
||||
print_spaces_filtered (n, stream)
|
||||
int n;
|
||||
FILE *stream;
|
||||
GDB_FILE *stream;
|
||||
{
|
||||
fputs_filtered (n_spaces (n), stream);
|
||||
}
|
||||
@ -1992,7 +2208,7 @@ print_spaces_filtered (n, stream)
|
||||
|
||||
void
|
||||
fprintf_symbol_filtered (stream, name, lang, arg_mode)
|
||||
FILE *stream;
|
||||
GDB_FILE *stream;
|
||||
char *name;
|
||||
enum language lang;
|
||||
int arg_mode;
|
||||
@ -2071,6 +2287,50 @@ strcmp_iw (string1, string2)
|
||||
return (*string1 != '\0' && *string1 != '(') || (*string2 != '\0');
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** subsetCompare()
|
||||
** Answer whether stringToCompare is a full or partial match to
|
||||
** templateString. The partial match must be in sequence starting
|
||||
** at index 0.
|
||||
*/
|
||||
int
|
||||
#ifdef _STDC__
|
||||
subsetCompare(
|
||||
char *stringToCompare,
|
||||
char *templateString)
|
||||
#else
|
||||
subsetCompare(stringToCompare, templateString)
|
||||
char *stringToCompare;
|
||||
char *templateString;
|
||||
#endif
|
||||
{
|
||||
int match = 0;
|
||||
|
||||
if (templateString != (char *)NULL && stringToCompare != (char *)NULL &&
|
||||
strlen(stringToCompare) <= strlen(templateString))
|
||||
match = (strncmp(templateString,
|
||||
stringToCompare,
|
||||
strlen(stringToCompare)) == 0);
|
||||
|
||||
return match;
|
||||
} /* subsetCompare */
|
||||
|
||||
|
||||
void pagination_on_command(arg, from_tty)
|
||||
char *arg;
|
||||
int from_tty;
|
||||
{
|
||||
pagination_enabled = 1;
|
||||
}
|
||||
|
||||
void pagination_off_command(arg, from_tty)
|
||||
char *arg;
|
||||
int from_tty;
|
||||
{
|
||||
pagination_enabled = 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
initialize_utils ()
|
||||
@ -2090,62 +2350,10 @@ initialize_utils ()
|
||||
"Set number of lines gdb thinks are in a page.", &setlist),
|
||||
&showlist);
|
||||
|
||||
/* These defaults will be used if we are unable to get the correct
|
||||
values from termcap. */
|
||||
#if defined(__GO32__)
|
||||
lines_per_page = ScreenRows();
|
||||
chars_per_line = ScreenCols();
|
||||
#else
|
||||
lines_per_page = 24;
|
||||
chars_per_line = 80;
|
||||
init_page_info ();
|
||||
|
||||
#if !defined (MPW) && !defined (_WIN32)
|
||||
/* No termcap under MPW, although might be cool to do something
|
||||
by looking at worksheet or console window sizes. */
|
||||
/* Initialize the screen height and width from termcap. */
|
||||
{
|
||||
char *termtype = getenv ("TERM");
|
||||
|
||||
/* Positive means success, nonpositive means failure. */
|
||||
int status;
|
||||
|
||||
/* 2048 is large enough for all known terminals, according to the
|
||||
GNU termcap manual. */
|
||||
char term_buffer[2048];
|
||||
|
||||
if (termtype)
|
||||
{
|
||||
status = tgetent (term_buffer, termtype);
|
||||
if (status > 0)
|
||||
{
|
||||
int val;
|
||||
|
||||
val = tgetnum ("li");
|
||||
if (val >= 0)
|
||||
lines_per_page = val;
|
||||
else
|
||||
/* The number of lines per page is not mentioned
|
||||
in the terminal description. This probably means
|
||||
that paging is not useful (e.g. emacs shell window),
|
||||
so disable paging. */
|
||||
lines_per_page = UINT_MAX;
|
||||
|
||||
val = tgetnum ("co");
|
||||
if (val >= 0)
|
||||
chars_per_line = val;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* MPW */
|
||||
|
||||
#if defined(SIGWINCH) && defined(SIGWINCH_HANDLER)
|
||||
|
||||
/* If there is a better way to determine the window size, use it. */
|
||||
SIGWINCH_HANDLER (SIGWINCH);
|
||||
#endif
|
||||
#endif
|
||||
/* If the output is not a terminal, don't paginate it. */
|
||||
if (!ISATTY (gdb_stdout))
|
||||
if (!GDB_FILE_ISATTY (gdb_stdout))
|
||||
lines_per_page = UINT_MAX;
|
||||
|
||||
set_width_command ((char *)NULL, 0, c);
|
||||
@ -2157,6 +2365,19 @@ initialize_utils ()
|
||||
&setprintlist),
|
||||
&showprintlist);
|
||||
|
||||
add_show_from_set
|
||||
(add_set_cmd ("pagination", class_support,
|
||||
var_boolean, (char *)&pagination_enabled,
|
||||
"Set state of pagination.", &setlist),
|
||||
&showlist);
|
||||
if (xdb_commands)
|
||||
{
|
||||
add_com("am", class_support, pagination_on_command,
|
||||
"Enable pagination");
|
||||
add_com("sm", class_support, pagination_off_command,
|
||||
"Disable pagination");
|
||||
}
|
||||
|
||||
add_show_from_set
|
||||
(add_set_cmd ("sevenbit-strings", class_support, var_boolean,
|
||||
(char *)&sevenbit_strings,
|
||||
|
Reference in New Issue
Block a user