1 /*
2 gen-stat.c
3 $Id: gen-stat.c,v 1.5 2006/06/28 11:54:00 fedorov Exp $
4
5 Outputs <sys/stat.h> constants to stdout
6 as Perl constant functions
7
8 (C) 2004,2006 Dmitry A. Fedorov <fedorov@cpan.org>
9 Copying policy: GNU LGPL
10 */
11
12 #include <stdio.h>
13 #include <sys/stat.h>
14 #include <sys/types.h>
15
16 #ifdef _HAVE_SYS_SYSMACROS_H
17 # include <sys/sysmacros.h>
18 #endif
19
20
21 #undef P
22 #undef CONCAT
23 #undef CONCAT1
24 #undef STRING
25 #undef XSTRING
26 #undef VERBATIM
27
28
29 /* + shamelessly stolen from other source headers */
30
31 #if defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus)
32 /* ANSI C or C++ */
33 # define P(protos) protos
34 # define CONCAT1(x,y) x ## y
35 # define CONCAT(x,y) CONCAT1(x,y)
36 # define STRING(x) #x /* stringify without expanding x */
37 # define XSTRING(x) STRING(x) /* expand x, then stringify */
38 #else
39 /* traditional C, no prototypes */
40 # define VERBATIM(x) x
41
42 # define P(protos) ()
43 # define CONCAT(x,y) VERBATIM(x)VERBATIM(y)
44 # define STRING(x) "x"
45 # define XSTRING(x) STRING(x)
46 #endif
47
48 /* - shamelessly stolen from other source headers */
49
50
pr(const char * name,dev_t value)51 static void pr(const char *name, dev_t value)
52 {
53 printf("sub %-12s () { 0%06llo }\n", name, value);
54 }
55
prundef(const char * name)56 static void prundef(const char *name)
57 {
58 printf("sub %-12s () { undef }\n", name);
59 }
60
61 #if defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus)
62 /* ANSI C or C++ */
63 # define PR(x) pr( #x , x )
64 #else
65 /* traditional C, no prototypes */
66 # define PR(x) pr( "x" , x )
67 #endif
68
constants(void)69 static void constants(void)
70 {
71 PR(S_IFMT );
72 PR(S_IFDIR );
73 PR(S_IFCHR );
74 PR(S_IFBLK );
75 PR(S_IFREG );
76 #ifdef S_IFIFO
77 PR(S_IFIFO );
78 #endif
79 #ifdef S_IFLNK
80 PR(S_IFLNK );
81 #endif
82 #ifdef S_IFSOCK
83 PR(S_IFSOCK);
84 #endif
85
86 printf("\n");
87
88 PR(S_IRWXU);
89 PR(S_IRUSR);
90 PR(S_IWUSR);
91 PR(S_IXUSR);
92 PR(S_ISUID);
93
94 printf("\n");
95
96 PR(S_IRWXG);
97 PR(S_IRGRP);
98 PR(S_IWGRP);
99 PR(S_IXGRP);
100 PR(S_ISGID);
101
102 printf("\n");
103
104 PR(S_IRWXO);
105 PR(S_IROTH);
106 PR(S_IWOTH);
107 PR(S_IXOTH);
108 PR(S_ISVTX);
109
110 printf("\n");
111 }
112
113
114 #ifdef _HAVE_MAJOR_MINOR
115
116 #define MASK(bit) ( ((dev_t)1) << (bit) )
117
test(dev_t (* f)(dev_t),dev_t * _mask,unsigned int * _shift)118 static void test(dev_t (*f)(dev_t),
119 dev_t *_mask, unsigned int *_shift)
120 {
121 unsigned int shift;
122 dev_t mask, old_mask;
123
124 for(shift=0; mask=MASK(shift), f(mask) == 0; ++shift)
125 ;
126
127 *_shift=shift;
128
129 for(*_mask=0, old_mask=0;
130 (mask=MASK(shift)) > old_mask;
131 ++shift, old_mask=mask
132 )
133 {
134 if ( f(mask) != 0 )
135 *_mask |= mask;
136 }
137 }
138
139
Major(dev_t dev)140 static dev_t Major( dev_t dev )
141 {
142 return major(dev);
143 }
144
Minor(dev_t dev)145 static dev_t Minor( dev_t dev )
146 {
147 return minor(dev);
148 }
149
150 #endif /* _HAVE_MAJOR_MINOR */
151
152
main(void)153 int main(void)
154 {
155 #ifdef _HAVE_MAJOR_MINOR
156 dev_t major_mask , minor_mask;
157 unsigned int major_shift, minor_shift;
158
159 test( Major, &major_mask, &major_shift );
160 test( Minor, &minor_mask, &minor_shift );
161
162 pr("MAJOR_MASK" , major_mask );
163 pr("MAJOR_SHIFT", major_shift);
164 pr("MINOR_MASK" , minor_mask );
165 pr("MINOR_SHIFT", minor_shift);
166 #else
167 prundef("MAJOR_MASK" );
168 prundef("MAJOR_SHIFT");
169 prundef("MINOR_MASK" );
170 prundef("MINOR_SHIFT");
171 #endif /* _HAVE_MAJOR_MINOR */
172
173 printf("\n");
174
175 constants();
176 printf("\n1;\n");
177
178 return 0;
179 }
180