Blob


1 #include "mk.h"
3 static char *vexpand(char*, Envy*, Bufblock*);
5 static int
6 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 void
41 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 } else
87 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);
102 void
103 front(char *s)
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;
116 t = s;
117 for(j = 0; j < i; j++){
118 for(s = flds[j]; *s; *t++ = *s++);
119 *t++ = ' ';
121 *t = 0;
122 free(q);