1 /*****************************************************************************/
2 /*                                                                           */
3 /*                 (C) Copyright 1992-1997  Alberto Pasquale                 */
4 /*                                                                           */
5 /*                   A L L   R I G H T S   R E S E R V E D                   */
6 /*                                                                           */
7 /*****************************************************************************/
8 /*                                                                           */
9 /* This source code is NOT in the public domain and it CANNOT be used or     */
10 /* distributed without written permission from the author.                   */
11 /*                                                                           */
12 /*****************************************************************************/
13 /*                                                                           */
14 /* How to contact the author:  Alberto Pasquale of 2:332/504@fidonet         */
15 /*                             Viale Verdi 106                               */
16 /*                             41100 Modena                                  */
17 /*                             Italy                                         */
18 /*                                                                           */
19 /*****************************************************************************/
20 
21 // Addrs.Cpp
22 
23 #ifdef __OS2__
24     #define INCL_DOS
25     #include <os2.h>
26 #endif
27 
28 #include <stdio.h>
29 #include "addrs.hpp"
30 #include "misc.hpp"
31 #include "parse.hpp"
32 
33 
get_addr_2d(const char * p,ADR * adr)34 void get_addr_2d (const char *p, ADR *adr)    // leave zone as is, get net/node, set point=0
35 {
36     int n = sscanf (p, "%hd/%hd", &adr->net, &adr->node);
37     if (n != 2)
38         adr->net = adr->node = 0;
39     adr->point = 0;
40 }
41 
42 
get_addr(const char ** adrs,ADR * adr)43 BOOL get_addr (const char **adrs, ADR *adr)  // get 3 or 4D address
44 {                                      // and advance adrs
45     int n;
46 
47     *adrs = SkipBlank (*adrs);
48 
49     n = sscanf (*adrs, "%hd:%hd/%hd.%hd", &adr->zone, &adr->net, &adr->node, &adr->point);
50     if (n < 3) {
51         SetAddr (adr, 0,0,0,0);
52         return FALSE;
53     }
54     if (n < 4)
55         adr->point = 0;
56 
57     *adrs = SkipToken (*adrs);
58     return TRUE;
59 }
60 
61 
get_next_addr(const char ** adrs,ADR * adr,ADR * padr)62 BOOL get_next_addr (const char **adrs, ADR *adr, ADR *padr)
63 {
64     int n;
65     ADR pAdr;
66 
67     pAdr = *padr;   // save assumed address
68 
69     if (get_addr (adrs, adr))       // 3 or 4D
70         return TRUE;
71 
72     adr->point = 0;             // default point
73     adr->zone = pAdr.zone;     // assumed zone
74 
75     n = sscanf (*adrs, "%hd/%hd.%hd", &adr->net, &adr->node, &adr->point);
76     if (n >= 2) {
77         *adrs = SkipToken (*adrs);
78         return TRUE;
79     }
80 
81     adr->net = pAdr.net;       // assumed net
82 
83     n = sscanf (*adrs, "%hd.%hd", &adr->node, &adr->point);
84     if (n >= 1) {
85         *adrs = SkipToken (*adrs);
86         return TRUE;
87     }
88 
89     adr->node = pAdr.node;     // assumed node
90 
91     n = sscanf (*adrs, ".%hd", &adr->point);
92     if (n > 0) {
93         *adrs = SkipToken (*adrs);
94         return TRUE;
95     } else
96         return FALSE;
97 }
98 
99 
get_addr_lst(const char ** adrs,ADRLST ** tail)100 ADRLST **get_addr_lst (const char **adrs, ADRLST **tail)     // get list of addresses (starting w 3/4D)
101 {                                  // and advance adrs
102     ADR adr = {0, 0, 0, 0};
103 
104     while (get_next_addr (adrs, &adr, &adr)) {
105         *tail = new ADRLST;
106         (*tail)->adr = adr;
107         (*tail)->next = NULL;
108         tail = &((*tail)->next);
109     }
110 
111     return tail;
112 }
113 
114 
get_part_addr(const char ** adrs,ADR * adr)115 BOOL get_part_addr (const char **adrs, ADR *adr)  // get partial address
116 {                                           // starting w zone
117     int n;                                  // and advance adrs
118 
119     *adrs = SkipBlank (*adrs);
120 
121     n = sscanf (*adrs, "%hd:%hd/%hd.%hd", &adr->zone, &adr->net, &adr->node, &adr->point);
122     switch (n) {
123         case EOF:
124             n = 0;
125         case 0:
126             adr->zone = 0xFFFF;
127         case 1:
128             adr->net = 0xFFFF;
129         case 2:
130             adr->node = 0xFFFF;
131         case 3:
132             adr->point = 0xFFFF;
133         case 4:
134             ;
135     }
136 
137     if (n == 0)
138         return FALSE;
139 
140     *adrs = SkipToken (*adrs);
141     return TRUE;
142 }
143 
144 
get_part_addr(const char * adrs,EXTADR * adr)145 BOOL get_part_addr (const char *adrs, EXTADR *adr)
146 {
147     adr->region = adr->hub = 0;
148 
149     if (!get_part_addr (&adrs, adr))
150         return FALSE;
151 
152     sscanf (adrs, "%hu %hu", &adr->region, &adr->hub);
153 
154     return TRUE;
155 }
156 
157 
get_part_addr_lst(const char ** adrs,ADRLST ** tail)158 ADRLST **get_part_addr_lst (const char **adrs, ADRLST **tail) // list of partial addresses:
159 {                                   // CANNOT use abbreviations
160     ADR adr;
161 
162     while (get_part_addr (adrs, &adr)) {
163         *tail = new ADRLST;
164         (*tail)->adr = adr;
165         (*tail)->next = NULL;
166         tail = &((*tail)->next);
167     }
168 
169     return tail;
170 }
171 
172 
173 /* Is this address in the specified ADRLST ? */
174 
InAdrLst(ADR * adr,ADRLST * al)175 BOOL InAdrLst (ADR *adr, ADRLST *al)
176 {
177     while (al) {
178         if (adrcmp (&al->adr, adr) == 0)
179             return (TRUE);
180         al = al->next;
181     }
182 
183     return (FALSE);
184 }
185 
186 
InPartAdrLst(const EXTADR * adr,ADRLST * pal)187 BOOL InPartAdrLst (const EXTADR *adr, ADRLST *pal)
188 {
189     while (pal) {
190         if (adr->zone == pal->adr.zone) {
191             if (pal->adr.net == word(-1))  // zone selected
192                 return (TRUE);
193             if ((adr->region == pal->adr.net) && (pal->adr.node == word(-1))) // region
194                 return TRUE;
195             if (adr->net == pal->adr.net) {
196                 if (pal->adr.node == word(-1)) // net
197                     return (TRUE);
198                 if ((adr->hub == pal->adr.node) && (pal->adr.point == word(-1))) // hub
199                     return TRUE;
200                 if (adr->node == pal->adr.node) {
201                     if (pal->adr.point == word(-1))
202                         return TRUE;
203                     if (adr->point == pal->adr.point)
204                         return TRUE;
205                 }
206             }
207         }
208         pal = pal->next;
209     }
210     return (FALSE);
211 }
212 
213 
SetAddr(ADR * adr,word zone,word net,word node,word point)214 void SetAddr (ADR *adr, word zone, word net, word node, word point)
215 {
216     adr->zone  = zone;
217     adr->net   = net;
218     adr->node  = node;
219     adr->point = point;
220 }
221