; copy_structure, struct_in, no_pointers=no_pointers

FUNCTION copy_structure, struct_in, no_pointers=no_pointers
   IF SIZE( struct_in, /TYPE ) NE 8 THEN RETURN, 0
   struct_size = N_ELEMENTS( struct_in )
   num_fields = N_TAGS( struct_in[0] )
   cmd_str = "new_struct = CREATE_STRUCT("
   field_names = TAG_NAMES( struct_in[0] )
   FOR i = 0, num_fields -1 DO BEGIN
      var_type   = SIZE( struct_in[0].(i), /TYPE )
      IF var_type NE 10 AND var_type NE 11 THEN BEGIN
         IF i eq 0 THEN BEGIN
             new_struct =  CREATE_STRUCT( field_names[i], struct_in[0].(i) )
         ENDIF ELSE BEGIN
              new_struct =  CREATE_STRUCT( new_struct, field_names[i], struct_in[0].(i) )
         ENDELSE
      ENDIF ELSE BEGIN		; This is a pointer

         tmp_var = dereference_single(struct_in[0].(i))

         IF KEYWORD_SET( no_pointers ) THEN BEGIN
            IF i eq 0 THEN BEGIN
               new_struct =  CREATE_STRUCT( field_names[i], tmp_var )
            ENDIF ELSE BEGIN
               new_struct =  CREATE_STRUCT( new_struct, field_names[i], tmp_var )
            ENDELSE
         ENDIF ELSE BEGIN
            IF i eq 0 THEN BEGIN
               new_struct =  CREATE_STRUCT( field_names[i], PTR_NEW(tmp_var ) )
            ENDIF ELSE BEGIN
               new_struct =  CREATE_STRUCT( new_struct, field_names[i], PTR_NEW(tmp_var ) )
            ENDELSE
         ENDELSE
      ENDELSE      
   ENDFOR
   IF struct_size GT 1 THEN BEGIN 								; This is an array of structures
      new_struct = REPLICATE( new_struct, struct_size )
      FOR j = 1, struct_size -1 DO BEGIN
         FOR i = 0, num_fields -1 DO BEGIN
            var_type   = SIZE( struct_in[0].(i), /TYPE )
            IF var_type NE 10 AND var_type NE 11 THEN BEGIN
               new_struct[j].(i) = struct_in[j].(i)
            ENDIF ELSE BEGIN									; This is a pointer
               IF KEYWORD_SET( no_pointers ) THEN BEGIN
                  tmp_var = *struct_in[j].(i)
                  new_struct[j].(i) = tmp_var
               ENDIF ELSE BEGIN
                  new_struct[j].(i) = struct_in[j].(i)
               ENDELSE
            ENDELSE      
         ENDFOR
      ENDFOR
   ENDIF
   RETURN, new_struct
END
