| #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((uchar)*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((uchar)*name) || *name == '-'){ |
| alpha = 1; |
| continue; |
| } |
| if(*name == '.'){ |
| dot = 1; |
| continue; |
| } |
| if(isdigit((uchar)*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((uchar)*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); |
| } |