Annotation of src/usr.bin/make/generate.c, Revision 1.18
1.18 ! natano 1: /* $OpenBSD: generate.c,v 1.17 2015/04/18 18:28:37 deraadt Exp $ */
1.1 espie 2:
1.4 espie 3: /*
4: * Copyright (c) 2001 Marc Espie.
5: *
6: * Redistribution and use in source and binary forms, with or without
7: * modification, are permitted provided that the following conditions
8: * are met:
9: * 1. Redistributions of source code must retain the above copyright
10: * notice, this list of conditions and the following disclaimer.
11: * 2. Redistributions in binary form must reproduce the above copyright
12: * notice, this list of conditions and the following disclaimer in the
13: * documentation and/or other materials provided with the distribution.
14: *
15: * THIS SOFTWARE IS PROVIDED BY THE OPENBSD PROJECT AND CONTRIBUTORS
16: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBSD
19: * PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26: */
27:
28: #include <stddef.h>
1.15 espie 29: #include <stdint.h>
1.1 espie 30: #include <stdio.h>
31: #include <stdlib.h>
1.17 deraadt 32: #include <limits.h>
1.15 espie 33: #include <ohash.h>
1.1 espie 34:
1.3 espie 35: #include "stats.h"
36: #include "cond_int.h"
1.4 espie 37: #include "var_int.h"
1.9 espie 38: #include "node_int.h"
1.1 espie 39:
40: #define M(x) x, #x
1.3 espie 41: char *table_var[] = {
1.1 espie 42: M(TARGET),
43: M(OODATE),
44: M(ALLSRC),
45: M(IMPSRC),
46: M(PREFIX),
47: M(ARCHIVE),
48: M(MEMBER),
49: M(LONGTARGET),
50: M(LONGOODATE),
51: M(LONGALLSRC),
52: M(LONGIMPSRC),
53: M(LONGPREFIX),
54: M(LONGARCHIVE),
1.3 espie 55: M(LONGMEMBER),
56: M(FTARGET),
57: M(DTARGET),
58: M(FPREFIX),
59: M(DPREFIX),
60: M(FARCHIVE),
61: M(DARCHIVE),
62: M(FMEMBER),
63: M(DMEMBER),
1.18 ! natano 64: M(FIMPSRC),
! 65: M(DIMPSRC),
1.3 espie 66: NULL
1.1 espie 67: };
68:
1.3 espie 69: char *table_cond[] = {
70: M(COND_IF),
71: M(COND_IFDEF),
72: M(COND_IFNDEF),
73: M(COND_IFMAKE),
74: M(COND_IFNMAKE),
75: M(COND_ELSE),
1.5 espie 76: M(COND_ELIF),
1.3 espie 77: M(COND_ELIFDEF),
78: M(COND_ELIFNDEF),
79: M(COND_ELIFMAKE),
80: M(COND_ELIFNMAKE),
81: M(COND_ENDIF),
82: M(COND_FOR),
1.5 espie 83: M(COND_ENDFOR),
1.3 espie 84: M(COND_INCLUDE),
85: M(COND_UNDEF),
1.7 espie 86: M(COND_POISON),
1.3 espie 87: NULL
88: };
89:
1.9 espie 90: char *table_nodes[] = {
91: M(NODE_DEFAULT),
92: M(NODE_EXEC),
93: M(NODE_IGNORE),
94: M(NODE_INCLUDES),
95: M(NODE_INVISIBLE),
96: M(NODE_JOIN),
97: M(NODE_LIBS),
98: M(NODE_MADE),
99: M(NODE_MAIN),
100: M(NODE_MAKE),
101: M(NODE_MAKEFLAGS),
102: M(NODE_MFLAGS),
103: M(NODE_NOTMAIN),
104: M(NODE_NOTPARALLEL),
105: M(NODE_NO_PARALLEL),
106: M(NODE_NULL),
107: M(NODE_OPTIONAL),
108: M(NODE_ORDER),
109: M(NODE_PARALLEL),
110: M(NODE_PATH),
111: M(NODE_PHONY),
112: M(NODE_PRECIOUS),
113: M(NODE_RECURSIVE),
114: M(NODE_SILENT),
115: M(NODE_SINGLESHELL),
116: M(NODE_SUFFIXES),
117: M(NODE_USE),
118: M(NODE_WAIT),
119: M(NODE_BEGIN),
120: M(NODE_END),
121: M(NODE_INTERRUPT),
1.13 espie 122: M(NODE_CHEAP),
123: M(NODE_EXPENSIVE),
1.14 espie 124: M(NODE_POSIX),
125: M(NODE_SCCS_GET),
1.9 espie 126: NULL
127: };
128:
1.3 espie 129:
130: char **table[] = {
131: table_var,
1.9 espie 132: table_cond,
133: table_nodes
1.3 espie 134: };
1.1 espie 135:
136: int
137: main(int argc, char *argv[])
138: {
1.6 espie 139: uint32_t i;
140: uint32_t v;
141: uint32_t h;
142: uint32_t slots;
1.17 deraadt 143: const char *errstr;
1.1 espie 144: const char *e;
145: char **occupied;
1.3 espie 146: char **t;
147: int tn;
1.1 espie 148:
149: Init_Stats();
1.3 espie 150: if (argc != 3)
1.1 espie 151: exit(1);
152:
1.17 deraadt 153: tn = strtonum(argv[1], 1, INT_MAX, &errstr);
154: if (errstr)
1.1 espie 155: exit(1);
1.3 espie 156: t = table[tn-1];
1.17 deraadt 157: slots = strtonum(argv[2], 0, INT_MAX, &errstr);
158: if (errstr)
159: exit(1);
1.3 espie 160: if (slots) {
1.16 espie 161: occupied = calloc(slots, sizeof(char *));
1.3 espie 162: if (!occupied)
163: exit(1);
164: } else
165: occupied = NULL;
166:
1.10 espie 167: printf("/* File created by generate %d %d, do not edit */\n",
1.3 espie 168: tn, slots);
169: for (i = 0; t[i] != NULL; i++) {
1.1 espie 170: e = NULL;
1.3 espie 171: v = ohash_interval(t[i], &e);
172: if (slots) {
173: h = v % slots;
174: if (occupied[h]) {
1.10 espie 175: fprintf(stderr,
1.3 espie 176: "Collision: %s / %s (%d)\n", occupied[h],
177: t[i], h);
178: exit(1);
179: }
180: occupied[h] = t[i];
1.1 espie 181: }
1.3 espie 182: i++;
183: printf("#define K_%s %u\n", t[i], v);
1.1 espie 184: }
1.3 espie 185: if (slots)
186: printf("#define MAGICSLOTS%d %u\n", tn, slots);
1.1 espie 187: exit(0);
188: }