12162Seric # include	"../hdr/defines.h"
22162Seric 
3*30497Slepreau static char Sccsid[] = "@(#)dolist.c	4.3	02/15/87";
42162Seric 
5*30497Slepreau static char br[] = "bad range (co12)";
62162Seric 
72162Seric dolist(pkt,list,ch)
82162Seric struct packet *pkt;
92162Seric register char *list;
102162Seric char ch;
112162Seric {
122162Seric 	char str[32];
132162Seric 	struct sid lowsid, highsid, sid;
142162Seric 	int n;
152162Seric 
162162Seric 	while (*list) {
172162Seric 		list = getasid(list,&lowsid);
182162Seric 		if (*list == '-') {
192162Seric 			++list;
202162Seric 			list = getasid(list,&highsid);
212162Seric 			if (lowsid.s_br == 0) {
222162Seric 				if ((highsid.s_br || highsid.s_seq ||
232162Seric 					highsid.s_rel < lowsid.s_rel ||
242162Seric 					(highsid.s_rel == lowsid.s_rel &&
252162Seric 					highsid.s_lev < lowsid.s_lev)))
262162Seric 						fatal(br);
272162Seric 				sid.s_br = sid.s_seq = 0;
282162Seric 				for (sid.s_rel = lowsid.s_rel; sid.s_rel <= highsid.s_rel; sid.s_rel++) {
292162Seric 					sid.s_lev = (sid.s_rel == lowsid.s_rel ? lowsid.s_lev : 1);
302166Seric 					for ( ; (sid.s_rel < highsid.s_rel ||
312166Seric 						 sid.s_lev <= highsid.s_lev) &&
322166Seric 						(n = sidtoser(&sid,pkt)); sid.s_lev++)
332162Seric 						enter(pkt,ch,n,&sid);
342162Seric 				}
352162Seric 			}
362162Seric 			else {
372162Seric 				if (!(highsid.s_rel == lowsid.s_rel &&
382162Seric 					highsid.s_lev == lowsid.s_lev &&
392162Seric 					highsid.s_br == lowsid.s_br &&
402162Seric 					highsid.s_seq >= lowsid.s_seq))
412162Seric 						fatal(br);
422162Seric 				for (; lowsid.s_seq <= highsid.s_seq &&
432162Seric 					(n = sidtoser(&lowsid,pkt)); lowsid.s_seq++)
442162Seric 						enter(pkt,ch,n,&lowsid);
452162Seric 			}
462162Seric 		}
472162Seric 		else {
482162Seric 			if (n = sidtoser(&lowsid,pkt))
492162Seric 				enter(pkt,ch,n,&lowsid);
502162Seric 		}
512162Seric 		if (*list == ',')
522162Seric 			++list;
532162Seric 	}
542162Seric }
552162Seric 
562162Seric 
57*30497Slepreau static char dls[] = "delta list syntax (co13)";
582162Seric 
getasid(p,sp)592162Seric getasid(p,sp)
602162Seric register char *p;
612162Seric register struct sid *sp;
622162Seric {
632162Seric 	register char *old;
642162Seric 
652162Seric 	p = sid_ab(old = p,sp);
662162Seric 	if (old == p || sp->s_rel == 0)
672162Seric 		fatal(dls);
682162Seric 	if (sp->s_lev == 0) {
692162Seric 		sp->s_lev = MAX;
702162Seric 		if (sp->s_br || sp->s_seq)
712162Seric 			fatal(dls);
722162Seric 	}
732162Seric 	else if (sp->s_br) {
742162Seric 		if (sp->s_seq == 0)
752162Seric 			sp->s_seq = MAX;
762162Seric 	}
772162Seric 	else if (sp->s_seq)
782162Seric 		fatal(dls);
792162Seric 	return(p);
802162Seric }
81