ref: c3ba64f6935322f09b6de5c2285544fd471c605d
dir: /sys/src/cmd/mk/shprint.c/
#include "mk.h" static char *vexpand(char*, Envy*, Bufblock*); static char *shquote(char*, Rune, Bufblock*); static char *shbquote(char*, Bufblock*); void shprint(char *s, Envy *env, Bufblock *buf) { int n; Rune r; while(*s) { n = chartorune(&r, s); if (r == '$') s = vexpand(s, env, buf); else { rinsert(buf, r); s += n; s = copyq(s, r, buf); /*handle quoted strings*/ } } insert(buf, 0); } static char * mygetenv(char *name, Envy *env) { if (!env) return 0; if (symlook(name, S_WESET, 0) == 0 && symlook(name, S_INTERNAL, 0) == 0) return 0; /* only resolve internal variables and variables we've set */ for(; env->name; env++){ if (strcmp(env->name, name) == 0) return wtos(env->values, ' '); } return 0; } static char * vexpand(char *w, Envy *env, Bufblock *buf) { char *s, carry, *p, *q; assert(/*vexpand no $*/ *w == '$'); p = w+1; /* skip dollar sign */ if(*p == '{') { p++; q = utfrune(p, '}'); if (!q) q = strchr(p, 0); } else q = shname(p); carry = *q; *q = 0; s = mygetenv(p, env); *q = carry; if (carry == '}') q++; if (s) { bufcpy(buf, s, strlen(s)); free(s); } else /* copy name intact*/ bufcpy(buf, w, q-w); return(q); } void front(char *s) { char *t, *q; int i, j; char *flds[512]; q = strdup(s); i = getfields(q, flds, nelem(flds), 0, " \t\n"); if(i > 5){ flds[4] = flds[i-1]; flds[3] = "..."; i = 5; } t = s; for(j = 0; j < i; j++){ for(s = flds[j]; *s; *t++ = *s++); *t++ = ' '; } *t = 0; free(q); }