1 /* $OpenBSD: generate.c,v 1.14 2012/10/09 19:45:34 espie Exp $ */ 2 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> 29 #include <stdio.h> 30 #include <stdint.h> 31 #include <stdlib.h> 32 33 #include "stats.h" 34 #include "ohash.h" 35 #include "cond_int.h" 36 #include "var_int.h" 37 #include "node_int.h" 38 39 #define M(x) x, #x 40 char *table_var[] = { 41 M(TARGET), 42 M(OODATE), 43 M(ALLSRC), 44 M(IMPSRC), 45 M(PREFIX), 46 M(ARCHIVE), 47 M(MEMBER), 48 M(LONGTARGET), 49 M(LONGOODATE), 50 M(LONGALLSRC), 51 M(LONGIMPSRC), 52 M(LONGPREFIX), 53 M(LONGARCHIVE), 54 M(LONGMEMBER), 55 M(FTARGET), 56 M(DTARGET), 57 M(FPREFIX), 58 M(DPREFIX), 59 M(FARCHIVE), 60 M(DARCHIVE), 61 M(FMEMBER), 62 M(DMEMBER), 63 NULL 64 }; 65 66 char *table_cond[] = { 67 M(COND_IF), 68 M(COND_IFDEF), 69 M(COND_IFNDEF), 70 M(COND_IFMAKE), 71 M(COND_IFNMAKE), 72 M(COND_ELSE), 73 M(COND_ELIF), 74 M(COND_ELIFDEF), 75 M(COND_ELIFNDEF), 76 M(COND_ELIFMAKE), 77 M(COND_ELIFNMAKE), 78 M(COND_ENDIF), 79 M(COND_FOR), 80 M(COND_ENDFOR), 81 M(COND_INCLUDE), 82 M(COND_UNDEF), 83 M(COND_POISON), 84 NULL 85 }; 86 87 char *table_nodes[] = { 88 M(NODE_DEFAULT), 89 M(NODE_EXEC), 90 M(NODE_IGNORE), 91 M(NODE_INCLUDES), 92 M(NODE_INVISIBLE), 93 M(NODE_JOIN), 94 M(NODE_LIBS), 95 M(NODE_MADE), 96 M(NODE_MAIN), 97 M(NODE_MAKE), 98 M(NODE_MAKEFLAGS), 99 M(NODE_MFLAGS), 100 M(NODE_NOTMAIN), 101 M(NODE_NOTPARALLEL), 102 M(NODE_NO_PARALLEL), 103 M(NODE_NULL), 104 M(NODE_OPTIONAL), 105 M(NODE_ORDER), 106 M(NODE_PARALLEL), 107 M(NODE_PATH), 108 M(NODE_PHONY), 109 M(NODE_PRECIOUS), 110 M(NODE_RECURSIVE), 111 M(NODE_SILENT), 112 M(NODE_SINGLESHELL), 113 M(NODE_SUFFIXES), 114 M(NODE_USE), 115 M(NODE_WAIT), 116 M(NODE_BEGIN), 117 M(NODE_END), 118 M(NODE_INTERRUPT), 119 M(NODE_CHEAP), 120 M(NODE_EXPENSIVE), 121 M(NODE_POSIX), 122 M(NODE_SCCS_GET), 123 NULL 124 }; 125 126 127 char **table[] = { 128 table_var, 129 table_cond, 130 table_nodes 131 }; 132 133 int 134 main(int argc, char *argv[]) 135 { 136 uint32_t i; 137 uint32_t v; 138 uint32_t h; 139 uint32_t slots; 140 const char *e; 141 char **occupied; 142 char **t; 143 int tn; 144 145 Init_Stats(); 146 if (argc != 3) 147 exit(1); 148 149 tn = atoi(argv[1]); 150 if (!tn) 151 exit(1); 152 t = table[tn-1]; 153 slots = atoi(argv[2]); 154 if (slots) { 155 occupied = calloc(sizeof(char *), slots); 156 if (!occupied) 157 exit(1); 158 for (i = 0; i < slots; i++) 159 occupied[i] = NULL; 160 } else 161 occupied = NULL; 162 163 printf("/* File created by generate %d %d, do not edit */\n", 164 tn, slots); 165 for (i = 0; t[i] != NULL; i++) { 166 e = NULL; 167 v = ohash_interval(t[i], &e); 168 if (slots) { 169 h = v % slots; 170 if (occupied[h]) { 171 fprintf(stderr, 172 "Collision: %s / %s (%d)\n", occupied[h], 173 t[i], h); 174 exit(1); 175 } 176 occupied[h] = t[i]; 177 } 178 i++; 179 printf("#define K_%s %u\n", t[i], v); 180 } 181 if (slots) 182 printf("#define MAGICSLOTS%d %u\n", tn, slots); 183 exit(0); 184 } 185