Blob
1 #include "mk.h"3 static char *vexpand(char*, Envy*, Bufblock*);5 static int6 getfields(char *str, char **args, int max, int mflag, char *set)7 {8 Rune r;9 int nr, intok, narg;11 if(max <= 0)12 return 0;14 narg = 0;15 args[narg] = str;16 if(!mflag)17 narg++;18 intok = 0;19 for(;; str += nr) {20 nr = chartorune(&r, str);21 if(r == 0)22 break;23 if(utfrune(set, r)) {24 if(narg >= max)25 break;26 *str = 0;27 intok = 0;28 args[narg] = str + nr;29 if(!mflag)30 narg++;31 } else {32 if(!intok && mflag)33 narg++;34 intok = 1;35 }36 }37 return narg;38 }40 void41 shprint(char *s, Envy *env, Bufblock *buf)42 {43 int n;44 Rune r;46 while(*s) {47 n = chartorune(&r, s);48 if (r == '$')49 s = vexpand(s, env, buf);50 else {51 rinsert(buf, r);52 s += n;53 s = copyq(s, r, buf); /*handle quoted strings*/54 }55 }56 insert(buf, 0);57 }59 static char *60 mygetenv(char *name, Envy *env)61 {62 if (!env)63 return 0;64 if (symlook(name, S_WESET, 0) == 0 && symlook(name, S_INTERNAL, 0) == 0)65 return 0;66 /* only resolve internal variables and variables we've set */67 for(; env->name; env++){68 if (strcmp(env->name, name) == 0)69 return wtos(env->values, ' ');70 }71 return 0;72 }74 static char *75 vexpand(char *w, Envy *env, Bufblock *buf)76 {77 char *s, carry, *p, *q;79 assert("vexpand no $", *w == '$');80 p = w+1; /* skip dollar sign */81 if(*p == '{') {82 p++;83 q = utfrune(p, '}');84 if (!q)85 q = strchr(p, 0);86 } else87 q = shname(p);88 carry = *q;89 *q = 0;90 s = mygetenv(p, env);91 *q = carry;92 if (carry == '}')93 q++;94 if (s) {95 bufcpy(buf, s, strlen(s));96 free(s);97 } else /* copy name intact*/98 bufcpy(buf, w, q-w);99 return(q);100 }102 void103 front(char *s)104 {105 char *t, *q;106 int i, j;107 char *flds[512];109 q = strdup(s);110 i = getfields(q, flds, 512, 0, " \t\n");111 if(i > 5){112 flds[4] = flds[i-1];113 flds[3] = "...";114 i = 5;115 }116 t = s;117 for(j = 0; j < i; j++){118 for(s = flds[j]; *s; *t++ = *s++);119 *t++ = ' ';120 }121 *t = 0;122 free(q);123 }