make the maximum number of simultaneous SMTP connections an option
[unix-history] / usr / src / usr.sbin / config / mkheaders.c
index c37d387..116b579 100644 (file)
@@ -1,6 +1,7 @@
+/*     mkheaders.c     1.13    82/12/09        */
+
 /*
 /*
- * mkheaders.c 1.2     81/02/24
- * Make header files for EVERYTHING
+ * Make all the .h files for the optional entries
  */
 
 #include <stdio.h>
  */
 
 #include <stdio.h>
 #include "config.h"
 #include "y.tab.h"
 
 #include "config.h"
 #include "y.tab.h"
 
-
-
 headers()
 {
 headers()
 {
-    register struct device *ip;
-    register struct file_list *tp;
-    register int count;
+       register struct file_list *fl;
 
 
-    for (tp = ftab; tp != NULL; tp = tp->f_next)
-    {
-       if (tp->f_needs == NULL)
-           continue;
-       count = 0;
-       for (ip = dtab; ip != NULL; ip = ip->d_next)
-       {
-           if (eq(tp->f_needs, ip->d_name))
-               count++;
-       }
-       do_header(tp->f_needs, count);
-    }
+       for (fl = ftab; fl != 0; fl = fl->f_next)
+               if (fl->f_needs != 0)
+                       do_count(fl->f_needs, fl->f_needs, 1);
 }
 
 /*
 }
 
 /*
- * tomacro
- *     Convert a two character name to a NXX
+ * count all the devices of a certain type and recurse to count
+ * whatever the device is connected to
  */
  */
+do_count(dev, hname, search)
+       register char *dev, *hname;
+       int search;
+{
+       register struct device *dp, *mp;
+       register int count;
 
 
-tomacro(nm)
-register char *nm;
+       for (count = 0,dp = dtab; dp != 0; dp = dp->d_next)
+               if (dp->d_unit != -1 && eq(dp->d_name, dev)) {
+                       if (dp->d_type == PSEUDO_DEVICE) {
+                               count =
+                                   dp->d_slave != UNKNOWN ? dp->d_slave : 1;
+                               break;
+                       }
+                       count++;
+                       /*
+                        * Allow holes in unit numbering,
+                        * assumption is unit numbering starts
+                        * at zero.
+                        */
+                       if (dp->d_unit + 1 > count)
+                               count = dp->d_unit + 1;
+                       if (search) {
+                               mp = dp->d_conn;
+                               if (mp != 0 && mp != (struct device *)-1 &&
+                                   mp->d_conn != (struct device *)-1) {
+                                       do_count(mp->d_name, hname, 0);
+                                       search = 0;
+                               }
+                       }
+               }
+       do_header(dev, hname, count);
+}
+
+do_header(dev, hname, count)
+       char *dev, *hname;
+       int count;
 {
 {
-    static char ret[80];
-    register char *cp;
+       char *file, *name, *inw, *toheader(), *tomacro();
+       struct file_list *fl, *fl_head;
+       FILE *inf, *outf;
+       int inc, oldcount;
 
 
-    cp = ret;
-    *cp++ = 'N';
-    while(*nm)
-       *cp++ = toupper(*nm++);
-    *cp++ = '\0';
-    return ret;
+       file = toheader(hname);
+       name = tomacro(dev);
+       inf = fopen(file, "r");
+       oldcount = -1;
+       if (inf == 0) {
+               outf = fopen(file, "w");
+               if (outf == 0) {
+                       perror(file);
+                       exit(1);
+               }
+               fprintf(outf, "#define %s %d\n", name, count);
+               (void) fclose(outf);
+               return;
+       }
+       fl_head = 0;
+       for (;;) {
+               char *cp;
+               if ((inw = get_word(inf)) == 0 || inw == (char *)EOF)
+                       break;
+               if ((inw = get_word(inf)) == 0 || inw == (char *)EOF)
+                       break;
+               inw = ns(inw);
+               cp = get_word(inf);
+               if (cp == 0 || cp == (char *)EOF)
+                       break;
+               inc = atoi(cp);
+               if (eq(inw, name)) {
+                       oldcount = inc;
+                       inc = count;
+               }
+               cp = get_word(inf);
+               if (cp == (char *)EOF)
+                       break;
+               fl = (struct file_list *) malloc(sizeof *fl);
+               fl->f_fn = inw;
+               fl->f_type = inc;
+               fl->f_next = fl_head;
+               fl_head = fl;
+       }
+       (void) fclose(inf);
+       if (count == oldcount) {
+               for (fl = fl_head; fl != 0; fl = fl->f_next)
+                       free((char *)fl);
+               return;
+       }
+       if (oldcount == -1) {
+               fl = (struct file_list *) malloc(sizeof *fl);
+               fl->f_fn = name;
+               fl->f_type = count;
+               fl->f_next = fl_head;
+               fl_head = fl;
+       }
+       outf = fopen(file, "w");
+       if (outf == 0) {
+               perror(file);
+               exit(1);
+       }
+       for (fl = fl_head; fl != 0; fl = fl->f_next) {
+               fprintf(outf, "#define %s %d\n",
+                   fl->f_fn, count ? fl->f_type : 0);
+               free((char *)fl);
+       }
+       (void) fclose(outf);
 }
 
 /*
 }
 
 /*
- * do_header:
- *     See if a header file needs to be changed
+ * convert a dev name to a .h file name
  */
  */
+char *
+toheader(dev)
+       char *dev;
+{
+       static char hbuf[80];
 
 
-do_header(dev, count)
-char *dev;
-int count;
+       (void) strcpy(hbuf, path(dev));
+       (void) strcat(hbuf, ".h");
+       return (hbuf);
+}
+
+/*
+ * convert a dev name to a macro name
+ */
+char *tomacro(dev)
+       register char *dev;
 {
 {
-    register FILE *f;
-    char file[80];
-    register char *w;
-    register int oldcount;
+       static char mbuf[20];
+       register char *cp;
 
 
-    strcpy(file, "_unix/");
-    strcat(file, dev);
-    strcat(file, ".h");
-    oldcount = -1;
-    if ((f = fopen(file, "r")) != NULL)
-    {
-       /*
-        * Throw out the #define and the NXX
-        */
-       if ((w = get_word(f)) != EOF && w != NULL)
-           if ((w = get_word(f)) == EOF && w != NULL)
-               oldcount = atoi(get_word(f));
-       fclose(f);
-    }
-    if (oldcount != count)
-    {
-       f = fopen(file, "w");
-       fprintf(f, "#define %s %d\n", tomacro(dev), count);
-       fclose(f);
-    }
+       cp = mbuf;
+       *cp++ = 'N';
+       while (*dev)
+               *cp++ = toupper(*dev++);
+       *cp++ = 0;
+       return (mbuf);
 }
 }