+
+quarantineblock: QUARANTINE '{' quarantineitems '}' ';';
+quarantineitems: quarantineitems quarantineitem | quarantineitem;
+quarantineitem: QSTRING '=' QSTRING ';'
+{
+ struct qline *qconf = MyCalloc(1, sizeof(*qconf));
+ qconf->chname = $1;
+ qconf->reason = $3;
+ qconf->next = GlobalQuarantineList;
+ GlobalQuarantineList = qconf;
+};
+
+pseudoblock: PSEUDO QSTRING '{'
+{
+ smap = MyCalloc(1, sizeof(struct s_map));
+ smap->command = $2;
+}
+pseudoitems '}' ';'
+{
+ int valid = 0;
+
+ if (!smap->name)
+ parse_error("Missing name in pseudo %s block", smap->command);
+ else if (!smap->services)
+ parse_error("Missing nick in pseudo %s block", smap->command);
+ else if (!strIsAlpha(smap->command))
+ parse_error("Pseudo command %s invalid: must all be letters", smap->command);
+ else
+ valid = 1;
+ if (valid && register_mapping(smap))
+ {
+ smap->next = GlobalServiceMapList;
+ GlobalServiceMapList = smap;
+ }
+ else
+ {
+ free_mapping(smap);
+ }
+ smap = NULL;
+};
+
+pseudoitems: pseudoitem pseudoitems | pseudoitem;
+pseudoitem: pseudoname | pseudoprepend | pseudonick | pseudoflags;
+pseudoname: NAME '=' QSTRING ';'
+{
+ MyFree(smap->name);
+ smap->name = $3;
+};
+pseudoprepend: PREPEND '=' QSTRING ';'
+{
+ MyFree(smap->prepend);
+ smap->prepend = $3;
+};
+pseudonick: NICK '=' QSTRING ';'
+{
+ char *sep = strchr($3, '@');
+
+ if (sep != NULL) {
+ size_t slen = strlen($3);
+ struct nick_host *nh = MyMalloc(sizeof(*nh) + slen);
+ memcpy(nh->nick, $3, slen + 1);
+ nh->nicklen = sep - $3;
+ nh->next = smap->services;
+ smap->services = nh;
+ }
+ MyFree($3);
+};
+pseudoflags: FAST ';'
+{
+ smap->flags |= SMAP_FAST;
+};
+
+iauthblock: IAUTH '{' iauthitems '}' ';'
+{
+ auth_spawn(stringno, stringlist);
+ while (stringno > 0)
+ {
+ --stringno;
+ MyFree(stringlist[stringno]);
+ }
+};
+
+iauthitems: iauthitem iauthitems | iauthitem;
+iauthitem: iauthprogram;
+iauthprogram: PROGRAM '='
+{
+ while (stringno > 0)
+ {
+ --stringno;
+ MyFree(stringlist[stringno]);
+ }
+} stringlist ';';