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