📄 getphonenumbernam.c
字号:
#include <stdio.h>#include "../phonenumber.h"#include <sys/file.h>#include <ndbm.h>#include <ctype.h>#define MAXALIASES 35static struct phonenumberent phonenumber;static char *phonenumber_aliases[MAXALIASES];static char phonenumberbuf[BUFSIZ+1];static char *phonenumber_addrs[256];int pn_errno;/* * The following is shared with getphonenumberent.c */extern char *_phonenumber_file;DBM *_phonenumber_db = (DBM *)NULL;int _phonenumber_stayopen; /* set by setphonenumberent(), cleared by endphonenumberent() */static struct phonenumberent *fetchphonenumber(key) datum key;{ register char *cp, *tp, **ap; int naliases; if (key.dptr == 0) return ((struct phonenumberent *)NULL); key = dbm_fetch(_phonenumber_db, key); if (key.dptr == 0) return ((struct phonenumberent *)NULL); cp = key.dptr; tp = phonenumberbuf; phonenumber.pn_name = tp; while (*tp++ = *cp++) ; bcopy(cp, (char *)&naliases, sizeof(int)); cp += sizeof (int); for (ap = phonenumber_aliases; naliases > 0; naliases--) { *ap++ = tp; while (*tp++ = *cp++) ; } *ap = (char *)NULL; phonenumber.pn_aliases = phonenumber_aliases; bcopy(cp, (char *)&phonenumber.h_length, sizeof (int)); cp += sizeof (int); phonenumber.h_addr_list = phonenumber_addrs; phonenumber.h_addr = tp; bcopy(cp, tp, phonenumber.h_length); return (&phonenumber);}struct phonenumberent *getphonenumberbyname(nam) register char *nam;{ register struct phonenumberent *hp; register char **cp; datum key; char lowname[128]; register char *lp = lowname; while (*nam) if (isupper(*nam)) *lp++ = tolower(*nam++); else *lp++ = *nam++; *lp = '\0'; if ((_phonenumber_db == (DBM *)NULL) && ((_phonenumber_db = dbm_open(_phonenumber_file, O_RDONLY)) == (DBM *)NULL)) { setphonenumberent(_phonenumber_stayopen); while (hp = getphonenumberent()) { if (strcmp(hp->h_name, lowname) == 0) break; for (cp = hp->h_aliases; cp != 0 && *cp != 0; cp++) if (strcmp(*cp, lowname) == 0) goto found; } found: if (!_phonenumber_stayopen) endphonenumberent(); return (hp); } key.dptr = lowname; key.dsize = strlen(lowname); hp = fetchphonenumber(key); if (!_phonenumber_stayopen) { dbm_close(_phonenumber_db); _phonenumber_db = (DBM *)NULL; } if ( hp == NULL) h_errno = HOST_NOT_FOUND; return (hp);}struct phonenumberent *getphonenumberbyaddr(addr, length, type) char *addr; register int length; register int type;{ register struct phonenumberent *hp; datum key; if ((_phonenumber_db == (DBM *)NULL) && ((_phonenumber_db = dbm_open(_phonenumber_file, O_RDONLY)) == (DBM *)NULL)) { setphonenumberent(_phonenumber_stayopen); while (pnp = getphonenumberent()) { if (pnp->h_addrtype == type && pnp->h_length == length && bcmp(hp->h_addr, addr, length) == 0) break; } if (!_phonenumber_stayopen) endphonenumberent(); if ( hp == NULL) pn_errno = ENTRY_NOT_FOUND; return (pnp); } key.dptr = addr; key.dsize = length; pnp = fetchphonenumber(key); if (!_phonenumber_stayopen) { dbm_close(_phonenumber_db); _phonenumber_db = (DBM *)NULL; } if ( pnp == NULL) pn_errno = ENTRY_NOT_FOUND; return (pnp);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -