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

[tyndur-devel] [PATCH] bincat: Positionsangabe moeglich (wird auf 1k-Bloecke gerundet)



+bincat: Positionsangaben (Start, Länge und Ende)
*bincat: Umstellung auf getopt

Signed-off-by: Alexander Siol <alex@xxxxxxxxxx>
---
 trunk/src/modules/c/shell/cmds/bincat.c |   75 +++++++++++++++++++++++++++---
 1 files changed, 67 insertions(+), 8 deletions(-)

diff --git a/trunk/src/modules/c/shell/cmds/bincat.c b/trunk/src/modules/c/shell/cmds/bincat.c
index 8c0372e..0fa8539 100644
--- a/trunk/src/modules/c/shell/cmds/bincat.c
+++ b/trunk/src/modules/c/shell/cmds/bincat.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
@@ -38,35 +38,94 @@
 #include "stdio.h"
 #include "unistd.h"
 #include <lost/config.h>
+#include <getopt.h>
 
 #define BLOCK_SIZE 1024
 
 void bincat_display_usage(void);
 
+#define min(a,b) (a < b)?(a):(b);
+
 #ifdef CONFIG_SHELL_BUILTIN_ONLY
     int shell_command_bincat(int argc, char* argv[], const char* args)
 #else
     int main(int argc, char* argv[])
 #endif
 {
-    if (argc != 2) {
+    static const struct option long_options[] =
+    {
+        { "start", required_argument,  0, 's' },
+        { "size", required_argument,   0, 'l' },
+        { "end", required_argument,    0, 'e' },
+        { "help", no_argument,         0, 'h' },
+        { 0, 0, 0, 0 }
+    };
+
+    optind = 0;
+    int start = 0;
+    int end = 0;
+    int length = 0;
+    char *path = NULL;
+    int n = 0;
+    int m = 0;
+    size_t total_read = 0;
+
+
+    while (optind < argc) {
+        int result = getopt_long(argc, argv, "s:l:e:h", long_options, NULL);
+        if (result == -1) {
+            break;
+        }
+        switch (result) {
+            case 's':
+                start = atoi(optarg);
+                break;
+            case 'l':
+                length = atoi(optarg);
+                break;
+            case 'e':
+                end = atoi(optarg);
+                break;
+            case 'h':
+                bincat_display_usage();
+                return EXIT_SUCCESS;
+            default:
+                break;
+        }
+    }
+
+    if (length && end) {
+        printf("--size und --end schließen sich aus. Verwende --size\n");
+    } else if (end) {
+        length = end - start;
+    }
+
+    while (optind < argc) {
+        path = argv[optind++];
+    }
+
+    if (path == NULL) {
         bincat_display_usage();
-        return -1;
+        return EXIT_SUCCESS;
     }
 
-    char* path = argv[1];
     FILE* file = fopen(path, "r");
 
+    fseek(file, start, SEEK_SET);
+    m = start / 8;
+
     if (file == NULL) {
         printf("Konnte '%s' nicht zum lesen oeffnen!\n", path);
         return -1;
     } else {
         char buffer[BLOCK_SIZE];
         size_t size;
-        int n, m = 0;
-        while (feof(file) != EOF) {
+        while (feof(file) != EOF && (total_read <= length || length == 0)) {
+
             size = fread(buffer, 1, BLOCK_SIZE, file);
 
+            total_read += size;
+
             printf("0x%08x: ", m);
 
             for (n=0; n < size; n++) {
@@ -82,7 +141,7 @@ void bincat_display_usage(void);
 
         fclose(file);
     }
-    
+    printf("\n");
     return EXIT_SUCCESS;
 }
 
-- 
1.5.6.5