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 8f314994 2004-03-02 devnull #define getfields mkgetfields
6 8f314994 2004-03-02 devnull
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)
9 76193d7c 2003-09-30 devnull {
10 76193d7c 2003-09-30 devnull Rune r;
11 76193d7c 2003-09-30 devnull int nr, intok, narg;
12 76193d7c 2003-09-30 devnull
13 76193d7c 2003-09-30 devnull if(max <= 0)
14 76193d7c 2003-09-30 devnull return 0;
15 76193d7c 2003-09-30 devnull
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)
19 76193d7c 2003-09-30 devnull narg++;
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)
24 76193d7c 2003-09-30 devnull break;
25 76193d7c 2003-09-30 devnull if(utfrune(set, r)) {
26 76193d7c 2003-09-30 devnull if(narg >= max)
27 76193d7c 2003-09-30 devnull break;
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)
32 76193d7c 2003-09-30 devnull narg++;
33 76193d7c 2003-09-30 devnull } else {
34 76193d7c 2003-09-30 devnull if(!intok && mflag)
35 76193d7c 2003-09-30 devnull narg++;
36 76193d7c 2003-09-30 devnull intok = 1;
37 76193d7c 2003-09-30 devnull }
38 76193d7c 2003-09-30 devnull }
39 76193d7c 2003-09-30 devnull return narg;
40 76193d7c 2003-09-30 devnull }
41 76193d7c 2003-09-30 devnull
42 76193d7c 2003-09-30 devnull void
43 9aa1c92f 2005-01-04 devnull shprint(char *s, Envy *env, Bufblock *buf, Shell *sh)
44 76193d7c 2003-09-30 devnull {
45 76193d7c 2003-09-30 devnull int n;
46 76193d7c 2003-09-30 devnull Rune r;
47 76193d7c 2003-09-30 devnull
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);
52 76193d7c 2003-09-30 devnull else {
53 76193d7c 2003-09-30 devnull rinsert(buf, r);
54 76193d7c 2003-09-30 devnull s += n;
55 9aa1c92f 2005-01-04 devnull s = sh->copyq(s, r, buf); /*handle quoted strings*/
56 76193d7c 2003-09-30 devnull }
57 76193d7c 2003-09-30 devnull }
58 76193d7c 2003-09-30 devnull insert(buf, 0);
59 76193d7c 2003-09-30 devnull }
60 76193d7c 2003-09-30 devnull
61 76193d7c 2003-09-30 devnull static char *
62 76193d7c 2003-09-30 devnull mygetenv(char *name, Envy *env)
63 76193d7c 2003-09-30 devnull {
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, ' ');
72 76193d7c 2003-09-30 devnull }
73 76193d7c 2003-09-30 devnull return 0;
74 76193d7c 2003-09-30 devnull }
75 76193d7c 2003-09-30 devnull
76 76193d7c 2003-09-30 devnull static char *
77 76193d7c 2003-09-30 devnull vexpand(char *w, Envy *env, Bufblock *buf)
78 76193d7c 2003-09-30 devnull {
79 76193d7c 2003-09-30 devnull char *s, carry, *p, *q;
80 76193d7c 2003-09-30 devnull
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 == '{') {
84 76193d7c 2003-09-30 devnull p++;
85 76193d7c 2003-09-30 devnull q = utfrune(p, '}');
86 76193d7c 2003-09-30 devnull if (!q)
87 76193d7c 2003-09-30 devnull q = strchr(p, 0);
88 76193d7c 2003-09-30 devnull } else
89 76193d7c 2003-09-30 devnull q = shname(p);
90 76193d7c 2003-09-30 devnull carry = *q;
91 76193d7c 2003-09-30 devnull *q = 0;
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 == '}')
95 76193d7c 2003-09-30 devnull q++;
96 76193d7c 2003-09-30 devnull if (s) {
97 76193d7c 2003-09-30 devnull bufcpy(buf, s, strlen(s));
98 76193d7c 2003-09-30 devnull free(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);
102 76193d7c 2003-09-30 devnull }
103 76193d7c 2003-09-30 devnull
104 76193d7c 2003-09-30 devnull void
105 76193d7c 2003-09-30 devnull front(char *s)
106 76193d7c 2003-09-30 devnull {
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];
110 76193d7c 2003-09-30 devnull
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] = "...";
116 76193d7c 2003-09-30 devnull i = 5;
117 76193d7c 2003-09-30 devnull }
118 76193d7c 2003-09-30 devnull t = s;
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++ = ' ';
122 76193d7c 2003-09-30 devnull }
123 76193d7c 2003-09-30 devnull *t = 0;
124 76193d7c 2003-09-30 devnull free(q);
125 76193d7c 2003-09-30 devnull }