home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2683 / rpc.zipcoded.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-02-07  |  3.4 KB  |  169 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <rpc/rpc.h>
  4. #include "zipcode.h"
  5.  
  6. #define ZIPFILE "/usr/local/lib/zipcode.txt"
  7. static RESULT result;    /* must be static */
  8.  
  9. RESULT *zipcode_1(keyword)
  10. char **keyword;
  11. {
  12.     FILE *zipfile;
  13.     int keynum;
  14.     char buffer[128];
  15.     char errbuf[128];
  16.     char grepbuf[128];
  17.     char keywrd[128];
  18.     int num1;
  19.     int num2;
  20.     int i;
  21.     char city[128];
  22.     char *City;
  23.     char *lowercase();
  24.     FILE *grepstream;
  25.     ZIPNEXT *zrp;
  26.     ZIPLIST *zlp;
  27.     char *pbuf();
  28.  
  29.     xdr_free(xdr_ZIPLIST, &result);    /* free memory from previous call */
  30.  
  31.     /* check length of keyword */
  32.     if (strlen(*keyword) > 120) {
  33.         sprintf(errbuf, "keyword %s too long", *keyword);
  34.         send_errmsg (errbuf);
  35.         return (&result);
  36.     }
  37.  
  38.     if ( keynum = isnum(*keyword) ) {
  39. /*
  40.  * This code finds the city given a numeric zipcode
  41.  * (can only be one match)
  42.  */
  43.         zipfile = fopen (ZIPFILE, "r");        /* open data file */
  44.         if (zipfile == NULL) {
  45.             send_errmsg ("rpc.zipcoded: unable to open zipcode.txt file");
  46.             return (&result);
  47.         }
  48.         while (fgets(buffer, 128, zipfile) != NULL) {
  49.             *(buffer+strlen(buffer)-2) == '\0';
  50.             if (*(buffer+5)=='-') {
  51.                 sscanf (buffer, "%5d-%5d", &num1, &num2);
  52.                 City = buffer+12;
  53.                } else {
  54.                 sscanf (buffer, "%5d", &num1);
  55.                 num2 = num1;
  56.                 City = buffer+6;
  57.             }
  58.             if (keynum >= num1 && keynum <= num2) {
  59.                 trunc (City);
  60.                 zlp        = (ZIPLIST *) malloc(sizeof(ZIPLIST));
  61.                 zlp->data  = (pbuf(num1, num2, City));
  62.                 zlp->next  = NULL;
  63.                 result.ziperror = 0;
  64.                 result.list= zlp;
  65.                 return (&result);
  66.             }
  67.         }
  68.         fclose (zipfile);
  69.         sprintf(errbuf, "rpc.zipcoded: no match found for zipcode %05d", keynum);
  70.         send_errmsg (errbuf);
  71.         return (&result);
  72.     } else {
  73. /*
  74.  * This code finds the zipcode(s) given a City name
  75.  */
  76.         sprintf (grepbuf, "/usr/bin/egrep -i '%s' %s", *keyword, ZIPFILE);
  77.         grepstream = popen (grepbuf, "r");
  78.         if (grepstream == NULL) {
  79.             send_errmsg ("rpc.zipcoded: can't pipe to egrep");
  80.             return (&result);
  81.         }
  82.  
  83.         zrp = &result.list;
  84.         while (fgets (buffer, 128, grepstream) != NULL) {
  85.             *(buffer+strlen(buffer)-2) == '\0';
  86.             if (*(buffer+5)=='-') {
  87.                 sscanf (buffer, "%5d-%5d", &num1, &num2);
  88.                 City = buffer+12;
  89.                } else {
  90.                 sscanf (buffer, "%5d", &num1);
  91.                 num2 = num1;
  92.                 City = buffer+6;
  93.             }
  94.             trunc (City);
  95.             zlp       = (ZIPLIST *) malloc(sizeof(ZIPLIST));
  96.             *zrp      = zlp;
  97.             zlp->data = pbuf(num1, num2, City);
  98.             zrp       = &zlp->next;
  99.         }
  100.         pclose( grepstream );
  101.         if (zrp == &result.list) {
  102.             sprintf(errbuf, 
  103.                 "rpc.zipcoded: no match found for keyword: %s", *keyword);
  104.             send_errmsg (errbuf);
  105.             return (&result);
  106.         } else {
  107.             *zrp = NULL;
  108.             result.ziperror = 0;
  109.         }
  110.         return (&result);
  111.     }
  112. }
  113.  
  114. isnum(keywrd)
  115. char *keywrd;
  116. {
  117.     int i;
  118.     int num;
  119.  
  120.     if (strlen(keywrd) != 5)
  121.         return 0;
  122.     for (i=0; i<5; i++)
  123.         if (!isdigit(*(keywrd+i)))
  124.             return 0;
  125.     sscanf(keywrd, "%d", &num);
  126.     return num;
  127. }
  128.  
  129. trunc(s)
  130. char *s;
  131. {
  132.     char *cp;
  133.     cp = s + strlen(s);
  134.     while (cp-- >= s) {
  135.         if (!isspace(*cp)) break;
  136.         *cp = NULL;
  137.     }
  138. }
  139.  
  140. char *pbuf(num1, num2, City)
  141. int num1;
  142. int num2;
  143. char *City;
  144. {
  145.     char *mp;
  146.     
  147.     mp = malloc(15+strlen(City));
  148.  
  149.     if (num1 == num2)
  150.         sprintf (mp, "%05d       %s", num1, City);
  151.     else
  152.         sprintf (mp, "%05d-%05d %s", num1, num2, City);
  153.  
  154.     return mp;
  155. }
  156.  
  157. send_errmsg (errmsg)
  158. char *errmsg;
  159. {
  160.     ZIPLIST *zlp;
  161.     char *strdup();
  162.  
  163.     zlp        = (ZIPLIST *) malloc(sizeof(ZIPLIST));
  164.     zlp->data  = strdup (errmsg);
  165.     zlp->next  = NULL;
  166.     result.list= zlp;
  167.     result.ziperror = 0;
  168. }
  169.