dmenu: removing stest
This commit is contained in:
@@ -1,30 +0,0 @@
|
|||||||
MIT/X Consortium License
|
|
||||||
|
|
||||||
© 2006-2019 Anselm R Garbe <anselm@garbe.ca>
|
|
||||||
© 2006-2008 Sander van Dijk <a.h.vandijk@gmail.com>
|
|
||||||
© 2006-2007 Michał Janeczek <janeczek@gmail.com>
|
|
||||||
© 2007 Kris Maglione <jg@suckless.org>
|
|
||||||
© 2009 Gottox <gottox@s01.de>
|
|
||||||
© 2009 Markus Schnalke <meillo@marmaro.de>
|
|
||||||
© 2009 Evan Gates <evan.gates@gmail.com>
|
|
||||||
© 2010-2012 Connor Lane Smith <cls@lubutu.com>
|
|
||||||
© 2014-2022 Hiltjo Posthuma <hiltjo@codemadness.org>
|
|
||||||
© 2015-2019 Quentin Rameau <quinq@fifth.space>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
copy of this software and associated documentation files (the "Software"),
|
|
||||||
to deal in the Software without restriction, including without limitation
|
|
||||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
and/or sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
DEALINGS IN THE SOFTWARE.
|
|
||||||
@@ -3,10 +3,10 @@
|
|||||||
|
|
||||||
include config.mk
|
include config.mk
|
||||||
|
|
||||||
SRC = drw.c dmenu.c stest.c util.c
|
SRC = drw.c dmenu.c util.c
|
||||||
OBJ = $(SRC:.c=.o)
|
OBJ = $(SRC:.c=.o)
|
||||||
|
|
||||||
all: dmenu stest
|
all: dmenu
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$(CC) -c $(CFLAGS) $<
|
$(CC) -c $(CFLAGS) $<
|
||||||
@@ -19,40 +19,17 @@ $(OBJ): arg.h config.h config.mk drw.h
|
|||||||
dmenu: dmenu.o drw.o util.o
|
dmenu: dmenu.o drw.o util.o
|
||||||
$(CC) -o $@ dmenu.o drw.o util.o $(LDFLAGS)
|
$(CC) -o $@ dmenu.o drw.o util.o $(LDFLAGS)
|
||||||
|
|
||||||
stest: stest.o
|
|
||||||
$(CC) -o $@ stest.o $(LDFLAGS)
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f dmenu stest $(OBJ) dmenu-$(VERSION).tar.gz
|
rm -f dmenu $(OBJ)
|
||||||
|
|
||||||
dist: clean
|
install: dmenu
|
||||||
mkdir -p dmenu-$(VERSION)
|
|
||||||
cp LICENSE Makefile README arg.h config.def.h config.mk dmenu.1\
|
|
||||||
drw.h util.h dmenu_path dmenu_run stest.1 $(SRC)\
|
|
||||||
dmenu-$(VERSION)
|
|
||||||
tar -cf dmenu-$(VERSION).tar dmenu-$(VERSION)
|
|
||||||
gzip dmenu-$(VERSION).tar
|
|
||||||
rm -rf dmenu-$(VERSION)
|
|
||||||
|
|
||||||
install: all
|
|
||||||
mkdir -p $(DESTDIR)$(PREFIX)/bin
|
mkdir -p $(DESTDIR)$(PREFIX)/bin
|
||||||
cp -f dmenu dmenu_path dmenu_run stest $(DESTDIR)$(PREFIX)/bin
|
cp -f dmenu dmenu_path dmenu_run $(DESTDIR)$(PREFIX)/bin
|
||||||
chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu
|
chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu
|
||||||
chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_path
|
chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_path
|
||||||
chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_run
|
chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_run
|
||||||
chmod 755 $(DESTDIR)$(PREFIX)/bin/stest
|
|
||||||
mkdir -p $(DESTDIR)$(MANPREFIX)/man1
|
|
||||||
sed "s/VERSION/$(VERSION)/g" < dmenu.1 > $(DESTDIR)$(MANPREFIX)/man1/dmenu.1
|
|
||||||
sed "s/VERSION/$(VERSION)/g" < stest.1 > $(DESTDIR)$(MANPREFIX)/man1/stest.1
|
|
||||||
chmod 644 $(DESTDIR)$(MANPREFIX)/man1/dmenu.1
|
|
||||||
chmod 644 $(DESTDIR)$(MANPREFIX)/man1/stest.1
|
|
||||||
|
|
||||||
uninstall:
|
uninstall:
|
||||||
rm -f $(DESTDIR)$(PREFIX)/bin/dmenu\
|
rm -f $(DESTDIR)$(PREFIX)/bin/dmenu\
|
||||||
$(DESTDIR)$(PREFIX)/bin/dmenu_path\
|
$(DESTDIR)$(PREFIX)/bin/dmenu_path\
|
||||||
$(DESTDIR)$(PREFIX)/bin/dmenu_run\
|
$(DESTDIR)$(PREFIX)/bin/dmenu_run\
|
||||||
$(DESTDIR)$(PREFIX)/bin/stest\
|
|
||||||
$(DESTDIR)$(MANPREFIX)/man1/dmenu.1\
|
|
||||||
$(DESTDIR)$(MANPREFIX)/man1/stest.1
|
|
||||||
|
|
||||||
.PHONY: all clean dist install uninstall
|
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
dmenu - dynamic menu
|
|
||||||
====================
|
|
||||||
dmenu is an efficient dynamic menu for X.
|
|
||||||
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
------------
|
|
||||||
In order to build dmenu you need the Xlib header files.
|
|
||||||
|
|
||||||
|
|
||||||
Installation
|
|
||||||
------------
|
|
||||||
Edit config.mk to match your local setup (dmenu is installed into
|
|
||||||
the /usr/local namespace by default).
|
|
||||||
|
|
||||||
Afterwards enter the following command to build and install dmenu
|
|
||||||
(if necessary as root):
|
|
||||||
|
|
||||||
make clean install
|
|
||||||
|
|
||||||
|
|
||||||
Running dmenu
|
|
||||||
-------------
|
|
||||||
See the man page for details.
|
|
||||||
@@ -1,194 +0,0 @@
|
|||||||
.TH DMENU 1 dmenu\-VERSION
|
|
||||||
.SH NAME
|
|
||||||
dmenu \- dynamic menu
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B dmenu
|
|
||||||
.RB [ \-bfiv ]
|
|
||||||
.RB [ \-l
|
|
||||||
.IR lines ]
|
|
||||||
.RB [ \-m
|
|
||||||
.IR monitor ]
|
|
||||||
.RB [ \-p
|
|
||||||
.IR prompt ]
|
|
||||||
.RB [ \-fn
|
|
||||||
.IR font ]
|
|
||||||
.RB [ \-nb
|
|
||||||
.IR color ]
|
|
||||||
.RB [ \-nf
|
|
||||||
.IR color ]
|
|
||||||
.RB [ \-sb
|
|
||||||
.IR color ]
|
|
||||||
.RB [ \-sf
|
|
||||||
.IR color ]
|
|
||||||
.RB [ \-w
|
|
||||||
.IR windowid ]
|
|
||||||
.P
|
|
||||||
.BR dmenu_run " ..."
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.B dmenu
|
|
||||||
is a dynamic menu for X, which reads a list of newline\-separated items from
|
|
||||||
stdin. When the user selects an item and presses Return, their choice is printed
|
|
||||||
to stdout and dmenu terminates. Entering text will narrow the items to those
|
|
||||||
matching the tokens in the input.
|
|
||||||
.P
|
|
||||||
.B dmenu_run
|
|
||||||
is a script used by
|
|
||||||
.IR dwm (1)
|
|
||||||
which lists programs in the user's $PATH and runs the result in their $SHELL.
|
|
||||||
.SH OPTIONS
|
|
||||||
.TP
|
|
||||||
.B \-b
|
|
||||||
dmenu appears at the bottom of the screen.
|
|
||||||
.TP
|
|
||||||
.B \-f
|
|
||||||
dmenu grabs the keyboard before reading stdin if not reading from a tty. This
|
|
||||||
is faster, but will lock up X until stdin reaches end\-of\-file.
|
|
||||||
.TP
|
|
||||||
.B \-i
|
|
||||||
dmenu matches menu items case insensitively.
|
|
||||||
.TP
|
|
||||||
.BI \-l " lines"
|
|
||||||
dmenu lists items vertically, with the given number of lines.
|
|
||||||
.TP
|
|
||||||
.BI \-m " monitor"
|
|
||||||
dmenu is displayed on the monitor number supplied. Monitor numbers are starting
|
|
||||||
from 0.
|
|
||||||
.TP
|
|
||||||
.BI \-p " prompt"
|
|
||||||
defines the prompt to be displayed to the left of the input field.
|
|
||||||
.TP
|
|
||||||
.BI \-fn " font"
|
|
||||||
defines the font or font set used.
|
|
||||||
.TP
|
|
||||||
.BI \-nb " color"
|
|
||||||
defines the normal background color.
|
|
||||||
.IR #RGB ,
|
|
||||||
.IR #RRGGBB ,
|
|
||||||
and X color names are supported.
|
|
||||||
.TP
|
|
||||||
.BI \-nf " color"
|
|
||||||
defines the normal foreground color.
|
|
||||||
.TP
|
|
||||||
.BI \-sb " color"
|
|
||||||
defines the selected background color.
|
|
||||||
.TP
|
|
||||||
.BI \-sf " color"
|
|
||||||
defines the selected foreground color.
|
|
||||||
.TP
|
|
||||||
.B \-v
|
|
||||||
prints version information to stdout, then exits.
|
|
||||||
.TP
|
|
||||||
.BI \-w " windowid"
|
|
||||||
embed into windowid.
|
|
||||||
.SH USAGE
|
|
||||||
dmenu is completely controlled by the keyboard. Items are selected using the
|
|
||||||
arrow keys, page up, page down, home, and end.
|
|
||||||
.TP
|
|
||||||
.B Tab
|
|
||||||
Copy the selected item to the input field.
|
|
||||||
.TP
|
|
||||||
.B Return
|
|
||||||
Confirm selection. Prints the selected item to stdout and exits, returning
|
|
||||||
success.
|
|
||||||
.TP
|
|
||||||
.B Ctrl-Return
|
|
||||||
Confirm selection. Prints the selected item to stdout and continues.
|
|
||||||
.TP
|
|
||||||
.B Shift\-Return
|
|
||||||
Confirm input. Prints the input text to stdout and exits, returning success.
|
|
||||||
.TP
|
|
||||||
.B Escape
|
|
||||||
Exit without selecting an item, returning failure.
|
|
||||||
.TP
|
|
||||||
.B Ctrl-Left
|
|
||||||
Move cursor to the start of the current word
|
|
||||||
.TP
|
|
||||||
.B Ctrl-Right
|
|
||||||
Move cursor to the end of the current word
|
|
||||||
.TP
|
|
||||||
.B C\-a
|
|
||||||
Home
|
|
||||||
.TP
|
|
||||||
.B C\-b
|
|
||||||
Left
|
|
||||||
.TP
|
|
||||||
.B C\-c
|
|
||||||
Escape
|
|
||||||
.TP
|
|
||||||
.B C\-d
|
|
||||||
Delete
|
|
||||||
.TP
|
|
||||||
.B C\-e
|
|
||||||
End
|
|
||||||
.TP
|
|
||||||
.B C\-f
|
|
||||||
Right
|
|
||||||
.TP
|
|
||||||
.B C\-g
|
|
||||||
Escape
|
|
||||||
.TP
|
|
||||||
.B C\-h
|
|
||||||
Backspace
|
|
||||||
.TP
|
|
||||||
.B C\-i
|
|
||||||
Tab
|
|
||||||
.TP
|
|
||||||
.B C\-j
|
|
||||||
Return
|
|
||||||
.TP
|
|
||||||
.B C\-J
|
|
||||||
Shift-Return
|
|
||||||
.TP
|
|
||||||
.B C\-k
|
|
||||||
Delete line right
|
|
||||||
.TP
|
|
||||||
.B C\-m
|
|
||||||
Return
|
|
||||||
.TP
|
|
||||||
.B C\-M
|
|
||||||
Shift-Return
|
|
||||||
.TP
|
|
||||||
.B C\-n
|
|
||||||
Down
|
|
||||||
.TP
|
|
||||||
.B C\-p
|
|
||||||
Up
|
|
||||||
.TP
|
|
||||||
.B C\-u
|
|
||||||
Delete line left
|
|
||||||
.TP
|
|
||||||
.B C\-w
|
|
||||||
Delete word left
|
|
||||||
.TP
|
|
||||||
.B C\-y
|
|
||||||
Paste from primary X selection
|
|
||||||
.TP
|
|
||||||
.B C\-Y
|
|
||||||
Paste from X clipboard
|
|
||||||
.TP
|
|
||||||
.B M\-b
|
|
||||||
Move cursor to the start of the current word
|
|
||||||
.TP
|
|
||||||
.B M\-f
|
|
||||||
Move cursor to the end of the current word
|
|
||||||
.TP
|
|
||||||
.B M\-g
|
|
||||||
Home
|
|
||||||
.TP
|
|
||||||
.B M\-G
|
|
||||||
End
|
|
||||||
.TP
|
|
||||||
.B M\-h
|
|
||||||
Up
|
|
||||||
.TP
|
|
||||||
.B M\-j
|
|
||||||
Page down
|
|
||||||
.TP
|
|
||||||
.B M\-k
|
|
||||||
Page up
|
|
||||||
.TP
|
|
||||||
.B M\-l
|
|
||||||
Down
|
|
||||||
.SH SEE ALSO
|
|
||||||
.IR dwm (1),
|
|
||||||
.IR stest (1)
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
.TH STEST 1 dmenu\-VERSION
|
|
||||||
.SH NAME
|
|
||||||
stest \- filter a list of files by properties
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B stest
|
|
||||||
.RB [ -abcdefghlpqrsuwx ]
|
|
||||||
.RB [ -n
|
|
||||||
.IR file ]
|
|
||||||
.RB [ -o
|
|
||||||
.IR file ]
|
|
||||||
.RI [ file ...]
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.B stest
|
|
||||||
takes a list of files and filters by the files' properties, analogous to
|
|
||||||
.IR test (1).
|
|
||||||
Files which pass all tests are printed to stdout. If no files are given, stest
|
|
||||||
reads files from stdin.
|
|
||||||
.SH OPTIONS
|
|
||||||
.TP
|
|
||||||
.B \-a
|
|
||||||
Test hidden files.
|
|
||||||
.TP
|
|
||||||
.B \-b
|
|
||||||
Test that files are block specials.
|
|
||||||
.TP
|
|
||||||
.B \-c
|
|
||||||
Test that files are character specials.
|
|
||||||
.TP
|
|
||||||
.B \-d
|
|
||||||
Test that files are directories.
|
|
||||||
.TP
|
|
||||||
.B \-e
|
|
||||||
Test that files exist.
|
|
||||||
.TP
|
|
||||||
.B \-f
|
|
||||||
Test that files are regular files.
|
|
||||||
.TP
|
|
||||||
.B \-g
|
|
||||||
Test that files have their set-group-ID flag set.
|
|
||||||
.TP
|
|
||||||
.B \-h
|
|
||||||
Test that files are symbolic links.
|
|
||||||
.TP
|
|
||||||
.B \-l
|
|
||||||
Test the contents of a directory given as an argument.
|
|
||||||
.TP
|
|
||||||
.BI \-n " file"
|
|
||||||
Test that files are newer than
|
|
||||||
.IR file .
|
|
||||||
.TP
|
|
||||||
.BI \-o " file"
|
|
||||||
Test that files are older than
|
|
||||||
.IR file .
|
|
||||||
.TP
|
|
||||||
.B \-p
|
|
||||||
Test that files are named pipes.
|
|
||||||
.TP
|
|
||||||
.B \-q
|
|
||||||
No files are printed, only the exit status is returned.
|
|
||||||
.TP
|
|
||||||
.B \-r
|
|
||||||
Test that files are readable.
|
|
||||||
.TP
|
|
||||||
.B \-s
|
|
||||||
Test that files are not empty.
|
|
||||||
.TP
|
|
||||||
.B \-u
|
|
||||||
Test that files have their set-user-ID flag set.
|
|
||||||
.TP
|
|
||||||
.B \-v
|
|
||||||
Invert the sense of tests, only failing files pass.
|
|
||||||
.TP
|
|
||||||
.B \-w
|
|
||||||
Test that files are writable.
|
|
||||||
.TP
|
|
||||||
.B \-x
|
|
||||||
Test that files are executable.
|
|
||||||
.SH EXIT STATUS
|
|
||||||
.TP
|
|
||||||
.B 0
|
|
||||||
At least one file passed all tests.
|
|
||||||
.TP
|
|
||||||
.B 1
|
|
||||||
No files passed all tests.
|
|
||||||
.TP
|
|
||||||
.B 2
|
|
||||||
An error occurred.
|
|
||||||
.SH SEE ALSO
|
|
||||||
.IR dmenu (1),
|
|
||||||
.IR test (1)
|
|
||||||
@@ -1,109 +0,0 @@
|
|||||||
/* See LICENSE file for copyright and license details. */
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "arg.h"
|
|
||||||
char *argv0;
|
|
||||||
|
|
||||||
#define FLAG(x) (flag[(x)-'a'])
|
|
||||||
|
|
||||||
static void test(const char *, const char *);
|
|
||||||
static void usage(void);
|
|
||||||
|
|
||||||
static int match = 0;
|
|
||||||
static int flag[26];
|
|
||||||
static struct stat old, new;
|
|
||||||
|
|
||||||
static void
|
|
||||||
test(const char *path, const char *name)
|
|
||||||
{
|
|
||||||
struct stat st, ln;
|
|
||||||
|
|
||||||
if ((!stat(path, &st) && (FLAG('a') || name[0] != '.') /* hidden files */
|
|
||||||
&& (!FLAG('b') || S_ISBLK(st.st_mode)) /* block special */
|
|
||||||
&& (!FLAG('c') || S_ISCHR(st.st_mode)) /* character special */
|
|
||||||
&& (!FLAG('d') || S_ISDIR(st.st_mode)) /* directory */
|
|
||||||
&& (!FLAG('e') || access(path, F_OK) == 0) /* exists */
|
|
||||||
&& (!FLAG('f') || S_ISREG(st.st_mode)) /* regular file */
|
|
||||||
&& (!FLAG('g') || st.st_mode & S_ISGID) /* set-group-id flag */
|
|
||||||
&& (!FLAG('h') || (!lstat(path, &ln) && S_ISLNK(ln.st_mode))) /* symbolic link */
|
|
||||||
&& (!FLAG('n') || st.st_mtime > new.st_mtime) /* newer than file */
|
|
||||||
&& (!FLAG('o') || st.st_mtime < old.st_mtime) /* older than file */
|
|
||||||
&& (!FLAG('p') || S_ISFIFO(st.st_mode)) /* named pipe */
|
|
||||||
&& (!FLAG('r') || access(path, R_OK) == 0) /* readable */
|
|
||||||
&& (!FLAG('s') || st.st_size > 0) /* not empty */
|
|
||||||
&& (!FLAG('u') || st.st_mode & S_ISUID) /* set-user-id flag */
|
|
||||||
&& (!FLAG('w') || access(path, W_OK) == 0) /* writable */
|
|
||||||
&& (!FLAG('x') || access(path, X_OK) == 0)) != FLAG('v')) { /* executable */
|
|
||||||
if (FLAG('q'))
|
|
||||||
exit(0);
|
|
||||||
match = 1;
|
|
||||||
puts(name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
usage(void)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "usage: %s [-abcdefghlpqrsuvwx] "
|
|
||||||
"[-n file] [-o file] [file...]\n", argv0);
|
|
||||||
exit(2); /* like test(1) return > 1 on error */
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
struct dirent *d;
|
|
||||||
char path[PATH_MAX], *line = NULL, *file;
|
|
||||||
size_t linesiz = 0;
|
|
||||||
ssize_t n;
|
|
||||||
DIR *dir;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
ARGBEGIN {
|
|
||||||
case 'n': /* newer than file */
|
|
||||||
case 'o': /* older than file */
|
|
||||||
file = EARGF(usage());
|
|
||||||
if (!(FLAG(ARGC()) = !stat(file, (ARGC() == 'n' ? &new : &old))))
|
|
||||||
perror(file);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* miscellaneous operators */
|
|
||||||
if (strchr("abcdefghlpqrsuvwx", ARGC()))
|
|
||||||
FLAG(ARGC()) = 1;
|
|
||||||
else
|
|
||||||
usage(); /* unknown flag */
|
|
||||||
} ARGEND;
|
|
||||||
|
|
||||||
if (!argc) {
|
|
||||||
/* read list from stdin */
|
|
||||||
while ((n = getline(&line, &linesiz, stdin)) > 0) {
|
|
||||||
if (line[n - 1] == '\n')
|
|
||||||
line[n - 1] = '\0';
|
|
||||||
test(line, line);
|
|
||||||
}
|
|
||||||
free(line);
|
|
||||||
} else {
|
|
||||||
for (; argc; argc--, argv++) {
|
|
||||||
if (FLAG('l') && (dir = opendir(*argv))) {
|
|
||||||
/* test directory contents */
|
|
||||||
while ((d = readdir(dir))) {
|
|
||||||
r = snprintf(path, sizeof path, "%s/%s",
|
|
||||||
*argv, d->d_name);
|
|
||||||
if (r >= 0 && (size_t)r < sizeof path)
|
|
||||||
test(path, d->d_name);
|
|
||||||
}
|
|
||||||
closedir(dir);
|
|
||||||
} else {
|
|
||||||
test(*argv, *argv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return match ? 0 : 1;
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user