/*
 *  utility.c
 *
 *  Scritto da Antonello Biancalana per AmigaMagazine
 *
 *  Programma dimostrativo sull'uso della libreria utility
 *
 */

#include <exec/types.h>
#include <utility/date.h>
#include <utility/tagitem.h>

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

#include <stdio.h>
#include <stdlib.h>

#define MYTAGBASE   TAG_USER

struct Library *UtilityBase;

struct ClockData CData;

void main(int argc, char **argv)
{
    short i;
    long sres, sa, sb, seconds, x;
    unsigned long ures, ua, ub, Key;
    unsigned char string[]="àèéìòù", *p;
    unsigned char tst1[31], tst2[31];

    struct TagItem *TagList, *CTag, *Tag;

    UtilityBase=OpenLibrary("utility.library",37L);

    if(!UtilityBase)
    {
        printf("libreria utility non disponibile\n");
        exit(0);
    }

    /* Divisione a 32 bit con segno */

    sa=25000000;
    sb=-500000;

    sres=SDivMod32(sa,sb);

    printf("Divisione a 32 bit con segno\n");
    printf("%ld / %ld = %ld\n\n",sa, sb, sres);

    /* Divisione a 32 bit senza segno */

    ua=23287000;
    ub=354005;

    ures=UDivMod32(ua,ub);

    printf("Divisione a 32 bit senza segno\n");
    printf("%ld / %ld = %ld\n\n",ua, ub, ures);

    /* Moltiplicazione a 32 bit con segno */

    sa=65536;
    sb=-1000;

    sres=SMult32(sa,sb);

    printf("Moltiplicazione a 32 bit con segno\n");
    printf("%ld * %ld = %ld\n\n",sa, sb, sres);

    /* Moltiplicazione a 32 bit senza segno */

    ua=125001;
    ub=77000;

    ures=UMult32(ua,ub);

    printf("Moltiplicazione a 32 bit senza segno\n");
    printf("%ld * %ld = %ld\n\n",ua, ub, ures);

    /* Funzioni relative a date di tempo */

    /* Conversione da secondi dopo 01-01-1978 a data */

    printf("\nnumero di secondi da 01-01-1978 : ");
    scanf("%ld",&seconds);

    Amiga2Date(seconds,&CData);

    printf("%d-%d-%d %d:%d:%d %d\n\n",CData.mday,CData.month,CData.year,
                                      CData.hour,CData.min,CData.sec,CData.wday);

    /* Conversione da data a secondi dopo 01-01-1978 */

    /* impostiamo la data a 06-10-1993 22:50:00 */

    CData.year=1993;
    CData.month=10;
    CData.mday=6;
    CData.hour=22;
    CData.min=50;
    CData.sec=0;

    seconds=Date2Amiga(&CData);
    
    printf("%d-%d-%d %d:%d:%d = %d secondi dopo 01-01-1978\n",CData.mday,CData.month,CData.year,
                                                              CData.hour,CData.min,CData.sec,seconds);
    /* Controllo della legalità di una data di tempo */

    /* impostiamo la data a 29-02-1994 12:30:12 */

    CData.year=1994;
    CData.month=2;
    CData.mday=29;
    CData.hour=12;
    CData.min=30;
    CData.sec=12;

    printf("\n%d-%d-%d %d:%d:%d è una data ",CData.mday,CData.month,CData.year,
                                             CData.hour,CData.min,CData.sec);

    seconds=CheckDate(&CData);
    
    if(seconds!=0)
        printf("valida\n");
    else
        printf("invalida\n");

    /* Funzioni stringa */

    printf("\nConversione di stringa in maiuscolo\n\n");

    printf("prima della conversione : %s\n",string);

    /* Conversione della stringa in maiuscolo mediante ToUpper() */

    p=string;

    while(*p)
    {
        *p=ToUpper(*p);
        p++;
    }

    printf("dopo la conversione : %s\n",string);

    /* Conversione della stringa in minuscolo mediante ToLower() */

    p=string;

    while(*p)
    {
        *p=ToLower(*p);
        p++;
    }

    printf("riconversione in minuscolo : %s\n",string);

    /* Confronto di stringa case insensitive */

    printf("\nConfronti di stringa\n\n");

    printf("Prima stringa   : ");
    scanf("%30s",tst1);

    printf("Seconda stringa : ");
    scanf("%30s",tst2);

    /* Confronto della stringa mediante Stricmp */

    x=Stricmp(tst1,tst2);

    printf("\n%s è ",tst1);

    if(x<0)
        printf("minore di");
    else if(x==0)
        printf("uguale a");
    else
        printf("maggiore di");

    printf(" %s\n",tst2);

    /* Confronto limitato della stringa mediante Strnicmp */

    printf("\nConfronto dei primi tre caratteri delle stringhe\n");

    x=Strnicmp(tst1,tst2,3);

    printf("\n%s è ",tst1);

    if(x<0)
        printf("minore di");
    else if(x==0)
        printf("uguale a");
    else
        printf("maggiore di");

    printf(" %s\n",tst2);

    /* Gestione delle tags */

    /* Allocazione di una lista di tags composta da 10 elementi */

    TagList=AllocateTagItems(10);

    if(!TagList)
    {
        printf("Memoria insufficiente per allocare la TagList\n");

        CloseLibrary(UtilityBase);

        exit(0);
    }

    /* Assegnazione dei valori nella TagList */

    for(i=0; i<=8; i++)
    {
        TagList[i].ti_Tag = MYTAGBASE+i;
        TagList[i].ti_Data = i*i;
    }

    /* L'ultimo elemento della TagList deve essere terminato */
    /* con la tag TAG_DONE o TAG_END                         */

    TagList[i].ti_Tag=TAG_DONE;
    TagList[i].ti_Data=0;

    /* Scorrimento della TagList mediante NextTagItem() */

    CTag=TagList;

    printf("\nContenuto della TagList\n");

    while(Tag=NextTagItem(&CTag))
        printf("%ld - %ld\n",Tag->ti_Tag,Tag->ti_Data);

    /* Ricerca di una tag specifica mediante FindTagItem() */

    Key=MYTAGBASE+4;

    printf("\nRicerca della Tag %ld\n",Key);

    if(Tag=FindTagItem(Key,TagList))
        printf("Tag trovata (ti_Data = %ld)\n",Tag->ti_Data);
    else
        printf("Tag non trovata\n");

    /* Deallocazione della TagList */

    FreeTagItems(TagList);

    /* Chiusura della libreria utility */

    CloseLibrary(UtilityBase);
}

