#ifndef lint static char *sccsid = "@(#)nptx.c 2.5 (smail) 9/15/87"; #endif #include #include #include #include #include "defs.h" #include char *malloc(), *index(), *fullname(); void nptx(), free(), dotspace(); enum edebug debug; /* not used by nptx */ char *fnlist = NULL; /* not used by nptx */ main() { int i; char buf[SMLBUF], *p, *name, *last, *nick, *ctmp; while(gets(buf) != NULL) { /* line should be in form ** ** login First Last ** or ** login First Last(Nickname) ** */ if((p = index(buf, '\t')) == NULL) { (void) fprintf(stderr, "format error: %s\n", buf); continue; } *p++ = '\0'; name = fullname(p); dotspace(name); if (last = rindex(name, '.')) { last++; } else { last = NULL; } if ((nick = index(p, '(')) != NULL) { nick++; if ((ctmp = index(nick, ')')) == NULL) { nick = NULL; } else { *ctmp = '\0'; } } nptx(buf, name); if((last != NULL) && (nick != NULL)) { i=strlen(nick) + strlen(last) + 2; if((name = malloc(i)) != NULL) { (void) strcpy(name, nick); (void) strcat(name, "."); (void) strcat(name, last); dotspace(name); nptx(buf, name); free(name); } } } return(0); } void dotspace(s) char *s; { register char *p, *t; /* turn whitespace to '.' */ for(p = s; *p != '\0'; p++) { if((*p == ' ') || (*p == '\t')) { *p = '.'; } } /* elide leading '.'s */ for(p = s; *p == '.' ; p++) ; /* elide mulitple '.'s and all "'"s */ for(t = s; *p != '\0'; p++, t++) { *t = *p; if(*t == '\'') { t--; continue; } if(*p == '.') { while(*(++p) == '.') ; p--; } } *t = '\0'; /* elide trailing '.' */ if((t > s) && (*(--t) == '.')) *t = '\0'; } void nptx(login, name) char *login, *name; { int i,j,k,N,lim,mask; int ii,ji,ki,Ni,limi,maski; char nl[11][100], il[11][100]; char *pi, *p, *rindex(); char buf[100]; char bufi[100]; if((name == NULL) || (*name == '\0')) { return; } for(i=0; i < 10; i++) { if((p = rindex(name, '.')) == NULL) break; (void) strcpy(nl[i], p+1); *p = NULL; } (void) strcpy(nl[i], name); while((strcmpic(nl[i], "Mr" ) == 0) || (strcmpic(nl[i], "Dr" ) == 0) || (strcmpic(nl[i], "Mrs" ) == 0) || (strcmpic(nl[i], "Miss") == 0) || (strcmpic(nl[i], "Ms" ) == 0)) { i--; } while((strcmpic(nl[0], "Jr") == 0) || (strcmpic(nl[0], "Sr") == 0)) { for(j=0; j < i; j++) { (void) strcpy(nl[j], nl[j+1]); } i--; } N = i; lim = 1 << (N+1); for(mask = 1 << N ; mask < lim ; mask++) { buf[0] = '\0'; for(j = 1, k = N; j < lim; j <<=1, k--) { if(j & mask) { (void) strcat(buf, nl[k]); (void) strcat(buf, "."); } } if((p = rindex(buf, '.')) != NULL) { *p = '\0'; } for(ii=0; ii < 10; ii++) { if((pi = rindex(buf, '.')) == NULL) break; (void) strcpy(il[ii], pi+1); *pi = NULL; } (void) strcpy(il[ii], buf); Ni = ii; limi = 1 << (Ni+1); for(maski = 1 << Ni /* 0 */ ; maski < limi ; maski++) { bufi[0] = '\0'; for(ji = 1, ki = Ni; ji < limi; ji <<=1, ki--) { if(ji & maski) { (void) strcat(bufi, il[ki]); } else { char init[3]; init[0] = il[ki][0]; init[1] = '\0'; (void) strcat(bufi, init); } (void) strcat(bufi, "."); } if((pi = rindex(bufi, '.')) != NULL) { *pi = '\0'; } #ifdef DOT_REQD if(index(bufi, '.') == NULL) { continue; } #endif /* DOT_REQD */ (void) printf("%s\t%s\n",bufi, login); /* */ } } }