5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews/*
bd911976d51f102751848568ccf56592fd5f6d77Tinderbox User * Copyright (C) 1998-2009, 2012-2017 Internet Systems Consortium, Inc. ("ISC")
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews */
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*! \file */
dfea6f0eaadb9287cfcdc1566ac2f997af1b075aBob Halley
bc8711b1489e1b25f311f4f6161355708f643f3dMark Andrews#ifdef WIN32
bc8711b1489e1b25f311f4f6161355708f643f3dMark Andrews/*
bc8711b1489e1b25f311f4f6161355708f643f3dMark Andrews * Silence compiler warnings about using strcpy and friends.
bc8711b1489e1b25f311f4f6161355708f643f3dMark Andrews */
bc8711b1489e1b25f311f4f6161355708f643f3dMark Andrews#define _CRT_SECURE_NO_DEPRECATE 1
5cd7ca9dbd4edff9b6be698c141bd309d4042691Mark Andrews/*
4d6329c1b3c80f82880291ae35f68f84c14ad820Francis Dupont * We use snprintf which was defined late in Windows even it is in C99.
5cd7ca9dbd4edff9b6be698c141bd309d4042691Mark Andrews */
4d6329c1b3c80f82880291ae35f68f84c14ad820Francis Dupont#if _MSC_VER < 1900
5cd7ca9dbd4edff9b6be698c141bd309d4042691Mark Andrews#define snprintf _snprintf
bc8711b1489e1b25f311f4f6161355708f643f3dMark Andrews#endif
4d6329c1b3c80f82880291ae35f68f84c14ad820Francis Dupont#endif
bc8711b1489e1b25f311f4f6161355708f643f3dMark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#include <sys/types.h>
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#include <ctype.h>
b57bb9136af9f1bf84378f1f11f0efc55c52c628Mark Andrews#include <stdlib.h>
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#include <stdio.h>
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#include <stdlib.h>
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#include <string.h>
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#include <time.h>
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence#ifdef WIN32
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence#include "gen-win32.h"
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence#else
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence#include "gen-unix.h"
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence#endif
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews#define INSIST(cond) \
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews if (!(cond)) { \
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews fprintf(stderr, "%s:%d: INSIST(%s)\n", \
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews __FILE__, __LINE__, #cond); \
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews abort(); \
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews }
6098d364b690cb9dabf96e9664c4689c8559bd2eMark Andrews
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews#define FROMTEXTARGS "rdclass, type, lexer, origin, options, target, callbacks"
d981ca645597116d227a48bf37cc5edc061c854dBob Halley#define FROMTEXTCLASS "rdclass"
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#define FROMTEXTTYPE "type"
ebfcb6cf66283096ebda1503b6cc042ce86b6bedBrian Wellington#define FROMTEXTDEF "result = DNS_R_UNKNOWN"
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson#define TOTEXTARGS "rdata, tctx, target"
d981ca645597116d227a48bf37cc5edc061c854dBob Halley#define TOTEXTCLASS "rdata->rdclass"
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#define TOTEXTTYPE "rdata->type"
3d5cad69ec20157912e95cf3b79316dfb0a314f3Mark Andrews#define TOTEXTDEF "use_default = ISC_TRUE"
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews#define FROMWIREARGS "rdclass, type, source, dctx, options, target"
d981ca645597116d227a48bf37cc5edc061c854dBob Halley#define FROMWIRECLASS "rdclass"
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#define FROMWIRETYPE "type"
3d5cad69ec20157912e95cf3b79316dfb0a314f3Mark Andrews#define FROMWIREDEF "use_default = ISC_TRUE"
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#define TOWIREARGS "rdata, cctx, target"
d981ca645597116d227a48bf37cc5edc061c854dBob Halley#define TOWIRECLASS "rdata->rdclass"
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#define TOWIRETYPE "rdata->type"
3d5cad69ec20157912e95cf3b79316dfb0a314f3Mark Andrews#define TOWIREDEF "use_default = ISC_TRUE"
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
d981ca645597116d227a48bf37cc5edc061c854dBob Halley#define FROMSTRUCTARGS "rdclass, type, source, target"
d981ca645597116d227a48bf37cc5edc061c854dBob Halley#define FROMSTRUCTCLASS "rdclass"
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#define FROMSTRUCTTYPE "type"
3d5cad69ec20157912e95cf3b79316dfb0a314f3Mark Andrews#define FROMSTRUCTDEF "use_default = ISC_TRUE"
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews#define TOSTRUCTARGS "rdata, target, mctx"
d981ca645597116d227a48bf37cc5edc061c854dBob Halley#define TOSTRUCTCLASS "rdata->rdclass"
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#define TOSTRUCTTYPE "rdata->type"
3d5cad69ec20157912e95cf3b79316dfb0a314f3Mark Andrews#define TOSTRUCTDEF "use_default = ISC_TRUE"
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews#define FREESTRUCTARGS "source"
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews#define FREESTRUCTCLASS "common->rdclass"
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews#define FREESTRUCTTYPE "common->rdtype"
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews#define FREESTRUCTDEF NULL
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#define COMPAREARGS "rdata1, rdata2"
d981ca645597116d227a48bf37cc5edc061c854dBob Halley#define COMPARECLASS "rdata1->rdclass"
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#define COMPARETYPE "rdata1->type"
3d5cad69ec20157912e95cf3b79316dfb0a314f3Mark Andrews#define COMPAREDEF "use_default = ISC_TRUE"
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
d981ca645597116d227a48bf37cc5edc061c854dBob Halley#define ADDITIONALDATAARGS "rdata, add, arg"
d981ca645597116d227a48bf37cc5edc061c854dBob Halley#define ADDITIONALDATACLASS "rdata->rdclass"
d981ca645597116d227a48bf37cc5edc061c854dBob Halley#define ADDITIONALDATATYPE "rdata->type"
d981ca645597116d227a48bf37cc5edc061c854dBob Halley#define ADDITIONALDATADEF "use_default = ISC_TRUE"
d981ca645597116d227a48bf37cc5edc061c854dBob Halley
477437f48d24f46c2c2f5271c53e759f0b4ca1caBob Halley#define DIGESTARGS "rdata, digest, arg"
477437f48d24f46c2c2f5271c53e759f0b4ca1caBob Halley#define DIGESTCLASS "rdata->rdclass"
477437f48d24f46c2c2f5271c53e759f0b4ca1caBob Halley#define DIGESTTYPE "rdata->type"
477437f48d24f46c2c2f5271c53e759f0b4ca1caBob Halley#define DIGESTDEF "use_default = ISC_TRUE"
477437f48d24f46c2c2f5271c53e759f0b4ca1caBob Halley
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews#define CHECKOWNERARGS "name, rdclass, type, wildcard"
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews#define CHECKOWNERCLASS "rdclass"
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews#define CHECKOWNERTYPE "type"
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews#define CHECKOWNERDEF "result = ISC_TRUE"
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews#define CHECKNAMESARGS "rdata, owner, bad"
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews#define CHECKNAMESCLASS "rdata->rdclass"
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews#define CHECKNAMESTYPE "rdata->type"
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews#define CHECKNAMESDEF "result = ISC_TRUE"
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic const char copyright[] =
987effb43724fc55747b803dd9ab80a5a7c9c518Michael Graff"/*\n"
704e6c8876907aac0bf7380effca8bca400d4acdMark Andrews" * Copyright (C) 1998%s Internet Systems Consortium, Inc. (\"ISC\")\n"
987effb43724fc55747b803dd9ab80a5a7c9c518Michael Graff" *\n"
704e6c8876907aac0bf7380effca8bca400d4acdMark Andrews" * This Source Code Form is subject to the terms of the Mozilla Public\n"
704e6c8876907aac0bf7380effca8bca400d4acdMark Andrews" * License, v. 2.0. If a copy of the MPL was not distributed with this\n"
704e6c8876907aac0bf7380effca8bca400d4acdMark Andrews" * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n"
987effb43724fc55747b803dd9ab80a5a7c9c518Michael Graff" */\n"
987effb43724fc55747b803dd9ab80a5a7c9c518Michael Graff"\n"
987effb43724fc55747b803dd9ab80a5a7c9c518Michael Graff"/***************\n"
987effb43724fc55747b803dd9ab80a5a7c9c518Michael Graff" ***************\n"
987effb43724fc55747b803dd9ab80a5a7c9c518Michael Graff" *************** THIS FILE IS AUTOMATICALLY GENERATED BY gen.c.\n"
987effb43724fc55747b803dd9ab80a5a7c9c518Michael Graff" *************** DO NOT EDIT!\n"
987effb43724fc55747b803dd9ab80a5a7c9c518Michael Graff" ***************\n"
987effb43724fc55747b803dd9ab80a5a7c9c518Michael Graff" ***************/\n"
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein"\n"
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein"/*! \\file */\n"
987effb43724fc55747b803dd9ab80a5a7c9c518Michael Graff"\n";
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews#define STR_EXPAND(tok) #tok
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews#define STR(tok) STR_EXPAND(tok)
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews
471e0563c7965c556c759775882cd3448dae78eaMark Andrews#define TYPENAMES 256
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews#define TYPECLASSLEN 20 /* DNS mnemonic size. Must be less than 100. */
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews#define TYPECLASSBUF (TYPECLASSLEN + 1)
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews#define TYPECLASSFMT "%" STR(TYPECLASSLEN) "[-0-9a-z]_%d"
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews#define ATTRIBUTESIZE 256
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews#define DIRNAMESIZE 256
471e0563c7965c556c759775882cd3448dae78eaMark Andrews
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic struct cc {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews struct cc *next;
d981ca645597116d227a48bf37cc5edc061c854dBob Halley int rdclass;
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews char classname[TYPECLASSBUF];
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews} *classes;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic struct tt {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews struct tt *next;
d981ca645597116d227a48bf37cc5edc061c854dBob Halley int rdclass;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews int type;
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews char classname[TYPECLASSBUF];
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews char typename[TYPECLASSBUF];
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews char dirname[DIRNAMESIZE]; /* XXX Should be max path length */
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews} *types;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic struct ttnam {
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews char typename[TYPECLASSBUF];
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews char macroname[TYPECLASSBUF];
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews char attr[ATTRIBUTESIZE];
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff unsigned int sorted;
471e0563c7965c556c759775882cd3448dae78eaMark Andrews int type;
471e0563c7965c556c759775882cd3448dae78eaMark Andrews} typenames[TYPENAMES];
471e0563c7965c556c759775882cd3448dae78eaMark Andrews
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic int maxtype = -1;
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic char *
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrenceupper(char *);
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic char *
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrencefunname(const char *, char *);
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic void
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrencedoswitch(const char *, const char *, const char *, const char *,
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence const char *, const char *);
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic void
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrenceadd(int, const char *, int, const char *, const char *);
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic void
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrencesd(int, const char *, const char *, char);
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic void
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrenceinsert_into_typenames(int, const char *, const char *);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*%
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff * If you use more than 10 of these in, say, a printf(), you'll have problems.
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff */
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic char *
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrewsupper(char *s) {
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff static int buf_to_use = 0;
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff static char buf[10][256];
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff char *b;
b57bb9136af9f1bf84378f1f11f0efc55c52c628Mark Andrews int c;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff buf_to_use++;
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff if (buf_to_use > 9)
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff buf_to_use = 0;
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff b = buf[buf_to_use];
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff memset(b, 0, 256);
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff
89bc8a8876a94d840aa034afb8905d4735b3af7eMichael Graff while ((c = (*s++) & 0xff))
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews *b++ = islower(c) ? toupper(c) : c;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews *b = '\0';
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff return (buf[buf_to_use]);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews}
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic char *
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrencefunname(const char *s, char *buf) {
217f572018871cdf09db052a676b9933512cdbfaMark Andrews char *b = buf;
217f572018871cdf09db052a676b9933512cdbfaMark Andrews char c;
217f572018871cdf09db052a676b9933512cdbfaMark Andrews
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews INSIST(strlen(s) < TYPECLASSBUF);
217f572018871cdf09db052a676b9933512cdbfaMark Andrews while ((c = *s++)) {
217f572018871cdf09db052a676b9933512cdbfaMark Andrews *b++ = (c == '-') ? '_' : c;
217f572018871cdf09db052a676b9933512cdbfaMark Andrews }
217f572018871cdf09db052a676b9933512cdbfaMark Andrews *b = '\0';
217f572018871cdf09db052a676b9933512cdbfaMark Andrews return (buf);
217f572018871cdf09db052a676b9933512cdbfaMark Andrews}
217f572018871cdf09db052a676b9933512cdbfaMark Andrews
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic void
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrencedoswitch(const char *name, const char *function, const char *args,
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence const char *tsw, const char *csw, const char *res)
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews{
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews struct tt *tt;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews int first = 1;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews int lasttype = 0;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews int subswitch = 0;
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews char buf1[TYPECLASSBUF], buf2[TYPECLASSBUF];
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence const char *result = " result =";
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews if (res == NULL)
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews result = "";
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
f1b68725503ff3e46001eee5a1751e29a43a09d1Andreas Gustafsson for (tt = types; tt != NULL; tt = tt->next) {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews if (first) {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews fprintf(stdout, "\n#define %s \\\n", name);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews fprintf(stdout, "\tswitch (%s) { \\\n" /*}*/, tsw);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews first = 0;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews }
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews if (tt->type != lasttype && subswitch) {
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews if (res == NULL)
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews fprintf(stdout, "\t\tdefault: break; \\\n");
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews else
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews fprintf(stdout,
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews "\t\tdefault: %s; break; \\\n", res);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews fputs(/*{*/ "\t\t} \\\n", stdout);
611a37e72daff14666f7dcc781674775e0c8e5eaMark Andrews fputs("\t\tbreak; \\\n", stdout);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews subswitch = 0;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews }
d981ca645597116d227a48bf37cc5edc061c854dBob Halley if (tt->rdclass && tt->type != lasttype) {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews fprintf(stdout, "\tcase %d: switch (%s) { \\\n" /*}*/,
7c89c5c5747cacffddc6dfff44bbb5010d1beb3fMark Andrews tt->type, csw);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews subswitch = 1;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews }
d981ca645597116d227a48bf37cc5edc061c854dBob Halley if (tt->rdclass == 0)
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews fprintf(stdout,
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews "\tcase %d:%s %s_%s(%s); break;",
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews tt->type, result, function,
217f572018871cdf09db052a676b9933512cdbfaMark Andrews funname(tt->typename, buf1), args);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews else
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews fprintf(stdout,
78838d3e0cd62423c23de5503910e01884d2104bBrian Wellington "\t\tcase %d:%s %s_%s_%s(%s); break;",
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence tt->rdclass, result, function,
217f572018871cdf09db052a676b9933512cdbfaMark Andrews funname(tt->classname, buf1),
217f572018871cdf09db052a676b9933512cdbfaMark Andrews funname(tt->typename, buf2), args);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews fputs(" \\\n", stdout);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews lasttype = tt->type;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews }
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews if (subswitch) {
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews if (res == NULL)
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews fprintf(stdout, "\t\tdefault: break; \\\n");
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence else
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews fprintf(stdout, "\t\tdefault: %s; break; \\\n", res);
ffe74cc719aa0f10c38fbc1f2f3ea7db0960cb8fMark Andrews fputs(/*{*/ "\t\t} \\\n", stdout);
611a37e72daff14666f7dcc781674775e0c8e5eaMark Andrews fputs("\t\tbreak; \\\n", stdout);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews }
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews if (first) {
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews if (res == NULL)
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews fprintf(stdout, "\n#define %s\n", name);
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews else
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews fprintf(stdout, "\n#define %s %s;\n", name, res);
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews } else {
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews if (res == NULL)
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews fprintf(stdout, "\tdefault: break; \\\n");
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews else
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews fprintf(stdout, "\tdefault: %s; break; \\\n", res);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews fputs(/*{*/ "\t}\n", stdout);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews }
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews}
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
471e0563c7965c556c759775882cd3448dae78eaMark Andrewsstatic struct ttnam *
471e0563c7965c556c759775882cd3448dae78eaMark Andrewsfind_typename(int type) {
471e0563c7965c556c759775882cd3448dae78eaMark Andrews int i;
471e0563c7965c556c759775882cd3448dae78eaMark Andrews
471e0563c7965c556c759775882cd3448dae78eaMark Andrews for (i = 0; i < TYPENAMES; i++) {
471e0563c7965c556c759775882cd3448dae78eaMark Andrews if (typenames[i].typename[0] != 0 &&
471e0563c7965c556c759775882cd3448dae78eaMark Andrews typenames[i].type == type)
471e0563c7965c556c759775882cd3448dae78eaMark Andrews return (&typenames[i]);
471e0563c7965c556c759775882cd3448dae78eaMark Andrews }
471e0563c7965c556c759775882cd3448dae78eaMark Andrews return (NULL);
471e0563c7965c556c759775882cd3448dae78eaMark Andrews}
471e0563c7965c556c759775882cd3448dae78eaMark Andrews
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic void
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrenceinsert_into_typenames(int type, const char *typename, const char *attr) {
471e0563c7965c556c759775882cd3448dae78eaMark Andrews struct ttnam *ttn = NULL;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews size_t c;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews int i, n;
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff char tmp[256];
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews INSIST(strlen(typename) < TYPECLASSBUF);
471e0563c7965c556c759775882cd3448dae78eaMark Andrews for (i = 0; i < TYPENAMES; i++) {
471e0563c7965c556c759775882cd3448dae78eaMark Andrews if (typenames[i].typename[0] != 0 &&
471e0563c7965c556c759775882cd3448dae78eaMark Andrews typenames[i].type == type &&
471e0563c7965c556c759775882cd3448dae78eaMark Andrews strcmp(typename, typenames[i].typename) != 0) {
471e0563c7965c556c759775882cd3448dae78eaMark Andrews fprintf(stderr,
471e0563c7965c556c759775882cd3448dae78eaMark Andrews "Error: type %d has two names: %s, %s\n",
471e0563c7965c556c759775882cd3448dae78eaMark Andrews type, typenames[i].typename, typename);
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff exit(1);
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff }
471e0563c7965c556c759775882cd3448dae78eaMark Andrews if (typenames[i].typename[0] == 0 && ttn == NULL)
471e0563c7965c556c759775882cd3448dae78eaMark Andrews ttn = &typenames[i];
471e0563c7965c556c759775882cd3448dae78eaMark Andrews }
471e0563c7965c556c759775882cd3448dae78eaMark Andrews if (ttn == NULL) {
471e0563c7965c556c759775882cd3448dae78eaMark Andrews fprintf(stderr, "Error: typenames array too small\n");
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff exit(1);
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff }
6098d364b690cb9dabf96e9664c4689c8559bd2eMark Andrews
56510cd031b3faf7d10f86f4c059442a2dd4be45Evan Hunt /* XXXMUKS: This is redundant due to the INSIST above. */
471e0563c7965c556c759775882cd3448dae78eaMark Andrews if (strlen(typename) > sizeof(ttn->typename) - 1) {
471e0563c7965c556c759775882cd3448dae78eaMark Andrews fprintf(stderr, "Error: type name %s is too long\n",
471e0563c7965c556c759775882cd3448dae78eaMark Andrews typename);
471e0563c7965c556c759775882cd3448dae78eaMark Andrews exit(1);
471e0563c7965c556c759775882cd3448dae78eaMark Andrews }
56510cd031b3faf7d10f86f4c059442a2dd4be45Evan Hunt
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews strncpy(ttn->typename, typename, sizeof(ttn->typename));
56510cd031b3faf7d10f86f4c059442a2dd4be45Evan Hunt ttn->typename[sizeof(ttn->typename) - 1] = '\0';
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews strncpy(ttn->macroname, ttn->typename, sizeof(ttn->macroname));
56510cd031b3faf7d10f86f4c059442a2dd4be45Evan Hunt ttn->macroname[sizeof(ttn->macroname) - 1] = '\0';
56510cd031b3faf7d10f86f4c059442a2dd4be45Evan Hunt
56510cd031b3faf7d10f86f4c059442a2dd4be45Evan Hunt ttn->type = type;
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff c = strlen(ttn->macroname);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff while (c > 0) {
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff if (ttn->macroname[c - 1] == '-')
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff ttn->macroname[c - 1] = '_';
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff c--;
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff }
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff if (attr == NULL) {
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews n = snprintf(tmp, sizeof(tmp),
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews "RRTYPE_%s_ATTRIBUTES", upper(ttn->macroname));
cbb2a0ebea9b5b2e3f6bd44947871b9a32709e13Mark Andrews INSIST(n > 0 && (unsigned)n < sizeof(tmp));
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff attr = tmp;
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff }
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff if (ttn->attr[0] != 0 && strcmp(attr, ttn->attr) != 0) {
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff fprintf(stderr, "Error: type %d has different attributes: "
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff "%s, %s\n", type, ttn->attr, attr);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff exit(1);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff }
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff if (strlen(attr) > sizeof(ttn->attr) - 1) {
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff fprintf(stderr, "Error: attr (%s) [name %s] is too long\n",
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff attr, typename);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff exit(1);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff }
56510cd031b3faf7d10f86f4c059442a2dd4be45Evan Hunt
41bbb34bc20f189af62e7047ce42822615417f15Evan Hunt strncpy(ttn->attr, attr, sizeof(ttn->attr));
56510cd031b3faf7d10f86f4c059442a2dd4be45Evan Hunt ttn->attr[sizeof(ttn->attr) - 1] = '\0';
56510cd031b3faf7d10f86f4c059442a2dd4be45Evan Hunt
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff ttn->sorted = 0;
471e0563c7965c556c759775882cd3448dae78eaMark Andrews if (maxtype < type)
471e0563c7965c556c759775882cd3448dae78eaMark Andrews maxtype = type;
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff}
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic void
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrenceadd(int rdclass, const char *classname, int type, const char *typename,
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence const char *dirname)
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence{
f3ca27e9fe307b55e35ea8d7b37351650630e5a3Andreas Gustafsson struct tt *newtt = (struct tt *)malloc(sizeof(*newtt));
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff struct tt *tt, *oldtt;
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff struct cc *newcc;
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff struct cc *cc, *oldcc;
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews INSIST(strlen(typename) < TYPECLASSBUF);
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews INSIST(strlen(classname) < TYPECLASSBUF);
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews INSIST(strlen(dirname) < DIRNAMESIZE);
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff insert_into_typenames(type, typename, NULL);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff if (newtt == NULL) {
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff fprintf(stderr, "malloc() failed\n");
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff exit(1);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff }
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews newtt->next = NULL;
d981ca645597116d227a48bf37cc5edc061c854dBob Halley newtt->rdclass = rdclass;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews newtt->type = type;
56510cd031b3faf7d10f86f4c059442a2dd4be45Evan Hunt
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews strncpy(newtt->classname, classname, sizeof(newtt->classname));
56510cd031b3faf7d10f86f4c059442a2dd4be45Evan Hunt newtt->classname[sizeof(newtt->classname) - 1] = '\0';
56510cd031b3faf7d10f86f4c059442a2dd4be45Evan Hunt
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews strncpy(newtt->typename, typename, sizeof(newtt->typename));
56510cd031b3faf7d10f86f4c059442a2dd4be45Evan Hunt newtt->typename[sizeof(newtt->typename) - 1] = '\0';
56510cd031b3faf7d10f86f4c059442a2dd4be45Evan Hunt
6098d364b690cb9dabf96e9664c4689c8559bd2eMark Andrews if (strncmp(dirname, "./", 2) == 0)
6098d364b690cb9dabf96e9664c4689c8559bd2eMark Andrews dirname += 2;
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews strncpy(newtt->dirname, dirname, sizeof(newtt->dirname));
56510cd031b3faf7d10f86f4c059442a2dd4be45Evan Hunt newtt->dirname[sizeof(newtt->dirname) - 1] = '\0';
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews tt = types;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews oldtt = NULL;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
3d5cad69ec20157912e95cf3b79316dfb0a314f3Mark Andrews while ((tt != NULL) && (tt->type < type)) {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews oldtt = tt;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews tt = tt->next;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews }
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
d981ca645597116d227a48bf37cc5edc061c854dBob Halley while ((tt != NULL) && (tt->type == type) && (tt->rdclass < rdclass)) {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews if (strcmp(tt->typename, typename) != 0)
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews exit(1);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews oldtt = tt;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews tt = tt->next;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews }
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
d981ca645597116d227a48bf37cc5edc061c854dBob Halley if ((tt != NULL) && (tt->type == type) && (tt->rdclass == rdclass))
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews exit(1);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews newtt->next = tt;
3d5cad69ec20157912e95cf3b79316dfb0a314f3Mark Andrews if (oldtt != NULL)
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews oldtt->next = newtt;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews else
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews types = newtt;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
47b26abe77184f9bedc68e36bdad03332cf67570David Lawrence /*
47b26abe77184f9bedc68e36bdad03332cf67570David Lawrence * Do a class switch for this type.
47b26abe77184f9bedc68e36bdad03332cf67570David Lawrence */
d981ca645597116d227a48bf37cc5edc061c854dBob Halley if (rdclass == 0)
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews return;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
f3ca27e9fe307b55e35ea8d7b37351650630e5a3Andreas Gustafsson newcc = (struct cc *)malloc(sizeof(*newcc));
45f36932943c02159a8907380fc79dd70e2184f1Evan Hunt if (newcc == NULL) {
45f36932943c02159a8907380fc79dd70e2184f1Evan Hunt fprintf(stderr, "malloc() failed\n");
45f36932943c02159a8907380fc79dd70e2184f1Evan Hunt exit(1);
45f36932943c02159a8907380fc79dd70e2184f1Evan Hunt }
d981ca645597116d227a48bf37cc5edc061c854dBob Halley newcc->rdclass = rdclass;
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews strncpy(newcc->classname, classname, sizeof(newcc->classname));
8eb2d262dc8f542f175d21033a956d8b40a4275fMark Andrews newcc->classname[sizeof(newcc->classname) - 1] = '\0';
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews cc = classes;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews oldcc = NULL;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
d981ca645597116d227a48bf37cc5edc061c854dBob Halley while ((cc != NULL) && (cc->rdclass < rdclass)) {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews oldcc = cc;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews cc = cc->next;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews }
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
d981ca645597116d227a48bf37cc5edc061c854dBob Halley if ((cc != NULL) && cc->rdclass == rdclass) {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews free((char *)newcc);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews return;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews }
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews newcc->next = cc;
3d5cad69ec20157912e95cf3b79316dfb0a314f3Mark Andrews if (oldcc != NULL)
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews oldcc->next = newcc;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews else
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews classes = newcc;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews}
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
f7d6bc93d17277a969f5559733bf1362c322b0efMark Andrewsstatic void
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrencesd(int rdclass, const char *classname, const char *dirname, char filetype) {
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews char buf[TYPECLASSLEN + sizeof("_65535.h")];
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews char typename[TYPECLASSBUF];
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews int type, n;
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence isc_dir_t dir;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence if (!start_directory(dirname, &dir))
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews return;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence while (next_file(&dir)) {
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews if (sscanf(dir.filename, TYPECLASSFMT, typename, &type) != 2)
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews continue;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews if ((type > 65535) || (type < 0))
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews continue;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews n = snprintf(buf, sizeof(buf), "%s_%d.%c", typename,
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews type, filetype);
cbb2a0ebea9b5b2e3f6bd44947871b9a32709e13Mark Andrews INSIST(n > 0 && (unsigned)n < sizeof(buf));
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence if (strcmp(buf, dir.filename) != 0)
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews continue;
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence add(rdclass, classname, type, typename, dirname);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews }
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence end_directory(&dir);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews}
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graffstatic unsigned int
6d12fdf96621801e80f3f4c2a8a569fe48766a20David LawrenceHASH(char *string) {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews size_t n;
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff unsigned char a, b;
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff n = strlen(string);
88cad5372415468e9a98a102b0994fea60426b0cMichael Graff if (n == 0) {
88cad5372415468e9a98a102b0994fea60426b0cMichael Graff fprintf(stderr, "n == 0?\n");
88cad5372415468e9a98a102b0994fea60426b0cMichael Graff exit(1);
88cad5372415468e9a98a102b0994fea60426b0cMichael Graff }
88cad5372415468e9a98a102b0994fea60426b0cMichael Graff a = tolower((unsigned char)string[0]);
88cad5372415468e9a98a102b0994fea60426b0cMichael Graff b = tolower((unsigned char)string[n - 1]);
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff return ((a + n) * b) % 256;
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff}
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrewsint
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrewsmain(int argc, char **argv) {
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews char buf[DIRNAMESIZE]; /* XXX Should be max path length */
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews char srcdir[DIRNAMESIZE]; /* XXX Should be max path length */
d981ca645597116d227a48bf37cc5edc061c854dBob Halley int rdclass;
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews char classname[TYPECLASSBUF];
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews struct tt *tt;
a98551ef592e9be6008e0141ceeb32efd586c5efMark Andrews struct cc *cc;
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff struct ttnam *ttn, *ttn2;
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff unsigned int hash;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews struct tm *tm;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews time_t now;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews char year[11];
bfb2a81b65579882a80855c279cedc45aebd62e8Mark Andrews int lasttype;
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews int code = 1;
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews int class_enum = 0;
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews int type_enum = 0;
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews int structs = 0;
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews int depend = 0;
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews int c, i, j, n;
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews char buf1[TYPECLASSBUF];
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews char filetype = 'c';
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews FILE *fd;
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews char *prefix = NULL;
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews char *suffix = NULL;
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews char *file = NULL;
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence isc_dir_t dir;
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff
471e0563c7965c556c759775882cd3448dae78eaMark Andrews for (i = 0; i < TYPENAMES; i++)
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff memset(&typenames[i], 0, sizeof(typenames[i]));
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt srcdir[0] = '\0';
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews while ((c = isc_commandline_parse(argc, argv, "cdits:F:P:S:")) != -1)
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews switch (c) {
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews case 'c':
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews code = 0;
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews depend = 0;
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews type_enum = 0;
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews class_enum = 1;
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews filetype = 'c';
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews structs = 0;
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews break;
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews case 'd':
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews code = 0;
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews depend = 1;
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews class_enum = 0;
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews type_enum = 0;
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews structs = 0;
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews filetype = 'h';
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews break;
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews case 't':
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews code = 0;
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews depend = 0;
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews class_enum = 0;
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews type_enum = 1;
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews filetype = 'c';
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews structs = 0;
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews break;
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews case 'i':
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews code = 0;
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews depend = 0;
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews class_enum = 0;
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews type_enum = 0;
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews structs = 1;
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews filetype = 'h';
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews break;
6d5dcd0dc9bdbd679282b1ffc47987d24c3a1346Bob Halley case 's':
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews if (strlen(isc_commandline_argument) >
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews DIRNAMESIZE - 2 * TYPECLASSLEN -
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews sizeof("/rdata/_65535_65535")) {
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews fprintf(stderr, "\"%s\" too long\n",
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews isc_commandline_argument);
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews exit(1);
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews }
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews n = snprintf(srcdir, sizeof(srcdir), "%s/",
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews isc_commandline_argument);
cbb2a0ebea9b5b2e3f6bd44947871b9a32709e13Mark Andrews INSIST(n > 0 && (unsigned)n < sizeof(srcdir));
6d5dcd0dc9bdbd679282b1ffc47987d24c3a1346Bob Halley break;
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews case 'F':
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews file = isc_commandline_argument;
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews break;
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews case 'P':
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence prefix = isc_commandline_argument;
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews break;
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews case 'S':
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence suffix = isc_commandline_argument;
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews break;
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews case '?':
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews exit(1);
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews }
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews n = snprintf(buf, sizeof(buf), "%srdata", srcdir);
cbb2a0ebea9b5b2e3f6bd44947871b9a32709e13Mark Andrews INSIST(n > 0 && (unsigned)n < sizeof(srcdir));
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence if (!start_directory(buf, &dir))
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews exit(1);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence while (next_file(&dir)) {
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews if (sscanf(dir.filename, TYPECLASSFMT, classname,
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews &rdclass) != 2)
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews continue;
d981ca645597116d227a48bf37cc5edc061c854dBob Halley if ((rdclass > 65535) || (rdclass < 0))
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews continue;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews n = snprintf(buf, sizeof(buf), "%srdata/%s_%d",
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews srcdir, classname, rdclass);
cbb2a0ebea9b5b2e3f6bd44947871b9a32709e13Mark Andrews INSIST(n > 0 && (unsigned)n < sizeof(buf));
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence if (strcmp(buf + 6 + strlen(srcdir), dir.filename) != 0)
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews continue;
d981ca645597116d227a48bf37cc5edc061c854dBob Halley sd(rdclass, classname, buf, filetype);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews }
53bd3f325f898b6892742ce928da3daa02ba0eddDavid Lawrence end_directory(&dir);
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews n = snprintf(buf, sizeof(buf), "%srdata/generic", srcdir);
cbb2a0ebea9b5b2e3f6bd44947871b9a32709e13Mark Andrews INSIST(n > 0 && (unsigned)n < sizeof(srcdir));
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews sd(0, "", buf, filetype);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews if (time(&now) != -1) {
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews if ((tm = localtime(&now)) != NULL && tm->tm_year > 104) {
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews n = snprintf(year, sizeof(year), "-%d",
e285c6ea84312a7be807b3af30151444b0002ba6Mark Andrews tm->tm_year + 1900);
cbb2a0ebea9b5b2e3f6bd44947871b9a32709e13Mark Andrews INSIST(n > 0 && (unsigned)n < sizeof(year));
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt } else {
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt snprintf(year, sizeof(year), "-2016");
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt }
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt } else {
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt snprintf(year, sizeof(year), "-2016");
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt }
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt if (!depend)
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt fprintf(stdout, copyright, year);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews if (code) {
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence fputs("#ifndef DNS_CODE_H\n", stdout);
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence fputs("#define DNS_CODE_H 1\n\n", stdout);
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence fputs("#include <isc/boolean.h>\n", stdout);
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence fputs("#include <isc/result.h>\n\n", stdout);
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence fputs("#include <dns/name.h>\n\n", stdout);
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence
f1b68725503ff3e46001eee5a1751e29a43a09d1Andreas Gustafsson for (tt = types; tt != NULL; tt = tt->next)
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff fprintf(stdout, "#include \"%s/%s_%d.c\"\n",
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff tt->dirname, tt->typename, tt->type);
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff fputs("\n\n", stdout);
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews doswitch("FROMTEXTSWITCH", "fromtext", FROMTEXTARGS,
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews FROMTEXTTYPE, FROMTEXTCLASS, FROMTEXTDEF);
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews doswitch("TOTEXTSWITCH", "totext", TOTEXTARGS,
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews TOTEXTTYPE, TOTEXTCLASS, TOTEXTDEF);
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews doswitch("FROMWIRESWITCH", "fromwire", FROMWIREARGS,
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews FROMWIRETYPE, FROMWIRECLASS, FROMWIREDEF);
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews doswitch("TOWIRESWITCH", "towire", TOWIREARGS,
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews TOWIRETYPE, TOWIRECLASS, TOWIREDEF);
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews doswitch("COMPARESWITCH", "compare", COMPAREARGS,
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews COMPARETYPE, COMPARECLASS, COMPAREDEF);
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrews doswitch("CASECOMPARESWITCH", "casecompare", COMPAREARGS,
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrews COMPARETYPE, COMPARECLASS, COMPAREDEF);
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews doswitch("FROMSTRUCTSWITCH", "fromstruct", FROMSTRUCTARGS,
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews FROMSTRUCTTYPE, FROMSTRUCTCLASS, FROMSTRUCTDEF);
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews doswitch("TOSTRUCTSWITCH", "tostruct", TOSTRUCTARGS,
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews TOSTRUCTTYPE, TOSTRUCTCLASS, TOSTRUCTDEF);
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews doswitch("FREESTRUCTSWITCH", "freestruct", FREESTRUCTARGS,
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews FREESTRUCTTYPE, FREESTRUCTCLASS, FREESTRUCTDEF);
d981ca645597116d227a48bf37cc5edc061c854dBob Halley doswitch("ADDITIONALDATASWITCH", "additionaldata",
d981ca645597116d227a48bf37cc5edc061c854dBob Halley ADDITIONALDATAARGS, ADDITIONALDATATYPE,
d981ca645597116d227a48bf37cc5edc061c854dBob Halley ADDITIONALDATACLASS, ADDITIONALDATADEF);
477437f48d24f46c2c2f5271c53e759f0b4ca1caBob Halley doswitch("DIGESTSWITCH", "digest",
477437f48d24f46c2c2f5271c53e759f0b4ca1caBob Halley DIGESTARGS, DIGESTTYPE,
477437f48d24f46c2c2f5271c53e759f0b4ca1caBob Halley DIGESTCLASS, DIGESTDEF);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews doswitch("CHECKOWNERSWITCH", "checkowner",
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews CHECKOWNERARGS, CHECKOWNERTYPE,
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews CHECKOWNERCLASS, CHECKOWNERDEF);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews doswitch("CHECKNAMESSWITCH", "checknames",
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews CHECKNAMESARGS, CHECKNAMESTYPE,
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews CHECKNAMESCLASS, CHECKNAMESDEF);
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff /*
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff * From here down, we are processing the rdata names and
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff * attributes.
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff */
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews
471e0563c7965c556c759775882cd3448dae78eaMark Andrews#define PRINT_COMMA(x) (x == maxtype ? "" : ",")
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff
47b26abe77184f9bedc68e36bdad03332cf67570David Lawrence#define METANOTQUESTION "DNS_RDATATYPEATTR_META | " \
47b26abe77184f9bedc68e36bdad03332cf67570David Lawrence "DNS_RDATATYPEATTR_NOTQUESTION"
47b26abe77184f9bedc68e36bdad03332cf67570David Lawrence#define METAQUESTIONONLY "DNS_RDATATYPEATTR_META | " \
47b26abe77184f9bedc68e36bdad03332cf67570David Lawrence "DNS_RDATATYPEATTR_QUESTIONONLY"
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff#define RESERVED "DNS_RDATATYPEATTR_RESERVED"
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff /*
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff * Add in reserved/special types. This will let us
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff * sort them without special cases.
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff */
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff insert_into_typenames(0, "reserved0", RESERVED);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff insert_into_typenames(31, "eid", RESERVED);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff insert_into_typenames(32, "nimloc", RESERVED);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff insert_into_typenames(34, "atma", RESERVED);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff insert_into_typenames(100, "uinfo", RESERVED);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff insert_into_typenames(101, "uid", RESERVED);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff insert_into_typenames(102, "gid", RESERVED);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff insert_into_typenames(251, "ixfr", METAQUESTIONONLY);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff insert_into_typenames(252, "axfr", METAQUESTIONONLY);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff insert_into_typenames(253, "mailb", METAQUESTIONONLY);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff insert_into_typenames(254, "maila", METAQUESTIONONLY);
8de9b6a1767498243d06359830d7840fdd10e49fMichael Graff insert_into_typenames(255, "any", METAQUESTIONONLY);
7ec579cd5d07228c0d6cece58b80694ad8d59de9Michael Graff
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff /*
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff * Spit out a quick and dirty hash function. Here,
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff * we walk through the list of type names, and calculate
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff * a hash. This isn't perfect, but it will generate "pretty
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff * good" estimates. Lowercase the characters before
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff * computing in all cases.
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff *
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff * Here, walk the list from top to bottom, calculating
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff * the hash (mod 256) for each name.
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff */
8695d7b357789bedff63e5b19c5ab25cd58fcd4bMark Andrews fprintf(stdout, "#define RDATATYPE_COMPARE(_s, _d, _tn, _n, _tp) \\\n");
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "\tdo { \\\n");
8695d7b357789bedff63e5b19c5ab25cd58fcd4bMark Andrews fprintf(stdout, "\t\tif (sizeof(_s) - 1 == _n && \\\n"
8695d7b357789bedff63e5b19c5ab25cd58fcd4bMark Andrews "\t\t strncasecmp(_s,(_tn),"
8695d7b357789bedff63e5b19c5ab25cd58fcd4bMark Andrews "(sizeof(_s) - 1)) == 0) { \\\n");
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews fprintf(stdout, "\t\t\tif ((dns_rdatatype_attributes(_d) & "
6098d364b690cb9dabf96e9664c4689c8559bd2eMark Andrews "DNS_RDATATYPEATTR_RESERVED) != 0) \\\n");
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "\t\t\t\treturn (ISC_R_NOTIMPLEMENTED); \\\n");
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "\t\t\t*(_tp) = _d; \\\n");
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "\t\t\treturn (ISC_R_SUCCESS); \\\n");
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "\t\t} \\\n");
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "\t} while (0)\n\n");
95f908eb79303b3e9fec1f9854b283532dfe9b1cMichael Graff
8695d7b357789bedff63e5b19c5ab25cd58fcd4bMark Andrews fprintf(stdout, "#define RDATATYPE_FROMTEXT_SW(_hash,"
8695d7b357789bedff63e5b19c5ab25cd58fcd4bMark Andrews "_typename,_length,_typep) \\\n");
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "\tswitch (_hash) { \\\n");
471e0563c7965c556c759775882cd3448dae78eaMark Andrews for (i = 0; i <= maxtype; i++) {
471e0563c7965c556c759775882cd3448dae78eaMark Andrews ttn = find_typename(i);
471e0563c7965c556c759775882cd3448dae78eaMark Andrews if (ttn == NULL)
471e0563c7965c556c759775882cd3448dae78eaMark Andrews continue;
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff /*
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff * Skip entries we already processed.
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff */
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff if (ttn->sorted != 0)
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff continue;
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff hash = HASH(ttn->typename);
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "\t\tcase %u: \\\n", hash);
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff /*
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff * Find all other entries that happen to match
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff * this hash.
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff */
471e0563c7965c556c759775882cd3448dae78eaMark Andrews for (j = 0; j <= maxtype; j++) {
471e0563c7965c556c759775882cd3448dae78eaMark Andrews ttn2 = find_typename(j);
471e0563c7965c556c759775882cd3448dae78eaMark Andrews if (ttn2 == NULL)
88cad5372415468e9a98a102b0994fea60426b0cMichael Graff continue;
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff if (hash == HASH(ttn2->typename)) {
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "\t\t\tRDATATYPE_COMPARE"
705d56b47a932cc277f980755e80ac4f46a18a64Mark Andrews "(\"%s\", %d, "
8695d7b357789bedff63e5b19c5ab25cd58fcd4bMark Andrews "_typename, _length, _typep); \\\n",
471e0563c7965c556c759775882cd3448dae78eaMark Andrews ttn2->typename, ttn2->type);
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff ttn2->sorted = 1;
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff }
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff }
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "\t\t\tbreak; \\\n");
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff }
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "\t}\n");
94a537e6ab3069f8d34e12e5ea722250be2b89c8Michael Graff
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews fprintf(stdout, "#define RDATATYPE_ATTRIBUTE_SW \\\n");
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews fprintf(stdout, "\tswitch (type) { \\\n");
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews for (i = 0; i <= maxtype; i++) {
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews ttn = find_typename(i);
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews if (ttn == NULL)
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews continue;
705d56b47a932cc277f980755e80ac4f46a18a64Mark Andrews fprintf(stdout, "\tcase %d: return (%s); \\\n",
6098d364b690cb9dabf96e9664c4689c8559bd2eMark Andrews i, upper(ttn->attr));
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews }
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews fprintf(stdout, "\t}\n");
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews fprintf(stdout, "#define RDATATYPE_TOTEXT_SW \\\n");
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews fprintf(stdout, "\tswitch (type) { \\\n");
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews for (i = 0; i <= maxtype; i++) {
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews ttn = find_typename(i);
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews if (ttn == NULL)
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews continue;
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews /*
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews * Remove KEYDATA (65533) from the type to memonic
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews * translation as it is internal use only. This
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews * stops the tools from displaying KEYDATA instead
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews * of TYPE65533.
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews */
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews if (i == 65533U)
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews continue;
705d56b47a932cc277f980755e80ac4f46a18a64Mark Andrews fprintf(stdout, "\tcase %d: return "
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews "(str_totext(\"%s\", target)); \\\n",
6098d364b690cb9dabf96e9664c4689c8559bd2eMark Andrews i, upper(ttn->typename));
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews }
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews fprintf(stdout, "\t}\n");
28b863e609ff2d97b78663b46894494cfa2ea411Mark Andrews
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence fputs("#endif /* DNS_CODE_H */\n", stdout);
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews } else if (type_enum) {
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence char *s;
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence fprintf(stdout, "#ifndef DNS_ENUMTYPE_H\n");
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "#define DNS_ENUMTYPE_H 1\n\n");
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "enum {\n");
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "\tdns_rdatatype_none = 0,\n");
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews lasttype = 0;
f1b68725503ff3e46001eee5a1751e29a43a09d1Andreas Gustafsson for (tt = types; tt != NULL; tt = tt->next)
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews if (tt->type != lasttype)
47b26abe77184f9bedc68e36bdad03332cf67570David Lawrence fprintf(stdout,
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence "\tdns_rdatatype_%s = %d,\n",
217f572018871cdf09db052a676b9933512cdbfaMark Andrews funname(tt->typename, buf1),
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence lasttype = tt->type);
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "\tdns_rdatatype_ixfr = 251,\n");
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "\tdns_rdatatype_axfr = 252,\n");
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "\tdns_rdatatype_mailb = 253,\n");
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "\tdns_rdatatype_maila = 254,\n");
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "\tdns_rdatatype_any = 255\n");
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "};\n\n");
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "#define dns_rdatatype_none\t"
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence "((dns_rdatatype_t)dns_rdatatype_none)\n");
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence
f1b68725503ff3e46001eee5a1751e29a43a09d1Andreas Gustafsson for (tt = types; tt != NULL; tt = tt->next)
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence if (tt->type != lasttype) {
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence s = funname(tt->typename, buf1);
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout,
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence "#define dns_rdatatype_%s\t%s"
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence "((dns_rdatatype_t)dns_rdatatype_%s)"
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence "\n",
5eb91bd90e3ad3426e5e3213031556a737cf3809Mark Andrews s, strlen(s) < 2U ? "\t" : "", s);
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence lasttype = tt->type;
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence }
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "#define dns_rdatatype_ixfr\t"
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence "((dns_rdatatype_t)dns_rdatatype_ixfr)\n");
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "#define dns_rdatatype_axfr\t"
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence "((dns_rdatatype_t)dns_rdatatype_axfr)\n");
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "#define dns_rdatatype_mailb\t"
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence "((dns_rdatatype_t)dns_rdatatype_mailb)\n");
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "#define dns_rdatatype_maila\t"
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence "((dns_rdatatype_t)dns_rdatatype_maila)\n");
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "#define dns_rdatatype_any\t"
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence "((dns_rdatatype_t)dns_rdatatype_any)\n");
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence fprintf(stdout, "\n#endif /* DNS_ENUMTYPE_H */\n");
0b056755b2f423ba5f6adac8f7851d78f7d11437David Lawrence
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews } else if (class_enum) {
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence char *s;
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence int classnum;
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "#ifndef DNS_ENUMCLASS_H\n");
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "#define DNS_ENUMCLASS_H 1\n\n");
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "enum {\n");
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "\tdns_rdataclass_reserved0 = 0,\n");
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "#define dns_rdataclass_reserved0 \\\n\t\t\t\t"
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence "((dns_rdataclass_t)dns_rdataclass_reserved0)\n");
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence#define PRINTCLASS(name, num) \
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence do { \
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence s = funname(name, buf1); \
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence classnum = num; \
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "\tdns_rdataclass_%s = %d%s\n", s, classnum, \
f8faa9fe099f7367e631df8ff5ce9a8982b0ae39David Lawrence classnum != 255 ? "," : ""); \
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "#define dns_rdataclass_%s\t" \
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence "((dns_rdataclass_t)dns_rdataclass_%s)\n", s, s); \
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence } while (0)
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews
18b8cd9e27cc2aa80b3e93b5ec8161e571223224Michael Graff for (cc = classes; cc != NULL; cc = cc->next) {
ef67e6d8fa86d98a2c0defc43b624434324d9ce7Mark Andrews if (cc->rdclass == 3)
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence PRINTCLASS("chaos", 3);
ef67e6d8fa86d98a2c0defc43b624434324d9ce7Mark Andrews else if (cc->rdclass == 255)
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence PRINTCLASS("none", 254);
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence PRINTCLASS(cc->classname, cc->rdclass);
18b8cd9e27cc2aa80b3e93b5ec8161e571223224Michael Graff }
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence#undef PRINTCLASS
1c70c5ee90d80eebb18033b2553a42c3652a9d72David Lawrence
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "};\n\n");
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer fprintf(stdout, "#endif /* DNS_ENUMCLASS_H */\n");
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews } else if (structs) {
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews if (prefix != NULL) {
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews if ((fd = fopen(prefix,"r")) != NULL) {
f3ca27e9fe307b55e35ea8d7b37351650630e5a3Andreas Gustafsson while (fgets(buf, sizeof(buf), fd) != NULL)
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews fputs(buf, stdout);
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews fclose(fd);
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews }
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews }
f1b68725503ff3e46001eee5a1751e29a43a09d1Andreas Gustafsson for (tt = types; tt != NULL; tt = tt->next) {
41bbb34bc20f189af62e7047ce42822615417f15Evan Hunt snprintf(buf, sizeof(buf), "%s/%s_%d.h",
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews tt->dirname, tt->typename, tt->type);
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews if ((fd = fopen(buf,"r")) != NULL) {
f3ca27e9fe307b55e35ea8d7b37351650630e5a3Andreas Gustafsson while (fgets(buf, sizeof(buf), fd) != NULL)
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews fputs(buf, stdout);
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews fclose(fd);
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews }
4fd3e3482c7e4ce01e2cf28f13e0152c8e50d746Mark Andrews }
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews if (suffix != NULL) {
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews if ((fd = fopen(suffix,"r")) != NULL) {
f3ca27e9fe307b55e35ea8d7b37351650630e5a3Andreas Gustafsson while (fgets(buf, sizeof(buf), fd) != NULL)
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews fputs(buf, stdout);
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews fclose(fd);
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews }
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews }
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews } else if (depend) {
f1b68725503ff3e46001eee5a1751e29a43a09d1Andreas Gustafsson for (tt = types; tt != NULL; tt = tt->next)
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews fprintf(stdout, "%s:\t%s/%s_%d.h\n", file,
d2b5fe92a4755ce67f2dd6050955782b4fd6b3f3Mark Andrews tt->dirname, tt->typename, tt->type);
0c67279acb4a6ac356879498b220645755d77cc9Mark Andrews }
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews if (ferror(stdout) != 0)
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews exit(1);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
10ba7f6f563d68b8f1284847ccce85b706e793feBob Halley return (0);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews}