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