123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #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);
- }
|