home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <ctype.h>
- #include <rpc/rpc.h>
- #include "zipcode.h"
-
- #define ZIPFILE "/usr/local/lib/zipcode.txt"
- static RESULT result; /* must be static */
-
- RESULT *zipcode_1(keyword)
- char **keyword;
- {
- FILE *zipfile;
- int keynum;
- char buffer[128];
- char errbuf[128];
- char grepbuf[128];
- char keywrd[128];
- int num1;
- int num2;
- int i;
- char city[128];
- char *City;
- char *lowercase();
- FILE *grepstream;
- ZIPNEXT *zrp;
- ZIPLIST *zlp;
- char *pbuf();
-
- xdr_free(xdr_ZIPLIST, &result); /* free memory from previous call */
-
- /* check length of keyword */
- if (strlen(*keyword) > 120) {
- sprintf(errbuf, "keyword %s too long", *keyword);
- send_errmsg (errbuf);
- return (&result);
- }
-
- if ( keynum = isnum(*keyword) ) {
- /*
- * This code finds the city given a numeric zipcode
- * (can only be one match)
- */
- zipfile = fopen (ZIPFILE, "r"); /* open data file */
- if (zipfile == NULL) {
- send_errmsg ("rpc.zipcoded: unable to open zipcode.txt file");
- return (&result);
- }
- while (fgets(buffer, 128, zipfile) != NULL) {
- *(buffer+strlen(buffer)-2) == '\0';
- if (*(buffer+5)=='-') {
- sscanf (buffer, "%5d-%5d", &num1, &num2);
- City = buffer+12;
- } else {
- sscanf (buffer, "%5d", &num1);
- num2 = num1;
- City = buffer+6;
- }
- if (keynum >= num1 && keynum <= num2) {
- trunc (City);
- zlp = (ZIPLIST *) malloc(sizeof(ZIPLIST));
- zlp->data = (pbuf(num1, num2, City));
- zlp->next = NULL;
- result.ziperror = 0;
- result.list= zlp;
- return (&result);
- }
- }
- fclose (zipfile);
- sprintf(errbuf, "rpc.zipcoded: no match found for zipcode %05d", keynum);
- send_errmsg (errbuf);
- return (&result);
- } else {
- /*
- * This code finds the zipcode(s) given a City name
- */
- sprintf (grepbuf, "/usr/bin/egrep -i '%s' %s", *keyword, ZIPFILE);
- grepstream = popen (grepbuf, "r");
- if (grepstream == NULL) {
- send_errmsg ("rpc.zipcoded: can't pipe to egrep");
- return (&result);
- }
-
- zrp = &result.list;
- while (fgets (buffer, 128, grepstream) != NULL) {
- *(buffer+strlen(buffer)-2) == '\0';
- if (*(buffer+5)=='-') {
- sscanf (buffer, "%5d-%5d", &num1, &num2);
- City = buffer+12;
- } else {
- sscanf (buffer, "%5d", &num1);
- num2 = num1;
- City = buffer+6;
- }
- trunc (City);
- zlp = (ZIPLIST *) malloc(sizeof(ZIPLIST));
- *zrp = zlp;
- zlp->data = pbuf(num1, num2, City);
- zrp = &zlp->next;
- }
- pclose( grepstream );
- if (zrp == &result.list) {
- sprintf(errbuf,
- "rpc.zipcoded: no match found for keyword: %s", *keyword);
- send_errmsg (errbuf);
- return (&result);
- } else {
- *zrp = NULL;
- result.ziperror = 0;
- }
- return (&result);
- }
- }
-
- isnum(keywrd)
- char *keywrd;
- {
- int i;
- int num;
-
- if (strlen(keywrd) != 5)
- return 0;
- for (i=0; i<5; i++)
- if (!isdigit(*(keywrd+i)))
- return 0;
- sscanf(keywrd, "%d", &num);
- return num;
- }
-
- trunc(s)
- char *s;
- {
- char *cp;
- cp = s + strlen(s);
- while (cp-- >= s) {
- if (!isspace(*cp)) break;
- *cp = NULL;
- }
- }
-
- char *pbuf(num1, num2, City)
- int num1;
- int num2;
- char *City;
- {
- char *mp;
-
- mp = malloc(15+strlen(City));
-
- if (num1 == num2)
- sprintf (mp, "%05d %s", num1, City);
- else
- sprintf (mp, "%05d-%05d %s", num1, num2, City);
-
- return mp;
- }
-
- send_errmsg (errmsg)
- char *errmsg;
- {
- ZIPLIST *zlp;
- char *strdup();
-
- zlp = (ZIPLIST *) malloc(sizeof(ZIPLIST));
- zlp->data = strdup (errmsg);
- zlp->next = NULL;
- result.list= zlp;
- result.ziperror = 0;
- }
-