Merge branch 'rs/ctype'
* rs/ctype: Add is_regex_special() Change NUL char handling of isspecial() Reformat ctype.c Add ctype test Conflicts: Makefile
This commit is contained in:
commit
d9fde065bd
3
Makefile
3
Makefile
@ -1357,6 +1357,7 @@ endif
|
|||||||
### Testing rules
|
### Testing rules
|
||||||
|
|
||||||
TEST_PROGRAMS += test-chmtime$X
|
TEST_PROGRAMS += test-chmtime$X
|
||||||
|
TEST_PROGRAMS += test-ctype$X
|
||||||
TEST_PROGRAMS += test-date$X
|
TEST_PROGRAMS += test-date$X
|
||||||
TEST_PROGRAMS += test-delta$X
|
TEST_PROGRAMS += test-delta$X
|
||||||
TEST_PROGRAMS += test-genrandom$X
|
TEST_PROGRAMS += test-genrandom$X
|
||||||
@ -1376,6 +1377,8 @@ export NO_SVN_TESTS
|
|||||||
test: all
|
test: all
|
||||||
$(MAKE) -C t/ all
|
$(MAKE) -C t/ all
|
||||||
|
|
||||||
|
test-ctype$X: ctype.o
|
||||||
|
|
||||||
test-date$X: date.o ctype.o
|
test-date$X: date.o ctype.o
|
||||||
|
|
||||||
test-delta$X: diff-delta.o patch-delta.o
|
test-delta$X: diff-delta.o patch-delta.o
|
||||||
|
33
ctype.c
33
ctype.c
@ -5,25 +5,22 @@
|
|||||||
*/
|
*/
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
|
|
||||||
/* Just so that no insane platform contaminate namespace with these symbols */
|
enum {
|
||||||
#undef SS
|
S = GIT_SPACE,
|
||||||
#undef AA
|
A = GIT_ALPHA,
|
||||||
#undef DD
|
D = GIT_DIGIT,
|
||||||
#undef GS
|
G = GIT_GLOB_SPECIAL, /* *, ?, [, \\ */
|
||||||
|
R = GIT_REGEX_SPECIAL, /* $, (, ), +, ., ^, {, | * */
|
||||||
#define SS GIT_SPACE
|
};
|
||||||
#define AA GIT_ALPHA
|
|
||||||
#define DD GIT_DIGIT
|
|
||||||
#define GS GIT_SPECIAL /* \0, *, ?, [, \\ */
|
|
||||||
|
|
||||||
unsigned char sane_ctype[256] = {
|
unsigned char sane_ctype[256] = {
|
||||||
GS, 0, 0, 0, 0, 0, 0, 0, 0, SS, SS, 0, 0, SS, 0, 0, /* 0-15 */
|
0, 0, 0, 0, 0, 0, 0, 0, 0, S, S, 0, 0, S, 0, 0, /* 0.. 15 */
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 16-15 */
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 16.. 31 */
|
||||||
SS, 0, 0, 0, 0, 0, 0, 0, 0, 0, GS, 0, 0, 0, 0, 0, /* 32-15 */
|
S, 0, 0, 0, R, 0, 0, 0, R, R, G, R, 0, 0, R, 0, /* 32.. 47 */
|
||||||
DD, DD, DD, DD, DD, DD, DD, DD, DD, DD, 0, 0, 0, 0, 0, GS, /* 48-15 */
|
D, D, D, D, D, D, D, D, D, D, 0, 0, 0, 0, 0, G, /* 48.. 63 */
|
||||||
0, AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, /* 64-15 */
|
0, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, /* 64.. 79 */
|
||||||
AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, GS, GS, 0, 0, 0, /* 80-15 */
|
A, A, A, A, A, A, A, A, A, A, A, G, G, 0, R, 0, /* 80.. 95 */
|
||||||
0, AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, /* 96-15 */
|
0, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, /* 96..111 */
|
||||||
AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, AA, 0, 0, 0, 0, 0, /* 112-15 */
|
A, A, A, A, A, A, A, A, A, A, A, R, R, 0, 0, 0, /* 112..127 */
|
||||||
/* Nothing in the 128.. range */
|
/* Nothing in the 128.. range */
|
||||||
};
|
};
|
||||||
|
4
dir.c
4
dir.c
@ -75,7 +75,7 @@ static int match_one(const char *match, const char *name, int namelen)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
unsigned char c1 = *match;
|
unsigned char c1 = *match;
|
||||||
unsigned char c2 = *name;
|
unsigned char c2 = *name;
|
||||||
if (isspecial(c1))
|
if (c1 == '\0' || is_glob_special(c1))
|
||||||
break;
|
break;
|
||||||
if (c1 != c2)
|
if (c1 != c2)
|
||||||
return 0;
|
return 0;
|
||||||
@ -678,7 +678,7 @@ static int simple_length(const char *match)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
unsigned char c = *match++;
|
unsigned char c = *match++;
|
||||||
len++;
|
len++;
|
||||||
if (isspecial(c))
|
if (c == '\0' || is_glob_special(c))
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -327,13 +327,15 @@ extern unsigned char sane_ctype[256];
|
|||||||
#define GIT_SPACE 0x01
|
#define GIT_SPACE 0x01
|
||||||
#define GIT_DIGIT 0x02
|
#define GIT_DIGIT 0x02
|
||||||
#define GIT_ALPHA 0x04
|
#define GIT_ALPHA 0x04
|
||||||
#define GIT_SPECIAL 0x08
|
#define GIT_GLOB_SPECIAL 0x08
|
||||||
|
#define GIT_REGEX_SPECIAL 0x10
|
||||||
#define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0)
|
#define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0)
|
||||||
#define isspace(x) sane_istest(x,GIT_SPACE)
|
#define isspace(x) sane_istest(x,GIT_SPACE)
|
||||||
#define isdigit(x) sane_istest(x,GIT_DIGIT)
|
#define isdigit(x) sane_istest(x,GIT_DIGIT)
|
||||||
#define isalpha(x) sane_istest(x,GIT_ALPHA)
|
#define isalpha(x) sane_istest(x,GIT_ALPHA)
|
||||||
#define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT)
|
#define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT)
|
||||||
#define isspecial(x) sane_istest(x,GIT_SPECIAL)
|
#define is_glob_special(x) sane_istest(x,GIT_GLOB_SPECIAL)
|
||||||
|
#define is_regex_special(x) sane_istest(x,GIT_GLOB_SPECIAL | GIT_REGEX_SPECIAL)
|
||||||
#define tolower(x) sane_case((unsigned char)(x), 0x20)
|
#define tolower(x) sane_case((unsigned char)(x), 0x20)
|
||||||
#define toupper(x) sane_case((unsigned char)(x), 0)
|
#define toupper(x) sane_case((unsigned char)(x), 0)
|
||||||
|
|
||||||
|
8
grep.c
8
grep.c
@ -28,15 +28,9 @@ void append_grep_pattern(struct grep_opt *opt, const char *pat,
|
|||||||
p->next = NULL;
|
p->next = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int isregexspecial(int c)
|
|
||||||
{
|
|
||||||
return isspecial(c) || c == '$' || c == '(' || c == ')' || c == '+' ||
|
|
||||||
c == '.' || c == '^' || c == '{' || c == '|';
|
|
||||||
}
|
|
||||||
|
|
||||||
static int is_fixed(const char *s)
|
static int is_fixed(const char *s)
|
||||||
{
|
{
|
||||||
while (!isregexspecial(*s))
|
while (*s && !is_regex_special(*s))
|
||||||
s++;
|
s++;
|
||||||
return !*s;
|
return !*s;
|
||||||
}
|
}
|
||||||
|
15
t/t0070-fundamental.sh
Executable file
15
t/t0070-fundamental.sh
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='check that the most basic functions work
|
||||||
|
|
||||||
|
|
||||||
|
Verify wrappers and compatibility functions.
|
||||||
|
'
|
||||||
|
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
test_expect_success 'character classes (isspace, isalpha etc.)' '
|
||||||
|
test-ctype
|
||||||
|
'
|
||||||
|
|
||||||
|
test_done
|
78
test-ctype.c
Normal file
78
test-ctype.c
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#include "cache.h"
|
||||||
|
|
||||||
|
|
||||||
|
static int test_isdigit(int c)
|
||||||
|
{
|
||||||
|
return isdigit(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_isspace(int c)
|
||||||
|
{
|
||||||
|
return isspace(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_isalpha(int c)
|
||||||
|
{
|
||||||
|
return isalpha(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_isalnum(int c)
|
||||||
|
{
|
||||||
|
return isalnum(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_is_glob_special(int c)
|
||||||
|
{
|
||||||
|
return is_glob_special(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_is_regex_special(int c)
|
||||||
|
{
|
||||||
|
return is_regex_special(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DIGIT "0123456789"
|
||||||
|
#define LOWER "abcdefghijklmnopqrstuvwxyz"
|
||||||
|
#define UPPER "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
|
||||||
|
static const struct ctype_class {
|
||||||
|
const char *name;
|
||||||
|
int (*test_fn)(int);
|
||||||
|
const char *members;
|
||||||
|
} classes[] = {
|
||||||
|
{ "isdigit", test_isdigit, DIGIT },
|
||||||
|
{ "isspace", test_isspace, " \n\r\t" },
|
||||||
|
{ "isalpha", test_isalpha, LOWER UPPER },
|
||||||
|
{ "isalnum", test_isalnum, LOWER UPPER DIGIT },
|
||||||
|
{ "is_glob_special", test_is_glob_special, "*?[\\" },
|
||||||
|
{ "is_regex_special", test_is_regex_special, "$()*+.?[\\^{|" },
|
||||||
|
{ NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static int test_class(const struct ctype_class *test)
|
||||||
|
{
|
||||||
|
int i, rc = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
int expected = i ? !!strchr(test->members, i) : 0;
|
||||||
|
int actual = test->test_fn(i);
|
||||||
|
|
||||||
|
if (actual != expected) {
|
||||||
|
rc = 1;
|
||||||
|
printf("%s classifies char %d (0x%02x) wrongly\n",
|
||||||
|
test->name, i, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
const struct ctype_class *test;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
for (test = classes; test->name; test++)
|
||||||
|
rc |= test_class(test);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user