1
0
mirror of https://https.git.savannah.gnu.org/git/gnulib.git synced 2026-09-01 02:34:55 +00:00

Don't assume that UNICODE is not defined.

Many Windows API functions are defined differently (redirecting to a
function with suffix 'W') if the application defines the macro UNICODE
than by default (redirecting to a function with suffix 'A').

* lib/clean-temp.c (OSVERSIONINFO, GetVersionEx): Redirect to the
variant with suffix 'A'.
* lib/dirent-private.h (WIN32_FIND_DATA): Likewise.
* lib/gc-gnulib.c (CryptAcquireContext): Likewise.
* lib/getaddrinfo.c (GetModuleHandle): Likewise.
* lib/getlogin.c (GetUserName): Likewise.
* lib/getlogin_r.c (GetUserName): Likewise.
* lib/gettimeofday.c (LoadLibrary): Likewise.
* lib/isatty.c (LoadLibrary, QueryFullProcessImageName): Likewise.
* lib/link.c (GetModuleHandle, CreateHardLink): Likewise.
* lib/localename.c (GetLocaleInfo, EnumSystemLocales): Likewise.
* lib/mountlist.c (GetDriveType): Likewise.
* lib/nonblocking.c (GetNamedPipeHandleState): Likewise.
* lib/opendir.c (WIN32_FIND_DATA, GetFullPathName, FindFirstFile):
Likewise.
* lib/physmem.c (GetModuleHandle): Likewise.
* lib/poll.c (GetModuleHandle, PeekConsoleInput, CreateEvent,
PeekMessage, DispatchMessage): Likewise.
* lib/progreloc.c (GetModuleFileName): Likewise.
* lib/putenv.c (SetEnvironmentVariable): Likewise.
* lib/read.c (GetNamedPipeHandleState): Likewise.
* lib/readdir.c (FindNextFile): Likewise.
* lib/relocatable.c (GetModuleFileName): Likewise.
* lib/rename.c (MoveFileEx): Likewise.
* lib/rewinddir.c (FindFirstFile): Likewise.
* lib/select.c (GetModuleHandle, PeekConsoleInput, CreateEvent,
PeekMessage, DispatchMessage): Likewise.
* lib/sethostname.c (GetComputerNameEx, SetComputerNameEx): Likewise.
* lib/socket.c (WSASocket): Likewise.
* lib/stat-w32.c (LoadLibrary, GetFinalPathNameByHandle): Likewise.
* lib/stat.c (WIN32_FIND_DATA, CreateFile, FindFirstFile): Likewise.
* lib/stdio-read.c (GetNamedPipeHandleState): Likewise.
* lib/stdio-write.c (GetNamedPipeHandleState): Likewise.
* lib/tmpdir.c (GetTempPath): Likewise.
* lib/tmpfile.c (OSVERSIONINFO, GetVersionEx, GetTempPath): Likewise.
* lib/uname.c (OSVERSIONINFO, GetVersionEx): Likewise.
* lib/utime.c (CreateFile, GetFileAttributes): Likewise.
* lib/windows-cond.c (CreateEvent): Likewise.
* lib/windows-rwlock.c (CreateEvent): Likewise.
* lib/windows-timedmutex.c (CreateEvent): Likewise.
* lib/windows-timedrecmutex.c (CreateEvent): Likewise.
* lib/windows-timedrwlock.c (CreateEvent): Likewise.
* lib/write.c (GetNamedPipeHandleState): Likewise.
This commit is contained in:
Bruno Haible
2020-05-30 11:04:02 +02:00
parent 4bc0be55d6
commit 57f80070cc
40 changed files with 279 additions and 27 deletions
+50
View File
@@ -1,3 +1,53 @@
2020-05-30 Bruno Haible <bruno@clisp.org>
Don't assume that UNICODE is not defined.
Many Windows API functions are defined differently (redirecting to a
function with suffix 'W') if the application defines the macro UNICODE
than by default (redirecting to a function with suffix 'A').
* lib/clean-temp.c (OSVERSIONINFO, GetVersionEx): Redirect to the
variant with suffix 'A'.
* lib/dirent-private.h (WIN32_FIND_DATA): Likewise.
* lib/gc-gnulib.c (CryptAcquireContext): Likewise.
* lib/getaddrinfo.c (GetModuleHandle): Likewise.
* lib/getlogin.c (GetUserName): Likewise.
* lib/getlogin_r.c (GetUserName): Likewise.
* lib/gettimeofday.c (LoadLibrary): Likewise.
* lib/isatty.c (LoadLibrary, QueryFullProcessImageName): Likewise.
* lib/link.c (GetModuleHandle, CreateHardLink): Likewise.
* lib/localename.c (GetLocaleInfo, EnumSystemLocales): Likewise.
* lib/mountlist.c (GetDriveType): Likewise.
* lib/nonblocking.c (GetNamedPipeHandleState): Likewise.
* lib/opendir.c (WIN32_FIND_DATA, GetFullPathName, FindFirstFile):
Likewise.
* lib/physmem.c (GetModuleHandle): Likewise.
* lib/poll.c (GetModuleHandle, PeekConsoleInput, CreateEvent,
PeekMessage, DispatchMessage): Likewise.
* lib/progreloc.c (GetModuleFileName): Likewise.
* lib/putenv.c (SetEnvironmentVariable): Likewise.
* lib/read.c (GetNamedPipeHandleState): Likewise.
* lib/readdir.c (FindNextFile): Likewise.
* lib/relocatable.c (GetModuleFileName): Likewise.
* lib/rename.c (MoveFileEx): Likewise.
* lib/rewinddir.c (FindFirstFile): Likewise.
* lib/select.c (GetModuleHandle, PeekConsoleInput, CreateEvent,
PeekMessage, DispatchMessage): Likewise.
* lib/sethostname.c (GetComputerNameEx, SetComputerNameEx): Likewise.
* lib/socket.c (WSASocket): Likewise.
* lib/stat-w32.c (LoadLibrary, GetFinalPathNameByHandle): Likewise.
* lib/stat.c (WIN32_FIND_DATA, CreateFile, FindFirstFile): Likewise.
* lib/stdio-read.c (GetNamedPipeHandleState): Likewise.
* lib/stdio-write.c (GetNamedPipeHandleState): Likewise.
* lib/tmpdir.c (GetTempPath): Likewise.
* lib/tmpfile.c (OSVERSIONINFO, GetVersionEx, GetTempPath): Likewise.
* lib/uname.c (OSVERSIONINFO, GetVersionEx): Likewise.
* lib/utime.c (CreateFile, GetFileAttributes): Likewise.
* lib/windows-cond.c (CreateEvent): Likewise.
* lib/windows-rwlock.c (CreateEvent): Likewise.
* lib/windows-timedmutex.c (CreateEvent): Likewise.
* lib/windows-timedrecmutex.c (CreateEvent): Likewise.
* lib/windows-timedrwlock.c (CreateEvent): Likewise.
* lib/write.c (GetNamedPipeHandleState): Likewise.
2020-05-30 Bruno Haible <bruno@clisp.org>
physmem: Fix compilation errors on MSVC.
+8
View File
@@ -66,6 +66,14 @@
# define PATH_MAX 1024
#endif
#if defined _WIN32 && ! defined __CYGWIN__
/* Don't assume that UNICODE is not defined. */
# undef OSVERSIONINFO
# define OSVERSIONINFO OSVERSIONINFOA
# undef GetVersionEx
# define GetVersionEx GetVersionExA
#endif
/* The use of 'volatile' in the types below (and ISO C 99 section 5.1.2.3.(5))
ensure that while constructing or modifying the data structures, the field
+4
View File
@@ -20,6 +20,10 @@
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
/* Don't assume that UNICODE is not defined. */
#undef WIN32_FIND_DATA
#define WIN32_FIND_DATA WIN32_FIND_DATAA
struct gl_directory
{
/* Status, or error code to produce in next readdir() call.
+6
View File
@@ -89,6 +89,12 @@ HCRYPTPROV g_hProv = 0;
# endif
#endif
#if defined _WIN32 && ! defined __CYGWIN__
/* Don't assume that UNICODE is not defined. */
# undef CryptAcquireContext
# define CryptAcquireContext CryptAcquireContextA
#endif
Gc_rc
gc_init (void)
{
+4
View File
@@ -86,6 +86,10 @@ freeaddrinfo (struct addrinfo *ai)
# ifdef WINDOWS_NATIVE
/* Don't assume that UNICODE is not defined. */
# undef GetModuleHandle
# define GetModuleHandle GetModuleHandleA
# if !(_WIN32_WINNT >= _WIN32_WINNT_WINXP)
/* Avoid warnings from gcc -Wcast-function-type. */
+3
View File
@@ -25,6 +25,9 @@
#if defined _WIN32 && ! defined __CYGWIN__
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
/* Don't assume that UNICODE is not defined. */
# undef GetUserName
# define GetUserName GetUserNameA
#endif
char *
+3
View File
@@ -30,6 +30,9 @@
#if defined _WIN32 && ! defined __CYGWIN__
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
/* Don't assume that UNICODE is not defined. */
# undef GetUserName
# define GetUserName GetUserNameA
#else
# if !HAVE_DECL_GETLOGIN
extern char *getlogin (void);
+4
View File
@@ -33,6 +33,10 @@
#ifdef WINDOWS_NATIVE
/* Don't assume that UNICODE is not defined. */
# undef LoadLibrary
# define LoadLibrary LoadLibraryA
# if !(_WIN32_WINNT >= _WIN32_WINNT_WIN8)
/* Avoid warnings from gcc -Wcast-function-type. */
+6
View File
@@ -39,6 +39,12 @@
# include <io.h>
#endif
/* Don't assume that UNICODE is not defined. */
#undef LoadLibrary
#define LoadLibrary LoadLibraryA
#undef QueryFullProcessImageName
#define QueryFullProcessImageName QueryFullProcessImageNameA
#if !(_WIN32_WINNT >= _WIN32_WINNT_VISTA)
/* Avoid warnings from gcc -Wcast-function-type. */
+6
View File
@@ -30,6 +30,12 @@
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
/* Don't assume that UNICODE is not defined. */
# undef GetModuleHandle
# define GetModuleHandle GetModuleHandleA
# undef CreateHardLink
# define CreateHardLink CreateHardLinkA
# if !(_WIN32_WINNT >= _WIN32_WINNT_WINXP)
/* Avoid warnings from gcc -Wcast-function-type. */
+5
View File
@@ -1150,6 +1150,11 @@ extern char * getlocalename_l(int, locale_t);
# ifndef LOCALE_NAME_MAX_LENGTH
# define LOCALE_NAME_MAX_LENGTH 85
# endif
/* Don't assume that UNICODE is not defined. */
# undef GetLocaleInfo
# define GetLocaleInfo GetLocaleInfoA
# undef EnumSystemLocales
# define EnumSystemLocales EnumSystemLocalesA
#endif
/* We want to use the system's setlocale() function here, not the gnulib
+3
View File
@@ -195,6 +195,9 @@
#ifdef __CYGWIN__
# include <windows.h>
/* Don't assume that UNICODE is not defined. */
# undef GetDriveType
# define GetDriveType GetDriveTypeA
# define ME_REMOTE me_remote
/* All cygwin mount points include ':' or start with '//'; so it
requires a native Windows call to determine remote disks. */
+4
View File
@@ -38,6 +38,10 @@
# include <io.h>
# endif
/* Don't assume that UNICODE is not defined. */
# undef GetNamedPipeHandleState
# define GetNamedPipeHandleState GetNamedPipeHandleStateA
int
get_nonblocking_flag (int desc)
{
+10
View File
@@ -45,6 +45,16 @@
# include <fcntl.h>
#endif
#if defined _WIN32 && ! defined __CYGWIN__
/* Don't assume that UNICODE is not defined. */
# undef WIN32_FIND_DATA
# define WIN32_FIND_DATA WIN32_FIND_DATAA
# undef GetFullPathName
# define GetFullPathName GetFullPathNameA
# undef FindFirstFile
# define FindFirstFile FindFirstFileA
#endif
DIR *
opendir (const char *dir_name)
{
+4
View File
@@ -63,6 +63,10 @@
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
/* Don't assume that UNICODE is not defined. */
# undef GetModuleHandle
# define GetModuleHandle GetModuleHandleA
/* Avoid warnings from gcc -Wcast-function-type. */
# define GetProcAddress \
(void *) GetProcAddress
+12
View File
@@ -76,6 +76,18 @@
#ifdef WINDOWS_NATIVE
/* Don't assume that UNICODE is not defined. */
# undef GetModuleHandle
# define GetModuleHandle GetModuleHandleA
# undef PeekConsoleInput
# define PeekConsoleInput PeekConsoleInputA
# undef CreateEvent
# define CreateEvent CreateEventA
# undef PeekMessage
# define PeekMessage PeekMessageA
# undef DispatchMessage
# define DispatchMessage DispatchMessageA
/* Do *not* use the function WSAPoll
<https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-wsapoll>
because there is a bug named “Windows 8 Bugs 309411 - WSAPoll does not
+6
View File
@@ -80,6 +80,12 @@
one. */
extern char * canonicalize_file_name (const char *name);
#if defined WINDOWS_NATIVE
/* Don't assume that UNICODE is not defined. */
# undef GetModuleFileName
# define GetModuleFileName GetModuleFileNameA
#endif
/* Pathname support.
ISSLASH(C) tests whether C is a directory separator character.
IS_FILE_NAME_WITH_DIR(P) tests whether P contains a directory specification.
+6
View File
@@ -58,6 +58,12 @@ __libc_lock_define_initialized (static, envlock)
# define UNLOCK
#endif
#if defined _WIN32 && ! defined __CYGWIN__
/* Don't assume that UNICODE is not defined. */
# undef SetEnvironmentVariable
# define SetEnvironmentVariable SetEnvironmentVariableA
#endif
static int
_unsetenv (const char *name)
{
+4
View File
@@ -37,6 +37,10 @@
# include <io.h>
# endif
/* Don't assume that UNICODE is not defined. */
# undef GetNamedPipeHandleState
# define GetNamedPipeHandleState GetNamedPipeHandleStateA
# undef read
# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+4
View File
@@ -24,6 +24,10 @@
#include "dirent-private.h"
/* Don't assume that UNICODE is not defined. */
#undef FindNextFile
#define FindNextFile FindNextFileA
struct dirent *
readdir (DIR *dirp)
{
+6
View File
@@ -65,6 +65,12 @@
# include <libintl.h>
#endif
#if defined _WIN32 && !defined __CYGWIN__
/* Don't assume that UNICODE is not defined. */
# undef GetModuleFileName
# define GetModuleFileName GetModuleFileNameA
#endif
/* Faked cheap 'bool'. */
#undef bool
#undef false
+4
View File
@@ -39,6 +39,10 @@
# include "dirname.h"
/* Don't assume that UNICODE is not defined. */
# undef MoveFileEx
# define MoveFileEx MoveFileExA
/* Rename the file SRC to DST. This replacement is necessary on
Windows, on which the system rename function will not replace
an existing DST. */
+4
View File
@@ -23,6 +23,10 @@
#include "dirent-private.h"
/* Don't assume that UNICODE is not defined. */
#undef FindFirstFile
#define FindFirstFile FindFirstFileA
void
rewinddir (DIR *dirp)
{
+12
View File
@@ -47,6 +47,18 @@
#undef select
/* Don't assume that UNICODE is not defined. */
#undef GetModuleHandle
#define GetModuleHandle GetModuleHandleA
#undef PeekConsoleInput
#define PeekConsoleInput PeekConsoleInputA
#undef CreateEvent
#define CreateEvent CreateEventA
#undef PeekMessage
#define PeekMessage PeekMessageA
#undef DispatchMessage
#define DispatchMessage DispatchMessageA
/* Avoid warnings from gcc -Wcast-function-type. */
#define GetProcAddress \
(void *) GetProcAddress
+6 -7
View File
@@ -103,13 +103,12 @@ sethostname (const char *name, size_t len)
# include <string.h>
# include <windows.h>
/* The mingw header files don't define GetComputerNameEx, SetComputerNameEx. */
# ifndef GetComputerNameEx
# define GetComputerNameEx GetComputerNameExA
# endif
# ifndef SetComputerNameEx
# define SetComputerNameEx SetComputerNameExA
# endif
/* Don't assume that UNICODE is not defined. */
# undef GetComputerNameEx
# define GetComputerNameEx GetComputerNameExA
# undef SetComputerNameEx
# define SetComputerNameEx SetComputerNameExA
/* Set up to LEN chars of NAME as system hostname.
Return 0 if ok, set errno and return -1 on error. */
+4
View File
@@ -28,6 +28,10 @@
#include "sockets.h"
/* Don't assume that UNICODE is not defined. */
#undef WSASocket
#define WSASocket WSASocketA
int
rpl_socket (int domain, int type, int protocol)
{
+6
View File
@@ -40,6 +40,12 @@
#include "pathmax.h"
#include "verify.h"
/* Don't assume that UNICODE is not defined. */
#undef LoadLibrary
#define LoadLibrary LoadLibraryA
#undef GetFinalPathNameByHandle
#define GetFinalPathNameByHandle GetFinalPathNameByHandleA
#if !(_WIN32_WINNT >= _WIN32_WINNT_VISTA)
/* Avoid warnings from gcc -Wcast-function-type. */
+7
View File
@@ -65,6 +65,13 @@ orig_stat (const char *filename, struct stat *buf)
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
# include "stat-w32.h"
/* Don't assume that UNICODE is not defined. */
# undef WIN32_FIND_DATA
# define WIN32_FIND_DATA WIN32_FIND_DATAA
# undef CreateFile
# define CreateFile CreateFileA
# undef FindFirstFile
# define FindFirstFile FindFirstFileA
#endif
#ifdef WINDOWS_NATIVE
+4
View File
@@ -43,6 +43,10 @@
# include <io.h>
# endif
/* Don't assume that UNICODE is not defined. */
# undef GetNamedPipeHandleState
# define GetNamedPipeHandleState GetNamedPipeHandleStateA
# define CALL_WITH_ERRNO_FIX(RETTYPE, EXPRESSION, FAILED) \
if (ferror (stream)) \
return (EXPRESSION); \
+4
View File
@@ -45,6 +45,10 @@
# include <io.h>
# endif
/* Don't assume that UNICODE is not defined. */
# undef GetNamedPipeHandleState
# define GetNamedPipeHandleState GetNamedPipeHandleStateA
# if GNULIB_NONBLOCKING
# define CLEAR_ERRNO \
errno = 0;
+6
View File
@@ -49,6 +49,12 @@
#include "pathmax.h"
#if defined _WIN32 && ! defined __CYGWIN__
/* Don't assume that UNICODE is not defined. */
# undef GetTempPath
# define GetTempPath GetTempPathA
#endif
#if _LIBC
# define struct_stat64 struct stat64
#else
+8
View File
@@ -52,6 +52,14 @@
#if defined _WIN32 && ! defined __CYGWIN__
/* A native Windows platforms. */
/* Don't assume that UNICODE is not defined. */
# undef OSVERSIONINFO
# define OSVERSIONINFO OSVERSIONINFOA
# undef GetVersionEx
# define GetVersionEx GetVersionExA
# undef GetTempPath
# define GetTempPath GetTempPathA
/* On Windows, opening a file with _O_TEMPORARY has the effect of passing
the FILE_FLAG_DELETE_ON_CLOSE flag to CreateFile(), which has the effect
of deleting the file when it is closed - even when the program crashes.
+26 -20
View File
@@ -22,29 +22,35 @@
/* This file provides an implementation only for the native Windows API. */
#if defined _WIN32 && ! defined __CYGWIN__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <windows.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <unistd.h>
# include <windows.h>
/* Mingw headers don't have all the platform codes. */
#ifndef VER_PLATFORM_WIN32_CE
# define VER_PLATFORM_WIN32_CE 3
#endif
# ifndef VER_PLATFORM_WIN32_CE
# define VER_PLATFORM_WIN32_CE 3
# endif
/* Some headers don't have all the processor architecture codes. */
#ifndef PROCESSOR_ARCHITECTURE_AMD64
# define PROCESSOR_ARCHITECTURE_AMD64 9
#endif
#ifndef PROCESSOR_ARCHITECTURE_IA32_ON_WIN64
# define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10
#endif
# ifndef PROCESSOR_ARCHITECTURE_AMD64
# define PROCESSOR_ARCHITECTURE_AMD64 9
# endif
# ifndef PROCESSOR_ARCHITECTURE_IA32_ON_WIN64
# define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10
# endif
/* Mingw headers don't have the latest processor codes. */
#ifndef PROCESSOR_AMD_X8664
# define PROCESSOR_AMD_X8664 8664
#endif
# ifndef PROCESSOR_AMD_X8664
# define PROCESSOR_AMD_X8664 8664
# endif
/* Don't assume that UNICODE is not defined. */
# undef OSVERSIONINFO
# define OSVERSIONINFO OSVERSIONINFOA
# undef GetVersionEx
# define GetVersionEx GetVersionExA
int
uname (struct utsname *buf)
@@ -108,7 +114,7 @@ uname (struct utsname *buf)
super_version = "";
/* Fill in sysname. */
#ifdef __MINGW32__
# ifdef __MINGW32__
/* Returns a string compatible with the MSYS uname.exe program,
so that no further changes are needed to GNU config.guess.
For example,
@@ -117,9 +123,9 @@ uname (struct utsname *buf)
sprintf (buf->sysname, "MINGW32_%s-%u.%u", super_version,
(unsigned int) version.dwMajorVersion,
(unsigned int) version.dwMinorVersion);
#else
# else
sprintf (buf->sysname, "Windows%s", super_version);
#endif
# endif
/* Fill in release, version. */
/* The MSYS uname.exe programs uses strings from a modified Cygwin runtime:
+6
View File
@@ -29,6 +29,12 @@
# include "filename.h"
# include "malloca.h"
/* Don't assume that UNICODE is not defined. */
# undef CreateFile
# define CreateFile CreateFileA
# undef GetFileAttributes
# define GetFileAttributes GetFileAttributesA
int
_gl_utimens_windows (const char *name, struct timespec ts[2])
{
+4
View File
@@ -27,6 +27,10 @@
#include <stdlib.h>
#include <sys/time.h>
/* Don't assume that UNICODE is not defined. */
#undef CreateEvent
#define CreateEvent CreateEventA
/* In this file, the waitqueues are implemented as linked lists. */
#define glwthread_waitqueue_t glwthread_linked_waitqueue_t
+4
View File
@@ -25,6 +25,10 @@
#include <errno.h>
#include <stdlib.h>
/* Don't assume that UNICODE is not defined. */
#undef CreateEvent
#define CreateEvent CreateEventA
/* In this file, the waitqueues are implemented as circular arrays. */
#define glwthread_waitqueue_t glwthread_carray_waitqueue_t
+4
View File
@@ -26,6 +26,10 @@
#include <stdlib.h>
#include <sys/time.h>
/* Don't assume that UNICODE is not defined. */
#undef CreateEvent
#define CreateEvent CreateEventA
int
glwthread_timedmutex_init (glwthread_timedmutex_t *mutex)
{
+4
View File
@@ -26,6 +26,10 @@
#include <stdlib.h>
#include <sys/time.h>
/* Don't assume that UNICODE is not defined. */
#undef CreateEvent
#define CreateEvent CreateEventA
int
glwthread_timedrecmutex_init (glwthread_timedrecmutex_t *mutex)
{
+4
View File
@@ -26,6 +26,10 @@
#include <stdlib.h>
#include <sys/time.h>
/* Don't assume that UNICODE is not defined. */
#undef CreateEvent
#define CreateEvent CreateEventA
/* In this file, the waitqueues are implemented as linked lists. */
#define glwthread_waitqueue_t glwthread_clinked_waitqueue_t
+4
View File
@@ -43,6 +43,10 @@
# include <io.h>
# endif
/* Don't assume that UNICODE is not defined. */
# undef GetNamedPipeHandleState
# define GetNamedPipeHandleState GetNamedPipeHandleStateA
# undef write
# if HAVE_MSVC_INVALID_PARAMETER_HANDLER