]>
git.saurik.com Git - apple/xnu.git/blob - SETUP/config/mkheaders.c
2 * Copyright (c) 1999-2006 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7 * Reserved. This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 1.0 (the 'License'). You may not use this file
10 * except in compliance with the License. Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
14 * The Original Code and all software distributed under the License are
15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19 * License for the specific language governing rights and limitations
22 * @APPLE_LICENSE_HEADER_END@
25 * Mach Operating System
26 * Copyright (c) 1990 Carnegie-Mellon University
27 * Copyright (c) 1989 Carnegie-Mellon University
28 * Copyright (c) 1988 Carnegie-Mellon University
29 * Copyright (c) 1987 Carnegie-Mellon University
30 * All rights reserved. The CMU software License Agreement specifies
31 * the terms and conditions for use and redistribution.
35 * Copyright (c) 1980 Regents of the University of California.
36 * All rights reserved.
38 * Redistribution and use in source and binary forms are permitted
39 * provided that the above copyright notice and this paragraph are
40 * duplicated in all such forms and that any documentation,
41 * advertising materials, and other materials related to such
42 * distribution and use acknowledge that the software was developed
43 * by the University of California, Berkeley. The name of the
44 * University may not be used to endorse or promote products derived
45 * from this software without specific prior written permission.
46 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
47 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
48 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
52 static char sccsid
[] __attribute__((used
)) = "@(#)mkheaders.c 5.5 (Berkeley) 6/18/88";
56 * Make all the .h files for the optional entries
60 #include <unistd.h> /* unlink */
65 static void do_count(const char *dev
, const char *hname
, int search
);
66 static void do_header(const char *dev
, const char *hname
, int count
);
67 static int file_needed(const char *name
);
68 static char *toheader(const char *dev
);
69 static char *tomacro(const char *dev
);
76 for (fl
= ftab
; fl
!= 0; fl
= fl
->f_next
)
78 do_count(fl
->f_needs
, fl
->f_needs
, 1);
82 * count all the devices of a certain type and recurse to count
83 * whatever the device is connected to
86 do_count(const char *dev
, const char *hname
, int search
)
88 struct device
*dp
, *mp
;
91 for (count
= 0,dp
= dtab
; dp
!= 0; dp
= dp
->d_next
)
92 if (dp
->d_unit
!= -1 && eq(dp
->d_name
, dev
)) {
94 * Avoid making .h files for bus types on sun machines
96 if ((machine
== MACHINE_SUN2
||
97 machine
== MACHINE_SUN3
||
98 machine
== MACHINE_SUN4
)
99 && dp
->d_conn
== TO_NEXUS
){
102 if (dp
->d_type
== PSEUDO_DEVICE
) {
104 dp
->d_slave
!= UNKNOWN
? dp
->d_slave
: 1;
109 if (machine
!= MACHINE_SUN2
&& machine
!= MACHINE_SUN3
110 && machine
!= MACHINE_SUN4
)
111 /* avoid ie0,ie0,ie1 setting NIE to 3 */
114 * Allow holes in unit numbering,
115 * assumption is unit numbering starts
118 if (dp
->d_unit
+ 1 > count
)
119 count
= dp
->d_unit
+ 1;
122 if (mp
!= 0 && mp
!= TO_NEXUS
&&
123 mp
->d_conn
!= TO_NEXUS
) {
125 * Check for the case of the
126 * controller that the device
127 * is attached to is in a separate
128 * file (e.g. "sd" and "sc").
129 * In this case, do NOT define
130 * the number of controllers
131 * in the hname .h file.
133 if (!file_needed(mp
->d_name
))
134 do_count(mp
->d_name
, hname
, 0);
139 do_header(dev
, hname
, count
);
143 * Scan the file list to see if name is needed to bring in a file.
146 file_needed(const char *name
)
148 struct file_list
*fl
;
150 for (fl
= ftab
; fl
!= 0; fl
= fl
->f_next
) {
151 if (fl
->f_needs
&& strcmp(fl
->f_needs
, name
) == 0)
158 do_header(const char *dev
, const char *hname
, int count
)
163 struct file_list
*fl
= NULL
; /* may exit for(;;) uninitted */
164 struct file_list
*fl_head
, *fl_prev
;
168 file
= toheader(hname
);
169 name
= tomacro(dev
?dev
:hname
) + (dev
== NULL
);
170 inf
= fopen(file
, "r");
174 outf
= fopen(file
, "w");
179 fprintf(outf
, "#define %s %d\n", name
, count
);
181 file
= path("meta_features.h");
182 outf
= fopen(file
, "a");
187 fprintf(outf
, "#include <%s.h>\n", hname
);
194 if ((inw
= get_word(inf
)) == 0 || inw
== (char *)EOF
)
196 if ((inw
= get_word(inf
)) == 0 || inw
== (char *)EOF
)
200 if (cp
== 0 || cp
== (char *)EOF
)
203 if (eq(inwcopy
, name
)) {
208 if (cp
== (char *)EOF
)
210 fl
= (struct file_list
*) malloc(sizeof *fl
);
213 fl
->f_next
= fl_head
;
217 if (count
== oldcount
) {
221 free((char *)fl_prev
);
225 if (oldcount
== -1) {
226 fl
= (struct file_list
*) malloc(sizeof *fl
);
229 fl
->f_next
= fl_head
;
233 outf
= fopen(file
, "w");
238 for (fl
= fl_head
; fl
!= 0; fl
= fl
->f_next
) {
239 fprintf(outf
, "#define %s %d\n",
240 fl
->f_fn
, count
? fl
->f_type
: 0);
247 * convert a dev name to a .h file name
250 toheader(const char *dev
)
252 static char hbuf
[MAXPATHLEN
];
253 (void) snprintf(hbuf
, sizeof hbuf
, "%s.h", path(dev
));
254 hbuf
[MAXPATHLEN
-1] = '\0';
259 * convert a dev name to a macro name
262 tomacro(const char *dev
)
264 static char mbuf
[FILENAME_MAX
];
273 *cp
++ = toupper(*dev
++);