/****************************
 * Name   : MAIL            *
 * Ver.   : 1.0             *
 * Author : Marc Alagem     *
 * Source : DICE C          *
 ****************************/

/***************************************************
 * includes pour printf(),fputs(),FILE and strlen()*
 ***************************************************/

#include <stdio.h>
#include <string.h>

/***********************************
 * défintion de quelques attributs *
 **********************************/

#define BOLD      "\x9b1;31;40m"
#define ITALIC    "\x9b3;31;40m"
#define UNDERLINE "\x9b4;31;40m"
#define NORMAL    "\x9b0;31;40m"
#define COPYRIGHT "\xa9"

/**************
 * prototypes *
 **************/

int usage();
int input();
int list();
int erase();
int printlist();
int copyright();
int rmv_mess();
int line_error();

/********************************
 * Verifie la ligne de commande *
 *******************************/

main(ac,av)
int ac;
char *av[];
    {
    char arg[];
    int k,op_code;

    if(ac==1|ac>2)
        {
        copyright();
        exit();
        }

    sprintf(arg,"%s",av[1]);

    if(arg[0]=='-'&&arg[1]=='i')      input();
    else if(arg[0]=='-'&&arg[1]=='e') erase();
    else if(arg[0]=='-'&&arg[1]=='l') list();
    else if(arg[0]=='-'&&arg[1]=='p') printlist();
    else if(arg[0]=='-'&&arg[1]=='h') usage();
    else if(arg[0]=='-'&&arg[1]=='d') rmv_mess();
    else                              line_error();

    }

/************************
 * Affiche le copyright *
 ************************/

copyright()
    {
    printf("\n%sMail v1.0%s %s 1992 Marc Alagem\n",BOLD,NORMAL,COPYRIGHT);
    printf("This program is %sFREEWARE%s. Read docfile for help.\n",ITALIC,NORMAL);
    printf("Type : %sMAIL -H%s for a brief overview\n\n",BOLD,NORMAL);
    }

/*****************
 * Affiche usage *
 *****************/

usage()
    {
    printf("\n%sMail v1.0%s %s 1992 Marc Alagem\n",BOLD,NORMAL,COPYRIGHT);
    printf("%sUsage%s    : Mail <command>\n",ITALIC,NORMAL);
    printf("%sCommands%s : %s-i%s : input message\n",ITALIC,NORMAL,BOLD,NORMAL);
    printf("           %s-e%s : reset datafile\n",BOLD,NORMAL);
    printf("           %s-h%s : display this text\n",BOLD,NORMAL);
    printf("           %s-l%s : list messages\n",BOLD,NORMAL);
    printf("           %s-p%s : send message list to printer\n",BOLD,NORMAL);
    printf("           %s-d%s : remove all messages for a given user\n\n",BOLD,NORMAL);
    exit();
    }

/*******************************
 * Verifie messages en entrée  *
 ******************************/

input()
    {
    char message[80],from_id[6],to_id[6],choice[];
    int ctrl_wrt;
    FILE *fp;

    fp=fopen("sys:s/Mail.dat","r");
    if(ferror(fp))
        fp=fopen("sys:s/Mail.dat","w");
    else
        {
        fclose(fp);
        fp=fopen("sys:s/Mail.dat","ra");
        if(ferror(fp))
            {
            printf("%sError%s : unable to open the datafile !\n",BOLD,NORMAL);
            exit();
            }
        }
    
    read_message:

    printf("\n%sMessage%s : ",ITALIC,NORMAL);
    gets(message);
    printf("%sFrom%s    : ",ITALIC,NORMAL);
    gets(from_id);
    printf("%sTo%s      : ",ITALIC,NORMAL);
    gets(to_id);

    write_message:

    ctrl_wrt=fprintf(fp,"%s\n",message);
    if(!ctrl_wrt)
        {
        printf("%sError%s : could not record the message !\n",BOLD,NORMAL);
        printf("Retry or Abort ? (r/a) : ");
        scanf("%c",choice);
        if(choice[0]=='r'|choice[0]=='R') goto write_message;
        else exit();
        }
    fprintf(fp,"%s\n",from_id);
    fprintf(fp,"%s\n",to_id);

    printf("\nAnother message (y/n) : ");
    scanf("%c",choice);
    if(choice[0]=='y'|choice[0]=='Y') goto read_message;

    fclose(fp);
    }

