mirror of
https://git.savannah.gnu.org/git/gnulib.git
synced 2025-08-08 17:22:05 +03:00
binary-io, eealloc, mbfile, mbiter, mbutil, xsize: better 'inline'
* lib/binary-io.c, lib/eealloc.c, lib/mbfile.c, lib/mbiter.c: * lib/mbuiter.c, lib/xsize.c: New files. * lib/binary-io.h (BINARY_IO_INLINE): * lib/eealloc.h (EEALLOC_INLINE): * lib/mbfile.h (MBFILE_INLINE): * lib/mbiter.h (MBITER_INLINE): * lib/mbuiter.h (MBUITER_INLINE): * lib/xsize.h (XSIZE_INLINE): New macros. Replace all uses of 'static inline' with them. Use _GL_INLINE_HEADER_BEGIN, _GL_INLINE_HEADER_END. * m4/eealloc.m4 (gl_EEALLOC): * m4/mbfile.m4 (gl_MBFILE): * m4/mbiter.m4 (gl_MBITER): * m4/xsize.m4 (gl_XSIZE): Do not require AC_C_INLINE. * modules/binary-io (Files, lib_SOURCES): Add lib/binary-io.c * modules/eealloc (Files, lib_SOURCES): Add lib/eealloc.c. * modules/mbfile (Files, lib_SOURCES): Add lib/mbfile.c. * modules/mbiter (Files, lib_SOURCES): Add lib/mbiter.c. * modules/mbuiter (Files, lib_SOURCES): Add lib/mbuiter.c. * modules/xsize (Files, lib_SOURCES): Add lib/xsize.c. * modules/binary-io, modules/eealloc, modules/mbfile: * modules/mbiter, modules/mbuiter: (Depends-on): Add extern-inline.
This commit is contained in:
27
ChangeLog
27
ChangeLog
@@ -1,5 +1,32 @@
|
||||
2012-09-22 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
binary-io, eealloc, mbfile, mbiter, mbutil, xsize: better 'inline'
|
||||
* lib/binary-io.c, lib/eealloc.c, lib/mbfile.c, lib/mbiter.c:
|
||||
* lib/mbuiter.c, lib/xsize.c: New files.
|
||||
* lib/binary-io.h (BINARY_IO_INLINE):
|
||||
* lib/eealloc.h (EEALLOC_INLINE):
|
||||
* lib/mbfile.h (MBFILE_INLINE):
|
||||
* lib/mbiter.h (MBITER_INLINE):
|
||||
* lib/mbuiter.h (MBUITER_INLINE):
|
||||
* lib/xsize.h (XSIZE_INLINE):
|
||||
New macros.
|
||||
Replace all uses of 'static inline' with them.
|
||||
Use _GL_INLINE_HEADER_BEGIN, _GL_INLINE_HEADER_END.
|
||||
* m4/eealloc.m4 (gl_EEALLOC):
|
||||
* m4/mbfile.m4 (gl_MBFILE):
|
||||
* m4/mbiter.m4 (gl_MBITER):
|
||||
* m4/xsize.m4 (gl_XSIZE):
|
||||
Do not require AC_C_INLINE.
|
||||
* modules/binary-io (Files, lib_SOURCES): Add lib/binary-io.c
|
||||
* modules/eealloc (Files, lib_SOURCES): Add lib/eealloc.c.
|
||||
* modules/mbfile (Files, lib_SOURCES): Add lib/mbfile.c.
|
||||
* modules/mbiter (Files, lib_SOURCES): Add lib/mbiter.c.
|
||||
* modules/mbuiter (Files, lib_SOURCES): Add lib/mbuiter.c.
|
||||
* modules/xsize (Files, lib_SOURCES): Add lib/xsize.c.
|
||||
* modules/binary-io, modules/eealloc, modules/mbfile:
|
||||
* modules/mbiter, modules/mbuiter:
|
||||
(Depends-on): Add extern-inline.
|
||||
|
||||
pipe-filter-gi, pipe-filter-ii: better use of 'inline'
|
||||
* lib/pipe-filter-aux.c: New file.
|
||||
* lib/pipe-filter-aux.h (PIPE_FILTER_AUX_INLINE): New macro.
|
||||
|
3
lib/binary-io.c
Normal file
3
lib/binary-io.c
Normal file
@@ -0,0 +1,3 @@
|
||||
#include <config.h>
|
||||
#define BINARY_IO_INLINE _GL_EXTERN_INLINE
|
||||
#include "binary-io.h"
|
@@ -25,6 +25,11 @@
|
||||
so we include it here first. */
|
||||
#include <stdio.h>
|
||||
|
||||
_GL_INLINE_HEADER_BEGIN
|
||||
#ifndef BINARY_IO_INLINE
|
||||
# define BINARY_IO_INLINE _GL_INLINE
|
||||
#endif
|
||||
|
||||
/* set_binary_mode (fd, mode)
|
||||
sets the binary/text I/O mode of file descriptor fd to the given mode
|
||||
(must be O_BINARY or O_TEXT) and returns the previous mode. */
|
||||
@@ -41,7 +46,7 @@
|
||||
/* On reasonable systems, binary I/O is the only choice. */
|
||||
/* Use a function rather than a macro, to avoid gcc warnings
|
||||
"warning: statement with no effect". */
|
||||
static inline int
|
||||
BINARY_IO_INLINE int
|
||||
set_binary_mode (int fd, int mode)
|
||||
{
|
||||
(void) fd;
|
||||
@@ -62,4 +67,6 @@ set_binary_mode (int fd, int mode)
|
||||
# define SET_BINARY(fd) ((void) set_binary_mode (fd, O_BINARY))
|
||||
#endif
|
||||
|
||||
_GL_INLINE_HEADER_END
|
||||
|
||||
#endif /* _BINARY_H */
|
||||
|
3
lib/eealloc.c
Normal file
3
lib/eealloc.c
Normal file
@@ -0,0 +1,3 @@
|
||||
#include <config.h>
|
||||
#define EEALLOC_INLINE _GL_EXTERN_INLINE
|
||||
#include "eealloc.h"
|
@@ -31,18 +31,23 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
_GL_INLINE_HEADER_BEGIN
|
||||
#ifndef EEALLOC_INLINE
|
||||
# define EEALLOC_INLINE _GL_INLINE
|
||||
#endif
|
||||
|
||||
#if MALLOC_0_IS_NONNULL
|
||||
# define eemalloc malloc
|
||||
#else
|
||||
# if __GNUC__ >= 3
|
||||
static inline void *eemalloc (size_t n)
|
||||
EEALLOC_INLINE void *eemalloc (size_t n)
|
||||
__attribute__ ((__malloc__))
|
||||
# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
|
||||
__attribute__ ((__alloc_size__ (1)))
|
||||
# endif
|
||||
;
|
||||
# endif
|
||||
static inline void *
|
||||
EEALLOC_INLINE void *
|
||||
eemalloc (size_t n)
|
||||
{
|
||||
/* If n is zero, allocate a 1-byte block. */
|
||||
@@ -56,10 +61,10 @@ eemalloc (size_t n)
|
||||
# define eerealloc realloc
|
||||
#else
|
||||
# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
|
||||
static inline void *eerealloc (void *p, size_t n)
|
||||
EEALLOC_INLINE void *eerealloc (void *p, size_t n)
|
||||
__attribute__ ((__alloc_size__ (2)));
|
||||
# endif
|
||||
static inline void *
|
||||
EEALLOC_INLINE void *
|
||||
eerealloc (void *p, size_t n)
|
||||
{
|
||||
/* If n is zero, allocate or keep a 1-byte block. */
|
||||
@@ -76,4 +81,6 @@ eerealloc (void *p, size_t n)
|
||||
eenrealloc (void *p, size_t n, size_t s) - like eerealloc (p, n * s)
|
||||
If this would be useful in your application. please speak up. */
|
||||
|
||||
_GL_INLINE_HEADER_END
|
||||
|
||||
#endif /* _EEALLOC_H */
|
||||
|
3
lib/mbfile.c
Normal file
3
lib/mbfile.c
Normal file
@@ -0,0 +1,3 @@
|
||||
#include <config.h>
|
||||
#define MBFILE_INLINE _GL_EXTERN_INLINE
|
||||
#include "mbfile.h"
|
11
lib/mbfile.h
11
lib/mbfile.h
@@ -62,6 +62,11 @@
|
||||
|
||||
#include "mbchar.h"
|
||||
|
||||
_GL_INLINE_HEADER_BEGIN
|
||||
#ifndef MBFILE_INLINE
|
||||
# define MBFILE_INLINE _GL_INLINE
|
||||
#endif
|
||||
|
||||
struct mbfile_multi {
|
||||
FILE *fp;
|
||||
bool eof_seen;
|
||||
@@ -72,7 +77,7 @@ struct mbfile_multi {
|
||||
struct mbchar pushback;
|
||||
};
|
||||
|
||||
static inline void
|
||||
MBFILE_INLINE void
|
||||
mbfile_multi_getc (struct mbchar *mbc, struct mbfile_multi *mbf)
|
||||
{
|
||||
size_t bytes;
|
||||
@@ -215,7 +220,7 @@ eof:
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void
|
||||
MBFILE_INLINE void
|
||||
mbfile_multi_ungetc (const struct mbchar *mbc, struct mbfile_multi *mbf)
|
||||
{
|
||||
mb_copy (&mbf->pushback, mbc);
|
||||
@@ -239,4 +244,6 @@ typedef mbchar_t mbf_char_t;
|
||||
|
||||
#define mb_iseof(mbc) ((mbc).bytes == 0)
|
||||
|
||||
_GL_INLINE_HEADER_BEGIN
|
||||
|
||||
#endif /* _MBFILE_H */
|
||||
|
3
lib/mbiter.c
Normal file
3
lib/mbiter.c
Normal file
@@ -0,0 +1,3 @@
|
||||
#include <config.h>
|
||||
#define MBITER_INLINE _GL_EXTERN_INLINE
|
||||
#include "mbiter.h"
|
13
lib/mbiter.h
13
lib/mbiter.h
@@ -97,6 +97,11 @@
|
||||
|
||||
#include "mbchar.h"
|
||||
|
||||
_GL_INLINE_HEADER_BEGIN
|
||||
#ifndef MBITER_INLINE
|
||||
# define MBITER_INLINE _GL_INLINE
|
||||
#endif
|
||||
|
||||
struct mbiter_multi
|
||||
{
|
||||
const char *limit; /* pointer to end of string */
|
||||
@@ -112,7 +117,7 @@ struct mbiter_multi
|
||||
*/
|
||||
};
|
||||
|
||||
static inline void
|
||||
MBITER_INLINE void
|
||||
mbiter_multi_next (struct mbiter_multi *iter)
|
||||
{
|
||||
if (iter->next_done)
|
||||
@@ -172,14 +177,14 @@ mbiter_multi_next (struct mbiter_multi *iter)
|
||||
iter->next_done = true;
|
||||
}
|
||||
|
||||
static inline void
|
||||
MBITER_INLINE void
|
||||
mbiter_multi_reloc (struct mbiter_multi *iter, ptrdiff_t ptrdiff)
|
||||
{
|
||||
iter->cur.ptr += ptrdiff;
|
||||
iter->limit += ptrdiff;
|
||||
}
|
||||
|
||||
static inline void
|
||||
MBITER_INLINE void
|
||||
mbiter_multi_copy (struct mbiter_multi *new_iter, const struct mbiter_multi *old_iter)
|
||||
{
|
||||
new_iter->limit = old_iter->limit;
|
||||
@@ -212,4 +217,6 @@ typedef struct mbiter_multi mbi_iterator_t;
|
||||
/* Copying an iterator. */
|
||||
#define mbi_copy mbiter_multi_copy
|
||||
|
||||
_GL_INLINE_HEADER_END
|
||||
|
||||
#endif /* _MBITER_H */
|
||||
|
3
lib/mbuiter.c
Normal file
3
lib/mbuiter.c
Normal file
@@ -0,0 +1,3 @@
|
||||
#include <config.h>
|
||||
#define MBUITER_INLINE _GL_EXTERN_INLINE
|
||||
#include "mbuiter.h"
|
@@ -106,6 +106,11 @@
|
||||
#include "mbchar.h"
|
||||
#include "strnlen1.h"
|
||||
|
||||
_GL_INLINE_HEADER_BEGIN
|
||||
#ifndef MBUITER_INLINE
|
||||
# define MBUITER_INLINE _GL_INLINE
|
||||
#endif
|
||||
|
||||
struct mbuiter_multi
|
||||
{
|
||||
bool in_shift; /* true if next byte may not be interpreted as ASCII */
|
||||
@@ -120,7 +125,7 @@ struct mbuiter_multi
|
||||
*/
|
||||
};
|
||||
|
||||
static inline void
|
||||
MBUITER_INLINE void
|
||||
mbuiter_multi_next (struct mbuiter_multi *iter)
|
||||
{
|
||||
if (iter->next_done)
|
||||
@@ -181,13 +186,13 @@ mbuiter_multi_next (struct mbuiter_multi *iter)
|
||||
iter->next_done = true;
|
||||
}
|
||||
|
||||
static inline void
|
||||
MBUITER_INLINE void
|
||||
mbuiter_multi_reloc (struct mbuiter_multi *iter, ptrdiff_t ptrdiff)
|
||||
{
|
||||
iter->cur.ptr += ptrdiff;
|
||||
}
|
||||
|
||||
static inline void
|
||||
MBUITER_INLINE void
|
||||
mbuiter_multi_copy (struct mbuiter_multi *new_iter, const struct mbuiter_multi *old_iter)
|
||||
{
|
||||
if ((new_iter->in_shift = old_iter->in_shift))
|
||||
@@ -219,4 +224,6 @@ typedef struct mbuiter_multi mbui_iterator_t;
|
||||
/* Copying an iterator. */
|
||||
#define mbui_copy mbuiter_multi_copy
|
||||
|
||||
_GL_INLINE_HEADER_END
|
||||
|
||||
#endif /* _MBUITER_H */
|
||||
|
3
lib/xsize.c
Normal file
3
lib/xsize.c
Normal file
@@ -0,0 +1,3 @@
|
||||
#include <config.h>
|
||||
#define XSIZE_INLINE _GL_EXTERN_INLINE
|
||||
#include "xsize.h"
|
15
lib/xsize.h
15
lib/xsize.h
@@ -27,6 +27,11 @@
|
||||
# include <stdint.h>
|
||||
#endif
|
||||
|
||||
_GL_INLINE_HEADER_BEGIN
|
||||
#ifndef XSIZE_INLINE
|
||||
# define XSIZE_INLINE _GL_INLINE
|
||||
#endif
|
||||
|
||||
/* The size of memory objects is often computed through expressions of
|
||||
type size_t. Example:
|
||||
void* p = malloc (header_size + n * element_size).
|
||||
@@ -48,7 +53,7 @@
|
||||
((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX)
|
||||
|
||||
/* Sum of two sizes, with overflow check. */
|
||||
static inline size_t
|
||||
XSIZE_INLINE size_t
|
||||
#if __GNUC__ >= 3
|
||||
__attribute__ ((__pure__))
|
||||
#endif
|
||||
@@ -59,7 +64,7 @@ xsum (size_t size1, size_t size2)
|
||||
}
|
||||
|
||||
/* Sum of three sizes, with overflow check. */
|
||||
static inline size_t
|
||||
XSIZE_INLINE size_t
|
||||
#if __GNUC__ >= 3
|
||||
__attribute__ ((__pure__))
|
||||
#endif
|
||||
@@ -69,7 +74,7 @@ xsum3 (size_t size1, size_t size2, size_t size3)
|
||||
}
|
||||
|
||||
/* Sum of four sizes, with overflow check. */
|
||||
static inline size_t
|
||||
XSIZE_INLINE size_t
|
||||
#if __GNUC__ >= 3
|
||||
__attribute__ ((__pure__))
|
||||
#endif
|
||||
@@ -79,7 +84,7 @@ xsum4 (size_t size1, size_t size2, size_t size3, size_t size4)
|
||||
}
|
||||
|
||||
/* Maximum of two sizes, with overflow check. */
|
||||
static inline size_t
|
||||
XSIZE_INLINE size_t
|
||||
#if __GNUC__ >= 3
|
||||
__attribute__ ((__pure__))
|
||||
#endif
|
||||
@@ -104,4 +109,6 @@ xmax (size_t size1, size_t size2)
|
||||
#define size_in_bounds_p(SIZE) \
|
||||
((SIZE) != SIZE_MAX)
|
||||
|
||||
_GL_INLINE_HEADER_END
|
||||
|
||||
#endif /* _XSIZE_H */
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# eealloc.m4 serial 2
|
||||
# eealloc.m4 serial 3
|
||||
dnl Copyright (C) 2003, 2009-2012 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
@@ -8,7 +8,6 @@ AC_DEFUN([gl_EEALLOC],
|
||||
[
|
||||
AC_REQUIRE([gl_EEMALLOC])
|
||||
AC_REQUIRE([gl_EEREALLOC])
|
||||
AC_REQUIRE([AC_C_INLINE])
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_EEMALLOC],
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# mbfile.m4 serial 6
|
||||
# mbfile.m4 serial 7
|
||||
dnl Copyright (C) 2005, 2008-2012 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
@@ -9,7 +9,6 @@ dnl From Bruno Haible.
|
||||
|
||||
AC_DEFUN([gl_MBFILE],
|
||||
[
|
||||
AC_REQUIRE([AC_C_INLINE])
|
||||
AC_REQUIRE([AC_TYPE_MBSTATE_T])
|
||||
:
|
||||
])
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# mbiter.m4 serial 6
|
||||
# mbiter.m4 serial 7
|
||||
dnl Copyright (C) 2005, 2008-2012 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
@@ -9,7 +9,6 @@ dnl From Bruno Haible.
|
||||
|
||||
AC_DEFUN([gl_MBITER],
|
||||
[
|
||||
AC_REQUIRE([AC_C_INLINE])
|
||||
AC_REQUIRE([AC_TYPE_MBSTATE_T])
|
||||
:
|
||||
])
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# xsize.m4 serial 4
|
||||
# xsize.m4 serial 5
|
||||
dnl Copyright (C) 2003-2004, 2008-2012 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
@@ -8,6 +8,5 @@ AC_DEFUN([gl_XSIZE],
|
||||
[
|
||||
dnl Prerequisites of lib/xsize.h.
|
||||
AC_REQUIRE([gl_SIZE_MAX])
|
||||
AC_REQUIRE([AC_C_INLINE])
|
||||
AC_CHECK_HEADERS([stdint.h])
|
||||
])
|
||||
|
@@ -3,15 +3,16 @@ Binary mode I/O.
|
||||
|
||||
Files:
|
||||
lib/binary-io.h
|
||||
lib/binary-io.c
|
||||
|
||||
Depends-on:
|
||||
extern-inline
|
||||
fcntl-h
|
||||
|
||||
configure.ac:
|
||||
AC_REQUIRE([AC_C_INLINE])
|
||||
|
||||
Makefile.am:
|
||||
lib_SOURCES += binary-io.h
|
||||
lib_SOURCES += binary-io.h binary-io.c
|
||||
|
||||
Include:
|
||||
"binary-io.h"
|
||||
@@ -21,4 +22,3 @@ LGPLv2+
|
||||
|
||||
Maintainer:
|
||||
Bruno Haible
|
||||
|
||||
|
@@ -3,16 +3,19 @@ Memory allocation with expensive empty allocations (glibc compatible).
|
||||
|
||||
Files:
|
||||
lib/eealloc.h
|
||||
lib/eealloc.c
|
||||
m4/eealloc.m4
|
||||
m4/malloc.m4
|
||||
m4/realloc.m4
|
||||
|
||||
Depends-on:
|
||||
extern-inline
|
||||
|
||||
configure.ac:
|
||||
gl_EEALLOC
|
||||
|
||||
Makefile.am:
|
||||
lib_SOURCES += eealloc.c
|
||||
|
||||
Include:
|
||||
<eealloc.h>
|
||||
|
@@ -3,10 +3,12 @@ Multibyte character I/O.
|
||||
|
||||
Files:
|
||||
lib/mbfile.h
|
||||
lib/mbfile.c
|
||||
m4/mbfile.m4
|
||||
m4/mbrtowc.m4
|
||||
|
||||
Depends-on:
|
||||
extern-inline
|
||||
mbchar
|
||||
mbrtowc
|
||||
mbsinit
|
||||
@@ -17,7 +19,7 @@ configure.ac:
|
||||
gl_MBFILE
|
||||
|
||||
Makefile.am:
|
||||
lib_SOURCES += mbfile.h
|
||||
lib_SOURCES += mbfile.h mbfile.c
|
||||
|
||||
Include:
|
||||
"mbfile.h"
|
||||
@@ -27,4 +29,3 @@ LGPL
|
||||
|
||||
Maintainer:
|
||||
Bruno Haible
|
||||
|
||||
|
@@ -3,10 +3,12 @@ Iterating through multibyte strings.
|
||||
|
||||
Files:
|
||||
lib/mbiter.h
|
||||
lib/mbiter.c
|
||||
m4/mbiter.m4
|
||||
m4/mbrtowc.m4
|
||||
|
||||
Depends-on:
|
||||
extern-inline
|
||||
mbchar
|
||||
mbrtowc
|
||||
mbsinit
|
||||
@@ -17,7 +19,7 @@ configure.ac:
|
||||
gl_MBITER
|
||||
|
||||
Makefile.am:
|
||||
lib_SOURCES += mbiter.h
|
||||
lib_SOURCES += mbiter.h mbiter.c
|
||||
|
||||
Include:
|
||||
"mbiter.h"
|
||||
@@ -27,4 +29,3 @@ LGPL
|
||||
|
||||
Maintainer:
|
||||
Bruno Haible
|
||||
|
||||
|
@@ -3,10 +3,12 @@ Iterating through multibyte strings.
|
||||
|
||||
Files:
|
||||
lib/mbuiter.h
|
||||
lib/mbuiter.c
|
||||
m4/mbiter.m4
|
||||
m4/mbrtowc.m4
|
||||
|
||||
Depends-on:
|
||||
extern-inline
|
||||
mbchar
|
||||
mbrtowc
|
||||
mbsinit
|
||||
@@ -18,7 +20,7 @@ configure.ac:
|
||||
gl_MBITER
|
||||
|
||||
Makefile.am:
|
||||
lib_SOURCES += mbuiter.h
|
||||
lib_SOURCES += mbuiter.h mbuiter.c
|
||||
|
||||
Include:
|
||||
"mbuiter.h"
|
||||
@@ -28,4 +30,3 @@ LGPL
|
||||
|
||||
Maintainer:
|
||||
Bruno Haible
|
||||
|
||||
|
@@ -3,16 +3,18 @@ Checked size_t computations.
|
||||
|
||||
Files:
|
||||
lib/xsize.h
|
||||
lib/xsize.c
|
||||
m4/xsize.m4
|
||||
|
||||
Depends-on:
|
||||
extern-inline
|
||||
size_max
|
||||
|
||||
configure.ac:
|
||||
gl_XSIZE
|
||||
|
||||
Makefile.am:
|
||||
lib_SOURCES += xsize.h
|
||||
lib_SOURCES += xsize.h xsize.c
|
||||
|
||||
Include:
|
||||
"xsize.h"
|
||||
@@ -22,4 +24,3 @@ LGPLv2+
|
||||
|
||||
Maintainer:
|
||||
Bruno Haible
|
||||
|
||||
|
Reference in New Issue
Block a user