1 d1f529f4 2005-10-29 devnull #include "common.h"
3 d1f529f4 2005-10-29 devnull /* expand a path relative to some `.' */
4 d1f529f4 2005-10-29 devnull extern String *
5 d1f529f4 2005-10-29 devnull abspath(char *path, char *dot, String *to)
7 d1f529f4 2005-10-29 devnull if (*path == '/') {
8 d1f529f4 2005-10-29 devnull to = s_append(to, path);
10 d1f529f4 2005-10-29 devnull to = s_append(to, dot);
11 d1f529f4 2005-10-29 devnull to = s_append(to, "/");
12 d1f529f4 2005-10-29 devnull to = s_append(to, path);
14 d1f529f4 2005-10-29 devnull return to;
17 d1f529f4 2005-10-29 devnull /* return a pointer to the base component of a pathname */
18 d1f529f4 2005-10-29 devnull extern char *
19 d1f529f4 2005-10-29 devnull basename(char *path)
21 d1f529f4 2005-10-29 devnull char *cp;
23 d1f529f4 2005-10-29 devnull cp = strrchr(path, '/');
24 d1f529f4 2005-10-29 devnull return cp==0 ? path : cp+1;
27 d1f529f4 2005-10-29 devnull /* append a sub-expression match onto a String */
28 d1f529f4 2005-10-29 devnull extern void
29 d1f529f4 2005-10-29 devnull append_match(Resub *subexp, String *sp, int se)
31 d1f529f4 2005-10-29 devnull char *cp, *ep;
33 605c0ea1 2006-02-08 devnull cp = subexp[se].s.sp;
34 605c0ea1 2006-02-08 devnull ep = subexp[se].e.ep;
35 d1f529f4 2005-10-29 devnull for (; cp < ep; cp++)
36 d1f529f4 2005-10-29 devnull s_putc(sp, *cp);
37 d1f529f4 2005-10-29 devnull s_terminate(sp);
41 d1f529f4 2005-10-29 devnull * check for shell characters in a String
43 d1f529f4 2005-10-29 devnull static char *illegalchars = "\r\n";
45 d1f529f4 2005-10-29 devnull extern int
46 d1f529f4 2005-10-29 devnull shellchars(char *cp)
48 d1f529f4 2005-10-29 devnull char *sp;
50 d1f529f4 2005-10-29 devnull for(sp=illegalchars; *sp; sp++)
51 d1f529f4 2005-10-29 devnull if(strchr(cp, *sp))
52 d1f529f4 2005-10-29 devnull return 1;
53 d1f529f4 2005-10-29 devnull return 0;
56 605c0ea1 2006-02-08 devnull static char *specialchars = " ()<>{};=\\'`^&|";
57 d1f529f4 2005-10-29 devnull static char *escape = "%%";
60 d1f529f4 2005-10-29 devnull hexchar(int x)
62 d1f529f4 2005-10-29 devnull x &= 0xf;
63 d1f529f4 2005-10-29 devnull if(x < 10)
64 d1f529f4 2005-10-29 devnull return '0' + x;
66 d1f529f4 2005-10-29 devnull return 'A' + x - 10;
70 d1f529f4 2005-10-29 devnull * rewrite a string to escape shell characters
72 d1f529f4 2005-10-29 devnull extern String*
73 d1f529f4 2005-10-29 devnull escapespecial(String *s)
75 d1f529f4 2005-10-29 devnull String *ns;
76 d1f529f4 2005-10-29 devnull char *sp;
78 d1f529f4 2005-10-29 devnull for(sp = specialchars; *sp; sp++)
79 d1f529f4 2005-10-29 devnull if(strchr(s_to_c(s), *sp))
81 d1f529f4 2005-10-29 devnull if(*sp == 0)
82 d1f529f4 2005-10-29 devnull return s;
84 d1f529f4 2005-10-29 devnull ns = s_new();
85 d1f529f4 2005-10-29 devnull for(sp = s_to_c(s); *sp; sp++){
86 d1f529f4 2005-10-29 devnull if(strchr(specialchars, *sp)){
87 d1f529f4 2005-10-29 devnull s_append(ns, escape);
88 d1f529f4 2005-10-29 devnull s_putc(ns, hexchar(*sp>>4));
89 d1f529f4 2005-10-29 devnull s_putc(ns, hexchar(*sp));
91 d1f529f4 2005-10-29 devnull s_putc(ns, *sp);
93 d1f529f4 2005-10-29 devnull s_terminate(ns);
94 d1f529f4 2005-10-29 devnull s_free(s);
95 d1f529f4 2005-10-29 devnull return ns;
99 d1f529f4 2005-10-29 devnull hex2uint(char x)
101 d1f529f4 2005-10-29 devnull if(x >= '0' && x <= '9')
102 d1f529f4 2005-10-29 devnull return x - '0';
103 d1f529f4 2005-10-29 devnull if(x >= 'A' && x <= 'F')
104 d1f529f4 2005-10-29 devnull return (x - 'A') + 10;
105 d1f529f4 2005-10-29 devnull if(x >= 'a' && x <= 'f')
106 d1f529f4 2005-10-29 devnull return (x - 'a') + 10;
107 d1f529f4 2005-10-29 devnull return -512;
111 d1f529f4 2005-10-29 devnull * rewrite a string to remove shell characters escapes
113 d1f529f4 2005-10-29 devnull extern String*
114 d1f529f4 2005-10-29 devnull unescapespecial(String *s)
116 d1f529f4 2005-10-29 devnull String *ns;
117 d1f529f4 2005-10-29 devnull char *sp;
118 d1f529f4 2005-10-29 devnull uint c, n;
120 d1f529f4 2005-10-29 devnull if(strstr(s_to_c(s), escape) == 0)
121 d1f529f4 2005-10-29 devnull return s;
122 d1f529f4 2005-10-29 devnull n = strlen(escape);
124 d1f529f4 2005-10-29 devnull ns = s_new();
125 d1f529f4 2005-10-29 devnull for(sp = s_to_c(s); *sp; sp++){
126 d1f529f4 2005-10-29 devnull if(strncmp(sp, escape, n) == 0){
127 d1f529f4 2005-10-29 devnull c = (hex2uint(sp[n])<<4) + hex2uint(sp[n+1]);
128 d1f529f4 2005-10-29 devnull if(c < 0)
129 d1f529f4 2005-10-29 devnull s_putc(ns, *sp);
131 d1f529f4 2005-10-29 devnull s_putc(ns, c);
132 d1f529f4 2005-10-29 devnull sp += n+2-1;
135 d1f529f4 2005-10-29 devnull s_putc(ns, *sp);
137 d1f529f4 2005-10-29 devnull s_terminate(ns);
138 d1f529f4 2005-10-29 devnull s_free(s);
139 d1f529f4 2005-10-29 devnull return ns;
144 d1f529f4 2005-10-29 devnull returnable(char *path)
147 d1f529f4 2005-10-29 devnull return strcmp(path, "/dev/null") != 0;