#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);
}
|