/**********************
 * Vérifie le fichier *
 *********************/

erase()
    {
    int r;
    
    r=unlink("s:Mail.dat");
    if(r!=0)
        {
        printf("%sError%s : could not reset the datafile !\n",BOLD,NORMAL);
        exit();
        }
    }

/************************************************
 * Vérifie le username et la liste des messages *
 ************************************************/

list()
    {
    char message[80],from_id[6],to_id[6],username[6];
    FILE *fp;
    int checksum=0,i,tmes=0,lm=0;
    char choice[];
    
    fp=fopen("sys:s/Mail.dat","r");
    if(ferror(fp))
        {
        printf("%sError%s : the datafile does not exist !\n",BOLD,NORMAL);
        exit();
        }

    printf("\nPlease enter your ID : ");
    gets(username);

    printf("\n%sList of messages                                                            %s\n\n",UNDERLINE,NORMAL);

    checksum=0;

    fgets(message,80,fp);
    if(feof(fp)) goto end_of_read;
    fgets(from_id,6,fp);
    if(feof(fp)) goto end_of_read;
    fgets(to_id,6,fp);
    if(feof(fp)) goto end_of_read;

    for(i=0;i<strlen(username);i++)
        if(to_id[i]==username[i]) checksum++;
    if(checksum==strlen(to_id)-1)
        {
        printf("%sFrom%s    : %s%sMessage%s : %s\n",ITALIC,NORMAL,from_id,ITALIC,NORMAL,message);
        tmes++;
        checksum=0;
        }

    do
        {
        checksum=0;
        fgets(message,132,fp);
        if(feof(fp)) goto end_of_read;
        fgets(from_id,6,fp);
        if(feof(fp)) goto end_of_read;
        fgets(to_id,6,fp);
        if(feof(fp)) goto end_of_read;

        for(i=0;i<strlen(username);i++)
            if(username[i]==to_id[i]) checksum++;
        if(checksum==strlen(to_id)-1)
            {
            printf("%sFrom%s    : %s%sMessage%s : %s\n",ITALIC,NORMAL,from_id,ITALIC,NORMAL,message);
            tmes++;
            checksum=0;
            }
        }
    while(!feof(fp));

    end_of_read:

    if(tmes==0)
        printf("Sorry, no messages for you, %s\n\n",username);

    fclose(fp);

    }

/**********************************************
 * Vérifie le fichier et imprime les messages *
 *********************************************/

printlist()
    {
    char message[80],from_id[6],to_id[6],username[6];
    FILE *fp;
    FILE *pt;
    int checksum=0,i,tmes=0,lm=0;
    char choice[];
    
    fp=fopen("sys:s/Mail.dat","r");
    if(ferror(fp))
        {
        printf("%sError%s : the datafile does not exist !\n",BOLD,NORMAL);
        exit();
        }

    printf("\nPlease enter your ID : ");
    gets(username);

    pt=fopen("prt:","w");
    if(ferror(pt))
        {
        printf("%sError%s : the printer is not avaiable !\n",BOLD,NORMAL);
        exit();
        }    

    fprintf(pt,"\n%sList of messages                                                            %s\n\n",UNDERLINE,NORMAL);

    checksum=0;

    fgets(message,80,fp);
    if(feof(fp)) goto pt_end_of_read;
    fgets(from_id,6,fp);
    if(feof(fp)) goto pt_end_of_read;
    fgets(to_id,6,fp);
    if(feof(fp)) goto pt_end_of_read;

    for(i=0;i<strlen(username);i++)
        if(to_id[i]==username[i]) checksum++;
    if(checksum==strlen(to_id)-1)
        {
        fprintf(pt,"From    : %sMessage : %s\n",from_id,message);
        tmes++;
        checksum=0;
        }

    do
        {
        checksum=0;
        fgets(message,132,fp);
        if(feof(fp)) goto pt_end_of_read;
        fgets(from_id,6,fp);
        if(feof(fp)) goto pt_end_of_read;
        fgets(to_id,6,fp);
        if(feof(fp)) goto pt_end_of_read;

        for(i=0;i<strlen(username);i++)
            if(username[i]==to_id[i]) checksum++;
        if(checksum==strlen(to_id)-1)
            {
            fprintf(pt,"From    : %sMessage : %s\n",from_id,message);
            tmes++;
            checksum=0;
            }
        }
    while(!feof(fp));

    pt_end_of_read:

    if(tmes==0)
        printf("Sorry, no messages for you, %s\n\n",username);

    fclose(fp);
    fclose(pt);
    puts("Print job terminated.");
    }

