char* dollar(Exec *e, char *s, int *namelen) { int n; static char *abuf; char *t; *namelen = 1; if(e!=nil && '0'<=s[0] && s[0]<='9') return nonnil(e->match[s[0]-'0']); for(t=s; isalnum(*t); t++) ; n = t-s; *namelen = n; if(e != nil){ if(n == 3){ if(memcmp(s, "src", 3) == 0) return nonnil(e->msg->src); if(memcmp(s, "dst", 3) == 0) return nonnil(e->msg->dst); if(memcmp(s, "dir", 3) == 0) return filename(e, e->dir); } if(n == 4){ if(memcmp(s, "attr", 4) == 0){ free(abuf); abuf = plumbpackattr(e->msg->attr); return nonnil(abuf); } if(memcmp(s, "data", 4) == 0) return nonnil(e->msg->data); if(memcmp(s, "file", 4) == 0) return filename(e, e->file); if(memcmp(s, "type", 4) == 0) return nonnil(e->msg->type); if(memcmp(s, "wdir", 3) == 0) return nonnil(e->msg->wdir); } } return variable(s, n); }
char* plumbpack(Plumbmsg *m, int *np) { int n, ndata; char *buf, *p, *attr; ndata = m->ndata; if(ndata < 0) ndata = Strlen(m->data); attr = plumbpackattr(m->attr); n = Strlen(m->src)+1 + Strlen(m->dst)+1 + Strlen(m->wdir)+1 + Strlen(m->type)+1 + Strlen(attr)+1 + 16 + ndata; buf = malloc(n+1); /* +1 for '\0' */ if(buf == nil){ free(attr); return nil; } p = Strcpy(buf, m->src); *p++ = '\n'; p = Strcpy(p, m->dst); *p++ = '\n'; p = Strcpy(p, m->wdir); *p++ = '\n'; p = Strcpy(p, m->type); *p++ = '\n'; p = Strcpy(p, attr); *p++ = '\n'; p += sprint(p, "%d\n", ndata); memmove(p, m->data, ndata); *np = (p-buf)+ndata; buf[*np] = '\0'; /* null terminate just in case */ if(*np >= n+1) abort(); free(attr); return buf; }