1 76193d7c 2003-09-30 devnull #include "mk.h"
3 76193d7c 2003-09-30 devnull static char *vexpand(char*, Envy*, Bufblock*);
5 76193d7c 2003-09-30 devnull static int
6 76193d7c 2003-09-30 devnull getfields(char *str, char **args, int max, int mflag, char *set)
9 76193d7c 2003-09-30 devnull int nr, intok, narg;
11 76193d7c 2003-09-30 devnull if(max <= 0)
12 76193d7c 2003-09-30 devnull return 0;
14 76193d7c 2003-09-30 devnull narg = 0;
15 76193d7c 2003-09-30 devnull args[narg] = str;
16 76193d7c 2003-09-30 devnull if(!mflag)
18 76193d7c 2003-09-30 devnull intok = 0;
19 76193d7c 2003-09-30 devnull for(;; str += nr) {
20 76193d7c 2003-09-30 devnull nr = chartorune(&r, str);
21 76193d7c 2003-09-30 devnull if(r == 0)
23 76193d7c 2003-09-30 devnull if(utfrune(set, r)) {
24 76193d7c 2003-09-30 devnull if(narg >= max)
26 76193d7c 2003-09-30 devnull *str = 0;
27 76193d7c 2003-09-30 devnull intok = 0;
28 76193d7c 2003-09-30 devnull args[narg] = str + nr;
29 76193d7c 2003-09-30 devnull if(!mflag)
32 76193d7c 2003-09-30 devnull if(!intok && mflag)
34 76193d7c 2003-09-30 devnull intok = 1;
37 76193d7c 2003-09-30 devnull return narg;
41 76193d7c 2003-09-30 devnull shprint(char *s, Envy *env, Bufblock *buf)
46 76193d7c 2003-09-30 devnull while(*s) {
47 76193d7c 2003-09-30 devnull n = chartorune(&r, s);
48 76193d7c 2003-09-30 devnull if (r == '$')
49 76193d7c 2003-09-30 devnull s = vexpand(s, env, buf);
51 76193d7c 2003-09-30 devnull rinsert(buf, r);
53 76193d7c 2003-09-30 devnull s = copyq(s, r, buf); /*handle quoted strings*/
56 76193d7c 2003-09-30 devnull insert(buf, 0);
59 76193d7c 2003-09-30 devnull static char *
60 76193d7c 2003-09-30 devnull mygetenv(char *name, Envy *env)
62 76193d7c 2003-09-30 devnull if (!env)
63 76193d7c 2003-09-30 devnull return 0;
64 76193d7c 2003-09-30 devnull if (symlook(name, S_WESET, 0) == 0 && symlook(name, S_INTERNAL, 0) == 0)
65 76193d7c 2003-09-30 devnull return 0;
66 76193d7c 2003-09-30 devnull /* only resolve internal variables and variables we've set */
67 76193d7c 2003-09-30 devnull for(; env->name; env++){
68 76193d7c 2003-09-30 devnull if (strcmp(env->name, name) == 0)
69 76193d7c 2003-09-30 devnull return wtos(env->values, ' ');
71 76193d7c 2003-09-30 devnull return 0;
74 76193d7c 2003-09-30 devnull static char *
75 76193d7c 2003-09-30 devnull vexpand(char *w, Envy *env, Bufblock *buf)
77 76193d7c 2003-09-30 devnull char *s, carry, *p, *q;
79 76193d7c 2003-09-30 devnull assert("vexpand no $", *w == '$');
80 76193d7c 2003-09-30 devnull p = w+1; /* skip dollar sign */
81 76193d7c 2003-09-30 devnull if(*p == '{') {
83 76193d7c 2003-09-30 devnull q = utfrune(p, '}');
85 76193d7c 2003-09-30 devnull q = strchr(p, 0);
87 76193d7c 2003-09-30 devnull q = shname(p);
88 76193d7c 2003-09-30 devnull carry = *q;
90 76193d7c 2003-09-30 devnull s = mygetenv(p, env);
91 76193d7c 2003-09-30 devnull *q = carry;
92 76193d7c 2003-09-30 devnull if (carry == '}')
95 76193d7c 2003-09-30 devnull bufcpy(buf, s, strlen(s));
97 76193d7c 2003-09-30 devnull } else /* copy name intact*/
98 76193d7c 2003-09-30 devnull bufcpy(buf, w, q-w);
99 76193d7c 2003-09-30 devnull return(q);
103 76193d7c 2003-09-30 devnull front(char *s)
105 76193d7c 2003-09-30 devnull char *t, *q;
106 76193d7c 2003-09-30 devnull int i, j;
107 76193d7c 2003-09-30 devnull char *flds[512];
109 76193d7c 2003-09-30 devnull q = strdup(s);
110 76193d7c 2003-09-30 devnull i = getfields(q, flds, 512, 0, " \t\n");
111 76193d7c 2003-09-30 devnull if(i > 5){
112 76193d7c 2003-09-30 devnull flds[4] = flds[i-1];
113 76193d7c 2003-09-30 devnull flds[3] = "...";
117 76193d7c 2003-09-30 devnull for(j = 0; j < i; j++){
118 76193d7c 2003-09-30 devnull for(s = flds[j]; *s; *t++ = *s++);
119 76193d7c 2003-09-30 devnull *t++ = ' ';
122 76193d7c 2003-09-30 devnull free(q);