1 76193d7c 2003-09-30 devnull #include "mk.h"
3 76193d7c 2003-09-30 devnull static char *vexpand(char*, Envy*, Bufblock*);
5 8f314994 2004-03-02 devnull #define getfields mkgetfields
7 76193d7c 2003-09-30 devnull static int
8 76193d7c 2003-09-30 devnull getfields(char *str, char **args, int max, int mflag, char *set)
11 76193d7c 2003-09-30 devnull int nr, intok, narg;
13 76193d7c 2003-09-30 devnull if(max <= 0)
14 76193d7c 2003-09-30 devnull return 0;
16 76193d7c 2003-09-30 devnull narg = 0;
17 76193d7c 2003-09-30 devnull args[narg] = str;
18 76193d7c 2003-09-30 devnull if(!mflag)
20 76193d7c 2003-09-30 devnull intok = 0;
21 76193d7c 2003-09-30 devnull for(;; str += nr) {
22 76193d7c 2003-09-30 devnull nr = chartorune(&r, str);
23 76193d7c 2003-09-30 devnull if(r == 0)
25 76193d7c 2003-09-30 devnull if(utfrune(set, r)) {
26 76193d7c 2003-09-30 devnull if(narg >= max)
28 76193d7c 2003-09-30 devnull *str = 0;
29 76193d7c 2003-09-30 devnull intok = 0;
30 76193d7c 2003-09-30 devnull args[narg] = str + nr;
31 76193d7c 2003-09-30 devnull if(!mflag)
34 76193d7c 2003-09-30 devnull if(!intok && mflag)
36 76193d7c 2003-09-30 devnull intok = 1;
39 76193d7c 2003-09-30 devnull return narg;
43 76193d7c 2003-09-30 devnull shprint(char *s, Envy *env, Bufblock *buf)
48 76193d7c 2003-09-30 devnull while(*s) {
49 76193d7c 2003-09-30 devnull n = chartorune(&r, s);
50 76193d7c 2003-09-30 devnull if (r == '$')
51 76193d7c 2003-09-30 devnull s = vexpand(s, env, buf);
53 76193d7c 2003-09-30 devnull rinsert(buf, r);
55 76193d7c 2003-09-30 devnull s = copyq(s, r, buf); /*handle quoted strings*/
58 76193d7c 2003-09-30 devnull insert(buf, 0);
61 76193d7c 2003-09-30 devnull static char *
62 76193d7c 2003-09-30 devnull mygetenv(char *name, Envy *env)
64 76193d7c 2003-09-30 devnull if (!env)
65 76193d7c 2003-09-30 devnull return 0;
66 76193d7c 2003-09-30 devnull if (symlook(name, S_WESET, 0) == 0 && symlook(name, S_INTERNAL, 0) == 0)
67 76193d7c 2003-09-30 devnull return 0;
68 76193d7c 2003-09-30 devnull /* only resolve internal variables and variables we've set */
69 76193d7c 2003-09-30 devnull for(; env->name; env++){
70 76193d7c 2003-09-30 devnull if (strcmp(env->name, name) == 0)
71 76193d7c 2003-09-30 devnull return wtos(env->values, ' ');
73 76193d7c 2003-09-30 devnull return 0;
76 76193d7c 2003-09-30 devnull static char *
77 76193d7c 2003-09-30 devnull vexpand(char *w, Envy *env, Bufblock *buf)
79 76193d7c 2003-09-30 devnull char *s, carry, *p, *q;
81 76193d7c 2003-09-30 devnull assert("vexpand no $", *w == '$');
82 76193d7c 2003-09-30 devnull p = w+1; /* skip dollar sign */
83 76193d7c 2003-09-30 devnull if(*p == '{') {
85 76193d7c 2003-09-30 devnull q = utfrune(p, '}');
87 76193d7c 2003-09-30 devnull q = strchr(p, 0);
89 76193d7c 2003-09-30 devnull q = shname(p);
90 76193d7c 2003-09-30 devnull carry = *q;
92 76193d7c 2003-09-30 devnull s = mygetenv(p, env);
93 76193d7c 2003-09-30 devnull *q = carry;
94 76193d7c 2003-09-30 devnull if (carry == '}')
97 76193d7c 2003-09-30 devnull bufcpy(buf, s, strlen(s));
99 76193d7c 2003-09-30 devnull } else /* copy name intact*/
100 76193d7c 2003-09-30 devnull bufcpy(buf, w, q-w);
101 76193d7c 2003-09-30 devnull return(q);
105 76193d7c 2003-09-30 devnull front(char *s)
107 76193d7c 2003-09-30 devnull char *t, *q;
108 76193d7c 2003-09-30 devnull int i, j;
109 76193d7c 2003-09-30 devnull char *flds[512];
111 76193d7c 2003-09-30 devnull q = strdup(s);
112 76193d7c 2003-09-30 devnull i = getfields(q, flds, 512, 0, " \t\n");
113 76193d7c 2003-09-30 devnull if(i > 5){
114 76193d7c 2003-09-30 devnull flds[4] = flds[i-1];
115 76193d7c 2003-09-30 devnull flds[3] = "...";
119 76193d7c 2003-09-30 devnull for(j = 0; j < i; j++){
120 76193d7c 2003-09-30 devnull for(s = flds[j]; *s; *t++ = *s++);
121 76193d7c 2003-09-30 devnull *t++ = ' ';
124 76193d7c 2003-09-30 devnull free(q);