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