[9] | 1 | /* basename - print last part of a path Authors: B. Garfolo & P. Nelson */
|
---|
| 2 |
|
---|
| 3 | /* Basename - print the last part of a path.
|
---|
| 4 | *
|
---|
| 5 | * For MINIX -- Conforms to POSIX - P1003.2/D10
|
---|
| 6 | * Exception -- it ignores the LC environment variables.
|
---|
| 7 | *
|
---|
| 8 | * Original MINIX author: Blaine Garfolo
|
---|
| 9 | * POSIX rewrite author: Philip A. Nelson
|
---|
| 10 | *
|
---|
| 11 | * POSIX version - October 20, 1990
|
---|
| 12 | * Feb 14, 1991: changed rindex to strrchr. (PAN)
|
---|
| 13 | *
|
---|
| 14 | */
|
---|
| 15 |
|
---|
| 16 |
|
---|
| 17 | #include <string.h>
|
---|
| 18 | #include <stdlib.h>
|
---|
| 19 | #include <stdio.h>
|
---|
| 20 |
|
---|
| 21 | #define EOS '\0'
|
---|
| 22 |
|
---|
| 23 | _PROTOTYPE(int main, (int argc, char **argv));
|
---|
| 24 |
|
---|
| 25 | int main(argc, argv)
|
---|
| 26 | int argc;
|
---|
| 27 | char *argv[];
|
---|
| 28 | {
|
---|
| 29 | char *result_string; /* The pointer into argv[1]. */
|
---|
| 30 | char *temp; /* Used to move around in argv[1]. */
|
---|
| 31 | int suffix_len; /* Length of the suffix. */
|
---|
| 32 | int suffix_start; /* Where the suffix should start. */
|
---|
| 33 |
|
---|
| 34 |
|
---|
| 35 | /* Check for the correct number of arguments. */
|
---|
| 36 | if ((argc < 2) || (argc > 3)) {
|
---|
| 37 | fprintf(stderr, "Usage: basename string [suffix] \n");
|
---|
| 38 | exit(1);
|
---|
| 39 | }
|
---|
| 40 |
|
---|
| 41 | /* Check for all /'s */
|
---|
| 42 | for (temp = argv[1]; *temp == '/'; temp++) /* Move to next char. */
|
---|
| 43 | ;
|
---|
| 44 | if (*temp == EOS) {
|
---|
| 45 | printf("/\n");
|
---|
| 46 | exit(0);
|
---|
| 47 | }
|
---|
| 48 |
|
---|
| 49 | /* Build the basename. */
|
---|
| 50 | result_string = argv[1];
|
---|
| 51 |
|
---|
| 52 | /* Find the last /'s */
|
---|
| 53 | temp = strrchr(result_string, '/');
|
---|
| 54 |
|
---|
| 55 | if (temp != NULL) {
|
---|
| 56 | /* Remove trailing /'s. */
|
---|
| 57 | while ((*(temp + 1) == EOS) && (*temp == '/')) *temp-- = EOS;
|
---|
| 58 |
|
---|
| 59 | /* Set result_string to last part of path. */
|
---|
| 60 | if (*temp != '/') temp = strrchr(result_string, '/');
|
---|
| 61 | if (temp != NULL && *temp == '/') result_string = temp + 1;
|
---|
| 62 | }
|
---|
| 63 |
|
---|
| 64 | /* Remove the suffix, if any. */
|
---|
| 65 | if (argc > 2) {
|
---|
| 66 | suffix_len = strlen(argv[2]);
|
---|
| 67 | suffix_start = strlen(result_string) - suffix_len;
|
---|
| 68 | if (suffix_start > 0)
|
---|
| 69 | if (strcmp(result_string + suffix_start, argv[2]) == EOS)
|
---|
| 70 | *(result_string + suffix_start) = EOS;
|
---|
| 71 | }
|
---|
| 72 |
|
---|
| 73 | /* Print the resultant string. */
|
---|
| 74 | printf("%s\n", result_string);
|
---|
| 75 | return(0);
|
---|
| 76 | }
|
---|