1*219b2ee8SDavid du Colombier #include <stdlib.h> 2*219b2ee8SDavid du Colombier #include <string.h> 3*219b2ee8SDavid du Colombier #include <stdio.h> 4*219b2ee8SDavid du Colombier 5*219b2ee8SDavid du Colombier main(int argc, char **argv) 6*219b2ee8SDavid du Colombier { 7*219b2ee8SDavid du Colombier char *f, *b, *s; 8*219b2ee8SDavid du Colombier int n; 9*219b2ee8SDavid du Colombier 10*219b2ee8SDavid du Colombier if(argc < 2 || argc > 3){ 11*219b2ee8SDavid du Colombier fprintf(stderr, "Usage: basename string [suffix]\n"); 12*219b2ee8SDavid du Colombier exit(1); 13*219b2ee8SDavid du Colombier } 14*219b2ee8SDavid du Colombier s = argv[1]; 15*219b2ee8SDavid du Colombier b = s + strlen(s) - 1; 16*219b2ee8SDavid du Colombier while(b > s && *b == '/') 17*219b2ee8SDavid du Colombier b--; 18*219b2ee8SDavid du Colombier *++b = 0; 19*219b2ee8SDavid du Colombier if(b == s+1 && s[0] == '/') { 20*219b2ee8SDavid du Colombier printf("/"); 21*219b2ee8SDavid du Colombier exit(0); 22*219b2ee8SDavid du Colombier } 23*219b2ee8SDavid du Colombier /* now b is after last char of string, trailing slashes removed */ 24*219b2ee8SDavid du Colombier 25*219b2ee8SDavid du Colombier for(f = b; f >= s; f--) 26*219b2ee8SDavid du Colombier if(*f == '/'){ 27*219b2ee8SDavid du Colombier f++; 28*219b2ee8SDavid du Colombier break; 29*219b2ee8SDavid du Colombier } 30*219b2ee8SDavid du Colombier if(f < s) 31*219b2ee8SDavid du Colombier f = s; 32*219b2ee8SDavid du Colombier 33*219b2ee8SDavid du Colombier /* now f is first char after last remaining slash, or first char */ 34*219b2ee8SDavid du Colombier 35*219b2ee8SDavid du Colombier if(argc == 3){ 36*219b2ee8SDavid du Colombier n = strlen(argv[2]); 37*219b2ee8SDavid du Colombier if(n < b-f && strncmp(b-n, argv[2], n) == 0){ 38*219b2ee8SDavid du Colombier b -= n; 39*219b2ee8SDavid du Colombier *b = 0; 40*219b2ee8SDavid du Colombier } 41*219b2ee8SDavid du Colombier } 42*219b2ee8SDavid du Colombier printf("%s\n", f); 43*219b2ee8SDavid du Colombier exit(0); 44*219b2ee8SDavid du Colombier } 45