From 4f5791ebd03eaec1c7da0865a383175b05102712 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 5 May 2024 19:47:29 +0200 Subject: Adding upstream version 2:4.17.12+dfsg. Signed-off-by: Daniel Baumann --- examples/validchars/validchr.c | 123 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 examples/validchars/validchr.c (limited to 'examples/validchars/validchr.c') diff --git a/examples/validchars/validchr.c b/examples/validchars/validchr.c new file mode 100644 index 0000000..415546c --- /dev/null +++ b/examples/validchars/validchr.c @@ -0,0 +1,123 @@ +/* by tino@augsburg.net + */ + +#include +#include + +#include + +unsigned char +test(void) +{ + DIR *dir; + struct dirent *dp; + unsigned char c; + + if ((dir=opendir("."))==0) + { + perror("open ."); + return 0; + } + c = 0; + while ((dp=readdir(dir))!=0) + { + size_t len; + + len = strlen(dp->d_name); + if (len<4) + continue; + if (strcmp(dp->d_name+len-4, ".TST")) + continue; + if (len!=5) + { + fprintf(stderr, "warning: %s\n", dp->d_name); + printf(" length"); + continue; + } + if (c) + printf(" double%d\n", c); + c = dp->d_name[0]; + } + if (closedir(dir)) + perror("close ."); + return c; +} + +int +main(void) +{ + char name[256]; + unsigned char map[256], upper[256], lower[256]; + int i, j, c; + FILE *fd; + + if (test()) + { + printf("There are *.TST files, please remove\n"); + return 0; + } + for (i=0; ++i<256; ) + { + lower[i] = i; + upper[i] = 0; + } + for (i=256; --i; ) + { + map[i] = i; + strcpy(name, "..TST"); + name[0] = i; + printf("%d:", i); + if ((fd=fopen(name, "w"))==0) + printf(" open"); + else + fclose(fd); + c = test(); + if (unlink(name)) + printf(" unlink"); + if (c==i) + printf(" ok"); + else + printf(" %d", c); + printf("\n"); + if (c!=i) + { + upper[c]++; + lower[c] = i; + } + map[i] = c; + } + + /* Uppercase characters are detected above on: + * The character is mapped to itself and there is a + * character which maps to it. + * Lowercase characters are the lowest character pointing to another one. + * Else it is a one way character. + * + * For this reason we have to process the list + * 1) for 'one way' characters + * 'one way' is something which is no upper and no lower character. + * This is an awful, crude and ugly hack due to missing Samba support. + * 2) for true uppercase/lowercase characters + * 3) for standalone characters + * Note that there might be characters which do not fall into 1 to 3. + */ + printf("\n valid chars ="); + for (i=0; ++i<256; ) + if (map[i] && map[i]!=i && lower[map[i]]!=i) + { + if (!upper[i]) + printf(" %d:%d %d:%d %d:%d", /*1*/ + map[i], i, i, map[i], map[i], map[i]); + else + fprintf(stderr, "ignoring map %d->%d because of %d->%d\n", + lower[i], i, i, map[i]); + } + for (i=0; ++i<256; ) + if (map[i] && map[i]==i) + if (upper[i]) + printf(" %d:%d", lower[i], i); /*2*/ + else + printf(" %d", i); /*3*/ + printf("\n"); + return 0; +} -- cgit v1.2.3