ref: b0377e84cf31c48afed765c433abe7eebb4135a5
dir: /sys/src/cmd/ndb/mkdb.c/
#include <u.h> #include <libc.h> #include <bio.h> #include <ctype.h> Biobuf in; Biobuf out; enum { Empty, Sys, Dk, Ip, Domain, }; int iscomment(char *name) { return *name == '#'; } /* * is this a fully specified datakit name? */ int isdk(char *name) { int slash; slash = 0; for(; *name; name++){ if(isalnum(*name)) continue; if(*name == '/'){ slash = 1; continue; } return 0; } return slash; } /* * Is this an internet domain name? */ int isdomain(char *name) { int dot = 0; int alpha = 0; for(; *name; name++){ if(isalpha(*name) || *name == '-'){ alpha = 1; continue; } if(*name == '.'){ dot = 1; continue; } if(isdigit(*name)) continue; return 0; } return dot && alpha; } /* * is this an ip address? */ int isip(char *name) { int dot = 0; for(; *name; name++){ if(*name == '.'){ dot = 1; continue; } if(isdigit(*name)) continue; return 0; } return dot; } char tup[64][64]; int ttype[64]; int ntup; void tprint(void) { int i, tab; char *p; tab = 0; for(i = 0; i < ntup; i++){ if(ttype[i] == Sys){ Bprint(&out, "sys = %s\n", tup[i]); tab = 1; ttype[i] = Empty; break; } } for(i = 0; i < ntup; i++){ if(ttype[i] == Empty) continue; if(tab) Bprint(&out, "\t"); tab = 1; switch(ttype[i]){ case Domain: Bprint(&out, "dom=%s\n", tup[i]); break; case Ip: Bprint(&out, "ip=%s\n", tup[i]); break; case Dk: p = strrchr(tup[i], '/'); if(p){ p++; if((*p == 'C' || *p == 'R') && strncmp(tup[i], "nj/astro/", p-tup[i]) == 0) Bprint(&out, "flavor=console "); } Bprint(&out, "dk=%s\n", tup[i]); break; case Sys: Bprint(&out, "sys=%s\n", tup[i]); break; } } } #define NFIELDS 64 /* * make a database file from a merged uucp/inet database */ void main(void) { int n, i, j; char *l; char *fields[NFIELDS]; int ftype[NFIELDS]; int same, match; Binit(&in, 0, OREAD); Binit(&out, 1, OWRITE); ntup = 0; while(l = Brdline(&in, '\n')){ l[Blinelen(&in)-1] = 0; n = getfields(l, fields, NFIELDS, 1, " \t"); same = 0; for(i = 0; i < n; i++){ if(iscomment(fields[i])){ n = i; break; } if(isdomain(fields[i])){ ftype[i] = Domain; for(j = 0; j < ntup; j++) if(ttype[j] == Domain && strcmp(fields[i], tup[j]) == 0){ same = 1; ftype[i] = Empty; break; } } else if(isip(fields[i])) ftype[i] = Ip; else if(isdk(fields[i])) ftype[i] = Dk; else ftype[i] = Sys; } if(!same && ntup){ tprint(); ntup = 0; } for(i = 0; i < n; i++){ match = 0; for(j = 0; j < ntup; j++){ if(ftype[i] == ttype[j] && strcmp(fields[i], tup[j]) == 0){ match = 1; break; } } if(!match){ ttype[ntup] = ftype[i]; strcpy(tup[ntup], fields[i]); ntup++; } } } if(ntup) tprint(); exits(0); }