13e12c5d1SDavid du Colombier #include "common.h"
23e12c5d1SDavid du Colombier
33e12c5d1SDavid du Colombier /* expand a path relative to some `.' */
43e12c5d1SDavid du Colombier extern String *
abspath(char * path,char * dot,String * to)53e12c5d1SDavid du Colombier abspath(char *path, char *dot, String *to)
63e12c5d1SDavid du Colombier {
73e12c5d1SDavid du Colombier if (*path == '/') {
83e12c5d1SDavid du Colombier to = s_append(to, path);
93e12c5d1SDavid du Colombier } else {
103e12c5d1SDavid du Colombier to = s_append(to, dot);
113e12c5d1SDavid du Colombier to = s_append(to, "/");
123e12c5d1SDavid du Colombier to = s_append(to, path);
133e12c5d1SDavid du Colombier }
143e12c5d1SDavid du Colombier return to;
153e12c5d1SDavid du Colombier }
163e12c5d1SDavid du Colombier
173e12c5d1SDavid du Colombier /* return a pointer to the base component of a pathname */
183e12c5d1SDavid du Colombier extern char *
basename(char * path)193e12c5d1SDavid du Colombier basename(char *path)
203e12c5d1SDavid du Colombier {
213e12c5d1SDavid du Colombier char *cp;
223e12c5d1SDavid du Colombier
233e12c5d1SDavid du Colombier cp = strrchr(path, '/');
243e12c5d1SDavid du Colombier return cp==0 ? path : cp+1;
253e12c5d1SDavid du Colombier }
263e12c5d1SDavid du Colombier
273e12c5d1SDavid du Colombier /* append a sub-expression match onto a String */
283e12c5d1SDavid du Colombier extern void
append_match(Resub * subexp,String * sp,int se)293e12c5d1SDavid du Colombier append_match(Resub *subexp, String *sp, int se)
303e12c5d1SDavid du Colombier {
317dd7cddfSDavid du Colombier char *cp, *ep;
323e12c5d1SDavid du Colombier
337dd7cddfSDavid du Colombier cp = subexp[se].sp;
347dd7cddfSDavid du Colombier ep = subexp[se].ep;
353e12c5d1SDavid du Colombier for (; cp < ep; cp++)
363e12c5d1SDavid du Colombier s_putc(sp, *cp);
373e12c5d1SDavid du Colombier s_terminate(sp);
383e12c5d1SDavid du Colombier }
393e12c5d1SDavid du Colombier
403e12c5d1SDavid du Colombier /*
413e12c5d1SDavid du Colombier * check for shell characters in a String
423e12c5d1SDavid du Colombier */
437dd7cddfSDavid du Colombier static char *illegalchars = "\r\n";
447dd7cddfSDavid du Colombier
453e12c5d1SDavid du Colombier extern int
shellchars(char * cp)463e12c5d1SDavid du Colombier shellchars(char *cp)
473e12c5d1SDavid du Colombier {
483e12c5d1SDavid du Colombier char *sp;
493e12c5d1SDavid du Colombier
507dd7cddfSDavid du Colombier for(sp=illegalchars; *sp; sp++)
513e12c5d1SDavid du Colombier if(strchr(cp, *sp))
523e12c5d1SDavid du Colombier return 1;
533e12c5d1SDavid du Colombier return 0;
543e12c5d1SDavid du Colombier }
557dd7cddfSDavid du Colombier
567dd7cddfSDavid du Colombier static char *specialchars = " ()<>{};=\\'\`^&|";
577dd7cddfSDavid du Colombier static char *escape = "%%";
587dd7cddfSDavid du Colombier
597dd7cddfSDavid du Colombier int
hexchar(int x)607dd7cddfSDavid du Colombier hexchar(int x)
617dd7cddfSDavid du Colombier {
627dd7cddfSDavid du Colombier x &= 0xf;
637dd7cddfSDavid du Colombier if(x < 10)
647dd7cddfSDavid du Colombier return '0' + x;
657dd7cddfSDavid du Colombier else
667dd7cddfSDavid du Colombier return 'A' + x - 10;
677dd7cddfSDavid du Colombier }
687dd7cddfSDavid du Colombier
697dd7cddfSDavid du Colombier /*
707dd7cddfSDavid du Colombier * rewrite a string to escape shell characters
717dd7cddfSDavid du Colombier */
727dd7cddfSDavid du Colombier extern String*
escapespecial(String * s)737dd7cddfSDavid du Colombier escapespecial(String *s)
747dd7cddfSDavid du Colombier {
757dd7cddfSDavid du Colombier String *ns;
767dd7cddfSDavid du Colombier char *sp;
777dd7cddfSDavid du Colombier
787dd7cddfSDavid du Colombier for(sp = specialchars; *sp; sp++)
797dd7cddfSDavid du Colombier if(strchr(s_to_c(s), *sp))
807dd7cddfSDavid du Colombier break;
817dd7cddfSDavid du Colombier if(*sp == 0)
827dd7cddfSDavid du Colombier return s;
837dd7cddfSDavid du Colombier
847dd7cddfSDavid du Colombier ns = s_new();
857dd7cddfSDavid du Colombier for(sp = s_to_c(s); *sp; sp++){
867dd7cddfSDavid du Colombier if(strchr(specialchars, *sp)){
877dd7cddfSDavid du Colombier s_append(ns, escape);
887dd7cddfSDavid du Colombier s_putc(ns, hexchar(*sp>>4));
897dd7cddfSDavid du Colombier s_putc(ns, hexchar(*sp));
907dd7cddfSDavid du Colombier } else
917dd7cddfSDavid du Colombier s_putc(ns, *sp);
927dd7cddfSDavid du Colombier }
937dd7cddfSDavid du Colombier s_terminate(ns);
947dd7cddfSDavid du Colombier s_free(s);
957dd7cddfSDavid du Colombier return ns;
967dd7cddfSDavid du Colombier }
977dd7cddfSDavid du Colombier
98*34a82533SDavid du Colombier int
hex2uint(char x)997dd7cddfSDavid du Colombier hex2uint(char x)
1007dd7cddfSDavid du Colombier {
1017dd7cddfSDavid du Colombier if(x >= '0' && x <= '9')
1027dd7cddfSDavid du Colombier return x - '0';
1037dd7cddfSDavid du Colombier if(x >= 'A' && x <= 'F')
1047dd7cddfSDavid du Colombier return (x - 'A') + 10;
1057dd7cddfSDavid du Colombier if(x >= 'a' && x <= 'f')
1067dd7cddfSDavid du Colombier return (x - 'a') + 10;
1077dd7cddfSDavid du Colombier return -512;
1087dd7cddfSDavid du Colombier }
1097dd7cddfSDavid du Colombier
1107dd7cddfSDavid du Colombier /*
1117dd7cddfSDavid du Colombier * rewrite a string to remove shell characters escapes
1127dd7cddfSDavid du Colombier */
1137dd7cddfSDavid du Colombier extern String*
unescapespecial(String * s)1147dd7cddfSDavid du Colombier unescapespecial(String *s)
1157dd7cddfSDavid du Colombier {
116*34a82533SDavid du Colombier int c;
1177dd7cddfSDavid du Colombier String *ns;
1187dd7cddfSDavid du Colombier char *sp;
119*34a82533SDavid du Colombier uint n;
1207dd7cddfSDavid du Colombier
1217dd7cddfSDavid du Colombier if(strstr(s_to_c(s), escape) == 0)
1227dd7cddfSDavid du Colombier return s;
1237dd7cddfSDavid du Colombier n = strlen(escape);
1247dd7cddfSDavid du Colombier
1257dd7cddfSDavid du Colombier ns = s_new();
1267dd7cddfSDavid du Colombier for(sp = s_to_c(s); *sp; sp++){
1277dd7cddfSDavid du Colombier if(strncmp(sp, escape, n) == 0){
128*34a82533SDavid du Colombier c = (hex2uint(sp[n])<<4) | hex2uint(sp[n+1]);
1297dd7cddfSDavid du Colombier if(c < 0)
1307dd7cddfSDavid du Colombier s_putc(ns, *sp);
1317dd7cddfSDavid du Colombier else {
1327dd7cddfSDavid du Colombier s_putc(ns, c);
1337dd7cddfSDavid du Colombier sp += n+2-1;
1347dd7cddfSDavid du Colombier }
1357dd7cddfSDavid du Colombier } else
1367dd7cddfSDavid du Colombier s_putc(ns, *sp);
1377dd7cddfSDavid du Colombier }
1387dd7cddfSDavid du Colombier s_terminate(ns);
1397dd7cddfSDavid du Colombier s_free(s);
1407dd7cddfSDavid du Colombier return ns;
1417dd7cddfSDavid du Colombier
1427dd7cddfSDavid du Colombier }
1437dd7cddfSDavid du Colombier
1447dd7cddfSDavid du Colombier int
returnable(char * path)1457dd7cddfSDavid du Colombier returnable(char *path)
1467dd7cddfSDavid du Colombier {
1477dd7cddfSDavid du Colombier
1489a747e4fSDavid du Colombier return strcmp(path, "/dev/null") != 0;
1497dd7cddfSDavid du Colombier }
150