/************************************************
 * retire tous les messages pour un utilisateur *
 ***********************************************/

rmv_mess()
    {
    char message[80],from_id[6],to_id[6],username[6];
    FILE *fp;
    FILE *fr;
    int checksum=0,i,tmes=0,lm=0;
    char choice[];
    
    fp=fopen("sys:s/Mail.dat","r");
    if(ferror(fp))
        {
        printf("%sError%s : the datafile does not exist !\n",BOLD,NORMAL);
        exit();
        }

    fr=fopen("ram:@@!mail!01.tmp","w");
    if(ferror(fr))
        {
        printf("%sError%s : cannot open \"@@!mail!01.tmp\" !\n",BOLD,NORMAL);
        exit();
        }

    printf("\nPlease enter your ID : ");
    gets(username);

    checksum=0;

    fgets(message,80,fp);
    if(feof(fp)) goto end_of_delete;
    fgets(from_id,6,fp);
    if(feof(fp)) goto end_of_delete;
    fgets(to_id,6,fp);
    if(feof(fp)) goto end_of_delete;

    for(i=0;i<strlen(username);i++)
        if(to_id[i]==username[i]) checksum++;
    if(checksum!=strlen(to_id)-1)
        {
        fprintf(fr,"%s",message);
        fprintf(fr,"%s",from_id);
        fprintf(fr,"%s",to_id);
        checksum=0;
        }
    else
        tmes++;

    do
        {
        checksum=0;
        fgets(message,132,fp);
        if(feof(fp)) goto end_of_delete;
        fgets(from_id,6,fp);
        if(feof(fp)) goto end_of_delete;
        fgets(to_id,6,fp);
        if(feof(fp)) goto end_of_delete;

        for(i=0;i<strlen(username);i++)
            if(username[i]==to_id[i]) checksum++;
        if(checksum!=strlen(to_id)-1)
            {
            fprintf(fr,"%s",message);
            fprintf(fr,"%s",from_id);
            fprintf(fr,"%s",to_id);
            checksum=0;
            }
        else
            tmes++;
        }
    while(!feof(fp));

    end_of_delete:

    if(tmes==0)
        printf("No messages found for \"%s\"\n\n",username);
    else
        printf("%d messages deleted for \"%s\"\n\n",tmes,username);

    fclose(fp);
    fclose(fr);

    unlink("s:mail.dat");

    fp=fopen("sys:s/Mail.dat","w");
    if(ferror(fp))
        {
        printf("%sError%s : cannot update the datafile !\n",BOLD,NORMAL);
        exit();
        }

    fr=fopen("ram:@@!mail!01.tmp","r");
    if(ferror(fr))
        {
        printf("%sError%s : cannot open \"@@!mail!01.tmp\" !\n",BOLD,NORMAL);
        exit();
        }

    fgets(message,80,fr);
    if(feof(fr)) goto end_of_copy;
    fgets(from_id,6,fr);
    if(feof(fr)) goto end_of_copy;
    fgets(to_id,6,fr);
    if(feof(fr)) goto end_of_copy;
    fprintf(fp,"%s",message);
    fprintf(fp,"%s",from_id);
    fprintf(fp,"%s",to_id);

    do
        {
        fgets(message,132,fr);
        if(feof(fr)) goto end_of_copy;
        fgets(from_id,6,fr);
        if(feof(fr)) goto end_of_copy;
        fgets(to_id,6,fr);
        if(feof(fr)) goto end_of_copy;
        fprintf(fp,"%s",message);
        fprintf(fp,"%s",from_id);
        fprintf(fp,"%s",to_id);
        }
    while(!feof(fr));

    end_of_copy:
    
    fclose(fp);
    fclose(fr);
    unlink("ram:@@!mail!01.tmp");
    }

/************************************
 * Erreur dans la ligne de commande *
 ***********************************/

line_error()
    {
    printf("%sError%s : unknown command line option\n",BOLD,NORMAL);
    printf("Valid options are : [-i -e -h -l -p -d]\n");
    printf("Type : %sMAIL -H%s for a brief overview\n",BOLD,NORMAL);
    }
