PRO STORE_ARRAY, DESTINATION, INSERT, INDEX
;
    ON_ERROR, 2         ;On error, return to caller
;
;  Check the number of parameters.
;
    IF N_PARAMS() NE 3 THEN MESSAGE,    $
        'Syntax:  STORE_ARRAY, DESTINATION, INSERT, INDEX'
;
;  Make sure everything is defined.
;
    IF N_ELEMENTS(INSERT) EQ 0 THEN MESSAGE,'INSERT not defined'
    IF N_ELEMENTS(INDEX) EQ 0 THEN MESSAGE,'INDEX not defined'
;
;  If DESTINATION is not defined, then set it equal to INSERT.
;
    IF N_ELEMENTS(DESTINATION) EQ 0 THEN BEGIN
        DESTINATION = INSERT
        RETURN
    ENDIF
;
;  Get the array types and dimensions of DESTINATION and INSERT.
;
    SD = SIZE(DESTINATION)
    SA = SIZE(INSERT)
    D_NDIM = SD[0]
    A_NDIM = SA[0]
    IF D_NDIM EQ 0 THEN D_DIM = 1 ELSE D_DIM = SD[1:D_NDIM]
    IF A_NDIM EQ 0 THEN A_DIM = 1 ELSE A_DIM = SA[1:A_NDIM]
    D_TYPE = SD[N_ELEMENTS(SD)-2]
    A_TYPE = SA[N_ELEMENTS(SA)-2]
;
;  Treat scalars as one-dimensional arrays.
;
    D_NDIM = D_NDIM > 1
    A_NDIM = A_NDIM > 1
; 
;  Check to see if both arrays are of type string or numeric.
;
    IF D_TYPE EQ 7 THEN D_STRING = 1  ELSE D_STRING = 0
    IF A_TYPE EQ 7 THEN A_STRING = 1  ELSE A_STRING = 0
    IF D_STRING NE A_STRING THEN MESSAGE,   $
        'Data arrays should be either both string or both non-string'
;
;  If both arrays have the same number of elements, then replace DESTINATION
;  with INSERT.
;
    IF D_NDIM EQ A_NDIM THEN BEGIN
        DESTINATION = INSERT
        RETURN
;
;  Otherwise, make sure that INSERT has fewer dimensions than DESTINATION.
;
    END ELSE IF D_NDIM LT A_NDIM THEN MESSAGE,  $
        'INSERT has more dimensions than DESTINATION'
;
;  Check INDEX
;
    LAST = D_DIM[D_NDIM-1] - 1
    IF (INDEX LT 0) OR (INDEX GT LAST) THEN MESSAGE,    $
        'INDEX must be between 0 and ' + STRTRIM(LAST,2)
;
;  Merge the dimensions of DESTINATION and INSERT.
;
    R_DIM = D_DIM
    FOR I = 0,A_NDIM-1 DO R_DIM[I] = D_DIM[I] > A_DIM[I]
;
;  Create the output array with the correct number of elements, and the greater
;  of the types of DESTINATION and INSERT.
;
    OUTPUT = MAKE_ARRAY(DIMENSION=R_DIM, TYPE=(D_TYPE > A_TYPE))
    R_NDIM = N_ELEMENTS(R_DIM)
;
;  If INDEX is not zero, then store the first part of DESTINATION in the output
;  array.
;
    IF INDEX NE 0 THEN BEGIN
        K = INDEX - 1
        CASE R_NDIM OF
            2:  OUTPUT[0,0] = DESTINATION[*,0:K]
            3:  OUTPUT[0,0,0] = DESTINATION[*,*,0:K]
            4:  OUTPUT[0,0,0,0] = DESTINATION[*,*,*,0:K]
            5:  OUTPUT[0,0,0,0,0] = DESTINATION[*,*,*,*,0:K]
            6:  OUTPUT[0,0,0,0,0,0] = DESTINATION[*,*,*,*,*,0:K]
            7:  OUTPUT[0,0,0,0,0,0,0] = DESTINATION[*,*,*,*,*,*,0:K]
        ENDCASE
    ENDIF
;
;  Add INSERT.
;
    CASE R_NDIM OF
        2:  OUTPUT[0,INDEX] = INSERT
        3:  OUTPUT[0,0,INDEX] = INSERT
        4:  OUTPUT[0,0,0,INDEX] = INSERT
        5:  OUTPUT[0,0,0,0,INDEX] = INSERT
        6:  OUTPUT[0,0,0,0,0,INDEX] = INSERT
        7:  OUTPUT[0,0,0,0,0,0,INDEX] = INSERT
    ENDCASE
;
;  Store the remainder of DESTINATION, if any, in the output array.
;
    IF INDEX NE LAST THEN BEGIN
        K = INDEX + 1
        CASE R_NDIM OF
            2:  OUTPUT[0,K] = DESTINATION[*,K:*]
            3:  OUTPUT[0,0,K] = DESTINATION[*,*,K:*]
            4:  OUTPUT[0,0,0,K] = DESTINATION[*,*,*,K:*]
            5:  OUTPUT[0,0,0,0,K] = DESTINATION[*,*,*,*,K:*]
            6:  OUTPUT[0,0,0,0,0,K] = DESTINATION[*,*,*,*,*,K:*]
            7:  OUTPUT[0,0,0,0,0,0,K] = DESTINATION[*,*,*,*,*,*,K:*]
        ENDCASE
    ENDIF
;
;  Replace DESTINATION with OUTPUT, and return.
;
    DESTINATION = OUTPUT
    RETURN
    END