mirror of
https://sourceware.org/git/glibc.git
synced 2025-12-24 17:51:17 +03:00
Remove use of INTDEF/INTUSE in libio
This commit is contained in:
178
libio/libioP.h
178
libio/libioP.h
@@ -41,15 +41,6 @@
|
||||
|
||||
/* Control of exported symbols. Used in glibc. By default we don't
|
||||
do anything. */
|
||||
#ifndef INTUSE
|
||||
# define INTUSE(name) name
|
||||
#endif
|
||||
#ifndef INTDEF
|
||||
# define INTDEF(name)
|
||||
#endif
|
||||
#ifndef INTDEF2
|
||||
# define INTDEF2(name)
|
||||
#endif
|
||||
#ifndef libc_hidden_proto
|
||||
# define libc_hidden_proto(name)
|
||||
#endif
|
||||
@@ -380,24 +371,41 @@ typedef struct _IO_FILE *_IO_ITER;
|
||||
extern void _IO_switch_to_main_get_area (_IO_FILE *) __THROW;
|
||||
extern void _IO_switch_to_backup_area (_IO_FILE *) __THROW;
|
||||
extern int _IO_switch_to_get_mode (_IO_FILE *);
|
||||
libc_hidden_proto (_IO_switch_to_get_mode)
|
||||
extern void _IO_init (_IO_FILE *, int) __THROW;
|
||||
libc_hidden_proto (_IO_init)
|
||||
extern int _IO_sputbackc (_IO_FILE *, int) __THROW;
|
||||
libc_hidden_proto (_IO_sputbackc)
|
||||
extern int _IO_sungetc (_IO_FILE *) __THROW;
|
||||
extern void _IO_un_link (struct _IO_FILE_plus *) __THROW;
|
||||
libc_hidden_proto (_IO_un_link)
|
||||
extern void _IO_link_in (struct _IO_FILE_plus *) __THROW;
|
||||
libc_hidden_proto (_IO_link_in)
|
||||
extern void _IO_doallocbuf (_IO_FILE *) __THROW;
|
||||
libc_hidden_proto (_IO_doallocbuf)
|
||||
extern void _IO_unsave_markers (_IO_FILE *) __THROW;
|
||||
libc_hidden_proto (_IO_unsave_markers)
|
||||
extern void _IO_setb (_IO_FILE *, char *, char *, int) __THROW;
|
||||
libc_hidden_proto (_IO_setb)
|
||||
extern unsigned _IO_adjust_column (unsigned, const char *, int) __THROW;
|
||||
libc_hidden_proto (_IO_adjust_column)
|
||||
#define _IO_sputn(__fp, __s, __n) _IO_XSPUTN (__fp, __s, __n)
|
||||
|
||||
_IO_ssize_t _IO_least_wmarker (_IO_FILE *, wchar_t *) __THROW;
|
||||
libc_hidden_proto (_IO_least_wmarker)
|
||||
extern void _IO_switch_to_main_wget_area (_IO_FILE *) __THROW;
|
||||
libc_hidden_proto (_IO_switch_to_main_wget_area)
|
||||
extern void _IO_switch_to_wbackup_area (_IO_FILE *) __THROW;
|
||||
libc_hidden_proto (_IO_switch_to_wbackup_area)
|
||||
extern int _IO_switch_to_wget_mode (_IO_FILE *);
|
||||
libc_hidden_proto (_IO_switch_to_wget_mode)
|
||||
extern void _IO_wsetb (_IO_FILE *, wchar_t *, wchar_t *, int) __THROW;
|
||||
libc_hidden_proto (_IO_wsetb)
|
||||
extern wint_t _IO_sputbackwc (_IO_FILE *, wint_t) __THROW;
|
||||
libc_hidden_proto (_IO_sputbackwc)
|
||||
extern wint_t _IO_sungetwc (_IO_FILE *) __THROW;
|
||||
extern void _IO_wdoallocbuf (_IO_FILE *) __THROW;
|
||||
libc_hidden_proto (_IO_wdoallocbuf)
|
||||
extern void _IO_unsave_wmarkers (_IO_FILE *) __THROW;
|
||||
extern unsigned _IO_adjust_wcolumn (unsigned, const wchar_t *, int) __THROW;
|
||||
|
||||
@@ -434,18 +442,30 @@ libc_hidden_proto (_IO_list_resetlock)
|
||||
|
||||
extern int _IO_default_underflow (_IO_FILE *) __THROW;
|
||||
extern int _IO_default_uflow (_IO_FILE *);
|
||||
libc_hidden_proto (_IO_default_uflow)
|
||||
extern wint_t _IO_wdefault_uflow (_IO_FILE *);
|
||||
libc_hidden_proto (_IO_wdefault_uflow)
|
||||
extern int _IO_default_doallocate (_IO_FILE *) __THROW;
|
||||
libc_hidden_proto (_IO_default_doallocate)
|
||||
extern int _IO_wdefault_doallocate (_IO_FILE *) __THROW;
|
||||
libc_hidden_proto (_IO_wdefault_doallocate)
|
||||
extern void _IO_default_finish (_IO_FILE *, int) __THROW;
|
||||
libc_hidden_proto (_IO_default_finish)
|
||||
extern void _IO_wdefault_finish (_IO_FILE *, int) __THROW;
|
||||
libc_hidden_proto (_IO_wdefault_finish)
|
||||
extern int _IO_default_pbackfail (_IO_FILE *, int) __THROW;
|
||||
libc_hidden_proto (_IO_default_pbackfail)
|
||||
extern wint_t _IO_wdefault_pbackfail (_IO_FILE *, wint_t) __THROW;
|
||||
libc_hidden_proto (_IO_wdefault_pbackfail)
|
||||
extern _IO_FILE* _IO_default_setbuf (_IO_FILE *, char *, _IO_ssize_t);
|
||||
extern _IO_size_t _IO_default_xsputn (_IO_FILE *, const void *, _IO_size_t);
|
||||
libc_hidden_proto (_IO_default_xsputn)
|
||||
extern _IO_size_t _IO_wdefault_xsputn (_IO_FILE *, const void *, _IO_size_t);
|
||||
libc_hidden_proto (_IO_wdefault_xsputn)
|
||||
extern _IO_size_t _IO_default_xsgetn (_IO_FILE *, void *, _IO_size_t);
|
||||
libc_hidden_proto (_IO_default_xsgetn)
|
||||
extern _IO_size_t _IO_wdefault_xsgetn (_IO_FILE *, void *, _IO_size_t);
|
||||
libc_hidden_proto (_IO_wdefault_xsgetn)
|
||||
extern _IO_off64_t _IO_default_seekoff (_IO_FILE *, _IO_off64_t, int, int)
|
||||
__THROW;
|
||||
extern _IO_off64_t _IO_default_seekpos (_IO_FILE *, _IO_off64_t, int);
|
||||
@@ -473,13 +493,17 @@ extern const struct _IO_jump_t _IO_str_jumps attribute_hidden;
|
||||
extern const struct _IO_jump_t _IO_wstr_jumps attribute_hidden;
|
||||
extern const struct _IO_codecvt __libio_codecvt attribute_hidden;
|
||||
extern int _IO_do_write (_IO_FILE *, const char *, _IO_size_t);
|
||||
libc_hidden_proto (_IO_do_write)
|
||||
extern int _IO_new_do_write (_IO_FILE *, const char *, _IO_size_t);
|
||||
extern int _IO_old_do_write (_IO_FILE *, const char *, _IO_size_t);
|
||||
extern int _IO_wdo_write (_IO_FILE *, const wchar_t *, _IO_size_t);
|
||||
libc_hidden_proto (_IO_wdo_write)
|
||||
extern int _IO_flush_all_lockp (int);
|
||||
extern int _IO_flush_all (void);
|
||||
libc_hidden_proto (_IO_flush_all)
|
||||
extern int _IO_cleanup (void);
|
||||
extern void _IO_flush_all_linebuffered (void);
|
||||
libc_hidden_proto (_IO_flush_all_linebuffered)
|
||||
extern int _IO_new_fgetpos (_IO_FILE *, _IO_fpos_t *);
|
||||
extern int _IO_old_fgetpos (_IO_FILE *, _IO_fpos_t *);
|
||||
extern int _IO_new_fsetpos (_IO_FILE *, const _IO_fpos_t *);
|
||||
@@ -494,15 +518,15 @@ extern void _IO_old_init (_IO_FILE *fp, int flags) __THROW;
|
||||
#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
|
||||
# define _IO_do_flush(_f) \
|
||||
((_f)->_mode <= 0 \
|
||||
? INTUSE(_IO_do_write)(_f, (_f)->_IO_write_base, \
|
||||
(_f)->_IO_write_ptr-(_f)->_IO_write_base) \
|
||||
: INTUSE(_IO_wdo_write)(_f, (_f)->_wide_data->_IO_write_base, \
|
||||
((_f)->_wide_data->_IO_write_ptr \
|
||||
- (_f)->_wide_data->_IO_write_base)))
|
||||
? _IO_do_write(_f, (_f)->_IO_write_base, \
|
||||
(_f)->_IO_write_ptr-(_f)->_IO_write_base) \
|
||||
: _IO_wdo_write(_f, (_f)->_wide_data->_IO_write_base, \
|
||||
((_f)->_wide_data->_IO_write_ptr \
|
||||
- (_f)->_wide_data->_IO_write_base)))
|
||||
#else
|
||||
# define _IO_do_flush(_f) \
|
||||
INTUSE(_IO_do_write)(_f, (_f)->_IO_write_base, \
|
||||
(_f)->_IO_write_ptr-(_f)->_IO_write_base)
|
||||
_IO_do_write(_f, (_f)->_IO_write_base, \
|
||||
(_f)->_IO_write_ptr-(_f)->_IO_write_base)
|
||||
#endif
|
||||
#define _IO_old_do_flush(_f) \
|
||||
_IO_old_do_write(_f, (_f)->_IO_write_base, \
|
||||
@@ -533,31 +557,48 @@ extern void _IO_old_init (_IO_FILE *fp, int flags) __THROW;
|
||||
/* Jumptable functions for files. */
|
||||
|
||||
extern int _IO_file_doallocate (_IO_FILE *) __THROW;
|
||||
libc_hidden_proto (_IO_file_doallocate)
|
||||
extern _IO_FILE* _IO_file_setbuf (_IO_FILE *, char *, _IO_ssize_t);
|
||||
libc_hidden_proto (_IO_file_setbuf)
|
||||
extern _IO_off64_t _IO_file_seekoff (_IO_FILE *, _IO_off64_t, int, int);
|
||||
libc_hidden_proto (_IO_file_seekoff)
|
||||
extern _IO_off64_t _IO_file_seekoff_mmap (_IO_FILE *, _IO_off64_t, int, int)
|
||||
__THROW;
|
||||
extern _IO_size_t _IO_file_xsputn (_IO_FILE *, const void *, _IO_size_t);
|
||||
libc_hidden_proto (_IO_file_xsputn)
|
||||
extern _IO_size_t _IO_file_xsgetn (_IO_FILE *, void *, _IO_size_t);
|
||||
libc_hidden_proto (_IO_file_xsgetn)
|
||||
extern int _IO_file_stat (_IO_FILE *, void *) __THROW;
|
||||
libc_hidden_proto (_IO_file_stat)
|
||||
extern int _IO_file_close (_IO_FILE *) __THROW;
|
||||
libc_hidden_proto (_IO_file_close)
|
||||
extern int _IO_file_close_mmap (_IO_FILE *) __THROW;
|
||||
extern int _IO_file_underflow (_IO_FILE *);
|
||||
libc_hidden_proto (_IO_file_underflow)
|
||||
extern int _IO_file_underflow_mmap (_IO_FILE *);
|
||||
extern int _IO_file_underflow_maybe_mmap (_IO_FILE *);
|
||||
extern int _IO_file_overflow (_IO_FILE *, int);
|
||||
libc_hidden_proto (_IO_file_overflow)
|
||||
#define _IO_file_is_open(__fp) ((__fp)->_fileno != -1)
|
||||
extern void _IO_file_init (struct _IO_FILE_plus *) __THROW;
|
||||
libc_hidden_proto (_IO_file_init)
|
||||
extern _IO_FILE* _IO_file_attach (_IO_FILE *, int);
|
||||
libc_hidden_proto (_IO_file_attach)
|
||||
extern _IO_FILE* _IO_file_open (_IO_FILE *, const char *, int, int, int, int);
|
||||
libc_hidden_proto (_IO_file_open)
|
||||
extern _IO_FILE* _IO_file_fopen (_IO_FILE *, const char *, const char *, int);
|
||||
libc_hidden_proto (_IO_file_fopen)
|
||||
extern _IO_ssize_t _IO_file_write (_IO_FILE *, const void *, _IO_ssize_t);
|
||||
extern _IO_ssize_t _IO_file_read (_IO_FILE *, void *, _IO_ssize_t);
|
||||
libc_hidden_proto (_IO_file_read)
|
||||
extern int _IO_file_sync (_IO_FILE *);
|
||||
libc_hidden_proto (_IO_file_sync)
|
||||
extern int _IO_file_close_it (_IO_FILE *);
|
||||
libc_hidden_proto (_IO_file_close_it)
|
||||
extern _IO_off64_t _IO_file_seek (_IO_FILE *, _IO_off64_t, int) __THROW;
|
||||
libc_hidden_proto (_IO_file_seek)
|
||||
extern void _IO_file_finish (_IO_FILE *, int);
|
||||
libc_hidden_proto (_IO_file_finish)
|
||||
|
||||
extern _IO_FILE* _IO_new_file_attach (_IO_FILE *, int);
|
||||
extern int _IO_new_file_close_it (_IO_FILE *);
|
||||
@@ -591,11 +632,16 @@ extern void _IO_old_file_finish (_IO_FILE *, int);
|
||||
|
||||
extern int _IO_wfile_doallocate (_IO_FILE *) __THROW;
|
||||
extern _IO_size_t _IO_wfile_xsputn (_IO_FILE *, const void *, _IO_size_t);
|
||||
libc_hidden_proto (_IO_wfile_xsputn)
|
||||
extern _IO_FILE* _IO_wfile_setbuf (_IO_FILE *, wchar_t *, _IO_ssize_t);
|
||||
extern wint_t _IO_wfile_sync (_IO_FILE *);
|
||||
libc_hidden_proto (_IO_wfile_sync)
|
||||
extern wint_t _IO_wfile_underflow (_IO_FILE *);
|
||||
libc_hidden_proto (_IO_wfile_underflow)
|
||||
extern wint_t _IO_wfile_overflow (_IO_FILE *, wint_t);
|
||||
libc_hidden_proto (_IO_wfile_overflow)
|
||||
extern _IO_off64_t _IO_wfile_seekoff (_IO_FILE *, _IO_off64_t, int, int);
|
||||
libc_hidden_proto (_IO_wfile_seekoff)
|
||||
|
||||
/* Jumptable functions for proc_files. */
|
||||
extern _IO_FILE* _IO_proc_open (_IO_FILE *, const char *, const char *)
|
||||
@@ -609,9 +655,13 @@ extern int _IO_old_proc_close (_IO_FILE *);
|
||||
|
||||
/* Jumptable functions for strfiles. */
|
||||
extern int _IO_str_underflow (_IO_FILE *) __THROW;
|
||||
libc_hidden_proto (_IO_str_underflow)
|
||||
extern int _IO_str_overflow (_IO_FILE *, int) __THROW;
|
||||
libc_hidden_proto (_IO_str_overflow)
|
||||
extern int _IO_str_pbackfail (_IO_FILE *, int) __THROW;
|
||||
libc_hidden_proto (_IO_str_pbackfail)
|
||||
extern _IO_off64_t _IO_str_seekoff (_IO_FILE *, _IO_off64_t, int, int) __THROW;
|
||||
libc_hidden_proto (_IO_str_seekoff)
|
||||
extern void _IO_str_finish (_IO_FILE *, int) __THROW;
|
||||
|
||||
/* Other strfile functions */
|
||||
@@ -641,115 +691,25 @@ extern int _IO_vsnprintf (char *string, _IO_size_t maxlen,
|
||||
|
||||
|
||||
extern _IO_size_t _IO_getline (_IO_FILE *,char *, _IO_size_t, int, int);
|
||||
libc_hidden_proto (_IO_getline)
|
||||
extern _IO_size_t _IO_getline_info (_IO_FILE *,char *, _IO_size_t,
|
||||
int, int, int *);
|
||||
libc_hidden_proto (_IO_getline_info)
|
||||
extern _IO_ssize_t _IO_getdelim (char **, _IO_size_t *, int, _IO_FILE *);
|
||||
extern _IO_size_t _IO_getwline (_IO_FILE *,wchar_t *, _IO_size_t, wint_t, int);
|
||||
extern _IO_size_t _IO_getwline_info (_IO_FILE *,wchar_t *, _IO_size_t,
|
||||
wint_t, int, wint_t *);
|
||||
|
||||
extern struct _IO_FILE_plus *_IO_list_all;
|
||||
libc_hidden_proto (_IO_list_all)
|
||||
extern void (*_IO_cleanup_registration_needed) (void);
|
||||
|
||||
/* Prototype for functions with alternative entry point. */
|
||||
extern int _IO_flush_all_internal (void);
|
||||
extern unsigned _IO_adjust_column_internal (unsigned, const char *, int);
|
||||
|
||||
extern int _IO_default_uflow_internal (_IO_FILE *);
|
||||
extern void _IO_default_finish_internal (_IO_FILE *, int) __THROW;
|
||||
extern int _IO_default_pbackfail_internal (_IO_FILE *, int) __THROW;
|
||||
extern _IO_size_t _IO_default_xsputn_internal (_IO_FILE *, const void *,
|
||||
_IO_size_t);
|
||||
extern _IO_size_t _IO_default_xsgetn_internal (_IO_FILE *, void *, _IO_size_t);
|
||||
extern int _IO_default_doallocate_internal (_IO_FILE *) __THROW;
|
||||
extern void _IO_wdefault_finish_internal (_IO_FILE *, int) __THROW;
|
||||
extern wint_t _IO_wdefault_pbackfail_internal (_IO_FILE *, wint_t) __THROW;
|
||||
extern _IO_size_t _IO_wdefault_xsputn_internal (_IO_FILE *, const void *,
|
||||
_IO_size_t);
|
||||
extern _IO_size_t _IO_wdefault_xsgetn_internal (_IO_FILE *, void *,
|
||||
_IO_size_t);
|
||||
extern int _IO_wdefault_doallocate_internal (_IO_FILE *) __THROW;
|
||||
extern wint_t _IO_wdefault_uflow_internal (_IO_FILE *);
|
||||
|
||||
extern int _IO_file_doallocate_internal (_IO_FILE *) __THROW;
|
||||
extern _IO_FILE* _IO_file_setbuf_internal (_IO_FILE *, char *, _IO_ssize_t);
|
||||
extern _IO_off64_t _IO_file_seekoff_internal (_IO_FILE *, _IO_off64_t,
|
||||
int, int);
|
||||
extern _IO_size_t _IO_file_xsputn_internal (_IO_FILE *, const void *,
|
||||
_IO_size_t);
|
||||
extern _IO_size_t _IO_file_xsgetn_internal (_IO_FILE *, void *, _IO_size_t);
|
||||
extern int _IO_file_stat_internal (_IO_FILE *, void *) __THROW;
|
||||
extern int _IO_file_close_internal (_IO_FILE *) __THROW;
|
||||
extern int _IO_file_close_it_internal (_IO_FILE *);
|
||||
extern int _IO_file_underflow_internal (_IO_FILE *);
|
||||
extern int _IO_file_overflow_internal (_IO_FILE *, int);
|
||||
extern void _IO_file_init_internal (struct _IO_FILE_plus *) __THROW;
|
||||
extern _IO_FILE* _IO_file_attach_internal (_IO_FILE *, int);
|
||||
extern _IO_FILE* _IO_file_fopen_internal (_IO_FILE *, const char *,
|
||||
const char *, int);
|
||||
extern _IO_ssize_t _IO_file_read_internal (_IO_FILE *, void *,
|
||||
_IO_ssize_t);
|
||||
extern int _IO_file_sync_internal (_IO_FILE *);
|
||||
extern _IO_off64_t _IO_file_seek_internal (_IO_FILE *, _IO_off64_t, int)
|
||||
__THROW;
|
||||
extern void _IO_file_finish_internal (_IO_FILE *, int);
|
||||
|
||||
extern _IO_size_t _IO_wfile_xsputn_internal (_IO_FILE *, const void *,
|
||||
_IO_size_t);
|
||||
extern _IO_off64_t _IO_wfile_seekoff_internal (_IO_FILE *, _IO_off64_t,
|
||||
int, int);
|
||||
extern wint_t _IO_wfile_sync_internal (_IO_FILE *);
|
||||
|
||||
extern int _IO_str_underflow_internal (_IO_FILE *) __THROW;
|
||||
extern int _IO_str_overflow_internal (_IO_FILE *, int) __THROW;
|
||||
extern int _IO_str_pbackfail_internal (_IO_FILE *, int) __THROW;
|
||||
extern _IO_off64_t _IO_str_seekoff_internal (_IO_FILE *, _IO_off64_t,
|
||||
int, int) __THROW;
|
||||
extern void _IO_str_init_static_internal (struct _IO_strfile_ *, char *,
|
||||
_IO_size_t, char *) __THROW;
|
||||
|
||||
extern struct _IO_jump_t _IO_file_jumps_internal attribute_hidden;
|
||||
extern struct _IO_jump_t _IO_wfile_jumps_internal attribute_hidden;
|
||||
|
||||
extern struct _IO_FILE_plus *_IO_list_all_internal attribute_hidden;
|
||||
|
||||
extern void _IO_link_in_internal (struct _IO_FILE_plus *) __THROW;
|
||||
extern int _IO_sputbackc_internal (_IO_FILE *, int) __THROW;
|
||||
extern void _IO_wdoallocbuf_internal (_IO_FILE *) __THROW;
|
||||
|
||||
extern _IO_size_t _IO_sgetn_internal (_IO_FILE *, void *, _IO_size_t);
|
||||
extern void _IO_flush_all_linebuffered_internal (void) __THROW;
|
||||
extern int _IO_switch_to_wget_mode_internal (_IO_FILE *);
|
||||
extern void _IO_unsave_markers_internal (_IO_FILE *) __THROW;
|
||||
extern void _IO_switch_to_main_wget_area_internal (_IO_FILE *) __THROW;
|
||||
extern int _IO_wdo_write_internal (_IO_FILE *, const wchar_t *, _IO_size_t);
|
||||
extern int _IO_do_write_internal (_IO_FILE *, const char *, _IO_size_t);
|
||||
extern _IO_ssize_t _IO_padn_internal (_IO_FILE *, int, _IO_ssize_t);
|
||||
extern _IO_size_t _IO_getline_info_internal (_IO_FILE *,char *, _IO_size_t,
|
||||
int, int, int *);
|
||||
extern _IO_size_t _IO_getline_internal (_IO_FILE *, char *, _IO_size_t, int,
|
||||
int);
|
||||
extern void _IO_free_wbackup_area_internal (_IO_FILE *) __THROW;
|
||||
extern void _IO_free_backup_area_internal (_IO_FILE *) __THROW;
|
||||
extern void _IO_switch_to_wbackup_area_internal (_IO_FILE *) __THROW;
|
||||
extern void _IO_setb_internal (_IO_FILE *, char *, char *, int) __THROW;
|
||||
extern wint_t _IO_sputbackwc_internal (_IO_FILE *, wint_t) __THROW;
|
||||
extern int _IO_switch_to_get_mode_internal (_IO_FILE *);
|
||||
extern int _IO_vfscanf_internal (_IO_FILE * __restrict,
|
||||
const char * __restrict,
|
||||
_IO_va_list, int *__restrict);
|
||||
extern int _IO_vfprintf_internal (_IO_FILE *__restrict, const char *__restrict,
|
||||
_IO_va_list);
|
||||
extern void _IO_doallocbuf_internal (_IO_FILE *) __THROW;
|
||||
extern void _IO_wsetb_internal (_IO_FILE *, wchar_t *, wchar_t *, int)
|
||||
__THROW;
|
||||
extern _IO_off64_t _IO_seekoff_unlocked (_IO_FILE *, _IO_off64_t, int, int)
|
||||
attribute_hidden;
|
||||
extern _IO_off64_t _IO_seekpos_unlocked (_IO_FILE *, _IO_off64_t, int)
|
||||
attribute_hidden;
|
||||
extern int _IO_putc_internal (int __c, _IO_FILE *__fp);
|
||||
extern void _IO_init_internal (_IO_FILE *, int) __THROW;
|
||||
extern void _IO_un_link_internal (struct _IO_FILE_plus *) __THROW;
|
||||
|
||||
#ifndef EOF
|
||||
# define EOF (-1)
|
||||
|
||||
Reference in New Issue
Block a user