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