/* Resize
 * Cree le : 12/02/2000
 * Par : Bad Max
 * Commentaire : 1.0
 *	- version shell
 */

/*** Includes C ANSI ***/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*** Includes AmigaOS ***/
#include <dos/dos.h>
#include <exec/exec.h>

#include <proto/dos.h>
#include <proto/exec.h>

/*** Types à nous ***/
typedef struct
{
    char Nom_Fichier[256];
    int Taille;
} Args;

/*** Variables globales ***/
int     code = 0;
static char *version = "$VER: resize 1.0 (12/02/2000)";

/*** Prototypes à nous ***/
int ScanArgs(int agc, char **agv, Args *arguments);

/*** Main ***/
void main(int argc, char *argv[])
{
    Args        args;
    int         success;
    BPTR        lock_file;
    struct FileInfoBlock infos;
    char        *buffer,
                *courant;
    
    if (ScanArgs(argc, argv, &args))
    {
        /* Verrouille le fichier */
        lock_file = Lock(args.Nom_Fichier, ACCESS_READ);
        if (lock_file == NULL)
        {
            fprintf(stderr, "Erreur sur Lock()\n");
            code = 22;
            exit(code);
        }
        
        /* Lit les infos */
        success = Examine(lock_file, &infos);
        if (!success)
        {
            fprintf(stderr, "Erreur sur Examine()\n");
            UnLock(lock_file);
            code = 23;
            exit(code);
        }
        
        /* Vérifie s'il s'agit d'un répertoire ou pas */
        if (infos.fib_DirEntryType > 0)
        {
            fprintf(stderr, "Le fichier %s est un répertoire\n", infos.fib_FileName);
            UnLock(lock_file);
            code = 24;
            exit(code);
        }
        
        /* Vérifie si la taille indiquée est supérieure à
         * celle du fichier
         */
        if (args.Taille >= infos.fib_Size)
        {
            fprintf(stderr, "La taille du fichier est inférieure à celle demandée\n");
            UnLock(lock_file);
            exit(25);
        }
        
        /* Déverouille le fichier */
        UnLock(lock_file);
                
        /* Alloue le buffer de lecture */
        buffer = malloc(args.Taille);
        if (buffer == NULL)
        {
            fprintf(stderr, "Erreur à l'allocation du buffer\n");
            exit(26);
        }
        
        courant = buffer;
        
        /* Ouvre le fichier */
        lock_file = Open(args.Nom_Fichier, MODE_OLDFILE);
        
        /* Positionnement dans ce fichier */
        Seek(lock_file, infos.fib_Size - args.Taille, OFFSET_BEGINNING);
        
        /* Lecture du fichier */
        success = Read(lock_file, courant, 1024);
        
        while (success != -1 && success)
        {
            //memcpy(courant, lu, success);
            courant += success;
            
            success = Read(lock_file, courant, 1024);
        }
        
        Close(lock_file);
        
        /* Lecture terminée
         * maintenant on re-érit le fichier
         */
         
        /* On commence par l'effacer */
        success = DeleteFile(args.Nom_Fichier);
        if (!success)
        {
            fprintf(stderr, "Erreur à l'effacement du fichier\n");
            exit(27);
        }
        
        /* On le re-crée */
        lock_file = Open(args.Nom_Fichier, MODE_NEWFILE);
        
        /* On écrit */
        Write(lock_file, buffer, args.Taille);
        
        /* On a fini */
        free(buffer);
        Close(lock_file);
    }
    
    exit(code);
}


/* Fonction de vérification de la ligne de commande
 * Entree : argc, argv, structure Args
 * Sortie : booléen
 */
int ScanArgs(int agc, char **agv, Args *arguments)
{
    FILE        *essai;
    
    if (agc < 3)
    {
        printf("%s\n", version);
        printf("Usage :\n\t%s nom_fichier nouvelle_taille\n", agv[0]);
        code = 20;      /* Code de retour du soft */
        return 0;       /* Renvoie FALSE */
    }
    else
    {
        /* Essaye d'ouvrir le fichier passé en paramètre */
        essai = fopen(agv[1], "r");
        if (essai == NULL)
        {
            printf("Impossible d'ouvrir le fichier %s\n", agv[1]);
            code = 21;
            return 0;
        }
        else
        {
            fclose(essai);
        }
        
        /* Stocke les arguments */
        strcpy(arguments->Nom_Fichier, agv[1]);
        arguments->Taille = atoi(agv[2]);
        return 1;
    }
}
