_PROTOTYPE(struct macro *getmp, (char *name ));
_PROTOTYPE(char *getmacro, (char *name ));
_PROTOTYPE(struct macro *setmacro, (char *name, char *val ));
+_PROTOTYPE(struct macro *addmacro, (char *name, char *val ));
_PROTOTYPE(void setDFmacro, (char *name, char *val ));
_PROTOTYPE(void doexp, (struct str *to, char *from ));
_PROTOTYPE(void expand, (struct str *strs ));
while (isspace(*p)) p++; /* Find first target */
+ while (((q = strchr(p, '+')) != (char *)0) &&
+ (q[1] == '=') && (p != q) && (q[-1] == '\\')) /* Find value */
+ {
+ a = q - 1; /* Del \ chr; move rest back */
+ p = q;
+ while(*a++ = *q++)
+ ;
+ }
+
+ if (q != (char *)0 && q[1] == '=') {
+
+ *q++ = '\0'; /* Separate name and val */
+ *q++ = '\0'; /* Separate name and val */
+ while (isspace(*q))
+ q++;
+ if (p = strrchr(q, '\n'))
+ *p = '\0';
+
+ p = str1;
+ if ((a = gettok(&p)) == (char *)0)
+ error("No macro name",(char *)0);
+
+ addmacro(a, q);
+
+ if (getline(&str1s, fd))
+ return;
+ continue;
+ }
+
+
while (((q = strchr(p, '=')) != (char *)0) &&
(p != q) && (q[-1] == '\\')) /* Find value */
{
}
+struct macro *addmacro(name, val)
+char *name;
+char *val;
+{
+ register struct macro *rp;
+ register char *cp;
+ int len_old_value;
+
+
+ /* Replace macro definition if it exists */
+ for (rp = macrohead; rp; rp = rp->m_next)
+ if (strcmp(name, rp->m_name) == 0) {
+ if(rp->m_flag & M_OVERRIDE) return rp; /* mustn't change */
+ break;
+ }
+
+ if (!rp) /* If not defined, allocate space for new */
+ {
+ fatal("Cannot add to a non-existing macro",(char *)0,0);
+ }
+
+ len_old_value = strlen(rp->m_val);
+ if ((cp = (char *) malloc(len_old_value+1+strlen(val)+1)) == (char *)0)
+ fatal("No memory for macro",(char *)0,0);
+ strcpy(cp, rp->m_val); /* Copy in old value */
+ cp[len_old_value] = ' ';
+ strcpy(cp+len_old_value+1, val); /* Copy in new value */
+ free(rp->m_val);
+ rp->m_val = cp;
+
+ return rp;
+}
+
+
+
struct macro *setmacro(name, val)
char *name;
char *val;