Annotation of src/usr.bin/make/generate.c, Revision 1.3
1.1 espie 1:
2: #include <stdio.h>
3: #include <stdlib.h>
4: #include <stddef.h>
5:
6: #include "make.h"
1.3 ! espie 7: #include "stats.h"
1.1 espie 8: #include "ohash.h"
1.3 ! espie 9: #include "cond_int.h"
1.1 espie 10:
11: #define M(x) x, #x
1.3 ! espie 12: char *table_var[] = {
1.1 espie 13: M(TARGET),
14: M(OODATE),
15: M(ALLSRC),
16: M(IMPSRC),
17: M(PREFIX),
18: M(ARCHIVE),
19: M(MEMBER),
20: M(LONGTARGET),
21: M(LONGOODATE),
22: M(LONGALLSRC),
23: M(LONGIMPSRC),
24: M(LONGPREFIX),
25: M(LONGARCHIVE),
1.3 ! espie 26: M(LONGMEMBER),
! 27: M(FTARGET),
! 28: M(DTARGET),
! 29: M(FPREFIX),
! 30: M(DPREFIX),
! 31: M(FARCHIVE),
! 32: M(DARCHIVE),
! 33: M(FMEMBER),
! 34: M(DMEMBER),
! 35: NULL
1.1 espie 36: };
37:
1.3 ! espie 38: char *table_cond[] = {
! 39: M(COND_IF),
! 40: M(COND_IFDEF),
! 41: M(COND_IFNDEF),
! 42: M(COND_IFMAKE),
! 43: M(COND_IFNMAKE),
! 44: M(COND_ELSE),
! 45: M(COND_ELIFDEF),
! 46: M(COND_ELIFNDEF),
! 47: M(COND_ELIFMAKE),
! 48: M(COND_ELIFNMAKE),
! 49: M(COND_ENDIF),
! 50: M(COND_FOR),
! 51: M(COND_INCLUDE),
! 52: M(COND_UNDEF),
! 53: NULL
! 54: };
! 55:
! 56:
! 57: char **table[] = {
! 58: table_var,
! 59: table_cond
! 60: };
1.1 espie 61:
62: int
63: main(int argc, char *argv[])
64: {
65: u_int32_t i;
66: u_int32_t v;
67: u_int32_t h;
68: u_int32_t slots;
69: const char *e;
70: char **occupied;
1.3 ! espie 71: char **t;
! 72: int tn;
1.1 espie 73:
74: #ifdef HAS_STATS
75: Init_Stats();
76: #endif
1.3 ! espie 77: if (argc != 3)
1.1 espie 78: exit(1);
79:
1.3 ! espie 80: tn = atoi(argv[1]);
! 81: if (!tn)
1.1 espie 82: exit(1);
1.3 ! espie 83: t = table[tn-1];
! 84: slots = atoi(argv[2]);
! 85: if (slots) {
! 86: occupied = malloc(sizeof(char *) * slots);
! 87: if (!occupied)
! 88: exit(1);
! 89: for (i = 0; i < slots; i++)
! 90: occupied[i] = NULL;
! 91: } else
! 92: occupied = NULL;
! 93:
! 94: printf("/* File created by generate %d %d, do not edit */\n",
! 95: tn, slots);
! 96: for (i = 0; t[i] != NULL; i++) {
1.1 espie 97: e = NULL;
1.3 ! espie 98: v = ohash_interval(t[i], &e);
! 99: if (slots) {
! 100: h = v % slots;
! 101: if (occupied[h]) {
! 102: fprintf(stderr,
! 103: "Collision: %s / %s (%d)\n", occupied[h],
! 104: t[i], h);
! 105: exit(1);
! 106: }
! 107: occupied[h] = t[i];
1.1 espie 108: }
1.3 ! espie 109: i++;
! 110: printf("#define K_%s %u\n", t[i], v);
1.1 espie 111: }
1.3 ! espie 112: if (slots)
! 113: printf("#define MAGICSLOTS%d %u\n", tn, slots);
1.1 espie 114: exit(0);
115: }