[BACK]Return to generate.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / make

File: [local] / src / usr.bin / make / generate.c (download)

Revision 1.3, Thu May 3 13:41:05 2001 UTC (23 years, 1 month ago) by espie
Branch: MAIN
Changes since 1.2: +69 -26 lines

Synch with my current work.
Numerous changes:
- generate can build several tables
- style cleanup
- statistics code
- use variable names throughout (struct Name)
- recursive variables everywhere
- faster parser (pass buffer along instead of allocating multiple copies)
- correct parser. Handles comments everywhere, and ; correctly
- more string intervals
- simplified dir.c, less recursion.
- extended for loops
- sinclude()
- finished removing extra junk from Lst_*
- handles ${@D} and friends in a simpler way
- cleaned up and modular VarModifiers handling.
- recognizes some gnu Makefile usages and errors out about them.

Additionally, some extra functionality is defined by FEATURES. The set of
functionalities is currently hardcoded to OpenBSD defaults, but this may
include support for some NetBSD extensions, like ODE modifiers.

Backed by miod@ and millert@, who finally got sick of my endless patches...

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>

#include "make.h"
#include "stats.h"
#include "ohash.h"
#include "cond_int.h"

#define M(x)	x, #x
char *table_var[] = {
	M(TARGET),
	M(OODATE),
	M(ALLSRC),
	M(IMPSRC),
	M(PREFIX),
	M(ARCHIVE),
	M(MEMBER),
	M(LONGTARGET),
	M(LONGOODATE),
	M(LONGALLSRC),
	M(LONGIMPSRC),
	M(LONGPREFIX),
	M(LONGARCHIVE),
	M(LONGMEMBER),
	M(FTARGET),
	M(DTARGET),
	M(FPREFIX),
	M(DPREFIX),
	M(FARCHIVE),
	M(DARCHIVE),
	M(FMEMBER),
	M(DMEMBER),
	NULL
};

char *table_cond[] = {
	M(COND_IF),
	M(COND_IFDEF),
	M(COND_IFNDEF),
	M(COND_IFMAKE),
	M(COND_IFNMAKE),
	M(COND_ELSE),
	M(COND_ELIFDEF),
	M(COND_ELIFNDEF),
	M(COND_ELIFMAKE),
	M(COND_ELIFNMAKE),
	M(COND_ENDIF),
	M(COND_FOR),
	M(COND_INCLUDE),
	M(COND_UNDEF),
	NULL
};


char **table[] = {
	table_var,
	table_cond
};

int
main(int argc, char *argv[])
{
	u_int32_t i;
	u_int32_t v;
	u_int32_t h;
	u_int32_t slots;
	const char *e;
	char **occupied;
	char **t;
	int tn;

#ifdef HAS_STATS
	Init_Stats();
#endif
	if (argc != 3)
		exit(1);

	tn = atoi(argv[1]);
	if (!tn)
		exit(1);
	t = table[tn-1];
	slots = atoi(argv[2]);
	if (slots) {
		occupied = malloc(sizeof(char *) * slots);
		if (!occupied)
			exit(1);
		for (i = 0; i < slots; i++)
			occupied[i] = NULL;
	} else
		occupied = NULL;

	printf("/* File created by generate %d %d, do not edit */\n", 
	    tn, slots);
	for (i = 0; t[i] != NULL; i++) {
		e = NULL;
		v = ohash_interval(t[i], &e);
		if (slots) {
			h = v % slots;
			if (occupied[h]) {
				fprintf(stderr, 
				    "Collision: %s / %s (%d)\n", occupied[h],
				    t[i], h);
				exit(1);
			}
			occupied[h] = t[i];
		}
		i++;
		printf("#define K_%s %u\n", t[i], v);
	}
	if (slots)
		printf("#define MAGICSLOTS%d %u\n", tn, slots);
	exit(0);
}