+stralloc qsender = {0};
+stralloc tmpline = {0};
+char *verhhost = (char *)0;
+char *verhlocal = (char *)0;
+int flagheader,flagdobody;
+unsigned int i;
+
+int verhline(sa)
+stralloc *sa;
+/* substitutes ##L => recipient local, ##H => recipient host if VERP sender */
+/* returns 0 normally, -1 on out-of-memory */
+{
+ register char *cp;
+ char *cpnext,*cpafter;
+
+ if (!verhlocal) return 0; /* no VERP SENDER */
+ cp = sa->s;
+ cpnext = sa->s;
+ cpafter = cp + sa->len;
+ tmpline.len = 0; /* clear */
+ for (;;) {
+ while (cp < cpafter && *cp++ != '#');
+ if (cp + 1 < cpafter && *cp == '#') { /* found '##' */
+ cp++;
+ if (*cp == 'L') { /* ##L */
+ if (!stralloc_catb(&tmpline,cpnext,cp - cpnext - 2)) return -1;
+ cp++;
+ cpnext = cp;
+ if (!stralloc_cats(&tmpline,verhlocal)) return -1;
+ } else if (*cp == 'H') { /* ##H */
+ if (!stralloc_catb(&tmpline,cpnext,cp - cpnext - 2)) return -1;
+ cp++;
+ cpnext = cp;
+ if (!stralloc_cats(&tmpline,verhhost)) return -1;
+ }
+ }
+ if (cp >= cpafter) {
+ if (tmpline.len) { /* true if we've done any substitutions */
+ if (!stralloc_catb(&tmpline,cpnext,cpafter - cpnext)) return -1;
+ if (!stralloc_copy(sa,&tmpline)) return -1;
+ }
+ return 0;
+ }
+ }
+}