implement VAR += .. feature, contributed by Pieter Hijma

This commit is contained in:
Ben Gras 2009-10-01 11:29:08 +00:00
parent 49808dcf77
commit cee82da892
3 changed files with 66 additions and 0 deletions

View file

@ -277,6 +277,7 @@ _PROTOTYPE(void input, (FILE *fd ));
_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 ));

View file

@ -308,6 +308,36 @@ FILE *fd;
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 */
{

View file

@ -47,6 +47,41 @@ char *name;
}
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;