xref: /plan9/sys/src/cmd/upas/common/aux.c (revision 34a82533f8bc729c8047271cce828f5c89364b66)
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