Blame


1 c99867c9 2014-06-03 rsc #include "common.h"
2 c99867c9 2014-06-03 rsc
3 c99867c9 2014-06-03 rsc /* expand a path relative to some `.' */
4 c99867c9 2014-06-03 rsc extern String *
5 c99867c9 2014-06-03 rsc abspath(char *path, char *dot, String *to)
6 c99867c9 2014-06-03 rsc {
7 c99867c9 2014-06-03 rsc if (*path == '/') {
8 c99867c9 2014-06-03 rsc to = s_append(to, path);
9 c99867c9 2014-06-03 rsc } else {
10 c99867c9 2014-06-03 rsc to = s_append(to, dot);
11 c99867c9 2014-06-03 rsc to = s_append(to, "/");
12 c99867c9 2014-06-03 rsc to = s_append(to, path);
13 c99867c9 2014-06-03 rsc }
14 c99867c9 2014-06-03 rsc return to;
15 c99867c9 2014-06-03 rsc }
16 c99867c9 2014-06-03 rsc
17 c99867c9 2014-06-03 rsc /* return a pointer to the base component of a pathname */
18 c99867c9 2014-06-03 rsc extern char *
19 c99867c9 2014-06-03 rsc basename(char *path)
20 c99867c9 2014-06-03 rsc {
21 c99867c9 2014-06-03 rsc char *cp;
22 c99867c9 2014-06-03 rsc
23 c99867c9 2014-06-03 rsc cp = strrchr(path, '/');
24 c99867c9 2014-06-03 rsc return cp==0 ? path : cp+1;
25 c99867c9 2014-06-03 rsc }
26 c99867c9 2014-06-03 rsc
27 c99867c9 2014-06-03 rsc /* append a sub-expression match onto a String */
28 c99867c9 2014-06-03 rsc extern void
29 c99867c9 2014-06-03 rsc append_match(Resub *subexp, String *sp, int se)
30 c99867c9 2014-06-03 rsc {
31 c99867c9 2014-06-03 rsc char *cp, *ep;
32 c99867c9 2014-06-03 rsc
33 c99867c9 2014-06-03 rsc cp = subexp[se].s.sp;
34 c99867c9 2014-06-03 rsc ep = subexp[se].e.ep;
35 c99867c9 2014-06-03 rsc for (; cp < ep; cp++)
36 c99867c9 2014-06-03 rsc s_putc(sp, *cp);
37 c99867c9 2014-06-03 rsc s_terminate(sp);
38 c99867c9 2014-06-03 rsc }
39 c99867c9 2014-06-03 rsc
40 c99867c9 2014-06-03 rsc /*
41 c99867c9 2014-06-03 rsc * check for shell characters in a String
42 c99867c9 2014-06-03 rsc */
43 c99867c9 2014-06-03 rsc static char *illegalchars = "\r\n";
44 c99867c9 2014-06-03 rsc
45 c99867c9 2014-06-03 rsc extern int
46 c99867c9 2014-06-03 rsc shellchars(char *cp)
47 c99867c9 2014-06-03 rsc {
48 c99867c9 2014-06-03 rsc char *sp;
49 c99867c9 2014-06-03 rsc
50 c99867c9 2014-06-03 rsc for(sp=illegalchars; *sp; sp++)
51 c99867c9 2014-06-03 rsc if(strchr(cp, *sp))
52 c99867c9 2014-06-03 rsc return 1;
53 c99867c9 2014-06-03 rsc return 0;
54 c99867c9 2014-06-03 rsc }
55 c99867c9 2014-06-03 rsc
56 c99867c9 2014-06-03 rsc static char *specialchars = " ()<>{};=\\'`^&|";
57 c99867c9 2014-06-03 rsc static char *escape = "%%";
58 c99867c9 2014-06-03 rsc
59 c99867c9 2014-06-03 rsc int
60 c99867c9 2014-06-03 rsc hexchar(int x)
61 c99867c9 2014-06-03 rsc {
62 c99867c9 2014-06-03 rsc x &= 0xf;
63 c99867c9 2014-06-03 rsc if(x < 10)
64 c99867c9 2014-06-03 rsc return '0' + x;
65 c99867c9 2014-06-03 rsc else
66 c99867c9 2014-06-03 rsc return 'A' + x - 10;
67 c99867c9 2014-06-03 rsc }
68 c99867c9 2014-06-03 rsc
69 c99867c9 2014-06-03 rsc /*
70 c99867c9 2014-06-03 rsc * rewrite a string to escape shell characters
71 c99867c9 2014-06-03 rsc */
72 c99867c9 2014-06-03 rsc extern String*
73 c99867c9 2014-06-03 rsc escapespecial(String *s)
74 c99867c9 2014-06-03 rsc {
75 c99867c9 2014-06-03 rsc String *ns;
76 c99867c9 2014-06-03 rsc char *sp;
77 c99867c9 2014-06-03 rsc
78 c99867c9 2014-06-03 rsc for(sp = specialchars; *sp; sp++)
79 c99867c9 2014-06-03 rsc if(strchr(s_to_c(s), *sp))
80 c99867c9 2014-06-03 rsc break;
81 c99867c9 2014-06-03 rsc if(*sp == 0)
82 c99867c9 2014-06-03 rsc return s;
83 c99867c9 2014-06-03 rsc
84 c99867c9 2014-06-03 rsc ns = s_new();
85 c99867c9 2014-06-03 rsc for(sp = s_to_c(s); *sp; sp++){
86 c99867c9 2014-06-03 rsc if(strchr(specialchars, *sp)){
87 c99867c9 2014-06-03 rsc s_append(ns, escape);
88 c99867c9 2014-06-03 rsc s_putc(ns, hexchar(*sp>>4));
89 c99867c9 2014-06-03 rsc s_putc(ns, hexchar(*sp));
90 c99867c9 2014-06-03 rsc } else
91 c99867c9 2014-06-03 rsc s_putc(ns, *sp);
92 c99867c9 2014-06-03 rsc }
93 c99867c9 2014-06-03 rsc s_terminate(ns);
94 c99867c9 2014-06-03 rsc s_free(s);
95 c99867c9 2014-06-03 rsc return ns;
96 c99867c9 2014-06-03 rsc }
97 c99867c9 2014-06-03 rsc
98 c99867c9 2014-06-03 rsc uint
99 c99867c9 2014-06-03 rsc hex2uint(char x)
100 c99867c9 2014-06-03 rsc {
101 c99867c9 2014-06-03 rsc if(x >= '0' && x <= '9')
102 c99867c9 2014-06-03 rsc return x - '0';
103 c99867c9 2014-06-03 rsc if(x >= 'A' && x <= 'F')
104 c99867c9 2014-06-03 rsc return (x - 'A') + 10;
105 c99867c9 2014-06-03 rsc if(x >= 'a' && x <= 'f')
106 c99867c9 2014-06-03 rsc return (x - 'a') + 10;
107 c99867c9 2014-06-03 rsc return -512;
108 c99867c9 2014-06-03 rsc }
109 c99867c9 2014-06-03 rsc
110 c99867c9 2014-06-03 rsc /*
111 c99867c9 2014-06-03 rsc * rewrite a string to remove shell characters escapes
112 c99867c9 2014-06-03 rsc */
113 c99867c9 2014-06-03 rsc extern String*
114 c99867c9 2014-06-03 rsc unescapespecial(String *s)
115 c99867c9 2014-06-03 rsc {
116 c99867c9 2014-06-03 rsc String *ns;
117 c99867c9 2014-06-03 rsc char *sp;
118 c99867c9 2014-06-03 rsc uint c, n;
119 c99867c9 2014-06-03 rsc
120 c99867c9 2014-06-03 rsc if(strstr(s_to_c(s), escape) == 0)
121 c99867c9 2014-06-03 rsc return s;
122 c99867c9 2014-06-03 rsc n = strlen(escape);
123 c99867c9 2014-06-03 rsc
124 c99867c9 2014-06-03 rsc ns = s_new();
125 c99867c9 2014-06-03 rsc for(sp = s_to_c(s); *sp; sp++){
126 c99867c9 2014-06-03 rsc if(strncmp(sp, escape, n) == 0){
127 c99867c9 2014-06-03 rsc c = (hex2uint(sp[n])<<4) + hex2uint(sp[n+1]);
128 c99867c9 2014-06-03 rsc if(c < 0)
129 c99867c9 2014-06-03 rsc s_putc(ns, *sp);
130 c99867c9 2014-06-03 rsc else {
131 c99867c9 2014-06-03 rsc s_putc(ns, c);
132 c99867c9 2014-06-03 rsc sp += n+2-1;
133 c99867c9 2014-06-03 rsc }
134 c99867c9 2014-06-03 rsc } else
135 c99867c9 2014-06-03 rsc s_putc(ns, *sp);
136 c99867c9 2014-06-03 rsc }
137 c99867c9 2014-06-03 rsc s_terminate(ns);
138 c99867c9 2014-06-03 rsc s_free(s);
139 c99867c9 2014-06-03 rsc return ns;
140 c99867c9 2014-06-03 rsc
141 c99867c9 2014-06-03 rsc }
142 c99867c9 2014-06-03 rsc
143 c99867c9 2014-06-03 rsc int
144 c99867c9 2014-06-03 rsc returnable(char *path)
145 c99867c9 2014-06-03 rsc {
146 c99867c9 2014-06-03 rsc
147 c99867c9 2014-06-03 rsc return strcmp(path, "/dev/null") != 0;
148 c99867c9 2014-06-03 rsc }