changeset 2293:51d1492dfd57

Print raw byte data when dumping fields with unknown value representations and sizes other than 2 or 4.
author bert <bert>
date Mon, 06 Jun 2005 20:48:14 +0000
parents 2ce2f73ee308
children 5279bf60395a
files conversion/Acr_nema/element.c
diffstat 1 files changed, 31 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/conversion/Acr_nema/element.c
+++ b/conversion/Acr_nema/element.c
@@ -6,7 +6,10 @@
 @CREATED    : November 10, 1993 (Peter Neelin)
 @MODIFIED   : 
  * $Log: element.c,v $
- * Revision 6.7.2.1  2005-05-12 21:15:30  bert
+ * Revision 6.7.2.2  2005-06-06 20:48:14  bert
+ * Print raw byte data when dumping fields with unknown value representations and sizes other than 2 or 4.
+ *
+ * Revision 6.7.2.1  2005/05/12 21:15:30  bert
  * Initial checkin
  *
  * Revision 6.7  2005/04/18 23:22:29  bert
@@ -1552,9 +1555,10 @@
 #define INDENT_AMOUNT 3
    Acr_Element cur_element;
    long element_length;
+   long string_length;
    int printable;
    int i;
-   char *string, copy[1024];
+   char *string, *copy;
    static int current_indent_level = 0;
    Acr_VR_Type vr_code;
 
@@ -1635,30 +1639,35 @@
          (void) putc((int) '\n', file_pointer);
       }
       else {
+         int done_already = 0;
+
          element_length = acr_get_element_length(cur_element);
          switch (element_length) {
          case ACR_SIZEOF_SHORT:
             (void) fprintf(file_pointer, " short = %d (0x%04x)",
                            (int) acr_get_element_short(cur_element),
                            (int) acr_get_element_short(cur_element));
+            done_already = 1;
             break;
          case ACR_SIZEOF_LONG:
             (void) fprintf(file_pointer, " long = %d (0x%08x)",
                            (int) acr_get_element_long(cur_element),
                            (int) acr_get_element_long(cur_element));
+            done_already = 1;
             break;
          }
 
-         /* Remove trailing NULs from string */
          string = acr_get_element_string(cur_element);
-         while ((element_length > 0) && (string[element_length-1] == '\0')) {
-            element_length--;
+         string_length = element_length;
+         while ((string_length > 0) && (string[string_length-1] == '\0')) {
+            string_length--;
          }
 
          /* Print string if short enough and is printable */
-         if ((element_length > 0) && (element_length < sizeof(copy)-1)) {
-            printable = TRUE;
-            for (i=0; i < element_length; i++) {
+         if (element_length > 0) {
+            copy = malloc(string_length + 1);
+            printable = (string_length > 0);
+            for (i=0; i < string_length; i++) {
                if (! isprint((int) string[i])) {
                   printable = FALSE;
                   copy[i] = ' ';
@@ -1675,7 +1684,20 @@
             if (printable) {
                (void) fprintf(file_pointer, " string = \"%s\"", copy);
             }
-
+            else if (!done_already && element_length < 2048) {
+                /* If unknown length print as a series of bytes.
+                 */
+                string = acr_get_element_data(cur_element);
+                fprintf(file_pointer, " byte = ");
+                for (i = 0; i < element_length; i++) {
+                    fprintf(file_pointer, "0x%02x", 
+                            (unsigned char)string[i]);
+                    if (i != element_length - 1) {
+                        fprintf(file_pointer, ", ");
+                    }
+                }
+            }
+            free(copy);
          }
 
          /* End line */