[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tyndur-devel] [PATCH] ls: Versteckte Dateien, Mehrere Verzeichnisse listen



On Sat, Aug 08, 2009 at 11:39:10PM +0200, Alexander Siol wrote:
> +ls: Erkennung & Handhabung versteckter Dateien
> +ls: Mehrere Verzeichnisse können zum auflisten angegeben werden
> *ls: Umstellung auf getopt für weitere Erweiterungen
> 
> Signed-off-by: Alexander Siol <alex@xxxxxxxxxx>
> ---
>  trunk/src/modules/c/shell/cmds/ls.c |  110 +++++++++++++++++++++++++----------
>  1 files changed, 78 insertions(+), 32 deletions(-)
> 
> diff --git a/trunk/src/modules/c/shell/cmds/ls.c b/trunk/src/modules/c/shell/cmds/ls.c
> index 195f769..8cfe7c7 100644
> --- a/trunk/src/modules/c/shell/cmds/ls.c
> +++ b/trunk/src/modules/c/shell/cmds/ls.c
> @@ -1,8 +1,8 @@
>  /*
> - * Copyright (c) 2007 The tyndur Project. All rights reserved.
> + * Copyright (c) 2007-2009 The tyndur Project. All rights reserved.
>   *
>   * This code is derived from software contributed to the tyndur Project
> - * by Antoine Kaufmann.
> + * by Antoine Kaufmann, Alexander Siol
>   *
>   * Redistribution and use in source and binary forms, with or without
>   * modification, are permitted provided that the following conditions
> @@ -39,6 +39,8 @@
>  #include "dir.h"
>  #include "unistd.h"
>  #include <lost/config.h>
> +#include <getopt.h>
> +#include <collections.h>
>  
>  void ls_display_usage(void);
>  
> @@ -48,46 +50,89 @@ void ls_display_usage(void);
>      int main(int argc, char* argv[])
>  #endif
>  {
> -    if (argc > 2) {
> -        ls_display_usage();
> -        return -1;
> -    }
> -    
>      char* dir_path;
> -    bool free_dir_path;
> +    char* cwd_dir = NULL;
>      bool success = TRUE;
> +    bool show_hidden = FALSE;
> +    list_t *dirs = list_create();
> +    bool print_dirnames = FALSE;
>  
> -    if (argc == 1) {
> -        //Mit NULL als Parameter wird der buffer mit malloc() erstellt
> -        dir_path = getcwd(NULL, 0);
> -        free_dir_path = TRUE;
> -    } else {
> -        dir_path = argv[1];
> -        free_dir_path = FALSE;
> +    static const struct option long_options[] =
> +    {
> +        { "all", no_argument,          0, 'a' },
> +        { "help", no_argument,         0,   1 },
> +        { 0, 0, 0, 0 }
> +    };
> +
> +    optind = 0;
> +
> +    while (optind < argc) {
> +        int result = getopt_long(argc, argv, "a", long_options, NULL);

Warum kein -h erlauben?

> +        if (result == -1) {
> +            break;
> +        }
> +        switch (result) {
> +            case 'a':
> +                show_hidden = TRUE;
> +                break;
> +            case 1:
> +                ls_display_usage();
> +                return EXIT_SUCCESS;
> +            default:
> +                break;
> +        }
> +    }
> +
> +    while (optind < argc) {
> +        list_push(dirs, argv[optind++]);
>      }
>  
> +    if (list_size(dirs) == 0) {
> +        cwd_dir = getcwd(NULL, 0);
> +        list_push(dirs, cwd_dir);
> +    } 
> +
> +    if (list_size(dirs) > 1) {
> +        print_dirnames = TRUE;
> +    }
>  
> -    io_resource_t* dir_res = directory_open(dir_path);
> -    if (dir_res != NULL) {
> -        io_direntry_t* direntry;
> -        while ((direntry = directory_read(dir_res))) {
> -            if (direntry->type == IO_DIRENTRY_FILE) {
> -                printf("       %s\n", direntry->name);
> -            } else {
> -                printf(" [DIR] %s\n", direntry->name);
> +    while ((dir_path = list_pop(dirs))) {
> +        if (print_dirnames) {
> +            printf("%s:\n", dir_path);
> +        }
> +        io_resource_t* dir_res = directory_open(dir_path);
> +        if (dir_res != NULL) {
> +            io_direntry_t* direntry;
> +            while ((direntry = directory_read(dir_res))) {
> +                bool entry_hidden = FALSE;
> +                if (strncmp(direntry->name, ".", 1) == 0) {
> +                    entry_hidden = TRUE;
> +                }

Darf ich einen Gegenvorschlag machen?

bool entry_hidden = (*direntry->name == '.');

> +                if (entry_hidden == FALSE || show_hidden == TRUE) {

if (!entry_hidden || show_hidden)

> +                    if (direntry->type == IO_DIRENTRY_FILE) {
> +                        printf("       %s\n", direntry->name);
> +                    } else {
> +                        printf(" [DIR] %s\n", direntry->name);
> +                    }
> +                }
> +                free(direntry);
>              }
> -           free(direntry);
> +    
> +            directory_close(dir_res);
> +        } else {
> +            printf("Konnte '%s' nicht zum lesen oeffnen!\n", dir_path);

öffnen mit ö

> +            success = FALSE;
> +        }
> +        if (list_size(dirs) > 0) {
> +            printf("\n");
>          }
> -
> -        directory_close(dir_res);
> -    } else {
> -        printf("Konnte '%s' nicht zum lesen oeffnen!\n", dir_path);
> -        success = FALSE;
>      }
>  
> -    if (free_dir_path == TRUE) {
> -        free(dir_path);
> +    if (cwd_dir != NULL) {
> +        free(cwd_dir);
>      }

free(NULL) funktioniert ohne weiteres

> +
> +    list_destroy(dirs);
>      
>      if (success == TRUE) {
>          return EXIT_SUCCESS;
> @@ -98,6 +143,7 @@ void ls_display_usage(void);
>  
>  void ls_display_usage()
>  {
> -    puts("\nAufruf: ls [Verzeichnis]\n");
> +    puts("\nAufruf: ls [-a] [Verzeichnis]\n");
> +    puts("Mittels der Option -a werden versteckte Dateien angezeigt.\n");

Das könnte man auch in ein üblicheres Format bringen, also:

-a:     Versteckte Dateien anzeigen
-h:     -Dieser Hilfe


>
>
>
>  }
>  
> -- 
> 1.5.6.5
> 
> _______________________________________________
> tyndur-devel mailing list
> tyndur-devel@xxxxxxxxxx
> http://list.tyndur.org/mailman/listinfo/tyndur-devel