1/* $OpenBSD: generate.c,v 1.18 2016/10/14 09:27:21 natano 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 <stdint.h> 30#include <stdio.h> 31#include <stdlib.h> 32#include <limits.h> 33#include <ohash.h> 34 35#include "stats.h" 36#include "cond_int.h" 37#include "var_int.h" 38#include "node_int.h" 39 40#define M(x) x, #x 41char *table_var[] = { 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), 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), 64 M(FIMPSRC), 65 M(DIMPSRC), 66 NULL 67}; 68 69char *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), 76 M(COND_ELIF), 77 M(COND_ELIFDEF), 78 M(COND_ELIFNDEF), 79 M(COND_ELIFMAKE), 80 M(COND_ELIFNMAKE), 81 M(COND_ENDIF), 82 M(COND_FOR), 83 M(COND_ENDFOR), 84 M(COND_INCLUDE), 85 M(COND_UNDEF), 86 M(COND_POISON), 87 NULL 88}; 89 90char *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), 122 M(NODE_CHEAP), 123 M(NODE_EXPENSIVE), 124 M(NODE_POSIX), 125 M(NODE_SCCS_GET), 126 NULL 127}; 128 129 130char **table[] = { 131 table_var, 132 table_cond, 133 table_nodes 134}; 135 136int 137main(int argc, char *argv[]) 138{ 139 uint32_t i; 140 uint32_t v; 141 uint32_t h; 142 uint32_t slots; 143 const char *errstr; 144 const char *e; 145 char **occupied; 146 char **t; 147 int tn; 148 149 Init_Stats(); 150 if (argc != 3) 151 exit(1); 152 153 tn = strtonum(argv[1], 1, INT_MAX, &errstr); 154 if (errstr) 155 exit(1); 156 t = table[tn-1]; 157 slots = strtonum(argv[2], 0, INT_MAX, &errstr); 158 if (errstr) 159 exit(1); 160 if (slots) { 161 occupied = calloc(slots, sizeof(char *)); 162 if (!occupied) 163 exit(1); 164 } else 165 occupied = NULL; 166 167 printf("/* File created by generate %d %d, do not edit */\n", 168 tn, slots); 169 for (i = 0; t[i] != NULL; i++) { 170 e = NULL; 171 v = ohash_interval(t[i], &e); 172 if (slots) { 173 h = v % slots; 174 if (occupied[h]) { 175 fprintf(stderr, 176 "Collision: %s / %s (%d)\n", occupied[h], 177 t[i], h); 178 exit(1); 179 } 180 occupied[h] = t[i]; 181 } 182 i++; 183 printf("#define K_%s %u\n", t[i], v); 184 } 185 if (slots) 186 printf("#define MAGICSLOTS%d %u\n", tn, slots); 187 exit(0); 188} 189