Readded some POSIX utils I'd written prior
This commit is contained in:
parent
c05b989f71
commit
333b984e4e
5 changed files with 162 additions and 0 deletions
90
basename.c
Executable file
90
basename.c
Executable file
|
@ -0,0 +1,90 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(int argc, char ** argv) {
|
||||
int suffix_present = 0, i, j;
|
||||
char *basename; char c;
|
||||
int basename_length = 0, last_slash = 0;
|
||||
int suffix_length = 0;
|
||||
|
||||
if(argc > 2) {
|
||||
suffix_present = 1;
|
||||
}
|
||||
else if(argc == 1) {
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(strcmp(argv[1], "//") == 0) {
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
|
||||
for(c = argv[1][i]; c != '\0'; c = argv[1][i]) {
|
||||
i++;
|
||||
}
|
||||
|
||||
if(argv[1][i-1] == '/') {
|
||||
argv[1][i-1] = '\0';
|
||||
}
|
||||
|
||||
i = 0;
|
||||
|
||||
for(c = argv[1][i]; c != '\0'; c = argv[1][i]) {
|
||||
if(c == '/') {
|
||||
last_slash = i;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
i = last_slash + 1;
|
||||
|
||||
for(c = argv[1][i]; c != '\0'; c = argv[1][i]) {
|
||||
basename_length++; i++;
|
||||
}
|
||||
|
||||
basename = calloc(basename_length + 1, sizeof(*basename));
|
||||
if(basename == NULL) {
|
||||
fprintf(stderr, "%s: Could not allocate sufficient memory\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
i = last_slash + 1;
|
||||
|
||||
for(c = argv[1][i]; c != '\0'; c = argv[1][i]) {
|
||||
basename[i - (last_slash + 1)] = c;
|
||||
i++;
|
||||
}
|
||||
|
||||
basename[basename_length] = '\0';
|
||||
|
||||
if(suffix_present && strcmp(basename, argv[2]) != 0) {
|
||||
i = 0;
|
||||
for(c = argv[2][i]; c != '\0'; c = argv[2][i]) {
|
||||
suffix_length++;
|
||||
i++;
|
||||
}
|
||||
|
||||
j = suffix_length - 1;
|
||||
|
||||
for(i = basename_length - 1; i > 0; i--) {
|
||||
if(basename[i] != argv[2][j]) {
|
||||
break;
|
||||
}
|
||||
else if(j == 0) {
|
||||
basename[i] = '\0';
|
||||
i = 0;
|
||||
}
|
||||
j--;
|
||||
}
|
||||
}
|
||||
|
||||
printf("%s\n", basename);
|
||||
|
||||
free(basename);
|
||||
|
||||
return 0;
|
||||
}
|
49
dirname.c
Executable file
49
dirname.c
Executable file
|
@ -0,0 +1,49 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(int argc, char ** argv) {
|
||||
int i, last_slash = -1, length;
|
||||
|
||||
if(argc == 1) {
|
||||
printf("/\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(strcmp(argv[1], "//") == 0) {
|
||||
printf("/\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
length = strlen(argv[1]);
|
||||
|
||||
if(argv[1][length - 1] == '/') {
|
||||
argv[1][length - 1] = '\0';
|
||||
}
|
||||
|
||||
for(i = 0; i < length; i++) {
|
||||
if(argv[1][i] == '/') {
|
||||
last_slash = i;
|
||||
}
|
||||
}
|
||||
|
||||
if(last_slash == -1) {
|
||||
printf(".\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
argv[1][last_slash] = '\0';
|
||||
|
||||
if(strcmp(argv[1], "//") == 0 || strcmp(argv[1], "") == 0 ||
|
||||
strcmp(argv[1], "/") == 0) {
|
||||
printf("/\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
for(i = last_slash - 1; argv[1][i] == '/'; i--) {
|
||||
argv[1][i] = '\0';
|
||||
}
|
||||
|
||||
printf("%s\n", argv[1]);
|
||||
|
||||
return 0;
|
||||
}
|
3
false.c
Executable file
3
false.c
Executable file
|
@ -0,0 +1,3 @@
|
|||
int main() {
|
||||
return -1;
|
||||
}
|
17
link.c
Executable file
17
link.c
Executable file
|
@ -0,0 +1,17 @@
|
|||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(int argc, char * argv[]) {
|
||||
if(argc < 3) {
|
||||
fprintf(stderr, "%s: missing file operand\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if(argc > 3) {
|
||||
fprintf(stderr, "%s: extra operand specified\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return link(argv[1], argv[2]);
|
||||
}
|
3
true.c
Executable file
3
true.c
Executable file
|
@ -0,0 +1,3 @@
|
|||
int main() {
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue