#include #include #include #include #include #include #include #include #include #include #define TITLEMAP "yeats.bytitle" #define FIRSTMAP "yeats.byfirst" char *yeatsdomain; static char *readpoem(); static int setdomain(); static void fixline(); static int first = 1; char * getyeatsbytitle(title) char *title; { char scratch[BUFSIZ]; char *filename; int flength; if(setdomain() != 0) return(NULL); fixline(scratch,title,BUFSIZ); if(yp_match(yeatsdomain,TITLEMAP, scratch,strlen(scratch), &filename,&flength) != 0) return(NULL); filename[flength] = '\0'; return(readpoem(filename)); } char * getyeatsbyfirst(first) char *first; { char scratch[BUFSIZ]; char *filename; int flength; if(setdomain() != 0) return(NULL); fixline(scratch,first,BUFSIZ); if(yp_match(yeatsdomain,FIRSTMAP, scratch,strlen(scratch), &filename,&flength) != 0) return(NULL); filename[flength] = '\0'; return(readpoem(filename)); } setyeatsent() { first = 1; if(setdomain() != 0) return(-1); else return(0); } endyeatsent() { first = 1; yeatsdomain = NULL; /* force new lookup of domain */ return(0); } char * getyeatsent() { int err; char *key, *filename; int flength; static int keylen; static char lastkey[MAXPATHLEN]; if(setdomain() != 0) return(NULL); if(first) err = yp_first(yeatsdomain,TITLEMAP, &key,&keylen,&filename,&flength); else err = yp_next(yeatsdomain,TITLEMAP, lastkey,keylen, &key,&keylen,&filename,&flength); if(err) return(NULL); else bcopy(key,lastkey,keylen); first = 0; filename[flength] = '\0'; return(readpoem(filename)); } static void fixline(out,in,max) char *out, *in; int max; { int i; for(i=0,max--; (*in != '\0') && (i < max);i++) if(isupper(*in)) *out++ = tolower(*in++); else if(isspace(*in)) { *out++ = '_'; while(isspace(*in)) *in++; } else *out++ = *in++; *out = '\0'; } static int setdomain() { int err; if((yeatsdomain == NULL) && (err = yp_get_default_domain(&yeatsdomain))) return(err); else return(0); } static char * readpoem(path) char *path; { char *poem; struct stat st; int fd; if(stat(path,&st) < 0) return(NULL); if((fd = open(path,O_RDONLY)) < 0) return(NULL); if((poem = (char *)malloc(st.st_size+1)) == NULL) { close(fd); return(NULL); } if(read(fd,poem,st.st_size) != st.st_size) { free(poem); close(fd); return(NULL); } poem[st.st_size] = '\0'; close(fd); return(poem); }