Blame


1 76193d7c 2003-09-30 devnull #include "mk.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull static int bquote(Biobuf*, Bufblock*);
4 76193d7c 2003-09-30 devnull
5 76193d7c 2003-09-30 devnull /*
6 76193d7c 2003-09-30 devnull * Assemble a line skipping blank lines, comments, and eliding
7 76193d7c 2003-09-30 devnull * escaped newlines
8 76193d7c 2003-09-30 devnull */
9 76193d7c 2003-09-30 devnull int
10 76193d7c 2003-09-30 devnull assline(Biobuf *bp, Bufblock *buf)
11 76193d7c 2003-09-30 devnull {
12 76193d7c 2003-09-30 devnull int c;
13 76193d7c 2003-09-30 devnull int lastc;
14 76193d7c 2003-09-30 devnull
15 76193d7c 2003-09-30 devnull buf->current=buf->start;
16 76193d7c 2003-09-30 devnull while ((c = nextrune(bp, 1)) >= 0){
17 76193d7c 2003-09-30 devnull switch(c)
18 76193d7c 2003-09-30 devnull {
19 76193d7c 2003-09-30 devnull case '\r': /* consumes CRs for Win95 */
20 76193d7c 2003-09-30 devnull continue;
21 76193d7c 2003-09-30 devnull case '\n':
22 76193d7c 2003-09-30 devnull if (buf->current != buf->start) {
23 76193d7c 2003-09-30 devnull insert(buf, 0);
24 76193d7c 2003-09-30 devnull return 1;
25 76193d7c 2003-09-30 devnull }
26 76193d7c 2003-09-30 devnull break; /* skip empty lines */
27 76193d7c 2003-09-30 devnull case '\\':
28 76193d7c 2003-09-30 devnull case '\'':
29 76193d7c 2003-09-30 devnull case '"':
30 76193d7c 2003-09-30 devnull rinsert(buf, c);
31 9aa1c92f 2005-01-04 devnull if (shellt->escapetoken(bp, buf, 1, c) == 0)
32 76193d7c 2003-09-30 devnull Exit();
33 76193d7c 2003-09-30 devnull break;
34 76193d7c 2003-09-30 devnull case '`':
35 76193d7c 2003-09-30 devnull if (bquote(bp, buf) == 0)
36 76193d7c 2003-09-30 devnull Exit();
37 76193d7c 2003-09-30 devnull break;
38 76193d7c 2003-09-30 devnull case '#':
39 76193d7c 2003-09-30 devnull lastc = '#';
40 76193d7c 2003-09-30 devnull while ((c = Bgetc(bp)) != '\n') {
41 76193d7c 2003-09-30 devnull if (c < 0)
42 76193d7c 2003-09-30 devnull goto eof;
43 76193d7c 2003-09-30 devnull if(c != '\r')
44 76193d7c 2003-09-30 devnull lastc = c;
45 76193d7c 2003-09-30 devnull }
46 76193d7c 2003-09-30 devnull mkinline++;
47 76193d7c 2003-09-30 devnull if (lastc == '\\')
48 76193d7c 2003-09-30 devnull break; /* propagate escaped newlines??*/
49 76193d7c 2003-09-30 devnull if (buf->current != buf->start) {
50 76193d7c 2003-09-30 devnull insert(buf, 0);
51 76193d7c 2003-09-30 devnull return 1;
52 76193d7c 2003-09-30 devnull }
53 76193d7c 2003-09-30 devnull break;
54 76193d7c 2003-09-30 devnull default:
55 76193d7c 2003-09-30 devnull rinsert(buf, c);
56 76193d7c 2003-09-30 devnull break;
57 76193d7c 2003-09-30 devnull }
58 76193d7c 2003-09-30 devnull }
59 76193d7c 2003-09-30 devnull eof:
60 76193d7c 2003-09-30 devnull insert(buf, 0);
61 76193d7c 2003-09-30 devnull return *buf->start != 0;
62 76193d7c 2003-09-30 devnull }
63 76193d7c 2003-09-30 devnull
64 76193d7c 2003-09-30 devnull /*
65 76193d7c 2003-09-30 devnull * assemble a back-quoted shell command into a buffer
66 76193d7c 2003-09-30 devnull */
67 76193d7c 2003-09-30 devnull static int
68 76193d7c 2003-09-30 devnull bquote(Biobuf *bp, Bufblock *buf)
69 76193d7c 2003-09-30 devnull {
70 76193d7c 2003-09-30 devnull int c, line, term;
71 76193d7c 2003-09-30 devnull int start;
72 76193d7c 2003-09-30 devnull
73 76193d7c 2003-09-30 devnull line = mkinline;
74 76193d7c 2003-09-30 devnull while((c = Bgetrune(bp)) == ' ' || c == '\t')
75 76193d7c 2003-09-30 devnull ;
76 76193d7c 2003-09-30 devnull if(c == '{'){
77 76193d7c 2003-09-30 devnull term = '}'; /* rc style */
78 76193d7c 2003-09-30 devnull while((c = Bgetrune(bp)) == ' ' || c == '\t')
79 76193d7c 2003-09-30 devnull ;
80 76193d7c 2003-09-30 devnull } else
81 76193d7c 2003-09-30 devnull term = '`'; /* sh style */
82 76193d7c 2003-09-30 devnull
83 76193d7c 2003-09-30 devnull start = buf->current-buf->start;
84 76193d7c 2003-09-30 devnull for(;c > 0; c = nextrune(bp, 0)){
85 76193d7c 2003-09-30 devnull if(c == term){
86 76193d7c 2003-09-30 devnull insert(buf, '\n');
87 76193d7c 2003-09-30 devnull insert(buf,0);
88 76193d7c 2003-09-30 devnull buf->current = buf->start+start;
89 76193d7c 2003-09-30 devnull execinit();
90 9aa1c92f 2005-01-04 devnull execsh(0, buf->current, buf, envy, shellt, shellcmd);
91 76193d7c 2003-09-30 devnull return 1;
92 76193d7c 2003-09-30 devnull }
93 76193d7c 2003-09-30 devnull if(c == '\n')
94 76193d7c 2003-09-30 devnull break;
95 76193d7c 2003-09-30 devnull if(c == '\'' || c == '"' || c == '\\'){
96 76193d7c 2003-09-30 devnull insert(buf, c);
97 9aa1c92f 2005-01-04 devnull if(!shellt->escapetoken(bp, buf, 1, c))
98 76193d7c 2003-09-30 devnull return 0;
99 76193d7c 2003-09-30 devnull continue;
100 76193d7c 2003-09-30 devnull }
101 76193d7c 2003-09-30 devnull rinsert(buf, c);
102 76193d7c 2003-09-30 devnull }
103 76193d7c 2003-09-30 devnull SYNERR(line);
104 76193d7c 2003-09-30 devnull fprint(2, "missing closing %c after `\n", term);
105 76193d7c 2003-09-30 devnull return 0;
106 76193d7c 2003-09-30 devnull }
107 76193d7c 2003-09-30 devnull
108 76193d7c 2003-09-30 devnull /*
109 76193d7c 2003-09-30 devnull * get next character stripping escaped newlines
110 76193d7c 2003-09-30 devnull * the flag specifies whether escaped newlines are to be elided or
111 76193d7c 2003-09-30 devnull * replaced with a blank.
112 76193d7c 2003-09-30 devnull */
113 76193d7c 2003-09-30 devnull int
114 76193d7c 2003-09-30 devnull nextrune(Biobuf *bp, int elide)
115 76193d7c 2003-09-30 devnull {
116 76193d7c 2003-09-30 devnull int c, c2;
117 76193d7c 2003-09-30 devnull static int savec;
118 76193d7c 2003-09-30 devnull
119 76193d7c 2003-09-30 devnull if(savec){
120 76193d7c 2003-09-30 devnull c = savec;
121 76193d7c 2003-09-30 devnull savec = 0;
122 76193d7c 2003-09-30 devnull return c;
123 76193d7c 2003-09-30 devnull }
124 76193d7c 2003-09-30 devnull
125 76193d7c 2003-09-30 devnull for (;;) {
126 76193d7c 2003-09-30 devnull c = Bgetrune(bp);
127 76193d7c 2003-09-30 devnull if (c == '\\') {
128 76193d7c 2003-09-30 devnull c2 = Bgetrune(bp);
129 76193d7c 2003-09-30 devnull if(c2 == '\r'){
130 76193d7c 2003-09-30 devnull savec = c2;
131 76193d7c 2003-09-30 devnull c2 = Bgetrune(bp);
132 76193d7c 2003-09-30 devnull }
133 76193d7c 2003-09-30 devnull if (c2 == '\n') {
134 76193d7c 2003-09-30 devnull savec = 0;
135 76193d7c 2003-09-30 devnull mkinline++;
136 76193d7c 2003-09-30 devnull if (elide)
137 76193d7c 2003-09-30 devnull continue;
138 76193d7c 2003-09-30 devnull return ' ';
139 76193d7c 2003-09-30 devnull }
140 76193d7c 2003-09-30 devnull Bungetrune(bp);
141 76193d7c 2003-09-30 devnull }
142 76193d7c 2003-09-30 devnull if (c == '\n')
143 76193d7c 2003-09-30 devnull mkinline++;
144 76193d7c 2003-09-30 devnull return c;
145 76193d7c 2003-09-30 devnull }
146 76193d7c 2003-09-30 devnull }