/*
    ####             #    #     # #
    #   #            #    #       #          The FreeWare C library for
    #   #  ##   ###  #  # #     # ###             RISC OS machines
    #   # #  # #     # #  #     # #  #   ___________________________________
    #   # ####  ###  ##   #     # #  #
    #   # #        # # #  #     # #  #    Please refer to the accompanying
    ####   ### ####  #  # ##### # ###    documentation for conditions of use
    ________________________________________________________________________

    File:    Sprite.LoadFiles.c
    Author:  Sprite.LoadFile.c Copyright  1994 Tim Browse
             modifications for multiple files Copyright  1994 Lee Atkinson
    Version: 1.00 (25 Sep 1994)
    Purpose: Allocate a sprite area and load any number of files into it.
*/

#include <stdarg.h>
#include <stdlib.h>

#include "Desk.Core.h"
#include "Desk.File.h"
#include "Desk.Sprite.h"
#include "Desk.DeskMem.h"

extern Desk_sprite_area Desk_Sprite_LoadFiles(int nooffiles, ...)
/* loads any number of sprite files into a sprite area (allocated by Desk_DeskMem_XMalloc()),
                                                  and returns a pointer to it */
{
 int          i, blksize=0;
 Desk_sprite_area  sprarea = 0;
 va_list      argptr;

Desk_JumpAuto_Try	{
 
 va_start(argptr, nooffiles); /* inititialise arguments pointer */
 for (i=nooffiles;i;i--) blksize+=Desk_File_Size(va_arg(argptr, char *)); /* size of
                                                                    all files */
 blksize+=16; /* add room for extra header info & safety padding */
 sprarea=(Desk_sprite_area)Desk_DeskMem_Malloc(blksize))==NULL) /* allocate memory */
 
 sprarea->areasize=blksize; /* initialise sprite area */
 sprarea->firstoffset=16;
 Desk_Sprite_InitArea(sprarea);
 
 va_start(argptr, nooffiles); /* initialise stack pointer */
 
 Desk_Sprite_Load(sprarea, va_arg(argptr, char *))) /* load 1st sprite file */
     {
      for (i=nooffiles-1;i;i--)
         {
          Desk_Sprite_Merge(sprarea, va_arg(argptr, char *))
         }
     }
 va_end(argptr); /* restore stack */
}

Desk_JumpAuto_Catch	{
	Desk_DeskMem_Free( sprarea);
	va_end( argptr);
	Error2_ReThrow();
	}

Desk_JumpAuto_EndCatch

 return sprarea; /* return */
}
