From 65a923180dba8ae569f8ddb3b8e5373a53281f61 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Mon, 24 May 2004 00:05:33 +0000 Subject: [PATCH] Initial release --- src/cp.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/strings.c | 115 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 241 insertions(+) create mode 100644 src/cp.c create mode 100644 src/strings.c diff --git a/src/cp.c b/src/cp.c new file mode 100644 index 0000000..54c57db --- /dev/null +++ b/src/cp.c @@ -0,0 +1,126 @@ +/* cp.c */ + + + +#include +#include +#include +extern int optind; +#include +#include +#include +#include + +#define sys_error(msg) { fprintf(stderr, "%s", "cp: "); perror(msg); return 2; } + + +/* cp */ +static int _cp_single(char * src, char * dst); +static int _cp_multiple(int argc, char * argv[]); +static int _cp(int argc, char * argv[]) +{ + /* FIXME + * - cp_multiple already checks if last arg is a dir + * => always call cp_multiple + * if argc == 2 && returns 1, call cp_single + * - blah blah */ + struct stat st; + + if(argc > 2) + return _cp_multiple(argc, argv); + if(stat(argv[1], &st) == -1 && errno != ENOENT) + sys_error(argv[1]); + if(S_ISDIR(st.st_mode)) + return _cp_multiple(argc, argv); + return _cp_single(argv[0], argv[1]); +} + +static int _cp_single(char * src, char * dst) +{ + FILE * fsrc; + FILE * fdst; + char buf[BUFSIZ]; + size_t size; + char * err = src; + struct stat st; + + if(stat(src, &st) == -1) + sys_error(src); + if(S_ISDIR(st.st_mode)) + { + fprintf(stderr, "%s%s%s", "cp: ", src, ": omitting directory\n"); + return 2; + } + if((fsrc = fopen(src, "r")) == NULL) + sys_error(src); + if((fdst = fopen(dst, "w")) == NULL) + { + fclose(fsrc); + sys_error(dst); + } + while((size = fread(buf, sizeof(char), BUFSIZ, fsrc)) > 0) + if(fwrite(buf, sizeof(char), size, fdst) != BUFSIZ) + { + err = dst; + break; + } + fclose(fdst); + if(!feof(fsrc)) + { + fclose(fsrc); + sys_error(err); + } + fclose(fsrc); + return 0; +} + +static int _cp_multiple(int argc, char * argv[]) +{ + char * dst = NULL; + char * p; + int i, len; + + for(i = 0; i < argc - 1; i++) + { + len = strlen(argv[i]) + strlen(argv[argc-1]) + 2; + if((p = realloc(dst, len * sizeof(char))) == NULL) + { + free(dst); + sys_error("malloc"); + } + dst = p; + sprintf(dst, "%s/%s", argv[argc-1], argv[i]); + _cp_single(argv[i], dst); + } + free(dst); + return 2; +} + +/* usage */ +static int _usage(void) +{ + fprintf(stderr, "%s", "Usage: cp [-fip] source_file target_file\n\ + cp [-fip] source_file ... target\n\ + cp -R [-H | -L | -P][-fip] source_file ... target\n\ + cp -r [-H | -L | -P][-fip] source_file ... target\n"); + return 1; +} + + +/* main */ +int main(int argc, char * argv[]) +{ + int o; + + while((o = getopt(argc, argv, "")) != -1) + { + switch(o) + { + case '?': + return _usage(); + } + } + if(optind + 1 >= argc) + return _usage(); + return _cp(argc - optind, &argv[optind]); +} diff --git a/src/strings.c b/src/strings.c new file mode 100644 index 0000000..46ce9b4 --- /dev/null +++ b/src/strings.c @@ -0,0 +1,115 @@ +/* strings.c */ + + + +#include +extern int optind; +extern char * optarg; +#include +#include +#include + + + +/* strings */ +static void _strings_do(int flgn, FILE * fp); +static int _strings(int flgn, int argc, char * argv[]) +{ + FILE * fp; + int i; + + if(argc == 0) + { + _strings_do(flgn, stdin); + return 0; + } + for(i = 0; i < argc; i++) + { + if((fp = fopen(argv[i], "r")) == NULL) + { + fprintf(stderr, "%s%s", "strings: ", argv[i]); + perror("fopen"); + return 2; + } + _strings_do(flgn, fp); + fclose(fp); + } + return 0; +} + +static void _strings_do(int flgn, FILE * fp) +{ + int c; + char * str; + char * p; + int i = 0; + int n; + + str = malloc(flgn * sizeof(char)); + n = flgn; + while((c = fgetc(fp)) != EOF) + { + if(isprint(c)) + { + if(i + 1 >= n) + { + if((p = realloc(str, (i + 2) * sizeof(char))) == NULL) + { + perror("malloc"); + return; + } + str = p; + n = i + 2; + } + str[i++] = c; + } + else if(i >= flgn && (c == '\n' || c == '\0')) + { + str[i] = '\0'; + printf("%s\n", str); + i = 0; + } + else + i = 0; + } + free(str); +} + + +/* usage */ +static int _usage(void) +{ + fprintf(stderr, "%s", "Usage: strings [-a][-t format][-n number][file...]\n\ + -a\n\ + -t\n\ + -n\n"); + return 1; +} + + +/* main */ +int main(int argc, char * argv[]) +{ + int o; + int flgn = 4; + char * p; + + while((o = getopt(argc, argv, "at:n:")) != -1) + { + switch(o) + { + case 'a': + break; + case 't': + break; + case 'n': + flgn = strtol(optarg, &p, 10); + if(*(optarg) == '\0' || *p != '\0') + return _usage(); + break; + case '?': + return _usage(); + } + } + return _strings(flgn, argc - optind, &argv[optind]); +}