xref: /plan9/sys/src/ape/cmd/basename.c (revision 027288c8a8763d34db13dc89d8bcd6514dbc2163)
1219b2ee8SDavid du Colombier #include <stdlib.h>
2219b2ee8SDavid du Colombier #include <string.h>
3219b2ee8SDavid du Colombier #include <stdio.h>
4219b2ee8SDavid du Colombier 
5*027288c8SDavid du Colombier void
main(int argc,char ** argv)6219b2ee8SDavid du Colombier main(int argc, char **argv)
7219b2ee8SDavid du Colombier {
8219b2ee8SDavid du Colombier 	char *f, *b, *s;
9219b2ee8SDavid du Colombier 	int n;
10219b2ee8SDavid du Colombier 
11219b2ee8SDavid du Colombier 	if(argc < 2 || argc > 3){
12219b2ee8SDavid du Colombier 		fprintf(stderr, "Usage: basename string [suffix]\n");
13219b2ee8SDavid du Colombier 		exit(1);
14219b2ee8SDavid du Colombier 	}
15219b2ee8SDavid du Colombier 	s = argv[1];
16219b2ee8SDavid du Colombier 	b = s + strlen(s) - 1;
17219b2ee8SDavid du Colombier 	while(b > s && *b == '/')
18219b2ee8SDavid du Colombier 		b--;
19219b2ee8SDavid du Colombier 	*++b = 0;
20219b2ee8SDavid du Colombier 	if(b == s+1 && s[0] == '/') {
21219b2ee8SDavid du Colombier 		printf("/");
22219b2ee8SDavid du Colombier 		exit(0);
23219b2ee8SDavid du Colombier 	}
24219b2ee8SDavid du Colombier 	/* now b is after last char of string, trailing slashes removed */
25219b2ee8SDavid du Colombier 
26219b2ee8SDavid du Colombier 	for(f = b; f >= s; f--)
27219b2ee8SDavid du Colombier 		if(*f == '/'){
28219b2ee8SDavid du Colombier 			f++;
29219b2ee8SDavid du Colombier 			break;
30219b2ee8SDavid du Colombier 		}
31219b2ee8SDavid du Colombier 	if(f < s)
32219b2ee8SDavid du Colombier 		f = s;
33219b2ee8SDavid du Colombier 
34219b2ee8SDavid du Colombier 	/* now f is first char after last remaining slash, or first char */
35219b2ee8SDavid du Colombier 
36219b2ee8SDavid du Colombier 	if(argc == 3){
37219b2ee8SDavid du Colombier 		n = strlen(argv[2]);
38219b2ee8SDavid du Colombier 		if(n < b-f && strncmp(b-n, argv[2], n) == 0){
39219b2ee8SDavid du Colombier 			b -= n;
40219b2ee8SDavid du Colombier 			*b = 0;
41219b2ee8SDavid du Colombier 		}
42219b2ee8SDavid du Colombier 	}
43219b2ee8SDavid du Colombier 	printf("%s\n", f);
44219b2ee8SDavid du Colombier 	exit(0);
45219b2ee8SDavid du Colombier }
46