~bug-zappers/ubuntu/lucid/samba/bugzapping

« back to all changes in this revision

Viewing changes to examples/validchars/validchr.c

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2004-10-15 12:31:58 UTC
  • Revision ID: james.westby@ubuntu.com-20041015123158-aokykzdqkdgy6dfx
Tags: upstream-3.0.7
ImportĀ upstreamĀ versionĀ 3.0.7

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* by tino@augsburg.net
 
2
 */
 
3
 
 
4
#include <stdio.h>
 
5
#include <string.h>
 
6
 
 
7
#include <dirent.h>
 
8
 
 
9
unsigned char
 
10
test(void)
 
11
{
 
12
  DIR           *dir;
 
13
  struct dirent *dp;
 
14
  unsigned char c;
 
15
 
 
16
  if ((dir=opendir("."))==0)
 
17
    {
 
18
      perror("open .");
 
19
      return 0;
 
20
    }
 
21
  c     = 0;
 
22
  while ((dp=readdir(dir))!=0)
 
23
    {
 
24
      size_t len;
 
25
 
 
26
      len       = strlen(dp->d_name);
 
27
      if (len<4)
 
28
        continue;
 
29
      if (strcmp(dp->d_name+len-4, ".TST"))
 
30
        continue;
 
31
      if (len!=5)
 
32
        {
 
33
          fprintf(stderr, "warning: %s\n", dp->d_name);
 
34
          printf(" length");
 
35
          continue;
 
36
        }
 
37
      if (c)
 
38
        printf(" double%d\n", c);
 
39
      c = dp->d_name[0];
 
40
    }
 
41
  if (closedir(dir))
 
42
    perror("close .");
 
43
  return c;
 
44
}
 
45
 
 
46
int
 
47
main(void)
 
48
{
 
49
  char          name[256];
 
50
  unsigned char map[256], upper[256], lower[256];
 
51
  int           i, j, c;
 
52
  FILE          *fd;
 
53
 
 
54
  if (test())
 
55
    {
 
56
      printf("There are *.TST files, please remove\n");
 
57
      return 0;
 
58
    }
 
59
  for (i=0; ++i<256; )
 
60
    {
 
61
      lower[i]  = i;
 
62
      upper[i]  = 0;
 
63
    }
 
64
  for (i=256; --i; )
 
65
    {
 
66
      map[i]    = i;
 
67
      strcpy(name, "..TST");
 
68
      name[0]   = i;
 
69
      printf("%d:", i);
 
70
      if ((fd=fopen(name, "w"))==0)
 
71
        printf(" open");
 
72
      else
 
73
        fclose(fd);
 
74
      c = test();
 
75
      if (unlink(name))
 
76
        printf(" unlink");
 
77
      if (c==i)
 
78
        printf(" ok");
 
79
      else
 
80
        printf(" %d", c);
 
81
      printf("\n");
 
82
      if (c!=i)
 
83
        {
 
84
          upper[c]++;
 
85
          lower[c]      = i;
 
86
        }
 
87
      map[i]    = c;
 
88
    }
 
89
 
 
90
  /* Uppercase characters are detected above on:
 
91
   * The character is mapped to itself and there is a
 
92
   * character which maps to it.
 
93
   * Lowercase characters are the lowest character pointing to another one.
 
94
   * Else it is a one way character.
 
95
   *
 
96
   * For this reason we have to process the list
 
97
   * 1) for 'one way' characters
 
98
   *    'one way' is something which is no upper and no lower character.
 
99
   *    This is an awful, crude and ugly hack due to missing Samba support.
 
100
   * 2) for true uppercase/lowercase characters
 
101
   * 3) for standalone characters
 
102
   * Note that there might be characters which do not fall into 1 to 3.
 
103
   */
 
104
  printf("\n   valid chars =");
 
105
  for (i=0; ++i<256; )
 
106
    if (map[i] && map[i]!=i && lower[map[i]]!=i)
 
107
      {
 
108
        if (!upper[i])
 
109
          printf(" %d:%d %d:%d %d:%d",                                  /*1*/
 
110
                 map[i], i, i, map[i], map[i], map[i]);
 
111
        else
 
112
          fprintf(stderr, "ignoring map %d->%d because of %d->%d\n",
 
113
                  lower[i], i, i, map[i]);
 
114
      }
 
115
  for (i=0; ++i<256; )
 
116
    if (map[i] && map[i]==i)
 
117
      if (upper[i])
 
118
        printf(" %d:%d", lower[i], i);                                  /*2*/
 
119
      else
 
120
        printf(" %d", i);                                               /*3*/
 
121
  printf("\n");
 
122
  return 0;
 
123
}