1 c99867c9 2014-06-03 rsc #include "common.h"
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)
7 c99867c9 2014-06-03 rsc if (*path == '/') {
8 c99867c9 2014-06-03 rsc to = s_append(to, path);
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);
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)
23 c99867c9 2014-06-03 rsc cp = strrchr(path, '/');
24 c99867c9 2014-06-03 rsc return cp==0 ? path : cp+1;
27 c99867c9 2014-06-03 rsc /* append a sub-expression match onto a String */
29 c99867c9 2014-06-03 rsc append_match(Resub *subexp, String *sp, int se)
31 c99867c9 2014-06-03 rsc char *cp, *ep;
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);
41 c99867c9 2014-06-03 rsc * check for shell characters in a String
43 c99867c9 2014-06-03 rsc static char *illegalchars = "\r\n";
46 c99867c9 2014-06-03 rsc shellchars(char *cp)
50 c99867c9 2014-06-03 rsc for(sp=illegalchars; *sp; sp++)
51 c99867c9 2014-06-03 rsc if(strchr(cp, *sp))
56 c99867c9 2014-06-03 rsc static char *specialchars = " ()<>{};=\\'`^&|";
57 c99867c9 2014-06-03 rsc static char *escape = "%%";
60 c99867c9 2014-06-03 rsc hexchar(int x)
64 c99867c9 2014-06-03 rsc return '0' + x;
66 c99867c9 2014-06-03 rsc return 'A' + x - 10;
70 c99867c9 2014-06-03 rsc * rewrite a string to escape shell characters
72 c99867c9 2014-06-03 rsc extern String*
73 c99867c9 2014-06-03 rsc escapespecial(String *s)
78 c99867c9 2014-06-03 rsc for(sp = specialchars; *sp; sp++)
79 c99867c9 2014-06-03 rsc if(strchr(s_to_c(s), *sp))
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));
91 c99867c9 2014-06-03 rsc s_putc(ns, *sp);
93 c99867c9 2014-06-03 rsc s_terminate(ns);
99 c99867c9 2014-06-03 rsc hex2uint(char x)
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;
111 c99867c9 2014-06-03 rsc * rewrite a string to remove shell characters escapes
113 c99867c9 2014-06-03 rsc extern String*
114 c99867c9 2014-06-03 rsc unescapespecial(String *s)
120 c99867c9 2014-06-03 rsc if(strstr(s_to_c(s), escape) == 0)
122 c99867c9 2014-06-03 rsc n = strlen(escape);
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]);
129 c99867c9 2014-06-03 rsc s_putc(ns, *sp);
131 c99867c9 2014-06-03 rsc s_putc(ns, c);
132 c99867c9 2014-06-03 rsc sp += n+2-1;
135 c99867c9 2014-06-03 rsc s_putc(ns, *sp);
137 c99867c9 2014-06-03 rsc s_terminate(ns);
144 c99867c9 2014-06-03 rsc returnable(char *path)
147 c99867c9 2014-06-03 rsc return strcmp(path, "/dev/null") != 0;