home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 2 BBS / 02-BBS.zip / XGRP_000.SZH / PRSEADDR.C < prev    next >
C/C++ Source or Header  |  1991-06-11  |  5KB  |  178 lines

  1. #include "xgroup.h"
  2.  
  3.  
  4.  
  5.  
  6. int _fastcall parse_addr (char **p, ADDR *r,ADDR *rr) {
  7.  
  8.     /* Tries to parse a string for a valid FTN addresss.
  9.        I say "tries" because it attempts to allow incomplete addresses
  10.        without getting itself confused.
  11.        p=pointer-to-pointer to string to parse
  12.        r=pointer to address structure to place parsed address in */
  13.  
  14.     char *domain,*zone,*net,*node,*point,*temp,*tcr,*tnum,*tcp,*start;
  15.     char lastdelim = 0;
  16.  
  17.  
  18.     r->domain = domain = zone = net = node = point = temp = NULL;
  19.     if(!*p || !**p) return -1;
  20.     *p = skip_white(*p);
  21.     start = *p;
  22.  
  23.     do {
  24.         temp = *p;
  25.         *p = to_delim(*p,"#:/.@\r\t ");
  26.         switch((int) **p) {
  27.             case '\r':
  28.             case '\0':
  29.             case ' ':
  30.             case '\t':  if(lastdelim == '.') point = temp;
  31.                         else if(lastdelim == '@') domain = temp;
  32.                         else node = temp;
  33.                         goto BreakOut;
  34.             case '#':   domain = temp;
  35.                         if(lastdelim == '.') {  /* handle fidonet.org */
  36.                             domain = start;
  37.                             point = NULL;
  38.                         }
  39.                         break;
  40.             case ':':   zone = temp;
  41.                         break;
  42.             case '/':   net = temp;
  43.                         break;
  44.             case '@':   if(lastdelim == '.') point = temp;
  45.                         else node = temp;
  46.                         break;
  47.             case '.':   if(lastdelim != '@') node = temp;
  48.                         else {
  49.                             *p = skip_nonwhite(*p); /* end this farce */
  50.                             goto BreakOut;
  51.                         }
  52.                         break;
  53.         }
  54.         lastdelim = **p;
  55.         (*p)++;     /* Skip delimiter */
  56.     } while(*p && **p);
  57.  
  58. BreakOut:
  59.  
  60.     if(!zone && !net && !point && !domain) {
  61.         if(!node || (!atoi(node) && *node != '0')) return -1;
  62.     }
  63.  
  64.     if(domain) {
  65.         lstrip(domain);
  66.         temp = strchr(domain,' ');
  67.         if(temp) *temp = 0;
  68.         tnum = strchr(domain,'#');
  69.         if(tnum) *tnum = 0;
  70.         tcr = strchr(domain,'\r');
  71.         if(tcr) *tcr = 0;
  72.         tcp = strchr(domain,'.');
  73.         if(tcp) *tcr = 0;
  74.         rstrip(domain);
  75.         if(*domain) {
  76.             r->domain = strdup(domain);
  77.         }
  78.         if(temp) *temp = ' ';
  79.         if(tcr) *tcr = '\r';
  80.         if(tnum) *tnum = '#';
  81.         if(tcp) *tcp = '.';
  82.     }
  83.     if(zone) r->zone = atoi(zone);
  84.     else r->zone = 0;
  85.     if(net) r->net = atoi(net);
  86.     else r->net = 0;
  87.     if(node) r->node = atoi(node);
  88.     else r->node = 0;
  89.     if(point) r->point = atoi(point);
  90.     else r->point = 0;
  91.  
  92. Again:
  93.  
  94.     if(!r->zone || !r->net || !node || !r->domain) {
  95.         if(rr) {
  96.             guess_rest(r,rr);
  97.             rr = NULL;
  98.             goto Again;
  99.         }
  100.         else return -1;
  101.     }
  102.  
  103.     return 0;
  104. }
  105.  
  106.  
  107.  
  108.  
  109. int _fastcall guess_rest (ADDR *r, ADDR *m) {
  110.  
  111.     /* Makes primitive attempt to fill in missing fields of address
  112.        r=pointer to address structure to complete
  113.        m=pointer to first address in list to find missing info in */
  114.  
  115.     ADDR *temp;
  116.  
  117.  
  118.     if(!r->net) r->net = m->net;  /* always assume primary address' net */
  119.  
  120.     if(!r->zone) {
  121.         temp = m;
  122.         r->zone = m->zone;        /* start assuming primary address' zone */
  123.         while(temp) {
  124.             if(temp->net == r->net) { /* unless we get a net match */
  125.                 r->zone = temp->zone;
  126.                 break;
  127.             }
  128.             temp = temp->next;
  129.         }
  130.     }
  131.  
  132.     if(!r->domain) {
  133.         r->domain = strdup(m->domain);  /* start assuming primary domain */
  134.         temp = m;
  135.         while(temp) {
  136.             if(temp->zone == r->zone) {   /* unless we get zone match */
  137.                 r->domain = assign(r->domain,temp->domain);
  138.             }
  139.             if(temp->net == r->net) break;    /* if we get a net match, break */
  140.             temp = temp->next;
  141.         }
  142.     }
  143.  
  144.     return 0;
  145. }
  146.  
  147.  
  148.  
  149.  
  150. ADDR * _fastcall best_guess (ADDR *r,ADDR *m) {
  151.  
  152.     /* take our best guess as to who we should be when talking to node r
  153.        m is list of addresses from which to choose */
  154.  
  155.     ADDR *temp,*ret = NULL;
  156.  
  157.  
  158.     if(!r) return m;
  159.  
  160.     temp = m;
  161.     while(temp) {
  162.         if(r->domain && temp->domain && !stricmp(temp->domain,r->domain)) {
  163.             if(!ret) ret = temp;         /* at least domains will match */
  164.             if(temp->zone == r->zone) {
  165.                 if(ret->zone != r->zone) ret = temp;  /* zones too */
  166.                 if(temp->net == r->net) {             /* nets match! */
  167.                     ret = temp;
  168.                     break;             /* close as we're likely to get */
  169.                 }
  170.             }
  171.         }
  172.         temp = temp->next;
  173.     }
  174.  
  175.     if(ret) return ret;
  176.     else return m;
  177. }
  178.