Blame


1 76193d7c 2003-09-30 devnull #include "mk.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull static char *vexpand(char*, Envy*, Bufblock*);
4 76193d7c 2003-09-30 devnull
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)
7 76193d7c 2003-09-30 devnull {
8 76193d7c 2003-09-30 devnull Rune r;
9 76193d7c 2003-09-30 devnull int nr, intok, narg;
10 76193d7c 2003-09-30 devnull
11 76193d7c 2003-09-30 devnull if(max <= 0)
12 76193d7c 2003-09-30 devnull return 0;
13 76193d7c 2003-09-30 devnull
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)
17 76193d7c 2003-09-30 devnull narg++;
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)
22 76193d7c 2003-09-30 devnull break;
23 76193d7c 2003-09-30 devnull if(utfrune(set, r)) {
24 76193d7c 2003-09-30 devnull if(narg >= max)
25 76193d7c 2003-09-30 devnull break;
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)
30 76193d7c 2003-09-30 devnull narg++;
31 76193d7c 2003-09-30 devnull } else {
32 76193d7c 2003-09-30 devnull if(!intok && mflag)
33 76193d7c 2003-09-30 devnull narg++;
34 76193d7c 2003-09-30 devnull intok = 1;
35 76193d7c 2003-09-30 devnull }
36 76193d7c 2003-09-30 devnull }
37 76193d7c 2003-09-30 devnull return narg;
38 76193d7c 2003-09-30 devnull }
39 76193d7c 2003-09-30 devnull
40 76193d7c 2003-09-30 devnull void
41 76193d7c 2003-09-30 devnull shprint(char *s, Envy *env, Bufblock *buf)
42 76193d7c 2003-09-30 devnull {
43 76193d7c 2003-09-30 devnull int n;
44 76193d7c 2003-09-30 devnull Rune r;
45 76193d7c 2003-09-30 devnull
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);
50 76193d7c 2003-09-30 devnull else {
51 76193d7c 2003-09-30 devnull rinsert(buf, r);
52 76193d7c 2003-09-30 devnull s += n;
53 76193d7c 2003-09-30 devnull s = copyq(s, r, buf); /*handle quoted strings*/
54 76193d7c 2003-09-30 devnull }
55 76193d7c 2003-09-30 devnull }
56 76193d7c 2003-09-30 devnull insert(buf, 0);
57 76193d7c 2003-09-30 devnull }
58 76193d7c 2003-09-30 devnull
59 76193d7c 2003-09-30 devnull static char *
60 76193d7c 2003-09-30 devnull mygetenv(char *name, Envy *env)
61 76193d7c 2003-09-30 devnull {
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, ' ');
70 76193d7c 2003-09-30 devnull }
71 76193d7c 2003-09-30 devnull return 0;
72 76193d7c 2003-09-30 devnull }
73 76193d7c 2003-09-30 devnull
74 76193d7c 2003-09-30 devnull static char *
75 76193d7c 2003-09-30 devnull vexpand(char *w, Envy *env, Bufblock *buf)
76 76193d7c 2003-09-30 devnull {
77 76193d7c 2003-09-30 devnull char *s, carry, *p, *q;
78 76193d7c 2003-09-30 devnull
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 == '{') {
82 76193d7c 2003-09-30 devnull p++;
83 76193d7c 2003-09-30 devnull q = utfrune(p, '}');
84 76193d7c 2003-09-30 devnull if (!q)
85 76193d7c 2003-09-30 devnull q = strchr(p, 0);
86 76193d7c 2003-09-30 devnull } else
87 76193d7c 2003-09-30 devnull q = shname(p);
88 76193d7c 2003-09-30 devnull carry = *q;
89 76193d7c 2003-09-30 devnull *q = 0;
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 == '}')
93 76193d7c 2003-09-30 devnull q++;
94 76193d7c 2003-09-30 devnull if (s) {
95 76193d7c 2003-09-30 devnull bufcpy(buf, s, strlen(s));
96 76193d7c 2003-09-30 devnull free(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);
100 76193d7c 2003-09-30 devnull }
101 76193d7c 2003-09-30 devnull
102 76193d7c 2003-09-30 devnull void
103 76193d7c 2003-09-30 devnull front(char *s)
104 76193d7c 2003-09-30 devnull {
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];
108 76193d7c 2003-09-30 devnull
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] = "...";
114 76193d7c 2003-09-30 devnull i = 5;
115 76193d7c 2003-09-30 devnull }
116 76193d7c 2003-09-30 devnull t = s;
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++ = ' ';
120 76193d7c 2003-09-30 devnull }
121 76193d7c 2003-09-30 devnull *t = 0;
122 76193d7c 2003-09-30 devnull free(q);
123 76193d7c 2003-09-30 devnull }